Преглед изворни кода

RichTextConverter 支持多级嵌套加粗、斜体、下划线样式

deason пре 2 година
родитељ
комит
fbb470baac

+ 35 - 8
examcloud-support/src/main/java/cn/com/qmth/examcloud/support/handler/richtext2/RichTextConverter.java

@@ -85,7 +85,7 @@ public class RichTextConverter implements TagConstant {
         List<Section> sections = new ArrayList<>();
         for (List<Node> curNodes : groups) {
             List<Block> blocks = new ArrayList<>();
-            splitBlocks(curNodes, blocks);
+            splitBlocks(curNodes, blocks, null);
             if (blocks.isEmpty()) {
                 continue;
             }
@@ -99,7 +99,7 @@ public class RichTextConverter implements TagConstant {
         return sections;
     }
 
-    private static void splitBlocks(List<Node> nodes, List<Block> blocks) {
+    private static void splitBlocks(List<Node> nodes, List<Block> blocks, Param parentParam) {
         if (nodes.isEmpty()) {
             return;
         }
@@ -116,23 +116,50 @@ public class RichTextConverter implements TagConstant {
                     processAudio(element, blocks);
 
                     if (!node.childNodes().isEmpty()) {
-                        splitBlocks(node.childNodes(), blocks);
+                        splitBlocks(node.childNodes(), blocks, parentParam);
                     }
                 } else if (TAG_B.equals(node.nodeName()) || TAG_STRONG.equals(node.nodeName())) {
                     // 处理文本 加粗
                     Param param = new Param();
+                    if (parentParam != null) {
+                        param.setItalic(parentParam.getItalic());
+                        param.setUnderline(parentParam.getUnderline());
+                    }
                     param.setBold(true);
-                    processText(element.text(), param, blocks);
+
+                    if (!node.childNodes().isEmpty()) {
+                        splitBlocks(node.childNodes(), blocks, param);
+                    } else {
+                        processText(element.text(), param, blocks);
+                    }
                 } else if (TAG_I.equals(node.nodeName()) || TAG_EM.equals(node.nodeName())) {
                     // 处理文本 斜体
                     Param param = new Param();
+                    if (parentParam != null) {
+                        param.setBold(parentParam.getBold());
+                        param.setUnderline(parentParam.getUnderline());
+                    }
                     param.setItalic(true);
-                    processText(element.text(), param, blocks);
+
+                    if (!node.childNodes().isEmpty()) {
+                        splitBlocks(node.childNodes(), blocks, param);
+                    } else {
+                        processText(element.text(), param, blocks);
+                    }
                 } else if (TAG_U.equals(node.nodeName())) {
                     // 处理文本 下划线
                     Param param = new Param();
+                    if (parentParam != null) {
+                        param.setBold(parentParam.getBold());
+                        param.setItalic(parentParam.getItalic());
+                    }
                     param.setUnderline(true);
-                    processText(element.text(), param, blocks);
+
+                    if (!node.childNodes().isEmpty()) {
+                        splitBlocks(node.childNodes(), blocks, param);
+                    } else {
+                        processText(element.text(), param, blocks);
+                    }
                 } else if (TAG_SUP.equals(node.nodeName())) {
                     // 处理文本 上标
                     Param param = new Param();
@@ -144,13 +171,13 @@ public class RichTextConverter implements TagConstant {
                     param.setSub(true);
                     processText(element.text(), param, blocks);
                 } else {
-                    splitBlocks(node.childNodes(), blocks);
+                    splitBlocks(node.childNodes(), blocks, parentParam);
                 }
             } else {
                 if (node instanceof TextNode) {
                     TextNode element = (TextNode) node;
                     // 处理文本
-                    processText(element.text(), null, blocks);
+                    processText(element.text(), parentParam, blocks);
                 } else {
                     log.debug("Ignore node {}", node.nodeName());
                 }