Markdown基本语法
Markdown作为一种标记语言,语法简单且易阅读易编写,可完全脱离鼠标写出样式丰富的文档,是日常工作以及写技术博客必备的技能之一。
| 元素 | Markdown语法 | 效果预览 | |
|---|---|---|---|
| 标题 | # 标题1## h2### h3 |
标题一 标题二 标题三 |
|
| 加粗 | **文字加粗** |
文字加粗 | |
| 引用 | > 引用文字 |
引用文字 |
|
| 有序列表 | 1. 第一项2. 第二项3. 第三项 |
|
|
| 无序列表 | - 第一项- 第二项- 第三项 |
|
|
| 链接 | [链接](url) |
链接 | |
| 图片 |  |
||
| 水平线 | --- |
||
| 代码 | `code` |
code |
|
| 代码块 | ```code snippet``` |
|
更多语法请参考 基础语法 | Markdown Guide 和 扩展语法 | Markdown Guide
Hexo内置标签
Markdown满足了最基本的文档编写需求,标签(Tag Plugin)是Hexo提供的一种快速生成特定内容的方式,用来提供更多样式和功能,例如,标准的Markdown语法中,我们无法制定图片的大小,这是我们可以使用标签来解决。值得一提的是,标签(Tag Plugin)有Plugin的属性,你可以自主编写独特的标签来满足你的需求。
1.文本居中的引用
看,
centerquote是这样的,俺觉得这个用处不大
1 | <!-- HTML方式: 直接在 Markdown 文件中编写 HTML 来调用 --> |
2.代码块的进阶用法
1 | title: 清明梦 |
代码块进阶语法规则:
1 | > ```[language] [title] [url] [link text] |
其中,各参数意义如下:
- langugae:语言名称,引导渲染引擎正确解析并高亮显示关键字
- title:代码块标题,将会显示在左上角
- url:链接地址,如果没有指定 link text 则会在右上角显示 link
- link text:链接名称,指定 url 后有效,将会显示在右上角
url 必须为有效链接地址才会以链接的形式显示在右上角,否则将作为标题显示在左上角。以 url 为分界,左侧除了第一个单词会被解析为 language,其他所有单词都会被解析为 title,而右侧的所有单词都会被解析为 link text。
如果不想填写 title,可以在 language 和 url 之间添加至少三个空格。
可以在站点配置文件中设置 highlight.auto_detect: true 来开启自动语言检测高亮。
如果设置语言为 diff,可以在代码前添加 + 和 - 来使用如上所示的高亮增删行提示效果,在展示代码改动痕迹时比较实用。
1 | highlight: |
3.note标签
通过 note 标签可以为段落添加背景色,语法如下:
1 | {% note class %} |
支持的 class 种类包括 default primary success info warning danger,也可以不指定 class。
primary note tag
success note tag
info note tag
warning note tag
danger note tag
undefined class note tag
样式配置可在主题配置文件中进行设置
1 | note: |
4.label标签
使用label标签可以为文字添加背景色,语法如下:
1 | {% label [class]@text %} |
支持的class种类与note一致。
示例如下:
I heard the echo, from the valleys and the heart
Open to the lonely soul of sickle harvesting
Repeat outrightly, but also repeat the well-being of
Eventually swaying in the desert oasis
I believe I am
Born as the bright summer flowers
Do not withered undefeated fiery demon rule
Heart rate and breathing to bear the load of the cumbersome
Bored
可在主题配置文件中设置 label: false 来取消label标签默认CSS样式。
5.button按钮
通过button标签可以快速添加带有主题样式的按钮,语法如下:
1 | {% button /path/to/url/, text, icon [class], title %} |
也可简写为:
1 | {% btn /path/to/url/, text, icon [class], title %} |
其中, 图标ID来源于 FontAwesome 。
使用示例如下:
1 | {% btn #, 文本 %} |
6.tab标签
tab标签用于快速创建tab选项卡,语法如下
1 | {% tabs [Unique name], [index] %} |
其中,各参数意义如下:
- Unique name: 全局唯一的Tab名称,将作为各个标签页的id属性前缀
- index: 当前激活的标签页索引,如果未定义则默认选中显示第一个标签页,如果设为-1则默认隐藏所有标签页
- Tab caption: 当前标签页的标题,如果不指定则会以Unique name加上索引作为标题
- icon: 在标签页标题中添加Font awesome图标
使用示例如下:
1 | {% tabs Tab标签列表 %} |
标签页1文本内容
标签页2文本内容
标签页3文本内容
7.引用站内链接
可以通过如下语法引入站内文章的地址或链接:
1 | {% post_path slug %} |
其中,slug 表示 _post 目录下的Markdown文件名。
post_path 标签将会渲染为文章的地址,即 permalink;而 post_link 标签将会渲染为链接,可以通过 title 指定链接标题。
如以下标签将会生成 {% post_path hexo-writing-skills %}
1 | {% post_path hexo-writing-skills %} |
而以下标签则会生成 链接标题
1 | {% post_link hexo-writing-skills 链接标题 %} |
这种站内引用方式比直接使用url引用的形式更为可靠,因为即使修改了 permalink 格式,或者修改了文章的路由地址,只要Markdown文件名没有发生改变,引用链接都不会失效。
8.插入Gist
如果需要在页面内插入Gist上的代码片段时,可以使用如下标签:
1 | {% gist gist_id [filename] %} |
其中,各参数意义如下:
- gist_id: Gist仓库页面url中最后一段随机字符串
- filename: Gist中的文件名
如果Gist中只有一个文件,可以不用指定filename,也可以通过JavaScript脚本的形式直接引入,如:
1 | <script src="https://gist.github.com/Coodool/cb4ff46a3523955dd4b918dd775b6774.js"></script> |
如果Gist中有多个文件,可以在标签内输入filename来指定只引入某个文件,如果没有指定filename,将会引入Gist中的所有文件。另外,引用JavaScript脚本形式无法精确控制只引入某一个文件,将会同时引入Gist中的所有文件。
如果指定了与Gist无法匹配的filename,页面上将不会显示任何标签内容。所以,一般在Gist只有一个文件的情况下无需指定filename。
在页面中引入Gist代码段将会同时从github服务器上下载脚本与CSS样式文件,由于国内访问github服务器延迟较高,往往资源文件连接和下载的速度很慢,会阻塞页面的渲染进程导致短时白屏。
插入多媒体
插入图片
Markdown并不会保存插入的图片资源本身,只是记录了获取资源的链接。因此我们需要选择一款合适的图床来支持博客写作,目前各大云服务商都提供了对象存储服务,如七牛云KODO、又拍云USS、腾讯云COS、阿里云OSS等。
所以在Markdown中插入一张图片要分为以下几步来进行:
- 将图片资源上传到图床中
- 获取图片外链
- 插入到Markdown文档中
对于博客这种低频访问的应用场景,各大服务商的服务其实并没有显著的差异,并且前期的使用都提供了免费的流量,所以我认为图床的选择主要参考以下几个方面:
图床是否提供了便捷的图形化管理工具用于图片的上传下载?
如阿里云有ossbrowser,腾讯云有cosbrowser,七牛云有QsunSync等,但就本人使用体验来说,七牛云QsunSync的UI界面确实很拙劣,功能较为单一,而腾讯云cosbrowser的界面就相对美观优雅的多,并以Windows资源管理器的交互方式为用户提供资源的上传、下载和管理服务。

是否能够方便的插入到Markdown文档中?
这就和服务商的关系不大了,主要看主流Markdown文档编辑器对各大图床的支持程度。其实关于在Markdown中更便捷的插入图片这事儿,最上心的还是文档编辑器的开发者,为了给用户提供更方便的文档写作体验,各大文档编辑器以及支持了Markdown语法的笔记软件都花了不少心思,解决方案无外乎两种,第一种是内置图片存储服务,如有道云笔记(需付费)、石墨文档,第二种是集成了云服务商的图床服务,如Hexo Editor、Mweb等,前者插入图片方便,适用于个人笔记,而后者能够提供CDN加速服务,适用于博客等公开文档。
其中Hexo Editor支持腾讯云和七牛云的一键上传服务,MWeb支持Imgur、七牛云、又拍云,也可自定义图床服务。
本站使用腾讯云COS提供对象存储服务。
网易云音乐
在网页版云音乐中找到歌曲,点击生成外链播放器:

根据个人喜好选择播放器尺寸和播放模式:

将获取到的 iframe 代码添加到页面中,默认样式如下:
播放器宽度将会被拉长占满整个页宽,看起来有点别扭。查看控制台之后发现 iframe 在渲染的时候被处理过,外层包了一个类名为 fluid-vids 的 div 元素。顺藤摸瓜,找到了相关代码,原来是为了让嵌入的视频支持自适应布局,恰好也将 music.163.com 域名包含在了处理逻辑内,只需要将该行删除即可。
1 | var SUPPORTED_PLAYERS = [ |
这样播放器样式就变成左对齐固定宽度了,如果你还想让播放器居中,可以将 iframe 包在 <center> 标签内。
1 | <center> |
效果如下:
其实这种通过HTML标签实现CSS样式的做法并不合适,写前端代码的时候不推荐这么做,并且HTML5中也已经废除了 <center> <strong> 等纯粹为了改变样式而存在的HTML标签,HTML标签应该只负责文档结构,所有样式相关的工作应该交给CSS来实现。
如果你发现播放器前后都有空行,可以在控制台中查看元素,检查 iframe 元素前后是否多了 <br> 元素:

造成这样的原因是Markdown渲染引擎把 <center> 标签和 <iframe> 标签之间的回车当作 <br> 来处理了。参考链接: Hexo issues #1388
简单的解决方案是将HTML标签写到一行内,但这样会降低代码可编辑性。
另外一种方案是在站点配置文件中添加如下代码:
1 | marked: |
重启服务器之后更改才会生效。
网易云音乐中部分歌曲因版权保护已经无法生成外链了,即使是通过控制台强行拿到外链地址,嵌入网页后也无法播放。
Aplayer音频播放器
APlayer是由 DIYgod 编写的HTML5音频播放器,提供了另一种音频播放方案。
了解诞生背景: APlayer - 送给小狐狸和小兔子的 HTML5 播放器
借助 hexo-tag-aplayer 插件,可以通过标签的形式方便快捷的插入音频组件。
在站点根目录下执行以下命令:
1 | $ npm install hexo-tag-aplayer --save |
然后在页面中按照以下标签格式插入歌曲链接和相关信息:
1 | {% aplayer title author url [picture_url, narrow, autoplay, width:xxx, lrc:xxx] %} |
其中,各参数意义如下:
- title: 曲目标题
- author: 曲目作者
- url: 音乐文件 URL 地址
- picture_url: (可选) 音乐对应的图片地址
- narrow: (可选)播放器袖珍风格
- autoplay: (可选) 自动播放,移动端浏览器暂时不支持此功能
- width:xxx: (可选) 播放器宽度 (默认: 100%)
- lrc:xxx: (可选)歌词文件 URL 地址
示例效果如下:
当开启 Hexo 的 文章资源文件夹 功能时,可以将图片、音乐文件、歌词文件放入与文章对应的资源文件夹中,然后直接引用,示例如下:
1 | {% aplayer "Caffeine" "Jeff Williams" "caffeine.mp3" "picture.jpg" "lrc:caffeine.txt" %} |
如果想要统一实现固定宽度和居中样式,可以在自定义样式文件中添加如下样式规则
1 | //Aplayer 播放器居中 |
插入播放列表功能请参考: hexo-tag-aplayer | With playlist