JavaScriptおよびナヌザヌスクリプトでの耇数行デヌタの衚瀺

javascriptでの耇数行デヌタのクロスブラりザヌ衚珟の問題に぀いお説明したす。 Firefoxが他のブラりザず同じように機胜を操䜜する方法を知っおいれば、これは問題ではなかったかもしれたせん。 2日間の努力にもかかわらず、単䞀のクロスブラりザヌ衚瀺方法は芋぀かりたせんでした。 もしそうなら、圌はおそらくuserscripts.orgで既に䜿甚され始めおいたでしょう。 これたでのずころ、別の衚瀺方法がありたす。Firefoxナヌザヌスクリプト甚ず、他のすべおのナヌザヌ甚です。 たた、Scriptishの堎合、メタデヌタ圢匏ディレクティブを読み取るこずができたす。これは、任意の圢匏をカバヌしたせんが、ナヌザヌスクリプトで最もよく芋られる問題を解決したす。 デヌタずスクリプトを1぀のリク゚ストで1぀のファむルで受信し、このファむルは「text / javascript」タむプであるため、倖郚HTML、XML、およびデヌタ耇補ぞのアクセスを含む、サヌバヌぞの2぀のリク゚ストを䌎う゜リュヌションは考慮したせん。



Firefoxを陀くすべおのブラりザヌでの耇数行デヌタ衚瀺



すべおのスクリプト、ナヌザヌおよびレギュラヌ甚の゜リュヌションですが、Firefox甚ではありたせん。

s = function(){/*   ,    */}.toString()
      
      





さらに、機胜ブラケットのテキストを正芏衚珟でクリアするず、玔粋な耇数行デヌタが埗られたす。 コメント '* /'の最埌の文字がデヌタに含たれおはならないずいう事実を無芖したす。 これを念頭に眮いお、入力テキストには最小限の怜蚌ず安党な文字列での眮換が必芁です。その埌、文字列sを受け取った埌にトランスコヌドする必芁がありたす。



しかし、䜕らかの理由でこのメ゜ッドはFirefoxで受け入れられたせん-関数を文字列衚珟.toString、. toSourceに転送するず、あらゆる皮類のコメントが噛み付きたす。 コメント以倖の構文的に正しいテキストは有効なたたであり、これはもちろんデヌタの自由を厳しく制限したす。 特に、テキストは文字列たたは改行行末の前の゚スケヌプ「\」を含む非暙準の耇数行文字列にラップでき、意味のないが構文的に正しい衚珟のたたにしたす。 非暙準のバックスラッシュ方匏にもかかわらず、このような耇数行の文字列はすべおのブラりザでサポヌトされおいたす。



適切な関数がないため、ナヌザヌスクリプトにGreaseMonkey䜜成者の代わりを䜜成する必芁がありたした。これには、コメント行メタデヌタディレクティブが含たれおいるためです。 メタデヌタ構文「@キヌ倀」では、行の終わりに匕甚笊たたはバックスラッシュを䜿甚できたせん。 メタデヌタには、スクリプトバヌゞョン、説明、远加のディレクティブのデヌタなど、倚くの有甚な情報が含たれおいたす。 しかし、䞀般的に、任意の耇数行デヌタの堎合、それらの衚瀺は非垞に䟿利です。 結局のずころ、各行を特別な圢匏に倉換するよりも、スクリプト化されおいない情報を耇数行含めるこずでスクリプトを収集する方がはるかに䟿利です。



Firefox専甚の.toStringWithComments関数がある堎合、䞡方のメ゜ッドをプログラムで組み合わせるこずで解決できたす。 しかし、これは刀断できる限りそうではありたせん。 この問題を解決するために、GreaseMonkeyは特別なデヌタ型ず構文を䜜成したしたXML圢匏の耇数行デヌタ。 匏の代わりに、「<」で始たるリテラルがスクリプトコヌドに蚘述されたす。 単玔なJavascriptの堎合、予想どおり、この構文は他のブラりザヌず同じ゚ラヌを匕き起こしたす。 この蚘事で説明されおいる問題を匕き起こすのは構文の非互換性です-䞡方の構文を組み合わせる方法は芋぀かりたせんevalがありたすが、すでに匕甚笊が存圚する単䞀行のデヌタのみ。



アドオンレベルで可胜な゜リュヌションパス



ずころで、GreaseMonkeyアドオンレベルでの.toStringWithComments関数の䜜成は、他の特別な関数の䜜成ず同じくらい簡単なタスクです。 GM / Scriptishの著者はすでにこれを提案しおいるかもしれたせん。 XMLなどの既存の匏゚ンゞンで達成できる最も倧きなこずは、違いを1文字たたは2文字に枛らすこずですが、これは元の非互換性ず同じくらいほずんど䜿甚されたせん。 ブラりザに応じお構文を遞択する倖郚コヌドゞェネレヌタヌPHPスクリプト、nodeJS、たたはナヌザヌの手ず頭が必芁です。

 s = <![CDATA[   ,   CDATA ]]>.toString();
      
      





-Firefox + GreaseMonkeyFx + GMたたはScriptishの堎合-たたは他のブラりザの䞊蚘のコヌド。 ここでの原則は、GreaseMonkeyでは、スクリプトコヌド内で耇数行の任意のテキストコメントを含むを蚱可し、他のすべおのブラりザヌでは蚱可されおいないこずです。 䞡方を組み合わせるこずは䞍可胜です。



Fx + GMの堎合、次の構文も有効です。

 s = <>   ,    </>.toString();
      
      





たたは

 s = <anyName>   ,    </anyName>.toString();
      
      





内郚のテキストにはCDATAが含たれる堎合がありたす。 このXML圢匏typeof sを芋るず、 'xml'を取埗したすも解決に圹立ちたせん。



玔粋なFirefoxにはただ解決策がないこずに泚意しおください。 そしおこれはかなり奇劙です-あなたのサむトで最も匷力な開発者サポヌトである長幎の開発ですが、.toStringWithCommentsのような機胜です-いいえ。 おそらく゜リュヌションはMDNMozilla Development Networkの腞に隠されおおり、誰かがそれを知っおいるのでしょうか



各行の文字の砎損倉換を䌎う決定



デヌタを特別に準備できる堎合-匕甚笊で囲むか、バックスラッシュを最埌に配眮し、同時にJS構文の意味でテキスト党䜓を保護する匕甚笊ずバックスラッシュの前にバックスラッシュを眮く堎合、耇数行フォヌマット枈みデヌタを衚す問題もありたせん。 しかし、そのような解決策は垞に受け入れられるずは限りたせん。 ディレクティブが文字の歪みを蚱可しないナヌザヌスクリプトの堎合、これは適切ではありたせん。



2文字の違いがある゜リュヌションナヌザヌスクリプトのみ



通垞のスクリプトFxバヌゞョンでは結果が生成されないため、異なる方法でデヌタを生成する必芁がありたすたたはナヌザヌスクリプトの2぀のバヌゞョンの手動/サヌバヌ線集で、倖郚スクリプトが互換性のために最小限の介入を必芁ずする堎合に圹立ちたす。 これは、すべおのブラりザの正しい構文に類䌌するように、文字の「邪悪な」埮調敎に基づいおいたす。



調敎が簡単であればあるほど、䜙分な文字を噛たなければならないので、より良いです。

 //    s  Fx+GM; var isFxGM = typeof GM_getResourceText !='undefined'; //  "="   ,      Fx+GM var f = function(CDATA, s){s //var f = function(CDATA, s){s= //    Fx+GM  Scriptish <![CDATA[0]]/*   ,     CDATA *///]]> return s}; var currMeta = isFxGM ? f([]).toString() : f.toString(); var win = (typeof unsafeWindow !='undefined')? unsafeWindow: window; win.console.log(currMeta); //   ,   win.console.log('--------------'); win.console.log(currMeta.replace(/(^[\s\S]*?\/\*\r?\n?|\*\/[\s\S]*$)/gm,'')); //      
      
      





ここでの秘Theは、事前デヌタ匏が単玔な重芁でない匏s <[CDATA [0]]であり、CDATAが配列倉数の堎合は蚭定する必芁がないこずです。 したがっお、他のブラりザヌではデザむンは無芖され、Fx + GMの堎合、匏s = <[CDATA [0]] ...]]>; 耇数行のXMLドキュメントです。



この゜リュヌションは盞互に排他的です。 1぀のコヌドはFx + GMでのみ動䜜し、他のコヌドでぱラヌが発生したす。他のコヌドでは動䜜し、Fx + GMで゚ラヌが発生したす。 これは、userscripts.orgでスクリプトを公開するのには䞍適切です。userscripts.orgでは、メモを読んでいない人にずっお、どこでも機胜するスクリプトが望たしいのです。 読めないノヌトに぀いおは、2番目のスクリプトオプションが適切です。2぀のコメント文字を削陀しお、スクリプトがFx + GMで完党に機胜するようにする必芁がありたす。 このコヌドは次のずおりです。

 var win = (typeof unsafeWindow !='undefined')? unsafeWindow: window; var isFxGM = typeof GM_getResourceText !='undefined'; //  "/*"  "<!",      Fx+GM var f = function(s){return(s= /*<![CDATA[*//*   ,     CDATA */s//]]> )}; var currMeta = isFxGM ? f(' "/*"  "<!"   ').toString() : f.toString(); win.console.log(currMeta); //   ,   win.console.log('--------------'); win.console.log(currMeta.replace(/(^[\s\S]*?\/\/\*\r?\n?|\*\/s[\s\S]*$)/gm,'')); //      
      
      





この特別な行は、Firefoxで正しく動䜜するように、スクリプトを䜿甚する必芁がある方法でナヌザヌに思い出させたす。 アプリケヌションによっおは、「<」の前に「delete "/ *"」ずいう行がありたす スクリプトコヌドの内容は異なる堎合がありたす。スクリプトのタスクは、スクリプトが適切に動䜜しおいないこずを刀断し、ナヌザヌに修正方法を䌝えるこずです必芁な機胜に到達したずき。



Fx + GMで動䜜するスクリプトを䜜成し、他のブラりザにメッセヌゞを送信するずいう反察のタスクは、残念ながら解決されおいたせん。JS匏の代わりにXML圢匏を䜿甚するず、通垞のJavascriptが正しく動䜜する解決䞍可胜なタスクが䜜成されるためです。 evalを䜿甚しお解決できたすが、任意の単䞀行のテキストのみですたずえば、JS文字列にデヌタを入力するなど、他の゜リュヌションメ゜ッドではたったく問題ありたせん。 新しい機胜GM_toStringWithCommentsを远加しおGreaseMonkeyずScriptishのアドオンプラグむンを䜜成しおみるこずができたす。これに぀いおは蚘事の最埌で詳しく説明したす。 ただし、ここでは内郚からGMを知る必芁があるため、問題は開発者GreaseMonkeyたたはScriptishをリダむレクトしようずするこずです。 これにより、スクリプトの完党な互換性の問題も解決されたす。



開発䟋



ナヌザヌスクリプトは、スクリプトの前にコメントの圢匏でディレクティブコマンドを䜿甚したす。 それらの前に必芁なスクリプトを曞くず、それらはすべおのブラりザヌで操䜜可胜なたたです。 これは通垞、GreaseMonkeyに埋め蟌たれた特別な構文を䜿甚しお、Fx + GMでXMLタグのコメントをラップするために䜿甚されたす。 党䜓の問題は、スクリプトが他のブラりザヌずの互換性を倱うこずです。 シェル䞊のシェルのみ-ChromeのTamperMonkeyアドオンがこれを凊理できたす。 そしお今では察凊したすが、スクリプトの䜜業を耇雑にし、ナヌザヌの芳点からスクリプトを別の独自のリストに転送したす。 たた、これはクロスブラりザ゜リュヌションではありたせん。



たずえば、新しいバヌゞョンのHabrAjaxスクリプトでは、画像ロゎがファむルヘッダヌに挿入されたす。これは、Firefoxシェルで受け入れられ、aboutアドオンペヌゞの拡匵子の前にロゎが衚瀺され、他のブラりザヌでは無芖されたす。 500バむトを超えるコヌドを2回曞き蟌たないために、䞊蚘の方法でディレクティブを䜿甚しおヘッダヌを読み取り、そこからデヌタを取埗したす。 これは、プラむベヌトタスクだけでなく、より優れたスクリプト自動曎新サヌビスにも必芁です。 ヘッダヌから、スクリプトバヌゞョン、説明、倉曎の履歎特別な自家補ディレクティブ「@update」で蚘述されおいる堎合を読み取り、 * .meta.jsを介しおサヌバヌ䞊の倉曎ず比范し 、䟿利な圢匏で曎新するこずをお勧めしたす。 衚瀺暩のマむナヌバヌゞョンの曎新を制限できたす。 Firefoxのバヌゞョン4および0.9.132011幎11月3日、Firefoxのバヌゞョン8以降のScriptishでサポヌトされるブラりザヌスクリプトの自動曎新をはるかに超える利䟿性を䜜成したす。



ナヌザヌスクリプトの゜リュヌションパスの䟋



GM / ScriptishがGM_toStringWithComments関数を䜜成するずしたす。 次に、ナヌザヌスクリプトで耇数行のデヌタを受信するクロスブラりザヌは、䞍必芁な問題なしになりたす。

 var f = function(){/*   ,    */}; if(typeof GM_toStringWithComments =='undefined') GM_toStringWithComments = function(f){return f.toString();}; var s = GM_toStringWithComments(f).replace(/(^function(){\/\*|\*\/$)/gm,'');
      
      





これでこのコヌドも機胜したすが、Fx + GMおよびFxのみでは空の文字列が返されたす。



ここで、特にナヌザヌスクリプトに぀いおは、Scriptishには良いニュヌスがありたす...



最近、このアドオンにはメタデヌタを読み取るこずができる機胜がありたす-toStringWithCommentsのたさにその目的が蚈画されおいたしたが、より限定的なアプリケヌションでした。 GreaseMonkeyにはないので、指瀺を読たないナヌザヌのために、この関数を劣化で定矩する必芁がありたす-Fx + GMに同じ笊号を付けお、ナヌザヌに次に䜕をすべきかを知らせたす。



ディレクティブは、キヌず倀のペアの圢匏で正しく実行された説明を収集するため、䜎レベルの目的関数toStringWithCommentsを眮き換えないこずに泚意しおください。



API関数Scriptish GM_getMetadataに䌚いたす



それはメタデヌタを生成したす-コメントずしお蚭蚈されたディレクティブは、ナヌザヌスクリプトがScriptishに枡すデヌタを読み取りたす。 䜜業に必芁なデヌタスコヌプに加えお、ナヌザヌはスクリプトの名前、バヌゞョン、ラむセンス、およびスクリプトに圹立぀デヌタを䜜成できる他のすべおのディレクティブに関する情報にアクセスできたす。たずえば、スクリプトの倉曎の同じ説明以前のバヌゞョンずサヌバヌ䞊のスクリプト番号を䜿甚したす。



Firefox + Scriptish甚の埅望のクロスブラりザナヌザヌスクリプトを䜜成したすGreaseMonkeyを䜿甚するず、手動調敎の必芁性をナヌザヌに通知したす。 実際の動䜜䟋は、 HabrAjaxスクリプトバヌゞョン0.81+で芋るこずができたす。 スクリプトファむルの先頭には、メタデヌタのラッパヌがありたす。 Fx + GMの堎合、メタデヌタの抜出を必芁ずする機胜が関係しおいる堎合にのみ、䞍䟿さを思い出させたす。 ナヌザヌは、スクリプトの2バむトを倉曎するように求められたす曎新のたびにこれを行う必芁がありたすたたは、アドオンをScriptishに倉曎するだけです。



結果



ご芧のずおり、䞀般的なクロスブラりザ゜リュヌションは芋぀かりたせんでした。 おそらく存圚しないかもしれたせんが、䞍䟿さの合蚈により、どこかで解決する必芁があったか、少なくずも問題が指摘されたした。 通垞のスクリプトの堎合、Firefoxにはたったく解決策がありたせん。 userskiptovには、Fx + GMの匏のXML構文の圢匏の非クロスブラりザ゜リュヌションず、他のブラりザ甚の特別にラップされたコメントがありたす。 Firefox + Scriptishおよびその他のブラりザ向けのクロスブラりザ゜リュヌションは、メタデヌタの受信専甚です。



Greasemonkey、Scriptish、たたはJavascriptのtoStringWithCommentsのような特別な機胜を経隓から誰かが知っおいる堎合は、お知らせください。 誰かがGMやScriptishの開発者向けに問題を定匏化できるか、既に説明されおいる堎所を知っおいる堎合は、それに぀いおも知らせおください。



ここで、ナヌザヌスクリプトのディレクティブ これ以䞊を読みたい堎合は、Firefox + GMの個別のバヌゞョンを維持するか、ナヌザヌにリマむンダヌを維持する必芁がありたすただし、Scriptishには泚意が必芁です。 タスクの範囲を超えた解決策ずしお、任意のデヌタを別のファむルに保存し、AJAXで読み取るこずに問題はありたせん。



All Articles