Skip to content

Commit

Permalink
Merge pull request #10155 from ppalaga/i10153
Browse files Browse the repository at this point in the history
  • Loading branch information
gastaldi authored Jun 23, 2020
2 parents 5e91d6f + fdaa2e0 commit e2bbfdb
Show file tree
Hide file tree
Showing 3 changed files with 100 additions and 6 deletions.
12 changes: 12 additions & 0 deletions core/processor/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,18 @@
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.asciidoctor</groupId>
<artifactId>asciidoctorj</artifactId>
<scope>test</scope>
<version>2.3.0</version>
<exclusions>
<exclusion>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,6 @@ final class JavaDocParser {
private static final String SUPER_SCRIPT_NODE = "sup";
private static final String UN_ORDERED_LIST_NODE = "ul";

private static final String INLINE_JAVA_DOC_TAG_FORMAT = "`%s`";

private static final String BIG_ASCIDOC_STYLE = "[.big]";
private static final String LINK_ATTRIBUTE_FORMAT = "[%s]";
private static final String SUB_SCRIPT_ASCIDOC_STYLE = "~";
Expand Down Expand Up @@ -153,14 +151,18 @@ private String htmlJavadocToAsciidoc(JavadocDescription javadocDescription) {
case VALUE:
case LITERAL:
case SYSTEM_PROPERTY:
sb.append(String.format(INLINE_JAVA_DOC_TAG_FORMAT, content));
sb.append('`');
appendEscapedAsciiDoc(sb, content);
sb.append('`');
break;
case LINK:
case LINKPLAIN:
if (content.startsWith(HASH)) {
content = hyphenate(content.substring(1));
}
sb.append(String.format(INLINE_JAVA_DOC_TAG_FORMAT, content));
sb.append('`');
appendEscapedAsciiDoc(sb, content);
sb.append('`');
break;
default:
sb.append(content);
Expand Down Expand Up @@ -257,8 +259,7 @@ private void appendHtml(StringBuilder sb, Node node) {
sb.append(NEW_LINE);
break;
case TEXT_NODE:
final TextNode textNode = (TextNode) childNode;
sb.append(textNode.text());
appendEscapedAsciiDoc(sb, ((TextNode) childNode).text());
break;
default:
appendHtml(sb, childNode);
Expand All @@ -267,6 +268,45 @@ private void appendHtml(StringBuilder sb, Node node) {
}
}

static StringBuilder appendEscapedAsciiDoc(StringBuilder sb, String text) {
boolean escaping = false;
for (int i = 0; i < text.length(); i++) {
final char ch = text.charAt(i);
switch (ch) {
case '#':
case '*':
case '\\':
case '{':
case '}':
case '[':
case ']':
if (!escaping) {
sb.append("++");
escaping = true;
}
sb.append(ch);
break;
case '+':
if (escaping) {
sb.append("++");
escaping = false;
}
sb.append("{plus}");
break;
default:
if (escaping) {
sb.append("++");
escaping = false;
}
sb.append(ch);
}
}
if (escaping) {
sb.append("++");
}
return sb;
}

static class SectionHolder {
final String title;
final String details;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,13 @@

import static org.junit.jupiter.api.Assertions.assertEquals;

import java.util.Collections;

import org.asciidoctor.Asciidoctor.Factory;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

public class JavaDocConfigDescriptionParserTest {

Expand Down Expand Up @@ -238,4 +243,41 @@ public void asciidocLists() {

assertEquals(asciidoc, parser.parseConfigDescription(asciidoc + "\n" + "@asciidoclet"));
}

@ParameterizedTest
@ValueSource(strings = { "#", "*", "\\", "[", "]" })
public void escape(String ch) {
final String javaDoc = "Inline " + ch + " " + ch + ch + ", <code>HTML tag glob " + ch + " " + ch + ch
+ "</code>, {@code JavaDoc tag " + ch + " " + ch + ch + "}";
final String expected = "<div class=\"paragraph\">\n<p>Inline " + ch + " " + ch + ch + ", <code>HTML tag glob " + ch
+ " " + ch + ch + "</code>, <code>JavaDoc tag " + ch + " " + ch + ch + "</code></p>\n</div>";

final String asciiDoc = parser.parseConfigDescription(javaDoc);
final String actual = Factory.create().convert(asciiDoc, Collections.emptyMap());
assertEquals(expected, actual);
}

@Test
public void escapePlus() {
final String javaDoc = "Inline + ++, <code>HTML tag glob + ++</code>, {@code JavaDoc tag + ++}";
final String expected = "<div class=\"paragraph\">\n<p>Inline &#43; &#43;&#43;, <code>HTML tag glob &#43; &#43;&#43;</code>, <code>JavaDoc tag &#43; &#43;&#43;</code></p>\n</div>";

final String asciiDoc = parser.parseConfigDescription(javaDoc);
final String actual = Factory.create().convert(asciiDoc, Collections.emptyMap());
assertEquals(expected, actual);
}

@ParameterizedTest
@ValueSource(strings = { "{", "}" })
public void escapeBrackets(String ch) {
final String javaDoc = "Inline " + ch + " " + ch + ch + ", <code>HTML tag glob " + ch + " " + ch + ch
+ "</code>";
final String expected = "<div class=\"paragraph\">\n<p>Inline " + ch + " " + ch + ch + ", <code>HTML tag glob " + ch
+ " " + ch + ch + "</code></p>\n</div>";

final String asciiDoc = parser.parseConfigDescription(javaDoc);
final String actual = Factory.create().convert(asciiDoc, Collections.emptyMap());
assertEquals(expected, actual);
}

}

0 comments on commit e2bbfdb

Please sign in to comment.