素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

li要素の行番号をコピーしないようにするGreasemonkeyスクリプト

シンタックスハイライトなどのスクリプトを導入しているページで、li要素を含むものをコピーすると、行番号が入ってしまってそのまま実行することができない場合がある。
下のスクリプトを使うとそういったことが起こらなくなる。

// ==UserScript==
// @name           listOkCopyHelper
// @namespace      http://d.hatena.ne.jp/javascripter/
// @include        http*
// ==/UserScript==
window.addEventListener('copy',onCopy,false);

function onCopy(){
  var selection = window.getSelection(),
      ranges = [];
  for (var i = 0;i < selection.rangeCount;i++)
    ranges.push(selection.getRangeAt(i));
  selection.removeAllRanges();
  var pre = document.body.appendChild(document.createElement('pre')),
      range = document.createRange();
  ranges.forEach(
      function(selectionRange){
        var tmp = document.createElement('pre');
        tmp.appendChild(selectionRange.cloneContents());
        pre.textContent += tmp.textContent;
      });
  range.selectNodeContents(pre);
  selection.addRange(range);
  setTimeout(function(){
      document.body.removeChild(pre);
      selection.removeRange(range);
      ranges.forEach(function(selectionRange){
        selection.addRange(selectionRange);
        });
      });
}

copyイベント発生直後に選択範囲を変えると、コピーするものを制御することができる。