]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/tools/quickbook/src/block_element_grammar.cpp
update sources to v12.2.3
[ceph.git] / ceph / src / boost / tools / quickbook / src / block_element_grammar.cpp
1 /*=============================================================================
2 Copyright (c) 2002 2004 2006Joel de Guzman
3 Copyright (c) 2004 Eric Niebler
4 http://spirit.sourceforge.net/
5
6 Use, modification and distribution is subject to the Boost Software
7 License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
8 http://www.boost.org/LICENSE_1_0.txt)
9 =============================================================================*/
10
11 #include "utils.hpp"
12 #include "state.hpp"
13 #include "actions.hpp"
14 #include "grammar_impl.hpp"
15 #include "block_tags.hpp"
16 #include "template_tags.hpp"
17 #include <boost/spirit/include/classic_assign_actor.hpp>
18 #include <boost/spirit/include/classic_if.hpp>
19 #include <boost/spirit/include/classic_clear_actor.hpp>
20 #include <boost/spirit/include/phoenix1_primitives.hpp>
21 #include <boost/spirit/include/phoenix1_casts.hpp>
22
23 namespace quickbook
24 {
25 namespace cl = boost::spirit::classic;
26 namespace ph = phoenix;
27
28 struct block_element_grammar_local
29 {
30 cl::rule<scanner>
31 heading, inner_block, inner_phrase, def_macro,
32 table, table_title, table_row, variablelist,
33 varlistentry, varlistterm, list, cell,
34 preformatted, begin_section, end_section,
35 xinclude, include, include_filename,
36 template_, template_id, template_formal_arg,
37 template_body, identifier, import,
38 element_id,
39 same_line;
40 };
41
42 void quickbook_grammar::impl::init_block_elements()
43 {
44 block_element_grammar_local& local = cleanup_.add(
45 new block_element_grammar_local);
46
47 // Actions
48 error_action error(state);
49 element_id_warning_action element_id_warning(state);
50 raw_char_action raw_char(state);
51 explicit_list_action explicit_list(state);
52 scoped_parser<to_value_scoped_action> to_value(state);
53
54 local.element_id =
55 !( ':'
56 >> ( qbk_ver(107u)
57 >> to_value(general_tags::element_id) [attribute_value_1_7]
58 | qbk_ver(0, 107u)
59 >> !(qbk_ver(105u) >> space)
60 >> (+(cl::alnum_p | '_')) [state.values.entry(ph::arg1, ph::arg2, general_tags::element_id)]
61 | cl::eps_p [element_id_warning]
62 )
63 )
64 ;
65
66 elements.add
67 ("section", element_info(element_info::section_block, &local.begin_section, block_tags::begin_section))
68 ("endsect", element_info(element_info::section_block, &local.end_section, block_tags::end_section))
69 ;
70
71 local.begin_section =
72 space
73 >> local.element_id
74 >> space
75 >> local.inner_phrase
76 ;
77
78 local.end_section =
79 space
80 >> local.element_id
81 ;
82
83 local.heading
84 = space
85 >> !(qbk_ver(106u) >> local.element_id)
86 >> space
87 >> local.inner_phrase
88 ;
89
90 elements.add
91 ("heading", element_info(element_info::conditional_or_block, &local.heading, block_tags::generic_heading))
92 ("h1", element_info(element_info::conditional_or_block, &local.heading, block_tags::heading1))
93 ("h2", element_info(element_info::conditional_or_block, &local.heading, block_tags::heading2))
94 ("h3", element_info(element_info::conditional_or_block, &local.heading, block_tags::heading3))
95 ("h4", element_info(element_info::conditional_or_block, &local.heading, block_tags::heading4))
96 ("h5", element_info(element_info::conditional_or_block, &local.heading, block_tags::heading5))
97 ("h6", element_info(element_info::conditional_or_block, &local.heading, block_tags::heading6))
98 ;
99
100 elements.add
101 ("blurb", element_info(element_info::nested_block, &local.inner_block, block_tags::blurb))
102 (":", element_info(element_info::nested_block, &local.inner_block, block_tags::blockquote))
103 ("warning", element_info(element_info::nested_block, &local.inner_block, block_tags::warning))
104 ("caution", element_info(element_info::nested_block, &local.inner_block, block_tags::caution))
105 ("important", element_info(element_info::nested_block, &local.inner_block, block_tags::important))
106 ("note", element_info(element_info::nested_block, &local.inner_block, block_tags::note))
107 ("tip", element_info(element_info::nested_block, &local.inner_block, block_tags::tip))
108 ;
109
110 elements.add
111 ("block", element_info(element_info::nested_block, &local.inner_phrase, block_tags::block, 106u))
112 ;
113
114 elements.add
115 ("pre", element_info(element_info::nested_block, &local.preformatted, block_tags::preformatted))
116 ;
117
118 local.preformatted =
119 ( qbk_ver(0, 106) >> space
120 | qbk_ver(106) >> blank >> !eol
121 )
122 >> to_value()
123 [
124 inside_preformatted
125 ]
126 ;
127
128 elements.add
129 ("def", element_info(element_info::conditional_or_block, &local.def_macro, block_tags::macro_definition))
130 ;
131
132 local.def_macro =
133 space
134 >> macro_identifier [state.values.entry(ph::arg1, ph::arg2)]
135 >> blank
136 >> local.inner_phrase
137 ;
138
139 local.identifier =
140 (cl::alpha_p | '_') >> *(cl::alnum_p | '_')
141 ;
142
143 local.template_id =
144 local.identifier | (cl::punct_p - (cl::ch_p('[') | ']'))
145 ;
146
147 elements.add
148 ("template", element_info(element_info::conditional_or_block, &local.template_, block_tags::template_definition))
149 ;
150
151 local.template_ =
152 space
153 >> local.template_id [state.values.entry(ph::arg1, ph::arg2)]
154 >> state.values.list()[
155 !(
156 space >> '['
157 >> *(
158 space
159 >> local.template_id [state.values.entry(ph::arg1, ph::arg2)]
160 )
161 >> space >> ']'
162 )
163 ]
164 >> ( cl::eps_p(*cl::blank_p >> cl::eol_p)
165 >> local.template_body [state.values.entry(ph::arg1, ph::arg2, template_tags::block)]
166 | local.template_body [state.values.entry(ph::arg1, ph::arg2, template_tags::phrase)]
167 )
168 ;
169
170 local.template_body =
171 qbk_ver(106u)
172 >> *(~cl::eps_p(']') >> skip_entity)
173 | qbk_ver(0,106u)
174 >> *(('[' >> local.template_body >> ']') | (cl::anychar_p - ']'))
175 >> cl::eps_p(space >> ']')
176 >> space
177 ;
178
179 elements.add
180 ("variablelist", element_info(element_info::nested_block, &local.variablelist, block_tags::variable_list))
181 ;
182
183 local.variablelist =
184 (cl::eps_p(*cl::blank_p >> cl::eol_p) | space)
185 >> local.table_title
186 >> *local.varlistentry
187 ;
188
189 local.varlistentry =
190 space
191 >> cl::ch_p('[')
192 >> state.values.list()
193 [
194 (
195 local.varlistterm
196 >> ( +local.cell
197 | cl::eps_p [error]
198 )
199 >> cl::ch_p(']')
200 >> space
201 )
202 | cl::eps_p [error]
203 ]
204 ;
205
206 local.varlistterm =
207 space
208 >> cl::ch_p('[')
209 >> local.inner_phrase
210 >> ( cl::ch_p(']')
211 >> space
212 | cl::eps_p [error]
213 )
214 ;
215
216 elements.add
217 ("table", element_info(element_info::nested_block, &local.table, block_tags::table))
218 ;
219
220 local.same_line = *cl::blank_p >> !(comment >> space);
221
222 local.table =
223 local.same_line
224 >> !(qbk_ver(105u) >> local.element_id)
225 >> local.same_line
226 >> local.table_title
227 >> *local.table_row
228 ;
229
230 local.table_row =
231 space
232 >> cl::ch_p('[')
233 >>
234 (
235 (
236 state.values.list(table_tags::row)
237 [ *local.cell
238 ]
239 >> cl::ch_p(']')
240 >> space
241 )
242 | cl::eps_p [error]
243 )
244 ;
245
246 local.table_title =
247 qbk_ver(0, 106)
248 >> (*(cl::anychar_p - eol)) [state.values.entry(ph::arg1, ph::arg2, table_tags::title)]
249 >> (+eol)
250 | qbk_ver(106)
251 >> to_value(table_tags::title)
252 [
253 table_title_phrase
254 ]
255 >> space
256 ;
257
258 elements.add
259 ("ordered_list", element_info(element_info::nested_block, &local.list, block_tags::ordered_list, 106))
260 ("itemized_list", element_info(element_info::nested_block, &local.list, block_tags::itemized_list, 106))
261 ;
262
263 local.list =
264 *( cl::eps_p [explicit_list]
265 >> local.cell
266 )
267 ;
268
269 local.cell =
270 space
271 >> cl::ch_p('[')
272 >> ( local.inner_block
273 >> cl::ch_p(']')
274 >> space
275 | cl::eps_p [error]
276 )
277 ;
278
279 elements.add
280 ("xinclude", element_info(element_info::conditional_or_block, &local.xinclude, block_tags::xinclude))
281 ("import", element_info(element_info::conditional_or_block, &local.import, block_tags::import))
282 ("include", element_info(element_info::conditional_or_block, &local.include, block_tags::include))
283 ;
284
285 local.xinclude =
286 space
287 >> local.include_filename
288 ;
289
290 local.import =
291 space
292 >> local.include_filename
293 ;
294
295 local.include =
296 space
297 >>
298 !(
299 ':'
300 >> (*((cl::alnum_p | '_') - cl::space_p))
301 [state.values.entry(ph::arg1, ph::arg2, general_tags::include_id)]
302 >> space
303 )
304 >> local.include_filename
305 ;
306
307 local.include_filename =
308 qbk_ver(0, 106u)
309 >> (*(cl::anychar_p - phrase_end)) [state.values.entry(ph::arg1, ph::arg2)]
310 | qbk_ver(106u, 107u)
311 >> to_value()
312 [ *( raw_escape
313 | (cl::anychar_p - phrase_end)
314 [raw_char]
315 )
316 ]
317 | qbk_ver(107u)
318 >> to_value() [ attribute_value_1_7 ]
319 ;
320
321 local.inner_block =
322 to_value()
323 [
324 inside_paragraph
325 ]
326 ;
327
328 local.inner_phrase =
329 to_value()
330 [
331 paragraph_phrase
332 ]
333 ;
334 }
335 }