|
16 | 16 | */ |
17 | 17 | package org.tensorflow.op.generator; |
18 | 18 |
|
19 | | -import java.util.Arrays; |
20 | | -import java.util.List; |
21 | | -import java.util.StringJoiner; |
22 | | -import java.util.regex.MatchResult; |
23 | | -import java.util.regex.Matcher; |
24 | | -import java.util.regex.Pattern; |
| 19 | +import org.commonmark.node.Node; |
| 20 | +import org.commonmark.parser.Parser; |
| 21 | +import org.tensorflow.op.generator.javadoc.JavaDocRenderer; |
25 | 22 | import org.tensorflow.proto.framework.OpDef.ArgDef; |
26 | 23 |
|
27 | 24 | /** |
28 | 25 | * Utilities for op generation |
29 | 26 | */ |
30 | 27 | final class GeneratorUtils { |
31 | 28 |
|
| 29 | + private static final Parser parser = Parser.builder().build(); |
| 30 | + |
32 | 31 | /** |
33 | 32 | * Convert a Python style name to a Java style name. |
34 | 33 | * |
@@ -72,107 +71,10 @@ static String javaizeMemberName(String name) { |
72 | 71 | * Convert markdown descriptions to JavaDocs. |
73 | 72 | */ |
74 | 73 | static String parseDocumentation(String docs) { |
75 | | - StringBuilder javadoc = new StringBuilder(); |
76 | | - List<String> markdownExprs = Arrays |
77 | | - .asList("\n+\\*\\s+", "\n{2,}", "`{3,}\\s*[^\\s\n]*\\s*\n", "`+", "\\*{1,2}\\b", "\\["); |
78 | | - StringJoiner joiner = new StringJoiner("|", "(", ")"); |
79 | | - markdownExprs.forEach(joiner::add); |
80 | | - Pattern markupExpr = Pattern.compile(joiner.toString()); |
81 | | - |
82 | | - Pattern codeBlock = Pattern.compile("(```\\s*\n*)"); |
83 | | - |
84 | | - boolean inList = false; |
85 | | - String input = docs; |
86 | | - while (true) { |
87 | | - Matcher m = markupExpr.matcher(input); |
88 | | - if (m.find()) { |
89 | | - MatchResult result = m.toMatchResult(); |
90 | | - |
91 | | - String text = input.substring(0, result.start()); |
92 | | - input = input.substring(result.end()); |
93 | | - String markup = result.group(); |
94 | | - |
95 | | - javadoc.append(text); |
96 | | - |
97 | | - if (markup.startsWith("\n")) { |
98 | | - javadoc.append("\n"); |
99 | | - if (markup.contains("*")) { |
100 | | - javadoc.append(inList ? "<li>\n" : "<ul>\n"); |
101 | | - javadoc.append("<li>\n"); |
102 | | - inList = true; |
103 | | - } else if (inList) { |
104 | | - javadoc.append("<li>\n<ul>\n"); |
105 | | - inList = false; |
106 | | - } else if (!input.startsWith("```")) { |
107 | | - javadoc.append("<p>\n"); |
108 | | - } |
109 | | - } else if (markup.startsWith("```")) { |
110 | | - Matcher cb = codeBlock.matcher(input); |
111 | | - if (cb.find()) { |
112 | | - result = cb.toMatchResult(); |
113 | | - text = input.substring(0, result.start()); |
114 | | - input = input.substring(result.end()); |
115 | | - javadoc.append("<pre>{@code\n").append(text).append("}</pre>\n"); |
116 | | - } else { |
117 | | - javadoc.append(markup); |
118 | | - } |
119 | | - } else if (markup.startsWith("`")) { |
120 | | - Matcher cb = Pattern.compile(markup).matcher(input); |
121 | | - if (cb.find()) { |
122 | | - result = cb.toMatchResult(); |
123 | | - text = input.substring(0, result.start()); |
124 | | - input = input.substring(result.end()); |
125 | | - javadoc.append("{@code ").append(text).append("}"); |
126 | | - } else { |
127 | | - javadoc.append(markup); |
128 | | - } |
129 | | - } else if (markup.equals("**")) { |
130 | | - Matcher cb = Pattern.compile("(\\b\\*{2})").matcher(input); |
131 | | - if (cb.find()) { |
132 | | - result = cb.toMatchResult(); |
133 | | - text = input.substring(0, result.start()); |
134 | | - input = input.substring(result.end()); |
135 | | - javadoc.append("<b>").append(text).append("</b>"); |
136 | | - } else { |
137 | | - javadoc.append(markup); |
138 | | - } |
139 | | - } else if (markup.equals("*")) { |
140 | | - Matcher cb = Pattern.compile("(\\b\\*{1})").matcher(input); |
141 | | - if (cb.find()) { |
142 | | - result = cb.toMatchResult(); |
143 | | - text = input.substring(0, result.start()); |
144 | | - input = input.substring(result.end()); |
145 | | - javadoc.append("<i>").append(text).append("</i>"); |
146 | | - } else { |
147 | | - javadoc.append(markup); |
148 | | - } |
149 | | - } else if (markup.startsWith("[")) { |
150 | | - //TODO this seems incorrect, there's a "](" between link and label |
151 | | - Matcher cb = Pattern.compile("([^\\[]+)\\]\\((http.+)\\)", Pattern.DOTALL).matcher(input); |
152 | | - if (cb.find()) { |
153 | | - result = cb.toMatchResult(); |
154 | | - String label = result.group(1); |
155 | | - String link = result.group(2); |
156 | | - if (input.startsWith(label + "](" + link)) { |
157 | | - input = input.substring(label.length() + link.length() + 2); |
158 | | - javadoc.append("<a href=\"").append(link).append("\">") |
159 | | - .append(parseDocumentation(label)).append("</a>"); |
160 | | - } else { |
161 | | - javadoc.append(markup); |
162 | | - } |
163 | | - } else { |
164 | | - javadoc.append(markup); |
165 | | - } |
166 | | - } else { |
167 | | - javadoc.append(markup); |
168 | | - } |
| 74 | + Node document = parser.parse(docs); |
| 75 | + JavaDocRenderer renderer = JavaDocRenderer.builder().build(); |
| 76 | + return renderer.render(document); |
| 77 | + } |
169 | 78 |
|
170 | | - } else { |
171 | | - javadoc.append(input); |
172 | | - break; |
173 | | - } |
174 | | - } |
175 | 79 |
|
176 | | - return javadoc.toString(); |
177 | | - } |
178 | 80 | } |
0 commit comments