連番を挿入

提供:MeryWiki
2014年1月8日 (水) 21:07時点におけるMasme (トーク | 投稿記録)による版 (ZIPへのリンクを[メディア]に変更。ソースコードにCSS:overflowを設定。レイアウトを調整。)
ナビゲーションに移動 検索に移動

カーソル位置or選択範囲の行頭に連番(半角数字)を挿入するマクロです。
範囲選択している場合は、各行の行頭に連番を付加します。
範囲選択していない場合は、入力した「行数」分の連番を挿入します。

※アルファベット連番やカタカナ連番などには対応していません。

InsertSequentialNumber Popup.png
連番を挿入 連番の挿入を実行します。
(プレビュー) 挿入される連番の内容を事前に確認できます。
プリセット あらかじめ登録しておいた内容に従い、設定を一括変更します。
始値 開始番号。0以上の半角数字を入力してください。
行数 連番の個数。1以上の半角数字を入力してください。
※範囲選択している場合は変更できません。
増分 連番の増え方。0以上の半角数字を入力してください。
増分が 2 なら、1,3,5,7,9... のように2ずつ増える連番になります。
桁数 連番の最低桁数。1以上の半角数字を入力してください。
桁数が 3 なら、最低でも3桁以上になるよう桁埋めします。
※「桁埋め」が (無し) の場合、この設定は無視されます。
桁埋め 桁揃えに使用する文字列。半角1文字を入力してください。
※全角文字や2文字以上を入力することもできますが桁が揃わなくなります。
接頭辞 連番の前に付ける文字列。
接尾辞 連番の後に付ける文字列。

注意点

  • ポップアップメニュー上での視認性を良くするため、半角空白は ␣ (U+2423)、水平タブは › (U+203A) の記号で代替表示されます。また、空欄の場合(何も入力されてない項目)は、(無し) と表示されます。
  • 桁埋め/接頭辞/接尾辞の文字入力時にキャンセルすると、入力前の状態に戻るのではなく、空欄あつかい=(無し) となります。

プリセットについて

プリセットは、設定項目を一発で変更する機能です。
「プリセット一覧」部分を各自で編集する必要がありますが、よく使う設定をプリセットに登録しておけば、使い勝手が向上します。

※記述ミスがあると正しく機能しません。セミコロン ; や括弧の打ち忘れ、打ち間違いに注意してください。

ソースコード

ダウンロード→ 連番を挿入.zip

//■連番を挿入
// 2013/08/25
//
//・カーソル位置or選択範囲の行頭に連番(半角数字)を挿入します。
//・範囲選択してない場合は、連番の行数(個数)を変更できます。
//▲注意点
//・桁埋め/接頭辞/接尾辞の文字入力時にキャンセルすると、
// 入力前の状態に戻るのではなく、空欄=(無し)となります。
// ※空欄でOKした時とキャンセルした時の返り値が同じなので、
//  分岐処理することができません。求ム、解決法。

//■初期設定 ●初期値
var start = 1;		//始値 ●1      ※半角数字/0以上の整数
var lines = 10;		//行数 ●10     ※半角数字/1以上の整数
var incre = 1;		//増分 ●1      ※半角数字/0以上の整数
var digit = 1;		//桁数 ●1      ※半角数字/1以上の整数
var supply = "0";	//桁埋め ●"0"  ※文字列/半角1文字を推奨
var prefix = "";	//接頭辞 ●""   ※文字列
var suffix = "";	//接尾辞 ●""   ※文字列

//■プリセット一覧
var last = start+(lines-1)*incre;	//終値を計算
var f = [];
// ----------------- ↓ここより下にプリセットを記述

f.push(["桁埋め=(無し)",{cmd:function(){
  supply="";
  }}]);

f.push(["桁埋め= ",{cmd:function(){
  supply=" ";
  }}]);

f.push(["桁埋め=0",{cmd:function(){
  supply="0";
  }}]);

f.push("----");

f.push(["(n~nn)",{cmd:function(){
  supply="";
  prefix="(";
  suffix=")";
  }}]);

f.push([" n~nn. ",{cmd:function(){
  supply=" ";
  prefix="";
  suffix=". ";
  }}]);

f.push(["第0n~nn章",{cmd:function(){
  supply="0";
  prefix="第";
  suffix="章";
  }}]);

f.push(["第0n~nn位",{cmd:function(){
  supply="0";
  prefix="第";
  suffix="位";
  }}]);

f.push(["n~nn/終値",{cmd:function(){
  supply="";
  prefix="";
  suffix="/"+ last;
  }}]);

// ----------------- ↑ここより上にプリセットを記述

//■実行コード
(function(){
  var sel = document.Selection;
  var cmd = [], cid = 101;	//コマンド格納用,ID
  
  //選択範囲orカーソル位置の調整
  var meP = mePosLogical;
  var ty = sel.GetTopPointY(meP);	//範囲開始行
  var by = sel.GetBottomPointY(meP);	//範囲終了行
  if (sel.Text) {
    //◆範囲選択している場合:選択範囲を行頭行末まで拡張
    if (ty!=by && sel.GetBottomPointX(meP)==1) by--;	//行選択時、次の行を含めない
    sel.SetActivePoint(meP, 1, by);
    sel.EndOfLine(false, meP);
    sel.SetAnchorPoint(meP, 1, ty);
    lines = 1 + by - ty;		//行数を自動設定
  } else {
    //◆範囲選択していない場合:カーソルを行頭に移動
    sel.SetActivePoint(meP, 1, ty);
  }
  //プリセット一覧からメニュー生成
  var preset = CreatePopupMenu();
  ListToMenu(f, preset);
  //ポップアップメニュー
  var tr = 10;
  while (tr>1) {	//実行(1)orキャンセル(0)するまで繰り返す
    last = start+(lines-1)*incre;	//終値を再計算
    //メニューを生成
    var popup = CreatePopupMenu();
    popup.Add("連番を挿入", 1);
    popup.Add(Naming(prefix+Padding(start)+suffix)+"~", 0, meMenuGrayed);
    popup.Add(Naming(prefix+Padding(last)+suffix), 0, meMenuGrayed);
    popup.Add("----", 0, meMenuSeparator);
    popup.AddPopup("プリセット", preset);
    popup.Add("----", 0, meMenuSeparator);
    popup.Add("始値: "+ start, 2);
    popup.Add("行数: "+ lines, 3, ((sel.Text)? meMenuGrayed:0));
    popup.Add("増分: "+ incre, 4);
    popup.Add("桁数: "+ digit +"桁以上", 5, (supply? 0:meMenuGrayed));
    popup.Add("桁埋め: "+ Naming(supply), 6);
    popup.Add("接頭辞: "+ Naming(prefix), 7);
    popup.Add("接尾辞: "+ Naming(suffix), 9);
    //メニューを表示して処理
    tr = popup.Track(0);
    if (tr>100) {
      cmd[tr]["cmd"]();				//プリセットの実行
      if (sel.Text) lines = 1 + by - ty;	//範囲選択時、行数は固定させる
    }
    switch (tr) {
    case 1: sel.Text = Numbering(); Quit();
    case 2: start = PromptEx("始値: ※半角数字/0 以上の整数",start,0); break;
    case 3: lines = PromptEx("行数: ※半角数字/1 以上の整数",lines,1); break;
    case 4: incre = PromptEx("増分: ※半角数字/0 以上の整数",incre,0); break;
    case 5: digit = PromptEx("桁数: ※半角数字/1 以上の整数",digit,1); break;
    case 6: supply = Prompt("桁埋め: ※半角1文字を推奨",supply); break;
    case 7: prefix = Prompt("接頭辞:",prefix); break;
    case 9: suffix = Prompt("接尾辞:",suffix); break;
    }
  }
  
  //▼桁埋め関数:現在値との桁数差を求め、桁埋めする
  function Padding(num) {
    var sup = "";
    var diff = (digit > String(last).length)? digit: String(last).length;
    diff = diff - String(num).length;
    for (var i=0; i<diff; i++) sup += supply;
    return sup + num;
  };
  //▼連番を挿入する関数
  function Numbering() {
    var num = start;
    var output = [];
    if (sel.Text) {	
      //◆範囲選択している場合
      var input = sel.Text.split("\n");
      for (var i=0; i<input.length; i++) {
        var text = prefix + Padding(num) + suffix + input[i];
        output.push(text);
        num += incre;
      }
      return output.join("\n");
    } else {
      //◆範囲選択していない場合
      for (var i=0; i<lines; i++) {
        var text = prefix + Padding(num) + suffix + "\n";
        output.push(text);
        num += incre;
      }
      return output.join("");
    }
  };
  
  //▼プロンプト拡張:入力文字を簡易判定
  function PromptEx(text,input,mode) {
    var p = Prompt(text,input);
    switch (mode) {
    case 0:	//0以上の整数
    case 1:	//1以上の整数
      return (parseInt(p) >= mode)? parseInt(p): input;
    }
    return p;
  };
  //▼メニュー表示補助関数
  function Naming(str) {
    if (!str) return "(無し)";		//空欄の場合 (無し) と表示
    str = str.replace(/ /g,"\u2423");		//半角空白をU+2423に
    str = str.replace(/\t/g," \u203A ");	//水平タブを U+203A に
    return str;
  };
  //▼メニュー生成用関数
  function ListToMenu(List, M) {
    for (var i=0; i<List.length; i++) {
      var L = List[i];
      //セパレータ
      if (typeof L == "string" && /^-+$/.test(L)) {
        M.Add(L, 0, meMenuSeparator);
      //サブメニュー
      } else if (typeof L[1] == "function") {
        var sub_popup = CreatePopupMenu();
        M.AddPopup(L[0], sub_popup);
        var sub_f = [];
        L[1](sub_f);
        ListToMenu(sub_f, sub_popup);	//再帰処理:サブメニュー作成
      //コマンド
      } else if (typeof L[1] == "object") {
        cmd[cid] = L[1];
        M.Add(Naming(L[0]), cid++);
      }
    }
  };
})();

開発者メモ

半角数字以外の連番 ⇒未定
「プリセット一覧」のような「連番タイプ一覧」を作る案がありましたが、繰上がり処理・桁埋め処理・メニュー処理が複雑になり、仕様がまとまらなくて頓挫しました。
個人的に、アルファベットやひらがなの連番は使用頻度が低く、開発意欲が湧きません。
文字入力時キャンセルすると (無し) になる仕様
現状、「仕様です」と言う他ありません。
キャンセルすると入力前の状態に戻る事を期待するのが自然だろうと思うのですが、空欄で OK した時とキャンセルした時の返り値が同じらしく、対処しようがありません。
解決法があれば、ご教授ください。
スポンサーリンク