Global
会社概要
歴史
ブログ
ウェブ
iPhone
フリーソフト

SeaHorse スクリプト配布

トップ -> Developer フォーラム (SLDEV)

トピックに返信
投稿者 メッセージ

やすゆき★
Fenrir & Co.



登録日: 2006.02.14
投稿記事: 147
公開所在地: 梅田

投稿SeaHorse スクリプト配布
日時: 2006/06/28 Wed - 17:56

引用付きで返信

完成したスクリプトはここで配布してください。
直接書き込まれるか、リンクでもかまいません。
将来的には Fenrir Extensions Center からインストールできるようにします。

利用される方はスクリプトを入れる行為が危険であることを認識した上で
自己責任でご利用ください。


スクリプトを <任意のファイル名>.user.js で保存して、
plugins\seahorse\ に入れてください。

※コピー&ペーストでファイルを作る場合、各行末に半角スペースが入ります。
@include行は末尾に余計な文字があると正しくマッチングできませんので
最低その2行は末尾から半角スペースを取り除いてください。


スクリプトの有効・無効や、削除は
Sleipnirオプション>拡張機能>SeaHorse から行えます。

参考ページ: Sleipnir Script BBS - http://sleepy.dw.land.to/bbs/index.html
_________________
Fenrir & Co.
Chief Executive Officer.
Yasuyuki Kashiwagi.


最終編集者 やすゆき★ [ 2006/07/02 Sun - 16:09 ], 編集回数 5 回

やすゆき★
Fenrir & Co.



登録日: 2006.02.14
投稿記事: 147
公開所在地: 梅田

投稿SleipnirSearch の強調表示
日時: 2006/06/28 Wed - 17:58

引用付きで返信

このスクリプトは検索エンジン変更にともない現在動かなくなっています。

Code:

// ==UserScript==
// @name SleipnirSearch の強調表示
// @description SleipnirSearch の検索結果を強調表示します
// @include http://sleipnir.excite.co.jp/search.gw*target=combined*
// ==/UserScript==

var _document = document;
var _window = window;

if ( _document != null ) {
var input =_document.forms( 0 ).elements( "search" );

var keywords = input.value.split( " " );

var colors = new Array( 5 );
colors[ 0 ] = "#ffff00";
colors[ 1 ] = "#00ffff";
colors[ 2 ] = "#ff00ff";
colors[ 3 ] = "#33ff33";
colors[ 4 ] = "#0099ff";
colors[ 5 ] = "#ffffff";

for ( i in keywords ) {
var s = "b>" + keywords[ i ] + "</b";
var hilight = i;
if ( i >= colors.length ) {
break;
}

_document.body.innerHTML = _document.body.innerHTML.replace( RegExp( s, "ig" ), 'b><span style="background:' + colors[ hilight ] + ';">' + keywords[ i ] + "</span></b" );
}
}

_________________
Fenrir & Co.
Chief Executive Officer.
Yasuyuki Kashiwagi.


最終編集者 やすゆき★ [ 2006/09/05 Tue - 17:03 ], 編集回数 5 回

プヨぷよ
Professional



登録日: 2006.06.21
投稿記事: 252

投稿Google詰め合わせ
日時: 2006/06/30 Fri - 02:12

引用付きで返信

注意
Googleの表示設定の検索結果を新しいウィンドウで開く で、target=nwだったのが
target=_blankへと変更されたため、Google側の設定で新規タブでの表示が可能になっています。
958氏製作のAutoPagerize for SeaHorse に同梱のGoogle HighlighterでGoogle検索結果のハイライトが可能であり、
AutoPagerize for SeaHorse はGoogleを初めとした多数のサイトで動作するため、
Google詰め合わせとGoogleAutopager+の併用よりもAutoPagerize for SeaHorseと
Google Highlighterの組み合わせでの利用を推奨します。
(検索バー、ページ検索バーへの反映は同じく958氏のLinkSearchBarStringで可能です)

修正履歴:
06/07/03
 クライアント | 全般 | スクリプトによるクライアントの操作を許可するにチェックがない場合、
 可能な分の動作を実行するように変更

06/07/15
 "foo bar"のような検索を行った際のハイライト、検索語句に正規表現用の文字が入っていた場合の処理を修正。Google内のリンクはオプションに関わらず同じウィンドウで開くように仕様変更。

06/09/30
 yahooでも一部機能を利用できるように変更
 検索結果の自動ナビゲートロックを行えるように
 スクリプトの実行後にテキストボックスにフォーカスがいくように(検索バーから動作しないから微妙…)

07/04/20
 新しいウィンドウで開かないようにしているときはフォーカスを移さないように

概要:
1.Googleでの検索結果でキーワードをハイライト
2.リンクを新しいウィンドウで開く。
3.サイトで検索した時に検索バー・ページ検索バーにキーワードを反映
4.Alexaのサービスを利用してサイトのプレビューをつける(デフォルトオフ)
5.全角スペースで区切られていた場合半角スペースに置換する
6.検索結果を自動でナビゲートロック(デフォルトオフ)

ハイライト、新しいウィンドウで開く、ナビゲートロック、検索バー、ページ検索バーとの連動はYahoo Japanでも機能します

検索バー、ページ検索バーへのキーワード反映、およびナビゲートロックはオプションの
[クライアント | 全般 | スクリプトによるクライアントの操作を許可する]
にチェックがはいってないと動きません。


※ページ検索バーへの反映は複数キーワードが入力されていた場合、不自然な動作をすると思いますが、
空白を入れなおすなど編集作業を行うとで完全に反映されます。不便だと思う方はオフにして下さい。

Code:
// ==UserScript==
// @name        Google詰め合わせ
// @author      プヨぷよ
// @include     http://www.google.*/*search*
// @include     http://images.google.*/images*
// @include     http://search.blogger.com/blogsearch*
// @include     http://excite.co.jp/search.gw*target=combined*
// @include     http://search.yahoo.co.jp/search*
// @type        SleipnirScript
// @description Googleで検索用小物詰め合わせ
// ==/UserScript==
//
// Lastupdate 07/04/20 21:00

//ここから設定
var doHilight = true;//ハイライトを行う true / false
var doNavigateLock = false;//ナビゲートロックを行う true / false
var openNewWindow = true;//検索結果からのリンクを新しいウィンドウで開く true / false
var connectWithPageSeachBar = true;//ページ検索バーと連動する true / false
var maxPreview = 0;//プレビューを表示する件数 0で機能オフ
var previewByIFrame = false;//プレビューをiframeで開く(重い) true / false
//ここまで設定

if (document != null && !document.body.Assortment) {
   document.body.Assortment = true;
   
   var input = document.forms(0).elements("q");
   if (input == null) {
      input = document.forms(0).elements("search");
   }
   if (input == null) {
      input = document.forms(0).elements("yschsp");
   }
   
   input.value = input.value.replace(/ +/g, " ").replace(/\s+/g, " ");
   
   var keywords = input.value.split(" ");
   
   var colors = new Array(6);
   colors[0] = "#ffff00";
   colors[1] = "#00ffff";
   colors[2] = "#ff88ff";
   colors[3] = "#33ff33";
   colors[4] = "#8888ff";
   colors[5] = "#ff8833";
   
   if (doHilight) {
      var btag = document.all.tags("b");
      
      for (i in keywords) {
         re = RegExp(keywords[i].replace(/\"/g, "").replace(/([+*?.{}|\[\]$^])/g, function(str, p){return "\\" + p}), "i");
         
         for (j in btag) {
            if (btag[j].innerText != null && re.test(btag[j].innerText)) {
               btag[j].style.backgroundColor = colors[i % colors.length];
            }
         }
      }
   }
   
   if (openNewWindow) {
      var tags = document.links;
      input.focus();//テキストボックスへフォーカスを移す
      for (i in tags) {
         if (tags[i].href && !tags[i].href.match(/^http:\/\/.+google\.com\//)) {
            tags[i].target = "_blank";
         }
      }
   }
   
   if (maxPreview > 0) {
      var atag = document.all.tags("a");
      for (i = 0, j = 0; i < atag.length && j < maxPreview; i++) {
         if (atag[i].className == "l" && !atag[i].href.match(/\.pdf/)) {
            if (previewByIFrame) {
               atag[i].insertAdjacentHTML("BeforeBegin","<iframe src='" + atag[i].href + "' style='zoom:0.2;' height=600 width=800></iframe>");
            }
            else {
               atag[i].insertAdjacentHTML("BeforeBegin", "<img src='http://pthumbnails.alexa.com/image_server.cgi?id=yoursite.com&size=large&url=" + atag[i].href + "' width=201 height=147 />");
            }
            j++;
         }
      }
   }
   
   if (API != null) {
      API.SearchBarString = input.value;
      
      if (connectWithPageSeachBar) {
         API.PageSearchBarString = input.value;
      }
      
      if (doNavigateLock) {
         var documentID = API.GetDocumentID(API.ActiveIndex);
         API.SetNavigateLock(documentID, true);
      }
   }
}

_________________
 ∩∩ 欲しいスクリプトを要望してみるスレ - Fenrir User Community
(・×・) 
 (  )。


最終編集者 プヨぷよ [ 2008/01/14 Mon - 23:57 ], 編集回数 9 回

プヨぷよ
Professional



登録日: 2006.06.21
投稿記事: 252

投稿GoogleAutoPager+
日時: 2006/07/01 Sat - 22:18

引用付きで返信

修正履歴:
23:20
 Google詰め合わせと併用すると呼び出しタイミングによってはうまく機能しない問題を修正
06/07/03
 SeaHorseの同じスクリプトが複数回実行されるバグに対処(多分
06/07/15
 検索結果が1ページだった際のエラー、"foo bar"のような検索を行った際のハイライト、検索語句に正規表現用の文字が入っていた場合の処理を修正
 デフォルトでautoStartをオンに、Google内のリンクはオプションに関わらず同じウィンドウで開くように仕様変更
06/09/20
 Googleの検索結果で、次へ、の表示形式が変わったのに対処。
 Google提携の新プニルサーチでも動作するように修正。
06/12/12
 Googleの検索結果のHTML修正に対応。追加分の表示を修正
07/04/20
 追加読込み分のソース分離に失敗した時はソースを全て追加するように変更
 ブログ検索、イメージ検索で動作するように修正

概要:
Google詰め合わせはGoogleAutoPagerで追加で読み込まれた分には反映しませんので
GoogleAutoPagerにハイライト、新しいウィンドウで開く、プレビュ−を追加しました。
ハイライトなどが作用するのはあくまで追加されたものに限りますので
上記のスクリプトと併用されるといいと思います。
ダブルクリックでオン・オフが切り替わります。autoStartをfalseにすると、
読み込みが終わった時点ではオフになった状態になります。

Code:
// ==UserScript==
// @name        GoogleAutoPager+
// @author      ma.la <timpo@ma.la>
// @include     http://www.google.*/*search*
// @include     http://images.google.*/images*
// @include     http://search.blogger.com/blogsearch?*
// @include     http://excite.co.jp/search.gw*target=combined*
// @description GoogleAutoPagerにハイライトとプレビューと新しいウィンドウで開く機能を追加。
// ==/UserScript==

// Released under the GPL license
//  http://www.gnu.org/copyleft/gpl.html
// オリジナル
//  http://la.ma.la/blog/diary_200506231749.htm

// ver 0.1 @ 2005-06-23
//  実験的に公開
//  experimental release
// ver 0.2 @ 2005-06-23
//  ダブルクリックでスタート、にしてみる。
//  double click to start.
// ver 0.3 @ 2006-07-01 - modified by プヨぷよ
//  キーワードのハイライト機能とリンクを新しいウィンドウで開く機能と
//  プレビューと自動スタート機能を追加。
// ver 0.4 @ 2006-07-01
//  Google詰め合わせと競合起こしてる部分を修正
// ver 0.5 @ 2006-07-03
//  SeaHorseの同じスクリプトが複数回実行されるバグに対応できてなかったのを修正
// ver 0.6 @ 2006-07-15
//  検索結果が1ページだった際のエラー等を修正
// ver 0.7 @ 2006-09-20
//  googleの検索結果のソース変更に対応、新プニルサーチで動作するように修正
// ver 0.8 @ 2006-12-12
//  googleの検索結果のソース変更に対応、追加分の表示修正
// ver 0.9 @ 2007-04-20
//  追加読込み分のソース分離に失敗した時はソースを全て追加するように変更
//  ブログ検索、イメージ検索で動作するように修正

//設定ここから
var doHilight = true;//キーワードをハイライト表示するか true / false
var openNewWindow = true;//検索結果からのリンクを新しいウィンドウで開く true / false
var showPreview = false;//プレビューを表示する true / false
var previewByIFrame = false;//プレビューをiframeで開く(重いがマイナーなサイトでもOK) true / false
var autoStart = true;//trueなら読み込み完了時点でスタート true / false
//設定ここまで

var sliceStart = new Array("<div class=g>", '</div></div><div>', "</div></td></tr></tbody></table>");
var sliceEnd = new Array("<div id=navbar class=n>", '<div id="pnirBottom"/>', "<div id=navbar class=n>");
var toNext = new Array("<b>次へ</b>");

var GoogleAutoPager;//SeaHorseのバグ(同じスクリプトが複数回実行される)対策
if (GoogleAutoPager == null) {
   var base;
   var offset;
   var num;
   var query;
   var insertPoint = document.body;
   var Enable = autoStart;
   
   var input = document.forms(0).elements("q");
   if (input == null) {
      input = document.forms(0).elements("search");
   }
   
   var keywords = input.value.replace(/ +/g, " ").replace(/\s+/g, " ").split(" ");
   
   var colors = new Array(6);
   colors[0] = "#ffff00";
   colors[1] = "#00ffff";
   colors[2] = "#ff88ff";
   colors[3] = "#33ff33";
   colors[4] = "#8888ff";
   colors[5] = "#ff8833";
   
   var watch_scroll = function() {
      try {
         var sc = document.body.scrollTop;
         var total = (document.body.scrollHeight - document.body.clientHeight);
         var remain = total - sc;
         if(remain < 500 && Enable == 1) {
            do_request();
         }
      }
      catch(e) {
      
      }
      var self = arguments.callee;
      timeOutId = setTimeout(self, 100);
   };
   
   var do_request = function() {
      if (this.requested == offset) {return}
      this.requested = offset;
      var xmlhttp;
      try {
         xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
      }
      catch(e) {
         xmlhttp = new XMLHttpRequest();
      }
      xmlhttp.onreadystatechange = function() {
         if (xmlhttp.readyState == 4) {
            var v = xmlhttp.responseText;
            
            var start = -1;
            var end = -1;
            var end_flag = true;
            
            for (i = 0; i < sliceStart.length && start == -1; i++) {
               var start = v.indexOf(sliceStart[i]);
               var end = v.indexOf(sliceEnd[i]);
            }
            
            var div = document.createElement("div");
            div.innerHTML = ["<hr>",offset + 1," to ",(offset + num),"","<p class=g>",v].join("");
            
            var atag = div.all.tags("a");
            
            for (j = 0; j < atag.length; j++) {
               if (atag[j].hostname == location.hostname) {
                  for (i = 0; i < toNext.length && end_flag; i++) {
                     end_flag = !RegExp(toNext[i], "i").test(atag[j].innerHTML);
                  }
               }
            }
            if (start * end > 0) {
               v = v.slice(start, end);
            }
            if (end_flag) v += "<div align=center>end</div>";
            div.innerHTML = ["<hr>",offset + 1," to ",(offset + num),"","<p class=g>",v].join("");
            
            if (doHilight) {
               var btag = div.all.tags("b");
               
               for (i in keywords) {
                  re = RegExp(keywords[i].replace(/\"/g, "").replace(/([+*?.{}|\[\]$^])/g, function(str, p){return "\\" + p}), "i");//"
                  
                  for (j in btag) {
                     if (btag[j].innerText != null && re.test(btag[j].innerText)) {
                        btag[j].style.backgroundColor = colors[i % colors.length];
                     }
                  }
               }
            }
            
            if (openNewWindow) {
               var tags = div.all.tags("a");
               
               for (i in tags) {
                  if (tags[i].href && !tags[i].href.match(/^http:\/\/.+google\.com\//)) {
                     tags[i].target = "_blank";
                  }
               }
            }
            
            if (showPreview) {
               var atag = div.all.tags("a");
               for (i = 0; i < atag.length; i++) {
                  if (atag[i].className == "l" && !atag[i].href.match(/\.pdf/)) {
                     if (previewByIFrame) {
                        atag[i].insertAdjacentHTML("BeforeBegin","<iframe src='" + atag[i].href + "' style='zoom:0.2;' height=600 width=800></iframe>");
                     }
                     else {
                        atag[i].insertAdjacentHTML("BeforeBegin", "<img src='http://pthumbnails.alexa.com/image_server.cgi?id=yoursite.com&size=large&url=" + atag[i].href + "' width=201 height=147 />");
                     }
                  }
               }
            }
            
            insertPoint.appendChild(div);
            
            window.status = "loading ... " + offset + " - " + (offset+num) + " done.";
            if (!end_flag) {
               offset += num;
            }
         }
      };
      xmlhttp.open("GET", base + query.replace(/start=\d*/,"start=" + offset) + "&gbv=1", true);
      window.status = "loading ... " + offset +" - " + (offset + num);
      xmlhttp.send(null);
   };
   
   var init_autopager = function() {
      var next = null;
      
      var tags = document.links;
      
      for (var i = 0; i < tags.length && !next; i++) {
         if (tags[i].hostname == location.hostname) {
            for (var j = 0; j < toNext.length && !next; j++) {
               if (RegExp(toNext[j], "i").test(tags[i].innerHTML)) {
                  next = tags[i];
               }
            }
         }
      }
      
      if (next != null) {
         var href =  next.href;
         base = href.substr(0, href.indexOf("?"));
         query = href.substr(href.indexOf("?"));
         offset = (query.match(/start=(\d*)/))[1] - 0;
         var tmp = query.match(/num=(\d*)/);
         num = tmp ? tmp[1] - 0 : 10;
      }
      
      tags = document.all.tags("div");
      for (i = 0; i < tags.length; i++) {
         for (j = 0; j < sliceStart.length; j++) {
            if (RegExp(sliceStart[j], "i").test(tags[i].outerHTML)) {
               insertPoint = tags[i];
            }
         }
      }
   };
   
   // init
   if (document.body.attachEvent) {
      document.body.attachEvent(
         'ondblclick',function() {
            Enable = !Enable;
            window.status = Enable ? "Enabled" : "Disabled"
         }
      );
   }
   else {
      document.body.addEventListener(
         'dblclick',function() {
            Enable = !Enable;
            window.status = Enable ? "Enabled" : "Disabled"
         }, true
      );
   }
   init_autopager();
   watch_scroll();
}

_________________
 ∩∩ 欲しいスクリプトを要望してみるスレ - Fenrir User Community
(・×・) 
 (  )。


最終編集者 プヨぷよ [ 2007/04/20 Fri - 21:03 ], 編集回数 5 回

プヨぷよ
Professional



登録日: 2006.06.21
投稿記事: 252

投稿
日時: 2006/07/02 Sun - 06:56

引用付きで返信

mixi用のスクリプトです。単体ではマイミクの外部日記に自動でジャンプするだけですが
専用のUserAction Extention用スクリプトと併用することでコミュニティや
トピックにブックマークできるようになります。

※06/07/03
クライアント|全般|スクリプトによるクライアントの操作を許可する
にチェックがなくても動作するように修正

※06/10/16
新着日記からは確認画面を介さないように修正
特定IDユーザのあぼーん機能を追加(IDをデータベースに追加するために専用スクリプトが必要)

Code:

// ==UserScript==
// @name        mixiを拡張
// @author      プヨぷよ
// @include     http://mixi.jp/*
// @type        SleipnirScript
// @description mymixiの外部日記に自動で飛んだりコミュとかトピにbookmark
// ==/UserScript==

if (document != null) {
   var db = sleipnir.Database.Open("mixiDB");
   var mixi_width = 800;
   
   var url = location.href;
   
   //mymixiの『日記』に対する処理
   if (url.indexOf("mixi.jp/list_diary.pl") != -1 || url.indexOf("mixi.jp/view_diary.pl?url=") != -1) {
      var tags = document.getElementsByTagName("a");

      for (i in tags) {
         if (tags[i].href == null) {
            continue;
         }
         
         if (tags[i].href.indexOf("mixi") == -1 && tags[i].href.indexOf("javascript:void(0)") == -1) {
            location = tags[i].href;
         }
      }
   }
   
   //新着日記一覧での処理
   else if (url == "http://mixi.jp/new_friend_diary.pl") {
      var tags = document.getElementsByTagName("a");
      for (i in tags) {
         if (tags[i].href && tags[i].href.match(/mixi.jp\/view_diary.pl\?url=(.+)&owner_id=\d+$/)) {
            tags[i].href = unescape(RegExp.$1);
         }
      }
   }
      
   //Homeの処理
   else if (url.match(/mixi.jp\/(home.pl|$)/) && document.body.innerHTML.match(/<!--フッタ-->/)) {
      var tags = document.getElementsByTagName("a");
      for (i in tags) {
         if (tags[i].href && tags[i].href.match(/mixi.jp\/view_diary.pl\?url=(.+)&owner_id=\d+$/)) {
            tags[i].href = unescape(RegExp.$1);
         }
      }
      
      var res = db.Query("SELECT * FROM community_bookmark ORDER BY Count DESC;");
      if (res.NumRows() != 0) {
         var community_list = "<div style='width=" + (mixi_width - 5) + ";margin-left:5'>CommunityBookmark<br />";
         for (i = 0; i < res.NumRows(); i++) {
            var row = res.FetchArray();
            var no = row.At(0);
            var name = row.At(1);
            
            if (i & 1) {
               community_list += "<span style='width:" + (mixi_width - 5) / 5 + ";background-color:#FEC977;'>";
            }
            else {
               community_list += "<span style='width:" + (mixi_width - 5) / 5 + ";background-color:#F8A448;'>";
            }
            community_list += "<a href='http://mixi.jp/view_community.pl?id=" + no + "'>" + name + "</a></span>";
         }
         community_list += "</div>";
      }
      
      res = db.Query("SELECT * FROM topic_bookmark ORDER BY Count DESC;");
      if (res.NumRows() != 0) {
         var topic_list = "<div style='width=" + (mixi_width - 5) + ";margin-left:5'>TopicBookmark<br />";
         for (i = 0; i < res.NumRows(); i++) {
            var row = res.FetchArray();
            var topic_no = row.At(0);
            var community_no = row.At(1);
            var name = row.At(2);
            
            if (i & 1) {
               topic_list += "<span style='width:" + (mixi_width - 5) / 3 + ";background-color:#FEC977;'>";
            }
            else {
               topic_list += "<span style='width:" + (mixi_width - 5) / 3 + ";background-color:#F8A448;'>";
            }
            topic_list += "<a href='http://mixi.jp/view_bbs.pl?id=" + topic_no + "&comm_id=" + community_no + "'>" + name + "</a></span>";
         }
         topic_list += "</div>";
      }
      
      var text = "";
      if (community_list) {
         text += community_list;
      }
      if (topic_list) {
         text += topic_list;
      }
      
      document.body.innerHTML = document.body.innerHTML.replace(/<!--フッタ-->/, text);
   }
   
   //コミュニティに対する処理
   else if (url.match(/mixi.jp\/view_community.pl\?id=(\d+)/)) {
      var no = Number(RegExp.$1);
      
      var res = db.Query("SELECT * FROM community_bookmark WHERE No = " + no + ";");
      if (res.NumRows() > 0) {
         var count = Number(res.FetchArray().At(2)) + 1;
         db.Query("UPDATE community_bookmark SET Count = " + count + " WHERE No =" + no + ";");
      }
   }
   
   //トピックに対する処理
   else if (url.match(/mixi.jp\/view_bbs.pl\?id=(\d+).+comm_id=(\d+)/)) {
      var topic_no = Number(RegExp.$1);
      var community_no = Number(RegExp.$2);
      
      var res = db.Query("SELECT * FROM topic_bookmark WHERE Topic_No = " + topic_no + " AND Community_No = " + community_no + ";");
      if (res.NumRows() > 0) {
         var count = Number(res.FetchArray().At(3)) + 1;
         db.Query("UPDATE topic_bookmark SET Count = " + count + " WHERE Topic_No = " + topic_no + " AND Community_No = " + community_no + ";");
      }
      
      var ngid = new Array();
      res = db.Query("SELECT * FROM ng_id;");
      for (i = 0; i < res.NumRows(); i++) {
         ngid.push(res.FetchArray().At(0));
      }
      
      var tags = document.getElementsByTagName("a");
      
      for (i in tags) {
         if (tags[i].href) {
            if (tags[i].href.match(/show_friend\.pl\?id=(\d+)/)) {
               for (j in ngid) {
                  if (ngid[j] == RegExp.$1 && tags[i].parentNode.parentNode.nextSibling) {
                     tags[i].parentNode.parentNode.style.display = "none";
                     tags[i].parentNode.parentNode.nextSibling.style.display = "none";
                  }
               }
            }
         }
      }
   }
}

_________________
 ∩∩ 欲しいスクリプトを要望してみるスレ - Fenrir User Community
(・×・) 
 (  )。


最終編集者 プヨぷよ [ 2006/10/16 Mon - 18:37 ], 編集回数 3 回

moke
Beginner



登録日: 2006.04.03
投稿記事: 2

投稿外部へのリンクを新しいタブで開くスクリプト
日時: 2006/08/03 Thu - 16:39

引用付きで返信

異なるホストへのリンクを新しいタブで開くスクリプトです。

Code:

// ==UserScript==
// @name           OpenNewTab
// @include        http*
// @type        SleipnirScript
// @description    外部へのリンクを新しいタブで開く。The external link is opened in a new tab.
// ==/UserScript==

//---------------------------------------------------------------------
//
// 外部へのリンクを新しいタブで開くスクリプト
//
//---------------------------------------------------------------------



if ( document != null ) {
   var tags = document.links;

   for ( i in tags ) {
      if ( tags[ i ].hostname != _window.location.hostname && (/^http*/).test( tags[ i ].protocol ) ) {
         tags[ i ].target = '_blank';
      }
   }
}

kohiro
Regular



登録日: 2006.02.17
投稿記事: 33

投稿Adobe Reader 風 ドラッグスクロール
日時: 2007/01/24 Wed - 14:05

引用付きで返信

こちらで要望があったので「[暴満館] JavaScriptメモ - 巨大なテーブルをスクロールで表示」を参考に作成してみました。
ダブルクリックで有効無効を切り替えます。

*08/03/15
慣性で動く際に、マウスの移動量が少ないときは、動き続ける様に

*08/03/15
慣性で動くオプションを追加(デフォルトでオンです)

*07/07/31
UserActionScript版公開

*07/05/31
整理

*07/01/25
テキストエリアやdiv要素もスクロールするように。

Code:

// ==UserScript==
// @name          Grab and Drag for Sleipnir
// @description   Adobe Reader 風 ドラッグスクロール
// @include       *
// ==/UserScript==

function GrabAndDrag() {
   // 移動レート(増やすとちょっと動かしたらいっぱい動く)
   this.moveRate         = 1.0;
   // 初期状態でグラブするかしないか
   this.defaultGrab      = false;
   // 慣性で動くか否か
   this.flickGestures      = true;
   // 慣性で動くか否かのマウス移動量の閾値
   this.flickGesturesBorder= 2;
   // 動き続けるか、慣性で動くかマウス移動量の閾値(0で無効)
   this.autoScrollBorder   = 10;

   this.enabledGandD      = false;
   this.drag            = false;
   this.lastSX            = 0;
   this.lastSY            = 0;
   this.lastMX            = 0;
   this.lastMY            = 0;
   this.speedX            = 0;
   this.speedY            = 0;
   this.target            = null;

   this._init();
}

GrabAndDrag.prototype._init = function() {
   var self = this;
   document.body.attachEvent('onmousemove', function() { self.onMouseMove(); });
   document.body.attachEvent('onmouseup', function() { self.onMouseUp(); });
   document.body.attachEvent('onmousedown', function() { self.onMouseDown(); });
   document.body.attachEvent('ondblclick', function() { self.onDblClick();  });
   if (this.defaultGrab == true) {
      document.body.style.cursor = 'move';
      this.enabledGandD = true;
   }
   if (this.flickGestures)
      this.smoothScroll = new SmoothScroll();
}
GrabAndDrag.prototype._setDragPosition = function(obj) {
   this.lastSX = obj.scrollLeft;
   this.lastSY = obj.scrollTop;
   this.lastMX = obj.scrollLeft + event.clientX;
   this.lastMY = obj.scrollTop + event.clientY;
}
GrabAndDrag.prototype.onMouseDown = function() {
   if (event.button != 1)
      return;
   if (this.enabledGandD == false)
      return;
   if ((event.clientX > document.body.clientWidth) || (event.clientY > document.body.clientHeight))
      return;
   if (this.drag) {
      this.drag = false;
   } else {
      var obj = event.srcElement;
      while(1) {
         if (((obj.offsetHeight != 0) && (obj.offsetWidth != 0)) &&
            ((obj.offsetHeight < obj.scrollHeight) || (obj.offsetWidth < obj.scrollWidth))) {
            break;
         } else {
            if (obj.tagName == 'HTML')
               break;
            obj = obj.parentNode;
         }
      }
      if (obj != null) {
         if (this.flickGestures)
            this.smoothScroll.stop();
         this.speedX = 0;
         this.speedY = 0;
         this.target = obj;
         this._setDragPosition(obj);
         this.drag = true;
      }
   }
   event.returnValue = false;
}
GrabAndDrag.prototype.onMouseUp = function() {
   if (!this.drag) return;
   this.drag = false;
   if (this.flickGestures) {
      var speedX = (this.speedX > 0) ? this.speedX : -this.speedX;
      var speedY = (this.speedY > 0) ? this.speedY : -this.speedY;
      if ((this.flickGesturesBorder > speedX) && (this.flickGesturesBorder > speedY)) return;
      if ((speedX < this.autoScrollBorder) && (speedY < this.autoScrollBorder)) {
         var y = (this.speedY > 0) ? -1 : 1, x = (this.speedX > 0) ?  -1 : 1;
         if (speedX > speedY)
            y = 0;
         else
            x = 0;
         this.smoothScroll.autoScroll(x, y, this.target);
      } else
         this.smoothScroll.scrollTo(this.lastSX - (this.speedX * 30), this.lastSY - (this.speedY * 30), this.target);
   }
}
GrabAndDrag.prototype.onMouseMove = function() {
   if (this.drag) {
      if (this.target != null) {
         var prevX = this.target.scrollLeft;
         var prevY = this.target.scrollTop;
         var X = this.target.scrollLeft + event.clientX;
         var Y = this.target.scrollTop + event.clientY;
         this.target.scrollLeft   = this.lastSX - (X - this.lastMX) * this.moveRate;
         this.target.scrollTop   = this.lastSY - (Y - this.lastMY) * this.moveRate;
         this.speedX = prevX - this.target.scrollLeft;
         this.speedY = prevY - this.target.scrollTop;
         this._setDragPosition(this.target);
      }
      event.returnValue = false;
   }
}
GrabAndDrag.prototype.onDblClick = function() {
   if (this.enabledGandD == false) {
      document.body.style.cursor = 'move';
      this.enabledGandD = true;
   } else {
      document.body.style.cursor = '';
      this.enabledGandD = false;
   }
   event.returnValue = false;
}

// for LDRize for SeaHorse
function SmoothScroll() {
   this.destinationx = null;
   this.destinationy = null;
   this.timerID = null;
   this.callBackFunc = null;
}
SmoothScroll.prototype = {
   steps : 200,
   duration : 1000,

   setCallback : function(f) {
      this.callBackFunc = f;
   },
   stop : function() {
      if (this.timerID != null) {
         clearTimeout(this.timerID);
         this.timerID = null;
      }
      if ((this.destinationx != null) && (this.destinationy != null)) {
         this.target.scrollLeft = this.destinationx;
         this.target.scrollTop =  this.destinationy;
         this.destinationx = null;
         this.destinationy = null;
      }
   },
   autoScroll: function(x, y, target){
      this.target = target;
      var self = this;
      this.autoX = x;
      this.autoY = y;
      self.timerID = setTimeout(function() {
         var y = self.target.scrollTop;
         var x = self.target.scrollLeft;

         var yy = y + self.autoY;
         var xx = x + self.autoX;
         if (y == self.prevY)
            yy = 0;
         if (x == self.prevX)
            xx = 0;

         if ((yy == 0) && (xx == 0)) {
            clearTimeout(self.timerID);
            setTimeout(function() { if (self.callBackFunc != null) self.callBackFunc(); }, 10);
         } else {
            if (self.autoX != 0) self.target.scrollLeft = xx;
            if (self.autoY != 0) self.target.scrollTop =  yy;
            self.timerID = setTimeout(arguments.callee, 10);
         }
         self.prevY = y;
         self.prevX = x;
      }, 10);
   },
   scrollTo : function(destX, destY, target){
      this.target = target;
      this.destinationx = destX;
      this.destinationy = destY;
      this.step = 0;
      var self = this;
      this.prevY = -1;
      this.prevX = -1;

      self.timerID = setTimeout(function() {
         var y = self.target.scrollTop;
         var x = self.target.scrollLeft;

         var yy = self.destinationy - ((self.destinationy - y) / 1.5);
         var xx = self.destinationx - ((self.destinationx - x) / 1.5);
         if ((y == self.prevY) || (Math.abs(self.destinationy - yy) < 1))
            yy = self.destinationy;
         if ((x == self.prevX) || (Math.abs(self.destinationx - xx) < 1))
            xx = self.destinationx;

         if (((yy == self.destinationy) && (xx == self.destinationx))|| (self.step + 1 == self.steps)) {
            self.target.scrollLeft = self.destinationx;
            self.target.scrollTop =  self.destinationy;
            clearTimeout(self.timerID);
            setTimeout(function() { if (self.callBackFunc != null) self.callBackFunc(); }, 10);
            self.destinationx = null;
            self.destinationy = null;
         } else {
            self.target.scrollLeft = xx;
            self.target.scrollTop =  yy;
            self.timerID = setTimeout(arguments.callee, (self.duration / self.steps) * (self.step + 1));
         }
         self.step++;
         self.prevY = y;
         self.prevX = x;
      }, (this.duration / this.steps) * this.step + 1);
   }
};
GrabAndDrag = new GrabAndDrag();


最終編集者 kohiro [ 2008/03/15 Sat - 13:38 ], 編集回数 4 回

プヨぷよ
Professional



登録日: 2006.06.21
投稿記事: 252

投稿SaveTextArea
日時: 2007/05/08 Tue - 00:54

引用付きで返信

08/01/08現在α版ですが、Fenrir純正プラグインに同様の機能をもつRememberMeがあります。

修正履歴:
07/05/15 19:35
 ボタンの幅をテキストエリアに合わせるようにした
 フレーム内でページ遷移したときに再実行できるように複数回実行の回避部を修正
 テキストエリア内のバイト数、文字数、改行数をボタンに表示するようにした

07/05/29 07:00
 ページ遷移したときやタブを閉じた時にデータベースインタフェースを開放するようにした。

07/06/05 22:35
 ボタンの文字色の設定が正常に機能していなかったのを修正
 テキストエリア内の文字量が多いと情報の取得が重くなるため、文字入力中は情報の取得を停止するようにした

07/11/28 23:06
 データベースのデーブル作成クエリを修正
 テキストを保存する際 ' が含まれていると正常に保存できなかった不具合を修正

08/01/08 18:30
 テーブルの作成クエリを修正
 テキストエリアをリサイズした際ボタンのサイズも追従するようにした
 リモートサイトのスクリプトにexecScriptのオーバーライドを利用してISleipnirインタフェースを奪われる可能性がある不具合を修正した
  (副作用としてタブのセキュリティ設定でスクリプトが無効になっていても動作するようになっていますが、
  スクリプトコントロールを利用する為Windows98では別途インストールが必要になります。
  こちらからインストールできるかと思いますが、テスト環境がないため本当に動作するかはわかりません)

概要:
テキストエリアへの入力内容をデータベースに保存し、5分以内(設定可)に同じURIにアクセスしたとき
保存した内容を自動(設定可)で復元できるようにします。
謝ってページを閉じてしまった場合やページ遷移してしまった場合などの保険にどうぞ。
但し復元できたらラッキー、という程度にお考えください。
また、現在のところ文字通りテキストエリアのみが対象です。
編集中のテキストに色がついて表示されるようなものには適用されません。

SeaHorse、UserActionのどちらとしても動作します。
テキストエリアへの入力の機会の多いサイトをSeaHorseに登録し、
一時的に利用したい場合などにUserActionを利用するといいかと思います。

導入:
スクリプトを全て選択して(codeのブロックをトリプルクリックすると選択が楽です。)
<任意のファイル名>.user.js で保存して、Sleipnir\plugins\seahorse\ に入れてください。
(UserAction用とする場合は<任意のファイル名>.js で保存して、Sleipnir\plugins\scripts\ に入れてください。)

Code:
// ==UserScript==
// @name        SaveTextArea
// @author      プヨぷよ
// @include     http://community.tabbrowser.jp/forum/*
// @include     http://mixi.jp/*
// @description テキストエリアへの入力内容を保護してくれる"かも"。信頼厳禁
// @type        SleipnirScript
// ==/UserScript==

//ここから設定

var Minutes = 5;//Minutes分経過したデータを自動削除
var AutoSave = true;//自動保存を有効にする true(推奨) / false

//テキストエリアに文字がなければ自動で復元する true(推奨) / false
var LoadIfEmpty = true;

//テキストエリアに文字があっても自動で復元する true / false(推奨)
var LoadAlways = false;

//ボタンにテキストエリア内のバイト数、文字数、行数を表示する true / false
var DispInfo = true;

var ButtonSetting = [
   //ボタンに表示されるテキスト, 文字色, 背景色
   "保存されたテキストを復元", "white" , "red",//復元可能な状態
   "テキストを手動で保存", "white" , "black",//待機状態
   "入力完了時に自動保存します", "white" , "navy"//キー入力中
];

//ここまで設定

var ScriptControl = CreateObject("ScriptControl");
if (ScriptControl && !_window[ScriptName]) {
   _window[ScriptName] = true;
   ScriptControl.Language = "JScript";
   ScriptControl.AddObject("ScriptControl", ScriptControl);
   ScriptControl.AddObject("sleipnir", sleipnir, true);
   ScriptControl.AddObject("db", Database.Open("SaveTextAreaDB"));
   ScriptControl.AddObject("_window", _window);
   ScriptControl.AddObject("Minutes", Object(Minutes));
   ScriptControl.AddObject("AutoSave", Object(AutoSave));
   ScriptControl.AddObject("LoadIfEmpty", Object(LoadIfEmpty));
   ScriptControl.AddObject("LoadAlways", Object(LoadAlways));
   ScriptControl.AddObject("DispInfo", Object(DispInfo));
   ScriptControl.AddObject("ButtonSetting", ButtonSetting);
   ScriptControl.Eval("_window.attachEvent('onunload', function(){ScriptControl=null;});");
   ScriptControl.AddCode(SaveTextArea);
   ScriptControl.Run("SaveTextArea", _window);
}

function SaveTextArea(window)
{
   var document = window.document;
   var frames = document.getElementsByTagName("frame");
   var callee = arguments.callee;
   
   if (frames.length) {
      for (i = 0; i < frames.length; i++) {
         var w = frames[i].contentWindow;
         try {
            if (w.document.readyState == "complete") {
               callee(w);
            }
            
            frames[i].attachEvent("onload", function(e){
               callee(e.srcElement.contentWindow);
            });
         }
         catch (e) {
            Output.Print(ScriptName + " エラー:ドメインの異なるサブフレーム", false);
         }
      }
      return;
   }
   
   var textAreas = document.getElementsByTagName("TextArea");
   var timeoutId;
   var no;
   
   var res = db.Query("SELECT * FROM Form;");
   if (res.NumRows() == 0) {
      db.Query("CREATE TABLE IF NOT EXISTS Form(target TEXT primary key, text TEXT, date INTEGER);");
   }
   else {
      var ttime = new Date().getTime() - 1000 * 60 * Minutes;
      db.Query("DELETE FROM Form WHERE date < " + ttime + ";");
   }
   
   for (no = 0; no < textAreas.length; no++) {
      res = db.Query("SELECT text FROM Form WHERE target = '" + window.location.href + " " + no + "';");
      
      var loadedText = "";
      
      if (res.NumRows() != 0) {
         loadedText = res.FetchArray().At(0);
         if ((textAreas[no].value == "" && LoadIfEmpty) || LoadAlways)
         {
            textAreas[no].value = loadedText;
         }
      }
      
      var messageButton = document.createElement("input");
      messageButton.type = "button";
      messageButton.style.display = "block";
      messageButton.style.width = textAreas[no].offsetWidth;
      textAreas[no].attachEvent("onresize", function(e) {
         e.srcElement.previousSibling.style.width = e.srcElement.offsetWidth;
      });
      
      if (loadedText && loadedText != textAreas[no].value) {
         messageButton.value = ButtonSetting[0];
         messageButton.style.color = ButtonSetting[1];
         messageButton.style.backgroundColor = ButtonSetting[2];
         messageButton.onclick = Load;
         messageButton.loadedText = loadedText;
      }
      else {
         messageButton.value = ButtonSetting[3] + (DispInfo ? GetInfo(textAreas[no]) : "");
         messageButton.style.color = ButtonSetting[4];
         messageButton.style.backgroundColor = ButtonSetting[5];
         messageButton.onclick = Save;
      }
      textAreas[no].parentNode.insertBefore(messageButton, textAreas[no]);
      messageButton = null;//明示的に開放しないとScriptControlが開放できない
   }
   if (AutoSave) {
      for (no = 0; no < textAreas.length; no++) {
         textAreas[no].attachEvent("onkeyup", ReserveSaveTextArea);
      }
   }
   
   function ReserveSaveTextArea()
   {
      if (window.event.keyCode > 40 || window.event.keyCode < 37) {
         no = 0;
         while (textAreas[no] != window.event.srcElement) no++;
         
         if (timeoutId) {
            window.clearTimeout(timeoutId);
         }
         else {
            var button = window.event.srcElement.previousSibling;
            button.onclick = Save;
            button.value = ButtonSetting[6];// + (DispInfo ? GetInfo(textAreas[no]) : "");
            button.style.color = ButtonSetting[7];
            button.style.backgroundColor = ButtonSetting[8];
         }
         
         timeoutId = window.setTimeout(Save, 500);
      }
   }
   
   function Save()
   {
      if (window.event && window.event.type == "click") {
         if (textAreas[no].value == "") {
            alert("保存するテキストがありません\n(取得に失敗しているかもしれません)");
            return;
         }
         else {
            alert("テキストを保存しました!\n\n" + textAreas[no].value);
         }
      }
      var dd = new Date();
      var time = dd.getTime();
      var text = textAreas[no].value.replace(/'/g, "''");//'
      var target = window.location.href + " " + no;
      
      var res = db.Query("SELECT * FROM Form WHERE target = '" + target + "';");
      if (res.NumRows() != 0) {
         db.Query("UPDATE Form SET date = "  + time + ", text = '" + text + "' WHERE target = '" + target + "';");
      }
      else {
         db.Query("INSERT INTO Form(target, text, date) VALUES('" + target + "', '" + text + "', " + time + ");");
      }
      textAreas[no].previousSibling.value = ButtonSetting[3] + (DispInfo ? GetInfo(textAreas[no]) : "");
      textAreas[no].previousSibling.style.color = ButtonSetting[4];
      textAreas[no].previousSibling.style.backgroundColor = ButtonSetting[5];
      
      timeoutId = null;
   }
   
   function Load()
   {
      this.nextSibling.value = this.loadedText;
      this.onclick = Save;
      this.value = ButtonSetting[3] + (DispInfo ? GetInfo(textAreas[no]) : "");
      this.style.color = ButtonSetting[4];
      this.style.backgroundColor = ButtonSetting[5];
   }
   
   function GetInfo(textArea)
   {
      var str = textArea.value;
      var chars = str.length;
      var n = str.match(/\n/g);
      var lines = n ? n.length + 1 : 1;
      
      str = escape(str);
      var bytes = 0;
       for (var i = 0; i < str.length; i++, bytes++) {
         if (str.charAt(i) == "%") {
            if (str.charAt(++i) == "u") {
               i += 3;
               bytes++;
            }
            i++;
         }
      }
      return " (" + bytes + "B " + chars +  "字 " + lines + "行)";
   }
}

_________________
 ∩∩ 欲しいスクリプトを要望してみるスレ - Fenrir User Community
(・×・) 
 (  )。

プヨぷよ
Professional



登録日: 2006.06.21
投稿記事: 252

投稿rapiddownload
日時: 2009/04/17 Fri - 23:57

引用付きで返信

概要:
rapidshare, MEGAUPLOADでダウンロードボタンが表示されるまでのカウントダウンをスキップします。
※ページ上でのカウントダウンを無効にするだけなので連続ダウンロードに対する制限は緩和されません。

導入:
スクリプトを全て選択して(codeのブロックをトリプルクリックすると選択が楽です。)
<任意のファイル名>.user.js で保存して、Sleipnir\plugins\seahorse\ に入れてください。

Code:
// ==UserScript==
// @name        rapiddownload
// @author      プヨぷよ
// @include     http://rs*.rapidshare.com/files/*
// @include     http://www.megaupload.com/*
// @description rapidshare, MEGAUPLOADで待ち時間なくなるかも
// @type        JavaScript
// @date        09/04/17
// ==/UserScript==

c = 0;//rapidshare用
count = 1;//MEGAUPLOAD用

_________________
 ∩∩ 欲しいスクリプトを要望してみるスレ - Fenrir User Community
(・×・) 
 (  )。

sogaken
Beginner



登録日: 2009.06.09
投稿記事: 5

投稿linkbucksをスキップ
日時: 2009/08/13 Thu - 17:40

引用付きで返信

linkbucksのページで、いちいちクリックするのが面倒なので、自分用に作りました。
自分は問題なく動作してますが、不具合があるかもしれません。あしからず。

Code:
// ==UserScript==
// @name            skip_linkbucks.user.js
// @description   linkbucksをスキップさせる
// @include         http://*.linkbucks.com/*
// @include         http://*.thesefiles.com/*
// @include         http://*.thosefiles.com/*
// @include         http://*.thesegalleries.com/*
// @include         http://*.thosegalleries.com/*
// ==/UserScript==

function main(){reg1 = new RegExp('linkDestUrl.*?=.*?[\"\'](.*)[\"\']'); if(window.document.body.innerHTML.match(reg1)){buff=RegExp.$1;reg2 = new RegExp('^http:.*'); if(buff.match(reg2)){window.location.href = buff;}}return;}main();

トップ -> Developer フォーラム (SLDEV)

トピックに返信

 
新規投稿: 不可
返信投稿: 不可
記事編集: 不可
記事削除: 不可
投票参加: 不可
Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : PHPBB JAPAN / EUC-JP Edition : JP Support Forum