1 /*=============================================================================
2 Copyright (c) 2002 2004 2006Joel de Guzman
3 Copyright (c) 2004 Eric Niebler
4 http://spirit.sourceforge.net/
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 =============================================================================*/
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>
25 namespace cl
= boost::spirit::classic
;
26 namespace ph
= phoenix
;
28 struct block_element_grammar_local
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
,
42 void quickbook_grammar::impl::init_block_elements()
44 block_element_grammar_local
& local
= cleanup_
.add(
45 new block_element_grammar_local
);
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
);
57 >> to_value(general_tags::element_id
) [attribute_value_1_7
]
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
]
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
))
85 >> !(qbk_ver(106u) >> local
.element_id
)
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
))
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
))
111 ("block", element_info(element_info::nested_block
, &local
.inner_phrase
, block_tags::block
, 106u))
115 ("pre", element_info(element_info::nested_block
, &local
.preformatted
, block_tags::preformatted
))
119 ( qbk_ver(0, 106) >> space
120 | qbk_ver(106) >> blank
>> !eol
129 ("def", element_info(element_info::conditional_or_block
, &local
.def_macro
, block_tags::macro_definition
))
134 >> macro_identifier
[state
.values
.entry(ph::arg1
, ph::arg2
)]
136 >> local
.inner_phrase
140 (cl::alpha_p
| '_') >> *(cl::alnum_p
| '_')
144 local
.identifier
| (cl::punct_p
- (cl::ch_p('[') | ']'))
148 ("template", element_info(element_info::conditional_or_block
, &local
.template_
, block_tags::template_definition
))
153 >> local
.template_id
[state
.values
.entry(ph::arg1
, ph::arg2
)]
154 >> state
.values
.list()[
159 >> local
.template_id
[state
.values
.entry(ph::arg1
, ph::arg2
)]
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
)]
170 local
.template_body
=
172 >> *(~cl::eps_p(']') >> skip_entity
)
174 >> *(('[' >> local
.template_body
>> ']') | (cl::anychar_p
- ']'))
175 >> cl::eps_p(space
>> ']')
180 ("variablelist", element_info(element_info::nested_block
, &local
.variablelist
, block_tags::variable_list
))
184 (cl::eps_p(*cl::blank_p
>> cl::eol_p
) | space
)
186 >> *local
.varlistentry
192 >> state
.values
.list()
209 >> local
.inner_phrase
217 ("table", element_info(element_info::nested_block
, &local
.table
, block_tags::table
))
220 local
.same_line
= *cl::blank_p
>> !(comment
>> space
);
224 >> !(qbk_ver(105u) >> local
.element_id
)
236 state
.values
.list(table_tags::row
)
248 >> (*(cl::anychar_p
- eol
)) [state
.values
.entry(ph::arg1
, ph::arg2
, table_tags::title
)]
251 >> to_value(table_tags::title
)
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))
264 *( cl::eps_p
[explicit_list
]
272 >> ( local
.inner_block
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
))
287 >> local
.include_filename
292 >> local
.include_filename
300 >> (*((cl::alnum_p
| '_') - cl::space_p
))
301 [state
.values
.entry(ph::arg1
, ph::arg2
, general_tags::include_id
)]
304 >> local
.include_filename
307 local
.include_filename
=
309 >> (*(cl::anychar_p
- phrase_end
)) [state
.values
.entry(ph::arg1
, ph::arg2
)]
310 | qbk_ver(106u, 107u)
313 | (cl::anychar_p
- phrase_end
)
318 >> to_value() [ attribute_value_1_7
]