annotate vendor/gopkg.in/yaml.v2/emitterc.go @ 71:7819959ac6ca draft

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