新博客的一大好处是可以使用Markdown来写作,虽然知道Markdown是什么,但一直没有大规模使用,借着这个机会就可以好好用用了。
这里根据Markdown 中文文档的指引,把Markdown的语法总结一下,外加比较一下本地Typora编辑器和Halo编辑器的区别。
1 HTML元素的使用
Markdown是纯文本,然后由解析引擎解析为HTML展示出来。对于Markdown中没有的东西,可以直接使用HTML标签。HTML标签有两种,一种是块级标签,一种是内联标签,这两种标签的处理方式不同。
1.1 块级标签的处理
块级标签的处理就类似于<div>或者<p>这种标签,注意在这一行里,左边的尖括号实际上是用转义来书写的,否则会被解析成HTML。这种块级标签,必须要单独起一行放置,而且其中的Markdown语法结构不会被处理,比如:
### 这是一个P标签内部想被解析成标题然而失败的标题
在外边如果你想要在一个新段落开始直接写左边三个#号,然后空一格的文字,就会变成3级标题。实际上我发现,Halo直接使用div标签还是会带来一些混乱,比如两种标题格式中用=和-号的依然会被解析,以及块级之后的换行解析也不正确。用P标签就正确,所以还是少用div为妙。1.2 内联标签的处理
内联元素内部的Markdown语法则会被正常解析,比如这是span元素内部的删除线Markdown语法,这一段删除线文字被包含在span元素内,然后左右两侧各有两个波浪线“~”符号,构成Markdown的删除线标记,可见与显示的一样,正常解析了。所以像链接既可以使用Markdown的链接格式,也可以通过a标签来详细控制,比如:
1.3 转义字符
在之前使用Wordpress的时候,发现Wordpress对于转义字符和一些Unicode字符支持很不好,甚至不能够正常发布文章。
Markdown对于单独内联使用的左尖括号<是可以正常转义的,尖括号搭配一些Markdown语法需要前后留一些空白,比如**<**和 <,前者和文字没有空白,后者有一个空白,可能具体使用的编辑器效果还不同。这里经过我实验,Halo的编辑器在这个方面的表现与Typora编辑器还是有不同之处的,Halo编辑器如果没有后边的空格,则会把中间的“和”字粗体化,Typora不加空格也显示正常,所以Halo里还是要稍微注意一下混合排列才行。在页面上显示的时候查看源代码,可以看到单独使用的左尖括号确实都被自动转义成为字符。
转义符号的起始字符&单独在内联中也可以正常使用,就像这句话中的符号已经被转义,这对于编写带有多个参数的链接非常方便。
2 块级元素
块级元素在Markdown中就是用一个空行或者硬换行(回车)分开的部分,常用来做单独展示。
2.1 P标签与硬换行
按照标准的Markdown格式,连续文字的末尾加上两个空白然后换行就可以得到一个硬换行,在Halo里边只需要再多输入一个回车,就可以得到一个间隔比较大的段落。经过查看代码,Halo编辑器如果单独只用一个回车,则相当于插入一个br标签,其后的文字还是在一个P标签内部;如果连续两个回车,那么就相当于一个新的P标签,P标签的带有一定的margin,所以间隔就变大了,相当于真正的新段落。在Typora中也是一样,如果手工插入br标签,不意味着更换段落,如果按回车,则就是新的P标签。
所以这里总结一下两个编辑器的特点:
换行 | Halo | Typora |
---|---|---|
段落内换行(软换行) | br标签和仅按一次回车 | br标签 |
换段落(硬换行) | 按两次回车 | 按一次回车 |
所以我理解了Markdown的硬换行概念,实际上就是是否新开启P标签的概念。开启新的P标签就是Markdown的硬换行。
2.2 标题
标题有两种方法,一种是软换行之后用连续的=====(几个都行)表示一个一级标题,用连续的-----(几个都可以)表示二级标题,由于是软换行,所以标题的内容就是同一个段落内的内容。还有一种方法就是在开头加上#,然后用一个空白与标题内容隔开,可以用1-6个#号表示1-6级别标题。我个人还是感觉使用#号要好一些。
2.3 块引用
块引用就是特意高亮一块区域,看起来像这样:
这是引用的区域
这是软换行的区域,左侧显示依然是同一个引用,可以使用一个回车,或者一个回车后在行前加上 > 符号
这是分过段落的引用区域,和上边不是同一个部分
块引用如同上边所示,只需要在行前加上一个 > 符号即可。块引用还可以嵌套,块内的Markdown语法会被正常解析,只需要再加上 > 符号即可:
普通的引用
二级引用
解析语法的例子:
- 列表第一项
- 列表第二项
块引用如果能想到的话,还是能够让文章页面变得生动许多的。
2.4 列表
很显然,列表需要区分有序列表和无序列表。
无序列表使用星号,加号,减号,放在一行的开头,与内容隔开一个空白,就可以创建列表,比如:
* 1st
* 2nd
* 3rd
这样得到的结果如下:
- 1st
- 2nd
- 3rd
符号是可以混用的,但是混用的时候,Markdown会将其解析为不同的列表,只有靠在一起的同样符号标记的列表才会去放到同一个ul元素内,比如:
* 1st * 2nd - 3rd + 4th
在页面上显示如下:
- 1st
- 2nd
- 3rd
- 4th
点开页面可以看到,这其实是三个ul标签,也就是三个列表。
有序列表则使用数字加上一个小数点,放在一行的开头,与列表内容用一个空白隔开,注意数字并不需要按照大小排列:
1. 1st
9. 2nd
5. 3rd
2. 4th
最后就会被渲染到一个ol标签内,因为数字是浏览器渲染的时候自动生成的,所以这里的数字顺序无所谓,起到的只是一个标记样式的功能,如下:
- 1st
- 2nd
- 3rd
- 4th
如果列表中包含段落,Halo编辑器会自动缩进,完全不用担心段落的排版。
- 这是一个比较长的段落。这是一个比较长的段落。这是一个比较长的段落。这是一个比较长的段落。这是一个比较长的段落。这是一个比较长的段落。这是一个比较长的段落。这是一个比较长的段落。
- 这还是一个比较长的段落。这还是一个比较长的段落。这还是一个比较长的段落。这还是一个比较长的段落。这还是一个比较长的段落。这还是一个比较长的段落。
-
使用引用也可以
Typora编辑器也同样可以自行控制缩进。
2.5 代码块
这个功能可以说最常用了,写开发的东西免不了要用等宽字体来展示代码。简单的代码功能,就是使用一个制表符或者四个空格加在每一行开头,就可以开启代码块部分,如下:
这是使用制表符的一行
这是使用四个空格的一行
两种方法对于页面实际呈现效果没有区别,内容都会被渲染在pre->code标签中。代码块中的内容不会被Markdown解析,所以用来书写代码(以及Markdown自己的样例代码)非常方便。
Halo编辑器自带了代码高亮显示功能,实际上是Markdown扩展语法的一种变体。Markdown扩展语法中支持三个重音符号包裹代码段,Halo中加上了可以高亮代码的插件,采用的是如下形式:
```language
```
来包围代码段,这是特殊的显示插件,可以把language换成要展示的代码名称,这样就可以正确的解析,把language修改成Java,然后写一点代码看看:
import reactor.core.publisher.Flux;
public class App {
public static void main(String[] args) {
Flux.fromArray(new Integer[]{1, 2, 3, 4, 5}).buffer(2).subscribe(
t -> System.out.println(t.getClass()));
}
}
再来一段Python代码试试:
import random
from openpyxl.styles import PatternFill, Border, Side, Alignment, Font, Color, NamedStyle
from openpyxl.writer.excel import save_virtual_workbook
from django.shortcuts import render
def file_page(request):
return render(request, 'file.html')
可以看到,在插件的加持效果下,关键字和常量都会高亮,要比使用原生的Markdown语法仅仅渲染成普通的pre->code标签的效果要好很多,所以对于具体编程语言优先使用Halo提供的代码块功能,而不是标准Markdown语法,只有为了展示纯文本的本来效果再考虑使用原生语法。
2.6 水平线
只要一行内仅仅只有三个以上的星号或者减号,就会生成一条水平线,不连续也可以。这篇文章就使用了水平线分割每个一级标题之间的内容。