1+ /*
2+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+ * SPDX-License-Identifier: Apache-2.0
4+ */
5+ package software .amazon .smithy .python .aws .codegen ;
6+
7+ import software .amazon .smithy .model .shapes .Shape ;
8+ import software .amazon .smithy .model .traits .DocumentationTrait ;
9+ import software .amazon .smithy .python .codegen .PythonSettings ;
10+ import software .amazon .smithy .python .codegen .integrations .PythonIntegration ;
11+ import software .amazon .smithy .utils .SmithyInternalApi ;
12+ import software .amazon .smithy .model .Model ;
13+ import software .amazon .smithy .model .transform .ModelTransformer ;
14+ import org .jsoup .Jsoup ;
15+ import org .jsoup .nodes .Document ;
16+ import org .jsoup .nodes .Element ;
17+ import org .jsoup .nodes .Node ;
18+ import org .jsoup .nodes .TextNode ;
19+ import org .jsoup .select .NodeVisitor ;
20+
21+ /**
22+ * Adds a runtime plugin to set user agent.
23+ */
24+ @ SmithyInternalApi
25+ public class AwsDocConverter implements PythonIntegration {
26+ @ Override
27+ public Model preprocessModel (Model model , PythonSettings settings ) {
28+ return ModelTransformer .create ().mapShapes (model , shape -> {
29+ if (shape .hasTrait (DocumentationTrait .class )) {
30+ DocumentationTrait docTrait = shape .getTrait (DocumentationTrait .class ).get ();
31+ String html = docTrait .getValue ();
32+ String rst = convertHtmlToRst (html );
33+ DocumentationTrait newDocTrait = new DocumentationTrait (rst );
34+ return Shape .shapeToBuilder (shape )
35+ .addTrait (newDocTrait )
36+ .build ();
37+ } else {
38+ return shape ;
39+ }
40+ });
41+ }
42+
43+ private String convertHtmlToRst (String html ) {
44+ Document document = Jsoup .parse (html );
45+ RstNodeVisitor visitor = new RstNodeVisitor ();
46+ document .body ().traverse (visitor );
47+ return visitor .toString ();
48+ }
49+
50+ private static class RstNodeVisitor implements NodeVisitor {
51+ private final StringBuilder sb = new StringBuilder ();
52+ private boolean inList = false ;
53+
54+ @ Override
55+ public void head (Node node , int depth ) {
56+ if (node instanceof TextNode ) {
57+ //TODO properly handle stripping whitespace
58+ Node parentNode = node .parent ();
59+ if (parentNode != null && parentNode .nodeName ().equals ("p" )) {
60+ //TODO write a test case like the following: <p> Foo <i>bar
61+ // </i> baz</p> -> "Foo *bar* baz"
62+ sb .append (((TextNode ) node ).text ().strip ());
63+ } else {
64+ sb .append (((TextNode ) node ).text ());
65+ }
66+ } else if (node instanceof Element ) {
67+ Element element = (Element ) node ;
68+ switch (element .tagName ()) {
69+ case "a" :
70+ sb .append ("`" );
71+ break ;
72+ case "b" :
73+ case "strong" :
74+ sb .append ("**" );
75+ break ;
76+ case "i" :
77+ case "em" :
78+ sb .append ("*" );
79+ break ;
80+ case "code" :
81+ sb .append (" ``" );
82+ break ;
83+ case "important" :
84+ sb .append (".. important::\n \n " );
85+ break ;
86+ case "note" :
87+ sb .append (".. note::\n \n " );
88+ break ;
89+ //TODO this looks a little weird on modelid for invoke_model input
90+ // do I do something weird based on if it's in a parameter cause
91+ // those are already bullets?
92+ case "ul" :
93+ inList = true ;
94+ sb .append ("\n " );
95+ break ;
96+ case "li" :
97+ if (inList ) {
98+ sb .append ("- " );
99+ }
100+ break ;
101+ }
102+ }
103+ }
104+
105+ @ Override
106+ public void tail (Node node , int depth ) {
107+ if (node instanceof Element ) {
108+ Element element = (Element ) node ;
109+ switch (element .tagName ()) {
110+ case "a" :
111+ sb .append (" <" ).append (element .attr ("href" )).append (">`_ " );
112+ break ;
113+ case "b" :
114+ case "strong" :
115+ sb .append ("**" );
116+ break ;
117+ case "i" :
118+ case "em" :
119+ sb .append ("*" );
120+ break ;
121+ case "code" :
122+ sb .append ("`` " );
123+ break ;
124+ case "important" :
125+ case "note" :
126+ sb .append ("\n \n " );
127+ break ;
128+ case "ul" :
129+ inList = false ;
130+ sb .append ("\n " );
131+ break ;
132+ case "p" :
133+ sb .append ("\n \n " );
134+ break ;
135+ }
136+ }
137+ }
138+
139+ @ Override
140+ public String toString () {
141+ return sb .toString ().trim ();
142+ }
143+ }
144+ }
0 commit comments