kwin commented on code in PR #141: URL: https://github.com/apache/maven-doxia/pull/141#discussion_r1090522065
########## doxia-modules/doxia-module-markdown/src/main/java/org/apache/maven/doxia/module/markdown/MarkdownParser.java: ########## @@ -156,6 +178,86 @@ public void parse(Reader source, Sink sink, String reference) throws ParseExcept } } + private boolean processMetadataForHtml(StringBuilder html, StringBuilder source) { + final Map<String, List<String>> metaData; + final int endOffset; // end of metadata within source + // support two types of metadata: + if (source.toString().startsWith("---")) { + // 1. YAML front matter (https://github.com/vsch/flexmark-java/wiki/Extensions#yaml-front-matter) + Node documentRoot = FLEXMARK_METADATA_PARSER.parse(source.toString()); + YamlFrontMatterVisitor visitor = new YamlFrontMatterVisitor(); + visitor.visit(documentRoot); + metaData = visitor.getData(); + endOffset = visitor.getEndOffset(); + } else { + // 2. Multimarkdown metadata (https://fletcher.github.io/MultiMarkdown-5/metadata.html), not yet supported + // by Flexmark (https://github.com/vsch/flexmark-java/issues/550) + metaData = new LinkedHashMap<>(); + Matcher metadataMatcher = METADATA_SECTION_PATTERN.matcher(source); + if (metadataMatcher.find()) { + String entry = metadataMatcher.group(0) + '\n'; + Matcher entryMatcher = METADATA_ENTRY_PATTERN.matcher(entry); + while (entryMatcher.find()) { + String key = entryMatcher.group(1); + String value = normalizeMultilineValue(entryMatcher.group(2)); + metaData.put(key, Collections.singletonList(value)); + } + endOffset = metadataMatcher.end(0); + } else { + endOffset = 0; + } + } + if (endOffset > 0) { + // Trim the metadata from the source + source.delete(0, endOffset); + } + return writeHtmlMetadata(html, metaData); + } + + static String normalizeMultilineValue(String value) { + return value.trim().replaceAll("[ \\t]*[\\r\\n]+[ \\t]*", " "); + } + + private boolean writeHtmlMetadata(StringBuilder html, Map<String, List<String>> data) { + boolean containsTitle = false; + for (Entry<String, List<String>> entry : data.entrySet()) { + if (writeHtmlMetadata(html, entry.getKey(), entry.getValue())) { + containsTitle = true; + } + } + return containsTitle; + } + + private boolean writeHtmlMetadata(StringBuilder html, String key, List<String> values) { + if ("title".equalsIgnoreCase(key)) { + html.append("<title>"); + html.append(HtmlTools.escapeHTML(values.stream().collect(Collectors.joining(", ")), false)); + html.append("</title>"); + return true; + } else { + if (key.equalsIgnoreCase("author") && values.size() > 1) { + // for multiple authors emit multiple meta tags + for (String value : values) { + writeHtmlMetadata(html, key, Collections.singletonList(value)); + } + } else { + // every other multivalue should just be concatenated and emitted in a single meta tag + final String separator; + if (key.equalsIgnoreCase("keywords")) { + separator = ","; + } else { + separator = "\n"; Review Comment: Fixed in https://github.com/apache/maven-doxia/pull/141/commits/168071b3d8e0434ce73d668746e6c78f5f2051f2. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: issues-unsubscr...@maven.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org