class Krill::Arranger
Attributes
consumed[RW]
current_format_state[R]
finalized[R]
fragments[R]
max_ascender[R]
max_descender[R]
max_line_height[R]
unconsumed[R]
The following present only for testing purposes
Public Class Methods
new(options={})
click to toggle source
# File lib/krill/arranger.rb, line 16 def initialize(options={}) @fragments = [] @unconsumed = [] @kerning = options[:kerning] end
Public Instance Methods
current_formatter()
click to toggle source
# File lib/krill/arranger.rb, line 22 def current_formatter current_format_state.fetch(:font) end
finalize_line()
click to toggle source
# File lib/krill/arranger.rb, line 50 def finalize_line @finalized = true omit_trailing_whitespace_from_line_width @fragments = [] @consumed.each do |hash| text = hash[:text] format_state = hash.dup format_state.delete(:text) fragment = Krill::Fragment.new(text, format_state) @fragments << fragment set_fragment_measurements(fragment) set_line_measurement_maximums(fragment) end end
finished?()
click to toggle source
# File lib/krill/arranger.rb, line 87 def finished? @unconsumed.none? end
format_array=(array)
click to toggle source
# File lib/krill/arranger.rb, line 66 def format_array=(array) initialize_line @unconsumed = [] array.each do |hash| binding.pry unless hash.is_a?(Hash) hash[:text].scan(/[^\n]+|\n/) do |line| @unconsumed << hash.merge(text: line) end end end
initialize_line()
click to toggle source
# File lib/krill/arranger.rb, line 77 def initialize_line @finalized = false @max_line_height = 0 @max_descender = 0 @max_ascender = 0 @consumed = [] @fragments = [] end
line()
click to toggle source
# File lib/krill/arranger.rb, line 42 def line fail "Lines must be finalized before calling #line" unless finalized @fragments.collect do |fragment| fragment.text.dup.force_encoding(::Encoding::UTF_8) end.join end
line_width()
click to toggle source
# File lib/krill/arranger.rb, line 34 def line_width fail "Lines must be finalized before calling #line_width" unless finalized @fragments.inject(0) do |sum, fragment| sum + fragment.width end end
next_string()
click to toggle source
# File lib/krill/arranger.rb, line 91 def next_string fail "Lines must not be finalized when calling #next_string" if finalized next_unconsumed_hash = @unconsumed.shift if next_unconsumed_hash @consumed << next_unconsumed_hash.dup @current_format_state = next_unconsumed_hash.dup @current_format_state.delete(:text) next_unconsumed_hash[:text] end end
preview_next_string()
click to toggle source
# File lib/krill/arranger.rb, line 105 def preview_next_string next_unconsumed_hash = @unconsumed.first next_unconsumed_hash[:text] if next_unconsumed_hash end
repack_unretrieved()
click to toggle source
# File lib/krill/arranger.rb, line 131 def repack_unretrieved new_unconsumed = [] while fragment = retrieve_fragment fragment.include_trailing_white_space! new_unconsumed << fragment.format_state.merge(:text => fragment.text) end @unconsumed = new_unconsumed.concat(@unconsumed) end
retrieve_fragment()
click to toggle source
# File lib/krill/arranger.rb, line 125 def retrieve_fragment fail "Lines must be finalized before fragments can be retrieved" unless finalized @fragments.shift end
space_count()
click to toggle source
# File lib/krill/arranger.rb, line 26 def space_count fail "Lines must be finalized before calling #space_count" unless finalized @fragments.inject(0) do |sum, fragment| sum + fragment.space_count end end
update_last_string(printed, unprinted, normalized_soft_hyphen = nil)
click to toggle source
# File lib/krill/arranger.rb, line 110 def update_last_string(printed, unprinted, normalized_soft_hyphen = nil) return if printed.nil? if printed.empty? @consumed.pop else @consumed.last[:text] = printed @consumed.last[:normalized_soft_hyphen] = normalized_soft_hyphen if normalized_soft_hyphen end @unconsumed.unshift(@current_format_state.merge(text: unprinted)) unless unprinted.empty? load_previous_format_state if printed.empty? end
Private Instance Methods
load_previous_format_state()
click to toggle source
# File lib/krill/arranger.rb, line 142 def load_previous_format_state if @consumed.empty? @current_format_state = {} else hash = @consumed.last @current_format_state = hash.dup @current_format_state.delete(:text) end end
omit_trailing_whitespace_from_line_width()
click to toggle source
# File lib/krill/arranger.rb, line 152 def omit_trailing_whitespace_from_line_width @consumed.reverse_each do |hash| if hash[:text] == "\n" break elsif hash[:text].strip.empty? && @consumed.length > 1 # this entire fragment is trailing white space hash[:exclude_trailing_white_space] = true else # this fragment contains the first non-white space we have # encountered since the end of the line hash[:exclude_trailing_white_space] = true break end end end
set_fragment_measurements(fragment)
click to toggle source
# File lib/krill/arranger.rb, line 168 def set_fragment_measurements(fragment) fragment.width = fragment.formatter.width_of(fragment.text, kerning: @kerning) fragment.line_height = fragment.formatter.height fragment.descender = fragment.formatter.descender fragment.ascender = fragment.formatter.ascender end
set_line_measurement_maximums(fragment)
click to toggle source
# File lib/krill/arranger.rb, line 175 def set_line_measurement_maximums(fragment) @max_line_height = [defined?(@max_line_height) && @max_line_height, fragment.line_height].compact.max @max_descender = [defined?(@max_descender) && @max_descender, fragment.descender].compact.max @max_ascender = [defined?(@max_ascender) && @max_ascender, fragment.ascender].compact.max end