/* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package writer import lexer.Token import parser.files.AbstractFileParser import java.io.File import java.nio.file.Path import java.nio.file.Paths fun warn(msg: String) { System.err.println("WARNING: $msg") } /** * Get values of tokens, useful for debugging. */ fun tokenValues(tokens: List<Token>): String { return tokens.map { it.value }.joinToString("|") } /** * Escape string for HTML. */ fun htmlEscape(string: String): String { val out = StringBuilder(Math.max(16, string.length)) string.toCharArray().forEach { c -> if (c.toInt() > 127 || c == '"' || c == '<' || c == '>' || c == '&' || c == '$' || c == '{' || c == '}') { out.append("&#") out.append(c.toInt()) out.append(';') } else { out.append(c) } } return out.toString() } /** * Used to display description text. */ fun formatTextasHTML(string: String, useParagraphs: Boolean = true): String { if (string.isEmpty()) return string val sb = StringBuilder() if (useParagraphs) sb.append("<p>") //match and replace empty lines val replaceText = if (useParagraphs) "</p>\n<p>" else "<br>\n" sb.append(htmlEscape(string.trim()).replace(Regex("\\s*\n\n\\s*"), replaceText)) if (useParagraphs) sb.append("</p>") return sb.toString() } private val summaryRegex = Regex("\\.|\n\n") //match period or empty line /** * Given a block of description text, return the first sentence. */ fun getDescSummaryText(string: String): String { return if (string.isEmpty()) { string } else { val s = string.trimStart() // remove any beginning empty lines/whitespace val sb = StringBuilder(summaryRegex.split(s)[0]) if (sb[sb.length - 1] != '.') sb.append(".") // add period, if needed formatTextasHTML(sb.toString()) } } /** * Return the out file path for a given parser. */ fun getOutPath(parser: AbstractFileParser, outDir: Path): Path { val pkgPath = parser.packageName.replace(".", File.separator) val dirPath = "${outDir}${File.separator}${pkgPath}${File.separator}${parser.packageVersion}" return Paths.get("${dirPath}${File.separator}${parser.name}.html") }