From f32a53f5534aa9f9a8591e8b197bb1f8acd9e6c0 Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Sun, 03 Jul 2022 21:42:36 +0800
Subject: [PATCH] fix cms core

---
 src/main/java/com/xcong/farmer/cms/core/node/AttrNode.java |   92 +++++++++++++++++++++++++++++++++++++--------
 1 files changed, 75 insertions(+), 17 deletions(-)

diff --git a/src/main/java/com/xcong/farmer/cms/cms/node/AttrNode.java b/src/main/java/com/xcong/farmer/cms/core/node/AttrNode.java
similarity index 67%
rename from src/main/java/com/xcong/farmer/cms/cms/node/AttrNode.java
rename to src/main/java/com/xcong/farmer/cms/core/node/AttrNode.java
index adf7a84..ce47824 100644
--- a/src/main/java/com/xcong/farmer/cms/cms/node/AttrNode.java
+++ b/src/main/java/com/xcong/farmer/cms/core/node/AttrNode.java
@@ -1,17 +1,18 @@
-package com.xcong.farmer.cms.cms.node;
+package com.xcong.farmer.cms.core.node;
 
 
+import cn.hutool.core.collection.CollUtil;
 import com.alibaba.fastjson.JSONObject;
-import com.xcong.farmer.cms.cms.handler.DataParserHandler;
-import com.xcong.farmer.cms.cms.tag.TagsEnum;
-import com.xcong.farmer.cms.cms.tag.model.Articles;
-import com.xcong.farmer.cms.cms.template.Configuration;
+import com.xcong.farmer.cms.core.handler.DataParserHandler;
+import com.xcong.farmer.cms.core.tag.TagsEnum;
+import com.xcong.farmer.cms.core.template.Configuration;
 import groovy.lang.Binding;
 import groovy.lang.GroovyShell;
 import org.apache.commons.text.StringSubstitutor;
 import org.jsoup.nodes.Attribute;
 import org.jsoup.nodes.Attributes;
 import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -28,11 +29,14 @@
     private Object data;
     // 用于给这个标签attr注入的数据
     private Map<String, Object> parserData;
+    private Map<String, Object> systemData;
+
     // Tag参数 {id=[1,2,3], page=1, limit=5, field=art}
     private Object param;
 
     private Element element;
     private Element originalElement;
+    private boolean processContinue = true;
 
     public AttrNode() {
     }
@@ -64,7 +68,30 @@
         System.out.println(1);
     }
 
+    private boolean isNeedEmpty() {
+        Elements children = this.element.children();
+        if (CollUtil.isNotEmpty(children)) {
+            return true;
+        }
+        Attributes attributes = this.element.attributes();
+        if (CollUtil.isEmpty(attributes)) {
+            return false;
+        }
+
+        for (Attribute attribute : attributes) {
+            if (attribute.getKey().contains("@") || attribute.getKey().contains("$")) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     public void parser() {
+        // 判断是否为最小节点,如果是且没有特殊标签,则跳过清空
+        if (!isNeedEmpty()) {
+            return;
+        }
+
         this.element.empty();
         Attributes attributes = this.element.attributes();
         if (attributes.isEmpty()) {
@@ -101,6 +128,9 @@
             }
 
             this.tag = tagsEnum.getName();
+            if (this.data == null) {
+                this.processContinue = false;
+            }
         }
 
         runDataInject();
@@ -127,9 +157,10 @@
 
                 this.element.removeAttr("class");
                 this.element.attr("class", evaluate);
-            } else if (value.startsWith("${")) {
+            } else if (value.contains( "${")) {
 
                 String result = attrValueFormat(value);
+                System.out.println(result);
                 if ("text".equals(key)) {
                     this.element.text(result);
                 } else {
@@ -146,22 +177,41 @@
         Map<String, String> targetData = new HashMap<>();
         while (matcher.find()) {
             String group = matcher.group();
-            String splitValue = group.replaceAll("\\$\\{", "").replaceAll("}", "");
-            String[] split = splitValue.split("\\.");
-            if (split.length == 0) {
-                continue;
-            }
+//            String splitValue = group.replaceAll("\\$\\{", "").replaceAll("}", "");
+//            String[] split = splitValue.split("\\.");
+//            if (split.length == 0) {
+//                continue;
+//            }
+//
+//            for (Map.Entry<String, Object> entry : this.parserData.entrySet()) {
+//                String fieldKey = entry.getKey();
+//                Map<String, Object> data = (Map<String, Object>) entry.getValue();
+//                JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(data.get("state")));
+//
+//                for (Map.Entry<String, Object> map : jsonObject.entrySet()) {
+//                    if (map.getValue() instanceof String) {
+//                        targetData.put(fieldKey + "." + map.getKey(), (String) map.getValue());
+//                    }
+//                }
+//            }
 
+            Binding binding = new Binding();
             for (Map.Entry<String, Object> entry : this.parserData.entrySet()) {
                 String fieldKey = entry.getKey();
                 Map<String, Object> data = (Map<String, Object>) entry.getValue();
-                JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(data.get("state")));
+                binding.setProperty(fieldKey, data.get("state"));
+            }
 
-                for (Map.Entry<String, Object> map : jsonObject.entrySet()) {
-                    if (map.getValue() instanceof String) {
-                        targetData.put(fieldKey + "." + map.getKey(), (String) map.getValue());
-                    }
-                }
+            if (systemData != null) {
+                binding.setProperty("system", systemData);
+            }
+
+            GroovyShell shell = new GroovyShell(binding);
+            Object evaluate = shell.evaluate(group);
+            if (evaluate == null) {
+                targetData.put(group, "");
+            } else {
+                targetData.put(group, evaluate.toString());
             }
         }
 
@@ -200,4 +250,12 @@
     public String getTag() {
         return tag;
     }
+
+    public boolean processContinue() {
+        return processContinue;
+    }
+
+    public void systemData(Map<String, Object> systemData) {
+        this.systemData = systemData;
+    }
 }

--
Gitblit v1.9.1