# $Id: color_code_ruby.rb,v 1.1 2003-07-02 21:59:20+09 waka Exp waka $ # http://www.double-red.net/ =begin color_code_ruby.rb スタイルシートでプログラムソースを色分けする アイデアは、ちはやさん(http://sein.pobox.ne.jp/nowhere/diary/200306a.html#d06_t1) です。 原形をとどめておりません…。 空行ありでも動作するはずです。 =end class Filter def color_code_ruby(str, type) #予約語 色分け時はsyntaxクラスになる。 syntax = %w{ BEGIN END alias and begin break case def defined? do else elsif end ensure for if in module next not or redo rescue retry return super then undef unless until when while yield } #擬似変数 色分け時はvarクラスになる variable = %w{ self true false nil __FILE__ __LINE__ } #強調語 色分け時はemphasisクラスになる emphasis = %w{ require private public include attr_reader attr_writer attr_accessor initialize protected each times } case type when :ONEDAY str.gsub!(/^RubyCode:(.*?)\nCodeRuby:/mi){ code = $1 code.gsub!(/&/, "&") code.gsub!(//, ">") code.gsub!(/(?!\\)(.)(".*?[^\\]")/){ z = $1 key = $2 "#{z}#{key}" } code.gsub!(/(?!\\)('.*?(?!\\)')/, %q{\1}) code.gsub!(/(%[qw]{.*?})/mi, %q{\1}) code.gsub!(/(%[qw]\[.*?\])/mi, %q{\1}) code.gsub!(/(%[qw]\(.*?\))/mi, %q{\1}) code.gsub!(/(%[r]\|.*?\|)/i, %q{\1}) # value class 内の '#' をコメントとして認識させないための小細工 comment_sharp = "s_h_a_r_p" code.gsub!(/(.*)<\/em>/){ key = $1.gsub(/#/,"#{comment_sharp}") "#{key}" } code.gsub!(/(def +)([\w\d_=]+)(\(.*\))?$/){ #メソッド head = $1 key = $2 arg = $3 "#{head}#{key}#{arg}" } code.gsub!(/(@@?[\w\d_]+)([=,. )[]?$?)/){ #インスタンス変数 key = $1 tail = $2 "#{key}#{tail}" } code.gsub!(/(class[ \t]+)([A-Z][\w\d_]+)$/,'\1\2') #クラス名 code.gsub!(/(?!class)([ \t]+[A-Z][\w\d_]+)([. =]?$?)/){ #定数 key = $1 tail = $2 unless key =~ /__$/ then tail = tail unless tail.empty? "#{key}#{tail}" else "#{key} " end } code.gsub!(/^([ \t]*[A-Z][\w\d_]+)([. =]?$?)/){ #定数 key = $1 tail = $2 unless key =~ /__$/ then tail = tail unless tail.empty? "#{key}#{tail}" else "#{key} " end } code.gsub!(/(\$[\w\d]+)[ =]?$?/){ #グローバル変数 key = $1 "#{key}" } #classはhtml中で使われるため別扱いで code.gsub!(/((\b)class(\s))/i, %q{\1}) variable.each do |word| code.gsub!(/((\b)#{word}(\b))/i, %q{\1}) end emphasis.each do |word| code.gsub!(/((\b)#{word}(\b))/i, %q{\1}) end syntax.each do |word| code.gsub!(/(.)?((\b)#{word}(\b))/i){ z = $1 key = $2 unless key =~ /(begin)|(end)/ and z =~ /=/ then "#{z}#{key}" else "#{z}#{key}" end } end code.gsub!(/(^=begin.*?=end$)/mi){ # =begin 〜 =end 用 key = $1.gsub(/^=begin/,"=b_egin").gsub(/=end$/,"=e_nd") key = key.gsub(//,"").gsub(/<\/em>/,"") "#{key}" } code.gsub!(/((#)$|(#[^[{].+))/){ key = $1.gsub(//,"").gsub(/<\/em>/,"") "#{key}" } # 後始末 code.gsub!(/end<\/em><\/em>/, "end") code.gsub!(/=b_egin$/,"=begin") code.gsub!(/=e_nd<\/em>$/,"=end<\/em>") code.gsub!("(?!\")#{comment_sharp}(?!\")",'#') code.gsub!(/^$/," ") "<<\n
\n#{code}
" } when :AFTER_ONEDAY str.gsub!(/(.*)<\/code>/mi){ code = $1 code.gsub!(/^\t/,"") "#{code}" } end end end