diff --git a/src/main/java/app/model/languages/Java.java b/src/main/java/app/model/languages/Java.java index d3bb51b..61dc1df 100644 --- a/src/main/java/app/model/languages/Java.java +++ b/src/main/java/app/model/languages/Java.java @@ -3,7 +3,10 @@ package app.model.languages; import java.net.URL; import java.util.AbstractMap; import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; +import java.util.AbstractMap.SimpleEntry; import java.util.Map.Entry; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -30,11 +33,12 @@ public class Java implements ProgrammingLanguage { }; private static Entry e(String k, String v) { - return new AbstractMap.SimpleEntry<>(Pattern.compile(k), v); + return new SimpleEntry<>(Pattern.compile(k), v); } - private static final Map pattern = - Map.ofEntries( + + private static final List> patternList = + List.of( e("\"([^\"\\\\]|\\\\.)*\"", "string"), e("\\bthis\\b", "this"), e("\\btrue\\b", "true"), @@ -50,6 +54,14 @@ public class Java implements ProgrammingLanguage { "keyword"), e("(?://.*)|/\\*(?:\\n|.)*?\\*/", "comment") ); + + private static Map pattern; + + public Java() { + pattern = new LinkedHashMap<>(); + patternList + .forEach(e -> pattern.put(e.getKey(), e.getValue())); + } public String getName() { return this.name; @@ -60,6 +72,7 @@ public class Java implements ProgrammingLanguage { } public Map getPatternMap() { + return Java.pattern; } diff --git a/src/main/java/app/model/languages/Markdown.java b/src/main/java/app/model/languages/Markdown.java index f6e0965..30df72e 100644 --- a/src/main/java/app/model/languages/Markdown.java +++ b/src/main/java/app/model/languages/Markdown.java @@ -3,6 +3,8 @@ package app.model.languages; import java.net.URL; import java.util.AbstractMap; import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.regex.Pattern; @@ -19,8 +21,8 @@ public class Markdown implements ProgrammingLanguage { return new AbstractMap.SimpleEntry<>(Pattern.compile(k), v); } - private static final Map pattern = - Map.ofEntries( + private static final List> patternList = + List.of( e("", "comment"), e("##### .*", "ssssheader"), e("#### .*", "sssheader"), @@ -38,6 +40,14 @@ public class Markdown implements ProgrammingLanguage { e("\\[\\d+\\]: .*", "source") ); + private static Map pattern; + + public Markdown() { + pattern = new LinkedHashMap<>(); + patternList + .forEach(e -> pattern.put(e.getKey(), e.getValue())); + } + public String getName() { return this.name; } diff --git a/src/test/java/app/service/LanguageOperationsTest.java b/src/test/java/app/service/LanguageOperationsTest.java new file mode 100644 index 0000000..4261383 --- /dev/null +++ b/src/test/java/app/service/LanguageOperationsTest.java @@ -0,0 +1,160 @@ +package app.service; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.Collection; +import java.util.Collections; + +import org.fxmisc.richtext.model.StyleSpan; +import org.fxmisc.richtext.model.StyleSpans; +import org.fxmisc.richtext.model.StyleSpansBuilder; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import app.model.languages.Java; + +public class LanguageOperationsTest { + + private String javaCode = +""" +class TestClass { + // This is a comment + private int myInt = 1; + + /* + * This is a longer comment + */ + public int getMyInt() { + return this.myInt; + } + + public static void main(String[] args) { + TestClass class = new TestClass(); + System.out.println(class.getMyInt()); + System.out.println(\"This is a string\"); + System.out.println(true); + } +} +"""; + + private StyleSpan> s(String style, int length) { + return new StyleSpan>(Collections.singleton(style), length); + } + + private StyleSpan> s(int length) { + return new StyleSpan>(Collections.emptyList(), length); + } + + private StyleSpans> javaStyle = + new StyleSpansBuilder>() + .add(s("keyword", 5)) + .add(s(1)) + .add(s("identifier", 9)) + .add(s(1)) + .add(s("curlyBrackets", 1)) + .add(s(3)) + .add(s("comment", 20)) + .add(s(3)) + .add(s("keyword", 7)) + .add(s(1)) + .add(s("keyword", 3)) + .add(s(10)) + .add(s("semicolon", 1)) + .add(s(4)) + .add(s("comment", 36)) + .add(s(3)) + .add(s("keyword", 6)) + .add(s(1)) + .add(s("keyword", 3)) + .add(s(1)) + .add(s("method", 8)) + .add(s("paranthesis", 2)) + .add(s(1)) + .add(s("curlyBrackets", 1)) + .add(s(5)) + .add(s("keyword", 6)) + .add(s(1)) + .add(s("this", 4)) + .add(s("property", 6)) + .add(s("semicolon", 1)) + .add(s(3)) + .add(s("curlyBrackets", 1)) + .add(s(4)) + .add(s("keyword", 6)) + .add(s(1)) + .add(s("keyword", 6)) + .add(s(1)) + .add(s("keyword", 4)) + .add(s(1)) + .add(s("method", 4)) + .add(s("paranthesis", 1)) + .add(s("identifier", 6)) + .add(s("squareBrackets", 2)) + .add(s(5)) + .add(s("paranthesis", 1)) + .add(s(1)) + .add(s("curlyBrackets", 1)) + .add(s(5)) + .add(s("identifier", 9)) + .add(s(1)) + .add(s("keyword", 5)) + .add(s(3)) + .add(s("keyword", 3)) + .add(s(1)) + .add(s("method", 9)) + .add(s("paranthesis", 2)) + .add(s("semicolon", 1)) + .add(s(5)) + .add(s("identifier", 6)) + .add(s("property", 4)) + .add(s(1)) + .add(s("method", 7)) + .add(s("paranthesis", 1)) + .add(s("keyword", 5)) + .add(s(1)) + .add(s("method", 8)) + .add(s("paranthesis", 3)) + .add(s("semicolon", 1)) + .add(s(5)) + .add(s("identifier", 6)) + .add(s("property", 4)) + .add(s(1)) + .add(s("method", 7)) + .add(s("paranthesis", 1)) + .add(s("string", 18)) + .add(s("paranthesis", 1)) + .add(s("semicolon", 1)) + .add(s(5)) + .add(s("identifier", 6)) + .add(s("property", 4)) + .add(s(1)) + .add(s("method", 7)) + .add(s("paranthesis", 1)) + .add(s("true", 4)) + .add(s("paranthesis", 1)) + .add(s("semicolon", 1)) + .add(s(3)) + .add(s("curlyBrackets", 1)) + .add(s(1)) + .add(s("curlyBrackets", 1)) + .add(s(1)) + .create(); + + @Test + @DisplayName("") + public void testSyntaxHighlighting() { + StyleSpans> highlightData = + LanguageOperations.syntaxHighlight(javaCode, new Java()); + + // highlightData.forEach(sp -> + // System.out.println( + // sp.getStyle().isEmpty() + // ? String.format(".add(s(%d))", sp.getLength()) + // : String.format(".add(s(\"%s\", %d))", sp.getStyle().toArray()[0], sp.getLength()) + // ) + // ); + + assertEquals(javaStyle, highlightData); + } + +}