Shinsuke Sugaya 5 rokov pred
rodič
commit
d0ec71ccb5

+ 32 - 0
src/main/java/org/codelibs/fess/taglib/FessFunctions.java

@@ -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>";
+    }
 }

+ 8 - 0
src/main/webapp/WEB-INF/fe.tld

@@ -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>

+ 42 - 0
src/test/java/org/codelibs/fess/taglib/FessFunctionsTest.java

@@ -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);
+
+    }
 }