WebOS Goodies

WebOS の未来を模索する、ゲームプログラマあがりの Web 開発者のブログ。

WebOS Goodies へようこそ! WebOS はインターネットの未来形。あらゆる Web サイトが繋がり、共有し、協力して創り上げる、ひとつの巨大な情報システムです。そこでは、あらゆる情報がネットワーク上に蓄積され、我々はいつでも、どこからでも、多彩なデバイスを使ってそれらにアクセスできます。 WebOS Goodies は、さまざまな情報提供やツール開発を通して、そんな世界の実現に少しでも貢献するべく活動していきます。
Subscribe       

TWiki : 簡易データベースでリンク集を作る(後編)

前回に引き続き、TWiki の簡易データベース機能を利用したリンク集を構築していきます。前回はページに対して必要な付加データ(サイト名、URL、カテゴリー)を設定しました。単に Wiki でテーブルを定義するだけでフォームが追加できるのはなかなか画期的でしたね。今回はそれらのデータを活用する方法をご紹介しようと思います。

リンク集を完成させる

それでは、前回の続きをやっていきましょう。すでにデータ入力の部分は出来ているので、登録したサイトのリスト表示と、データ入力フォームへの簡便なアクセスを実装します。

全サイトのリストを表示する

まずは登録されている全サイトをリスト表示するページを作ってみましょう。Sandbox Web のトップページの「Create by Name」ボタンで「AllMyLinks」というページを作成してください。そして、そのページ内容を以下のようにします。

| *サイト名* | *カテゴリー* |
%SEARCH{"^MyLink[0-9]" scope="topic" type="regex"
nosearch="on" nototal="on" order="modified" reverse="on"
format="| [[$topic][$formfield(SiteName)]] | $formfield(Category) |"
web="Sandbox"
}%

なんだかよくわからない記述が出てきましたね。先頭行は単純なテーブルヘッダの記述です。その下の %SEARCH 以降のすべてが SEARCH という TWiki Variables の指定になっています。これは、指定された条件にマッチするページを検索し、その情報をページに挿入する TWiki Variables です。

ここではあまり深く突っ込まず、とにかく入力してみてください。昨日の記事のときに作成したページが表示されるはずです。

サイト名をクリックすれば、きちんと該当の Wiki ページに移動します。

サイトの追加のリンクを作成する

サイトを追加するたびに前回の記事でご紹介したように手動でフォームを設定するのは面倒です。ワンクリックでフォームを設定した新規ページが作成できるようにしましょう。それには、以下のリンクを AllMyLinks のページのどこかに配置します。

[[%SCRIPTURLPATH{"edit"}%/%WEB%/MyLinkXXXXXXXXXX?formtemplate=MyLinksForm][サイトの追加]]

それぞれの記述の意味は以下のようになっています。

%SCRIPTURLPATH{"edit"}%
SCRIPTURLPATH は指定したスクリプトの URL に置換される TWiki Variables です。ここでは編集ページのスクリプトの URL に置換されます。
%WEB%
現在のカレント Web の名前に置換される TWiki Variables です。
MyLinkXXXXXXXXXX
このように 10 個の連続した "X" を含むページ名を "edit" スクリプトに渡すと、"X" の部分がユニークな数字に置き換えられて新規ページが作成できます。Sandbox Web トップページの「Create TestTopic###」ボタンもこれを使っているわけですね。
formtemplate=MyLinksForm
CGI パラメータの formtemplate を指定すると、ページに特定のフォームを自動的にアタッチできます。個の場合は、"MyLinksForm" をアタッチしています。

以上、一見複雑そうですが、理解するとなんてことはありませんね。これで簡単にサイトを追加できるようになりました。

カテゴリごとのリストを作成する

次は、カテゴリー単位のリストを表示するページを作りましょう。"AllMyLinks" のページのどこかに以下の行を追加してください。

   * MyLinkLinux

それを保存すると、"MyLinkLinux" のテキストの右に "?" マークが表示されます。この "?" をクリックすると、"MyLinkLinux" のページを作成できます。このように、まだ存在しないページの Wiki ワードを記述すると、右に "?" マークが表示されてページを作成するリンクが貼られます。

さて、"MyLinkLinux" のページ内容ですが、とりあえず以下のようにしてください。

%SEARCH{"[C]ategory.*value\=.*[L]inux" type="regex"
nosearch="on" nototal="on" order="modified" reverse="on"
format="| [[$topic][$formfield(SiteName)]] | $formfield(Category) |"
web="Sandbox"
}%

検索文字列がさらに意味不明になりましたが、とりあえず気にしないでください。このようにすると、フォームの "Category" フィールドに "Linux" が設定してあるページのみを表示します。

いくつかサイトを追加してから表示したのが以下の画像です。"AllMyLinks" のページではすべてのカテゴリーのサイトが表示されていますが・・・

"MyLinkLinux" のページでは Linux のサイトしか表示されていません。

さて、ここでもうひと工夫してみましょう。先ほどの検索指定では、全ページのフォームを検索して "Category" フィールドが "Linux" になっているページを探しています。これはちょっと効率が悪いですし、他のフォームでも "Category" というフィールドがあった場合に間違ってヒットしてしまう可能性もあります。

そこで、最初にページ名が "MyLink<数字>" となっているページを検索し、その中から "Category" が "Linux" のもののみを表示するようにしてみます。それが以下の記述です。

| *サイト名* | *カテゴリー* |
%SEARCH{"^MyLink[0-9]" scope="topic" type="regex"
nosearch="on" nototal="on" order="modified" reverse="on"
format="$percntSEARCH{ \"[C]ategory.*value\=.*[L]inux\" type=\"regex\" nosearch=\"on\" nototal=\"on\" format=\"| [[$dollartopic][$dollarformfield(SiteName)]] | $dollarformfield(Category) |$n\"
web=\"Sandbox\" topic=\"$topic\" }$nop%"
web="Sandbox"
separator=""
}%

なにやらもう訳が分かりませんね。SEARCHformat 指定の中にさらに SEARCH を記述することでネストした検索を実現しているのですが、詳細は後述します。いずれにせよ、これで別のページで同じフィールド名が使われていても表示されないはずです。

Linux カテゴリにサイトを追加するリンクを作成する

"AllMyLinks" のページと同様に、サイトを追加するリンクを追加しましょう。こちらのページでサイトを追加するときには、あらかじめ Linux カテゴリーが設定されていると便利ですね。それには以下のようにします。

[[%SCRIPTURLPATH{"edit"}%/%WEB%/MyLinkXXXXXXXXXX?formtemplate=MyLinksForm&Category=Linux][サイトの追加]]

このように、CGI パラメータとして "<フィールド名>=<値>" を付加すると、フォームに初期値を設定することが出来ます。

これで Linux カテゴリのページも完成です。後はすべてのカテゴリに対して同様の作業を繰り返せば、リンク集アプリの完成です。

SEARCH について

今回は難解な %SEARCH% の記述がいくつか出てきました。それらについて補足説明をしておこうと思います。

基本的な書式

TWiki VariablesSEARCH は、以下のような書式になっています。

%SEARCH{"<検索文字列> [オプション]...}%

基本的には 検索文字列 を含むページをリストアップしますが、検索方法や表示方法はオプションで柔軟に変更できます。多数のオプションがありますが、今回使用したものだけを以下に示します。

scope
検索対象を、"topic"(ページ名のみ), "text"(本文のみ), "all"(両方)から選択します。
type
検索方法を "keyword"(キーワード検索), "literal"(完全一致検索), "regex"(正規表現検索)から選択します。
nosearch
"on" を指定すると、検索文字列 を検索結果に表示しません。
nototal
"on" を指定すると、検索結果の数を表示しません。
order
検索結果のソート方法を "topic"(ページ名順), "created"(作成日付順), "modified"(更新日付順), "editby"(最終更新者順), "formfield(name)"(フォームの name フィールド順)から選択します。
reverse
"on" を指定するとソート順序が逆になります。
format
検索結果の出力フォーマットを指定します。フォーマット指定の内部では "$〜" という形式の特殊な変数展開が使用できます。使用可能な変数のリストはリファレンスマニュアルのこちらのページをご覧ください。
separator
それぞれの検索結果表示の間に挿入する文字列を指定します。デフォルトでは改行が挿入されますが、検索結果をコンマ区切りで並べたい場合などはこのオプションで変更できます。
topic
検索対象のページ名を指定します。検索を特定のページでのみ行いたい場合に指定します。
web
検索対象となる Web を指定します。コンマ区切りで複数記述できます。"all" を指定すると全 Web が対象になります。特定の Web だけ除外したい場合は、"-TWiki" のように先頭にハイフンを付けます。

SEARCH に関する詳細はリファレンスマニュアルのこちらのページを参照してください。

検索結果のネストについて

SEARCHformat 指定の中に SEARCH を記述することで、初回の検索結果を利用してさらに検索を実行することができます。その際、format の中に記述する SEARCH は以下のエスケープを施す必要があります。

  • "%" は "$percnt" に置き換える("$percent" ではないので注意^^;)
  • ダブルクオーテーションは "\" でエスケープする
  • "$" は "$dollar" に置き換える
  • 最後の "}%" は "}$nop%" と記述する

こうすると、外側の SEARCH の検索結果それぞれに対して、format 内の SEARCH が実行されます。今回の "MyLinkLinux" のページに記述した例では、

%SEARCH{"^MyLink[0-9]" scope="topic" type="regex"
nosearch="on" nototal="on" order="modified" reverse="on"
web="Sandbox"
separator=""
}%

のそれぞれの検索結果に対して、

%SEARCH{ "[C]ategory.*value\=.*[L]inux" type="regex"
nosearch="on" nototal="on"
format="| [[$dollartopic][$dollarformfield(SiteName)]] | $formfield(Category) |$n"
web="Sandbox" topic="<検索結果のページ>"
}%"

という検索が実行されるわけです。

フォーム内容の検索について

上記の 2 回目の検索で、妙な正規表現を指定していますね。これは TWiki でフォームを検索するときのお約束のようで、こちらのページで解説されています。

どうやら、TWiki の内部ではフィールドの値を以下のような書式で保存しているようなのです。

%META:FIELD{name="OperatingSystem" title="OperatingSystem" value="OsWin"}%

ですので、あのような正規表現でこの記述を検索しているわけです。フォーム名と値の頭文字をブラケットで囲っているのは、本文にヒットしないようにするためのトリックだそうです。なぜそんな効果がでるのかはよくわかりませんが・・・(^^ゞ

ということで、TWiki のみで作成するリンク集アプリケーション、いかがだったでしょうか。私も手探りでやっているので機能的は最低限ですが、まだまだ工夫の余地はあると思います。ぜひ皆さんの手でさらに使いやすいものに仕上げてください!(他力本願^^;)

関連記事

この記事にコメントする

Recommendations
Books
「Closure Library」の入門書です。
詳しくはこちらの記事をどうぞ!
Categories
Recent Articles