# $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!(/>/, ">")
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>/,"")
""
}
code.gsub!(/((#)$|(#[^[{].+))/){
key = $1.gsub(//,"").gsub(/<\/em>/,"")
""
}
# 後始末
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"
}
when :AFTER_ONEDAY
str.gsub!(/(.*)<\/code>/mi){
code = $1
code.gsub!(/^\t/,"")
"#{code}"
}
end
end
end