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

io.vrap.codegen.languages.extensions.DescriptionFacetExtensions.kt Maven / Gradle / Ivy

Go to download

RAML API client code generators based on the REST Modeling Framework. https://github.com/vrapio/rest-modeling-framework

There is a newer version: 1.0.0-20241120142200
Show 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 }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy