排版恐惧者的福音——Markdown介绍

写在前面

由于TW的作业需要以简书博客的形式来完成,所以我将Markdown作为我的第一份作业。文章将介绍Markdown的优势、基本语法、学习中遇到的小问题,以及如何实现一个简单的Markdown解释器。如果发现文章中有什么问题,欢迎指出~


为什么要用Markdown?

Markdown是一种用来写作的轻量级「标记语言」,它用简洁的语法代替排版样式,让你在短时间内写出结构清晰、优美的文章,从而最大程度的专注于文章的内容。对恐惧word排版的朋友来说可谓福音。

经过这几天的使用,我的觉得Markdown有这些优点:

  • 适合对轻量级的随笔、技术分享等进行快速排版
  • 可在HTML页面、PDF文档中完美呈现
  • 纯文本内容,即使用windows记事本也可进行编辑
  • 语法简单,容易记忆

那么下面就来介绍一下Markdown常见的语法~


Markdown基本语法

  • 标题

如果要定义某段文字为标题,在前面加上** # **号即可,几个#号就是几级标题,最低为六级:
# 一级标题
## 二级标题
### 三级标题
……
###### 六级标题

Tip1. #号与标题内容之间最好加上空格,一是为了兼容性,二是为了美观。

  • 列表

分为无序列表与有序列表两种,但目前有序列表还是按无序的效果来显示,也许之后的Markdown版本中会支持有序列表的呈现。
其效果即为本章中每种语法<u>带圆点的题头</u>。
无序符号有多种,包括** - * 、或 + **三种,后面再加一个空格:
* 无序列表1
- 无序列表2
+ 无序列表3
有序符号为数字+“.”+空格:
1. 有序列表1
2. 有序列表2
3. 有序列表3

这里的空格不能缺省,否则无法识别为列表格式,因此在Tip1中推荐大家在所有标记之后都要加空格,就是为了避免记混。

  • 文字强调

文字强调分为粗体斜体,<u>下划线</u>,和删除线,他们的语法分别为:
粗体
斜体
删除线
嗯...有没有发现上面没有<u>下划线</u>的语法标记?,那是因为Markdown为了避免和链接样式混淆,而去掉了<u>下划线</u>样式。如果一定要输出这种格式,那就要用到Markdown的一个特性了,即——内嵌HTML,具体请看本章最后一小节:神奇符号在哪里?

  • 引用

如果你需要引用别处的句子,那么就可以用这种格式,语法如下:
> 引用一下
当然,定义中说是引用,但不一定只在引用文字时才能用这种符号,只要你觉得文章排版合理,可以表达清意思,就可以使用。

效果是这样子的
Tip2. 引用完后记得多敲一行回车,否则后面的文字都会变成引用的内容

  • 图片

插入图片有两种语法,即行内式参考式
行内式适用于图片少的文章,语法为:

Panda

“[]”内为下标图片名,“()”内为图片链接,本地图片需要先上传到网上,这里推荐图床
参考式适用于图片多的文章,语法为:

![Panda][PandaPic]
[PandaPic]: http://img.blog.csdn.net/20151109165400641

第一个“[]”内为下标图片名,第二个“[]”内为图片索引id,冒号后为图片链接
两种方法的最终效果均为:

Panda

Tip3. 别忘了最开始的感叹号

  • 链接

插入链接与插入图片的语法很像,区别是没有** ! 号。此外,插入链接有三种语法,即行内式参考式网址链接式
1. 行内式适用于
文字内部插入少量链接**。语法为:

       [百度](http://www.baidu.com)
  <u>效果为:</u>
最大的中文搜索引擎是[百度](http://www.baidu.com)。
2. 参考式适用于**文字内部插入大量链接**,用这种方法书写起来比较整齐。语法为:
我经常使用的搜索引擎有[Google] [website1],[Baidu] [website2],and [Bing] [website3].
[website1]: http://www.google.com/ "Google"
[website2]: http://www.baidu.com/ "Baidu"
[website3]: http://www.bing.com/ "Bing"

其中第一个“[]”内为链接显示名,第二个“[]”内为链接索引id。索引后要加冒号与空格,并且在链接的末尾,可以加上title,即鼠标放在链接上将会显示出的文字。

<u>效果为:</u>
我经常使用的搜索引擎有[Google] [website1],[Baidu] [website2],and [Bing] [website3].
[website1]: http://www.google.com/ "Google"
[website2]: http://www.baidu.com/ "Baidu"
[website3]: http://www.bing.com/ "Bing"

Tip4. 使用这种参考式时需要注意,整篇文章的<u>图片及链接</u>的索引id不能重复,且不区分大小写

3.网址链接式适用于直接呈现链接地址。语法为

百度网址是:<http://www.baidu.com>

<u>效果为:</u>
百度网址是:http://www.baidu.com

Tip5. 以上所有链接地址都要加http协议头,并填写完整的网址,否则会按jianshu.com的域名去做链接。

这里有个小疑问,希望大神帮我解答:

参考式的链接末尾,如果将title设置为中文,最终呈现出来的只是unicode码,而非中文文字。用Chrome查看网页源码,发现链接的title存储格式为“/u4284/u15c6”形式的unicode码,在源码中修改为中文后显示正常,但刷新后失效。

初步猜测是因为简书使用的是GFM解释器(Github Favored Markdown),它在Markdown->html的翻译过程中,将html标签属性中的所有中文转换为unicode,但在显示时浏览器并未自动转换,从而出现这种问题。而对于普通的中文文字,他们只是html的string内容,而非标签内的属性值,因此不会出现这种问题。

所以这种情况该怎么办,求解~

  • 公式

Markdown中采用LaTex语法来编辑公式,标记符为$$LaTex公式内容$$,但简书貌似没有支持。
所以我采用了另外的方法,即利用http://latex.codecogs.com网站在线编辑公式,并生成公式的图片链接,例如生成以下链接:
http://latex.codecogs.com/gif.latex?\prod(n_{i})+1
可以显示出这样的公式:

公式1
公式1

可以发现链接末尾就是LaTex的语法,熟悉LaTex的朋友可以直接在链接末尾带上LaTex公式,从而得到图片链接。

此外,还有其他插入公式的方法,如使用Google Chart的服务器、使用MathJax引擎等,具体方法不再详述,有兴趣的朋友可以看Mark中插入数学公式的方法

  • 表格

Markdown生成表格的语法有点麻烦,如下所示:

| Tables       | Are           | Cool |
| -------------  |:-------------:| -----:  |
| col 3 is       | right-aligned | $1600 |
| col 2 is       | centered | $12 |
| zebra stripes | are neat | $1 |

可以得到以下表格:

| Tables | Are | Cool |
|: ------------- |:-------------:| -----: |
| col 3 is | right-aligned | $1600 |
| col 2 is | centered | $12 |
| zebra stripes | are neat | $1 |

值得注意的是,第二行冒号的位置指明了该列的对齐方式:冒号在左左对齐,冒号在右右对齐,两侧都有则居中。
当然也可以用在线生成Markdown表格的网站

Markdown生成的表格不太好看,还不如本地excel做好后截图上传(坏笑)

  • 代码区块

Markdown对程序猿的一大福利就是可以编辑代码,语法很简单,即用三个`符号(就是ESC下面那个键,英文状态下输入)做开头,三个`做结尾即可,如果在开头的三个`后说明**代码的语言类型**,即可按这种语言的**高亮模式**去显示
python [code]
效果为:

import json
import re
LINK_CAPACITY = 100000000
class QosBw(app_manager.RyuApp):
    OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]
    _CONTEXTS = {
        "Network_Monitor": network_monitor.Network_Monitor,
        "wsgi": WSGIApplication
    }

这里回答一下作业中的问题——什么时候用inline code?
如果用单个`符号包裹文字,即为inline code,它适用于单行的代码展示,比如一个启动命令安装命令等,或者需要高亮部分文字,也可以用inline code,如下:
ryu-manager --observe-links dijkstra.py
Markdown对于单个`和三个`分别解析为code和pre标签,前者不保留文字段落格式,而后者保留,因此前者适合单行展示,而后者适合多行代码展示。

Tip6. 需要在文章中打出Markdown的特殊符号时(如*,+等),只用在符号前用反斜杠*标记即可,这也与正则表达式*一致(其实Markdown解释器就是用正则写的)。

  • 分隔符

三个下划线_减号-星号*都可实现分隔符。




能不能看到上面有三条线?嗯,就是分别用这三种方法画的。

Tip7. 使用三个减号时,上下都需要空行,另外两种不需要。

  • 神奇符号在哪里?

(标题居中、下划线等效果在Markdown中的实现)

本质上,Markdown是文档结构描述语言,而不支持任何格式。但其原理就是将标记语言翻译成HTML语法,并在网页上显示出来,因此Markdown必然兼容HTML。对于某些Markdown语法中暂未支持的效果,可以内嵌标准HTML代码以达到效果。
→如插入以下HTML代码:
<div align = "center">这是居中文字</div>
<u>下划线</u>
2上标
2下标
简书页面上将分别出现以下效果:
<div align = "center">这是居中文字(发布后惊恐地发现格式失效了,预览的时候还对着,简书都怪你!)</div>
<u>下划线</u>
2上标
2下标

以上这些效果在GFM解释器中并没有实现,而使用原生HTML就可以做到。

此外,在查阅GFM的资料后,发现了一个好玩的东西,原来在GFM中可以插入emoji表情:

emoji

语法也很简单,如上面那个表情用“:joy:”就可以显示出。
遗憾的是简书对GFM做了一些简化,取消了这个语法,希望以后可以加上吧~

以上就是常用的Markdown语法,基本可以涵盖大多数的排版需求。


如何实现一个简单的Markdown解释器?

Markdown原理可分为三个主要部分:正则匹配md标记、HTML标签替换、以及UI美化。

  • 正则匹配
    首先要学习正则表达式,要能够将所有md标记符识别出来,并处理多余的空格、回车等。例如识别标题符:
res = line.match("^#{1,6}.*\r$")
  • 标签替换
    识别出md标记后,就可以根据其定义,翻译出对应的HTML代码,例如翻译标题类型:
level = line.count("#")
line.replace("#{1,6}","<h" + level + ">")
line += "</h" + level + ">"
  • UI美化
    得到最终的HTML后,还需要字体、布局等的样式,因此还需要编写CSS及JS文件以美化文章。

注:其实我上面的代码是随便写的,大家随便看看就行,大致就这么个意思。

这里有一篇介绍Markdown实现原理的文章,以及一个实现Markdown解释器的文章,讲的都很好,有兴趣的朋友可以看看。
另外,再介绍几款开源的MD解释器:GFMMarkedMango


总结

本来只是想简单写写知识总结,没想到还写了挺多的,里面的问题肯定也不少,希望大家指正~
(PS. 后面的作业怎么办啊...感觉写不完了)


参考文献

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • Markdown 语法 之剑 2016.5.3 23:41:46 hljs.initHighlightingOnL...
    光剑书架上的书阅读 1,626评论 1 5
  • 为什么学习Markdown 自从搭建了 Hexo 博客之后,发现还有 Markdown 这种写文章的方法,想到以后...
    lifeColder阅读 20,124评论 10 217
  • (Markdown语法没有一个统一的标准,不同的工具或平台采用的标准不一样,所以有些语法规则和功能是有差异的) 0...
    迟道阅读 56,669评论 4 69
  • 来今天插一章,整个人极其焦灼,正好配上这个话题了。今天的小怪兽名字叫二逼兽。好大爷的表演要开始了…… ...
    大大大机灵阅读 563评论 0 1
  • 本文主要是用来总结下目前学习的心得,其中有不正确的地方欢迎各位指出,同时因为许多代码是借用了网上的开源项目,我会在...
    七月的辛巴阅读 275评论 0 0