All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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 includeTOC»
«ENDIF»
«new TopMatter().get(model)» «if(showPaths) model.pathsHtml» «if(showParams) model.parametersHtml» «if(showResponses) model.responsesHtml» «if(showDefs) model.definitionsHtml»
«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

«FOR path : model.paths?.keySet.sortByPosition(model.paths) ?: #[]» «new PathDoc(path).html» «ENDFOR»
''' } def private parametersHtml(OpenApi3 model) { '''

Parameters

«FOR param : model.parameters.keySet.sortByPosition(model.parameters)» «new ParamDoc(model, param).html» «ENDFOR»
''' } def private responsesHtml(OpenApi3 model) { '''

Responses

«FOR response : model.responses.keySet.sortByPosition(model.responses)» «new ResponseDoc(response).html» «ENDFOR»
''' } def private definitionsHtml(OpenApi3 model) { '''

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