◀マクロトップへ
  • 63 (WSH 5.6)直前の閉じていないHTMLタグを閉じる
    • 64 (WSH 5.6)カーソル直前のマクロファイルを実行
      • 153 おおっ!キーマクロの読み込み・実行ってキー以外のマクロもあり
        • 189 Re:おおっ!キーマクロの読み込み・実行ってキー以外のマクロもあり
        • 190 Re:おおっ!キーマクロの読み込み・実行ってキー以外のマクロもあり
          • 191 マクロ実行マクロの新バージョン
    • 65 コメント文込みの js ファイル
    • 150 【更新】直前の閉じていない HTML/XML タグを閉じる(1)
      • 315 削除
    • 151 【更新】直前の閉じていない HTML/XML タグを閉じる(2)
    • 152 【更新】直前の閉じていない HTML/XML タグを閉じる(3)
      • 154 大作ですね。ぜひ sakura-editor ブリーフケースのマクロ置き場に
        • 188 Re:大作ですね。ぜひ sakura-editor ブリーフケースのマクロ置き場に
          • 192 興味ある分野です
  • [63] (WSH 5.6)直前の閉じていないHTMLタグを閉じる gis_dur 2004年02月26日 20:54

    閉じていないタグ又はコメントを閉じます
    コメントタグ内は無視します
    古い WSH エンジンでの動作は試していません。
    投稿許可サイズオーバーにつきコメント文大幅カット

    【closeLastTag.js】
    var QUIET_MODE = false;
    var REGX_ALL = "</?[\\w\\d]+\\b(.*/>)?|<!--|-->";
    var NO_CLOSETAG = "|area|base|basefont|bgsound|br|col|embed|frame" +
    "|hr|img|input|isindex|keygen|link|meta|nextid" +
    "|param|spacer|wbr|!doctype|";
    var stack_tags = new Array();
    var sel_text = "";
    var ins_text = "";
    var tmp_str = "";
    var b_comment = false;

    Editor.CancelMode(0);
    Editor.InsText("_");
    while ( true ) {
    Editor.SearchPrev(REGX_ALL, 22);
    sel_text = Editor.GetSelectedString(0).toLowerCase();
    if ( sel_text=="" ) {
    if ( b_comment )
    popup_error("コメントの開閉関係が不正です");
    if ( stack_tags.length )
    popup_error("開始タグの無い終了タグが見つかりました")
    break;
    }
    if ( b_comment ) {
    if ( sel_text=="<!--" ) {
    b_comment = false;
    }
    } else {
    // -->
    if ( sel_text=="-->" ) {
    b_comment = true;
    // <!--
    } else if ( sel_text=="<!--" ) {
    ins_text = "-->";
    break;
    // <.../>
    } else if ( sel_text.indexOf("/>")!=-1 ) {
    // </...>
    } else if ( sel_text.indexOf("</")==0 ) {
    sel_text = sel_text.substring(2);
    stack_tags.push(sel_text);
    // <...>
    } else {
    sel_text = sel_text.substring(1);
    if (NO_CLOSETAG.indexOf("|"+sel_text+"|")!=-1)
    continue;
    if ( stack_tags.length==0 ) {
    ins_text = "</"+ sel_text +">";
    break;
    } else {
    tmp_str = stack_tags.pop();
    if ( sel_text!=tmp_str ) {
    tmp_str = "タグの包含関係が不正です\n" +
    "<" + sel_text + "> ... ... " +
    "</" + tmp_str + ">";
    popup_error( tmp_str );
    break;
    }
    }
    }
    }
    }
    Editor.CancelMode(0);
    Editor.Undo(0);
    Editor.SearchClearMark(0);
    Editor.InsText(ins_text);

    function popup_error(err_string) {
    if (!QUIET_MODE) {
    Editor.SearchClearMark(0);
    var shell = new ActiveXObject("WScript.Shell");
    shell.Popup(err_string, 0, "HTML 文法エラー", 0);
    }
    }
    • [64] (WSH 5.6)カーソル直前のマクロファイルを実行 gis_dur 2004年02月26日 21:34

      カーソル直前の語をファイル名とするマクロを実行
      folder内 incremental search により部分入力可
      # やはりコメント大幅カット (T-T
      # 無理のある実装。ご自身の責任でどうぞ。

      【0executeMacro.js】
      // 必ず正しく指定
      // ## 設定 ##
      // スクリプト自身のファイル名
      var SCRIPT_NAME = "0executeMacro.js";
      // マクロ群のあるフォルダのフルパス
      var MACRO_FOLDER = "C:\\...\\sakura\\macro";
      // マクロファイルの拡張子(小文字,正規表現不可)
      var MACRO_EXT = ".mac|.ppa|.js|.vbs";
      // Sendkeys用文字列
      // shortcutキーも可
      // %:alt ^:ctrl +:shift
      var KEYS_OPENMACRO = "%ta";//マクロ開く
      var KEYS_EXECMACRO = "%td";//マクロ実行
      // ## 設定終了 ##

      var DIALOG_TYPE=1;
      var DLGRET_AUTO=-1;
      var DLGRET_OK=1;
      var DLGRET_CANCEL=2;
      var RECKEY_NAME="RecKey.mac";
      MACRO_EXT="|"+MACRO_EXT+"|";

      var shell=new ActiveXObject("WScript.Shell");
      var sel_text=get_left();
      var astr_fileNames=get_macros(sel_text);
      var dlg_return=pop_dialog(astr_fileNames);

      if (dlg_return!=DLGRET_CANCEL) {
      del_left();
      var path=MACRO_FOLDER+"\\"+astr_fileNames[0];
      shell.Sendkeys(KEYS_OPENMACRO);
      shell.Sendkeys(path);
      shell.Sendkeys("{ENTER}");
      shell.Sendkeys(KEYS_EXECMACRO);
      }

      function get_left() {
      var str="";
      Editor.CancelMode(0);
      Editor.WordLeft_Sel(0);
      str=Editor.GetSelectedString(0);
      if (str.match(/\x0D\x0A|\x0D|\x0A/)) {
      str="";
      }
      Editor.Right(0);
      return str;
      }
      function del_left() {
      Editor.CancelMode(0);
      Editor.WordLeft_Sel(0);
      Editor.Delete(0);
      }
      function get_macros(in_sel_text) {
      var fsys=new ActiveXObject("Scripting.FileSystemObject");
      var fld=fsys.GetFolder(MACRO_FOLDER);
      var fset=new Enumerator(fld.Files);
      var NOEXT=-1;
      var str="";
      var ext="";
      var arr=new Array();
      if (in_sel_text=="") return arr;
      for (;!fset.atEnd();fset.moveNext()) {
      str=fset.item().Name.toLowerCase();
      i=str.lastIndexOf(".");
      if (i==NOEXT) continue;
      ext="|"+str.substring(i)+"|";
      if (MACRO_EXT.indexOf(ext)==NOEXT) continue;
      if (str==SCRIPT_NAME.toLowerCase()) continue;
      if (str==RECKEY_NAME) continue;
      if (str.indexOf(in_sel_text)==0) arr.push(str);
      }
      return arr;
      }
      function pop_dialog(in_arr) {
      if (in_arr.length!=1) return DLGRET_CANCEL;
      var message="";
      message+="マクロ「"+in_arr[0]+"」を実行します\n";
      return shell.Popup(message,0,"マクロ実行の確認",DIALOG_TYPE);
      }
      • [153] おおっ!キーマクロの読み込み・実行ってキー以外のマクロもあり りーや 2005年06月20日 12:19

        ▼ gis_durさん
        > カーソル直前の語をファイル名とするマクロを実行
        > var KEYS_OPENMACRO = "%ta";//マクロ開く
        > var KEYS_EXECMACRO = "%td";//マクロ実行

        キーマクロの読み込み(機能番号:31252)とキーマクロの実行(同:31253)って、てっきりキーマクロという言葉の先入観で、WSH系のマクロも動かせるとは思ってませんでした。
        謂われてみれば、外部マクロの登録も混在なので不思議ではないのですが、頭が固くなってたみたいです。

        登録せずに試せて、とても良いですね。PerlScriptもOKでした。

        ところでご存知でしょうか? お礼の意味で老婆心ながら・・・
        JScriptとPerlScriptでは、eval でマクロの中から違うマクロを読んで実行することが出来ます。Editor. のマクロ関数もOKでした。
        例えば
        var fso, f, mac;
        fso = new ActiveXObject("Scripting.FileSystemObject");
        f = fso.OpenTextFile("c:\\Sakura\\Macro\\test.js", 1);
        mac = f.ReadAll();
        eval(mac);
        のようにして、test.js をマクロとして実行できます。KEYSENDより良いかも知れません。
        私は、こちらのアプローチで、マクロ・ランチャーみたいのを作り掛けてます。
        • [189] Re:おおっ!キーマクロの読み込み・実行ってキー以外のマクロもあり gis_dur 2005年07月17日 02:33

          返事が遅れてしまい申し訳ありません。

          ▼ りーやさん
          > ▼ gis_durさん
          > > カーソル直前の語をファイル名とするマクロを実行
          > > var KEYS_OPENMACRO = "%ta";//マクロ開く
          > > var KEYS_EXECMACRO = "%td";//マクロ実行
          (中略)
          > ところでご存知でしょうか? お礼の意味で老婆心ながら・・・
          > JScriptとPerlScriptでは、eval でマクロの中から違うマクロを読んで実行することが出来ます。Editor. のマクロ関数もOKでした。

          なるほど。eval 関数とは思いつきませんでした。

          [メリット]
          ・keysend の sleep 不足による実行失敗がない
          ・ファイル選択ダイアログが表示されない
          ・sakura がマクロ実行中にマクロ読み込みを行った際、
          実行中マクロが上書きされないか、などの挙動の心配を
          せずに済む(!)

          [デメリット]
          ・js または mac ファイルしか実行できない

          検討するまでもなく、新案を採用させて頂きました。
          貴重な情報、まことに有り難うございました。
        • [190] Re:おおっ!キーマクロの読み込み・実行ってキー以外のマクロもあり gis_dur 2005年07月17日 02:51

          ▼ りーやさん
          > 私は、こちらのアプローチで、マクロ・ランチャーみたいのを作り掛けてます。

          こちらもマクロ実行マクロの新バージョンを作成中です。
          以下の機能を追加します。と言いつつ本音は、
          「誰か代わりにやってくれないかなーー」だったりします。

          (1)現在開いているファイルの拡張子に応じて、
          マクロ格納フォルダを切り替える。
          [例]
          init マクロの実行を指示
          → html ファイルならば <MacroDir>/html/init.js を実行
          → java ファイルならば <MacroDir>/java/init.js を実行
          → 以下同様
          ただし、ファイル検索結果が「該当なし」の場合は
          さらに <MacroDir>(マクロフォルダ)内を検索する。

          (2)自分自身を実行できない、デフォルトキーマクロを
          実行できない、などの制限を外し、その代わり常に
          実行確認ダイアログを表示する。
          [理由]
          自分自身を実行せずとも、A が B を呼び B が A を呼ぶ
          ことで簡単に無限ループに陥る可能性を考慮し、このよう
          に仕様を変更することにしました。

          別のスレッドで上がっていますが、セキュリティソフトに
          よって色々とブロックされるようですね。上記の無限ルー
          プは、場合によっては sakura を終了できなくなるという
          悪質な事態を招きますので、警告を出すのは「あるべき姿」
          なのかもしれません。

          最後に、アイディアの元となった各エディタ

          TTTEditor: 閉じタグ挿入
          K2Editor: カーソル直前の単語のファイル名マクロ実行

          の作者の方々に感謝致します。
          • [191] マクロ実行マクロの新バージョン りーや 2005年07月19日 00:17


            >こちらもマクロ実行マクロの新バージョンを作成中です。
            >以下の機能を追加します。と言いつつ本音は、
            >「誰か代わりにやってくれないかなーー」だったりします。

            :-) あは、お気持ちすっごく同意です。

            カーソル位置の前をマクロ名とするのも、コスト軽くていかにもエディタのマクロらしいアプローチだと思います。

            私の方は、選択範囲やカーソル位置の単語を処理対象とするマクロのランチャーにしたいので、苦し紛れに入力補完を使おうとしたりですが、本来の使い方を逸脱しすぎたみたいです。

            自分の環境では、PerlからWin32::GUIで自前のリストボックスで選択してマクロ起動が動いてはいるのですが、GUIのイベントドリブンの処理が大部分になってマクロを逸脱しちゃった感じです。しかもとっても重いし、何度も動しているとsakura.exeのタスクごと落ちたりして危ないモノになっちゃいました。

            しかも、Perl以外のマクロをgis_durさん方式で起動しようとすると、どうも SendKeys 関係をマクロ内から行うとマクロの最後でフラッシュされて一機にキー送信されるみたいで、遅延を挟もうとしてもうまくいきません。そこで、外部コマンド実行でマクロの外のスクリプトを起動してサクラエディタのウインドをターゲットにキー送信をさせるとうまく sleepをはさんでタイミングをとりながら動かせるのですが、ここまで来るとマクロで実現する意味もなく、外部プログラムをマクロから起動するだけで・・・と本末転倒?気味になりそう

            という訳で、私の場合は他の言語のマクロをPerlScriptに移植してマクロ言語の統一を進めてます。

            > 別のスレッドで上がっていますが、セキュリティソフトによって色々とブロックされるようですね。

            ラブレターウイルスのおかげで、WSHのオブジェクトが悪者扱いですね。同じことをさせるのでも Perl の機能を使ったり、別な COM オブジェクトを拾って来て行わせる分にはお咎めなしです。汎用化やノウハウの共有を考えると興ざめなんですが、私自身は言語機能や AutoItXなどに逃げる傾向です。
    • [65] コメント文込みの js ファイル gis_dur 2004年02月26日 21:56

      親記事2つのソースについて
      いじってみようという物好きな方へ(居るのか?)

      以下のURLにコメント削除前のファイルを上げておきました。
      そちらを利用すると若干わかりやすくなると思います。
      http://gis-dur.hp.infoseek.co.jp/pages/temp/gis_macros.lzh

      # 最初からこうすれば良かったのか!
    • [150] 【更新】直前の閉じていない HTML/XML タグを閉じる(1) gis_dur 2005年06月19日 17:11

      1. XML に対応
      2. 大幅に高速化
      3. スクロール位置が変わってしまう不具合を解消
      /************************************************
      ** Close Last Tag 2.1 **
      *************************************************
      ** A "Sakura-Editor Macro" using WSH 5.6 **
      ** For sakura.exe ver.1.4.7.0 and over **
      ** Copyright (C) 2004-2005 gis_dur **
      *************************************************
      **【動作】 **
      ** カーソル位置より前にある HTML/XML タグを **
      ** ファイル先頭に向かって検索し、 **
      ** 1. 閉じていないコメント **
      ** 2. 終了タグのない開始タグ **
      ** がある場合、対応する終了タグを挿入します。 **
      ** コメントタグ内は無視します。 **
      ************************************************/

      // ======== 設定開始 ========

      // true : 構文エラーメッセージ非表示
      // false : 構文エラーメッセージ表示
      var QUIET_MODE = false;
      // 文字列 NO_CLOSE_TAG で指定された終了タグについて、
      // true : タグの省略を許さない (XML モード)
      // false : 常に省略する (HTML モード)
      var XML_MODE = false;
      // 省略可能な終了タグ
      var NO_CLOSETAG = "|area|base|basefont|bgsound|br|col|embed|frame" +
      "|hr|img|input|isindex|keygen|link|meta|nextid" +
      "|param|spacer|wbr|!doctype|"; // 小文字で記述
      // 省略可能な終了タグを増やすには、以下のように追加します
      // var NO_CLOSETAG += "|colgroup|dd|dt|li|option|p|rp|rt|";

      // ======== 設定終了 ========

      /***********************************************************
      ** 変数定義 **
      ***********************************************************/
      // 正規表現オブジェクト
      var regExpObj_tags =
      new RegExp("<[/!]?[A-Za-z][\\w\\-:]*([^>]*/>)?|<!--|-->", "g");
      var regExpObj_newLines =
      new RegExp("\x0d\x0a|\x0d|\x0a", "g");
      // 終了タグスタック
      var stack_tags = new Array();
      // 全タグ
      var TagsArray = new Array();
      // タグ総数
      var ntags = 0;
      // 全行
      var LinesArray = new Array();
      // 行総数
      var nlines = 0;
      // カーソル位置
      var cursorX, cursorY;
      // カーソル位置より前にある全テキスト
      var all_text = "";
      // 現在判定中のテキスト
      var now_text = "";
      // カーソル位置に挿入するテキスト
      var ins_text = "";
      // テンポラリ文字列
      var tmp_str = "";

      // コメントブロック処理中であれば true
      var b_comment = false;

      // (続く...)
      • [315] 削除 Luke 2006年11月17日 22:55

        -
    • [151] 【更新】直前の閉じていない HTML/XML タグを閉じる(2) gis_dur 2005年06月19日 17:14

      /***********************************************************
      ** 主処理 **
      ***********************************************************/
      // 選択状態を解除
      Editor.CancelMode(0);
      // カーソル位置取得
      cursorX = Number(Editor.ExpandParameter('$x'))-1;
      cursorY = Number(Editor.ExpandParameter('$y'))-1;
      // 全て選択
      Editor.SelectAll(0);
      // 読み込み
      all_text = Editor.GetSelectedString(0);
      // 選択状態を解除
      Editor.CancelMode(0);

      // 改行コード統一
      all_text = all_text.replace(regExpObj_newLines, "\x0d\x0a");
      // 行に分解
      LinesArray = all_text.split(/\n/);
      nlines = LinesArray.length;
      // カーソル行の文字列を取得
      tmp_str = LinesArray[cursorY];
      // カーソルが最終行にあって、かつ最終行に一文字も無い場合、
      // 現在行は空文字列とする。
      if (tmp_str == null) tmp_str = "";
      // カーソル以前の文字列のみ残す
      if (nlines-(cursorY+1) > 0)
      LinesArray.splice(cursorY+1, nlines-(cursorY+1));
      for (var i=0; i<cursorX; i++)
      if (isKanji(tmp_str.charAt(i)))
      cursorX--;
      LinesArray[cursorY] = tmp_str.substring(0, cursorX);
      // タグのリストを取得
      TagsArray = LinesArray.join("\n").match(regExpObj_tags);
      // タグ総数を取得
      if (TagsArray == null) {
      ntags = 0;
      } else {
      ntags = TagsArray.length;
      }

      // 直前の開始タグを検索する
      for (var i=ntags-1;i>=0;i--) {
      // 注目しているタグまたはコメント
      now_text = TagsArray[i].toLowerCase();
      // コメントブロック内での処理
      if ( b_comment ) {
      // コメント開始タグ
      if ( now_text=="<!--" ) {
      // コメントブロック処理を抜け出す
      b_comment = false;
      }
      // 通常処理
      } else {
      // -->
      if ( now_text=="-->" ) {
      // 検索位置より前はコメントブロック
      b_comment = true;
      // <!--
      } else if ( now_text=="<!--" ) {
      // コメント終了タグを挿入して終了
      ins_text = "-->";
      break;
      // <.../>
      } else if ( now_text.indexOf("/>")!=-1 ) {
      // 終了タグが必要ないので無視
      // </...>
      } else if ( now_text.indexOf("</")==0 ) {
      now_text = now_text.substring(2);
      // 終了タグスタックに追加
      stack_tags.push(now_text);

      // (続く...)
    • [152] 【更新】直前の閉じていない HTML/XML タグを閉じる(3) gis_dur 2005年06月19日 17:15

      // <...>
      } else {
      now_text = now_text.substring(1);
      // 終了タグをとらないタグは無視
      if (!XML_MODE && NO_CLOSETAG.indexOf("|"+now_text+"|")!=-1)
      continue;
      // 終了タグスタックの要素が無い場合
      // 対応する終了タグを挿入して終了
      if ( stack_tags.length==0 ) {
      ins_text = "</"+ TagsArray[i].substring(1) +">";
      break;
      // 終了タグスタックの最終要素と比較
      // 一致すれば無視して次のタグを検索
      // 一致しなければタグの包含関係に誤り
      // 例:<a> <b> </a> </b> ... |←検索開始位置
      } else {
      tmp_str = stack_tags.pop();
      if ( now_text!=tmp_str ) {
      tmp_str = "タグの包含関係が不正です\n" +
      "<" + now_text + "> ... ... " +
      "</" + tmp_str + ">";
      popup_error( tmp_str );
      stack_tags=new Array();
      break;
      }
      }
      }
      }
      }

      if (ins_text != "") {
      // 終了タグを挿入
      Editor.InsText(ins_text);
      } else {
      // 不正なコメントブロック
      if ( b_comment )
      popup_error("コメントの開閉関係が不正です");
      // 終了タグスタックに余り要素
      if ( stack_tags.length ) {
      tmp_str = stack_tags.pop();
      tmp_str = "開始タグの無い終了タグが見つかりました\n" +
      "</" + tmp_str + ">";
      popup_error( tmp_str );
      }
      }

      /***********************************************************
      ** 2バイト文字判定 **
      ***********************************************************/
      function isKanji(c) {
      var tmp = escape(c);
      if (tmp.charAt(0) != "%") return false;
      if (tmp.charAt(1) == "u") return true;
      else return false;
      }

      /***********************************************************
      ** エラー出力処理 **
      ***********************************************************/
      function popup_error(err_string) {
      if (!QUIET_MODE) {
      Editor.SearchClearMark(0);
      var shell = new ActiveXObject("WScript.Shell");
      shell.Popup(err_string, 0, "HTML 文法エラー", 0);
      }
      }
      • [154] 大作ですね。ぜひ sakura-editor ブリーフケースのマクロ置き場に りーや 2005年06月20日 12:28

        gis_durさん、素敵なマクロをありがとうございます。

        RSSからみでXMLにも触り始めたし、利用させていただきます。

        gis_durさんの昔のご投稿を今まで見落としていて、ちょっと損してた気分です。
        これから、マクロという方の参考にもなるので、よろしかったらマクロ置き場への掲載を是非。

        念のため、マクロ置き場のURLを付けておきます。
        • [188] Re:大作ですね。ぜひ sakura-editor ブリーフケースのマクロ置き場に gis_dur 2005年07月17日 02:12

          ▼ りーやさん
          > gis_durさんの昔のご投稿を今まで見落としていて、ちょっと損してた気分です。
          > これから、マクロという方の参考にもなるので、よろしかったらマクロ置き場への掲載を是非。

          仕事が忙しく返事が遅れてしまい申し訳ありません。
          件のマクロですが、XML モードでバグがありました。

          [現状の動作]
          入れ子関係を判断する際、<table>……</Table> を1
          セットとして扱っています。

          [期待される動作]
          XML モード時のみ、<table><TABLE> などを別のものと
          して区別します。

          [対処]
          判断部分(長い for 文)にて以下の修正をする。
          //---- 修正前
          // 注目しているタグまたはコメント
          now_text = TagsArray[i].toLowerCase();
          //---- 修正後
          // 注目しているタグまたはコメント
          if (!XML_MODE) {
          now_text = TagsArray[i].toLowerCase();
          } else {
          now_text = TagsArray[i];
          }
          //---- ここまで

          他にもバグがありそうです。
          マクロ置き場についてはもうしばらく見合わせ、修正が
          落ち着いた頃に掲載を考えます。

          ともあれ、使って頂いてありがとうございます。
          • [192] 興味ある分野です りーや 2005年07月19日 00:17


            ▼ gis_durさん
            >ともあれ、使って頂いてありがとうございます。

            これも Perl に移植させてもらいながら勉強したいなぁと・・・
            なかなか、そこまで手が回らないのですが、なんとかと思って・・・