Macro/投稿/158

http://sakura.qp.land.to/?Macro%2F%C5%EA%B9%C6%2F158


Top > Macro > 投稿 > 158

VSライクなhtml終タグ自動補完 & texの\end補完

  • ページ: Macro/投稿
  • 作者: peak?
  • カテゴリー: js
  • 投稿日: 2006-12-23 (土) 11:40:43

メッセージ

gis_dur 氏のマクロにインスパイアされたものです。

HTML/XML

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
////////////////////////////////////////////////////////////////////////////////
// html, xml 入力支援
// <...>の直後に</...>を自動で補完します。
//
// インストール方法
// キー SHIFT + . にこのマクロを割り当ててください。
 
 
////////////////////////////////////////////////////////////////////////////////
// エントリーポイント
Entry();
 
 
function Entry()
{
    // SHIFT + . で呼び出されるので、とりあえず > を出力する
    Editor.Char(0x3e); // 0x3e = '>'
 
    var strFileName = Editor.GetFileName();
    if(/\.(htm|html|shtml)$/.test(strFileName)){
        ComplementTag(true);
    }
    else if(/\.(xml|xhtml)$/.test(strFileName)){
        ComplementTag(false);
    }
}
 
 
function ComplementTag(isHTML)
{
    var strLine = GetCurLineUntilCursor();
    var astrMatched = strLine.match(/<([^<>"']|"[^"]*?"|'[^']*?')+>$/); //'
    if(astrMatched == null) return false;
    var strTag = astrMatched[0];
 
    // 終タグを必要としないタグなら何もしない
    if(/-->$|\/>$|\?>$/.test(strTag)) return;
    if(strTag.search(/^<\s*(\w+)/) < 0) return;
 
    // タグ名を抽出
    strTag = RegExp.$1;
 
    if(isHTML){
        // HTMLの場合は、タグの種類によっては終タグがいらない
        if("|area|base|basefont|bgsound|br|col|embed|frame|hr|img|input|isindex|keygen|link|meta|nextid|param|spacer|wbr|"
            .indexOf("|" + strTag + "|") >= 0)
        {
            return;
        }
    }
 
    // 終タグを作って挿入
    strTag = "</" + strTag + ">";
 
    Editor.InsText(strTag);
    for(var i = 0; i < strTag.length; ++i){
        Editor.Left();
    }
 
    return true;
}
 
 
function GetCurLineUntilCursor()
{
    // カーソル位置取得
    var xCursor = parseInt(Editor.ExpandParameter('$x'));
    var yCursor = parseInt(Editor.ExpandParameter('$y'));
 
    // カーソル行全体を取得
    var str = Editor.GetLineStr(yCursor);
 
    // xCursor はマルチバイトコードでの値なのでユニコード用に補正
    --xCursor; // 1起算だったものを0起算に直す
    for (var x = 0; x < xCursor; ++x){
        if(IsWide(str.charCodeAt(x))) --xCursor;
    }
 
    return str.substring(0, xCursor);
}
 
 
////////////////////////////////////////////////////////////////////////////////
// 2バイト文字判定
function IsWide(charCode)
{
    return  0x80 <= charCode && (charCode <= 0xff60 || 0xffa0 <= charCode);
}

tex

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
////////////////////////////////////////////////////////////////////////////////
// tex 入力支援
// \begin{...}の直後に\end{...}を自動で補完します。
//
// インストール方法
// キー SHIFT + ] にこのマクロを割り当ててください。
 
 
////////////////////////////////////////////////////////////////////////////////
// エントリーポイント
Entry();
 
 
function Entry()
{
    // SHIFT + ] で呼び出されるので、とりあえず } を出力する
    Editor.Char(0x7d); // 0x7d = '}'
 
    var strFileName = Editor.GetFileName();
    var ixExt = strFileName.lastIndexOf('.');
    if(ixExt >= 0){
        var strExt = strFileName.substr(ixExt).toLowerCase();
        if(strExt == '.tex'){
            ComplementTag();
        }
    }
}
 
 
function ComplementTag()
{
    var strLine = GetCurLineUntilCursor();
    var astrMatched = strLine.match(/\\begin\{[^{}]+?\}$/);
    if(astrMatched == null){
        return false;
    }
    var strEndTag = astrMatched[0].replace(/^\\begin/, "\\end");
 
    Editor.InsText(strEndTag);
    for(var i = 0; i < strEndTag.length; ++i){
        Editor.Left();
    }
 
    return true;
}
 
 
function GetCurLineUntilCursor()
{
    // カーソル位置取得
    var xCursor = parseInt(Editor.ExpandParameter('$x'));
    var yCursor = parseInt(Editor.ExpandParameter('$y'));
 
    // カーソル行全体を取得
    var str = Editor.GetLineStr(yCursor);
 
    // xCursor はマルチバイトコードでの値なのでユニコード用に補正
    --xCursor; // 1起算だったものを0起算に直す
    for (var x = 0; x < xCursor; ++x){
        if(IsWide(str.charCodeAt(x))) --xCursor;
    }
 
    return str.substring(0, xCursor);
}
 
 
////////////////////////////////////////////////////////////////////////////////
// 2バイト文字判定
function IsWide(charCode)
{
    return  0x80 <= charCode && (charCode <= 0xff60 || 0xffa0 <= charCode);
}


URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

リロード   新規 編集 凍結 差分 添付 複製 名前変更   ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: 2006-12-23 (土) 11:40:44 (6324d)