Yuki Takei 3 лет назад
Родитель
Сommit
67c43e7d57

+ 1 - 1
packages/app/package.json

@@ -91,6 +91,7 @@
     "connect-redis": "^4.0.4",
     "cookie-parser": "^1.4.5",
     "csurf": "^1.11.0",
+    "csv-to-markdown-table": "^1.1.0",
     "date-fns": "^2.23.0",
     "detect-indent": "^7.0.0",
     "diff": "^5.0.0",
@@ -209,7 +210,6 @@
     "colors": "=1.4.0",
     "connect-browser-sync": "^2.1.0",
     "core-js": "=2.6.9",
-    "csv-to-markdown-table": "^1.0.1",
     "diff2html": "^3.1.2",
     "eazy-logger": "^3.1.0",
     "emoji-mart": "npm:panta82-emoji-mart@^3.0.1",

+ 48 - 0
packages/app/src/services/renderer/remark-plugins/xsv-to-table.ts

@@ -0,0 +1,48 @@
+import csvToMarkdownTable from 'csv-to-markdown-table';
+import { fromMarkdown } from 'mdast-util-from-markdown';
+import { gfmTableFromMarkdown } from 'mdast-util-gfm-table';
+import { gfmTable } from 'micromark-extension-gfm-table';
+import { Plugin } from 'unified';
+import { Node } from 'unist';
+import { visit } from 'unist-util-visit';
+
+type Lang = 'csv' | 'csv-h' | 'tsv' | 'tsv-h';
+
+function isXsv(lang: unknown): lang is Lang {
+  return /^(csv|csv-h|tsv|tsv-h)$/.test(lang as string);
+}
+
+// workaround for the broken type definition of csv-to-markdown-table -- 2022.09.15 Yuki Takei
+const csvToMarkdown = csvToMarkdownTable.csvToMarkdown ?? csvToMarkdownTable;
+
+function rewriteNode(node: Node, lang: Lang) {
+  const tableContents = node.value as string;
+
+  const tableDoc = csvToMarkdown(
+    tableContents,
+    lang === 'csv' || lang === 'csv-h' ? ',' : '\t',
+    lang === 'csv-h' || lang === 'tsv-h',
+  );
+  const tableTree = fromMarkdown(tableDoc, {
+    extensions: [gfmTable],
+    mdastExtensions: [gfmTableFromMarkdown],
+  });
+
+  // replace node
+  if (tableTree.children[0] != null) {
+    node.type = 'table';
+    node.children = tableTree.children[0].children;
+  }
+}
+
+export const remarkPlugin: Plugin = function() {
+  return (tree) => {
+    visit(tree, (node) => {
+      if (node.type === 'code') {
+        if (isXsv(node.lang)) {
+          rewriteNode(node, node.lang);
+        }
+      }
+    });
+  };
+};

+ 4 - 0
packages/app/src/services/renderer/renderer.tsx

@@ -33,6 +33,7 @@ import * as keywordHighlighter from './rehype-plugins/keyword-highlighter';
 import { relativeLinks } from './rehype-plugins/relative-links';
 import { relativeLinksByPukiwikiLikeLinker } from './rehype-plugins/relative-links-by-pukiwiki-like-linker';
 import { pukiwikiLikeLinker } from './remark-plugins/pukiwiki-like-linker';
+import * as xsvToTable from './remark-plugins/xsv-to-table';
 
 // import CsvToTable from './PreProcessor/CsvToTable';
 // import EasyGrid from './PreProcessor/EasyGrid';
@@ -315,6 +316,7 @@ export const generateViewOptions = (
   // add remark plugins
   remarkPlugins.push(
     math,
+    xsvToTable.remarkPlugin,
     lsxGrowiPlugin.remarkPlugin,
   );
   if (config.isEnabledLinebreaks) {
@@ -416,6 +418,7 @@ export const generateSimpleViewOptions = (config: RendererConfig, pagePath: stri
   // add remark plugins
   remarkPlugins.push(
     math,
+    xsvToTable.remarkPlugin,
     lsxGrowiPlugin.remarkPlugin,
   );
   if (config.isEnabledLinebreaks) {
@@ -450,6 +453,7 @@ export const generatePreviewOptions = (config: RendererConfig, pagePath: string)
   // add remark plugins
   remarkPlugins.push(
     math,
+    xsvToTable.remarkPlugin,
     lsxGrowiPlugin.remarkPlugin,
   );
   if (config.isEnabledLinebreaks) {

+ 4 - 4
yarn.lock

@@ -7773,10 +7773,10 @@ csurf@^1.11.0:
     csrf "3.1.0"
     http-errors "~1.7.3"
 
-csv-to-markdown-table@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/csv-to-markdown-table/-/csv-to-markdown-table-1.0.1.tgz#43da1b0c0c483faa10a23921abc5e47a48e0daba"
-  integrity sha512-sw7oHNTBvmvztdDp5ZdIA3FPOy7fVol08hPgdSfVky4D1bcIoKwSiUeB/3G99mSaHnZh7wgCHcT7wAmyiyiaQA==
+csv-to-markdown-table@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/csv-to-markdown-table/-/csv-to-markdown-table-1.1.0.tgz#1c4546b4a6d7265d7715df51825c1852a7286247"
+  integrity sha512-gsnCustJ+9ckvdsivA8pRkBSUbr7vaMK5uuXU+gn5df93hUe2EqGPTazAJFGjc3vy0R9hjKHoLRjphTFy04bPg==
 
 currently-unhandled@^0.4.1:
   version "0.4.1"