annotate vendor/gopkg.in/yaml.v3/emitterc.go @ 74:d8727551f403 draft

The Empress (III) * Change the way how versions are handled in version.go (to ease `go install`) * Upgrade yaml.v2 to yaml.v3 Signed-off-by: Izuru Yakumo <yakumo.izuru@chaotic.ninja>
author yakumo.izuru
date Mon, 04 Dec 2023 00:54:29 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
74
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2 // Copyright (c) 2011-2019 Canonical Ltd
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
3 // Copyright (c) 2006-2010 Kirill Simonov
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
4 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
5 // Permission is hereby granted, free of charge, to any person obtaining a copy of
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
6 // this software and associated documentation files (the "Software"), to deal in
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
7 // the Software without restriction, including without limitation the rights to
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
8 // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
9 // of the Software, and to permit persons to whom the Software is furnished to do
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
10 // so, subject to the following conditions:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
11 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
12 // The above copyright notice and this permission notice shall be included in all
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
13 // copies or substantial portions of the Software.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
14 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
15 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
16 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
17 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
18 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
19 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
20 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
21 // SOFTWARE.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
22
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
23 package yaml
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
24
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
25 import (
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
26 "bytes"
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
27 "fmt"
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
28 )
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
29
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
30 // Flush the buffer if needed.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
31 func flush(emitter *yaml_emitter_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
32 if emitter.buffer_pos+5 >= len(emitter.buffer) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
33 return yaml_emitter_flush(emitter)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
34 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
35 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
36 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
37
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
38 // Put a character to the output buffer.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
39 func put(emitter *yaml_emitter_t, value byte) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
40 if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
41 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
42 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
43 emitter.buffer[emitter.buffer_pos] = value
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
44 emitter.buffer_pos++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
45 emitter.column++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
46 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
47 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
48
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
49 // Put a line break to the output buffer.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
50 func put_break(emitter *yaml_emitter_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
51 if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
52 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
53 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
54 switch emitter.line_break {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
55 case yaml_CR_BREAK:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
56 emitter.buffer[emitter.buffer_pos] = '\r'
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
57 emitter.buffer_pos += 1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
58 case yaml_LN_BREAK:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
59 emitter.buffer[emitter.buffer_pos] = '\n'
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
60 emitter.buffer_pos += 1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
61 case yaml_CRLN_BREAK:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
62 emitter.buffer[emitter.buffer_pos+0] = '\r'
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
63 emitter.buffer[emitter.buffer_pos+1] = '\n'
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
64 emitter.buffer_pos += 2
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
65 default:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
66 panic("unknown line break setting")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
67 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
68 if emitter.column == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
69 emitter.space_above = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
70 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
71 emitter.column = 0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
72 emitter.line++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
73 // [Go] Do this here and below and drop from everywhere else (see commented lines).
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
74 emitter.indention = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
75 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
76 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
77
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
78 // Copy a character from a string into buffer.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
79 func write(emitter *yaml_emitter_t, s []byte, i *int) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
80 if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
81 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
82 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
83 p := emitter.buffer_pos
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
84 w := width(s[*i])
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
85 switch w {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
86 case 4:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
87 emitter.buffer[p+3] = s[*i+3]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
88 fallthrough
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
89 case 3:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
90 emitter.buffer[p+2] = s[*i+2]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
91 fallthrough
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
92 case 2:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
93 emitter.buffer[p+1] = s[*i+1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
94 fallthrough
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
95 case 1:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
96 emitter.buffer[p+0] = s[*i+0]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
97 default:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
98 panic("unknown character width")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
99 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
100 emitter.column++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
101 emitter.buffer_pos += w
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
102 *i += w
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
103 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
104 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
105
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
106 // Write a whole string into buffer.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
107 func write_all(emitter *yaml_emitter_t, s []byte) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
108 for i := 0; i < len(s); {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
109 if !write(emitter, s, &i) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
110 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
111 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
112 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
113 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
114 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
115
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
116 // Copy a line break character from a string into buffer.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
117 func write_break(emitter *yaml_emitter_t, s []byte, i *int) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
118 if s[*i] == '\n' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
119 if !put_break(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
120 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
121 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
122 *i++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
123 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
124 if !write(emitter, s, i) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
125 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
126 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
127 if emitter.column == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
128 emitter.space_above = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
129 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
130 emitter.column = 0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
131 emitter.line++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
132 // [Go] Do this here and above and drop from everywhere else (see commented lines).
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
133 emitter.indention = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
134 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
135 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
136 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
137
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
138 // Set an emitter error and return false.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
139 func yaml_emitter_set_emitter_error(emitter *yaml_emitter_t, problem string) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
140 emitter.error = yaml_EMITTER_ERROR
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
141 emitter.problem = problem
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
142 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
143 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
144
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
145 // Emit an event.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
146 func yaml_emitter_emit(emitter *yaml_emitter_t, event *yaml_event_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
147 emitter.events = append(emitter.events, *event)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
148 for !yaml_emitter_need_more_events(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
149 event := &emitter.events[emitter.events_head]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
150 if !yaml_emitter_analyze_event(emitter, event) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
151 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
152 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
153 if !yaml_emitter_state_machine(emitter, event) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
154 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
155 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
156 yaml_event_delete(event)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
157 emitter.events_head++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
158 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
159 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
160 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
161
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
162 // Check if we need to accumulate more events before emitting.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
163 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
164 // We accumulate extra
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
165 // - 1 event for DOCUMENT-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
166 // - 2 events for SEQUENCE-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
167 // - 3 events for MAPPING-START
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
168 //
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
169 func yaml_emitter_need_more_events(emitter *yaml_emitter_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
170 if emitter.events_head == len(emitter.events) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
171 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
172 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
173 var accumulate int
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
174 switch emitter.events[emitter.events_head].typ {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
175 case yaml_DOCUMENT_START_EVENT:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
176 accumulate = 1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
177 break
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
178 case yaml_SEQUENCE_START_EVENT:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
179 accumulate = 2
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
180 break
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
181 case yaml_MAPPING_START_EVENT:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
182 accumulate = 3
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
183 break
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
184 default:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
185 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
186 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
187 if len(emitter.events)-emitter.events_head > accumulate {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
188 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
189 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
190 var level int
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
191 for i := emitter.events_head; i < len(emitter.events); i++ {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
192 switch emitter.events[i].typ {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
193 case yaml_STREAM_START_EVENT, yaml_DOCUMENT_START_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
194 level++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
195 case yaml_STREAM_END_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_END_EVENT, yaml_MAPPING_END_EVENT:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
196 level--
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
197 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
198 if level == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
199 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
200 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
201 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
202 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
203 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
204
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
205 // Append a directive to the directives stack.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
206 func yaml_emitter_append_tag_directive(emitter *yaml_emitter_t, value *yaml_tag_directive_t, allow_duplicates bool) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
207 for i := 0; i < len(emitter.tag_directives); i++ {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
208 if bytes.Equal(value.handle, emitter.tag_directives[i].handle) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
209 if allow_duplicates {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
210 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
211 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
212 return yaml_emitter_set_emitter_error(emitter, "duplicate %TAG directive")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
213 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
214 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
215
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
216 // [Go] Do we actually need to copy this given garbage collection
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
217 // and the lack of deallocating destructors?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
218 tag_copy := yaml_tag_directive_t{
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
219 handle: make([]byte, len(value.handle)),
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
220 prefix: make([]byte, len(value.prefix)),
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
221 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
222 copy(tag_copy.handle, value.handle)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
223 copy(tag_copy.prefix, value.prefix)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
224 emitter.tag_directives = append(emitter.tag_directives, tag_copy)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
225 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
226 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
227
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
228 // Increase the indentation level.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
229 func yaml_emitter_increase_indent(emitter *yaml_emitter_t, flow, indentless bool) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
230 emitter.indents = append(emitter.indents, emitter.indent)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
231 if emitter.indent < 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
232 if flow {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
233 emitter.indent = emitter.best_indent
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
234 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
235 emitter.indent = 0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
236 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
237 } else if !indentless {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
238 // [Go] This was changed so that indentations are more regular.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
239 if emitter.states[len(emitter.states)-1] == yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
240 // The first indent inside a sequence will just skip the "- " indicator.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
241 emitter.indent += 2
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
242 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
243 // Everything else aligns to the chosen indentation.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
244 emitter.indent = emitter.best_indent*((emitter.indent+emitter.best_indent)/emitter.best_indent)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
245 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
246 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
247 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
248 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
249
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
250 // State dispatcher.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
251 func yaml_emitter_state_machine(emitter *yaml_emitter_t, event *yaml_event_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
252 switch emitter.state {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
253 default:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
254 case yaml_EMIT_STREAM_START_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
255 return yaml_emitter_emit_stream_start(emitter, event)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
256
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
257 case yaml_EMIT_FIRST_DOCUMENT_START_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
258 return yaml_emitter_emit_document_start(emitter, event, true)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
259
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
260 case yaml_EMIT_DOCUMENT_START_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
261 return yaml_emitter_emit_document_start(emitter, event, false)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
262
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
263 case yaml_EMIT_DOCUMENT_CONTENT_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
264 return yaml_emitter_emit_document_content(emitter, event)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
265
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
266 case yaml_EMIT_DOCUMENT_END_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
267 return yaml_emitter_emit_document_end(emitter, event)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
268
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
269 case yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
270 return yaml_emitter_emit_flow_sequence_item(emitter, event, true, false)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
271
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
272 case yaml_EMIT_FLOW_SEQUENCE_TRAIL_ITEM_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
273 return yaml_emitter_emit_flow_sequence_item(emitter, event, false, true)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
274
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
275 case yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
276 return yaml_emitter_emit_flow_sequence_item(emitter, event, false, false)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
277
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
278 case yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
279 return yaml_emitter_emit_flow_mapping_key(emitter, event, true, false)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
280
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
281 case yaml_EMIT_FLOW_MAPPING_TRAIL_KEY_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
282 return yaml_emitter_emit_flow_mapping_key(emitter, event, false, true)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
283
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
284 case yaml_EMIT_FLOW_MAPPING_KEY_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
285 return yaml_emitter_emit_flow_mapping_key(emitter, event, false, false)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
286
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
287 case yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
288 return yaml_emitter_emit_flow_mapping_value(emitter, event, true)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
289
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
290 case yaml_EMIT_FLOW_MAPPING_VALUE_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
291 return yaml_emitter_emit_flow_mapping_value(emitter, event, false)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
292
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
293 case yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
294 return yaml_emitter_emit_block_sequence_item(emitter, event, true)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
295
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
296 case yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
297 return yaml_emitter_emit_block_sequence_item(emitter, event, false)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
298
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
299 case yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
300 return yaml_emitter_emit_block_mapping_key(emitter, event, true)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
301
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
302 case yaml_EMIT_BLOCK_MAPPING_KEY_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
303 return yaml_emitter_emit_block_mapping_key(emitter, event, false)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
304
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
305 case yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
306 return yaml_emitter_emit_block_mapping_value(emitter, event, true)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
307
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
308 case yaml_EMIT_BLOCK_MAPPING_VALUE_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
309 return yaml_emitter_emit_block_mapping_value(emitter, event, false)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
310
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
311 case yaml_EMIT_END_STATE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
312 return yaml_emitter_set_emitter_error(emitter, "expected nothing after STREAM-END")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
313 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
314 panic("invalid emitter state")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
315 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
316
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
317 // Expect STREAM-START.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
318 func yaml_emitter_emit_stream_start(emitter *yaml_emitter_t, event *yaml_event_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
319 if event.typ != yaml_STREAM_START_EVENT {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
320 return yaml_emitter_set_emitter_error(emitter, "expected STREAM-START")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
321 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
322 if emitter.encoding == yaml_ANY_ENCODING {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
323 emitter.encoding = event.encoding
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
324 if emitter.encoding == yaml_ANY_ENCODING {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
325 emitter.encoding = yaml_UTF8_ENCODING
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
326 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
327 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
328 if emitter.best_indent < 2 || emitter.best_indent > 9 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
329 emitter.best_indent = 2
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
330 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
331 if emitter.best_width >= 0 && emitter.best_width <= emitter.best_indent*2 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
332 emitter.best_width = 80
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
333 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
334 if emitter.best_width < 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
335 emitter.best_width = 1<<31 - 1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
336 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
337 if emitter.line_break == yaml_ANY_BREAK {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
338 emitter.line_break = yaml_LN_BREAK
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
339 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
340
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
341 emitter.indent = -1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
342 emitter.line = 0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
343 emitter.column = 0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
344 emitter.whitespace = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
345 emitter.indention = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
346 emitter.space_above = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
347 emitter.foot_indent = -1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
348
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
349 if emitter.encoding != yaml_UTF8_ENCODING {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
350 if !yaml_emitter_write_bom(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
351 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
352 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
353 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
354 emitter.state = yaml_EMIT_FIRST_DOCUMENT_START_STATE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
355 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
356 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
357
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
358 // Expect DOCUMENT-START or STREAM-END.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
359 func yaml_emitter_emit_document_start(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
360
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
361 if event.typ == yaml_DOCUMENT_START_EVENT {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
362
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
363 if event.version_directive != nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
364 if !yaml_emitter_analyze_version_directive(emitter, event.version_directive) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
365 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
366 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
367 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
368
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
369 for i := 0; i < len(event.tag_directives); i++ {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
370 tag_directive := &event.tag_directives[i]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
371 if !yaml_emitter_analyze_tag_directive(emitter, tag_directive) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
372 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
373 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
374 if !yaml_emitter_append_tag_directive(emitter, tag_directive, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
375 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
376 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
377 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
378
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
379 for i := 0; i < len(default_tag_directives); i++ {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
380 tag_directive := &default_tag_directives[i]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
381 if !yaml_emitter_append_tag_directive(emitter, tag_directive, true) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
382 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
383 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
384 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
385
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
386 implicit := event.implicit
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
387 if !first || emitter.canonical {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
388 implicit = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
389 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
390
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
391 if emitter.open_ended && (event.version_directive != nil || len(event.tag_directives) > 0) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
392 if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
393 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
394 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
395 if !yaml_emitter_write_indent(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
396 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
397 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
398 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
399
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
400 if event.version_directive != nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
401 implicit = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
402 if !yaml_emitter_write_indicator(emitter, []byte("%YAML"), true, false, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
403 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
404 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
405 if !yaml_emitter_write_indicator(emitter, []byte("1.1"), true, false, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
406 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
407 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
408 if !yaml_emitter_write_indent(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
409 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
410 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
411 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
412
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
413 if len(event.tag_directives) > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
414 implicit = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
415 for i := 0; i < len(event.tag_directives); i++ {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
416 tag_directive := &event.tag_directives[i]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
417 if !yaml_emitter_write_indicator(emitter, []byte("%TAG"), true, false, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
418 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
419 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
420 if !yaml_emitter_write_tag_handle(emitter, tag_directive.handle) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
421 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
422 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
423 if !yaml_emitter_write_tag_content(emitter, tag_directive.prefix, true) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
424 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
425 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
426 if !yaml_emitter_write_indent(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
427 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
428 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
429 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
430 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
431
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
432 if yaml_emitter_check_empty_document(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
433 implicit = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
434 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
435 if !implicit {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
436 if !yaml_emitter_write_indent(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
437 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
438 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
439 if !yaml_emitter_write_indicator(emitter, []byte("---"), true, false, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
440 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
441 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
442 if emitter.canonical || true {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
443 if !yaml_emitter_write_indent(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
444 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
445 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
446 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
447 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
448
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
449 if len(emitter.head_comment) > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
450 if !yaml_emitter_process_head_comment(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
451 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
452 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
453 if !put_break(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
454 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
455 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
456 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
457
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
458 emitter.state = yaml_EMIT_DOCUMENT_CONTENT_STATE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
459 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
460 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
461
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
462 if event.typ == yaml_STREAM_END_EVENT {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
463 if emitter.open_ended {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
464 if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
465 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
466 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
467 if !yaml_emitter_write_indent(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
468 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
469 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
470 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
471 if !yaml_emitter_flush(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
472 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
473 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
474 emitter.state = yaml_EMIT_END_STATE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
475 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
476 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
477
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
478 return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-START or STREAM-END")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
479 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
480
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
481 // Expect the root node.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
482 func yaml_emitter_emit_document_content(emitter *yaml_emitter_t, event *yaml_event_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
483 emitter.states = append(emitter.states, yaml_EMIT_DOCUMENT_END_STATE)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
484
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
485 if !yaml_emitter_process_head_comment(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
486 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
487 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
488 if !yaml_emitter_emit_node(emitter, event, true, false, false, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
489 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
490 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
491 if !yaml_emitter_process_line_comment(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
492 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
493 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
494 if !yaml_emitter_process_foot_comment(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
495 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
496 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
497 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
498 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
499
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
500 // Expect DOCUMENT-END.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
501 func yaml_emitter_emit_document_end(emitter *yaml_emitter_t, event *yaml_event_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
502 if event.typ != yaml_DOCUMENT_END_EVENT {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
503 return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-END")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
504 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
505 // [Go] Force document foot separation.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
506 emitter.foot_indent = 0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
507 if !yaml_emitter_process_foot_comment(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
508 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
509 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
510 emitter.foot_indent = -1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
511 if !yaml_emitter_write_indent(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
512 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
513 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
514 if !event.implicit {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
515 // [Go] Allocate the slice elsewhere.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
516 if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
517 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
518 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
519 if !yaml_emitter_write_indent(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
520 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
521 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
522 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
523 if !yaml_emitter_flush(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
524 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
525 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
526 emitter.state = yaml_EMIT_DOCUMENT_START_STATE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
527 emitter.tag_directives = emitter.tag_directives[:0]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
528 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
529 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
530
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
531 // Expect a flow item node.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
532 func yaml_emitter_emit_flow_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first, trail bool) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
533 if first {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
534 if !yaml_emitter_write_indicator(emitter, []byte{'['}, true, true, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
535 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
536 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
537 if !yaml_emitter_increase_indent(emitter, true, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
538 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
539 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
540 emitter.flow_level++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
541 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
542
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
543 if event.typ == yaml_SEQUENCE_END_EVENT {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
544 if emitter.canonical && !first && !trail {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
545 if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
546 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
547 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
548 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
549 emitter.flow_level--
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
550 emitter.indent = emitter.indents[len(emitter.indents)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
551 emitter.indents = emitter.indents[:len(emitter.indents)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
552 if emitter.column == 0 || emitter.canonical && !first {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
553 if !yaml_emitter_write_indent(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
554 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
555 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
556 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
557 if !yaml_emitter_write_indicator(emitter, []byte{']'}, false, false, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
558 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
559 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
560 if !yaml_emitter_process_line_comment(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
561 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
562 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
563 if !yaml_emitter_process_foot_comment(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
564 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
565 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
566 emitter.state = emitter.states[len(emitter.states)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
567 emitter.states = emitter.states[:len(emitter.states)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
568
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
569 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
570 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
571
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
572 if !first && !trail {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
573 if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
574 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
575 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
576 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
577
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
578 if !yaml_emitter_process_head_comment(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
579 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
580 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
581 if emitter.column == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
582 if !yaml_emitter_write_indent(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
583 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
584 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
585 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
586
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
587 if emitter.canonical || emitter.column > emitter.best_width {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
588 if !yaml_emitter_write_indent(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
589 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
590 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
591 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
592 if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
593 emitter.states = append(emitter.states, yaml_EMIT_FLOW_SEQUENCE_TRAIL_ITEM_STATE)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
594 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
595 emitter.states = append(emitter.states, yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
596 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
597 if !yaml_emitter_emit_node(emitter, event, false, true, false, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
598 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
599 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
600 if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
601 if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
602 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
603 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
604 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
605 if !yaml_emitter_process_line_comment(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
606 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
607 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
608 if !yaml_emitter_process_foot_comment(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
609 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
610 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
611 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
612 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
613
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
614 // Expect a flow key node.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
615 func yaml_emitter_emit_flow_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first, trail bool) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
616 if first {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
617 if !yaml_emitter_write_indicator(emitter, []byte{'{'}, true, true, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
618 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
619 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
620 if !yaml_emitter_increase_indent(emitter, true, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
621 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
622 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
623 emitter.flow_level++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
624 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
625
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
626 if event.typ == yaml_MAPPING_END_EVENT {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
627 if (emitter.canonical || len(emitter.head_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0) && !first && !trail {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
628 if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
629 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
630 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
631 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
632 if !yaml_emitter_process_head_comment(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
633 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
634 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
635 emitter.flow_level--
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
636 emitter.indent = emitter.indents[len(emitter.indents)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
637 emitter.indents = emitter.indents[:len(emitter.indents)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
638 if emitter.canonical && !first {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
639 if !yaml_emitter_write_indent(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
640 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
641 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
642 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
643 if !yaml_emitter_write_indicator(emitter, []byte{'}'}, false, false, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
644 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
645 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
646 if !yaml_emitter_process_line_comment(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
647 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
648 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
649 if !yaml_emitter_process_foot_comment(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
650 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
651 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
652 emitter.state = emitter.states[len(emitter.states)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
653 emitter.states = emitter.states[:len(emitter.states)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
654 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
655 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
656
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
657 if !first && !trail {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
658 if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
659 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
660 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
661 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
662
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
663 if !yaml_emitter_process_head_comment(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
664 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
665 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
666
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
667 if emitter.column == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
668 if !yaml_emitter_write_indent(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
669 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
670 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
671 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
672
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
673 if emitter.canonical || emitter.column > emitter.best_width {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
674 if !yaml_emitter_write_indent(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
675 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
676 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
677 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
678
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
679 if !emitter.canonical && yaml_emitter_check_simple_key(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
680 emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
681 return yaml_emitter_emit_node(emitter, event, false, false, true, true)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
682 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
683 if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
684 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
685 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
686 emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_VALUE_STATE)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
687 return yaml_emitter_emit_node(emitter, event, false, false, true, false)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
688 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
689
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
690 // Expect a flow value node.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
691 func yaml_emitter_emit_flow_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
692 if simple {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
693 if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
694 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
695 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
696 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
697 if emitter.canonical || emitter.column > emitter.best_width {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
698 if !yaml_emitter_write_indent(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
699 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
700 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
701 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
702 if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
703 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
704 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
705 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
706 if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
707 emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_TRAIL_KEY_STATE)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
708 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
709 emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_KEY_STATE)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
710 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
711 if !yaml_emitter_emit_node(emitter, event, false, false, true, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
712 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
713 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
714 if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
715 if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
716 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
717 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
718 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
719 if !yaml_emitter_process_line_comment(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
720 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
721 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
722 if !yaml_emitter_process_foot_comment(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
723 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
724 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
725 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
726 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
727
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
728 // Expect a block item node.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
729 func yaml_emitter_emit_block_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
730 if first {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
731 if !yaml_emitter_increase_indent(emitter, false, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
732 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
733 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
734 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
735 if event.typ == yaml_SEQUENCE_END_EVENT {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
736 emitter.indent = emitter.indents[len(emitter.indents)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
737 emitter.indents = emitter.indents[:len(emitter.indents)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
738 emitter.state = emitter.states[len(emitter.states)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
739 emitter.states = emitter.states[:len(emitter.states)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
740 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
741 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
742 if !yaml_emitter_process_head_comment(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
743 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
744 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
745 if !yaml_emitter_write_indent(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
746 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
747 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
748 if !yaml_emitter_write_indicator(emitter, []byte{'-'}, true, false, true) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
749 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
750 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
751 emitter.states = append(emitter.states, yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
752 if !yaml_emitter_emit_node(emitter, event, false, true, false, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
753 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
754 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
755 if !yaml_emitter_process_line_comment(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
756 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
757 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
758 if !yaml_emitter_process_foot_comment(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
759 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
760 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
761 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
762 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
763
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
764 // Expect a block key node.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
765 func yaml_emitter_emit_block_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
766 if first {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
767 if !yaml_emitter_increase_indent(emitter, false, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
768 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
769 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
770 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
771 if !yaml_emitter_process_head_comment(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
772 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
773 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
774 if event.typ == yaml_MAPPING_END_EVENT {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
775 emitter.indent = emitter.indents[len(emitter.indents)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
776 emitter.indents = emitter.indents[:len(emitter.indents)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
777 emitter.state = emitter.states[len(emitter.states)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
778 emitter.states = emitter.states[:len(emitter.states)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
779 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
780 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
781 if !yaml_emitter_write_indent(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
782 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
783 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
784 if len(emitter.line_comment) > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
785 // [Go] A line comment was provided for the key. That's unusual as the
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
786 // scanner associates line comments with the value. Either way,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
787 // save the line comment and render it appropriately later.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
788 emitter.key_line_comment = emitter.line_comment
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
789 emitter.line_comment = nil
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
790 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
791 if yaml_emitter_check_simple_key(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
792 emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
793 return yaml_emitter_emit_node(emitter, event, false, false, true, true)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
794 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
795 if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, true) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
796 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
797 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
798 emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_VALUE_STATE)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
799 return yaml_emitter_emit_node(emitter, event, false, false, true, false)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
800 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
801
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
802 // Expect a block value node.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
803 func yaml_emitter_emit_block_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
804 if simple {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
805 if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
806 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
807 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
808 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
809 if !yaml_emitter_write_indent(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
810 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
811 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
812 if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, true) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
813 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
814 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
815 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
816 if len(emitter.key_line_comment) > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
817 // [Go] Line comments are generally associated with the value, but when there's
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
818 // no value on the same line as a mapping key they end up attached to the
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
819 // key itself.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
820 if event.typ == yaml_SCALAR_EVENT {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
821 if len(emitter.line_comment) == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
822 // A scalar is coming and it has no line comments by itself yet,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
823 // so just let it handle the line comment as usual. If it has a
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
824 // line comment, we can't have both so the one from the key is lost.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
825 emitter.line_comment = emitter.key_line_comment
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
826 emitter.key_line_comment = nil
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
827 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
828 } else if event.sequence_style() != yaml_FLOW_SEQUENCE_STYLE && (event.typ == yaml_MAPPING_START_EVENT || event.typ == yaml_SEQUENCE_START_EVENT) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
829 // An indented block follows, so write the comment right now.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
830 emitter.line_comment, emitter.key_line_comment = emitter.key_line_comment, emitter.line_comment
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
831 if !yaml_emitter_process_line_comment(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
832 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
833 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
834 emitter.line_comment, emitter.key_line_comment = emitter.key_line_comment, emitter.line_comment
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
835 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
836 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
837 emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_KEY_STATE)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
838 if !yaml_emitter_emit_node(emitter, event, false, false, true, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
839 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
840 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
841 if !yaml_emitter_process_line_comment(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
842 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
843 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
844 if !yaml_emitter_process_foot_comment(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
845 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
846 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
847 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
848 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
849
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
850 func yaml_emitter_silent_nil_event(emitter *yaml_emitter_t, event *yaml_event_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
851 return event.typ == yaml_SCALAR_EVENT && event.implicit && !emitter.canonical && len(emitter.scalar_data.value) == 0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
852 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
853
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
854 // Expect a node.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
855 func yaml_emitter_emit_node(emitter *yaml_emitter_t, event *yaml_event_t,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
856 root bool, sequence bool, mapping bool, simple_key bool) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
857
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
858 emitter.root_context = root
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
859 emitter.sequence_context = sequence
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
860 emitter.mapping_context = mapping
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
861 emitter.simple_key_context = simple_key
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
862
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
863 switch event.typ {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
864 case yaml_ALIAS_EVENT:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
865 return yaml_emitter_emit_alias(emitter, event)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
866 case yaml_SCALAR_EVENT:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
867 return yaml_emitter_emit_scalar(emitter, event)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
868 case yaml_SEQUENCE_START_EVENT:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
869 return yaml_emitter_emit_sequence_start(emitter, event)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
870 case yaml_MAPPING_START_EVENT:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
871 return yaml_emitter_emit_mapping_start(emitter, event)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
872 default:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
873 return yaml_emitter_set_emitter_error(emitter,
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
874 fmt.Sprintf("expected SCALAR, SEQUENCE-START, MAPPING-START, or ALIAS, but got %v", event.typ))
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
875 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
876 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
877
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
878 // Expect ALIAS.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
879 func yaml_emitter_emit_alias(emitter *yaml_emitter_t, event *yaml_event_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
880 if !yaml_emitter_process_anchor(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
881 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
882 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
883 emitter.state = emitter.states[len(emitter.states)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
884 emitter.states = emitter.states[:len(emitter.states)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
885 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
886 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
887
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
888 // Expect SCALAR.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
889 func yaml_emitter_emit_scalar(emitter *yaml_emitter_t, event *yaml_event_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
890 if !yaml_emitter_select_scalar_style(emitter, event) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
891 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
892 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
893 if !yaml_emitter_process_anchor(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
894 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
895 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
896 if !yaml_emitter_process_tag(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
897 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
898 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
899 if !yaml_emitter_increase_indent(emitter, true, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
900 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
901 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
902 if !yaml_emitter_process_scalar(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
903 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
904 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
905 emitter.indent = emitter.indents[len(emitter.indents)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
906 emitter.indents = emitter.indents[:len(emitter.indents)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
907 emitter.state = emitter.states[len(emitter.states)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
908 emitter.states = emitter.states[:len(emitter.states)-1]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
909 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
910 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
911
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
912 // Expect SEQUENCE-START.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
913 func yaml_emitter_emit_sequence_start(emitter *yaml_emitter_t, event *yaml_event_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
914 if !yaml_emitter_process_anchor(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
915 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
916 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
917 if !yaml_emitter_process_tag(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
918 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
919 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
920 if emitter.flow_level > 0 || emitter.canonical || event.sequence_style() == yaml_FLOW_SEQUENCE_STYLE ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
921 yaml_emitter_check_empty_sequence(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
922 emitter.state = yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
923 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
924 emitter.state = yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
925 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
926 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
927 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
928
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
929 // Expect MAPPING-START.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
930 func yaml_emitter_emit_mapping_start(emitter *yaml_emitter_t, event *yaml_event_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
931 if !yaml_emitter_process_anchor(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
932 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
933 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
934 if !yaml_emitter_process_tag(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
935 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
936 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
937 if emitter.flow_level > 0 || emitter.canonical || event.mapping_style() == yaml_FLOW_MAPPING_STYLE ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
938 yaml_emitter_check_empty_mapping(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
939 emitter.state = yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
940 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
941 emitter.state = yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
942 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
943 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
944 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
945
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
946 // Check if the document content is an empty scalar.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
947 func yaml_emitter_check_empty_document(emitter *yaml_emitter_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
948 return false // [Go] Huh?
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
949 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
950
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
951 // Check if the next events represent an empty sequence.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
952 func yaml_emitter_check_empty_sequence(emitter *yaml_emitter_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
953 if len(emitter.events)-emitter.events_head < 2 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
954 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
955 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
956 return emitter.events[emitter.events_head].typ == yaml_SEQUENCE_START_EVENT &&
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
957 emitter.events[emitter.events_head+1].typ == yaml_SEQUENCE_END_EVENT
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
958 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
959
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
960 // Check if the next events represent an empty mapping.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
961 func yaml_emitter_check_empty_mapping(emitter *yaml_emitter_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
962 if len(emitter.events)-emitter.events_head < 2 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
963 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
964 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
965 return emitter.events[emitter.events_head].typ == yaml_MAPPING_START_EVENT &&
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
966 emitter.events[emitter.events_head+1].typ == yaml_MAPPING_END_EVENT
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
967 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
968
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
969 // Check if the next node can be expressed as a simple key.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
970 func yaml_emitter_check_simple_key(emitter *yaml_emitter_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
971 length := 0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
972 switch emitter.events[emitter.events_head].typ {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
973 case yaml_ALIAS_EVENT:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
974 length += len(emitter.anchor_data.anchor)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
975 case yaml_SCALAR_EVENT:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
976 if emitter.scalar_data.multiline {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
977 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
978 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
979 length += len(emitter.anchor_data.anchor) +
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
980 len(emitter.tag_data.handle) +
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
981 len(emitter.tag_data.suffix) +
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
982 len(emitter.scalar_data.value)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
983 case yaml_SEQUENCE_START_EVENT:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
984 if !yaml_emitter_check_empty_sequence(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
985 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
986 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
987 length += len(emitter.anchor_data.anchor) +
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
988 len(emitter.tag_data.handle) +
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
989 len(emitter.tag_data.suffix)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
990 case yaml_MAPPING_START_EVENT:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
991 if !yaml_emitter_check_empty_mapping(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
992 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
993 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
994 length += len(emitter.anchor_data.anchor) +
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
995 len(emitter.tag_data.handle) +
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
996 len(emitter.tag_data.suffix)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
997 default:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
998 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
999 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1000 return length <= 128
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1001 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1002
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1003 // Determine an acceptable scalar style.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1004 func yaml_emitter_select_scalar_style(emitter *yaml_emitter_t, event *yaml_event_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1005
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1006 no_tag := len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1007 if no_tag && !event.implicit && !event.quoted_implicit {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1008 return yaml_emitter_set_emitter_error(emitter, "neither tag nor implicit flags are specified")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1009 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1010
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1011 style := event.scalar_style()
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1012 if style == yaml_ANY_SCALAR_STYLE {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1013 style = yaml_PLAIN_SCALAR_STYLE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1014 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1015 if emitter.canonical {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1016 style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1017 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1018 if emitter.simple_key_context && emitter.scalar_data.multiline {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1019 style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1020 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1021
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1022 if style == yaml_PLAIN_SCALAR_STYLE {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1023 if emitter.flow_level > 0 && !emitter.scalar_data.flow_plain_allowed ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1024 emitter.flow_level == 0 && !emitter.scalar_data.block_plain_allowed {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1025 style = yaml_SINGLE_QUOTED_SCALAR_STYLE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1026 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1027 if len(emitter.scalar_data.value) == 0 && (emitter.flow_level > 0 || emitter.simple_key_context) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1028 style = yaml_SINGLE_QUOTED_SCALAR_STYLE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1029 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1030 if no_tag && !event.implicit {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1031 style = yaml_SINGLE_QUOTED_SCALAR_STYLE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1032 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1033 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1034 if style == yaml_SINGLE_QUOTED_SCALAR_STYLE {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1035 if !emitter.scalar_data.single_quoted_allowed {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1036 style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1037 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1038 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1039 if style == yaml_LITERAL_SCALAR_STYLE || style == yaml_FOLDED_SCALAR_STYLE {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1040 if !emitter.scalar_data.block_allowed || emitter.flow_level > 0 || emitter.simple_key_context {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1041 style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1042 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1043 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1044
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1045 if no_tag && !event.quoted_implicit && style != yaml_PLAIN_SCALAR_STYLE {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1046 emitter.tag_data.handle = []byte{'!'}
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1047 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1048 emitter.scalar_data.style = style
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1049 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1050 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1051
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1052 // Write an anchor.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1053 func yaml_emitter_process_anchor(emitter *yaml_emitter_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1054 if emitter.anchor_data.anchor == nil {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1055 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1056 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1057 c := []byte{'&'}
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1058 if emitter.anchor_data.alias {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1059 c[0] = '*'
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1060 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1061 if !yaml_emitter_write_indicator(emitter, c, true, false, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1062 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1063 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1064 return yaml_emitter_write_anchor(emitter, emitter.anchor_data.anchor)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1065 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1066
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1067 // Write a tag.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1068 func yaml_emitter_process_tag(emitter *yaml_emitter_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1069 if len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1070 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1071 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1072 if len(emitter.tag_data.handle) > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1073 if !yaml_emitter_write_tag_handle(emitter, emitter.tag_data.handle) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1074 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1075 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1076 if len(emitter.tag_data.suffix) > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1077 if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1078 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1079 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1080 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1081 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1082 // [Go] Allocate these slices elsewhere.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1083 if !yaml_emitter_write_indicator(emitter, []byte("!<"), true, false, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1084 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1085 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1086 if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1087 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1088 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1089 if !yaml_emitter_write_indicator(emitter, []byte{'>'}, false, false, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1090 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1091 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1092 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1093 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1094 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1095
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1096 // Write a scalar.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1097 func yaml_emitter_process_scalar(emitter *yaml_emitter_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1098 switch emitter.scalar_data.style {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1099 case yaml_PLAIN_SCALAR_STYLE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1100 return yaml_emitter_write_plain_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1101
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1102 case yaml_SINGLE_QUOTED_SCALAR_STYLE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1103 return yaml_emitter_write_single_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1104
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1105 case yaml_DOUBLE_QUOTED_SCALAR_STYLE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1106 return yaml_emitter_write_double_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1107
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1108 case yaml_LITERAL_SCALAR_STYLE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1109 return yaml_emitter_write_literal_scalar(emitter, emitter.scalar_data.value)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1110
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1111 case yaml_FOLDED_SCALAR_STYLE:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1112 return yaml_emitter_write_folded_scalar(emitter, emitter.scalar_data.value)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1113 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1114 panic("unknown scalar style")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1115 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1116
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1117 // Write a head comment.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1118 func yaml_emitter_process_head_comment(emitter *yaml_emitter_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1119 if len(emitter.tail_comment) > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1120 if !yaml_emitter_write_indent(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1121 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1122 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1123 if !yaml_emitter_write_comment(emitter, emitter.tail_comment) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1124 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1125 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1126 emitter.tail_comment = emitter.tail_comment[:0]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1127 emitter.foot_indent = emitter.indent
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1128 if emitter.foot_indent < 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1129 emitter.foot_indent = 0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1130 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1131 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1132
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1133 if len(emitter.head_comment) == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1134 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1135 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1136 if !yaml_emitter_write_indent(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1137 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1138 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1139 if !yaml_emitter_write_comment(emitter, emitter.head_comment) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1140 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1141 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1142 emitter.head_comment = emitter.head_comment[:0]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1143 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1144 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1145
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1146 // Write an line comment.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1147 func yaml_emitter_process_line_comment(emitter *yaml_emitter_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1148 if len(emitter.line_comment) == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1149 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1150 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1151 if !emitter.whitespace {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1152 if !put(emitter, ' ') {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1153 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1154 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1155 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1156 if !yaml_emitter_write_comment(emitter, emitter.line_comment) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1157 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1158 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1159 emitter.line_comment = emitter.line_comment[:0]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1160 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1161 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1162
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1163 // Write a foot comment.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1164 func yaml_emitter_process_foot_comment(emitter *yaml_emitter_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1165 if len(emitter.foot_comment) == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1166 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1167 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1168 if !yaml_emitter_write_indent(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1169 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1170 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1171 if !yaml_emitter_write_comment(emitter, emitter.foot_comment) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1172 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1173 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1174 emitter.foot_comment = emitter.foot_comment[:0]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1175 emitter.foot_indent = emitter.indent
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1176 if emitter.foot_indent < 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1177 emitter.foot_indent = 0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1178 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1179 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1180 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1181
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1182 // Check if a %YAML directive is valid.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1183 func yaml_emitter_analyze_version_directive(emitter *yaml_emitter_t, version_directive *yaml_version_directive_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1184 if version_directive.major != 1 || version_directive.minor != 1 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1185 return yaml_emitter_set_emitter_error(emitter, "incompatible %YAML directive")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1186 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1187 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1188 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1189
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1190 // Check if a %TAG directive is valid.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1191 func yaml_emitter_analyze_tag_directive(emitter *yaml_emitter_t, tag_directive *yaml_tag_directive_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1192 handle := tag_directive.handle
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1193 prefix := tag_directive.prefix
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1194 if len(handle) == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1195 return yaml_emitter_set_emitter_error(emitter, "tag handle must not be empty")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1196 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1197 if handle[0] != '!' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1198 return yaml_emitter_set_emitter_error(emitter, "tag handle must start with '!'")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1199 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1200 if handle[len(handle)-1] != '!' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1201 return yaml_emitter_set_emitter_error(emitter, "tag handle must end with '!'")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1202 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1203 for i := 1; i < len(handle)-1; i += width(handle[i]) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1204 if !is_alpha(handle, i) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1205 return yaml_emitter_set_emitter_error(emitter, "tag handle must contain alphanumerical characters only")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1206 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1207 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1208 if len(prefix) == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1209 return yaml_emitter_set_emitter_error(emitter, "tag prefix must not be empty")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1210 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1211 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1212 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1213
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1214 // Check if an anchor is valid.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1215 func yaml_emitter_analyze_anchor(emitter *yaml_emitter_t, anchor []byte, alias bool) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1216 if len(anchor) == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1217 problem := "anchor value must not be empty"
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1218 if alias {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1219 problem = "alias value must not be empty"
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1220 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1221 return yaml_emitter_set_emitter_error(emitter, problem)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1222 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1223 for i := 0; i < len(anchor); i += width(anchor[i]) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1224 if !is_alpha(anchor, i) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1225 problem := "anchor value must contain alphanumerical characters only"
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1226 if alias {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1227 problem = "alias value must contain alphanumerical characters only"
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1228 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1229 return yaml_emitter_set_emitter_error(emitter, problem)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1230 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1231 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1232 emitter.anchor_data.anchor = anchor
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1233 emitter.anchor_data.alias = alias
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1234 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1235 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1236
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1237 // Check if a tag is valid.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1238 func yaml_emitter_analyze_tag(emitter *yaml_emitter_t, tag []byte) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1239 if len(tag) == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1240 return yaml_emitter_set_emitter_error(emitter, "tag value must not be empty")
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1241 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1242 for i := 0; i < len(emitter.tag_directives); i++ {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1243 tag_directive := &emitter.tag_directives[i]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1244 if bytes.HasPrefix(tag, tag_directive.prefix) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1245 emitter.tag_data.handle = tag_directive.handle
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1246 emitter.tag_data.suffix = tag[len(tag_directive.prefix):]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1247 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1248 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1249 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1250 emitter.tag_data.suffix = tag
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1251 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1252 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1253
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1254 // Check if a scalar is valid.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1255 func yaml_emitter_analyze_scalar(emitter *yaml_emitter_t, value []byte) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1256 var (
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1257 block_indicators = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1258 flow_indicators = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1259 line_breaks = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1260 special_characters = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1261 tab_characters = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1262
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1263 leading_space = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1264 leading_break = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1265 trailing_space = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1266 trailing_break = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1267 break_space = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1268 space_break = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1269
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1270 preceded_by_whitespace = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1271 followed_by_whitespace = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1272 previous_space = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1273 previous_break = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1274 )
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1275
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1276 emitter.scalar_data.value = value
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1277
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1278 if len(value) == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1279 emitter.scalar_data.multiline = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1280 emitter.scalar_data.flow_plain_allowed = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1281 emitter.scalar_data.block_plain_allowed = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1282 emitter.scalar_data.single_quoted_allowed = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1283 emitter.scalar_data.block_allowed = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1284 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1285 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1286
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1287 if len(value) >= 3 && ((value[0] == '-' && value[1] == '-' && value[2] == '-') || (value[0] == '.' && value[1] == '.' && value[2] == '.')) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1288 block_indicators = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1289 flow_indicators = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1290 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1291
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1292 preceded_by_whitespace = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1293 for i, w := 0, 0; i < len(value); i += w {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1294 w = width(value[i])
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1295 followed_by_whitespace = i+w >= len(value) || is_blank(value, i+w)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1296
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1297 if i == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1298 switch value[i] {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1299 case '#', ',', '[', ']', '{', '}', '&', '*', '!', '|', '>', '\'', '"', '%', '@', '`':
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1300 flow_indicators = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1301 block_indicators = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1302 case '?', ':':
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1303 flow_indicators = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1304 if followed_by_whitespace {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1305 block_indicators = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1306 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1307 case '-':
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1308 if followed_by_whitespace {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1309 flow_indicators = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1310 block_indicators = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1311 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1312 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1313 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1314 switch value[i] {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1315 case ',', '?', '[', ']', '{', '}':
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1316 flow_indicators = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1317 case ':':
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1318 flow_indicators = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1319 if followed_by_whitespace {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1320 block_indicators = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1321 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1322 case '#':
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1323 if preceded_by_whitespace {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1324 flow_indicators = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1325 block_indicators = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1326 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1327 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1328 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1329
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1330 if value[i] == '\t' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1331 tab_characters = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1332 } else if !is_printable(value, i) || !is_ascii(value, i) && !emitter.unicode {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1333 special_characters = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1334 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1335 if is_space(value, i) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1336 if i == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1337 leading_space = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1338 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1339 if i+width(value[i]) == len(value) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1340 trailing_space = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1341 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1342 if previous_break {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1343 break_space = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1344 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1345 previous_space = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1346 previous_break = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1347 } else if is_break(value, i) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1348 line_breaks = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1349 if i == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1350 leading_break = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1351 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1352 if i+width(value[i]) == len(value) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1353 trailing_break = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1354 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1355 if previous_space {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1356 space_break = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1357 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1358 previous_space = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1359 previous_break = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1360 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1361 previous_space = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1362 previous_break = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1363 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1364
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1365 // [Go]: Why 'z'? Couldn't be the end of the string as that's the loop condition.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1366 preceded_by_whitespace = is_blankz(value, i)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1367 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1368
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1369 emitter.scalar_data.multiline = line_breaks
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1370 emitter.scalar_data.flow_plain_allowed = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1371 emitter.scalar_data.block_plain_allowed = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1372 emitter.scalar_data.single_quoted_allowed = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1373 emitter.scalar_data.block_allowed = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1374
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1375 if leading_space || leading_break || trailing_space || trailing_break {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1376 emitter.scalar_data.flow_plain_allowed = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1377 emitter.scalar_data.block_plain_allowed = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1378 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1379 if trailing_space {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1380 emitter.scalar_data.block_allowed = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1381 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1382 if break_space {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1383 emitter.scalar_data.flow_plain_allowed = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1384 emitter.scalar_data.block_plain_allowed = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1385 emitter.scalar_data.single_quoted_allowed = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1386 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1387 if space_break || tab_characters || special_characters {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1388 emitter.scalar_data.flow_plain_allowed = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1389 emitter.scalar_data.block_plain_allowed = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1390 emitter.scalar_data.single_quoted_allowed = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1391 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1392 if space_break || special_characters {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1393 emitter.scalar_data.block_allowed = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1394 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1395 if line_breaks {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1396 emitter.scalar_data.flow_plain_allowed = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1397 emitter.scalar_data.block_plain_allowed = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1398 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1399 if flow_indicators {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1400 emitter.scalar_data.flow_plain_allowed = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1401 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1402 if block_indicators {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1403 emitter.scalar_data.block_plain_allowed = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1404 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1405 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1406 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1407
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1408 // Check if the event data is valid.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1409 func yaml_emitter_analyze_event(emitter *yaml_emitter_t, event *yaml_event_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1410
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1411 emitter.anchor_data.anchor = nil
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1412 emitter.tag_data.handle = nil
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1413 emitter.tag_data.suffix = nil
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1414 emitter.scalar_data.value = nil
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1415
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1416 if len(event.head_comment) > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1417 emitter.head_comment = event.head_comment
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1418 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1419 if len(event.line_comment) > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1420 emitter.line_comment = event.line_comment
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1421 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1422 if len(event.foot_comment) > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1423 emitter.foot_comment = event.foot_comment
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1424 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1425 if len(event.tail_comment) > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1426 emitter.tail_comment = event.tail_comment
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1427 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1428
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1429 switch event.typ {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1430 case yaml_ALIAS_EVENT:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1431 if !yaml_emitter_analyze_anchor(emitter, event.anchor, true) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1432 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1433 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1434
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1435 case yaml_SCALAR_EVENT:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1436 if len(event.anchor) > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1437 if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1438 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1439 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1440 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1441 if len(event.tag) > 0 && (emitter.canonical || (!event.implicit && !event.quoted_implicit)) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1442 if !yaml_emitter_analyze_tag(emitter, event.tag) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1443 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1444 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1445 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1446 if !yaml_emitter_analyze_scalar(emitter, event.value) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1447 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1448 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1449
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1450 case yaml_SEQUENCE_START_EVENT:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1451 if len(event.anchor) > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1452 if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1453 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1454 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1455 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1456 if len(event.tag) > 0 && (emitter.canonical || !event.implicit) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1457 if !yaml_emitter_analyze_tag(emitter, event.tag) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1458 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1459 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1460 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1461
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1462 case yaml_MAPPING_START_EVENT:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1463 if len(event.anchor) > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1464 if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1465 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1466 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1467 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1468 if len(event.tag) > 0 && (emitter.canonical || !event.implicit) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1469 if !yaml_emitter_analyze_tag(emitter, event.tag) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1470 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1471 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1472 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1473 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1474 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1475 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1476
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1477 // Write the BOM character.
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1478 func yaml_emitter_write_bom(emitter *yaml_emitter_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1479 if !flush(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1480 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1481 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1482 pos := emitter.buffer_pos
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1483 emitter.buffer[pos+0] = '\xEF'
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1484 emitter.buffer[pos+1] = '\xBB'
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1485 emitter.buffer[pos+2] = '\xBF'
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1486 emitter.buffer_pos += 3
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1487 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1488 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1489
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1490 func yaml_emitter_write_indent(emitter *yaml_emitter_t) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1491 indent := emitter.indent
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1492 if indent < 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1493 indent = 0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1494 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1495 if !emitter.indention || emitter.column > indent || (emitter.column == indent && !emitter.whitespace) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1496 if !put_break(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1497 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1498 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1499 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1500 if emitter.foot_indent == indent {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1501 if !put_break(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1502 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1503 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1504 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1505 for emitter.column < indent {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1506 if !put(emitter, ' ') {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1507 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1508 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1509 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1510 emitter.whitespace = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1511 //emitter.indention = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1512 emitter.space_above = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1513 emitter.foot_indent = -1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1514 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1515 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1516
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1517 func yaml_emitter_write_indicator(emitter *yaml_emitter_t, indicator []byte, need_whitespace, is_whitespace, is_indention bool) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1518 if need_whitespace && !emitter.whitespace {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1519 if !put(emitter, ' ') {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1520 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1521 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1522 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1523 if !write_all(emitter, indicator) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1524 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1525 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1526 emitter.whitespace = is_whitespace
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1527 emitter.indention = (emitter.indention && is_indention)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1528 emitter.open_ended = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1529 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1530 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1531
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1532 func yaml_emitter_write_anchor(emitter *yaml_emitter_t, value []byte) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1533 if !write_all(emitter, value) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1534 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1535 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1536 emitter.whitespace = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1537 emitter.indention = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1538 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1539 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1540
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1541 func yaml_emitter_write_tag_handle(emitter *yaml_emitter_t, value []byte) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1542 if !emitter.whitespace {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1543 if !put(emitter, ' ') {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1544 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1545 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1546 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1547 if !write_all(emitter, value) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1548 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1549 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1550 emitter.whitespace = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1551 emitter.indention = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1552 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1553 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1554
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1555 func yaml_emitter_write_tag_content(emitter *yaml_emitter_t, value []byte, need_whitespace bool) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1556 if need_whitespace && !emitter.whitespace {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1557 if !put(emitter, ' ') {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1558 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1559 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1560 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1561 for i := 0; i < len(value); {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1562 var must_write bool
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1563 switch value[i] {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1564 case ';', '/', '?', ':', '@', '&', '=', '+', '$', ',', '_', '.', '~', '*', '\'', '(', ')', '[', ']':
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1565 must_write = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1566 default:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1567 must_write = is_alpha(value, i)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1568 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1569 if must_write {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1570 if !write(emitter, value, &i) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1571 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1572 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1573 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1574 w := width(value[i])
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1575 for k := 0; k < w; k++ {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1576 octet := value[i]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1577 i++
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1578 if !put(emitter, '%') {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1579 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1580 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1581
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1582 c := octet >> 4
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1583 if c < 10 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1584 c += '0'
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1585 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1586 c += 'A' - 10
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1587 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1588 if !put(emitter, c) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1589 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1590 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1591
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1592 c = octet & 0x0f
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1593 if c < 10 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1594 c += '0'
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1595 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1596 c += 'A' - 10
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1597 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1598 if !put(emitter, c) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1599 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1600 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1601 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1602 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1603 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1604 emitter.whitespace = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1605 emitter.indention = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1606 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1607 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1608
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1609 func yaml_emitter_write_plain_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1610 if len(value) > 0 && !emitter.whitespace {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1611 if !put(emitter, ' ') {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1612 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1613 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1614 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1615
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1616 spaces := false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1617 breaks := false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1618 for i := 0; i < len(value); {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1619 if is_space(value, i) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1620 if allow_breaks && !spaces && emitter.column > emitter.best_width && !is_space(value, i+1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1621 if !yaml_emitter_write_indent(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1622 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1623 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1624 i += width(value[i])
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1625 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1626 if !write(emitter, value, &i) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1627 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1628 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1629 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1630 spaces = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1631 } else if is_break(value, i) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1632 if !breaks && value[i] == '\n' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1633 if !put_break(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1634 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1635 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1636 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1637 if !write_break(emitter, value, &i) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1638 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1639 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1640 //emitter.indention = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1641 breaks = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1642 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1643 if breaks {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1644 if !yaml_emitter_write_indent(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1645 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1646 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1647 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1648 if !write(emitter, value, &i) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1649 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1650 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1651 emitter.indention = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1652 spaces = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1653 breaks = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1654 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1655 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1656
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1657 if len(value) > 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1658 emitter.whitespace = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1659 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1660 emitter.indention = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1661 if emitter.root_context {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1662 emitter.open_ended = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1663 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1664
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1665 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1666 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1667
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1668 func yaml_emitter_write_single_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1669
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1670 if !yaml_emitter_write_indicator(emitter, []byte{'\''}, true, false, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1671 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1672 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1673
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1674 spaces := false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1675 breaks := false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1676 for i := 0; i < len(value); {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1677 if is_space(value, i) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1678 if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 && !is_space(value, i+1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1679 if !yaml_emitter_write_indent(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1680 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1681 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1682 i += width(value[i])
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1683 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1684 if !write(emitter, value, &i) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1685 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1686 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1687 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1688 spaces = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1689 } else if is_break(value, i) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1690 if !breaks && value[i] == '\n' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1691 if !put_break(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1692 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1693 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1694 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1695 if !write_break(emitter, value, &i) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1696 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1697 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1698 //emitter.indention = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1699 breaks = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1700 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1701 if breaks {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1702 if !yaml_emitter_write_indent(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1703 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1704 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1705 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1706 if value[i] == '\'' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1707 if !put(emitter, '\'') {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1708 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1709 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1710 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1711 if !write(emitter, value, &i) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1712 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1713 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1714 emitter.indention = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1715 spaces = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1716 breaks = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1717 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1718 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1719 if !yaml_emitter_write_indicator(emitter, []byte{'\''}, false, false, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1720 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1721 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1722 emitter.whitespace = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1723 emitter.indention = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1724 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1725 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1726
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1727 func yaml_emitter_write_double_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1728 spaces := false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1729 if !yaml_emitter_write_indicator(emitter, []byte{'"'}, true, false, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1730 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1731 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1732
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1733 for i := 0; i < len(value); {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1734 if !is_printable(value, i) || (!emitter.unicode && !is_ascii(value, i)) ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1735 is_bom(value, i) || is_break(value, i) ||
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1736 value[i] == '"' || value[i] == '\\' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1737
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1738 octet := value[i]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1739
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1740 var w int
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1741 var v rune
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1742 switch {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1743 case octet&0x80 == 0x00:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1744 w, v = 1, rune(octet&0x7F)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1745 case octet&0xE0 == 0xC0:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1746 w, v = 2, rune(octet&0x1F)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1747 case octet&0xF0 == 0xE0:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1748 w, v = 3, rune(octet&0x0F)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1749 case octet&0xF8 == 0xF0:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1750 w, v = 4, rune(octet&0x07)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1751 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1752 for k := 1; k < w; k++ {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1753 octet = value[i+k]
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1754 v = (v << 6) + (rune(octet) & 0x3F)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1755 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1756 i += w
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1757
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1758 if !put(emitter, '\\') {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1759 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1760 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1761
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1762 var ok bool
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1763 switch v {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1764 case 0x00:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1765 ok = put(emitter, '0')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1766 case 0x07:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1767 ok = put(emitter, 'a')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1768 case 0x08:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1769 ok = put(emitter, 'b')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1770 case 0x09:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1771 ok = put(emitter, 't')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1772 case 0x0A:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1773 ok = put(emitter, 'n')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1774 case 0x0b:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1775 ok = put(emitter, 'v')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1776 case 0x0c:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1777 ok = put(emitter, 'f')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1778 case 0x0d:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1779 ok = put(emitter, 'r')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1780 case 0x1b:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1781 ok = put(emitter, 'e')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1782 case 0x22:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1783 ok = put(emitter, '"')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1784 case 0x5c:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1785 ok = put(emitter, '\\')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1786 case 0x85:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1787 ok = put(emitter, 'N')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1788 case 0xA0:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1789 ok = put(emitter, '_')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1790 case 0x2028:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1791 ok = put(emitter, 'L')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1792 case 0x2029:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1793 ok = put(emitter, 'P')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1794 default:
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1795 if v <= 0xFF {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1796 ok = put(emitter, 'x')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1797 w = 2
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1798 } else if v <= 0xFFFF {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1799 ok = put(emitter, 'u')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1800 w = 4
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1801 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1802 ok = put(emitter, 'U')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1803 w = 8
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1804 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1805 for k := (w - 1) * 4; ok && k >= 0; k -= 4 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1806 digit := byte((v >> uint(k)) & 0x0F)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1807 if digit < 10 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1808 ok = put(emitter, digit+'0')
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1809 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1810 ok = put(emitter, digit+'A'-10)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1811 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1812 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1813 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1814 if !ok {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1815 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1816 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1817 spaces = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1818 } else if is_space(value, i) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1819 if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1820 if !yaml_emitter_write_indent(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1821 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1822 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1823 if is_space(value, i+1) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1824 if !put(emitter, '\\') {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1825 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1826 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1827 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1828 i += width(value[i])
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1829 } else if !write(emitter, value, &i) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1830 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1831 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1832 spaces = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1833 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1834 if !write(emitter, value, &i) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1835 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1836 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1837 spaces = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1838 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1839 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1840 if !yaml_emitter_write_indicator(emitter, []byte{'"'}, false, false, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1841 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1842 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1843 emitter.whitespace = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1844 emitter.indention = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1845 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1846 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1847
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1848 func yaml_emitter_write_block_scalar_hints(emitter *yaml_emitter_t, value []byte) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1849 if is_space(value, 0) || is_break(value, 0) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1850 indent_hint := []byte{'0' + byte(emitter.best_indent)}
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1851 if !yaml_emitter_write_indicator(emitter, indent_hint, false, false, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1852 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1853 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1854 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1855
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1856 emitter.open_ended = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1857
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1858 var chomp_hint [1]byte
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1859 if len(value) == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1860 chomp_hint[0] = '-'
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1861 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1862 i := len(value) - 1
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1863 for value[i]&0xC0 == 0x80 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1864 i--
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1865 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1866 if !is_break(value, i) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1867 chomp_hint[0] = '-'
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1868 } else if i == 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1869 chomp_hint[0] = '+'
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1870 emitter.open_ended = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1871 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1872 i--
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1873 for value[i]&0xC0 == 0x80 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1874 i--
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1875 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1876 if is_break(value, i) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1877 chomp_hint[0] = '+'
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1878 emitter.open_ended = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1879 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1880 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1881 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1882 if chomp_hint[0] != 0 {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1883 if !yaml_emitter_write_indicator(emitter, chomp_hint[:], false, false, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1884 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1885 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1886 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1887 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1888 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1889
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1890 func yaml_emitter_write_literal_scalar(emitter *yaml_emitter_t, value []byte) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1891 if !yaml_emitter_write_indicator(emitter, []byte{'|'}, true, false, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1892 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1893 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1894 if !yaml_emitter_write_block_scalar_hints(emitter, value) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1895 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1896 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1897 if !yaml_emitter_process_line_comment(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1898 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1899 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1900 //emitter.indention = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1901 emitter.whitespace = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1902 breaks := true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1903 for i := 0; i < len(value); {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1904 if is_break(value, i) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1905 if !write_break(emitter, value, &i) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1906 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1907 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1908 //emitter.indention = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1909 breaks = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1910 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1911 if breaks {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1912 if !yaml_emitter_write_indent(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1913 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1914 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1915 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1916 if !write(emitter, value, &i) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1917 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1918 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1919 emitter.indention = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1920 breaks = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1921 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1922 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1923
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1924 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1925 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1926
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1927 func yaml_emitter_write_folded_scalar(emitter *yaml_emitter_t, value []byte) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1928 if !yaml_emitter_write_indicator(emitter, []byte{'>'}, true, false, false) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1929 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1930 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1931 if !yaml_emitter_write_block_scalar_hints(emitter, value) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1932 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1933 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1934 if !yaml_emitter_process_line_comment(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1935 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1936 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1937
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1938 //emitter.indention = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1939 emitter.whitespace = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1940
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1941 breaks := true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1942 leading_spaces := true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1943 for i := 0; i < len(value); {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1944 if is_break(value, i) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1945 if !breaks && !leading_spaces && value[i] == '\n' {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1946 k := 0
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1947 for is_break(value, k) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1948 k += width(value[k])
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1949 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1950 if !is_blankz(value, k) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1951 if !put_break(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1952 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1953 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1954 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1955 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1956 if !write_break(emitter, value, &i) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1957 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1958 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1959 //emitter.indention = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1960 breaks = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1961 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1962 if breaks {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1963 if !yaml_emitter_write_indent(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1964 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1965 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1966 leading_spaces = is_blank(value, i)
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1967 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1968 if !breaks && is_space(value, i) && !is_space(value, i+1) && emitter.column > emitter.best_width {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1969 if !yaml_emitter_write_indent(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1970 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1971 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1972 i += width(value[i])
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1973 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1974 if !write(emitter, value, &i) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1975 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1976 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1977 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1978 emitter.indention = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1979 breaks = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1980 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1981 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1982 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1983 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1984
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1985 func yaml_emitter_write_comment(emitter *yaml_emitter_t, comment []byte) bool {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1986 breaks := false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1987 pound := false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1988 for i := 0; i < len(comment); {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1989 if is_break(comment, i) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1990 if !write_break(emitter, comment, &i) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1991 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1992 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1993 //emitter.indention = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1994 breaks = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1995 pound = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1996 } else {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1997 if breaks && !yaml_emitter_write_indent(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1998 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
1999 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2000 if !pound {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2001 if comment[i] != '#' && (!put(emitter, '#') || !put(emitter, ' ')) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2002 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2003 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2004 pound = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2005 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2006 if !write(emitter, comment, &i) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2007 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2008 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2009 emitter.indention = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2010 breaks = false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2011 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2012 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2013 if !breaks && !put_break(emitter) {
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2014 return false
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2015 }
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2016
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2017 emitter.whitespace = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2018 //emitter.indention = true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2019 return true
d8727551f403 The Empress (III)
yakumo.izuru
parents:
diff changeset
2020 }