Skip to content

Commit 96f5143

Browse files
authored
Merge pull request #35 from jmini/patch-13
Migrate "html" and "dynamic-html" Codegen
2 parents cc19d1c + e7a1404 commit 96f5143

23 files changed

+10512
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
package io.swagger.codegen.languages.html;
2+
3+
import io.swagger.codegen.CliOption;
4+
import io.swagger.codegen.CodegenConfig;
5+
import io.swagger.codegen.CodegenConstants;
6+
import io.swagger.codegen.CodegenType;
7+
import io.swagger.codegen.SupportingFile;
8+
import io.swagger.codegen.languages.DefaultCodegenConfig;
9+
import org.apache.commons.lang3.StringUtils;
10+
import java.io.File;
11+
12+
public class StaticDocCodegen extends DefaultCodegenConfig implements CodegenConfig {
13+
protected String invokerPackage = "io.swagger.client";
14+
protected String groupId = "io.swagger";
15+
protected String artifactId = "swagger-client";
16+
protected String artifactVersion = "1.0.0";
17+
protected String sourceFolder = "docs";
18+
19+
public StaticDocCodegen() {
20+
super();
21+
22+
// clear import mapping (from default generator) as this generator does not use it
23+
// at the moment
24+
importMapping.clear();
25+
26+
outputFolder = "docs";
27+
modelTemplateFiles.put("model.mustache", ".html");
28+
apiTemplateFiles.put("operation.mustache", ".html");
29+
30+
cliOptions.add(new CliOption(CodegenConstants.INVOKER_PACKAGE, CodegenConstants.INVOKER_PACKAGE_DESC));
31+
cliOptions.add(new CliOption(CodegenConstants.GROUP_ID, CodegenConstants.GROUP_ID_DESC));
32+
cliOptions.add(new CliOption(CodegenConstants.ARTIFACT_ID, CodegenConstants.ARTIFACT_ID_DESC));
33+
cliOptions.add(new CliOption(CodegenConstants.ARTIFACT_VERSION, CodegenConstants.ARTIFACT_VERSION_DESC));
34+
35+
additionalProperties.put(CodegenConstants.INVOKER_PACKAGE, invokerPackage);
36+
additionalProperties.put(CodegenConstants.GROUP_ID, groupId);
37+
additionalProperties.put(CodegenConstants.ARTIFACT_ID, artifactId);
38+
additionalProperties.put(CodegenConstants.ARTIFACT_VERSION, artifactVersion);
39+
40+
supportingFiles.add(new SupportingFile("package.mustache", "", "package.json"));
41+
supportingFiles.add(new SupportingFile("main.mustache", "", "main.js"));
42+
supportingFiles.add(new SupportingFile("assets/css/bootstrap-responsive.css", outputFolder + "/assets/css", "bootstrap-responsive.css"));
43+
supportingFiles.add(new SupportingFile("assets/css/bootstrap.css", outputFolder + "/assets/css", "bootstrap.css"));
44+
supportingFiles.add(new SupportingFile("assets/css/style.css", outputFolder + "/assets/css", "style.css"));
45+
supportingFiles.add(new SupportingFile("assets/images/logo.png", outputFolder + "/assets/images", "logo.png"));
46+
supportingFiles.add(new SupportingFile("assets/js/bootstrap.js", outputFolder + "/assets/js", "bootstrap.js"));
47+
supportingFiles.add(new SupportingFile("assets/js/jquery-1.8.3.min.js", outputFolder + "/assets/js", "jquery-1.8.3.min.js"));
48+
supportingFiles.add(new SupportingFile("assets/js/main.js", outputFolder + "/assets/js", "main.js"));
49+
supportingFiles.add(new SupportingFile("index.mustache", outputFolder, "index.html"));
50+
51+
instantiationTypes.put("array", "ArrayList");
52+
instantiationTypes.put("map", "HashMap");
53+
}
54+
55+
@Override
56+
public CodegenType getTag() {
57+
return CodegenType.DOCUMENTATION;
58+
}
59+
60+
@Override
61+
public String getArgumentsLocation() {
62+
return "";
63+
}
64+
65+
@Override
66+
public String getName() {
67+
return "dynamic-html";
68+
}
69+
70+
@Override
71+
public String getHelp() {
72+
return "Generates a dynamic HTML site.";
73+
}
74+
75+
@Override
76+
public void processOpts() {
77+
super.processOpts();
78+
79+
String templateVersion = getTemplateVersion();
80+
if (StringUtils.isNotBlank(templateVersion)) {
81+
embeddedTemplateDir = templateDir = String.format("%s/swagger-static", templateVersion);
82+
}
83+
else {
84+
embeddedTemplateDir = templateDir = String.format("%s/swagger-static", DEFAULT_TEMPLATE_VERSION);
85+
}
86+
}
87+
88+
@Override
89+
public String escapeReservedWord(String name) {
90+
if (this.reservedWordsMappings().containsKey(name)) {
91+
return this.reservedWordsMappings().get(name);
92+
}
93+
return "_" + name;
94+
}
95+
96+
@Override
97+
public String apiFileFolder() {
98+
return outputFolder + File.separator + sourceFolder + File.separator + "operations";
99+
}
100+
101+
@Override
102+
public String modelFileFolder() {
103+
return outputFolder + File.separator + sourceFolder + File.separator + "models";
104+
}
105+
106+
@Override
107+
public String escapeQuotationMark(String input) {
108+
// just return the original string
109+
return input;
110+
}
111+
112+
@Override
113+
public String escapeUnsafeCharacters(String input) {
114+
// just return the original string
115+
return input;
116+
}
117+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
1+
package io.swagger.codegen.languages.html;
2+
3+
import io.swagger.codegen.CliOption;
4+
import io.swagger.codegen.CodegenConfig;
5+
import io.swagger.codegen.CodegenConstants;
6+
import io.swagger.codegen.CodegenModel;
7+
import io.swagger.codegen.CodegenOperation;
8+
import io.swagger.codegen.CodegenParameter;
9+
import io.swagger.codegen.CodegenProperty;
10+
import io.swagger.codegen.CodegenResponse;
11+
import io.swagger.codegen.CodegenType;
12+
import io.swagger.codegen.SupportingFile;
13+
import io.swagger.codegen.languages.DefaultCodegenConfig;
14+
import io.swagger.codegen.utils.Markdown;
15+
import io.swagger.v3.oas.models.OpenAPI;
16+
import io.swagger.v3.oas.models.info.Info;
17+
import io.swagger.v3.oas.models.media.ArraySchema;
18+
import io.swagger.v3.oas.models.media.MapSchema;
19+
import io.swagger.v3.oas.models.media.Schema;
20+
import org.apache.commons.lang3.StringUtils;
21+
import java.util.HashMap;
22+
import java.util.HashSet;
23+
import java.util.List;
24+
import java.util.Map;
25+
26+
public class StaticHtmlCodegen extends DefaultCodegenConfig implements CodegenConfig {
27+
protected String invokerPackage = "io.swagger.client";
28+
protected String groupId = "io.swagger";
29+
protected String artifactId = "swagger-client";
30+
protected String artifactVersion = "1.0.0";
31+
32+
public StaticHtmlCodegen() {
33+
super();
34+
outputFolder = "docs";
35+
36+
defaultIncludes = new HashSet<String>();
37+
38+
cliOptions.add(new CliOption("appName", "short name of the application"));
39+
cliOptions.add(new CliOption("appDescription", "description of the application"));
40+
cliOptions.add(new CliOption("infoUrl", "a URL where users can get more information about the application"));
41+
cliOptions.add(new CliOption("infoEmail", "an email address to contact for inquiries about the application"));
42+
cliOptions.add(new CliOption("licenseInfo", "a short description of the license"));
43+
cliOptions.add(new CliOption("licenseUrl", "a URL pointing to the full license"));
44+
cliOptions.add(new CliOption(CodegenConstants.INVOKER_PACKAGE, CodegenConstants.INVOKER_PACKAGE_DESC));
45+
cliOptions.add(new CliOption(CodegenConstants.GROUP_ID, CodegenConstants.GROUP_ID_DESC));
46+
cliOptions.add(new CliOption(CodegenConstants.ARTIFACT_ID, CodegenConstants.ARTIFACT_ID_DESC));
47+
cliOptions.add(new CliOption(CodegenConstants.ARTIFACT_VERSION, CodegenConstants.ARTIFACT_VERSION_DESC));
48+
49+
additionalProperties.put("appName", "Swagger Sample");
50+
additionalProperties.put("appDescription", "A sample swagger server");
51+
additionalProperties.put("infoUrl", "https://helloreverb.com");
52+
additionalProperties.put("infoEmail", "[email protected]");
53+
additionalProperties.put("licenseInfo", "All rights reserved");
54+
additionalProperties.put("licenseUrl", "http://apache.org/licenses/LICENSE-2.0.html");
55+
additionalProperties.put(CodegenConstants.INVOKER_PACKAGE, invokerPackage);
56+
additionalProperties.put(CodegenConstants.GROUP_ID, groupId);
57+
additionalProperties.put(CodegenConstants.ARTIFACT_ID, artifactId);
58+
additionalProperties.put(CodegenConstants.ARTIFACT_VERSION, artifactVersion);
59+
60+
supportingFiles.add(new SupportingFile("index.mustache", "", "index.html"));
61+
reservedWords = new HashSet<String>();
62+
63+
languageSpecificPrimitives = new HashSet<String>();
64+
importMapping = new HashMap<String, String>();
65+
}
66+
67+
/**
68+
* Convert Markdown (CommonMark) to HTML. This class also disables normal HTML
69+
* escaping in the Mustache engine (see processCompiler(Compiler) above.)
70+
*/
71+
@Override
72+
public String escapeText(String input) {
73+
// newline escaping disabled for HTML documentation for markdown to work correctly
74+
return toHtml(input);
75+
}
76+
77+
@Override
78+
public CodegenType getTag() {
79+
return CodegenType.DOCUMENTATION;
80+
}
81+
82+
@Override
83+
public String getArgumentsLocation() {
84+
return "";
85+
}
86+
87+
@Override
88+
public String getName() {
89+
return "html";
90+
}
91+
92+
@Override
93+
public String getHelp() {
94+
return "Generates a static HTML file.";
95+
}
96+
97+
@Override
98+
public String getTypeDeclaration(Schema propertySchema) {
99+
if (propertySchema instanceof ArraySchema) {
100+
Schema inner = ((ArraySchema) propertySchema).getItems();
101+
return String.format("%s[%s]", getSchemaType(propertySchema), getTypeDeclaration(inner));
102+
}
103+
else if (propertySchema instanceof MapSchema) {
104+
Schema inner = (Schema) propertySchema.getAdditionalProperties();
105+
return String.format("%s[String, %s]", getSchemaType(propertySchema), getTypeDeclaration(inner));
106+
}
107+
return super.getTypeDeclaration(propertySchema);
108+
}
109+
110+
@Override
111+
public Map<String, Object> postProcessOperations(Map<String, Object> objs) {
112+
Map<String, Object> operations = (Map<String, Object>) objs.get("operations");
113+
List<CodegenOperation> operationList = (List<CodegenOperation>) operations.get("operation");
114+
for (CodegenOperation op : operationList) {
115+
op.httpMethod = op.httpMethod.toLowerCase();
116+
for (CodegenResponse response : op.responses) {
117+
if ("0".equals(response.code)) {
118+
response.code = "default";
119+
}
120+
}
121+
}
122+
return objs;
123+
}
124+
125+
@Override
126+
public void processOpts() {
127+
super.processOpts();
128+
129+
String templateVersion = getTemplateVersion();
130+
if (StringUtils.isNotBlank(templateVersion)) {
131+
embeddedTemplateDir = templateDir = String.format("%s/htmlDocs", templateVersion);
132+
}
133+
else {
134+
embeddedTemplateDir = templateDir = String.format("%s/htmlDocs", DEFAULT_TEMPLATE_VERSION);
135+
}
136+
}
137+
138+
@Override
139+
public String escapeQuotationMark(String input) {
140+
// just return the original string
141+
return input;
142+
}
143+
144+
@Override
145+
public String escapeUnsafeCharacters(String input) {
146+
// just return the original string
147+
return input;
148+
}
149+
150+
private Markdown markdownConverter = new Markdown();
151+
152+
/**
153+
* Convert Markdown text to HTML
154+
*
155+
* @param input
156+
* text in Markdown; may be null.
157+
* @return the text, converted to Markdown. For null input, "" is returned.
158+
*/
159+
public String toHtml(String input) {
160+
if (input == null)
161+
return "";
162+
return markdownConverter.toHtml(input);
163+
}
164+
165+
// DefaultCodegen converts model names to UpperCamelCase
166+
// but for static HTML, we want the names to be preserved as coded in the OpenApi
167+
// so HTML links work
168+
@Override
169+
public String toModelName(final String name) {
170+
return name;
171+
}
172+
173+
public void preprocessOpenAPI(OpenAPI openAPI) {
174+
Info info = openAPI.getInfo();
175+
info.setDescription(toHtml(info.getDescription()));
176+
info.setTitle(toHtml(info.getTitle()));
177+
if (openAPI.getComponents() == null || openAPI.getComponents().getSchemas() == null) {
178+
return;
179+
}
180+
Map<String, Schema> schemas = openAPI.getComponents().getSchemas();
181+
for (Schema schema : schemas.values()) {
182+
schema.setDescription(toHtml(schema.getDescription()));
183+
schema.setTitle(toHtml(schema.getTitle()));
184+
}
185+
}
186+
187+
// override to post-process any parameters
188+
public void postProcessParameter(CodegenParameter parameter) {
189+
parameter.description = toHtml(parameter.description);
190+
parameter.unescapedDescription = toHtml(parameter.unescapedDescription);
191+
}
192+
193+
// override to post-process any model properties
194+
public void postProcessModelProperty(CodegenModel model, CodegenProperty property) {
195+
property.description = toHtml(property.description);
196+
property.unescapedDescription = toHtml(property.unescapedDescription);
197+
}
198+
199+
}

src/main/resources/META-INF/services/io.swagger.codegen.CodegenConfig

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
io.swagger.codegen.languages.html.StaticDocCodegen
2+
io.swagger.codegen.languages.html.StaticHtmlCodegen
13
io.swagger.codegen.languages.java.JavaClientCodegen
24
io.swagger.codegen.languages.java.JavaCXFServerCodegen
35
io.swagger.codegen.languages.java.JavaInflectorServerCodegen
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{{#is this 'body-param'}}<div class="param">{{baseName}} {{#baseType}}<a href="#{{baseType}}">{{baseType}}</a>{{/baseType}} {{^required}}(optional){{/required}}{{#required}}(required){{/required}}</div>
2+
3+
<div class="param-desc"><span class="param-type">Body Parameter</span> &mdash; {{unescapedDescription}} {{#defaultValue}}default: {{{defaultValue}}}{{/defaultValue}}</div>{{/is}}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{{#is this 'form-param'}}<div class="param">{{baseName}} {{^required}}(optional){{/required}}{{#required}}(required){{/required}}</div>
2+
3+
<div class="param-desc"><span class="param-type">Form Parameter</span> &mdash; {{unescapedDescription}} {{#defaultValue}}default: {{{defaultValue}}} {{/defaultValue}}{{#dataFormat}}format: {{{dataFormat}}}{{/dataFormat}}</div>{{/is}}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{{#is this 'header-param'}}<div class="param">{{baseName}} {{^required}}(optional){{/required}}{{#required}}(required){{/required}}</div>
2+
3+
<div class="param-desc"><span class="param-type">Header Parameter</span> &mdash; {{unescapedDescription}} {{#defaultValue}}default: {{{defaultValue}}} {{/defaultValue}}{{#dataFormat}}format: {{{dataFormat}}}{{/dataFormat}}</div>{{/is}}

0 commit comments

Comments
 (0)