=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[