次に、本発明を実施するための形態を、以下の実施例に基づき図面を参照しつつ説明していく。なお、本実施例では、ネットワーク上の資源の一例としてWebページを例に説明する。
(本実施例の概要)
本実施例は、Webページ上の画面を切り取って、指定された他のWebページに貼付するマッシュアップ装置において、フォーム入力等の切り取り元のWebページの持つ機能が正しく実行されるようにするために、切り取り元のWebページの切り取り範囲から構成タグ検索,アクション要素検索,アクション要素の絞り込みにより、最低限必要な情報を切り取って保持することで、貼り付け先のWebページにおいて正しい機能が実行されるようにしている。本実施例は必要となる正規化を切り取り元のWebページ側で行うことによって、貼り付け先のWebページにおいて正しい機能が実行されるようにするものである。
まず、本実施例の理解を容易とする為、あるWebページ上のコンテンツや機能の一部分を切り取り、別のWebページ上に貼り付けることで利用可能にする、すなわち、あるWebページにアクセスしたとき、その時点での別のWebページの内容を表示したり検索や動画閲覧などの機能を可能にしたりするマッシュアップ技術について説明する。
図1は切り取り元のWebページの一例のイメージ図である。図1の切り取り元のWebページは検索窓の部分1を有する。ユーザはシステムがWebページ上で提示する例えば赤枠2を移動させて適切な部分を選択し、所定のコマンド(ctrl−c)等でWebページ上の部分を切り取る。
図1のWebページは赤枠2により検索窓の部分1が指定されている。ユーザは図1の状態でWebページ上の部分を切り取る所定のコマンドを入力することにより、切り取り元のWebページから検索窓の部分1を切り取ることができる。
図2は貼り付け先のWebページの一例のイメージ図である。ユーザはシステムが貼り付け先のWebページ上で提示する例えば赤枠を移動させて適切な部分を選択し、所定のコマンド(ctrl−v)等で、切り取り元のWebページから切り取った検索窓の部分1を貼り付ける。図3は切り取り元のWebページから切り取られた部分が貼り付けられた貼り付け先のWebページの一例のイメージ図である。
図3のWebページは赤枠3により貼り付け部分が指定されている。ユーザはWebページ上の部分に貼り付ける所定のコマンドを入力することにより、切り取り元のWebページから切り取った検索窓の部分1を、赤枠3により指定されている貼り付け先のWebページの貼り付け部分に貼り付けることができる。図3のWebページは図1に示す切り取り元のWebページの検索窓の部分1が赤枠3により指定された貼り付け部分に埋め込まれている。
貼り付け先のWebページに貼り付けたものは単なるスナップショットでなく、切り取り元のWebページから切り取った切り取り部分が持つ機能を、そのまま有する。図3の例では、切り取り元のWebページが有する検索機能を保持している。ユーザは図3のWebページに貼り付けられた検索窓の部分1にクエリーを入力することで検索結果を得ることができる。
このように、切り取り元のWebページが有する検索機能を貼り付け先のWebページで保持できるのは、以下の理由による。まず、Webページは、HTML等で作成されている。検索窓の部分1の周辺のHTMLは具体的に以下のように記述されている。
<h5><label for="searchInput">検索</label></h5>
<div id="searchBody" class="pBody">
<form action="/w/index.php" id="searchform">
<div>
<input type=“hidden”name="title" value="特別:Search"/>
<input id="searchInput" name="search" type="text" accesskey="f" value="" />
<input type=“submit” name="go" class="searchButton" id="searchGoButton" value="表示" />
<input type=“submit” name="fulltext" class="searchButton" id="mw-searchButton" value="検索" />
</div>
</form>
</div>
そして、切り取り元のWebページが有する検索機能は、上記のようなHTMLを単なる文字列テキストとして捉えるのではなく、ドキュメントツリーを意識して適当な範囲で切り取り、別のWebページのHTMLテキストの中に埋め込むことで、貼り付け先のWebページで実現される。
しかし、切り取り元のWebページから切り取った部分を貼り付け先のWebページに埋め込む場合、切り取り元のWebページから切り取る範囲によっては、ユーザが期待する機能を保持(貼り付け先のWebページで同じ機能を利用)できないことがある。
図4は切り取り元のWebページの一例のイメージ図である。例えば、図4の切り取り元のWebページは赤枠4が図1よりも狭い範囲(検索窓)を指定している。ユーザは図4の状態でWebページ上の部分を切り取る所定のコマンドを入力することにより、切り取り元のWebページから検索窓を切り取ることができる。ユーザは貼り付け先のWebページ上で赤枠を移動させて適切な部分を選択し、所定のコマンド等で、切り取り元のWebページから切り取った検索窓を貼り付けたとする。
図4では、赤枠4の部分が検索窓である。しかし、赤枠4が指定する検索窓を他のWebページに貼り付けたとしても、ユーザが期待する機能は保持されない。ここで、ユーザが期待する機能とは、単に検索窓を貼り付けることでなく、検索機能であることが常識である。ユーザが期待する検索機能が保持されない理由は以下の通りである。
まず、WebページはHTML等で作成されている。検索窓の周辺のHTMLは具体的に以下のように記述されている。
<h5>検索</h5>
<div id="searchBody" class="pBody">
<form action="/w/index.php" id="searchform">
<div>
<input type=“hidden” name="title" value="特別:Search"/>
<input id="searchInput" name="search" type="text" accesskey="f" value="" />
<input type=“submit” name="go" class="searchButton" id="searchGoButton"
value="表示" />
<input type=“submit” name="fulltext" class="searchButton" id="mw-searchButton" value="検索" />
</div>
</form>
</div>
図1の例では赤枠2が<form> 〜 </form> の範囲を示していた。図4の例では赤枠4が<input id="searchInput" name="search" type="text" accesskey="f" value="" />の範囲を示す。上記のHTMLでは実際の検索機能を保持する為、<form> 〜 </form> 全体が必要になる。
HTMLフラグメントを切り取って別のWebページに貼り付けた時に、ユーザが常識的に期待する機能を保持する為には、適切な範囲を切り取らなければならない。図4の例では説明を分かり易くするために検索窓の範囲に限定したが、<form> 〜 </form> の内部にある<div> 〜 </div> を切り取ったとしても検索機能を保持できない。この時にブラウザ上で見えている範囲(例えば赤枠2で指定される範囲)は、図1の赤枠2で指定される範囲と同じである。
この他の例については、後に述べるが、切り取り元のWebページの切り取った範囲から期待される機能を貼り付け先のWebページにおいても保持する為に、切り取り元のWebページから切り取る切り取り範囲を適切に制御する必要がある。
なお、切り取り元のWebページの切り取った範囲から期待される機能を貼り付け先のWebページにおいても保持する手法としては、切り取り元のWebページの切り取り対象部分を切り取るのではなく、切り取り元のWebページ全体を取り出して貼り付け先のWebページに貼り付け、切り取り対象部分以外を非表示とすることも考えられる。
この手法では、切り取り対象部分以外を非表示とするため、見かけ上、指定された部分を切り取っているように振る舞える。また、この手法では切り取り元のWebページ全体を保持する為、切り取り元のWebページの機能も損なわず、貼り付け先のWebページにおいて期待される機能を保持できる。
しかしながら、切り取り元のWebページ全体を保持することは、必要のない部分まで保持するため、無駄がある。これは容量的に無駄があるというだけでなく、切り取り元のWebページの切り取り対象部分以外に有する(記述されている)機能が副作用として実行されてしまうという現象を起こすことにもなる。例えば副作用としては、あるWebページにアクセスすると、ポップアップで別の情報(広告など)が表示されたり、音楽が流れたりするというようなものである。
また、切り取り元のWebページが持つ機能をそのままに、表示スタイルを貼り付け先のWebページに合わせるなど、2つのWebページを融合させたいというような場合にも上記手法では応えることができない。これは切り取り元のWebページの機能だけが必要だったのに、切り取り元のWebページのスタイルもそのまま引き継いでしまったということで、一種の副作用として考えることもできる。
以上、任意のWebページの情報を切り取って、新しいWebページに貼り付けたときに、任意のWebページが有する機能を、そのまま新しいWebページに引き継ぐ為には適切な範囲が切り取られることを期待するか、副作用がないことを期待する(あるいはあっても無視する)しかなかった。
本実施例では任意のWebページにおける任意の切り取り範囲の指定に対しても、その切り取り範囲からユーザが期待する機能を推定し、貼り付け先のWebページにおいて広い意味での副作用を起こすことなく、ユーザの期待する機能が正しく働く率を高めるものである。言い換えれば、本実施例では任意のWebページにおける任意の切り取り範囲を指定することで、その切り取り範囲からユーザが期待する機能を推定し、切り取り元のWebページ全体を保持するのではなく、推定した機能の実行に必要最低限と思われる部分を切り取るものである。
マッシュアップ装置には、切り取り元のWebページ上の画面を切り取らせて、その位置を位置情報として保持しておき、指定された貼り付け先のWebページにアクセスしたときに、切り取り元のWebページの位置情報から現在の切り取り元のWebページの情報を取り出して貼り付け先のWebページに合うように正規化を行い、現在アクセスしている貼り付け先のWebページに一時的に埋め込むことで、複数のWebページの機能をそのままに、マッシュアップさせるものがある。
しかしながら、上記のマッシュアップ装置は切り取り範囲が正当である(切り取り範囲はユーザが期待する機能を実行するのに必要な情報がすべてそろっている)ことを仮定している。そこで、本実施例は、ユーザにより指定された切り取り範囲に対して、切り取り範囲が示唆する機能(切り取り範囲からユーザが期待する機能)の実行に必要な情報をすべて含むように、指定された切り取り範囲を拡張するものである。
以下では、ユーザにより指定された切り取り範囲に基づいて、切り取り範囲が示唆する機能の実行に必要な情報をすべて含むように、切り取り範囲を拡張する方法について説明していく。
(切り取り範囲を拡張する方法)
ここでは、主に検索機能を有するWebページの検索窓を他のWebページに貼り付ける場合を例として説明する。Webページ上で検索機能をサービスとして提供する場合は入力フォームが用いられることが多い。入力フォームを表示するには<form>タグが用いられ、form要素(<form>~</form>)が一つのフォームとなる。フォーム要素中にはinput要素、select要素、textarea要素などのフォーム部品が配置される。
例えば、input要素はフォームの中のテキスト入力や実行ボタンなどの各フォーム部品を表示する。また、フォームは通常、ひとつのサブミット(実行)ボタンを持ち、各入力部品に値を入力した後、サブミットボタンが押されることで、<form>タグのmethod属性で指定した転送方法により、action属性で指定したアクションを呼び出す。
すなわち、input要素はform要素の部品であるため、<input>~</input>が切り取り範囲として指定されたとしても、<form>~</form>のフォーム全体で切り取らないと意味をなさないことになる。select要素、textarea要素もinput要素と同様、form要素の部品であるため、<form>~</form>のフォーム全体で切り取らなければ、意味をなさないことになる。
このような例は他にもあり、<param>タグは、<applet>タグ(HTMLドキュメントにJavaアプレットを挿入するためのタグ)や<object>タグ(画像・動画・音声・各種プラグインデータ・Javaアプレット・他のHTML文書等の様々な形式のデータを文書に埋め込むための汎用的なタグ)の中でデータが実行される際に必要となるパラメータを指定するタグであり、<applet>~</applet>や<object>~</object>のノード全体で切り取らなければ、意味をなさないことになる。
そこで、以下では<input>、<select>、<textarea>、<param>タグを部品タグと呼ぶこととする。<form>、<applet>や<object>タグを構成タグと呼ぶこととする。部品タグと構成タグとの関係は図5のような部品・構成タグ一覧テーブルとして保持される。図5は部品・構成タグ一覧テーブルの一例の構成図である。
図5の部品・構成タグ一覧テーブルは、<input>、<select>、<textarea>タグが<form>タグの部品タグであることを表す。図5の部品・構成タグ一覧テーブルは、<param>タグが<applet>や<object>タグの部品タグであることを表す。
また、図5の部品・構成タグ一覧テーブルは、<form>タグが<input>、<select>、<textarea>タグの構成タグであることを表す。図5の部品・構成タグ一覧テーブルは、<applet>や<object>タグが<param>タグの構成タグであることを表す。
図6は切り取り範囲を拡張する第1の方法を示す説明図である。図6は部品の指定に対して構成ノードを見つけることにより切り取り範囲を拡張するものである。未解決部品確認部12は切り取り範囲(HTMLフラグメントあるいはドキュメントツリーのサブツリー)が与えられる。
例えば未解決部品確認部12はユーザにより指定された図7の赤枠15が示す検索窓が切り取り範囲として与えられる。図7は切り取り元のWebページの一例のイメージ図である。図7のWebページはHTMLで示されるが、そのドキュメントツリーが図8に示すようになっている。
図8はドキュメントツリーの一例の構成図である。切り取り範囲として与えられた赤枠15が示す検索窓はform要素の下位構造のp要素の最初のinputノード20に対応したinput要素となる。未解決部品確認部12では、切り取り範囲が与えられる。具体的には切り取り範囲がドキュメントツリーのノードとして与えられる。木構造上のノードは、そのノードをルートとするサブツリーを示すと考える。
すなわち、図8のinputノード20はHTML上で<input>〜</input>のinput要素を示しているものとする。未解決部品確認部12では、与えられたノード自身あるいは与えられたノードより木構造での下位構造に、form要素などの構成要素の下位構造ではないinput等の部品要素(木構造上では部品タグでラベル付けされるノード)を有するかどうかを判定する。
例えば、図8のinputノード20は、自分自身が部品要素である。したがって、未解決部品確認部12はinputノード20が未解決部品要素ということで未解決部品要素ありと判定する。
inputノード20の兄弟のspanノード21が与えられた場合は、spanノード21自身が部品要素ではなく、spanノード21より木構造での下位構造を辿っても、a要素があるだけである。したがって、未解決部品確認部12はa要素が部品要素でないということで未解決部品要素なしと判定する。
inputノード20の親であるpノード22が与えられた場合は、pノード22自身が部品要素ではないが、pノード22より木構造での下位構造を辿ると、form等の構成要素がないままに部品要素であるinputノード20が出現する。したがって、未解決部品確認部12は未解決部品要素ありと判定する。pノード22の先祖のformノード23が与えられた場合は、formノード23自身が構成要素である。したがって、未解決部品確認部12は未解決部品要素なしと判定する。
formノード23の先祖であるbodyノード24が与えられた場合、bodyノード24より木構造での下位構造を辿っても、構成要素なしで部品要素が出現することはない。したがって、未解決部品確認部12は未解決部品要素なしと判定する。図8ではbodyノード24の下位のdivノード25の下にformノード23が出現する。したがって、未解決部品確認部12はformノード23の下位にあるinputノード20まで見に行かない。
以上のように、未解決部品確認部12では、与えられた範囲(ノード)において、未解決部品要素があるかないかの確認を行う。未解決部品要素がない場合、未解決部品確認部12は与えられた範囲(ノード)を、そのまま返すことになる。また、未解決部品要素がある場合、未解決部品確認部12は関連構成取得部13を呼び出す。
関連構成取得部13は与えられた範囲(ノード)に対して木構造での上位構造を辿っていき、構成要素を見つける。構成要素を見つけると、関連構成取得部13は見つけた構成要素(構成ノードをルートとするサブツリー)を正規化された範囲(正規化切り取り範囲)として返す。
inputノード20の場合には、木構造での上位構造を辿っていくとformノード23のところで構成要素が見つかるので、form要素(formノード23をルートノードとするサブツリー)が正規化切り取り範囲として返される。pノード22の場合も、木構造での上位構造を辿っていくとformノード23のところで構成要素が見つかるので、form要素が正規化切り取り範囲として返される。
なお、上記では部品要素の部分(下位)構造(例えばボタンに記述された文字列)が切り取り範囲として指定された場合に、下位構造を部品要素と見なさなかったが、部品要素の一部としてみなすことも可能である。その場合、未解決部品確認部12は、下位構造を辿って部品要素を探すとともに、上位構造を辿って構成要素より上位構造にはない部品要素の存在を確かめることになる。
切り取り範囲を拡張する第1の方法では、リテラシーの低い人やHTMLソースとブラウザ画面との対応関係を与えるユーザインタフェースの制限上の問題などにより、部品要素のみが選択された場合であっても、その部品要素を利用する構成要素が正規化切り取り範囲(マッシュアップ対象)として選択される。
これにより、切り取り範囲を拡張する第1の方法では、単純に切り取った部分(切り取り範囲)を貼り付けた場合に比べて、一般的に意図されるとおりの機能(ユーザが期待する機能)が保存される可能性を大幅に増加させる。また、切り取り範囲を拡張する第1の方法では、貼り付け部分(正規化切り取り範囲)の増加が最小限であり、副作用を起こす可能性も少ない。
ただし、切り取り範囲に関連する機能が局所的な切り取りで実現しない場合には、切り取り範囲を拡張する第1の方法だけで一般的に意図されるとおりの機能を保存することができない。
次に、切り取り範囲を拡張する第2の方法について説明する。例えば切り取り範囲は下記のような要素(HTML記述)であったとする。
<form id="fm1" onsubmit="return f()">
<input type="text" name="q" value="" size="35">
<input type="submit" value="検索">
</form>
onsubmit属性は、送信ボタンが押された時に起動するスクリプトを記述しているものである。上記のHTML記述では「検索」が押されると関数f()が呼び出される。上記の要素ではform要素(<form>〜</form>)だけでアクションが完結せず、関数f()も取り込まなければならない。
関数f()は、Webページ中のどこかに直接記述されているか、あるいは外部から取り込まれるスクリプトの中に記述されているはずである。そこで、切り取り範囲を拡張する第2の方法は、Webページのスクリプト記述のすべてと、外部からスクリプトを読み込む記述とをすべて取り込んでおき、貼り付け先のWebページにもWebページのスクリプト記述のすべてと、外部からスクリプトを読み込む記述とをすべて反映させることにより関数f()を実行できるようにする。
図9は、切り取り範囲を拡張する第2の方法を示す説明図である。図9は、切り取り範囲に関連する機能が局所的な切り取りで実現しない場合に、Webページ内の全てのアクションを見つけて切り取り範囲を拡張することで、一般的に意図されるとおりの機能を保存するものである。
アクション取得部32は、切り取り範囲から呼び出される関数や変数の定義(あるいは呼び出された関数から繰り返し的に呼び出される関数や変数の定義)を含む可能性のあるアクション要素を取得する。なお、アクション要素は、アクション要素テーブルにある要素名(タグ)により判定される。図10は、アクション要素テーブルの一例の構成図である。アクション取得部32は切り取り元のWebページのドキュメントツリーを入力として受け取り、ドキュメントツリーの各ノードに対して、アクションを含むノード(アクション要素)を切り出していく。
アクション要素の典型的なものはscript要素である。<script>タグはJavaScriptなどのスクリプトを記述するものであり、<script>~</script>に直接スクリプトが記述されることもあるし、<script type="text/javascript" src="xxx.js" />のようにsrc属性により呼び出される外部ファイルに記述されることもある。
アクション要素としては、script要素以外にform要素がある。例えば下記のようなform要素であったとする。
<form id="f1" name="f1" method="post" action="">
<input name="q" type="hidden" value="">
<input name="r" type="hidden" value="s">
</form>
このform要素は、すべてのinput要素がhiddenであり、ユーザに何も入力を要求しておらず、他のアクション要素の補助的な働きを持つものである。したがって、上記のようなform要素はアクション要素として切り出すことが必要になる。
アクション要素管理部33は切り出されたアクション要素を適切な形式に変換してアクション要素集合テーブル31に保持する。例えば、アクション要素は、その記述自身で保持する方法もあるし、そのアクション要素の位置をXPathのような形式で保持してもよい。アクション要素集合出力部34はドキュメントツリー全体からアクション要素を取得し終えたならば、切り取り位置の拡張として追加すべきアクション要素集合をアクション要素集合テーブル31から出力する。
切り取り範囲を拡張する第2の方法では、Webページ内にあるすべてのアクションを切り取るので、局所的な切り取りで実現しない機能を保存できる。また、切り取り範囲を拡張する第2の方法は切り取り元のWebページ全体でなく、アクションで切り取り範囲を拡張するため、切り取り元のWebページ全体を取り出して貼り付け先のWebページに貼り付けるよりも切り取り範囲が限定され、スタイル等の取り込みを制御することができる。
しかし、切り取り範囲を拡張する第2の方法はアクションのすべての部分を切り取ってしまうので、広告のような定型情報の表示など、副作用が残ることもある。次に、切り取り範囲を拡張する第3の方法について説明する。
スクリプトには命令やイベントハンドラ等から呼び出されたときに実行される関数の定義が記述される。しかし、次のスクリプトは命令だけで関数定義がない例である。
<div>
<script type="text/javascript">
document.write("Hello ")
</script>
world
</div>
上のスクリプトは、読み込まれた時点で評価されて実行される。したがって、上のスクリプトの実行結果(スクリプトを実行した後のドキュメントツリー)は、Hello worldとなる。
このように、スクリプト中に関数定義のないものは、他のアクションから参照されない独立したものなので、切り取り範囲として付け加える必要がない。しかもスクリプト中に関数定義のないものは、逆に残してしまうと、上のスクリプトのように本来切り取った部分にない余分なテキストを書き出したり、あるいは広告を表示したりするなどの副作用を起こすかもしれない。
そこで、上のような関数定義のないスクリプトなど、本来の切り取り範囲にある機能の実現に関係のなさそうなアクション要素は切り取りリストに入れないようにする。
以下に他の例を示す。例えば、以下のようなform要素がアクションとして切り出されたとする。
<body>
<form id="f1" name="f1" method="post" action="">
<input name="q" type="hidden" value="">
<input name="ie" type="hidden" value="UTF-8">
<input name="ref" type="hidden" value="sa">
</form>
<h1>ヘッダ</h1>
‥
このform要素ではすべてのinputのtypeがhiddenとなっている。これは、入力用の窓やボタン等がブラウザ上になにも表示されていないことを意味する。また、このform要素はh1の手前に独立して存在している(何かのブロック内部ではない)。このことから、本form要素は独立して用いられるというよりも、何か別のform要素に付随する(別のスクリプトから呼び出される)可能性が高い(独立度が低い)と判断できる。
一方、以下のようなform要素がアクションとして切り出されたとする。
<form action="http://xxx/search.js" name="search" method="get">
<B>WEBサイト検索</B>
<input type="text" size="28" name="search"><input type="submit" value="検索">
<input type="hidden" name="target" value="combined">
<input type="hidden" name="look" value="yyy">
</form>
このform要素では一部のinputのtypeがhiddenとなっているが、type="text"とtype="submit"があり、通常の入力に対して検索などの何かの処理を実行するためのフォームの可能性が高い(独立度が高い)と判断できる。このような独立度の高いアクションの中には、サブミットしない限り、副作用を及ぼさないものもあるが、広告等の定型的な情報を出力するためにも使われている。
図11は、切り取り範囲を拡張する第3の方法を示す説明図である。図11は、切り取り範囲に関連する機能が局所的な切り取りで実現しない場合に、Webページ内の全てのアクションから切り取り範囲とアクションとの関連性によってアクションを絞り込んで切り取り範囲を拡張することで、一般的に意図されるとおりの機能を保存するものである。
切り取り範囲を拡張する第3の方法は、各アクション要素に対して、切り取り範囲内のアクション要素との関連度を計算して(アクション要素の独立度が高ければ関連度は低いことになる)、アクション要素集合として残すかどうか篩にかける。図11は図9の構成にアクション要素取捨選択部35を付け加えたものになっている。
アクション要素取捨選択部35は、プログラムの形態、存在位置、変数等から、与えられたアクション要素の独立度や、切り取り範囲のアクションとの関連度を計算する。アクション要素取捨選択部35は、独立度が低く、切り取られた範囲との関連度が高いと認められたアクション要素(例えばある閾値以上の場合)だけを残す。独立度が低く、切り取られた範囲との関連度が高いと認められたアクション要素だけを残すアクション要素取捨選択部35の処理の詳細は後述する。
なお、アクション要素取捨選択部35は、独立度が低く、切り取られた範囲との関連度が高いアクション要素を自動的に判定しても構わないし、人が何らかの指示を与えるのでも構わない。
切り取り範囲を拡張する第3の方法では、Webページ内にあるそれぞれのアクション要素に対して、切り取り範囲内にあるアクション要素との関連性を計算して、切り取り範囲として残す部分を絞り込むので、副作用(切り取り範囲とは無関係で独立な広告表示等の不要なアクションの実行)の可能性を大幅に減らすことができる。
しかし、切り取り範囲を拡張する第3の方法によるアクション関連度計算はヒューリスティックスによるものとなるので、副作用が残る場合や、本来必要だったアクション要素を篩にかけて落としてしまうという場合も起こりえる。次に、切り取り範囲を拡張する第4の方法について説明する。
例えば、以下のスクリプトを切り取ったとする
<form style="margin: 0px;" id="fm1" name="fm1" onSubmit="return goF2('fm1')">
<input name="q" autocomplete="off" value="" size="35" class="j12" accesskey="e" type="text" />
<input value="検索" class="j12" onclick="return goF1('fm1')" type="button" />
<input value="クリア" onclick="javascript:wordClear('fm1')" class="j12" type="button" />
</form>
このスクリプトでは、goF2とgoF1という関数を呼び出している。したがって、より正確にアクション要素を絞り込む為には呼び出している関数が定義されているアクション要素に絞り込んだアクション要素集合を取り出せば良い。しかし、実際には関数定義の中からまた別のアクション要素に記述されている関数や変数などを呼び出しているかもしれないので、未解決な識別子(関数や変数)を管理しながら、取り込むべきアクション要素を決定することが必要になる。
図12は、切り取り範囲を拡張する第4の方法を示す説明図である。図12は、切り取り範囲に関連する機能が局所的な切り取りで実現しない場合に、Webページ内の全てのアクションからアクションの解析によって、より正確にアクションを絞り込んで切り取り範囲を拡張することで、一般的に意図されるとおりの機能を保存するものである。図12は図9の構成に識別子参照定義関数取得部36,識別子定義元アクション要素取得部37及び識別子管理部38を付け加えたものになっている。
識別子管理部38は、解決した(取り込んだアクション要素内で定義されている)識別子(関数や変数)と未解決な(取り込んだアクション要素内だけではまだ定義されていない)識別子を管理するものである。
識別子参照定義関係取得部36は、与えられたアクション要素に対して、まずスクリプトを取り込む。取り込むスクリプトは、スクリプトがアクション要素内部で記述されている場合、それ自身である。また、取り込むスクリプトは、外部ファイルが参照されている場合、その外部ファイルを取り込んで、その外部ファイルに記述されているスクリプトになる。識別子参照定義関係取得部36は、取り込んだスクリプトを解析し、そのスクリプト内部でどのような識別子が定義されているか、またどのような外部識別子を参照しているかを解析する。
識別子定義元アクション要素取得部37は、未解決な識別子に対して、識別子参照定義関係取得部36の解析結果を利用して、その識別子を解決するためのアクション要素を特定するものである。
実際の動作は、例えば、まず切り取り範囲内のアクション要素に対する未解決および解決済の識別子を識別子管理部38に与える。識別子参照定義関係取得部36ではあらかじめすべてのアクション要素に対して、どのアクション要素でどの識別子が定義され、どのような識別子が参照されるかを解析し、その一覧表を保持しておく。
識別子定義元アクション要素取得部37では識別子管理部38から未解決な識別子を取り出し、識別子参照定義関係取得部36の解析結果を参照して、その識別子を解決するためのアクション要素を特定する。識別子定義元アクション要素取得部37は、特定したアクション要素をアクション要素管理部33に通知するとともに、取り込んだアクション要素によって定義されている識別子の情報と、外部参照が行われている識別子の情報とを識別子管理部38に通知する。そして、識別子定義元アクション要素取得部37は未解決な識別子がなくなるまでこのような動作を繰り返すことで、すべての識別子を解決済とするアクション要素の集合を特定する。なお、識別子参照定義関数取得部36,識別子定義元アクション要素取得部37及び識別子管理部38の処理の詳細は後述する。
(本実施例の詳細)
図13は本実施例のマッシュアップ装置を含むシステムの一実施例の構成図である。図13のシステムは、Webマッシュアップ設定装置100,Webマッシュアップ実現装置110,アノテーション管理サーバ120を有している。
Webマッシュアップ設定装置100はユーザに切り取り部分および貼り付け先を指定させる。Webマッシュアップ実現装置110はユーザに指定された切り取り部分および貼り付け先に基づいたマッシュアップ結果を表示する。アノテーション管理サーバ120はマッシュアップするためのデータを管理する。Webマッシュアップ設定装置100及びWebマッシュアップ実現装置110はWeb閲覧器101,111の拡張機能として実施される。図13ではWebマッシュアップ設定装置100とWebマッシュアップ実現装置110とを分けているが、一つのWeb閲覧器の拡張機能として同時に実現してもよい。
Webマッシュアップ設定装置100は、Web閲覧器101,切り取り元選定部102,範囲提示選定部103,貼り付け先選定部104,アノテーション管理部105を有する。
範囲提示選定部103は、通常のWeb閲覧器101によるWebページの表示においてユーザの特定の操作を受けることで、切り取り範囲や貼り付け先の位置の候補をユーザのキーボードやマウス操作などによって提示する。範囲提示選定部103は、指定された操作(例えばctrl−cやctrl−v)によって現在表示されている範囲に相当する木構造上の位置を返す。
切り取り元選定部102はユーザの特定の操作によって切り取り候補の提示・取得作業を開始し、指示された範囲の切り取りを行う(実際には切り取り位置を取得する)。貼り付け先選定部104はユーザの特定の操作(例えば切り取り終了や特定のキー操作)によって貼り付け候補の提示・取得作業を開始し、指示された位置を貼り付け先と決定(実際には貼り付け位置を取得する)し、切り取り情報(切り取ったWebページのURIと切り取った部分のXPath)と貼り付け情報(貼り付けるWebページのURIである貼り付け先URIと貼り付け位置のXPath)とをセットとしてアノテーション管理部105に渡す。
アノテーション管理部105は与えられた切り取り情報と貼り付け情報とをセットにしたアノテーション情報の登録をアノテーション管理サーバ120に依頼する。なお、切り取りから貼り付けの間にはWeb閲覧器101による一般的なWebページ間の移動やWebページ内での移動などが行われる。
Web閲覧器101による一般的なWebページ間の移動やWebページ内での移動などの作業が一連の作業として行われることを前提とする場合は、切り取り情報を一時的にメモリに保持しても良いが、切り取り作業の終了時に切り取り情報を外部のファイルに書き込み、貼り付け作業の開始時に適切な切り取り情報を外部のファイルから取り出すという形態でも良い。
アノテーション管理サーバ120は、アノテーションデータベース管理部121,アノテーションデータベース122を有する。アノテーションデータベース管理部121はWebマッシュアップ設定装置100からの依頼を受け、切り取り情報と貼り付け情報とをセットとしたアノテーション情報をアノテーションデータベース122に登録する。
また、アノテーションデータベース管理部121はWebマッシュアップ実現装置110からの依頼を受け、指定されたURIを貼り付け先URIとして持つアノテーション情報を返す。なお、アノテーション管理サーバ120は、Webマッシュアップ設定装置100及びWebマッシュアップ実現装置110と同一のコンピュータ上に実現しても構わないし、ネットワークを介して繋がった別のコンピュータ上に実現しても構わない。
Webマッシュアップ実現装置110は、Web閲覧器111,切り出し情報取得部112,正規化部113,貼り付け位置獲得部114,合成部115,アノテーション管理部116を有する。
Web閲覧器111は指定されたURIのコンテンツ(Webページ)をネットワークから取り込む。このとき、アノテーション管理部116は指定されたURIに付与されたアノテーション情報をアノテーション管理サーバ120に要求して受け取る。切り出し情報取得部112は受け取ったアノテーション情報の個々について、アノテーション情報に記述された切り取り元のURIをWeb閲覧器111に渡し、切り取り元のURIのコンテンツをネットワークから取り込み、アノテーション情報に記述された切り取り元のXPathの部分(HTML断片)を切り出す。
正規化部113は切り出されたHTML断片を、貼り付け先のWebページの環境に適合するように正規化する。貼り付け位置獲得部114はアノテーション情報に記述された貼り付け先のXPathからHTML断片を貼り付ける貼り付け位置を求める。
合成部115は、貼り付け位置獲得部114が求めた貼り付け位置に正規化されたHTML断片を貼り付ける。なお、正規化されたHTML断片が合成部115により貼り付けられたWebページのDOMツリーは、後述するように、レンダリングエンジンによってレンダリングされて表示される。
図13のWebマッシュアップ設定装置100,Webマッシュアップ実現装置110及びアノテーション管理サーバ120は、例えば図14に示すコンピュータシステムにより実現できる。
図14はコンピュータシステムの一例の構成図である。コンピュータシステムは、それぞれバスBで相互に接続されている入力装置151,出力装置152,ドライブ装置153,補助記憶装置154,主記憶装置155,演算処理装置156及びインターフェース装置157を有する。
入力装置151はキーボードやマウス等である。入力装置151は各種信号を入力するために用いられる。出力装置152はディスプレイ装置等である。出力装置152は各種ウインドウやデータ等を表示するために用いられる。インターフェース装置157はモデムやLANカードなどであり、ネットワークに接続する為に用いられる。
本実施例のマッシュアッププログラムはWebマッシュアップ設定装置100,Webマッシュアップ実現装置110を制御する各種プログラムに含まれる。マッシュアッププログラムは例えば記録媒体158の配布やネットワークからのダウンロードなどによって提供される。マッシュアッププログラムを記録した記録媒体158は、CD−ROM、フレキシブルディスク、光磁気ディスク等の様に情報を光学的,電気的或いは磁気的に記録する記録媒体、ROM、フラッシュメモリ等の様に情報を電気的に記録する半導体メモリ等、様々なタイプの記録媒体を用いることができる。
マッシュアッププログラムを記録した記録媒体158がドライブ装置153にセットされると、マッシュアッププログラムは記録媒体158からドライブ装置153を介して補助記憶装置154にインストールされる。
ネットワークからダウンロードされたマッシュアッププログラムはインターフェース装置157を介して補助記憶装置154にインストールされる。補助記憶装置154はインストールされたマッシュアッププログラムを格納すると共に、必要なファイル,データ等を格納する。
主記憶装置155は、コンピュータの起動時に補助記憶装置154からマッシュアッププログラムを読み出して格納する。そして、演算処理装置156は主記憶装置155に格納されたマッシュアッププログラムに従って、後述の各種処理を実現している。
(マッシュアッププログラムがWeb閲覧器に適用された例)
図15は、本実施例のマッシュアッププログラムを適用したWeb閲覧器の一例の構成図である。図15のWeb閲覧器160は、典型的な構成を示したものであり、説明に不要なCSSの処理やPDFプラグイン等の細かい部分を省略している。
ネットワークを経由して受信されたHTML文書161をHTMLパーサ162は解析して、木構造(DOMツリー)163を生成する。これと同時に、Javascriptエンジン165はHTML文書161中にあったJavascriptプログラム164を実行し、DOMツリー163の中身を書き換える。書き換えられたDOMツリー163はレンダリングエンジン166に送られる。
レンダリングエンジン166は送られてきたDOMツリー163を画面で見える形に変換する。そして、ユーザインタフェース167を介したユーザの操作等によってJavascriptエンジン165はJavascriptプログラム164に従って、DOMツリー163を書き換え、表示させる内容を変化させる。マッシュアッププログラム168は、典型的にWeb閲覧器160の中に保持される(すなわち、Web閲覧器160に組込まれる、あるいは機能拡張として付け加えられる形で実現される)。
そして、読み込まれたHTML文書161のJavascriptプログラム164が実行されるのに追加して、マッシュアッププログラム168は実行され、DOMツリー163を書き換える。
なお、マッシュアッププログラム168が参照するアノテーションデータベース等のデータはWeb閲覧器160の外部に保持される。マッシュアッププログラム168を保持する別の実施形態としては、読み込まれるHTML文書161に、マッシュアッププログラム168を保持しておくことが考えられる。この実施形態では、適用できるWebページが限定されるが、Web閲覧器160にマッシュアッププログラム168を保持するのと同じ効果を持たせることができる。
以下では、図13のシステムにおけるWebマッシュアップ設定装置100及びWebマッシュアップ実現装置110の処理について説明する。
(Webマッシュアップ設定装置100)
Webマッシュアップ設定装置100を組込んだ典型的なWeb閲覧器101は、切り取り元選定部102、範囲提示選定部103、貼り付け先選定部104、アノテーション管理部105を有する。
図16は、切り取り元選定部の処理を表したフローチャートである。切り取り元選定部102は、Web閲覧器101に埋め込まれたコマンド(キー操作やメニュー、ボタンなど)により起動される。
ステップS21に進み、起動された切り取り元選定部102はモードを切り取りとして範囲提示選定部103を起動する。ステップS22に進み、切り取り元選定部102は範囲提示選定部103から切り取り位置のノード(XPath)を受け取る。ステップS23に進み、切り取り元選定部102は範囲提示選定部103から受け取った切り取り位置のノード(XPath)を切り取り情報として一時的に格納して終了する。
図17は、貼り付け先選定部の処理を表したフローチャートである。貼り付け先選定部104は、切り取り元選定部102の終了によって、あるいはWeb閲覧器101に埋め込まれたコマンド(キー操作やメニュー、ボタンなど)により起動される。
ステップS31に進み、起動された貼り付け先選定部104はモードを貼り付けとして範囲提示選定部103を起動する。ステップS32に進み、貼り付け先選定部104は範囲提示選定部103から貼り付け位置のノード(XPath)を受け取る。
ステップS33に進み、貼り付け先選定部104はアノテーション管理部105を呼び出し、一時的に格納してあった切り取り情報と範囲提示選定部103から受け取った貼り付け位置のノード(XPath)である貼り付け情報とをセットにして、アノテーションデータベース122に登録する。
図18は、範囲提示選定部の処理を表したフローチャートである。範囲提示選定部103はユーザのアクション等により、切り取り位置、或いは、貼り付け位置のノード(XPath)を切り取り元選定部105又は貼り付け先選定部104に返すものである。具体的に範囲提示選定部103は、例えばマウスカーソルの移動によって現在注目している木構造上のノードを画面上で選定させ、木構造上のノードをマウスクリックによって確定させるものである。
ステップS41に進み、範囲提示選定部103は、現在が切り取り作業のための範囲提示なのか、貼り付け作業のための範囲提示なのかのモードを受け取る。例えば範囲提示選定部103は切り取り元選定部102から切り取り作業のための範囲提示であることを示す切り取りモードを受け付ける。また、範囲提示選定部103は貼り付け先選定部104から貼り付け作業のための範囲提示であることを示す貼り付けモードを受け付ける。範囲提示選定部103は受け付けたモードを起動させる。
ステップS42に進み、範囲提示選定部103は、画面上のマウスカーソルの位置を求める。ステップS43に進み、範囲提示選定部103は画面上のマウスカーソルの位置に対応するWebページの木構造上の位置を求める。ステップS44に進み、範囲提示選定部103は画面上のマウスカーソルの位置に対応するWebページの木構造上の位置から適切なノード(要素)を現在のノードとして求める。例えば範囲提示選定部103は文字や文字間(#textノード)ならば、上位ノード(pノード、tdノード、h1ノードなど)を現在のノードとする。
ステップS45に進み、範囲提示選定部103は現在のノードを囲う枠をモードに合わせて表示する。範囲提示選定部103は例えば切り取り作業の枠の色と貼り付け作業の枠の色とを変更する。また、範囲提示選定部103はマウスカーサの動きにより枠を大きくしたり小さくしたりする。
ステップS46に進み、範囲提示選定部103は予め設定したアクション(マウスボタンをクリックするであるとか、指定されたキー入力など)による割り込みがあれば、その時点でのノード(枠が表示されている範囲)を切り取り元選定部102又は貼り付け先選定部104に返す。なお、範囲提示選定部103は予め設定したアクションによる割り込みがなければ、ステップS42に戻り、処理を続ける。
(Webマッシュアップ実現装置110)
本実施例のマッシュアッププログラム168を組み込んだWeb閲覧器(あるいは一般にWebクライアント)111は図19に示すフローチャートのような動作を行う。図19はWebマッシュアップ実現装置の処理を表したフローチャートである。
図19中、ステップS51では、Web閲覧器111が、表示するWebページのURIを受け取る。ステップS52に進み、Web閲覧器111は受け取ったURIで指定されるWebページをネットワークから読み込む。ステップS53に進み、Web閲覧器111は読み込んだWebページをパーサによって解析し、構造を抽出する。抽出された構造は木構造(ツリー)の形をとる(例えばDOMツリー)。
ステップS54に進み、アノテーション管理部116は受け取ったURIをキーとしてアノテーション管理サーバ120にアクセスし、受け取ったURIが貼り付け先に指定されている全てのアノテーション情報を獲得する。そして、Webマッシュアップ実現装置110はステップS54で獲得したアノテーション情報のそれぞれに対して以下の処理を行う。
まず、ステップS55に進み、切り出し情報取得部112は受け取ったアノテーション情報に記述された切り取り元のURIを獲得する。ステップS56に進み、切り出し情報取得部112は獲得した切り取り元のURIをWeb閲覧器111に渡し、切り取り元のURIのWebページをネットワークから獲得する。ステップS57に進み、Web閲覧器111は獲得した切り取り元のURIのWebページを、HTMLパーサ162で解析する。
ステップS58に進み、切り出し情報取得部112はアノテーション情報に記述された切り取り元のXPathから切り取り位置を求め、切り取り元のWebページの切り取り位置からHTML断片を取り出す。ステップS59に進み、正規化部113は取り出されたHTML断片を、貼り付け先のWebページの環境に適合するように正規化する。
ステップS60に進み、貼り付け位置獲得部114はアノテーション情報に記述された貼り付け先のXPathと、ステップS53で抽出された木構造とに基づき、HTML断片を貼り付ける木構造上の貼り付け位置を獲得する。ステップS61に進み、合成部115は貼り付け位置獲得部114が獲得した貼り付け位置に、正規化されたHTML断片を埋め込む(接ぎ木する)。
ステップS54で獲得したアノテーション情報のそれぞれに対するステップS55〜S61の処理が終了すると、Web閲覧器111はステップS62に進み、アノテーション情報のそれぞれのHTML断片が埋め込まれた木構造をレンダリングエンジン166に渡してレンダリングする。
(本実施例におけるマッシュアップ方法の3つの実施形態)
本実施例におけるマッシュアップ方法を図13のマッシュアップ装置に組込む典型的な実施形態としては、第1〜第3の実施形態がある。第1の実施形態は、切り取る位置を指定された時に、その時点で位置を拡張する方法である。第2の実施形態は、Webマッシュアップ実現時に位置を拡張する方法である。第3の実施形態は、ユーザインタフェースとして必要最小限の情報を含まない時に切り取りができないようにする方法である。
以下、第1〜第3の実施形態について説明する。
第1の実施形態は、Webマッシュアップ設定装置100の切り取り元選択部102を拡張するものである。第1の実施形態では、切り取り範囲が指定された後、切り取り範囲を正規化する。この正規化された切り取り範囲をアノテーション管理部105に対して正規化切り取り範囲として与えることで、第1の実施形態はユーザが指定した切り取り範囲にかかわらず正規化した切り取り範囲が与えられるので、期待される機能が保持されたマッシュアップが可能となる。
第2の実施形態は、Webマッシュアップ実現装置110の切り出し情報取得部112を拡張するものである。第2の実施形態ではアノテーション情報として実際に切り取った範囲(正規化前のもの)を保持しておく。第2の実施形態では、Webマッシュアップ実現装置110の切り出し情報取得部112がアノテーション情報として切り取り範囲が与えられる。切り出し情報取得部112は切り取り元のWebページからHTMLフラグメントを取得する前に、与えられた切り取り範囲を正規化して、正規化された範囲(正規化切り取り範囲)を用いて実際の切り取りを行う。
このように第2の実施形態は、第1の実施形態と正規化するタイミングが異なる。第1の実施形態では切り取り時に1回だけ正規化を行えば良い。第2の実施形態ではマッシュアップされた情報を表示するWebマッシュアップ実現時に毎回正規化を行う必要がある。その代わり、第2の実施形態では切り取り時から貼り付け時の間にスクリプトの変更などがあった場合、新しいスクリプトに基づいて切り取り範囲等が決定されることになる。
第3の実施形態は、Webマッシュアップ設定装置100の範囲提示選定部103を拡張するものである。第3の実施形態では、ユーザインタフェースとして切り取れる範囲を提示する際に、木構造上の内部的に指し示しているノード(切り取り範囲)と正規化された切り取り範囲とを同時に持つようにする。
第3の実施形態は、通常(特殊な操作をしない限り)、ユーザに正規化された範囲しか提示しないことで正規化された範囲でしか切り取れないようにするものである。第3の実施形態は、ユーザに対して何が起きているのかを示しやすくなる。なお、実施形態1〜3は複数を組み合わせることもあり得る。
(切り取り範囲を拡張する第1の方法)
図5のような部品・構成タグ一覧テーブルは、部品タグと構成タグとの関係を保持したものである。部品タグは検索等の機能を実現するための部品であって単独では意味をなさない。構成タグは部品タグをまとめて機能を実現する為のスクリプト(プログラム)を呼び出す役割を果たす。
図20は未解決部品確認部の処理手順を表した一例のフローチャートである。ステップS71に進み、未解決部品確認部12は切り取り範囲をドキュメントツリーのノードとして受け取り、このノードを一つ含む探索リストを設定する。
ステップS72に進み、未解決部品確認部12は探索リストが空になったら未解決部品ノードなしを返す。探索リストにメンバが存在するならば、未解決部品確認部12はステップS73に進み、メンバ(ノード)を一つ取り出し、取り出したメンバを探索リストから取り除く。
ステップS74に進み、未解決部品確認部12は取り出したメンバが部品要素か否かを確認する。具体的に、未解決部品確認部12は取り出したノードのタグ名が部品・構成タグ一覧テーブル11に部品タグ名として登録されているか否かを確認する。
取り出したノードのタグ名が部品タグとして登録されているならば未解決部品確認部12は取り出したメンバが部品要素であると判定する。部品要素であると判定すれば、未解決部品確認部12は未解決部品ノードありを返す。部品要素であると判定しなければ、未解決部品確認部12はステップS75に進み、ステップS74と同様、取り出したメンバが構成要素か否かを確認する。構成要素であると判定すれば、未解決部品確認部12はステップS72に戻る。
すなわち、未解決部品確認部12はステップS73で取り出したノードの下位構造に関しての探索を行わない。構成要素でないと判定すれば、未解決部品確認部12はステップS73で取り出したノードの子ノードが存在するならば、その子ノードをそれぞれ探索リストのメンバとしてつけ加えたあと、ステップS72に戻る。すなわち、構成要素でなかった場合、未解決部品確認部12はステップS73で取り出したノードの下位構造も部品要素を探索することになる。
図21は、未解決部品確認部のオプションの処理手順を表した一例のフローチャートである。図20のフローチャートでは、検索窓の中の文字列など、部品要素の内部が選択された場合に、部品要素ではないとしている。しかし、部品の内部の要素も部品であると考えるならば、未解決部品確認部12は部品要素でないと判定されたときに、さらに図21のフローチャートの処理を実行する。
すなわち、未解決部品確認部12はステップS81に進み、オリジナルノード(切り取り範囲)を受け取る。ステップS82に進み、未解決部品確認部12は受け取ったオリジナルノードがトップノードか否かを判定する。トップノードでなければ、未解決部品確認部12はステップS83に進み、オリジナルノードが構成要素か否かを確認する。構成要素であると判定しなければ、未解決部品確認部12はステップS84に進み、オリジナルノードが部品要素か否かを判定する。部品要素であると判定しなければ、未解決部品確認部12はステップS85に進み、オリジナルノードを一つ上位ノードへ移動させたあとステップS82に戻る。
ステップS82において、未解決部品確認部12は受け取ったオリジナルノード又はステップS85で移動されたノードがトップノードであれば、オリジナルノードが部品要素の部分でないと判定する。ステップS83において、受け取ったオリジナルノード又はステップS85で移動されたノードが構成要素であれば、未解決部品確認部12はオリジナルノードが部品要素の部分でないと判定する。
ステップS84において、未解決部品確認部12は受け取ったオリジナルノード又はステップS85で移動されたノードが部品要素であれば、オリジナルノードが部品要素の部分であると判定する。
図21のフローチャートの処理において、未解決部品確認部12はオリジナルノードからノードを順に上位ノードへ辿っていき、構成要素や部品要素が見つからないままトップノードに辿り着いたならば、オリジナルノードが部品要素の部分でないと判定する。先に構成要素が見つかった場合も、未解決部品確認部12はオリジナルノードが部品要素の部分でないと判定する。先に部品要素が見つかった場合、未解決部品確認部12はオリジナルノードが部品要素の内部であったと判定する。なお、本実施例では、例えば、検索のボタンとボタンとの間にある文字列を部品要素と考えないことになる。
図22は関連構成取得部の処理手順を表した一例のフローチャートである。ステップS91に進み、関連構成取得部13はオリジナルノード(切り取り範囲)を受け取る。ステップS92に進み、関連構成取得部13はオリジナルノードを一つ上位ノードへ移動させる。ステップS93に進み、関連構成取得部13はステップS92で移動されたノードが構成要素でなければステップS92に戻り処理を繰り返す。ステップS92で移動されたノードが構成要素であれば、関連構成取得部13はステップS92で移動されたノードを正規化された範囲(正規化切り取り範囲)として返す。
図22のフローチャートの処理において、関連構成取得部13は切り取られた範囲に未解決部品要素があると未解決部品確認部12に判定された場合に呼び出される。関連構成取得部13では切り取られた範囲であるドキュメントツリーのノードを起点として、上位ノードへ一つずつ辿っていく。辿ったところのノードが構成要素であったら、関連構成取得部13は構成要素(構成ノードをルートとするサブツリー)を正規化切り取り範囲として返す。
(切り取り範囲を拡張する第2の方法)
図23は切り取り範囲を拡張する第2の方法の処理手順を表した一例のフローチャートである。ステップS101の処理は、上記した切り取り範囲を拡張する第1の方法と同様であるため説明を省略する。
ステップS102に進み、アクション取得部32はステップS101で正規化された範囲(正規化切り取り範囲)以下の構造において、まず他のアクション要素において定義される関数や変数等の識別子の参照を含むかどうか判定する。関数や変数等の識別子はスクリプト内部に記述される。したがって、アクション取得部32は、簡易的に、スクリプトのソースが記述されているかどうかで判定する。
具体的に、ステップS102の参照を含むかどうかの判定は、スクリプトソース記述可能属性テーブルの要素・属性の有無にしたがって判定される。図24はスクリプトソース記述可能属性テーブルの一例の構成図である。なお、図24のスクリプトソース記述可能属性テーブルにおけるコメントは説明の為に付けたものであり、必須でない。
<form>
<input type="button" value="Click!" onClick="ソース記入">
</form>
上記のform要素はonClick属性の値としてスクリプトのソースが記述されている例である。スクリプトソースが記述される可能性のあるのは図24のスクリプトソース記述可能属性テーブルに示した、form要素に記述されるonreset属性、onsubmit属性などのフォーム要素イベント属性や、html、head、titleなどのいくつかの要素を除いた様々な要素において記述可能なonclick属性、onmousedown属性などのマウスイベント属性がある。また、スクリプトはaタグのhref属性の値として以下のように記述されることもある。
<a href="JavaScript:ソース記入">ここをクリック</a>
正規化切り取り範囲内に上記のようなスクリプトを何も含まない場合、アクション取得部32は特に何もすることはなく、そのまま正規化切り取り範囲を返す。正規化切り取り範囲内に上記のようなスクリプトを含む場合、アクション取得部32は参照を含む可能性があると判定して、以下の処理を行う。
ステップS103に進み、アクション取得部32はドキュメントツリーのトップに焦点を当て、ドキュメントツリーのトップ以下の各ノードを順に辿る。木構造の探索は一般に良く知られたアルゴリズムであるので説明を省略する。ここではアクション取得部32が深さ優先探索で木構造のノードを順に辿るものとする。
ステップS104に進み、アクション取得部32は巡るノードが有るか無いかで探索終了か否かを判定する。辿るノードがあるならば、アクション取得部32はステップS105に進み、焦点を次のノードに移す。ステップS106に進み、アクション取得部32はステップS105で焦点を当てたノードがアクション要素かどうかを判定する。
具体的に、アクション取得部32はアクション要素テーブルに基づき、入力フォームを構成するform要素、スクリプトを記述するscript要素などをアクション要素として判定する。
ステップS105で焦点を当てたノードがアクション要素であった場合、アクション要素管理部33はステップS107に進み、ステップS105で焦点を当てたノード以下をアクション要素としてアクション要素集合に追加登録する。また、ステップS105で焦点を当てたノード以下をアクション要素として登録するので、アクション取得部32はステップS105で焦点を当てたノード以下の木構造の個別の探索が不要なので、焦点をステップS105で焦点を当てたノードの最後のノードまで移動する。
辿るノードが無くなるまで、アクション取得部32はステップS104〜S107の処理を繰り返し行う。辿るノードが無くなる、言い換えれば、ドキュメントツリー全体の探索が終了したならば、アクション要素集合出力部34は登録されているアクション要素集合をアクション要素集合テーブル31から出力する。
(切り取り範囲を拡張する第3の方法)
図25は切り取り範囲を拡張する第3の方法の処理手順を表した一例のフローチャートである。図25のフローチャートでは正規化切り取り範囲とアクション要素との関連度が高いか否かを判定し、正規化切り取り範囲と関連度が高いアクション要素をアクション要素集合に登録するものである。
ステップS111〜S116の処理は図23のステップS101〜S106の処理と同様であるため、説明を省略する。ステップS115で焦点を当てたノードがアクション要素であった場合、アクション要素取捨選択部35はステップS117に進み、正規化切り取り範囲とアクション要素との関連度が高いか否かを図26のフローチャートに示す処理により判定する。
図26は正規化切り取り範囲とアクション要素との関連度を判定する処理手順を表した一例のフローチャートである。ステップS121に進み、アクション要素取捨選択部35はステップS115で焦点を当てたアクション要素が内部に関数定義も変数定義もないscriptであるか否かを判定する。
ステップS115で焦点を当てたアクション要素が内部に関数定義も変数定義もないscriptであれば、アクション要素取捨選択部35は正規化切り取り範囲とアクション要素との関連度が低いと判定する。
ステップS115で焦点を当てたアクション要素が内部に関数定義も変数定義もないscriptでなければ、アクション要素取捨選択部35はステップS122に進む。ステップS122に進み、アクション要素取捨選択部35はステップS115で焦点を当てたアクション要素がすべてのinputのtypeがhiddenなform要素であるか否かを判定する。ステップS115で焦点を当てたアクション要素がすべてのinputのtypeがhiddenなform要素であれば、アクション要素取捨選択部35は正規化切り取り範囲とアクション要素との関連度が高いと判定する。
ステップS115で焦点を当てたアクション要素が、全てのinputのtypeがhiddenなform要素でなければ、アクション要素取捨選択部35はステップS123に進む。ステップS123に進み、アクション要素取捨選択部35はステップS115で焦点を当てたアクション要素が、hiddenでないinputを持つform要素であるか否かを判定する。
ステップS115で焦点を当てたアクション要素が、hiddenでないinputを持つform要素であれば、アクション要素取捨選択部35は正規化切り取り範囲とアクション要素との関連度が低いと判定する。
ステップS115で焦点を当てたアクション要素が、hiddenでないinputを持つform要素でなければ、アクション要素取捨選択部35は正規化切り取り範囲とアクション要素との関連度を判定する残りの処理を行う。ステップS121〜S123は正規化切り取り範囲とアクション要素との関連度を判定する処理の一例である。
図25のステップS117に戻り、アクション要素取捨選択部35は正規化切り取り範囲とアクション要素との関連度が高いと判定すると、ステップS118に進み、ステップS115で焦点を当てたノード以下をアクション要素としてアクション要素集合に追加登録する。また、ステップS105で焦点を当てたノード以下をアクション要素として登録するので、アクション取得部32はステップS115で焦点を当てたノード以下の木構造の個別の探索が不要なので焦点をステップS115で焦点を当てたノードの最後のノードまで移動する。
辿るノードが無くなるまで、アクション取得部32はステップS114〜S118の処理を繰り返し行う。辿るノードが無くなる、言い換えれば、ドキュメントツリー全体の探索が終了したならば、アクション要素集合出力部34は登録されているアクション要素集合をアクション要素集合テーブル31から出力する。
切り取り範囲を拡張する第2の方法では、正規化切り取り範囲にスクリプト記述が存在すれば参照を含むとして、ドキュメントツリーにあるすべてのform要素やscript要素の集合をアクション要素集合として正規化切り取り範囲に加えている。しかし、切り取り範囲を拡張する第2の方法では、不必要な(場合によっては副作用を起こす)アクション要素も正規化切り取り範囲に含めてしまうことになる。
実際には、いくつかのヒューリスティックスによって、正規化切り取り範囲に含むべき要素を篩にかけることができる。単純なヒューリスティックスとしては、アクション要素そのものだけで判断するものがある。例えばスクリプトを含むが、スクリプト内部に関数定義も変数設定も存在しない要素やhiddenでないinputを持つform要素はアクション要素として含めない具体例である。切り取り範囲を拡張する第3の方法は、いくつかのヒューリスティックスによって、正規化切り取り範囲に含むべき要素を篩にかけるものである。
(切り取り範囲を拡張する第4の方法)
図27は切り取り範囲を拡張する第4の方法の処理手順を表した一例のフローチャートである。ステップS131に進み、識別子管理部38はアクション要素の参照・定義表を作成する。
識別子参照定義関係取得部36はアクション要素のそれぞれに対して、そのアクション要素内部でどのような識別子が定義されているのか、またどのような識別子が参照されているのかを求め、識別子管理部38にアクション要素の参照・定義表を設定させる。
なお、アクション要素は、具体的にドキュメントツリー上の位置(例えばXPath)として保持される。例えば、アクション要素の参照・定義表は図28のようになる。図28はアクション要素の参照・定義表の一例の構成図である。アクション要素は直接記述されたスクリプトのみではない。アクション要素は外部ファイルを参照している場合に、その外部ファイルを取り込んで、その外部ファイルの内容であるスクリプトから識別子を取り出す。なお、スクリプトの解析技術はパージング技術として良く知られているため、詳細を省く。
ステップS132に進み、識別子参照定義関係取得部36は正規化切り取り範囲にあるアクション要素から識別子の定義と識別子の参照を取り出す。また、ステップS133に進み、識別子管理部38は識別子管理表の設定を行う。識別子管理表は識別子欄,参照欄及び定義済欄を持たせる。ステップS132でアクション要素から取り出された識別子の定義と識別子の参照とから識別子管理部38は識別子管理表を設定する。
例えば正規化切り取り範囲が以下のform要素であったとする。
<form style="margin: 0px;" id="fm1" name="fm1" onSubmit="return goF2('fm1')">
<input name="q" autocomplete="off" value="" size="35" class="j12" accesskey="e" type="text" />
<input value="検索" class="j12" onclick="return goF1('fm1')" type="button" />
<input value="クリア" onclick="javascript:wordClear('fm1')" class="j12" type="button" />
</form>
上記のform要素の場合、識別子管理表にはgoF2とgoF1、wordClearが参照される識別子として図29のように定義される。図29は識別子管理表の一例の構成図である。
ステップS134に進み、識別子定義元アクション要素取得部37は図29の識別子管理表において、参照欄に「〇」があるが定義済欄に「〇」がない識別子が存在するかどうかチェックする。参照欄に「〇」があるが定義済欄に「〇」がない識別子は未定義識別子である。
未定義識別子があれば、識別子定義元アクション要素取得部37はステップS135に進み、未定義識別子の一つを取り出す。ここでは、goF2を選んだとする。ステップS136に進み、識別子定義元アクション要素取得部37はアクション要素の参照・定義表から未定義識別子(goF2)を解決する(定義している)アクション要素を取り出す(上の例では/html/head/script[3] が取り出される)。
ステップS137に進み、識別子定義元アクション要素取得部37はステップS136で取り出したアクション要素を、アクション要素集合に付け加える。ステップS138に進み、ステップS136で取り出したアクション要素では、goF1,goF2,goF3が定義され、checkWordが参照されているので、識別子管理表のgoF1とgoF2を定義済にする。
また、識別子定義元アクション要素取得部37はgoF3を識別子管理表に追加して定義済にする。さらに、識別子定義元アクション要素取得部37はwordClearを識別子管理表に加えて、参照欄に「〇」をする。その結果、識別子管理表は図30のようになる。
ステップS138に進み、識別子定義元アクション要素取得部37は未定義な識別子が無くなるまで、ステップS134〜S138のアクション要素の追加を繰り返す。未定義な識別子がなくなったら、アクション要素集合出力部34は登録されているアクション要素集合をアクション要素集合テーブル31から出力する。
本発明は、具体的に開示された実施例に限定されるものではなく、特許請求の範囲から逸脱することなく、種々の変形や変更が可能である。なお、マッシュアップ装置は図13のWebマッシュアップ設定装置100を有する形態、Webマッシュアップ設定装置100及びWebマッシュアップ実現装置110を有する形態、Webマッシュアップ設定装置100,Webマッシュアップ実現装置110及びアノテーション管理サーバ120を有する形態など、様々な形態をとることができる。