@isdk/mdast-plus 0.2.2 → 0.2.4

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.
Files changed (35) hide show
  1. package/README.cn.md +9 -5
  2. package/README.md +9 -5
  3. package/dist/index.d.mts +27 -9
  4. package/dist/index.d.ts +27 -9
  5. package/dist/index.js +1 -1
  6. package/dist/index.mjs +1 -1
  7. package/docs/README.md +9 -5
  8. package/docs/_media/CONTRIBUTING.md +35 -0
  9. package/docs/_media/README.cn.md +9 -5
  10. package/docs/classes/MdastBasePipeline.md +25 -25
  11. package/docs/classes/MdastPipeline.md +32 -32
  12. package/docs/enumerations/PipelineStage.md +6 -6
  13. package/docs/functions/astCompiler.md +1 -1
  14. package/docs/functions/checkUrlExists.md +25 -0
  15. package/docs/functions/jsonParser.md +1 -1
  16. package/docs/functions/mdast.md +1 -1
  17. package/docs/globals.md +1 -0
  18. package/docs/interfaces/MdastDataOrigin.md +4 -4
  19. package/docs/interfaces/MdastFormat.md +7 -7
  20. package/docs/interfaces/MdastMark.md +3 -3
  21. package/docs/interfaces/MdastPlugin.md +9 -9
  22. package/docs/interfaces/MdastSub.md +3 -3
  23. package/docs/interfaces/MdastSup.md +3 -3
  24. package/docs/interfaces/PipelineRunOptions.md +4 -4
  25. package/docs/interfaces/ReadabilityOptions.md +38 -6
  26. package/docs/type-aliases/PipelineStageName.md +1 -1
  27. package/docs/variables/DefaultPipelineStage.md +1 -1
  28. package/docs/variables/astFormat.md +1 -1
  29. package/docs/variables/htmlFormat.md +1 -1
  30. package/docs/variables/htmlReadability.md +1 -1
  31. package/docs/variables/htmlReadabilityPlugin.md +1 -1
  32. package/docs/variables/htmlReadabilityPlugins.md +2 -2
  33. package/docs/variables/markdownFormat.md +1 -1
  34. package/docs/variables/restoreReadabilityMetaPlugin.md +8 -2
  35. package/package.json +1 -1
package/README.cn.md CHANGED
@@ -102,12 +102,16 @@ const vfile = await mdast(myInput)
102
102
  .data({ myGlobal: 'value' })
103
103
  // 以数组形式在 'compile' 阶段添加多个插件
104
104
  .use([pluginA, pluginB])
105
- // 或在特定阶段添加一组插件
106
- .useAt('parse', htmlReadabilityPlugins)
105
+ // 或在特定阶段添加一组插件并配置选项
106
+ .useAt('parse', htmlReadabilityPlugins, {
107
+ url: 'https://example.com/article',
108
+ frontmatter: true, // 将元数据注入为 YAML Frontmatter
109
+ sourceLink: true // 在底部添加原文链接
110
+ })
107
111
  .priority(10) // 比默认插件更晚执行
108
- .to('html');
112
+ .to('markdown');
109
113
 
110
- console.log(vfile.value); // 序列化后的 HTML 字符串
114
+ console.log(vfile.value); // 包含 Frontmatter 的序列化 Markdown 字符串
111
115
  ```
112
116
 
113
117
  ### 插件行为
@@ -181,7 +185,7 @@ const result = await mdast('Hello').to('reverse');
181
185
  | `extract-code-meta` | normalize | 从代码块元数据中解析 `title="foo"`。 |
182
186
  | `image-size` | normalize | 从图片 URL 中解析 `#=WxH`。 |
183
187
  | `normalize-inline-styles` | normalize | 标准化 `==mark==`、`~sub~` 和 `^sup^`。 |
184
- | `html-readability` | parse | 使用 Mozilla 的 Readability 从 HTML 中提取主体内容。使用 `htmlReadabilityPlugins` 数组可以简化配置。 |
188
+ | `html-readability` | parse | 使用 Mozilla 的 Readability 从 HTML 中提取主体内容。支持 `frontmatter` 注入和 `sourceLink` (原文链接) 页脚。使用 `htmlReadabilityPlugins` 数组可以简化配置。 |
185
189
 
186
190
  ## 贡献
187
191
 
package/README.md CHANGED
@@ -102,12 +102,16 @@ const vfile = await mdast(myInput)
102
102
  .data({ myGlobal: 'value' })
103
103
  // Add multiple plugins as an array at the 'compile' stage
104
104
  .use([pluginA, pluginB])
105
- // Or add a set of plugins at a specific stage
106
- .useAt('parse', htmlReadabilityPlugins)
105
+ // Or add a set of plugins at a specific stage with options
106
+ .useAt('parse', htmlReadabilityPlugins, {
107
+ url: 'https://example.com/article',
108
+ frontmatter: true, // Inject metadata as YAML frontmatter
109
+ sourceLink: true // Append source link at the bottom
110
+ })
107
111
  .priority(10) // Run later than default plugins
108
- .to('html');
112
+ .to('markdown');
109
113
 
110
- console.log(vfile.value); // The serialized HTML string
114
+ console.log(vfile.value); // The serialized Markdown with frontmatter
111
115
  ```
112
116
 
113
117
  ### Plugin Behavior
@@ -181,7 +185,7 @@ Each stage can have one "main" plugin. If a plugin is marked with `main: true`,
181
185
  | `extract-code-meta` | normalize | Parses `title="foo"` from code block meta. |
182
186
  | `image-size` | normalize | Parses `#=WxH` from image URLs. |
183
187
  | `normalize-inline-styles` | normalize | Standardizes `==mark==`, `~sub~`, and `^sup^`. |
184
- | `html-readability` | parse | Uses Mozilla's Readability to extract main content from HTML. Use `htmlReadabilityPlugins` array for easier setup. |
188
+ | `html-readability` | parse | Uses Mozilla's Readability to extract main content from HTML. Supports `frontmatter` injection and `sourceLink` (source link) footer. Use `htmlReadabilityPlugins` array for easier setup. |
185
189
 
186
190
  ## Contributing
187
191
 
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { Plugin, Processor } from 'unified';
1
+ import { Plugin, Pluggable, PluggableList, Processor } from 'unified';
2
2
  import { VFileCompatible, VFile } from 'vfile';
3
3
 
4
4
  // ## Interfaces
@@ -1617,7 +1617,14 @@ declare class MdastBasePipeline {
1617
1617
  * @param options - Arguments for the plugin(s).
1618
1618
  * @returns The pipeline instance for chaining.
1619
1619
  */
1620
- use(plugin: Plugin | MdastPlugin | (Plugin | MdastPlugin)[], ...options: any[]): this;
1620
+ use(plugin: Pluggable | MdastPlugin | (Pluggable | MdastPlugin)[] | PluggableList, ...options: any[]): this;
1621
+ /**
1622
+ * Normalizes various plugin input formats (Pluggable, MdastPlugin, Lists) into a flat array of MdastPlugins.
1623
+ * @param input - The plugin(s) input.
1624
+ * @param options - Global options to apply (if applicable).
1625
+ * @returns An array of MdastPlugins.
1626
+ */
1627
+ private normalizePluggable;
1621
1628
  /**
1622
1629
  * Adds a plugin or an array of plugins to the pipeline at a specific stage.
1623
1630
  * @param stage - The stage name or numeric value.
@@ -1625,14 +1632,14 @@ declare class MdastBasePipeline {
1625
1632
  * @param options - Arguments for the plugin(s).
1626
1633
  * @returns The pipeline instance for chaining.
1627
1634
  */
1628
- useAt(stage: PipelineStage | PipelineStageName, plugin: Plugin | MdastPlugin | (Plugin | MdastPlugin)[], ...options: any[]): this;
1635
+ useAt(stage: PipelineStage | PipelineStageName, plugin: Pluggable | MdastPlugin | PluggableList | (Pluggable | MdastPlugin)[], ...options: any[]): this;
1629
1636
  /**
1630
- * Adds a plugin or an array of plugins to the pipeline. The stage is taken from the plugin object(s).
1631
- * @param plugin - The MdastPlugin object or an array of them.
1637
+ * Adds a plugin or an array of plugins to the pipeline. The stage is taken from the plugin object(s) or defaults to 'compile'.
1638
+ * @param plugin - The MdastPlugin object or an array of them, or a standard unified Pluggable.
1632
1639
  * @param options - Arguments for the plugin(s) (overrides plugin.options if provided).
1633
1640
  * @returns The pipeline instance for chaining.
1634
1641
  */
1635
- useAt(plugin: MdastPlugin | MdastPlugin[], ...options: any[]): this;
1642
+ useAt(plugin: MdastPlugin | MdastPlugin[] | Pluggable | PluggableList, ...options: any[]): this;
1636
1643
  /**
1637
1644
  * Sets the priority order for the most recently added plugin.
1638
1645
  * Plugins with lower order run earlier within the same stage.
@@ -1740,6 +1747,16 @@ interface ReadabilityOptions {
1740
1747
  jsdom?: Record<string, any>;
1741
1748
  hast?: Record<string, any>;
1742
1749
  'rehype-parse'?: Record<string, any>;
1750
+ /**
1751
+ * Whether to inject metadata as frontmatter.
1752
+ * @default false
1753
+ */
1754
+ frontmatter?: boolean | 'yaml' | 'toml';
1755
+ /**
1756
+ * Whether to append source link at the bottom.
1757
+ * @default false
1758
+ */
1759
+ sourceLink?: boolean;
1743
1760
  }
1744
1761
  /**
1745
1762
  * A unified/rehype plugin that uses Mozilla's Readability to parse the input HTML.
@@ -1759,7 +1776,7 @@ declare const htmlReadabilityPlugin: {
1759
1776
  */
1760
1777
  declare const restoreReadabilityMetaPlugin: {
1761
1778
  name: string;
1762
- plugin: () => (tree: any, file: any) => void;
1779
+ plugin: (options?: ReadabilityOptions) => (tree: any, file: any) => void;
1763
1780
  stage: PipelineStage;
1764
1781
  after: string;
1765
1782
  };
@@ -1773,9 +1790,10 @@ declare const htmlReadabilityPlugins: ({
1773
1790
  main: boolean;
1774
1791
  } | {
1775
1792
  name: string;
1776
- plugin: () => (tree: any, file: any) => void;
1793
+ plugin: (options?: ReadabilityOptions) => (tree: any, file: any) => void;
1777
1794
  stage: PipelineStage;
1778
1795
  after: string;
1779
1796
  })[];
1797
+ declare function checkUrlExists(tree: any, url: string): boolean;
1780
1798
 
1781
- export { DefaultPipelineStage, MdastBasePipeline, type MdastDataOrigin, type MdastFormat, type MdastMark, MdastPipeline, type MdastPlugin, type MdastSub, type MdastSup, type PipelineRunOptions, PipelineStage, type PipelineStageName, type ReadabilityOptions, astCompiler, astFormat, htmlFormat, htmlReadability, htmlReadabilityPlugin, htmlReadabilityPlugins, jsonParser, markdownFormat, mdast, restoreReadabilityMetaPlugin };
1799
+ export { DefaultPipelineStage, MdastBasePipeline, type MdastDataOrigin, type MdastFormat, type MdastMark, MdastPipeline, type MdastPlugin, type MdastSub, type MdastSup, type PipelineRunOptions, PipelineStage, type PipelineStageName, type ReadabilityOptions, astCompiler, astFormat, checkUrlExists, htmlFormat, htmlReadability, htmlReadabilityPlugin, htmlReadabilityPlugins, jsonParser, markdownFormat, mdast, restoreReadabilityMetaPlugin };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Plugin, Processor } from 'unified';
1
+ import { Plugin, Pluggable, PluggableList, Processor } from 'unified';
2
2
  import { VFileCompatible, VFile } from 'vfile';
3
3
 
4
4
  // ## Interfaces
@@ -1617,7 +1617,14 @@ declare class MdastBasePipeline {
1617
1617
  * @param options - Arguments for the plugin(s).
1618
1618
  * @returns The pipeline instance for chaining.
1619
1619
  */
1620
- use(plugin: Plugin | MdastPlugin | (Plugin | MdastPlugin)[], ...options: any[]): this;
1620
+ use(plugin: Pluggable | MdastPlugin | (Pluggable | MdastPlugin)[] | PluggableList, ...options: any[]): this;
1621
+ /**
1622
+ * Normalizes various plugin input formats (Pluggable, MdastPlugin, Lists) into a flat array of MdastPlugins.
1623
+ * @param input - The plugin(s) input.
1624
+ * @param options - Global options to apply (if applicable).
1625
+ * @returns An array of MdastPlugins.
1626
+ */
1627
+ private normalizePluggable;
1621
1628
  /**
1622
1629
  * Adds a plugin or an array of plugins to the pipeline at a specific stage.
1623
1630
  * @param stage - The stage name or numeric value.
@@ -1625,14 +1632,14 @@ declare class MdastBasePipeline {
1625
1632
  * @param options - Arguments for the plugin(s).
1626
1633
  * @returns The pipeline instance for chaining.
1627
1634
  */
1628
- useAt(stage: PipelineStage | PipelineStageName, plugin: Plugin | MdastPlugin | (Plugin | MdastPlugin)[], ...options: any[]): this;
1635
+ useAt(stage: PipelineStage | PipelineStageName, plugin: Pluggable | MdastPlugin | PluggableList | (Pluggable | MdastPlugin)[], ...options: any[]): this;
1629
1636
  /**
1630
- * Adds a plugin or an array of plugins to the pipeline. The stage is taken from the plugin object(s).
1631
- * @param plugin - The MdastPlugin object or an array of them.
1637
+ * Adds a plugin or an array of plugins to the pipeline. The stage is taken from the plugin object(s) or defaults to 'compile'.
1638
+ * @param plugin - The MdastPlugin object or an array of them, or a standard unified Pluggable.
1632
1639
  * @param options - Arguments for the plugin(s) (overrides plugin.options if provided).
1633
1640
  * @returns The pipeline instance for chaining.
1634
1641
  */
1635
- useAt(plugin: MdastPlugin | MdastPlugin[], ...options: any[]): this;
1642
+ useAt(plugin: MdastPlugin | MdastPlugin[] | Pluggable | PluggableList, ...options: any[]): this;
1636
1643
  /**
1637
1644
  * Sets the priority order for the most recently added plugin.
1638
1645
  * Plugins with lower order run earlier within the same stage.
@@ -1740,6 +1747,16 @@ interface ReadabilityOptions {
1740
1747
  jsdom?: Record<string, any>;
1741
1748
  hast?: Record<string, any>;
1742
1749
  'rehype-parse'?: Record<string, any>;
1750
+ /**
1751
+ * Whether to inject metadata as frontmatter.
1752
+ * @default false
1753
+ */
1754
+ frontmatter?: boolean | 'yaml' | 'toml';
1755
+ /**
1756
+ * Whether to append source link at the bottom.
1757
+ * @default false
1758
+ */
1759
+ sourceLink?: boolean;
1743
1760
  }
1744
1761
  /**
1745
1762
  * A unified/rehype plugin that uses Mozilla's Readability to parse the input HTML.
@@ -1759,7 +1776,7 @@ declare const htmlReadabilityPlugin: {
1759
1776
  */
1760
1777
  declare const restoreReadabilityMetaPlugin: {
1761
1778
  name: string;
1762
- plugin: () => (tree: any, file: any) => void;
1779
+ plugin: (options?: ReadabilityOptions) => (tree: any, file: any) => void;
1763
1780
  stage: PipelineStage;
1764
1781
  after: string;
1765
1782
  };
@@ -1773,9 +1790,10 @@ declare const htmlReadabilityPlugins: ({
1773
1790
  main: boolean;
1774
1791
  } | {
1775
1792
  name: string;
1776
- plugin: () => (tree: any, file: any) => void;
1793
+ plugin: (options?: ReadabilityOptions) => (tree: any, file: any) => void;
1777
1794
  stage: PipelineStage;
1778
1795
  after: string;
1779
1796
  })[];
1797
+ declare function checkUrlExists(tree: any, url: string): boolean;
1780
1798
 
1781
- export { DefaultPipelineStage, MdastBasePipeline, type MdastDataOrigin, type MdastFormat, type MdastMark, MdastPipeline, type MdastPlugin, type MdastSub, type MdastSup, type PipelineRunOptions, PipelineStage, type PipelineStageName, type ReadabilityOptions, astCompiler, astFormat, htmlFormat, htmlReadability, htmlReadabilityPlugin, htmlReadabilityPlugins, jsonParser, markdownFormat, mdast, restoreReadabilityMetaPlugin };
1799
+ export { DefaultPipelineStage, MdastBasePipeline, type MdastDataOrigin, type MdastFormat, type MdastMark, MdastPipeline, type MdastPlugin, type MdastSub, type MdastSup, type PipelineRunOptions, PipelineStage, type PipelineStageName, type ReadabilityOptions, astCompiler, astFormat, checkUrlExists, htmlFormat, htmlReadability, htmlReadabilityPlugin, htmlReadabilityPlugins, jsonParser, markdownFormat, mdast, restoreReadabilityMetaPlugin };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var t,e=Object.create,r=Object.defineProperty,i=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,s=Object.getPrototypeOf,o=Object.prototype.hasOwnProperty,a=(t,e,s,a)=>{if(e&&"object"==typeof e||"function"==typeof e)for(let l of n(e))o.call(t,l)||l===s||r(t,l,{get:()=>e[l],enumerable:!(a=i(e,l))||a.enumerable});return t},l=(t,i,n)=>(n=null!=t?e(s(t)):{},a(!i&&t&&t.__esModule?n:r(n,"default",{value:t,enumerable:!0}),t)),u={};((t,e)=>{for(var i in e)r(t,i,{get:e[i],enumerable:!0})})(u,{DefaultPipelineStage:()=>p,MdastBasePipeline:()=>K,MdastPipeline:()=>U,PipelineStage:()=>c,astCompiler:()=>V,astFormat:()=>G,htmlFormat:()=>L,htmlReadability:()=>Z,htmlReadabilityPlugin:()=>tt,htmlReadabilityPlugins:()=>rt,jsonParser:()=>_,markdownFormat:()=>R,mdast:()=>W,restoreReadabilityMetaPlugin:()=>et}),module.exports=(t=u,a(r({},"__esModule",{value:!0}),t));var c=(t=>(t[t.parse=0]="parse",t[t.normalize=100]="normalize",t[t.compile=200]="compile",t[t.finalize=300]="finalize",t[t.stringify=400]="stringify",t))(c||{}),p=200,f=require("unified"),h=require("vfile"),m=l(require("remark-parse")),d=l(require("remark-stringify")),g=l(require("remark-gfm")),y=l(require("remark-directive")),b=l(require("remark-math")),v=l(require("remark-frontmatter")),w=require("unist-util-visit");function k(t,e){return{type:t,children:e,data:{hName:t}}}var q={mark:(t,e,r)=>"=="+r.containerPhrasing(t,{before:"==",after:"=="})+"==",sub:(t,e,r)=>"~"+r.containerPhrasing(t,{before:"~",after:"~"})+"~",sup:(t,e,r)=>"^"+r.containerPhrasing(t,{before:"^",after:"^"})+"^"},j={plugin:()=>t=>{!function(t){(0,w.visit)(t,"text",(t,e,r)=>{if(!r||void 0===e)return;const i=t.value;let n=0;const s=[];let o=!1;const a=/(==[^=]+==|~[^~]+~|\^[^^]+\^)/g;let l;for(;null!==(l=a.exec(i));){o=!0;const t=l[0],e=l.index;e>n&&s.push({type:"text",value:i.slice(n,e)});let r="mark",u="";t.startsWith("==")?(r="mark",u=t.slice(2,-2)):t.startsWith("~")?(r="sub",u=t.slice(1,-1)):t.startsWith("^")&&(r="sup",u=t.slice(1,-1)),s.push(k(r,[{type:"text",value:u}])),n=a.lastIndex}return o?(n<i.length&&s.push({type:"text",value:i.slice(n)}),r.children.splice(e,1,...s),e+s.length):void 0})}(t)},stage:100},M=require("unist-util-visit"),P={error:"danger",warn:"warning",success:"tip",important:"important",caution:"caution",note:"note"},x={plugin:()=>async t=>{(0,M.visit)(t,["containerDirective","leafDirective","textDirective"],t=>{const e=t,r=e.name.toLowerCase();if(e.name=P[r]||r,e.children&&e.children.length>0){const t=e.children[0];if(t.data?.directiveLabel||"directiveLabel"===t.type){const r=t;let i="";(0,M.visit)(r,"text",t=>{i+=t.value}),i&&!e.attributes?.title&&(e.attributes=e.attributes||{},e.attributes.title=i.trim()),e.children.shift()}}e.attributes?.title&&(e.attributes.title=String(e.attributes.title).trim()),e.data=e.data||{},e.data.hName=e.data.hName||("containerDirective"===e.type?"div":"span"),e.data.hProperties={...e.data.hProperties||{},...e.attributes,className:[e.name,e.data.hProperties?.className].filter(Boolean).join(" ")}})},stage:100,order:10},S=require("unist-util-visit"),T={plugin:()=>async t=>{(0,S.visit)(t,"tableCell",t=>{if(t.data){const{rowspan:e,colspan:r}=t.data;t.data.hProperties=t.data.hProperties||{},void 0!==e&&(t.data.hProperties.rowSpan=e,delete t.data.rowspan),void 0!==r&&(t.data.hProperties.colSpan=r,delete t.data.colspan)}})},stage:100,order:20},F=require("unist-util-visit"),N=require("shell-quote");var O={plugin:()=>async t=>{(0,F.visit)(t,"code",t=>{if(t.meta){const e=function(t){const e={},r=(0,N.parse)(t);for(const t of r)if("string"==typeof t){const r=t.split("=",2);2===r.length?e[r[0]]=r[1]:e[t]="true"}return e}(t.meta),r=t.data=t.data||{};e.title&&(r.title=e.title),e.filename&&(r.filename=e.filename),r.kv={...r.kv||{},...e}}})},stage:100,order:30},A=require("unist-util-visit"),D={plugin:()=>async t=>{(0,A.visit)(t,"image",t=>{const e=t.data=t.data||{},r=e.hProperties=e.hProperties||{},i=/[#?&](?:width=([0-9]+))?(?:&?height=([0-9]+))?(?:=([0-9]+)x([0-9]+))?$/,n=t.url.match(i);if(n){const e=n[1]||n[3],s=n[2]||n[4];e&&!r.width&&(r.width=parseInt(e,10)),s&&!r.height&&(r.height=parseInt(s,10)),t.url=t.url.replace(i,"")}e.width&&!r.width&&(r.width=e.width),e.height&&!r.height&&(r.height=e.height)})},stage:100,order:40},z=[{plugin:m.default,stage:0},{plugin:g.default,options:[{singleTilde:!1}],stage:0},{plugin:y.default,stage:0},{plugin:b.default,stage:0},{plugin:v.default,options:[["yaml","toml"]],stage:0},x,T,O,D,j],E=[{plugin:d.default,options:[{handlers:q}],stage:400},{plugin:g.default,options:[{singleTilde:!1}],stage:400},{plugin:y.default,stage:400},{plugin:b.default,stage:400},{plugin:v.default,options:[["yaml","toml"]],stage:400}];E.forEach(t=>{t.plugin===d.default?t.order=100:t.order=10});var R={id:"markdown",title:"Markdown (GFM + Directives)",extensions:["md","markdown","mdown","mkdn"],mediaTypes:["text/markdown"],input:z,output:E},$=l(require("rehype-parse")),B=l(require("rehype-remark")),C=l(require("remark-rehype")),H=l(require("rehype-sanitize")),I=l(require("rehype-stringify")),L={id:"html",title:"HTML",extensions:["html","htm"],mediaTypes:["text/html"],input:[{name:"rehype-parse",plugin:$.default,stage:0},{name:"rehype-remark",plugin:B.default,options:[{handlers:{mark:(t,e)=>{const r={type:"mark",children:t.all(e)};return t.patch(e,r),r},sub:(t,e)=>{const r={type:"sub",children:t.all(e)};return t.patch(e,r),r},sup:(t,e)=>{const r={type:"sup",children:t.all(e)};return t.patch(e,r),r}}}],stage:0}],output:[{plugin:C.default,stage:300,order:10},{plugin:H.default,options:[{...H.defaultSchema,tagNames:[...H.defaultSchema.tagNames||[],"mark","sub","sup"],attributes:{...H.defaultSchema.attributes,"*":[...H.defaultSchema.attributes?.["*"]||[],"className","id","style"],td:[...H.defaultSchema.attributes?.td||[],"rowSpan","colSpan","rowspan","colspan"],th:[...H.defaultSchema.attributes?.th||[],"rowSpan","colSpan","rowspan","colspan"],img:[...H.defaultSchema.attributes?.img||[],"width","height"]}}],stage:300,order:20},{plugin:I.default,stage:400}]};function V(){this.Compiler=t=>t}function _(){this.Parser=t=>JSON.parse(t)}var G={id:"ast",title:"MDAST",input:[{plugin:_,stage:0},x,T,O,D,j],output:[{plugin:V,options:[],stage:400}]};function J(t){return"object"==typeof t&&null!==t&&"string"==typeof t.type}var Q=class t{constructor(t){this.queue=[],this._data={},this.input=t}static register(t){this.registry.set(t.id,t)}static getFormat(t){return this.registry.get(t)}data(t,e){return"string"==typeof t?this._data[t]=e:Object.assign(this._data,t),this}getFormat(t){return this.constructor.getFormat(t)}resolveFormat(t){if("string"==typeof t){const e=this.getFormat(t);if(!e)throw new Error(`[MdastPlus] Format '${t}' is not registered.`);return e}return t}toRuntimeEntry(t,e,r){let i=e;void 0!==t.stage&&(i="string"==typeof t.stage?c[t.stage]??e:t.stage);let n=t.options||[];const s=t.name||t.plugin.name;if(r&&s&&s in r){const e=r[s];"object"!=typeof e||null===e||Array.isArray(e)?n=Array.isArray(e)?e:[e]:("main"in e&&(t.main=!!e.main),"before"in e&&(t.before=e.before),"after"in e&&(t.after=e.after),n=[e])}return{name:s,plugin:t.plugin,options:n,stage:i,order:t.order||0,main:t.main,before:t.before,after:t.after}}ensureInputPlugins(e,r,i=400){const n=e.some(t=>0===(t.stage??p)),s=J(this.input);if(!n){let n=[];if(s){const e=t.getFormat("ast");e&&e.input&&(n=e.input)}else{const e=t.getFormat("markdown");e&&e.input&&(n=e.input)}for(const t of n){const n=this.toRuntimeEntry(t,0,r);(n.stage??p)<=i&&e.push(n)}}}from(t,e){const r=this.resolveFormat(t);if(!r.input||0===r.input.length)throw new Error(`[MdastPlus] Format '${r.id}' does not support input.`);for(const t of r.input)this.queue.push(this.toRuntimeEntry(t,0,e));return this}resolveRunQueue(t,e,r,i){let n=[];if(n=e?this.queue.map(t=>this.toRuntimeEntry(t,t.stage??p,e)):[...this.queue],void 0!==r){const t=r;n=n.filter(e=>(e.stage??p)<=t);const s=n.findIndex(e=>(e.stage??p)===t),o=-1!==s?s+(i??0):n.length-1,a=n.slice(0,o+1),l=n.filter(t=>t.main&&!a.includes(t));n=a.concat(l),this.ensureInputPlugins(n,e,t),n.push({plugin:V,options:[],stage:400,order:0})}else if(this.ensureInputPlugins(n,e,400),t.output)for(const r of t.output)n.push(this.toRuntimeEntry(r,300,e));return n}async to(t,e){const r=this.resolveFormat(t);if(!r.output)throw new Error(`[MdastPlus] Format '${r.id}' does not support output.`);let i,n,s;if(e){const t=e;"overrides"in t||"stage"in t||"stopAtIndex"in t?(i=t.overrides,n="string"==typeof t.stage?c[t.stage]:t.stage,s=t.stopAtIndex):i=e}const o=this.resolveRunQueue(r,i,n,s),a=this.assembleProcessor(o);if(J(this.input)){const t=await a.run(this.input),e=a.stringify(t),r=new h.VFile;return"string"==typeof e||Buffer.isBuffer(e)?r.value=e:r.result=e,r}return a.process(this.input)}use(t,...e){return this.useAt("compile",t,...e)}useAt(t,e,...r){if(Array.isArray(t)){for(const i of t)this.useAt(i,e,...r);return this}if(Array.isArray(e)){for(const i of e)this.useAt(t,i,...r);return this}if("object"==typeof t&&null!==t&&"plugin"in t){const i=t,n=void 0!==i.stage?"string"==typeof i.stage?c[i.stage]:i.stage:p,s=void 0!==e?[e,...r]:i.options;this.queue.push(this.toRuntimeEntry({...i,options:s},n))}else{const i="string"==typeof t?c[t]??p:t;if("object"==typeof e&&null!==e&&"plugin"in e){const t=e,n=r.length>0?r:t.options;this.queue.push(this.toRuntimeEntry({...t,options:n},i))}else e&&this.queue.push({plugin:e,options:r,stage:i,order:0})}return this}priority(t){const e=this.queue[this.queue.length-1];return e&&(e.order=t),this}configure(t,...e){for(let r=this.queue.length-1;r>=0;r--){const i=this.queue[r];if((i.name||i.plugin.name)===t){i.options=e;break}}return this}assembleProcessor(t){const e={};for(const r of t){const t=r.stage??p;e[t]||(e[t]=[]),e[t].push(r)}const r=[],i=Object.keys(e).map(Number).sort((t,e)=>t-e);for(const t of i){const i=e[t].sort((t,e)=>(t.order||0)-(e.order||0)),n=i.findIndex(t=>t.main);if(-1!==n){const t=i[n];!1===t.options?.[0]?console.warn(`Main Plugin "${t.name}" is disabled. Skipping.`):0!==n&&(i.splice(n,1),i[0]=t)}let s=!0,o=0;for(;s&&o<i.length;){s=!1,o++;for(let t=0;t<i.length;t++){const e=i[t];if(e.after){const r=i.findIndex(t=>t.name===e.after);if(-1!==r&&r>t){i.splice(t,1),i.splice(r,0,e),s=!0;break}}if(e.before){const r=i.findIndex(t=>t.name===e.before);if(-1!==r&&r<t){i.splice(t,1),i.splice(r,0,e),s=!0;break}}}}r.push(...i)}const n=(0,f.unified)();Object.keys(this._data).length>0&&n.data(this._data);for(const t of r)n.use(t.plugin,...t.options||[]);return n}};Q.registry=new Map;var K=Q,U=class extends K{async toMarkdown(){const t=await this.to("markdown");return String(t)}toMarkdownVFile(){return this.to("markdown")}async toHtml(){const t=await this.to("html");return String(t)}toHtmlVFile(){return this.to("html")}async toAst(t){return(await this.to("ast",t)).result}toHTML(){return this.toHtml()}toAST(t){return this.toAst(t)}};function W(t){return new U(t)}U.register(R),U.register(L),U.register(G);var X=require("hast-util-from-html"),Y=require("hast-util-from-dom"),Z=function(t){const{readability:e,jsdom:r,hast:i,url:n}=t||{};this.parser=function(t,s){if(!1===e)return(0,X.fromHtml)(t,{fragment:!0,...i});let o,a;try{o=require("jsdom").JSDOM;a=require("@mozilla/readability").Readability}catch(t){throw new Error("[html-readability] Dependency missing. Please install 'jsdom' and '@mozilla/readability'.")}const l=new a(new o(t,{url:n,pretendToBeVisual:!0,...r,includeNodeLocations:!0}).window.document,{maxElemsToParse:1e5,nbTopCandidates:5,charThreshold:500,keepClasses:!0,...e,serializer:t=>t}).parse();if(!l||!l.content)return(0,X.fromHtml)(t,{fragment:!0,...i});const u=l.content;let c=(0,Y.fromDom)(u,{afterTransform:i?.afterTransform});const p=!1!==i?.fragment,f={...l};return delete f.content,delete f.textContent,s&&(s.data=s.data||{},s.data.readability=f),c&&(c=p?{type:"root",children:[c]}:{type:"root",children:[{type:"element",tagName:"html",properties:{},children:[{type:"element",tagName:"head",properties:{},children:[]},{type:"element",tagName:"body",properties:{},children:[c]}]}]},c.data=c.data||{},c.data.readability=f),c}},tt={name:"readability",plugin:Z,stage:0,main:!0},et={name:"restore-readability-meta",plugin:()=>(t,e)=>{e.data?.readability&&(t.data=t.data||{},t.data.readability=e.data.readability)},stage:0,after:"rehype-remark"},rt=[tt,et];
1
+ "use strict";var t,e=Object.create,r=Object.defineProperty,i=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,s=Object.getPrototypeOf,o=Object.prototype.hasOwnProperty,a=(t,e,s,a)=>{if(e&&"object"==typeof e||"function"==typeof e)for(let u of n(e))o.call(t,u)||u===s||r(t,u,{get:()=>e[u],enumerable:!(a=i(e,u))||a.enumerable});return t},u=(t,i,n)=>(n=null!=t?e(s(t)):{},a(!i&&t&&t.__esModule?n:r(n,"default",{value:t,enumerable:!0}),t)),l={};((t,e)=>{for(var i in e)r(t,i,{get:e[i],enumerable:!0})})(l,{DefaultPipelineStage:()=>p,MdastBasePipeline:()=>Q,MdastPipeline:()=>K,PipelineStage:()=>c,astCompiler:()=>U,astFormat:()=>_,checkUrlExists:()=>ot,htmlFormat:()=>I,htmlReadability:()=>rt,htmlReadabilityPlugin:()=>it,htmlReadabilityPlugins:()=>st,jsonParser:()=>V,markdownFormat:()=>E,mdast:()=>W,restoreReadabilityMetaPlugin:()=>nt}),module.exports=(t=l,a(r({},"__esModule",{value:!0}),t));var c=(t=>(t[t.parse=0]="parse",t[t.normalize=100]="normalize",t[t.compile=200]="compile",t[t.finalize=300]="finalize",t[t.stringify=400]="stringify",t))(c||{}),p=200,f=require("unified"),m=require("vfile"),h=u(require("remark-parse")),g=u(require("remark-stringify")),d=u(require("remark-gfm")),y=u(require("remark-directive")),b=u(require("remark-math")),v=u(require("remark-frontmatter")),w=require("unist-util-visit");function k(t,e){return{type:t,children:e,data:{hName:t}}}var q={mark:(t,e,r)=>"=="+r.containerPhrasing(t,{before:"==",after:"=="})+"==",sub:(t,e,r)=>"~"+r.containerPhrasing(t,{before:"~",after:"~"})+"~",sup:(t,e,r)=>"^"+r.containerPhrasing(t,{before:"^",after:"^"})+"^"},j={plugin:()=>t=>{!function(t){(0,w.visit)(t,"text",(t,e,r)=>{if(!r||void 0===e)return;const i=t.value;let n=0;const s=[];let o=!1;const a=/(==[^=]+==|~[^~]+~|\^[^^]+\^)/g;let u;for(;null!==(u=a.exec(i));){o=!0;const t=u[0],e=u.index;e>n&&s.push({type:"text",value:i.slice(n,e)});let r="mark",l="";t.startsWith("==")?(r="mark",l=t.slice(2,-2)):t.startsWith("~")?(r="sub",l=t.slice(1,-1)):t.startsWith("^")&&(r="sup",l=t.slice(1,-1)),s.push(k(r,[{type:"text",value:l}])),n=a.lastIndex}return o?(n<i.length&&s.push({type:"text",value:i.slice(n)}),r.children.splice(e,1,...s),e+s.length):void 0})}(t)},stage:100},x=require("unist-util-visit"),P={error:"danger",warn:"warning",success:"tip",important:"important",caution:"caution",note:"note"},M={plugin:()=>async t=>{(0,x.visit)(t,["containerDirective","leafDirective","textDirective"],t=>{const e=t,r=e.name.toLowerCase();if(e.name=P[r]||r,e.children&&e.children.length>0){const t=e.children[0];if(t.data?.directiveLabel||"directiveLabel"===t.type){const r=t;let i="";(0,x.visit)(r,"text",t=>{i+=t.value}),i&&!e.attributes?.title&&(e.attributes=e.attributes||{},e.attributes.title=i.trim()),e.children.shift()}}e.attributes?.title&&(e.attributes.title=String(e.attributes.title).trim()),e.data=e.data||{},e.data.hName=e.data.hName||("containerDirective"===e.type?"div":"span"),e.data.hProperties={...e.data.hProperties||{},...e.attributes,className:[e.name,e.data.hProperties?.className].filter(Boolean).join(" ")}})},stage:100,order:10},S=require("unist-util-visit"),T={plugin:()=>async t=>{(0,S.visit)(t,"tableCell",t=>{if(t.data){const{rowspan:e,colspan:r}=t.data;t.data.hProperties=t.data.hProperties||{},void 0!==e&&(t.data.hProperties.rowSpan=e,delete t.data.rowspan),void 0!==r&&(t.data.hProperties.colSpan=r,delete t.data.colspan)}})},stage:100,order:20},F=require("unist-util-visit"),N=require("shell-quote");var O={plugin:()=>async t=>{(0,F.visit)(t,"code",t=>{if(t.meta){const e=function(t){const e={},r=(0,N.parse)(t);for(const t of r)if("string"==typeof t){const r=t.split("=",2);2===r.length?e[r[0]]=r[1]:e[t]="true"}return e}(t.meta),r=t.data=t.data||{};e.title&&(r.title=e.title),e.filename&&(r.filename=e.filename),r.kv={...r.kv||{},...e}}})},stage:100,order:30},A=require("unist-util-visit"),D={plugin:()=>async t=>{(0,A.visit)(t,"image",t=>{const e=t.data=t.data||{},r=e.hProperties=e.hProperties||{},i=/[#?&](?:width=([0-9]+))?(?:&?height=([0-9]+))?(?:=([0-9]+)x([0-9]+))?$/,n=t.url.match(i);if(n){const e=n[1]||n[3],s=n[2]||n[4];e&&!r.width&&(r.width=parseInt(e,10)),s&&!r.height&&(r.height=parseInt(s,10)),t.url=t.url.replace(i,"")}e.width&&!r.width&&(r.width=e.width),e.height&&!r.height&&(r.height=e.height)})},stage:100,order:40},R=[{plugin:h.default,stage:0},{plugin:d.default,options:[{singleTilde:!1}],stage:0},{plugin:y.default,stage:0},{plugin:b.default,stage:0},{plugin:v.default,options:[["yaml","toml"]],stage:0},M,T,O,D,j],z=[{plugin:g.default,options:[{handlers:q}],stage:400},{plugin:d.default,options:[{singleTilde:!1}],stage:400},{plugin:y.default,stage:400},{plugin:b.default,stage:400},{plugin:v.default,options:[["yaml","toml"]],stage:400}];z.forEach(t=>{t.plugin===g.default?t.order=100:t.order=10});var E={id:"markdown",title:"Markdown (GFM + Directives)",extensions:["md","markdown","mdown","mkdn"],mediaTypes:["text/markdown"],input:R,output:z},L=u(require("rehype-parse")),$=u(require("rehype-remark")),B=u(require("remark-rehype")),C=u(require("rehype-sanitize")),H=u(require("rehype-stringify")),I={id:"html",title:"HTML",extensions:["html","htm"],mediaTypes:["text/html"],input:[{name:"rehype-parse",plugin:L.default,stage:0},{name:"rehype-remark",plugin:$.default,options:[{handlers:{mark:(t,e)=>{const r={type:"mark",children:t.all(e)};return t.patch(e,r),r},sub:(t,e)=>{const r={type:"sub",children:t.all(e)};return t.patch(e,r),r},sup:(t,e)=>{const r={type:"sup",children:t.all(e)};return t.patch(e,r),r}}}],stage:0}],output:[{plugin:B.default,stage:300,order:10},{plugin:C.default,options:[{...C.defaultSchema,tagNames:[...C.defaultSchema.tagNames||[],"mark","sub","sup"],attributes:{...C.defaultSchema.attributes,"*":[...C.defaultSchema.attributes?.["*"]||[],"className","id","style"],td:[...C.defaultSchema.attributes?.td||[],"rowSpan","colSpan","rowspan","colspan"],th:[...C.defaultSchema.attributes?.th||[],"rowSpan","colSpan","rowspan","colspan"],img:[...C.defaultSchema.attributes?.img||[],"width","height"]}}],stage:300,order:20},{plugin:H.default,stage:400}]};function U(){this.Compiler=t=>t}function V(){this.Parser=t=>JSON.parse(t)}var _={id:"ast",title:"MDAST",input:[{plugin:V,stage:0},M,T,O,D,j],output:[{plugin:U,options:[],stage:400}]};function G(t){return"object"==typeof t&&null!==t&&"string"==typeof t.type}var J=class t{constructor(t){this.queue=[],this._data={},this.input=t}static register(t){this.registry.set(t.id,t)}static getFormat(t){return this.registry.get(t)}data(t,e){return"string"==typeof t?this._data[t]=e:Object.assign(this._data,t),this}getFormat(t){return this.constructor.getFormat(t)}resolveFormat(t){if("string"==typeof t){const e=this.getFormat(t);if(!e)throw new Error(`[MdastPlus] Format '${t}' is not registered.`);return e}return t}toRuntimeEntry(t,e,r){let i=e;void 0!==t.stage&&(i="string"==typeof t.stage?c[t.stage]??e:t.stage);let n=t.options||[];const s=t.name||t.plugin.name;if(r&&s&&s in r){const e=r[s];"object"!=typeof e||null===e||Array.isArray(e)?n=Array.isArray(e)?e:[e]:("main"in e&&(t.main=!!e.main),"before"in e&&(t.before=e.before),"after"in e&&(t.after=e.after),n=[e])}return{name:s,plugin:t.plugin,options:n,stage:i,order:t.order||0,main:t.main,before:t.before,after:t.after}}ensureInputPlugins(e,r,i=400){const n=e.some(t=>0===(t.stage??p)),s=G(this.input);if(!n){let n=[];if(s){const e=t.getFormat("ast");e&&e.input&&(n=e.input)}else{const e=t.getFormat("markdown");e&&e.input&&(n=e.input)}for(const t of n){const n=this.toRuntimeEntry(t,0,r);(n.stage??p)<=i&&e.push(n)}}}from(t,e){const r=this.resolveFormat(t);if(!r.input||0===r.input.length)throw new Error(`[MdastPlus] Format '${r.id}' does not support input.`);for(const t of r.input)this.queue.push(this.toRuntimeEntry(t,0,e));return this}resolveRunQueue(t,e,r,i){let n=[];if(n=e?this.queue.map(t=>this.toRuntimeEntry(t,t.stage??p,e)):[...this.queue],void 0!==r){const t=r;n=n.filter(e=>(e.stage??p)<=t);const s=n.findIndex(e=>(e.stage??p)===t),o=-1!==s?s+(i??0):n.length-1,a=n.slice(0,o+1),u=n.filter(t=>t.main&&!a.includes(t));n=a.concat(u),this.ensureInputPlugins(n,e,t),n.push({plugin:U,options:[],stage:400,order:0})}else if(this.ensureInputPlugins(n,e,400),t.output)for(const r of t.output)n.push(this.toRuntimeEntry(r,300,e));return n}async to(t,e){const r=this.resolveFormat(t);if(!r.output)throw new Error(`[MdastPlus] Format '${r.id}' does not support output.`);let i,n,s;if(e){const t=e;"overrides"in t||"stage"in t||"stopAtIndex"in t?(i=t.overrides,n="string"==typeof t.stage?c[t.stage]:t.stage,s=t.stopAtIndex):i=e}const o=this.resolveRunQueue(r,i,n,s),a=this.assembleProcessor(o);if(G(this.input)){const t=await a.run(this.input),e=a.stringify(t),r=new m.VFile;return"string"==typeof e||Buffer.isBuffer(e)?r.value=e:r.result=e,r}return a.process(this.input)}use(t,...e){return this.useAt("compile",t,...e)}normalizePluggable(t,e=[]){const r=[];if(Array.isArray(t)){let i=!1;if(t.length>0&&"function"==typeof t[0]){t.slice(1).some(t=>!function(t){if("function"==typeof t)return!0;if(Array.isArray(t))return!0;if("object"==typeof t&&null!==t){if("plugin"in t&&"function"==typeof t.plugin)return!0;if("plugins"in t)return!0}return!1}(t))&&(i=!0)}if(i){const[e,...i]=t;r.push({plugin:e,options:i})}else for(const i of t)r.push(...this.normalizePluggable(i,e))}else if("function"==typeof t)r.push({plugin:t,options:e});else if("object"==typeof t&&null!==t)if("plugin"in t&&"function"==typeof t.plugin){const i=t,n=e.length>0?e:i.options||[];r.push({...i,options:n})}else if("plugins"in t){const e=t;e.plugins&&r.push(...this.normalizePluggable(e.plugins))}return r}useAt(t,e,...r){let i,n,s;"string"==typeof t||"number"==typeof t?(i=("string"==typeof t?c[t]:t)??p,n=e,s=r):(i=void 0,n=t,s=[e,...r].filter(t=>void 0!==t));const o=this.normalizePluggable(n,s);for(const t of o){const e=i??p;this.queue.push(this.toRuntimeEntry(t,e))}return this}priority(t){const e=this.queue[this.queue.length-1];return e&&(e.order=t),this}configure(t,...e){for(let r=this.queue.length-1;r>=0;r--){const i=this.queue[r];if((i.name||i.plugin.name)===t){i.options=e;break}}return this}assembleProcessor(t){const e={};for(const r of t){const t=r.stage??p;e[t]||(e[t]=[]),e[t].push(r)}const r=[],i=Object.keys(e).map(Number).sort((t,e)=>t-e);for(const t of i){const i=e[t].sort((t,e)=>(t.order||0)-(e.order||0)),n=i.findIndex(t=>t.main);if(-1!==n){const t=i[n];!1===t.options?.[0]?console.warn(`Main Plugin "${t.name}" is disabled. Skipping.`):0!==n&&(i.splice(n,1),i[0]=t)}let s=!0,o=0;for(;s&&o<i.length;){s=!1,o++;for(let t=0;t<i.length;t++){const e=i[t];if(e.after){const r=i.findIndex(t=>t.name===e.after);if(-1!==r&&r>t){i.splice(t,1),i.splice(r,0,e),s=!0;break}}if(e.before){const r=i.findIndex(t=>t.name===e.before);if(-1!==r&&r<t){i.splice(t,1),i.splice(r,0,e),s=!0;break}}}}r.push(...i)}const n=(0,f.unified)();Object.keys(this._data).length>0&&n.data(this._data);for(const t of r)n.use(t.plugin,...t.options||[]);return n}};J.registry=new Map;var Q=J,K=class extends Q{async toMarkdown(){const t=await this.to("markdown");return String(t)}toMarkdownVFile(){return this.to("markdown")}async toHtml(){const t=await this.to("html");return String(t)}toHtmlVFile(){return this.to("html")}async toAst(t){return(await this.to("ast",t)).result}toHTML(){return this.toHtml()}toAST(t){return this.toAst(t)}};function W(t){return new K(t)}K.register(E),K.register(I),K.register(_);var X=require("unist-util-visit"),Y=require("hast-util-from-html"),Z=require("hast-util-from-dom"),tt=require("yaml"),et=require("lodash-es"),rt=function(t){const{readability:e,jsdom:r,hast:i,url:n}=t||{};this.parser=function(t,s){if(!1===e)return(0,Y.fromHtml)(t,{fragment:!0,...i});let o,a;try{o=require("jsdom").JSDOM;a=require("@mozilla/readability").Readability}catch(t){throw new Error("[html-readability] Dependency missing. Please install 'jsdom' and '@mozilla/readability'.")}const u=new a(new o(t,{url:n,pretendToBeVisual:!0,...r,includeNodeLocations:!0}).window.document,{maxElemsToParse:1e5,nbTopCandidates:5,charThreshold:500,keepClasses:!0,...e,serializer:t=>t}).parse();if(!u||!u.content)return(0,Y.fromHtml)(t,{fragment:!0,...i});const l=u.content;let c=(0,Z.fromDom)(l,{afterTransform:i?.afterTransform});const p=!1!==i?.fragment,f=(0,et.omitBy)(u,et.isNil);return n&&(f.url=n),delete f.content,delete f.textContent,s&&(s.data=s.data||{},s.data.readability=f),c&&(c=p?{type:"root",children:[c]}:{type:"root",children:[{type:"element",tagName:"html",properties:{},children:[{type:"element",tagName:"head",properties:{},children:[]},{type:"element",tagName:"body",properties:{},children:[c]}]}]},c.data=c.data||{},c.data.readability=f),c}},it={name:"readability",plugin:rt,stage:0,main:!0},nt={name:"restore-readability-meta",plugin:t=>(e,r)=>{if(r.data?.readability){e.data=e.data||{},e.data.readability=r.data.readability;const{frontmatter:i,sourceLink:n}=t||{};if(i){const t="toml"===i?"toml":"yaml",n=(0,tt.stringify)(r.data.readability).trim();e.children.unshift({type:t,value:n})}if(n&&r.data.readability.url){const{url:t,title:i}=r.data.readability;ot(e,t)||e.children.push({type:"blockquote",children:[{type:"paragraph",children:[{type:"text",value:"Source: "},{type:"link",url:t,children:[{type:"text",value:i||t}]}]}]})}}},stage:0,after:"rehype-remark"},st=[it,nt];function ot(t,e){if(!e)return!1;let r=!1;return(0,X.visit)(t,"link",t=>{if(function(t,e){if(!t||!e)return!1;if(t===e)return!0;try{const r=new URL(t),i=new URL(e);return r.href===i.href}catch{return t.replace(/\/$/,"")===e.replace(/\/$/,"")}}(t.url,e))return r=!0,!1}),r}
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- var t=(t=>"undefined"!=typeof require?require:"undefined"!=typeof Proxy?new Proxy(t,{get:(t,e)=>("undefined"!=typeof require?require:t)[e]}):t)(function(t){if("undefined"!=typeof require)return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')}),e=(t=>(t[t.parse=0]="parse",t[t.normalize=100]="normalize",t[t.compile=200]="compile",t[t.finalize=300]="finalize",t[t.stringify=400]="stringify",t))(e||{}),r=200;import{unified as i}from"unified";import{VFile as n}from"vfile";import o from"remark-parse";import s from"remark-stringify";import a from"remark-gfm";import l from"remark-directive";import p from"remark-math";import u from"remark-frontmatter";import{visit as m}from"unist-util-visit";function f(t,e){return{type:t,children:e,data:{hName:t}}}var c={plugin:()=>t=>{!function(t){m(t,"text",(t,e,r)=>{if(!r||void 0===e)return;const i=t.value;let n=0;const o=[];let s=!1;const a=/(==[^=]+==|~[^~]+~|\^[^^]+\^)/g;let l;for(;null!==(l=a.exec(i));){s=!0;const t=l[0],e=l.index;e>n&&o.push({type:"text",value:i.slice(n,e)});let r="mark",p="";t.startsWith("==")?(r="mark",p=t.slice(2,-2)):t.startsWith("~")?(r="sub",p=t.slice(1,-1)):t.startsWith("^")&&(r="sup",p=t.slice(1,-1)),o.push(f(r,[{type:"text",value:p}])),n=a.lastIndex}return s?(n<i.length&&o.push({type:"text",value:i.slice(n)}),r.children.splice(e,1,...o),e+o.length):void 0})}(t)},stage:100};import{visit as h}from"unist-util-visit";var d={error:"danger",warn:"warning",success:"tip",important:"important",caution:"caution",note:"note"},g={plugin:()=>async t=>{h(t,["containerDirective","leafDirective","textDirective"],t=>{const e=t,r=e.name.toLowerCase();if(e.name=d[r]||r,e.children&&e.children.length>0){const t=e.children[0];if(t.data?.directiveLabel||"directiveLabel"===t.type){let r="";h(t,"text",t=>{r+=t.value}),r&&!e.attributes?.title&&(e.attributes=e.attributes||{},e.attributes.title=r.trim()),e.children.shift()}}e.attributes?.title&&(e.attributes.title=String(e.attributes.title).trim()),e.data=e.data||{},e.data.hName=e.data.hName||("containerDirective"===e.type?"div":"span"),e.data.hProperties={...e.data.hProperties||{},...e.attributes,className:[e.name,e.data.hProperties?.className].filter(Boolean).join(" ")}})},stage:100,order:10};import{visit as y}from"unist-util-visit";var v={plugin:()=>async t=>{y(t,"tableCell",t=>{if(t.data){const{rowspan:e,colspan:r}=t.data;t.data.hProperties=t.data.hProperties||{},void 0!==e&&(t.data.hProperties.rowSpan=e,delete t.data.rowspan),void 0!==r&&(t.data.hProperties.colSpan=r,delete t.data.colspan)}})},stage:100,order:20};import{visit as w}from"unist-util-visit";import{parse as b}from"shell-quote";var k={plugin:()=>async t=>{w(t,"code",t=>{if(t.meta){const e=function(t){const e={},r=b(t);for(const t of r)if("string"==typeof t){const r=t.split("=",2);2===r.length?e[r[0]]=r[1]:e[t]="true"}return e}(t.meta),r=t.data=t.data||{};e.title&&(r.title=e.title),e.filename&&(r.filename=e.filename),r.kv={...r.kv||{},...e}}})},stage:100,order:30};import{visit as x}from"unist-util-visit";var T={plugin:()=>async t=>{x(t,"image",t=>{const e=t.data=t.data||{},r=e.hProperties=e.hProperties||{},i=/[#?&](?:width=([0-9]+))?(?:&?height=([0-9]+))?(?:=([0-9]+)x([0-9]+))?$/,n=t.url.match(i);if(n){const e=n[1]||n[3],o=n[2]||n[4];e&&!r.width&&(r.width=parseInt(e,10)),o&&!r.height&&(r.height=parseInt(o,10)),t.url=t.url.replace(i,"")}e.width&&!r.width&&(r.width=e.width),e.height&&!r.height&&(r.height=e.height)})},stage:100,order:40},M=[{plugin:o,stage:0},{plugin:a,options:[{singleTilde:!1}],stage:0},{plugin:l,stage:0},{plugin:p,stage:0},{plugin:u,options:[["yaml","toml"]],stage:0},g,v,k,T,c],S=[{plugin:s,options:[{handlers:{mark:(t,e,r)=>"=="+r.containerPhrasing(t,{before:"==",after:"=="})+"==",sub:(t,e,r)=>"~"+r.containerPhrasing(t,{before:"~",after:"~"})+"~",sup:(t,e,r)=>"^"+r.containerPhrasing(t,{before:"^",after:"^"})+"^"}}],stage:400},{plugin:a,options:[{singleTilde:!1}],stage:400},{plugin:l,stage:400},{plugin:p,stage:400},{plugin:u,options:[["yaml","toml"]],stage:400}];S.forEach(t=>{t.plugin===s?t.order=100:t.order=10});var j={id:"markdown",title:"Markdown (GFM + Directives)",extensions:["md","markdown","mdown","mkdn"],mediaTypes:["text/markdown"],input:M,output:S};import N from"rehype-parse";import P from"rehype-remark";import A from"remark-rehype";import F,{defaultSchema as q}from"rehype-sanitize";import D from"rehype-stringify";var E={id:"html",title:"HTML",extensions:["html","htm"],mediaTypes:["text/html"],input:[{name:"rehype-parse",plugin:N,stage:0},{name:"rehype-remark",plugin:P,options:[{handlers:{mark:(t,e)=>{const r={type:"mark",children:t.all(e)};return t.patch(e,r),r},sub:(t,e)=>{const r={type:"sub",children:t.all(e)};return t.patch(e,r),r},sup:(t,e)=>{const r={type:"sup",children:t.all(e)};return t.patch(e,r),r}}}],stage:0}],output:[{plugin:A,stage:300,order:10},{plugin:F,options:[{...q,tagNames:[...q.tagNames||[],"mark","sub","sup"],attributes:{...q.attributes,"*":[...q.attributes?.["*"]||[],"className","id","style"],td:[...q.attributes?.td||[],"rowSpan","colSpan","rowspan","colspan"],th:[...q.attributes?.th||[],"rowSpan","colSpan","rowspan","colspan"],img:[...q.attributes?.img||[],"width","height"]}}],stage:300,order:20},{plugin:D,stage:400}]};function z(){this.Compiler=t=>t}function $(){this.Parser=t=>JSON.parse(t)}var H={id:"ast",title:"MDAST",input:[{plugin:$,stage:0},g,v,k,T,c],output:[{plugin:z,options:[],stage:400}]};function I(t){return"object"==typeof t&&null!==t&&"string"==typeof t.type}var L=class t{constructor(t){this.queue=[],this._data={},this.input=t}static register(t){this.registry.set(t.id,t)}static getFormat(t){return this.registry.get(t)}data(t,e){return"string"==typeof t?this._data[t]=e:Object.assign(this._data,t),this}getFormat(t){return this.constructor.getFormat(t)}resolveFormat(t){if("string"==typeof t){const e=this.getFormat(t);if(!e)throw new Error(`[MdastPlus] Format '${t}' is not registered.`);return e}return t}toRuntimeEntry(t,r,i){let n=r;void 0!==t.stage&&(n="string"==typeof t.stage?e[t.stage]??r:t.stage);let o=t.options||[];const s=t.name||t.plugin.name;if(i&&s&&s in i){const e=i[s];"object"!=typeof e||null===e||Array.isArray(e)?o=Array.isArray(e)?e:[e]:("main"in e&&(t.main=!!e.main),"before"in e&&(t.before=e.before),"after"in e&&(t.after=e.after),o=[e])}return{name:s,plugin:t.plugin,options:o,stage:n,order:t.order||0,main:t.main,before:t.before,after:t.after}}ensureInputPlugins(e,i,n=400){const o=e.some(t=>0===(t.stage??r)),s=I(this.input);if(!o){let o=[];if(s){const e=t.getFormat("ast");e&&e.input&&(o=e.input)}else{const e=t.getFormat("markdown");e&&e.input&&(o=e.input)}for(const t of o){const o=this.toRuntimeEntry(t,0,i);(o.stage??r)<=n&&e.push(o)}}}from(t,e){const r=this.resolveFormat(t);if(!r.input||0===r.input.length)throw new Error(`[MdastPlus] Format '${r.id}' does not support input.`);for(const t of r.input)this.queue.push(this.toRuntimeEntry(t,0,e));return this}resolveRunQueue(t,e,i,n){let o=[];if(o=e?this.queue.map(t=>this.toRuntimeEntry(t,t.stage??r,e)):[...this.queue],void 0!==i){const t=i;o=o.filter(e=>(e.stage??r)<=t);const s=o.findIndex(e=>(e.stage??r)===t),a=-1!==s?s+(n??0):o.length-1,l=o.slice(0,a+1),p=o.filter(t=>t.main&&!l.includes(t));o=l.concat(p),this.ensureInputPlugins(o,e,t),o.push({plugin:z,options:[],stage:400,order:0})}else if(this.ensureInputPlugins(o,e,400),t.output)for(const r of t.output)o.push(this.toRuntimeEntry(r,300,e));return o}async to(t,r){const i=this.resolveFormat(t);if(!i.output)throw new Error(`[MdastPlus] Format '${i.id}' does not support output.`);let o,s,a;if(r){const t=r;"overrides"in t||"stage"in t||"stopAtIndex"in t?(o=t.overrides,s="string"==typeof t.stage?e[t.stage]:t.stage,a=t.stopAtIndex):o=r}const l=this.resolveRunQueue(i,o,s,a),p=this.assembleProcessor(l);if(I(this.input)){const t=await p.run(this.input),e=p.stringify(t),r=new n;return"string"==typeof e||Buffer.isBuffer(e)?r.value=e:r.result=e,r}return p.process(this.input)}use(t,...e){return this.useAt("compile",t,...e)}useAt(t,i,...n){if(Array.isArray(t)){for(const e of t)this.useAt(e,i,...n);return this}if(Array.isArray(i)){for(const e of i)this.useAt(t,e,...n);return this}if("object"==typeof t&&null!==t&&"plugin"in t){const o=t,s=void 0!==o.stage?"string"==typeof o.stage?e[o.stage]:o.stage:r,a=void 0!==i?[i,...n]:o.options;this.queue.push(this.toRuntimeEntry({...o,options:a},s))}else{const o="string"==typeof t?e[t]??r:t;if("object"==typeof i&&null!==i&&"plugin"in i){const t=i,e=n.length>0?n:t.options;this.queue.push(this.toRuntimeEntry({...t,options:e},o))}else i&&this.queue.push({plugin:i,options:n,stage:o,order:0})}return this}priority(t){const e=this.queue[this.queue.length-1];return e&&(e.order=t),this}configure(t,...e){for(let r=this.queue.length-1;r>=0;r--){const i=this.queue[r];if((i.name||i.plugin.name)===t){i.options=e;break}}return this}assembleProcessor(t){const e={};for(const i of t){const t=i.stage??r;e[t]||(e[t]=[]),e[t].push(i)}const n=[],o=Object.keys(e).map(Number).sort((t,e)=>t-e);for(const t of o){const r=e[t].sort((t,e)=>(t.order||0)-(e.order||0)),i=r.findIndex(t=>t.main);if(-1!==i){const t=r[i];!1===t.options?.[0]?console.warn(`Main Plugin "${t.name}" is disabled. Skipping.`):0!==i&&(r.splice(i,1),r[0]=t)}let o=!0,s=0;for(;o&&s<r.length;){o=!1,s++;for(let t=0;t<r.length;t++){const e=r[t];if(e.after){const i=r.findIndex(t=>t.name===e.after);if(-1!==i&&i>t){r.splice(t,1),r.splice(i,0,e),o=!0;break}}if(e.before){const i=r.findIndex(t=>t.name===e.before);if(-1!==i&&i<t){r.splice(t,1),r.splice(i,0,e),o=!0;break}}}}n.push(...r)}const s=i();Object.keys(this._data).length>0&&s.data(this._data);for(const t of n)s.use(t.plugin,...t.options||[]);return s}};L.registry=new Map;var O=L,B=class extends O{async toMarkdown(){const t=await this.to("markdown");return String(t)}toMarkdownVFile(){return this.to("markdown")}async toHtml(){const t=await this.to("html");return String(t)}toHtmlVFile(){return this.to("html")}async toAst(t){return(await this.to("ast",t)).result}toHTML(){return this.toHtml()}toAST(t){return this.toAst(t)}};function C(t){return new B(t)}B.register(j),B.register(E),B.register(H);import{fromHtml as V}from"hast-util-from-html";import{fromDom as R}from"hast-util-from-dom";var G=function(e){const{readability:r,jsdom:i,hast:n,url:o}=e||{};this.parser=function(e,s){if(!1===r)return V(e,{fragment:!0,...n});let a,l;try{a=t("jsdom").JSDOM;l=t("@mozilla/readability").Readability}catch(t){throw new Error("[html-readability] Dependency missing. Please install 'jsdom' and '@mozilla/readability'.")}const p=new l(new a(e,{url:o,pretendToBeVisual:!0,...i,includeNodeLocations:!0}).window.document,{maxElemsToParse:1e5,nbTopCandidates:5,charThreshold:500,keepClasses:!0,...r,serializer:t=>t}).parse();if(!p||!p.content)return V(e,{fragment:!0,...n});const u=p.content;let m=R(u,{afterTransform:n?.afterTransform});const f=!1!==n?.fragment,c={...p};return delete c.content,delete c.textContent,s&&(s.data=s.data||{},s.data.readability=c),m&&(m=f?{type:"root",children:[m]}:{type:"root",children:[{type:"element",tagName:"html",properties:{},children:[{type:"element",tagName:"head",properties:{},children:[]},{type:"element",tagName:"body",properties:{},children:[m]}]}]},m.data=m.data||{},m.data.readability=c),m}},J={name:"readability",plugin:G,stage:0,main:!0},Q={name:"restore-readability-meta",plugin:()=>(t,e)=>{e.data?.readability&&(t.data=t.data||{},t.data.readability=e.data.readability)},stage:0,after:"rehype-remark"},K=[J,Q];export{r as DefaultPipelineStage,O as MdastBasePipeline,B as MdastPipeline,e as PipelineStage,z as astCompiler,H as astFormat,E as htmlFormat,G as htmlReadability,J as htmlReadabilityPlugin,K as htmlReadabilityPlugins,$ as jsonParser,j as markdownFormat,C as mdast,Q as restoreReadabilityMetaPlugin};
1
+ var t=(t=>"undefined"!=typeof require?require:"undefined"!=typeof Proxy?new Proxy(t,{get:(t,e)=>("undefined"!=typeof require?require:t)[e]}):t)(function(t){if("undefined"!=typeof require)return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')}),e=(t=>(t[t.parse=0]="parse",t[t.normalize=100]="normalize",t[t.compile=200]="compile",t[t.finalize=300]="finalize",t[t.stringify=400]="stringify",t))(e||{}),r=200;import{unified as i}from"unified";import{VFile as n}from"vfile";import o from"remark-parse";import s from"remark-stringify";import a from"remark-gfm";import u from"remark-directive";import l from"remark-math";import p from"remark-frontmatter";import{visit as f}from"unist-util-visit";function c(t,e){return{type:t,children:e,data:{hName:t}}}var m={plugin:()=>t=>{!function(t){f(t,"text",(t,e,r)=>{if(!r||void 0===e)return;const i=t.value;let n=0;const o=[];let s=!1;const a=/(==[^=]+==|~[^~]+~|\^[^^]+\^)/g;let u;for(;null!==(u=a.exec(i));){s=!0;const t=u[0],e=u.index;e>n&&o.push({type:"text",value:i.slice(n,e)});let r="mark",l="";t.startsWith("==")?(r="mark",l=t.slice(2,-2)):t.startsWith("~")?(r="sub",l=t.slice(1,-1)):t.startsWith("^")&&(r="sup",l=t.slice(1,-1)),o.push(c(r,[{type:"text",value:l}])),n=a.lastIndex}return s?(n<i.length&&o.push({type:"text",value:i.slice(n)}),r.children.splice(e,1,...o),e+o.length):void 0})}(t)},stage:100};import{visit as h}from"unist-util-visit";var d={error:"danger",warn:"warning",success:"tip",important:"important",caution:"caution",note:"note"},g={plugin:()=>async t=>{h(t,["containerDirective","leafDirective","textDirective"],t=>{const e=t,r=e.name.toLowerCase();if(e.name=d[r]||r,e.children&&e.children.length>0){const t=e.children[0];if(t.data?.directiveLabel||"directiveLabel"===t.type){let r="";h(t,"text",t=>{r+=t.value}),r&&!e.attributes?.title&&(e.attributes=e.attributes||{},e.attributes.title=r.trim()),e.children.shift()}}e.attributes?.title&&(e.attributes.title=String(e.attributes.title).trim()),e.data=e.data||{},e.data.hName=e.data.hName||("containerDirective"===e.type?"div":"span"),e.data.hProperties={...e.data.hProperties||{},...e.attributes,className:[e.name,e.data.hProperties?.className].filter(Boolean).join(" ")}})},stage:100,order:10};import{visit as y}from"unist-util-visit";var v={plugin:()=>async t=>{y(t,"tableCell",t=>{if(t.data){const{rowspan:e,colspan:r}=t.data;t.data.hProperties=t.data.hProperties||{},void 0!==e&&(t.data.hProperties.rowSpan=e,delete t.data.rowspan),void 0!==r&&(t.data.hProperties.colSpan=r,delete t.data.colspan)}})},stage:100,order:20};import{visit as w}from"unist-util-visit";import{parse as b}from"shell-quote";var k={plugin:()=>async t=>{w(t,"code",t=>{if(t.meta){const e=function(t){const e={},r=b(t);for(const t of r)if("string"==typeof t){const r=t.split("=",2);2===r.length?e[r[0]]=r[1]:e[t]="true"}return e}(t.meta),r=t.data=t.data||{};e.title&&(r.title=e.title),e.filename&&(r.filename=e.filename),r.kv={...r.kv||{},...e}}})},stage:100,order:30};import{visit as x}from"unist-util-visit";var T={plugin:()=>async t=>{x(t,"image",t=>{const e=t.data=t.data||{},r=e.hProperties=e.hProperties||{},i=/[#?&](?:width=([0-9]+))?(?:&?height=([0-9]+))?(?:=([0-9]+)x([0-9]+))?$/,n=t.url.match(i);if(n){const e=n[1]||n[3],o=n[2]||n[4];e&&!r.width&&(r.width=parseInt(e,10)),o&&!r.height&&(r.height=parseInt(o,10)),t.url=t.url.replace(i,"")}e.width&&!r.width&&(r.width=e.width),e.height&&!r.height&&(r.height=e.height)})},stage:100,order:40},M=[{plugin:o,stage:0},{plugin:a,options:[{singleTilde:!1}],stage:0},{plugin:u,stage:0},{plugin:l,stage:0},{plugin:p,options:[["yaml","toml"]],stage:0},g,v,k,T,m],S=[{plugin:s,options:[{handlers:{mark:(t,e,r)=>"=="+r.containerPhrasing(t,{before:"==",after:"=="})+"==",sub:(t,e,r)=>"~"+r.containerPhrasing(t,{before:"~",after:"~"})+"~",sup:(t,e,r)=>"^"+r.containerPhrasing(t,{before:"^",after:"^"})+"^"}}],stage:400},{plugin:a,options:[{singleTilde:!1}],stage:400},{plugin:u,stage:400},{plugin:l,stage:400},{plugin:p,options:[["yaml","toml"]],stage:400}];S.forEach(t=>{t.plugin===s?t.order=100:t.order=10});var P={id:"markdown",title:"Markdown (GFM + Directives)",extensions:["md","markdown","mdown","mkdn"],mediaTypes:["text/markdown"],input:M,output:S};import j from"rehype-parse";import N from"rehype-remark";import q from"remark-rehype";import A,{defaultSchema as F}from"rehype-sanitize";import D from"rehype-stringify";var z={id:"html",title:"HTML",extensions:["html","htm"],mediaTypes:["text/html"],input:[{name:"rehype-parse",plugin:j,stage:0},{name:"rehype-remark",plugin:N,options:[{handlers:{mark:(t,e)=>{const r={type:"mark",children:t.all(e)};return t.patch(e,r),r},sub:(t,e)=>{const r={type:"sub",children:t.all(e)};return t.patch(e,r),r},sup:(t,e)=>{const r={type:"sup",children:t.all(e)};return t.patch(e,r),r}}}],stage:0}],output:[{plugin:q,stage:300,order:10},{plugin:A,options:[{...F,tagNames:[...F.tagNames||[],"mark","sub","sup"],attributes:{...F.attributes,"*":[...F.attributes?.["*"]||[],"className","id","style"],td:[...F.attributes?.td||[],"rowSpan","colSpan","rowspan","colspan"],th:[...F.attributes?.th||[],"rowSpan","colSpan","rowspan","colspan"],img:[...F.attributes?.img||[],"width","height"]}}],stage:300,order:20},{plugin:D,stage:400}]};function E(){this.Compiler=t=>t}function L(){this.Parser=t=>JSON.parse(t)}var $={id:"ast",title:"MDAST",input:[{plugin:L,stage:0},g,v,k,T,m],output:[{plugin:E,options:[],stage:400}]};function H(t){return"object"==typeof t&&null!==t&&"string"==typeof t.type}var I=class t{constructor(t){this.queue=[],this._data={},this.input=t}static register(t){this.registry.set(t.id,t)}static getFormat(t){return this.registry.get(t)}data(t,e){return"string"==typeof t?this._data[t]=e:Object.assign(this._data,t),this}getFormat(t){return this.constructor.getFormat(t)}resolveFormat(t){if("string"==typeof t){const e=this.getFormat(t);if(!e)throw new Error(`[MdastPlus] Format '${t}' is not registered.`);return e}return t}toRuntimeEntry(t,r,i){let n=r;void 0!==t.stage&&(n="string"==typeof t.stage?e[t.stage]??r:t.stage);let o=t.options||[];const s=t.name||t.plugin.name;if(i&&s&&s in i){const e=i[s];"object"!=typeof e||null===e||Array.isArray(e)?o=Array.isArray(e)?e:[e]:("main"in e&&(t.main=!!e.main),"before"in e&&(t.before=e.before),"after"in e&&(t.after=e.after),o=[e])}return{name:s,plugin:t.plugin,options:o,stage:n,order:t.order||0,main:t.main,before:t.before,after:t.after}}ensureInputPlugins(e,i,n=400){const o=e.some(t=>0===(t.stage??r)),s=H(this.input);if(!o){let o=[];if(s){const e=t.getFormat("ast");e&&e.input&&(o=e.input)}else{const e=t.getFormat("markdown");e&&e.input&&(o=e.input)}for(const t of o){const o=this.toRuntimeEntry(t,0,i);(o.stage??r)<=n&&e.push(o)}}}from(t,e){const r=this.resolveFormat(t);if(!r.input||0===r.input.length)throw new Error(`[MdastPlus] Format '${r.id}' does not support input.`);for(const t of r.input)this.queue.push(this.toRuntimeEntry(t,0,e));return this}resolveRunQueue(t,e,i,n){let o=[];if(o=e?this.queue.map(t=>this.toRuntimeEntry(t,t.stage??r,e)):[...this.queue],void 0!==i){const t=i;o=o.filter(e=>(e.stage??r)<=t);const s=o.findIndex(e=>(e.stage??r)===t),a=-1!==s?s+(n??0):o.length-1,u=o.slice(0,a+1),l=o.filter(t=>t.main&&!u.includes(t));o=u.concat(l),this.ensureInputPlugins(o,e,t),o.push({plugin:E,options:[],stage:400,order:0})}else if(this.ensureInputPlugins(o,e,400),t.output)for(const r of t.output)o.push(this.toRuntimeEntry(r,300,e));return o}async to(t,r){const i=this.resolveFormat(t);if(!i.output)throw new Error(`[MdastPlus] Format '${i.id}' does not support output.`);let o,s,a;if(r){const t=r;"overrides"in t||"stage"in t||"stopAtIndex"in t?(o=t.overrides,s="string"==typeof t.stage?e[t.stage]:t.stage,a=t.stopAtIndex):o=r}const u=this.resolveRunQueue(i,o,s,a),l=this.assembleProcessor(u);if(H(this.input)){const t=await l.run(this.input),e=l.stringify(t),r=new n;return"string"==typeof e||Buffer.isBuffer(e)?r.value=e:r.result=e,r}return l.process(this.input)}use(t,...e){return this.useAt("compile",t,...e)}normalizePluggable(t,e=[]){const r=[];if(Array.isArray(t)){let i=!1;if(t.length>0&&"function"==typeof t[0]){t.slice(1).some(t=>!function(t){if("function"==typeof t)return!0;if(Array.isArray(t))return!0;if("object"==typeof t&&null!==t){if("plugin"in t&&"function"==typeof t.plugin)return!0;if("plugins"in t)return!0}return!1}(t))&&(i=!0)}if(i){const[e,...i]=t;r.push({plugin:e,options:i})}else for(const i of t)r.push(...this.normalizePluggable(i,e))}else if("function"==typeof t)r.push({plugin:t,options:e});else if("object"==typeof t&&null!==t)if("plugin"in t&&"function"==typeof t.plugin){const i=t,n=e.length>0?e:i.options||[];r.push({...i,options:n})}else if("plugins"in t){const e=t;e.plugins&&r.push(...this.normalizePluggable(e.plugins))}return r}useAt(t,i,...n){let o,s,a;"string"==typeof t||"number"==typeof t?(o=("string"==typeof t?e[t]:t)??r,s=i,a=n):(o=void 0,s=t,a=[i,...n].filter(t=>void 0!==t));const u=this.normalizePluggable(s,a);for(const t of u){const e=o??r;this.queue.push(this.toRuntimeEntry(t,e))}return this}priority(t){const e=this.queue[this.queue.length-1];return e&&(e.order=t),this}configure(t,...e){for(let r=this.queue.length-1;r>=0;r--){const i=this.queue[r];if((i.name||i.plugin.name)===t){i.options=e;break}}return this}assembleProcessor(t){const e={};for(const i of t){const t=i.stage??r;e[t]||(e[t]=[]),e[t].push(i)}const n=[],o=Object.keys(e).map(Number).sort((t,e)=>t-e);for(const t of o){const r=e[t].sort((t,e)=>(t.order||0)-(e.order||0)),i=r.findIndex(t=>t.main);if(-1!==i){const t=r[i];!1===t.options?.[0]?console.warn(`Main Plugin "${t.name}" is disabled. Skipping.`):0!==i&&(r.splice(i,1),r[0]=t)}let o=!0,s=0;for(;o&&s<r.length;){o=!1,s++;for(let t=0;t<r.length;t++){const e=r[t];if(e.after){const i=r.findIndex(t=>t.name===e.after);if(-1!==i&&i>t){r.splice(t,1),r.splice(i,0,e),o=!0;break}}if(e.before){const i=r.findIndex(t=>t.name===e.before);if(-1!==i&&i<t){r.splice(t,1),r.splice(i,0,e),o=!0;break}}}}n.push(...r)}const s=i();Object.keys(this._data).length>0&&s.data(this._data);for(const t of n)s.use(t.plugin,...t.options||[]);return s}};I.registry=new Map;var O=I,R=class extends O{async toMarkdown(){const t=await this.to("markdown");return String(t)}toMarkdownVFile(){return this.to("markdown")}async toHtml(){const t=await this.to("html");return String(t)}toHtmlVFile(){return this.to("html")}async toAst(t){return(await this.to("ast",t)).result}toHTML(){return this.toHtml()}toAST(t){return this.toAst(t)}};function B(t){return new R(t)}R.register(P),R.register(z),R.register($);import{visit as C}from"unist-util-visit";import{fromHtml as V}from"hast-util-from-html";import{fromDom as U}from"hast-util-from-dom";import{stringify as G}from"yaml";import{isNil as J,omitBy as Q}from"lodash-es";var K=function(e){const{readability:r,jsdom:i,hast:n,url:o}=e||{};this.parser=function(e,s){if(!1===r)return V(e,{fragment:!0,...n});let a,u;try{a=t("jsdom").JSDOM;u=t("@mozilla/readability").Readability}catch(t){throw new Error("[html-readability] Dependency missing. Please install 'jsdom' and '@mozilla/readability'.")}const l=new u(new a(e,{url:o,pretendToBeVisual:!0,...i,includeNodeLocations:!0}).window.document,{maxElemsToParse:1e5,nbTopCandidates:5,charThreshold:500,keepClasses:!0,...r,serializer:t=>t}).parse();if(!l||!l.content)return V(e,{fragment:!0,...n});const p=l.content;let f=U(p,{afterTransform:n?.afterTransform});const c=!1!==n?.fragment,m=Q(l,J);return o&&(m.url=o),delete m.content,delete m.textContent,s&&(s.data=s.data||{},s.data.readability=m),f&&(f=c?{type:"root",children:[f]}:{type:"root",children:[{type:"element",tagName:"html",properties:{},children:[{type:"element",tagName:"head",properties:{},children:[]},{type:"element",tagName:"body",properties:{},children:[f]}]}]},f.data=f.data||{},f.data.readability=m),f}},W={name:"readability",plugin:K,stage:0,main:!0},X={name:"restore-readability-meta",plugin:t=>(e,r)=>{if(r.data?.readability){e.data=e.data||{},e.data.readability=r.data.readability;const{frontmatter:i,sourceLink:n}=t||{};if(i){const t="toml"===i?"toml":"yaml",n=G(r.data.readability).trim();e.children.unshift({type:t,value:n})}if(n&&r.data.readability.url){const{url:t,title:i}=r.data.readability;Z(e,t)||e.children.push({type:"blockquote",children:[{type:"paragraph",children:[{type:"text",value:"Source: "},{type:"link",url:t,children:[{type:"text",value:i||t}]}]}]})}}},stage:0,after:"rehype-remark"},Y=[W,X];function Z(t,e){if(!e)return!1;let r=!1;return C(t,"link",t=>{if(function(t,e){if(!t||!e)return!1;if(t===e)return!0;try{const r=new URL(t),i=new URL(e);return r.href===i.href}catch{return t.replace(/\/$/,"")===e.replace(/\/$/,"")}}(t.url,e))return r=!0,!1}),r}export{r as DefaultPipelineStage,O as MdastBasePipeline,R as MdastPipeline,e as PipelineStage,E as astCompiler,$ as astFormat,Z as checkUrlExists,z as htmlFormat,K as htmlReadability,W as htmlReadabilityPlugin,Y as htmlReadabilityPlugins,L as jsonParser,P as markdownFormat,B as mdast,X as restoreReadabilityMetaPlugin};
package/docs/README.md CHANGED
@@ -106,12 +106,16 @@ const vfile = await mdast(myInput)
106
106
  .data({ myGlobal: 'value' })
107
107
  // Add multiple plugins as an array at the 'compile' stage
108
108
  .use([pluginA, pluginB])
109
- // Or add a set of plugins at a specific stage
110
- .useAt('parse', htmlReadabilityPlugins)
109
+ // Or add a set of plugins at a specific stage with options
110
+ .useAt('parse', htmlReadabilityPlugins, {
111
+ url: 'https://example.com/article',
112
+ frontmatter: true, // Inject metadata as YAML frontmatter
113
+ sourceLink: true // Append source link at the bottom
114
+ })
111
115
  .priority(10) // Run later than default plugins
112
- .to('html');
116
+ .to('markdown');
113
117
 
114
- console.log(vfile.value); // The serialized HTML string
118
+ console.log(vfile.value); // The serialized Markdown with frontmatter
115
119
  ```
116
120
 
117
121
  ### Plugin Behavior
@@ -185,7 +189,7 @@ Each stage can have one "main" plugin. If a plugin is marked with `main: true`,
185
189
  | `extract-code-meta` | normalize | Parses `title="foo"` from code block meta. |
186
190
  | `image-size` | normalize | Parses `#=WxH` from image URLs. |
187
191
  | `normalize-inline-styles` | normalize | Standardizes `==mark==`, `~sub~`, and `^sup^`. |
188
- | `html-readability` | parse | Uses Mozilla's Readability to extract main content from HTML. Use `htmlReadabilityPlugins` array for easier setup. |
192
+ | `html-readability` | parse | Uses Mozilla's Readability to extract main content from HTML. Supports `frontmatter` injection and `sourceLink` (source link) footer. Use `htmlReadabilityPlugins` array for easier setup. |
189
193
 
190
194
  ## Contributing
191
195
 
@@ -110,6 +110,41 @@ export const myPlugin: MdastPlugin = {
110
110
 
111
111
  > **Important**: Never pass `false` as the second argument to `.use()` or within `MdastPlugin.options` if you want the plugin to execute. In `unified`, `false` is a special value that **disables** the plugin. If your plugin is a "main" plugin (like a parser replacement), disabling it with `false` will prevent it from replacing the default plugin of that stage, providing a safe fallback. A warning will be printed to the terminal when this fallback occurs. Use an options object (e.g., `{ enabled: false }`) if you need a way to skip logic within the plugin itself while keeping it active.
112
112
 
113
+ ### Plugin Development Notes
114
+
115
+ #### 1. `.use()` Flexibility and Array Ambiguity
116
+
117
+ `MdastPipeline` is designed to support both standard `unified` community habits and `mdast-plus`'s high-level structured objects.
118
+
119
+ * **Standard call**: `.use(plugin, options)`
120
+ * **Tuple call**: `.use([plugin, options])` —— commonly used in Presets.
121
+ * **List call**: `.use([plugin1, plugin2])` —— registers multiple plugins at once.
122
+ * **Struct call**: `.use({ plugin: myPlugin, stage: 'parse' })` —— recommended for internal development.
123
+
124
+ **Note:** When an array is passed, the system uses a **Heuristic** algorithm to distinguish between Tuple and List:
125
+ * If the array looks like `[Function, Object]`, it could be either `[Plugin, Options]` (Tuple) or `[Plugin, MdastPlugin]` (List).
126
+ * The system checks subsequent elements. If subsequent elements **don't look like** a plugin (not a function, not an array, no `plugin` property), the system determines it's a **Tuple** (i.e., subsequent elements are options).
127
+ * Therefore, ensure your structure is clear when developing Presets.
128
+
129
+ #### 2. Option Passing and Presets
130
+
131
+ When you load an array of multiple plugins (Preset) using `.use(preset, globalOptions)`, `globalOptions` will be recursively passed to each sub-plugin in the Preset (unless the sub-plugin already has specific Options bound). This allows users to configure a set of plugins with a single call.
132
+
133
+ #### 3. Plugin Signature
134
+
135
+ Modern `unified` (v11+) plugins (Attachers) only receive `options` as an argument. The context is accessed via `this`.
136
+
137
+ ```typescript
138
+ // ✅ Correct
139
+ const myPlugin = function(options) {
140
+ const processor = this; // Access processor context
141
+ return (tree, file) => { ... }; // Transformer receives tree and file
142
+ }
143
+
144
+ // ❌ Incorrect (Old style)
145
+ const myPlugin = function(options, context) { ... }
146
+ ```
147
+
113
148
  ### Main Plugins
114
149
 
115
150
  Each stage supports a **single** main plugin. When a plugin is marked with `main: true`, it will replace the first plugin that was originally registered for that stage. This is primarily used by formats to allow users to override the default parser or stringifier by injecting a different one at the same stage.
@@ -102,12 +102,16 @@ const vfile = await mdast(myInput)
102
102
  .data({ myGlobal: 'value' })
103
103
  // 以数组形式在 'compile' 阶段添加多个插件
104
104
  .use([pluginA, pluginB])
105
- // 或在特定阶段添加一组插件
106
- .useAt('parse', htmlReadabilityPlugins)
105
+ // 或在特定阶段添加一组插件并配置选项
106
+ .useAt('parse', htmlReadabilityPlugins, {
107
+ url: 'https://example.com/article',
108
+ frontmatter: true, // 将元数据注入为 YAML Frontmatter
109
+ sourceLink: true // 在底部添加原文链接
110
+ })
107
111
  .priority(10) // 比默认插件更晚执行
108
- .to('html');
112
+ .to('markdown');
109
113
 
110
- console.log(vfile.value); // 序列化后的 HTML 字符串
114
+ console.log(vfile.value); // 包含 Frontmatter 的序列化 Markdown 字符串
111
115
  ```
112
116
 
113
117
  ### 插件行为
@@ -181,7 +185,7 @@ const result = await mdast('Hello').to('reverse');
181
185
  | `extract-code-meta` | normalize | 从代码块元数据中解析 `title="foo"`。 |
182
186
  | `image-size` | normalize | 从图片 URL 中解析 `#=WxH`。 |
183
187
  | `normalize-inline-styles` | normalize | 标准化 `==mark==`、`~sub~` 和 `^sup^`。 |
184
- | `html-readability` | parse | 使用 Mozilla 的 Readability 从 HTML 中提取主体内容。使用 `htmlReadabilityPlugins` 数组可以简化配置。 |
188
+ | `html-readability` | parse | 使用 Mozilla 的 Readability 从 HTML 中提取主体内容。支持 `frontmatter` 注入和 `sourceLink` (原文链接) 页脚。使用 `htmlReadabilityPlugins` 数组可以简化配置。 |
185
189
 
186
190
  ## 贡献
187
191