Changeset 11579

Show
Ignore:
Timestamp:
05/14/08 15:09:21 (5 years ago)
Author:
hajimehoshi
Message:

Modified document.rb

Location:
websites/starruby/trunk
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • websites/starruby/trunk/doc/index

    r11498 r11579  
    44@type h 
    55@lang ja 
    6 Ruby で簡単ゲーム開発 
     6Ruby でお手軽ゲーム開発! 
     7 
     8@type h 
     9@lang en 
     10Agile game development with Ruby! 
     11 
  • websites/starruby/trunk/lib/document.rb

    r11498 r11579  
    11module ParagraphModule 
    22 
     3  attr_reader :lang 
     4  attr_reader :children 
     5  private :children 
     6 
     7  include Enumerable 
     8 
     9  def initialize(children) 
     10    @children = children.dup 
     11    @children.freeze 
     12  end 
     13 
     14  def [](index) 
     15    children[index] 
     16  end 
     17 
     18  def size 
     19    children.size 
     20  end 
     21 
     22  def each 
     23    children.each{|i| yield(i)} 
     24  end 
     25 
     26  def children_with_lang(lang = nil) 
     27    children.select{|c| c.lang.nil? or c.lang == lang} 
     28  end 
     29 
     30end 
     31 
     32class Paragraph 
     33 
     34  def self.level(str) 
     35    level = 0 
     36    while str =~ /\A\x20\x20/ 
     37      level += 1 
     38      str = str[2..-1] 
     39    end     
     40    level 
     41  end 
     42 
     43  include ParagraphModule 
     44 
     45  attr_reader :level 
    346  attr_reader :type 
    447  attr_reader :arg 
    548  attr_reader :text 
    6   attr_reader :lang 
    7   attr_reader :level 
    8  
    9   include Enumerable 
    10  
    11   def initialize(str) 
     49 
     50  def initialize(str, children = []) 
     51    super(children) 
     52    @text = "" 
     53    @level = Paragraph.level(str) 
    1254    @type = :p 
    13     @text = "" 
    14     @level = 0 
    15     while str =~ /\A\x20\x20/ 
    16       @level += 1 
    17       str = str[2..-1] 
    18     end 
    1955    str.strip.each do |line| 
    2056      case line.lstrip 
     
    3369      end 
    3470    end 
    35   end 
    36  
    37   def [](index) 
    38     children[index] 
    39   end 
    40  
    41   def <<(paragraph) 
    42     children << paragraph 
    43   end 
    44  
    45   def size 
    46     children.size 
    47   end 
    48  
    49   def each 
    50     children.each{|i| yield(i)} 
    5171  end 
    5272 
     
    125145  private 
    126146 
    127   def children 
    128     @children ||= [] 
    129   end 
    130  
    131   def children_with_lang(lang = nil) 
    132     children.select{|c| c.lang.nil? or c.lang == lang} 
    133   end 
    134  
    135147  def content(text) 
    136148    content = h(text) 
     
    180192end 
    181193 
    182 class Paragraph 
     194class RootParagraph 
    183195 
    184196  include ParagraphModule 
    185197 
    186 end 
    187  
    188 class RootParagraph 
    189  
    190   include ParagraphModule 
    191  
    192   def initialize 
     198  def initialize(children) 
     199    super(children) 
    193200  end 
    194201 
     
    198205 
    199206  def to_html(lang = nil) 
    200     html = children_with_lang(lang).map {|p| p.to_html(lang)}.join("\n") 
    201     html.gsub!("</dl>\n<dl>\n", "") 
    202     html 
     207    (@htmls ||= {})[lang] ||= 
     208      (html = children_with_lang(lang).map {|p| p.to_html(lang)}.join("\n") 
     209       html.gsub!("</dl>\n<dl>\n", "") 
     210       html) 
    203211  end 
    204212 
     
    210218 
    211219  def initialize(text) 
    212     @root = RootParagraph.new 
    213     paragraphs = text.split(/\n\s*\n/).map {|p| Paragraph.new(p)}.unshift(@root) 
    214     paragraphs.inject([]) do |done, para| 
    215       if para != @root 
    216         parent = done.find do |p| 
    217           raise "invalid indent level" if p.level + 2 <= para.level 
    218           p.level + 1 == para.level 
     220    stack = [] 
     221    text.split(/\n\s*\n/).reverse_each do |p| 
     222      level = Paragraph.level(p) 
     223      if stack.empty? 
     224        stack.push(Paragraph.new(p)) 
     225      else 
     226        if stack.last.level == level + 1 
     227          children = [] 
     228          while not stack.empty? and stack.last.level == level + 1 
     229            children << stack.pop 
     230          end 
     231          stack.push(Paragraph.new(p, children)) 
     232        elsif stack.last.level <= level 
     233          stack.push(Paragraph.new(p)) 
     234        else 
     235          raise "invalid indent level" unless parent           
    219236        end 
    220         raise "invalid indent level" unless parent 
    221         parent << para 
    222237      end 
    223       done.unshift(para) 
    224     end 
     238    end 
     239    raise "invalid indent level" unless stack.all?{|p| p.level == 0} 
     240    @root = RootParagraph.new(stack.reverse) 
    225241  end 
    226242 
    227243  def to_html(lang = nil) 
    228     root.to_html(lang) 
     244    (@htmls ||= {})[lang] ||= root.to_html(lang) 
    229245  end 
    230246   
    231247  def title(lang = nil) 
    232     para = root.find do |para| 
    233       para.type == :title and (para.lang.nil? or para.lang == lang) 
    234     end 
    235     if para 
    236       para.text 
    237     else 
    238       nil 
    239     end 
     248    (@titles ||= {})[lang] ||= 
     249      (para = root.find do |para| 
     250         para.type == :title and (para.lang.nil? or para.lang == lang) 
     251       end 
     252       if para 
     253         para.text 
     254       else 
     255         nil 
     256       end) 
    240257  end 
    241258