Class Prawn::Format::LayoutBuilder
In: lib/prawn/format/layout_builder.rb
lib/prawn/format/layout_builder.rb
Parent: Object

Methods

done?   done?   fill   fill   new   new   next   next   translate_prawn_options   translate_prawn_options   unget   unget   word_wrap   word_wrap  

Attributes

document  [R] 
document  [R] 
options  [R] 
options  [R] 

Public Class methods

[Source]

    # File lib/prawn/format/layout_builder.rb, line 11
11:       def initialize(document, text, options={})
12:         @document = document
13:         @options  = options
14:         @tags     = document.tags.merge(options[:tags] || {})
15:         @styles   = document.styles.merge(options[:styles] || {})
16:         style     = document.default_style.merge(options[:default_style] || {})
17: 
18:         translate_prawn_options(style, options)
19: 
20:         @parser   = Parser.new(@document, text,
21:                       :tags => @tags, :styles => @styles, :style => style)
22: 
23:         @state    = {}
24:       end

[Source]

    # File lib/prawn/format/layout_builder.rb, line 11
11:       def initialize(document, text, options={})
12:         @document = document
13:         @options  = options
14:         @tags     = document.tags.merge(options[:tags] || {})
15:         @styles   = document.styles.merge(options[:styles] || {})
16:         style     = document.default_style.merge(options[:default_style] || {})
17: 
18:         translate_prawn_options(style, options)
19: 
20:         @parser   = Parser.new(@document, text,
21:                       :tags => @tags, :styles => @styles, :style => style)
22: 
23:         @state    = {}
24:       end

Public Instance methods

[Source]

    # File lib/prawn/format/layout_builder.rb, line 26
26:       def done?
27:         @parser.eos?
28:       end

[Source]

    # File lib/prawn/format/layout_builder.rb, line 26
26:       def done?
27:         @parser.eos?
28:       end

[Source]

    # File lib/prawn/format/layout_builder.rb, line 55
55:       def fill(x, y, width, fill_options={}, &block)
56:         lines = word_wrap(width, fill_options, &block)
57:         draw_options = options.merge(fill_options).merge(:state => @state)
58:         @state = document.draw_lines(x, y, width, lines, draw_options)
59:         @state.delete(:cookies)
60:         return @state[:dy] + y
61:       end

[Source]

    # File lib/prawn/format/layout_builder.rb, line 55
55:       def fill(x, y, width, fill_options={}, &block)
56:         lines = word_wrap(width, fill_options, &block)
57:         draw_options = options.merge(fill_options).merge(:state => @state)
58:         @state = document.draw_lines(x, y, width, lines, draw_options)
59:         @state.delete(:cookies)
60:         return @state[:dy] + y
61:       end

[Source]

    # File lib/prawn/format/layout_builder.rb, line 63
63:       def next(line_width=nil)
64:         line = []
65:         width = 0
66:         break_at = nil
67: 
68:         while (instruction = @parser.next)
69:           next if !@parser.verbatim? && line.empty? && instruction.discardable? # ignore discardables at line start
70:           line.push(instruction)
71: 
72:           if instruction.break?
73:             width += instruction.width(:nondiscardable)
74:             break_at = line.length if line_width && width <= line_width
75:             width += instruction.width(:discardable)
76:           else
77:             width += instruction.width
78:           end
79: 
80:           if instruction.force_break? || line_width && width >= line_width
81:             break_at ||= line.length
82: 
83:             @parser.push(line.pop) while line.length > break_at
84:             hard_break = instruction.force_break? || @parser.eos?
85: 
86:             return Line.new(line, hard_break)
87:           end
88:         end
89: 
90:         Line.new(line, true) if line.any?
91:       end

[Source]

    # File lib/prawn/format/layout_builder.rb, line 63
63:       def next(line_width=nil)
64:         line = []
65:         width = 0
66:         break_at = nil
67: 
68:         while (instruction = @parser.next)
69:           next if !@parser.verbatim? && line.empty? && instruction.discardable? # ignore discardables at line start
70:           line.push(instruction)
71: 
72:           if instruction.break?
73:             width += instruction.width(:nondiscardable)
74:             break_at = line.length if line_width && width <= line_width
75:             width += instruction.width(:discardable)
76:           else
77:             width += instruction.width
78:           end
79: 
80:           if instruction.force_break? || line_width && width >= line_width
81:             break_at ||= line.length
82: 
83:             @parser.push(line.pop) while line.length > break_at
84:             hard_break = instruction.force_break? || @parser.eos?
85: 
86:             return Line.new(line, hard_break)
87:           end
88:         end
89: 
90:         Line.new(line, true) if line.any?
91:       end

[Source]

     # File lib/prawn/format/layout_builder.rb, line 97
 97:       def translate_prawn_options(style, options)
 98:         style[:kerning] = options[:kerning] if options.key?(:kerning)
 99:         style[:font_size] = options[:size] if options.key?(:size)
100: 
101:         case options[:style]
102:         when :bold then
103:           style[:font_weight] = :bold
104:         when :italic then
105:           style[:font_style] = :italic
106:         when :bold_italic then
107:           style[:font_weight] = :bold
108:           style[:font_style] = :italic
109:         end
110:       end

[Source]

     # File lib/prawn/format/layout_builder.rb, line 97
 97:       def translate_prawn_options(style, options)
 98:         style[:kerning] = options[:kerning] if options.key?(:kerning)
 99:         style[:font_size] = options[:size] if options.key?(:size)
100: 
101:         case options[:style]
102:         when :bold then
103:           style[:font_weight] = :bold
104:         when :italic then
105:           style[:font_style] = :italic
106:         when :bold_italic then
107:           style[:font_weight] = :bold
108:           style[:font_style] = :italic
109:         end
110:       end

[Source]

    # File lib/prawn/format/layout_builder.rb, line 93
93:       def unget(line)
94:         line.source.reverse_each { |instruction| @parser.push(instruction) }
95:       end

[Source]

    # File lib/prawn/format/layout_builder.rb, line 93
93:       def unget(line)
94:         line.source.reverse_each { |instruction| @parser.push(instruction) }
95:       end

[Source]

    # File lib/prawn/format/layout_builder.rb, line 30
30:       def word_wrap(width, options={}, &block)
31:         if options[:height] && block
32:           raise ArgumentError, "cannot specify both height and a block"
33:         elsif options[:height]
34:           block = Proc.new { |l, h| h > options[:height] }
35:         elsif block.nil?
36:           block = Proc.new { |l, h| false }
37:         end
38: 
39:         lines = []
40:         total_height = 0
41: 
42:         while (line = self.next(width))
43:           if block[line, total_height + line.height]
44:             unget(line)
45:             break
46:           end
47: 
48:           total_height += line.height
49:           lines.push(line)
50:         end
51: 
52:         return lines
53:       end

[Source]

    # File lib/prawn/format/layout_builder.rb, line 30
30:       def word_wrap(width, options={}, &block)
31:         if options[:height] && block
32:           raise ArgumentError, "cannot specify both height and a block"
33:         elsif options[:height]
34:           block = Proc.new { |l, h| h > options[:height] }
35:         elsif block.nil?
36:           block = Proc.new { |l, h| false }
37:         end
38: 
39:         lines = []
40:         total_height = 0
41: 
42:         while (line = self.next(width))
43:           if block[line, total_height + line.height]
44:             unget(line)
45:             break
46:           end
47: 
48:           total_height += line.height
49:           lines.push(line)
50:         end
51: 
52:         return lines
53:       end

[Validate]