From 81978c4f33775da065d2807bb079be6d0b33cee6 Mon Sep 17 00:00:00 2001 From: zhangmeng <1334717033@qq.com> Date: Mon, 12 Jun 2023 18:18:33 +0800 Subject: [PATCH] =?UTF-8?q?2023=E5=B9=B46=E6=9C=8812=E6=97=A518:18:26?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tools/controller/FileEditController.java | 73 +++++++++++++++++-- .../zhangmeng/tools/languages/ProcessXML.java | 17 +++++ .../zhangmeng/tools/languages/ProcessYML.java | 39 ++++++++++ src/main/resources/css/code.css | 58 +++++++++++++++ 4 files changed, 182 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/zhangmeng/tools/languages/ProcessXML.java create mode 100644 src/main/java/com/zhangmeng/tools/languages/ProcessYML.java diff --git a/src/main/java/com/zhangmeng/tools/controller/FileEditController.java b/src/main/java/com/zhangmeng/tools/controller/FileEditController.java index 10b9a9d..18261e0 100644 --- a/src/main/java/com/zhangmeng/tools/controller/FileEditController.java +++ b/src/main/java/com/zhangmeng/tools/controller/FileEditController.java @@ -3,11 +3,9 @@ package com.zhangmeng.tools.controller; import cn.hutool.core.io.resource.ClassPathResource; import cn.hutool.core.io.resource.Resource; import com.zhangmeng.tools.components.RecursiveFileList; -import com.zhangmeng.tools.languages.ProcessGO; -import com.zhangmeng.tools.languages.ProcessHtml; -import com.zhangmeng.tools.languages.ProcessJava; -import com.zhangmeng.tools.languages.ProcessSql; +import com.zhangmeng.tools.languages.*; import com.zhangmeng.tools.utils.AlertUtils; +import com.zhangmeng.tools.utils.FxmlUtils; import javafx.application.Platform; import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.value.ChangeListener; @@ -78,7 +76,9 @@ public class FileEditController { GO, JS, CSS, - SQL + SQL, + XML, + YML } @FXML @@ -282,6 +282,32 @@ public class FileEditController { codeArea.replaceText(0, 0, file_content); Tab tab = new Tab(file.getName()); + ContextMenu contextMenu = new ContextMenu(); + MenuItem close = new MenuItem("close"); + MenuItem close_other_tabs = new MenuItem("close other tabs"); + MenuItem close_all = new MenuItem("close all"); + close_all.setOnAction(event -> { + tabPane.getTabs().clear(); + }); + close_other_tabs.setOnAction(event -> { + ObservableList tabs = tabPane.getTabs(); + ObservableList list = FXCollections.observableArrayList(tabs); + //关闭其他 + for (Tab tabPaneTab : list) { + if (tabPaneTab != tabPane.getSelectionModel().getSelectedItem()){ + tabs.remove(tabPaneTab); + } + } + }); + close.setOnAction(event -> { + //关闭当前窗口 + Tab selectedItem = tabPane.getSelectionModel().getSelectedItem(); + tabPane.getTabs().remove(selectedItem); + }); + contextMenu.getItems().add(close); + contextMenu.getItems().add(close_other_tabs); + contextMenu.getItems().add(close_all); + tab.setContextMenu(contextMenu); tab.setOnCloseRequest(new EventHandler() { @Override public void handle(Event event) { @@ -375,6 +401,12 @@ public class FileEditController { if (extension.equals("sql")) { type = Type.SQL; } + if (extension.equals("xml")) { + type = Type.XML; + } + if (extension.equals("yml")) { + type = Type.YML; + } if (type == null) { type = Type.JAVA; } @@ -395,6 +427,12 @@ public class FileEditController { if (type.equals(Type.SQL)) { matcher = ProcessSql.PATTERN.matcher(text); } + if (type.equals(Type.XML)) { + matcher = ProcessXML.PATTERN.matcher(text); + } + if (type.equals(Type.YML)) { + matcher = ProcessYML.PATTERN.matcher(text); + } int lastKwEnd = 0; StyleSpansBuilder> spansBuilder = new StyleSpansBuilder<>(); while (matcher.find()) { @@ -458,6 +496,31 @@ public class FileEditController { matcher.group("HTMLKEYWORDS2") != null ? "html-keyword2" : //html 属性 null; /* never happens */ } + if (type.equals(Type.XML)) { + if (matcher.group("ELEMENT") != null) { + if (matcher.group("ELEMENT").startsWith("(]*)(\\h*/?>))" + + "|(?)"; + + public static final Pattern PATTERN = Pattern.compile(XML_PATTERN); + +} diff --git a/src/main/java/com/zhangmeng/tools/languages/ProcessYML.java b/src/main/java/com/zhangmeng/tools/languages/ProcessYML.java new file mode 100644 index 0000000..6f24b67 --- /dev/null +++ b/src/main/java/com/zhangmeng/tools/languages/ProcessYML.java @@ -0,0 +1,39 @@ +package com.zhangmeng.tools.languages; + +import java.util.regex.Pattern; + +/** + * @author : 芊芊墨客 + * @version : 1.0 + * @date : 2023-06-12 17:17 + */ +public class ProcessYML { + + public static final String[] KEYWORDS = new String[] { + "true", "false", "yes", "no", "null","" + }; + + public static final String KEYWORD_PATTERN = "\\b(" + String.join("|", KEYWORDS) + ")\\b"; + public static final String NUMBER_PATTERN = "\\b\\d+\\b"; + public static final String STRING_PATTERN = "\"([^\"\\\\]|\\\\.)*\""; + public static final String COMMENT_PATTERN = "\\s*#.*"; + public static final String ANCHOR_ALIAS_PATTERN = "^(&|\\*)[a-zA-Z0-9_-]+$"; + public static final String TAG_PATTERN = "!\\S+"; + public static final String DOCUMENT_MARKER_PATTERN = "^(---|\\.\\.\\.)$"; + public static final String DIRECTIVE_PATTERN = "^%.+$"; + public static final String VARIABLE_PATTERN = "\\$\\{.+?\\}"; + + public static final Pattern PATTERN = Pattern.compile( + "(?" + KEYWORD_PATTERN + ")" + + "|(?" + NUMBER_PATTERN + ")" + + "|(?" + STRING_PATTERN + ")" + + "|(?" + COMMENT_PATTERN + ")" +// + "|(?" + ANCHOR_ALIAS_PATTERN + ")" + + "|(?" + TAG_PATTERN + ")" +// + "|(?" + DOCUMENT_MARKER_PATTERN + ")" + + "|(?" + DIRECTIVE_PATTERN + ")" + + "|(?" + VARIABLE_PATTERN + ")" + ); + + +} diff --git a/src/main/resources/css/code.css b/src/main/resources/css/code.css index a27f1d1..f1f9a8c 100644 --- a/src/main/resources/css/code.css +++ b/src/main/resources/css/code.css @@ -199,3 +199,61 @@ -fx-fill: #1097eb; } +.xml-open-tag { + -fx-fill: #0000FF; + -fx-font-weight: bold; +} + +.xml-close-tag { + -fx-fill: #0000FF; + -fx-font-weight: bold; +} + +.xml-comment { + -fx-fill: #008000; + -fx-font-style: italic; +} + +.comment { + -fx-fill: gray; +} + +.string { + -fx-fill: green; +} + +.keyword { + -fx-fill: blue; +} + +.number { + -fx-fill: red; +} + +.operator { + -fx-fill: black; +} + +.punctuation { + -fx-fill: black; +} + +.anchor-alias { + -fx-fill: purple; +} + +.tag { + -fx-fill: orange; +} + +.document-marker { + -fx-fill: brown; +} + +.directive { + -fx-fill: teal; +} + +.variable { + -fx-fill: darkgreen; +}