|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r70189 - in trunk/tools/quickbook: . src test
From: dnljms_at_[hidden]
Date: 2011-03-19 11:19:11
Author: danieljames
Date: 2011-03-19 11:19:09 EDT (Sat, 19 Mar 2011)
New Revision: 70189
URL: http://svn.boost.org/trac/boost/changeset/70189
Log:
Quickbook: nestable elements. Refs #1193
Properties modified:
trunk/tools/quickbook/ (props changed)
Text files modified:
trunk/tools/quickbook/src/actions.cpp | 25 +++
trunk/tools/quickbook/src/actions.hpp | 19 ++
trunk/tools/quickbook/src/actions_class.cpp | 1
trunk/tools/quickbook/src/actions_class.hpp | 3
trunk/tools/quickbook/src/block_element_grammar.cpp | 38 +++---
trunk/tools/quickbook/src/grammar_impl.hpp | 9 +
trunk/tools/quickbook/src/main_grammar.cpp | 225 ++++++++++++++++++++++++---------------
trunk/tools/quickbook/src/parsers.hpp | 32 +++--
trunk/tools/quickbook/src/rule_store.hpp | 10 +
trunk/tools/quickbook/src/scoped.hpp | 8 +
trunk/tools/quickbook/src/syntax_highlight.hpp | 27 +++-
trunk/tools/quickbook/src/values_parse.hpp | 22 ++-
trunk/tools/quickbook/test/table_1_5.gold | 65 +++++++++++
trunk/tools/quickbook/test/table_1_5.quickbook | 24 ++++
14 files changed, 360 insertions(+), 148 deletions(-)
Modified: trunk/tools/quickbook/src/actions.cpp
==============================================================================
--- trunk/tools/quickbook/src/actions.cpp (original)
+++ trunk/tools/quickbook/src/actions.cpp 2011-03-19 11:19:09 EDT (Sat, 19 Mar 2011)
@@ -329,7 +329,7 @@
out << post;
}
- void cond_phrase_push::start()
+ bool cond_phrase_push::start()
{
saved_suppress = actions.suppress;
@@ -338,6 +338,8 @@
values.consume().get_quickbook().c_str());
actions.suppress = actions.suppress || !condition;
+
+ return true;
}
void cond_phrase_push::cleanup()
@@ -1733,11 +1735,13 @@
return (*this)(actions.out);
}
- void scoped_output_push::start()
+ bool scoped_output_push::start()
{
actions.out.push();
actions.phrase.push();
actions.anchors.swap(saved_anchors);
+
+ return true;
}
void scoped_output_push::cleanup()
@@ -1747,14 +1751,29 @@
actions.anchors.swap(saved_anchors);
}
- void set_no_eols_scoped::start()
+ bool set_no_eols_scoped::start()
{
saved_no_eols = actions.no_eols;
actions.no_eols = false;
+
+ return true;
}
void set_no_eols_scoped::cleanup()
{
actions.no_eols = saved_no_eols;
}
+
+ bool scoped_context_impl::start(int new_context)
+ {
+ saved_context_ = actions_.context;
+ actions_.context = new_context;
+
+ return true;
+ }
+
+ void scoped_context_impl::cleanup()
+ {
+ actions_.context = saved_context_;
+ }
}
Modified: trunk/tools/quickbook/src/actions.hpp
==============================================================================
--- trunk/tools/quickbook/src/actions.hpp (original)
+++ trunk/tools/quickbook/src/actions.hpp 2011-03-19 11:19:09 EDT (Sat, 19 Mar 2011)
@@ -170,7 +170,7 @@
cond_phrase_push(quickbook::actions& x)
: actions(x) {}
- void start();
+ bool start();
void cleanup();
quickbook::actions& actions;
@@ -451,7 +451,7 @@
scoped_output_push(quickbook::actions& actions)
: actions(actions) {}
- void start();
+ bool start();
void cleanup();
quickbook::actions& actions;
@@ -463,12 +463,25 @@
set_no_eols_scoped(quickbook::actions& actions)
: actions(actions) {}
- void start();
+ bool start();
void cleanup();
quickbook::actions& actions;
bool saved_no_eols;
};
+
+ struct scoped_context_impl : scoped_action_base
+ {
+ scoped_context_impl(quickbook::actions& actions)
+ : actions_(actions) {}
+
+ bool start(int);
+ void cleanup();
+
+ private:
+ quickbook::actions& actions_;
+ int saved_context_;
+ };
}
#ifdef BOOST_MSVC
Modified: trunk/tools/quickbook/src/actions_class.cpp
==============================================================================
--- trunk/tools/quickbook/src/actions_class.cpp (original)
+++ trunk/tools/quickbook/src/actions_class.cpp 2011-03-19 11:19:09 EDT (Sat, 19 Mar 2011)
@@ -42,6 +42,7 @@
, scoped_cond_phrase(*this)
, scoped_output(*this)
, scoped_no_eols(*this)
+ , scoped_context(*this)
// state
, filename(fs::absolute(filein_))
Modified: trunk/tools/quickbook/src/actions_class.hpp
==============================================================================
--- trunk/tools/quickbook/src/actions_class.hpp (original)
+++ trunk/tools/quickbook/src/actions_class.hpp 2011-03-19 11:19:09 EDT (Sat, 19 Mar 2011)
@@ -60,6 +60,8 @@
scoped_output;
scoped_parser<set_no_eols_scoped>
scoped_no_eols;
+ scoped_parser<scoped_context_impl>
+ scoped_context;
// state
fs::path filename;
@@ -95,6 +97,7 @@
bool no_eols;
bool suppress;
bool warned_about_breaks;
+ int context;
// push/pop the states and the streams
void copy_macros_for_write();
Modified: trunk/tools/quickbook/src/block_element_grammar.cpp
==============================================================================
--- trunk/tools/quickbook/src/block_element_grammar.cpp (original)
+++ trunk/tools/quickbook/src/block_element_grammar.cpp 2011-03-19 11:19:09 EDT (Sat, 19 Mar 2011)
@@ -88,27 +88,27 @@
;
elements.add
- ("heading", element_info(element_info::block, &local.heading, block_tags::generic_heading))
- ("h1", element_info(element_info::block, &local.heading, block_tags::heading1))
- ("h2", element_info(element_info::block, &local.heading, block_tags::heading2))
- ("h3", element_info(element_info::block, &local.heading, block_tags::heading3))
- ("h4", element_info(element_info::block, &local.heading, block_tags::heading4))
- ("h5", element_info(element_info::block, &local.heading, block_tags::heading5))
- ("h6", element_info(element_info::block, &local.heading, block_tags::heading6))
+ ("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::block, &local.inner_block, block_tags::blurb))
- (":", element_info(element_info::block, &local.inner_block, block_tags::blockquote))
- ("warning", element_info(element_info::block, &local.inner_block, block_tags::warning))
- ("caution", element_info(element_info::block, &local.inner_block, block_tags::caution))
- ("important", element_info(element_info::block, &local.inner_block, block_tags::important))
- ("note", element_info(element_info::block, &local.inner_block, block_tags::note))
- ("tip", element_info(element_info::block, &local.inner_block, block_tags::tip))
+ ("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
- ("pre", element_info(element_info::block, &local.preformatted, block_tags::preformatted))
+ ("pre", element_info(element_info::nested_block, &local.preformatted, block_tags::preformatted))
;
local.preformatted =
@@ -120,7 +120,7 @@
;
elements.add
- ("def", element_info(element_info::block, &local.def_macro, block_tags::macro_definition))
+ ("def", element_info(element_info::conditional_or_block, &local.def_macro, block_tags::macro_definition))
;
local.def_macro =
@@ -139,7 +139,7 @@
;
elements.add
- ("template", element_info(element_info::block, &local.template_, block_tags::template_definition))
+ ("template", element_info(element_info::conditional_or_block, &local.template_, block_tags::template_definition))
;
local.template_ =
@@ -168,7 +168,7 @@
;
elements.add
- ("variablelist", element_info(element_info::block, &local.variablelist, block_tags::variable_list))
+ ("variablelist", element_info(element_info::nested_block, &local.variablelist, block_tags::variable_list))
;
local.variablelist =
@@ -206,7 +206,7 @@
;
elements.add
- ("table", element_info(element_info::block, &local.table, block_tags::table))
+ ("table", element_info(element_info::nested_block, &local.table, block_tags::table))
;
local.table =
Modified: trunk/tools/quickbook/src/grammar_impl.hpp
==============================================================================
--- trunk/tools/quickbook/src/grammar_impl.hpp (original)
+++ trunk/tools/quickbook/src/grammar_impl.hpp 2011-03-19 11:19:09 EDT (Sat, 19 Mar 2011)
@@ -26,12 +26,15 @@
in_block = 1,
in_phrase = 2,
in_conditional = 4,
+ in_nested_block = 8
};
enum type_enum {
- block = 1,
- phrase = 2,
- conditional_or_block = 5
+ nothing = 0,
+ block = in_block,
+ conditional_or_block = block | in_conditional,
+ nested_block = conditional_or_block | in_nested_block,
+ phrase = nested_block | in_phrase
};
element_info(
Modified: trunk/tools/quickbook/src/main_grammar.cpp
==============================================================================
--- trunk/tools/quickbook/src/main_grammar.cpp (original)
+++ trunk/tools/quickbook/src/main_grammar.cpp 2011-03-19 11:19:09 EDT (Sat, 19 Mar 2011)
@@ -14,10 +14,9 @@
#include "template_tags.hpp"
#include "block_tags.hpp"
#include "parsers.hpp"
+#include "scoped.hpp"
#include <boost/spirit/include/classic_core.hpp>
-#include <boost/spirit/include/classic_confix.hpp>
#include <boost/spirit/include/classic_chset.hpp>
-#include <boost/spirit/include/classic_clear_actor.hpp>
#include <boost/spirit/include/classic_if.hpp>
#include <boost/spirit/include/classic_loops.hpp>
#include <boost/spirit/include/phoenix1_primitives.hpp>
@@ -82,24 +81,66 @@
main_grammar_local& l;
};
- struct check_element_type {
- check_element_type(main_grammar_local const& l, element_info::context t)
- : l(l), t(t) {}
+ struct process_element_impl : scoped_action_base {
+ process_element_impl(main_grammar_local& l)
+ : l(l) {}
+
+ bool start()
+ {
+ if (!(l.element_type & l.actions_.context))
+ return false;
+
+ // Save the element type because it might
+ // be overridden by nested markup.
+ element_type_ = l.element_type;
+
+ if (!(element_type_ & element_info::in_phrase))
+ l.actions_.paragraph();
+
+ l.actions_.values.reset()();
+
+ return true;
+ }
+
+ template <typename ResultT, typename ScannerT>
+ bool result(ResultT result, ScannerT const& scan)
+ {
+ if (result || l.element_type & element_info::in_phrase)
+ return result;
- bool operator()() const {
- return l.element_type & t;
+ l.actions_.error(scan.first, scan.first);
+ return true;
}
- main_grammar_local const& l;
- element_info::context t;
+ void success() { l.element_type = element_type_; }
+ void failure() { l.element_type = element_info::nothing; }
+
+ main_grammar_local& l;
+ element_info::type_enum element_type_;
+ };
+
+ struct is_block_type
+ {
+ typedef bool result_type;
+ template <typename Arg1 = void>
+ struct result { typedef bool type; };
+
+ is_block_type(main_grammar_local& l)
+ : l_(l)
+ {}
+
+ bool operator()() const
+ {
+ return !(l_.element_type & element_info::in_phrase);
+ }
+
+ main_grammar_local& l_;
};
cl::rule<scanner>
top_level, blocks, paragraph_separator,
- block_element,
code, code_line, blank_line, hr,
- list, ordered_list, list_item,
- phrase_element, extended_phrase_element, element,
+ list, list_item, element,
simple_phrase_end,
escape,
inline_code, simple_format,
@@ -111,6 +152,7 @@
template_inner_arg_1_4, brackets_1_4,
template_args_1_5, template_arg_1_5, template_arg_1_5_content,
template_inner_arg_1_5, brackets_1_5,
+ break_,
command_line_macro_identifier, command_line_phrase,
dummy_block
;
@@ -118,21 +160,25 @@
element_info::type_enum element_type;
cl::rule<scanner> element_rule;
value::tag_type element_tag;
+
+ quickbook::actions& actions_;
assign_element_type assign_element;
+ scoped_parser<process_element_impl> process_element;
+ is_block_type is_block;
- main_grammar_local()
- : assign_element(*this) {}
-
- check_element_type check_element(element_info::context t) const {
- return check_element_type(*this, t);
- }
+ main_grammar_local(quickbook::actions& actions)
+ : actions_(actions)
+ , assign_element(*this)
+ , process_element(*this)
+ , is_block(*this)
+ {}
};
void quickbook_grammar::impl::init_main()
{
using detail::var;
- main_grammar_local& local = store_.create();
+ main_grammar_local& local = store_.add(new main_grammar_local(actions));
block_skip_initial_spaces =
*(cl::blank_p | comment) >> block_start
@@ -142,15 +188,20 @@
local.top_level >> blank
;
- local.top_level
- = local.blocks
- >> *(
- local.block_element >> !(+eol >> local.blocks)
+ local.top_level =
+ actions.scoped_context(element_info::in_block)
+ [ local.blocks
+ >> *( local.element
+ >> cl::if_p(local.is_block)
+ [ !(+eol >> local.blocks)
+ ]
| local.paragraph_separator >> local.blocks
| common
| cl::space_p [actions.space_char]
| cl::anychar_p [actions.plain_char]
- );
+ )
+ ]
+ ;
local.blocks =
*( local.code
@@ -172,20 +223,20 @@
>> +eol
;
- local.block_element
- = '[' >> space
- >> local.element
- >> cl::eps_p(local.check_element(element_info::in_block))
- [actions.paragraph]
- [actions.values.reset()]
- >> ( actions.values.list(detail::var(local.element_tag))
+ local.element
+ = '['
+ >> ( cl::eps_p(cl::punct_p)
+ >> elements [local.assign_element]
+ | elements [local.assign_element]
+ >> (cl::eps_p - (cl::alnum_p | '_'))
+ )
+ >> local.process_element()
+ [ actions.values.list(detail::var(local.element_tag))
[ local.element_rule
- >> ( (space >> ']')
- | cl::eps_p [actions.error]
- )
+ >> space
+ >> ']'
] [actions.element]
- | cl::eps_p [actions.error]
- )
+ ]
;
local.code =
@@ -219,6 +270,8 @@
;
local.list_item =
+ actions.scoped_context(element_info::in_phrase)
+ [
actions.values.save()
[
*( common
@@ -229,12 +282,15 @@
) [actions.plain_char]
)
]
+ ]
>> +eol
;
common =
local.macro
- | local.phrase_element
+ | local.element
+ | local.template_
+ | local.break_
| local.code_block
| local.inline_code
| local.simple_format
@@ -250,7 +306,8 @@
;
local.template_ =
- cl::eps_p [actions.values.reset()]
+ ( '['
+ >> space [actions.values.reset()]
>> !cl::str_p("`") [actions.values.entry(ph::arg1, ph::arg2, template_tags::escape)]
>>
( (
@@ -265,8 +322,8 @@
>> space
>> !local.template_args
) )
- >> cl::eps_p(']')
- >> cl::eps_p [actions.do_template]
+ >> ']'
+ ) [actions.do_template]
;
local.template_args =
@@ -315,6 +372,15 @@
'[' >> local.template_inner_arg_1_5 >> ']'
;
+ local.break_
+ = ( '['
+ >> space
+ >> "br"
+ >> space
+ >> ']'
+ ) [actions.break_]
+ ;
+
local.inline_code =
'`' >>
(
@@ -365,22 +431,33 @@
simple_markup(local.simple_teletype,
'=', actions.simple_teletype, local.simple_phrase_end);
- phrase = actions.values.save()[
- *( common
- | (cl::anychar_p - phrase_end) [actions.plain_char]
- )
+ phrase =
+ actions.scoped_context(element_info::in_phrase)
+ [
+ actions.values.save()
+ [ *( common
+ | (cl::anychar_p - phrase_end)
+ [actions.plain_char]
+ )
+ ]
]
;
- extended_phrase = actions.values.save()[
- *( local.extended_phrase_element
- | common
- | (cl::anychar_p - phrase_end) [actions.plain_char]
- )
+ extended_phrase =
+ actions.scoped_context(element_info::in_conditional)
+ [
+ actions.values.save()
+ [ *( common
+ | (cl::anychar_p - phrase_end)
+ [actions.plain_char]
+ )
+ ]
]
;
inside_paragraph =
+ actions.scoped_context(element_info::in_nested_block)
+ [
actions.values.save()
[ *( local.paragraph_separator [actions.paragraph]
| common
@@ -388,45 +465,7 @@
[actions.plain_char]
)
] [actions.paragraph]
- ;
-
- local.phrase_element
- = '['
- >> space
- >> ( local.element
- >> cl::eps_p(local.check_element(element_info::in_phrase))
- [actions.values.reset()]
- >> actions.values.list(detail::var(local.element_tag))
- [ local.element_rule
- >> cl::eps_p(space >> ']')
- ] [actions.element]
- | local.template_
- | cl::str_p("br") [actions.break_]
- )
- >> ']'
- ;
-
- local.extended_phrase_element
- = '[' >> space
- >> local.element
- >> cl::eps_p(local.check_element(element_info::in_conditional))
- [actions.paragraph]
- [actions.values.reset()]
- >> ( actions.values.list(detail::var(local.element_tag))
- [ local.element_rule
- >> ( (space >> ']')
- | cl::eps_p [actions.error]
- )
- ] [actions.element]
- | cl::eps_p [actions.error]
- )
- ;
-
- local.element
- = cl::eps_p(cl::punct_p)
- >> elements [local.assign_element]
- | elements [local.assign_element]
- >> (cl::eps_p - (cl::alnum_p | '_'))
+ ]
;
local.escape =
@@ -448,11 +487,16 @@
// Simple phrase grammar
//
- simple_phrase = actions.values.save()[
+ simple_phrase =
+ actions.scoped_context(element_info::in_phrase)
+ [
+ actions.values.save()
+ [
*( common
| (cl::anychar_p - ']') [actions.plain_char]
)
]
+ ]
;
//
@@ -480,11 +524,14 @@
local.command_line_phrase =
+ actions.scoped_context(element_info::in_phrase)
+ [
actions.values.save()
[ *( common
| (cl::anychar_p - ']') [actions.plain_char]
)
]
+ ]
;
// Miscellaneous stuff
Modified: trunk/tools/quickbook/src/parsers.hpp
==============================================================================
--- trunk/tools/quickbook/src/parsers.hpp (original)
+++ trunk/tools/quickbook/src/parsers.hpp 2011-03-19 11:19:09 EDT (Sat, 19 Mar 2011)
@@ -65,24 +65,24 @@
typedef phoenix::tuple_index<0> t0;
typedef phoenix::tuple_index<1> t1;
- void start(phoenix::tuple<> const&)
+ bool start(phoenix::tuple<> const&)
{
- impl_.start();
- in_progress_ = true;
+ in_progress_ = impl_.start();
+ return in_progress_;
}
template <typename Arg1>
- void start(phoenix::tuple<Arg1> const& x)
+ bool start(phoenix::tuple<Arg1> const& x)
{
- impl_.start(x[t0()]);
- in_progress_ = true;
+ in_progress_ = impl_.start(x[t0()]);
+ return in_progress_;
}
template <typename Arg1, typename Arg2>
- void start(phoenix::tuple<Arg1, Arg2> const& x)
+ bool start(phoenix::tuple<Arg1, Arg2> const& x)
{
- impl_.start(x[t0()], x[t1()]);
- in_progress_ = true;
+ in_progress_ = impl_.start(x[t0()], x[t1()]);
+ return in_progress_;
}
void success()
@@ -114,16 +114,22 @@
iterator_t save = scan.first;
scoped scope(impl_);
- scope.start(arguments_);
+ if (!scope.start(arguments_))
+ return scan.no_match();
typename cl::parser_result<ParserT, ScannerT>::type result
= this->subject().parse(scan);
- //result = scope.match(result);
+ bool success = scope.impl_.result(result, scan);
- if (result) {
+ if (success) {
scope.success();
- return scan.create_match(result.length(), cl::nil_t(), save, scan.first);
+ if (result) {
+ return scan.create_match(result.length(), cl::nil_t(), save, scan.first);
+ }
+ else {
+ return scan.create_match(scan.first.base() - save.base(), cl::nil_t(), save, scan.first);
+ }
}
else {
scope.failure();
Modified: trunk/tools/quickbook/src/rule_store.hpp
==============================================================================
--- trunk/tools/quickbook/src/rule_store.hpp (original)
+++ trunk/tools/quickbook/src/rule_store.hpp 2011-03-19 11:19:09 EDT (Sat, 19 Mar 2011)
@@ -72,6 +72,16 @@
instantiate i(*this);
return i;
}
+
+ template <typename T>
+ T& add(T* new_)
+ {
+ std::auto_ptr<T> obj(new_);
+ store_.push_back(detail::scoped_void());
+ store_.back().store(obj.release(), &detail::delete_impl<T>);
+
+ return *new_;
+ }
std::deque<detail::scoped_void> store_;
private:
Modified: trunk/tools/quickbook/src/scoped.hpp
==============================================================================
--- trunk/tools/quickbook/src/scoped.hpp (original)
+++ trunk/tools/quickbook/src/scoped.hpp 2011-03-19 11:19:09 EDT (Sat, 19 Mar 2011)
@@ -15,10 +15,16 @@
struct scoped_action_base
{
- void start() {}
+ bool start() { return true; }
void success() {}
void failure() {}
void cleanup() {}
+
+ template <typename ResultT, typename ScannerT>
+ bool result(ResultT result, ScannerT const&)
+ {
+ return result;
+ }
};
}
Modified: trunk/tools/quickbook/src/syntax_highlight.hpp
==============================================================================
--- trunk/tools/quickbook/src/syntax_highlight.hpp (original)
+++ trunk/tools/quickbook/src/syntax_highlight.hpp 2011-03-19 11:19:09 EDT (Sat, 19 Mar 2011)
@@ -16,6 +16,7 @@
#include <boost/spirit/include/classic_symbols.hpp>
#include <boost/spirit/include/classic_loops.hpp>
#include "grammar.hpp"
+#include "grammar_impl.hpp" // Just for context stuff. Should move?
namespace quickbook
{
@@ -69,10 +70,12 @@
;
qbk_phrase =
- *( g.common
- | (cl::anychar_p - cl::str_p("``"))
+ self.escape_actions.scoped_context(element_info::in_phrase)
+ [ *( g.common
+ | (cl::anychar_p - cl::str_p("``"))
[self.escape_actions.plain_char]
- )
+ )
+ ]
;
escape =
@@ -218,10 +221,13 @@
;
qbk_phrase =
- *( g.common
- | (cl::anychar_p - cl::str_p("``"))
+ self.escape_actions.scoped_context(element_info::in_phrase)
+ [
+ *( g.common
+ | (cl::anychar_p - cl::str_p("``"))
[self.escape_actions.plain_char]
- )
+ )
+ ]
;
escape =
@@ -362,10 +368,13 @@
;
qbk_phrase =
- *( g.common
- | (cl::anychar_p - cl::str_p("``"))
+ self.escape_actions.scoped_context(element_info::in_phrase)
+ [
+ *( g.common
+ | (cl::anychar_p - cl::str_p("``"))
[self.escape_actions.plain_char]
- )
+ )
+ ]
;
escape =
Modified: trunk/tools/quickbook/src/values_parse.hpp
==============================================================================
--- trunk/tools/quickbook/src/values_parse.hpp (original)
+++ trunk/tools/quickbook/src/values_parse.hpp 2011-03-19 11:19:09 EDT (Sat, 19 Mar 2011)
@@ -11,6 +11,7 @@
#include "values.hpp"
#include "parsers.hpp"
+#include "scoped.hpp"
#include <boost/spirit/include/phoenix1_functions.hpp>
#include <iostream>
@@ -18,28 +19,33 @@
namespace quickbook {
namespace ph = phoenix;
- struct value_builder_save
+ struct value_builder_save : scoped_action_base
{
value_builder_save(value_builder& builder) : builder(builder) {}
- void start() { builder.save(); }
- void success() {}
- void failure() {}
+ bool start()
+ {
+ builder.save();
+ return true;
+ }
+
void cleanup() { builder.restore(); }
value_builder& builder;
};
- struct value_builder_list
+ struct value_builder_list : scoped_action_base
{
value_builder_list(value_builder& builder) : builder(builder) {}
- void start(value::tag_type tag = value::default_tag)
- { builder.start_list(tag); }
+ bool start(value::tag_type tag = value::default_tag)
+ {
+ builder.start_list(tag);
+ return true;
+ }
void success() { builder.finish_list(); }
void failure() { builder.clear_list(); }
- void cleanup() {}
value_builder& builder;
};
Modified: trunk/tools/quickbook/test/table_1_5.gold
==============================================================================
--- trunk/tools/quickbook/test/table_1_5.gold (original)
+++ trunk/tools/quickbook/test/table_1_5.gold 2011-03-19 11:19:09 EDT (Sat, 19 Mar 2011)
@@ -233,5 +233,70 @@
</tbody>
</tgroup>
</table>
+ <table frame="all" id="table_1_5.section1.nested_tables">
+ <title>Nested Tables</title>
+ <tgroup cols="1">
+ <thead>
+ <row>
+ <entry>
+ <para>
+ Header 1
+ </para>
+ </entry>
+ <entry>
+ <para>
+ Header 2
+ </para>
+ </entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>
+ <table frame="all" id="table_1_5.section1.inner_table">
+ <title>Inner Table</title>
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>
+ <para>
+ 1.1
+ </para>
+ </entry>
+ <entry>
+ <para>
+ 1.2
+ </para>
+ </entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>
+ <para>
+ 2.1
+ </para>
+ </entry>
+ <entry>
+ <para>
+ 2.2
+ </para>
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <para>
+ Something.
+ </para>
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
</section>
</article>
Modified: trunk/tools/quickbook/test/table_1_5.quickbook
==============================================================================
--- trunk/tools/quickbook/test/table_1_5.quickbook (original)
+++ trunk/tools/quickbook/test/table_1_5.quickbook 2011-03-19 11:19:09 EDT (Sat, 19 Mar 2011)
@@ -69,4 +69,28 @@
]
]
+[table Nested Tables
+ [
+ [
+ Header 1
+ ]
+ [
+ Header 2
+ ]
+ ]
+ [
+ [
+ [table Inner Table
+ [[1.1][1.2]]
+ [[2.1][2.2]]
+ ]
+ ]
+ ]
+ [
+ [
+ Something.
+ ]
+ ]
+]
+
[endsect]
\ No newline at end of file
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk