细心的读者在阅读滇狐的编译脚本时可能已经发现了,滇狐在编译
.viki 文件的时候,将 .viki 文件头部的 KEYWORDS
命令抽取出来专门生成了一段 HTML
代码片段,并插入到了生成的 HTML
文件里指定的位置。这样一来,每篇文章尾部都可以看到一段“标签:”字样。既然每篇文章都能够通过
KEYWORDS
命令添加若干个标签,那很自然地,大家一定能想到,滇狐是不是还有另外一个脚本,能生成具有某个标签的所有页面列表,以及全部标签列表呢?
没错,的确是这样的。这个脚本是用 Bash
写的,运行效率很低,但用 Bash
写东西本来就是一件很行为艺术的事情,是滇狐业余时间最大的爱好,因此就放在这里和大家一起分享吧:
TARGET_DIR=~/Public/html
ARGS="-m lang-zh_CN-autospace -m utf8 -m code-vim73 -t bright.html --css bright -X"
rm -f $TARGET_DIR/tag_*.html
tempdir=`mktemp -d /tmp/cc-XXXXXX`
cat > "$tempdir/tags.viki" << EOF
#TITLE: 所有标签
所有标签:
EOF
gen_tags() {
tags=`grep ^
filename=`basename "$1" .$2`
if [ "$tags" != "" ]; then
title=`grep ^`
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
}
for file in ~/Documents/Viki/*.viki; do
gen_tags $file viki
done
for file in ~/Documents/Viki/*.md; do
gen_tags $file md
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"