(57)【要約】【課題】複数のユーザによる文書編集内容の共有を円滑化する。【解決手段】テキスト１４の編集を検出する。編集されたテキスト１４の中から所定の文字列で囲まれたブロック１５を抽出し、ブロック１５から表示部品を生成する際にブロック１５に文法エラーが検出されたか判定する。文法エラーが検出された場合、編集の位置が文法エラーが検出されたブロック１５の内側であるか外側であるかを判定する。編集の位置が文法エラーが検出されたブロック１５の内側である場合、当該編集を示す編集命令１６を外部の情報処理装置２０に送信することを保留し、編集の位置が文法エラーが検出されたブロック１５の外側である場合、当該編集を示す編集命令１７を情報処理装置２０に送信することを許可する。【選択図】図１
2019207528.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータに、
テキストの編集を検出し、
編集された前記テキストの中から所定の文字列で囲まれたブロックを抽出し、前記ブロックから表示部品を生成する際に前記ブロックに文法エラーが検出されたか判定し、
前記文法エラーが検出された場合、前記編集の位置が前記文法エラーが検出された前記ブロックの内側であるか外側であるかを判定し、
前記編集の位置が前記文法エラーが検出された前記ブロックの内側である場合、前記編集を示す編集命令を前記コンピュータの外部の情報処理装置に送信することを保留し、前記編集の位置が前記文法エラーが検出された前記ブロックの外側である場合、前記編集命令を前記情報処理装置に送信することを許可する、
処理を実行させる編集プログラム。
【請求項２】
前記文法エラーの判定では、前記ブロックから前記表示部品を生成するアプリケーションプログラムを呼び出し、前記ブロックに前記文法エラーが検出されたか否かを示す検査結果を前記アプリケーションプログラムから取得する、
請求項１記載の編集プログラム。
【請求項３】
前記アプリケーションプログラムの呼び出しでは、コールバック関数のポインタと前記ブロックとを前記アプリケーションプログラムに渡し、
前記検査結果の取得では、前記アプリケーションプログラムからの前記コールバック関数の呼び出しを介して前記検査結果を取得する、
請求項２記載の編集プログラム。
【請求項４】
前記コンピュータに更に、
前記編集の前に前記ブロックに対して行われた他の編集を示す他の編集命令が保留中であり、前記編集の位置が前記ブロックの外側である場合、前記他の編集命令に含まれる前記他の編集の位置を示す位置情報を前記編集の位置に応じて書き換える、
処理を実行させる請求項１記載の編集プログラム。
【請求項５】
前記コンピュータに更に、
前記テキストに含まれる他のブロックに対して行われた他の編集を示す他の編集命令が保留中であり、前記編集の位置が前記ブロックの内側である場合、前記他の編集命令に含まれる前記他の編集の位置を示す位置情報を前記編集の位置に応じて書き換える、
処理を実行させる請求項１記載の編集プログラム。
【請求項６】
テキストを記憶する記憶部と、
外部の情報処理装置と通信する通信部と、
前記テキストの編集を検出し、編集された前記テキストの中から所定の文字列で囲まれたブロックを抽出し、前記ブロックから表示部品を生成する際に前記ブロックに文法エラーが検出されたか判定し、前記文法エラーが検出された場合、前記編集の位置が前記文法エラーが検出された前記ブロックの内側であるか外側であるかを判定し、前記編集の位置が前記文法エラーが検出された前記ブロックの内側である場合、前記編集を示す編集命令を前記情報処理装置に送信することを保留し、前記編集の位置が前記文法エラーが検出された前記ブロックの外側である場合、前記編集命令を前記情報処理装置に送信することを許可する処理部と、
を有する編集装置。
【請求項７】
コンピュータが実行する編集方法であって、
テキストの編集を検出し、
編集された前記テキストの中から所定の文字列で囲まれたブロックを抽出し、前記ブロックから表示部品を生成する際に前記ブロックに文法エラーが検出されたか判定し、
前記文法エラーが検出された場合、前記編集の位置が前記文法エラーが検出された前記ブロックの内側であるか外側であるかを判定し、
前記編集の位置が前記文法エラーが検出された前記ブロックの内側である場合、前記編集を示す編集命令を前記コンピュータの外部の情報処理装置に送信することを保留し、前記編集の位置が前記文法エラーが検出された前記ブロックの外側である場合、前記編集命令を前記情報処理装置に送信することを許可する、
編集方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は編集プログラム、編集装置および編集方法に関する。
【背景技術】
【０００２】
ネットワーク上で複数のユーザが文書を共有するシステムとして、Ｗｉｋｉなど、Ｗｅｂサーバが公開する文書をＷｅｂブラウザから編集することができるものがある。Ｗｅｂブラウザからの文書の編集には、ＨＴＭＬ（HyperText Markup Language）などＷｅｂブラウザが解釈可能な標準マークアップ言語に代えて、マークダウンなど標準マークアップ言語よりも文法が簡潔な軽量マークアップ言語を使用することがある。
【０００３】
文書共有システムの中には、Ｗｅｂブラウザにエディタ領域とプレビュー領域とを表示させ、エディタ領域に入力されたマークダウンテキストを解析して、マークダウンテキストに対応するＷｅｂページをプレビュー領域に表示するものがある。
【０００４】
なお、ＵＭＬ（Unified Modeling Language）で記述したソフトウェアモデルを複数の開発者によって共有するソフトウェア開発支援システムが提案されている。提案のソフトウェア開発支援システムは、ソフトウェアモデルを記憶する共有データベースに開発者毎の操作履歴を反映させるときに、反映する操作履歴を示すバックアップ情報を保存しておくことで、後で開発者毎の操作履歴を復元できるようにする。
【０００５】
また、あるＷｅｂページのフィールドに入力された入力データが未送信である間に他のＷｅｂページへの移動が発生すると、クライアントアプリケーションがサーバアプリケーションに対して自動的に入力データを送信する計算システムが提案されている。
【０００６】
また、サーバに記憶されたデータをネットワークを介して複数のクライアントから編集することができる共同編集方法が提案されている。提案の共同編集方法では、第１のクライアントから第１の操作列を受信し、第２のクライアントから第２の操作列を受信し、第１の操作列と第２の操作列をマージしてサーバ上のデータに適用する。また、複数のクライアントから文書に対する編集操作を受け付け、アプリケーションサーバがそれら複数の編集操作の間の衝突を解消するオンライン文書編集方法が提案されている。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２００８−２６９２８０号公報
【特許文献２】特開２００９−４３２６８号公報
【特許文献３】特開２０１１−２５３２２９号公報
【特許文献４】国際公開第２０１２／０５８０７８号
【発明の概要】
【発明が解決しようとする課題】
【０００８】
文書共有システムにおいて、複数のユーザがそれぞれエディタ領域とプレビュー領域とを含む画面を用いて同一の文書を開いている場合を考える。あるユーザがエディタ領域のテキストを編集している途中では、一時的にテキストに文法エラーが生じることがあり、文法エラーの影響を受ける範囲の表示がプレビュー領域から消えてしまうことがある。文書共有システムの同期処理によって当該ユーザのテキスト編集が他のユーザに伝達されると、他のユーザのプレビュー領域からも一部の表示が消えてしまう。
【０００９】
これに対しては、あるユーザのエディタ領域のテキストに文法エラーが生じた場合には、当該文法エラーが解消するまでの間、当該ユーザのテキスト編集を他のユーザに伝達する同期処理を停止することが考えられる。しかし、当該ユーザのテキスト編集の同期自体を停止してしまうと、文法エラーの影響を受けない他の範囲の編集も他のユーザに伝達されなくなってしまい、ユーザ間の情報共有が遅延してしまう。
【００１０】
１つの側面では、本発明は、複数のユーザによる文書編集内容の共有を円滑化できる編集プログラム、編集装置および編集方法を提供することを目的とする。
【課題を解決するための手段】
【００１１】
１つの態様では、コンピュータに以下の処理を実行させる編集プログラムが提供される。テキストの編集を検出する。編集されたテキストの中から所定の文字列で囲まれたブロックを抽出し、ブロックから表示部品を生成する際にブロックに文法エラーが検出されたか判定する。文法エラーが検出された場合、編集の位置が文法エラーが検出されたブロックの内側であるか外側であるかを判定する。編集の位置が文法エラーが検出されたブロックの内側である場合、編集を示す編集命令をコンピュータの外部の情報処理装置に送信することを保留し、編集の位置が文法エラーが検出されたブロックの外側である場合、編集命令を情報処理装置に送信することを許可する。
【００１２】
また、１つの態様では、記憶部と通信部と処理部とを有する編集装置が提供される。また、１つの態様では、コンピュータが実行する編集方法が提供される。
【発明の効果】
【００１３】
１つの側面では、複数のユーザによる文書編集内容の共有を円滑化できる。
【図面の簡単な説明】
【００１４】
【図１】第１の実施の形態の編集装置の例を説明する図である。
【図２】第２の実施の形態の情報処理システムの例を示す図である。
【図３】クライアントのハードウェア例を示すブロック図である。
【図４】ブラウザ画面の表示例を示す図である。
【図５】複数ユーザによる第１の編集例を示す図である。
【図６】複数ユーザによる第２の編集例を示す図である。
【図７】複数ユーザによる第３の編集例を示す図である。
【図８】複数ユーザによる第４の編集例を示す図である。
【図９】複数ユーザによる第５の編集例を示す図である。
【図１０】複数ユーザによる第６の編集例を示す図である。
【図１１】情報処理システムの機能例を示すブロック図である。
【図１２】編集命令を格納するキューの例を示す図である。
【図１３】テキスト編集の手順例を示すシーケンス図である。
【図１４】同期処理の手順例を示すフローチャートである。
【図１５】同期処理の手順例を示すフローチャート（続き）である。
【発明を実施するための形態】
【００１５】
以下、本実施の形態を図面を参照して説明する。
［第１の実施の形態］
第１の実施の形態を説明する。
【００１６】
図１は、第１の実施の形態の編集装置の例を説明する図である。
第１の実施の形態の編集装置１０は、ユーザが使用するクライアントコンピュータである。編集装置１０は、同一文書を他のユーザと共同で編集する編集作業を支援する。編集装置１０は、記憶部１１、通信部１２および処理部１３を有する。
【００１７】
記憶部１１は、ＲＡＭ（Random Access Memory）などの揮発性半導体メモリでもよいし、ＨＤＤ（Hard Disk Drive）やフラッシュメモリなどの不揮発性ストレージでもよい。記憶部１１は、編集装置１０のユーザによって編集中の文書を示すテキスト１４を記憶する。テキスト１４は、例えば、マークダウンなどの軽量マークアップ言語で記述される。
【００１８】
通信部１２は、ネットワークを介して情報処理装置２０と通信する。通信部１２は、ルータやスイッチなどの有線通信装置とケーブルで接続されてもよいし、基地局やアクセスポイントなどの無線通信装置と無線リンクで接続されてもよい。情報処理装置２０は、複数のユーザにより共有される文書を管理するサーバコンピュータでもよい。また、情報処理装置２０は、他のユーザが使用するクライアントコンピュータでもよく、編集装置１０と同一文書を編集する他の編集装置でもよい。
【００１９】
処理部１３は、テキスト１４の編集を支援する。処理部１３は、例えば、ＣＰＵ（Central Processing Unit）やＤＳＰ（Digital Signal Processor）などのプロセッサである。プロセッサは、ＲＡＭなどのメモリに記憶されたプログラムを実行する。複数のプロセッサの集合を「マルチプロセッサ」または単に「プロセッサ」と言うこともある。ただし、処理部１３は、ＡＳＩＣ（Application Specific Integrated Circuit）やＦＰＧＡ（Field Programmable Gate Array）などの特定用途向け電子回路を含んでもよい。
【００２０】
処理部１３は、テキスト１４をページに変換し、編集装置１０が有するディスプレイにページを表示させる。処理部１３は、テキスト１４の編集に応じて、編集されたテキスト１４に対応するページをリアルタイムに生成する。テキスト１４は、ページ上の視覚的効果を所定の文法に従って文字列によって指定する。ページは、拡大文字や下線付き文字や太字や斜体文字などの装飾文字を含むことがある。また、ページは、表や線分や画像などの図形要素を含むことがある。また、ページは、入力フォームなどのユーザインタフェースを含むことがある。処理部１３は、例えば、編集装置１０が有するキーボードなどの入力デバイスを用いてテキスト１４を編集することが可能なエディタ領域と、編集中のテキスト１４に対応するページを表示するプレビュー領域とを提供する。
【００２１】
また、処理部１３は、情報処理装置２０との間でテキスト１４を同期し、複数のユーザがテキスト１４を共有することを可能にする。
このとき、処理部１３は、編集装置１０のユーザによるテキスト１４の編集を検出する。すると、処理部１３は、編集されたテキスト１４の中から所定の文字列で囲まれたブロック１５を抽出する。ブロック１５は、例えば、「```」と「```」とで囲まれたFenced Code Block（フェンストコードブロック）である。ブロック１５は、ＨＴＭＬ要素に直接対応付けられる文字列でなくてもよく、所定のアプリケーションプログラムによって処理されるデータであってもよい。
【００２２】
例えば、テキスト１４をページに変換する際に、処理部１３は、ブロック１５に対応付けられたアプリケーションプログラムを呼び出し、当該アプリケーションプログラムを用いてブロック１５から表示部品を生成し、表示部品をページに埋め込む。表示部品は、表や線分や画像などの図形要素を含んでもよく、編集装置１０のユーザから入力を受け付ける入力フォームなどのユーザインタフェースを含んでもよい。ブロック１５の記載方法は、呼び出されるアプリケーションプログラムに依存する。
【００２３】
処理部１３は、ブロック１５から表示部品を生成する際に、ブロック１５に文法エラーが検出されたか判定する。文法エラーは、ブロック１５の構文が所定の文法に従っていないことを示す。ブロック１５に文法エラーがあると、不完全な表示部品が生成される可能性や表示部品が生成されない可能性がある。ブロック１５が所定のアプリケーションプログラムによって処理されるデータである場合、ブロック１５に期待される文法は当該アプリケーションプログラムが知っている。例えば、処理部１３は、アプリケーションプログラムに文法エラーの有無を判定させ、アプリケーションプログラムから文法エラーの検査結果を取得する。処理部１３は、アプリケーションプログラムを呼び出すときに、ブロック１５と併せてコールバック関数のポインタをアプリケーションプログラムに渡し、コールバック関数を介してアプリケーションプログラムから検査結果を取得してもよい。
【００２４】
処理部１３は、ブロック１５に文法エラーが検出された場合、テキスト１４の今回の編集位置がブロック１５の内側であるか外側であるかを判定する。
ブロック１５に文法エラーが検出されており今回の編集位置がブロック１５の内側である場合、処理部１３は、当該編集を示す編集命令１６を情報処理装置２０に送信することを保留する。編集命令１６は、編集位置や挿入された文字などの編集内容を示す。これにより、ブロック１５の内側に対して行った編集が、一時的に他のユーザと共有されないことになる。処理部１３、例えば、後の編集によってブロック１５の文法エラーが解消されたときに、保留中の編集命令１６を情報処理装置２０に送信することを許可する。
【００２５】
一方、ブロック１５に文法エラーが検出されているものの今回の編集位置がブロック１５の外側である場合、処理部１３は、当該編集を示す編集命令１７を情報処理装置２０に送信することを許可する。編集命令１７は、編集位置や挿入された文字などの編集内容を示す。これにより、ブロック１５の外側に対して行った編集が、他のユーザと共有されることになる。なお、ブロック１５に文法エラーが検出されていない場合、処理部１３は、編集位置にかかわらず編集命令を情報処理装置２０に送信することを許可する。
【００２６】
第１の実施の形態の編集装置１０によれば、テキスト１４が編集されブロック１５から表示部品を生成する際に、ブロック１５に文法エラーが検出されたか判定される。ブロック１５に文法エラーが検出されており今回の編集位置がブロック１５の内側である場合、当該編集を示す編集命令１６の送信が保留される。一方、ブロック１５に文法エラーが検出されているものの今回の編集位置がブロック１５の外側である場合、当該編集を示す編集命令１７が情報処理装置２０に送信され得る。
【００２７】
これにより、編集装置１０のユーザによる編集中にブロック１５に一時的に文法エラーが生じても、ブロック１５の編集内容が他のユーザに伝達されない。よって、他のユーザが閲覧するページにおいて、ブロック１５に対応する表示部品が適切に表示されなくなることを抑制できる。また、ブロック１５に文法エラーが生じている間も、ブロック１５の外側の編集内容は他のユーザに伝達される。よって、ブロック１５の外側の情報については複数のユーザが迅速に共有することができる。このように、編集装置１０によれば、複数のユーザによる編集内容の共有を円滑化することができる。
【００２８】
［第２の実施の形態］
次に、第２の実施の形態を説明する。
図２は、第２の実施の形態の情報処理システムの例を示す図である。
【００２９】
第２の実施の形態の情報処理システムは、複数のユーザが文書を閲覧し編集することができる文書共有システムである。文書共有にはＷｉｋｉが利用される。情報処理システムは、ネットワーク３０、クライアント１００，１００−１，１００−２およびサーバ２００を含む。ネットワーク３０は、インターネットなどの広域ネットワークを含んでもよいし、有線ＬＡＮ（Local Area Network）や無線ＬＡＮを含んでもよい。
【００３０】
なお、クライアント１００は、第１の実施の形態の編集装置１０に対応する。サーバ２００は、第１の実施の形態の情報処理装置２０に対応する。
クライアント１００，１００−１，１００−２は、ユーザが操作するクライアントコンピュータである。クライアント１００，１００−１，１００−２は、デスクトップ型コンピュータでもよいし、ノート型コンピュータなどの携帯可能なコンピュータでもよい。クライアント１００，１００−１，１００−２は、テキスト編集のためにキーボードを有することが好ましい。クライアント１００，１００−１，１００−２は、ＨＴＴＰ（Hypertext Transfer Protocol）によりネットワーク３０を介してサーバ２００と通信する。
【００３１】
クライアント１００，１００−１，１００−２は、Ｗｅｂブラウザを実行する。クライアント１００，１００−１，１００−２は、Ｗｅｂブラウザを用いてサーバ２００からテキストを受信し、受信したテキストに基づいてページを表示する。また、クライアント１００，１００−１，１００−２は、Ｗｅｂブラウザを用いてテキストを編集する。
【００３２】
サーバ２００は、ページを記述したテキストを管理するサーバコンピュータである。サーバ２００が管理するテキストは、ＨＴＭＬなどの標準マークアップ言語ではなくマークダウンなどの軽量マークアップ言語で記述される。サーバ２００は、クライアント１００，１００−１，１００−２にテキストを送信する。あるクライアントがテキストを編集すると、サーバ２００は、当該クライアントから編集内容を示す編集命令を受信し、サーバ２００が保持するテキストを更新すると共に他のクライアントに編集命令を転送する。すなわち、サーバ２００は、クライアント１００，１００−１，１００−２の間でテキストを同期させる。これにより、複数のユーザが同一ページを閲覧し編集できる。
【００３３】
図３は、クライアントのハードウェア例を示すブロック図である。
クライアント１００は、ＣＰＵ１０１、ＲＡＭ１０２、ＨＤＤ１０３、ディスプレイ１０４、キーボード１０５、媒体リーダ１０６および通信インタフェース１０７を有する。上記ユニットはクライアント１００内でバスに接続されている。
【００３４】
なお、ＣＰＵ１０１は、第１の実施の形態の処理部１３に対応する。ＲＡＭ１０２またはＨＤＤ１０３は、第１の実施の形態の記憶部１１に対応する。通信インタフェース１０７は、第１の実施の形態の通信部１２に対応する。クライアント１００−１，１００−２およびサーバ２００も、同様のハードウェアを用いて実装できる。
【００３５】
ＣＰＵ１０１は、プログラムの命令を実行するプロセッサである。ＣＰＵ１０１は、ＨＤＤ１０３に記憶されたプログラムやデータの少なくとも一部をＲＡＭ１０２にロードし、プログラムを実行する。なお、ＣＰＵ１０１は複数のプロセッサコアを有してもよく、クライアント１００は複数のプロセッサを有してもよい。複数のプロセッサの集合を「マルチプロセッサ」または単に「プロセッサ」と言うことがある。
【００３６】
ＲＡＭ１０２は、ＣＰＵ１０１が実行するプログラムやＣＰＵ１０１が演算に用いるデータを一時的に記憶する揮発性半導体メモリである。なお、クライアント１００は、ＲＡＭ以外の種類のメモリを有してもよく、複数個のメモリを有してもよい。
【００３７】
ＨＤＤ１０３は、ＯＳ（Operating System）やミドルウェアやアプリケーションソフトウェアなどのソフトウェアのプログラムおよびデータを記憶する不揮発性ストレージである。なお、クライアント１００は、フラッシュメモリやＳＳＤ（Solid State Drive）など他の種類のストレージを有してもよく、複数の不揮発性ストレージを有してもよい。
【００３８】
ディスプレイ１０４は、ＣＰＵ１０１からの命令に従って画面を表示する。ディスプレイ１０４としては、ＣＲＴ（Cathode Ray Tube）ディスプレイ、液晶ディスプレイ（ＬＣＤ：Liquid Crystal Display）、有機ＥＬ（ＯＥＬ：Organic Electro-Luminescence）ディスプレイなど、任意の種類のディスプレイを用いることができる。
【００３９】
キーボード１０５は、ユーザから入力操作を受け付けて入力信号をＣＰＵ１０１に出力する。なお、クライアント１００は、マウスやタッチパネルやタッチパッドなど他の種類の入力デバイスを有してもよく、複数個の入力デバイスを有してもよい。
【００４０】
媒体リーダ１０６は、記録媒体１０８に記録されたプログラムやデータを読み取る読み取り装置である。記録媒体１０８として、例えば、フレキシブルディスク（ＦＤ：Flexible Disk）やＨＤＤなどの磁気ディスク、ＣＤ（Compact Disc）やＤＶＤ（Digital Versatile Disc）などの光ディスク、光磁気ディスク（ＭＯ：Magneto-Optical disk）、半導体メモリなどを使用できる。媒体リーダ１０６は、記録媒体１０８から読み取ったプログラムやデータをＲＡＭ１０２またはＨＤＤ１０３に格納する。
【００４１】
通信インタフェース１０７は、ネットワーク３０を介してサーバ２００と通信する。通信インタフェース１０７は、ルータやスイッチなどの有線通信装置に接続する有線通信インタフェースでもよい。また、通信インタフェース１０７は、基地局やアクセスポイントなどの無線通信装置に接続する無線通信インタフェースでもよい。
【００４２】
次に、クライアント１００によるテキスト編集について説明する。
図４は、ブラウザ画面の表示例を示す図である。
クライアント１００は、サーバ２００からＨＴＭＬテンプレートとスクリプトを受信する。また、クライアント１００は、編集および閲覧の対象のページを選択し、選択したページに対応するマークダウンテキストをサーバ２００から受信する。ＨＴＭＬテンプレートは、ページの編集および閲覧をＷｅｂブラウザ上で可能にするための画面構成を規定するＨＴＭＬテキストである。マークダウンテキストは、軽量マークアップ言語であるマークダウンを用いてページを記述する。スクリプトは、Ｗｅｂブラウザ上で実行可能なプログラムであり、マークダウンテキストの編集、サーバ２００との間のマークダウンテキストの同期、マークダウンテキストからページへの変換などの処理を規定する。
【００４３】
例えば、クライアント１００のＷｅｂブラウザ上にブラウザ画面４０が表示される。ブラウザ画面４０は、エディタ領域４１およびプレビュー領域４２を含む。エディタ領域４１は左側に配置され、プレビュー領域４２は右側に配置される。
【００４４】
エディタ領域４１は、マークダウンテキストを表示する。ユーザは、キーボード１０５などの入力デバイスを用いて、エディタ領域４１に表示されたマークダウンテキストを編集することができる。例えば、ユーザはマークダウンテキストに文字を挿入し、また、マークダウンテキストから文字を削除する。プレビュー領域４２は、エディタ領域４１の現在のマークダウンテキストに対応するページを表示する。マークダウンテキストからページへの変換は、クライアント１００に予めダウンロードされたスクリプトを用いてクライアント１００においてリアルタイムに実行される。よって、エディタ領域４１のマークダウンテキストが書き換えられる毎にプレビュー領域４２のページも更新される。
【００４５】
マークダウンテキストは、ページ上の視覚的表現方法を簡易的な文法によって規定することができる。例えば、行頭の「#」は第１レベルの見出しを意味し、行頭および行末の「**」は文字列の強調表示を意味する。「```」から「```」までの範囲はFenced Code Blockである。先頭の「```」の後ろにタグとしてプログラミング言語名を記載すると、先頭の「```」の次の行から末尾の「```」の前の行までの文字列がサンプルプログラムと解釈される。すると、プログラミング言語で定義された予約語が特定の色で表示されるなど、プログラミング言語に応じた視覚的表現方法によってサンプルプログラムがページ上に表示される。
【００４６】
また、マークダウンテキストは、Fenced Code Blockを利用して、特別の視覚的インタフェースをもつアプリケーションソフトウェアの起動を規定することができる。先頭の「```」の後ろにタグとしてアプリケーション名を記載すると、予めダウンロードされたスクリプトの中から当該アプリケーション名をもつアプリケーションプログラムが実行される。そして、アプリケーションプログラムによって生成される特別の表示部品がプレビュー領域４２に表示される。先頭の「```」の次の行から末尾の「```」の前の行までの文字列が、アプリケーションソフトウェアが処理するデータと解釈される。Fenced Code Blockに記載すべきデータの形式は、起動するアプリケーションソフトウェアに依存する。プレビュー領域４２のページの中に埋め込まれた特別の表示部品がデータ操作を許容している場合、プレビュー領域４２上での操作がマークダウンテキストにも反映される。すなわち、エディタ領域４１とプレビュー領域４２が双方向に同期する。
【００４７】
例えば、「kpt」タグを含むFenced Code Blockがマークダウンテキストに記載されているとする。すると、ＫＰＴ（Keep-Problem-Try）アプリケーションが起動され、ＫＰＴ分析に有用な表や入力フォームを含む表示部品がプレビュー領域４２に表示される。この表示部品は、Keep項目を示す文字列の入力と、Problem項目を示す文字列の入力と、Try項目を示す文字列の入力を可能とする。プレビュー領域４２上で文字列が入力されると、その文字列がマークダウンテキストのFenced Code Blockに挿入される。これにより、複雑なデータ構造をもつデータの入力を支援することができる。
【００４８】
ここで、アプリケーションソフトウェアは所定の文法に従って記載されたデータを要求する。Fenced Code Blockが所定の文法に従って記載されていない場合、アプリケーションソフトウェアは受け付けたデータを解釈することができず、適切な表示部品をプレビュー領域４２に表示することができないことがある。例えば、表の枠線はプレビュー領域４２に表示されるものの、表の中に文字列が全く表示されないブラックアウトが発生し得る。これに対して、エディタ領域４１でマークダウンテキストを編集している途中では、一時的にFenced Code Blockに文法不正が発生することがある。そこで、Fenced Code Blockの文法不正とユーザ間のマークダウンテキストの同期との関係が問題となる。
【００４９】
図５は、複数ユーザによる第１の編集例を示す図である。
クライアント１００にはブラウザ画面４１１が表示され、クライアント１００−１にはブラウザ画面４１２が表示されている。ブラウザ画面４１１，４１２に表示されるマークダウンテキストおよびページは同一である。ブラウザ画面４１１，４１２のマークダウンテキストは、「kpt」タグをもつFenced Code Blockを含む。Fenced Code Blockは、文法が妥当であり、Keep項目として「keep1」と「keep2」を含む。ブラウザ画面４１１，４１２のページは、ＫＰＴアプリケーションによって生成された表示部品を含む。表示部品は、Keep項目の領域とProblem項目の領域とTry項目の領域を含む表であり、Keep項目を入力するための入力フィールド、Problem項目を入力するための入力フィールドおよびTry項目を入力するための入力フィールドを含む。Keep項目の領域の中には、Fenced Code Blockに記載されたKeep項目の値である「keep1」と「keep2」が表示される。
【００５０】
ここで、クライアント１００がFenced Code Blockに「,」を挿入することによってFenced Code Blockに文法不正が発生したとする。すると、クライアント１００ではブラウザ画面４１１がブラウザ画面４１３に遷移する。ＫＰＴアプリケーションは編集されたFenced Code Blockを正しく解釈することができないため、ブラウザ画面４１３のページの中の表示部品はブラックアウトする。すなわち、ブラウザ画面４１１では表示されていたKeep項目の「keep1」と「keep2」が、ブラウザ画面４１３では表示されなくなる。
【００５１】
クライアント１００によるマークダウンテキストの編集が即時にクライアント１００−１に伝達すると、クライアント１００−１ではブラウザ画面４１２がブラウザ画面４１４に遷移する。ブラウザ画面４１４に表示されるマークダウンテキストおよびページは、ブラウザ画面４１３と同一である。すなわち、クライアント１００−１のマークダウンテキストのFenced Code Blockにも「,」が挿入されて文法不正が発生する。そして、ブラウザ画面４１４の表示部品はブラックアウトし、ブラウザ画面４１２では表示されていたKeep項目の「keep1」と「keep2」がブラウザ画面４１４では表示されなくなる。
【００５２】
次に、クライアント１００−１のユーザがブラウザ画面４１４の表示部品を操作して、Problem項目の入力フィールドに「problem1」を入力したとする。すると、ＫＰＴアプリケーションは、Keep項目およびTry項目が空でありProblem項目が「problem1」であるとＫＰＴアプリケーションのデータを解釈する。ＫＰＴアプリケーションは、クライアント１００−１のマークダウンテキストのFenced Code Blockを、Keep項目およびTry項目が空でありProblem項目が「problem1」であるように更新する。これにより、クライアント１００−１ではブラウザ画面４１４がブラウザ画面４１６に遷移する。
【００５３】
クライアント１００−１によるマークダウンテキストの編集が即時にクライアント１００に伝達すると、クライアント１００ではブラウザ画面４１３がブラウザ画面４１５に遷移する。ブラウザ画面４１５に表示されるマークダウンテキストおよびページは、ブラウザ画面４１６と同一である。すなわち、クライアント１００のマークダウンテキストのFenced Code Blockは、Problem項目として「problem1」を含む一方、ブラウザ画面４１３では含まれていたKeep項目の「keep1」と「keep2」が削除されている。
【００５４】
このように、Fenced Code Blockに文法不正が発生しているか否かにかかわらずクライアント１００によるマークダウンテキストの編集をクライアント１００−１に即時に伝達すると、クライアント１００−１におけるページのプレビューが適切に行われない。また、その結果としてFenced Code Blockの既存データが消えてしまうことがある。この問題に対しては、クライアント１００でFenced Code Blockに文法不正が発生すると、その文法不正が解消されるまで、クライアント１００によるマークダウンテキストの編集をクライアント１００−１に伝達することを保留する方法が考えられる。
【００５５】
図６は、複数ユーザによる第２の編集例を示す図である。
クライアント１００にはブラウザ画面４２１が表示され、クライアント１００−１にはブラウザ画面４２２が表示されている。ブラウザ画面４２１は前述のブラウザ画面４１１と同一であり、ブラウザ画面４２２は前述のブラウザ画面４１２と同一である。
【００５６】
ここで、クライアント１００がFenced Code Blockに「,」を挿入することによってFenced Code Blockに文法不正が発生したとする。すると、クライアント１００ではブラウザ画面４２１がブラウザ画面４２３に遷移する。ＫＰＴアプリケーションは編集されたFenced Code Blockを正しく解釈することができないため、ブラウザ画面４２３のページの中の表示部品はブラックアウトする。ただし、Fenced Code Blockに文法不正があるため、クライアント１００によるマークダウンテキストの編集がクライアント１００−１に伝達されない。よって、クライアント１００−１ではブラウザ画面４２４が表示される。ブラウザ画面４２４は、ブラウザ画面４２２と同一である。すなわち、クライアント１００−１のマークダウンテキストのFenced Code Blockには「,」が挿入されない。
【００５７】
次に、クライアント１００がFenced Code BlockのKeep項目に「keep3」を挿入する編集が完了し、Fenced Code Blockの文法不正が解消されたとする。すると、クライアント１００ではブラウザ画面４２３がブラウザ画面４２５に遷移する。ＫＰＴアプリケーションは編集されたFenced Code Blockを正しく解釈することができるため、ブラウザ画面４２５では表示部品のブラックアウトが解消する。すなわち、ブラウザ画面４２５の表示部品は、Keep項目として「keep1」と「keep2」と「keep3」を含む。
【００５８】
このとき、Fenced Code Blockの文法不正が解消されたため、保留されていたクライアント１００によるマークダウンテキストの編集がクライアント１００−１に伝達する。すると、クライアント１００−１ではブラウザ画面４２４がブラウザ画面４２６に遷移する。ブラウザ画面４２６に表示されるマークダウンテキストおよびページは、ブラウザ画面４２５と同一である。すなわち、クライアント１００−１のマークダウンテキストのFenced Code BlockにもKeep項目として「keep3」が挿入され、ブラウザ画面４２６の表示部品はKeep項目として「keep1」と「keep2」と「keep3」を含む。
【００５９】
このように、クライアント１００でFenced Code Blockに文法不正が発生している間はクライアント１００−１への編集の伝達を保留することで、クライアント１００−１のページのプレビューが不適切になることを抑制できる。また、Fenced Code Blockの既存データが意図せずに消えてしまうリスクを低減できる。しかし、文法不正が解消されるまでマークダウンテキストの編集の伝達を全て保留してしまうと、クライアント１００，１００−１の間の情報共有が必要以上に遅延してしまうことがある。
【００６０】
図７は、複数ユーザによる第３の編集例を示す図である。
クライアント１００にはブラウザ画面４３１が表示され、クライアント１００−１にはブラウザ画面４３２が表示されている。ブラウザ画面４３１は前述のブラウザ画面４２３と同一であり、ブラウザ画面４３２は前述のブラウザ画面４２４と同一である。すなわち、クライアント１００では、Fenced Code Blockに「,」を挿入することによってFenced Code Blockに文法不正が発生している。ただし、クライアント１００によるマークダウンテキストの編集がクライアント１００−１に伝達されないため、クライアント１００−１ではFenced Code Blockに文法不正が発生していない。
【００６１】
ここで、Fenced Code Blockの文法不正を解消する前に、クライアント１００がFenced Code Blockの外側に見出しとして「20180105」を挿入したとする。すると、クライアント１００ではブラウザ画面４３１がブラウザ画面４３３に遷移する。ブラウザ画面４３３のページは、見出しとしての「20180105」とFenced Code Blockに対応する表示部品とを含む。ブラウザ画面４３３の表示部品はブラックアウトしている。
【００６２】
一方、Fenced Code Blockの文法不正が解消していないため、クライアント１００によるマークダウンテキストの編集がクライアント１００−１に伝達されないことが継続する。よって、クライアント１００−１ではブラウザ画面４３４が表示される。ブラウザ画面４３４は、ブラウザ画面４３２と同一である。すなわち、クライアント１００−１のマークダウンテキストには見出しとしての「20180105」が挿入されない。
【００６３】
このように、Fenced Code Blockに文法不正が発生しているときに一律にマークダウンテキストの同期を停止してしまうと、Fenced Code Blockの外側の編集もクライアント１００からクライアント１００−１に伝達されなくなる。よって、クライアント１００とクライアント１００−１の間の情報共有が制限される。この問題は、マークダウンテキストに複数のFenced Code Blockが記載されており、一部のFenced Code Blockにのみ文法不正が発生している場合にも当てはまる。
【００６４】
図８は、複数ユーザによる第４の編集例を示す図である。
クライアント１００にはブラウザ画面４４１が表示され、クライアント１００−１にはブラウザ画面４４２が表示されている。ブラウザ画面４４１，４４２のマークダウンテキストは、「kpt」タグをもつ２つのFenced Code Blockを含む。１番目のFenced Code Blockは、Keep項目として「keep1」と「keep2」を含み、２番目のFenced Code Blockは、Keep項目として「k1」を含む。ブラウザ画面４４１，４４２のページは、ＫＰＴアプリケーションによって生成された２つの表示部品を含む。
【００６５】
ここで、クライアント１００が１番目のFenced Code Blockに「,」を挿入することによって、１番目のFenced Code Blockに文法不正が発生している。よって、ブラウザ画面４４１のページでは、１番目の表示部品はブラックアウトしており２番目の表示部品は正しく表示されている。何れかのFenced Code Blockに文法不正が存在するため、クライアント１００からクライアント１００−１にマークダウンテキストの編集が伝達されない。よって、ブラウザ画面４４２のマークダウンテキストは、１番目のFenced Code Blockに「,」が挿入される前の状態になっている。よって、ブラウザ画面４４２のページでは、１番目の表示部品および２番目の表示部品の両方が正しく表示されている。
【００６６】
次に、クライアント１００が２番目のFenced Code BlockにProblem項目として「p1」を挿入したとする。２番目のFenced Code Blockに文法不正は発生していない。すると、クライアント１００ではブラウザ画面４４１がブラウザ画面４４３に遷移する。ブラウザ画面４４３のページでは、１番目のFenced Code Blockの文法不正が解消していないため１番目の表示部品がブラックアウトしており、２番目のFenced Code Blockに文法不正がないため２番目の表示部品が正しく表示されている。
【００６７】
このとき、何れかのFenced Code Blockに文法不正が存在するため、引き続きクライアント１００からクライアント１００−１にマークダウンテキストの編集が伝達されない。よって、クライアント１００−１ではブラウザ画面４４４が表示される。ブラウザ画面４４４は、ブラウザ画面４４２と同一である。すなわち、ブラウザ画面４４４では、マークダウンテキストの２番目のFenced Code BlockにProblem項目である「p1」が挿入されておらず、ページの２番目の表示部品が更新されていない。
【００６８】
このように、あるFenced Code Blockに文法不正が発生しているときに一律にマークダウンテキストの同期を停止してしまうと、他のFenced Code Blockの編集もクライアント１００からクライアント１００−１に伝達されなくなる。よって、クライアント１００とクライアント１００−１の間の情報共有が制限される。そこで、第２の実施の形態の情報処理システムは、編集位置が文法不正のあるFenced Code Blockの内側か外側かを判定してマークダウンテキストの同期を制御することとする。
【００６９】
図９は、複数ユーザによる第５の編集例を示す図である。
クライアント１００にはブラウザ画面４５１が表示され、クライアント１００−１にはブラウザ画面４５２が表示されている。ブラウザ画面４５１は前述のブラウザ画面４３１と同一であり、ブラウザ画面４５２は前述のブラウザ画面４３２と同一である。すなわち、クライアント１００では、Fenced Code Blockに「,」を挿入することによってFenced Code Blockに文法不正が発生している。ただし、文法不正のあるFenced Code Blockの編集がクライアント１００からクライアント１００−１に伝達されないため、クライアント１００−１ではFenced Code Blockに文法不正が発生していない。
【００７０】
ここで、Fenced Code Blockの文法不正を解消する前に、クライアント１００がFenced Code Blockの外側に見出しとして「20180105」を挿入したとする。すると、クライアント１００ではブラウザ画面４５１がブラウザ画面４５３に遷移する。ブラウザ画面４５３のページは、見出しとしての「20180105」とFenced Code Blockに対応する表示部品とを含む。ブラウザ画面４５３の表示部品はブラックアウトしている。
【００７１】
Fenced Code Blockの文法不正が解消していないものの、クライアント１００の編集位置がFenced Code Blockの外側であるため、マークダウンテキストに見出しとして「20180105」を挿入する編集がクライアント１００−１に伝達される。よって、クライアント１００−１ではブラウザ画面４５２がブラウザ画面４５４に遷移する。ブラウザ画面４５４のマークダウンテキストには、Fenced Code Blockの中の「,」は挿入されていないものの見出しである「20180105」は挿入されている。よって、ブラウザ画面４５４のページには、見出しである「20180105」が表示されており、Fenced Code Blockに対応する表示部品がブラックアウトせずに正しく表示されている。
【００７２】
ただし、クライアント１００では、Fenced Code Blockの前に見出しを挿入することで、保留しているFenced Code Blockの編集の編集位置が影響を受ける。すなわち、Fenced Code Blockに「,」を挿入した時点では、「,」を挿入する編集の編集位置は５行目である。しかし、１行目に見出しが挿入されると、「,」を挿入する編集の編集位置が６行目にずれてしまう。マークダウンテキストの同期を、Fenced Code Blockの内側の編集とFenced Code Blockの外側の編集とで独立に行えるようにすると、事後的な編集位置のずれが問題となる。すなわち、保留中のFenced Code Blockの内側の編集が、後から行われたFenced Code Blockの外側の編集によって影響を受けることがある。
【００７３】
そこで、クライアント１００は、保留中の編集の編集位置を適宜更新することとする。クライアント１００は、１行目に見出しを挿入したときに、Fenced Code Blockについて保留している「,」の挿入の編集位置を５行目から６行目に更新する。Fenced Code Blockの文法不正が解消したときには、クライアント１００からクライアント１００−１に、６行目に「,」を挿入するという編集内容が伝達される。これは、Fenced Code Blockの外側の編集が保留中のFenced Code Blockの内側の編集よりも先に行われたと仮定して、Fenced Code Blockの編集位置を修正するものである。これにより、Fenced Code Blockの内側と外側の同期順序を固定しないことが可能となる。このような同期制御は、マークダウンテキストに複数のFenced Code Blockが記載されており、一部のFenced Code Blockにのみ文法不正が発生している場合にも当てはまる。
【００７４】
図１０は、複数ユーザによる第６の編集例を示す図である。
クライアント１００にはブラウザ画面４６１が表示され、クライアント１００−１にはブラウザ画面４６２が表示されている。ブラウザ画面４６１は前述のブラウザ画面４４１と同一であり、ブラウザ画面４６２は前述のブラウザ画面４４２と同一である。すなわち、クライアント１００では、１番目のFenced Code Blockに「,」を挿入することによって１番目のFenced Code Blockに文法不正が発生している。ただし、１番目のFenced Code Blockの編集がクライアント１００からクライアント１００−１に伝達されないため、クライアント１００−１では１番目のFenced Code Blockに文法不正が発生していない。
【００７５】
ここで、１番目のFenced Code Blockの文法不正を解消する前に、クライアント１００が２番目のFenced Code BlockにProblem項目として「p1」を挿入したとする。すると、クライアント１００ではブラウザ画面４６１がブラウザ画面４６３に遷移する。ブラウザ画面４６３のページは、１番目のFenced Code Blockに対応する１番目の表示部品と２番目のFenced Code Blockに対応する２番目の表示部品とを含む。１番目の表示部品はブラックアウトしており、２番目の表示部品は正しく表示されている。
【００７６】
１番目のFenced Code Blockの文法不正が解消していないものの、クライアント１００の編集位置は文法不正のない２番目のFenced Code Blockの内側、すなわち、１番目のFenced Code Blockの外側である。よって、２番目のFenced Code BlockにProblem項目である「p1」を挿入する編集がクライアント１００−１に伝達される。クライアント１００−１ではブラウザ画面４６２がブラウザ画面４６４に遷移する。ブラウザ画面４６４のマークダウンテキストには、１番目のFenced Code Blockの中の「,」は挿入されていないものの２番目のFenced Code Blockの「p1」は挿入されている。よって、ブラウザ画面４６４のページには、１番目の表示部品および２番目の表示部品が正しく表示されている。
【００７７】
なお、文法不正があるFenced Code Blockの前のFenced Code Blockを編集することで、保留している編集の編集位置が影響を受ける。マークダウンテキストの同期をFenced Code Block毎に独立に行えるようにすると、事後的な編集位置のずれが問題となる。すなわち、保留中のFenced Code Blockの編集が、後から行われた他のFenced Code Blockの編集によって影響を受けることがある。そこで、クライアント１００は、保留中の編集の編集位置を適宜更新することとする。文法不正があるFenced Code Blockの編集を保留しているときに他のFenced Code Blockが編集されると、クライアント１００は、保留中の編集の編集位置を修正する。これは、他のFenced Code Blockの編集が保留中のFenced Code Blockの編集よりも先に行われたと仮定して編集位置を修正するものである。これにより、複数のFenced Code Blockの同期順序を固定しないことが可能となる。
【００７８】
次に、クライアント１００およびサーバ２００の機能について説明する。
図１１は、情報処理システムの機能例を示すブロック図である。
サーバ２００は、マークダウン記憶部２１１、プログラム記憶部２１２および同期部２１３を有する。マークダウン記憶部２１１およびプログラム記憶部２１２は、サーバ２００が有するＲＡＭまたはＨＤＤの記憶領域を用いて実装される。同期部２１３は、サーバ２００が有するＣＰＵが実行するプログラムを用いて実装される。
【００７９】
マークダウン記憶部２１１は、ページを記述したマークダウンテキストを記憶する。マークダウンテキストは、クライアント１００，１００−１，１００−２からアップロードされる。プログラム記憶部２１２は、マークダウンテキストの編集画面を規定するＨＴＭＬテンプレートを記憶する。また、プログラム記憶部２１２は、マークダウンテキストの編集およびページのプレビューを実現する各種スクリプトを記憶する。ＨＴＭＬテンプレートおよびスクリプトは、管理者によって予めサーバ２００に登録される。
【００８０】
同期部２１３は、クライアント１００，１００−１，１００−２に対して、プログラム記憶部２１２に記憶されたＨＴＭＬテンプレートおよびスクリプトを送信する。また、同期部２１３は、クライアント１００，１００−１，１００−２によるページの選択に応じて、マークダウン記憶部２１１に記憶された当該ページに対応するマークダウンテキストを送信する。また、同期部２１３は、マークダウン記憶部２１１のマークダウンテキストおよびクライアント１００，１００−１，１００−２が保持するマークダウンテキストを同期させる。同期部２１３は、クライアント１００から編集内容を示す編集命令を受信し、編集命令に従ってマークダウン記憶部２１１のマークダウンテキストを更新する。そして、同期部２１３は、編集命令をクライアント１００−１，１００−２に転送する。例えば、同期部２１３は、クライアント１００−１，１００−２から定期的にアクセスを受け付け、転送すべき編集命令が存在する場合に編集命令を送信する。
【００８１】
クライアント１００は、マークダウン記憶部１１１、プログラム記憶部１１２、編集命令記憶部１１３、Ｗｅｂブラウザ１１４、エディタ１１５、パーザ１１６、プレビューア１１７、アプリケーション起動部１１８および同期部１１９を有する。マークダウン記憶部１１１、プログラム記憶部１１２および編集命令記憶部１１３は、ＲＡＭ１０２またはＨＤＤ１０３の記憶領域を用いて実装される。Ｗｅｂブラウザ１１４、エディタ１１５、パーザ１１６、プレビューア１１７、アプリケーション起動部１１８および同期部１１９は、ＣＰＵ１０１が実行するプログラムを用いて実装される。
【００８２】
マークダウン記憶部１１１は、サーバ２００からダウンロードし編集中であるマークダウンを記憶する。プログラム記憶部１１２は、サーバ２００からダウンロードしたＨＴＭＬテンプレートおよびスクリプトを記憶する。編集命令記憶部１１３は、サーバ２００への送信を保留している編集命令を記憶する。編集命令記憶部１１３は、Fenced Code Block毎に区分して編集命令を記憶するキューをもつ。
【００８３】
Ｗｅｂブラウザ１１４は、ユーザ入力を受け付け、サーバ２００とＨＴＴＰ通信を行い、サーバ２００から受信したＨＴＭＬテンプレートに基づいてブラウザ画面を表示する。Ｗｅｂブラウザ１１４は、サーバ２００から受信したスクリプトを起動することがある。具体的には、Ｗｅｂブラウザ１１４は、エディタ１１５、パーザ１１６、プレビューア１１７、アプリケーション起動部１１８および同期部１１９を適宜呼び出す。
【００８４】
エディタ１１５は、マークダウン記憶部１１１に記憶されたマークダウンテキストをエディタ領域に表示する。また、エディタ１１５は、ユーザからマークダウンテキストの編集入力を受け付け、マークダウンテキストを更新する。また、エディタ１１５は、パーザ１１６および同期部１１９からの通知に応じてマークダウンテキストを更新する。
【００８５】
パーザ１１６は、エディタ１１５によりマークダウンテキストが更新されると、マークダウンテキストの構文解析（パース）を行い、マークダウンテキストを抽象構文木（ＡＳＴ：Abstract Syntax Tree）に変換する。ＡＳＴは、ＨＴＭＬデータ構造を示すツリーであり、複数のノードとノード間のリンクとを含む。１つのFenced Code Blockの文字列は、通常のＨＴＭＬデータではなくアプリケーションソフトウェアのデータと解釈されるため、ＡＳＴでは単一のノードに収容される。また、パーザ１１６は、アプリケーション起動部１１８によって起動されたアプリケーションソフトウェアからデータを受け付け、Fenced Code Blockに対応するノードを更新する。すると、パーザ１１６は、エディタ１１５にFenced Code Blockの更新を通知する。
【００８６】
プレビューア１１７は、パーザ１１６が生成したＡＳＴに基づいてページを生成し、ページをプレビュー領域に表示する。ＡＳＴの中にFenced Code Blockを示すノードが含まれている場合、プレビューア１１７は、Fenced Code Blockを示すノード内のデータを引数として渡してアプリケーション起動部１１８を呼び出す。
【００８７】
アプリケーション起動部１１８は、プレビューア１１７からFenced Code Blockのデータを受け付け、Fenced Code Blockがもつタグに応じたスクリプト（アプリケーションプログラム）をプログラム記憶部１１２から読み出して実行する。アプリケーション起動部１１８は、このようにして起動したアプリケーションソフトウェアにデータを処理させる。例えば、タグが「kpt」であるFenced Code Blockのデータを受け付けると、アプリケーション起動部１１８はＫＰＴアプリケーションを起動する。起動したアプリケーションソフトウェアは、受け付けたデータに基づいて表示部品を生成してプレビュー領域に表示する。また、アプリケーションソフトウェアは、ユーザ入力によってデータが更新されると、更新されたデータをパーザ１１６に通知する。
【００８８】
ここで、アプリケーションソフトウェアは表示部品を生成する際に、受け付けたデータの文法が妥当であるか不正であるかを検査する。アプリケーション起動部１１８がアプリケーションソフトウェアを呼び出すとき、データと併せてコールバック関数のポインタをアプリケーションソフトウェアに渡す。コールバック関数は、アプリケーション起動部１１８が文法の検査結果をアプリケーションソフトウェアから受け取るためにアプリケーション起動部１１８が有する関数である。アプリケーションソフトウェアは、コールバック関数を呼び出して検査結果をアプリケーション起動部１１８に渡す。アプリケーション起動部１１８は、検査結果をパーザ１１６を介してエディタ１１５に渡す。Fenced Code Block毎の検査結果が最終的に同期部１１９に通知される。
【００８９】
同期部１１９は、クライアント１００とサーバ２００の間のマークダウンテキストの同期を制御する。同期部１１９は、クライアント１００−１，１００−２による編集を示す編集命令をサーバ２００から受信し、受信した編集命令をエディタ１１５に通知する。これにより、受信した編集命令がマークダウンテキストに対して実行される。
【００９０】
また、同期部１１９は、最新のマークダウンテキストより１世代古いマークダウンテキスト（最後の編集の直前のマークダウンテキスト）を保持する。同期部１１９は、エディタ１１５によって編集された最新のマークダウンテキストと１世代古いマークダウンテキストとを比較し、両者の差分から編集内容を示す編集命令を生成する。編集命令は、挿入や削除などの編集種別と、行番号および列番号によって特定される編集位置とを含み、編集種別が挿入である場合には挿入された文字を含む。また、同期部１１９は、エディタ１１５からFenced Code Block毎の文法の検査結果を取得する。
【００９１】
そして、同期部１１９は、Fenced Code Block毎の文法の検査結果に基づいて、生成した編集命令を保留するかサーバ２００に送信するか決定する。編集命令を保留する場合、同期部１１９は、編集対象のFenced Code Blockに対応する編集命令記憶部１１３のキューに編集命令を格納する。また、同期部１１９は、あるFenced Code Blockの文法不正が解消されると、当該Fenced Code Blockに対応する編集命令記憶部１１３のキューに保存されている編集命令をまとめてサーバ２００に送信する。
【００９２】
また、同期部１１９は、新たな編集命令を生成したときに、編集命令記憶部１１３に記憶されている既存の編集命令の編集位置を修正することがある。これは、前述のように、あるFenced Code Blockの内側における編集の編集位置が、当該Fenced Code Blockの外側の編集の影響を事後的に受けることがあるためである。また、同期部１１９は、サーバ２００に編集命令を送信するときに、送信する編集命令の編集位置を修正することがある。これは、クライアント１００が２以上の編集命令を保持しておりそのうち１つの編集命令を送信する場合には、送信相手は未送信の他の編集命令の存在を認知していないため、他の編集命令による編集の影響を除去すべきであるからである。すなわち、同期部１１９は、１つの編集命令を送信するとき、未送信の他の編集命令による行の追加などの編集がないものと仮定して、送信する編集命令の編集位置を再計算する。
【００９３】
図１２は、編集命令を格納するキューの例を示す図である。
編集命令記憶部１１３は、Fenced Code Block毎にキューを保持する。例えば、編集命令記憶部１１３は、あるFenced Code Blockに対応するキュー１２１と、別のFenced Code Blockに対応するキュー１２２を保持する。各キューは、キューに対応するFenced Code Blockを識別するブロックＩＤを含む。また、各キューは、「種別」と「位置」と「文字」を含む編集命令を１つ以上格納する。「種別」は、挿入や削除などの編集の種別を示す。「位置」は、行番号と列番号を含む編集位置を示す。「文字」は、種別が挿入である場合に挿入された文字を示す。なお、マークダウンテキストに複数の文字を連続的に挿入する編集に対しては、１つの文字の挿入から１つの編集命令が生成されてもよいし、単位時間内の２以上の文字の挿入から１つの編集命令が生成されてもよい。
【００９４】
図１３は、テキスト編集の手順例を示すシーケンス図である。
エディタ１１５は、エディタ領域においてユーザによるマークダウンテキストの編集を検出する。すると、エディタ１１５は、最新のマークダウンテキストをパーザ１１６に渡す（Ｓ１０）。パーザ１１６は、マークダウンテキストを構文解析してＡＳＴを生成し、プレビューア１１７にＡＳＴを渡す（Ｓ１１）。
【００９５】
プレビューア１１７は、ＡＳＴに基づいてページを生成してプレビュー領域に表示する。ＡＳＴの中にFenced Code Blockを示すノードが含まれている場合、プレビューア１１７は、Fenced Code Blockの文字列をデータとしてアプリケーション起動部１１８に渡す（Ｓ１２）。ＡＳＴの中に複数のFenced Code Blockを示すノードが含まれている場合、Fenced Code Block毎にアプリケーション起動部１１８にデータが渡される。
【００９６】
アプリケーション起動部１１８は、データに含まれるタグに基づいて当該データを処理可能なアプリケーションソフトウェア１２０を判定し、アプリケーションソフトウェア１２０を呼び出す。このとき、アプリケーション起動部１１８は、アプリケーション起動部１１８が有するコールバック関数のポイントとデータとをアプリケーションソフトウェア１２０に渡す（Ｓ１３）。アプリケーションソフトウェア１２０は、データの文法の妥当性を検査し、コールバック関数を呼び出して検査結果をアプリケーション起動部１１８に渡す（Ｓ１４）。検査結果は、文法妥当または文法不正を示す。アプリケーションソフトウェア１２０は、データから表示部品を生成してプレビュー領域に表示する。
【００９７】
アプリケーション起動部１１８は、アプリケーションソフトウェア１２０から検査結果を受け付け、パーザ１１６に検査結果を転送する（Ｓ１５）。ＡＳＴの中に複数のFenced Code Blockを示すノードが含まれている場合、Fenced Code Block毎に検査結果が転送される。パーザ１１６は、エディタ１１５に検査結果を転送する（Ｓ１６）。エディタ１１５は、マークダウンテキストと検査結果を同期部１１９に渡す（Ｓ１７）。
【００９８】
次に、同期部１１９の処理手順を説明する。
図１４は、同期処理の手順例を示すフローチャートである。
（Ｓ２０）同期部１１９は、マークダウンテキストの編集位置を特定する。同期部１１９は、特定した編集位置を含む編集命令（今回の編集命令）を生成する。
【００９９】
（Ｓ２１）同期部１１９は、マークダウンテキストに含まれる各Fenced Code Blockの文法の検査結果をエディタ１１５から取得する。検査結果は、文法妥当または文法不正を示す。あるFenced Code Blockの検査結果は、当該Fenced Code Blockに対応付けられたアプリケーションソフトウェアによって生成されたものであり、アプリケーション起動部１１８、パーザ１１６およびエディタ１１５により転送される。
【０１００】
（Ｓ２２）同期部１１９は、ステップＳ２０の編集位置（今回の編集位置）が何れかのFenced Code Blockの内側であるか判断する。今回の編集位置が何れかのFenced Code Blockの内側である場合はステップＳ２５に進み、今回の編集位置が何れのFenced Code Blockの内側でもない場合はステップＳ２３に進む。
【０１０１】
（Ｓ２３）同期部１１９は、マークダウンテキストの中に文法不正と判定されたFenced Code Blockが少なくとも１つ存在するか判断する。文法不正のFenced Code Blockが少なくとも１つ存在する場合はステップＳ２４に進み、文法不正のFenced Code Blockが存在しない場合はステップＳ３５に進む。
【０１０２】
（Ｓ２４）同期部１１９は、今回の編集命令に基づいて、各キューに格納された編集命令（保留中の編集命令）の編集位置を更新する。例えば、今回の編集命令が行を１つ追加するものである場合、同期部１１９は、今回の編集位置よりも後ろに記載されたFenced Code Blockに対応する保留中の編集命令について編集位置の行番号を１つ増加させる。そして、ステップＳ３５に進む。なお、文法不正のFenced Code Blockが少なくとも１つ存在することから、ここでは１以上の保留中の編集命令が存在する。
【０１０３】
（Ｓ２５）同期部１１９は、マークダウンテキストの中に文法不正と判定されたFenced Code Blockが少なくとも１つ存在するか判断する。文法不正のFenced Code Blockが少なくとも１つ存在する場合はステップＳ２８に進み、文法不正のFenced Code Blockが存在しない場合はステップＳ２６に進む。
【０１０４】
（Ｓ２６）同期部１１９は、今回の編集位置が属するFenced Code Blockに対応するキューに、保留中の編集命令が格納されているか判断する。保留中の編集命令が格納されている場合はステップＳ２７に進み、保留中の編集命令が格納されていない場合はステップＳ３５に進む。なお、今回の編集の前からFenced Code Blockに文法不正がない場合はキューに保留中の編集命令が格納されておらず、今回の編集によってFenced Code Blockの文法不正が解消された場合はキューに保留中の編集命令が格納されている。
【０１０５】
（Ｓ２７）同期部１１９は、今回の編集位置が属するFenced Code Blockに対応するキューから保留中の編集命令を取り出し、取り出した編集命令をサーバ２００に送信する。そして、ステップＳ３５に進む。
【０１０６】
図１５は、同期処理の手順例を示すフローチャート（続き）である。
（Ｓ２８）同期部１１９は、今回の編集位置が属するFenced Code Blockが文法不正であるか判断する。今回の編集位置が属するFenced Code Blockが文法不正である場合はステップＳ２９に進み、文法不正でない場合はステップＳ３２に進む。
【０１０７】
（Ｓ２９）同期部１１９は、今回の編集位置が属するFenced Code Block以外の他のFenced Code Blockが存在し、かつ、他のFenced Code Blockに対応するキュー（他のキュー）に保留中の編集命令が格納されているか判断する。上記条件を満たす場合はステップＳ３０に進み、上記条件を満たさない場合はステップＳ３１に進む。
【０１０８】
（Ｓ３０）同期部１１９は、今回の編集命令に基づいて、他のキューに格納された編集命令の編集位置を更新する。例えば、今回の編集命令が行を１つ追加するものである場合、同期部１１９は、今回の編集位置よりも後ろに記載された他のFenced Code Blockに対応する保留中の編集命令について編集位置の行番号を１つ増加させる。
【０１０９】
（Ｓ３１）同期部１１９は、今回の編集位置が属するFenced Code Blockに対応するキューに、今回の編集命令を格納する。そして、同期処理が終了する。
（Ｓ３２）同期部１１９は、今回の編集命令に基づいて、他のキューに格納された編集命令の編集位置を更新する。なお、文法不正のある他のFenced Code Blockが存在することから、ここでは少なくとも１つの他のキューに保留中の編集命令が存在する。
【０１１０】
（Ｓ３３）同期部１１９は、今回の編集位置が属するFenced Code Blockに対応するキューに、保留中の編集命令が格納されているか判断する。保留中の編集命令が格納されている場合はステップＳ３４に進み、保留中の編集命令が格納されていない場合はステップＳ３５に進む。なお、今回の編集の前からFenced Code Blockに文法不正がない場合はキューに保留中の編集命令が格納されておらず、今回の編集によってFenced Code Blockの文法不正が解消された場合はキューに保留中の編集命令が格納されている。
【０１１１】
（Ｓ３４）同期部１１９は、今回の編集位置が属するFenced Code Blockに対応するキューから保留中の編集命令を取り出し、取り出した編集命令をサーバ２００に送信する。このとき、同期部１１９は、他のキューの編集命令が示す編集が行われなかったと仮定して、送信する編集命令の編集位置を修正する。
【０１１２】
（Ｓ３５）同期部１１９は、今回の編集命令をサーバ２００に送信する。このとき、同期部１１９は、他のキューに保留中の編集命令が格納されている場合、他のキューの編集命令が示す編集が行われなかったと仮定して、今回の編集命令の編集位置を修正する。
【０１１３】
上記のフローチャートによれば、以下の１０通りのケースが考えられる。
（１）文法不正のFenced Code Blockがなく、保留中の編集命令がなく、今回の編集位置が何れのFenced Code Blockにも属さない場合。この場合、同期部１１９は、今回の編集命令をサーバ２００に送信する。（２）文法不正のFenced Code Blockがあり、文法不正のFenced Code Blockについて保留中の編集命令があり、今回の編集位置が何れのFenced Code Blockにも属さない場合。この場合、同期部１１９は、保留中の編集命令の編集位置を更新し、今回の編集命令をサーバ２００に送信する。
【０１１４】
（３）文法不正のFenced Code Blockがなく、保留中の編集命令がなく、今回の編集位置が何れかのFenced Code Blockに属する場合。この場合、同期部１１９は、今回の編集命令をサーバ２００に送信する。（４）文法不正のFenced Code Blockがなく、何れかのFenced Code Blockについて保留中の編集命令があり、今回の編集位置が当該保留中の編集命令があるFenced Code Blockに属する場合。この場合、同期部１１９は、保留中の編集命令をサーバ２００に送信し、その後に今回の編集命令をサーバ２００に送信する。
【０１１５】
（５）文法不正のFenced Code Blockがあり、文法不正のFenced Code Blockについて保留中の編集命令があり、今回の編集位置が文法不正のないFenced Code Blockに属する場合。この場合、同期部１１９は、保留中の編集命令の編集位置を更新し、今回の編集命令をサーバ２００に送信する。（６）文法不正のFenced Code Blockがあり、文法不正のFenced Code Blockについて保留中の編集命令があり、更に文法不正のないFenced Code Blockについて保留中の編集命令があり、今回の編集位置が文法不正のないFenced Code Blockに属する場合。この場合、同期部１１９は、文法不正のFenced Code Blockの保留中の編集命令の編集位置を更新し、文法不正のないFenced Code Blockの保留中の編集命令をサーバ２００に送信し、その後に今回の編集命令をサーバ２００に送信する。
【０１１６】
（７）文法不正のFenced Code Blockが１つのみであり、保留中の編集命令がなく、今回の編集位置が文法不正のFenced Code Blockに属する場合。この場合、同期部１１９は、今回の編集命令を保留する。（８）文法不正のFenced Code Blockが１つのみであり、文法不正のFenced Code Blockについて保留中の編集命令があり、今回の編集位置が文法不正のFenced Code Blockに属する場合。この場合、同期部１１９は、保留中の編集命令をそのまま維持して今回の編集命令を保留する。
【０１１７】
（９）文法不正のFenced Code Blockが複数あり、今回の編集位置が何れかの文法不正のFenced Code Blockに属し、今回の編集位置が属するFenced Code Blockに保留中の編集命令がなく、他のFenced Code Blockに保留中の編集命令がある場合。この場合、同期部１１９は、他のFenced Code Blockの保留中の編集命令の編集位置を更新し、今回の編集命令を保留する。（１０）文法不正のFenced Code Blockが複数あり、今回の編集位置が何れかの文法不正のFenced Code Blockに属し、今回の編集位置が属するFenced Code Blockに保留中の編集命令があり、他のFenced Code Blockに保留中の編集命令がある場合。この場合、同期部１１９は、他のFenced Code Blockの保留中の編集命令の編集位置を更新し、今回の編集位置が属するFenced Code Blockの保留中の編集命令をそのまま維持して今回の編集位置を保留する。
【０１１８】
第２の実施の形態の情報処理システムによれば、あるFenced Code Blockに文法不正が発生した場合、当該Fenced Code Blockの編集はユーザ間で同期されない。これにより、編集したユーザ以外の他のユーザのプレビュー領域で表示部品がブラックアウトすることを抑制できる。その結果として、Fenced Code Block内の既存データが意図せず消去されてしまうことを抑制できる。また、Fenced Code Blockに文法不正が発生している間でも、Fenced Code Blockの外側の編集はユーザ間で同期される。また、あるFenced Code Blockに文法不正が発生している間でも、文法不正のない他のFenced Code Blockの編集はユーザ間で同期される。よって、ユーザ間の情報共有が過度に制限されることを抑制でき、複数のユーザによる編集内容の共有を円滑化することができる。
【符号の説明】
【０１１９】
１０  編集装置
１１  記憶部
１２  通信部
１３  処理部
１４  テキスト
１５  ブロック
１６，１７  編集命令
２０  情報処理装置
【図１】
2019207528.tif 000003
【図２】
2019207528.tif 000004
【図３】
2019207528.tif 000005
【図４】
2019207528.tif 000006
【図５】
2019207528.tif 000007
【図６】
2019207528.tif 000008
【図７】
2019207528.tif 000009
【図８】
2019207528.tif 000010
【図９】
2019207528.tif 000011
【図１０】
2019207528.tif 000012
【図１１】
2019207528.tif 000013
【図１２】
2019207528.tif 000014
【図１３】
2019207528.tif 000015
【図１４】
2019207528.tif 000016
【図１５】
2019207528.tif 000017