From 97641c088c44dd60f63e697466c73613a1c63262 Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Sat, 02 Jul 2022 21:37:01 +0800
Subject: [PATCH] Merge branch 'master' of http://120.27.238.55:7000/r/farmer-cms

---
 src/main/java/com/xcong/farmer/cms/cms/node/AttrNode.java |  203 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 203 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/xcong/farmer/cms/cms/node/AttrNode.java b/src/main/java/com/xcong/farmer/cms/cms/node/AttrNode.java
new file mode 100644
index 0000000..adf7a84
--- /dev/null
+++ b/src/main/java/com/xcong/farmer/cms/cms/node/AttrNode.java
@@ -0,0 +1,203 @@
+package com.xcong.farmer.cms.cms.node;
+
+
+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 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 java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class AttrNode extends Configuration {
+    private String tag;
+
+    public TagsEnum tagsEnum;
+    // tag标签中field字段的值 如 field=art 中的 art
+    private String field;
+    // 标签数据 如@artilces从数据库查询到的数据
+    private Object data;
+    // 用于给这个标签attr注入的数据
+    private Map<String, Object> parserData;
+    // Tag参数 {id=[1,2,3], page=1, limit=5, field=art}
+    private Object param;
+
+    private Element element;
+    private Element originalElement;
+
+    public AttrNode() {
+    }
+
+    public AttrNode(Element element) {
+        this.element = element.clone();
+        this.originalElement = element;
+    }
+
+    public AttrNode(Element element, Map<String, Object> parserData) {
+        this.element = element.clone();
+        this.originalElement = element;
+        this.parserData = parserData;
+    }
+
+    public static void main(String[] args) {
+//        String data = "{id=[1,2,3], page=1, limit=5, field=art}";
+//        Articles articles = new AttrNode().parserTag(data, Articles.class);
+
+//        String value = "{id=${col.id}, page=1, limit=5, field=art}";
+//        String pattern = "(?<=\\$\\{)[\\s\\S]*?(?=\\})";
+//        Matcher matcher = Pattern.compile(pattern).matcher(value);
+//        while (matcher.find()) {
+//            String group = matcher.group();
+//            System.out.println(1);
+//        }
+
+
+        System.out.println(1);
+    }
+
+    public void parser() {
+        this.element.empty();
+        Attributes attributes = this.element.attributes();
+        if (attributes.isEmpty()) {
+            return;
+        }
+
+        // i = 1表示每个element上最多有一个tag
+        int i = 1;
+
+        // 判断element中是否包含tag,若有,则解析并查询对应数据
+        for (TagsEnum tagsEnum : TagsEnum.values()) {
+            if (!attributes.hasKey(tagsEnum.getName())) {
+                continue;
+            }
+            if (i > 1) {
+                throw new RuntimeException("element most one tag");
+            }
+            i++;
+
+            try {
+                // {id=${col.id}, page=1, limit=5, field=art} ${col.id} 形式需先设置值
+                String tagValue = attributes.get(tagsEnum.getName());
+                tagValue = attrValueFormat(tagValue);
+
+                this.param = parserTag(tagValue, Class.forName(tagsEnum.getClassName()));
+
+                this.field  = JSONObject.parseObject(JSONObject.toJSONString(param)).getString("field");
+                this.tagsEnum = tagsEnum;
+
+                DataParserHandler handler = (DataParserHandler) Class.forName(tagsEnum.getHandler()).newInstance();
+                handler.dataParser(this);
+            } catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) {
+                e.printStackTrace();
+            }
+
+            this.tag = tagsEnum.getName();
+        }
+
+        runDataInject();
+    }
+
+    public void runDataInject() {
+        Attributes attributes = this.element.attributes();
+        for (Attribute attribute : attributes) {
+            String key = attribute.getKey().replaceAll("\\$", "");
+            String value = attribute.getValue();
+
+            // @{} 为java表达式; ${}为需要注入的数据项
+            if (value.startsWith("@{")) {
+                value = value.replaceAll("\\@\\{", "").replaceAll("}", "");
+                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();
+                    binding.setProperty(fieldKey, data);
+                    binding.setVariable(fieldKey + ".index", 1);
+                }
+                GroovyShell shell = new GroovyShell(binding);
+                String evaluate = (String) shell.evaluate(value);
+
+                this.element.removeAttr("class");
+                this.element.attr("class", evaluate);
+            } else if (value.startsWith("${")) {
+
+                String result = attrValueFormat(value);
+                if ("text".equals(key)) {
+                    this.element.text(result);
+                } else {
+                    this.element.attr(key, result);
+                }
+            }
+        }
+    }
+
+    public String attrValueFormat(String value) {
+        String pattern = "(?<=\\$\\{)[\\s\\S]*?(?=\\})";
+        Matcher matcher = Pattern.compile(pattern).matcher(value);
+
+        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;
+            }
+
+            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());
+                    }
+                }
+            }
+        }
+
+        StringSubstitutor str = new StringSubstitutor(targetData);
+        return str.replace(value);
+    }
+
+    public Object getData() {
+        return data;
+    }
+
+    public void setData(Object data) {
+        this.data = data;
+    }
+
+    public String getField() {
+        return field;
+    }
+
+    public void setField(String field) {
+        this.field = field;
+    }
+
+    public Element getElement() {
+        return element;
+    }
+
+    public Map<String, Object> getParserData() {
+        return parserData;
+    }
+
+    public Object getParam() {
+        return param;
+    }
+
+    public String getTag() {
+        return tag;
+    }
+}

--
Gitblit v1.9.1