如何使用Node.js标记标记?

bob*_*off 8 javascript markdown tokenize node.js ios

我正在构建一个iOS应用程序,其视图将来自markdown.

我的想法是能够将存储在MongoDB中的markdown解析为类似于以下内容的JSON对象:

{
    "h1": "This is the heading",
    "p" : "Heres the first paragraph",
    "link": {
        "text": "Text for link",
        "url": "http://exampledomain.com",
    }
}
Run Code Online (Sandbox Code Playgroud)

在服务器上,我正在运行Node.js,并且正在查看标记的模块,这些模块似乎是最受欢迎的模块.它让我可以访问Lexer,它标记了一些自定义对象的降价.但是当我查看对象时,它并没有标记链接.如果我继续将markdown解析为HTML,则检测到链接并且HTML看起来正确.

在查看了一些更多的模块,并且失败之后,我想也许我可以在客户端上执行此操作而发现MMMarkdown看起来很有希望,但是再次......在直接解析为HTML时工作正常,但是当介于两者之间时只是解析所谓的MMDocument的降价,它不包含Link类型的任何MMElement.

那么,我缺少的降价解析有什么基础吗?内联链接的lexing是否应该在第二轮中完成,或者其他什么?我无法理解它.

如果没有其他工作,我可能只是使用填充了来自解析的markdown的HTML的UIWebView,但是我们必须再次设计整个事情,但是使用CSS,我们已经没时间了,所以我们不能再提供双重工作.

小智 10

你看过https://github.com/evilstreak/markdown-js吗?

它似乎可以让您访问语法树.

例如:

var md = require( "markdown" ).markdown,
text = "Header\n---------------\n\n" +
       "This is a paragraph\n\n" +
"This is [an example](http://example.com/ \"Title\") inline link.";

// parse the markdown into a tree and grab the link references
var tree = md.parse( text );

console.log(JSON.stringify(tree));
Run Code Online (Sandbox Code Playgroud)

产生

[
    "markdown",
    [
        "header",
        {
            "level": 2
        },
        "Header"
    ],
    [
        "para",
        "This is a paragraph"
    ],
    [
        "para",
        "This is ",
        [
            "link",
            {
                "href": "http://example.com/",
                "title": "Title"
            },
            "an example"
        ],
        " inline link."
    ]
]
Run Code Online (Sandbox Code Playgroud)

  • 哇,读了一年多以后,我意识到他们使用数组来保持令牌的顺序正确:)(doh!) (4认同)

lum*_*mio 8

虽然这个问题已经有很多年了,但我还是想稍微更新一下。

我发现的组合unifiedremark-parse一个非常适合我的情况。安装这些包(使用npmyarnpnpm或你最喜欢的 js 包管理器)后,我写了一个小测试脚本如下:

const unified = require('unified');
const markdown = require('remark-parse');

const tokens = unified()
  .use(markdown)
  .parse('# Hello world');

console.log(tokens);
Run Code Online (Sandbox Code Playgroud)

这当然会生成一个令牌树并需要进一步处理。

也许这对偶然发现这个问题的其他人有用。