(57)【特許請求の範囲】
【請求項１】
文書内のデータが階層構造を有する複数の構成要素に分類された構造化文書をコンピュータにより処理するための方法であって、
前記コンピュータに備えられたユーザーインターフェースが、前記構造化文書を編集するための編集要求を取得する工程と、
前記コンピュータに備えられた編集ユニットが、前記編集要求を取得して、前記構造化文書に対する編集処理を実行する工程と、
前記編集ユニットが、複数の前記編集処理によって変更された前記データを全て含む前記構成要素のうち、最下位の階層を有する前記構成要素が更新されたことを通知するための文書編集通知を発行する工程と、
前記コンピュータに備えられた表示ユニットが、前記文書編集通知を取得して、前記構成要素に含まれる前記データをレイアウトする工程と、
前記ユーザーインターフェースが、改行処理要求を取得する工程と、
前記編集ユニットが、改行位置を含む第１の構成要素のテキストデータのうち、改行位置よりも後のテキストデータを削除する工程と、
前記編集ユニットが、前記第１の構成要素の後ろに新たな第２の構成要素を追加する工程と、
前記編集ユニットが、前記第２の構成要素のテキストデータとして、前記第１の構成要素のテキストデータのうち、改行位置よりも後のテキストデータを追加する工程と、
前記編集ユニットが、前記第１の構成要素が更新されたことを通知する文書編集通知を発行する工程と、
前記編集ユニットが、前記第１の構成要素の後に、前記第２の構成要素が挿入されたことを通知する文書編集通知を発行する工程と、
前記表示ユニットが、前記文書編集通知を取得して、前記第１及び第２の構成要素に含まれる前記データをレイアウトする工程と、
を含むことを特徴とする文書処理方法。
【請求項２】
前記構造化文書は、ＳＧＭＬ、ＸＭＬ、ＭＨＥＧ、ＨＴＭＬ、ＸＨＴＭＬ、およびそれらに対して拡張または限定を行った形式のうちのいずれかの形式で記述されたことを特徴とする請求項１に記載の文書処理方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、文書処理装置、文書処理方法、およびその方法をコンピュータに実行させるプログラムを記録したコンピュータ読み取り可能な記録媒体に関する。特に、本発明は、文書内のデータが階層構造を有する複数の要素に分類された構造化文書を処理するための方法、その方法を利用可能な文書処理装置、およびその方法をコンピュータに実行させるプログラムを記録したコンピュータ読み取り可能な記録媒体に関する。
【０００２】
【従来の技術】
インターネットの普及に伴い、膨大な量の文書が流通するようになった。ＷＷＷ（World Wide Web）上で公開される文書のほとんどは、ＨＴＭＬ（Hyper-Text Markup Language）によって記述されている。ＨＴＭＬによって記述された文書は、仕様で予め決められた要素を示すタグのみしか用いることができず、膨大な量の文書を効率良く処理するのに適さないという問題点が指摘されるようになった。
【０００３】
膨大な文書を効果的に活用するために、ＸＭＬ（eXtensible Markup Language）などのマークアップ言語が提唱されている。それに伴い、ＸＭＬなどのマークアップ言語によって記述された、文書内のデータが階層構造を有する複数の要素に分類された構造化文書を、簡便に、効率良く処理するための方法および装置の開発が求められている。
【０００４】
【発明が解決しようとする課題】
そこで本発明は、上記の課題を解決することのできる文書処理方法、文書処理装置、およびその方法をコンピュータに実行させるプログラムを記録したコンピュータ読み取り可能な記録媒体を提供することを目的とする。この目的は特許請求の範囲における独立項に記載の特徴の組み合わせにより達成される。また従属項は本発明の更なる有利な具体例を規定する。
【０００５】
【課題を解決するための手段】
即ち、本発明の第１の形態における文書処理装置は、文書内のデータが階層構造を有する複数の構成要素に分類された構造化文書を処理するための文書処理装置であって、文書処理装置に対するユーザーの指示を入力するためのユーザーインターフェースと、文書を表示するための処理を行う表示ユニットと、ユーザーインターフェースから伝達された指示に基づいて、構造化文書を編集するための編集コマンドを実行する編集ユニットとを備え、編集コマンドは、編集された全てのデータを含む構成要素のうち、最下位の階層を有する構成要素が更新されたことを表示ユニットに伝達する文書編集通知処理を含む。
【０００６】
本発明の第１の形態における文書処理方法は、文書内のデータが階層構造を有する複数の構成要素に分類された構造化文書を処理するための方法であって、構造化文書を編集するための編集要求を取得する工程と、編集要求を取得して、構造化文書に対する編集処理を実行する工程と、編集処理によって変更されたデータを全て含む構成要素のうち、最下位の階層を有する構成要素が更新されたことを通知するための文書編集通知を発行する工程と、文書編集通知を取得して、構成要素に含まれるデータをレイアウトする工程とを含む。
【０００７】
本発明の第２の形態における文書処理方法は、文書内のデータが階層構造を有する複数の構成要素に分類された構造化文書を処理するための方法であって、改行処理要求を取得する工程と、改行処理を実行する工程と、改行位置を含む構成要素が更新されたことを通知する文書編集通知を発行する工程と、改行位置を含む構成要素の後に、新たな構成要素が挿入されたことを通知する文書編集通知処理を発行する工程と、文書編集通知処理を取得して、構成要素に含まれるデータをレイアウトする工程とを含む。
【０００８】
構造化文書は、ＳＧＭＬ、ＸＭＬ、ＭＨＥＧ、ＨＴＭＬ、ＸＨＴＭＬ、およびそれらに対して拡張または限定を行った形式のうちのいずれかの形式で記述されても良い。
【０００９】
本発明の第１の形態における記録媒体は、コンピュータ読み取り可能な記録媒体であって、上記いずれかに記載の方法をコンピュータに実行させるためのプログラムを記録する。
【００１０】
本発明の第１の形態におけるサーバ装置は、上記いずれかに記載の方法をコンピュータに実行させるためのプログラムを格納する記録媒体と、プログラムを記録媒体から読み出してコンピュータに配信する通信装置とを備える。
【００１１】
なお上記の発明の概要は、本発明の必要な特徴の全てを列挙したものではなく、これらの特徴群のサブコンビネーションも又発明となりうる。
【００１２】
【発明の実施の形態】
以下、発明の実施の形態を通じて本発明を説明するが、以下の実施形態はクレームにかかる発明を限定するものではなく、又実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。
【００１３】
図１は、本実施形態の文書処理方法をコンピュータに実行させるためのプログラムがネットワークを介して配信される様子を示す図である。プログラムは、ダウンロードサーバ２０内に設けられたハードディスクなどの記憶媒体に格納されている。すなわち、ダウンロードサーバ２０のハードディスクは、本発明の記憶媒体の一形態である。ユーザーは、インターネット１０を介してダウンロードサーバ２０のハードディスクに格納されたプログラムをダウンロードして、利用者端末３０内に設けられたハードディスクなどの記憶媒体に格納することができる。これにより、利用者端末３０において、本実施形態の文書処理方法を実現することができる。このとき、プログラムを利用者端末３０に配信すべく、ダウンロードサーバ２０に設けられたハードディスクからプログラムを読み出す行為は、記憶媒体の使用に該当する。なお、ダウンロードサーバ２０に設けられたハードディスクに格納されたプログラムは、符号化または圧縮されたデータとして提供されても良い。本実施形態の文書処理方法をコンピュータに実行させるためのプログラムは、他にも、ＣＤ−ＲＯＭ、フロッピーディスク、メモリーカードなどの記憶媒体に格納された形で提供することができる。
【００１４】
本実施形態の文書処理装置は、ＬＡＮなどのネットワークで接続された文書サーバ４０および複数の編集端末５０によって構成されても良い。文書サーバ４０は、本実施形態のプログラムのうち、少なくとも編集ユニットを備える。編集端末５０は、本実施形態のプログラムのうち、少なくともユーザーインターフェースおよび表示ユニットを備える。この構成により、文書サーバ４０に格納された一つの文書を、複数のユーザーがそれぞれ編集端末５０を用いて編集することができる。編集端末５０は、インターネット１０を介して文書サーバ４０にアクセスしても良い。本実施形態の文書処理方法を実現するためのプログラムは、Ｊａｖａ言語などの汎用性の高い言語によって記述されているため、例えば、利用者端末３０が本実施形態のプログラムを備えていなくても、文書サーバ４０に備えられたプログラムを利用して、文書サーバ４０に格納された文書を編集することができる。
【００１５】
図２は、ダウンロードサーバ２０、利用者端末３０、文書サーバ４０、および編集端末５０などのコンピュータの構成を示す。コンピュータは、主に、入力装置６０、表示装置６２、通信装置６４、ＣＰＵ６６、メモリ６８、ハードディスク７０、外部記憶装置７２、およびバス７４を備える。入力装置６０は、キーボード、マウス、音声入力装置、タッチパネルなど、ユーザーからの情報をコンピュータに伝達するための装置を含む。表示装置６２は、液晶モニタなど、編集中の文書およびメニューなどの情報を表示するための装置を含む。通信装置６４は、インターネット１０、ＬＡＮなどの通信手段を介して所定の情報を送受信するための装置を含む。ＣＰＵ６６は、本実施形態のプログラムをロードして実行する。メモリ６８は、ＲＯＭ、ＲＡＭなどの記憶装置を含む。
【００１６】
図３以降において詳述される本実施形態の文書処理装置の機能ブロックは、プログラムが必要に応じてＣＰＵ６６に呼び出されて実行されることにより構成される。このプログラムは、通信装置６４を介してダウンロードサーバ２０から、または、外部記憶装置７２に装着されたフロッピーディスク、ＣＤ−ＲＯＭなどの可搬な記憶媒体から提供され、ハードディスク７０に格納される。プログラムは、通信装置６４を介してダウンロードサーバ２０から、または、外部記憶装置７２に装着されたフロッピーディスク、ＣＤ−ＲＯＭなどの可搬な記憶媒体から、メモリ６８に読み込まれても良い。
【００１７】
記録媒体としては、フロッピーディスク、ＣＤ−ＲＯＭの他にも、ＤＶＤ等の光学記録媒体、ＭＤ等の磁気記録媒体、ＰＤ等の光磁気記録媒体、テープ媒体、磁気記録媒体、ＩＣカードやミニチュアーカードなどの半導体メモリ等を用いることができる。このような記録媒体は、文書処理装置を製造するためにのみ使用されるものであり、そのような記録媒体の業としての製造および販売等が本出願に基づく特許権の侵害を構成することは明らかである。
【００１８】
図３は、本実施形態の文書処理装置の概略機能ブロックを示す。文書処理装置９０は、主に、ユーザーインターフェース１００、編集ユニット２００、表示ユニット３００、取消再実行処理制御ユニット４００、およびブラグインユニット５００を備える。
【００１９】
ユーザーインターフェース１００は、入力装置６０から入力されたユーザーからの指示を受けて、必要な処理を行い、編集ユニット２００、表示ユニット３００、取消再実行処理制御ユニット４００、およびプラグインユニット５００へ、指示を伝達する。編集ユニット２００は、ユーザーインターフェース１００から伝達された指示を受けて、文書に対する編集処理を行い、表示ユニット３００へ表示要求を伝達する。また取消再実行処理制御ユニット４００へ必要な指示を伝達する。表示ユニット３００は、ユーザーインターフェース１００、編集ユニット２００、またはプラグインユニット５００から伝達される表示要求を受けて、表示装置６２へ必要な情報を表示するための処理を行う。取消再実行処理制御ユニット４００は、ユーザーインターフェース１００、編集ユニット２００、またはプラグインユニット５００で行われた処理を取り消したり、再実行したりするための制御を行う。
【００２０】
プラグインユニット５００は、文書処理装置９０に追加機能を付加するためのモジュールを含む。追加機能の例としては、例えば、印刷機能、文書形式変換機能、特定のタグセットについての編集機能およびレンダリング機能などがある。プラグインユニット５００は、ユーザーインターフェース１００を介して、入力装置６０から伝達された指示を受け取る。そして、指示に応じた処理を行い、必要であれば、ユーザーインターフェース１００、編集ユニット２００、表示ユニット３００、取消再実行処理制御ユニット４００へ指示を伝達する。
【００２１】
本実施形態の文書処理装置９０は、主に、文書内のデータが階層構造を有する複数の要素に分類された構造化文書を処理するための装置である。このような構造化文書には、ＳＧＭＬ、ＸＭＬ、ＭＨＥＧ、ＨＴＭＬなど、多様な形式が提唱されており、さらに、それらに対して拡張または限定を行って新たな形式を作ることも可能である。本実施形態では、これらの形式のうち、ＸＭＬによって記述された構造化文書を例にとって説明する。ＸＭＬに関する情報は、例えば、ｈｔｔｐ：／／ｗｗｗ．ｗ３．ｏｒｇ／ＴＲ／  などから入手することができるので、本明細書中では必要に応じて説明するにとどめる。
【００２２】
本実施形態の文書処理装置９０は、ＸＭＬ文書をデータとして扱うときのアクセス方法を提供するために定められたＤＯＭ（Document Object Model）にしたがって、構造化文書を処理する。また、ＸＭＬで記述された構造化文書の表示方法を規定するために、ＣＳＳ（Cascading Style Sheets）またはＸＳＬ（XML Style Language）などの形式で記述された文書を用いる。ＤＯＭ、ＣＳＳ、ＸＳＬに関する情報も、例えば、ｈｔｔｐ：／／ｗｗｗ．ｗ３．ｏｒｇ／ＴＲ／  などから入手することができるので、本明細書中では必要に応じて説明するにとどめる。
【００２３】
図４は、ユーザーインターフェース１００の詳細な機能ブロックを示す。ユーザーインターフェース１００は、イベント解析部１１０、イベントマップ１２０、ＵＩコマンド実行部１３０、およびメニュー制御部１４０を備える。
【００２４】
イベント解析部１１０は、入力装置６０から伝達されるイベントを受信し、イベントマップ１２０を参照してイベントの内容を解析し、ＵＩコマンド実行部１３０、メニュー制御部１４０、編集ユニット２００などへ、必要な指示を伝達する。イベントマップ１２０には、入力装置６０から伝達されるイベントの種類と、イベントによって起動される処理の種類とが、対応づけて格納されている。ＵＩコマンド実行部１３０は、主に、画面のスクロール、ツールバーの表示／非表示の切り換えなど、文書の編集処理を伴わないような、ユーザーインターフェース１００に関する処理を実行する。メニュー制御部１４０は、イベント解析部１１０からメニュー表示要求が伝達されると、各種コマンドを実行するためのメニューを生成して、表示装置６２に表示するための処理を実行する。
【００２５】
図５は、編集ユニット２００の詳細な機能ブロックを示す。編集ユニット２００は、編集コマンド実行部２１０、ＤＯＭエンジン２２０、文書保持部２３０、位置情報保持部２４０、編集適否判断部２５０、および文書修正部２６０を備える。
【００２６】
編集コマンド実行部２１０は、構造化文書を編集するための各種編集コマンドを実行する。ＤＯＭエンジン２２０は、ＸＭＬ文書をデータとして扱うときのアクセス方法を提供するために定められたＤＯＭを、Ｊａｖａ言語などのプログラミング言語によって実装したものであり、文書保持部２３０に保持された対象文書にアクセスして指示された処理を実行する。位置情報保持部２４０は、対象文書の中の、カーソル位置、選択範囲の始点、選択範囲の終点、しおり位置などといった位置情報を保持する。編集適否判断部２５０は、編集コマンド実行部２１０によって実行された編集処理が適当であったか否かを判断する。文書修正部２６０は、編集コマンド実行部２１０が実行した編集処理によって編集された文書がさらに修正を必要としている場合に、修正処理を実行する。
【００２７】
図６は、表示ユニット３００の詳細な機能ブロックを示す。表示ユニット３００は、レンダリングユニット選択部３１０、レンダリング部３２０、ツリー表示処理部３３０、および表示部３４０を備える。レンダリング部３２０は、スタイル設定部３２２およびレイアウト処理部３２４を備える。
【００２８】
レンダリングユニット選択部３１０は、構造化文書の各要素に属するデータをレンダリングするためのレンダリングユニットを選択して、そのレンダリングユニットにレンダリング処理を要求する。レンダリング部３２０は、主に、ＸＨＴＭＬ（eXtended Hyper-Text Markup Language）で記述されたデータのレンダリング処理を行う。スタイル設定部３２２は、色、大きさ、フォントなどのスタイルを設定する。レイアウト処理部３２４は、テキストデータとフローティングブロックのレイアウト処理を行う。ツリー表示処理部３３０は、適切なレンダリングユニットによってレンダリングできないデータを、ツリー表示するための処理を行う。表示部３４０は、作成された表示画面データを表示装置６２に表示するための処理を行う。
【００２９】
図７から図１０を用いて、本実施形態の文書処理装置９０の動作の概要を説明する。
【００３０】
図７は、本実施形態の文書処理装置９０によって処理可能な構造化文書の例を示す。図７において、構造化文書６００は、ＸＨＴＭＬによって記述された文書である。１行目はＸＭＬ宣言であり、文書６００がＸＭＬ仕様の第１．０版に従うことと、シフトＪＩＳ形式で符号化されていることを示す。２行目は、この文書がＸＨＴＭＬによって記述されていることと、日本語で記述されていることを示す。４行目から９行目までは、文書のヘッダ情報である。
【００３１】
１０行目から２０行目は、文書６００の本体を構成するデータであり、要素「ｂｏｄｙ」に属する。要素「ｂｏｄｙ」は、その直下の階層の要素（以下、単に「子要素」という）として、３つの要素「ｄｉｖ」を含む。「ｄｉｖ」は、文書の段落に対応する要素である。１番目の要素「ｄｉｖ」は、テキストデータ「あいうえお」を含む。２番目の要素「ｄｉｖ」は、子要素「ｈｒ」を含む。要素「ｈｒ」は、終了タグを持たない空要素であり、水平線を表示するための要素である。３番目の要素「ｄｉｖ」は、テキストデータ「かきくけこ」を含む。３番目の要素「ｄｉｖ」には、左インデントが８カラムであることを示す表示属性が指定されている。要素「ｄｉｖ」のスタイルは、「段落のプロパティ」メニューによって指定することができる。
【００３２】
図８は、文書処理装置９０が構造化文書６００を読み込み、表示ユニット３００によって表示装置６２へ表示させた様子を示す。表示装置６２に表示された画面７００は、メニューバー７０２、ツールバー７０４、水平ルーラ７０６、垂直ルーラ７０８、文書表示部７１０、およびカーソル７１２を含む。
【００３３】
メニューバー７０２は、構造化文書６００を処理するために必要なコマンドをメニュー表示する。たとえば、メニューバー７０２の「ファイル」を入力装置６０の一例のマウスでクリックすると、「ファイル」メニューが表示される。ツールバー７０４は、使用頻度の特に高いコマンドをアイコン表示する。アイコンをマウスでクリックすることによりコマンドを起動することができるので、メニューを経由するよりも簡便に所望のコマンドを起動することができる。水平ルーラ７０６は、主に、カーソル７１２の水平方向の位置を示す。垂直ルーラ７０８は、主に、カーソル７１２の垂直方向の位置を示す。文書表示部７１０は、構造化文書６００をレンダリング部３２０によってレンダリングした結果を表示する。
【００３４】
文書処理装置９０は、処理すべき構造化文書６００を読み込んで文書保持部２３０に保持する。続いて、レンダリングユニット選択部３１０が、構造化文書６００のデータの名前空間を参照して、適切なレンダリングユニットを決定する。構造化文書６００は全てＸＨＴＭＬによって記述されているので、レンダリングユニット選択部３１０は、適切なレンダリングユニットとしてレンダリング部３２０を選択する。
【００３５】
まず、スタイル設定部３２２が、各要素の表示属性（スタイル）を設定する。ＸＨＴＭＬの各要素の表示属性は、デフォルトスタイルシート、ユーザースタイルシートの順に設定され、順次上書きされていく。文書中に記述されたオーサースタイルシートがある場合には、さらにオーサースタイルシートに記述された表示属性が設定される。要素ごとに表示属性が指定されている場合には、さらに要素ごとに表示属性が設定される。ここでは、３番目の要素「ｄｉｖ」に、左インデントが８カラムであるという表示属性が指定されているので、これを３番目の「ｄｉｖ」の表示属性として設定する。スタイル設定部３２２の詳細な動作については、図３７において詳述する。
【００３６】
つづいて、レイアウト処理部３２４が、テキストデータとフローティングブロックデータをレイアウトする。文書６００には、フローティングブロックがないので、テキストデータのみをレイアウト処理する。テキストデータは、１行ずつレイアウト処理される。レイアウト処理部３２４の詳細な動作については、図４１において詳述する。レンダリング部３２０によってレンダリングされた表示データは、表示部３４０によって表示装置６２へ表示される。
【００３７】
以上の説明からも分かるように、本実施形態の文書処理装置９０は、ＸＭＬなどによって記述された構造化文書を表示するためのブラウザとしての機能を有する。処理すべき文書を指定せずにプログラムが起動された場合には、対象文書として新規文書を作成しても良い。このとき、本体部分のデータを持たない文書が対象文書として作成される。表示画面７００の文書表示部７１０には何も表示されない。
【００３８】
次に、カーソル７１２の位置で、入力装置６０の一例としてのキーボードから文字列「１２３４」を入力したときの、文書処理装置９０の動作を説明する。まず、イベント解析部１１０が、キーボードからの文字列入力イベントを受信する。イベントマップ１２０には、文字列入力イベントに文字列挿入コマンドが対応づけられている。イベント解析部１１０は、イベントマップ１２０を参照し、文字列挿入コマンドを起動するよう編集ユニット２００に指示する。
【００３９】
編集コマンド実行部２１０は、イベント解析部１１０からの文字列挿入コマンド実行要求を受信して、文字列挿入コマンドを実行する。編集コマンド実行部２１０は、ＤＯＭエンジン２２０に、１番目の要素「ｄｉｖ」のテキストデータのうち、２文字目の後ろの位置に、文字列「１２３４」を挿入するよう指示する。ＤＯＭエンジン２２０は、ＤＯＭの仕様に沿って文書保持部２３０に保持された文書にアクセスし、指示された処理を実行する。このとき、後で詳述するように、位置情報保持部２４０に保持された位置情報が自動的に更新される。続いて、ＤＯＭエンジン２２０は、１番目の要素「ｄｉｖ」のテキストデータが変更されたことを通知するためのミューテーションイベントを発行し、表示ユニット３００に伝達する。
【００４０】
表示ユニット３００は、ミューテーションイベントを受信して、必要な部分を再レンダリングし、表示装置６２の画面を更新する。まず、レンダリングユニット選択部３１０が、適切なレンダリングユニットを選択する。この場合、１番目の要素「ｄｉｖ」をレンダリングするのに適切なレンダリングユニットは、レンダリング部３２０である。レンダリング部３２０のスタイル設定部３２２は、１番目の要素「ｄｉｖ」のスタイルを設定する。この場合、スタイルは変更されていないので、再設定の必要はない。レイアウト処理部３２４は、１番目の要素「ｄｉｖ」を再レイアウトする。この場合、左から順に「あい１２３４うえお」の文字列がレイアウトされる。２番目および３番目の要素「ｄｉｖ」については、フローティングブロックの影響を受けないことが明らかであるので、再レイアウトの必要はない。
【００４１】
以上のサイクルで、ユーザーから指示された処理が実行される。図９は、上記の処理が実行された後の文書６００を示す。１２行目のテキストデータが、「あいうえお」から「あい１２３４うえお」に変更されている。図１０は、上記の処理が実行された後の画面７００を示す。１段落目が、「あいうえお」から「あい１２３４うえお」に変更され、カーソル位置が「４」の後ろに移動している。
【００４２】
図１１は、メニュー制御部１４０の動作を示すフローチャートである。まず、メニュー制御部１４０は、入力装置６０を介して伝達されるメニュー表示要求を取得する（Ｓ１００）。メニュー表示要求を取得すると、カーソル位置または編集範囲位置を検出して、現在の編集位置を取得する（Ｓ１０２）。続いて、編集位置を含むデータが属する名前空間を取得する（Ｓ１０４）。編集位置が複数ある場合には、それぞれの名前空間を取得する。続いて、取得した名前空間に対応する文書型定義（ＤＴＤ：Document Type Definition）を取得する（Ｓ１０６）。文書型定義は、ＸＭＬ  Ｓｃｈｅｍａ、ＲＥＬＡＸなどの形式で記述されていても良い。続いて、必要であれば、対象文書の要素の表示規則を記述したスタイルシートを取得する（Ｓ１０８）。スタイルシートは、ＣＳＳ、ＸＳＬなどの形式で記述されていても良い。続いて、ＤＴＤと、必要であればスタイルシートとを参照して、メニューを生成する（Ｓ１１０）。続いて、表示ユニット３００にメニューを表示するよう指示する（Ｓ１１２）。
【００４３】
図１２は、ＸＭＬによって記述された構造化文書の例を示す。図１２に示した構造化文書６１０においては、名前空間「http://www.sample.com/」で識別される文書型を文書型「ｓａｍｐｌｅ」と呼ぶことにする。ＸＭＬのＤＴＤには名前空間を表現する方法がないため、図１２では文書型ＸＨＴＭＬのモジュール化ＤＴＤを想定して、文書型「ｓａｍｐｌｅ」との合成ＤＴＤを記述している。すなわち、文書型「ｓａｍｐｌｅ」に属する要素型名を全て接頭辞「ｓ：」を付加した名前に変換した文書型定義を生成し、それをＸＨＴＭＬのモジュール化ＤＴＤと合成している。ＣＳＳスタイルシートにも名前空間を表現する方法がないため、に「ｓａｍｐｌｅ」に属する要素型に対するスタイル定義は接頭辞「ｓ：」を付加した名前の要素に対するスタイル定義として記述している。以上の制限により、文書６１０内では文書型「ｓａｍｐｌｅ］に適用する名前空間接頭辞は「ｓ」に限定している。説明の都合上、図１２ではＤＴＤおよびＣＳＳを利用したが、名前空間を表現する能力を持った文書型記述言語やスタイルシート言語を用いてもよい。その場合は、上記のような制限はない。
【００４４】
文書６１０は、文書型「ｓａｍｐｌｅ」の文書型定義６１２、文書型「ｓａｍｐｌｅ」の各要素の表示属性を規定するスタイルシート６１４、および文書「ｓａｍｐｌｅ」に属する部分６１６を含む。
【００４５】
文書型定義６１２は、要素型宣言と、属性リスト宣言を含む。３行目から８行目までは、要素型宣言である。例えば、３行目の要素型宣言は要素「ｓａｍｐｌｅ」を定義しており、要素「ｓａｍｐｌｅ」が、要素「ｓｅｃｔ」または要素「ｐａｒａｇ」を１回以上含むことを規定している。また、４行目の要素型宣言は要素「ｓｅｃｔ」を定義しており、要素「ｓｅｃｔ」が、テキストデータ、要素「ｓｅｃｔ」、要素「ｐａｒａｇ」、要素「ｓｕｂ」、要素「ｂｏｌｄ」、または要素「ｉｍａｇｅ」を、０回以上含むことを規定している。また、８行目の要素型宣言は要素「ｉｍａｇｅ」を定義しており、要素「ｉｍａｇｅ」が、内容を持たない空要素タグであることを規定している。９行目は、属性リスト宣言である。これは、要素「ｉｍａｇｅ」が、「ｓｉｚｅ」という属性を必ず持つことを規定している。
【００４６】
スタイルシート６１４は、文書型「ｓａｍｐｌｅ」の各要素の表示属性を規定する。１８行目は、スタイルシート６１４が、ＣＳＳ形式で記述されていることを示す。２２行目は、要素「ｓｕｂ」が、下付き文字で表示されることを規定する。２３行目は、要素「ｂｏｌｄ」が、太字で表示されることを規定する。
【００４７】
図１３は、図１２に示した構造化文書６１０のうち、文書型「ｓａｍｐｌｅ」に属する部分６１６の階層構造を分かりやすく示した模式図である。最上位の階層の要素である「ｓａｍｐｌｅ」は、子要素として、「ｓｅｃｔ」および「ｐａｒａｇ」を含む。要素「ｓｅｃｔ」は、テキストデータ「あいうえお」、子要素「ｓｕｂ」、およびテキストデータ「かきくけこ」を含む。要素「ｓｕｂ」は、テキストデータ「１２３４」、子要素「ｂｏｌｄ」、およびテキストデータ「９０」を含む。要素「ｂｏｌｄ」は、テキストデータ「５６７８」を含む。要素「ｐａｒａｇ」は、テキストデータ「さしすせそ」および子要素「ｉｍａｇｅ」を含む。要素「ｉｍａｇｅ」は、空要素である。以上のような階層構造は、図１２に示した文書型定義６１２に従っている。すなわち、文書６１０は、妥当なＸＭＬ文書である。参照番号（１）から（１１）は、図１４以降でメニュー制御部１４０の動作を説明するために用いる。
【００４８】
図１４は、カーソル７１２が図１３における位置（４）にあるときに、メニューを表示させた様子を示す。カーソル７１２が図１３における位置（４）にあるときに、ユーザーがメニューバー７０２の「挿入」をマウスでクリックすると、「挿入」メニュー７２０が表示される。ここで、さらに、項目「タグ」にマウス位置を合わせると、「タグ」メニュー７２２の表示要求がメニュー制御部１４０に伝達される。
【００４９】
このとき、メニュー制御部１４０は、編集位置を取得する。この場合、編集位置は、カーソル７１２の位置である。続いて、メニュー制御部１４０は、編集位置の名前空間を取得し、対応する文書型を取得する。この場合、カーソル７１２の位置は、文書型「ｓａｍｐｌｅ」に属する。続いて、メニュー制御部１４０は、文書型に対応する文書型定義を取得する。この場合、「ｓａｍｐｌｅ」に対応する文書型定義は、図１２に示した文書型定義６１２である。続いて、メニュー制御部１４０は、スタイルシートを取得する。この場合、文書６１０のスタイルシートは、図１２に示したスタイルシート６１４である。続いて、メニュー制御部１４０は、メニューを生成する。ここで生成すべきメニューは、「タグ」メニュー７２２である。メニュー制御部１４０は、まず、文書型定義６１２を参照して、カーソル７１２の位置にタグを挿入しても文書型定義６１２に反しないようなタグを抽出する。
【００５０】
図１５は、文書６１０における編集位置と、その位置に挿入可能なタグとの関係を示す。今、カーソル７１２は位置（４）にあるので、位置（４）に挿入可能なタグを抽出する。位置（４）は、要素「ｓｕｂ」に含まれている。文書型定義６１２によると、要素「ｓｕｂ」が子要素として持つことができる要素は、要素「ｓｕｂ」、要素「ｂｏｌｄ」、および要素「ｉｍａｇｅ」である。したがって、これら３つのタグが、位置（４）に挿入可能なタグである。図１５においては、このような挿入可能なタグを「○」で示している。要素「ｓｅｃｔ」および要素「ｐａｒａｇ」は、要素「ｓｕｂ」の子要素になることができないので、位置（４）には挿入することができない。図１５においては、このような挿入不可能なタグを「×」または「△」で示している。「△」で示したタグは、文書修正部２６０による修正処理によって、文書型定義６１２に適合した形式に修正可能なタグである。「×」で示したタグは、文書修正部２６０による修正処理によっても、文書型定義６１２に適合した形式に修正できないタグである。文書修正部２６０の動作については、図２０において詳述する。
【００５１】
メニュー制御部１４０は、要素「ｓｕｂ」、要素「ｂｏｌｄ」、および要素「ｉｍａｇｅ」が選択可能で、要素「ｓｅｃｔ」および要素「ｐａｒａｇ」が選択不可能となるように、タグメニュー７２２を生成する。図１４においては、選択不可能な要素「ｓｅｃｔ」および要素「ｐａｒａｇ」には、取消線が表示されている。メニューのうち選択可能な項目が黒字で表示され、選択不可能な項目が灰色で表示されても良い。このとき、マウスを項目に合わせると、選択可能な項目は反転表示されるが、選択不可能な項目は反転表示されない。これにより、ユーザーは、文書型定義６１２の内容を知らなくても、カーソル７１２の位置に挿入可能なタグと、挿入不可能なタグを正しく認識することができる。また、文書型定義６１２を意識することなく、妥当なＸＭＬ文書を作成することができる。
【００５２】
ここで、タグメニュー７２２の項目「ｉｍａｇｅ」の右側には、「．．．」が表示されている。これは、項目「ｉｍａｇｅ」を選択すると、ダイアログが表示されることを示している。文書型定義６１２の属性リスト宣言によると、要素「ｉｍａｇｅ」は、必ず属性「ｓｉｚｅ」を持つ。したがって、属性「ｓｉｚｅ」を指定するためのダイアログを表示し、ユーザーに属性「ｓｉｚｅ」の指定を促す。これにより、ユーザーは、文書型定義６１２を意識することなく、妥当なＸＭＬ文書を作成することができる。
【００５３】
メニュー制御部１４０は、さらにスタイルシート６１４を参照してタグメニュー７２２を生成しても良い。スタイルシート６１４によると、要素「ｓｅｃｔ」および要素「ｐａｒａｇ」は、段落タイプとしての表示属性を持ち、要素「ｓｕｂ」および要素「ｂｏｌｄ」は、文字タイプとしての表示属性を持つ。したがって、要素「ｓｅｃｔ」および要素「ｐａｒａｇ」をひとまとまりに表示し、要素「ｓｕｂ」および要素「ｂｏｌｄ」をひとまとまりに表示しても良い。このように、表示属性にしたがって分類表示することで、より分かりやすく操作しやすいメニューにすることができる。
【００５４】
図１４においては、要素「ｓｅｃｔ」および要素「ｐａｒａｇ」という「△」で示された要素を選択不可能にしたが、これらの要素を選択できるようにしても良い。このとき、文書型定義６１２に適合するように、文書６１０の階層構造を修正しても良い。階層構造の修正を実行するか否かをユーザーに問い合わせても良い。修正の方法については、図２０において詳述する。
【００５５】
図１６は、範囲７２４を選択している状態で、メニューを表示させた様子を示す。ユーザーが、範囲７２４を選択してからメニューバー７０２の「書式」をマウスでクリックすると、「書式」メニュー７２６が表示される。ここで、さらに、項目「範囲のタグ化」にマウス位置を合わせると、「範囲のタグ化」メニュー７２８の表示要求がメニュー制御部１４０に伝達される。
【００５６】
このとき、メニュー制御部１４０は、編集位置を取得する。この場合、編集位置は、範囲７２４である。続いて、メニュー制御部１４０は、編集位置の名前空間を取得する。この場合、範囲７２４の名前空間は、「ｓａｍｐｌｅ」である。続いて、メニュー制御部１４０は、名前空間に対応する文書型定義を取得する。この場合、「ｓａｍｐｌｅ」に対応する文書型定義は、図１２に示した文書型定義６１２である。続いて、メニュー制御部１４０は、ＣＳＳを取得する。この場合、文書６１０のＣＳＳは、図１２に示したスタイルシート６１４である。続いて、メニュー制御部１４０は、メニューを生成する。ここで生成すべきメニューは、「範囲のタグ化」メニュー７２８である。メニュー制御部１４０は、まず、文書型定義６１２を参照して、範囲７２４をタグ化しても文書型定義６１２に反しないようなタグを抽出する。
【００５７】
図１７は、文書６１０における編集範囲と、その範囲をタグ化可能なタグとの関係を示す。今、位置（１１）から位置（１２）までの範囲７２４が選択されているので、この範囲のテキストデータを新たな子要素に変換しても文書型定義６１２に反しないようなタグを抽出する。範囲７２４は、要素「ｐａｒａｇ」に含まれている。文書型定義６１２によると、要素「ｐａｒａｇ」が子要素として持つことができる要素は、要素「ｓｕｂ」、要素「ｂｏｌｄ」、および要素「ｉｍａｇｅ」である。したがって、これら３つのタグが、範囲７２４をタグ化可能なタグである。要素「ｓｅｃｔ」および要素「ｐａｒａｇ」は、要素「ｐａｒａｇ」の子要素になることができないので、範囲７２４をこれらのタグにタグ化することができない。
【００５８】
メニュー制御部１４０は、要素「ｓｕｂ」、要素「ｂｏｌｄ」、および要素「ｉｍａｇｅ」が選択可能で、要素「ｓｅｃｔ」および要素「ｐａｒａｇ」が選択不可能となるように、「範囲のタグ化」メニュー７２８を生成する。図１６においては、選択不可能な要素「ｓｅｃｔ」および要素「ｐａｒａｇ」には、取消線が表示されている。メニューのうち選択可能な項目が黒字で表示され、選択不可能な項目が灰色で表示されても良い。このとき、マウスを項目に合わせると、選択可能な項目は反転表示されるが、選択不可能な項目は反転表示されない。これにより、ユーザーは、文書型定義６１２の内容を知らなくても、範囲７２４をタグ化可能なタグと、タグ化不可能なタグを正しく認識することができる。また、文書型定義６１２を意識することなく、妥当なＸＭＬ文書を作成することができる。
【００５９】
図１８は、カーソル７１２が図１３における位置（４）にあるときに、文書表示部７１０の中でマウスを右クリックしてメニューを表示させた様子を示す。カーソル７１２が図１３における位置（４）にあるときに、ユーザーがマウスの右クリックなどの動作によってメニュー表示要求を発すると、「文書編集」メニュー７３０が表示される。ここで、さらに、項目「挿入」にマウス位置を合わせると、「挿入」メニュー７２０が表示され、さらに、項目「タグ」にマウス位置を合わせると、「タグ」メニュー７２２の表示要求がメニュー制御部１４０に伝達される。このときのメニュー制御部１４０の動作については、図１４において説明した動作と同様である。
【００６０】
このように、文書中の要素の階層構造を変更するような編集処理を行う場合、文書型定義に反するような文書が生成してしまう恐れがある。このため、メニュー制御部１４０は、文書型定義を参照して、文書型定義に適合しない階層構造を生成する編集処理を選択できないようなメニューを生成する。文書型定義に適合しない階層構造を生成する編集処理が選択されたときに、ユーザーに注意を喚起するような構成であっても良い。文書型定義に適合しない階層構造を生成する編集処理が選択されたときに、文書型定義に適合するよう階層構造を修正しても良い。
【００６１】
文書処理装置９０が、ある特定の名前空間のデータを処理するためのプラグインユニット５００を有していても良い。メニュー表示要求が伝達されたときに、そのときの編集位置に対応する名前空間のデータを処理するためのプラグインユニット５００が存在する場合には、そのプラグインユニット５００がメニューを表示しても良い。これによれば、ユーザーは、名前空間を意識することなく、文書中の各データを処理するのに適したプラグインユニット５００のメニューを表示させることができる。
【００６２】
図１９は、編集適否判断部２５０の動作を示すフローチャートである。編集適否判断部２５０は、編集コマンド実行部２１０が実行する編集コマンドが、適当か否かを判断する。前述のメニュー制御部１４０は、メニュー表示時にその編集コマンドの適否を判断したが、編集適否判断部２５０は、編集コマンドの実行要求が伝達されたときに、その編集コマンドの適否を判断する。
【００６３】
編集適否判断部２５０は、編集コマンドの実行要求が伝達されると、その編集コマンドが階層構造の変化を伴うか否かを判断する（Ｓ２０２）。テキストデータのみの挿入、削除、変更など、階層構造の変化を伴わないような編集処理の場合は、Ｎへ進み、その編集コマンドの実行を許可する（Ｓ２１４）。新たな要素が追加されたり、要素が削除されたりするような、階層構造の変化を伴う編集処理が要求されたときは、Ｙへ進み、文書型定義が取得できるか否かを判断する（Ｓ２０４）。文書型定義が取得できない場合は、Ｎへ進み、アラーム処理を行ってユーザーに注意を喚起し（Ｓ２１０）、その編集コマンドの実行を禁止する（Ｓ２１２）。これは、文書型定義に適合しない文書を生成してしまう恐れがあるからである。妥当なＸＭＬ文書を生成する必要がない場合は、文書型定義の取得の可否に関わらず、編集コマンドの実行を許可しても良い。この場合、編集の結果生成したＸＭＬ文書が適正形式であるか否かを判断する工程を設けても良い。
【００６４】
Ｓ２０４において、文書型定義が取得できた場合は、Ｙへ進み、要求されている編集コマンドを実行した結果生成する文書が、文書型定義に適合するか否かを判断する（Ｓ２０６）。編集コマンドを実行した結果生成する文書が、文書型定義に適合している場合は、Ｙへ進み、編集コマンドの実行が許可される（Ｓ２１４）。編集コマンドを実行した結果生成する文書が、文書型定義に適合していない場合は、Ｎへ進み、編集を実行するか否かをユーザーに問い合わせる（Ｓ２０８）。ユーザーが、文書型定義に適合しない文書が生成するのを認識した上で、その編集コマンドを実行するよう要求した場合には、編集コマンドの実行を許可する（Ｓ２１４）。このとき、文書型定義に適合するよう、階層構造を修正しても良い。階層構造を修正するか否かをユーザーに問い合わせても良い。Ｓ２０８において、ユーザーが編集を実行しないと判断した場合には、Ｎへ進み、アラーム処理が行われ（Ｓ２１０）、編集コマンドの実行が禁止される（Ｓ２１２）。
【００６５】
Ｓ２０８において、編集を実行するか否かをユーザーに問い合わせずに、編集を禁止しても良い。編集を実行するか否かをユーザーに問い合わせずに、アラーム処理を行った後、編集を許可しても良い。
【００６６】
以上のような動作により、妥当なＸＭＬ文書ではない文書が生成してしまうような編集処理が実行されようとしたときに、ユーザーに注意を喚起し、その編集処理を適正に禁止することができるので、ユーザーが文書型定義を意識しなくとも、妥当なＸＭＬ文書を作成することができる。
【００６７】
編集の適否を判断するタイミングは、編集コマンド実行時に限られない。例えば、編集位置が、異なる名前空間のデータの位置に変更されたときに、それまでの編集処理によって生成した文書が、文書型定義に適合しているか否かを判断しても良い。また、文書に対する処理を終了して記録媒体に保存する際に、それまでの編集処理によって生成した文書が、文書型定義に適合しているか否かを判断しても良い。この場合も、図１９に示した方法によって編集の適否を判断することができる。このように、編集コマンド実行ごとに判断するのではなく、編集処理が終了した段階で一括して判断する方法によれば、文書を編集しているときに一時的に文書型定義に適合しない文書を経由してしまう場合に、アラーム処理を行わずに編集処理を続行することができる。
【００６８】
図２０は、文書修正部２６０の動作を示すフローチャートである。文書修正部２６０は、編集コマンドの実行によって生成した文書に修正が必要であるか否かを判断し、修正が必要である場合には、適当な修正を施す。
【００６９】
まず、文書修正部２６０は、編集処理によって生成した文書が、階層構造の修正を必要とするか否かを判断する（Ｓ２５２）。修正が必要でない場合には、Ｎへ進み、文書修正部２６０における処理を終了する。修正が必要である場合には、Ｙへ進み、修正処理を実行するか否かをユーザーに問い合わせる（Ｓ２５４）。ユーザーが修正を実行しないと判断した場合には、Ｎへ進み、文書修正部２６０における処理を終了する。ユーザーが修正を実行すると判断した場合には、Ｙへ進み、修正処理を実行する（Ｓ２５６）。ユーザーに問い合わせずに、修正処理を実行しても良い。
【００７０】
図２１（ａ）（ｂ）は、文書修正部２６０の動作の例を説明するための図である。図２１（ａ）は、図１３において、位置（４）にタグ「ｓｅｃｔ」を挿入した様子を示す。図１２に示した文書型定義６１２によると、要素「ｓｕｂ」は、要素「ｓｅｃｔ」を子要素として持てないので、このままの状態では、文書６１０は妥当なＸＭＬ文書ではない。
【００７１】
図２１（ｂ）は、図２１（ａ）に示した文書６１０を、文書型定義６１２に適合するように修正した例を示す。要素「ｓｅｃｔ」は、要素「ｓｕｂ」の子要素にはなれないので、要素「ｓｕｂ」から上の階層へ辿り、要素「ｓｅｃｔ」を子要素として持てるような要素を探す。この場合、要素「ｓｕｂ」の直上の階層にある要素（以下、単に「親要素」という）である要素「ｓｅｃｔ」が、要素「ｓｅｃｔ」を子要素に持つことができる。そこで、要素「ｓｅｃｔ」を要素「ｓｕｂ」の子要素として挿入するのではなく、要素「ｓｅｃｔ」の子要素として挿入する。すなわち、要素「ｓｕｂ」を２つに分割して、分割した間に、要素「ｓｅｃｔ」を挿入する。これにより、ユーザーが要求した位置と同じ場所に、文書型定義に適合する形で、要素「ｓｅｃｔ」を挿入することができる。以上が、図２０における修正処理Ｓ２５６の詳細である。
【００７２】
図１５において、三角の印がついているタグを挿入する場合には、上記と同様な方法によって、文書型定義に適合するように文書を修正することができる。例えば、位置（６）に新たにタグを挿入する場合について説明する。位置（６）は、要素「ｂｏｌｄ」に含まれている。文書型定義６１２によると、要素「ｂｏｌｄ」は、子要素として要素「ｉｍａｇｅ」を持つことができる。他の要素を挿入するときには、文書修正部２６０による修正が必要となる。要素「ｓｕｂ」および要素「ｂｏｌｄ」を挿入する場合は、要素「ｂｏｌｄ」の一つ上の階層である要素「ｓｕｂ」の子要素として挿入することができる。要素「ｓｅｃｔ」および要素「ｐａｒａｇ」を挿入する場合には、要素「ｂｏｌｄ」の二つ上の階層である要素「ｓｅｃｔ」の子要素として挿入することができる。
【００７３】
図１５において、位置（１）に新たにタグを挿入する場合について説明する。要素「ｓａｍｐｌｅ」が内容として持てる要素は、要素「ｓｅｃｔ」および要素「ｐａｒａｇ」に限られるので、要素「ｓｕｂ」、要素「ｂｏｌｄ」、および要素「ｉｍａｇｅ」は位置（１）に挿入することができない。この場合は、修正によって文書型定義６１２に適合させることもできないので、メニュー制御部１４０は、要素「ｓｕｂ」、要素「ｂｏｌｄ」、および要素「ｉｍａｇｅ」を選択不可能とする。
【００７４】
同様に、図１７において、三角の印がついている範囲をタグ化する場合には、上記と同様な方法によって、文書型定義に適合するように文書を修正することができる。例えば、範囲（４）〜（５）をタグ化する場合について説明する。範囲（４）〜（５）は、要素「ｓｕｂ」に含まれている。文書型定義６１２によると、要素「ｓｕｂ」は、子要素として要素「ｓｕｂ」、要素「ｂｏｌｄ」、および要素「ｉｍａｇｅ」を持つことができる。他の要素にタグ化するときには、文書修正部２６０による修正が必要となる。要素「ｓｅｃｔ」および要素「ｐａｒａｇ」にタグ化する場合は、要素「ｓｕｂ」の親要素「ｓｅｃｔ」の子要素となるように、テキストデータ「３」を持つ要素「ｓｅｃｔ」または要素「ｐａｒａｇ」を新たに挿入することによって、文書型定義６１２に適合させることができる。
【００７５】
図２２（ａ）（ｂ）は、文書修正部２６０の動作の他の例を説明するための図である。図２２（ａ）は、文書処理装置９０によって処理可能な構造化文書の一例としての文書６２０の階層構造を示す。文書６２０は、本体部分に、要素「ｕｌ」を３つ有する。１番目の要素「ｕｌ」は、子要素「ｌｉ」を有し、要素「ｌｉ」は、子要素「ｄｉｖ」を有し、要素「ｄｉｖ」は、テキストデータ「ＡＢＣ」を有する。２番目の要素「ｕｌ」は、子要素「ｌｉ」を有し、要素「ｌｉ」は、子要素「ｄｉｖ」を有し、要素「ｄｉｖ」は、テキストデータ「１２３」を有する。３番目の要素「ｕｌ」は、子要素「ｌｉ」を有し、要素「ｌｉ」は、子要素「ｄｉｖ」を有し、要素「ｄｉｖ」は、テキストデータ「ａｂｃ」を有する。
【００７６】
図２２（ｂ）は、文書６２０を表示装置６２に表示させた様子を示す。表示装置６２０の画面７００の文書表示部７１０には、文書６２０をレンダリングした結果が表示されている。要素「ｕｌ」は、箇条書きとして表示されるように表示属性が設定されているので、３つの要素「ｕｌ」の内容は、それぞれ「・」を付加された形で表示されている。今、ユーザーが、マウスなどの入力装置６０を用いて、範囲７３０を選択している。
【００７７】
図２３（ａ）（ｂ）は、図２２（ｂ）において、選択された範囲を削除する編集コマンドが実行されたときの、文書修正部２６０の動作を説明するための図である。図２２（ｂ）において、範囲７３０を削除する編集コマンドが実行されたとき、図２３（ａ）における位置（ｘ１）から位置（ｘ２）までの範囲が削除されることになる。このようなＤＯＭ操作を行うことは、構造化文書に対する処理として適当でない。したがって、本実施形態においては、文書修正部２６０が、位置（ｙ１）から位置（ｙ２）までの範囲を削除するよう、ＤＯＭエンジン２２０へ指示する。すなわち、２番目の要素「ｕｌ」が削除される。
【００７８】
図２３（ｂ）は、上記の操作が行われた後に、文書６２０を表示装置６２に表示させた様子を示す。文書修正部２６０による修正処理によって、ユーザーの意図した操作を実現することができる。
【００７９】
図２４は、位置情報保持部２４０のデータ構成を示す。位置情報保持部２４０は、カーソル位置、選択範囲の始点、選択範囲の終点、しおり位置など、構造化文書における位置情報を保持する。位置情報は、その位置が含まれる要素の情報と、その要素内におけるオフセット情報とを含む。
【００８０】
図２５は、図７に示した構造化文書６００を、表示装置６２に表示させた様子を示す。今、２つの範囲７３２、７３４が選択されており、カーソルは位置７１２にある。範囲７３２は、構造化文書６００の１番目の要素「ｄｉｖ」のうち、１文字目の後ろから、３文字目の後ろまでに対応する。したがって、図２４において、範囲１始点の要素情報には、１番目の要素「ｄｉｖ」が格納されており、範囲１始点のオフセット情報には、「１」が格納されている。範囲１終点の要素情報には、１番目の要素「ｄｉｖ」が格納されており、範囲１終点のオフセット情報には、「３」が格納されている。他の位置情報についても、これと同様である。しおり位置は、画面７００上には表示されていないが、文書の他の位置からジャンプするためのしおりとして用いられる情報である。
【００８１】
図２６は、位置情報保持部２４０の位置情報を自動更新するための方法を示すフローチャートである。まず、ユーザーによって、しおり位置が指定されたり、範囲が選択されたり、カーソル位置が移動されたりすると、新たな位置情報が位置情報保持部２４０に登録される（Ｓ３０２）。続いて、文書６００を編集するコマンドが実行される（Ｓ３０４）。編集コマンドが実行されると、その編集コマンドによる編集操作の対象となる要素が、位置情報が登録されているノードに対応していれば、Ｓ３０６のＹへ進み、位置情報の自動補正が実行される（Ｓ３０８）。そうでない場合は、Ｓ３０６のＮへ進み、位置情報は自動補正されない。
【００８２】
図２７（ａ）（ｂ）は、図２６に示した位置情報の自動補正方法の具体例を示す。図２７（ａ）は、要素「ｄｉｖ」のテキストデータのうち、４文字目の後ろに位置情報が登録されている場合に、要素「ｄｉｖ」のテキストデータの２文字目の後ろの位置で改行処理が行われたときの例を示す。このとき、編集コマンド実行部２１０が、改行処理を実行すると同時に、位置情報保持部２４０に保持された位置情報を自動補正する。この場合、登録されていた、要素「ｄｉｖ」のテキストデータのうち、４文字目の後ろという位置は、新たに追加された２番目の要素「ｄｉｖ」のテキストデータのうち、２文字目の後ろという位置へ移動しているので、その位置へ自動補正される。
【００８３】
図２７（ｂ）は、要素「ｄｉｖ」のテキストデータのうち、４文字目の後ろに位置情報が登録されている場合に、要素「ｄｉｖ」のテキストデータの２文字目の後ろから５文字目の後ろまでが削除されたときの例を示す。このとき、編集コマンド実行部２１０が、選択範囲を削除する処理を実行すると同時に、位置情報保持部２４０に保持された位置情報を自動補正する。この場合、登録されていた、要素「ｄｉｖ」のテキストデータのうち、４文字目の後ろという位置は、すでに消失しているので、要素「ｄｉｖ」のテキストデータのうち、２文字目の後ろへ自動補正する。
【００８４】
上記のように、位置情報保持部２４０に保持された位置情報は、その位置情報が登録されたノードの編集操作に伴って自動的に補正されるので、カーソル７１２や選択範囲などの表示を自動的に更新することができる。また、位置情報が、ＤＯＭエンジン２２０の操作によって自動更新されるので、複数のユーザーによって一つの文書を編集する際に、他のユーザーによって編集処理が行われた場合にも、自動的に位置情報を更新することができる。また、文書を編集する機能を有するプラグインユニット５００を開発する場合にも、ＤＯＭエンジン２２０が自動的に位置情報を更新するので、位置情報を気にすることなく文書に対する処理を行うことができる。
【００８５】
図２８（ａ）（ｂ）は、編集処理によって文書が処理されたことを、表示ユニット３００に伝達するためのミューテーションイベントについて説明するための図である。図２８（ａ）は、要素「ｄｉｖ」のテキストデータ「あいうえお」のうち、「うえお」が削除されたときの例を示す。このとき、ＤＯＭエンジン２２０は、表示ユニット３００に、要素「ｄｉｖ」のテキストデータが変更されたことを通知するためのミューテーションイベントを発行する。
【００８６】
図２８（ｂ）は、要素「ｄｉｖ」のテキストデータ「あいうえお」のうち、「い」の後ろの位置で改行キーが押下されたときの例を示す。このとき、編集コマンド実行部２１０は、まず、要素「ｄｉｖ」のテキストデータのうち、「うえお」を削除する。続いて、新たな２番目の要素「ｄｉｖ」を元の１番目の要素「ｄｉｖ」の後ろに追加する。続いて、２番目の要素「ｄｉｖ」のテキストデータとして、「うえお」を追加する。このとき、編集コマンド実行部２１０は、ＤＯＭエンジン２２０に、以上の３つの操作のそれぞれについてミューテーションイベントを発行させるのではなく、１番目の要素「ｄｉｖ」が更新されたことを通知するミューテーションイベントと、２番目の要素「ｄｉｖ」が挿入されたことを通知するミューテーションイベントとを発行させる。これによれば、無駄なミューテーションイベントの発行を防ぐことができ、ひいては、処理を高速化することができる。
【００８７】
上記のように、編集コマンド実行部２１０は、１つの編集コマンドを実行する際に複数のＤＯＭ操作を行うときでも、複数のミューテーションイベントを１つにまとめて発行する。これにより、処理を高速化することができる。一般に、操作の行われた要素群を全て包括する最も小さい要素を抽出し、その要素が更新されたことを通知するミューテーションイベントを発行すれば良い。操作の行われた要素群を全て包括するような要素が、非常に多くの内容を有している場合には、その要素全てを再レンダリング処理するのに多大な時間を要するので、実際に処理された各要素について、個別にミューテーションイベントを発行しても良い。
【００８８】
図２９は、取消再実行処理制御ユニット４００の構成を示す。取消再実行処理制御ユニット４００は、取消処理および再実行処理を実行するための取消再実行処理保持部４０８および現在の処理状態を保持する処理状態保持部４０６を備える。取消再実行処理保持部４０８は、コマンド４１０に含まれる各処理およびその逆処理をメソッドとして有するオブジェクトを、処理の順に保持する。図２９においては、説明の便宜上、取消再実行処理保持部４０８に保持されたオブジェクトに含まれている、取消処理を実行するためのメソッド４０２と、再実行処理を実行するためのメソッド４０４とを、別個の枠で示している。各種コマンド４１０が実行されたときに、そのコマンドが、取消処理が可能なコマンドであれば、そのコマンド４１０の中の一つ一つの操作をメソッドとして有するオブジェクトが順に取消再実行処理保持部４０８へ積まれていく。このとき、コマンド４１０がどの操作からどの操作までに対応するのかという情報も記憶される。
【００８９】
ユーザーインターフェース１００を介して取消処理の実行要求が伝達されると、取消再実行処理制御ユニット４００は、取消再実行処理保持部４０８に保持されたオブジェクトのうち取消処理のためのメソッドを、最新の操作から、スタックされた順番と逆順に、１コマンド分だけ実行する。このとき、処理状態保持部４０６は、１コマンド分だけ移動される。続いて、さらに、取消処理の実行要求が伝達されると、さらに取消再実行処理保持部４０８に保持されたオブジェクトのうち取消処理のためのメソッドを、処理状態保持部４０６の位置から、スタックされた順番と逆順に、１コマンド分だけ実行する。再実行処理の実行要求が伝達されたときは、取消再実行処理保持部４０８に保持されたオブジェクトのうち再実行処理のためのメソッドを、処理状態保持部４０６の位置から、スタックされた順番と同じ順番に、１コマンド分だけ実行する。
【００９０】
図３０（ａ）（ｂ）は、取消再実行処理制御ユニット４００の動作を説明するための図である。図３０（ａ）は、編集コマンド実行部２１０によって、文書中の要素「ｄｉｖ」のテキストデータ「あいう」のうち、「い」の後ろの位置に、テキストデータ「かき」を挿入するコマンドが実行される様子を示す。このコマンドが実行された結果、要素「ｄｉｖ」のテキストデータは、「あいかきう」に変更される。
【００９１】
図３０（ｂ）は、図３０（ａ）に示したコマンド中の各操作を実行するためのオブジェクトが、取消再実行処理保持部４０８に積まれた様子を示す。１番目のオブジェクトは、取消処理が実行されたときに、カーソル位置が元の位置に戻るようにするために、カーソル位置を「う」の前に移動する操作を、アンドゥメソッド４０２として有する。再実行する際には、この操作の逆操作は実行する必要がないので、リドゥメソッド４０４は何もしない空の操作である。続いて、編集コマンド実行部２１０は、コマンドの実行中に他の操作によって画面が変更されることがないように、表示ユニット３００に画面をロックするよう要求する。このとき、２番目に積まれるオブジェクトは、ビューをロックする操作をリドゥメソッド４０４として有し、その逆操作に対応するビューのロックを解除する操作をアンドゥメソッド４０２として有する。
【００９２】
続いて、取消処理が実行されたときに、画面が元の状態に戻るようにするために、要素「ｄｉｖ」のテキストデータが更新されたというミューテーションイベントを発行する操作をアンドゥメソッド４０２として有するオブジェクトを、取消再実行処理保持部４０８に積む。再実行する際には、この操作の逆操作は実行する必要がないので、リドゥメソッド４０４は空の操作である。続いて、ＤＯＭエンジン２２０は、要素「ｄｉｖ」のテキストデータを「あいう」から「あいかきう」に変更する。このとき、要素「ｄｉｖ」のテキストデータを「あいう」から「あいかきう」に変更する操作をリドゥメソッド４０４として有し、その逆操作に対応する要素「ｄｉｖ」のテキストデータを「あいかきう」から「あいう」に変更する操作をアンドゥメソッド４０２として有するオブジェクトが、取消再実行処理保持部４０８に積まれる。
【００９３】
続いて、編集コマンド実行部２１０は、要素「ｄｉｖ」のテキストデータが更新されたというミューテーションイベントを発行し、表示ユニット３００に伝達する。このとき、この操作をリドゥメソッド４０４として有するオブジェクトが取消再実行処理保持部４０８に積まれる。取消処理を実行する際には、この操作の逆操作は実行する必要がないので、アンドゥメソッド４０４は空の操作である。続いて、編集コマンド実行部２１０は、ビューのロックを解除するよう、表示ユニット３００に指示する。このとき、この操作をリドゥメソッド４０４として有し、この操作の逆操作に対応する、ビューをロックする操作をアンドゥメソッド４０２として有するオブジェクトが、取消再実行処理保持部４０８に積まれる。
【００９４】
最後に、編集コマンド実行部２１０は、カーソル位置を「う」の前に移動する。このとき、この操作をリドゥメソッド４０４として有するオブジェクトが、取消再実行処理保持部４０８に積まれる。取消処理を実行する際には、この操作の逆操作は実行する必要がないので、アンドゥメソッド４０４は空の操作である。以上のように、取消再実行処理保持部４０８には、コマンドの中の各操作をリドゥメソッド４０４として有し、その逆操作をアンドゥメソッド４０２として有するオブジェクトが、順に積まれていく。編集コマンドが実行されるときには、主にＤＯＭ操作を一つの単位として処理するためのオブジェクトが、取消再実行処理保持部４０８に積まれていく。
【００９５】
図３０（ｂ）の説明では、アンドゥ操作とリドゥ操作とをメソッドとして有するオブジェクトを一つ一つの記憶単位として、取消再実行処理保持部４０８に積んだ場合について説明したが、アンドゥスタック４０２とリドゥスタック４０４とを別個に設けても良い。このとき、アンドゥ操作を実行するオブジェクトがアンドゥスタック４０２に積まれていき、リドゥ操作を実行するオブジェクトがリドゥスタック４０２に積まれていく。
【００９６】
以上のような構成によれば、コマンド毎に取消処理を用意する必要がないので、新たなコマンドを開発する際に手間を減らすことができる。取消再実行処理制御ユニット４００は、プラグインユニット５００によって実行されたコマンドの取消再実行処理も制御できるので、プラグインユニット５００を開発する際に、取消処理を用意する必要が無く、開発を容易にすることができる。
【００９７】
図３１は、表示ユニット３００における動作を概略的に示したフローチャートである。表示ユニット３００に、編集ユニット２００からミューテーションイベントが伝達されると、まず、レンダリングユニット選択部３１０が、表示すべきデータの名前空間を取得する（Ｓ４０２）。続いて、レンダリングユニット選択部３１０は、取得した名前空間のデータをレンダリングするレンダリングユニットを選択する（Ｓ４０４）。適当なレンダリングユニットがある場合は、Ｙへ進み、そのレンダリングユニットへレンダリング処理を実行するよう指示を送り、レンダリング処理が行われ（Ｓ４０６）、その結果を表示部３４０が表示装置６２に表示する（Ｓ４１０）。適当なレンダリングユニットがない場合は、Ｎへ進み、ツリー表示処理部３３０がツリー表示処理を行い（Ｓ４０８）、その結果を表示部３４０が表示装置６２に表示する（Ｓ４１０）。
【００９８】
図３２は、レンダリングユニット選択部３１０およびツリー表示処理部３３０を説明するために用いる構造化文書６３０を示す。文書６３０は、ＸＨＴＭＬで記述された部分６３２およびＭＡＴＨＭＬで記述された部分６３４を含む。ＭＡＴＨＭＬは、数学分野で用いられる記号や式を記述するためのマークアップ言語である。
【００９９】
図３３は、ＭＡＴＨＭＬで記述された文書を処理するためのＭＡＴＨＭＬプラグインユニット５１０を有する文書処理装置９０によって構造化文書６３０をレンダリング処理し、表示装置６２に表示した例を示す。表示ユニット３００に文書６３０の表示要求が伝達されると、レンダリングユニット選択部３１０は、レンダリング部３２０に、ＸＨＴＭＬで記述された部分６３２をレンダリング処理するよう指示し、ＭＡＴＨＭＬプラグインユニット５１０に、ＭＡＴＨＭＬで記述された部分６３４をレンダリング処理するよう指示する。レンダリング部３２０は、ＸＨＴＭＬで記述された部分６３２のレンダリング処理を行い、画面を作成する。ＭＡＴＨＭＬプラグインユニット５１０は、ＭＡＴＨＭＬで記述された部分６３４のレンダリング処理を行い、画面を作成する。表示部３４０は、それぞれの画面を表示装置６２に表示する。
【０１００】
図３４は、ＭＡＴＨＭＬで記述された文書を処理するためのＭＡＴＨＭＬプラグインユニット５１０を有しない文書処理装置９０によって構造化文書６３０をレンダリング処理し、表示装置６２に表示した例を示す。表示ユニット３００に文書６３０の表示要求が伝達されると、レンダリングユニット選択部３１０は、レンダリング部３２０に、ＸＨＴＭＬで記述された部分６３２をレンダリング処理するよう指示する。この場合、ＭＡＴＨＭＬで記述された部分６３４をレンダリング処理するためのプラグインユニット５００は搭載されていない。レンダリングユニット選択部３１０は、ＭＡＴＨＭＬで記述された部分６３２を表示するためのスタイルシートが取得できるか否かを判断する。スタイルシートが取得できれば、レンダリング部３２０にレンダリング処理を行うよう指示する。スタイルシートが取得できなければ、ツリー表示処理部３３０に、ツリー表示処理を行うよう指示する。
【０１０１】
レンダリング部３２０は、ＸＨＴＭＬで記述された部分６３２のレンダリング処理を行い、画面を作成する。ツリー表示処理部３３０は、ＭＡＴＨＭＬで記述された部分６３４を階層構造が分かる形で表示するための処理を行い、画面を作成する。表示部３４０は、それぞれの画面を表示装置６２に表示する。図３４においては、ＭＡＴＨＭＬで記述された部分６３４は、文書表示部７１０内に設けられたウインドウ７３０に、ツリー表示されている。
【０１０２】
このとき、ウインドウ７３０内に表示されたデータの編集を禁止しても良い。図１９において説明したように、編集適否判断部２５０が編集を許可した場合に限って、ウインドウ７３０内に表示されたデータの編集処理を行っても良い。階層構造の変化を伴う編集処理を禁止しても良い。階層構造の変化を伴わないような、テキストデータのみの編集処理を許可しても良い。
【０１０３】
図３５は、ＭＡＴＨＭＬで記述された部分６３４を、スクロールバーのついたウインドウ７３０に表示した例を示す。ウインドウ７３０は、表示属性が不明なＭＡＴＨＭＬで記述された部分６３４を、スクロール可能に設けられている。これにより、表示属性不明データが非常に多い場合であっても、限られた領域の中に全てのデータを表示することができる。
【０１０４】
図３６は、ＭＡＴＨＭＬで記述された部分６３４のソースを、スクロールバーのついたウインドウ７３０に表示した例を示す。このように、文書をそのままの形をで表示した場合でも、ユーザーは文書の階層構造を知ることができる。
【０１０５】
以上の構成によれば、独自のタグセットによって記述された、表示属性が不明なデータが文書中にあっても、それを階層構造が分かる形で文書表示部７１０内に表示することによって、文書の内容を分かりやすく表示することができる。
【０１０６】
図３７は、スタイル設定部３２２の動作を示すフローチャートである。スタイル設定部３２２は、スタイルシートに記述された、各要素の満たすべき表示属性を設定する。スタイル設定部３２２は、まず、デフォルトスタイルシートを取得して、デフォルトスタイルシートに記述された表示属性を設定する（Ｓ５０２）。デフォルトスタイルシートは、文書処理装置９０の初期設定を規定したスタイルシートであり、ユーザーが表示属性を指定しなかったときに適用される。
【０１０７】
続いて、スタイル設定部３２２は、ユーザースタイルシートに記述された表示属性を上書き設定する（Ｓ５０４）。ユーザースタイルシートは、文書処理装置９０を使用するユーザーが初期設定として規定したスタイルシートであり、文書内に表示属性を指定しなかったときに適用される。ユーザースタイルシートに記述された表示属性は、上書き設定されるので、デフォルトスタイルシートに記述された表示属性よりも優先される。ユーザースタイルシートに記述されていない表示属性については、デフォルトスタイルシートに記述された表示属性が適用される。
【０１０８】
続いて、スタイル設定部３２２は、オーサースタイルシートが指定されているか否かを判断する（Ｓ５０６）。オーサースタイルシートが指定されている場合は、Ｙへ進み、オーサースタイルシートに記述された表示属性を上書き設定する（Ｓ５０８）。オーサースタイルシートは、文書を編集した著者が文書全体に適用される表示属性として規定したスタイルシートであり、文書内の要素に表示属性を指定しなかったときに適用される。オーサースタイルシートに記述された表示属性は、上書き設定されるので、デフォルトスタイルシートおよびユーザースタイルシートに記述された表示属性よりも優先される。オーサースタイルシートに記述されていない表示属性については、デフォルトスタイルシートまたはユーザースタイルシートに記述された表示属性が適用される。オーサースタイルシートが指定されていない場合は、Ｎへ進み、表示属性の設定肯定は省略され、Ｓ５１０へ進む。
【０１０９】
続いて、スタイル設定部３２２は、要素に表示属性が指定されているか否かを判断する（Ｓ５１０）。要素に表示属性が指定されている場合は、Ｙへ進み、オーサースタイルシートに記述された表示属性を上書き設定する（Ｓ５１２）。要素に直接指定された表示属性は、上書き設定されるので、全てのスタイルシートに記述された表示属性よりも優先される。要素に表示属性が指定されていない場合は、デフォルトスタイルシート、ユーザースタイルシート、またはオーサースタイルシートに記述された表示属性が適用される。要素に表示属性が指定されていない場合は、Ｎへ進み、表示属性の設定工程は省略される。以上で、スタイル設定部３２２の動作が終了する。
【０１１０】
図３８は、図３７に示した表示属性の設定工程（Ｓ５０２、Ｓ５０４、およびＳ５０８）の詳細を示すフローチャートである。スタイル設定部３２２は、スタイルを設定すべきターゲット要素の要素名を取得する（Ｓ５２２）。続いて、その要素に適用すべき表示属性を、要素名をキーとして検索し、表示属性を設定する（Ｓ５２４）。続いて、ターゲット要素に、ｃｌａｓｓ属性、ｉｄ属性などの属性が指定されているか否かを判断する（Ｓ５２６）。属性が指定されていなければ、Ｎへ進み、表示属性の設定工程を終了する。属性が指定されていれば、Ｙへ進み、さらにターゲット要素の属性名を取得する（Ｓ５２８）。続いて、属性名をキーとして表示属性を検索し、表示属性を設定する（Ｓ５３０）。以上で、表示属性の設定工程を終了する。属性名をキーとしたハッシュテーブルが用意されていない場合は、ハッシュテーブルを用いた検索工程（Ｓ５３０）は行われない。
【０１１１】
図３９は、図３８に示した表示属性の検索・設定工程（Ｓ５２４およびＳ５３０）の詳細を示すフローチャートである。スタイル設定部３２２は、取得したターゲット要素の要素名に基づいて、ハッシュ値を取得する（Ｓ５４２）。ハッシュ値は、例えば、要素名のアスキーコード値などから算出されてもよい。続いて、得られたハッシュ値をキーとして、ハッシュテーブルを検索する（Ｓ５４４）。ハッシュテーブルについては、図４０において詳述する。
【０１１２】
ハッシュテーブルの中にハッシュ値が存在しなかったときは、ターゲット要素の表示属性が指定されていないということなので、Ｓ５４６のＮへ進み、表示属性を設定せずに工程を終了する。ハッシュテーブルの中にハッシュ値が存在していたときは、Ｓ５４６のＹへ進み、ハッシュ値に対応する適合セレクタが複数あるか否かを判断する（Ｓ５４８）。適合セレクタが複数ある場合には、Ｙへ進み、適合セレクタを絞り込み、ターゲット要素に合致するセレクタを取得する（Ｓ５５０）。続いて、ターゲット要素に合致したセレクタに設定されている表示属性を、ターゲット要素に設定する（Ｓ５５２）。適合セレクタが１つしかない場合には、Ｎへ進み、そのセレクタに設定されている表示属性を、ターゲット要素に設定する（Ｓ５５２）。以上で、表示属性の検索・設定工程を終了する。
【０１１３】
図４０（ａ）（ｂ）は、ハッシュテーブルの例を示す。図４０（ａ）は、要素の属性による分類がなされていないハッシュテーブルの例を示す。ハッシュ値は、セレクタのうち最下位の階層の要素の要素名から算出される。例えば、要素名「ｂｏｄｙ」のハッシュ値は、８である。このハッシュテーブルにおいては、属性による分類がなされていないので、要素「ｄｉｖ」のハッシュ値と、「参照１」という属性が指定された要素「ｄｉｖ」のハッシュ値は、同一になる。セレクタ「ｄｉｖ  ｐ」は、要素「ｄｉｖ」の子孫要素となっている要素「ｐ」に対応する。このとき、ハッシュ値は、最下位の階層の要素の要素名から算出されるので、「ｄｉｖ  ｐ」のハッシュ値は、「ｐ」のハッシュ値と同一になる。
【０１１４】
図４０（ａ）に示されたハッシュテーブルを用いて、ターゲット要素「ｄｉｖ」の表示属性を設定する方法について説明する。ここで、ターゲット要素「ｄｉｖ」には、ｃｌａｓｓ属性「参照２」が指定されている。まず、要素名「ｄｉｖ」からハッシュ値を算出する。要素名「ｄｉｖ」から算出されるハッシュ値は、１４である。続いて、ハッシュ値１４をキーとして、ハッシュテーブルを検索する。すると、適合セレクタは、「ｄｉｖ」、「ｄｉｖ．参照１」、および「ｄｉｖ．参照２」であることが分かる。続いて、それぞれの適合セレクタとターゲット要素とを照らし合わせて、表示属性を設定すべきセレクタを取得する。ここでは、「ｄｉｖ」および「ｄｉｖ．参照２」が該当するので、まず、「ｄｉｖ」に指定された表示属性を設定し、続いて、「ｄｉｖ．参照２」に指定された表示属性を上書き設定する。
【０１１５】
図４０（ｂ）は、要素の属性によってさらに分類された階層化ハッシュテーブルの例を示す。ハッシュ値１４に対応するセレクタは、「ｄｉｖ」、「ｄｉｖ．参照１」、「ｄｉｖ．参照２」、および「ｄｉｖ．参照２＃ａｂｃ」である。このうち、「ｄｉｖ．参照１」、「ｄｉｖ．参照２」、および「ｄｉｖ．参照２＃ａｂｃ」については、属性が指定されているので、さらに属性名をキーとしたハッシュテーブルに分類されている。属性「参照１」が指定された要素「ｄｉｖ」は、ハッシュ値５に分類されており、属性「参照２」が指定された要素「ｄｉｖ」は、ハッシュ値１１に分類されている。
【０１１６】
図４０（ｂ）に示されたハッシュテーブルを用いて、ターゲット要素＜ｄｉｖｃｌａｓｓ＝“参照２”＞の表示属性を設定する方法について説明する。まず、要素名「ｄｉｖ」からハッシュ値を算出する。要素名「ｄｉｖ」から算出されるハッシュ値は、１４である。続いて、ハッシュ値１４をキーとして、ハッシュテーブルを検索する。すると、適合セレクタとして、まず、「ｄｉｖ」。続いて、それぞれの適合セレクタとターゲット要素とを照らし合わせて、表示属性を設定すべきセレクタを取得する。ここでは、「ｄｉｖ」および「ｄｉｖ．参照２」が該当するので、まず、「ｄｉｖ」に指定された表示属性を設定し、続いて、「ｄｉｖ．参照２」に指定された表示属性を上書き設定する。
【０１１７】
本実施形態では、ハッシュテーブルを用いて適合セレクタを検索したが、二分木などの方法を用いて検索を実行しても良い。以上のような構成によれば、スタイル設定処理を高速化することができる。
【０１１８】
図４１は、レイアウト処理部３２４の動作を示すフローチャートである。まず、編集位置より前の行から先送りされて配置されたフロートブロックを、再配置のためにレイアウトから外して、ソース上での出現位置の順番にキューへ待避する（Ｓ６０２）。続いて、編集位置を含む段落のテキストデータを再レイアウトする（Ｓ６０４）。テキストデータが配置可能な行矩形の中に、テキストデータを順に配置していく。続いて、編集位置以降の段落をシフト処理する（Ｓ６０６）。Ｓ６０４によって段落の行数が変化すると、以降の段落との間に、隙間または重なりが生じるので、それを解消すべく以降の段落を垂直方向にシフトする。続いて、キューに待避された配置待ちフロートブロックがあるか否かを判断する（Ｓ６０８）。
【０１１９】
キューにフロートブロックがある場合は、Ｙへ進み、フロートブロックが配置可能か否かを判断する（Ｓ６１０）。すなわち、キューに配置待ちのフロートブロックがある限り、必ず行頭で配置可能か否かを判断する。配置可能であれば、Ｙへ進み、フロートブロックをレイアウトする（Ｓ６１２）。その後、再びＳ６０８へ戻り、配置不可能なフロートブロックが出現するか、キューに待避された配置待ちフロートブロックが無くなるまで、フロートブロックのレイアウト処理が行われる。Ｓ６１０において、フロートブロックが配置できなかったときは、Ｎへ進み、テキストデータの行レイアウト処理が行われる（Ｓ６１４）。行矩形の中にテキストデータを順に配置し、１行分配置したところで終了する。
【０１２０】
続いて、文書末またはテーブルセルの末尾であるか否かを判断する（Ｓ６２２）。すなわち、配置すべきテキストデータがまだ残っているか否かを判断する。残っていれば、Ｎへ進み、再びフロートブロックが配置可能か否かを判断する。文書末またはテーブルセルの末尾である場合には、Ｙへ進み、フロートブロックが配置可能か否かを判断するための仮想行を設定する（Ｓ６２４）。キューに残っているフロートブロックを末尾行に配置した場合に、そのフロートブロックと重なる最も内側の配置済みフロートブロックの、下辺の直下に仮想行を設定する。その後、再びキューに待避された配置待ちフロートブロックが配置可能か否かを判断するときに、この仮想行の行頭で判断が行われる。
【０１２１】
Ｓ６０８において、キューに待避された配置待ちのフロートブロックがなくなった場合には、Ｎへ進み、次の段落の１行目の行矩形と、フロートブロックとの間に、重なりまたは隙間があるか否かを判断する（Ｓ６１６）。重なりまたは隙間がある場合は、Ｎへ進み、その段落を末尾まで再レイアウトする（Ｓ６１８）。その後、再びＳ６１６へ進む。重なりまたは隙間がない場合は、Ｙへ進み、それ以降の段落をシフト処理する（Ｓ６２０）。以上により、文書が編集されたときの、再レイアウト処理を終了する。
【０１２２】
図４２は、レイアウト処理部３２４の動作を説明するために用いる構造化文書の例を示す。構造化文書６４０は、ＸＨＴＭＬで記述された文書である。文書６４０の第１段落には、イメージファイルが埋め込まれており、右寄せで表示されるよう指定されている。
【０１２３】
図４３は、図４２に示した文書６４０を表示装置６２へ表示した様子を示す。画像６４２は、右寄せで表示されている。各段落のテキストデータは、画像６４２と重ならないようにレイアウトされている。
【０１２４】
図４４は、レイアウト処理部３２４がレイアウト処理を行う際に、テキストデータを行矩形として管理する様子を示す。レイアウト処理部３２４は、画像、表、縦書きブロック、ツリー表示ウインドウ、などのフローティングブロックと、テキストデータの行とを、矩形データとして管理している。レイアウト処理部３２４は、これらの矩形データが重なるか否かを調べることによって、正しくレイアウトされているか否かを判断する。
【０１２５】
図４５（ａ）（ｂ）（ｃ）は、文書６４０のうち、範囲６４４が削除されたときの、レイアウト処理部３２４の動作を説明するための図である。図４５（ａ）は、文書６４０のうち、範囲６４４が選択された様子を示す。入力装置６０を介してユーザーが範囲６４４を選択した後、さらに削除コマンドを実行すると、編集ユニット２００が必要な処理を行い、表示ユニット３００へミューテーションイベントを伝達する。このとき、レイアウト処理部３２４は、編集部分から後の部分を再レイアウトする。
【０１２６】
この場合、削除された行よりも前の行から先送りされて配置されたフロートブロックが存在しないので、キューに待避されるフロートブロックはない。まず、第２段落のテキストデータを再レイアウトする。第２段落のテキストデータのうち、範囲６４４が削除されているので、第２行から第４行が消失する。続いて、第３段落および第４段落を、上方へシフトする。その結果を図４５（ｂ）に示す。この状態は、実際には表示されない。ここで、シフト処理の結果、行矩形データと、フローティングブロックの矩形データとの間に、重なりまたは隙間があるか否かを調べる。この場合、第３段落の１行目の行矩形データと、画像６４２の矩形データとが重なるので、このままの状態では正しいレイアウトではない。したがって、さらに、第３段落を再レイアウトし、画像６４２と重ならないようにする。画像６４２と重ならないように新たに設定された行矩形内に、第３段落のテキストデータを配置していく。この結果、行の増減などによって段落の高さが変化すると、その段落以降の段落とそれらに含まれる行をシフトする。その結果を図４５（ｃ）に示す。
【０１２７】
第４段落以降も、同様に、各行の行頭において、行矩形データとフロートブロックの矩形データとの重なりまたは隙間があるか否かを調べる。第４段落の第１行目は、フロートブロックとの重なりがない。さらに、以前フロートブロックを避けていた隙間がない。すなわち、行矩形が、文書表示部７１０の左端から右端までの全てに渡っている。このとき、この行以降のレイアウトには変化が生じないので、行の重なりまたは隙間のチェックを終了し、この行以降の行をシフト処理する。この場合は、図４５（ｃ）の状態が、正しくレイアウトされた状態に対応する。
【０１２８】
図４６は、レイアウト処理部３２４の動作を説明するために用いる構造化文書の他の例を示す。構造化文書６５０は、ＸＨＴＭＬで記述された文書である。文書６５０の第１段落には、イメージファイルが３つ埋め込まれており、１つは右寄せで、残りの２つは左寄せで表示されるよう指定されている。
【０１２９】
図４７は、図４６に示した文書６５０を表示装置６２へ表示した様子を示す。画像６５２は、右寄せで表示されている。画像６５４および６５６は、左寄せで表示されている。各段落のテキストデータは、画像６５２、６５４、および６５６と重ならないように、回り込んでレイアウトされている。フロートブロックは、原則として、行単位で位置決めされる。すなわち、行の上辺とフロートブロックの上辺のｙ座標は一致する。文書の末尾やテーブルセルの末尾行以下に配置される場合は、ピクセル単位で位置決めされる。今、範囲６５８が選択されている。
【０１３０】
図４８から図５０は、文書６５０のうち、範囲６５８が削除されたときの、レイアウト処理部３２４の動作を説明するための図である。図４８は、文書６５０のうち、範囲６５８が削除され、削除された行よりも前の行から先送りされて配置された画像６５４および６５６がキュー６６０に待避され、第２段落が再レイアウトされ、第３段落がシフト処理されたときの様子を示す。キュー６６０には、ソース上の出現位置の順番に、画像６５４および画像６５６がバッファに積まれている。
【０１３１】
図４９は、続いて、第３段落が再レイアウトされた様子を示す。まず、図４８の状態から、キューにフロートブロックが積まれているので、第２段落の直下の行に配置可能か否かを判断する。この場合、配置不可能なので、第３段落の第１行目が行レイアウト処理される。続いて、第３段落の第１行目の直下の行にフロートブロックを配置可能か否かを判断する。画像６５４が配置可能なので、画像６５４を左寄せにして配置する。さらに、画像６５６が配置可能か否かを判断する。画像６５６は配置不可能なので、キューに積んだまま、第３段落の第２行目を行レイアウトする。このように、改行毎にフロートブロックの配置チェックを行い、配置できなければテキストデータの行レイアウトを行う。第３段落の末尾まで行レイアウトが終了した状態が図４９に示されている。
【０１３２】
図５０は、画像６５６がレイアウトされた様子を示す。図４９において、文書末までレイアウトが終了したときに、まだキュー６６０には画像６５６が残っていたので、仮想行を設定する。仮想行は、末尾行に画像６５６を配置したときに重なりが生じる、画像６５４の下辺の直下に設定される。この行の行頭において、画像６５６が配置可能か否かのチェックが行われる。画像６５６は、配置可能であるから、左寄せにして配置される。これで、文書６５０の再レイアウト処理が終了する。
【０１３３】
以上の構成によれば、ＣＳＳの仕様に準拠したレイアウトを実現することができる。また、改段落のときに、フロートブロックとの重なりや隙間がないときには、以下の段落をレイアウトせず、シフト処理を行うため、再表示に要する時間を短縮することができる。本実施形態の方法によれば、多くの場合、フロートブロックの重なりや隙間があるかどうかの判定は、全段落について行う必要がないので、高速な処理を実現することができる。
【０１３４】
記録媒体の一例としてのフロッピーディスク５６またはＣＤ−ＲＯＭ５８には、本出願で説明した端末１０の動作の一部または全ての機能を格納することができる。またフロッピーディスク１０６には他の装置の動作の一部または全ての機能を格納することができる。これらのプログラムは記録媒体から直接ＲＡＭに読み出されて実行されても良い。
【０１３５】
本実施形態においては、構造化文書の一例として、ＸＨＴＭＬ形式およびＸＭＬ形式の文書を処理する方法について説明したが、本実施形態の方法は、ＳＧＭＬ、ＭＨＥＧ、ＨＴＭＬ、その他の形式、およびそれらに対して拡張または限定を行った形式を用いて記述された構造化文書についても適用することができる。
【０１３６】
以上、本発明を実施の形態を用いて説明したが、本発明の技術的範囲は上記実施の形態に記載の範囲には限定されない。上記実施の形態に、多様な変更又は改良を加えることができることが当業者に明らかである。その様な変更又は改良を加えた形態も本発明の技術的範囲に含まれ得ることが、特許請求の範囲の記載から明らかである。
【０１３７】
【発明の効果】
上記説明から明らかなように、本発明によれば構造化文書を適切に処理することができる文書処理装置、およびその文書処理装置で利用可能な文書処理方法、およびその方法をコンピュータに実行させるプログラムを記録したコンピュータ読み取り可能な記録媒体を提供することができる。
【図面の簡単な説明】
【図１】  図１は、本実施形態の文書処理方法をコンピュータに実行させるためのプログラムがネットワークを介して配信される様子を示す図である。
【図２】  図２は、コンピュータの構成を示す図である。
【図３】  図３は、本発明の実施形態に係る文書処理装置９０の概略機能ブロックを示す図である。
【図４】  図４は、ユーザーインターフェース１００のより詳細な機能ブロックを示す図である。
【図５】  図５は、編集ユニット２００のより詳細な機能ブロックを示す図である。
【図６】  図６は、表示ユニット３００のより詳細な機能ブロックを示す図である。
【図７】  図７は、文書処理装置９０によって処理可能な構造化文書６００を示す図である。
【図８】  図８は、文書処理装置９０が構造化文書６００を読み込み、表示ユニット３００によって表示装置６２へ表示させた様子を示す図である。
【図９】  図９は、編集処理が実行された後の構造化文書６００を示す図である。
【図１０】  図１０は、編集処理が実行された後の画面７００を示す図である。
【図１１】  図１１は、メニュー制御部１４０の動作を示すフローチャートである。
【図１２】  図１２は、ＸＭＬによって記述された構造化文書６１０を示す図である。
【図１３】  図１３は、構造化文書６１０のうち、名前空間が「ｓａｍｐｌｅ」である部分６１６の階層構造を分かりやすく示した模式図である。
【図１４】  図１４は、カーソル７１２が図１３における位置（４）にあるときに、メニューを表示させた様子を示す図である。
【図１５】  図１５は、文書６１０における編集位置と、その位置に挿入可能なタグとの関係を示す図である。
【図１６】  図１６は、範囲７２４を選択している状態で、メニューを表示させた様子を示す図である。
【図１７】  図１７は、文書６１０における編集位置と、その範囲をタグ化可能なタグとの関係を示す図である。
【図１８】  図１８は、カーソル７１２が図１３における位置（４）にあるときに、文書表示部７１０の中でマウスを右クリックしてメニューを表示させた様子を示す図である。
【図１９】  図１９は、編集適否判断部２５０の動作を示すフローチャートである。
【図２０】  図２０は、文書修正部２６０の動作を示すフローチャートである。
【図２１】  図２１（ａ）（ｂ）は、文書修正部２６０の動作の例を説明するための図である。
【図２２】  図２２（ａ）（ｂ）は、文書修正部２６０の動作の他の例を説明するための図である。
【図２３】  図２３（ａ）（ｂ）は、図２２（ｂ）において、選択された範囲を削除する編集コマンドが実行されたときの、文書修正部２６０の動作を説明するための図である。
【図２４】  図２４は、位置情報保持部２４０のデータ構成を示す図である。
【図２５】  図２５は、図７に示した構造化文書６００を、表示装置６２に表示させた様子を示す図である。
【図２６】  図２６は、位置情報保持部２４０の位置情報を自動更新するための方法を示すフローチャートである。
【図２７】  図２７（ａ）（ｂ）は、図２６に示した位置情報の自動補正方法の具体例を示す図である。
【図２８】  図２８（ａ）（ｂ）は、編集処理によって文書が処理されたことを、表示ユニット３００に伝達するためのミューテーションイベントについて説明するための図である。
【図２９】  図２９は、取消再実行処理制御ユニット４００の構成を示す図である。
【図３０】  図３０（ａ）（ｂ）は、取消再実行処理制御ユニット４００の動作を説明するための図である。
【図３１】  図３１は、表示ユニット３００における動作を概略的に示したフローチャートである。
【図３２】  図３２は、レンダリングユニット選択部３１０およびツリー表示処理部３３０を説明するために用いる構造化文書６３０を示す図である。
【図３３】  図３３は、ＭＡＴＨＭＬで記述された文書を処理するためのＭＡＴＨＭＬプラグインユニット５１０を有する文書処理装置９０によって構造化文書６３０をレンダリングし、表示装置６２に表示した例を示す図である。
【図３４】  図３４は、ＭＡＴＨＭＬで記述された文書を処理するためのＭＡＴＨＭＬプラグインユニット５１０を有しない文書処理装置９０によって構造化文書６３０をレンダリングし、表示装置６２に表示した例を示す図である。
【図３５】  図３５は、ＭＡＴＨＭＬで記述された部分６３４を、スクロールバーのついたウインドウ７３０に表示した例を示す図である。
【図３６】  図３６は、ＭＡＴＨＭＬで記述された部分６３４のソースを、スクロールバーのついたウインドウ７３０に表示した例を示す図である。
【図３７】  図３７は、スタイル設定部３２２の動作を示すフローチャートである。
【図３８】  図３８は、図３７に示した表示属性の設定工程（Ｓ５０２、Ｓ５０４、およびＳ５０８）の詳細を示すフローチャートである。
【図３９】  図３９は、図３８に示した表示属性の検索・設定工程（Ｓ５２４およびＳ５３０）の詳細を示すフローチャートである。
【図４０】  図４０（ａ）（ｂ）は、ハッシュテーブルの例を示す図である。
【図４１】  図４１は、レイアウト処理部３２４の動作を示すフローチャートである。
【図４２】  図４２は、レイアウト処理部３２４の動作を説明するために用いる構造化文書６４０を示す図である。
【図４３】  図４３は、図４２に示した文書６４０を表示装置６２へ表示した様子を示す図である。
【図４４】  図４４は、レイアウト処理部３２４がレイアウト処理を行う際に、テキストデータを行矩形として管理する様子を示す図である。
【図４５】  図４５（ａ）（ｂ）（ｃ）は、文書６４０のうち、範囲６４４が削除されたときの、レイアウト処理部３２４の動作を説明するための図である。
【図４６】  図４６は、レイアウト処理部３２４の動作を説明するために用いる構造化文書６５０を示す図である。
【図４７】  図４７は、図４６に示した文書６５０を表示装置６２へ表示した様子を示す図である。
【図４８】  図４８は、文書６５０のうち、範囲６５８が削除されたときの、レイアウト処理部３２４の動作を説明するための図である。
【図４９】  図４９は、文書６５０のうち、範囲６５８が削除されたときの、レイアウト処理部３２４の動作を説明するための図である。
【図５０】  図５０は、文書６５０のうち、範囲６５８が削除されたときの、レイアウト処理部３２４の動作を説明するための図である。
【符号の説明】
１０  インターネット、  ２０  ダウンロードサーバ、  ３０  利用者端末、４０  文書サーバ、  ５０  編集端末、  ６０  入力装置、  ６２  表示装置、６４  通信装置、  ６６  ＣＰＵ、  ６８  メモリ、  ７０  ハードディスク、７２  外部記憶装置、  ９０  文書処理装置、  １００  ユーザーインターフェース、  １１０  イベント解析部、  １２０  イベントマップ、  １３０  ＵＩコマンド実行部、  １４０  メニュー制御部、  ２００  編集ユニット、  ２１０編集コマンド実行部、  ２２０  ＤＯＭエンジン、  ２３０  文書保持部、  ２４０  位置情報保持部、  ２５０  編集適否判断部、  ２６０  文書修正部、３００  表示ユニット、  ３１０  レンダリングユニット選択部、  ３２０  レンダリング部、  ３２２  スタイル設定部、  ３２４  レイアウト処理部、  ３３０  ツリー表示処理部、  ３４０  表示部、  ４００  取消再実行処理制御ユニット、  ４０２  アンドゥスタック、  ４０４  リドゥスタック、  ４１０コマンド、  ５００  プラグインユニット、  ６６０  キュー、  ７００  画面、  ７０２  メニューバー、  ７０４  ツールバー、  ７０６  水平ルーラ、７０８  垂直ルーラ、  ７１０  文書表示部、  ７１２  カーソル、  ７３０ウインドウ
【図１】
0004514888.tif 000002
【図２】
0004514888.tif 000003
【図３】
0004514888.tif 000004
【図４】
0004514888.tif 000005
【図５】
0004514888.tif 000006
【図６】
0004514888.tif 000007
【図７】
0004514888.tif 000008
【図８】
0004514888.tif 000009
【図９】
0004514888.tif 000010
【図１０】
0004514888.tif 000011
【図１１】
0004514888.tif 000012
【図１２】
0004514888.tif 000013
【図１３】
0004514888.tif 000014
【図１４】
0004514888.tif 000015
【図１５】
0004514888.tif 000016
【図１６】
0004514888.tif 000017
【図１７】
0004514888.tif 000018
【図１８】
0004514888.tif 000019
【図１９】
0004514888.tif 000020
【図２０】
0004514888.tif 000021
【図２１】
0004514888.tif 000022
【図２２】
0004514888.tif 000023
【図２３】
0004514888.tif 000024
【図２４】
0004514888.tif 000025
【図２５】
0004514888.tif 000026
【図２６】
0004514888.tif 000027
【図２７】
0004514888.tif 000028
【図２８】
0004514888.tif 000029
【図２９】
0004514888.tif 000030
【図３０】
0004514888.tif 000031
【図３１】
0004514888.tif 000032
【図３２】
0004514888.tif 000033
【図３３】
0004514888.tif 000034
【図３４】
0004514888.tif 000035
【図３５】
0004514888.tif 000036
【図３６】
0004514888.tif 000037
【図３７】
0004514888.tif 000038
【図３８】
0004514888.tif 000039
【図３９】
0004514888.tif 000040
【図４０】
0004514888.tif 000041
【図４１】
0004514888.tif 000042
【図４２】
0004514888.tif 000043
【図４３】
0004514888.tif 000044
【図４４】
0004514888.tif 000045
【図４５】
0004514888.tif 000046
【図４６】
0004514888.tif 000047
【図４７】
0004514888.tif 000048
【図４８】
0004514888.tif 000049
【図４９】
0004514888.tif 000050
【図５０】
0004514888.tif 000051