com.reprezen.genflow.openapi3.doc.XGenerateOpenApi3Doc.xtend Maven / Gradle / Ivy
package com.reprezen.genflow.openapi3.doc
import com.google.common.collect.Lists
import com.reprezen.genflow.api.openapi3.OpenApi3OutputItem
import com.reprezen.genflow.common.HtmlInjections
import com.reprezen.kaizen.oasparser.model3.OpenApi3
import java.util.List
import java.util.regex.Pattern
import static com.reprezen.genflow.common.HtmlInjections.*
class XGenerateOpenApi3Doc extends OpenApi3OutputItem {
extension OptionHelper optionHelper
extension HtmlHelper htmlHelper
extension MiscHelper miscHelper
extension HtmlInjections htmlInjections
override generate(OpenApi3 model) {
try {
HelperHelper.open(model, context)
optionHelper = HelperHelper.optionHelper
htmlHelper = HelperHelper.htmlHelper
miscHelper = HelperHelper.miscHelper
htmlInjections = context.genTargetParameters.get(HTML_INJECTIONS_PARAM) as HtmlInjections ?: new HtmlInjections()
doGenerate(model)
} finally {
HelperHelper.close()
}
}
def doGenerate(OpenApi3 model) {
val urlPrefix = getUrlPrefix
val preview = isPreview
val startTime = System.nanoTime
val showPaths = !model.paths.empty
val showDefs = (!preview || !showPaths) && !model.schemas.empty
val showParams = (!preview || !showPaths) && !model.parameters.empty
val showResponses = (!preview || !showPaths) && !model.responses.empty
val includeTOC = !preview && isIncludeTOC
val html = '''
«htmlHeadSection(model, urlPrefix, preview)»
«IF preview»
«BODY_BOTTOM.inject»
«ENDIF»
«IF includeTOC»
«ENDIF»
'''
html.removeUnwantedIndentation
}
def private elapsedTime(long nano) {
val msec = nano / 1000000
String.format("%d.%03d", msec / 1000, msec % 1000)
}
def private htmlHeadSection(OpenApi3 model, String urlPrefix, boolean preview) {
'''
«model?.info?.title» Documentation
«IF preview»
«ENDIF»
«IF preview»
«HEAD_BOTTOM.inject»
«ENDIF»
'''
}
def private pathsHtml(OpenApi3 model) {
'''
Path Specifications
Path Specifications
«FOR path : model.paths?.keySet.sortByPosition(model.paths) ?: #[]»
«new PathDoc(path).html»
«ENDFOR»
'''
}
def private parametersHtml(OpenApi3 model) {
'''
Parameters
Parameters
«FOR param : model.parameters.keySet.sortByPosition(model.parameters)»
«new ParamDoc(model, param).html»
«ENDFOR»
'''
}
def private responsesHtml(OpenApi3 model) {
'''
Responses
Responses
«FOR response : model.responses.keySet.sortByPosition(model.responses)»
«new ResponseDoc(response).html»
«ENDFOR»
'''
}
def private definitionsHtml(OpenApi3 model) {
'''
Schema Definitions
Schema Definitions
«FOR definition : model.schemas.keySet.sortByPosition(model.schemas)»
«new ModelDoc(definition).html»
«ENDFOR»
'''
}
val indentedPreBlock = Pattern.compile("^(\\s*)]*class=\"remove-xtend-indent\"[^>]*>.*$",
Pattern.CASE_INSENSITIVE + Pattern.DOTALL) // DOTALL so we match trailing \r chars
def private removeUnwantedIndentation(String html) {
return html.split("\n").removeUnwantedIndentation
}
def private removeUnwantedIndentation(List lines) {
var i = 0
val unindentedLines = Lists.newArrayList
while (i < lines.size) {
var line = lines.get(i)
var matcher = indentedPreBlock.matcher(line)
if (matcher.matches) {
var indentation = matcher.group(1)
var indentLen = matcher.end(1)
while (i < lines.size && line.startsWith(indentation)) {
unindentedLines.add(line.substring(indentLen))
i = i + 1
line = if(i < lines.size) lines.get(i) else ""
}
} else {
unindentedLines.add(lines.get(i))
i = i + 1
}
}
unindentedLines.join("\n")
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy
