writr 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -7,6 +7,7 @@
7
7
  [![GitHub license](https://img.shields.io/github/license/jaredwray/writr)](https://github.com/jaredwray/writr/blob/master/LICENSE)
8
8
  [![codecov](https://codecov.io/gh/jaredwray/writr/branch/master/graph/badge.svg?token=1YdMesM07X)](https://codecov.io/gh/jaredwray/writr)
9
9
  [![npm](https://img.shields.io/npm/dm/writr)](https://npmjs.com/package/writr)
10
+ [![npm](https://img.shields.io/npm/v/writr)](https://npmjs.com/package/writr)
10
11
 
11
12
  ---
12
13
  ## Table of Contents
@@ -17,13 +18,14 @@
17
18
  ## Features
18
19
  * Takes the complexity of Remark and makes it easy to use.
19
20
  * Up and Rendering in seconds with a simple API.
21
+ * Easily Render to `React` or `HTML`.
20
22
  * Generates a Table of Contents for your markdown files (remark-toc).
21
23
  * Slug generation for your markdown files (rehype-slug).
22
24
  * Code Highlighting (rehype-highlight).
25
+ * Math Support (rehype-katex).
23
26
  * Markdown to HTML (rehype-stringify).
24
27
  * Github Flavor Markdown (remark-gfm).
25
28
  * Emoji Support (remark-emoji).
26
- * Generation of Keywords, Descriptions, and Translations using AI.
27
29
 
28
30
  ## Getting Started
29
31
 
@@ -79,23 +81,29 @@ const description = await writr.description(markdown); // 'Hello World Test'
79
81
 
80
82
  ### `new Writr(options?: WritrOptions)`
81
83
 
82
- ```js
83
- interface WritrOptions {
84
- openai?: string; // openai api key (default: undefined)
85
- emoji?: boolean; // emoji support (default: true)
86
- toc?: boolean; // table of contents generation (default: true)
87
- slug?: boolean; // slug generation (default: true)
88
- highlight?: boolean; // code highlighting (default: true)
89
- gfm?: boolean; // github flavor markdown (default: true)
90
- }
91
- ```
92
-
93
- You can access the `WritrOptions` from the instance of Writr.
84
+ You can access the `WritrOptions` from the instance of Writr. Here is an example of WritrOptions.
94
85
 
95
86
  ```javascript
96
87
  import { Writr, WritrOptions } from 'writr';
88
+ const writrOptions = {
89
+ openai: 'your-api-key', // openai api key (default: undefined)
90
+ renderOptions: {
91
+ emoji: true,
92
+ toc: true,
93
+ slug: true,
94
+ highlight: true,
95
+ gfm: true,
96
+ math: true
97
+ }
98
+ };
99
+ const writr = new Writr(writrOptions);
97
100
  ```
98
101
 
102
+ ### `.engine`
103
+
104
+ Accessing the underlying engine for this instance of Writr. This is a `Processor<Root, Root, Root, undefined, undefined>` fromt the unified `.use()` function. You can use this to add additional plugins to the engine.
105
+
106
+
99
107
  ### `.options`
100
108
 
101
109
  Accessing the default options for this instance of Writr.
@@ -119,18 +127,38 @@ interface RenderOptions {
119
127
  }
120
128
  ```
121
129
 
122
- ### `.renderTranslation(markdown: string, langCode: string, options?: RenderOptions): Promise<string>`
130
+ ### `.renderSync(markdown: string, options?: RenderOptions): string`
123
131
 
124
- Rendering markdown to HTML. the options are based on RenderOptions. Which you can access from the Writr instance.
132
+ Rendering markdown to HTML synchronously. the options are based on RenderOptions. Which you can access from the Writr instance. The parameters are the same as the `.render()` function.
125
133
 
134
+ ```javascript
135
+ import { Writr } from 'writr';
136
+ const writr = new Writr();
137
+ const markdown = `# Hello World ::-):\n\n This is a test.`;
138
+ const html = writr.renderSync(markdown); // <h1>Hello World 🙂</h1><p>This is a test.</p>
139
+ ```
126
140
 
127
- ### `.keywords(markdown: string): Promise<string[]>`
141
+ ### '.renderReact(markdown: string, options?: RenderOptions, reactOptions?: HTMLReactParserOptions): Promise<React.JSX.Element>'
128
142
 
129
- AI Generation of Keywords that can be used for SEO on your HTML.
143
+ Rendering markdown to React. The options are based on RenderOptions and now HTMLReactParserOptions from `html-react-parser`.
130
144
 
131
- ### `.description(markdown: string): Promise<string>`
145
+ ```javascript
146
+ import { Writr } from 'writr';
147
+ const writr = new Writr();
148
+ const markdown = `# Hello World ::-):\n\n This is a test.`;
149
+ const reactElement = await writr.renderReact(markdown); // Will return a React.JSX.Element
150
+ ```
151
+
152
+ ### '.renderReactSync(markdown: string, options?: RenderOptions, reactOptions?: HTMLReactParserOptions): React.JSX.Element'
132
153
 
133
- AI Generation of a Description that can be used for SEO on your HTML.
154
+ Rendering markdown to React. The options are based on RenderOptions and now HTMLReactParserOptions from `html-react-parser`.
155
+
156
+ ```javascript
157
+ import { Writr } from 'writr';
158
+ const writr = new Writr();
159
+ const markdown = `# Hello World ::-):\n\n This is a test.`;
160
+ const reactElement = writr.renderReactSync(markdown); // Will return a React.JSX.Element
161
+ ```
134
162
 
135
163
  ## Code of Conduct and Contributing
136
164
  [Code of Conduct](CODE_OF_CONDUCT.md) and [Contributing](CONTRIBUTING.md) guidelines.
package/dist/writr.d.ts CHANGED
@@ -1,11 +1,9 @@
1
1
  import { Processor } from 'unified';
2
+ import { type HTMLReactParserOptions } from 'html-react-parser';
3
+ import type React from 'react';
2
4
  type WritrOptions = {
3
5
  openai?: string;
4
- emoji?: boolean;
5
- toc?: boolean;
6
- slug?: boolean;
7
- highlight?: boolean;
8
- gfm?: boolean;
6
+ renderOptions?: RenderOptions;
9
7
  };
10
8
  type RenderOptions = {
11
9
  emoji?: boolean;
@@ -13,6 +11,7 @@ type RenderOptions = {
13
11
  slug?: boolean;
14
12
  highlight?: boolean;
15
13
  gfm?: boolean;
14
+ math?: boolean;
16
15
  };
17
16
  declare class Writr {
18
17
  engine: Processor<import("mdast").Root, import("mdast").Root, import("hast").Root, import("hast").Root, string>;
@@ -20,6 +19,9 @@ declare class Writr {
20
19
  constructor(options?: WritrOptions);
21
20
  get options(): WritrOptions;
22
21
  render(markdown: string, options?: RenderOptions): Promise<string>;
22
+ renderSync(markdown: string, options?: RenderOptions): string;
23
+ renderReact(markdown: string, options?: RenderOptions, reactParseOptions?: HTMLReactParserOptions): Promise<string | React.JSX.Element | React.JSX.Element[]>;
24
+ renderReactSync(markdown: string, options?: RenderOptions, reactParseOptions?: HTMLReactParserOptions): string | React.JSX.Element | React.JSX.Element[];
23
25
  private createProcessor;
24
26
  }
25
27
  export { Writr, type WritrOptions, type RenderOptions };
package/dist/writr.js CHANGED
@@ -5,8 +5,11 @@ import rehypeSlug from 'rehype-slug';
5
5
  import rehypeHighlight from 'rehype-highlight';
6
6
  import rehypeStringify from 'rehype-stringify';
7
7
  import remarkToc from 'remark-toc';
8
+ import remarkMath from 'remark-math';
9
+ import rehypeKatex from 'rehype-katex';
8
10
  import remarkGfm from 'remark-gfm';
9
11
  import remarkEmoji from 'remark-emoji';
12
+ import parse from 'html-react-parser';
10
13
  class Writr {
11
14
  engine = unified()
12
15
  .use(remarkParse)
@@ -15,21 +18,28 @@ class Writr {
15
18
  .use(remarkEmoji) // Add emoji support
16
19
  .use(remarkRehype) // Convert markdown to HTML
17
20
  .use(rehypeSlug) // Add slugs to headings in HTML
21
+ .use(remarkMath) // Add math support
22
+ .use(rehypeKatex) // Add math support
18
23
  .use(rehypeHighlight) // Apply syntax highlighting
19
24
  .use(rehypeStringify); // Stringify HTML
20
25
  _options = {
21
26
  openai: undefined,
22
- emoji: true,
23
- toc: true,
24
- slug: true,
25
- highlight: true,
26
- gfm: true,
27
+ renderOptions: {
28
+ emoji: true,
29
+ toc: true,
30
+ slug: true,
31
+ highlight: true,
32
+ gfm: true,
33
+ math: true,
34
+ },
27
35
  };
28
36
  constructor(options) {
29
37
  if (options) {
30
38
  this._options = { ...this._options, ...options };
31
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
32
- this.engine = this.createProcessor(this._options);
39
+ if (this._options.renderOptions) {
40
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
41
+ this.engine = this.createProcessor(this._options.renderOptions);
42
+ }
33
43
  }
34
44
  }
35
45
  get options() {
@@ -39,7 +49,7 @@ class Writr {
39
49
  try {
40
50
  let { engine } = this;
41
51
  if (options) {
42
- options = { ...this._options, ...options };
52
+ options = { ...this._options.renderOptions, ...options };
43
53
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
44
54
  engine = this.createProcessor(options);
45
55
  }
@@ -50,6 +60,29 @@ class Writr {
50
60
  throw new Error(`Failed to render markdown: ${error.message}`);
51
61
  }
52
62
  }
63
+ renderSync(markdown, options) {
64
+ try {
65
+ let { engine } = this;
66
+ if (options) {
67
+ options = { ...this._options.renderOptions, ...options };
68
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
69
+ engine = this.createProcessor(options);
70
+ }
71
+ const file = engine.processSync(markdown);
72
+ return String(file);
73
+ }
74
+ catch (error) {
75
+ throw new Error(`Failed to render markdown: ${error.message}`);
76
+ }
77
+ }
78
+ async renderReact(markdown, options, reactParseOptions) {
79
+ const html = await this.render(markdown, options);
80
+ return parse(html, reactParseOptions);
81
+ }
82
+ renderReactSync(markdown, options, reactParseOptions) {
83
+ const html = this.renderSync(markdown, options);
84
+ return parse(html, reactParseOptions);
85
+ }
53
86
  createProcessor(options) {
54
87
  const processor = unified().use(remarkParse);
55
88
  if (options.gfm) {
@@ -73,4 +106,4 @@ class Writr {
73
106
  }
74
107
  }
75
108
  export { Writr };
76
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdHIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvd3JpdHIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE9BQU8sRUFBWSxNQUFNLFNBQVMsQ0FBQztBQUMzQyxPQUFPLFdBQVcsTUFBTSxjQUFjLENBQUM7QUFDdkMsT0FBTyxZQUFZLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sVUFBVSxNQUFNLGFBQWEsQ0FBQztBQUNyQyxPQUFPLGVBQWUsTUFBTSxrQkFBa0IsQ0FBQztBQUMvQyxPQUFPLGVBQWUsTUFBTSxrQkFBa0IsQ0FBQztBQUMvQyxPQUFPLFNBQVMsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxTQUFTLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sV0FBVyxNQUFNLGNBQWMsQ0FBQztBQW1CdkMsTUFBTSxLQUFLO0lBQ0gsTUFBTSxHQUFHLE9BQU8sRUFBRTtTQUN2QixHQUFHLENBQUMsV0FBVyxDQUFDO1NBQ2hCLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQywrQkFBK0I7U0FDOUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLHdCQUF3QjtTQUN2QyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsb0JBQW9CO1NBQ3JDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQywyQkFBMkI7U0FDN0MsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLGdDQUFnQztTQUNoRCxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsNEJBQTRCO1NBQ2pELEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLGlCQUFpQjtJQUV4QixRQUFRLEdBQWlCO1FBQ3pDLE1BQU0sRUFBRSxTQUFTO1FBQ2pCLEtBQUssRUFBRSxJQUFJO1FBQ1gsR0FBRyxFQUFFLElBQUk7UUFDVCxJQUFJLEVBQUUsSUFBSTtRQUNWLFNBQVMsRUFBRSxJQUFJO1FBQ2YsR0FBRyxFQUFFLElBQUk7S0FDVCxDQUFDO0lBRUYsWUFBWSxPQUFzQjtRQUNqQyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLE9BQU8sRUFBQyxDQUFDO1lBQy9DLG1FQUFtRTtZQUNuRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25ELENBQUM7SUFDRixDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN0QixDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFnQixFQUFFLE9BQXVCO1FBQ3JELElBQUksQ0FBQztZQUNKLElBQUksRUFBQyxNQUFNLEVBQUMsR0FBRyxJQUFJLENBQUM7WUFDcEIsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDYixPQUFPLEdBQUcsRUFBQyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxPQUFPLEVBQUMsQ0FBQztnQkFDekMsbUVBQW1FO2dCQUNuRSxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN4QyxDQUFDO1lBRUQsTUFBTSxJQUFJLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzVDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQStCLEtBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzNFLENBQUM7SUFDRixDQUFDO0lBRU8sZUFBZSxDQUFDLE9BQXFDO1FBQzVELE1BQU0sU0FBUyxHQUFHLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUU3QyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNqQixTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFCLENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNqQixTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxFQUFDLE9BQU8sRUFBRSx1QkFBdUIsRUFBQyxDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUVELElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ25CLFNBQVMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUVELFNBQVMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFNUIsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbEIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDdkIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBRUQsU0FBUyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUUvQixPQUFPLFNBQVMsQ0FBQztJQUNsQixDQUFDO0NBQ0Q7QUFFRCxPQUFPLEVBQUMsS0FBSyxFQUF3QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHt1bmlmaWVkLCBQcm9jZXNzb3J9IGZyb20gJ3VuaWZpZWQnO1xuaW1wb3J0IHJlbWFya1BhcnNlIGZyb20gJ3JlbWFyay1wYXJzZSc7XG5pbXBvcnQgcmVtYXJrUmVoeXBlIGZyb20gJ3JlbWFyay1yZWh5cGUnO1xuaW1wb3J0IHJlaHlwZVNsdWcgZnJvbSAncmVoeXBlLXNsdWcnO1xuaW1wb3J0IHJlaHlwZUhpZ2hsaWdodCBmcm9tICdyZWh5cGUtaGlnaGxpZ2h0JztcbmltcG9ydCByZWh5cGVTdHJpbmdpZnkgZnJvbSAncmVoeXBlLXN0cmluZ2lmeSc7XG5pbXBvcnQgcmVtYXJrVG9jIGZyb20gJ3JlbWFyay10b2MnO1xuaW1wb3J0IHJlbWFya0dmbSBmcm9tICdyZW1hcmstZ2ZtJztcbmltcG9ydCByZW1hcmtFbW9qaSBmcm9tICdyZW1hcmstZW1vamknO1xuXG50eXBlIFdyaXRyT3B0aW9ucyA9IHtcblx0b3BlbmFpPzogc3RyaW5nOyAvLyBPcGVuYWkgYXBpIGtleSAoZGVmYXVsdDogdW5kZWZpbmVkKVxuXHRlbW9qaT86IGJvb2xlYW47IC8vIEVtb2ppIHN1cHBvcnQgKGRlZmF1bHQ6IHRydWUpXG5cdHRvYz86IGJvb2xlYW47IC8vIFRhYmxlIG9mIGNvbnRlbnRzIGdlbmVyYXRpb24gKGRlZmF1bHQ6IHRydWUpXG5cdHNsdWc/OiBib29sZWFuOyAvLyBTbHVnIGdlbmVyYXRpb24gKGRlZmF1bHQ6IHRydWUpXG5cdGhpZ2hsaWdodD86IGJvb2xlYW47IC8vIENvZGUgaGlnaGxpZ2h0aW5nIChkZWZhdWx0OiB0cnVlKVxuXHRnZm0/OiBib29sZWFuOyAvLyBHaXRodWIgZmxhdm9yIG1hcmtkb3duIChkZWZhdWx0OiB0cnVlKVxufTtcblxudHlwZSBSZW5kZXJPcHRpb25zID0ge1xuXHRlbW9qaT86IGJvb2xlYW47IC8vIEVtb2ppIHN1cHBvcnQgKGRlZmF1bHQ6IHRydWUpXG5cdHRvYz86IGJvb2xlYW47IC8vIFRhYmxlIG9mIGNvbnRlbnRzIGdlbmVyYXRpb24gKGRlZmF1bHQ6IHRydWUpXG5cdHNsdWc/OiBib29sZWFuOyAvLyBTbHVnIGdlbmVyYXRpb24gKGRlZmF1bHQ6IHRydWUpXG5cdGhpZ2hsaWdodD86IGJvb2xlYW47IC8vIENvZGUgaGlnaGxpZ2h0aW5nIChkZWZhdWx0OiB0cnVlKVxuXHRnZm0/OiBib29sZWFuOyAvLyBHaXRodWIgZmxhdm9yIG1hcmtkb3duIChkZWZhdWx0OiB0cnVlKVxufTtcblxuY2xhc3MgV3JpdHIge1xuXHRwdWJsaWMgZW5naW5lID0gdW5pZmllZCgpXG5cdFx0LnVzZShyZW1hcmtQYXJzZSlcblx0XHQudXNlKHJlbWFya0dmbSkgLy8gVXNlIEdpdEh1YiBGbGF2b3JlZCBNYXJrZG93blxuXHRcdC51c2UocmVtYXJrVG9jKSAvLyBBZGQgdGFibGUgb2YgY29udGVudHNcblx0XHQudXNlKHJlbWFya0Vtb2ppKSAvLyBBZGQgZW1vamkgc3VwcG9ydFxuXHRcdC51c2UocmVtYXJrUmVoeXBlKSAvLyBDb252ZXJ0IG1hcmtkb3duIHRvIEhUTUxcblx0XHQudXNlKHJlaHlwZVNsdWcpIC8vIEFkZCBzbHVncyB0byBoZWFkaW5ncyBpbiBIVE1MXG5cdFx0LnVzZShyZWh5cGVIaWdobGlnaHQpIC8vIEFwcGx5IHN5bnRheCBoaWdobGlnaHRpbmdcblx0XHQudXNlKHJlaHlwZVN0cmluZ2lmeSk7IC8vIFN0cmluZ2lmeSBIVE1MXG5cblx0cHJpdmF0ZSByZWFkb25seSBfb3B0aW9uczogV3JpdHJPcHRpb25zID0ge1xuXHRcdG9wZW5haTogdW5kZWZpbmVkLFxuXHRcdGVtb2ppOiB0cnVlLFxuXHRcdHRvYzogdHJ1ZSxcblx0XHRzbHVnOiB0cnVlLFxuXHRcdGhpZ2hsaWdodDogdHJ1ZSxcblx0XHRnZm06IHRydWUsXG5cdH07XG5cblx0Y29uc3RydWN0b3Iob3B0aW9ucz86IFdyaXRyT3B0aW9ucykge1xuXHRcdGlmIChvcHRpb25zKSB7XG5cdFx0XHR0aGlzLl9vcHRpb25zID0gey4uLnRoaXMuX29wdGlvbnMsIC4uLm9wdGlvbnN9O1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXNzaWdubWVudFxuXHRcdFx0dGhpcy5lbmdpbmUgPSB0aGlzLmNyZWF0ZVByb2Nlc3Nvcih0aGlzLl9vcHRpb25zKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgZ2V0IG9wdGlvbnMoKTogV3JpdHJPcHRpb25zIHtcblx0XHRyZXR1cm4gdGhpcy5fb3B0aW9ucztcblx0fVxuXG5cdGFzeW5jIHJlbmRlcihtYXJrZG93bjogc3RyaW5nLCBvcHRpb25zPzogUmVuZGVyT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0dHJ5IHtcblx0XHRcdGxldCB7ZW5naW5lfSA9IHRoaXM7XG5cdFx0XHRpZiAob3B0aW9ucykge1xuXHRcdFx0XHRvcHRpb25zID0gey4uLnRoaXMuX29wdGlvbnMsIC4uLm9wdGlvbnN9O1xuXHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hc3NpZ25tZW50XG5cdFx0XHRcdGVuZ2luZSA9IHRoaXMuY3JlYXRlUHJvY2Vzc29yKG9wdGlvbnMpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBmaWxlID0gYXdhaXQgZW5naW5lLnByb2Nlc3MobWFya2Rvd24pO1xuXHRcdFx0cmV0dXJuIFN0cmluZyhmaWxlKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmVuZGVyIG1hcmtkb3duOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGNyZWF0ZVByb2Nlc3NvcihvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgV3JpdHJPcHRpb25zKTogYW55IHtcblx0XHRjb25zdCBwcm9jZXNzb3IgPSB1bmlmaWVkKCkudXNlKHJlbWFya1BhcnNlKTtcblxuXHRcdGlmIChvcHRpb25zLmdmbSkge1xuXHRcdFx0cHJvY2Vzc29yLnVzZShyZW1hcmtHZm0pO1xuXHRcdH1cblxuXHRcdGlmIChvcHRpb25zLnRvYykge1xuXHRcdFx0cHJvY2Vzc29yLnVzZShyZW1hcmtUb2MsIHtoZWFkaW5nOiAndG9jfHRhYmxlIG9mIGNvbnRlbnRzJ30pO1xuXHRcdH1cblxuXHRcdGlmIChvcHRpb25zLmVtb2ppKSB7XG5cdFx0XHRwcm9jZXNzb3IudXNlKHJlbWFya0Vtb2ppKTtcblx0XHR9XG5cblx0XHRwcm9jZXNzb3IudXNlKHJlbWFya1JlaHlwZSk7XG5cblx0XHRpZiAob3B0aW9ucy5zbHVnKSB7XG5cdFx0XHRwcm9jZXNzb3IudXNlKHJlaHlwZVNsdWcpO1xuXHRcdH1cblxuXHRcdGlmIChvcHRpb25zLmhpZ2hsaWdodCkge1xuXHRcdFx0cHJvY2Vzc29yLnVzZShyZWh5cGVIaWdobGlnaHQpO1xuXHRcdH1cblxuXHRcdHByb2Nlc3Nvci51c2UocmVoeXBlU3RyaW5naWZ5KTtcblxuXHRcdHJldHVybiBwcm9jZXNzb3I7XG5cdH1cbn1cblxuZXhwb3J0IHtXcml0ciwgdHlwZSBXcml0ck9wdGlvbnMsIHR5cGUgUmVuZGVyT3B0aW9uc307XG5cbiJdfQ==
109
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdHIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvd3JpdHIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE9BQU8sRUFBWSxNQUFNLFNBQVMsQ0FBQztBQUMzQyxPQUFPLFdBQVcsTUFBTSxjQUFjLENBQUM7QUFDdkMsT0FBTyxZQUFZLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sVUFBVSxNQUFNLGFBQWEsQ0FBQztBQUNyQyxPQUFPLGVBQWUsTUFBTSxrQkFBa0IsQ0FBQztBQUMvQyxPQUFPLGVBQWUsTUFBTSxrQkFBa0IsQ0FBQztBQUMvQyxPQUFPLFNBQVMsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxVQUFVLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sV0FBVyxNQUFNLGNBQWMsQ0FBQztBQUN2QyxPQUFPLFNBQVMsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxXQUFXLE1BQU0sY0FBYyxDQUFDO0FBQ3ZDLE9BQU8sS0FBb0MsTUFBTSxtQkFBbUIsQ0FBQztBQWlCckUsTUFBTSxLQUFLO0lBQ0gsTUFBTSxHQUFHLE9BQU8sRUFBRTtTQUN2QixHQUFHLENBQUMsV0FBVyxDQUFDO1NBQ2hCLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQywrQkFBK0I7U0FDOUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLHdCQUF3QjtTQUN2QyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsb0JBQW9CO1NBQ3JDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQywyQkFBMkI7U0FDN0MsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLGdDQUFnQztTQUNoRCxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsbUJBQW1CO1NBQ25DLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxtQkFBbUI7U0FDcEMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDLDRCQUE0QjtTQUNqRCxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxpQkFB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QUFDO1FBQ2hELE9BQU8sS0FBSyxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFTyxlQUFlLENBQUMsT0FBc0I7UUFDN0MsTUFBTSxTQUFTLEdBQUcsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTdDLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2pCLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUIsQ0FBQztRQUVELElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2pCLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLEVBQUMsT0FBTyxFQUFFLHVCQUF1QixFQUFDLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbkIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM1QixDQUFDO1FBRUQsU0FBUyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUU1QixJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsQixTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzNCLENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN2QixTQUFTLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2hDLENBQUM7UUFFRCxTQUFTLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRS9CLE9BQU8sU0FBUyxDQUFDO0lBQ2xCLENBQUM7Q0FDRDtBQUVELE9BQU8sRUFBQyxLQUFLLEVBQXdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3VuaWZpZWQsIFByb2Nlc3Nvcn0gZnJvbSAndW5pZmllZCc7XG5pbXBvcnQgcmVtYXJrUGFyc2UgZnJvbSAncmVtYXJrLXBhcnNlJztcbmltcG9ydCByZW1hcmtSZWh5cGUgZnJvbSAncmVtYXJrLXJlaHlwZSc7XG5pbXBvcnQgcmVoeXBlU2x1ZyBmcm9tICdyZWh5cGUtc2x1Zyc7XG5pbXBvcnQgcmVoeXBlSGlnaGxpZ2h0IGZyb20gJ3JlaHlwZS1oaWdobGlnaHQnO1xuaW1wb3J0IHJlaHlwZVN0cmluZ2lmeSBmcm9tICdyZWh5cGUtc3RyaW5naWZ5JztcbmltcG9ydCByZW1hcmtUb2MgZnJvbSAncmVtYXJrLXRvYyc7XG5pbXBvcnQgcmVtYXJrTWF0aCBmcm9tICdyZW1hcmstbWF0aCc7XG5pbXBvcnQgcmVoeXBlS2F0ZXggZnJvbSAncmVoeXBlLWthdGV4JztcbmltcG9ydCByZW1hcmtHZm0gZnJvbSAncmVtYXJrLWdmbSc7XG5pbXBvcnQgcmVtYXJrRW1vamkgZnJvbSAncmVtYXJrLWVtb2ppJztcbmltcG9ydCBwYXJzZSwge3R5cGUgSFRNTFJlYWN0UGFyc2VyT3B0aW9uc30gZnJvbSAnaHRtbC1yZWFjdC1wYXJzZXInO1xuaW1wb3J0IHR5cGUgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG50eXBlIFdyaXRyT3B0aW9ucyA9IHtcblx0b3BlbmFpPzogc3RyaW5nOyAvLyBPcGVuYWkgYXBpIGtleSAoZGVmYXVsdDogdW5kZWZpbmVkKVxuXHRyZW5kZXJPcHRpb25zPzogUmVuZGVyT3B0aW9uczsgLy8gRGVmYXVsdCByZW5kZXIgb3B0aW9ucyAoZGVmYXVsdDogdW5kZWZpbmVkKVxufTtcblxudHlwZSBSZW5kZXJPcHRpb25zID0ge1xuXHRlbW9qaT86IGJvb2xlYW47IC8vIEVtb2ppIHN1cHBvcnQgKGRlZmF1bHQ6IHRydWUpXG5cdHRvYz86IGJvb2xlYW47IC8vIFRhYmxlIG9mIGNvbnRlbnRzIGdlbmVyYXRpb24gKGRlZmF1bHQ6IHRydWUpXG5cdHNsdWc/OiBib29sZWFuOyAvLyBTbHVnIGdlbmVyYXRpb24gKGRlZmF1bHQ6IHRydWUpXG5cdGhpZ2hsaWdodD86IGJvb2xlYW47IC8vIENvZGUgaGlnaGxpZ2h0aW5nIChkZWZhdWx0OiB0cnVlKVxuXHRnZm0/OiBib29sZWFuOyAvLyBHaXRodWIgZmxhdm9yIG1hcmtkb3duIChkZWZhdWx0OiB0cnVlKVxuXHRtYXRoPzogYm9vbGVhbjsgLy8gTWF0aCBzdXBwb3J0IChkZWZhdWx0OiB0cnVlKVxufTtcblxuY2xhc3MgV3JpdHIge1xuXHRwdWJsaWMgZW5naW5lID0gdW5pZmllZCgpXG5cdFx0LnVzZShyZW1hcmtQYXJzZSlcblx0XHQudXNlKHJlbWFya0dmbSkgLy8gVXNlIEdpdEh1YiBGbGF2b3JlZCBNYXJrZG93blxuXHRcdC51c2UocmVtYXJrVG9jKSAvLyBBZGQgdGFibGUgb2YgY29udGVudHNcblx0XHQudXNlKHJlbWFya0Vtb2ppKSAvLyBBZGQgZW1vamkgc3VwcG9ydFxuXHRcdC51c2UocmVtYXJrUmVoeXBlKSAvLyBDb252ZXJ0IG1hcmtkb3duIHRvIEhUTUxcblx0XHQudXNlKHJlaHlwZVNsdWcpIC8vIEFkZCBzbHVncyB0byBoZWFkaW5ncyBpbiBIVE1MXG5cdFx0LnVzZShyZW1hcmtNYXRoKSAvLyBBZGQgbWF0aCBzdXBwb3J0XG5cdFx0LnVzZShyZWh5cGVLYXRleCkgLy8gQWRkIG1hdGggc3VwcG9ydFxuXHRcdC51c2UocmVoeXBlSGlnaGxpZ2h0KSAvLyBBcHBseSBzeW50YXggaGlnaGxpZ2h0aW5nXG5cdFx0LnVzZShyZWh5cGVTdHJpbmdpZnkpOyAvLyBTdHJpbmdpZnkgSFRNTFxuXG5cdHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnM6IFdyaXRyT3B0aW9ucyA9IHtcblx0XHRvcGVuYWk6IHVuZGVmaW5lZCxcblx0XHRyZW5kZXJPcHRpb25zOiB7XG5cdFx0XHRlbW9qaTogdHJ1ZSxcblx0XHRcdHRvYzogdHJ1ZSxcblx0XHRcdHNsdWc6IHRydWUsXG5cdFx0XHRoaWdobGlnaHQ6IHRydWUsXG5cdFx0XHRnZm06IHRydWUsXG5cdFx0XHRtYXRoOiB0cnVlLFxuXHRcdH0sXG5cdH07XG5cblx0Y29uc3RydWN0b3Iob3B0aW9ucz86IFdyaXRyT3B0aW9ucykge1xuXHRcdGlmIChvcHRpb25zKSB7XG5cdFx0XHR0aGlzLl9vcHRpb25zID0gey4uLnRoaXMuX29wdGlvbnMsIC4uLm9wdGlvbnN9O1xuXHRcdFx0aWYgKHRoaXMuX29wdGlvbnMucmVuZGVyT3B0aW9ucykge1xuXHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hc3NpZ25tZW50XG5cdFx0XHRcdHRoaXMuZW5naW5lID0gdGhpcy5jcmVhdGVQcm9jZXNzb3IodGhpcy5fb3B0aW9ucy5yZW5kZXJPcHRpb25zKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgZ2V0IG9wdGlvbnMoKTogV3JpdHJPcHRpb25zIHtcblx0XHRyZXR1cm4gdGhpcy5fb3B0aW9ucztcblx0fVxuXG5cdGFzeW5jIHJlbmRlcihtYXJrZG93bjogc3RyaW5nLCBvcHRpb25zPzogUmVuZGVyT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0dHJ5IHtcblx0XHRcdGxldCB7ZW5naW5lfSA9IHRoaXM7XG5cdFx0XHRpZiAob3B0aW9ucykge1xuXHRcdFx0XHRvcHRpb25zID0gey4uLnRoaXMuX29wdGlvbnMucmVuZGVyT3B0aW9ucywgLi4ub3B0aW9uc307XG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFzc2lnbm1lbnRcblx0XHRcdFx0ZW5naW5lID0gdGhpcy5jcmVhdGVQcm9jZXNzb3Iob3B0aW9ucyk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGZpbGUgPSBhd2FpdCBlbmdpbmUucHJvY2VzcyhtYXJrZG93bik7XG5cdFx0XHRyZXR1cm4gU3RyaW5nKGZpbGUpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZW5kZXIgbWFya2Rvd246ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuXHRcdH1cblx0fVxuXG5cdHJlbmRlclN5bmMobWFya2Rvd246IHN0cmluZywgb3B0aW9ucz86IFJlbmRlck9wdGlvbnMpOiBzdHJpbmcge1xuXHRcdHRyeSB7XG5cdFx0XHRsZXQge2VuZ2luZX0gPSB0aGlzO1xuXHRcdFx0aWYgKG9wdGlvbnMpIHtcblx0XHRcdFx0b3B0aW9ucyA9IHsuLi50aGlzLl9vcHRpb25zLnJlbmRlck9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuXHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hc3NpZ25tZW50XG5cdFx0XHRcdGVuZ2luZSA9IHRoaXMuY3JlYXRlUHJvY2Vzc29yKG9wdGlvbnMpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBmaWxlID0gZW5naW5lLnByb2Nlc3NTeW5jKG1hcmtkb3duKTtcblx0XHRcdHJldHVybiBTdHJpbmcoZmlsZSk7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlbmRlciBtYXJrZG93bjogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgcmVuZGVyUmVhY3QobWFya2Rvd246IHN0cmluZywgb3B0aW9ucz86IFJlbmRlck9wdGlvbnMsIHJlYWN0UGFyc2VPcHRpb25zPzogSFRNTFJlYWN0UGFyc2VyT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nIHwgUmVhY3QuSlNYLkVsZW1lbnQgfCBSZWFjdC5KU1guRWxlbWVudFtdPiB7XG5cdFx0Y29uc3QgaHRtbCA9IGF3YWl0IHRoaXMucmVuZGVyKG1hcmtkb3duLCBvcHRpb25zKTtcblxuXHRcdHJldHVybiBwYXJzZShodG1sLCByZWFjdFBhcnNlT3B0aW9ucyk7XG5cdH1cblxuXHRyZW5kZXJSZWFjdFN5bmMobWFya2Rvd246IHN0cmluZywgb3B0aW9ucz86IFJlbmRlck9wdGlvbnMsIHJlYWN0UGFyc2VPcHRpb25zPzogSFRNTFJlYWN0UGFyc2VyT3B0aW9ucyk6IHN0cmluZyB8IFJlYWN0LkpTWC5FbGVtZW50IHwgUmVhY3QuSlNYLkVsZW1lbnRbXSB7XG5cdFx0Y29uc3QgaHRtbCA9IHRoaXMucmVuZGVyU3luYyhtYXJrZG93biwgb3B0aW9ucyk7XG5cdFx0cmV0dXJuIHBhcnNlKGh0bWwsIHJlYWN0UGFyc2VPcHRpb25zKTtcblx0fVxuXG5cdHByaXZhdGUgY3JlYXRlUHJvY2Vzc29yKG9wdGlvbnM6IFJlbmRlck9wdGlvbnMpOiBhbnkge1xuXHRcdGNvbnN0IHByb2Nlc3NvciA9IHVuaWZpZWQoKS51c2UocmVtYXJrUGFyc2UpO1xuXG5cdFx0aWYgKG9wdGlvbnMuZ2ZtKSB7XG5cdFx0XHRwcm9jZXNzb3IudXNlKHJlbWFya0dmbSk7XG5cdFx0fVxuXG5cdFx0aWYgKG9wdGlvbnMudG9jKSB7XG5cdFx0XHRwcm9jZXNzb3IudXNlKHJlbWFya1RvYywge2hlYWRpbmc6ICd0b2N8dGFibGUgb2YgY29udGVudHMnfSk7XG5cdFx0fVxuXG5cdFx0aWYgKG9wdGlvbnMuZW1vamkpIHtcblx0XHRcdHByb2Nlc3Nvci51c2UocmVtYXJrRW1vamkpO1xuXHRcdH1cblxuXHRcdHByb2Nlc3Nvci51c2UocmVtYXJrUmVoeXBlKTtcblxuXHRcdGlmIChvcHRpb25zLnNsdWcpIHtcblx0XHRcdHByb2Nlc3Nvci51c2UocmVoeXBlU2x1Zyk7XG5cdFx0fVxuXG5cdFx0aWYgKG9wdGlvbnMuaGlnaGxpZ2h0KSB7XG5cdFx0XHRwcm9jZXNzb3IudXNlKHJlaHlwZUhpZ2hsaWdodCk7XG5cdFx0fVxuXG5cdFx0cHJvY2Vzc29yLnVzZShyZWh5cGVTdHJpbmdpZnkpO1xuXG5cdFx0cmV0dXJuIHByb2Nlc3Nvcjtcblx0fVxufVxuXG5leHBvcnQge1dyaXRyLCB0eXBlIFdyaXRyT3B0aW9ucywgdHlwZSBSZW5kZXJPcHRpb25zfTtcblxuIl19
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "writr",
3
- "version": "3.0.0",
3
+ "version": "3.1.0",
4
4
  "description": "Markdown Rendering Simplified",
5
5
  "type": "module",
6
- "exports": "./dist/index.js",
7
- "types": "./dist/index.d.ts",
6
+ "exports": "./dist/writr.js",
7
+ "types": "./dist/writr.d.ts",
8
8
  "repository": "https://github.com/jaredwray/writr.git",
9
9
  "author": "Jared Wray <me@jaredwray.com>",
10
10
  "engines": {
@@ -33,7 +33,11 @@
33
33
  "seo-friendly",
34
34
  "markdown-anchors",
35
35
  "remark",
36
- "rehype"
36
+ "rehype",
37
+ "react",
38
+ "react-component",
39
+ "react-markdown",
40
+ "markdown-to-react"
37
41
  ],
38
42
  "scripts": {
39
43
  "clean": "rimraf ./dist ./coverage ./node_modules ./package-lock.json ./yarn.lock ./site/README.md ./site-output",
@@ -44,11 +48,15 @@
44
48
  "prepare": "yarn run build"
45
49
  },
46
50
  "dependencies": {
51
+ "html-react-parser": "^5.1.8",
52
+ "react": "^18.2.0",
47
53
  "rehype-highlight": "^7.0.0",
54
+ "rehype-katex": "^7.0.0",
48
55
  "rehype-slug": "^6.0.0",
49
56
  "rehype-stringify": "^10.0.0",
50
57
  "remark-emoji": "^4.0.1",
51
58
  "remark-gfm": "^4.0.0",
59
+ "remark-math": "^6.0.0",
52
60
  "remark-parse": "^11.0.0",
53
61
  "remark-rehype": "^11.1.0",
54
62
  "remark-toc": "^9.0.0",
@@ -57,6 +65,7 @@
57
65
  },
58
66
  "devDependencies": {
59
67
  "@types/node": "^20.10.5",
68
+ "@types/react": "^18.2.61",
60
69
  "@vitest/coverage-v8": "^1.1.0",
61
70
  "docula": "^0.4.0",
62
71
  "rimraf": "^5.0.5",