66
|
1 package yaml
|
|
2
|
|
3 import (
|
|
4 "bytes"
|
|
5 "fmt"
|
|
6 )
|
|
7
|
|
8 // Flush the buffer if needed.
|
|
9 func flush(emitter *yaml_emitter_t) bool {
|
|
10 if emitter.buffer_pos+5 >= len(emitter.buffer) {
|
|
11 return yaml_emitter_flush(emitter)
|
|
12 }
|
|
13 return true
|
|
14 }
|
|
15
|
|
16 // Put a character to the output buffer.
|
|
17 func put(emitter *yaml_emitter_t, value byte) bool {
|
|
18 if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) {
|
|
19 return false
|
|
20 }
|
|
21 emitter.buffer[emitter.buffer_pos] = value
|
|
22 emitter.buffer_pos++
|
|
23 emitter.column++
|
|
24 return true
|
|
25 }
|
|
26
|
|
27 // Put a line break to the output buffer.
|
|
28 func put_break(emitter *yaml_emitter_t) bool {
|
|
29 if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) {
|
|
30 return false
|
|
31 }
|
|
32 switch emitter.line_break {
|
|
33 case yaml_CR_BREAK:
|
|
34 emitter.buffer[emitter.buffer_pos] = '\r'
|
|
35 emitter.buffer_pos += 1
|
|
36 case yaml_LN_BREAK:
|
|
37 emitter.buffer[emitter.buffer_pos] = '\n'
|
|
38 emitter.buffer_pos += 1
|
|
39 case yaml_CRLN_BREAK:
|
|
40 emitter.buffer[emitter.buffer_pos+0] = '\r'
|
|
41 emitter.buffer[emitter.buffer_pos+1] = '\n'
|
|
42 emitter.buffer_pos += 2
|
|
43 default:
|
|
44 panic("unknown line break setting")
|
|
45 }
|
|
46 emitter.column = 0
|
|
47 emitter.line++
|
|
48 return true
|
|
49 }
|
|
50
|
|
51 // Copy a character from a string into buffer.
|
|
52 func write(emitter *yaml_emitter_t, s []byte, i *int) bool {
|
|
53 if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) {
|
|
54 return false
|
|
55 }
|
|
56 p := emitter.buffer_pos
|
|
57 w := width(s[*i])
|
|
58 switch w {
|
|
59 case 4:
|
|
60 emitter.buffer[p+3] = s[*i+3]
|
|
61 fallthrough
|
|
62 case 3:
|
|
63 emitter.buffer[p+2] = s[*i+2]
|
|
64 fallthrough
|
|
65 case 2:
|
|
66 emitter.buffer[p+1] = s[*i+1]
|
|
67 fallthrough
|
|
68 case 1:
|
|
69 emitter.buffer[p+0] = s[*i+0]
|
|
70 default:
|
|
71 panic("unknown character width")
|
|
72 }
|
|
73 emitter.column++
|
|
74 emitter.buffer_pos += w
|
|
75 *i += w
|
|
76 return true
|
|
77 }
|
|
78
|
|
79 // Write a whole string into buffer.
|
|
80 func write_all(emitter *yaml_emitter_t, s []byte) bool {
|
|
81 for i := 0; i < len(s); {
|
|
82 if !write(emitter, s, &i) {
|
|
83 return false
|
|
84 }
|
|
85 }
|
|
86 return true
|
|
87 }
|
|
88
|
|
89 // Copy a line break character from a string into buffer.
|
|
90 func write_break(emitter *yaml_emitter_t, s []byte, i *int) bool {
|
|
91 if s[*i] == '\n' {
|
|
92 if !put_break(emitter) {
|
|
93 return false
|
|
94 }
|
|
95 *i++
|
|
96 } else {
|
|
97 if !write(emitter, s, i) {
|
|
98 return false
|
|
99 }
|
|
100 emitter.column = 0
|
|
101 emitter.line++
|
|
102 }
|
|
103 return true
|
|
104 }
|
|
105
|
|
106 // Set an emitter error and return false.
|
|
107 func yaml_emitter_set_emitter_error(emitter *yaml_emitter_t, problem string) bool {
|
|
108 emitter.error = yaml_EMITTER_ERROR
|
|
109 emitter.problem = problem
|
|
110 return false
|
|
111 }
|
|
112
|
|
113 // Emit an event.
|
|
114 func yaml_emitter_emit(emitter *yaml_emitter_t, event *yaml_event_t) bool {
|
|
115 emitter.events = append(emitter.events, *event)
|
|
116 for !yaml_emitter_need_more_events(emitter) {
|
|
117 event := &emitter.events[emitter.events_head]
|
|
118 if !yaml_emitter_analyze_event(emitter, event) {
|
|
119 return false
|
|
120 }
|
|
121 if !yaml_emitter_state_machine(emitter, event) {
|
|
122 return false
|
|
123 }
|
|
124 yaml_event_delete(event)
|
|
125 emitter.events_head++
|
|
126 }
|
|
127 return true
|
|
128 }
|
|
129
|
|
130 // Check if we need to accumulate more events before emitting.
|
|
131 //
|
|
132 // We accumulate extra
|
|
133 // - 1 event for DOCUMENT-START
|
|
134 // - 2 events for SEQUENCE-START
|
|
135 // - 3 events for MAPPING-START
|
|
136 //
|
|
137 func yaml_emitter_need_more_events(emitter *yaml_emitter_t) bool {
|
|
138 if emitter.events_head == len(emitter.events) {
|
|
139 return true
|
|
140 }
|
|
141 var accumulate int
|
|
142 switch emitter.events[emitter.events_head].typ {
|
|
143 case yaml_DOCUMENT_START_EVENT:
|
|
144 accumulate = 1
|
|
145 break
|
|
146 case yaml_SEQUENCE_START_EVENT:
|
|
147 accumulate = 2
|
|
148 break
|
|
149 case yaml_MAPPING_START_EVENT:
|
|
150 accumulate = 3
|
|
151 break
|
|
152 default:
|
|
153 return false
|
|
154 }
|
|
155 if len(emitter.events)-emitter.events_head > accumulate {
|
|
156 return false
|
|
157 }
|
|
158 var level int
|
|
159 for i := emitter.events_head; i < len(emitter.events); i++ {
|
|
160 switch emitter.events[i].typ {
|
|
161 case yaml_STREAM_START_EVENT, yaml_DOCUMENT_START_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT:
|
|
162 level++
|
|
163 case yaml_STREAM_END_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_END_EVENT, yaml_MAPPING_END_EVENT:
|
|
164 level--
|
|
165 }
|
|
166 if level == 0 {
|
|
167 return false
|
|
168 }
|
|
169 }
|
|
170 return true
|
|
171 }
|
|
172
|
|
173 // Append a directive to the directives stack.
|
|
174 func yaml_emitter_append_tag_directive(emitter *yaml_emitter_t, value *yaml_tag_directive_t, allow_duplicates bool) bool {
|
|
175 for i := 0; i < len(emitter.tag_directives); i++ {
|
|
176 if bytes.Equal(value.handle, emitter.tag_directives[i].handle) {
|
|
177 if allow_duplicates {
|
|
178 return true
|
|
179 }
|
|
180 return yaml_emitter_set_emitter_error(emitter, "duplicate %TAG directive")
|
|
181 }
|
|
182 }
|
|
183
|
|
184 // [Go] Do we actually need to copy this given garbage collection
|
|
185 // and the lack of deallocating destructors?
|
|
186 tag_copy := yaml_tag_directive_t{
|
|
187 handle: make([]byte, len(value.handle)),
|
|
188 prefix: make([]byte, len(value.prefix)),
|
|
189 }
|
|
190 copy(tag_copy.handle, value.handle)
|
|
191 copy(tag_copy.prefix, value.prefix)
|
|
192 emitter.tag_directives = append(emitter.tag_directives, tag_copy)
|
|
193 return true
|
|
194 }
|
|
195
|
|
196 // Increase the indentation level.
|
|
197 func yaml_emitter_increase_indent(emitter *yaml_emitter_t, flow, indentless bool) bool {
|
|
198 emitter.indents = append(emitter.indents, emitter.indent)
|
|
199 if emitter.indent < 0 {
|
|
200 if flow {
|
|
201 emitter.indent = emitter.best_indent
|
|
202 } else {
|
|
203 emitter.indent = 0
|
|
204 }
|
|
205 } else if !indentless {
|
|
206 emitter.indent += emitter.best_indent
|
|
207 }
|
|
208 return true
|
|
209 }
|
|
210
|
|
211 // State dispatcher.
|
|
212 func yaml_emitter_state_machine(emitter *yaml_emitter_t, event *yaml_event_t) bool {
|
|
213 switch emitter.state {
|
|
214 default:
|
|
215 case yaml_EMIT_STREAM_START_STATE:
|
|
216 return yaml_emitter_emit_stream_start(emitter, event)
|
|
217
|
|
218 case yaml_EMIT_FIRST_DOCUMENT_START_STATE:
|
|
219 return yaml_emitter_emit_document_start(emitter, event, true)
|
|
220
|
|
221 case yaml_EMIT_DOCUMENT_START_STATE:
|
|
222 return yaml_emitter_emit_document_start(emitter, event, false)
|
|
223
|
|
224 case yaml_EMIT_DOCUMENT_CONTENT_STATE:
|
|
225 return yaml_emitter_emit_document_content(emitter, event)
|
|
226
|
|
227 case yaml_EMIT_DOCUMENT_END_STATE:
|
|
228 return yaml_emitter_emit_document_end(emitter, event)
|
|
229
|
|
230 case yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE:
|
|
231 return yaml_emitter_emit_flow_sequence_item(emitter, event, true)
|
|
232
|
|
233 case yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE:
|
|
234 return yaml_emitter_emit_flow_sequence_item(emitter, event, false)
|
|
235
|
|
236 case yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE:
|
|
237 return yaml_emitter_emit_flow_mapping_key(emitter, event, true)
|
|
238
|
|
239 case yaml_EMIT_FLOW_MAPPING_KEY_STATE:
|
|
240 return yaml_emitter_emit_flow_mapping_key(emitter, event, false)
|
|
241
|
|
242 case yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE:
|
|
243 return yaml_emitter_emit_flow_mapping_value(emitter, event, true)
|
|
244
|
|
245 case yaml_EMIT_FLOW_MAPPING_VALUE_STATE:
|
|
246 return yaml_emitter_emit_flow_mapping_value(emitter, event, false)
|
|
247
|
|
248 case yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE:
|
|
249 return yaml_emitter_emit_block_sequence_item(emitter, event, true)
|
|
250
|
|
251 case yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE:
|
|
252 return yaml_emitter_emit_block_sequence_item(emitter, event, false)
|
|
253
|
|
254 case yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE:
|
|
255 return yaml_emitter_emit_block_mapping_key(emitter, event, true)
|
|
256
|
|
257 case yaml_EMIT_BLOCK_MAPPING_KEY_STATE:
|
|
258 return yaml_emitter_emit_block_mapping_key(emitter, event, false)
|
|
259
|
|
260 case yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE:
|
|
261 return yaml_emitter_emit_block_mapping_value(emitter, event, true)
|
|
262
|
|
263 case yaml_EMIT_BLOCK_MAPPING_VALUE_STATE:
|
|
264 return yaml_emitter_emit_block_mapping_value(emitter, event, false)
|
|
265
|
|
266 case yaml_EMIT_END_STATE:
|
|
267 return yaml_emitter_set_emitter_error(emitter, "expected nothing after STREAM-END")
|
|
268 }
|
|
269 panic("invalid emitter state")
|
|
270 }
|
|
271
|
|
272 // Expect STREAM-START.
|
|
273 func yaml_emitter_emit_stream_start(emitter *yaml_emitter_t, event *yaml_event_t) bool {
|
|
274 if event.typ != yaml_STREAM_START_EVENT {
|
|
275 return yaml_emitter_set_emitter_error(emitter, "expected STREAM-START")
|
|
276 }
|
|
277 if emitter.encoding == yaml_ANY_ENCODING {
|
|
278 emitter.encoding = event.encoding
|
|
279 if emitter.encoding == yaml_ANY_ENCODING {
|
|
280 emitter.encoding = yaml_UTF8_ENCODING
|
|
281 }
|
|
282 }
|
|
283 if emitter.best_indent < 2 || emitter.best_indent > 9 {
|
|
284 emitter.best_indent = 2
|
|
285 }
|
|
286 if emitter.best_width >= 0 && emitter.best_width <= emitter.best_indent*2 {
|
|
287 emitter.best_width = 80
|
|
288 }
|
|
289 if emitter.best_width < 0 {
|
|
290 emitter.best_width = 1<<31 - 1
|
|
291 }
|
|
292 if emitter.line_break == yaml_ANY_BREAK {
|
|
293 emitter.line_break = yaml_LN_BREAK
|
|
294 }
|
|
295
|
|
296 emitter.indent = -1
|
|
297 emitter.line = 0
|
|
298 emitter.column = 0
|
|
299 emitter.whitespace = true
|
|
300 emitter.indention = true
|
|
301
|
|
302 if emitter.encoding != yaml_UTF8_ENCODING {
|
|
303 if !yaml_emitter_write_bom(emitter) {
|
|
304 return false
|
|
305 }
|
|
306 }
|
|
307 emitter.state = yaml_EMIT_FIRST_DOCUMENT_START_STATE
|
|
308 return true
|
|
309 }
|
|
310
|
|
311 // Expect DOCUMENT-START or STREAM-END.
|
|
312 func yaml_emitter_emit_document_start(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
|
|
313
|
|
314 if event.typ == yaml_DOCUMENT_START_EVENT {
|
|
315
|
|
316 if event.version_directive != nil {
|
|
317 if !yaml_emitter_analyze_version_directive(emitter, event.version_directive) {
|
|
318 return false
|
|
319 }
|
|
320 }
|
|
321
|
|
322 for i := 0; i < len(event.tag_directives); i++ {
|
|
323 tag_directive := &event.tag_directives[i]
|
|
324 if !yaml_emitter_analyze_tag_directive(emitter, tag_directive) {
|
|
325 return false
|
|
326 }
|
|
327 if !yaml_emitter_append_tag_directive(emitter, tag_directive, false) {
|
|
328 return false
|
|
329 }
|
|
330 }
|
|
331
|
|
332 for i := 0; i < len(default_tag_directives); i++ {
|
|
333 tag_directive := &default_tag_directives[i]
|
|
334 if !yaml_emitter_append_tag_directive(emitter, tag_directive, true) {
|
|
335 return false
|
|
336 }
|
|
337 }
|
|
338
|
|
339 implicit := event.implicit
|
|
340 if !first || emitter.canonical {
|
|
341 implicit = false
|
|
342 }
|
|
343
|
|
344 if emitter.open_ended && (event.version_directive != nil || len(event.tag_directives) > 0) {
|
|
345 if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) {
|
|
346 return false
|
|
347 }
|
|
348 if !yaml_emitter_write_indent(emitter) {
|
|
349 return false
|
|
350 }
|
|
351 }
|
|
352
|
|
353 if event.version_directive != nil {
|
|
354 implicit = false
|
|
355 if !yaml_emitter_write_indicator(emitter, []byte("%YAML"), true, false, false) {
|
|
356 return false
|
|
357 }
|
|
358 if !yaml_emitter_write_indicator(emitter, []byte("1.1"), true, false, false) {
|
|
359 return false
|
|
360 }
|
|
361 if !yaml_emitter_write_indent(emitter) {
|
|
362 return false
|
|
363 }
|
|
364 }
|
|
365
|
|
366 if len(event.tag_directives) > 0 {
|
|
367 implicit = false
|
|
368 for i := 0; i < len(event.tag_directives); i++ {
|
|
369 tag_directive := &event.tag_directives[i]
|
|
370 if !yaml_emitter_write_indicator(emitter, []byte("%TAG"), true, false, false) {
|
|
371 return false
|
|
372 }
|
|
373 if !yaml_emitter_write_tag_handle(emitter, tag_directive.handle) {
|
|
374 return false
|
|
375 }
|
|
376 if !yaml_emitter_write_tag_content(emitter, tag_directive.prefix, true) {
|
|
377 return false
|
|
378 }
|
|
379 if !yaml_emitter_write_indent(emitter) {
|
|
380 return false
|
|
381 }
|
|
382 }
|
|
383 }
|
|
384
|
|
385 if yaml_emitter_check_empty_document(emitter) {
|
|
386 implicit = false
|
|
387 }
|
|
388 if !implicit {
|
|
389 if !yaml_emitter_write_indent(emitter) {
|
|
390 return false
|
|
391 }
|
|
392 if !yaml_emitter_write_indicator(emitter, []byte("---"), true, false, false) {
|
|
393 return false
|
|
394 }
|
|
395 if emitter.canonical {
|
|
396 if !yaml_emitter_write_indent(emitter) {
|
|
397 return false
|
|
398 }
|
|
399 }
|
|
400 }
|
|
401
|
|
402 emitter.state = yaml_EMIT_DOCUMENT_CONTENT_STATE
|
|
403 return true
|
|
404 }
|
|
405
|
|
406 if event.typ == yaml_STREAM_END_EVENT {
|
|
407 if emitter.open_ended {
|
|
408 if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) {
|
|
409 return false
|
|
410 }
|
|
411 if !yaml_emitter_write_indent(emitter) {
|
|
412 return false
|
|
413 }
|
|
414 }
|
|
415 if !yaml_emitter_flush(emitter) {
|
|
416 return false
|
|
417 }
|
|
418 emitter.state = yaml_EMIT_END_STATE
|
|
419 return true
|
|
420 }
|
|
421
|
|
422 return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-START or STREAM-END")
|
|
423 }
|
|
424
|
|
425 // Expect the root node.
|
|
426 func yaml_emitter_emit_document_content(emitter *yaml_emitter_t, event *yaml_event_t) bool {
|
|
427 emitter.states = append(emitter.states, yaml_EMIT_DOCUMENT_END_STATE)
|
|
428 return yaml_emitter_emit_node(emitter, event, true, false, false, false)
|
|
429 }
|
|
430
|
|
431 // Expect DOCUMENT-END.
|
|
432 func yaml_emitter_emit_document_end(emitter *yaml_emitter_t, event *yaml_event_t) bool {
|
|
433 if event.typ != yaml_DOCUMENT_END_EVENT {
|
|
434 return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-END")
|
|
435 }
|
|
436 if !yaml_emitter_write_indent(emitter) {
|
|
437 return false
|
|
438 }
|
|
439 if !event.implicit {
|
|
440 // [Go] Allocate the slice elsewhere.
|
|
441 if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) {
|
|
442 return false
|
|
443 }
|
|
444 if !yaml_emitter_write_indent(emitter) {
|
|
445 return false
|
|
446 }
|
|
447 }
|
|
448 if !yaml_emitter_flush(emitter) {
|
|
449 return false
|
|
450 }
|
|
451 emitter.state = yaml_EMIT_DOCUMENT_START_STATE
|
|
452 emitter.tag_directives = emitter.tag_directives[:0]
|
|
453 return true
|
|
454 }
|
|
455
|
|
456 // Expect a flow item node.
|
|
457 func yaml_emitter_emit_flow_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
|
|
458 if first {
|
|
459 if !yaml_emitter_write_indicator(emitter, []byte{'['}, true, true, false) {
|
|
460 return false
|
|
461 }
|
|
462 if !yaml_emitter_increase_indent(emitter, true, false) {
|
|
463 return false
|
|
464 }
|
|
465 emitter.flow_level++
|
|
466 }
|
|
467
|
|
468 if event.typ == yaml_SEQUENCE_END_EVENT {
|
|
469 emitter.flow_level--
|
|
470 emitter.indent = emitter.indents[len(emitter.indents)-1]
|
|
471 emitter.indents = emitter.indents[:len(emitter.indents)-1]
|
|
472 if emitter.canonical && !first {
|
|
473 if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
|
|
474 return false
|
|
475 }
|
|
476 if !yaml_emitter_write_indent(emitter) {
|
|
477 return false
|
|
478 }
|
|
479 }
|
|
480 if !yaml_emitter_write_indicator(emitter, []byte{']'}, false, false, false) {
|
|
481 return false
|
|
482 }
|
|
483 emitter.state = emitter.states[len(emitter.states)-1]
|
|
484 emitter.states = emitter.states[:len(emitter.states)-1]
|
|
485
|
|
486 return true
|
|
487 }
|
|
488
|
|
489 if !first {
|
|
490 if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
|
|
491 return false
|
|
492 }
|
|
493 }
|
|
494
|
|
495 if emitter.canonical || emitter.column > emitter.best_width {
|
|
496 if !yaml_emitter_write_indent(emitter) {
|
|
497 return false
|
|
498 }
|
|
499 }
|
|
500 emitter.states = append(emitter.states, yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE)
|
|
501 return yaml_emitter_emit_node(emitter, event, false, true, false, false)
|
|
502 }
|
|
503
|
|
504 // Expect a flow key node.
|
|
505 func yaml_emitter_emit_flow_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
|
|
506 if first {
|
|
507 if !yaml_emitter_write_indicator(emitter, []byte{'{'}, true, true, false) {
|
|
508 return false
|
|
509 }
|
|
510 if !yaml_emitter_increase_indent(emitter, true, false) {
|
|
511 return false
|
|
512 }
|
|
513 emitter.flow_level++
|
|
514 }
|
|
515
|
|
516 if event.typ == yaml_MAPPING_END_EVENT {
|
|
517 emitter.flow_level--
|
|
518 emitter.indent = emitter.indents[len(emitter.indents)-1]
|
|
519 emitter.indents = emitter.indents[:len(emitter.indents)-1]
|
|
520 if emitter.canonical && !first {
|
|
521 if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
|
|
522 return false
|
|
523 }
|
|
524 if !yaml_emitter_write_indent(emitter) {
|
|
525 return false
|
|
526 }
|
|
527 }
|
|
528 if !yaml_emitter_write_indicator(emitter, []byte{'}'}, false, false, false) {
|
|
529 return false
|
|
530 }
|
|
531 emitter.state = emitter.states[len(emitter.states)-1]
|
|
532 emitter.states = emitter.states[:len(emitter.states)-1]
|
|
533 return true
|
|
534 }
|
|
535
|
|
536 if !first {
|
|
537 if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
|
|
538 return false
|
|
539 }
|
|
540 }
|
|
541 if emitter.canonical || emitter.column > emitter.best_width {
|
|
542 if !yaml_emitter_write_indent(emitter) {
|
|
543 return false
|
|
544 }
|
|
545 }
|
|
546
|
|
547 if !emitter.canonical && yaml_emitter_check_simple_key(emitter) {
|
|
548 emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE)
|
|
549 return yaml_emitter_emit_node(emitter, event, false, false, true, true)
|
|
550 }
|
|
551 if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, false) {
|
|
552 return false
|
|
553 }
|
|
554 emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_VALUE_STATE)
|
|
555 return yaml_emitter_emit_node(emitter, event, false, false, true, false)
|
|
556 }
|
|
557
|
|
558 // Expect a flow value node.
|
|
559 func yaml_emitter_emit_flow_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool {
|
|
560 if simple {
|
|
561 if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) {
|
|
562 return false
|
|
563 }
|
|
564 } else {
|
|
565 if emitter.canonical || emitter.column > emitter.best_width {
|
|
566 if !yaml_emitter_write_indent(emitter) {
|
|
567 return false
|
|
568 }
|
|
569 }
|
|
570 if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, false) {
|
|
571 return false
|
|
572 }
|
|
573 }
|
|
574 emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_KEY_STATE)
|
|
575 return yaml_emitter_emit_node(emitter, event, false, false, true, false)
|
|
576 }
|
|
577
|
|
578 // Expect a block item node.
|
|
579 func yaml_emitter_emit_block_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
|
|
580 if first {
|
|
581 if !yaml_emitter_increase_indent(emitter, false, emitter.mapping_context && !emitter.indention) {
|
|
582 return false
|
|
583 }
|
|
584 }
|
|
585 if event.typ == yaml_SEQUENCE_END_EVENT {
|
|
586 emitter.indent = emitter.indents[len(emitter.indents)-1]
|
|
587 emitter.indents = emitter.indents[:len(emitter.indents)-1]
|
|
588 emitter.state = emitter.states[len(emitter.states)-1]
|
|
589 emitter.states = emitter.states[:len(emitter.states)-1]
|
|
590 return true
|
|
591 }
|
|
592 if !yaml_emitter_write_indent(emitter) {
|
|
593 return false
|
|
594 }
|
|
595 if !yaml_emitter_write_indicator(emitter, []byte{'-'}, true, false, true) {
|
|
596 return false
|
|
597 }
|
|
598 emitter.states = append(emitter.states, yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE)
|
|
599 return yaml_emitter_emit_node(emitter, event, false, true, false, false)
|
|
600 }
|
|
601
|
|
602 // Expect a block key node.
|
|
603 func yaml_emitter_emit_block_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
|
|
604 if first {
|
|
605 if !yaml_emitter_increase_indent(emitter, false, false) {
|
|
606 return false
|
|
607 }
|
|
608 }
|
|
609 if event.typ == yaml_MAPPING_END_EVENT {
|
|
610 emitter.indent = emitter.indents[len(emitter.indents)-1]
|
|
611 emitter.indents = emitter.indents[:len(emitter.indents)-1]
|
|
612 emitter.state = emitter.states[len(emitter.states)-1]
|
|
613 emitter.states = emitter.states[:len(emitter.states)-1]
|
|
614 return true
|
|
615 }
|
|
616 if !yaml_emitter_write_indent(emitter) {
|
|
617 return false
|
|
618 }
|
|
619 if yaml_emitter_check_simple_key(emitter) {
|
|
620 emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE)
|
|
621 return yaml_emitter_emit_node(emitter, event, false, false, true, true)
|
|
622 }
|
|
623 if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, true) {
|
|
624 return false
|
|
625 }
|
|
626 emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_VALUE_STATE)
|
|
627 return yaml_emitter_emit_node(emitter, event, false, false, true, false)
|
|
628 }
|
|
629
|
|
630 // Expect a block value node.
|
|
631 func yaml_emitter_emit_block_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool {
|
|
632 if simple {
|
|
633 if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) {
|
|
634 return false
|
|
635 }
|
|
636 } else {
|
|
637 if !yaml_emitter_write_indent(emitter) {
|
|
638 return false
|
|
639 }
|
|
640 if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, true) {
|
|
641 return false
|
|
642 }
|
|
643 }
|
|
644 emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_KEY_STATE)
|
|
645 return yaml_emitter_emit_node(emitter, event, false, false, true, false)
|
|
646 }
|
|
647
|
|
648 // Expect a node.
|
|
649 func yaml_emitter_emit_node(emitter *yaml_emitter_t, event *yaml_event_t,
|
|
650 root bool, sequence bool, mapping bool, simple_key bool) bool {
|
|
651
|
|
652 emitter.root_context = root
|
|
653 emitter.sequence_context = sequence
|
|
654 emitter.mapping_context = mapping
|
|
655 emitter.simple_key_context = simple_key
|
|
656
|
|
657 switch event.typ {
|
|
658 case yaml_ALIAS_EVENT:
|
|
659 return yaml_emitter_emit_alias(emitter, event)
|
|
660 case yaml_SCALAR_EVENT:
|
|
661 return yaml_emitter_emit_scalar(emitter, event)
|
|
662 case yaml_SEQUENCE_START_EVENT:
|
|
663 return yaml_emitter_emit_sequence_start(emitter, event)
|
|
664 case yaml_MAPPING_START_EVENT:
|
|
665 return yaml_emitter_emit_mapping_start(emitter, event)
|
|
666 default:
|
|
667 return yaml_emitter_set_emitter_error(emitter,
|
|
668 fmt.Sprintf("expected SCALAR, SEQUENCE-START, MAPPING-START, or ALIAS, but got %v", event.typ))
|
|
669 }
|
|
670 }
|
|
671
|
|
672 // Expect ALIAS.
|
|
673 func yaml_emitter_emit_alias(emitter *yaml_emitter_t, event *yaml_event_t) bool {
|
|
674 if !yaml_emitter_process_anchor(emitter) {
|
|
675 return false
|
|
676 }
|
|
677 emitter.state = emitter.states[len(emitter.states)-1]
|
|
678 emitter.states = emitter.states[:len(emitter.states)-1]
|
|
679 return true
|
|
680 }
|
|
681
|
|
682 // Expect SCALAR.
|
|
683 func yaml_emitter_emit_scalar(emitter *yaml_emitter_t, event *yaml_event_t) bool {
|
|
684 if !yaml_emitter_select_scalar_style(emitter, event) {
|
|
685 return false
|
|
686 }
|
|
687 if !yaml_emitter_process_anchor(emitter) {
|
|
688 return false
|
|
689 }
|
|
690 if !yaml_emitter_process_tag(emitter) {
|
|
691 return false
|
|
692 }
|
|
693 if !yaml_emitter_increase_indent(emitter, true, false) {
|
|
694 return false
|
|
695 }
|
|
696 if !yaml_emitter_process_scalar(emitter) {
|
|
697 return false
|
|
698 }
|
|
699 emitter.indent = emitter.indents[len(emitter.indents)-1]
|
|
700 emitter.indents = emitter.indents[:len(emitter.indents)-1]
|
|
701 emitter.state = emitter.states[len(emitter.states)-1]
|
|
702 emitter.states = emitter.states[:len(emitter.states)-1]
|
|
703 return true
|
|
704 }
|
|
705
|
|
706 // Expect SEQUENCE-START.
|
|
707 func yaml_emitter_emit_sequence_start(emitter *yaml_emitter_t, event *yaml_event_t) bool {
|
|
708 if !yaml_emitter_process_anchor(emitter) {
|
|
709 return false
|
|
710 }
|
|
711 if !yaml_emitter_process_tag(emitter) {
|
|
712 return false
|
|
713 }
|
|
714 if emitter.flow_level > 0 || emitter.canonical || event.sequence_style() == yaml_FLOW_SEQUENCE_STYLE ||
|
|
715 yaml_emitter_check_empty_sequence(emitter) {
|
|
716 emitter.state = yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE
|
|
717 } else {
|
|
718 emitter.state = yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE
|
|
719 }
|
|
720 return true
|
|
721 }
|
|
722
|
|
723 // Expect MAPPING-START.
|
|
724 func yaml_emitter_emit_mapping_start(emitter *yaml_emitter_t, event *yaml_event_t) bool {
|
|
725 if !yaml_emitter_process_anchor(emitter) {
|
|
726 return false
|
|
727 }
|
|
728 if !yaml_emitter_process_tag(emitter) {
|
|
729 return false
|
|
730 }
|
|
731 if emitter.flow_level > 0 || emitter.canonical || event.mapping_style() == yaml_FLOW_MAPPING_STYLE ||
|
|
732 yaml_emitter_check_empty_mapping(emitter) {
|
|
733 emitter.state = yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE
|
|
734 } else {
|
|
735 emitter.state = yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE
|
|
736 }
|
|
737 return true
|
|
738 }
|
|
739
|
|
740 // Check if the document content is an empty scalar.
|
|
741 func yaml_emitter_check_empty_document(emitter *yaml_emitter_t) bool {
|
|
742 return false // [Go] Huh?
|
|
743 }
|
|
744
|
|
745 // Check if the next events represent an empty sequence.
|
|
746 func yaml_emitter_check_empty_sequence(emitter *yaml_emitter_t) bool {
|
|
747 if len(emitter.events)-emitter.events_head < 2 {
|
|
748 return false
|
|
749 }
|
|
750 return emitter.events[emitter.events_head].typ == yaml_SEQUENCE_START_EVENT &&
|
|
751 emitter.events[emitter.events_head+1].typ == yaml_SEQUENCE_END_EVENT
|
|
752 }
|
|
753
|
|
754 // Check if the next events represent an empty mapping.
|
|
755 func yaml_emitter_check_empty_mapping(emitter *yaml_emitter_t) bool {
|
|
756 if len(emitter.events)-emitter.events_head < 2 {
|
|
757 return false
|
|
758 }
|
|
759 return emitter.events[emitter.events_head].typ == yaml_MAPPING_START_EVENT &&
|
|
760 emitter.events[emitter.events_head+1].typ == yaml_MAPPING_END_EVENT
|
|
761 }
|
|
762
|
|
763 // Check if the next node can be expressed as a simple key.
|
|
764 func yaml_emitter_check_simple_key(emitter *yaml_emitter_t) bool {
|
|
765 length := 0
|
|
766 switch emitter.events[emitter.events_head].typ {
|
|
767 case yaml_ALIAS_EVENT:
|
|
768 length += len(emitter.anchor_data.anchor)
|
|
769 case yaml_SCALAR_EVENT:
|
|
770 if emitter.scalar_data.multiline {
|
|
771 return false
|
|
772 }
|
|
773 length += len(emitter.anchor_data.anchor) +
|
|
774 len(emitter.tag_data.handle) +
|
|
775 len(emitter.tag_data.suffix) +
|
|
776 len(emitter.scalar_data.value)
|
|
777 case yaml_SEQUENCE_START_EVENT:
|
|
778 if !yaml_emitter_check_empty_sequence(emitter) {
|
|
779 return false
|
|
780 }
|
|
781 length += len(emitter.anchor_data.anchor) +
|
|
782 len(emitter.tag_data.handle) +
|
|
783 len(emitter.tag_data.suffix)
|
|
784 case yaml_MAPPING_START_EVENT:
|
|
785 if !yaml_emitter_check_empty_mapping(emitter) {
|
|
786 return false
|
|
787 }
|
|
788 length += len(emitter.anchor_data.anchor) +
|
|
789 len(emitter.tag_data.handle) +
|
|
790 len(emitter.tag_data.suffix)
|
|
791 default:
|
|
792 return false
|
|
793 }
|
|
794 return length <= 128
|
|
795 }
|
|
796
|
|
797 // Determine an acceptable scalar style.
|
|
798 func yaml_emitter_select_scalar_style(emitter *yaml_emitter_t, event *yaml_event_t) bool {
|
|
799
|
|
800 no_tag := len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0
|
|
801 if no_tag && !event.implicit && !event.quoted_implicit {
|
|
802 return yaml_emitter_set_emitter_error(emitter, "neither tag nor implicit flags are specified")
|
|
803 }
|
|
804
|
|
805 style := event.scalar_style()
|
|
806 if style == yaml_ANY_SCALAR_STYLE {
|
|
807 style = yaml_PLAIN_SCALAR_STYLE
|
|
808 }
|
|
809 if emitter.canonical {
|
|
810 style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
|
|
811 }
|
|
812 if emitter.simple_key_context && emitter.scalar_data.multiline {
|
|
813 style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
|
|
814 }
|
|
815
|
|
816 if style == yaml_PLAIN_SCALAR_STYLE {
|
|
817 if emitter.flow_level > 0 && !emitter.scalar_data.flow_plain_allowed ||
|
|
818 emitter.flow_level == 0 && !emitter.scalar_data.block_plain_allowed {
|
|
819 style = yaml_SINGLE_QUOTED_SCALAR_STYLE
|
|
820 }
|
|
821 if len(emitter.scalar_data.value) == 0 && (emitter.flow_level > 0 || emitter.simple_key_context) {
|
|
822 style = yaml_SINGLE_QUOTED_SCALAR_STYLE
|
|
823 }
|
|
824 if no_tag && !event.implicit {
|
|
825 style = yaml_SINGLE_QUOTED_SCALAR_STYLE
|
|
826 }
|
|
827 }
|
|
828 if style == yaml_SINGLE_QUOTED_SCALAR_STYLE {
|
|
829 if !emitter.scalar_data.single_quoted_allowed {
|
|
830 style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
|
|
831 }
|
|
832 }
|
|
833 if style == yaml_LITERAL_SCALAR_STYLE || style == yaml_FOLDED_SCALAR_STYLE {
|
|
834 if !emitter.scalar_data.block_allowed || emitter.flow_level > 0 || emitter.simple_key_context {
|
|
835 style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
|
|
836 }
|
|
837 }
|
|
838
|
|
839 if no_tag && !event.quoted_implicit && style != yaml_PLAIN_SCALAR_STYLE {
|
|
840 emitter.tag_data.handle = []byte{'!'}
|
|
841 }
|
|
842 emitter.scalar_data.style = style
|
|
843 return true
|
|
844 }
|
|
845
|
|
846 // Write an anchor.
|
|
847 func yaml_emitter_process_anchor(emitter *yaml_emitter_t) bool {
|
|
848 if emitter.anchor_data.anchor == nil {
|
|
849 return true
|
|
850 }
|
|
851 c := []byte{'&'}
|
|
852 if emitter.anchor_data.alias {
|
|
853 c[0] = '*'
|
|
854 }
|
|
855 if !yaml_emitter_write_indicator(emitter, c, true, false, false) {
|
|
856 return false
|
|
857 }
|
|
858 return yaml_emitter_write_anchor(emitter, emitter.anchor_data.anchor)
|
|
859 }
|
|
860
|
|
861 // Write a tag.
|
|
862 func yaml_emitter_process_tag(emitter *yaml_emitter_t) bool {
|
|
863 if len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0 {
|
|
864 return true
|
|
865 }
|
|
866 if len(emitter.tag_data.handle) > 0 {
|
|
867 if !yaml_emitter_write_tag_handle(emitter, emitter.tag_data.handle) {
|
|
868 return false
|
|
869 }
|
|
870 if len(emitter.tag_data.suffix) > 0 {
|
|
871 if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) {
|
|
872 return false
|
|
873 }
|
|
874 }
|
|
875 } else {
|
|
876 // [Go] Allocate these slices elsewhere.
|
|
877 if !yaml_emitter_write_indicator(emitter, []byte("!<"), true, false, false) {
|
|
878 return false
|
|
879 }
|
|
880 if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) {
|
|
881 return false
|
|
882 }
|
|
883 if !yaml_emitter_write_indicator(emitter, []byte{'>'}, false, false, false) {
|
|
884 return false
|
|
885 }
|
|
886 }
|
|
887 return true
|
|
888 }
|
|
889
|
|
890 // Write a scalar.
|
|
891 func yaml_emitter_process_scalar(emitter *yaml_emitter_t) bool {
|
|
892 switch emitter.scalar_data.style {
|
|
893 case yaml_PLAIN_SCALAR_STYLE:
|
|
894 return yaml_emitter_write_plain_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context)
|
|
895
|
|
896 case yaml_SINGLE_QUOTED_SCALAR_STYLE:
|
|
897 return yaml_emitter_write_single_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context)
|
|
898
|
|
899 case yaml_DOUBLE_QUOTED_SCALAR_STYLE:
|
|
900 return yaml_emitter_write_double_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context)
|
|
901
|
|
902 case yaml_LITERAL_SCALAR_STYLE:
|
|
903 return yaml_emitter_write_literal_scalar(emitter, emitter.scalar_data.value)
|
|
904
|
|
905 case yaml_FOLDED_SCALAR_STYLE:
|
|
906 return yaml_emitter_write_folded_scalar(emitter, emitter.scalar_data.value)
|
|
907 }
|
|
908 panic("unknown scalar style")
|
|
909 }
|
|
910
|
|
911 // Check if a %YAML directive is valid.
|
|
912 func yaml_emitter_analyze_version_directive(emitter *yaml_emitter_t, version_directive *yaml_version_directive_t) bool {
|
|
913 if version_directive.major != 1 || version_directive.minor != 1 {
|
|
914 return yaml_emitter_set_emitter_error(emitter, "incompatible %YAML directive")
|
|
915 }
|
|
916 return true
|
|
917 }
|
|
918
|
|
919 // Check if a %TAG directive is valid.
|
|
920 func yaml_emitter_analyze_tag_directive(emitter *yaml_emitter_t, tag_directive *yaml_tag_directive_t) bool {
|
|
921 handle := tag_directive.handle
|
|
922 prefix := tag_directive.prefix
|
|
923 if len(handle) == 0 {
|
|
924 return yaml_emitter_set_emitter_error(emitter, "tag handle must not be empty")
|
|
925 }
|
|
926 if handle[0] != '!' {
|
|
927 return yaml_emitter_set_emitter_error(emitter, "tag handle must start with '!'")
|
|
928 }
|
|
929 if handle[len(handle)-1] != '!' {
|
|
930 return yaml_emitter_set_emitter_error(emitter, "tag handle must end with '!'")
|
|
931 }
|
|
932 for i := 1; i < len(handle)-1; i += width(handle[i]) {
|
|
933 if !is_alpha(handle, i) {
|
|
934 return yaml_emitter_set_emitter_error(emitter, "tag handle must contain alphanumerical characters only")
|
|
935 }
|
|
936 }
|
|
937 if len(prefix) == 0 {
|
|
938 return yaml_emitter_set_emitter_error(emitter, "tag prefix must not be empty")
|
|
939 }
|
|
940 return true
|
|
941 }
|
|
942
|
|
943 // Check if an anchor is valid.
|
|
944 func yaml_emitter_analyze_anchor(emitter *yaml_emitter_t, anchor []byte, alias bool) bool {
|
|
945 if len(anchor) == 0 {
|
|
946 problem := "anchor value must not be empty"
|
|
947 if alias {
|
|
948 problem = "alias value must not be empty"
|
|
949 }
|
|
950 return yaml_emitter_set_emitter_error(emitter, problem)
|
|
951 }
|
|
952 for i := 0; i < len(anchor); i += width(anchor[i]) {
|
|
953 if !is_alpha(anchor, i) {
|
|
954 problem := "anchor value must contain alphanumerical characters only"
|
|
955 if alias {
|
|
956 problem = "alias value must contain alphanumerical characters only"
|
|
957 }
|
|
958 return yaml_emitter_set_emitter_error(emitter, problem)
|
|
959 }
|
|
960 }
|
|
961 emitter.anchor_data.anchor = anchor
|
|
962 emitter.anchor_data.alias = alias
|
|
963 return true
|
|
964 }
|
|
965
|
|
966 // Check if a tag is valid.
|
|
967 func yaml_emitter_analyze_tag(emitter *yaml_emitter_t, tag []byte) bool {
|
|
968 if len(tag) == 0 {
|
|
969 return yaml_emitter_set_emitter_error(emitter, "tag value must not be empty")
|
|
970 }
|
|
971 for i := 0; i < len(emitter.tag_directives); i++ {
|
|
972 tag_directive := &emitter.tag_directives[i]
|
|
973 if bytes.HasPrefix(tag, tag_directive.prefix) {
|
|
974 emitter.tag_data.handle = tag_directive.handle
|
|
975 emitter.tag_data.suffix = tag[len(tag_directive.prefix):]
|
|
976 return true
|
|
977 }
|
|
978 }
|
|
979 emitter.tag_data.suffix = tag
|
|
980 return true
|
|
981 }
|
|
982
|
|
983 // Check if a scalar is valid.
|
|
984 func yaml_emitter_analyze_scalar(emitter *yaml_emitter_t, value []byte) bool {
|
|
985 var (
|
|
986 block_indicators = false
|
|
987 flow_indicators = false
|
|
988 line_breaks = false
|
|
989 special_characters = false
|
|
990
|
|
991 leading_space = false
|
|
992 leading_break = false
|
|
993 trailing_space = false
|
|
994 trailing_break = false
|
|
995 break_space = false
|
|
996 space_break = false
|
|
997
|
|
998 preceded_by_whitespace = false
|
|
999 followed_by_whitespace = false
|
|
1000 previous_space = false
|
|
1001 previous_break = false
|
|
1002 )
|
|
1003
|
|
1004 emitter.scalar_data.value = value
|
|
1005
|
|
1006 if len(value) == 0 {
|
|
1007 emitter.scalar_data.multiline = false
|
|
1008 emitter.scalar_data.flow_plain_allowed = false
|
|
1009 emitter.scalar_data.block_plain_allowed = true
|
|
1010 emitter.scalar_data.single_quoted_allowed = true
|
|
1011 emitter.scalar_data.block_allowed = false
|
|
1012 return true
|
|
1013 }
|
|
1014
|
|
1015 if len(value) >= 3 && ((value[0] == '-' && value[1] == '-' && value[2] == '-') || (value[0] == '.' && value[1] == '.' && value[2] == '.')) {
|
|
1016 block_indicators = true
|
|
1017 flow_indicators = true
|
|
1018 }
|
|
1019
|
|
1020 preceded_by_whitespace = true
|
|
1021 for i, w := 0, 0; i < len(value); i += w {
|
|
1022 w = width(value[i])
|
|
1023 followed_by_whitespace = i+w >= len(value) || is_blank(value, i+w)
|
|
1024
|
|
1025 if i == 0 {
|
|
1026 switch value[i] {
|
|
1027 case '#', ',', '[', ']', '{', '}', '&', '*', '!', '|', '>', '\'', '"', '%', '@', '`':
|
|
1028 flow_indicators = true
|
|
1029 block_indicators = true
|
|
1030 case '?', ':':
|
|
1031 flow_indicators = true
|
|
1032 if followed_by_whitespace {
|
|
1033 block_indicators = true
|
|
1034 }
|
|
1035 case '-':
|
|
1036 if followed_by_whitespace {
|
|
1037 flow_indicators = true
|
|
1038 block_indicators = true
|
|
1039 }
|
|
1040 }
|
|
1041 } else {
|
|
1042 switch value[i] {
|
|
1043 case ',', '?', '[', ']', '{', '}':
|
|
1044 flow_indicators = true
|
|
1045 case ':':
|
|
1046 flow_indicators = true
|
|
1047 if followed_by_whitespace {
|
|
1048 block_indicators = true
|
|
1049 }
|
|
1050 case '#':
|
|
1051 if preceded_by_whitespace {
|
|
1052 flow_indicators = true
|
|
1053 block_indicators = true
|
|
1054 }
|
|
1055 }
|
|
1056 }
|
|
1057
|
|
1058 if !is_printable(value, i) || !is_ascii(value, i) && !emitter.unicode {
|
|
1059 special_characters = true
|
|
1060 }
|
|
1061 if is_space(value, i) {
|
|
1062 if i == 0 {
|
|
1063 leading_space = true
|
|
1064 }
|
|
1065 if i+width(value[i]) == len(value) {
|
|
1066 trailing_space = true
|
|
1067 }
|
|
1068 if previous_break {
|
|
1069 break_space = true
|
|
1070 }
|
|
1071 previous_space = true
|
|
1072 previous_break = false
|
|
1073 } else if is_break(value, i) {
|
|
1074 line_breaks = true
|
|
1075 if i == 0 {
|
|
1076 leading_break = true
|
|
1077 }
|
|
1078 if i+width(value[i]) == len(value) {
|
|
1079 trailing_break = true
|
|
1080 }
|
|
1081 if previous_space {
|
|
1082 space_break = true
|
|
1083 }
|
|
1084 previous_space = false
|
|
1085 previous_break = true
|
|
1086 } else {
|
|
1087 previous_space = false
|
|
1088 previous_break = false
|
|
1089 }
|
|
1090
|
|
1091 // [Go]: Why 'z'? Couldn't be the end of the string as that's the loop condition.
|
|
1092 preceded_by_whitespace = is_blankz(value, i)
|
|
1093 }
|
|
1094
|
|
1095 emitter.scalar_data.multiline = line_breaks
|
|
1096 emitter.scalar_data.flow_plain_allowed = true
|
|
1097 emitter.scalar_data.block_plain_allowed = true
|
|
1098 emitter.scalar_data.single_quoted_allowed = true
|
|
1099 emitter.scalar_data.block_allowed = true
|
|
1100
|
|
1101 if leading_space || leading_break || trailing_space || trailing_break {
|
|
1102 emitter.scalar_data.flow_plain_allowed = false
|
|
1103 emitter.scalar_data.block_plain_allowed = false
|
|
1104 }
|
|
1105 if trailing_space {
|
|
1106 emitter.scalar_data.block_allowed = false
|
|
1107 }
|
|
1108 if break_space {
|
|
1109 emitter.scalar_data.flow_plain_allowed = false
|
|
1110 emitter.scalar_data.block_plain_allowed = false
|
|
1111 emitter.scalar_data.single_quoted_allowed = false
|
|
1112 }
|
|
1113 if space_break || special_characters {
|
|
1114 emitter.scalar_data.flow_plain_allowed = false
|
|
1115 emitter.scalar_data.block_plain_allowed = false
|
|
1116 emitter.scalar_data.single_quoted_allowed = false
|
|
1117 emitter.scalar_data.block_allowed = false
|
|
1118 }
|
|
1119 if line_breaks {
|
|
1120 emitter.scalar_data.flow_plain_allowed = false
|
|
1121 emitter.scalar_data.block_plain_allowed = false
|
|
1122 }
|
|
1123 if flow_indicators {
|
|
1124 emitter.scalar_data.flow_plain_allowed = false
|
|
1125 }
|
|
1126 if block_indicators {
|
|
1127 emitter.scalar_data.block_plain_allowed = false
|
|
1128 }
|
|
1129 return true
|
|
1130 }
|
|
1131
|
|
1132 // Check if the event data is valid.
|
|
1133 func yaml_emitter_analyze_event(emitter *yaml_emitter_t, event *yaml_event_t) bool {
|
|
1134
|
|
1135 emitter.anchor_data.anchor = nil
|
|
1136 emitter.tag_data.handle = nil
|
|
1137 emitter.tag_data.suffix = nil
|
|
1138 emitter.scalar_data.value = nil
|
|
1139
|
|
1140 switch event.typ {
|
|
1141 case yaml_ALIAS_EVENT:
|
|
1142 if !yaml_emitter_analyze_anchor(emitter, event.anchor, true) {
|
|
1143 return false
|
|
1144 }
|
|
1145
|
|
1146 case yaml_SCALAR_EVENT:
|
|
1147 if len(event.anchor) > 0 {
|
|
1148 if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) {
|
|
1149 return false
|
|
1150 }
|
|
1151 }
|
|
1152 if len(event.tag) > 0 && (emitter.canonical || (!event.implicit && !event.quoted_implicit)) {
|
|
1153 if !yaml_emitter_analyze_tag(emitter, event.tag) {
|
|
1154 return false
|
|
1155 }
|
|
1156 }
|
|
1157 if !yaml_emitter_analyze_scalar(emitter, event.value) {
|
|
1158 return false
|
|
1159 }
|
|
1160
|
|
1161 case yaml_SEQUENCE_START_EVENT:
|
|
1162 if len(event.anchor) > 0 {
|
|
1163 if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) {
|
|
1164 return false
|
|
1165 }
|
|
1166 }
|
|
1167 if len(event.tag) > 0 && (emitter.canonical || !event.implicit) {
|
|
1168 if !yaml_emitter_analyze_tag(emitter, event.tag) {
|
|
1169 return false
|
|
1170 }
|
|
1171 }
|
|
1172
|
|
1173 case yaml_MAPPING_START_EVENT:
|
|
1174 if len(event.anchor) > 0 {
|
|
1175 if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) {
|
|
1176 return false
|
|
1177 }
|
|
1178 }
|
|
1179 if len(event.tag) > 0 && (emitter.canonical || !event.implicit) {
|
|
1180 if !yaml_emitter_analyze_tag(emitter, event.tag) {
|
|
1181 return false
|
|
1182 }
|
|
1183 }
|
|
1184 }
|
|
1185 return true
|
|
1186 }
|
|
1187
|
|
1188 // Write the BOM character.
|
|
1189 func yaml_emitter_write_bom(emitter *yaml_emitter_t) bool {
|
|
1190 if !flush(emitter) {
|
|
1191 return false
|
|
1192 }
|
|
1193 pos := emitter.buffer_pos
|
|
1194 emitter.buffer[pos+0] = '\xEF'
|
|
1195 emitter.buffer[pos+1] = '\xBB'
|
|
1196 emitter.buffer[pos+2] = '\xBF'
|
|
1197 emitter.buffer_pos += 3
|
|
1198 return true
|
|
1199 }
|
|
1200
|
|
1201 func yaml_emitter_write_indent(emitter *yaml_emitter_t) bool {
|
|
1202 indent := emitter.indent
|
|
1203 if indent < 0 {
|
|
1204 indent = 0
|
|
1205 }
|
|
1206 if !emitter.indention || emitter.column > indent || (emitter.column == indent && !emitter.whitespace) {
|
|
1207 if !put_break(emitter) {
|
|
1208 return false
|
|
1209 }
|
|
1210 }
|
|
1211 for emitter.column < indent {
|
|
1212 if !put(emitter, ' ') {
|
|
1213 return false
|
|
1214 }
|
|
1215 }
|
|
1216 emitter.whitespace = true
|
|
1217 emitter.indention = true
|
|
1218 return true
|
|
1219 }
|
|
1220
|
|
1221 func yaml_emitter_write_indicator(emitter *yaml_emitter_t, indicator []byte, need_whitespace, is_whitespace, is_indention bool) bool {
|
|
1222 if need_whitespace && !emitter.whitespace {
|
|
1223 if !put(emitter, ' ') {
|
|
1224 return false
|
|
1225 }
|
|
1226 }
|
|
1227 if !write_all(emitter, indicator) {
|
|
1228 return false
|
|
1229 }
|
|
1230 emitter.whitespace = is_whitespace
|
|
1231 emitter.indention = (emitter.indention && is_indention)
|
|
1232 emitter.open_ended = false
|
|
1233 return true
|
|
1234 }
|
|
1235
|
|
1236 func yaml_emitter_write_anchor(emitter *yaml_emitter_t, value []byte) bool {
|
|
1237 if !write_all(emitter, value) {
|
|
1238 return false
|
|
1239 }
|
|
1240 emitter.whitespace = false
|
|
1241 emitter.indention = false
|
|
1242 return true
|
|
1243 }
|
|
1244
|
|
1245 func yaml_emitter_write_tag_handle(emitter *yaml_emitter_t, value []byte) bool {
|
|
1246 if !emitter.whitespace {
|
|
1247 if !put(emitter, ' ') {
|
|
1248 return false
|
|
1249 }
|
|
1250 }
|
|
1251 if !write_all(emitter, value) {
|
|
1252 return false
|
|
1253 }
|
|
1254 emitter.whitespace = false
|
|
1255 emitter.indention = false
|
|
1256 return true
|
|
1257 }
|
|
1258
|
|
1259 func yaml_emitter_write_tag_content(emitter *yaml_emitter_t, value []byte, need_whitespace bool) bool {
|
|
1260 if need_whitespace && !emitter.whitespace {
|
|
1261 if !put(emitter, ' ') {
|
|
1262 return false
|
|
1263 }
|
|
1264 }
|
|
1265 for i := 0; i < len(value); {
|
|
1266 var must_write bool
|
|
1267 switch value[i] {
|
|
1268 case ';', '/', '?', ':', '@', '&', '=', '+', '$', ',', '_', '.', '~', '*', '\'', '(', ')', '[', ']':
|
|
1269 must_write = true
|
|
1270 default:
|
|
1271 must_write = is_alpha(value, i)
|
|
1272 }
|
|
1273 if must_write {
|
|
1274 if !write(emitter, value, &i) {
|
|
1275 return false
|
|
1276 }
|
|
1277 } else {
|
|
1278 w := width(value[i])
|
|
1279 for k := 0; k < w; k++ {
|
|
1280 octet := value[i]
|
|
1281 i++
|
|
1282 if !put(emitter, '%') {
|
|
1283 return false
|
|
1284 }
|
|
1285
|
|
1286 c := octet >> 4
|
|
1287 if c < 10 {
|
|
1288 c += '0'
|
|
1289 } else {
|
|
1290 c += 'A' - 10
|
|
1291 }
|
|
1292 if !put(emitter, c) {
|
|
1293 return false
|
|
1294 }
|
|
1295
|
|
1296 c = octet & 0x0f
|
|
1297 if c < 10 {
|
|
1298 c += '0'
|
|
1299 } else {
|
|
1300 c += 'A' - 10
|
|
1301 }
|
|
1302 if !put(emitter, c) {
|
|
1303 return false
|
|
1304 }
|
|
1305 }
|
|
1306 }
|
|
1307 }
|
|
1308 emitter.whitespace = false
|
|
1309 emitter.indention = false
|
|
1310 return true
|
|
1311 }
|
|
1312
|
|
1313 func yaml_emitter_write_plain_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool {
|
|
1314 if !emitter.whitespace {
|
|
1315 if !put(emitter, ' ') {
|
|
1316 return false
|
|
1317 }
|
|
1318 }
|
|
1319
|
|
1320 spaces := false
|
|
1321 breaks := false
|
|
1322 for i := 0; i < len(value); {
|
|
1323 if is_space(value, i) {
|
|
1324 if allow_breaks && !spaces && emitter.column > emitter.best_width && !is_space(value, i+1) {
|
|
1325 if !yaml_emitter_write_indent(emitter) {
|
|
1326 return false
|
|
1327 }
|
|
1328 i += width(value[i])
|
|
1329 } else {
|
|
1330 if !write(emitter, value, &i) {
|
|
1331 return false
|
|
1332 }
|
|
1333 }
|
|
1334 spaces = true
|
|
1335 } else if is_break(value, i) {
|
|
1336 if !breaks && value[i] == '\n' {
|
|
1337 if !put_break(emitter) {
|
|
1338 return false
|
|
1339 }
|
|
1340 }
|
|
1341 if !write_break(emitter, value, &i) {
|
|
1342 return false
|
|
1343 }
|
|
1344 emitter.indention = true
|
|
1345 breaks = true
|
|
1346 } else {
|
|
1347 if breaks {
|
|
1348 if !yaml_emitter_write_indent(emitter) {
|
|
1349 return false
|
|
1350 }
|
|
1351 }
|
|
1352 if !write(emitter, value, &i) {
|
|
1353 return false
|
|
1354 }
|
|
1355 emitter.indention = false
|
|
1356 spaces = false
|
|
1357 breaks = false
|
|
1358 }
|
|
1359 }
|
|
1360
|
|
1361 emitter.whitespace = false
|
|
1362 emitter.indention = false
|
|
1363 if emitter.root_context {
|
|
1364 emitter.open_ended = true
|
|
1365 }
|
|
1366
|
|
1367 return true
|
|
1368 }
|
|
1369
|
|
1370 func yaml_emitter_write_single_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool {
|
|
1371
|
|
1372 if !yaml_emitter_write_indicator(emitter, []byte{'\''}, true, false, false) {
|
|
1373 return false
|
|
1374 }
|
|
1375
|
|
1376 spaces := false
|
|
1377 breaks := false
|
|
1378 for i := 0; i < len(value); {
|
|
1379 if is_space(value, i) {
|
|
1380 if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 && !is_space(value, i+1) {
|
|
1381 if !yaml_emitter_write_indent(emitter) {
|
|
1382 return false
|
|
1383 }
|
|
1384 i += width(value[i])
|
|
1385 } else {
|
|
1386 if !write(emitter, value, &i) {
|
|
1387 return false
|
|
1388 }
|
|
1389 }
|
|
1390 spaces = true
|
|
1391 } else if is_break(value, i) {
|
|
1392 if !breaks && value[i] == '\n' {
|
|
1393 if !put_break(emitter) {
|
|
1394 return false
|
|
1395 }
|
|
1396 }
|
|
1397 if !write_break(emitter, value, &i) {
|
|
1398 return false
|
|
1399 }
|
|
1400 emitter.indention = true
|
|
1401 breaks = true
|
|
1402 } else {
|
|
1403 if breaks {
|
|
1404 if !yaml_emitter_write_indent(emitter) {
|
|
1405 return false
|
|
1406 }
|
|
1407 }
|
|
1408 if value[i] == '\'' {
|
|
1409 if !put(emitter, '\'') {
|
|
1410 return false
|
|
1411 }
|
|
1412 }
|
|
1413 if !write(emitter, value, &i) {
|
|
1414 return false
|
|
1415 }
|
|
1416 emitter.indention = false
|
|
1417 spaces = false
|
|
1418 breaks = false
|
|
1419 }
|
|
1420 }
|
|
1421 if !yaml_emitter_write_indicator(emitter, []byte{'\''}, false, false, false) {
|
|
1422 return false
|
|
1423 }
|
|
1424 emitter.whitespace = false
|
|
1425 emitter.indention = false
|
|
1426 return true
|
|
1427 }
|
|
1428
|
|
1429 func yaml_emitter_write_double_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool {
|
|
1430 spaces := false
|
|
1431 if !yaml_emitter_write_indicator(emitter, []byte{'"'}, true, false, false) {
|
|
1432 return false
|
|
1433 }
|
|
1434
|
|
1435 for i := 0; i < len(value); {
|
|
1436 if !is_printable(value, i) || (!emitter.unicode && !is_ascii(value, i)) ||
|
|
1437 is_bom(value, i) || is_break(value, i) ||
|
|
1438 value[i] == '"' || value[i] == '\\' {
|
|
1439
|
|
1440 octet := value[i]
|
|
1441
|
|
1442 var w int
|
|
1443 var v rune
|
|
1444 switch {
|
|
1445 case octet&0x80 == 0x00:
|
|
1446 w, v = 1, rune(octet&0x7F)
|
|
1447 case octet&0xE0 == 0xC0:
|
|
1448 w, v = 2, rune(octet&0x1F)
|
|
1449 case octet&0xF0 == 0xE0:
|
|
1450 w, v = 3, rune(octet&0x0F)
|
|
1451 case octet&0xF8 == 0xF0:
|
|
1452 w, v = 4, rune(octet&0x07)
|
|
1453 }
|
|
1454 for k := 1; k < w; k++ {
|
|
1455 octet = value[i+k]
|
|
1456 v = (v << 6) + (rune(octet) & 0x3F)
|
|
1457 }
|
|
1458 i += w
|
|
1459
|
|
1460 if !put(emitter, '\\') {
|
|
1461 return false
|
|
1462 }
|
|
1463
|
|
1464 var ok bool
|
|
1465 switch v {
|
|
1466 case 0x00:
|
|
1467 ok = put(emitter, '0')
|
|
1468 case 0x07:
|
|
1469 ok = put(emitter, 'a')
|
|
1470 case 0x08:
|
|
1471 ok = put(emitter, 'b')
|
|
1472 case 0x09:
|
|
1473 ok = put(emitter, 't')
|
|
1474 case 0x0A:
|
|
1475 ok = put(emitter, 'n')
|
|
1476 case 0x0b:
|
|
1477 ok = put(emitter, 'v')
|
|
1478 case 0x0c:
|
|
1479 ok = put(emitter, 'f')
|
|
1480 case 0x0d:
|
|
1481 ok = put(emitter, 'r')
|
|
1482 case 0x1b:
|
|
1483 ok = put(emitter, 'e')
|
|
1484 case 0x22:
|
|
1485 ok = put(emitter, '"')
|
|
1486 case 0x5c:
|
|
1487 ok = put(emitter, '\\')
|
|
1488 case 0x85:
|
|
1489 ok = put(emitter, 'N')
|
|
1490 case 0xA0:
|
|
1491 ok = put(emitter, '_')
|
|
1492 case 0x2028:
|
|
1493 ok = put(emitter, 'L')
|
|
1494 case 0x2029:
|
|
1495 ok = put(emitter, 'P')
|
|
1496 default:
|
|
1497 if v <= 0xFF {
|
|
1498 ok = put(emitter, 'x')
|
|
1499 w = 2
|
|
1500 } else if v <= 0xFFFF {
|
|
1501 ok = put(emitter, 'u')
|
|
1502 w = 4
|
|
1503 } else {
|
|
1504 ok = put(emitter, 'U')
|
|
1505 w = 8
|
|
1506 }
|
|
1507 for k := (w - 1) * 4; ok && k >= 0; k -= 4 {
|
|
1508 digit := byte((v >> uint(k)) & 0x0F)
|
|
1509 if digit < 10 {
|
|
1510 ok = put(emitter, digit+'0')
|
|
1511 } else {
|
|
1512 ok = put(emitter, digit+'A'-10)
|
|
1513 }
|
|
1514 }
|
|
1515 }
|
|
1516 if !ok {
|
|
1517 return false
|
|
1518 }
|
|
1519 spaces = false
|
|
1520 } else if is_space(value, i) {
|
|
1521 if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 {
|
|
1522 if !yaml_emitter_write_indent(emitter) {
|
|
1523 return false
|
|
1524 }
|
|
1525 if is_space(value, i+1) {
|
|
1526 if !put(emitter, '\\') {
|
|
1527 return false
|
|
1528 }
|
|
1529 }
|
|
1530 i += width(value[i])
|
|
1531 } else if !write(emitter, value, &i) {
|
|
1532 return false
|
|
1533 }
|
|
1534 spaces = true
|
|
1535 } else {
|
|
1536 if !write(emitter, value, &i) {
|
|
1537 return false
|
|
1538 }
|
|
1539 spaces = false
|
|
1540 }
|
|
1541 }
|
|
1542 if !yaml_emitter_write_indicator(emitter, []byte{'"'}, false, false, false) {
|
|
1543 return false
|
|
1544 }
|
|
1545 emitter.whitespace = false
|
|
1546 emitter.indention = false
|
|
1547 return true
|
|
1548 }
|
|
1549
|
|
1550 func yaml_emitter_write_block_scalar_hints(emitter *yaml_emitter_t, value []byte) bool {
|
|
1551 if is_space(value, 0) || is_break(value, 0) {
|
|
1552 indent_hint := []byte{'0' + byte(emitter.best_indent)}
|
|
1553 if !yaml_emitter_write_indicator(emitter, indent_hint, false, false, false) {
|
|
1554 return false
|
|
1555 }
|
|
1556 }
|
|
1557
|
|
1558 emitter.open_ended = false
|
|
1559
|
|
1560 var chomp_hint [1]byte
|
|
1561 if len(value) == 0 {
|
|
1562 chomp_hint[0] = '-'
|
|
1563 } else {
|
|
1564 i := len(value) - 1
|
|
1565 for value[i]&0xC0 == 0x80 {
|
|
1566 i--
|
|
1567 }
|
|
1568 if !is_break(value, i) {
|
|
1569 chomp_hint[0] = '-'
|
|
1570 } else if i == 0 {
|
|
1571 chomp_hint[0] = '+'
|
|
1572 emitter.open_ended = true
|
|
1573 } else {
|
|
1574 i--
|
|
1575 for value[i]&0xC0 == 0x80 {
|
|
1576 i--
|
|
1577 }
|
|
1578 if is_break(value, i) {
|
|
1579 chomp_hint[0] = '+'
|
|
1580 emitter.open_ended = true
|
|
1581 }
|
|
1582 }
|
|
1583 }
|
|
1584 if chomp_hint[0] != 0 {
|
|
1585 if !yaml_emitter_write_indicator(emitter, chomp_hint[:], false, false, false) {
|
|
1586 return false
|
|
1587 }
|
|
1588 }
|
|
1589 return true
|
|
1590 }
|
|
1591
|
|
1592 func yaml_emitter_write_literal_scalar(emitter *yaml_emitter_t, value []byte) bool {
|
|
1593 if !yaml_emitter_write_indicator(emitter, []byte{'|'}, true, false, false) {
|
|
1594 return false
|
|
1595 }
|
|
1596 if !yaml_emitter_write_block_scalar_hints(emitter, value) {
|
|
1597 return false
|
|
1598 }
|
|
1599 if !put_break(emitter) {
|
|
1600 return false
|
|
1601 }
|
|
1602 emitter.indention = true
|
|
1603 emitter.whitespace = true
|
|
1604 breaks := true
|
|
1605 for i := 0; i < len(value); {
|
|
1606 if is_break(value, i) {
|
|
1607 if !write_break(emitter, value, &i) {
|
|
1608 return false
|
|
1609 }
|
|
1610 emitter.indention = true
|
|
1611 breaks = true
|
|
1612 } else {
|
|
1613 if breaks {
|
|
1614 if !yaml_emitter_write_indent(emitter) {
|
|
1615 return false
|
|
1616 }
|
|
1617 }
|
|
1618 if !write(emitter, value, &i) {
|
|
1619 return false
|
|
1620 }
|
|
1621 emitter.indention = false
|
|
1622 breaks = false
|
|
1623 }
|
|
1624 }
|
|
1625
|
|
1626 return true
|
|
1627 }
|
|
1628
|
|
1629 func yaml_emitter_write_folded_scalar(emitter *yaml_emitter_t, value []byte) bool {
|
|
1630 if !yaml_emitter_write_indicator(emitter, []byte{'>'}, true, false, false) {
|
|
1631 return false
|
|
1632 }
|
|
1633 if !yaml_emitter_write_block_scalar_hints(emitter, value) {
|
|
1634 return false
|
|
1635 }
|
|
1636
|
|
1637 if !put_break(emitter) {
|
|
1638 return false
|
|
1639 }
|
|
1640 emitter.indention = true
|
|
1641 emitter.whitespace = true
|
|
1642
|
|
1643 breaks := true
|
|
1644 leading_spaces := true
|
|
1645 for i := 0; i < len(value); {
|
|
1646 if is_break(value, i) {
|
|
1647 if !breaks && !leading_spaces && value[i] == '\n' {
|
|
1648 k := 0
|
|
1649 for is_break(value, k) {
|
|
1650 k += width(value[k])
|
|
1651 }
|
|
1652 if !is_blankz(value, k) {
|
|
1653 if !put_break(emitter) {
|
|
1654 return false
|
|
1655 }
|
|
1656 }
|
|
1657 }
|
|
1658 if !write_break(emitter, value, &i) {
|
|
1659 return false
|
|
1660 }
|
|
1661 emitter.indention = true
|
|
1662 breaks = true
|
|
1663 } else {
|
|
1664 if breaks {
|
|
1665 if !yaml_emitter_write_indent(emitter) {
|
|
1666 return false
|
|
1667 }
|
|
1668 leading_spaces = is_blank(value, i)
|
|
1669 }
|
|
1670 if !breaks && is_space(value, i) && !is_space(value, i+1) && emitter.column > emitter.best_width {
|
|
1671 if !yaml_emitter_write_indent(emitter) {
|
|
1672 return false
|
|
1673 }
|
|
1674 i += width(value[i])
|
|
1675 } else {
|
|
1676 if !write(emitter, value, &i) {
|
|
1677 return false
|
|
1678 }
|
|
1679 }
|
|
1680 emitter.indention = false
|
|
1681 breaks = false
|
|
1682 }
|
|
1683 }
|
|
1684 return true
|
|
1685 }
|