OpenOffice.org向けの巧妙なバージョントラッキングソリューション

 OpenOffice.orgは1つのドキュメントについて複数のバージョンを保存できるが、この機能には実用性を制限するいくつかの欠点がある。初心者にとって、すべてのバージョンを1つのファイルに保存するのは、手持ちのすべての卵を1つのかごに放り込むようなものだ。何より、このアプローチでは、バージョンの共有やドキュメントに対する変更の管理を他のユーザとの間で行うのが難しい。本格的なバージョントラッキングシステムまたは専用のドキュメント管理ソリューションを使うという手があるが、ドキュメントの各バージョンを管理してその変更を他のユーザが把握できるシンプルな方法を求めている人にとっては行き過ぎの感がある。そこで、折衷案として浮かび上がってくるのが、OpenOffice.orgを使ってドキュメント変更のRSSフィードを管理するという方法だ。

 このソリューションの全体は、RSSフィードデータを含むWriterファイルと、OpenOffice.orgのマクロで構成される。なお、このマクロは、現在開いているバージョンのドキュメントを保存する機能と、保存したバージョンにリンクしているRSSフィード内にアイテムを作成する機能を持つ。マクロの動作がよくわかるように、まずはバージョントラッキングに必要な情報を持つRSSフィードを見てみよう。

  <?xml version="1.0"?>
  <rss version="2.0">
    <channel>
      <title>OpenOffice.org RSS Feed</title>
      <link>http://192.168.1.7</link>
      <description>A simple feed that tracks changes in OpenOffice.org documents</description>
      <language>en-us</language>
      <generator>OpenOffice.org 2.2.1</generator>

      <item>
        <title>Loremipsum.odt</title>
        <description>Initial version of the document.</description>
        <guid>http://192.168.1.7/Loremipsum.odt</guid>
      </item>

    </channel>
  </rss>

 ご覧のとおり、このフィードは、主に次の2つの部分からなるプレーンXMLファイルになっている。1つはフィードに関するメタ情報(タイトル、説明など)を含んだ静的なプリアンブル、もう1つはタイトル、説明、適切なドキュメントへのリンクなどのフィードアイテム群だ。このフィードを見れば、マクロ側ではドキュメントのバージョンを保存するたびに新しいアイテムを作成してRSSファイルに書き込めばよいことが容易にわかるだろう。

 OpenOffice.orgはプレーンテキストの読み書きはできるが、その操作はあまり得意ではない。そのため、RSSフィードを含むWriterファイル(例えば、RSS.odt)のセットアップを行う必要がある。続いてマクロは、そのファイルに新しいRSSエントリを書き込み、.xmlファイルとして保存する。RSS.odtファイルには、最初に以下のようなアイテムを持たない空のフィードを1つだけ含めておく必要がある。

  <?xml version="1.0"?>
  <rss version="2.0">
    <channel>
      <title>OpenOffice.org RSS Feed</title>
      <link>http://192.168.1.7</link>
      <description>A simple feed that tracks changes in OpenOffice.org documents</description>
      <language>en-us</language>
      <generator>OpenOffice.org 2.2.1</generator>
    </channel>
  </rss>

 RSS.odtドキュメントの準備ができたら、いよいよマクロにとりかかるとしよう。まず、2つの変数を定義してドキュメントが保存されているかどうかのチェックを行う必要がある。

  Sub AddRSSItem()
  Dim ObjSearch As Object
  Dim Args(0) As New com.sun.star.beans.PropertyValue
  ThisDoc=ThisComponent

  If ThisDoc.hasLocation=False Then
  MsgBox ("You must save the document first!", , "Attention!") :End
  End If

 次に、現在開いているドキュメントの名前を取得する。これはフィードエントリのタイトルとして使われる。

  DocURL=ThisDoc.getURL()
  FileName=Dir(DocURL, 0)

 このマクロは、RSSエントリをRSS.odtファイルに書き込んでからそれをXMLファイルとして保存するので、RSS.odtファイルのパス、結果として得られるXMLファイルの保存先のパス、XMLファイルの名前という3つの変数を指定する必要がある。

  RSSFile="ftp://user:password@192.168.1.7/web/RSS.odt"
  RSSPath="ftp://user:password@192.168.1.7/web/"
  RSSXMLFile="rss.xml"

 上の例では、RSS.odtファイルもそこから生まれるrss.xmlファイルもローカルFTPサーバ上の同じ場所に保存される。そのため、ローカルネットワーク上のユーザであれば、このRSSフィードを購読することができる。しかし、RSS.odtファイルをローカルマシン上に置いたまま、WebサーバでRSSフィードを公開することも可能だ。

 また、マクロでは、保存済みの各バージョンのユニークな識別子となるタイムスタンプを追加しなければならない。そのための方法はいくつかあるが、どんなデータを追加したいかによってその内容は変わってくる。以下のコードは、“YYYYMMDD_HH-MM-SS_”形式のプレフィックスをドキュメント名に追加するものだ。ここではRSSPathを使ってドキュメントのバージョンをrss.xmlファイルと同じ場所に保存しているため、以下のように割と簡単につなぐことができる。

  Timestamp=CDateToISO(Date) & "_" & Format(Hour(Now), "00") &_
  "-" & Format(Minute(Now), "00") & "-" &_
  Format(Second(Now), "00")
  VersionPath = RSSPath & Timestamp & "_" & FileName

 必要な要素がすべて揃ったら、マクロは、現在開いているドキュメントのタイムスタンプ付きバージョンの保存を行うことになる。

  Args(0).Name="Overwrite"
  Args(0).Value=True
  ThisDoc.storeToURL(VersionPath, Args())

 次に必要な手順は、RSSフィードを更新して変更を反映させることだ。マクロはまず、RSS.odtファイルを開いて、ユーザに変更内容の簡単な説明を入力するように求める。

  ThisDoc=StarDesktop.loadComponentFromURL(RSSFile, "_blank", 0, Array())
  ChangesDescription=InputBox("Summary of changes", "Enter a brief description of changes" , "")

 続いてマクロは、入力された情報を使って、新しいRSSエントリを生成してRSS.odtファイルに挿入する必要がある。RSS.odtファイルへのエントリ挿入は少し厄介だ。というのも、新しいエントリは</channel> </rss>タグの前に挿入しなければならないからだ。この問題を解決する方法の1つは、検索・置換のルーチンを使って、</channel>タグを探し、後ろに</channel>タグを付けた新しいRSSエントリで置き換えるというものである。もう1つ困るのが、OOoBasicの標準の検索・置換ルーチンがChr(13)というコードで指定した改行を無視する点だ。これは、RSSアイテムの全体が1つの行として挿入されることを意味する。RSSの構文解析には影響しないが、コードが読みづらくなってしまう。幸い、この問題は簡単に対処できる。正規表現を有効にし、“\n”コードを使って改行を挿入すればよい。検索・置換コードの最後のブロックは、以下のようになる。

  RSSEnd="</channel>"
  NewRSSItem=Chr(13) & "<item>\n <title>"& FileName & "</title>\n <description>" & ChangesDescription &_
  "</description>\n <guid>" & VersionPath & "</guid>\n </item>\n\n</channel>"
  ThisDoc=ThisComponent
  ObjSearch=ThisDoc.createReplaceDescriptor
  ObjSearch.SearchString=RSSEnd
  ObjSearch.ReplaceString=NewRSSItem
  ObjSearch.SearchWords=true
  ObjSearch.SearchRegularExpression=true
  nReplace=ThisDoc.ReplaceAll(ObjSearch)

 これでマクロはほぼ完成だ。あとはRSS.odtドキュメントの保存を行い、それをXMLファイルとして保存して、混乱のないように閉じておく。

  ThisDoc=ThisComponent
  ThisDoc.Store

  Args(0).Name="FilterName"
  Args(0).Value="Text"
  ThisDoc.StoreAsURL (RSSPath & RSSXMLFile, Args())

  ThisDoc.Close(True)
  End Sub

 必要な作業は以上だ。自作のバージョントラッキングソリューションは、いつでも利用できる状態になっている。RSS.odtドキュメントを好きな場所に移動してマクロ内のパスがすべて正しいことを確認したら、早速使ってみよう。これで他のユーザも、生成されたRSSフィードを購読することで、ドキュメントの変更を把握することができる。

Dmitri Popovはロシア、英国、米国、ドイツ、デンマークの各コンピュータ誌に寄稿しているフリーランスライタ。

Linux.com 原文