2013-04-06 5 views
9

私は<div contenteditable="true" />というユーザーが書くことができますが、その長さには限りがありません。
divのデータは、変更時にMySQLデータベースのタイムスタンプとともに保存されます。タイムスタンプでcontenteditableの変更を保存する

今、私の目標は、文書の各部分は(解像度は日にする必要があります)が作成されたことをユーザに通知します左側に小さなノートを持っていることです。

さて、質問です:がどのように情報(どの部分を変更しました)最善を保存することができますか?

は、私がこれまでに次のオプションを検討し、両方の改善できるようでどのユーザが文書の最後にサイトを訪れた

  1. たびに、私はフラグ(クラスとして例えばemtpyスパンを挿入します編集の開始を格納するデータ属性)。このフラグは、保存スクリプトが呼び出されたときにデータベースに保存されます。このオプションを使用すると、サイドに日付を表​​示するのが非常に簡単になります。空のスパンと同じ高さに置くだけで、スパンが私に日付を知らせます。短所は以下のとおりです。ユーザーが誤ってタイムスタンプスパンを削除してしまい、ユーザーが長い時間ウィンドウを閉じないと、新しいタイムスパンが挿入されません(これは、X分ごとに新しいタイムスタンプスパンを挿入することで回避できます)関連性が高い)
  2. データが保存スクリプトに渡されるたびに文字列diff比較を実行しようとしていて、タイムスタンプ付きの差分のみを保存します。その後、ページがロードされると、すべての部品を正しい順序でまとめ、Javascriptで日付のメモを適切な場所に配置します。しかし、古い部品が変更されたときに2つの部品が1つになるなど、これは私のためのオーバーヘッドのように思えます。

高く評価任意の入力/アイデア/提案!

+0

コンテンツのタイプは構造化されているか構造化されていませんか?それが(コードベースのように)構造化されていない場合は、Armelが提供するソリューションを使用することをお勧めします。それが構造化されている、または構造化されている場合は、MrFishieと私が提供したソリューションです。 –

+0

コンテンツのタイプは構造化されているか構造化されていませんか?構造化されていない場合(コードベースのように)、armelによって提供されるマージソリューションを使用することをお勧めします。それが構造化されている、または構造化されている場合は、MrFishieと私が提供したソリューションです。構造化されていないドキュメントは、適切な階層の変更を解決することが非常に困難なため、処理が複雑です。 (これは、ロータスノーツの異なるサーバー間でのレプリケーションでは常に問題が非常に深刻でした)。これは、私が考慮したいコメントのバージョンです。 –

+0

@LoekBergman:入力はユーザーによって生成されたもので、特定の構造には従いません。 – Horen

答えて

12

実装しようとしているのは、ソースコード管理の世界で「注釈」または「責め」と呼ばれる機能です(ただし、date + authorまたは単にauthorではなく、更新日が必要です)。

これを正しく行うには、diffs(php-diffがその仕事をするかもしれない)を作成し、テキストのバージョンを入手する方法が必要です。 があり、いくつかの戦略です:

  • ストアの最新バージョンとの差分だけを保つ(例えば統一差分として、私の好み)

  • ストアすべてのバージョンと、その場でデルタを計算する

あなたの現在のバージョンとデルタのリストを取得したら(リストを短くすることができます。デルタを一緒に構成します。これは、どのバージョンが各行に含まれているかを覚えているので、注釈フェーズが行われる場所です。作曲はかなりシンプルです(最新のものから始めて、パッチに追加されたすべてのラインは最新のものであり、他のものは説明する必要があるので、あなたが治療したい最も古いパッチに達するまで、残りの行はそのバージョンからのものであるか、または最も早いものであるため、「at」または「before」を示すいくつかのフラグが使用できます)。

Google has a diff library for Javascriptこのように、すべての作業をユーザーのマシンで行うことができます。彼らはこのライブラリのパッチ部分も持っています。私は注釈/非難のライブラリを見つけませんでした。

+0

ありがとう - それはいい考えのように聞こえる。ただ理解しやすくするために:保存:1)最新のバージョンを保存します。2)同時に、現在のバージョンに付属の差分を保存します。それから、ロード(あなたはそれを構成していると呼んでいます):1)現在のバージョンから始めます。2)最新の差分をとり、それを現在のバージョンに適用します。 GoogleのJavaScriptのパッチ、3)終了するまで、次の古いdiffでステップ2を繰り返します。私はそれを正しく理解しましたか? – Horen

+0

はい、そのようなものは、 "保存中"トランザクションで動作するようにしてください(現在の+保存パッチを保存してください)。 「読み込み中」に、パッチを適用してジョブを注釈する必要があります。パッチがライン指向であるため、注釈/パッチアプリケーションは、「著者および/または日付」の配列を操作して、ライン座標のみで操作し、パッチ内のテキストのみを操作するように縮小することができます(ただし、リストア機能、またはdiff-to-version)。 Google図書館では注釈の部分は行いませんが、コードからインスピレーションを得ることができます。 – armel

+0

彼は注釈や責任(または賞賛)のプロセスを要求していません。これは、誰がコードをコミットしたかを調べるプロセスであるためです。それは現在のバージョンの検索とは関係ありません。あなたが説明しているプロセスは、MrFishieと私が提案したもののマージと良い選択肢です。一般的な質問のコメントを参照してください。 –

4

あなたができることの1つは、divの改訂用の表を用意することです。多くの場合、コンテンツとタイムスタンプを含む新しいエントリをこのテーブルに追加することができます。したがって、編集のすべてのリビジョンを追跡することができます。次に、変更内容を確認するために、2つのエントリを比較して、追加された内容、変更された内容、削除された内容を簡単に比較できます。

+0

それはいい考えです。私が見る唯一の問題は、どのようなものが追加、変更、削除されたのか、どのように左に示されている作成日の位置に合わせるのかを見つける「方法」です。何か案は? – Horen

+0

正規表現でこれを行うにはいくつかの方法があるはずですが、私はあまりよくありません。 – cpdt

4

この情報は、ユーザーが情報を送信したときに保存する必要があります。ユーザーが情報を見たいと思う瞬間は、ほとんど計算が行われません。

バックエンドでは、2つのテーブルを作成します。あるテーブルでは、それを 'currentdocs'と呼ぶことができます。常に最新バージョンのデータを保存します。ユーザーがドキュメントを読み込むと、すべての情報がこのテーブル 'currentdocs'から取得されます。 他のテーブルでは、それを 'docsintime'と呼ぶことができます。新しい保存をすべて保存します。それは 'currentdocs'テーブルへの外部キーを持っていて、そのテーブルの最後の行を 'docsintime'で見つけることができます。 select文は次のようになります。

select id from docsintime where cur_key = x order desc limit 1; 

両方のテーブルでは、変更された最新のタイムスタンプを両方のテーブルに保存します。

新しい文書が保存されると、最後に保存されたバージョンがテーブル 'docsintime'に取得されます。すべての関連部分をそのレコードのデータと比較します。それ以外の場合は、保存する新しいレコードの該当する部分のタイムスタンプをコピーします。それが異なる場合は、その関連部分の新しいタイムスタンプを作成しますか。 比較後、 'currentdocs'と 'docsintime'の両方のテーブルに新しいレコードを保存しますか? 'currentdocs'テーブルを更新し、 'docsintime'テーブルに新しいレコードを挿入します。新しい文書でのみ、 'currentdocs'テーブルに挿入します。 その文書に対する次の要求では、 'currentdocs'テーブルから情報を収集するだけで済みます。そしてプロセスはもう一度始まります。

関連する問題