细心的读者在阅读滇狐的编译脚本时可能已经发现了,滇狐在编译 .viki 文件的时候,将 .viki 文件头部的 KEYWORDS 命令抽取出来专门生成了一段 HTML 代码片段,并插入到了生成的 HTML 文件里指定的位置。这样一来,每篇文章尾部都可以看到一段“标签:”字样。既然每篇文章都能够通过 KEYWORDS 命令添加若干个标签,那很自然地,大家一定能想到,滇狐是不是还有另外一个脚本,能生成具有某个标签的所有页面列表,以及全部标签列表呢?

没错,的确是这样的。这个脚本是用 Bash 写的,运行效率很低,但用 Bash 写东西本来就是一件很行为艺术的事情,是滇狐业余时间最大的爱好,因此就放在这里和大家一起分享吧:

#!/usr/bin/env bash

TARGET_DIR=~/Public/html
ARGS="-m lang-zh_CN-autospace -m utf8 -m code-vim73 -t bright.html --css bright -X"

######################################################################
# Generate tags
######################################################################
rm -f $TARGET_DIR/tag_*.html
tempdir=`mktemp -d /tmp/cc-XXXXXX`

cat > "$tempdir/tags.viki" << EOF
#TITLE: 所有标签

所有标签:

EOF

for file in ~/Documents/Viki/*.viki; do
  tags=`grep ^#KEYWORDS: $file | head -1 | cut -c 1-11 --complement`
  filename=`basename "$file" .viki`
  if [ "$tags!= "" ]; then
    title=`grep ^#TITLE: $file | head -1 | cut -c 1-8 --complement`
    if [ "$title= "" ]; then
      title="<无标题文档>"
    fi
    echo "$tags" sed 's/ *; */\n/g' | (
      while read tag; do
        tagfile=$(printf 'tag_%02x_%s' \
            "$(echo -n "$tag" | wc -c)" \
            "$(echo -n "$tag" | md5sum | awk '{ print $1 }')")
        if ! -f "$tempdir/$tagfile.viki" ]; then
          echo "#TITLE: $tag" > "$tempdir/$tagfile.viki"
          echo >> "$tempdir/$tagfile.viki"
          echo "含有标签“$tag”的文章:" >> "$tempdir/$tagfile.viki"
          echo >> "$tempdir/$tagfile.viki"
        fi
        echo "  * [[$filename][$title]]" >> "$tempdir/$tagfile.viki"
        echo "[[$tagfile][$tag]]" >> "$tempdir/tags"
      done
    )
  fi
done

umask 0022

sort $tempdir/tags | \
    uniq -c | \
    sed 's/\([0-9]\+\)\s\+\(.*\)/\2{,(\1)}/' \
    >> $tempdir/tags.viki
deplate -o $TARGET_DIR/tags.html \
    -m utf8 -t bright.html --css bright \
    $tempdir/tags.viki
sed -i -e "s,TAGS_GO""ES_HERE,,$TARGET_DIR/tags.html

for file in $tempdir/tag_*.viki; do
  echo >> $file
  echo "[[tags][所有标签]]" >> $file
  base=`basename $file .viki`
  deplate -o $TARGET_DIR/$base.html $ARGS $file
  sed -i -e "s,TAGS_GO""ES_HERE,,$TARGET_DIR/$base.html
done

rm -rf "$tempdir"