Module: Perception::StringSpreadI
- Included in:
- String
- Defined in:
- lib/perception/string_spread.rb
Instance Method Summary collapse
- #analyze_columns(options = {}) ⇒ Object
- #spread(options = {}) ⇒ Object
-
#spread_line(tabstops = [], search = /,/, position_add = nil, start = 0) ⇒ Object
Erzwingt ein bestimmtes Zeichen nur an Tabstop-Positionen Mit position_add= 0 werden die Spaces vor dem gefundenen Zeichen eingefügt.
Instance Method Details
#analyze_columns(options = {}) ⇒ Object
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
# File 'lib/perception/string_spread.rb', line 17 def analyze_columns(={}) # vorbereiten stretch = [:stretch] || 1 # soviel wird zu jedem Tabstop hinzuaddiert # mehrzeilige Darstellung if self.include?("\n") result = ArrayOfEnumerables.new self.split("\n").each do |zeile| # print zeile.inspect_pp # print zeile.analyze_columns(options).inspect_pp # print "\n" result << zeile.analyze_columns() end result.compact! result = result.rectangle result.transpose! #pp result result2 = result.collect { |spalte| (spalte.sort[-1]) + stretch} #pp result2 return result2 # einzeilig -- TODO: Fehler beheben else # weiter vorbereiten level_start = [:level_start] || 1 level_end = [:level_end] || 1 search = [:search] || ',' # funktioniert nicht 100%ig. Fehler bei einem mehrzeiligen Hash, dessen Values Gleichheitszeichen enthalten. # Hier verhindert wahrscheinlich die erste Zeile die Maskierung des Gleichheitszeichens -- sie enthält die {-Klammer. result = self.mask( :level_start => level_start, :level_end => level_end ) {|s| s.tr(search, Perception::PPP_SEARCH)} #pp result.split(Perception::PPP_SEARCH) result = result.split(Perception::PPP_SEARCH).collect {|e| e.strip.size + stretch} return result if result.size > 1 return nil end # if Rekursion end |
#spread(options = {}) ⇒ Object
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
# File 'lib/perception/string_spread.rb', line 107 def spread(={}) # vorbereiten level_start = [:level_start] || 1 level_end = [:level_end] || 1 search = [:search] || '=' tabstops = [:tabstops] position_add = [:position_add] # Mit position_add= 0 werden die Spaces vor dem gefundenen Zeichen eingefügt. # Standard ist position_add= search.size, damit werden die Spaces hinter den gefundenen Zeichen eingefügt. return self if tabstops.empty? # Spalte ausrichten self.mask( :level_start => level_start, :level_end => level_end # :with_brackets => true ) { |s| s_neu = s.split("\n").collect do | zeile | zeile.spread_line(tabstops, search, position_add) end.join("\n") replaces = [[/\x1F\n */ ,''],[/\x1F */ ,' ']] # PPP_ANTI_NEWLINE = 31.chr s_neu.mgsub(replaces) } # mask end |
#spread_line(tabstops = [], search = /,/, position_add = nil, start = 0) ⇒ Object
Erzwingt ein bestimmtes Zeichen nur an Tabstop-Positionen Mit position_add= 0 werden die Spaces vor dem gefundenen Zeichen eingefügt. Standard ist position_add= search.size, damit werden die Spaces hinter den gefundenen Zeichen eingefügt.
Mit PPP_ANTI_NEWLINE werden Zeilen markiert, bei denen anschließend noch das n entfernt werden kann.
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
# File 'lib/perception/string_spread.rb', line 70 def spread_line(tabstops=[], search=/,/, position_add=nil, start=0) #puts "spread_line, self=#{self.inspect_pp} tabstops=#{tabstops.join('-')}" position_add = search.inspect.size-2 unless position_add leading_spaces = self.size - self.lstrip.size # das auszurichtende Zeichen finden pos_found = self.index(search, start) return self if pos_found.nil? anti_newline = (self[pos_found+position_add..-1].strip == '' ? PPP_ANTI_NEWLINE : '') # Tabstops bestimmen: Modus feste Tabstops if tabstops.size > 1 pos_shift = 0 tabstops.each do |ts| if ts >= pos_found pos_shift = ts + leading_spaces break end end # do end # modus # Tabstops bestimmen: Modus "Tabstop alle n Zeichen" bzw. Fallback, wenn feste Tabstops nicht ausreichend waren if (tabstops.size == 1 || pos_shift == 0 ) pos_shift = ((pos_found/tabstops[0]) + 1) * tabstops[0] + leading_spaces end # if modus # Tabstops einfügen if pos_found < pos_shift self.insert(pos_found+position_add, (' '*(pos_shift - pos_found - 1)) + anti_newline ) end spread_line(tabstops, search, position_add, pos_shift + 1) end |