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

log[20080101] SHJSRubyールを修正(sh_ruby.js, sh_ruby.min.js)



20080101() Application Dataなんてフォルダを掘って一人で中に収まってる Operaは恥を知れ (Vistaでの)

[SHJS][Ruby][tDiary] SHJSRubyールを修正(sh_ruby.js, sh_ruby.min.js)

以下変更点のリ(\bの使い方が適当なのでスペースの少ないソースで問題が出る可能性あり\bの使いどころが全然わかってないせ)

    { // part of Kernel methods.
      'regex': /\b(?:defined\?|Array|Floar|Integer|String|abort|callcc|exec|exit!?|fork|proc|lambda|set_trace_func|spawn|syscall|system|trace_var|trap|untrace_var|warn)\b/g,
      'style': 'sh_preproc'
    },

なくてもいいかなと思うけど defined?Kernelモジールのメソドの一部を sh_preprocとして追加Rubysh_preprocなのは requireだけなので sh_preprocの配色を流用した選んだのは abortcallccexitforksystemなど比較的重要そうなもの(loopなど一部の他のメソドは sh_keywordとして既に分類されてい)

    {
      'next': 4,
      'regex': /<(?=[\w\/])/g,
      'style': 'sh_string'
    },

正規表現を /</g から変更<<メソドやヒドキュメ(<<HOGE)にマッチしないように

    { // Symbol
      'regex': /:(?:(?:@@|@|\$)?\w+[\?!]?|\+=?|!=?|~|\*\*=?|-=?|\*=?|\/=?|%=?|<<=?|>>=?|&=?|\|=?|^=?|>=?|<=?|<=>|===?|=~|!~|&&=?|\|\|=?|\.\.|\.\.\.|=)(?=\s|$)/g,
      'style': 'sh_string'
    },

新ルールシンボル(:hoge)sh_stringとして色付

    { // %!string!
      'regex': /%[Qq]?([!-'*-\/:;=?^]).*?\1/g,
      'style': 'sh_string'
    },

新ルール%!string!%Q!string!%q!string!sh_stringとして色付残念ながら %Q[]のように括弧を使ったものは入れ子になった括弧を数えられないので非対応対応した詳しくは下の方

    {
      'regex': /(?:\b(?:alias|begin|BEGIN|at_exit|break|case|do|else|elsif|end|END|ensure|for|if|in|include|loop|next|raise|redo|rescue|retry|return|super|then|undef|unless|until|when|while|yield|and|not|or|def|class|module|catch|fail|load|throw)\b|&&|\|\|)/g,
      'style': 'sh_keyword'
    },

ここにはプログラムの流れや定義に関するキーワドや Kernelメソドが集められているようなので既に登録されている ENDと同じ働きの at_exitを追加しdefinedを削除(上で sh_preprocとして defined?を登録済み)falsenilselftrue__FILE____LINE__を削除しあとで定数として定義&&||andorに対応するものとして追加

    { // global variables
      'regex': /\$(?:[_&~`'\+\?!@=\/\\,;\.<>\*\$:"]|-?[A-Za-z0-9_]+)/g,
      'style': 'sh_type'
    },

グローバル変数の定義を追加sh_typeはイスタス変数やクラス変数のクラス名として使用されているもの

    { // Constants
      'regex': /\b[A-Z]\w+[!\?]?(?=\b|$)/g,
      'style': 'sh_function'
    },
    { // Constants
      'regex': /\b(?:false|nil(?!\?)|true|self|__FILE__|__LINE__)(?=\b|$)/g,
      'style': 'sh_function'
    },

定数のルールを追加sh_functionRubyでは使われていないクラス

    {
      'regex': /[a-z0-9_]+(?:\?|!)/g,
      'style': 'sh_normal'
    },

正規表現を /[A-Za-z0-9_]+(?:\?|!)/g から変更定数は区別したいじゃない

 余談

    {
      'exit': true,
      'regex': /$/g
    },

文字列リテラルの終了条件に上のは必要ないむしろこれがあることで複数行にまたがったリテラルを正しく認識できないのだけど強力すぎる正規表現は誤認識があったときにソースを最後まで一色に染めてしまう危険性があるのでそのままにしているドキュメトに対応しないのも同じ理由

 追記@2008-01-02括弧を使ったリテラルにも対応した

    { // %r(regexp)
      'next': 6,
      'regex': /%r[\(<\[\{]/g,
      'style': 'sh_regexp'
    },
    { // %x(command), %w(array)
      'next': 7,
      'regex': /%[xWw][\(<\[\{]/g,
      'style': 'sh_normal'
    },
    { // %(string)
      'next': 8,
      'regex': /%[Qq]?[\(<\[\{]/g,
      'style': 'sh_string'
    },
  [
    {
      'exit': true,
      'regex': /$/g
    },
    {
      'next': 6,
      'regex': /[\(<\[\{]/g,
      'style': 'sh_regexp'
    },
    {
      'exit': true,
      'regex': /[)>\]}]/g
    }
  ],
  [
    {
      'exit': true,
      'regex': /$/g
    },
    {
      'next': 7,
      'regex': /[\(<\[\{]/g,
      'style': 'sh_normal'
    },
    {
      'exit': true,
      'regex': /[)>\]}]/g
    }
  ],
  [
    {
      'exit': true,
      'regex': /$/g
    },
    {
      'next': 8,
      'regex': /[\(<\[\{]/g,
      'style': 'sh_string'
    },
    {
      'exit': true,
      'regex': /[)>\]}]/g
    }
  ],

括弧の対応をチックすることはするけどカッコの種類を区別しないので

%(foo{bar)baz}

こんなのも通る。でも現実的には区別する必要ないよねHTML断片を組み立てるときに問題がありそうそしてそういうときにこそダブルクーテーションを使わずに %[]を使うんだよね試してみる

html << %[<option value="#{h hoge}"] << (selected? ? ' selected="selected">' : '>') << h(hoge) << "</option>\n";

っぱりダメだ〜

 追記@2008-01-02括弧を使ったリテラルに正式に対応した

上で出し「こんなのも通る」と「やっぱりダメだ〜の例が言葉とは裏腹「通ってない」と「ちゃんとできてる状態になってると思うだとしたら成功

変更点は20080102p01

 追記@2008-01-05#コメトと #{interpolation}の順番を入れ替え

# for variable interpolation, #{ is not a comment

というコメトを付けて #{}のハイラトルールを定義しているにも関わらずそれが #コメトルール よりも後ろにあるために機能していなかった#コメトルールを後ろに持ってきて解決

続きは20080105p01

See also...

listed by...