正如我们一开始就说过的,ViKi 的主要作用是记录笔记,而笔记,免不了存在复杂的网状交叉引用,以及在发布出去之后的反复修改。因此,RSS 对于 ViKi 来说,用途非常有限。我们这里的 RSS 导出脚本所做的事情仅仅是扫描所有的 .viki 文件,将最近的 20 次修改编译所得到的 HTML 文件再通过 html2text 转回纯文本,插入到 RSS 文件中。

html2text 的具体实现在处理 & 号和双引号 " 时有一些 bug,没能正确对这两个符号的 HTML entity 做 decode,因此我们在对 html2text 的输出进行处理重新转回 html 的时候,不要对这两个符号再次做 encode。具体代码如下,使用的时候请将代码中提到的路径名称替换为你自己系统里的真实路径再使用:

#!/usr/bin/env bash

cat > html/rss.xml <<EOF
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
 <channel>
  <title>滇狐的个人主页</title>
  <description>滇狐就是既疯癫又糊涂!</description>
  <link>http://edyfox.codecarver.org/html/rss.xml</link>
  <pubDate>`date -Ru`</pubDate>
  <lastBuildDate>`date -Ru`</lastBuildDate>
  <generator>Home-brewed upload.sh 1.0</generator>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
EOF
for item in $(
for file in ~/Documents/Viki/*.viki; do
    echo `stat -c %Z $file$file
done | sort -r | head -20 | awk '{ print $2 }'
)do
  echo '  <item>' >> html/rss.xml
  echo "   <title>`grep ^#TITLE: $item | head -1 | cut -c 1-8 --complement`</title>" >> html/rss.xml
  echo '   <author>滇狐</author>' >> html/rss.xml
  echo "   <link>http://edyfox.codecarver.org/html/`basename $item .viki`.html</link>" >> html/rss.xml
  echo "   <pubDate>$(date -Ru -d @`stat -c %Z $item`)</pubDate>" >> html/rss.xml
  echo "   <guid isPermaLink=\"false\">`basename $item .viki`</guid>" >> html/rss.xml
  echo "   <description>" >> html/rss.xml
  awk '
  /TEMPLATE_BODY''_BEGIN_TAG/ {
    begin = "yes"
    next
  }
  /TEMPLATE_BODY''_END_TAG/ {
    begin = "no"
    next
  }
  begin == "yes" {
    print
  }
  ' html/`basename $item .viki`.html | \
    html2text -style pretty -width -1 -utf8 | \
    sed -e 's/&quot;/"/g' \
        -e 's/</\&lt;/g' \
        -e 's/>/\&gt;/g' \
        -e 's/&ldquo;/“/g' \
        -e 's/&rdquo;/”/g' \
        -e 's/&lsquo;/‘/g' \
        -e 's/&rsquo;/’/g' \
        -e 's/&ndash;/–/g' \
        -e 's/^/    <p>/' \
        -e 's/$/<\/p>/' \
    >> html/rss.xml
  echo "   </description>" >> html/rss.xml
  echo '  </item>' >> html/rss.xml
done
cat >> html/rss.xml <<EOF
 </channel>
</rss>
EOF