Develop/1

http://sakura.qp.land.to/?Develop%2F1


Top > Develop > 1

アウトライン解析の現状と改善案

  • ページ: Develop
  • 投稿者: げんた
  • 優先順位: 低
  • 状態: 提案
  • カテゴリー: アウトライン解析
  • 投稿日: 2006-09-30 (土) 20:56:45
  • バージョン:

メッセージ

アウトライン解析をページの横にドッキングして欲しいという要望がある. 未だ実現していない理由の1つとして,現在は編集時にリストとの整合性を 保てないというのがある.

現状

CEditViewのコマンド処理部からからMake_xxxxを呼びだしてCFuncInfoArrに見出し情報の配列を得る.それをCDlgFunclistへ渡してリストボックス,あるいはツリーの形で表示する.

Make_xxxの部分は文書データからリストを作るところまで.リストを表示するための加工はCDlgFunclistの方にある.

CFuncInfoArrは何故かCEditView::Command_FUNCLIST()にて

static CFuncInfoArr	cFuncInfoArr;

とされている.

CFuncInfoArrはCFuncInfoの配列を管理するクラス. CFuncInfoへのポインタを配列として管理している. CFuncInfoArr::AppendDataは要素が1つ増える毎にreallocしているので,メモリの再配置が頻繁に行われているかもしれない.

CFuncInfoの要素は以下の通り.

  • int m_nFuncLineCRLF: 関数のある行(CRLF単位)
  • int m_nFuncLineLAYOUT: 関数のある行(折り返し単位)
  • CMemory m_cmemFuncName: 関数名
  • int m_nInfo: 付加情報
  • int m_nDepth: 深さ

CFuncInfo物理行とレイアウト行の両方が本当に必要かという疑問がある.

折り返し単位の行番号の現在の使われ方

  • 行番号表示が折り返し単位の時にそれに合わせる形でリストボックスに行番号を表示するため.
  • 現在のカーソル位置がどの見出し項目に含まれるかを調べるため.

変更案

ウィンドウをドッキング可能にすると,もはやダイアログボックスではないので CDlgFunclistとは別の実装になると思われる.現在CDlgFunclistに入っている 種類毎の個別の表示処理を独立した関数とし,データ構築時にそのポインタを CFuncInfoArrに渡しておくようにする.

折り返し位置の変化によって値が変わってしまう折り返し単位の行番号は常時表示には向かないので必要に応じて計算し直すことにする.現在のカーソル位置との比較にもレイアウト行位置を使っているが,これは最初に一回変換しておけばそれ以降はレイアウト行である必要はない.

注意: 表示行→物理行のポインタはあるが逆はない.

行とのリンクのために,CFincInfoの項目として整数値を1つ追加する. また,CDocLineにも整数値を1つ追加して行位置がずれた場合に追跡可能にする. ただし,実際にどのくらいindexが作られるかはわからないのである範囲の番号を 使い回す.(別の言い方をすれば Count mod X の値を格納する)

ルール

  • 行番号の若い順に連番を振る

検索

  • 指定行番号の行のindexを調べる.番号が一致すればOK
  • 一致しなければまず後方を調べる.
  • 最初に見つかった番号が目的の物より大きければ,今度は前方を調べる.
  • 見つかった番号が目的の物より小さければ当該行は削除されたと判断する.
  • 見つかったときの行番号をCFuncInfoに書き戻す.

この方法だと,インデックスの追加には対応できない.しかし,ファイルサイズによっては構築に時間がかかるので,むやみに完全再構築を行うべきではない.

番号が循環するので比較は単純には出来ない.例えばX=16(4bit利用),目的の番号=13のとき,1は13-1=11, 16+1-13=4なので目的より後ろと判断すべきである. これは (1-13)&15の最上位ビットを符号ビットと考えれば判定できるが, 誤判定を減らすために判断不能な領域を設けておいた方がよいかもしれない. (上の例では7とか)

見出しではない行も表現する必要がある.値の1つを使う方法と独立したフラグとする 方法が考えられるが,前者だと環状データが2^n-1周期となって単純なANDマスクが使えない.

行に付けるインデックスは,アウトラインデータ構築時に全ての行をスキャンすることを利用して再構築時にクリアする.

行番号インデックスの付いた行をbookmarkのように探すことで,前後の見出しへジャンプする機能を容易に実装できる.

2006.10.28 途中までUP

まだCDocLineのiteratorとCFuncListArrへのCEditDoc追加くらい. 次はレイアウト行を使わないようにする.

その後で行の読み出しと追加をiterator経由で行えるようにする. この段階で各メソッドはCEditDoc配下である必要が無くなるはず.

2006.10.30 途中までUP

CFuncInfoからレイアウト行の情報を除去. MakeFunc_CだけCEditDocから切り離してみた.問題なく動作する.

2007.02.02 途中までUP

さらに多くの関数を切り離した.残り2つ. 基本的にはAppendDataの引数を2つ削除するのとループを置き換えるだけなので 書き間違えなければ問題は出ないはずだが,別の場所からコピーした物を ベースにすると間違える.(txtで階層が作られない問題が出た.) PL/SQL, Textは良さそうだが最終的には全て試す必要有り.

namespace OutlineAnalyzer に移動した関数の宣言部を使用場所の直前に置いているが, 別のヘッダに移す必要有り.

思いついたアイディア: 正規表現を利用したアウトライン解析は正規表現モジュールが必ずあるかどうかわからないので検討しなかったが,モジュールがなければ空のデータ(またはエラーメッセージのみ入ったデータ)を返す仕様なら良いのではないか?

2007.02.03 CEditDocからの切り離し完了

コンパイルは通ったが,試験は行っていない.

2007.09.14 rev.1121への対応

pythonのoutlineが追加されたため.



URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White
filefunclistarray_p6_1121.zip 371件 [詳細] filefunclistarray_p5.zip 410件 [詳細] filefunclistarray_p4.zip 363件 [詳細] filefunclistarray_p3.diff 264件 [詳細] filefunclistarray_p2.diff 263件 [詳細] filefunclistarray_p1.diff 236件 [詳細]
[添付ファイル一覧] [全ページの添付ファイル一覧]
アップロード可能最大ファイルサイズは 2,048KB です。

添付ファイル: filefunclistarray_p6_1121.zip 371件 [詳細] filefunclistarray_p5.zip 410件 [詳細] filefunclistarray_p4.zip 363件 [詳細] filefunclistarray_p3.diff 264件 [詳細] filefunclistarray_p2.diff 263件 [詳細] filefunclistarray_p1.diff 236件 [詳細]

リロード   新規 編集 凍結 差分 添付 複製 名前変更   ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: 2007-09-15 (土) 00:32:11 (6030d)