【问题标题】:showdown highlightjs extension摊牌 highlightjs 扩展
【发布时间】:2014-03-14 04:27:44
【问题描述】:

我正在尝试在 AngularJS 中编写降价编辑器。我正在使用 angular-markdown(AngularJS Showdown 包装器)来解析 markdown,我想使用 highlightjs 突出显示代码块。我写了以下摊牌扩展:

/* global
    hljs,
    Showdown
*/

(function() {
    'use strict';

    Showdown.extensions.hljs = function(converter) {
        return [
            {
                type: 'lang',
                filter: function(text) {
                    return text;
                    var m = /([`]{3}[\S\s]*[`]{3})/gm.exec(text);
                    if(!m) {
                        return text;
                    }
                    for(var i in m) {
                        if(isNaN(i)) {
                            continue
                        }
                        var match = m[i];
                        var lang = match.replace(
                            /([`]{3})([\s\S]*)(\n){1}([\s\S]*)([`]{3})/gm,
                            '$2');
                        var code = match.replace(
                            /([`]{3})([\S\n]*)(\n){1}([\s\S]*)([`]{3})/gm,
                            '$4');
                        var hl;
                        try {
                            var hl = hljs.highlight(lang, code);
                        } catch(e) {
                            var hl = hljs.highlightAuto(code);
                        }
                        text = text.replace(match, '<pre>' + hl.value + '</pre>');
                    }
                    return text;
                }
            }
        ];
    };
}());

虽然这还不完美。第一个代码 sn-p 之后的文本也嵌套并突出显示。

我创建了一个 plunkr here。相关代码在js/angular-markdown-hljs.js

我的问题是:我怎样才能让它发挥作用?

【问题讨论】:

标签: javascript regex highlight showdown


【解决方案1】:

使用 https://highlightjs.org/ 对代码高亮进行扩展,使用新摊牌的扩展 RegExp 引擎会很容易。

这是最近对决的代码示例。

showdown.extension('codehighlight', function() {
  function htmlunencode(text) {
    return (
      text
        .replace(/&amp;/g, '&')
        .replace(/&lt;/g, '<')
        .replace(/&gt;/g, '>')
      );
  }
  return [
    {
      type: 'output',
      filter: function (text, converter, options) {
        // use new shodown's regexp engine to conditionally parse codeblocks
        var left  = '<pre><code\\b[^>]*>',
            right = '</code></pre>',
            flags = 'g',
            replacement = function (wholeMatch, match, left, right) {
              // unescape match to prevent double escaping
              match = htmlunencode(match);
              return left + hljs.highlightAuto(match).value + right;
            };
        return showdown.helper.replaceRecursiveRegExp(text, replacement, left, right, flags);
      }
    }
  ];
});

【讨论】:

  • 这段代码和#215一样,我试过hightlight 9.8showdown 1.4.4,现在不行了,有更新版本的扩展吗?
  • 什么不起作用?从摊牌的角度来看,没有任何改变
  • 谢谢,它工作正常,我正在使用另一个扩展 prettyfy,它为
     添加了类,我更新了该部分,它现在可以工作了
猜你喜欢
  • 2020-09-19
  • 2015-05-24
  • 2021-10-28
  • 1970-01-01
  • 1970-01-01
  • 2012-06-10
  • 2013-12-11
  • 2012-03-30
  • 1970-01-01
相关资源
最近更新 更多