@isdk/mdast-plus 0.2.4 → 0.3.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.cn.md +13 -1
- package/README.md +13 -1
- package/dist/index.d.mts +28 -1
- package/dist/index.d.ts +28 -1
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/docs/README.md +13 -1
- package/docs/_media/CONTRIBUTING.md +10 -0
- package/docs/_media/README.cn.md +13 -1
- package/docs/classes/MdastBasePipeline.md +20 -20
- package/docs/classes/MdastPipeline.md +27 -27
- package/docs/enumerations/PipelineStage.md +6 -6
- package/docs/functions/astCompiler.md +1 -1
- package/docs/functions/checkHtmlUrlExists.md +25 -0
- package/docs/functions/checkUrlExists.md +1 -1
- package/docs/functions/jsonParser.md +1 -1
- package/docs/functions/mdast.md +1 -1
- package/docs/globals.md +2 -0
- package/docs/interfaces/MdastDataOrigin.md +4 -4
- package/docs/interfaces/MdastFormat.md +7 -7
- package/docs/interfaces/MdastMark.md +3 -3
- package/docs/interfaces/MdastPlugin.md +9 -9
- package/docs/interfaces/MdastSub.md +3 -3
- package/docs/interfaces/MdastSup.md +3 -3
- package/docs/interfaces/PipelineRunOptions.md +4 -4
- package/docs/interfaces/ReadabilityOptions.md +37 -8
- package/docs/interfaces/SmartExcerptOptions.md +43 -0
- package/docs/type-aliases/PipelineStageName.md +1 -1
- package/docs/variables/DefaultPipelineStage.md +1 -1
- package/docs/variables/astFormat.md +1 -1
- package/docs/variables/htmlFormat.md +1 -1
- package/docs/variables/htmlReadability.md +1 -1
- package/docs/variables/htmlReadabilityPlugin.md +1 -1
- package/docs/variables/htmlReadabilityPlugins.md +1 -1
- package/docs/variables/markdownFormat.md +1 -1
- package/docs/variables/restoreReadabilityMetaPlugin.md +1 -1
- package/package.json +1 -1
package/README.cn.md
CHANGED
|
@@ -185,7 +185,19 @@ const result = await mdast('Hello').to('reverse');
|
|
|
185
185
|
| `extract-code-meta` | normalize | 从代码块元数据中解析 `title="foo"`。 |
|
|
186
186
|
| `image-size` | normalize | 从图片 URL 中解析 `#=WxH`。 |
|
|
187
187
|
| `normalize-inline-styles` | normalize | 标准化 `==mark==`、`~sub~` 和 `^sup^`。 |
|
|
188
|
-
| `html-readability` | parse | 使用 Mozilla 的 Readability 从 HTML 中提取主体内容。支持 `frontmatter`
|
|
188
|
+
| `html-readability` | parse | 使用 Mozilla 的 Readability 从 HTML 中提取主体内容。支持 `frontmatter` 注入、`sourceLink` (原文链接) 页脚以及 `smartExcerpt` 智能摘要管理。使用 `htmlReadabilityPlugins` 数组可以简化配置。 |
|
|
189
|
+
|
|
190
|
+
### html-readability 选项
|
|
191
|
+
|
|
192
|
+
- `url`: (string) HTML 文档的 URL。
|
|
193
|
+
- `frontmatter`: (boolean | 'yaml' | 'toml') 是否将元数据注入为 Frontmatter。默认值: `false`。
|
|
194
|
+
- `sourceLink`: (boolean) 是否在底部添加原文链接。即使在 `fields` 选项中过滤或重命名了 title/url 字段,该链接仍将根据原始信息正确生成。默认值: `false`。
|
|
195
|
+
- `fields`: (string[] | object) 控制保留哪些元数据字段或如何重命名它们。
|
|
196
|
+
- 如果是数组:作为白名单(例如 `['title', 'excerpt']`)。
|
|
197
|
+
- 如果是对象:将原始键映射到新名称(例如 `{ title: 'headline' }`)。只有映射中存在的键才会被保留(投影)。
|
|
198
|
+
- `smartExcerpt`: (boolean | object) 是否在摘要与正文内容重复或近乎重复时移除摘要。默认值: `true`。
|
|
199
|
+
- `threshold`: (number) 摘要长度与正文长度的比率阈值 (0.0 到 1.0)。默认值: `0.6`。
|
|
200
|
+
- `minContentLength`: (number) 保留摘要所需的正文最小长度。默认值: `300`。
|
|
189
201
|
|
|
190
202
|
## 贡献
|
|
191
203
|
|
package/README.md
CHANGED
|
@@ -185,7 +185,19 @@ Each stage can have one "main" plugin. If a plugin is marked with `main: true`,
|
|
|
185
185
|
| `extract-code-meta` | normalize | Parses `title="foo"` from code block meta. |
|
|
186
186
|
| `image-size` | normalize | Parses `#=WxH` from image URLs. |
|
|
187
187
|
| `normalize-inline-styles` | normalize | Standardizes `==mark==`, `~sub~`, and `^sup^`. |
|
|
188
|
-
| `html-readability` | parse | Uses Mozilla's Readability to extract main content from HTML. Supports `frontmatter` injection
|
|
188
|
+
| `html-readability` | parse | Uses Mozilla's Readability to extract main content from HTML. Supports `frontmatter` injection, `sourceLink` (source link) footer, and `smartExcerpt` for intelligent summary management. Use `htmlReadabilityPlugins` array for easier setup. |
|
|
189
|
+
|
|
190
|
+
### html-readability Options
|
|
191
|
+
|
|
192
|
+
- `url`: (string) The URL of the HTML document.
|
|
193
|
+
- `frontmatter`: (boolean | 'yaml' | 'toml') Whether to inject metadata as frontmatter. Default: `false`.
|
|
194
|
+
- `sourceLink`: (boolean) Whether to append source link at the bottom. The link will be generated based on the original title/URL even if they are filtered or renamed in the `fields` option. Default: `false`.
|
|
195
|
+
- `fields`: (string[] | object) Control which metadata fields are kept or how they are renamed.
|
|
196
|
+
- If an array: acts as an allowlist (e.g., `['title', 'excerpt']`).
|
|
197
|
+
- If an object: maps original keys to new names (e.g., `{ title: 'headline' }`). Only keys in the map are kept (Projection).
|
|
198
|
+
- `smartExcerpt`: (boolean | object) Whether to remove the excerpt if it is a duplicate or near-duplicate of the main content. Default: `true`.
|
|
199
|
+
- `threshold`: (number) The ratio of excerpt length to content length (0.0 to 1.0). Default: `0.6`.
|
|
200
|
+
- `minContentLength`: (number) Minimum length of the main content required to keep the excerpt. Default: `300`.
|
|
189
201
|
|
|
190
202
|
## Contributing
|
|
191
203
|
|
package/dist/index.d.mts
CHANGED
|
@@ -1741,6 +1741,20 @@ declare function jsonParser(this: any): void;
|
|
|
1741
1741
|
*/
|
|
1742
1742
|
declare const astFormat: MdastFormat;
|
|
1743
1743
|
|
|
1744
|
+
interface SmartExcerptOptions {
|
|
1745
|
+
/**
|
|
1746
|
+
* The threshold ratio of excerpt length to content length.
|
|
1747
|
+
* If (excerptLength / contentLength) > threshold, the excerpt is considered redundant.
|
|
1748
|
+
* @default 0.6
|
|
1749
|
+
*/
|
|
1750
|
+
threshold?: number;
|
|
1751
|
+
/**
|
|
1752
|
+
* The minimum length of the main content required to keep the excerpt.
|
|
1753
|
+
* If content length is less than this value, the excerpt is considered redundant (if it is contained in the content).
|
|
1754
|
+
* @default 300
|
|
1755
|
+
*/
|
|
1756
|
+
minContentLength?: number;
|
|
1757
|
+
}
|
|
1744
1758
|
interface ReadabilityOptions {
|
|
1745
1759
|
url?: string;
|
|
1746
1760
|
readability?: Record<string, any> | false;
|
|
@@ -1757,6 +1771,18 @@ interface ReadabilityOptions {
|
|
|
1757
1771
|
* @default false
|
|
1758
1772
|
*/
|
|
1759
1773
|
sourceLink?: boolean;
|
|
1774
|
+
/**
|
|
1775
|
+
* Whether to remove the excerpt if it is a duplicate or near-duplicate of the main content.
|
|
1776
|
+
* Useful when the content is short or the excerpt is just a subset of the content.
|
|
1777
|
+
* @default true
|
|
1778
|
+
*/
|
|
1779
|
+
smartExcerpt?: boolean | SmartExcerptOptions;
|
|
1780
|
+
/**
|
|
1781
|
+
* Control the fields and names in metadata.
|
|
1782
|
+
* - If an array of strings, it acts as an allowlist (only these fields are kept).
|
|
1783
|
+
* - If an object, it maps original field names to new names. Only the keys present in the map are kept (Projection).
|
|
1784
|
+
*/
|
|
1785
|
+
fields?: string[] | Record<string, string>;
|
|
1760
1786
|
}
|
|
1761
1787
|
/**
|
|
1762
1788
|
* A unified/rehype plugin that uses Mozilla's Readability to parse the input HTML.
|
|
@@ -1795,5 +1821,6 @@ declare const htmlReadabilityPlugins: ({
|
|
|
1795
1821
|
after: string;
|
|
1796
1822
|
})[];
|
|
1797
1823
|
declare function checkUrlExists(tree: any, url: string): boolean;
|
|
1824
|
+
declare function checkHtmlUrlExists(tree: any, url: string): boolean;
|
|
1798
1825
|
|
|
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 };
|
|
1826
|
+
export { DefaultPipelineStage, MdastBasePipeline, type MdastDataOrigin, type MdastFormat, type MdastMark, MdastPipeline, type MdastPlugin, type MdastSub, type MdastSup, type PipelineRunOptions, PipelineStage, type PipelineStageName, type ReadabilityOptions, type SmartExcerptOptions, astCompiler, astFormat, checkHtmlUrlExists, checkUrlExists, htmlFormat, htmlReadability, htmlReadabilityPlugin, htmlReadabilityPlugins, jsonParser, markdownFormat, mdast, restoreReadabilityMetaPlugin };
|
package/dist/index.d.ts
CHANGED
|
@@ -1741,6 +1741,20 @@ declare function jsonParser(this: any): void;
|
|
|
1741
1741
|
*/
|
|
1742
1742
|
declare const astFormat: MdastFormat;
|
|
1743
1743
|
|
|
1744
|
+
interface SmartExcerptOptions {
|
|
1745
|
+
/**
|
|
1746
|
+
* The threshold ratio of excerpt length to content length.
|
|
1747
|
+
* If (excerptLength / contentLength) > threshold, the excerpt is considered redundant.
|
|
1748
|
+
* @default 0.6
|
|
1749
|
+
*/
|
|
1750
|
+
threshold?: number;
|
|
1751
|
+
/**
|
|
1752
|
+
* The minimum length of the main content required to keep the excerpt.
|
|
1753
|
+
* If content length is less than this value, the excerpt is considered redundant (if it is contained in the content).
|
|
1754
|
+
* @default 300
|
|
1755
|
+
*/
|
|
1756
|
+
minContentLength?: number;
|
|
1757
|
+
}
|
|
1744
1758
|
interface ReadabilityOptions {
|
|
1745
1759
|
url?: string;
|
|
1746
1760
|
readability?: Record<string, any> | false;
|
|
@@ -1757,6 +1771,18 @@ interface ReadabilityOptions {
|
|
|
1757
1771
|
* @default false
|
|
1758
1772
|
*/
|
|
1759
1773
|
sourceLink?: boolean;
|
|
1774
|
+
/**
|
|
1775
|
+
* Whether to remove the excerpt if it is a duplicate or near-duplicate of the main content.
|
|
1776
|
+
* Useful when the content is short or the excerpt is just a subset of the content.
|
|
1777
|
+
* @default true
|
|
1778
|
+
*/
|
|
1779
|
+
smartExcerpt?: boolean | SmartExcerptOptions;
|
|
1780
|
+
/**
|
|
1781
|
+
* Control the fields and names in metadata.
|
|
1782
|
+
* - If an array of strings, it acts as an allowlist (only these fields are kept).
|
|
1783
|
+
* - If an object, it maps original field names to new names. Only the keys present in the map are kept (Projection).
|
|
1784
|
+
*/
|
|
1785
|
+
fields?: string[] | Record<string, string>;
|
|
1760
1786
|
}
|
|
1761
1787
|
/**
|
|
1762
1788
|
* A unified/rehype plugin that uses Mozilla's Readability to parse the input HTML.
|
|
@@ -1795,5 +1821,6 @@ declare const htmlReadabilityPlugins: ({
|
|
|
1795
1821
|
after: string;
|
|
1796
1822
|
})[];
|
|
1797
1823
|
declare function checkUrlExists(tree: any, url: string): boolean;
|
|
1824
|
+
declare function checkHtmlUrlExists(tree: any, url: string): boolean;
|
|
1798
1825
|
|
|
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 };
|
|
1826
|
+
export { DefaultPipelineStage, MdastBasePipeline, type MdastDataOrigin, type MdastFormat, type MdastMark, MdastPipeline, type MdastPlugin, type MdastSub, type MdastSup, type PipelineRunOptions, PipelineStage, type PipelineStageName, type ReadabilityOptions, type SmartExcerptOptions, astCompiler, astFormat, checkHtmlUrlExists, 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 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}
|
|
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:()=>Q,MdastPipeline:()=>K,PipelineStage:()=>c,astCompiler:()=>U,astFormat:()=>_,checkHtmlUrlExists:()=>lt,checkUrlExists:()=>at,htmlFormat:()=>I,htmlReadability:()=>rt,htmlReadabilityPlugin:()=>it,htmlReadabilityPlugins:()=>st,jsonParser:()=>V,markdownFormat:()=>R,mdast:()=>W,restoreReadabilityMetaPlugin:()=>nt}),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"),m=require("vfile"),h=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")),k=require("unist-util-visit");function w(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:"^"})+"^"},x={plugin:()=>t=>{!function(t){(0,k.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(w(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},j=require("unist-util-visit"),P={error:"danger",warn:"warning",success:"tip",important:"important",caution:"caution",note:"note"},M={plugin:()=>async t=>{(0,j.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,j.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"),N={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},T=require("unist-util-visit"),F=require("shell-quote");var O={plugin:()=>async t=>{(0,T.visit)(t,"code",t=>{if(t.meta){const e=function(t){const e={},r=(0,F.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"),E={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},L=[{plugin:h.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},M,N,O,E,x],D=[{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}];D.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:L,output:D},z=l(require("rehype-parse")),$=l(require("rehype-remark")),C=l(require("remark-rehype")),H=l(require("rehype-sanitize")),B=l(require("rehype-stringify")),I={id:"html",title:"HTML",extensions:["html","htm"],mediaTypes:["text/html"],input:[{name:"rehype-parse",plugin:z.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: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:B.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,N,O,E,x],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),l=n.filter(t=>t.main&&!a.includes(t));n=a.concat(l),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(R),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,fields:s}=t||{};this.parser=function(o,a){if(!1===e)return(0,Y.fromHtml)(o,{fragment:!0,...i});let l,u;try{l=require("jsdom").JSDOM;u=require("@mozilla/readability").Readability}catch(t){throw new Error("[html-readability] Dependency missing. Please install 'jsdom' and '@mozilla/readability'.")}const c=new u(new l(o,{url:n,pretendToBeVisual:!0,...r,includeNodeLocations:!0}).window.document,{maxElemsToParse:1e5,nbTopCandidates:5,charThreshold:500,keepClasses:!0,...e,serializer:t=>t}).parse();if(!c||!c.content)return(0,Y.fromHtml)(o,{fragment:!0,...i});const p=c.content;let f=(0,Z.fromDom)(p,{afterTransform:i?.afterTransform});const m=!1!==i?.fragment,{smartExcerpt:h=!0,sourceLink:d}=t||{};let g=(0,et.omitBy)(c,t=>null==t||""===t);const y=n||g.url,b=g.title;if(h&&g.excerpt&&g.textContent){const{threshold:t=.6,minContentLength:e=300}=!0===h?{}:h,r=g.excerpt.trim().toLowerCase().replace(/\s+/g," "),i=g.textContent.trim().toLowerCase().replace(/\s+/g," ");if(i.includes(r)){(r.length/i.length>t||i.length<e)&&delete g.excerpt}}if(n&&(g.url=n),delete g.content,delete g.textContent,s)if(Array.isArray(s))g=(0,et.pick)(g,s);else{const t={};for(const[e,r]of Object.entries(s))void 0!==g[e]&&(t[r]=g[e]);g=t}if(a&&(a.data=a.data||{},a.data.readability=g),f){const t=[f];d&&y&&!lt(f,y)&&t.push({type:"element",tagName:"blockquote",properties:{},children:[{type:"element",tagName:"p",properties:{},children:[{type:"text",value:"Source: "},{type:"element",tagName:"a",properties:{href:y},children:[{type:"text",value:b||y}]}]}]}),f=m?{type:"root",children:t}:{type:"root",children:[{type:"element",tagName:"html",properties:{},children:[{type:"element",tagName:"head",properties:{},children:[]},{type:"element",tagName:"body",properties:{},children:t}]}]},f.data=f.data||{},f.data.readability=g}return f}},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;at(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(!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(/\/$/,"")}}function at(t,e){if(!e)return!1;let r=!1;return(0,X.visit)(t,"link",t=>{if(ot(t.url,e))return r=!0,!1}),r}function lt(t,e){if(!e)return!1;let r=!1;return(0,X.visit)(t,"element",t=>{if("a"===t.tagName&&t.properties&&ot(t.properties.href,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 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};
|
|
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 u 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 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",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)),o.push(c(r,[{type:"text",value:u}])),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 N={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},S=[{plugin:o,stage:0},{plugin:a,options:[{singleTilde:!1}],stage:0},{plugin:l,stage:0},{plugin:u,stage:0},{plugin:p,options:[["yaml","toml"]],stage:0},g,v,k,N,m],T=[{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:u,stage:400},{plugin:p,options:[["yaml","toml"]],stage:400}];T.forEach(t=>{t.plugin===s?t.order=100:t.order=10});var M={id:"markdown",title:"Markdown (GFM + Directives)",extensions:["md","markdown","mdown","mkdn"],mediaTypes:["text/markdown"],input:S,output:T};import j from"rehype-parse";import P from"rehype-remark";import q from"remark-rehype";import A,{defaultSchema as F}from"rehype-sanitize";import L from"rehype-stringify";var D={id:"html",title:"HTML",extensions:["html","htm"],mediaTypes:["text/html"],input:[{name:"rehype-parse",plugin:j,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: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:L,stage:400}]};function E(){this.Compiler=t=>t}function z(){this.Parser=t=>JSON.parse(t)}var $={id:"ast",title:"MDAST",input:[{plugin:z,stage:0},g,v,k,N,m],output:[{plugin:E,options:[],stage:400}]};function O(t){return"object"==typeof t&&null!==t&&"string"==typeof t.type}var C=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=O(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),u=o.filter(t=>t.main&&!l.includes(t));o=l.concat(u),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 l=this.resolveRunQueue(i,o,s,a),u=this.assembleProcessor(l);if(O(this.input)){const t=await u.run(this.input),e=u.stringify(t),r=new n;return"string"==typeof e||Buffer.isBuffer(e)?r.value=e:r.result=e,r}return u.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 l=this.normalizePluggable(s,a);for(const t of l){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}};C.registry=new Map;var H=C,I=class extends H{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 R(t){return new I(t)}I.register(M),I.register(D),I.register($);import{visit as B}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{omitBy as J,pick as Q}from"lodash-es";var K=function(e){const{readability:r,jsdom:i,hast:n,url:o,fields:s}=e||{};this.parser=function(a,l){if(!1===r)return V(a,{fragment:!0,...n});let u,p;try{u=t("jsdom").JSDOM;p=t("@mozilla/readability").Readability}catch(t){throw new Error("[html-readability] Dependency missing. Please install 'jsdom' and '@mozilla/readability'.")}const f=new p(new u(a,{url:o,pretendToBeVisual:!0,...i,includeNodeLocations:!0}).window.document,{maxElemsToParse:1e5,nbTopCandidates:5,charThreshold:500,keepClasses:!0,...r,serializer:t=>t}).parse();if(!f||!f.content)return V(a,{fragment:!0,...n});const c=f.content;let m=U(c,{afterTransform:n?.afterTransform});const h=!1!==n?.fragment,{smartExcerpt:d=!0,sourceLink:g}=e||{};let y=J(f,t=>null==t||""===t);const v=o||y.url,w=y.title;if(d&&y.excerpt&&y.textContent){const{threshold:t=.6,minContentLength:e=300}=!0===d?{}:d,r=y.excerpt.trim().toLowerCase().replace(/\s+/g," "),i=y.textContent.trim().toLowerCase().replace(/\s+/g," ");if(i.includes(r)){(r.length/i.length>t||i.length<e)&&delete y.excerpt}}if(o&&(y.url=o),delete y.content,delete y.textContent,s)if(Array.isArray(s))y=Q(y,s);else{const t={};for(const[e,r]of Object.entries(s))void 0!==y[e]&&(t[r]=y[e]);y=t}if(l&&(l.data=l.data||{},l.data.readability=y),m){const t=[m];g&&v&&!tt(m,v)&&t.push({type:"element",tagName:"blockquote",properties:{},children:[{type:"element",tagName:"p",properties:{},children:[{type:"text",value:"Source: "},{type:"element",tagName:"a",properties:{href:v},children:[{type:"text",value:w||v}]}]}]}),m=h?{type:"root",children:t}:{type:"root",children:[{type:"element",tagName:"html",properties:{},children:[{type:"element",tagName:"head",properties:{},children:[]},{type:"element",tagName:"body",properties:{},children:t}]}]},m.data=m.data||{},m.data.readability=y}return m}},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;_(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(!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(/\/$/,"")}}function _(t,e){if(!e)return!1;let r=!1;return B(t,"link",t=>{if(Z(t.url,e))return r=!0,!1}),r}function tt(t,e){if(!e)return!1;let r=!1;return B(t,"element",t=>{if("a"===t.tagName&&t.properties&&Z(t.properties.href,e))return r=!0,!1}),r}export{r as DefaultPipelineStage,H as MdastBasePipeline,I as MdastPipeline,e as PipelineStage,E as astCompiler,$ as astFormat,tt as checkHtmlUrlExists,_ as checkUrlExists,D as htmlFormat,K as htmlReadability,W as htmlReadabilityPlugin,Y as htmlReadabilityPlugins,z as jsonParser,M as markdownFormat,R as mdast,X as restoreReadabilityMetaPlugin};
|
package/docs/README.md
CHANGED
|
@@ -189,7 +189,19 @@ Each stage can have one "main" plugin. If a plugin is marked with `main: true`,
|
|
|
189
189
|
| `extract-code-meta` | normalize | Parses `title="foo"` from code block meta. |
|
|
190
190
|
| `image-size` | normalize | Parses `#=WxH` from image URLs. |
|
|
191
191
|
| `normalize-inline-styles` | normalize | Standardizes `==mark==`, `~sub~`, and `^sup^`. |
|
|
192
|
-
| `html-readability` | parse | Uses Mozilla's Readability to extract main content from HTML. Supports `frontmatter` injection
|
|
192
|
+
| `html-readability` | parse | Uses Mozilla's Readability to extract main content from HTML. Supports `frontmatter` injection, `sourceLink` (source link) footer, and `smartExcerpt` for intelligent summary management. Use `htmlReadabilityPlugins` array for easier setup. |
|
|
193
|
+
|
|
194
|
+
### html-readability Options
|
|
195
|
+
|
|
196
|
+
- `url`: (string) The URL of the HTML document.
|
|
197
|
+
- `frontmatter`: (boolean | 'yaml' | 'toml') Whether to inject metadata as frontmatter. Default: `false`.
|
|
198
|
+
- `sourceLink`: (boolean) Whether to append source link at the bottom. The link will be generated based on the original title/URL even if they are filtered or renamed in the `fields` option. Default: `false`.
|
|
199
|
+
- `fields`: (string[] | object) Control which metadata fields are kept or how they are renamed.
|
|
200
|
+
- If an array: acts as an allowlist (e.g., `['title', 'excerpt']`).
|
|
201
|
+
- If an object: maps original keys to new names (e.g., `{ title: 'headline' }`). Only keys in the map are kept (Projection).
|
|
202
|
+
- `smartExcerpt`: (boolean | object) Whether to remove the excerpt if it is a duplicate or near-duplicate of the main content. Default: `true`.
|
|
203
|
+
- `threshold`: (number) The ratio of excerpt length to content length (0.0 to 1.0). Default: `0.6`.
|
|
204
|
+
- `minContentLength`: (number) Minimum length of the main content required to keep the excerpt. Default: `300`.
|
|
193
205
|
|
|
194
206
|
## Contributing
|
|
195
207
|
|
|
@@ -145,6 +145,16 @@ const myPlugin = function(options) {
|
|
|
145
145
|
const myPlugin = function(options, context) { ... }
|
|
146
146
|
```
|
|
147
147
|
|
|
148
|
+
#### 4. Implementation Considerations: Tree Wrapping
|
|
149
|
+
|
|
150
|
+
When a plugin needs to wrap the AST tree (e.g., adding `<html>`/`<body>` tags or appending footers), follow this pattern:
|
|
151
|
+
|
|
152
|
+
1. **Prepare Content First**: Collect all content nodes (main content, footers, etc.) into an array.
|
|
153
|
+
2. **Check Existence**: Always check if a node (like a source link) already exists before appending to avoid duplicates.
|
|
154
|
+
3. **Wrap Once**: Perform the final wrapping logic (e.g., based on `isFragment` option) using the prepared array.
|
|
155
|
+
|
|
156
|
+
This approach ensures robustness across different output configurations and avoids redundant logic.
|
|
157
|
+
|
|
148
158
|
### Main Plugins
|
|
149
159
|
|
|
150
160
|
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.
|
package/docs/_media/README.cn.md
CHANGED
|
@@ -185,7 +185,19 @@ const result = await mdast('Hello').to('reverse');
|
|
|
185
185
|
| `extract-code-meta` | normalize | 从代码块元数据中解析 `title="foo"`。 |
|
|
186
186
|
| `image-size` | normalize | 从图片 URL 中解析 `#=WxH`。 |
|
|
187
187
|
| `normalize-inline-styles` | normalize | 标准化 `==mark==`、`~sub~` 和 `^sup^`。 |
|
|
188
|
-
| `html-readability` | parse | 使用 Mozilla 的 Readability 从 HTML 中提取主体内容。支持 `frontmatter`
|
|
188
|
+
| `html-readability` | parse | 使用 Mozilla 的 Readability 从 HTML 中提取主体内容。支持 `frontmatter` 注入、`sourceLink` (原文链接) 页脚以及 `smartExcerpt` 智能摘要管理。使用 `htmlReadabilityPlugins` 数组可以简化配置。 |
|
|
189
|
+
|
|
190
|
+
### html-readability 选项
|
|
191
|
+
|
|
192
|
+
- `url`: (string) HTML 文档的 URL。
|
|
193
|
+
- `frontmatter`: (boolean | 'yaml' | 'toml') 是否将元数据注入为 Frontmatter。默认值: `false`。
|
|
194
|
+
- `sourceLink`: (boolean) 是否在底部添加原文链接。即使在 `fields` 选项中过滤或重命名了 title/url 字段,该链接仍将根据原始信息正确生成。默认值: `false`。
|
|
195
|
+
- `fields`: (string[] | object) 控制保留哪些元数据字段或如何重命名它们。
|
|
196
|
+
- 如果是数组:作为白名单(例如 `['title', 'excerpt']`)。
|
|
197
|
+
- 如果是对象:将原始键映射到新名称(例如 `{ title: 'headline' }`)。只有映射中存在的键才会被保留(投影)。
|
|
198
|
+
- `smartExcerpt`: (boolean | object) 是否在摘要与正文内容重复或近乎重复时移除摘要。默认值: `true`。
|
|
199
|
+
- `threshold`: (number) 摘要长度与正文长度的比率阈值 (0.0 到 1.0)。默认值: `0.6`。
|
|
200
|
+
- `minContentLength`: (number) 保留摘要所需的正文最小长度。默认值: `300`。
|
|
189
201
|
|
|
190
202
|
## 贡献
|
|
191
203
|
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
# Class: MdastBasePipeline
|
|
8
8
|
|
|
9
|
-
Defined in: [packages/mdast-plus/src/pipeline.ts:42](https://github.com/isdk/mdast-plus.js/blob/
|
|
9
|
+
Defined in: [packages/mdast-plus/src/pipeline.ts:42](https://github.com/isdk/mdast-plus.js/blob/fc889343b0a625d8edbf2036c3e25b676d1bf163/src/pipeline.ts#L42)
|
|
10
10
|
|
|
11
11
|
Base implementation of the fluent mdast processing pipeline.
|
|
12
12
|
Manages the plugin registry and the execution queue.
|
|
@@ -21,7 +21,7 @@ Manages the plugin registry and the execution queue.
|
|
|
21
21
|
|
|
22
22
|
> **new MdastBasePipeline**(`input`): `MdastBasePipeline`
|
|
23
23
|
|
|
24
|
-
Defined in: [packages/mdast-plus/src/pipeline.ts:70](https://github.com/isdk/mdast-plus.js/blob/
|
|
24
|
+
Defined in: [packages/mdast-plus/src/pipeline.ts:70](https://github.com/isdk/mdast-plus.js/blob/fc889343b0a625d8edbf2036c3e25b676d1bf163/src/pipeline.ts#L70)
|
|
25
25
|
|
|
26
26
|
Initializes a new pipeline instance with the given input.
|
|
27
27
|
|
|
@@ -43,7 +43,7 @@ Content to process (string, Buffer, VFile, or AST Node).
|
|
|
43
43
|
|
|
44
44
|
> `protected` **\_data**: `Record`\<`string`, `any`\> = `{}`
|
|
45
45
|
|
|
46
|
-
Defined in: [packages/mdast-plus/src/pipeline.ts:64](https://github.com/isdk/mdast-plus.js/blob/
|
|
46
|
+
Defined in: [packages/mdast-plus/src/pipeline.ts:64](https://github.com/isdk/mdast-plus.js/blob/fc889343b0a625d8edbf2036c3e25b676d1bf163/src/pipeline.ts#L64)
|
|
47
47
|
|
|
48
48
|
***
|
|
49
49
|
|
|
@@ -51,7 +51,7 @@ Defined in: [packages/mdast-plus/src/pipeline.ts:64](https://github.com/isdk/mda
|
|
|
51
51
|
|
|
52
52
|
> `protected` **input**: `Compatible`
|
|
53
53
|
|
|
54
|
-
Defined in: [packages/mdast-plus/src/pipeline.ts:62](https://github.com/isdk/mdast-plus.js/blob/
|
|
54
|
+
Defined in: [packages/mdast-plus/src/pipeline.ts:62](https://github.com/isdk/mdast-plus.js/blob/fc889343b0a625d8edbf2036c3e25b676d1bf163/src/pipeline.ts#L62)
|
|
55
55
|
|
|
56
56
|
***
|
|
57
57
|
|
|
@@ -59,7 +59,7 @@ Defined in: [packages/mdast-plus/src/pipeline.ts:62](https://github.com/isdk/mda
|
|
|
59
59
|
|
|
60
60
|
> `protected` **queue**: [`MdastPlugin`](../interfaces/MdastPlugin.md)[] = `[]`
|
|
61
61
|
|
|
62
|
-
Defined in: [packages/mdast-plus/src/pipeline.ts:63](https://github.com/isdk/mdast-plus.js/blob/
|
|
62
|
+
Defined in: [packages/mdast-plus/src/pipeline.ts:63](https://github.com/isdk/mdast-plus.js/blob/fc889343b0a625d8edbf2036c3e25b676d1bf163/src/pipeline.ts#L63)
|
|
63
63
|
|
|
64
64
|
## Methods
|
|
65
65
|
|
|
@@ -67,7 +67,7 @@ Defined in: [packages/mdast-plus/src/pipeline.ts:63](https://github.com/isdk/mda
|
|
|
67
67
|
|
|
68
68
|
> `protected` **assembleProcessor**(`queue`): `Processor`
|
|
69
69
|
|
|
70
|
-
Defined in: [packages/mdast-plus/src/pipeline.ts:494](https://github.com/isdk/mdast-plus.js/blob/
|
|
70
|
+
Defined in: [packages/mdast-plus/src/pipeline.ts:494](https://github.com/isdk/mdast-plus.js/blob/fc889343b0a625d8edbf2036c3e25b676d1bf163/src/pipeline.ts#L494)
|
|
71
71
|
|
|
72
72
|
Assembles a unified processor based on the sorted plugin queue.
|
|
73
73
|
|
|
@@ -87,7 +87,7 @@ Assembles a unified processor based on the sorted plugin queue.
|
|
|
87
87
|
|
|
88
88
|
> **configure**(`pluginName`, ...`options`): `this`
|
|
89
89
|
|
|
90
|
-
Defined in: [packages/mdast-plus/src/pipeline.ts:478](https://github.com/isdk/mdast-plus.js/blob/
|
|
90
|
+
Defined in: [packages/mdast-plus/src/pipeline.ts:478](https://github.com/isdk/mdast-plus.js/blob/fc889343b0a625d8edbf2036c3e25b676d1bf163/src/pipeline.ts#L478)
|
|
91
91
|
|
|
92
92
|
Modifies the options of a plugin that is already in the pipeline queue.
|
|
93
93
|
Searches from the end of the queue and updates the first match found.
|
|
@@ -119,7 +119,7 @@ The pipeline instance for chaining.
|
|
|
119
119
|
|
|
120
120
|
> **data**(`key`, `value?`): `this`
|
|
121
121
|
|
|
122
|
-
Defined in: [packages/mdast-plus/src/pipeline.ts:80](https://github.com/isdk/mdast-plus.js/blob/
|
|
122
|
+
Defined in: [packages/mdast-plus/src/pipeline.ts:80](https://github.com/isdk/mdast-plus.js/blob/fc889343b0a625d8edbf2036c3e25b676d1bf163/src/pipeline.ts#L80)
|
|
123
123
|
|
|
124
124
|
Configures global data for the pipeline, which will be available to all plugins via this.data().
|
|
125
125
|
|
|
@@ -149,7 +149,7 @@ The pipeline instance for chaining.
|
|
|
149
149
|
|
|
150
150
|
> `protected` **ensureInputPlugins**(`queue`, `overrides?`, `maxStage?`): `void`
|
|
151
151
|
|
|
152
|
-
Defined in: [packages/mdast-plus/src/pipeline.ts:165](https://github.com/isdk/mdast-plus.js/blob/
|
|
152
|
+
Defined in: [packages/mdast-plus/src/pipeline.ts:165](https://github.com/isdk/mdast-plus.js/blob/fc889343b0a625d8edbf2036c3e25b676d1bf163/src/pipeline.ts#L165)
|
|
153
153
|
|
|
154
154
|
Ensures that input plugins (parser, normalizers) are present in the queue.
|
|
155
155
|
Adds implicit plugins if no parser is detected.
|
|
@@ -178,7 +178,7 @@ Adds implicit plugins if no parser is detected.
|
|
|
178
178
|
|
|
179
179
|
> **from**(`fmt`, `overrides?`): `this`
|
|
180
180
|
|
|
181
|
-
Defined in: [packages/mdast-plus/src/pipeline.ts:194](https://github.com/isdk/mdast-plus.js/blob/
|
|
181
|
+
Defined in: [packages/mdast-plus/src/pipeline.ts:194](https://github.com/isdk/mdast-plus.js/blob/fc889343b0a625d8edbf2036c3e25b676d1bf163/src/pipeline.ts#L194)
|
|
182
182
|
|
|
183
183
|
Configures the input format and adds its associated plugins to the pipeline.
|
|
184
184
|
|
|
@@ -208,7 +208,7 @@ The pipeline instance for chaining.
|
|
|
208
208
|
|
|
209
209
|
> **getFormat**(`id`): `undefined` \| [`MdastFormat`](../interfaces/MdastFormat.md)
|
|
210
210
|
|
|
211
|
-
Defined in: [packages/mdast-plus/src/pipeline.ts:92](https://github.com/isdk/mdast-plus.js/blob/
|
|
211
|
+
Defined in: [packages/mdast-plus/src/pipeline.ts:92](https://github.com/isdk/mdast-plus.js/blob/fc889343b0a625d8edbf2036c3e25b676d1bf163/src/pipeline.ts#L92)
|
|
212
212
|
|
|
213
213
|
Instance-level access to the global format registry.
|
|
214
214
|
|
|
@@ -228,7 +228,7 @@ Instance-level access to the global format registry.
|
|
|
228
228
|
|
|
229
229
|
> **priority**(`order`): `this`
|
|
230
230
|
|
|
231
|
-
Defined in: [packages/mdast-plus/src/pipeline.ts:461](https://github.com/isdk/mdast-plus.js/blob/
|
|
231
|
+
Defined in: [packages/mdast-plus/src/pipeline.ts:461](https://github.com/isdk/mdast-plus.js/blob/fc889343b0a625d8edbf2036c3e25b676d1bf163/src/pipeline.ts#L461)
|
|
232
232
|
|
|
233
233
|
Sets the priority order for the most recently added plugin.
|
|
234
234
|
Plugins with lower order run earlier within the same stage.
|
|
@@ -253,7 +253,7 @@ The pipeline instance for chaining.
|
|
|
253
253
|
|
|
254
254
|
> `protected` **resolveRunQueue**(`format`, `overrides?`, `stage?`, `stopAtIndex?`): [`MdastPlugin`](../interfaces/MdastPlugin.md)[]
|
|
255
255
|
|
|
256
|
-
Defined in: [packages/mdast-plus/src/pipeline.ts:214](https://github.com/isdk/mdast-plus.js/blob/
|
|
256
|
+
Defined in: [packages/mdast-plus/src/pipeline.ts:214](https://github.com/isdk/mdast-plus.js/blob/fc889343b0a625d8edbf2036c3e25b676d1bf163/src/pipeline.ts#L214)
|
|
257
257
|
|
|
258
258
|
Resolves the final plugin queue for execution based on the target format and run options.
|
|
259
259
|
Calculates the effective plugin list by applying overrides, handling partial execution (stage/stopAtIndex),
|
|
@@ -287,7 +287,7 @@ and injecting necessary input/output plugins.
|
|
|
287
287
|
|
|
288
288
|
> **to**(`fmt`, `optionsOrOverrides?`): `Promise`\<`VFile`\>
|
|
289
289
|
|
|
290
|
-
Defined in: [packages/mdast-plus/src/pipeline.ts:290](https://github.com/isdk/mdast-plus.js/blob/
|
|
290
|
+
Defined in: [packages/mdast-plus/src/pipeline.ts:290](https://github.com/isdk/mdast-plus.js/blob/fc889343b0a625d8edbf2036c3e25b676d1bf163/src/pipeline.ts#L290)
|
|
291
291
|
|
|
292
292
|
Processes the pipeline and serializes the result into the specified format.
|
|
293
293
|
|
|
@@ -317,7 +317,7 @@ A promise resolving to a VFile containing the result.
|
|
|
317
317
|
|
|
318
318
|
> `protected` **toRuntimeEntry**(`entry`, `defaultStage`, `overrides?`): [`MdastPlugin`](../interfaces/MdastPlugin.md) & `object`
|
|
319
319
|
|
|
320
|
-
Defined in: [packages/mdast-plus/src/pipeline.ts:116](https://github.com/isdk/mdast-plus.js/blob/
|
|
320
|
+
Defined in: [packages/mdast-plus/src/pipeline.ts:116](https://github.com/isdk/mdast-plus.js/blob/fc889343b0a625d8edbf2036c3e25b676d1bf163/src/pipeline.ts#L116)
|
|
321
321
|
|
|
322
322
|
Normalizes a plugin entry for runtime execution.
|
|
323
323
|
|
|
@@ -345,7 +345,7 @@ Normalizes a plugin entry for runtime execution.
|
|
|
345
345
|
|
|
346
346
|
> **use**(`plugin`, ...`options`): `this`
|
|
347
347
|
|
|
348
|
-
Defined in: [packages/mdast-plus/src/pipeline.ts:336](https://github.com/isdk/mdast-plus.js/blob/
|
|
348
|
+
Defined in: [packages/mdast-plus/src/pipeline.ts:336](https://github.com/isdk/mdast-plus.js/blob/fc889343b0a625d8edbf2036c3e25b676d1bf163/src/pipeline.ts#L336)
|
|
349
349
|
|
|
350
350
|
Adds a plugin or an array of plugins to the pipeline's compile stage.
|
|
351
351
|
|
|
@@ -377,7 +377,7 @@ The pipeline instance for chaining.
|
|
|
377
377
|
|
|
378
378
|
> **useAt**(`stage`, `plugin`, ...`options`): `this`
|
|
379
379
|
|
|
380
|
-
Defined in: [packages/mdast-plus/src/pipeline.ts:418](https://github.com/isdk/mdast-plus.js/blob/
|
|
380
|
+
Defined in: [packages/mdast-plus/src/pipeline.ts:418](https://github.com/isdk/mdast-plus.js/blob/fc889343b0a625d8edbf2036c3e25b676d1bf163/src/pipeline.ts#L418)
|
|
381
381
|
|
|
382
382
|
Adds a plugin or an array of plugins to the pipeline at a specific stage.
|
|
383
383
|
|
|
@@ -411,7 +411,7 @@ The pipeline instance for chaining.
|
|
|
411
411
|
|
|
412
412
|
> **useAt**(`plugin`, ...`options`): `this`
|
|
413
413
|
|
|
414
|
-
Defined in: [packages/mdast-plus/src/pipeline.ts:425](https://github.com/isdk/mdast-plus.js/blob/
|
|
414
|
+
Defined in: [packages/mdast-plus/src/pipeline.ts:425](https://github.com/isdk/mdast-plus.js/blob/fc889343b0a625d8edbf2036c3e25b676d1bf163/src/pipeline.ts#L425)
|
|
415
415
|
|
|
416
416
|
Adds a plugin or an array of plugins to the pipeline. The stage is taken from the plugin object(s) or defaults to 'compile'.
|
|
417
417
|
|
|
@@ -441,7 +441,7 @@ The pipeline instance for chaining.
|
|
|
441
441
|
|
|
442
442
|
> `static` **getFormat**(`id`): `undefined` \| [`MdastFormat`](../interfaces/MdastFormat.md)
|
|
443
443
|
|
|
444
|
-
Defined in: [packages/mdast-plus/src/pipeline.ts:58](https://github.com/isdk/mdast-plus.js/blob/
|
|
444
|
+
Defined in: [packages/mdast-plus/src/pipeline.ts:58](https://github.com/isdk/mdast-plus.js/blob/fc889343b0a625d8edbf2036c3e25b676d1bf163/src/pipeline.ts#L58)
|
|
445
445
|
|
|
446
446
|
Retrieves a registered format by its ID.
|
|
447
447
|
|
|
@@ -465,7 +465,7 @@ The format definition or undefined if not found.
|
|
|
465
465
|
|
|
466
466
|
> `static` **register**(`format`): `void`
|
|
467
467
|
|
|
468
|
-
Defined in: [packages/mdast-plus/src/pipeline.ts:49](https://github.com/isdk/mdast-plus.js/blob/
|
|
468
|
+
Defined in: [packages/mdast-plus/src/pipeline.ts:49](https://github.com/isdk/mdast-plus.js/blob/fc889343b0a625d8edbf2036c3e25b676d1bf163/src/pipeline.ts#L49)
|
|
469
469
|
|
|
470
470
|
Registers a global document format.
|
|
471
471
|
|