2008-01-13 22:34:05 -05:00
|
|
|
require 'rdoc/markup'
|
|
|
|
|
|
|
|
class RDoc::Markup
|
2003-12-01 02:12:49 -05:00
|
|
|
|
2008-01-12 22:35:34 -05:00
|
|
|
##
|
|
|
|
# We manage a set of attributes. Each attribute has a symbol name and a bit
|
2008-01-13 22:34:05 -05:00
|
|
|
# value.
|
2003-12-01 02:12:49 -05:00
|
|
|
|
|
|
|
class Attribute
|
|
|
|
SPECIAL = 1
|
|
|
|
|
|
|
|
@@name_to_bitmap = { :_SPECIAL_ => SPECIAL }
|
|
|
|
@@next_bitmap = 2
|
|
|
|
|
2008-02-09 22:59:08 -05:00
|
|
|
def self.bitmap_for(name)
|
2003-12-01 02:12:49 -05:00
|
|
|
bitmap = @@name_to_bitmap[name]
|
2008-02-09 22:59:08 -05:00
|
|
|
unless bitmap then
|
2003-12-01 02:12:49 -05:00
|
|
|
bitmap = @@next_bitmap
|
|
|
|
@@next_bitmap <<= 1
|
|
|
|
@@name_to_bitmap[name] = bitmap
|
|
|
|
end
|
|
|
|
bitmap
|
|
|
|
end
|
|
|
|
|
2008-02-09 22:59:08 -05:00
|
|
|
def self.as_string(bitmap)
|
2003-12-01 02:12:49 -05:00
|
|
|
return "none" if bitmap.zero?
|
|
|
|
res = []
|
|
|
|
@@name_to_bitmap.each do |name, bit|
|
|
|
|
res << name if (bitmap & bit) != 0
|
|
|
|
end
|
|
|
|
res.join(",")
|
|
|
|
end
|
|
|
|
|
2008-02-09 22:59:08 -05:00
|
|
|
def self.each_name_of(bitmap)
|
2003-12-01 02:12:49 -05:00
|
|
|
@@name_to_bitmap.each do |name, bit|
|
|
|
|
next if bit == SPECIAL
|
|
|
|
yield name.to_s if (bitmap & bit) != 0
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2008-04-26 12:14:19 -04:00
|
|
|
AttrChanger = Struct.new(:turn_on, :turn_off)
|
|
|
|
|
2008-01-12 22:35:34 -05:00
|
|
|
##
|
|
|
|
# An AttrChanger records a change in attributes. It contains a bitmap of the
|
2008-01-13 22:34:05 -05:00
|
|
|
# attributes to turn on, and a bitmap of those to turn off.
|
2003-12-01 02:12:49 -05:00
|
|
|
|
|
|
|
class AttrChanger
|
|
|
|
def to_s
|
2008-09-24 22:43:03 -04:00
|
|
|
"Attr: +#{Attribute.as_string(turn_on)}/-#{Attribute.as_string(turn_on)}"
|
2003-12-01 02:12:49 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2008-01-12 22:35:34 -05:00
|
|
|
##
|
2008-01-13 22:34:05 -05:00
|
|
|
# An array of attributes which parallels the characters in a string.
|
2008-01-12 22:35:34 -05:00
|
|
|
|
2003-12-01 02:12:49 -05:00
|
|
|
class AttrSpan
|
|
|
|
def initialize(length)
|
|
|
|
@attrs = Array.new(length, 0)
|
|
|
|
end
|
|
|
|
|
|
|
|
def set_attrs(start, length, bits)
|
|
|
|
for i in start ... (start+length)
|
|
|
|
@attrs[i] |= bits
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def [](n)
|
|
|
|
@attrs[n]
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
##
|
|
|
|
# Hold details of a special sequence
|
|
|
|
|
|
|
|
class Special
|
|
|
|
attr_reader :type
|
|
|
|
attr_accessor :text
|
|
|
|
|
|
|
|
def initialize(type, text)
|
|
|
|
@type, @text = type, text
|
|
|
|
end
|
|
|
|
|
|
|
|
def ==(o)
|
|
|
|
self.text == o.text && self.type == o.type
|
|
|
|
end
|
|
|
|
|
2007-12-28 01:13:06 -05:00
|
|
|
def inspect
|
2008-01-13 22:34:05 -05:00
|
|
|
"#<RDoc::Markup::Special:0x%x @type=%p, name=%p @text=%p>" % [
|
|
|
|
object_id, @type, RDoc::Markup::Attribute.as_string(type), text.dump]
|
2003-12-01 02:12:49 -05:00
|
|
|
end
|
2008-02-09 22:59:08 -05:00
|
|
|
|
|
|
|
def to_s
|
|
|
|
"Special: type=#{type}, name=#{RDoc::Markup::Attribute.as_string type}, text=#{text.dump}"
|
|
|
|
end
|
|
|
|
|
2003-12-01 02:12:49 -05:00
|
|
|
end
|
2008-01-12 22:35:34 -05:00
|
|
|
|
2003-12-01 02:12:49 -05:00
|
|
|
end
|
2008-01-12 22:35:34 -05:00
|
|
|
|
2008-04-26 12:14:19 -04:00
|
|
|
require 'rdoc/markup/attribute_manager'
|