2009/12/10

Apache Anakiaを使った簡易CMSの作成

anakiaについて調べてみたので、このブログに投稿する記事を生成するための簡易CMSを作ってみました。 機能は少ないですし、bloggerにポストするところも手でコピー&ペーストしています。

設計方針

このブログでは端末への入力やその結果を表示したり、 アプリケーションコードの一部を書く事が多いです。

いままでは手動で&などとクォートしていたのですが、 量が多いと面倒な事になります。 リダイレクト(>)なんかは手で書いていると、向きを間違えそうですしね。

コードを記述する場合の例

パラグラフ'p'タグの外で'code'タグやら'kbd'タグを使う場合は、'pre'タグの中に入れています。 この場合は主にCDATAを使って生のコードをそのまま書いています。

変換前:元のテキスト

<code><![CDATA[
<body>
  <h1>title</h1>
  <p>本文</p>
</body>
</code>]] >

変換後:画面には次のように表示される

<body>
  <h1>title</h1>
  <p>本文</p>
</body>

'p'タグの中でも'code'タグや'kbd'タグを使うことが出来るようになっています。 コマンドの入力$ emacs 20091210.1.xml &、コードの断片int i=0;

anakiaを使う場合の注意

Apache Anakiaをダウンロードして中にあるサンプルを変換して試すと思うのですが、 試す前に挫折してしまうかもしれません。 コマンドラインで動かそうとするとCLASSPATHの設定や附属のbuild/build.xmlはanakiaのビルド用でドキュメントの変換用ではなかったりします。

あとはデフォルトの言語が"ISO-8859-1"なので、せめてUTF-8なら良いのですが環境に合わせて適切に設定する必要もあります。

ディレクトリ構造

トップディレクトリは任意で、そこからの相対的なパスは次のようになっています。

  • apache-ant-1.7.1
  • anakia-1.0
  • xml/20091210.1.xml - 記事ファイル
  • build.sh - antを呼び出すラッパースクリプト
  • html - 出力用ディレクトリ
  • prop - 設定用ファイルを配置するディレクトリ
  • prop/build.xml - ant用設定ファイル
  • prop/site.vsl - 変換ルールを記述した
  • prop/project.xml - 今回は使わない共通テンプレートファイル
  • prop/velocity.properties - 日本語を使うならセットアップ必須
build.sh

CLASSPATHの設定が面倒なので、wrapperスクリプトを作成しました。

#!/bin/bash

BASEDIR="$(dirname $0)"
ANT_HOME="${BASEDIR}/apache-ant-1.7.1"
ANAKIA_HOME="${BASEDIR}/anakia-1.0"

## export essential variables
export ANT_HOME
export PATH="$ANT_HOME/bin:$PATH"

CP_ANT=$(find . $ANT_HOME/lib -name '*.jar' | tr '\n' ':')
CP_ANAKIA=$(find . $ANAKIA_HOME -name '*.jar' | tr '\n' ':')
export CLASSPATH=$CLASSPATH:$CP_ANT:$CP_ANAKIA

## main ##
cd "$BASEDIR"
ant -f prop/build.xml
prop/build.xml

マニュアルに附属のものをベースに変更しています。 書き方はいろいろやってみないと良く分からないですね。 "projectFile"は"${docs.src}"からの相対パスになりますが、"style"の方は先頭で指定した"${basedir}"からのパスになったりするのでパスの指定は何回かやり直しました。

anakiaに附属の例では"AnakiaTask"クラスがない場合にエラーにしていましたが、 ここではxmlファイルがwell-formedでない場合にはエラーを出すようにしています。

<project name="build-site" default="docs" basedir="..">
  <property name="docs.src" value="xml"/>
  <property name="docs.dest" value="html"/>

  <target name="validate_xml">
    <xmlvalidate failonerror="yes" lenient="yes" warn="yes"
		 classname="org.apache.xerces.parsers.SAXParser">
      <fileset dir="${docs.src}" includes="**/*.xml"/>
      <attribute name="http://xml.org/sax/features/validation" value="false"/>
      <attribute name="http://apache.org/xml/features/validation/schema"  value="false"/>
    </xmlvalidate>
  </target>
  <target name="docs" depends="validate_xml">
    <taskdef name="anakia"
	     classname="org.apache.anakia.AnakiaTask"/>
    <anakia basedir="${docs.src}" 
	    destdir="${docs.dest}"
	    extension=".html" style="prop/site.vsl"
	    projectFile="../prop/project.xml"
	    lastModifiedCheck="true"
	    velocityPropertiesFile="prop/velocity.properties">
    </anakia>
  </target>
</project>
prop/velocity.properties

linux上で動かしているのでUTF-8に設定しています。 WindowsであればShift_JISなどに変更するのが良いのでしょうね。

input.encoding=UTF-8
output.encoding=UTF-8

さいごに

anakiaは便利なんですけれど、含まれているsite.vslファイルの中では'source'タグを処理する時に'pre'開始タグがなくて、'/pre'閉じタグだけがあったり、急いでリリースしたのかなぁと思ったりします。

入出力の言語設定はvelocityの部分なので、anakiaのマニュアルには記述がありません。 それでもコードをみてvelocity.propertiesだなと当りが付けられるので、OSSで良かったです。

Velocityを直接操作しても、この程度のものは作れると思いますが、 このanakiaを触り始めて、この記事を書き上げるところまで睡眠時間を含めて通算15時間ぐらいですから、 まぁ自分の時間は節約できたと思います。 シンプルだけれど、フレームワークとしては初心者向けのはずなのに、説明不足な点が少しばかり残念です。

2009/12/10追記: 後から付けたすためのノートのテスト。

0 件のコメント: