package com.xcong.farmer.cms.core.node; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.xcong.farmer.cms.core.template.Configuration; import org.jsoup.nodes.Element; import java.util.HashMap; import java.util.List; import java.util.Map; public class PartNode extends Configuration { private Element element; private Element originalElement; private String html; private Map system; public PartNode(Element element, Map data) { this.element = element.clone(); this.originalElement = element; this.system = data; } public void parser() { this.html = parser(this.element, null); } public String parser(Element element, Map tagDataMap) { AttrNode attrNode = new AttrNode(element, tagDataMap); attrNode.systemData(this.system); attrNode.parser(); StringBuilder result = new StringBuilder(); if (CollUtil.isNotEmpty(element.children())) { Object parseData = attrNode.getData(); if (tagDataMap == null) { tagDataMap = new HashMap<>(); } if (parseData == null) { // 特殊处理。 如果有子节点标签@child,但数据中没有子节点数据,则将该子节点直接删除即直接返回空字符串 if (attrNode.processContinue()) { for (Element children : element.children()) { String html = parser(children, tagDataMap); result.append(html); } } else { return ""; } } else { if (parseData instanceof List) { List list = (List) parseData; int i = 1; for (Object o : list) { if (StrUtil.isNotBlank(attrNode.getField())) { Map data = new HashMap<>(); data.put("index", i); data.put("state", o); tagDataMap.put(attrNode.getField(), data); } StringBuilder listHtml = new StringBuilder(); for (Element children : element.children()) { String html = parser(children, tagDataMap); listHtml.append(html); } result.append(listHtml); i++; } } else if (parseData instanceof Object) { if (StrUtil.isNotBlank(attrNode.getField())) { Map data = new HashMap<>(); data.put("index", 1); data.put("state", parseData); tagDataMap.put(attrNode.getField(), data); } for (Element children : element.children()) { String html = parser(children, tagDataMap); result.append(html); } } } } attrNode.getElement().append(result.toString()); return attrNode.getElement().toString(); } public Element getElement() { return element; } public String getHtml() { return html; } }