/ 最近 .rdf 追記 編集 設定 本棚

脳log[20080820] SHJS-0.5 がリリースされてた。(2008-08-18)



2008年08月20日 (水) [Firefox] CSSの contentで追加した文字はコピペできない。アイタタタ

[SHJS] SHJS-0.5 がリリースされてた。(2008-08-18)

  • SHJS can now automatically load language script files (feature request #2007022 - thanks to Michal Nazarewicz and Eugene Marcotte).
  • Highlighting of C/C++ and JavaScript has been improved.
  • A new language file for Oracle SQL has been added (thanks to Mike Breeze).
  • Case-insensitive regular expressions are now handled more efficiently.
  • SHJS now treats <br> tags as line terminators in input (bug #2054144 - thanks to Altforweilerer).
  • Compressed .min.js files are now generated with YUI Compressor.

 メモ

  • languageファイルの自動読み込みは Msxml2.XMLHTTPか XMLHttpRequestを利用する。

    <script>タグを挿入するのかも*と思っていたが今風のやり方だった。(SourceForgeの Feature Requestsで両派の議論があったようで、0.5では Asynchronous XMLHttpRequestを採用したけど将来かわるかもー、だって)

  • lang/sh_javascript.jsの全変更点(多分)は

    • import, package, prototypeキーワードのハイライトがなくなった。
    • 正規表現リテラルのハイライトルールが追加された。
    • class, interfaceのハイライトルールがなくなった。
    • $を含む関数名に対応した。
    • /**コメント*/ と /*コメント*/ のネストに対応しなくなった。

    新たに対応したものも対応が外れたものもあるが、どちらも JavaScriptの仕様に近づくための変更という点は共通。

    それでもやっぱり Javaっぽいのは、java.langまるごとインクルードだった前バージョンの source-highlight-lang/javascript.langが、java.langの中身をベースに足し引きしたものに変わったに過ぎないから。

  • 「大文字小文字を無視する正規表現を効率的に」っていうのは lang/sh_sql.jsを見るにこういうこと。

    /[Vv][Aa][Rr][Cc][Hh][Aa][Rr]/ // ver. 0.4.2
    /VARCHAR/i                     // ver. 0.5

    ……。

  • YUI Compressorはローカル変数名を縮めることで JSMin以上の圧縮を図る。

    他にも、obj["prop"]を obj.propに(可能なら)したり、連結されるリテラル文字列を予め一つにしたり、オブジェクトノーテイション(って言うの?)のプロパティ名部分の引用符を取り除いたり({"p1":v1, "p2":v2} -> {p1:v1, p2:v2})、するらしい。

    おれは JSMinでアグレッシブ(level 3 of 3)に最小化する(と、不要な空白と全ての改行が取り除かれるので、セミコロンインサーションの余地がなくなって、一つのセミコロンも省略できなくなる)のが好きなんだけど。何より Javaの実行環境がないから、YUI Compressorは動かない……。

 SHJSについて (勝手に宣伝)

  •  JavaScriptで実装されています

    ブラウザ(クライアントサイド)で実行されるのでサーバーの負荷が増えません。

  •  ダウンロード量は最小限に保たれます

    メインスクリプト(最小化されたものが数KB)は必須ですが各言語ファイルはオプションです。名前も知らない言語の定義ファイルまでブラウザにダウンロードしてもらう必要はありません。

  •  ハイライト対象の言語名の指定が必須です

    自動認識のような不確かなものに頼りません。(自分の書いているものが何語なのか知らない人は少ないでしょう。あえて情報を削ってスクリプトの仕事を増やす必要はありません)

  •  言語の定義はなんでもありです

    言語ファイルは、状態オブジェクトの配列です。各状態は正規表現のパターンを一つ以上持ち、マッチしたパターンにより配色と遷移先を決定します。状態が増えるのをいとわなければ何でもできます

    ダブルクォーテーション文字列や数字や URLなどにマッチする正規表現を並べて順番にマッチングさせるだけのハイライターより一段上のパターン認識が可能です。(有名どころの SyntaxHighlighter 2.0は XRegExpというライブラリを使用していて、これが Perl5や鬼車や .NET並の正規表現を JavaScriptでも使用可能にしています。これも一歩踏み出す一つの方法ですが、ほとんど XMLのハイライトでしか使われてないようにも見えるのがもったいない)

 この日記で使っているお手製の SHJS言語ファイル(Rubyと JavaScript)*4

JavaScriptの方は letみたいな新しいキーワードには対応していないが、JScript5.5(ECMAScript3)に準拠したスクリプトのハイライトに可能な限り対応している。Javaもどきの実装とは全然違います。

Rubyの方もがんばったけど、こちらは正規表現による字句解析レベルでは判断の付かない要素が多くて、例えば

  str1 = % hoge ; #=> "hoge"
  str2 = "%04d-%02d-%02d" % [2008, 8, 20] #=> "2008-08-20"

% をメソッドと判断する(下段)か %!string! とする(上段)かは文脈がないと決められない。現在は後者が誤って %!string! と判断されている(%!string!記法の区切り文字としてスペースを認めなければ、より多くのケースで妥当な表示が得られるのはわかっているが……)。また、改行を含む %!string! リテラルにも対応していない(はてなはこれができる。悔しい)が、かっこを使った %記法( %[string]など )では改行を含むことができる。

既知の不具合はこれだけ。(知らないだけ)

* その場合スクリプトが実行されないことがあったような……(検索結果>http://la.ma.la/blog/diary_200612061928.htm ) と思ったが、IEで innerHTMLを使った場合の話だった。とはいえ、DOMで <script>エレメントを作成することは可能で、実行もされるというのだろうか?

 厳密ではない。感覚的な言葉。

 この文では普通の正規表現以上の表現力(例えばかっこの対応を調べられる)があるのを説明できていないような。(ある状態から別の状態へ移動するだけでなく後戻りすることもできるから、というのでは説明になっているだろうか?

*4 2008年12月にリリースされた shjs-0.6でフォーマットが変更になったので shjs-0.5用。