=begin
=color-code.rb Ver0.1

スタイルシートでスクリプトを色分けするtDiaryプラグイン

== 作成日
2003/05/25 ver0.1

== 制作者
さこと　sakoto@lapis.plala.or.jp
http://kurage.s12.xrea.com/x/diary/index.rb

== ライセンス
ライセンス、クレジットの改編も含めて自由に改造再配布可

== 内容
プログラムをtDiary内で記述する時に、見栄えを整える。

スクリプトを「""、''、%Q{} 、%W{}で囲まれたもの」「コメント」「予約語」「強調語」の４つの段階でCSSを用いて色分けをする。
Ver0.1では予約語にRubyの予約語が、強調語に作者の好みによる言葉が入っている。

予約語を変えることにより他の言語にも対応できる。
テーマに強調用スタイルシートを加えること。

= 使用法
== 基本的なつかいかた
<%=color_code %q{お好きなコード}%>

== 使用例
=== 変換前
<%=color_code %q{
class hogehoge
	def initialize(value)
		@value = "値" #コメント
	end
end
}%>
=== 変換後
 <pre class="color-code">
 <em class="color-code-syntax">class </em>hogehoge
     <em class="color-code-syntax">def</em> <em class="color-code-emphasis">initialize</em>(value)
         @value = <em class="color-code-value">"値"</em>
     <em class="color-code-syntax"><em class="color-code-syntax">end</em></em> 
 <em class="color-code-syntax"><em class="color-code-syntax">end</em></em>
 </pre>

= スタイルシート記述例
これを御利用のテーマにコピペしてみてください。

	div.body pre.color-code{
		color: #000000;
		background-color: #f5f5f5;
	}

	pre.color-code em.color-code-value{
		color: #FF33FF;
		font-style: normal;
	}

	pre.color-code em.color-code-comment{
		color: #339933;
		font-style: normal;
	}

	pre.color-code em.color-code-syntax{
		color: #0033FF;
		font-style: normal;
	
	}

	pre.color-code em.color-code-emphasis{
		color: #FF3300;
		font-style: normal;
	}

= 注意点
= コード中に空行があるとエラーが起きます！！
空行を造りたいときはタブか全角スペースをいっこいれといてください。

=end


def color_code(str)

	#--------------------------------------------------------------------
	#設定
	#--------------------------------------------------------------------
	#----　タブを変換するときのスペースの個数　0ならタブのまま(＝無変換)
	space = @options ? @options['color_code.tab_width'].to_i : 8

	#----　一般的な予約語　色分け時はcolor-code-syntaxクラスになる。
	syntax = /\b(?:BEGIN|END|alias|and|begin|break|case|def|defined?|do|else|elsif|end|ensure|false|for|module|next|nil|redo|rescue|retry|return|self|super|then|true|undef|unless|until|when|while|yield|if|not|in|or)\b/

	#----　強調語　色分け時はcolor-code-emphasisクラスになる
	emphasis = /\b(?:require|private|public|include|attr_reader|attr_writer|attr_accessor|initialize|protected|each|times|__FILE__|__LINE__)\b/

	#設定おわり
	#--------------------------------------------------------------------

	result = %Q{<pre class="color-code">}

	#いろいろ置換 gsub!を使う関係上、置換の順番が大事
	str.each do |code|
		code.chomp!

		code.gsub!(/&/,"&amp;lt;")
		code.gsub!(/</,"&lt;")
		code.gsub!(/>/,"&gt;")
		code.gsub!(/\t/," "*space) unless space == 0
		
		code.gsub!(/".*?"/, %q{<em class="color-code-value">\&</em>})
		code.gsub!(/'.*?'/, %q{<em class="color-code-value">\&</em>})
		code.gsub!(/%q\{.*?\}/i, %q{<em class="color-code-value">\&</em>})
		code.gsub!(/%w\{.*?\}/i, %q{<em class="color-code-value">\&</em>})

		code.gsub!(syntax, %q{<em class="color-code-syntax">\&</em>})
		code.gsub!(emphasis, %q{<em class="color-code-emphasis">\&</em>})

		code.gsub!(/#.*/,%q{<em class="color-code-comment">\&</em>})

		result << code << "\n"
	end

	result << "</pre>\n"
end

# vi: sw=2 ts=2
