djot.js (英语)
用于解析和 绘制光标格式 欢呼声。 。 。 .
这是重写 djot的原始卢瓦 执行。 。 。 . 它正在驱动 欢呼声 游乐场。 。 。 .
脚本 API
这些是运行后可用的 npm install,这将
安装库的构建依赖性 :
npm run ... | 说明 |
|---|---|
build | 编译和捆绑源到 lib 财务报告和审定财务报表 dist |
test | 运行测试 |
bench | 运行基准 |
安装命令行工具
您可以安装命令行工具 djot 通过
npm install -g @djot/djot
djot --help 将概述各种备选办法。 为了更多
大量文档、使用 man djot 或见
在线的男性页面。 。 。 .
你用得着 djot 改为
- 从 djot 转换为 HTML
- 显示 djot 解析器生成的低等事件流
- 以 JSON 或紧凑形式显示 djot 剖析器生成的 AST
- 从 JSON 格式化 djot AST 转换为 djot 或 HTML
- 使用过滤器修改 AST
- 从 djot 转换为 pandoc JSON , 它可以通过 pandoc 读取
- 将 pandoc JSON( 或 djot) 转换为 djot
例如,转换一个 gfm 文档 mydoc.md 欢乐,
pandoc mydoc.md -f gfm -t json | djot -f pandoc -t djot > mydoc.dj
并转换回 gfm, (中文(简体) ),
djot mydoc.dj -t pandoc | pandoc -f json -t gfm
光盘N
该图书馆可通过下列途径提供: unpkg CDN: (中文(简体) )
<script src="https://unpkg.com/@djot/[email protected]/dist/djot.js"></script>
(替换) 0.2.5 带有您想要使用的版本。 )
图书馆 API
向 AST 狂欢
parse(input : string, options : ParseOptions = {})
使用实例:
djot.parse("hello _there_", {sourcePositions: true});
options 可拥有下列(可选)字段:
sourcePositions : boolean: 在AST中包括来源位置warn : (message : Warning) => void数字 : 函数用来处理来自 parser 的警告.
可用 render() 方法,所以
例如,向控制台发出警告时,您可以:
{ warn: (warning) => console.log(warning.render()) }
或者,您可以直接访问字段
message (弦声), offset (如果定义,数字),
财务报告和审定财务报表 pos (单位:千美元){ line: number, col: number, offset: number } 如果定义).
解析一串事件
parseEvents(input : string, options : Options = {})
展出一个活动显示器,每个显示形式
{startpos : number, endpos : number, annot : string}。 。 。 .
使用实例:
for (let event of parseEvents("Hi _there_")) {
console.log(event)
}
这个 Options 对象有一个 warn 描述的属性 parse, (中文(简体) ),
见上文.
漂亮地印着欢乐AST
renderAST(doc : Doc) : string
使用实例:
console.log(djot.renderAST(djot.parse("hi _there_")));
将 djot AST 渲染到 HTML
renderHTML(ast : Doc, options : HTMLRenderOptions = {})
HTMLRenderOptions 扩展 Options 带有 overrides
字段,该字段将节点标记显示为其渲染器的覆盖.
使用实例:
console.log(djot.renderHTML(djot.parse("- _hi_",{sourcePositions:true})));
覆盖的简单示例 :
djot.renderHTML(
djot.parse("_hi_", { sourcePositions: true }),
{
overrides: {
emph: (node, renderer) => {
return `<span class="emphasized">${renderer.renderChildren(node)}</span>`;
}
}
});
该产量: <span class="emphasized">hi</span>。 。 。 .
欢乐
renderDjot(doc : Doc, options : DjotRenderOptions = {}) : string
DjotRenderOptions 扩展 Options 带有 wrapWidth : number 字段.
其影响如下:
wrapWidth > 0: 输出被包裹到宽度中, 并有 “ s软 break” 表现得像一个空间.wrapWidth = 0: 输出没有被包;soft_break调制 作为换行符.wrapWidth = -1: 输出没有被包;soft_break调制 作为一个空间.
使用实例:
console.log(djot.renderDjot(djot.parse("_Hello_ world"), {wrapWidth: 64}));
Pandoc 互操作性
toPandoc(doc : Doc, options : PandocRenderOptions) : Pandoc
PandocRenderOptions 扩展 Options 与
smartPunctuationMap,具有窗体和默认值:
{ non_breaking_space: " ",
ellipses: "⋯",
em_dash: "-",
en_dash: "-",
left_single_quote: "‘",
right_single_quote: "’",
left_double_quote: "“",
right_double_quote: "”" };
使用实例:
console.log(JSON.stringify(djot.toPandoc(djot.parse("- one\n- two\n"))));
fromPandoc(pandoc : Pandoc, options : Options) : Doc
使用实例:
let ast = djot.fromPandoc(JSON.parse(pandocJSON));
过滤器
applyFilter(node : Doc, filter : Filter)
使用实例:
const capitalizeFilter = () => {
return {
str: (e) => {
e.text = e.text.toUpperCase();
}
};
};
let ast = djot.parse("Hi there `verbatim`");
djot.applyFilter(ast, capitalizeFilter);
过滤器是更改 AST 之间的 JavaScript 程序 解析和渲染。 它们可用于定制.
以下是过滤器的例子 使用文档中的全部内容文本 :
// This filter capitalizes regular text, leaving code and URLs unaffected
return {
str: (el) => {
el.text = el.text.toUpperCase();
}
}
这是打印您所有 URL 列表的过滤器 链接到文档中。 这个过滤器不会改变 文档;它只是将列表打印为 stderr.
return {
link: (el) => {
process.stderr:write(el.destination + "\n")
}
}
默认过滤器进行自下而上倒转;即
节点过滤器在孩子处理完毕后运行 .
不过,可以进行自上而下的旅行,甚至
在输入节点时运行单独的动作(处理前)
(在处理儿童后)离开。 来
,将节点的标记与含有 enter 和(或)
exit 函数。 这个 enter 函数在我们穿越时运行
输入 结点,在我们穿过它的子孙之前 exit
函数在我们穿越了节点的孩子之后运行.
对于一个自上而下转弯, 你会只是使用 enter 函数.
如果标签与函数直接相关, 如
第一个例子,它被视为一种“退出”功能.
以下过滤器将使用文本 内嵌着强调,但不是其他文字:
// This filter capitalizes the contents of emph
// nodes instead of italicizing them.
let capitalize = 0;
return {
emph: {
enter: (e) => {
capitalize = capitalize + 1;
},
exit: (e) => {
capitalize = capitalize - 1;
e.tag = "span";
},
},
str: (e) => {
if (capitalize > 0) {
e.text = e.text.toUpperCase();
}
}
}
单个过滤器可能返回一个有多个表格的表格,这些表格将是 按顺序应用:
// This filter includes two sub-filters, run in sequence
return [
{ // first filter changes (TM) to trademark symbol
str: (e) => {
e.text = e.text.replace(/\\(TM\\)/, "™");
}
},
{ // second filter changes '[]' to '()' in text
str: (e) => {
e.text = e.text.replace(/\\(/,"[").replace(/\\)/,"]");
}
}
]
目前为止我们所看到的过滤器 正在修改节点
改变其一种属性(text) (中文(简体) ).
有时我们想用另一种
节点,或有多个节点,或删除一个节点. 在这些
我们可以以 return。 。 。 .
如果返回一个 AST 节点, 它将替换元素
过滤器正在处理。 如果返回 AST 节点数组,
它们将被分解出来,以替换元素。 如果一个空
数组返回,该元素将被删除.
// This filter replaces certain Symb nodes with
// formatted text.
const substitutions = {
mycorp: [ { tag: "str", text: "My Corp" },
{ tag: "superscript",
[ { tag: "str", text: "(TM)" } ] } ],
myloc: { tag: "str", text: "Coyote, NM" }
};
return {
symb: (e) => {
const found = substitutions[e.alias];
if (found) {
return found;
}
}
}
// This filter replaces all Image nodes with their descriptions.
return {
image: (e) => {
return e.children;
}
}
有可能阻止向一个节点的孩子转来转去,
拥有 enter 函数返回带有
属性 stop。内容 stop 将用作常规
返回值。 例如,这可用于防止
正在处理的脚注的内容:
return {
footnote: {
enter: (e) => {
return {stop: [e]};
}
}
}
获取版本
djot.version : string
返回版本编号.
技术
Djot AST 格式最人能读取的文件 这是 类型 定义。 。 。 .
还有一个 贾森 计划 用于验证是否符合AST程序.