将Markdown /纺织品转换为HTML的Javascript(理想情况下,将其转换回Markdown /纺织品)


84

有几种不错的Markdown / Textile Javascript编辑器(例如:http : //attacklab.net/showdown/,我现在正在使用的那个),但是我所需要的只是一个Javascript函数,可以从Markdown / Textile中转换字符串-> HTML,然后返回。

最好的方法是什么?(理想情况下,它将是jQuery友好的-例如,$("#editor").markdown_to_html()

编辑:另一种表达方式是我正在寻找Railstextilize()markdown()文本助手的Javascript实现。

Answers:


98

对于Markdown-> HTML,有Showdown

StackOverflow本身使用Markdown语言来解答问题;您是否尝试看看它是如何工作的?

好吧,看来它正在使用MIT许可下提供的PageDown

问题有没有好的Markdown Javascript库或控件?它的答案可能也有帮助:-)


当然,正式编辑不是您所需要的;但是他们必须使用某种函数将Markdown代码转换为HTML; 并且,根据这些编辑器的许可,您也许可以重新使用该功能...

实际上,如果仔细看一下Showdown,在其代码源(文件showdown.js)中,您会发现这部分注释:

//
// Showdown usage:
//
//   var text = "Markdown *rocks*.";
//
//   var converter = new Showdown.converter();
//   var html = converter.makeHtml(text);
//
//   alert(html);
//
// Note: move the sample code to the bottom of this
// file before uncommenting it.
//

它不是jQuery语法,但是应该很容易集成到您的应用程序中;-)


关于纺织品,找到有用的东西似乎有点困难:-(


另一方面,HTML-> Markdown,我想事情可能会有点困难...

我要做的是将Markdown和HTML都存储在我的应用程序数据存储(数据库?)中,并使用其中一个进行编辑,而使用另一个进行呈现...将占用更多空间,但看起来比“解密” HTML的风险要小。 ..



1
@约翰感谢您的评论; 我已经编辑了答案以更改链接;-)
Pascal MARTIN

不幸的是,该库似乎不适用于基于markdown的链接,也就是:某些文本无法转换。很遗憾,它缺少一些语法。还缺少什么?
奥德曼(Oddman)2013年

25

我认为值得在这里列出JavaScript解决方案及其缩小(未压缩)的大小和优点/缺点的列表。压缩后代码的压缩大小约为未压缩大小的50%。归结为:

  • 使用 如果需要全面的支持,并且需要用户编辑或任意文档,showdown(28KB)。
  • 使用 如果您有用户编辑/任意文档,但不需要表格,定义列表或脚注(例如,在StackExchange等网站上的注释),则pagedown(8KB)。
  • 用我自己的 提款,如果你需要合理的高品质,并表支持,但希望羽毛的重量,不需要每一个边缘的情况下解决(1.3kb的)。
  • 如果您需要诸如安全性或可扩展性之类的独特功能,请使用其他功能之一。

所有这些都使用MIT许可证,大多数在npm上。

  • 摊牌:28KB 基本上是金本位制;这是分页的基础。

  • pagedown:8KB。这就是StackExchange的强大功能,因此您可以亲自了解它支持的功能(功能非常强大,但缺少表,定义列表,脚注等)。除了8KB转换器脚本之外,它还提供了编辑器和消毒脚本,StackExchange也都使用了这两个脚本。

  • 缩编:1.3kb的。完全披露,是我写的。比任何其他轻量级转换器都具有更广泛的功能范围;处理大多数但不是全部的CommonMark规范。不建议用于用户编辑,但对于在Web应用程序中显示信息非常有用。没有内联HTML。

  • markdown-it:104KB。遵循CommonMark规范;支持语法扩展;默认情况下产生安全输出。快速; 实际上可能和摊牌一样强大,但是非常大。是http://dillinger.io/的基础。

  • 标记为:19KB。全面; 针对单元测试套件进行了测试;支持自定义词法分析器规则。

  • micromarkdown:5KB。支持许多功能,但缺少一些常用功能,例如使用的无序列表,*以及一些严格不属于规范的常用功能,例如受防护的代码块。许多错误会在大多数较长的文档上引发异常。我认为这是实验性的。

  • nano-markdown:1.9KB。功能范围仅限于大多数文档使用的内容;比micromarkdown更强大,但并不完美;使用自己的非常基本的单元测试。相当健壮,但在许多极端情况下都无法使用。

  • mmd.js:800个字节。努力使仍可能起作用的最小解析器的结果。支持一小部分;文档需要针对它进行定制。

  • markdown-js:54KB(无法下载,压缩后会缩小;可能会缩小到约20KB)。看起来很全面,并且包含测试,但是我不太熟悉。

  • 崩溃:41KB(不可下载,压缩后会压缩;可能会压缩到15KB)。jQuery插件;Markdown Extra(表格,定义列表,脚注)。

  • unified.js:因人而异,5-100KB。基于插件的系统,可在html,markdown和prose之间进行转换。根据所需的插件(拼写检查,语法突出显示,输入清理),文件大小会有所不同。服务器端使用的可能比客户端更多。


谢谢你,真的很有用!我只是使用了对决,fetch(对Jake Archibald的“ That's So Fetch”进行了少许扫描)将Markdown文件读入我的静态HTML页面并将其转换为HTML。甜蜜:-)
戴夫·埃弗里特

@DaveEveritt很棒-除非您瞄准的是固定浏览器,否则不要忘了包含fetch polyfill。这将对您有用
Adam Leggett

同意,并感谢您提供链接,尽管我认为现在只有少数浏览器需要此功能-三星正在新版本中提供支持,并且我不再以IE为目标,尽管我知道许多开发人员都需要... caniuse.com/#feat = fetch
Dave Everitt

您是否计划在下拉菜单中添加<table>功能?我尝试自己添加它,但这超出了我的理解范围。;(
维克多·李

1
@VictorLee完成了!
亚当·莱格特

13

纺织品

你可以找到一个看似很细的Javascript实现纺织这里,另一个存在(也许不那么好,但有一个很好的转换,为你型示例页面)。

注意:在我实现的第一个实现中存在一个错误:水平条未正确呈现。要解决此问题,您可以在文件中添加以下代码。

for(i=0;i<lines.length;i++) {
    // Add code :Start
    if (lines[i].match(/\s*-{4,}\s*/)){
      html+="<hr/>\n";
      continue;
    }
    // Add code :End
    if (lines[i].indexOf("[") == 0) {continue;}
    //...

9

我正在使用微小的简约脚本-mmd.js,该仅支持Markdown可能性的子集,但是无论如何这可能就是全部,所以这个小于1kb的脚本是惊人的,并且不会过分杀人。

支持的功能

  • 标头 #
  • 块引用 >
  • 有序列表 1
  • 无序列表 *
  • 段落
  • 链接 []()
  • 图片 ![]()
  • 内联重点 *
  • 内联重点 **

不支持的功能

  • 参考和ID
  • 降价字符转义
  • 套料


我们可以使用npm install安装mmd.js吗?我真的很想在我的项目中尝试一下。
sudhir shakya

1
adamvleggett.github.io/drawdown并没有那么大,但是它支持Markdown的方式更加灵活。
亚当·莱格特

4

无论有无jQuery使用Showdown都很容易。这是一个jQuery示例:

// See http://mathiasbynens.be/notes/showdown-javascript-jquery for a plain JavaScript version as well
$(function() {
 // When using more than one `textarea` on your page, change the following line to match the one you’re after
 var $textarea = $('textarea'),
     $preview = $('<div id="preview" />').insertAfter($textarea),
     converter = new Showdown.converter();
 $textarea.keyup(function() {
  $preview.html(converter.makeHtml($textarea.val()));
 }).trigger('keyup');
});



2

我发现这个问题很吸引人,所以我决定从头开始(仅替换strongitalic降价标记)。花了一个小时尝试使用正则表达式设计解决方案后,我放弃了并最终获得了以下内容,该方法似乎运行良好。就是说,它肯定可以进一步优化,但我不确定这种形式在现实世界中的弹性如何:

function mdToHtml(str) {
    var tempStr = str;
    while(tempStr.indexOf("**") !== -1) {
        var firstPos = tempStr.indexOf("**");
        var nextPos = tempStr.indexOf("**",firstPos + 2);
        if(nextPos !== -1) {
            var innerTxt = tempStr.substring(firstPos + 2,nextPos);
            var strongified = '<strong>' + innerTxt + '</strong>';
            tempStr = tempStr.substring(0,firstPos) + strongified + tempStr.substring(nextPos + 2,tempStr.length);
        //get rid of unclosed '**'
        } else {
            tempStr = tempStr.replace('**','');
        }
    }
     while(tempStr.indexOf("*") !== -1) {
        var firstPos = tempStr.indexOf("*");
        var nextPos = tempStr.indexOf("*",firstPos + 1);
        if(nextPos !== -1) {
            var innerTxt = tempStr.substring(firstPos + 1,nextPos);
            var italicized = '<i>' + innerTxt + '</i>';
            tempStr = tempStr.substring(0,firstPos) + italicized + tempStr.substring(nextPos + 2,tempStr.length);
        //get rid of unclosed '*'
        } else {
            tempStr = tempStr.replace('*','');
        }
    }
    return tempStr;
}

测试代码:

    var s = "This would be *italicized* text and this would be **bold** text, This would be *italicized* text and this would be **bold** text, This would be *italicized* text and this would be **bold** text";
    alert(mdToHtml(s));

输出:

This would be <i>italicized</i>text and this would be <strong>bold</strong> text, This would be <i>italicized</i>text and this would be <strong>bold</strong> text, This would be <i>italicized</i>text and this would be <strong>bold</strong> text

编辑:V 0.024中的新增功能-自动删除未关闭的降价标签



0

您是否看过Mylyn的Eclipse WikiText库。它将从许多Wiki语法转换为xhtml和xdocs / DITA。看起来很酷。

http://help.eclipse.org/galileo/topic/org.eclipse.mylyn.wikitext.help.ui/help/Markup-Conversion.html

有没有人找到HTML-> textile问题的解决方案?我们当前所有的文档都是M $ Word格式,我们希望将其引入Redmine Wiki中进行协作维护。我们没有找到可以进行转换的工具。我们发现Open Office扩展可以生成MediaWiki格式的文本,但是Redmine Wiki使用的是纺织品的子集。

工具的人知道皈依TO纺织从链接到MediaWiki时,Word,XDocs,或HTML?



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.