V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Daring Fireball: Markdown
CommonMark
MacDown Open Source Markdown Editor
Marked
GitHub Flavored Markdown
jakwings
V2EX  ›  Markdown

又一个类 Markdown 标记语言 Strictdown 诞生了,语法和转换工具应该会比较适合国人的书写习惯。

  •  
  •   jakwings · 2014-03-16 00:25:21 +08:00 · 6687 次点击
    这是一个创建于 3910 天前的主题,其中的信息可能已经有所发展或是发生改变。
    用 Javascript 为浏览器(应该支持 IE7)和 NodeJS 写的转换工具在 GitHub :
    https://github.com/jakwings/strictdown

    为了表示对外国人的谢意,先把英文说明文档搞定了,心累……(求英文大大修正)
    快速语法参考: http://jakwings.github.io/strictdown/QuickReference.html
    详细语法说明: http://jakwings.github.io/strictdown/Syntax.html
    34 条回复    1970-01-01 08:00:00 +08:00
    rannnn
        1
    rannnn  
       2014-03-16 01:04:53 +08:00
    那条语法是比较适合国人的呢?
    jprovim
        2
    jprovim  
       2014-03-16 09:28:20 +08:00   ❤️ 1
    支持,很像Python的代碼格式,使用indentation.
    akfish
        3
    akfish  
       2014-03-16 13:19:42 +08:00   ❤️ 1
    看了下,和markdown的差别不明显。
    可以考虑提供完善的工具链,有利于被采用,比如:
    - 做个live demo,左边编辑框,右边实时预览。
    - 前端:只需要引用一个script+css,把strickdown写在tag里面,就会自动parse渲染
    - 后端:给几个流行的博客框架写扩展,如wordpress,hexo,jekyll之类的

    这样的话,别人看到能很方便的直接用于production,就更愿意去尝试下。
    jakwings
        4
    jakwings  
    OP
       2014-03-16 15:23:33 +08:00
    @rannnn 粗体和斜体等格式都没有限制是否不能处于文字中间。转换工具提供了换行符号的各种处理模式,可根据需求适应各种应用环境或个人风格,例如评论框中可以直接让换行符变成 <br> 。
    jakwings
        5
    jakwings  
    OP
       2014-03-16 15:46:14 +08:00
    @akfish 嗯,差别是不明显,不过已经解决了 Markdown 的几个老问题了。
    忘了把早就用于测试的 live demo 也放上去了……补上了。
    写完英文文档之后就累死了,先放上去让喜欢的人先尝尝鲜,或许别人会比我快搞定展示工具吧 →_→
    sneezry
        6
    sneezry  
       2014-03-16 17:51:41 +08:00 via iPhone   ❤️ 1
    sexy job
    SoloCompany
        7
    SoloCompany  
       2014-03-17 03:27:00 +08:00 via iPad   ❤️ 1
    不错,表示支持,markdown有太多地方不爽了,结尾空格尤其可恨,直接就违反了代码规范了
    jakwings
        8
    jakwings  
    OP
       2014-03-17 14:04:13 +08:00
    @SoloCompany 其实有些特殊情况也是要用到结尾空格的,例如让脚注包含块级元素,让列表项目的第一个子元素为块级元素。不过只要不太折腾就好。不过为什么文章也要遵循代码规范?
    SoloCompany
        9
    SoloCompany  
       2014-03-17 16:07:16 +08:00
    @jakwings 说的不太正确,其实这应该是编辑器的规范,因为有代码规范的要求,一般编辑器都会配置为自动去掉行末空格的,而且一般是不区分文件类型的。实际上用行末空格来作为有意义字符这个定义我觉得是非常反人性的,这个其实和 python 刚好相反了
    jakwings
        10
    jakwings  
    OP
       2014-03-17 16:23:38 +08:00
    @SoloCompany 编辑器自动去掉行末空格,我觉得对于代码块很不公平,因为有时候就是想让代码块里面有行末空格,或者保留空白行的空格,marked.js 和 reStructuredText 在处理这一块时让人不太爽。
    SoloCompany
        11
    SoloCompany  
       2014-03-17 16:32:08 +08:00
    @jakwings 这点我持保留意见,行末任何空白字符不应该作为语意的一部分,这是我坚持的一点,因为这个只有机器能识别,人眼无法识别

    另外,我加一个建议,就是在语意定义上预留一个文件头的 encoding 声明的支持
    当然对于 node 或浏览器内部这个是毫无意义的
    但对于第三方 app 的支持,这个预留是很有必要的

    如果强制文件只能用 UTF8 编码的话,虽说也不是不可以,但还是有点不爽
    SoloCompany
        12
    SoloCompany  
       2014-03-17 16:33:22 +08:00
    我建议最好在 strictdown 中去除对行末空格的支持
    SoloCompany
        13
    SoloCompany  
       2014-03-17 16:35:15 +08:00
    其实我更希望是反过来的语意,和 sh / bash 一样
    回车默认就是换行
    除非行末加反斜杠转义,才表示一行未结束

    现在 strictdown 的定义是反的,默认回车不换行,除非加反斜杠

    这样会使得 shell user 不太适应
    jakwings
        14
    jakwings  
    OP
       2014-03-17 16:55:28 +08:00
    @SoloCompany 目前行末空格只为某些比较折腾的用法保留(例如让列表项目的第一个子元素为非段落的块级元素),还有代码块。至于普通的段落和标题之类的,行首和行末的空格假如没有被转义,都不会保留的。代码块的空格我是绝对要保留的,至于那些比较折腾的语法,没想到有什么比较好的替代方法,我觉得一般人都不会太折腾这种事情的,不过复杂脚注的语法,倒是可以打算去掉第一行的行末空格,可能有不少人希望在脚注中使用块级元素,不强制那个空格也不会产生什么歧义。

    至于默认回车换行,我觉得对于中文来说,换行一般就代表内容过长了,挤在一块不是很好看,在源代码里面更是难看,所以还是顺了英文用户,默认用空格连接多行了。

    转换工具里面有提供默认换行的设置选项,也可设置忽略换行直接连接多行文本的。
    jakwings
        15
    jakwings  
    OP
       2014-03-17 17:00:31 +08:00
    @SoloCompany 由于我本身写的 node 转换工具没提供别的编码格式,我也不想折腾编码格式,把 metadata 作为语义的一部分实在是没什么特别的价值。
    建议个人自行添加 metadata ,自行(修改转换工具源代码)转换。
    SoloCompany
        16
    SoloCompany  
       2014-03-17 17:31:08 +08:00
    @jakwings 编码方式肯定和 strictdown.js 无关的,至少希望要有这样的预留出来,strictdown.js 会忽略这个声明,而文件处理工具需要读取并且写入的时候添加
    SoloCompany
        17
    SoloCompany  
       2014-03-17 17:33:53 +08:00
    @jakwings 代码块里面的所有内容都保留,包括空格,这个同意

    但代码块之外也就是说语法本身,最好就不要支持行末空格了,直接 trim 掉都可以接受
    jakwings
        18
    jakwings  
    OP
       2014-03-17 17:39:17 +08:00
    @SoloCompany 明白,可是我觉得这真的太影响普通用户的使用了。普通用户直接靠一些转换工具自动判断文件内容编码就可以快速转换了。

    除了搞开发的,我想没什么人愿意关注 metadata 的。自己添加 metadata 对于程序员也不是什么难事,最常见的就是为特定博客系统写博文时固定用 "---" 来分隔 metadata 和文章内容,而且 metadata 还不止编码,还有更多东西,转换工具得到 metadata 后还要指定接收 metadata 的对象,而且数据结构也无法简单地统一。
    jakwings
        19
    jakwings  
    OP
       2014-03-17 17:44:10 +08:00
    @SoloCompany 刚刚把复杂脚注定义的语法改了,去掉标记符号后面的行末空格要求了。

    其它折腾块级元素的语法技巧,其实还是基于原来简单的语法推导出来的。我暂时不知道该怎么为了那些折腾的写作方式设计不影响可读性又不会过度增加语法复杂性的新语法。总之现在不过度折腾是不会遇到行末空格的问题的。
    SoloCompany
        20
    SoloCompany  
       2014-03-17 17:51:41 +08:00
    @jakwings 我明白,这个让写工具的人来做肯定可以的,但因为 markdown 还是 strictdown 都没有注释语法。我的意思其实是希望引入一些标准的注释,然后在注释的前提下定义 charset 声明的标准
    jakwings
        21
    jakwings  
    OP
       2014-03-17 17:58:43 +08:00
    @SoloCompany 注释的话太好办了,Strictdown 有个 macro 语法,凡是没有合法 macro 名称的 macro 都不会被转换并输出,macro 也可以自定义。这应该可以在不影响文章转换的前提下自动添加比较简单的隐藏数据了。
    jakwings
        22
    jakwings  
    OP
       2014-03-17 17:59:55 +08:00
    @SoloCompany macro 的内容支持换行,但是不支持用空白行分隔内容。
    jakwings
        23
    jakwings  
    OP
       2014-03-17 18:00:49 +08:00
    @jakwings 或许我得修改一下 macro 的语法,让它可以像 fenced code block 一样没遇到结束符号就不中止内容匹配。
    SoloCompany
        24
    SoloCompany  
       2014-03-17 18:16:13 +08:00
    @jakwings 既然是这样的话,我觉得还是官方把这个定义固定下来比较好

    [[charset UTF-8]]

    而且定义是最好要求必须出现在第一行
    我觉得这样就足够好了,关键是大家都有一个标准可参考
    jakwings
        25
    jakwings  
    OP
       2014-03-17 19:01:12 +08:00
    @SoloCompany 我就是为了尽量保持简单和提供方便自定义的接口才设计 macro 的。不常用的东西我不想加入到标准中,像 Markdown 我都没经常听到这类抱怨的,各种博客平台还是妥妥地运行着,想必这要求还是太小众了,Unicode 或者 UTF8 编码是目前的主流啊,其它编码的文本也有合适的转换方式。
    jyz19880823
        26
    jyz19880823  
       2014-03-18 14:12:10 +08:00
    啥叫国人的书写习惯呢
    jakwings
        27
    jakwings  
    OP
       2014-03-18 14:55:50 +08:00
    @jyz19880823 4 楼。试过就更清楚了。假如要执着中文特殊标点和全角符号的问题,那只能叹息中文没有什么特别合适的标点和特殊符号用于做标记了。
    soli
        28
    soli  
       2014-03-18 22:16:10 +08:00
    @jakwings


    > 除了搞开发的,我想没什么人愿意关注 metadata 的。自己添加 metadata 对于程序员也不是什么
    > 难事,最常见的就是为特定博客系统写博文时固定用 "---" 来分隔 metadata 和文章内容,而且
    > metadata 还不止编码,还有更多东西,转换工具得到 metadata 后还要指定接收 metadata 的对
    > 象,而且数据结构也无法简单地统一。

    我倒是觉得 metadata 是普遍存在的需求。比如现在最常见的 Yaml Front Matter。
    因为标准没有这方面的规范,所以各个编辑器都无法正确的隐藏这些内容(我只记得 MarkdownPad是支持的)。

    如果不想过于折腾,那可以只指定一种分隔方式,具体内容不做限制,由各个系统自行定义(我相信大部分人还是会用 YAML的)。

    另外,Fenced Code Blocks 好像没有类似 PHPMarkdownExtra 那样的自定义 class?主要是语法高亮需要。否则还要专门写 js 来搞。
    jakwings
        29
    jakwings  
    OP
       2014-03-18 22:35:02 +08:00
    @soli metadata 对于某些人做的博客系统来说或许并不重要,反而成了降低文件内容自由度的因素。
    Macro 语法应该可以解决这个任务了,例如:
    [[meta-yaml
    title: "title"
    date: "2014-01-01"
    ]]

    fenced code block 可以指定代码语言啊,会产生 lang-python 这样的 class 。
    jakwings
        30
    jakwings  
    OP
       2014-03-18 22:36:01 +08:00
    @jakwings 看来我还得再改进一下 macro 的语法,目前还不太适应换行。
    soli
        31
    soli  
       2014-03-19 09:25:01 +08:00
    Macro 实现 meta 看着有点怪怪的。不过,也算曲线救国了吧。比如,我现在用

    <!--
    author: Soli
    date: 2014-03-19
    -->

    这样在 Markdown 里实现的。虽然,能达到目的(编辑器自动忽略),但用的不是 Markdown 原生的语法,感觉不落地。如果我是一个编辑器的开发者的话,感觉无所适从。

    现在 fenced code block 虽然可以指定代码语言,但对 google-code-prettify 这类(需要在 <pre> 里加 prettyprint class)的工具,就无能为力了。当然,还是有曲线救国的方法的。

    只是,我觉得现在已经非常主流的 PHPMarkdownExtra 已经支持了的语法,如果能加进来的话,或许更有助于用户过渡。
    jakwings
        32
    jakwings  
    OP
       2014-03-19 15:28:16 +08:00
    @soli 可以将设置中的 languagePrefix 修改为 "prettyprint lang-" 来适应 prettify 。

    metadata 只要统一添加使用,就算不是用 macro 语法也可以轻松过滤的,我现在写博客时给 reStructuredText 的文档添加时也是这样。

    PHPMarkdownExtra 的语法除了表格不一样之外,大概只差「元素属性列表」了吧。
    标题的话可以用 {标题} ,然后 [链接]:[*标题] ,虽然标题过长的时候会不太方便。
    代码块属性可以靠语言名称,语言名称中的空格会被转换成横杠,既然已经这么高要求了,那么肯定是要和 CSS 、JS 打交道的了,高亮函数在获取语言名称后可以进一步分析。

    Strictdown 连最基本的斜体、粗体语法都和 Markdown 不同了,要过渡(修改已经有文章)也不是太容易的事情……
    jakwings
        33
    jakwings  
    OP
       2014-03-19 15:32:34 +08:00
    @soli prettify 没有强制要求非要在 pre 上面加 class ,code 也可以的。
    http://google-code-prettify.googlecode.com/svn/trunk/README.html
    jakwings
        34
    jakwings  
    OP
       2014-03-19 15:36:14 +08:00
    @soli 看来我还是根据 sanitize 模式来决定是否将 language 中的空格转换为横杠好了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1019 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 21:53 · PVG 05:53 · LAX 13:53 · JFK 16:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.