前言
通过长时间累积写文章,我摸索了一套Markdown书写规则,我会严格遵守并持续更新更美观的Markdown规则,通过阅读这篇文章你能更好的阅读我书写的文章
遵守相同的文章书写规范,可以让各个文章页面风格保持统一,同时对于IDE中全局搜索也更高效,在更新迭代书写规范时,可以通过IDE全局替换来更新新的书写规范
关于章节
一个HTML网页中规范只允许出现一个一级标题,这个标题通常为网站的标题。而在我的博客中,一级标题我认为是文章标题,所以文章主体中不再任何地方使用一级标题
- 文章能使用有层级的标题(
## ~###### )尽量不使用段落(- )
1 2 3 4 5
| ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 ###### 六级标题
|
Markdown渲染器自带了章节索引,尽可能使用有层级的标题有助于阅读者查阅对应的章节
可选
- 如果当前章节可根据需要而跳过,则在章节标题末尾标注
(可选)字样
版本
- 如果当前章节在特定版本下有效,则在章节标题末尾标注
(ES5)字样
章节的布局
- 如果文章需要指定环境下完成,而该环境在当前文章内没有详细说明配置方法,在
前言章节后添加准备工作章节用于描述实验环境
遇到这种情况,你需要首先确认是否已具备环境
1 2 3 4 5 6 7 8
| ## 前言
...
## 准备工作
...
|
- 如果有在已完成文章后又添加的内容,在
完成章节后添加后记章节
1 2 3 4 5 6 7 8 9 10 11
| ...
## 完成
...
## 后记
...
|
- 如果当前文章编写时有参考其他文档,在
完成章节后添加参考文献章节
1 2 3 4 5 6 7 8 9 10 11
| ...
## 完成
...
## 参考文献
[网站——作者](链接)
|
关于前言章节
- 每个文章会在第一段编写纯文本,用于描述当前文章的梗概或者这个知识点的概念,文章自述通常只有一个段落,并且没有前缀
- 如果是知识点的概念,通常我首先会去维基百科查找,如果没有的情况下在官网或Github项目主页找到描述准确的概述
1 2 3
| ## 前言
这是维基百科的描述([维基百科](https://))
|
1 2 3
| ## 前言
这是Github仓库项目的描述([Github](author/repository))
|
原因是:Hexo会自动识别更多分隔符,这样在首页就会清晰地展示每个文章标题和概述,而不会将文章主体展示在首页,当遇到感兴趣的文章点击标题或点击查看更多即可查看完整当前文章
关于参考文献章节
- 如果编写文章参阅了参考文献,会在文章末尾添加参考文献标明出处
- 如果我参阅了多个类似参考文献,通常会将我采纳的文章标注在参考文献中,如果我觉得都有值得受益的地方,会将他们罗列出来
- 如果没有编写参考文献,通常是原创,也可能是找不到出处,也可能是出处过多无法找到原始出处
关于段落
- 我通常将无序列表
- 的文本称为段落,每个段落单独一行,表示需要描述的内容
关于批注
如果两句内容基本相同,只有个别关键词不同,则将关键词加粗
在极特殊情况下使用红色文字
在已经废弃不推荐再使用的区域使用删除线
关于操作流
- 如果用于描述操作流的图片,在当前操作流下方使用
![]()展示图片
1 2 3
| - `完成`

|
- 如果操作流有快捷键,在行末尾使用
()描述快捷键组合
关于顺序
1
| - 静态属性初始化=>静态代码块=>成员属性初始化=>普通代码块=>构造方法
|
关于静态资源
- 尽可能不将除了图片以外的静态文件引入到文章中,为了避免网页响应过慢,例如:视频、音频
关于代码
- 为了能使代码高亮,我将严格定义代码域的类型
- 如果Markdown中包含了代码块内当前编程语言的类型,就指定代码块的编程语言类型为该编程语言
- 如果是终端命令则定义为
shell(实际上就是Shell语言,只不过不区分BashShell还是ZShell)
- 如果Markdown中没有包含代码块内当前编程语言的类型,用文件后缀名代替
- 如果文件没有后缀名,则定义为
text
1 2 3
| function fn() { console.log("Hello World !"); }
|
具有可选配置的代码
secret:定义密钥
具有固定返回值的代码
- 如果代码的运行结果有固定的几种结果,就在临近的
> 中展示
1
| MediaQuery.of(context).orientation;
|
Orientation.portrait:纵向
Orientation.landscape:横向
- 如果代码返回布尔值,表示是否执行成功,则使用
success作为接收返回值的变量
1
| boolean success = file.delete();
|
- 如果代码返回布尔值,表示是否存在,则使用
exist作为接收返回值的变量
1
| boolean exist = file.exists();
|
- 如果代码返回布尔值,表示是否可以,则使用
ok作为接收返回值的变量
1
| boolean ok = file.canRead();
|
- 如果代码返回布尔值,表示是或否,则使用
yes作为接收返回值的变量
1
| boolean yes = file.isFile();
|
- 如果代码返回一个数据,则使用
value作为接收返回值的变量
1
| const value = map.get("key");
|
- 如果代码返回一个函数执行结果,则使用
result作为接收返回值的变量
表示输出语句的执行结果
错误的写法
变更配置文件
固定位置的占位符
| 占位符 |
备注 |
举例 |
key |
表示键,可能是map的键,也可能是对象的属性 |
const obj = { key: "value" } |
value |
表示值 |
const value = "value" |
"str" |
表示字符串值 |
const value = "str" |
0 |
表示数值 |
const value = 0 |
obj |
对象变量名 |
const obj = {} |
fn |
函数变量名 |
fn() |
method |
方法变量名 |
obj.method() |
Cls |
类变量名 |
class Cls {} |
Father |
父类变量名 |
class Father {} |
Son |
子类变量名 |
class Son {} |
变量缺省值
<url>:URL
- 以下变量可能没有
> 来描述变量的值,则默认为以下缺省值
| 变量 |
备注 |
举例 |
<char> |
单个字符 |
'E' |
<str> |
字符串 |
"Example" |
<num> |
整型数 |
99 |
<domain> |
域名 |
example.com |
<ip> |
IP地址 |
127.0.0.1 |
<port> |
端口号 |
8080 |
<ip_local> |
本地IP地址或渗透测试时模拟的攻击者IP地址 |
127.0.0.1 |
<port_local> |
本地端口号或渗透测试时模拟的攻击者端口号 |
8080 |
<ip_remote> |
远端IP地址或渗透测试时模拟的受害者IP地址 |
12.34.56.78 |
<port_remote> |
远端端口号或渗透测试时模拟的受害者端口号 |
8080 |
<domain> |
不包含协议的域名 |
example.com、www.example.com |
<url> |
包含HTTP协议或HTTPS协议的URL链接,并不以/结尾 |
http://example.com、https://example.com、http://127.0.0.1:80、https://127.0.0.1:80 |
<url>/ |
包含HTTP协议或HTTPS协议的URL链接,并以/结尾 |
http://example.com/、https://example.com/、http://127.0.0.1:80/、https://127.0.0.1:80/ |
<dir> |
包含路径的目录名,并不以/结尾 |
/root/dir_name |
<dir>/ |
包含路径的目录名,并以/结尾 |
/root/dir_name |
<file_name> |
不含路径的文件名(不含后缀名) |
file_name |
<file> |
包含路径的文件名(含任意后缀名) |
/root/<dir_name>/<file_name>.txt、/root/<dir_name>/<file_name>.exe |
<file>.txt |
包含路径的文件名,并指定了文件的后缀名 |
/root/<dir_name>/<file_name>.txt |
<file_old>、<file_new> |
旧文件和新文件路径及文件名 |
/root/<dir_name>/<file_name>.txt |
<file_source>、<file_target> |
源文件和目标文件路径及文件名 |
/root/<dir_name>/<file_name>.txt |
<value> |
字符串类型或整型数的任意值 |
value |
<key>、<value> |
键值对,键可能是对象的键也可能是Map的键 |
<key>=<value> |
<username>、<password> |
用户名和密码 |
username=<username>&password=<password> |
<keyword> |
搜索时的关键词 |
keyword |
<shell> |
Shell命令 |
whoami |
<base64> |
base64编码的字符串 |
d2hvYW1pCg== |
<domain_or_ip> |
不包含协议的域名或IP地址 |
example.com、127.0.0.1 |
<dir_or_file> |
包含路径的目录名或文件名 |
/root/<dir_name>、/root/<dir_name>/<file_name>.txt |
关于命令
执行不同平台的命令
- 如果是执行Linux平台或MacOS的Shell命令,则使用shell代码块
不论是sh、bash、zsh,都使用shell代码块
不论是.sh脚本文件还是Shell命令行命令,都使用shell代码块
- 如果是执行Windows平台的CMD命令,则使用cmd代码块
不论是.cmd脚本文件还是CMD命令行命令,都使用cmd代码块
- 如果是执行Windows平台的Powershell命令,则使用powershell代码块
区别于powershell脚本文件,powershell脚本文件ps1使用ps1代码块
连续执行一组命令
- 如果执行一个操作需要多条命令,将多条命令放在同一个代码块中
一种命令的多种写法
- 如果执行一个操作的命令有多种写法,将多种写法的命令放在不同代码块中
执行有返回值的命令
- 如果执行命令有返回结果,就在临近的代码块中粘贴输出的结果,这个输出结果的代码块不设置语言
执行需要交互的命令
- 如果执行命令中途需要进行交互式配置,就在临近的代码块中粘贴出这个配置的问题,并提供我回复这个问题所输入的内容
1
| mysql_secure_installation
|
1
| Change the password for root ? ((Press y|Y for Yes, any other key for No) : y
|
在指定目录下执行命令
- 如果在指定目录下执行指令,则在指定语言为shell之后,指定目录,目录名以
/结尾
test/
修改指定文件
- 修改指定文件时,在指定语言后,指定文件,文件名以扩展名结尾
test.js1 2 3
| function() { console.log("Hello World !"); }
|
具有相同结构但不同参数的命令
- 在编辑一些包含多种参数的代码时,为了让结构更清晰,压缩主体代码为一个代码域,然后在代码域的上方使用
> 作为参数(或参数的键)描述,使用> > 作为参数的值描述
-m "<str>":指定提交的内容
<str>:提交内容
port:配置端口号
<num>:端口号
- 如果参数有默认值,在代码块中通常使用默认值,在描述域中通常注明
缺省值,并放在多个其他参数值列表中的第一个
- 默认值通常会作为代码示例写在代码中
text-align:配置文字对齐方向
left:缺省值,居左
center:居中
right:居右
1 2 3
| :root { text-align: left; }
|
关于目录层级
- 使用没有定义类型的代码块作为目录层级展现,文件使用
-作为前缀,目录使用+作为前缀,子级伴有缩进
1 2 3 4 5
| + 目录1 - 文件1 + 目录2 + 目录2中的目录1 - 目录2中的文件1 // 备注
|