Tracで改行をShift+Enterで簡単に入力

TracのWiki記法では、改行はそのままでは反映されません。[[br]]と入力する必要があります。このままでは面倒だということで、Shift+Enterで[[br]]タグが入力されるようなJavaScriptを書きました。

既に OZACC.blog: tracで改行[[br]]を簡単に入力 にてFirefoxで動作するものが公開されていますが、今回はこれを参考にInternet Explorerでも動くようにしました。

設定方法は、htdocs/js/trac.js に以下のコードを追加してください。

function getKeyCode(e){
  return e.keyCode != 0 ? e.keyCode : e.charCode;
}
document.onkeypress = function(e) {
  var flag = false;
  if (navigator.userAgent.indexOf("Firefox") != -1) {
    obj = e.target.tagName.toUpperCase();
    if (obj == 'TEXTAREA' && e.shiftKey && getKeyCode(e) == 13) {
      flag = true;
      elem = document.getElementById(e.target.id);
    }
  } else {
    obj = event.srcElement.tagName.toUpperCase();
    if (obj == 'TEXTAREA' && event.shiftKey && getKeyCode(event) == 13) {
      flag = true;
      elem = document.getElementById(event.srcElement.id);
    }
  }
  if (flag) {
    var insertTag = '[[br]]';
    insertAtCaret(elem, insertTag);
  }
}
function insertAtCaret(obj, text) {
  if(document.selection) {
    obj.focus();
    var orig = obj.value.replace(/\r\n/g, "\n");
    var range = document.selection.createRange();

    if(range.parentElement() != obj) {
      return false;
    }

    range.text = text;

    var actual = tmp = obj.value.replace(/\r\n/g, "\n");

    for(var diff = 0; diff < orig.length; diff++) {
      if(orig.charAt(diff) != actual.charAt(diff)) break;
    }

    for(var index = 0, start = 0;
        tmp.match(text)
          && (tmp = tmp.replace(text, ""))
          && index <= diff;
        index = start + text.length
    ) {
      start = actual.indexOf(text, index);
    }
  } else if(obj.selectionStart) {
    var start = obj.selectionStart;
    var end   = obj.selectionEnd;

    obj.value = obj.value.substr(0, start)
      + text
      + obj.value.substr(end, obj.value.length);
  }

  if(start != null) {
    setCaretTo(obj, start + text.length);
  } else {
    obj.value += text;
  }
}

function setCaretTo(obj, pos) {
  if(obj.createTextRange) {
    var range = obj.createTextRange();
    range.move('character', pos);
    range.select();
  } else if(obj.selectionStart) {
    obj.focus();
    obj.setSelectionRange(pos, pos);
  }
}

もともと社内で利用するために書いたのですが、お蔵入りになりそうで勿体ないので公開します。どうぞご自由に使ってください。



Leave a comment


:

:

:

:

このエントリーのはてなブックマーク (-)