TNC Ajax Wiki Site Module
■ サイトに、Wikiの機能を追加する
■ Ajax化により、閲覧・編集の生産性向上を図り、「知識共有」「知識創造」に寄与する
モジュールの概要
TNC AjaxWikiSite Module は、Drupal 上で、Wiki サイトを構築するためのモジュールです。

TNC AjaxWikiSite Module は、Wiki サイト構築モジュールとして、(1)Wiki 記法への対応、(2)新規ページ生成機能、(3)キーワード検索機能、(4)リビジョン管理機能、(5)編集権限管理機能など、一般的な Wiki サイトに必要な機能を提供します。それに加えて、名前に「Ajax」とあるように、Wiki の閲覧・編集に関する各種操作を Ajax 化しています。

TNC AjaxWikiSite Module は、知識共有・知識創造に寄与することを目的としてWiki 閲覧の Ajax 化と Wiki 編集の Ajax 化によりWiki の閲覧者・編集者双方の利便性向上を図りその生産性を向上させることによりWiki コンテンツの充実化と Wiki アクセスの増大化、すなわち、Wiki サイトの活性化を目指します
開発履歴
2013年12月25日 UPDATE|Drupal 8 (8.0-dev)に対応しました。Information No.0031
2011年03月08日 UPDATE|Drupal 7 に対応しました。
2011年01月16日 UPDATE|Wiki 記法を用いて、サイト管理者が登録した特定のプログラムを呼び出す機能を追加しました。
2011年01月06日 UPDATE|キーワード形式のパスと共に、ディレクトリ形式でのパスでもページにアクセスできる機能を追加しました。
2010年12月30日 UPDATE|Wiki 記法として、ブロック要素の水平配置(いわゆるカラム表示)への対応等を追加しました。
2010年12月12日 UPDATE|動的表示に対応できるようにしました。
2010年12月08日 UPDATE|単一のページにおいて他の複数のページのコンテンツを統合的に表示できる機能を追加しました。
2010年07月06日 LAUNCH|当サイトにて、実運用を開始しました。Information No.0011
(アップデート内容の詳細につきましては、このページの最下部にてインフォメーションしております。)
Wiki 閲覧の Ajax 化とWiki 編集の Ajax 化
TNC AjaxWikiSite Module は、Wiki に関わる2つの行為を Ajax 化しています。すなわち、Wiki 閲覧の Ajax 化Wiki 編集の Ajax 化です。Wiki 閲覧の Ajax 化とは、Wiki 内のリンクによるページ遷移プロセスが Ajax 化されている、ということです。そのため、ページ遷移にかかる時間が最小限に抑えられ、Wiki 閲覧者は、迅速に目的とするページにアクセスすることが可能となっています。それにより、Wiki 閲覧者の利便性向上を図り、Wiki コンテンツへのアクセスを増大させることを目指しています。また、Wiki 編集の Ajax 化とは、編集権限を持つユーザーが入力した Wiki データをプレビューしたり保存したりする作業プロセスが Ajax 化されている、ということです。そのため、Wiki によるコンテンツ作成にかかる作業時間が最小限に抑えられ、Wiki 編集者は、迅速にコンテンツの作成を行うことが可能となっています。それにより、Wiki 編集者の利便性向上を図り、新たなコンテンツの作成を支援することで、質的量的にコンテンツを充実させることを目指しています。すなわち、TNC AjaxWikiSite Module は、Wiki 閲覧の Ajax 化とWiki 編集の Ajax 化によりWiki コンテンツの充実化と Wiki アクセスの増大化を図りこの2つの善循環を作り出すことでWiki サイトの活性化を目指します。このことは、当モジュールの開発者としては、特に、知識共有・知識創造の促進を目的に、組織内のイントラネット上に Wiki サイトを構築する場合には、非常に有効に機能するのではないかと考えています。
Ajax 化を実現する2つの Wiki エンジン
TNC AjaxWikiSite Module は、Wiki 閲覧の Ajax 化とWiki 編集の Ajax 化を実現するために、2つの Wiki エンジンを実装しています。1つは、サーバーサイド(サーバー上)で機能する、 PHP というプログラミング言語で構築された Wiki エンジンです。もう1つは、クライアントサイド(ブラウザ上)で機能する、JavaScript というプログラミング言語で構築された Wiki エンジンです。そのため、TNC AjaxWikiSite Module は、Wiki のユーザー・エクスペリエンスという側面からは、「Ajax Wiki」であると言えますが、Wiki エンジンの種類という側面からは、「PHP Wiki」であると同時に「JavaScript Wiki」であると言えます。さらには、Wiki エンジンの設置場所という側面からは、「Server Side Wiki」であると同時に「Client Side Wiki」であると言えます。当然ですが、この2つの Wiki エンジンは、全く同じように機能します。Wiki においては、Ajax Wiki もしくは JavaScript Wiki という特徴だけでも非常に珍しい Wiki システムということになりますが、それに加えて、2つの Wiki エンジンを備えた「Double Engine Wiki」という特徴により、TNC AjaxWikiSite Module は、おそらく現時点では世界でも唯一の、非常にユニークな Wiki システムとなっています。
Client Side Wiki = Wiki 編集の迅速化
TNC AjaxWikiSite Module は、クライアントサイド(ブラウザ上)で機能する Wiki エンジンを持つという特徴により(= Client Side Wiki = JavaScript Wiki)、Wiki 編集者に対して、Wiki 編集作業の迅速化という利便性を提供します。Wiki 編集者は、編集対象とするページを表示させた後、編集モードに入ることにより、当該ページを編集することができるようになります。そこで、Wiki データを入力し「Convert」ボタンをクリックすることにより入力された Wiki データが、クライアントサイドの Wiki エンジンによって、ブラウザ上で一瞬にして HTML データに変換され同一画面上でプレビューすることができます。この作業は、通常の Wiki システムであれば、入力した Wiki データを一旦サーバーに送信し、サーバー上で Wiki データを HTML データに変換し、サーバーがブラウザに対して HTML データを送信する、という一連のプロセスを経ることになります。そして、このプロセスには、それなりの時間がかかります。また、想定通りの HTML データを得るために、通常、このプロセスが数回繰り返されることになります。Wiki の使用経験のある方ならご承知の通り、このプロセスが Wiki 編集者にとっては手待ち時間となり、非常にじれったい思いをすることになります。それが、Wiki 編集者を Wiki から遠ざける一因となっていたこと、すなわち、Wiki コンテンツの充実化を阻む一因となっていたことは否めないでしょう。一方、TNC AjaxWikiSite Module では、このプロセスを一瞬で行うことができます。そのため、Wiki 編集者は、じれったい思いをすることなく手待ち時間ゼロで想定通りの HTML データを作成することが可能となります(効率の向上)。そして、それにより、Wiki コンテンツの充実化(効果の向上)を目指します。
Server Side Wiki = 安全性の確保
TNC AjaxWikiSite Module は、第一義的には、知識共有・知識創造の促進を目的に、組織内のイントラネット上に Wiki サイトを構築する場合を想定して開発されていますが、公開サイトで不特定多数のユーザーを対象とする場合にも対応しています。JavaScript Wiki(= Client Side Wiki)には、前者に対して、上記のように「編集作業の迅速性」という利点があるわけですが、一方、後者に対しては、「入力されたデータの安全性」という弱点を持っています。一般的に、JavaScript Wiki の場合にも、この問題を回避する方法はありますが、そのためには、「閲覧するユーザーをブラウザの JavaScript が有効化されているユーザーに限定する」という制約が必要になります。それに対して、TNC AjaxWikiSite Module は、クライアントサイド(ブラウザ上)で機能する Wiki エンジンとは別に、サーバーサイド(サーバー上)で機能する Wiki エンジンを持つことにより(= Server Side Wiki)、そのような制約を課すことなく、この問題に対処しています。具体的には、Wiki 編集者が、ブラウザ上で機能する Wiki エンジンを活用して想定通りの HTML データができ上がったことを確認した後、「Save」ボタンをクリックすることにより、完成した Wiki データをサーバーに送信します。そして、サーバー上の Wiki エンジンが、この Wiki データを改めて HTML データに変換し、保存します(もちろん、このプロセスも Ajax 化されていますので、ネットワーク環境やサーバー能力にもよりますが、Wiki 編集者にとっては、それほどの待ち時間を要することなく実行できるようになっています)。そして、サーバー上で行われるこのプロセスにおいて、HTML インジェクション等の危険性を確実に除去することにより、通常の Web アプリケーションと同等の安全性を確保するようになっています。つまり、Wiki 閲覧者は、常に、サーバー側で安全性を確保しつつ生成された HTML データを閲覧することになる、というわけです。すなわち、TNC AjaxWikiSite Module は、クライアントサイドとサーバーサイドの2つの Wiki エンジンにより編集作業の迅速性と閲覧行為の安全性の両立を実現しています
その他の特徴
TNC AjaxWikiSite Module には、その他に、メリットとなる特徴として、(1)細かな権限設定、(2)孤立ページを回避する仕組み、(3)Wiki サイト内の巡回性を高める仕組みなどがあります。(1)については、TNC AjaxWikiSite Module は、Drupal のユーザー管理機能に依存せずに、独自の権限管理機能を実装しています。特定のログインユーザーだけに編集権限を与えることもできますし、広く非ログインユーザーに編集権限を与えることもできます。また、ページ単位(キーワード単位)で編集権限を持つユーザーの設定が可能となっていますので(この機能により、いわゆる「凍結」が可能になります)、組織の各部門毎に編集可能なページを設定するなどのことが可能となります。また、ページのアップデート権限をページの最初の作者に限定する機能があり、これにより、TNC AjaxWikiSite Module を、業務日誌などの個人単位の情報を作成・共有するなどの目的で使用することも可能となっています。(2)については、新規ページは、親ページからのリンクを経由してアクセスされた場合にのみ作成できる仕組みになっています。このため、親ページ(上位ページ)から子ページ(下位ページ)へのリンクを意図的に削除しない限り、孤立ページは存在しない仕様になっています。(3)については、(2)の孤立ページを回避する仕組みにより、フロントページを除く全てのページは、必ず、親ページを持つようになっています。そして、各ページには、親ページへのリンクを設けています。このような仕組みにより、TNC AjaxWikiSite Module による Wiki サイトにおいては、フロントページを頂点とするツリー構造が形成されることになります。そして、論理的には、Wiki 内の全てのページが、ツリー構造の上り方向・下り方向共に、直接的または間接的な Ajax リンクにより、連携されている状態となります(もちろん、当然ですが、Web のハイパーリンク機能により、ツリー構造によらない直接的な連携も可能です)。つまり、Wiki 閲覧者は、あるページから、そのページの下位ページだけでなく、そのページの上位ページにもアクセスできることになります。ささいなことですが、この特徴は、当モジュールの開発者としては、Wiki サイト構築の目的である「知識共有・知識創造」を促進することに大きく貢献するものと考えています。他にも、リビジョン削除機能ページ削除機能ページタイトル変更機能親ページ変更機能などを備えています(なお、現在のところ、差分表示機能はありません)。
実例
当サイトの Wiki ページ は、この TNC AjaxWikiSite Module により構築されています。なお、当サイトは、TransNetCreation の活動をお伝えすることを目的としているという性質上、Wiki ページの編集権限は、TransNetCreation 内部に限定しています。そのため、一般ユーザーの方が編集を行うことはできない状態となっています点につきましては、ご理解くださいますようお願い致します。また、この点は、TNC AjaxWikiSite Module を、情報発信を目的に公開サイトで使用する場合の一例として捉えていただけましたら幸いです。
開発履歴(詳細)
2013年12月25日 UPDATE|Drupal 8 (8.0-dev)に対応しました。
Drupal 8 に向けた Drupal core の開発は、現在は「API completion phase」ということで、「正式リリース(Release)」まで「Beta phase」「Release candidates」を経るのみとなっています(Drupal core release cycle)。ですから、今後も「正式リリース」に向けて Drupal 8 自体の細かい変更はあるはずですが、当モジュールにおいては、その変更の根幹部分に対する対応は今回のアップグレイドにより完了したものと考えています(※1)。今回、当モジュールのアップグレイド対応のための修正プロセスを通じて感じたことは、かなり大きな変化があった Drupal 6 から Drupal 7 へのアップグレイドに比べても、Drupal 7 から Drupal 8 へのアップグレイドは質的にその数倍の変化である、ということです。実際に、英語圏では、Apple 社が iPhone を展開したことなどを引き合いにして、それを Drupal における「破壊的イノベーション」と評する向きもあるようです。開発者の視点としては、具体的には、(1)ルーティングシステムの変更、(2)オブジェクト指向プログラミングの本格的導入、(3)コンフィギュレーションシステムの導入、(4)テーマシステムの変更などを挙げることができますが、これらからも Drupal がより大規模で高い信頼性が要求されるようなサイト構築のためのフレームワークを目指しているであろうことが見えてきます。一方で、というかそのためもあり、利用面・開発面では、特にルーティングやモジュールの変更においてはかなり繊細な対応が要求されるような面もあり(これは正式リリースまでによりよく改善される可能性もありますが)、利用者や開発者にとっては(それが良いか悪いかは別として)若干敷居が高くなりつつあるようにも感じられます。とすると、今後は、何故 Drupal なのか(その必要があるのか)ということをよく考慮する必要があるようにも思われます。
※1:ただし、現段階では、wiki 用のフロントページ(例えば、www.example.com/wiki)をサイト全体のフロントページ(例えば、www.example.com)に割り当てる設定機能(サイト全体のフロントページに wiki 用のフロントページのコンテンツを表示させるようにする設定機能)については、未対応となっています。(※2)
※2:2013年12月26日追記:追記※1に関して、Drupal 8 対応バージョンにおいてもこの機能を実装しました。

2011年03月08日 UPDATE|Drupal 7 に対応しました。
今回のアップデートにより、当モジュールを Drupal 7 上で使用することができるようになりました。また、当モジュールは、それ自身で、このモジュールにより構築されるページ内へのリンクを Ajax 化できるわけですが、今回新規に開発した TNC Ajax Site Module と併用する場合を想定し、当モジュールにおけるリンクの Ajax 化機能をオフにすることもできるようにしています。当モジュールはその名称のとおり、閲覧・編集の両面において Ajax 化していることがコア機能であるため、このような対応はその特徴の一面を取り去ることになってしまいます。しかし、ユーザーの方にとっては、Ajax 化がどのモジュールによって行われているかということよりも、むしろUIの統一性の方が重要な関心事項となると考えられるため、このような判断を採ることにしました。これにより、当サイトのように、同一サイト上で TNC Ajax Wiki Site Module と TNC Ajax Site Module を同時運用した場合においても、ユーザーの方に対して、画面の更新に際して同一のユーザー体験を提供することが可能となっています。

2011年01月16日 UPDATE|Wiki 記法を用いて、サイト管理者が登録した特定のプログラムを呼び出す機能を追加しました。
この機能により、(1)サイト管理者は、必要とするプログラムをいくつでも登録することができます(この権限はサイト管理者のみに限定されています)。そして、(2)ページの作者・編集者は、Wiki ページ中に、登録された特定のプログラムを呼び出すためのシンプルな Wiki 記法を追加することで、そのページにアクセスがあった際に、指定したプログラムを実行し、その出力結果を画面に表示できるようになります。このような機能を用いる具体例としては、「現在の時間を表示する」などの非常に単純な処理によるものから、「複数のタームのそれぞれの最新のノードをリスト化してカスタマイズ表示する」などのより複雑な処理によるもの、さらには、カレンダーやコンタクトフォームなどの特定の機能を提供するものなどが考えられます。当サイトにおいては、(1)DIARY :: AROUND THE CORNER ページ下部のナビゲーション部分と、(2)2011年以降にポストされたエントリーページ(例えば「Entity化するDrupal」)下部のコンタクトフォーム部分を、この機能により描画しています。これにより、(1)については、ナビゲーションの「THIS YEAR」と「THIS MONTH」のリンク先が、自動的にアクセス時点の日時を反映したページとなるようになっています。(2)については、本来は Field Module と連動し各エンティティ(Node を含む)の追加フィールドにおいて機能する TNC Ajax Contact Form Field Module のコードとデータを援用することにより、エンティティではない(従って、Drupal のフィールドとは全く関係のない)当モジュールによる Wiki ページ上に、Ajax 化されたコンタクトフォームを設置しています。これらに留まらず、アイディア次第、考え方次第で、単純な構成になりがちな Wiki ページをより複雑な構成にしたりより高機能化したりすることなどにより、Wiki ページの魅力や価値を高め、「知識共有」「知識創造」により貢献できるのではないかと考えています。

2011年01月06日 UPDATE|キーワード形式のパスと共に、ディレクトリ形式でのパスでもページにアクセスできる機能を追加しました。
当モジュールは基本的には Wiki の機能を提供するモジュールであるため、例えば「DIARY :: AROUND THE CORNER」というキーワードのページにアクセスする場合には、これまでは、「http://www.transnetcreation.com/wiki/DIARY%20%3A%3A%20AROUND%20THE%20CORNER」という URL を指定する必要がありました。「%20」などの記号が入っているのは、非モダンブラウザに対応するためですが、それにより、人間にとっては分かりにくい URL になってしまうというデメリットがありました。 それに対して、今回のアップデートにより、先程のページであれば、例えば「http://www.transnetcreation.com/diary」という URL でアクセスすることもできるようになりました。こうすることで、例えば、2011年01月06日の日記のエントリーページである「DIARY :: AROUND THE CORNER :: 20110106001」というキーワードのページには、「http://www.transnetcreation.com/diary/2011/01/06/001」という、よりコンテンツの内容を表す URL でアクセスすることもできるわけです(「diary」以下の「2011/01/06/001」部分については、任意に設定することができます)。今回のアップデートにより、当モジュールを、Wiki としてだけでなく、Ajax リンクによるページ遷移のないコンテンツ更新という特徴は保持しつつ、より CMS 的に使うことができるようになっています。

2010年12月30日 UPDATE|Wiki 記法として、ブロック要素の水平配置(いわゆるカラム表示)への対応等を追加しました。
今回のアップデートにより、(1)ブロック要素の水平配置ができる、(2)ブロック要素等に「style」「class」「id」属性を指定することができる、という機能を追加しました。style 属性には、CSS で用いられる全ての指定を行うことが可能です。通常の Wiki システムであればデザイン・レイアウトに関しては Wiki システムの開発者が予め用意した Wiki 記法の範囲に制約されることになりますが、今回のアップデートにより、当モジュールによる Wiki においては、デザイン・レイアウト面での自由度が大幅に広がりページの作者(=コンテンツの制作者)が、Wiki 記法を用いつつ、多様で豊かな表現をすることができるようになりました。もちろん、style 属性を指定するためには、CSS に関する知識が必要となりますが、class や id を指定することもできるため、CSS に関する知識を、管理者の方等が代替することで対応することも可能となっています。

2010年12月12日 UPDATE|動的表示に対応できるようにしました。
前回のアップデートにより「単一のページにおいて他の複数のページのコンテンツを統合的に表示する」機能を導入したことに伴い、今回のアップデートにより、動的表示にも対応できるようにしました。動的表示とは、ここでは、ページに対してリクエストがあった際に、その都度、wiki 記法で記述された文書を html データに変換・出力することを指しています。それに対して、静的表示とは、ページに対してリクエストがあった際に、予め wiki 文書から変換・保存していた html データを検索・出力することを指しています。これまで、当モジュールは、静的表示方式を採用していました。そうすることにより、サーバーの負荷を低減することができるためです。そこで、今回のアップデートにより動的表示にも対応できるようにしたわけですが、そうすることで、(前回のアップデートにより追加した機能を利用して)他のページを統合して表示しているページがある場合には、統合されているページに対して行われた変更・修正をリアルタイムで反映できるようになりました(すなわち、これが、今回、動的表示に対応した目的です)。つまり、動的表示に対応することで、(1)統合される方のページにおいては、統合している先のページのことを気にすることなく変更・修正作業を行うことができる、(2)統合している方のページにおいては、統合される元のページの変更・修正を気にすることなく、一度ページを構成してしまえば、何もしなくても、常に最新の状態を表示することができるようになります。具体的には、例えば、当サイトの日記において、新しい日記のエントリーを追加した場合、その月のマンスリー・アーカイブ(例えば 2010年12月のマンスリー・アーカイブ・ページ)に新しいエントリーのインデックスを追加するだけで、そのページを統合している全て各エントリー・ページ(例えば 2010年12月08日の日記のエントリー・ページ 等)では、常に、自動的に、その変更・修正を反映した最新のコンテンツを表示することができるようになるわけです。また、動的表示は、それが必要となる場合にのみ自動的に稼働し、それ以外の場合にはデフォルトで静的表示となるようになっています。こうすることで、動的表示に対応することによるサーバーの負荷の増加を必要最小限に抑えるようにしています。

2010年12月08日 UPDATE|単一のページにおいて他の複数のページのコンテンツを統合的に表示できる機能を追加しました。
当モジュール上で稼働する Wiki システムは、これまでは、通常の Wiki と同じように、1つのキーワードに対して対応する1つのページ(1つのコンテンツ)を表示するという仕組みになっていました。それに対して、今回のアップデートにより、コンテンツ面においては、(1)複数のページ(複数のコンテンツ)を統合したページを表示する、(2)複数の他のページで共通的に表示するコンテンツを一元的に管理する、ということができるようになります。また、デザイン面においては、(1)より複雑な画面構成が可能となる、(2)表示されるコンテンツに合わせて、ユーザーにとってより分かりやすい画面構成が可能となる、というメリットを得ることができます。具体的には、例えば、当サイトの日記の各エントリー・ページ(例えば 2010年12月08日の日記のエントリー・ページ)は、上部:「コンテンツ部分を展開しているページ」と下部:「リスト部分を展開しているページ(例えば 2010年12月のマンスリー・アーカイブ・ページ)」を統合して作成されています。このようにすることで、日記のコンテンツ部分(上部)はエントリー毎に別々で作成しつつ、 リスト部分(下部)は日記の各エントリー・ページで共通的に利用・表示する、ということが可能となっています。つまり、今回のアップデートにより、当モジュール上で稼働する Wiki を、より CMS に近い形で運用することも可能となる、というわけです。当 Wiki システムの開発者としては、今回追加した「単一のページにおいて他の複数のページのコンテンツを統合的に表示する」という機能は、「Wiki システムにおいて Ajax に対応する」という、当 Wiki システムの第一の特徴に続く、第二の大きな特徴になるものと考えています。