Markdown 吐血整理經(jīng)驗大全

2020 年第一季度默勾,產(chǎn)品從 DITA 遷移到 Markdown牢酵,這讓我有幸在半年內(nèi)熟悉了 DITA 和 Markdown 兩種不同的寫作方式秸弛,也熟悉了遷移過程的各個方面医咨,總結(jié)了一些經(jīng)驗教訓(xùn)。產(chǎn)品第一季度 release 后灰追,時間相對寬裕堵幽,我想記錄下整個遷移過程中自己的所學(xué)所思,以后說不定會有用處弹澎。這篇文章我就單說 Markdown, 其它方面諸如 GitHub谐檀,我會在另一篇文章里詳述。

Markdown Tips

1. Header organization has to be consecutive (H1 > H2 > H3), if you accidentally go from H1 # to H3 #, your code will be off.

2. If content, like a list, should be indented and be a subset of the preceding content, include the subset content on a new line and indent it by two spaces or one tab.

3. Use git pull often to minimize conflicts when you merge and to ensure that you have the latest content that someone else merged.

4. Use the Visual Studio Code preview to see your output. Also use the browser preview as a guide…not always 100% accurate, but usually a good way to see your errors.

5. After you prompt the user to run a command, be sure to start the codeblock in the a new line; press the space bar three times to help with the alignment of the codeblock.

6. Use anchors for long topics. Since we are getting away from rigid concepts, task, and references, you can have different kinds of content all in one topic. Sometimes the topics get long. Anchors are built much like links.

7. Use the back tick character for surrounding coding text. You can’t use an apostrophe (‘). Use ```? in a row to begin a codeblock and end it with another ```

Markdown limitations

1. As previously mentioned, to add a list to a table cell, create your .md table, then use HTML within a cell to create your list. This should be the only time you need to use HTML within a.md file.

2. Version control can be an issue since you do not have .ditavals. The simpler you keep the versioning, the better.

3. You need to know the Style Guide and stay on top of changes. Standardization is not as easy as it is in DITA. For instance, IBM DITA writers know exactly when to use ui-control (click something is bold), and when to use wintitle (window or page is italicized). This is because the DITA tag alone takes care of the text meaning for us. Work as a team to follow the style guide and use bold, italics, lists, etc.

Markdown 標簽

剛開始不喜歡 Markdown, 覺得什么都要自己敲裁奇,沒有 DITA 標簽用的方便。對 Markdown 的用法熟記于心后麦撵,覺得敲就敲吧刽肠,也不費太多時間。但隨之而來的產(chǎn)品文檔格式不一致問題免胃,更讓人頭疼音五。每個 information developer 都用自己的方式來完成一篇文章,看起來也遵循了格式規(guī)范羔沙,可是整個文檔系統(tǒng)非常雜亂無章躺涝。舉幾個例子:

1. 代碼塊里的變量名,有人用 <install_dir>, 有人用 Install_dir扼雏。

2. 用戶需要注意的點坚嗜,有人用 **Note** 來加粗表示, 有人就用普通的 Note夯膀。

3. 有人用 html 格式的表格,有人用 Markdown 格式的表格苍蔬。

在 產(chǎn)品 800 個 DITA 文檔用 Pandoc 轉(zhuǎn)換成 Markdown 格式后诱建,文檔里有大量的格式錯誤,也充斥著大量 html 標簽碟绑,我們花了一段時間修改自己 own 的 文檔俺猿,卻沒有提前就格式統(tǒng)一問題定好規(guī)則。這個問題導(dǎo)致后來又進行了新一輪的修改格仲,費時費力押袍。

以下是目前產(chǎn)品統(tǒng)一采用的規(guī)范:

1. 去掉所有不必要的 html 標簽,比如 <table>, <span>, <img> <a href>.?? 全部使用 Markdown 格式凯肋。

例外:

- 允許使用 <br> 表示換行谊惭。

- Markdown 格式的 table 不支持 list. 盡量在 table 里不用 list。但必須用的情況下可以用 <ul> 和 <ol>否过。

2. 使用 #午笛,## ,### 表示 headings苗桂, 而不用---药磺。Use hash sign instead of dashes for headings.

示例:

# Heading 1

## Heading 2

3. 簡化表格,去掉合并單元格煤伟,因為 Markdown 表格不支持癌佩。

4. 使用 space 表示空格。

5. Use? <variable> in command and underneath use italic to describe variable.

示例:

Run the following command:

?<install_dir>/bin/ececute.sh config <instance_name>

?Where *install_dir*? is the path where the agent is installed and *instance_name* is the name that you want to give to the agent instance.

需要注意的是:

如果你把<variable_name>放到 ``` 和 ``` 之間的 codeblock 里便锨,或者 ` `之間用

monospace 表示围辙,<variable_name> 能夠正確顯示。但如果你把<variable_name>放到

** 和 ** 之間來加粗顯示放案,或者放到 * 和 * 之間來斜體顯示, markdown preview 顯示正常姚建,發(fā)布后就慘了,<variable_name>消失了你都不知道吱殉,因為命令的其他部分仍然可以顯示掸冤。用戶運行這個命令失敗,影響很大友雳。

解決辦法是用 &#60;表示 <, 用 &#62; 表示 >

6. 使用鍵盤上的 tab 鍵表示 tab稿湿。

7. 盡量去掉文檔中的截圖,因為產(chǎn)品更新太快押赊,截圖很有可能過時饺藤。

8. 使用 Acrolinx 檢查所有文檔,確保沒有 grammer、wording涕俗、trademark 等錯誤罗丰。

9. 統(tǒng)一 Tips, Important, Notes 格式。

- If there is only one sentence for the note/tip/important, use **note** and put the text right after it in one paragraph/line. It will NOT cause accessibility violation or potential violation. For example:

**Important1:**? All on same line, with no Enter. text text text text text text text text text text text text text text.

- If there are any lists under the note/tip/important, then it has to be in multiple lines. So use something like ### note, and then followed by the lists of text. But if there are more than 1 such header note,? make sure the id is unique, for example, for note 1, we can say something like ### things to note:, for note 2, we can say something like ### note, to avoid duplicate ids.

10. 所有文檔發(fā)布前統(tǒng)一用 Acrolinux 檢查語法咽袜、拼寫丸卷、標點、trademark询刹、用法等錯誤并修改谜嫉。

11. 使用 Markdown Attributes.

{:shortdesc:?.shortdesc}

Shortdesc renders as a special class in the HTML for the 1st paragraph.

Yes, one of its main roles involves retrievability. It also has some

functional roles within KC, such as the sentence that appears with links

within search results, child\nested topics, etc.?

{:screen:?.screen}

比如在 linux command line 敲了很多命令,返回了一些結(jié)果凹联,可以 copy 命令和結(jié)果到 文檔中沐兰,用以下方式表示:

```

linux command and result

```

{:screen}

{:codeblock:?.codeblock}

Markdown 的 codeblock 不帶自動復(fù)制功能,使用 {:codeblock} 可以使代碼塊能一鍵復(fù)制蔽挠。

示例:

```

code

```

{:codeblock}

{:child:?.link?.ulchildlink}

{:childlinks:?.ullinks}

用來在超級主題中表示子主題住闯。

示例:

-?{:?child}?[Installing xxx](config_xxx_install.md)

-?{:?child}?[Creating?a xxx test](config_xxx_restapi.md)

{:?childlinks}

Markdown 表格

Markdown 表格雖然方便,熟悉了寫起來也快澳淑,但坑也多比原。這里我記錄幾個坑以及如何趟過去。

1. Markdown 用 | 符號來分割每個單元格杠巡。比如:

| Tables | Are | Cool |

| ----------|-----| ------|

| col 3 is | right-aligned | $1600 |

有時候單元格內(nèi)容本身包含 |量窘。比如單元格內(nèi)容是:運行 kubectl get pods | grep ***。如就這么輸入氢拥,肯定會導(dǎo)致表格顯示出錯蚌铜。用 \| 的方式來表示 |,在 markdown preview 表格顯示無誤嫩海,但在實際發(fā)布后的文檔后表格顯示仍然有問題冬殃。正確的方式是用 | 的轉(zhuǎn)義字符 &#166;

2. 如果表格的最后一個單元格是空的,markdown preview 沒問題叁怪,發(fā)布后會發(fā)現(xiàn)表格最后一個單元格消失了审葬。解決辦法是在最后一個空單元格加空格的轉(zhuǎn)義字符 &emsp;

3. 實在需要在表格里加列表,就用 <ul> 或 <ol>奕谭。

|Tasks|References|

|-----|----------|

|View?applications?across?clusters?on?one?console.?|<ul><li>[Managing clusters on one console](managing_cluster_console.md)</li></ul>|

4. 表格后要添加標題耳璧。

示例:

{: caption="Table 1. Helm chart configuration parameters caption-side="top"}?

5. 最坑的是,但凡 Markdown 表格前有縮進展箱,整個表格即使在 markdown preview 能正常顯示,發(fā)布后一團亂蹬昌。做了很多試驗和交流后混驰,發(fā)現(xiàn) Markdown 表格前不能縮進。

舉個例子:

表格在某個步驟后:

3. Enter xxxx.

| Tables | Are | Cool |

| ----------|-----| ------|

按照 Markdown 的規(guī)矩,這個表格需要縮進栖榨,才能正確顯示在步驟 3 下面昆汹。一縮進,表格一團亂婴栽。不縮進满粗, 步驟4 顯示成步驟 1 了,表格沒有顯示在步驟3 下面的正確位置愚争。

解決辦法是不要在步驟 3 下面放這個表格映皆,直接放到文章最后,設(shè)置個錨點轰枝,直接 For more information, see [Table 1](#table1) 吧捅彻。這樣就不會有顯示問題了。

Markdown TOC (Content Of Table)

Markdown TOC 非常敏感鞍陨,但凡有一點小錯誤步淹,TOC 不會正常顯示。常見錯誤就是格式錯誤. 剛開始有問題大家就一行行的查诚撵,最近找到了個 XML 檢查工具 (https://onlinexmltools.com/validate-xml)缭裆,能自動查出問題。

Markdown 文件復(fù)制問題

云產(chǎn)品文檔里使用 YAML 文件比較多寿烟,Javascript 代碼塊也不少澈驼。從 DITA 自動轉(zhuǎn)換成 Markdown 格式后,文件格式會比較亂韧衣。 YAML 對格式要求又很高盅藻,多一個空格都會出錯〕┟可以用自動檢查工具代替肉眼檢查氏淑。Javascript 代碼塊最好是格式化后再寫入 codeblock 里。

YAML checker: https://onlineyamltools.com/validate-yaml

Javascript 格式化工具: https://tool.oschina.net/codeformat/js/

Markdown conref 文件

如何自動從 DITA conref 格式(xml)轉(zhuǎn)化成 markdown conref 格式呢硕噩? 我寫了一個 python 腳本假残,可以自動轉(zhuǎn)化 xml 格式的 conref 到 markdown conref.

注意:

1. For conref.yml file, every space is meaningful.??Even if there is only one space error, the whole conref.yml file couldn’t be used.?Conref items couldn’t be showed well in documents.?Please ensure all the items are strictly right in format.

2. You can only use one conref.md file. It’s not possible to conref content from one file? to another.

3. You cannot use conrefs in your toc.xml file.? This file is not run through the build in the same way that the other files are. It is assumed by the build that it has already been through the process to resolve the conrefs.? Spell out the conrefs in this file only.

conrefs2.xml 如下:

<?xml version="1.0" encoding="utf-8" ?>

<!-- This is list of customers -->

<keywords>

? ? <keyword id="term_dc_cloudresource1">Kubernetes dc</keyword>

? ? <keyword id="term_dcs_cloud">Kubernetes dc</keyword>? ?

</keywords>


Python 腳本如下:

#coding=utf-8

import? xml.dom.minidom

dom = xml.dom.minidom.parse('C:\\Temp\\conrefs2.xml')

root = dom.documentElement

keywords = root.getElementsByTagName("keyword")

filename = "C:\\Temp\\keyword.txt"

for keyword in keywords:

? ? print(keyword.getAttribute("id"))

? ? try:

? ? ? ? tm = keyword.getElementsByTagName("tm")[0]

? ? ? ? if tm != 'null':

? ? ? ? ? ? str=keyword.toxml()

? ? ? ? ? ? print(str)

? ? ? ? ? ? with open(filename, 'a') as file_object:

? ? ? ? ? ? ? ? file_object.write(keyword.getAttribute("id"))

? ? ? ? ? ? ? ? file_object.write(":\n? ")

? ? ? ? ? ? ? ? file_object.write(str.replace(tm.toxml(),tm.childNodes[0].data))

? ? ? ? ? ? ? ? file_object.write("\n")

? ? ? ? ? ? ? ? print(str)

? ? except BaseException:

? ? ? ? print(keyword.childNodes[0].data)

? ? ? ? with open(filename, 'a') as file_object:

? ? ? ? ? ? file_object.write(keyword.getAttribute("id"))

? ? ? ? ? ? file_object.write(":\n? ")

? ? ? ? ? ? file_object.write(keyword.childNodes[0].data)

? ? ? ? ? ? file_object.write("\n")

腳本運行結(jié)果

自動生成 Markdown conref 到 keyword.txt 文件里。

示例:

cf:

? ? Cloud Foundry

? cf-deploy-tool:

? ? Cloud Foundry deployment tool

? cfee:

? ? Cloud Foundry Enterprise Environment

如何使用 Markdown conref 文件里的 keyword:

{{site.data.keyword.xxx}}

示例:

It interates with {{site.data.keyword.cf}}

keyword 好處:

一次修改炉擅,到處使用辉懒。比如產(chǎn)品名變了,不用改動所有用到產(chǎn)品名的文檔谍失,只需要改動 conref 文件里的產(chǎn)品名對應(yīng)的 keyword眶俩。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市快鱼,隨后出現(xiàn)的幾起案子颠印,更是在濱河造成了極大的恐慌纲岭,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件线罕,死亡現(xiàn)場離奇詭異止潮,居然都是意外死亡,警方通過查閱死者的電腦和手機钞楼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門喇闸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人询件,你說我怎么就攤上這事燃乍。” “怎么了雳殊?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵橘沥,是天一觀的道長。 經(jīng)常有香客問我夯秃,道長座咆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任仓洼,我火速辦了婚禮介陶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘色建。我一直安慰自己哺呜,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布箕戳。 她就那樣靜靜地躺著某残,像睡著了一般。 火紅的嫁衣襯著肌膚如雪陵吸。 梳的紋絲不亂的頭發(fā)上玻墅,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音壮虫,去河邊找鬼澳厢。 笑死,一個胖子當著我的面吹牛囚似,可吹牛的內(nèi)容都是我干的剩拢。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼饶唤,長吁一口氣:“原來是場噩夢啊……” “哼徐伐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起募狂,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤办素,失蹤者是張志新(化名)和其女友劉穎魏保,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體摸屠,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年粱哼,在試婚紗的時候發(fā)現(xiàn)自己被綠了季二。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡揭措,死狀恐怖胯舷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绊含,我是刑警寧澤桑嘶,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站躬充,受9級特大地震影響逃顶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜充甚,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一以政、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧伴找,春花似錦盈蛮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至衰倦,卻和暖如春袒炉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背耿币。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工梳杏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人淹接。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓十性,卻偏偏與公主長得像,于是被迫代替她去往敵國和親塑悼。 傳聞我的和親對象是個殘疾皇子劲适,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容