From 8dda5c3bed89ca0d8b10ef43cf1de569efc8af68 Mon Sep 17 00:00:00 2001 From: Luke Date: Tue, 24 Jun 2025 14:44:08 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=85=BC=E5=AE=B9=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E5=BC=95=E5=8F=B7=E7=9A=84=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/jcnc/snow/pkg/dsl/CloudDSLParser.java | 31 ++++++++++++++++--- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/jcnc/snow/pkg/dsl/CloudDSLParser.java b/src/main/java/org/jcnc/snow/pkg/dsl/CloudDSLParser.java index 5c61337..301e11d 100644 --- a/src/main/java/org/jcnc/snow/pkg/dsl/CloudDSLParser.java +++ b/src/main/java/org/jcnc/snow/pkg/dsl/CloudDSLParser.java @@ -19,13 +19,14 @@ import java.util.regex.Pattern; *
  • 顶级区块(如 project、properties、repositories、dependencies、build)以 sectionName { 开始,以 } 结束
  • *
  • 区块内部只识别 key = value 赋值,行尾可有 # 注释
  • *
  • build 区块支持嵌套,内部键通过 . 展平,例如 compile.enabled = true
  • + *
  • 新增:"value"'value' 形式的字面量自动去引号,调用方得到的均是不含引号的裸字符串
  • * * *
      * 示例 .cloud 文件片段:
      * project {
      *   group = com.example
    - *   artifact = demo
    + *   artifact = "demo-app"
      *   version = 1.0.0
      * }
      * 
    @@ -34,19 +35,25 @@ public final class CloudDSLParser { /** 匹配 sectionName { 的行 */ private static final Pattern SECTION_HEADER = Pattern.compile("^(\\w+)\\s*\\{\\s*$"); - /** 匹配 key = value 行,忽略行尾注释 */ - private static final Pattern KEY_VALUE = Pattern.compile("^(\\w+)\\s*=\\s*([^#]+?)\\s*(?:#.*)?$"); + + /** + * 匹配 key = value 行,忽略行尾注释。 + * 使用非贪婪匹配 .*?,确保 value 内部允许出现空格或 =。 + */ + private static final Pattern KEY_VALUE = Pattern.compile("^(\\w+)\\s*=\\s*(.*?)\\s*(?:#.*)?$"); + /** 匹配仅为 } 的行 */ private static final Pattern BLOCK_END = Pattern.compile("^}\\s*$"); - /** 私有构造方法,工具类禁止实例化 */ + /** 工具类禁止实例化 */ private CloudDSLParser() {} /** * 解析指定 .cloud 文件为 {@link Project} 对象。 * * * @param path .cloud 文件路径 @@ -92,6 +99,7 @@ public final class CloudDSLParser { if (kv.matches()) { String key = kv.group(1).trim(); String value = kv.group(2).trim(); + value = unquote(value); // 去除首尾成对引号 // 计算区块前缀 String prefix = String.join(".", (Iterable) sectionStack::descendingIterator); @@ -115,4 +123,17 @@ public final class CloudDSLParser { // 构建 Project 模型 return Project.fromFlatMap(flatMap); } + + /** + * 如果字符串首尾包裹成对单引号或双引号,则去掉引号后返回;否则直接返回原字符串。 + */ + private static String unquote(String s) { + if (s == null || s.length() < 2) return s; + char first = s.charAt(0); + char last = s.charAt(s.length() - 1); + if ((first == '"' && last == '"') || (first == '\'' && last == '\'')) { + return s.substring(1, s.length() - 1); + } + return s; + } }