=begin = rd2html-enum-lib.rb $Id: rd2html-ext-lib.rb,v 1.3 2003/01/29 17:41:15 rubikitch Exp rubikitch $ =end require "rd/rd2html-lib" require 'rd/headline-title' module RD class RD2HTMLExtVisitor < RD2HTMLVisitor # must-have constants OUTPUT_SUFFIX = "html" INCLUDE_SUFFIX = ["html"] METACHAR = { "<" => "<", ">" => ">", "&" => "&" } include HeadLineTitle attr_accessor :opt_headline_title, :opt_ref_extension, :opt_headline_secno, :opt_enable_br, :opt_native_inline, :opt_head_element attr(:head, true) def initialize @enum_count = [0, 0, 0, 0, 0, 0, 0] @levelold = 0 @enum_start_level = 2 @image_size = {} begin require 'image_size' @use_image_size = true rescue LoadError @use_image_size = false end super end def visit(tree) title_init if opt_headline_title || opt_headline_secno install_headline_secno if opt_headline_secno install_ref_extension if opt_ref_extension install_enable_br if opt_enable_br install_native_inline if opt_native_inline install_head_element if opt_head_element super end def install_native_inline extend NativeInline end def install_enable_br extend EnableBr end def install_headline_secno extend HeadlineSecno end def install_ref_extension extend RefExtension @ref_extension = [] (methods + private_methods).sort.each do |m| if /^ref_ext/ =~ m @ref_extension.push(m.intern) end end @ref_extension.push(:default_ref_ext) end def install_head_element extend HeadElement end ################ index inline => native inline module NativeInline Delimiter = "\ca\ca" def html_body(contents) html = super a = html.split(Delimiter) a.each_with_index do |s, i| if i % 2 == 1 meta_char_unescape!(s) end end a.join end private :html_body def apply_to_Index(element, content) %Q[#{Delimiter}#{content}#{Delimiter}] end def meta_char_unescape!(str) str.gsub!(/(<|>|&)/) { METACHAR.index($&) } end private :meta_char_unescape! end ################ Enable
module EnableBr def apply_to_TextBlock(element, content) if (element.parent.is_a?(ItemListItem) or element.parent.is_a?(EnumListItem)) and consist_of_one_textblock?(element.parent) content.join.chomp else content = content.delete_if{|x| x == "\n"}.join("").gsub(/\n/, "
\n") %Q[

#{content.chomp}

] end end end ################ Headline Enumeration module HeadlineSecno def make_Headline_secno(element) level = element.level (@levelold+1).upto(@enum_count.length-1){|i| @enum_count[i]=0} @enum_count[level] += 1 prefix = "" @enum_start_level.upto(level) do |l| prefix << @enum_count[l].to_s prefix << "." unless l == level end @levelold = level if prefix == '' then "Title:" else prefix end end private :make_Headline_secno def apply_to_Headline(element, title) anchor = refer(element) make_title(title) secno = make_Headline_secno element %Q[#{secno} ] + %Q[#{title}] + %Q[\n] end end ################ TextBlock Label ################ Reference Extension from rd2rwiki-lib.rb module RefExtension def apply_to_RefToElement(element, content) content = content.join("") apply_ref_extension(element, element_label(element), content) end private def apply_ref_extension(element, label, content) @ref_extension.each do |entry| result = __send__(entry, element, label, content) return result if result end end def element_label(element) case element when RDElement element.to_label else element end end def default_ref_ext(element, label, content) if anchor = refer(element) content = content.sub(/^function#/, "") %Q[#{content}] else # warning? label = hyphen_escape(element.to_label) %Q[] + %Q[#{content}] #' end end def ref_ext_RubyML(element, label, content) return nil unless /^(ruby-(?:talk|list|dev|math)):(.+)$/ =~ label ml = $1 article = $2.sub(/^0+/, '') content = "[#{label}]" if label == content %Q[#{ content }] end def ref_ext_RAA(element, label, content) return nil unless /^RAA:(.+)$/ =~ label name = CGI.escape($1) content = "[#{label}]" if label == content %Q[#{ content }] end def ref_ext_IMG(element, label, content) return nil unless /^IMG:(.+)$/ =~ label file = $1 label.to_s == content.to_s and content = file if @use_image_size begin unless @image_size[ file ] open( file ) do |img| is = ImageSize::new( img ) @image_size[ file ] = [ is.get_height, is.get_width ] end end height, width = @image_size[ file ] %Q[#{content}] rescue %Q[#{content}] end else %Q[#{content}] end end end # RefExtension ################ module HeadElement def html_head ret = %|\n| ret << html_title + "\n" ret << html_content_type + "\n" if html_content_type ret << link_to_css + "\n" if link_to_css ret << forward_links + "\n" if forward_links ret << backward_links + "\n" if backward_links ret << head + "\n" if head ret << %Q[] end end end # RD2HTMLExtVisitor end # RD $Visitor_Class = RD::RD2HTMLExtVisitor $RD2_Sub_OptionParser = "rd/rd2html-ext-opt"