fix #2243 add formatCode

This commit is contained in:
Shinsuke Sugaya 2019-09-08 20:11:11 +09:00
parent f5cc83de6a
commit d0ec71ccb5
3 changed files with 82 additions and 0 deletions

View file

@ -27,6 +27,7 @@ import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Base64;
import java.util.Calendar;
import java.util.Date;
@ -37,6 +38,8 @@ import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletRequest;
@ -359,4 +362,33 @@ public class FessFunctions {
}
return input.toString().replaceAll(regex, replacement);
}
public static String formatCode(final String prefix, final String input, final String style) {
if (input == null) {
return StringUtil.EMPTY;
}
final Pattern pattern = Pattern.compile("^" + prefix + "([0-9]+):(.*)$");
final String[] values = input.split("\n");
final List<String> list = new ArrayList<>(values.length);
int lineNum = 0;
for (final String line : values) {
final Matcher matcher = pattern.matcher(line);
if (matcher.matches()) {
if (lineNum == 0) {
lineNum = Integer.parseInt(matcher.group(1));
list.clear();
}
list.add(matcher.group(2));
} else {
list.add(line);
}
}
if (list.get(list.size() - 1).endsWith("...")) {
list.remove(list.size() - 1);
}
if (lineNum == 0) {
return "<pre class=\"" + style + "\">" + list.stream().collect(Collectors.joining("\n")) + "</pre>";
}
return "<pre class=\"" + style + " linenums:" + lineNum + "\">" + list.stream().collect(Collectors.joining("\n")) + "</pre>";
}
}

View file

@ -249,4 +249,12 @@
<function-signature>java.lang.String replace(java.lang.Object, java.lang.String, java.lang.String)</function-signature>
<example>${fe:replace(input, regex, replacement)}</example>
</function>
<function>
<description>Format a content as code.</description>
<name>formatCode</name>
<function-class>org.codelibs.fess.taglib.FessFunctions</function-class>
<function-signature>java.lang.String formatCode(java.lang.String, java.lang.String, java.lang.String)</function-signature>
<example>${fe:formatCode("L", doc.content_description, "prettyprint")}</example>
</function>
</taglib>

View file

@ -59,4 +59,46 @@ public class FessFunctionsTest extends UnitFessTestCase {
date = FessFunctions.parseDate("D:20040401033456-05'00'", "pdf_date");
assertEquals("2004-04-01T08:34:56.000Z", FessFunctions.formatDate(date));
}
public void test_formatCode() {
String code;
String value;
code = "";
value = FessFunctions.formatCode("L", code, "prettyprint");
assertEquals("<pre class=\"prettyprint\"></pre>", value);
code = "aaa";
value = FessFunctions.formatCode("L", code, "prettyprint");
assertEquals("<pre class=\"prettyprint\">aaa</pre>", value);
code = "aaa\nbbb";
value = FessFunctions.formatCode("L", code, "prettyprint");
assertEquals("<pre class=\"prettyprint\">aaa\nbbb</pre>", value);
code = "aaa\nbbb\nccc";
value = FessFunctions.formatCode("L", code, "prettyprint");
assertEquals("<pre class=\"prettyprint\">aaa\nbbb\nccc</pre>", value);
code = "L10:aaa";
value = FessFunctions.formatCode("L", code, "prettyprint");
assertEquals("<pre class=\"prettyprint linenums:10\">aaa</pre>", value);
code = "L10:aaa\nL11:bbb";
value = FessFunctions.formatCode("L", code, "prettyprint");
assertEquals("<pre class=\"prettyprint linenums:10\">aaa\nbbb</pre>", value);
code = "L10:aaa\nL11:bbb\nL12:ccc";
value = FessFunctions.formatCode("L", code, "prettyprint");
assertEquals("<pre class=\"prettyprint linenums:10\">aaa\nbbb\nccc</pre>", value);
code = "aaa\nL11:bbb\nL12:ccc";
value = FessFunctions.formatCode("L", code, "prettyprint");
assertEquals("<pre class=\"prettyprint linenums:11\">bbb\nccc</pre>", value);
code = "L10:aaa\nL11:bbb\nL12:ccc...";
value = FessFunctions.formatCode("L", code, "prettyprint");
assertEquals("<pre class=\"prettyprint linenums:10\">aaa\nbbb</pre>", value);
}
}