| Module | YAML::BaseEmitter |
| In: |
lib/yaml/baseemitter.rb
|
Emit binary data
# File lib/yaml/baseemitter.rb, line 28
28: def binary_base64( value )
29: self << "!binary "
30: self.node_text( [value].pack("m"), '|' )
31: end
Folding paragraphs within a column
# File lib/yaml/baseemitter.rb, line 134
134: def fold( value )
135: value.gsub( /(^[ \t]+.*$)|(\S.{0,#{options(:BestWidth) - 1}})(?:[ \t]+|(\n+(?=[ \t]|\Z))|$)/ ) do
136: $1 || $2 + ( $3 || "\n" )
137: end
138: end
Write a current indent
# File lib/yaml/baseemitter.rb, line 113
113: def indent( mod = nil )
114: #p [ self.id, level, mod, :INDENT ]
115: if level <= 0
116: mod ||= 0
117: else
118: mod ||= options(:Indent)
119: mod += ( level - 1 ) * options(:Indent)
120: end
121: return " " * mod
122: end
Write a text block with the current indent
# File lib/yaml/baseemitter.rb, line 103
103: def indent_text( text, mod, first_line = true )
104: return "" if text.to_s.empty?
105: spacing = indent( mod )
106: text = text.gsub( /\A([^\n])/, "#{ spacing }\\1" ) if first_line
107: return text.gsub( /\n^([^\n])/, "\n#{spacing}\\1" )
108: end
Quick mapping
# File lib/yaml/baseemitter.rb, line 143
143: def map( type, &e )
144: val = Mapping.new
145: e.call( val )
146: self << "#{type} " if type.length.nonzero?
147:
148: #
149: # Empty hashes
150: #
151: if val.length.zero?
152: self << "{}"
153: @seq_map = false
154: else
155: # FIXME
156: # if @buffer.length == 1 and options(:UseHeader) == false and type.length.zero?
157: # @headless = 1
158: # end
159:
160: defkey = @options.delete( :DefaultKey )
161: if defkey
162: seq_map_shortcut
163: self << "= : "
164: defkey.to_yaml( :Emitter => self )
165: end
166:
167: #
168: # Emit the key and value
169: #
170: val.each { |v|
171: seq_map_shortcut
172: if v[0].is_complex_yaml?
173: self << "? "
174: end
175: v[0].to_yaml( :Emitter => self )
176: if v[0].is_complex_yaml?
177: self << "\n"
178: indent!
179: end
180: self << ": "
181: v[1].to_yaml( :Emitter => self )
182: }
183: end
184: end
Emit plain, normal flowing text
# File lib/yaml/baseemitter.rb, line 36
36: def node_text( value, block = nil )
37: @seq_map = false
38: valx = value.dup
39: unless block
40: block =
41: if options(:UseBlock)
42: '|'
43: elsif not options(:UseFold) and valx =~ /\n[ \t]/ and not valx =~ /#{YAML::ESCAPE_CHAR}/
44: '|'
45: else
46: '>'
47: end
48:
49: indt = $&.to_i if block =~ /\d+/
50: if valx =~ /(\A\n*[ \t#]|^---\s+)/
51: indt = options(:Indent) unless indt.to_i > 0
52: block += indt.to_s
53: end
54:
55: block +=
56: if valx =~ /\n\Z\n/
57: "+"
58: elsif valx =~ /\Z\n/
59: ""
60: else
61: "-"
62: end
63: end
64: block += "\n"
65: if block[0] == ?"
66: esc_skip = ( "\t\n" unless valx =~ /^[ \t]/ ) || ""
67: valx = fold( YAML::escape( valx, esc_skip ) + "\"" ).chomp
68: self << '"' + indent_text( valx, indt, false )
69: else
70: if block[0] == ?>
71: valx = fold( valx )
72: end
73: #p [block, indt]
74: self << block + indent_text( valx, indt )
75: end
76: end
# File lib/yaml/baseemitter.rb, line 13
13: def options( opt = nil )
14: if opt
15: @options[opt] || YAML::DEFAULTS[opt]
16: else
17: @options
18: end
19: end
Quick sequence
# File lib/yaml/baseemitter.rb, line 200
200: def seq( type, &e )
201: @seq_map = false
202: val = Sequence.new
203: e.call( val )
204: self << "#{type} " if type.length.nonzero?
205:
206: #
207: # Empty arrays
208: #
209: if val.length.zero?
210: self << "[]"
211: else
212: # FIXME
213: # if @buffer.length == 1 and options(:UseHeader) == false and type.length.zero?
214: # @headless = 1
215: # end
216:
217: #
218: # Emit the key and value
219: #
220: val.each { |v|
221: self << "\n"
222: indent!
223: self << "- "
224: @seq_map = true if v.class == Hash
225: v.to_yaml( :Emitter => self )
226: }
227: end
228: end
# File lib/yaml/baseemitter.rb, line 186
186: def seq_map_shortcut
187: # FIXME: seq_map needs to work with the new anchoring system
188: # if @seq_map
189: # @anchor_extras[@buffer.length - 1] = "\n" + indent
190: # @seq_map = false
191: # else
192: self << "\n"
193: indent!
194: # end
195: end