1 /*
<lambda>null2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 package writer
18
19 import lexer.Token
20 import parser.files.AbstractFileParser
21 import java.io.File
22 import java.nio.file.Path
23 import java.nio.file.Paths
24
25 fun warn(msg: String) {
26 System.err.println("WARNING: $msg")
27 }
28
29 /**
30 * Get values of tokens, useful for debugging.
31 */
tokenValuesnull32 fun tokenValues(tokens: List<Token>): String {
33 return tokens.map { it.value }.joinToString("|")
34 }
35
36 /**
37 * Escape string for HTML.
38 */
htmlEscapenull39 fun htmlEscape(string: String): String {
40 val out = StringBuilder(Math.max(16, string.length))
41 string.toCharArray().forEach { c ->
42 if (c.toInt() > 127 || c == '"' || c == '<' || c == '>' || c == '&' || c == '$' || c == '{' || c == '}') {
43 out.append("&#")
44 out.append(c.toInt())
45 out.append(';')
46 } else {
47 out.append(c)
48 }
49 }
50 return out.toString()
51 }
52
53 /**
54 * Used to display description text.
55 */
formatTextasHTMLnull56 fun formatTextasHTML(string: String, useParagraphs: Boolean = true): String {
57 if (string.isEmpty()) return string
58
59 val sb = StringBuilder()
60 if (useParagraphs) sb.append("<p>")
61 //match and replace empty lines
62 val replaceText = if (useParagraphs) "</p>\n<p>" else "<br>\n"
63 sb.append(htmlEscape(string.trim()).replace(Regex("\\s*\n\n\\s*"), replaceText))
64 if (useParagraphs) sb.append("</p>")
65 return sb.toString()
66 }
67
68 private val summaryRegex = Regex("\\.|\n\n") //match period or empty line
69
70 /**
71 * Given a block of description text, return the first sentence.
72 */
getDescSummaryTextnull73 fun getDescSummaryText(string: String): String {
74 return if (string.isEmpty()) {
75 string
76 } else {
77 val s = string.trimStart() // remove any beginning empty lines/whitespace
78 val sb = StringBuilder(summaryRegex.split(s)[0])
79 if (sb[sb.length - 1] != '.') sb.append(".") // add period, if needed
80 formatTextasHTML(sb.toString())
81 }
82 }
83
84 /**
85 * Return the out file path for a given parser.
86 */
getOutPathnull87 fun getOutPath(parser: AbstractFileParser, outDir: Path): Path {
88 val pkgPath = parser.packageName.replace(".", File.separator)
89 val dirPath = "${outDir}${File.separator}${pkgPath}${File.separator}${parser.packageVersion}"
90 return Paths.get("${dirPath}${File.separator}${parser.name}.html")
91 }