1 /*=============================================================================
2 Copyright (c) 2002 2004 2006 Joel 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 =============================================================================*/
11 #include "grammar_impl.hpp"
13 #include "actions.hpp"
15 #include "phrase_tags.hpp"
16 #include <boost/spirit/include/classic_core.hpp>
17 #include <boost/spirit/include/classic_assign_actor.hpp>
18 #include <boost/spirit/include/classic_clear_actor.hpp>
19 #include <boost/spirit/include/classic_if.hpp>
20 #include <boost/spirit/include/phoenix1_primitives.hpp>
21 #include <boost/spirit/include/phoenix1_casts.hpp>
22 #include <boost/foreach.hpp>
26 namespace cl
= boost::spirit::classic
;
28 struct phrase_element_grammar_local
31 image
, anchor
, link
, empty
, cond_phrase
, inner_phrase
,
36 void quickbook_grammar::impl::init_phrase_elements()
38 phrase_element_grammar_local
& local
= cleanup_
.add(
39 new phrase_element_grammar_local
);
41 error_action
error(state
);
42 raw_char_action
raw_char(state
);
43 scoped_parser
<cond_phrase_push
> scoped_cond_phrase(state
);
44 scoped_parser
<to_value_scoped_action
> to_value(state
);
47 ("?", element_info(element_info::phrase
, &local
.cond_phrase
))
51 ( !(qbk_ver(107u) >> "!") ) [state
.values
.entry(ph::arg1
, ph::arg2
)]
53 >> macro_identifier
[state
.values
.entry(ph::arg1
, ph::arg2
)]
54 >> scoped_cond_phrase() [extended_phrase
]
58 ("$", element_info(element_info::phrase
, &local
.image
, phrase_tags::image
))
61 // Note that the attribute values here are encoded in plain text not
69 >> +(cl::anychar_p
- (cl::space_p
| phrase_end
| '['))
70 )) [state
.values
.entry(ph::arg1
, ph::arg2
)]
74 | (+cl::space_p
>> ~cl::eps_p(phrase_end
| '['))
76 | (cl::anychar_p
- (cl::space_p
| phrase_end
| '['))
82 >> *state
.values
.list()
84 >> (*(cl::alnum_p
| '_'))
85 [state
.values
.entry(ph::arg1
, ph::arg2
)]
88 >> (*(cl::anychar_p
- (phrase_end
| '[')))
89 [state
.values
.entry(ph::arg1
, ph::arg2
)]
93 | (cl::anychar_p
- (phrase_end
| '['))
104 >> (*(cl::anychar_p
- phrase_end
)) [state
.values
.entry(ph::arg1
, ph::arg2
)]
109 ("@", element_info(element_info::phrase
, &local
.link
, phrase_tags::url
))
110 ("link", element_info(element_info::phrase
, &local
.link
, phrase_tags::link
))
111 ("funcref", element_info(element_info::phrase
, &local
.link
, phrase_tags::funcref
))
112 ("classref", element_info(element_info::phrase
, &local
.link
, phrase_tags::classref
))
113 ("memberref", element_info(element_info::phrase
, &local
.link
, phrase_tags::memberref
))
114 ("enumref", element_info(element_info::phrase
, &local
.link
, phrase_tags::enumref
))
115 ("macroref", element_info(element_info::phrase
, &local
.link
, phrase_tags::macroref
))
116 ("headerref", element_info(element_info::phrase
, &local
.link
, phrase_tags::headerref
))
117 ("conceptref", element_info(element_info::phrase
, &local
.link
, phrase_tags::conceptref
))
118 ("globalref", element_info(element_info::phrase
, &local
.link
, phrase_tags::globalref
))
123 >> ( qbk_ver(0, 106u)
124 >> (*(cl::anychar_p
- (']' | space
)))
125 [state
.values
.entry(ph::arg1
, ph::arg2
)]
126 | qbk_ver(106u, 107u)
129 | (cl::anychar_p
- (cl::ch_p('[') | ']' | space
))
133 >> !( ~cl::eps_p(comment
)
134 >> cl::eps_p('[') [error("Open bracket in link value.")]
137 >> to_value() [attribute_value_1_7
]
140 >> local
.inner_phrase
144 ("#", element_info(element_info::maybe_block
, &local
.anchor
, phrase_tags::anchor
))
149 >> ( qbk_ver(0, 106u)
150 >> (*(cl::anychar_p
- phrase_end
)) [state
.values
.entry(ph::arg1
, ph::arg2
)]
151 | qbk_ver(106u, 107u)
154 | (cl::anychar_p
- phrase_end
)
159 >> to_value() [attribute_value_1_7
]
164 ("*", element_info(element_info::phrase
, &local
.inner_phrase
, phrase_tags::bold
))
165 ("'", element_info(element_info::phrase
, &local
.inner_phrase
, phrase_tags::italic
))
166 ("_", element_info(element_info::phrase
, &local
.inner_phrase
, phrase_tags::underline
))
167 ("^", element_info(element_info::phrase
, &local
.inner_phrase
, phrase_tags::teletype
))
168 ("-", element_info(element_info::phrase
, &local
.inner_phrase
, phrase_tags::strikethrough
))
169 ("\"", element_info(element_info::phrase
, &local
.inner_phrase
, phrase_tags::quote
))
170 ("~", element_info(element_info::phrase
, &local
.inner_phrase
, phrase_tags::replaceable
))
171 ("footnote", element_info(element_info::phrase
, &local
.inner_phrase
, phrase_tags::footnote
))
174 elements
.add("!", element_info(element_info::maybe_block
, &local
.source_mode
, code_tags::next_source_mode
, 107u))
178 cl::eps_p
[state
.values
.entry(ph::arg1
, ph::arg2
)]
179 >> source_modes
[state
.values
.entry(ph::arg1
)];
181 BOOST_FOREACH(int tag
, source_mode_tags::tags()) {
182 source_modes
.add(source_mode_tags::name(tag
), tag
);
183 elements
.add(source_mode_tags::name(tag
),
184 element_info(element_info::phrase
, &local
.empty
, tag
));
188 ("role", element_info(element_info::phrase
, &local
.role
, phrase_tags::role
, 106u))
193 >> ( qbk_ver(0, 107u)
194 >> (+(cl::alnum_p
| '_')) [state
.values
.entry(ph::arg1
, ph::arg2
)]
196 >> to_value() [attribute_value_1_7
]
199 >> local
.inner_phrase
202 local
.empty
= cl::eps_p
;
206 >> to_value() [ paragraph_phrase
]