我现在开始使用DocBook书写文档了,blog也不例外。使用DocBook的优点就是一份源文件能够有多种展现形式,比如可以方便的输出成html, pdf, rtf等格式。现在很多blog,比如CSDN blog都有源代码模式,这样我可以使用xml书写文档,然后转化成html,最后将html源文件直接张贴到blog。这种方式一直进行得很顺利,直到有一天我的文档中包含了的代码示例。在DocBook中,代码通常包含在<programlisting>和</programlisting>之间,转化成html格式后,代码包含在<pre>和</pre>之间。通常<pre>和</pre>之间的换行符在显示时保留的,这样代码并没有使用<br>,而是直接用换行符表示换行的。但是将html源代码张贴到blog后,blog会将换行符过滤掉,最后blog中包含的代码示例就都显示在一行了。为了解决这个问题,我不得不手工的在每行代码之后增加<br>标签,如果代码行数少还好办,如果代码行比较多,无疑是一行枯燥乏味的重复劳动。
能否借助工具将<pre>和</pre>之间的代码行后面插入<br>标签呢。脚本在处理文件方面的非常强大,处理此类问题轻而易举。以下就是我写的脚本,解决了代码张贴的问题:
sed 's/<pre//n<pre/g' $1 > $2 sed -i 's/<//pre>/<//pre>/n/g' $2 sed -i '/^<pre.*<//pre>$/s/<//pre>//n<//pre>/g' $2 sed -i '/<pre/,/<//pre>/{/pre/!s/$/<br>/g}' $2
第一句是在所有<pre之间增加换行符,第二条语句在</pre>之后增加换行符,第三条语句是将<pre和</pre>同在一行的打散成两行。前三行都是为第四行转换做准备工作的,主要是sed对于单行匹配及多行匹配不好混用。第四句在所有<pre和</pre>之间的代码每行后面增加<br>。完整的脚本可以在这里获得。
可能脚本的功力还不够,如果代码行中包括pre的话,这段脚本就工作不正常,所以我又写了一个小C程序进行处理,你可以从这里获得代码。