summaryrefslogtreecommitdiffstats
path: root/src/boost/tools/quickbook/src/phrase_element_grammar.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/tools/quickbook/src/phrase_element_grammar.cpp')
-rw-r--r--src/boost/tools/quickbook/src/phrase_element_grammar.cpp211
1 files changed, 211 insertions, 0 deletions
diff --git a/src/boost/tools/quickbook/src/phrase_element_grammar.cpp b/src/boost/tools/quickbook/src/phrase_element_grammar.cpp
new file mode 100644
index 000000000..ed33e3000
--- /dev/null
+++ b/src/boost/tools/quickbook/src/phrase_element_grammar.cpp
@@ -0,0 +1,211 @@
+/*=============================================================================
+ Copyright (c) 2002 2004 2006 Joel de Guzman
+ Copyright (c) 2004 Eric Niebler
+ http://spirit.sourceforge.net/
+
+ Use, modification and distribution is subject to the Boost Software
+ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+ http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+
+#include <boost/spirit/include/classic_assign_actor.hpp>
+#include <boost/spirit/include/classic_clear_actor.hpp>
+#include <boost/spirit/include/classic_core.hpp>
+#include <boost/spirit/include/classic_if.hpp>
+#include <boost/spirit/include/phoenix1_casts.hpp>
+#include <boost/spirit/include/phoenix1_primitives.hpp>
+#include "actions.hpp"
+#include "for.hpp"
+#include "grammar_impl.hpp"
+#include "phrase_tags.hpp"
+#include "state.hpp"
+#include "utils.hpp"
+
+namespace quickbook
+{
+ namespace cl = boost::spirit::classic;
+
+ struct phrase_element_grammar_local
+ {
+ cl::rule<scanner> image, anchor, link, empty, cond_phrase, inner_phrase,
+ role, source_mode;
+ };
+
+ void quickbook_grammar::impl::init_phrase_elements()
+ {
+ phrase_element_grammar_local& local =
+ cleanup_.add(new phrase_element_grammar_local);
+
+ error_action error(state);
+ raw_char_action raw_char(state);
+ scoped_parser<cond_phrase_push> scoped_cond_phrase(state);
+ scoped_parser<to_value_scoped_action> to_value(state);
+
+ // clang-format off
+
+ elements.add
+ ("?", element_info(element_info::phrase, &local.cond_phrase))
+ ;
+
+ local.cond_phrase =
+ ( !(qbk_ver(107u) >> "!") ) [state.values.entry(ph::arg1, ph::arg2)]
+ >> blank
+ >> macro_identifier [state.values.entry(ph::arg1, ph::arg2)]
+ >> scoped_cond_phrase() [extended_phrase]
+ ;
+
+ elements.add
+ ("$", element_info(element_info::phrase, &local.image, phrase_tags::image))
+ ;
+
+ // Note that the attribute values here are encoded in plain text not
+ // boostbook.
+ local.image =
+ qbk_ver(105u)
+ >> blank
+ >> ( qbk_ver(0, 106u)
+ >> (+(
+ *cl::space_p
+ >> +(cl::anychar_p - (cl::space_p | phrase_end | '['))
+ )) [state.values.entry(ph::arg1, ph::arg2)]
+ | qbk_ver(106u)
+ >> to_value()
+ [ +( raw_escape
+ | (+cl::space_p >> ~cl::eps_p(phrase_end | '['))
+ [raw_char]
+ | (cl::anychar_p - (cl::space_p | phrase_end | '['))
+ [raw_char]
+ )
+ ]
+ )
+ >> hard_space
+ >> *state.values.list()
+ [ '['
+ >> (*(cl::alnum_p | '_'))
+ [state.values.entry(ph::arg1, ph::arg2)]
+ >> space
+ >> ( qbk_ver(0, 106u)
+ >> (*(cl::anychar_p - (phrase_end | '[')))
+ [state.values.entry(ph::arg1, ph::arg2)]
+ | qbk_ver(106u)
+ >> to_value()
+ [ *( raw_escape
+ | (cl::anychar_p - (phrase_end | '['))
+ [raw_char]
+ )
+ ]
+ )
+ >> ']'
+ >> space
+ ]
+ >> cl::eps_p(']')
+ | qbk_ver(0, 105u)
+ >> blank
+ >> (*(cl::anychar_p - phrase_end)) [state.values.entry(ph::arg1, ph::arg2)]
+ >> cl::eps_p(']')
+ ;
+
+ elements.add
+ ("@", element_info(element_info::phrase, &local.link, phrase_tags::url))
+ ("link", element_info(element_info::phrase, &local.link, phrase_tags::link))
+ ("funcref", element_info(element_info::phrase, &local.link, phrase_tags::funcref))
+ ("classref", element_info(element_info::phrase, &local.link, phrase_tags::classref))
+ ("memberref", element_info(element_info::phrase, &local.link, phrase_tags::memberref))
+ ("enumref", element_info(element_info::phrase, &local.link, phrase_tags::enumref))
+ ("macroref", element_info(element_info::phrase, &local.link, phrase_tags::macroref))
+ ("headerref", element_info(element_info::phrase, &local.link, phrase_tags::headerref))
+ ("conceptref", element_info(element_info::phrase, &local.link, phrase_tags::conceptref))
+ ("globalref", element_info(element_info::phrase, &local.link, phrase_tags::globalref))
+ ;
+
+ local.link =
+ space
+ >> ( qbk_ver(0, 106u)
+ >> (*(cl::anychar_p - (']' | space)))
+ [state.values.entry(ph::arg1, ph::arg2)]
+ | qbk_ver(106u, 107u)
+ >> to_value()
+ [ *( raw_escape
+ | (cl::anychar_p - (cl::ch_p('[') | ']' | space))
+ [raw_char]
+ )
+ ]
+ >> !( ~cl::eps_p(comment)
+ >> cl::eps_p('[') [error("Open bracket in link value.")]
+ )
+ | qbk_ver(107u)
+ >> to_value() [attribute_value_1_7]
+ )
+ >> hard_space
+ >> local.inner_phrase
+ ;
+
+ elements.add
+ ("#", element_info(element_info::maybe_block, &local.anchor, phrase_tags::anchor))
+ ;
+
+ local.anchor =
+ blank
+ >> ( qbk_ver(0, 106u)
+ >> (*(cl::anychar_p - phrase_end)) [state.values.entry(ph::arg1, ph::arg2)]
+ | qbk_ver(106u, 107u)
+ >> to_value()
+ [ *( raw_escape
+ | (cl::anychar_p - phrase_end)
+ [raw_char]
+ )
+ ]
+ | qbk_ver(107u)
+ >> to_value() [attribute_value_1_7]
+ )
+ ;
+
+ elements.add
+ ("*", element_info(element_info::phrase, &local.inner_phrase, phrase_tags::bold))
+ ("'", element_info(element_info::phrase, &local.inner_phrase, phrase_tags::italic))
+ ("_", element_info(element_info::phrase, &local.inner_phrase, phrase_tags::underline))
+ ("^", element_info(element_info::phrase, &local.inner_phrase, phrase_tags::teletype))
+ ("-", element_info(element_info::phrase, &local.inner_phrase, phrase_tags::strikethrough))
+ ("\"", element_info(element_info::phrase, &local.inner_phrase, phrase_tags::quote))
+ ("~", element_info(element_info::phrase, &local.inner_phrase, phrase_tags::replaceable))
+ ("footnote", element_info(element_info::phrase, &local.inner_phrase, phrase_tags::footnote))
+ ;
+
+ elements.add("!", element_info(element_info::maybe_block, &local.source_mode, code_tags::next_source_mode, 107u))
+ ;
+
+ local.source_mode =
+ cl::eps_p [state.values.entry(ph::arg1, ph::arg2)]
+ >> source_modes [state.values.entry(ph::arg1)];
+
+ QUICKBOOK_FOR(int tag, source_mode_tags::tags()) {
+ source_modes.add(source_mode_tags::name(tag), tag);
+ elements.add(source_mode_tags::name(tag),
+ element_info(element_info::phrase, &local.empty, tag));
+ }
+
+ elements.add
+ ("role", element_info(element_info::phrase, &local.role, phrase_tags::role, 106u))
+ ;
+
+ local.role
+ = space
+ >> ( qbk_ver(0, 107u)
+ >> (+(cl::alnum_p | '_')) [state.values.entry(ph::arg1, ph::arg2)]
+ | qbk_ver(107u)
+ >> to_value() [attribute_value_1_7]
+ )
+ >> hard_space
+ >> local.inner_phrase
+ ;
+
+ local.empty = cl::eps_p;
+
+ local.inner_phrase =
+ blank
+ >> to_value() [ paragraph_phrase ]
+ ;
+
+ // clang-format on
+ }
+}