Просмотр исходного кода

Create and replace markdown with html ordered list

https://youtrack.weseek.co.jp/issue/GW-7856
- Add level to ordered list item
- Create nested object of ordered list by level
- Update method to create ordered list element
- Replace ordered list markdown with html
Mudana-Grune 3 лет назад
Родитель
Сommit
cca14b0283
1 измененных файлов с 34 добавлено и 36 удалено
  1. 34 36
      packages/app/src/services/renderer/PreProcessor/OrderedList.ts

+ 34 - 36
packages/app/src/services/renderer/PreProcessor/OrderedList.ts

@@ -1,7 +1,6 @@
 export default class OrderedList {
 
-  process(markdown, context) {
-
+  process(markdown) {
     const orderedListRE = /^(\s*)(\d+\.)(\s)(.*)+?/gm;
 
     const itemList = markdown.match(orderedListRE);
@@ -9,50 +8,49 @@ export default class OrderedList {
       const indent = item.split(/[\d]/)[0].length;
       const itemNumber = item.trim().split('.')[0];
       const content = item.split(/\d.\s/)[1];
+      const level = Math.round(indent / 4) + 1;
       return {
-        indent,
         number: itemNumber,
         content,
+        level,
       };
     });
 
-    const getChild = (listObject, indent) => {
-      let child = null;
-      listObject.every((list) => {
-        child = list;
-        return !(list.indent > indent);
-      });
-      return child;
-    };
-    const contentListWIthChild = itemListData.map((list, index) => {
-      const isLastElementOfSameIndent = () => {
-        if (index === itemListData.length - 1) {
-          return true;
-        }
-        return itemListData[index].indent === itemListData[index + 1].indent;
-      };
-      return {
-        ...list,
-        child: isLastElementOfSameIndent() ? null : getChild(itemListData, list.indent),
-      };
-    });
-    const createList = (node) => {
-      let element = '<ol>';
-      if (node.child == null) {
-        element += `<li>${node.content}</li></ol>`;
-      }
-      else {
-        element += node.child.map((childItem) => {
-          return createList(childItem);
+    const getNestedOrderedListData = (itemListData) => {
+      const result:any[] = [];
+      const levels:any[] = [result];
+      if (itemListData.length > 0) {
+        itemListData.forEach((item) => {
+          console.log(item);
+          levels[item.level - 1].push({ ...item, children: levels[item.level] = [] });
         });
+        return result;
       }
-      return element;
+      return result;
     };
-    // TODO: - Create nested data list from matched markdown
-    //       - Create HTML verison of ordered list
-    //       - Replace Markdown with HTML ordered list
 
-    return markdown;
+    const buildList = (itemListData) => {
+      if (itemListData == null || itemListData.length === 0) {
+        return '';
+      }
+      let element = `<ol start=${itemListData[0].number}>`;
+      element += itemListData.map((item) => {
+        return `<li class="code-line"> ${item.content}</li> ${buildList(item.children)}`;
+      }).join('');
+      element += '</ol>';
+      return element;
+
+    };
+    const nestedItemListData = getNestedOrderedListData(itemListData);
+    const getMarkdownRepacement = () => {
+      let occurrence = 0;
+      return markdown.replace(orderedListRE, () => {
+        occurrence++;
+        if (occurrence === 1) return buildList(nestedItemListData);
+        return '';
+      });
+    };
+    return getMarkdownRepacement();
 
   }