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

Re-implement rehype-add-class in TS

Taichi Masuyama 3 лет назад
Родитель
Сommit
59c303234d

+ 39 - 0
packages/app/src/services/renderer/rehype-plugins/add-class.ts

@@ -0,0 +1,39 @@
+// See: https://github.com/martypdx/rehype-add-classes for the original implementation.
+// Re-implemeted in TypeScript.
+
+import { selectAll, HastNode, Element } from 'hast-util-select';
+
+import { RehypePlugin } from '~/interfaces/services/renderer';
+
+export type SelectorName = string; // e.g. 'h1'
+export type ClassName = string; // e.g. 'header'
+export type Additions = Record<SelectorName, ClassName>;
+export type AdditionsEntry = [SelectorName, ClassName];
+
+const generateWriter = (className: string) => (element: Element) => {
+  const { properties } = element;
+
+  if (properties == null) {
+    return;
+  }
+
+  if (properties.className == null) {
+    properties.className = className;
+    return;
+  }
+
+  properties.className += ` ${className}`;
+};
+
+const adder = (entry: AdditionsEntry) => {
+  const [selectorName, className] = entry;
+  const writer = generateWriter(className);
+
+  return (node: HastNode) => selectAll(selectorName, node).forEach(writer);
+};
+
+export const addClass: RehypePlugin = (additions) => {
+  const adders = Object.entries(additions).map(adder);
+
+  return node => adders.forEach(a => a(node));
+};

+ 0 - 35
packages/app/src/services/renderer/rehype-plugins/task-lists.ts

@@ -1,35 +0,0 @@
-import { selectAll, HastNode, Element } from 'hast-util-select';
-
-import { RehypePlugin } from '~/interfaces/services/renderer';
-
-export type ITaskListsRehypePluginOptions = {
-  className: string,
-};
-
-const SELECTOR = 'table';
-
-const generateWriter = (className: string) => (element: Element) => {
-  const { properties } = element;
-
-  if (properties == null) {
-    return;
-  }
-
-  if (properties.className == null) {
-    properties.className = className;
-    return;
-  }
-
-  properties.className += ` ${className}`;
-};
-
-const adder = (className: string) => {
-  const writer = generateWriter(className);
-  return (node: HastNode) => selectAll(SELECTOR, node).forEach(writer);
-};
-
-export const taskLists: RehypePlugin = (option: ITaskListsRehypePluginOptions) => {
-  const { className } = option;
-
-  return adder(className);
-};