Return-Path: X-Original-To: apmail-maven-commits-archive@www.apache.org Delivered-To: apmail-maven-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id EC81D10885 for ; Wed, 6 Nov 2013 14:39:19 +0000 (UTC) Received: (qmail 88898 invoked by uid 500); 6 Nov 2013 14:38:37 -0000 Delivered-To: apmail-maven-commits-archive@maven.apache.org Received: (qmail 87762 invoked by uid 500); 6 Nov 2013 14:38:29 -0000 Mailing-List: contact commits-help@maven.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@maven.apache.org Delivered-To: mailing list commits@maven.apache.org Received: (qmail 86694 invoked by uid 99); 6 Nov 2013 14:38:27 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 06 Nov 2013 14:38:27 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 06 Nov 2013 14:38:24 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 1C23223888FE; Wed, 6 Nov 2013 14:38:03 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1539350 - /maven/doxia/doxia/trunk/doxia-modules/doxia-module-markdown/src/main/java/org/apache/maven/doxia/module/markdown/MarkdownParser.java Date: Wed, 06 Nov 2013 14:38:03 -0000 To: commits@maven.apache.org From: stephenc@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20131106143803.1C23223888FE@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: stephenc Date: Wed Nov 6 14:38:02 2013 New Revision: 1539350 URL: http://svn.apache.org/r1539350 Log: [DOXIA-472] Add support for multimarkdown-style metadata section at the start of a markdown file. Modified: maven/doxia/doxia/trunk/doxia-modules/doxia-module-markdown/src/main/java/org/apache/maven/doxia/module/markdown/MarkdownParser.java Modified: maven/doxia/doxia/trunk/doxia-modules/doxia-module-markdown/src/main/java/org/apache/maven/doxia/module/markdown/MarkdownParser.java URL: http://svn.apache.org/viewvc/maven/doxia/doxia/trunk/doxia-modules/doxia-module-markdown/src/main/java/org/apache/maven/doxia/module/markdown/MarkdownParser.java?rev=1539350&r1=1539349&r2=1539350&view=diff ============================================================================== --- maven/doxia/doxia/trunk/doxia-modules/doxia-module-markdown/src/main/java/org/apache/maven/doxia/module/markdown/MarkdownParser.java (original) +++ maven/doxia/doxia/trunk/doxia-modules/doxia-module-markdown/src/main/java/org/apache/maven/doxia/module/markdown/MarkdownParser.java Wed Nov 6 14:38:02 2013 @@ -19,22 +19,24 @@ package org.apache.maven.doxia.module.ma * under the License. */ -import java.io.IOException; -import java.io.Reader; -import java.io.StringReader; - +import org.apache.commons.lang.StringEscapeUtils; +import org.apache.commons.lang.StringUtils; import org.apache.maven.doxia.module.xhtml.XhtmlParser; import org.apache.maven.doxia.parser.ParseException; import org.apache.maven.doxia.parser.Parser; import org.apache.maven.doxia.sink.Sink; - import org.codehaus.plexus.component.annotations.Component; import org.codehaus.plexus.util.IOUtil; - import org.pegdown.Extensions; import org.pegdown.PegDownProcessor; import org.pegdown.ast.RootNode; +import java.io.IOException; +import java.io.Reader; +import java.io.StringReader; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + /** * Implementation of {@link org.apache.maven.doxia.parser.Parser} for Markdown documents. *

@@ -59,6 +61,17 @@ public class MarkdownParser protected static final PegDownProcessor PEGDOWN_PROCESSOR = new PegDownProcessor( Extensions.ALL & ~Extensions.HARDWRAPS, Long.MAX_VALUE ); + /** + * Regex that identifies a multimarkdown-style metadata section at the start of the document + */ + private static final String MULTI_MARKDOWN_METADATA_SECTION = + "^((?:[^\\s:][^:]*):(?:.*(?:\r?\n\\s[^\\s].*)*\r?\n))+(?:\\s*\r?\n)"; + + /** + * Regex that captures the key and value of a multimarkdown-style metadata entry. + */ + private static final String MULTI_MARKDOWN_METADATA_ENTRY = "([^\\s:][^:]*):(.*(?:\r?\n\\s[^\\s].*)*)\r?\n"; + /** * {@inheritDoc} @@ -69,9 +82,48 @@ public class MarkdownParser { try { - RootNode rootNode = PEGDOWN_PROCESSOR.parseMarkdown( IOUtil.toString( source ).toCharArray() ); - String markdownAsHtml = new MarkdownToDoxiaHtmlSerializer().toHtml( rootNode ); - super.parse( new StringReader( "" + markdownAsHtml + "" ), sink ); + String text = IOUtil.toString( source ); + StringBuilder html = new StringBuilder( text.length() * 2 ); + html.append( "" ); + html.append( "" ); + Pattern metadataPattern = Pattern.compile( MULTI_MARKDOWN_METADATA_SECTION, Pattern.MULTILINE ); + Matcher metadataMatcher = metadataPattern.matcher( text ); + if ( metadataMatcher.find() ) + { + metadataPattern = Pattern.compile( MULTI_MARKDOWN_METADATA_ENTRY, Pattern.MULTILINE ); + for ( int i = 1; i <= metadataMatcher.groupCount(); i++ ) + { + String line = metadataMatcher.group( i ); + Matcher lineMatcher = metadataPattern.matcher( line ); + if ( lineMatcher.matches() ) + { + String key = StringUtils.trimToEmpty( lineMatcher.group( 1 ) ); + String value = StringUtils.trimToEmpty( lineMatcher.group( 2 ) ); + if ( "title".equalsIgnoreCase( key ) ) + { + html.append( "" ); + html.append( StringEscapeUtils.escapeXml( value ) ); + html.append( "" ); + } + else + { + html.append( "" ); + } + } + } + text = text.substring( metadataMatcher.end() ); + } + html.append( "" ); + html.append( "" ); + RootNode rootNode = PEGDOWN_PROCESSOR.parseMarkdown( text.toCharArray() ); + html.append( new MarkdownToDoxiaHtmlSerializer().toHtml( rootNode ) ); + html.append( "" ); + html.append( "" ); + super.parse( new StringReader( html.toString() ), sink ); } catch ( IOException e ) {