« ブログにコードを貼り付ける方法.js alpha0.1 |Main| 日記 »

« ブログにコードを貼り付ける方法.js alpha0.1 | JavaScript | PythonとJavaScriptの微妙な違い »

ブログにコードを貼り付ける方法.js alpha0.2(Firefox only)

ブログにコードを貼り付ける方法.js alpha0.1の続編。コード中の<, >, &をエスケープしてPREタグで囲い、後ろにimgタグを貼り、onLoadからJavaScriptで書かれた関数を呼び出すことで、画面には適切な長さで折り返して見やすく表示しつつ、JavaScriptで生成されたcopyボタンを押すとソースコードがクリップボードにコピーされます。この時はもちろん、&lt;が<に戻された状態でコピーされます。

クリップボードにコピーするコードは最速インターフェース研究会 :: Firefoxでテキストをクリップボードにコピーする方法から、ソースコードを新しいウィンドウで開くコードはKazuho@Cybozu Labs: Ajax な HTML ページのソースコードを表示するから流用しました。

サンプル。

print "very loooooooooooooooooooooooooooooooooooooooooooong striiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiing & <html> tag"
コードは下記。

追記:"aaa".replace("a", "b")では最初のaしか置換されないんですねぇ。 "aaa".replace(/a/ig, "A")に変更しました。

<script>
function findTarget(tag, tagName){
  do{
    tag = tag.previousSibling;
  }while(tag.tagName != tagName);
  return tag;
}

function wrapCode(start){
  LINE_WIDTH = 60;
  var target = findTarget(start, "PRE");
  var originalData = target.innerHTML;
  
  lines = originalData.split("\n");
  wrappedData = ""
  for(i = 0; i < lines.length; i++){
    line = lines[i];
    while(line.length > LINE_WIDTH){
      wrappedData += line.substring(0, LINE_WIDTH) + "\n";
      line = line.substring(LINE_WIDTH);
    }
    wrappedData += line + "\n";
  }

  var pureData = originalData.replace(/&lt;/ig, "<");
  pureData = pureData.replace(/&gt;/ig, ">")
  pureData = pureData.replace(/&amp;/ig, "&");

  function copy(){
    setClipboard(pureData);
  }
  insertButton(start, "Copy to clipboard", copy);

  function openWindow(){
    w = window.open(
      'about:blank', '',
      'scrollbars=yes,dependent=yes,resizable=yes,menubar=yes,toolbar=yes'
    );
    w.stop();
    w.document.write('<plaintext>' + pureData);
  }
  insertButton(start, "Open window", openWindow);

  target.innerHTML = wrappedData;
}

function insertButton(start, caption, handler){
  var newElem = document.createElement("INPUT");
  newElem.type = "BUTTON";
  newElem.value = caption;
  newElem.onclick = handler;
  start.parentNode.insertBefore(newElem, start);
}
</script>
<pre>
print "very loooooooooooooooooooooooooooooooooooooooooooong striiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiing &amp; &lt;html&gt; tag"
</pre>
<img src="http://www.nishiohirokazu.org/blog/images/codearea.png" onLoad = "wrapCode(this);" border = 1>

トラックバック(Trackback)

Trackback URL: http://www.nishiohirokazu.org/mt/mt-tb.cgi/369

ご意見・ご感想をお送りください(フィードバック)

(フィードバックはメールで送信され、基本的に表示されませんが、内容によっては公開させていただくこともございます。ご了承ください。Your comment doesn't appear the page immediately. If the comment has value to other people, it will be put on the page or subsequent entries. Thank you.)

上の情報は、いずれも未記入でかまいません。 All of above questions are optional.