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 }