2
0
Эх сурвалжийг харах

Create ordered list from markdown

https://youtrack.weseek.co.jp/issue/GW-7856
- Move OrderedList.ts file
- Get markdown version of ordered list by regex
- Create ordered list data
- Add child item to ordered list data
- Create  HTML ordered list based on markdown
Mudana-Grune 3 жил өмнө
parent
commit
cc11980cbe

+ 0 - 18
packages/app/src/services/renderer/PostProcessor/OrderedList.ts

@@ -1,18 +0,0 @@
-export default class OrderedList {
-
-  process(html, context) {
-    const { markdown: md } = context;
-    // const parserdHTMLString = context.parsedHTML?.replace('/\\n|\\/g', '');
-    // console.log(parserdHTMLString);
-    const orderedListHTMLxRE = /<li.*\s*\d+[.)]\s*.*[\s\S]+?<\/li>/gm;
-
-
-    const matchAllOrderedListHtml = html.matchAll(orderedListHTMLxRE);
-    const orderedListRE = /^(\s*)(\d+)([.)])(\s*)(.*)/gm;
-    console.log(...matchAllOrderedListHtml);
-
-    // TODO: Create new list from parsed HTML and replace the html
-    return html;
-  }
-
-}

+ 59 - 0
packages/app/src/services/renderer/PreProcessor/OrderedList.ts

@@ -0,0 +1,59 @@
+export default class OrderedList {
+
+  process(markdown, context) {
+
+    const orderedListRE = /^(\s*)(\d+\.)(\s)(.*)+?/gm;
+
+    const itemList = markdown.match(orderedListRE);
+    const itemListData = itemList?.map((item) => {
+      const indent = item.split(/[\d]/)[0].length;
+      const itemNumber = item.trim().split('.')[0];
+      const content = item.split(/\d.\s/)[1];
+      return {
+        indent,
+        number: itemNumber,
+        content,
+      };
+    });
+
+    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);
+        });
+      }
+      return element;
+    };
+    // TODO: - Create nested data list from matched markdown
+    //       - Create HTML verison of ordered list
+    //       - Replace Markdown with HTML ordered list
+
+    return markdown;
+
+  }
+
+}

+ 3 - 2
packages/app/src/services/renderer/growi-renderer.ts

@@ -5,10 +5,10 @@ import { CustomWindow } from '~/interfaces/global';
 import { GrowiRendererConfig, RendererSettings } from '~/interfaces/services/renderer';
 import loggerFactory from '~/utils/logger';
 
-import OrderedList from './PostProcessor/OrderedList';
 import CsvToTable from './PreProcessor/CsvToTable';
 import EasyGrid from './PreProcessor/EasyGrid';
 import Linker from './PreProcessor/Linker';
+import OrderedList from './PreProcessor/OrderedList';
 import XssFilter from './PreProcessor/XssFilter';
 import BlockdiagConfigurer from './markdown-it/blockdiag';
 import DrawioViewerConfigurer from './markdown-it/drawio-viewer';
@@ -72,9 +72,10 @@ export default class GrowiRenderer {
           tagWhiteList: this.growiRendererConfig.tagWhiteList,
           attrWhiteList: this.growiRendererConfig.attrWhiteList,
         }),
+        new OrderedList(),
       ];
       this.postProcessors = [
-        new OrderedList(),
+
       ];
     }