5

我正在尝试让彩虹语法突出显示库与标记的降价渲染引擎一起使用。该marked文档指出,通过以下配置选项支持语法高亮显示:

marked.setOptions({
  highlight: function(code, lang) {
    return highlighter.javascript(code);
  }
});

rainbow 源代码表明通过以下语法支持传递字符串以突出显示:

Rainbow.color(code, lang, success);

我对如何将两者放在一起有点不知所措。具体来说,success是一个将被异步调用的回调,我不能简单地从回调中的Rainbow.color代码返回值highlight。这将如何实现?

4

4 回答 4

8

作者标记在这里。我不久前在问题跟踪器上解决了这个问题:https ://github.com/chjj/marked/issues/47

使用带有标记的异步荧光笔是非常有可能的。您只需要遍历词法分析器吐出的标记。

此处的示例:https ://github.com/chjj/marked/issues/47#issuecomment-5297067 (请记住,这是一个示例。您必须对其进行一些修改。)

我可能只是使用上面链接中的方法在本地实现这一点。这将对使用异步荧光笔的人造成性能影响,但如果您需要异步荧光笔,这意味着荧光笔正在执行某种 IO,并且您已经在性能受到影响。

于 2013-02-28T02:34:04.040 回答
4

您可以尝试使用另一个突出显示库,例如highlight.js - 它具有同步突出显示方法 (hljs.highlight(lang, code).valuehljs.highlightAuto(code).value),您可以在浏览器中使用,如下所示:

marked.setOptions({
  highlight: function(code) {
    return hljs.highlightAuto(code).value;
  }
});

这是一个有效的 JsFiddle 示例。

于 2013-02-26T00:05:05.093 回答
2

不幸的是,没有办法解决这个问题。

marked似乎需要一个同步语法高亮,并且rainbow是一个异步语法高亮。

在 Javascript 中,无法将后者转换为前者。

这就是为什么在node.js许多库函数中同时存在同步和异步版本的原因。Javascript 中没有办法在只给定异步的情况下构建同步的,因为您无法创建“嵌套事件循环”(在某些情况下,相反的转换可以使用 web 工作者完成)。

可能不难添加同步版本rainbow(例如,通过预先提供可能异步加载的外部资源)。

于 2013-02-17T22:24:50.070 回答
1

不是完美的解决方案,但在同步 API 合并到 rainbow.js 之前,我使用以下代码解决了它:

// ... after marked() has converted the markdown to html 
// (the highlight option of marked should be unchanged!)

// find all <code> elements and go through each
$('body')
     .find('code')
     .each(function() {
            var $code = $(this),
                cls = $code.attr('class'),
                language;

            // no language information at all
            if(typeof cls === 'undefined') {
                return;
            }

            // actually we should also check if a valid "lang-" class 
            // (which is by default set through marked) is given
            language = cls.split('-')[1];

            // add the data-language to the <code> element
            $code.data('language', language);
        });

// let the rainbows shine
Rainbow.color();

这运行客户端并使用 jQuery。

于 2013-02-21T14:49:25.827 回答