1 ViKi 编译脚本

为了方便生成的 HTML 的打包与上传, 最好不要把 viki 文件与生成的 HTML 文件放在同一个目录下, 滇狐提供的 Linux 和 Windows 下的编译脚本中, 开头部分都含有目的 HTML 存放路径的定义, 请根据需要进行修改。

在 Linux 下利用 Makefile 来实现 ViKi 编译, 还挺方便的。 只要将下面的脚本存放到 viki 文件所在的文件夹, 修改“TARGET_DIR”一行, 将它指向你存放 HTML 的目的文件夹, 然后到 viki 所在文件夹下执行该脚本就可以了。

#!/bin/sh

TARGET_DIR=~/public_html/html
ARGS="-m zh-cn-autospace -m code-gvim -t bright.html --css bright -X"

rm -f Makefile

echo TARGET_DIR = $TARGET_DIR >> Makefile
echo ARGS = $ARGS >> Makefile

echo "" >> Makefile
echo "all: \\" >> Makefile
for file in *.viki
do
    echo \$\(TARGET_DIR\)/`basename $file .viki`.html \\ >> Makefile
done
echo "" >> Makefile

for file in *.viki
do
    echo "" >> Makefile
    echo \$\(TARGET_DIR\)/`basename $file .viki`.html: \
        $file build.sh >> Makefile

    echo "  deplate -d \$(TARGET_DIR) \$(ARGS) $file" >> Makefile
    echo "  echo `basename $file .viki`.html >> upload.txt" \
        >> Makefile
    echo "  rm -f $TARGET_DIR/_code_* $TARGET_DIR/deplateCodeAuto*" >> Makefile
done

make
mv upload.txt upload.bak
sort upload.bak | uniq > upload.txt
rm -f upload.bak

滇狐不在 Windows 下写 ViKi, 不过还是为仍在 Windows 下受苦的朋友们提供了使用 vbs 编写的编译脚本。 将这个脚本放到 viki 文件所在的文件夹下, 命名为 build.vbs, 修改“htmlPath”一行, 将它指向你存放 HTML 的目的文件夹, 然后到 viki 所在文件夹下双击该脚本就可以了。

On Error Resume Next

htmlPath = "C:\Documents and Settings\edward\My Documents\html"
args = "-m zh-cn-autospace -m code-gvim -t bright.html --css bright -X"

If Right(htmlPath, 1) <> "\" Then
    htmlPath = htmlPath & "\"
End If

sSelfPath = WScript.ScriptFullName
sSelfPath = Left(sSelfPath, InStrRev(sSelfPath, "\") - 1)

Set WshShell = CreateObject("WScript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")
tSelfTime = fso.GetFile(WScript.ScriptFullName).DateLastModified

Set folder = fso.GetFolder(sSelfPath)
For Each file In folder.Files
    build = false
    vikiName = file.Name
    htmlFilename = ""

    If Len(vikiName) > 5 Then
        If LCase(Right(vikiName, 5)) = ".viki" Then
            htmlFilename = htmlPath & Left(vikiName, Len(vikiName) - 5) _
                & ".html"
            If fso.FileExists(htmlFilename) Then
                Set htmlFile = fso.GetFile(htmlFilename)
                If file.DateLastModified > htmlFile.DateLastModified Or _
                    tSelfTime> htmlFile.DateLastModified Then
                    build = True
                End if
            Else
                build = True
            End if
        End if
    End If

    If build Then
        cmdLine = "deplate.exe " & args & " -d " _
            & """" & Replace(htmlPath, "\", "/") & """ " _
            & """" & Replace(file.Path, "\", "/")  & """"
        WScript.StdOut.WriteLine cmdLine
        Set oExec = WshShell.Exec("cmd.exe /c " & cmdLine & " 2>&1")
        While Not oExec.StdOut.AtEndOfStream
            Line = oExec.StdOut.ReadLine
            WScript.StdOut.WriteLine Line
        Wend
    End if
Next

cmdLine = "del """ & htmlPath & "code_*"" """ & htmlPath & "deplateCodeAuto*"""
WScript.StdOut.WriteLine cmdLine
Set oExec = WshShell.Exec("cmd.exe /c " & cmdLine & " 2>&1")
While Not oExec.StdOut.AtEndOfStream
    Line = oExec.StdOut.ReadLine
    WScript.StdOut.WriteLine Line
Wend

Set fso = Nothing
Set WshShell = Nothing

2 更新日志生成脚本

滇狐使用这段 sh 脚本生成网站的更新日志, 目前暂不提供该脚本的 Windows 版本。

#!/bin/sh

get_title()
{
    titleline="`grep '^#TITLE:' $filename`"
    title="${titleline/\\#TITLE:/}"
    title=`echo $title`
    if test "$title" = ""; then
        title="<无标题文档>"
    fi
}

list_item()
{
    get_title
    echo >> $logfile
    echo "    * [[`basename $filename .viki`][$title]]" >> $logfile
}

logtitle=`date +"%Y  %m  %d  更新日志"`
logfile=`date +"log_%Y%m%d.viki"`
echo "#TITLE: $logtitle" > $logfile
echo >> $logfile
echo $logtitle >> $logfile

for item in `grep \\.html$ upload.txt`
do
    filename=`basename $item .html`.viki
    list_item
done

touch log.viki
grep -v '#TITLE:' log.viki > log.bak

echo "#TITLE: 更新日志" > log.viki
echo >> log.viki
echo "    * [[`basename $logfile .viki`][$logtitle]]" >> log.viki
cat log.bak >> log.viki
rm -f log.bak

3 打包上传脚本

由于学校提供的服务器不支持 FTP 上传, HTTP 上传总是比较麻烦。 幸好服务器支持 zip 包的上传解压, 为了节省工作量, 滇狐使用这段脚本生成上传用的 zip 包。 从上文的编译脚本可以看出, 滇狐在编译时记录了被更新过的文件名列表, 所以打包的时候就比较简单了:

#!/bin/sh

TARGET_DIR=~/public_html
TARGET=html
ZIP_FILE=html.zip

curpath=`pwd`
pushd .

cd $TARGET_DIR
rm -f $ZIP_FILE

for file in `cat $curpath/upload.txt`
do
    zip $ZIP_FILE $TARGET/$file
done

popd

rm -f upload.txt

Windows 下的打包脚本就不提供了, 因为 xcopy 命令可以自动判断文件修改时间, 很容易自己写一个打包脚本。 而且, 大部分 Windows 机器上都不会安装 zip.exe, 所以滇狐没法提供一个通用的 zip 打包脚本。

Created with Vim deplate Logo Google Sitemaps