Sleipnir2スレ
- 1 :l ★:2006/11/10(金) 23:37:03 ID:???
- 「作ったもの」スレが埋め尽くされつつあるので、Sleipnir関連はこっちに隔離することに。
- 43 :l ★:2007/05/15(火) 12:47:48 ID:???
- スクラップブック 相対リンクの修正など
スクラップブックに保存するときに、a href/img srcなどで相対URLが指定されていると、リンク切れになってしまう。
そこで、相対URLを絶対URLに変換するプラグインを作ることに。
new ActiveXObject('htmlfile')でIHTMLDocument2オブジェクトらしきものを作って、base要素のhref属性を設定してやれば、getElementsByTagName('img')[0].srcなどとして絶対URLで属性値を参照できるようになる。
そのURLを属性値自身に代入すると、getElementsByTagName('body')[0].innerHTML等で取得されるHTMLに反映される。
とりあえず、そんな感じでリンク切れの修正が出来るようになった。
元からbase hrefが設定されていたりすると駄目そうだが、今の所問題になってはいないから別にいいや。
リンク先の画像をダウンロードする機能も付けようかと思ったけど、面倒なんでやめた。
その他、スクラップダイアログに概要欄を追加したりした。
投稿ファイル名: ScrapBook.zip
http://lukewarm.s151.xrea.com/b/file/1163165308_43.zip
サイズ: 51918 bytes
- 44 :l ★:2007/05/16(水) 08:25:01 ID:???
- 相対リンク修正をbase hrefに対応させた。
Sleipnir公式のプラグインページを取り込もうとしたら、base hrefのせいで画像が取り込めなかったので、直した。
例の如く、動作確認以外では全然使ってない。どうしたものか。
投稿ファイル名: ResolveLink.zip
http://lukewarm.s151.xrea.com/b/file/1163165308_44.zip
サイズ: 532 bytes
- 45 :l ★:2007/05/17(木) 07:20:35 ID:???
- スクラップブックスクリプト ページ評価設定機能追加
残っていた放置フィールド・Ratingを操作する機能を付けた。
このフィールドには、ページの評価を設定する。
値は、-100から100の範囲に収められる。
コマンドフォームから、表示中のページやリストでチェックを入れたページの評価を変更できる。
「++」や「----」などを入力すると、1文字に付き25ずつ値を増減させられるという機能も付けてみた。
ページの個別表示では、音量メーターのようなバーで値を表示・設定できるようにした。
このバーはスタイルシートを駆使して表現しているのだが、Trident以外ではまともに表示されない。今に始まったことではないし、今の所Sleipnir2専用のスクリプトだからいいや。
スクラップダイアログからも設定できるようにしようと思っていたのだが、忘れた。まあいいや。
後、ページのスタイルシートをいじったりした。
固定幅サイドバー+可変幅メイン部分という構成を採用しているのだが、以前のスタイルシートだと、ページ表示部に画像等があって横にはみ出してしまう場合、メイン部分がサイドバーの下に移動してしまうという問題があった。
横幅が足りないときは、レイアウトを変えずに横スクロールバーを出すようにしたい。
Wikipediaのスタイルシートをパクったら何とかなった模様。
marginに負の値を指定できるとかいう訳の分からないテクニックを使っているらしい。
投稿ファイル名: ScrapBook.zip
http://lukewarm.s151.xrea.com/b/file/1163165308_45.zip
サイズ: 53890 bytes
- 46 :l ★:2007/05/17(木) 11:24:45 ID:???
- Googleノートブックのフレームウィンドウを表示するUserActionスクリプト
IE用の拡張をインストールすると追加されるボタンを押すことで画面右下に表示されるようになる奴を、Sleipnirでも使えるようにする。
Proxomitronのヘッダログで監視したところ、表示に使われているURLが分かったので、それをフレームとしてページに追加することに。
画面右下に固定されるように、スクロールやリサイズにイベントを割り当てて位置を追従させる。
clientWidthとかscrollLeftとかの関係が分かりづらくて困る。
動きがやたらとぎこちないが、まあいいだろう。
とりあえず普通に表示できたが、閉じるボタンを押してもフレームが閉じないのが間抜けだ。
自前の閉じるボタンを付けようかと思ったが、途中で面倒になったので、同じコマンドを再実行したら閉じることにした。
ついでに、スタイルシートのclipという奴で、タイトルバーの部分を隠してやることに。
そんなわけで、Sleipnirでも選択部分をD&Dでノートブックに保存したり出来るようになった。
すばらしい。
もうスクラップブックスクリプトなんて紛い物は要らないね。
投稿ファイル名: GoogleNotebook.zip
http://lukewarm.s151.xrea.com/b/file/1163165308_46.zip
サイズ: 583 bytes
- 47 :aaa:2007/06/01(金) 17:28:35 ID:v1KgzVqA
- >>380
ttp://lukewarm.s151.xrea.com/test/read.cgi/b/1163165308/
ここのどこかで実験してたよ
- 48 :aaa:2007/06/01(金) 17:30:14 ID:v1KgzVqA
- すんません。誤爆orz
- 49 :l ★:2007/06/02(土) 10:22:18 ID:???
- AutoPagerizerらしきもの
せっかくXPathが使えるようになったので、作ってみた。
window.onscrollでページの末尾近くまでスクロールしたことを検知して処理を実行させる。
ブラウザ側のJavaScriptで動作するかよく分からなかったので、>>25の方法を利用してスクリプトコントロールを常駐させる。
JavaScriptがOFFでも動作するのがよろしい。
nextLinkのhrefを取得しようとしたら、URLが勝手にデコードされて、なぜか文字化けしやがる。
encodeURI()しても正しく再エンコードできない。
「goungoun blog. ≫ Blog Archive ≫ getAttribute href、MSIE6が勝手にURLデコードする問題?(http://goungoun.dip.jp/app/blog/index.php/2006/08/27/19/)」に対策が載っていた。
この方法では、ソースに記述された生のURLが得られるが、相対パスの場合もあるのが難点。
以前作ったURLモジュールのbuild()メソッドで結合すればよい。
片方がサーバルートからのパスだったときに正しく動作しないことに気付いたので修正した。
取得したHTMLもなぜか文字化けする。
HTTPモジュールの自動文字コード変換が適当だったのが原因らしい。
ADODBの適当な判別に任せず、真面目にレスポンスヘッダやmetaタグからcharsetを取得するようにしたらまともになった。
取得したHTMLから表示する部分と次ページへのリンクを抽出する部分は、ActiveXObject('htmlfile')を利用する。
とりあえず、はてなブックマークのエントリリストで試してみたところ、それなりに動作しているようだった。
http://swdyh.infogami.com/autopagerizeの定義情報を取得してスクリプトを生成できるようにしようかと思ったが、面倒なんでやめた。
定義情報に書いてあるURLパターンがSeaHorseのincludeに互換性があるかどうか怪しいし。
投稿ファイル名: AutoPagerizer.zip
http://lukewarm.s151.xrea.com/b/file/1163165308_49.zip
サイズ: 16650 bytes
- 50 :l ★:2007/06/02(土) 12:03:40 ID:???
- >>49修正
なぜかwindow.windowとなっていて動作しなくなっている部分があったので直した。
後、XPathで//divのような部分をgetElementyByTagName()に変換する処理を追加してみたが、あまり速くなっていないような気がする。
投稿ファイル名: AutoPagerizer.zip
http://lukewarm.s151.xrea.com/b/file/1163165308_50.zip
サイズ: 16724 bytes
- 51 :l ★:2007/06/02(土) 13:41:00 ID:???
- ・タグ内ではない場所の特定の単語にマッチする正規表現
var re=new RegExp('\\bhref\\b(?=[^>]*(?:<|$))','ig');
document.body.innerHTML=document.body.innerHTML.replace(re,'<span style="background-color:yellow">$&</span>');
こんな感じでやれば、タグ内の文字列に誤爆せずにページ上の単語をハイライト出来るような気がする。
Sleipnirのハイライトより3倍くらい速いような気がするが、何か間違っているような気がしないでもない。
あと、SleipnirがハイライトしたHTMLを見たら、全てのspanタグにid=SleipnirHighlightが付いていて吹いた。
- 52 :l ★:2007/06/02(土) 18:08:49 ID:???
- ・全てのテキストノードに正規表現でハイライトをかける
>>51の方法は、ノードが再生成されるから色々と駄目な気がする。
スクリプトで割り当てたイベントとかがぶっ飛んだり、iframeが再読込されたりとか。
そこで、DOMツリーをたどり、全てのテキストノードに対してハイライト処理を行うというのを考えた。
var code='('+function(){
function hilightChild(doc,node,ptn){
for(var cn=node.firstChild;cn;cn=cn.nextSibling){
switch(cn.nodeType){
case(3):{
var p=0;
var nv=cn.nodeValue;
nv.replace(ptn,function(found){
var offset=arguments[arguments.length-2];
if(p<offset){
node.insertBefore(doc.createTextNode(nv.substring(p,offset)),cn);
}
if(found){
var elem=doc.createElement('span');
elem.innerText=found;
elem.style.backgroundColor='yellow';
node.insertBefore(elem,cn);
}
p=offset+found.length;
});
cn.nodeValue=nv.substr(p);
break;
}case(1):{
arguments.callee(doc,cn,ptn)
break;
}
}
}
}
p=new RegExp('href','ig');
hilightChild(document,document.documentElement,p);
case(3)以降が、各テキストノードに対してハイライト処理を行う部分。
nodeValueに対してString.replace()を適用する。一致箇所が見つかるごとに、第2引数に渡した関数が呼ばれる。
関数の中では、対象ノードの前に前回一致から今回一致までの間のテキストをテキストノードとして挿入し、innerTextにマッチ文字列を入れたspan要素を挿入する。
childNodesをfor(...;i<l;i++)で回していると、要素が増えることによるインデックスの変化が生じてややこしいので、firstChildとnextSiblingでチェックするようにした。
body.innerHTMLの置換に比べるとかなり遅いが、まだSleipnirのハイライトよりは速いような気がする。
- 53 :l ★:2007/06/03(日) 17:39:41 ID:???
- >>52のハイライトだが、textarea内のテキストへの誤爆対策をしていない。
どうなるかと思って試してみたら、普通にテキストエリア内のテキストに背景色が付いた。
このまま投稿してみたらどうなるのだろう。
とりあえず「テスト」をハイライトして試してみる
- 54 :l ★:2007/06/03(日) 17:40:45 ID:???
- どうもならなかった。投稿されるのはtextareaのinnerTextなのだろうか。
- 55 :l ★:2007/06/04(月) 16:20:23 ID:???
- >>52の方法では、複数のキーワードを「|」区切りでまとめて検索してハイライトすることも可能なはずである。
例えば、['Sleipnir','JavaScript']が渡されたら、color['sleipnir']=''#FFFF00';のようにして単語と色を設定しておき、
sleipnir|javascriptを検索して、spanのスタイル設定でelem.style.backgroundColor=color[found.toLowerCase()]とすればいい。
などと言うことをやろうかとおもったが、飽きた。
- 56 :l ★:2007/06/04(月) 20:53:41 ID:???
- はてなダイアリーAutoPager
>>49の奴を応用して作った。
「//div[@class="calendar"][last()]/a[contains(string(text()),"前の")]」のような複雑なXPathもそれなりに動作しているようで何よりだ。
はてなダイアリーのHTMLでは、「class="main"」の要素の下に「class="calendar"」で前後のページへのリンクがあり、その後に「class="day"」で各日付ごとの要素がある。
この各日付ごとの要素を全て抜き出して表示したいが、前回のバージョンでは、最初のノードのHTMLしか表示していなかったので、全てのノードのHTMLを表示するように修正した。
実行には>>50の奴が必要。
投稿ファイル名: HDiaryAutoPager.zip
http://lukewarm.s151.xrea.com/b/file/1163165308_56.zip
サイズ: 1302 bytes
- 57 :l ★:2007/06/04(月) 21:01:43 ID:???
- AutoPagerを有効にしたら、永久にページ末尾にたどり着けなくなった。
- 58 :l ★:2007/06/05(火) 13:46:30 ID:???
- SleipnirScriptの中でsleipnir.Database.Open()したデータベースは、SleipnirScriptが終了しても使える
ぷよラボ(http://www.google.co.jp/notebook/public/10297603972126706440/BDRO8IgoQwtm4pKQi)のどこだったかで知った。
「_window.sleipnir=sleipnir」というようにして他所のオブジェクトにSleipnirScriptの組み込みオブジェクトを追加してやっても、SleipnirScriptが一旦終了してしまうと使えなくなってしまう。
確か、sleipnir.Databaseを追加してやってもダメだった気がする。
スクリプト実行機能側で、実行終了後に毎回オブジェクトを解放しているのだろう。
しかし、「_window.mydatabase=sleipnir.Database.Open('myDatabase')」とした場合、SleipnirScriptが終了していても使える。
メソッドで動的に生成したオブジェクトまでは、いちいち解放してないのだろう。
これで、ブラウザ上のスクリプトなどからもSleipnirのデータベース機能が利用できる。
データベースさえ使えるようになれば、残りの機能はAPIなどで補える。
実行中にSleipnirがハングアップする組み込みスクリプトの問題を回避しつつ、ほぼ全ての機能を利用できそうだ。
ブラウザのJavaScriptは、Sleipnirのプロセス内で実行されているので、オブジェクトをそのまま使えるのは分からなくもない。
では、wscript.exeなどの別プロセスではどうだろうか。以下のようにして試してみた。
try{
var api=sleipnir.API;
api.GetWindowObject(api.GetDocumentID(api.ActiveIndex)).sleipnir_db=sleipnir.Database.Open("ScrapBook");
(new ActiveXObject("WScript.Shell")).Run('cscript "'+sleipnir.ScriptFullName+'"',0);
}catch(e){
basedir=WScript.ScriptFullName.replace(/(\\[^\\]+){3}$/,"\\ScrapBook\\");
eval((new ActiveXObject("Scripting.FileSystemObject")).OpenTextFile(basedir+"lib\\Std.js").ReadAll());
api=new ActiveXObject('Sleipnir.API');
win=api.GetWindowObject(api.GetDocumentID(api.ActiveIndex));
WScript.Sleep(1000);
res=win.sleipnir_db.Query('SELECT count(ID) FROM Pages');
win.alert(res.Current().At(0));
obj=(new ActiveXObject("WScript.Shell")).Exec('ping google.com');
win.alert(obj.StdOut.ReadAll());
}
普通に使えているようである。
これで、WScriptオブジェクトを使ったり、非表示のcscript.exeから起動した非表示のコンソールプログラムの標準入力に書き込んだりすることも可能になりそうだ。(標準出力の方はプロセスが終了するまで読み出せない腐れ仕様なので対策が必要だが)
また、プロセス間で共有できるのだから、勝手に作ったスクリプトコントロールでも利用できるに違いない。
・Webページのイベントやタイマーに割り当てられて
・JavaScript無効でも動作して
・Sleipnirのデータベース機能を利用でき
・実行中にSleipnirがハングアップしたりせず
・クロスドメイン制限のないXMLHTTPRequestやADODB.Streamなども使え
・外部プロセスを呼び出したりしない
というようなスクリプト実行も可能だろう。
以前頑張って作ったsqlite3.exeを使ったデータベース読み書きモジュールが無駄になってしまったが、まあいいか。
- 59 :l ★:2007/06/07(木) 22:22:58 ID:???
- AutoPagerの奴更新
なぜか継ぎ足した部分のHTMLが崩れると思ったら、抜き出した要素そのものではなくinnerHTMLを挿入していたのが悪かった。
outerHTMLにしたら直った気がする。
XPathライブラリは、いくつかの未実装箇所を適当に実装した。
ノードの重複除去とソートは、Step()でNodeSetに追加していくところで行うことに。
上手く重複を防止する方法が思いつかなかったので、既存の項目と一つずつ照らし合わせて、既に登録されていたら登録しないという安直な処理になった。
重複が起こりえない箇所ではチェックを省き、ある程度は効率化したつもり。
だいぶまともになったが、「|」演算子によるノード集合の結合が適当なままだ。
重複の除去は出来無くないが、どうやってノードをソートしたものか。
HTMLのエレメントならsourceIndexを比較すればいいのだが。
その他、preceding基準点とfollowing基準点を実装したり、不具合を直したりした。
あと、HTTPライブラリの文字コード判別がおかしかったのを修正。
投稿ファイル名: AutoPagerizer.zip
http://lukewarm.s151.xrea.com/b/file/1163165308_59.zip
サイズ: 18892 bytes
- 60 :l ★:2007/06/09(土) 11:51:39 ID:???
- sleipnirオブジェクトもSleipnirScriptが終了しても普通に使える
らしい(http://d.hatena.ne.jp/Puyo2/20070608/p1)
以下のスクリプトをUserActionで試してみたところ
code='('+(function(){
window.mainfunc=function(){
sleipnir.Echo('main');
}
window.attachEvent('onunload',function(){
sleipnir.Echo('unload');
});
window.setTimeout('window.mainfunc()',1000);
})+')();';
sc=new ActiveXObject('MSScriptControl.ScriptControl.1');
(_window.__ScriptControls__||(_window.__ScriptControls__=new Array)).push(sc);
with(sc){
Language='JScript';
AddObject('window',_window);
AddObject('document',_document);
AddObject('sleipnir',sleipnir);
Eval(code);
}
sleipnir.Echo('Exit from SleipnirScript');
確かにsetTimeoutでもイベントでも普通に動作した。
なんで以前試したときうまく行かなかったのか謎だが、とりあえず今は動いているから構うまい。
このようにしてwindowにスクリプトコントロールを付けていると、ページに仕込まれたJavaScriptからスクリプトコントロールのEvalで好き放題やられる恐れがある。
ページのJavaScriptをONにすることなんて滅多にないので別にどうでもいいが、何とか対策をしたいところ。
Eval('var sc=window.__ScriptControls__.pop();window.attachEvent("onunload",function(){sc=null;});'+code);
という風に改変してやれば、Evalされるコードとそこで作られた関数からしか見えない変数になり、ページ上のJavaScriptからは参照できなくなるような気がする。
関数がwindowのイベントにアタッチされて生存している間は、そこから参照可能なオブジェクトも生き延びるはず。
試してみたところ、動作しているような気がする。
スクリプトコントロールが正しく解放されているのかは、
window.mainfunc=function(){
ex=(new ActiveXObject("WScript.Shell")).Exec('cmd');
}
としてやれば試せるはず。
こうして生成されたWshScriptExecオブジェクトは、解放されるときに子プロセスを終了する。
実行してみたところ、確かに1秒後にコマンドプロンプトが表示され、ウィンドが閉じられるのに連動して終了した。
なお、sc=nullの部分を削除したら、正しく解放されなくなった。
どこから参照されているのかよく分からんが、恐ろしや。
そんなわけで、とりあえずwindowに安全にスクリプトコントロールを付加してイベントなどからsleipnirオブジェクトの全機能を利用することは出来そうである。
しかし、この方法では、ウィンドウが閉じられたときにスクリプトコントロールが使えなくなってしまう気がする。
非表示で起動したcscript.exeに受け渡すことは出来るだろうか。
- 61 :l ★:2007/06/09(土) 12:15:09 ID:???
- cscript.exeにsleipnirオブジェクトを渡すこともできた
アクティブなページのwindow経由で普通に渡せた。
try{
var api=sleipnir.API;
api.GetWindowObject(api.GetDocumentID(api.ActiveIndex)).sleipnir=sleipnir;
(new ActiveXObject("WScript.Shell")).Run('cscript "'+sleipnir.ScriptFullName+'"',0);
sleipnir.Echo('Exit from SleipnirScript');
}catch(e){
api=new ActiveXObject('Sleipnir.API');
sleipnir=api.GetWindowObject(api.GetDocumentID(api.ActiveIndex)).sleipnir;
sleipnir.Echo('this is '+WScript.Name);
sleipnir.Echo(sleipnir.Database.Open("ScrapBook").Query('SELECT count(ID) FROM Pages').Current().At(0));
obj=(new ActiveXObject("WScript.Shell")).Exec('ping google.com');
sleipnir.Echo(obj.StdOut.ReadAll());
}
Sleipnir.APIが使えない環境でもどうにかしたいところ。
http://www.vector.co.jp/soft/winnt/prog/se430605.htmlによると、InternetExplorer.Applicationを経由して受け渡せばいいらしいが、起動に時間がかかりそうで鬱陶しい。
まあ、代替手段だし別にいいか。
- 62 :l ★:2008/01/30(水) 03:51:55 ID:???
- Googleの検索結果から要らないページを消し去るユーザースクリプト
オンラインRSSリーダーとか、ソーシャルブックマークとか、書籍の目次とか、Googleの検索結果には見ても時間が無駄になるだけのゴミ検索結果が多すぎる。
例えば、PHPでMySQLを使ってどうのこうのする方法を知りたくて「PHP MySQL どうのこうの」と検索したとして、
「PHPの文字コード」「MySQLのチューンナップ」「C#でどうのこうのする方法」というページが登録されているだけのソーシャルブックマークやRSSリーダーのページが見つかっても何の役にも立たない。
「PHPでMySQLをどうのこうのする方法」というページへリンクしているだけのブックマーク情報ページも要らない。元のページだけ見つかれば十分だ。
また、「PHPでMySQLをどうのこうの」という内容を含んでいるらしい本の目次が載ったオンライン書籍通販サイトのページも、見つけたところで探している知識を得られるわけではないのでゴミ同然だ。
SeaHorseスクリプトでこれらのゴミサイトへのリンクを一掃してやる。
ゴミサイトのドメインを配列で用意しておき、連結して正規表現オブジェクトを作り、document.linksからhrefがマッチするリンクを探し、しかるべき加工をする。
消し去られたことすら分からないくらい跡形もなく消し去ってしまうと、書籍の評判を検索したいときとかに不便かも知れないので、
リンクだけは文字サイズを小さくして残し、残りの情報部分はリンクのツールチップに書き込んで消すことにした。
検索結果のページから消したいサイトの登録を行えるようにしようかと思ったが、検索結果を表示する度にリストを読み込むのは無駄だし、作るのが面倒だったのでやめた。
だが、ルール部分をスクリプトに埋め込んでしまうと、しょっちゅう編集するのは面倒くさい。
そこで、あらかじめそれっぽいサイトを一通り登録しておくことに。
少し検索するだけで、20以上のサイトが集まってしまった。ゴミページばかり増やしやがって。
投稿ファイル名: GoogleKillUselessSite.user.zip
http://lukewarm.s151.xrea.com/b/file/1163165308_62.zip
サイズ: 774 bytes
57KB
0ch BBS 2005-10-08