summaryrefslogtreecommitdiffstats
path: root/src/boost/tools/quickbook/src/block_element_grammar.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/tools/quickbook/src/block_element_grammar.cpp')
-rw-r--r--src/boost/tools/quickbook/src/block_element_grammar.cpp335
1 files changed, 335 insertions, 0 deletions
diff --git a/src/boost/tools/quickbook/src/block_element_grammar.cpp b/src/boost/tools/quickbook/src/block_element_grammar.cpp
new file mode 100644
index 000000000..b17581d82
--- /dev/null
+++ b/src/boost/tools/quickbook/src/block_element_grammar.cpp
@@ -0,0 +1,335 @@
+/*=============================================================================
+ Copyright (c) 2002 2004 2006Joel 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_if.hpp>
+#include <boost/spirit/include/phoenix1_casts.hpp>
+#include <boost/spirit/include/phoenix1_primitives.hpp>
+#include "actions.hpp"
+#include "block_tags.hpp"
+#include "grammar_impl.hpp"
+#include "state.hpp"
+#include "template_tags.hpp"
+#include "utils.hpp"
+
+namespace quickbook
+{
+ namespace cl = boost::spirit::classic;
+ namespace ph = phoenix;
+
+ struct block_element_grammar_local
+ {
+ cl::rule<scanner> heading, inner_block, inner_phrase, def_macro, table,
+ table_title, table_row, variablelist, varlistentry, varlistterm,
+ list, cell, preformatted, begin_section, end_section, xinclude,
+ include, include_filename, template_, template_id,
+ template_formal_arg, template_body, identifier, import, element_id,
+ same_line;
+ };
+
+ void quickbook_grammar::impl::init_block_elements()
+ {
+ block_element_grammar_local& local =
+ cleanup_.add(new block_element_grammar_local);
+
+ // Actions
+ error_action error(state);
+ element_id_warning_action element_id_warning(state);
+ raw_char_action raw_char(state);
+ explicit_list_action explicit_list(state);
+ scoped_parser<to_value_scoped_action> to_value(state);
+
+ // clang-format off
+
+ local.element_id =
+ !( ':'
+ >> ( qbk_ver(107u)
+ >> to_value(general_tags::element_id) [attribute_value_1_7]
+ | qbk_ver(0, 107u)
+ >> !(qbk_ver(105u) >> space)
+ >> (+(cl::alnum_p | '_')) [state.values.entry(ph::arg1, ph::arg2, general_tags::element_id)]
+ | cl::eps_p [element_id_warning]
+ )
+ )
+ ;
+
+ elements.add
+ ("section", element_info(element_info::section_block, &local.begin_section, block_tags::begin_section))
+ ("endsect", element_info(element_info::section_block, &local.end_section, block_tags::end_section))
+ ;
+
+ local.begin_section =
+ space
+ >> local.element_id
+ >> space
+ >> local.inner_phrase
+ ;
+
+ local.end_section =
+ space
+ >> local.element_id
+ ;
+
+ local.heading
+ = space
+ >> !(qbk_ver(106u) >> local.element_id)
+ >> space
+ >> local.inner_phrase
+ ;
+
+ elements.add
+ ("heading", element_info(element_info::conditional_or_block, &local.heading, block_tags::generic_heading))
+ ("h1", element_info(element_info::conditional_or_block, &local.heading, block_tags::heading1))
+ ("h2", element_info(element_info::conditional_or_block, &local.heading, block_tags::heading2))
+ ("h3", element_info(element_info::conditional_or_block, &local.heading, block_tags::heading3))
+ ("h4", element_info(element_info::conditional_or_block, &local.heading, block_tags::heading4))
+ ("h5", element_info(element_info::conditional_or_block, &local.heading, block_tags::heading5))
+ ("h6", element_info(element_info::conditional_or_block, &local.heading, block_tags::heading6))
+ ;
+
+ elements.add
+ ("blurb", element_info(element_info::nested_block, &local.inner_block, block_tags::blurb))
+ (":", element_info(element_info::nested_block, &local.inner_block, block_tags::blockquote))
+ ("warning", element_info(element_info::nested_block, &local.inner_block, block_tags::warning))
+ ("caution", element_info(element_info::nested_block, &local.inner_block, block_tags::caution))
+ ("important", element_info(element_info::nested_block, &local.inner_block, block_tags::important))
+ ("note", element_info(element_info::nested_block, &local.inner_block, block_tags::note))
+ ("tip", element_info(element_info::nested_block, &local.inner_block, block_tags::tip))
+ ;
+
+ elements.add
+ ("block", element_info(element_info::nested_block, &local.inner_phrase, block_tags::block, 106u))
+ ;
+
+ elements.add
+ ("pre", element_info(element_info::nested_block, &local.preformatted, block_tags::preformatted))
+ ;
+
+ local.preformatted =
+ ( qbk_ver(0, 106) >> space
+ | qbk_ver(106) >> blank >> !eol
+ )
+ >> to_value()
+ [
+ inside_preformatted
+ ]
+ ;
+
+ elements.add
+ ("def", element_info(element_info::conditional_or_block, &local.def_macro, block_tags::macro_definition))
+ ;
+
+ local.def_macro =
+ space
+ >> macro_identifier [state.values.entry(ph::arg1, ph::arg2)]
+ >> blank
+ >> local.inner_phrase
+ ;
+
+ local.identifier =
+ (cl::alpha_p | '_') >> *(cl::alnum_p | '_')
+ ;
+
+ local.template_id =
+ local.identifier | (cl::punct_p - (cl::ch_p('[') | ']'))
+ ;
+
+ elements.add
+ ("template", element_info(element_info::conditional_or_block, &local.template_, block_tags::template_definition))
+ ;
+
+ local.template_ =
+ space
+ >> local.template_id [state.values.entry(ph::arg1, ph::arg2)]
+ >> state.values.list()[
+ !(
+ space >> '['
+ >> *(
+ space
+ >> local.template_id [state.values.entry(ph::arg1, ph::arg2)]
+ )
+ >> space >> ']'
+ )
+ ]
+ >> ( cl::eps_p(*cl::blank_p >> cl::eol_p)
+ >> local.template_body [state.values.entry(ph::arg1, ph::arg2, template_tags::block)]
+ | local.template_body [state.values.entry(ph::arg1, ph::arg2, template_tags::phrase)]
+ )
+ ;
+
+ local.template_body =
+ qbk_ver(106u)
+ >> *(~cl::eps_p(']') >> skip_entity)
+ | qbk_ver(0,106u)
+ >> *(('[' >> local.template_body >> ']') | (cl::anychar_p - ']'))
+ >> cl::eps_p(space >> ']')
+ >> space
+ ;
+
+ elements.add
+ ("variablelist", element_info(element_info::nested_block, &local.variablelist, block_tags::variable_list))
+ ;
+
+ local.variablelist =
+ (cl::eps_p(*cl::blank_p >> cl::eol_p) | space)
+ >> local.table_title
+ >> *local.varlistentry
+ ;
+
+ local.varlistentry =
+ space
+ >> cl::ch_p('[')
+ >> state.values.list()
+ [
+ (
+ local.varlistterm
+ >> ( +local.cell
+ | cl::eps_p [error]
+ )
+ >> cl::ch_p(']')
+ >> space
+ )
+ | cl::eps_p [error]
+ ]
+ ;
+
+ local.varlistterm =
+ space
+ >> cl::ch_p('[')
+ >> local.inner_phrase
+ >> ( cl::ch_p(']')
+ >> space
+ | cl::eps_p [error]
+ )
+ ;
+
+ elements.add
+ ("table", element_info(element_info::nested_block, &local.table, block_tags::table))
+ ;
+
+ local.same_line = *cl::blank_p >> !(comment >> space);
+
+ local.table =
+ local.same_line
+ >> !(qbk_ver(105u) >> local.element_id)
+ >> local.same_line
+ >> local.table_title
+ >> *local.table_row
+ ;
+
+ local.table_row =
+ space
+ >> cl::ch_p('[')
+ >>
+ (
+ (
+ state.values.list(table_tags::row)
+ [ *local.cell
+ ]
+ >> cl::ch_p(']')
+ >> space
+ )
+ | cl::eps_p [error]
+ )
+ ;
+
+ local.table_title =
+ qbk_ver(0, 106)
+ >> (*(cl::anychar_p - eol)) [state.values.entry(ph::arg1, ph::arg2, table_tags::title)]
+ >> (+eol)
+ | qbk_ver(106)
+ >> to_value(table_tags::title)
+ [
+ table_title_phrase
+ ]
+ >> space
+ ;
+
+ elements.add
+ ("ordered_list", element_info(element_info::nested_block, &local.list, block_tags::ordered_list, 106))
+ ("itemized_list", element_info(element_info::nested_block, &local.list, block_tags::itemized_list, 106))
+ ;
+
+ local.list =
+ *( cl::eps_p [explicit_list]
+ >> local.cell
+ )
+ ;
+
+ local.cell =
+ space
+ >> cl::ch_p('[')
+ >> ( local.inner_block
+ >> cl::ch_p(']')
+ >> space
+ | cl::eps_p [error]
+ )
+ ;
+
+ elements.add
+ ("xinclude", element_info(element_info::conditional_or_block, &local.xinclude, block_tags::xinclude))
+ ("import", element_info(element_info::conditional_or_block, &local.import, block_tags::import))
+ ("include", element_info(element_info::conditional_or_block, &local.include, block_tags::include))
+ ;
+
+ local.xinclude =
+ space
+ >> local.include_filename
+ ;
+
+ local.import =
+ space
+ >> local.include_filename
+ ;
+
+ local.include =
+ space
+ >>
+ !(
+ ':'
+ >> (*((cl::alnum_p | '_') - cl::space_p))
+ [state.values.entry(ph::arg1, ph::arg2, general_tags::include_id)]
+ >> space
+ )
+ >> local.include_filename
+ ;
+
+ local.include_filename =
+ 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 ]
+ ;
+
+ local.inner_block =
+ to_value()
+ [
+ inside_paragraph
+ ]
+ ;
+
+ local.inner_phrase =
+ to_value()
+ [
+ paragraph_phrase
+ ]
+ ;
+
+ // clang-format on
+ }
+}