io.vrap.codegen.languages.extensions.DescriptionFacetExtensions.kt Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of codegen-renderers Show documentation
Show all versions of codegen-renderers Show documentation
RAML API client code generators based on the REST Modeling Framework. https://github.com/vrapio/rest-modeling-framework
The newest version!
package io.vrap.codegen.languages.extensions
import io.vrap.rmf.raml.model.types.AnnotationsFacet
import io.vrap.rmf.raml.model.types.DescriptionFacet
import io.vrap.rmf.raml.model.types.ObjectInstance
import io.vrap.rmf.raml.model.types.StringInstance
import org.commonmark.parser.Parser
import org.commonmark.renderer.html.HtmlRenderer
import org.jsoup.Jsoup
import org.jsoup.nodes.Document.OutputSettings
import org.jsoup.nodes.Entities
import org.jsoup.safety.Safelist
import java.nio.charset.StandardCharsets
private val HTML_RENDERER = HtmlRenderer.builder().build()
private val PARSER = Parser.builder().build()
private val outputSettings = OutputSettings()
.escapeMode(Entities.EscapeMode.extended)
.charset(StandardCharsets.UTF_8)
/**
* This extension method converts the description from markdown to html and wraps the result in doc comment.
*
* @return the description of this as a doc comment
*/
fun DescriptionFacet.toComment(empty: String = ""): String {
val htmlString = this.toHtml()
return if(htmlString.isNullOrBlank()){
empty
}else{
htmlString.filterLinks().let { it.lines().map { " * $it" }.joinToString(separator = "\n") }
}
}
fun DescriptionFacet.toHtml() = this
.description
?.value
?.let(PARSER::parse)
?.let(HTML_RENDERER::render)
?.trim()
fun String.filterLinks(): String {
return Jsoup.clean(this, "", Safelist.basic().removeTags("a"), outputSettings)
.replace("€", "€")
}
/**
* This method extracts the javadoc comment from the "enumDescriptions" annotation - which is of object type.
* Each key corresponds to an enum value and the value contains the markdown description of the enum.
*
* ResourceType:
* (enumDescriptions):
* channel: The channel resource type.
* type: string
* enum:
* - channel
* - cart-discount
*
*/
fun StringInstance.toComment(): String? {
val enumValues = (eContainer() as AnnotationsFacet).getAnnotation("enumDescriptions")
if (enumValues?.value is ObjectInstance) {
val description = (enumValues.value as ObjectInstance).getValue(value)
return if (description is StringInstance) {
description.value?.let(PARSER::parse)?.let(HTML_RENDERER::render)?.let { "/**\n${it.lines().map { '\t' + it }.joinToString(separator = "\n")}\n*/" }?.filterLinks()
} else {
null
}
}
return null
}