アウトラインのノードの完了/未完了を切り替える
#title = "完了未了切替"
/*****************************************************************************************************
******************************************************************************************************
**
** 当マクロはhalna氏作成のAndroidアプリ「ハルナアウトライン」
** https://play.google.com/store/apps/details?id=jp.blogspot.halnablue.HalnaOutliner
** とMeryを併用する前提で、Mery側に欲しい機能を私が勝手にマクロで実装したものです。
** 当マクロはhalna氏作成のAndroidアプリ「ハルナアウトライン」と直接の関係はありません。
** 当マクロについてhalna氏への問い合わせはおやめください。
**
** ハルナアウトラインの.hol形式の階層付きテキストは、
** ノード名の末尾にタブを挟んで、カンマ区切り5要素の0/1/空白3値のフラグを持っている。
** それぞれ、完了表示や取消表示に対応しているが、完了フラグは3桁目となっている。
** Meryで作成したアウトラインノードはこのフラグを持っていないため付与する。
** また、ハルナアウトラインは完了表示機能を持っていないので
** ハルナアウトラインで作成されたままのノードに対してはノード名称に□/☑/*を追記する。
**
** ノード接頭文字なしはハルナアウトラインで通常作成したままのノード
** ノード接頭文字"*"は接頭文字があるがフラグを持たない状態で残留していたノード
** とみなし、想定で状態を挿入する。当マクロを繰り返し実行することで手動で正しい姿に修正する前提。
**
** その前提で、選択中のノードのノード名先頭にある接頭文字□/☑/*を置換する。
** また、ノード名の末尾にあるフラグを反転する、もしくは追加する。
** □→☑ フラグ1へ
** ☑→□ フラグ0へ
** *→☑ フラグ1へ
** 無→□ フラグ0へ
**
** ノードを示す記号にはハルナアウトライン用に"."を用いる。
** NdMkrの値を変更すればMarkdownやらにも使えるかもしれません(未検証)。
**
******************************************************************************************************
*****************************************************************************************************/
var NdMkr = ".";
var cntMkr = 0;
var ndNmOld = "";
var ndNmNew = "";
var posY = 0;
var posX = 0;
var strFlgs = /\d?,\d?,(\d?),\d?,\d?/;
var strNl = /\r\n|\r|\n/;
reg = new RegExp("^\\" + NdMkr + "+");
with (document.selection) {
//カーソル位置を保持※文字数が著しく変わるため可能な限りの復帰を目指す
posY = GetActivePointY(mePosLogical);
posX = GetActivePointX(mePosLogical);
//ノード行先頭にカーソルがある場合、取り漏らすためカーソルを移動
EndOfLine(false,mePosLogical);
//カーソル手前に存在する先頭がノード記号である行から、旧ノード名を取得
//先頭n文字がノードの深さを示している想定
Find("^\\"+ NdMkr , meFindPrevious | meFindReplaceRegExp);
SelectLine();
ndNmOld = Text;
//□:未完了のとき、☑完了へ置き換える。フラグがなければノード名末尾に,,1,,を追加、フラグがあれば1へ置き換える。
if(ndNmOld.indexOf("□") !== -1){
ndNmNew = ndNmOld.replace("□", "☑"); //□→☑
if (strFlgs.test(ndNmNew) == false) {
ndNmNew = ndNmNew.replace(strNl, '');
ndNmNew = ndNmNew+"\t,,1,,\n" //フラグ1付与
} else {
ndNmNew = ndNmNew.replace(/(\d?,\d?,)\d?(,\d?,\d?)/, "$011$02");//フラグを1に
}
//☑:完了のとき、□:未完了へ置き換える。フラグがなければノード名末尾に,,1,,を追加、フラグがあれば1へ置き換える。
} else if (ndNmOld.indexOf("☑") !== -1) {
ndNmNew = ndNmOld.replace("☑", "□"); //☑→□
if (strFlgs.test(ndNmNew) == false) {
ndNmNew = ndNmNew.replace(strNl, '');
ndNmNew = ndNmNew+"\t,,0,,\n" //フラグ0付与
} else {
ndNmNew = ndNmNew.replace(/(\d?,\d?,)\d?(,\d?,\d?)/, "$010$02"); //フラグを0に
}
//*:不明のとき、切替先を完了と仮定し、☑:完了へ置き換える。
//フラグがなければノード名末尾に,,1,,を追加、フラグがあれば1へ置き換える。
} else if (ndNmOld.indexOf("*") !== -1) {
ndNmNew = ndNmOld.replace("*", "☑"); //*→☑
if (strFlgs.test(ndNmNew) == false) {
ndNmNew = ndNmNew.replace(strNl, '');
ndNmNew = ndNmNew+"\t,,1,,\n" //フラグ1付与
} else {
ndNmNew = ndNmNew.replace(/(\d?,\d?,)\d?(,\d?,\d?)/, "$011$02"); //フラグを1に
}
//*:不明のとき、切替先を未完了と仮定し、□:未完了へ置き換える。
//フラグがなければノード名末尾に,,0,,を追加、フラグがあれば1へ置き換える。
} else {
ndNmNew = ndNmOld.replace(/^(\.+)/, "$01□"); //無→□
if (strFlgs.test(ndNmNew) == false) {
ndNmNew = ndNmNew.replace(strNl, '');
ndNmNew = ndNmNew+"\t,,0,,\n" //フラグ0付与
} else {
ndNmNew = ndNmNew.replace(/(\d?,\d?,)\d?(,\d?,\d?)/, "$010$02"); //フラグを0に
}
}
//選択中の旧ノード名文字列を削除し、新ノード名を追記する。
Delete();
document.write(ndNmNew);
//カーソル位置の復帰
SetActivePoint (mePosLogical, posX, posY, false);
}
//Findを使っているため出現した検索強調表示を消す
document.HighlightFind = false;
スポンサーリンク