From 899be85cdfbe28e2f2a83aa2092c481f8bc0b8ac Mon Sep 17 00:00:00 2001 From: zhangmeng <1334717033@qq.com> Date: Wed, 7 Jun 2023 10:37:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tools/controller/FileEditController.java | 77 ++++++++++++------ .../tools/languages/ProcessHtml.java | 14 ++-- src/main/resources/css/code.css | 19 +++-- src/main/resources/image/close.png | Bin 0 -> 5056 bytes src/main/resources/image/open.png | Bin 0 -> 3911 bytes 5 files changed, 73 insertions(+), 37 deletions(-) create mode 100644 src/main/resources/image/close.png create mode 100644 src/main/resources/image/open.png diff --git a/src/main/java/com/zhangmeng/tools/controller/FileEditController.java b/src/main/java/com/zhangmeng/tools/controller/FileEditController.java index 63994b9..a5fb65f 100644 --- a/src/main/java/com/zhangmeng/tools/controller/FileEditController.java +++ b/src/main/java/com/zhangmeng/tools/controller/FileEditController.java @@ -83,11 +83,7 @@ public class FileEditController { private RecursiveFileList recursiveFileList = null; private TabPane tabPane = null; - - private static String path = null; private final ObservableList filePaths_list = FXCollections.observableArrayList(); - private final SimpleIntegerProperty index = new SimpleIntegerProperty(0); - private final SimpleIntegerProperty text_size = new SimpleIntegerProperty(15); private final SimpleIntegerProperty icon_size = new SimpleIntegerProperty(15); private static final Map map = new HashMap<>(); @@ -99,9 +95,6 @@ public class FileEditController { save.setAccelerator(new KeyCodeCombination(KeyCode.S, KeyCodeCombination.CONTROL_DOWN)); open_file.setAccelerator(new KeyCodeCombination(KeyCode.F, KeyCodeCombination.CONTROL_DOWN)); open_dir.setAccelerator(new KeyCodeCombination(KeyCode.D, KeyCodeCombination.CONTROL_DOWN)); - - //读取本地加载记录 - Properties s = config_path(false); recursiveFileList = new RecursiveFileList(null); init_file_list(); tabPane = new TabPane(); @@ -160,9 +153,9 @@ public class FileEditController { HBox hBox = new HBox(10); ImageView iv = null; if (this.getTreeItem().isExpanded()) { - iv = new ImageView(new Image("image/向下.png")); + iv = new ImageView(new Image("image/close.png")); } else { - iv = new ImageView(new Image("image/向右.png")); + iv = new ImageView(new Image("image/open.png")); } iv.setPreserveRatio(true); iv.setFitWidth(icon_size.get()); @@ -245,7 +238,7 @@ public class FileEditController { if (filePaths_list.contains(path)) {//size -1 ,szie -2 //切换到一打开的tab Tab tab = map.get(path); - if (!tabPane.getTabs().contains(tab)){ + if (!tabPane.getTabs().contains(tab)) { tabPane.getTabs().add(tab); } tabPane.getSelectionModel().select(tab); @@ -287,9 +280,9 @@ public class FileEditController { }); tab.setContent(new VirtualizedScrollPane<>(codeArea)); filePaths_list.add(path); - tabPane.getTabs().add( tab); + tabPane.getTabs().add(tab); tabPane.getSelectionModel().select(tab); - map.put(path,tab); + map.put(path, tab); } } @@ -381,19 +374,53 @@ public class FileEditController { int lastKwEnd = 0; StyleSpansBuilder> spansBuilder = new StyleSpansBuilder<>(); while (matcher.find()) { - String styleClass = - matcher.group("KEYWORD") != null ? "keyword" : - matcher.group("PAREN") != null ? "paren" : - matcher.group("BRACE") != null ? "brace" : - matcher.group("BRACKET") != null ? "bracket" : - matcher.group("SEMICOLON") != null ? "semicolon" : - matcher.group("STRING") != null ? "string" : - matcher.group("COMMENT") != null ? "comment" : - matcher.group("ANNOTATION") != null ? "annotation" : - matcher.group("PARAMS") != null ? "parameter" : - matcher.group("METHOD") != null ? "method" : - matcher.group("KEYWORD2") != null ? "method2" : - null; /* never happens */ + String styleClass = ""; + + if (type.equals(Type.JAVA)) { + styleClass = matcher.group("KEYWORD") != null ? "keyword" : + matcher.group("PAREN") != null ? "paren" : + matcher.group("BRACE") != null ? "brace" : + matcher.group("BRACKET") != null ? "bracket" : + matcher.group("SEMICOLON") != null ? "semicolon" : + matcher.group("STRING") != null ? "string" : + matcher.group("COMMENT") != null ? "comment" : + matcher.group("ANNOTATION") != null ? "annotation" : + matcher.group("PARAMS") != null ? "parameter" : + matcher.group("METHOD") != null ? "method" : + matcher.group("KEYWORD2") != null ? "method2" : + null; /* never happens */ + } + if (type.equals(Type.GO)) { + styleClass = matcher.group("KEYWORD") != null ? "keyword" : + matcher.group("PAREN") != null ? "paren" : + matcher.group("BRACE") != null ? "brace" : + matcher.group("BRACKET") != null ? "bracket" : + matcher.group("SEMICOLON") != null ? "semicolon" : + matcher.group("STRING") != null ? "string" : + matcher.group("COMMENT") != null ? "comment" : + matcher.group("ANNOTATION") != null ? "annotation" : + matcher.group("PARAMS") != null ? "parameter" : + matcher.group("METHOD") != null ? "method" : + matcher.group("KEYWORD2") != null ? "method2" : + null; /* never happens */ + } + + if (type.equals(Type.HTML)) { + styleClass = matcher.group("PAREN") != null ? "paren" : + matcher.group("BRACE") != null ? "brace" : + matcher.group("BRACKET") != null ? "bracket" : + matcher.group("SEMICOLON") != null ? "semicolon" : + matcher.group("STRING") != null ? "string" : + matcher.group("COMMENT") != null ? "comment" : + matcher.group("ANNOTATION") != null ? "annotation" : + matcher.group("PARAMS") != null ? "parameter" : + matcher.group("METHOD") != null ? "method" : + matcher.group("HTMLKEYWORDS") != null ? "html-keyword" : //html 标签 + matcher.group("HTMLKEYWORDS2") != null ? "html-keyword2" : //html 属性 + null; /* never happens */ + } + + assert styleClass != null; spansBuilder.add(Collections.emptyList(), matcher.start() - lastKwEnd); spansBuilder.add(Collections.singleton(styleClass), matcher.end() - matcher.start()); diff --git a/src/main/java/com/zhangmeng/tools/languages/ProcessHtml.java b/src/main/java/com/zhangmeng/tools/languages/ProcessHtml.java index b8db767..e098ea3 100644 --- a/src/main/java/com/zhangmeng/tools/languages/ProcessHtml.java +++ b/src/main/java/com/zhangmeng/tools/languages/ProcessHtml.java @@ -9,20 +9,20 @@ import java.util.regex.Pattern; */ public class ProcessHtml { - public static final String[] KEYWORDS = new String[] { + public static final String[] HTMLKEYWORDS = new String[] { "DOCTYPE","doctype", "html", "head", "body", "h1", "h2","h3","h4","h5","h6", "p", "br","meta", "title","img", "hr", "a", "table","div","span", "ul", "dl","dd","i","script","li","link" }; - public static final String[] KEYWORDS2 = new String[] { + public static final String[] HTMLKEYWORDS2 = new String[] { "href", "name", "style", "rel", "id", "src","media","content","http-equiv", - "return","class","target","charset","lay-filter","window","global","document" + "return","class","target","charset","lay-filter","window","global","document","var" }; - public static final String KEYWORD_PATTERN = "\\b(" + String.join("|", KEYWORDS) + ")\\b"; - public static final String KEYWORD_PATTERN2 = "\\b(" + String.join("|", KEYWORDS2) + ")\\b"; + public static final String HTMLKEYWORDS_PATTERN = "\\b(" + String.join("|", HTMLKEYWORDS) + ")\\b"; + public static final String HTMLKEYWORDS_PATTERN2 = "\\b(" + String.join("|", HTMLKEYWORDS2) + ")\\b"; public static final String PAREN_PATTERN = "\\(|\\)"; public static final String BRACE_PATTERN = "\\{|\\}"; public static final String BRACKET_PATTERN = "\\[|\\]"; @@ -34,7 +34,7 @@ public class ProcessHtml { public static final String METHOD_PATTERN = "\\w+\\((\\w+,\\s*)*\\w*\\)"; public static final Pattern PATTERN = Pattern.compile( - "(?" + KEYWORD_PATTERN + ")" + "(?" + HTMLKEYWORDS_PATTERN + ")" + "|(?" + PAREN_PATTERN + ")" + "|(?" + BRACE_PATTERN + ")" + "|(?" + BRACKET_PATTERN + ")" @@ -44,7 +44,7 @@ public class ProcessHtml { + "|(?" + ANNOTATION_PATTERN + ")" + "|(?" + PARAMS_PATTERN + ")" + "|(?" + METHOD_PATTERN + ")" - + "|(?" + KEYWORD_PATTERN2 + ")" + + "|(?" + HTMLKEYWORDS_PATTERN2 + ")" ); diff --git a/src/main/resources/css/code.css b/src/main/resources/css/code.css index ffe2291..a27f1d1 100644 --- a/src/main/resources/css/code.css +++ b/src/main/resources/css/code.css @@ -69,7 +69,7 @@ /*-*/ /*信息文本的样式*/ .code-area .keyword { - -fx-fill: #10ADEBFF + -fx-fill: #d12746 } /*-*/ @@ -119,7 +119,7 @@ /*-*/ /*参数的样式*/ .code-area .annotation { - -fx-fill: #eeee07; + -fx-fill: #b76bd5; } /*-*/ @@ -151,12 +151,12 @@ /*-*/ /*字段的样式*/ .code-area .method { - -fx-fill: red; + -fx-fill: #8841c0; -fx-text-fill: red; } .code-area .method2 { - -fx-fill: #699f45; + -fx-fill: #10adeb; -fx-text-fill: red; } @@ -188,5 +188,14 @@ /*-*/ /*抽象的样式*/ .code-area .deprecated { - -fx-fill: #d12746; + -fx-fill: #03e921; } + +.code-area .html-keyword{ + -fx-fill: #66af22; +} + +.code-area .html-keyword2{ + -fx-fill: #1097eb; +} + diff --git a/src/main/resources/image/close.png b/src/main/resources/image/close.png new file mode 100644 index 0000000000000000000000000000000000000000..10f606cc7c0d37dfa1cd0d3aa170e8e06e6b0525 GIT binary patch literal 5056 zcmeHL`9D;D)W60yl*|-bkTEGK*_X1-n3=L~L)k**i=v1~3^KAMS;okcC1orz6xr8G zDA}28gRC)@#x{1(?YHN*=O1`}xcB{f-TS)dp7TD-=bZE0)L4g)_Y^Mx0DOA7I6R20 z|1KyOc&AzwWq`o;2(NNGOzZ+yFqUa*lu!UuK5*);W1e!1{N1|&XpLg!pcy7hpDsRaK7`y~t# znX1r)aFXJ(m@-4MiG}sKpLVAWRH*1o$8JH~j@=^u?f%T+4+HV{XAUbwz+pKy6eNI)IoW(89(;h08TTm==GegN}Y?je$ zi?Ctv;L=cva>&!Vy=!*$$L^?~8#h4f`)L9Tw%>w&+7J?A9b}1jsTIhH7Jm+nJ5>6d zqImgjh!zJK{{j=KESn2shA0^=Uzo4?fc``)zScwtg$XN$(6tm46japJcTiU)zfGo~ z?IDVaiY}LAWyj8k4rJVZgw!Lg4li!Zu59OchH<}|+Z=v`{&rO?Y!ksd!CBO)D4NK<^x$;Hzr9dtp}mvx#@f|%X=_OnVy;0M*ii!tq; zod@P{_0w$}{_y0qv;a?%ges)*A}^`h1j=-FTV!fHuIfbSOH~K$^lKPfo?MN^K&#FC z8+$X_lN%F2n^3Z$Z`$4`J-JiWYeO(QJ$w@qj~|5q>MNHQQk4}aC&fBSXWgQ9M)opX#f6jrudBn6Y2J`4OM z2paz3Ns6qLHR=_9ztR~L5fM!Gk_9X_Lb;Ic2EE?>^`q}0-8KzJ;L8G-`$b0;edz_+ z>LT?7?-m0C7(7<_)XPI4)h-?0+X7$!1zm$`Pdo{_r}$?vvSx{hF0PQXrZW{**@BCK zM%v?=J^tJsyY<6JN*Y)2pn_!A>NV(i`L%cQ9d<0!CWdH4^<=tn#HnBpK4o(tS-x3g zI*8CtfKmFKFp;mZMlksDlDC>;1i#om%T)e~@gCIB&`_hG`>rXwoTYDV^kEn?O3BDl zlSbH&qLl3``^qZdn{i&7l?}af(T{#37}cq#nNA6QT-Kg)nwo*exxHBq6&-C}Ha+_~Y{3~EGerbFG~-XR zPs?1%{2XzHRe^~-L@gU@JtkX$ZXMj*+?+9btzw3qUiV8&lIMaK>-UmJ39}Dcp}JDV z9Kmsn69Gf?M^pZ!q=(0kw(19FlPlO8%T3oOiU{X>eot7?MIFv2jF|k*aA%x_dBIAa zPo4{?E8C#|)^Ck}k9_m=W~N01VM7y z76X90TytT0999Mq$PA%81c$tik1BD2pbLrL!C}?8ydq|G`SGMtF*qzt%Go7^}g?B98 zqtkRdD6Ph#kF5HgSm^3)C$_G@oo><*F8lXA%)|(jT zLS2uoNj&awW9C1?roRBZ<%b%TD|NLiJRWb)0eH_q`$Z2h6~lBjRaI7hN!AU}nyDhY znhbe0HT_K7lLvzd_H7Qd~HDU7`&Yy>s`|Gcym21vM@ngBq3hyS@}b1?}E& zUAC0pQVv)uqjBvFUb$so#!n#+oe71OcK|>@!0Jr9tu2-2b^YN5!PXzyiTJhJmzI*f zlAb_i$B9*2t@8VmI%v1ROGqw44;vhnmLpZyXE`T?LoC&2|6DIq$U;oqNzEDY>6GX{ z0HmfN00$%HkoXX7Xl~ynV^KUAefI+U6Z9hOn56N)^w>fFJ*iD+f>GEld;R#%0Ac8+ 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 Kl`L`yVEqp|1P3z! literal 0 HcmV?d00001