diff --git a/codegen/aws/core/src/test/java/software/amazon/smithy/python/aws/codegen/MarkdownToRstDocConverterTest.java b/codegen/aws/core/src/test/java/software/amazon/smithy/python/aws/codegen/MarkdownToRstDocConverterTest.java index 0f51a643..5b58ecc6 100644 --- a/codegen/aws/core/src/test/java/software/amazon/smithy/python/aws/codegen/MarkdownToRstDocConverterTest.java +++ b/codegen/aws/core/src/test/java/software/amazon/smithy/python/aws/codegen/MarkdownToRstDocConverterTest.java @@ -22,88 +22,88 @@ public void setUp() { @Test public void testConvertCommonmarkToRstWithTitleAndParagraph() { String html = "
Paragraph
"; - String expected = "\n\nTitle\n=====\nParagraph\n"; + String expected = "Title\n=====\nParagraph"; String result = markdownToRstDocConverter.convertCommonmarkToRst(html); - assertEquals(expected, result); + assertEquals(expected, result.trim()); } @Test public void testConvertCommonmarkToRstWithImportantNote() { String html = "Paragraph
Paragraph with bold text
"; - String expected = "\n\nTitle\n=====\nParagraph with **bold** text\n"; + String expected = "Title\n=====\nParagraph with **bold** text"; String result = markdownToRstDocConverter.convertCommonmarkToRst(html); - assertEquals(expected, result); + assertEquals(expected, result.trim()); } @Test public void testConvertCommonmarkToRstWithAnchorTag() { String html = "Link"; - String expected = "\n`Linkcode snippet
";
- String expected = "\n``code snippet``";
+ String expected = "``code snippet``";
String result = markdownToRstDocConverter.convertCommonmarkToRst(html);
- assertEquals(expected, result);
+ assertEquals(expected, result.trim());
}
@Test
public void testConvertCommonmarkToRstWithNoteTag() {
String html = "(.*)
$", Pattern.DOTALL); + Matcher matcher = pattern.matcher(html); + html = matcher.replaceAll("docs + //
). Since we standardize to html above, thattag + // starts a newline. We account for that with this if/else + // statement, but we should refactor this in the future to + // have a more elegant codepath. + if (secondColonIndex +1 == text.strip().length()) { + writer.indent(); + writer.ensureNewline(); + } else { + writer.ensureNewline(); + writer.indent(); + writer.write(text.substring(secondColonIndex + 1)); + writer.dedent(); + } + } else { + writer.writeInline(text); + } + // Account for services making a paragraph tag that's empty except + // for a newline } else if (node.parent() instanceof Element && ((Element) node.parent()).tagName().equals("p")) { - sb.append(text.replaceAll("[ \\t]+", "")); + writer.writeInline(text.replaceAll("[ \\t]+", "")); } } else if (node instanceof Element) { Element element = (Element) node; switch (element.tagName()) { case "a": - sb.append("`"); + writer.writeInline("`"); break; case "b": case "strong": - sb.append("**"); + writer.writeInline("**"); break; case "i": case "em": - sb.append("*"); + writer.writeInline("*"); break; case "code": - sb.append("``"); + writer.writeInline("``"); break; case "important": - sb.append("\n.. important::\n "); + writer.ensureNewline(); + writer.write(""); + writer.openBlock(".. important::"); break; case "note": - sb.append("\n.. note::\n "); + writer.ensureNewline(); + writer.write(""); + writer.openBlock(".. note::"); break; case "ul": + if (inList) { + writer.indent(); + } inList = true; listDepth++; - sb.append("\n"); + writer.ensureNewline(); + writer.write(""); break; case "li": - if (inList) { - sb.append(" ".repeat(listDepth - 1)).append("* "); - } + writer.writeInline("* "); break; case "h1": - sb.append("\n"); + writer.ensureNewline(); break; default: break; @@ -125,41 +156,47 @@ public void tail(Node node, int depth) { Element element = (Element) node; switch (element.tagName()) { case "a": - sb.append(" <").append(element.attr("href")).append(">`_"); + String href = element.attr("href"); + if (!href.isEmpty()) { + writer.writeInline(" <").writeInline(href).writeInline(">`_"); + } else { + writer.writeInline("`"); + } break; case "b": case "strong": - sb.append("**"); + writer.writeInline("**"); break; case "i": case "em": - sb.append("*"); + writer.writeInline("*"); break; case "code": - sb.append("``"); + writer.writeInline("``"); break; case "important": case "note": + writer.closeBlock(""); + break; case "p": - sb.append("\n"); + writer.ensureNewline(); + writer.write(""); break; case "ul": listDepth--; if (listDepth == 0) { inList = false; + } else { + writer.dedent(); } - if (sb.charAt(sb.length() - 1) != '\n') { - sb.append("\n\n"); - } + writer.ensureNewline(); break; case "li": - if (sb.charAt(sb.length() - 1) != '\n') { - sb.append("\n\n"); - } + writer.ensureNewline(); break; case "h1": String title = element.text(); - sb.append("\n").append("=".repeat(title.length())).append("\n"); + writer.ensureNewline().writeInline("=".repeat(title.length())).ensureNewline(); break; default: break; @@ -169,7 +206,7 @@ public void tail(Node node, int depth) { @Override public String toString() { - return sb.toString(); + return writer.toString(); } } } diff --git a/codegen/core/src/main/java/software/amazon/smithy/python/codegen/writer/PythonWriter.java b/codegen/core/src/main/java/software/amazon/smithy/python/codegen/writer/PythonWriter.java index 0e590113..6d3ecac9 100644 --- a/codegen/core/src/main/java/software/amazon/smithy/python/codegen/writer/PythonWriter.java +++ b/codegen/core/src/main/java/software/amazon/smithy/python/codegen/writer/PythonWriter.java @@ -174,6 +174,9 @@ private static void wrapLine(String line, StringBuilder wrappedText) { while (line.length() > MAX_LINE_LENGTH) { int wrapAt = findWrapPosition(line, MAX_LINE_LENGTH); wrappedText.append(indentStr).append(line, 0, wrapAt).append("\n"); + if (line.startsWith("* ")) { + indentStr += " "; + } line = line.substring(wrapAt).trim(); if (line.isEmpty()) { return; @@ -190,6 +193,7 @@ private static int findWrapPosition(String line, int maxLineLength) { wrapAt = line.length(); } else { // Ensure we don't break a link + //TODO account for earlier backticks on the same line as a link int linkStart = line.lastIndexOf("`", wrapAt); int linkEnd = line.indexOf("`_", wrapAt); if (linkStart != -1 && (linkEnd != -1 && linkEnd > linkStart)) {