EmEditorみんなでまとめサイト

連番([000-010]みたいな)を展開するマクロ

最終更新:

匿名ユーザー

- view
だれでも歓迎! 編集

説明

  • 選択範囲内の各行に対し、[001-010]のように書かれた部分を連番に展開し、リストを挿入する。
  • [###-###]でかかれた最初の方の数字の桁数に併せて、連番を0埋めする
  • 選択範囲がなければカーソルのある行に対して処理を行う

実行前の選択範囲
[000-003].jpg
http://host.com/[0-2]/[0-10].jpg
実行後
000.jpg
001.jpg
002.jpg
003.jpg
http://host.com/0/0.jpg
http://host.com/0/1.jpg
...(中略)
http://host.com/2/9.jpg
http://host.com/2/10.jpg

ソース(.jsee)

// strを各行ごとの終端に改行コードを残して配列にする。
function split_line(str) {
	var rest = str;
	var result = new Array();
	while (true) {
		if (/(\r\n|\r|\n)/.test(rest)) {
			result.push(RegExp.leftContext + RegExp.$1);
			rest = RegExp.rightContext;
		} else {
			if (rest.length > 0)
				result.push(rest + "\r\n");
			break;
		}
	}
	return result;
}

// digit桁に0-paddingした、nの10進数表現
function to_s(n, digit) {
	var result = n.toString();
	while (result.length < digit)
		result = "0" + result;
	return result;
}

// [###-###] を範囲内の数字に置き換えた文字列のリストを取得し、resultの末尾に追加
function expand(str, result) {
	if (/\[(\d+)\-(\d+)\]/.test(str)) {
		var digit = RegExp.$1.length;
		var i = parseInt(RegExp.$1);
		var j = parseInt(RegExp.$2);
		var lstr = RegExp.leftContext;
		var rstr = RegExp.rightContext;
		for (var k = i; k <= j; k++)
			expand(lstr + to_s(k, digit) + rstr, result);
	} else {
		result.push(str);
	}
}

if (Document.selection.IsEmpty)
	Document.selection.SelectLine();

var str = Document.selection.Text;
var lines = split_line(str)
var result = new Array();
for (var i in lines)
	expand(lines[i], result);
Document.selection.Text = result.join("");

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

目安箱バナー