アウトライン用ノード追加

提供: MeryWiki
移動先: 案内検索

当方プログラムをする身ではないため、不適切な記述があるかもしれません。 訂正・更新あればよろしくお願いします。

#title = "ノード追加"
/***********************************************************************************************************
************************************************************************************************************
**
**  当マクロはhalna氏作成のAndroidアプリ「ハルナアウトライン」
**  https://play.google.com/store/apps/details?id=jp.blogspot.halnablue.HalnaOutliner
**  とMeryを併用する前提で、Mery側に欲しい機能を私が勝手にマクロで実装したものです。
**  当マクロはhalna氏作成のAndroidアプリ「ハルナアウトライン」と直接の関係はありません。
**  当マクロについてhalna氏への問い合わせはおやめください。
**  
**  選択中のノードの末尾(実態は次のノードの手前)に「ノードを示す文字」を持った新規行を追加する。
**  追加されるノードの深さは現在カーソルが存在するノードと同じ深さとする。
**  追加する仮ノード名は"[AddedNode]"とする(仮)。
**  ただし……
**  ・ハルナアウトラインの.hol形式の階層付きテキストは、先頭ノードの手前に2行のデータ行があるためそれを考慮し、
**   先頭ノードよりも手前にカーソルがある状態では、先頭に深さ1のノードを追加する。
**  ・最後尾のノードでは「次のノードの手前」が取得できないため、ファイル末尾を追加位置とする。
**  
**  ノードを示す記号にはハルナアウトライン用に"."を用いる。
**  NdMkrの値を変更すればMarkdownやらにも使えるかもしれません(未検証)。
**
************************************************************************************************************
***********************************************************************************************************/

var NdMkr = ".";
var cntMkr = 0;
var adNodeNm = "[AddedNode]";

with (document.selection) {

	//カーソル位置を保持
	pos = GetActivePos();

	//ノード行先頭にカーソルがある場合、自ノードを取り漏らすためカーソルを移動
	EndOfLine(false,mePosLogical);

	//先頭ノードより手前でない限り…
	if(Find("^\\"+ NdMkr , meFindPrevious | meFindReplaceRegExp) > 0){

		//カーソル復帰し、行末にカーソルを移動
		//ノード記号をカーソル手前へ検索して、発見した行を選択する。
		SetActivePos (pos, false);
		EndOfLine(false,mePosLogical);
		Find("^\\"+ NdMkr , meFindPrevious | meFindReplaceRegExp);
		SelectLine();

		//行頭ノード記号の数(ノードの深さ)を取得
		reg = new RegExp("^\\" + NdMkr + "+");
		cntMkr = Text.match(reg)[0].length;

		//次のノードを検索するためカーソルを移動
		LineDown(false, 1);
		StartOfLine(false,mePosLogical);

		//カーソルより後にある行頭ノード記号の存在する行を取得
		//末尾ノードでない限り…
		if (Find("^\\"+ NdMkr , meFindNext | meFindReplaceRegExp) > 0){
		
			//その1行手前に新ノード用の行を追加する
			//一行遡って行末へ移動
			LineUp(false, 1);
			EndOfLine(false,mePosLogical);

			//改行、段落分の自動インデント発生を抑制できないためアンインデント、改行
			NewLine(1);
			SelectLine();
			unindent(1);
			NewLine(1);
			
			//ノードの深さに応じたノード記号と、仮ノード名[AddedNode]と、空行を追加
			for(step = 0; step < cntMkr; step++){
				document.Write(NdMkr);
			}
			document.Writeln(adNodeNm + "\r\n");

		} else {
		//末尾ノードの場合、「次ノードの手前」が取得できないため特殊処理
		//ファイル末尾に追加する
			EndOfDocument(false);
			NewLine(2);
			StartOfLine(false,mePosLogical);

			//ノードの深さに応じたノード記号と、仮ノード名[AddedNode]と、空行を追加
			for(step = 0; step < cntMkr; step++){
				document.Write(NdMkr);
			}
			document.Writeln( adNodeNm + "\r\n");
		}

	} else {
		//先頭ノードより手前の時
		//「手前のノードのノード記号の数」から深さを取得できないため特殊処理
		//先頭に、ハルナアウトライン用の特殊記述行がある前提
		StartOfDocument();
		LineDown(false, 2);
		NewLine();

		//ノード記号1つと仮ノード名[AddedNode]と、空行を追加
		document.Write(NdMkr);
		document.Writeln( adNodeNm + "\r\n");
	}


}

document.HighlightFind = false;
スポンサーリンク