52 lines
1.4 KiB
Ruby
52 lines
1.4 KiB
Ruby
|
require 'syntax/convertors/abstract'
|
||
|
|
||
|
module Syntax
|
||
|
module Convertors
|
||
|
|
||
|
# A simple class for converting a text into HTML.
|
||
|
class HTML < Abstract
|
||
|
|
||
|
# Converts the given text to HTML, using spans to represent token groups
|
||
|
# of any type but <tt>:normal</tt> (which is always unhighlighted). If
|
||
|
# +pre+ is +true+, the html is automatically wrapped in pre tags.
|
||
|
def convert( text, pre=true )
|
||
|
html = ""
|
||
|
html << "<pre>" if pre
|
||
|
regions = []
|
||
|
@tokenizer.tokenize( text ) do |tok|
|
||
|
value = html_escape(tok)
|
||
|
case tok.instruction
|
||
|
when :region_close then
|
||
|
regions.pop
|
||
|
html << "</span>"
|
||
|
when :region_open then
|
||
|
regions.push tok.group
|
||
|
html << "<span class=\"#{tok.group}\">#{value}"
|
||
|
else
|
||
|
if tok.group == ( regions.last || :normal )
|
||
|
html << value
|
||
|
else
|
||
|
html << "<span class=\"#{tok.group}\">#{value}</span>"
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
html << "</span>" while regions.pop
|
||
|
html << "</pre>" if pre
|
||
|
html
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
# Replaces some characters with their corresponding HTML entities.
|
||
|
def html_escape( string )
|
||
|
string.gsub( /&/, "&" ).
|
||
|
gsub( /</, "<" ).
|
||
|
gsub( />/, ">" ).
|
||
|
gsub( /"/, """ )
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
end
|
||
|
end
|