【期間限定】『英単語の覚え方』レポート配布中

Meryの「自動箇条書き」の改善コード例

愛用しているメモ帳アプリ「Mery」。

こちらに入れてある「自動箇条書き」のマクロが正常に作動しなくなってしまいました。

今まではShift+Enterで「・」を自動入力できていました。

しかしある時から「undefinedundefined・」という謎文字が表示されるようになったのです。

原因や改善策を調べてみましたが、

「マクロ上部に以下のコードを追加してみてください。」

#language = "JScript"

という情報しか見つけられませんでした。

そしてこれを入れても、というか何故か既にマクロ最上部に記入してあったのですが、問題は解決しませんでした。

目次

Meryを諦めきれない

Meryはかれこれ10年以上愛用しているソフトです。

今更他のメモ帳ソフトに移行する気はありません。

どうにか自動箇条書きを復活させられないかと、知恵を絞って修正コードを作成しました。

きっと私と同じ問題にぶつかっている人が他にもいると思います。

そのコードをこちらで共有しますので、良ければお試しください。

3点注意です。

  1. 何が起きても自己責任です。
  2. 少々私の好みに合わせた編集がしてあります。
  3. 上手くいかなくても相談に乗ったりはしません。

では、以下にコードを示します。

#language = "JScript"
#title = "箇条書き(記号対応版)"

var firstitem = "・";
var reg = /^([\t  ]*)(?:([((]*)([a-zA-Z]+|[0-9]+|[0-9]+)([))\.. ]+)|([--・・**■□>>]))/;

var ty = Editor.ActiveDocument.Selection.GetActivePointY(mePosLogical);
var trymax = 5;
var tyend = (ty - trymax > 0) ? ty - trymax : 1;
var line = "";
var result;
var resultary = [];
var thisline = Editor.ActiveDocument.GetLine(ty, 0);
var indent = thisline.replace(/^([ \t]*).*/, "$1");

for (var i = ty; i >= tyend; i--) {
	line = Editor.ActiveDocument.GetLine(i, 0);
	var linechk = line.replace(/^([ \t]*).*/, "$1");
	if (i < ty && linechk.length < indent.length) {
		break;
	}
	result = reg.exec(line);
	if (result != null) {
		if (result[1] == indent) {
			resultary.unshift(result.slice(0));
		} else if (result[1] < indent) {
			break;
		}
	} else if (resultary.length > 0) {
		break;
	}
}

Editor.ActiveDocument.Write(bulletSucc(resultary, thisline));

function bulletSucc(resultary, thisline) {
	if (resultary.length == 0) {
		return firstitem;
	}
	var chklast = resultary.pop();
	var chklastlast = resultary.pop();
	var i = (chklastlast == null || isNaN(chklast[3]) || isNaN(chklastlast[3])) ? 1 : chklast[3] - chklastlast[3];
	var s = "", r3 = (chklast == null) ? 0 : chklast[3];

	// undefined対策
	var indent = chklast[1] || "";
	var prefix = chklast[2] || "";
	var suffix = chklast[4] || "";
	var symbol = chklast[5] || "";

	// 数字・アルファベット箇条書きなら連番に
	if (r3) {
		if (isNaN(r3)) {
			if (r3 == "9") {
				s = 10;
			} else {
				i = (r3 == "z" || r3 == "Z") ? -25 : 1;
				s = String.fromCharCode(r3.charCodeAt(r3.length - 1) + i);
			}
		} else {
			s = Number(r3) + i;
			s = (s > 0) ? s : 0;
			if (r3.charAt(0) == "0") {
				s = ("0000" + s).slice(-r3.length);
			}
		}
	}

	// 記号だけなら、そのまま使う
	if (!r3 && symbol) {
		if (thisline.replace(/^[ \t]+/, "").length == 0) {
			return symbol;
		} else {
			return "\n" + indent + symbol;
		}
	}

	// 通常の箇条書き(数字・英字)
	if (thisline.replace(/^[ \t]+/, "").length == 0) {
		return prefix + s + suffix + symbol;
	} else {
		return "\n" + indent + prefix + s + suffix + symbol;
	}
}

上手くいったらコメントください。

元気がもらえます^^

この記事を書いた人

コメント

コメントする

目次