1 件の投稿を表示中 (合計 5 個)
  • 作成者
    投稿
  • #5942
    takuya
    参加者

    試作品です。
    開いているドキュメントの重複行を削除したり
    マッチする行を取り出したり
    マッチする行を削除したりできます。
    重複行の削除
    行の並び替えが出来ます

    マクロ作成のためのマクロです。

    こまめに更新していきます。

    利用方法:
    1:以下のコードをコピーし、Lines.jsという名前で保存する
    2:新規マクロを作成時に#includeでこのファイルを利用する
    3:メソッドを実行するソースを書く。記述例はこのページの下のほうに記載しています。

    //Grep,Sort,Uniqを行う
    //prototype.jsをモデルにEmEditorの各行を処理するマクロ
    //
    //ファイル名:Lines.js
    //このファイルはライブラリなので
    //実際に活用する場合は#includeを利用する
    //grep結果を新規ファイルに書き出す
    //uniq重複を削除する
    //cut 規則に従って行を分割する
    //reject 条件に一致しないものを削除する
    //remove 条件に一致するものを削除する
    //..etc
    //Rubyには破壊的メソッド”!”と言うのがあり、それを意識して
    //uniq/uniq$ の様に現在のファイルを書き換えるメソッドには
    //$をフラグとしてつけている。

    //名前空間
    Utena = {};
    Utena.$stop_iteration = {val:-1,message:”stop”};//例外がthrowされると処理を止める
    Utena.Lines = function(){
    var obj = {
    each:function(iterator_function){
    try{
    this.on_each_start();
    this.do_each(iterator_function);
    this.on_each_end();
    }catch(e){
    if (e != Utena.$stop_iteration) throw e;
    }
    return this;
    },
    do_each:function(iterator_function){
    //ドキュメントを上から順に一列ずつ取り出す
    for( y=0;y );
    }
    this.on_new_file_end();
    return this;
    },
    //内部的に利用している
    //破壊的メソッド
    //@param indexs 削除したい行番号一覧の配列
    removeLines:function( indexs ){//指定行を削除していく
    this.on_each_start();
    indexs = indexs.sort( /*function (a, b) { return(b – a); }*/);
    //何行削除したか覚えておく、削除すると行番号がずれるため
    count = 0;
    for( i in indexs ){
    document.selection.SetActivePoint( eePosLogical, 1,indexs-count++,false );//選択解除し目的行へ
    document.selection.SelectLine();
    document.selection.Delete();
    }
    return this;
    },
    //patternに一致する行を削除する
    //@param pattern 正規表現の条件
    //破壊的メソッド
    remove$:function( pattern ){//パターンに一致する行を削除していく
    var func = function(value, index){
    return index;
    }
    indexs = this.find(pattern,func);
    return this.removeLines( indexs );
    },
    //条件に一致しない行を削除する
    //破壊的メソッド
    reject$ : function( pattern ){
    var pick_up_func = function(value, index) {
    var stringValue = value.toString();
    return (!stringValue.match(pattern));
    };
    var indexs = this.pick_up( pick_up_func, iterator );
    return this.removeLines( indexs );
    },
    cut:function( delim, col_ids,iterator ){
    this.on_new_file_start();
    _this = this;//thisの参照を固定する
    var cut_func = function( value, index ){
    cols = value.split(delim);
    if(cols.length>1){
    temp = [];
    for( idx in col_ids ){
    temp[temp.length++] = cols[col_ids[idx]];
    }
    value = temp.join(delim);
    }
    _this.new_doc.Activate();
    _this.new_doc.writeln( (iterator || ( new Function(“x”,”y”,”return x;”) ))(value, index) );
    _this.current_doc.Activate();
    }
    this.each( cut_func );
    this.on_new_file_end();
    return this;
    },
    cut$:function( delim, col_ids,iterator ){
    this.on_new_file_start();
    results = [];
    var cut_func = function( value, index ){
    cols = value.split(delim);
    if(cols.length>1){
    temp = [];
    for( idx in col_ids ){
    temp[temp.length++] = cols[col_ids[idx]];
    }
    value = temp.join(delim);
    }
    results[results.length++] = (iterator || ( new Function(“x”,”y”,”return x;”) ))(value, index);
    }
    this.each( cut_func );
    this.rewrite( results.join(“n”) );
    return this;
    },
    //おまけ
    tail : function( num ){
    var ret = [];
    for( var idx=document.GetLines();idx>=document.GetLines()-num;idx– ){
    ret[ret.length++] = document.GetLine(idx);
    }
    this.on_new_file_start();
    this.new_doc.Activate();
    ret = ret.reverse();
    for( i in ret ){
    this.new_doc.writeln( ret
    );
    }
    this.on_new_file_end();
    return this;
    },
    //おまけ
    //先頭からN行取り出す。
    //非破壊的メソッド
    head : function( num ){
    var ret = [];
    var end = (num>document.GetLines()) ? document.GetLines(): num;
    for( var idx=1;idx<=end;idx++ ){ ret[ret.length++] = document.GetLine(idx); } this.on_new_file_start(); this.new_doc.Activate(); for( i in ret ){ this.new_doc.writeln( ret
    );
    }
    this.on_new_file_end();
    return this;
    },
    //非破壊メソッド
    uniq : function(){
    this.on_new_file_start();
    var obj = {}
    var func = function( value, index ){
    if(!obj[value] && value ){
    obj[value] = true;
    }
    }
    this.each( func );
    this.new_doc.Activate();
    Window.Redraw=false;
    for( i in obj ){
    this.new_doc.writeln( i );
    }
    this.on_new_file_end();
    Window.Redraw=true;
    return this;
    },
    //破壊的メソッド
    uniq$ : function(){
    var obj = {}
    var func = function( value, index ){
    if(!obj[value] && value ){
    obj[value] = true;
    }
    }
    this.each( func );
    this.rewrite(“”);
    for( i in obj ){
    Window.Redraw=false;
    document.writeln( i );
    }
    return this;
    },
    //
    //条件にマッチするものがそれぞれ何件あるか
    //結果は新規Windowsに書き出す
    count:function( array_of_pattern ){
    patterns = {};
    for( i in array_of_pattern ){
    patterns[array_of_pattern
    ] = 0;
    }
    for( i in patterns ){
    patterns
    = this.find( i ).length;
    }
    this.on_new_file_start();
    this.new_doc.Activate();
    Window.Redraw=false;
    for( i in patterns ){
    this.new_doc.writeln( i +”ttはtt”+ patterns
    +”件ありました”);
    }
    this.on_new_file_end();
    Window.Redraw=true;
    return this;
    },
    //現在ファイルの重複を数える
    //結果は新規ファイルに書き出す
    count_uniq:function(display_func){
    this.on_new_file_start();
    var obj = {}
    var func = function( value, index ){
    if(!obj[value] && value!=null ){
    obj[value]=1;
    }else{
    obj[value]++;
    }
    }
    this.each( func );
    this.new_doc.Activate();
    Window.Redraw=false;
    for( i in obj ){
    this.new_doc.writeln( (display_func ||
    (new Function(
    “i”, “obj”, ‘return i +”ttはtt”+ obj
    +”件ありました”;’
    )
    )
    )(i, obj) );
    }
    this.on_new_file_end();
    Window.Redraw=true;
    return this;
    },
    //現在ファイルの中身をソートする
    //非破壊メソッド
    //結果は新規ファイルに書き出す
    sort : function(order_func){
    document.selection.selectAll();
    lines = document.selection.Text.split(“n”);
    lines.sort(order_func|| null );
    this.on_new_file_start();
    this.new_doc.Activate();
    Window.Redraw=false;
    this.new_doc.write( lines.join(“n”) );
    return this;
    },
    //現在ファイルの中身をソートする
    //破壊的メソッド
    //現在のファイルを書き換える
    sort$ : function(order_func){
    document.selection.selectAll();
    lines = document.selection.Text.split(“n”);
    lines.sort(order_func|| null );
    this.rewrite( lines.join(“n”) );
    return this;
    }
    }
    return obj;
    }();

    #5944
    takuya
    参加者

    マクロの使用例を書いていきます。

    includeは適宜変更してください。

    先のマクロを利用してGREPを行うマクロ
    利用サンプル1

    #include “Lines.js”
    //GREPを実行するマクロ
    //Lines.grep.js
    //Grep結果は新規タブに開きます。
    var str =prompt(“Grep実行:  検索文字列を入力してください 例: ‘123456|abcd|test’; ‘^aaa’など”,””);
    if(str){
    Utena.Lines.grep(str);
    }

    利用サンプル2

    #include “Lines.js”
    //該当が何件あるか検索する
    //Lines.count.js
    //正規表現を使い検索する
    //結果は新規タブに開きます。
    var str =prompt(“何件あるか数えます。: 検索文字列を入力してください。”,””);

    if(str){
    Utena.Lines.count([str]);
    }

    利用サンプル3

    #include “Lines.js”
    //Lines.jsを利用してuniqを実現する。
    //文書の中からの各行から重複なく取り出します。
    //結果は新規タブに開きます。
    //
    Utena.Lines.uniq();

    利用サンプル4

    #include “Lines.js”
    //Lines.jsを利用してuniqを実現する。
    //Uniqを実行する
    //Lines.XXX$と末尾に$をつけているメソッドは
    //現在ファイルを書き換えます。
    Utena.Lines.uniq$();

    利用サンプル5

    #include “Lines.js”
    //現在のファイルの中身から重複を取り除き
    //取り除いた結果をソートするマクロ
    //メソッドチェインが特徴
    Utena.Lines.uniq$().sort$();

    利用サンプル6

    //1313で始まる行を取り出し
    //行頭にファイル名をつける
    Utena.Lines.grep$(“^1313.+”, function (x,y) { return document.Name +”t”+ x } );

    #5947
    takuya
    参加者

    ソースコードを更新しました。スレッドのルートにソースコードがあります。

    #20080313  変更点
    メソッド名をルールに従って書き換えた

    $がついているメソッドは現在ファイルを書き換える
    ついていないメソッドは結果を新規ファイルに書き出す

    #5984
    takuya
    参加者

    ソースコードを更新しました。スレッドのルートにソースコードがあります。

    #20080321  変更点
    GREP結果が一件もないときにメッセージを表示するように変更

    #6016
    takuya
    参加者

    id:takuyaです。

    grep/uniq/count/cutを行うマクロの修正です。
    ソースコードはこのトピックの最初に投稿しています。

    #0803028
    cutに関してバグを修正しました。
    Cut/Cut$のペアに修正しました。
    Cutの使い方は例の通りです。

    /***
    * @param delim 区切り文字、各行を配列に区切る文字
    * @param col_ids 各行の配列から取り出す要素番号(ゼロ始まり)
    * @iterator 各行を区切る処理を自前で作成する場合。
    **/
    cut:function( delim, col_ids,iterator ){
    ///略

    そろそろ、まともに動くようになってきたので、マクロライブラリに取り込めるよう江村さんにお願いしようかと思います。

1 件の投稿を表示中 (合計 5 個)
  • このトピックに返信するにはログインしてください。