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