在Meteor中自定义{{#markdown}}行为

时间:2014-02-13 16:07:59

标签: meteor markdown showdown

我喜欢Markdown。这个概念是我作为程序员在几年中遇到的最优雅和最有用的概念之一。所以我很高兴看到Meteor实现了一个Showdown包,让我将它与{{#markdown}}块帮助器一起使用。

然而,当我开始使用它时,突然出现了最少最喜欢的降价标记:缩进代码块。

写这个:

<template name="home">
    {{#markdown}}
        Hello!!! Welcome to *My Site*!!
    {{/markdown}}
</template>

结果如下:

  

My Hello!!! Welcome to *My Site*!!

格式化为CODE !!!!

我讨厌缩进代码块。他们完全搞砸了在编程环境中实际使用 Markdown的尝试。代码是粗略缩进的,并且有充分的理由。它可以保持组织有序并使行为清晰。因此Markdown规范多年来一直错过这一事实对我来说是一个惊天动地的事实。 Github的围栏代码块是一种无限更智能的方法,因为它不需要重复打孔选项卡或空格键,使编辑更容易,并且更清楚地发生在文本中发生的事情

无论如何,</rant>

我想自定义流星使用的降价。怎么样??我查看了Atmosphere并搜索了markdown,发现没有任何适用的内容。另外,我不确定如何在流星环境中使用Showdown扩展。

欢迎任何解决方案!我真正想要的是一个没有缩进代码块的markdown实现。他们很蠢。

2 个答案:

答案 0 :(得分:3)

为什么不实施自己的markdown帮助器:

// this is based on showdown package in spark branch
Handlebars.registerHelper('markdown', function (options) {
  return UI.block(function () {
    var self = this;
    return function () {
      var renderer = new marked.Renderer();
      var text = UI.toRawText(self.__content, self /* parentComponent */);
      return HTML.Raw(marked(trimIndentation(text), { renderer: renderer }));
    };
  });
});

其中trimIndentation或多或少看起来像这样:

function trimIndentation(text) {
  var regexp = null,
      result = "";
  return text.split('\n').map(function (line) {
    var match = (regexp || /(\s*)(\s*[^\s]+.*)/).exec(line);
    if (match) {
      !regexp && (regexp = new RegExp("(\\s{" + match[1].length + "})(.*)"));
      return match[2];
    }
    return line;
  }).join('\n');
}

在上面的示例中,我使用了新模板引擎的语法以及我使用marked库而不是旧的 showdown (或者我应该说 pagedown < / strong>?),但你可以选择自己选择的设置做同样的事情。

答案 1 :(得分:0)

Markdown 似乎已经 deprecated。我在我的项目中用 markdown-it 替换了它:

首先安装它,npm install markdown-it markdown-it-attrs。 然后将 markdown-it 设置为默认的 Markdown 空格键。

var md = require('markdown-it')();
var markdownItAttrs = require('markdown-it-attrs');
md.use(markdownItAttrs);
// md.disable("code")

您可以决定要禁用或编辑的 rules。就我而言,我禁用了代码块,但您可以查看自己案例的文档。

然后将 Markdown 实现为空格键:

  Blaze.Template.registerHelper("markdown", new Template('markdown', function () {
    var view = this;
    var content = '';
    if (view.templateContentBlock) {
      content = Blaze._toText(view.templateContentBlock, HTML.TEXTMODE.STRING);
    }
    return HTML.Raw(md.render(content));
  }));

在实现您的版本之前,请务必删除降价 (meteor remove markdown)。

然后您可以使用 {{#markdown}} 空格键调用它。