如何在docpad-plugin-marked下覆盖标记编译器的渲染方法?

时间:2014-06-07 19:58:38

标签: markdown docpad

我想在docpad-plugin-marked包中扩展marked markdown编译器,并询问如何最优雅地执行此操作的建议。

例如,这就是标记的文档如何重新定义编译标题:

var marked = require('marked');
var renderer = new marked.Renderer();

renderer.heading = function (text, level) {
  var escapedText = text.toLowerCase().replace(/[^\w]+/g, '-');

  return '<h' + level + '><a name="' +
                escapedText +
                 '" class="anchor" href="#' +
                 escapedText +
                 '"><span class="header-link"></span></a>' +
                  text + '</h' + level + '>';
},

console.log(marked('# heading+', { renderer: renderer }));

预期结果:

<h1>
  <a name="heading-" class="anchor" href="#heading-">
    <span class="header-link"></span>
  </a>
  heading+
</h1>

但是docpad-plugin-marked有自己的标记实例,所以我想我需要注入而不是创建自己的实例。它的文档没有解释这个案例https://github.com/docpad/docpad-plugin-marked

有谁知道如何处理它?谢谢!

1 个答案:

答案 0 :(得分:2)

现在无法执行此操作,因为插件不接受自定义渲染器 https://github.com/docpad/docpad-plugin-marked/blob/master/src/marked.plugin.coffee#L26

您必须修改插件才能接受允许您制作自定义渲染器的选项。

警告伪码:

 if (config.markedRenderer) {
 // make a new renderer
   renderer = new marked.Renderer();
   Object.keys(config.markedRenderer).forEach(function(key) {
     return renderer[key] = config.markedRenderer[key];
   });
 }
    // set the new renderer
   return marked(opts.content, { renderer: renderer }, function(err, result) {
        opts.content = result;
        return next(err);
      });

在您的配置文件中:

    marked: {
  markedRenderer: {
    heading: function (text, level) {
      var escapedText = text.toLowerCase().replace(/[^\w]+/g, '-');

      return '<h' + level + '><a name="' +
        escapedText +
        '" class="anchor" href="#' +
        escapedText +
        '"><span class="header-link"></span></a>' +
        text + '</h' + level + '>';
    }
  }
},

如果你正常工作,它会对这个插件提出很好的拉动请求!

更新:我实际上需要此功能,因此您可以在此处查看我的分叉:https://github.com/vladikoff/docpad-plugin-marked/commit/39cc54a0856c5ee0bc784920a6156acf1e1e5568#diff-c25561cb097f02c31ba4fa2cf5dce74eR34

plugins: {
marked: {
  markedRenderer: {
    heading: function (text, level) {
      var escapedText = text.toLowerCase().replace(/[^\w]+/g, '-');

      return '<h' + level + '>' +
        text + ' <a name="' +
        escapedText +
        '" class="anchor" href="#' +
        escapedText +
        '"><span class="header-link"># </span></a></h' + level + '>';
    }
  }
},