/* Opelish ( Stylish on Opera ) OpelishはFirefox用の拡張であるStylishの設定ファイルから CSSを抽出してOperaで使えるようにスクリプトです。 var 2007/10/15 : 2バイト文字対策も含め、全てのCSSをCSSファイルとして出力するようにした。 : Proxomitronで保存するとフィルタ以外の文字が消えるので #Opelish ~~~ # /Opelish で区切らないようした。 var 2007/10/9 : フィルタの文字数制限対策のため、8KBを超えたCSSはCSSファイルとして出力するようにした。 ver 2007/9/22 : Proxomitron用に特化 var 2007/6/** : テスト版 ## UserScriptとして出力する CSSを1つのUserScriptにまとめることで、各々のページでCSSを適用させます。 メリット : 他に導入するソフトウェアが必要ない。 デメリット : ページの読み込みが完了するまでCSSが適用されない : JavaScriptをOFFにしていると動作しない 実行するとUserScriptフォルダにopelish.user.jsが作成されます。 この状態でOperaでブラウジングすればすぐに適用されます。 ## Proxomitronフィルタとして出力 Proxomitronのフィルタとすることで、各々のページでCSSを適用させます。 メリット : ページを描画する前にCSSを適用できる。 デメリット : Proxomitronを実装しなければいけない。 スクリプトを実行するとdefault.cfgの[Patterns]直下にCSSを記述してdefault.cfgを上書きします。 次回実行時からはCSS部分のみを更新します。 一応実行した日付でdefault.cfgのバックアップを取っています。 ## 使い方 下記設定部にフォルダパス等を入力してから実行してください。 実行する際に書き込む予定のファイルをエディタ等で開いているとエラーが発生するので、 その場合は閉じてからもう一度実行してください。 ## 機知の不具合 高速化のため、一度適用したURLでは再度マッチングを行わない。 : スクリプト側で多重マッチを確認して適用させたい。 */ #NoTrayIcon ;##### 設定 ##### ;output = js ;UserScript output = prox ;Proxomitron ;UserScriptで利用する場合、jspathにはOperaのUserScriptを保存するパスを入れる(最後に\を入れること) jspath = C:\Program Files\Opera\profile\script\ ;Proxomitronで利用する場合、proxpathにはProxomitronのパスを入れる(最後に\を入れること) proxpath = C:\Program Files\Proxomitron\ ;Stylishの設定ファイルのパス rdffile = C:\Documents and Settings\[ユーザ名]\Application Data\Mozilla\Firefox\Profiles\stylish.rdf ;UserJS用 スクリプトのヘッダ scriptHead = ( // ==UserScript== // @name Opelish ver.試作 // @namespace http://bmky.net/ // @include * // ==/UserScript== function addStyle( type, target, style ) { var url = location.href; var host = location.hostname; if( ( type == "url" && url == target ) || ( type == "url-prefix" && url.indexOf( target ) == 0 ) || ( type == "domain" && host.indexOf( target ) == 0 ) || ( type == "*" && target == "*" ) `) { //opera.postError( type, target, style ); var link = document.createElement( "link" ); link.rel = "stylesheet"; link.type = "text/css"; link.href = "data:text/css," + style; document.getElementsByTagName( "head" )[0].appendChild( link ); } } ) jspath = %jspath%opelish.user.js csspath = %proxpath%html\opelish\ cfgpath = %proxpath%default.cfg scriptBody = globalCSS = cssNumber = 0 r_pos = 1 if output = prox { ;cssを保存するフォルダが存在しない場合は作成 IfNotExist, %csspath% FileCreateDir, %csspath% ;存在するなら中のcssを全削除 Else FileDelete, %csspath%\*.css } ;Stylish読み込み FileRead, rdftext, %rdffile% rdftext := RegExReplace( rdftext, "/\*[\s\S]*?\*/", "" ) rdftext := RegExReplace( rdftext, "(\r\n|\r|\n)[ \t]*", "" ) rdftext := RegExReplace( rdftext, "^.*?>", "" ) rdftext := RegExReplace( rdftext, "", "" ) rdftext := RegExReplace( rdftext, "", "" ) rdftext := RegExReplace( rdftext, "", "" ) rdftext := RegExReplace( rdftext, ".*?", "" ) rdftext := RegExReplace( rdftext, ".*?", "" ) rdftext := RegExReplace( rdftext, ".*?", "" ) rdftext := RegExReplace( rdftext, "", "" ) rdftext := RegExReplace( rdftext, ">", ">" ) rdftext := RegExReplace( rdftext, "<", "<" ) rdftext := RegExReplace( rdftext, "[ ]*([{},:<>+])[ ]*", "$1" ) Loop { ptn = ( x) .*?)"> (?P.*?) ) rdf_match := RegExMatch( rdftext, ptn, $, r_pos ) ;マッチしなかったらループを抜ける if rdf_match = 0 break ;次の検索開始位置を設定 StringLen, $len, $ r_pos := rdf_match + $len ptn = stylish:global="(?P.*?)" RegExMatch( $param, ptn, $ ) ptn = stylish:enabled="(?P.*?)" RegExMatch( $param, ptn, $ ) ptn = stylish:description="(?P.*?)" RegExMatch( $param, ptn, $ ) ptn = @namespace[ ]url\(.*?xul\); xul_match := RegExMatch( $code, ptn ) ;無効なCSSなら出力しない if $enabled = false continue ;namespaceにxulが入っていたらFirefox用と判断して出力しない if xul_match != 0 continue ;CSSから余分な記述を取り除く StringReplace, $code, $code, ', ", All $code := RegExReplace( $code, "([{;])-moz.*?:.*?([;}])", "$1$2" ) $code := RegExReplace( $code, "([{;])[a-zA-Z-_]*?:-moz.*?([;}])", "$1$2" ) ;全ページで使用するスタイル if $global = true { $code := RegExReplace( $code, "@namespace url\(.*?\);?", "" ) globalCSS = %globalCSS%%$code% continue } c_pos = 1 Loop { ptn = ( x) @-moz-document[ ] (?P[^{]*?) \{ `(?P (?:[^{]+\{ (?>[^{}]+|\{\})* \})* `)? \} ) fix_match := RegExMatch( $code, ptn, $, c_pos ) ;マッチしなかったらループを抜ける if fix_match = 0 break ;次の検索開始位置を設定 StringLen, $len, $ c_pos := fix_match + $len $document := RegExReplace( $document, ",", "`n" ) Loop, Parse, $document, `n { ptn = ( x) (?Purl|url-prefix|domain) \("?(?P.*?)"?\) ) doc_match := RegExMatch( A_LoopField, ptn, $ ) if doc_match = 0 continue addCSSCode( $csstext, $type, $target, $desc, output, scriptBody ) } } } if output = js { body = %scriptHead%`n%scriptBody% ;各CSSの最後に全体適用のCSSを追加する globalCSS = %globalCSS%' ); body := RegExReplace( body, "' \);", globalCSS ) createNewFile( jspath, body ) } if output = prox { ;各CSSの末尾に全体適用のCSSを追加する if globalCSS != { Loop, %csspath%\*.css FileAppend, `r`n%globalCSS%, %A_LoopFileFullPath% cssname = %cssNumber%.css FileAppend, @charset "UTF-8";`r`n%globalCSS%, %proxpath%html\opelish\%cssname% pattern := createProxFilter( "global", "*", cssname ) scriptBody = %scriptBody%%pattern%`n`n } ;default.cfgを読み込んで、既に存在するOpera用CSSを消去 ptn = ( x) Name\s=\s".*?(?:\r\n|\r|\n) Active.*?(?:\r\n|\r|\n) URL.*?(?:\r\n|\r|\n) Limit.*?(?:\r\n|\r|\n) Match.*?(?:\r\n|\r|\n) Replace.*?(?:\r\n|\r|\n) (?:\r\n|\r|\n)? ) FileRead, defaultcfg, %cfgpath% defaultcfg := RegExReplace( defaultcfg, ptn, "" ) ;新たにOpera用CSSを作成して[Patterns]直下に配置する scriptBody = [Patterns]`r`n%scriptBody%`r`n defaultcfg := RegExReplace( defaultcfg, "\[Patterns\]", scriptBody ) ;せっかくだからバックアップ FileCopy, %cfgpath%, %proxpath%backup%A_YYYY%%A_MM%%A_DD%%A_Hour%%A_Min%%A_Sec%.cfg createNewFile( cfgpath, defaultcfg ) } addCSSCode( code, type, target, desc, output, ByRef scriptBody ) { if output = js { scriptBody = %scriptBody%`naddStyle( '%type%', '%target%', '%code%' ); } else if output = prox { StringReplace, target, target, http://, if type = domain urlmatch = %target% else if type = url urlmatch = %target%(^?) else if type = url-prefix urlmatch = %target%* global cssNumber, proxpath, csspath cssname = %cssNumber%.css cssNumber += 1 pattern := createProxFilter( desc, urlmatch, cssname ) FileAppend, @charset "UTF-8";`r`n%code%, %proxpath%html\opelish\%cssname% scriptBody = %scriptBody%%pattern%`n`n } } createProxFilter( desc, urlmatch, cssname ) { pattern = (LTrim Name = " %desc%" Active = TRUE URL = "%urlmatch%$TYPE(htm)" Limit = 8 Match = "" Replace = "" ) return %pattern% } createNewFile( filepath, text ) { IfExist, %filepath% { ;空にするために削除 FileDelete, %filepath% if ErrorLevel != 0 { MsgBox, can't delete %filepath% return } } FileAppend, %text%, %filepath% }