◀マクロトップへ
  • 341 VSライクなhtml終タグ自動補完
    • 342 texバージョンもあります
  • [341] VSライクなhtml終タグ自動補完 peak 2006年12月23日 09:14

    Wikiへの投稿方法が分からないのでこちらに
    gis_dur 氏のマクロにインスパイアされたものです。
    ////////////////////////////////////////////////////////////////////////////////
    // 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);
    }
    • [342] texバージョンもあります peak 2006年12月23日 09:21

      ////////////////////////////////////////////////////////////////////////////////
      // 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);
      }