$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r59563 - branches/quickbook-1.5-spirit2
From: daniel_james_at_[hidden]
Date: 2010-02-07 04:12:05
Author: danieljames
Date: 2010-02-07 04:12:02 EST (Sun, 07 Feb 2010)
New Revision: 59563
URL: http://svn.boost.org/trac/boost/changeset/59563
Log:
Separate actions and state.
Added:
   branches/quickbook-1.5-spirit2/state.cpp   (contents, props changed)
      - copied, changed from r59562, /branches/quickbook-1.5-spirit2/actions_class.cpp
   branches/quickbook-1.5-spirit2/state.hpp   (contents, props changed)
      - copied, changed from r59562, /branches/quickbook-1.5-spirit2/actions_class.hpp
Removed:
   branches/quickbook-1.5-spirit2/actions_class.cpp
   branches/quickbook-1.5-spirit2/actions_class.hpp
Text files modified: 
   branches/quickbook-1.5-spirit2/Jamfile.v2           |     2                                         
   branches/quickbook-1.5-spirit2/actions.cpp          |    15 ++                                      
   branches/quickbook-1.5-spirit2/actions.hpp          |    28 ++++                                    
   branches/quickbook-1.5-spirit2/block.cpp            |     4                                         
   branches/quickbook-1.5-spirit2/block_actions.cpp    |    94 ++++++++--------                        
   branches/quickbook-1.5-spirit2/block_list.cpp       |     5                                         
   branches/quickbook-1.5-spirit2/boostbook.cpp        |   218 ++++++++++++++++++++--------------------
   branches/quickbook-1.5-spirit2/boostbook.hpp        |    40 +++---                                  
   branches/quickbook-1.5-spirit2/code_snippet.cpp     |     2                                         
   branches/quickbook-1.5-spirit2/doc_info.cpp         |     5                                         
   branches/quickbook-1.5-spirit2/doc_info_actions.cpp |     3                                         
   branches/quickbook-1.5-spirit2/fwd.hpp              |     2                                         
   branches/quickbook-1.5-spirit2/phrase.cpp           |     3                                         
   branches/quickbook-1.5-spirit2/phrase_actions.cpp   |     9                                         
   branches/quickbook-1.5-spirit2/phrase_image.cpp     |     5                                         
   branches/quickbook-1.5-spirit2/process.cpp          |     6                                         
   branches/quickbook-1.5-spirit2/quickbook.cpp        |    18 +-                                      
   branches/quickbook-1.5-spirit2/state.cpp            |    17 --                                      
   branches/quickbook-1.5-spirit2/state.hpp            |    20 --                                      
   branches/quickbook-1.5-spirit2/syntax_highlight.cpp |    10 -                                       
   branches/quickbook-1.5-spirit2/template.cpp         |    48 ++++----                                
   21 files changed, 289 insertions(+), 265 deletions(-)
Modified: branches/quickbook-1.5-spirit2/Jamfile.v2
==============================================================================
--- branches/quickbook-1.5-spirit2/Jamfile.v2	(original)
+++ branches/quickbook-1.5-spirit2/Jamfile.v2	2010-02-07 04:12:02 EST (Sun, 07 Feb 2010)
@@ -22,7 +22,7 @@
     process.cpp
     quickbook.cpp
     actions.cpp
-    actions_class.cpp
+    state.cpp
     utils.cpp
     input_path.cpp
     post_process.cpp
Modified: branches/quickbook-1.5-spirit2/actions.cpp
==============================================================================
--- branches/quickbook-1.5-spirit2/actions.cpp	(original)
+++ branches/quickbook-1.5-spirit2/actions.cpp	2010-02-07 04:12:02 EST (Sun, 07 Feb 2010)
@@ -10,7 +10,7 @@
 =============================================================================*/
 
 #include "actions.hpp"
-#include "actions_class.hpp"
+#include "state.hpp"
 #include "doc_info.hpp"
 #include "utils.hpp"
 
@@ -22,6 +22,17 @@
     unsigned qbk_minor_version = 0;
     unsigned qbk_version_n = 0; // qbk_major_version * 100 + qbk_minor_version
 
+    actions::actions(state& state)
+        : state_(state)
+        , templates(state.templates)
+        , macro(state.macro)
+        , process(*this)
+        , phrase_push(state.phrase)
+        , phrase_pop(state.phrase)
+        , error(state.error_count)
+        , syntax_p(state.source_mode, *this)
+    {}
+
     namespace {
         std::string fully_qualified_id(std::string const& library_id,
             std::string const& qualified_section_id,
@@ -50,7 +61,7 @@
         detail::outwarn(pos.file,pos.line) << "Empty id.\n";        
     }
 
-    void phrase_push_action::operator()(unused_type, unused_type, unused_type) const
+    void phrase_push_action::operator()() const
     {
         phrase.push();
     }
Modified: branches/quickbook-1.5-spirit2/actions.hpp
==============================================================================
--- branches/quickbook-1.5-spirit2/actions.hpp	(original)
+++ branches/quickbook-1.5-spirit2/actions.hpp	2010-02-07 04:12:02 EST (Sun, 07 Feb 2010)
@@ -55,6 +55,8 @@
         boost::phoenix::function<quickbook_before_impl> qbk_before;
     }
 
+    // TODO: Define this elsewhere?
+
     struct macro {
         macro() {}
         explicit macro(char const* x) : raw_markup(x) {};
@@ -109,7 +111,11 @@
         phrase_push_action(collector& phrase)
             : phrase(phrase) {}
 
-        void operator()(unused_type, unused_type, unused_type) const;
+        void operator()(unused_type, unused_type, unused_type) const {
+            return (*this)();
+        }
+
+        void operator()() const;
         
         collector& phrase;
     };
@@ -163,6 +169,26 @@
         
         quickbook::actions& actions;
     };
+
+    ///////////////////////////////////////////////////////////////////////////
+    // actions
+    ///////////////////////////////////////////////////////////////////////////
+
+    struct actions
+    {
+        actions(state&);
+    
+        state&                      state_;
+        template_stack&             templates;
+        macro_symbols&              macro;
+
+        process_action              process;
+        phrase_push_action          phrase_push;
+        phrase_pop_action           phrase_pop;
+        error_action                error;
+        element_id_warning_action   element_id_warning;
+        syntax_highlight            syntax_p;
+    };
 }
 
 #ifdef BOOST_MSVC
Deleted: branches/quickbook-1.5-spirit2/actions_class.cpp
==============================================================================
--- branches/quickbook-1.5-spirit2/actions_class.cpp	2010-02-07 04:12:02 EST (Sun, 07 Feb 2010)
+++ (empty file)
@@ -1,101 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2002 2004 2006 Joel de Guzman
-    Copyright (c) 2004 Eric Niebler
-    Copyright (c) 2005 Thomas Guest
-    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/filesystem/operations.hpp>
-#include "actions_class.hpp"
-#include "quickbook.hpp"
-
-#if (defined(BOOST_MSVC) && (BOOST_MSVC <= 1310))
-#pragma warning(disable:4355)
-#endif
-
-namespace quickbook
-{
-    namespace fs = boost::filesystem;
-
-    actions::actions(char const* filein_, fs::path const& outdir_, string_stream& out_)
-    // header info
-        : doc_id()
-        , doc_title()
-
-    // main output stream
-        , phrase(out_)
-
-    // state
-        , filename(fs::complete(fs::path(filein_, fs::native)))
-        , outdir(outdir_)
-        , macro()
-        , section_level(0)
-        , section_id()
-        , qualified_section_id()
-        , source_mode("c++")
-
-    // temporary or global state
-        , template_depth(0)
-        , templates()
-        , error_count(0)
-
-    // actions
-        , process(*this)
-        , phrase_push(phrase)
-        , phrase_pop(phrase)
-        , error(error_count)
-
-        , syntax_p(source_mode, *this)
-    {
-        // turn off __FILENAME__ macro on debug mode = true
-        std::string filename_str = debug_mode ?
-            std::string("NO_FILENAME_MACRO_GENERATED_IN_DEBUG_MODE") :
-            filename.native_file_string();
-
-        // add the predefined macros
-        macro.add
-            ("__DATE__", quickbook::macro(quickbook_get_date))
-            ("__TIME__", quickbook::macro(quickbook_get_time))
-            ("__FILENAME__", quickbook::macro(filename_str))
-        ;
-    }
-
-    void actions::push()
-    {
-        state_stack.push(
-            boost::make_tuple(
-                filename
-              , outdir
-              , macro
-              , section_level
-              , section_id
-              , qualified_section_id
-              , source_mode
-            )
-        );
-
-        phrase.push();
-        templates.push();
-    }
-
-    void actions::pop()
-    {
-        boost::tie(
-            filename
-          , outdir
-          , macro
-          , section_level
-          , section_id
-          , qualified_section_id
-          , source_mode
-        ) = state_stack.top();
-        state_stack.pop();
-
-        phrase.pop();
-        templates.pop();
-    }
-}
Deleted: branches/quickbook-1.5-spirit2/actions_class.hpp
==============================================================================
--- branches/quickbook-1.5-spirit2/actions_class.hpp	2010-02-07 04:12:02 EST (Sun, 07 Feb 2010)
+++ (empty file)
@@ -1,89 +0,0 @@
-/*=============================================================================
-    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)
-=============================================================================*/
-#if !defined(BOOST_SPIRIT_ACTIONS_CLASS_HPP)
-#define BOOST_SPIRIT_ACTIONS_CLASS_HPP
-
-#include <stack>
-#include <boost/tuple/tuple.hpp>
-#include <boost/filesystem/path.hpp>
-#include "fwd.hpp"
-#include "actions.hpp"
-#include "collector.hpp"
-#include "template.hpp"
-
-namespace quickbook
-{
-    namespace qi = boost::spirit::qi;
-    namespace fs = boost::filesystem;
-
-    struct actions
-    {
-        actions(char const* filein_, fs::path const& outdir, string_stream& out_);
-
-    ///////////////////////////////////////////////////////////////////////////
-    // State
-    ///////////////////////////////////////////////////////////////////////////
-
-        typedef std::vector<std::string> string_list;
-        typedef std::pair<char, int> mark_type;
-        static int const max_template_depth = 100;
-
-        std::string             doc_id;
-        std::string             doc_title;
-
-    // main output stream
-        collector               phrase;
-
-    // state
-        fs::path                filename;
-        fs::path                outdir;
-        macro_symbols           macro;
-        int                     section_level;
-        std::string             section_id;
-        std::string             qualified_section_id;
-        std::string             source_mode;
-
-        typedef boost::tuple<
-            fs::path
-          , fs::path
-          , macro_symbols
-          , int
-          , std::string
-          , std::string
-          , std::string>
-        state_tuple;
-
-        std::stack<state_tuple> state_stack;
-
-    // temporary or global state
-        int                     template_depth;
-        template_stack          templates;
-        int                     error_count;
-
-    // push/pop the states and the streams
-        void push();
-        void pop();
-
-    ///////////////////////////////////////////////////////////////////////////
-    // actions
-    ///////////////////////////////////////////////////////////////////////////
-        process_action          process;
-        phrase_push_action      phrase_push;
-        phrase_pop_action       phrase_pop;
-        error_action            error;
-
-        syntax_highlight        syntax_p;
-
-        element_id_warning_action element_id_warning;
-    };
-}
-
-#endif // BOOST_SPIRIT_ACTIONS_CLASS_HPP
-
Modified: branches/quickbook-1.5-spirit2/block.cpp
==============================================================================
--- branches/quickbook-1.5-spirit2/block.cpp	(original)
+++ branches/quickbook-1.5-spirit2/block.cpp	2010-02-07 04:12:02 EST (Sun, 07 Feb 2010)
@@ -20,8 +20,8 @@
 #include <boost/fusion/include/adapt_struct.hpp>
 #include "grammars.hpp"
 #include "block.hpp"
-#include "utils.hpp"
-#include "actions_class.hpp"
+#include "template.hpp"
+#include "actions.hpp"
 #include "parse_utils.hpp"
 #include "code.hpp"
 
Modified: branches/quickbook-1.5-spirit2/block_actions.cpp
==============================================================================
--- branches/quickbook-1.5-spirit2/block_actions.cpp	(original)
+++ branches/quickbook-1.5-spirit2/block_actions.cpp	2010-02-07 04:12:02 EST (Sun, 07 Feb 2010)
@@ -12,7 +12,8 @@
 #include <boost/assert.hpp>
 #include <boost/filesystem/convenience.hpp>
 #include "block_actions.hpp"
-#include "actions_class.hpp"
+#include "actions.hpp"
+#include "state.hpp"
 #include "quickbook.hpp"
 #include "grammars.hpp"
 #include "code_snippet_types.hpp"
@@ -45,30 +46,30 @@
     begin_section2 process(quickbook::actions& actions, begin_section const& x)
     {
         // TODO: This uses the generated title.
-        actions.section_id = x.id ? *x.id :
+        actions.state_.section_id = x.id ? *x.id :
             detail::make_identifier(
                 x.content.raw_markup.begin(),
                 x.content.raw_markup.end());
 
-        if (actions.section_level != 0) {
-            actions.qualified_section_id += '.';
+        if (actions.state_.section_level != 0) {
+            actions.state_.qualified_section_id += '.';
         }
         else {
-            BOOST_ASSERT(actions.qualified_section_id.empty());
+            BOOST_ASSERT(actions.state_.qualified_section_id.empty());
         }
 
-        actions.qualified_section_id += actions.section_id;
-        ++actions.section_level;
+        actions.state_.qualified_section_id += actions.state_.section_id;
+        ++actions.state_.section_level;
 
         begin_section2 r;
 
         if (qbk_version_n < 103) // version 1.2 and below
         {
-            r.id = actions.doc_id + "." + actions.section_id;
+            r.id = actions.state_.doc_id + "." + actions.state_.section_id;
         }
         else // version 1.3 and above
         {
-            r.linkend = r.id = actions.doc_id + "." + actions.qualified_section_id;
+            r.linkend = r.id = actions.state_.doc_id + "." + actions.state_.qualified_section_id;
         }
         
         r.content = x.content.content;
@@ -78,26 +79,26 @@
 
     end_section2 process(quickbook::actions& actions, end_section const& x)
     {
-        --actions.section_level;
-        if (actions.section_level < 0)
+        --actions.state_.section_level;
+        if (actions.state_.section_level < 0)
         {
             detail::outerr(x.position.file,x.position.line)
                 << "Mismatched [endsect] near column " << x.position.column << ".\n";
-            ++actions.error_count;
+            ++actions.state_.error_count;
             
             // $$$ TODO: somehow fail parse else BOOST_ASSERT(std::string::npos != n)
             // $$$ below will assert.
         }
-        if (actions.section_level == 0)
+        if (actions.state_.section_level == 0)
         {
-            actions.qualified_section_id.clear();
+            actions.state_.qualified_section_id.clear();
         }
         else
         {
             std::string::size_type const n =
-                actions.qualified_section_id.find_last_of('.');
+                actions.state_.qualified_section_id.find_last_of('.');
             BOOST_ASSERT(std::string::npos != n);
-            actions.qualified_section_id.erase(n, std::string::npos);
+            actions.state_.qualified_section_id.erase(n, std::string::npos);
         }
         
         return end_section2();
@@ -112,7 +113,8 @@
         
         r.level = x.level;
         if(r.level < 0) {
-            r.level = actions.section_level + 2;// section_level is zero-based. We need to use a
+            r.level = actions.state_.section_level + 2;
+                                                // section_level is zero-based. We need to use a
                                                 // one-based heading which is one greater
                                                 // than the current. Thus: section_level + 2.
             if (r.level > 6)                    // The max is h6, clip it if it goes
@@ -121,7 +123,7 @@
 
         if (!new_style) // version 1.2 and below
         {
-            r.id = actions.section_id + "." +
+            r.id = actions.state_.section_id + "." +
                 detail::make_identifier(
                     x.content.raw_markup.begin(),
                     x.content.raw_markup.end());
@@ -129,7 +131,7 @@
         else // version 1.3 and above
         {
             r.linkend = r.id = fully_qualified_id(
-                actions.doc_id, actions.qualified_section_id,
+                actions.state_.doc_id, actions.state_.qualified_section_id,
                 detail::make_identifier(
                     x.content.raw_markup.begin(),
                     x.content.raw_markup.end()));
@@ -143,7 +145,7 @@
 
     nothing process(quickbook::actions& actions, def_macro const& x)
     {
-        actions.macro.add(
+        actions.state_.macro.add(
             x.macro_identifier.begin()
           , x.macro_identifier.end()
           , quickbook::macro(x.content));
@@ -152,10 +154,10 @@
 
     nothing process(quickbook::actions& actions, define_template const& x)
     {
-        if(!actions.templates.add(x)) {
+        if(!actions.state_.templates.add(x)) {
             detail::outerr(x.position.file, x.position.line)
                 << "Template Redefinition: " << x.id << std::endl;
-            ++actions.error_count;
+            ++actions.state_.error_count;
         }
         
         return nothing();
@@ -169,12 +171,12 @@
         
         if(qbk_version_n >= 105) {
             if(x.id) {
-                r.id = fully_qualified_id(actions.doc_id,
-                    actions.qualified_section_id, *x.id);
+                r.id = fully_qualified_id(actions.state_.doc_id,
+                    actions.state_.qualified_section_id, *x.id);
             }
             else if(r.title) {
-                r.id = fully_qualified_id(actions.doc_id,
-                    actions.qualified_section_id,
+                r.id = fully_qualified_id(actions.state_.doc_id,
+                    actions.state_.qualified_section_id,
                     detail::make_identifier(x.title.begin(), x.title.end()));
             }
         }
@@ -284,9 +286,9 @@
             fs::path path(x);
             if (!path.is_complete())
             {
-                fs::path infile = fs::complete(actions.filename).normalize();
+                fs::path infile = fs::complete(actions.state_.filename).normalize();
                 path = (infile.branch_path() / path).normalize();
-                fs::path outdir = fs::complete(actions.outdir).normalize();
+                fs::path outdir = fs::complete(actions.state_.outdir).normalize();
                 path = path_difference(outdir, path);
             }
             return path;
@@ -302,59 +304,59 @@
 
     nothing process(quickbook::actions& actions, include const& x)
     {
-        fs::path filein = include_search(actions.filename.branch_path(), x.path);
+        fs::path filein = include_search(actions.state_.filename.branch_path(), x.path);
         std::string doc_id;
 
         // swap the filenames
-        std::swap(actions.filename, filein);
+        std::swap(actions.state_.filename, filein);
 
         // save the doc info strings
-        actions.doc_id.swap(doc_id);
+        actions.state_.doc_id.swap(doc_id);
 
         // scope the macros
-        macro_symbols macro = actions.macro;
+        macro_symbols macro = actions.state_.macro;
         // scope the templates
-        //~ template_symbols templates = actions.templates; $$$ fixme $$$
+        //~ template_symbols templates = actions.state_.templates; $$$ fixme $$$
 
         // if an id is specified in this include (as in [include:id foo.qbk])
         // then use it as the doc_id.
-        if (x.id) actions.doc_id = *x.id;
+        if (x.id) actions.state_.doc_id = *x.id;
 
         // update the __FILENAME__ macro
-        *actions.macro.find("__FILENAME__") =
-            quickbook::macro(actions.filename.native_file_string());
+        *actions.state_.macro.find("__FILENAME__") =
+            quickbook::macro(actions.state_.filename.native_file_string());
 
         // parse the file
-        quickbook::parse(actions.filename.native_file_string().c_str(), actions, true);
+        quickbook::parse(actions.state_.filename.native_file_string().c_str(), actions, true);
 
         // restore the values
-        std::swap(actions.filename, filein);
+        std::swap(actions.state_.filename, filein);
 
-        actions.doc_id.swap(doc_id);
+        actions.state_.doc_id.swap(doc_id);
 
         // restore the macros
-        actions.macro = macro;
+        actions.state_.macro = macro;
         // restore the templates
-        //~ actions.templates = templates; $$$ fixme $$$
+        //~ actions.state_.templates = templates; $$$ fixme $$$
         
         return nothing();
     }
 
     nothing process(quickbook::actions& actions, import const& x)
     {
-        fs::path path = include_search(actions.filename.branch_path(), x.path);
+        fs::path path = include_search(actions.state_.filename.branch_path(), x.path);
         std::string ext = fs::extension(path);
         std::vector<define_template> storage;
-        actions.error_count +=
-            load_snippets(path.string(), storage, ext, actions.doc_id);
+        actions.state_.error_count +=
+            load_snippets(path.string(), storage, ext, actions.state_.doc_id);
 
         BOOST_FOREACH(define_template const& definition, storage)
         {
-            if (!actions.templates.add(definition))
+            if (!actions.state_.templates.add(definition))
             {
                 detail::outerr(definition.position.file, definition.position.line)
                     << "Template Redefinition: " << definition.id << std::endl;
-                ++actions.error_count;
+                ++actions.state_.error_count;
             }
         }
 
Modified: branches/quickbook-1.5-spirit2/block_list.cpp
==============================================================================
--- branches/quickbook-1.5-spirit2/block_list.cpp	(original)
+++ branches/quickbook-1.5-spirit2/block_list.cpp	2010-02-07 04:12:02 EST (Sun, 07 Feb 2010)
@@ -10,7 +10,8 @@
 
 #include <stack>
 #include <boost/assert.hpp>
-#include "actions_class.hpp"
+#include "actions.hpp"
+#include "state.hpp"
 #include "gen_types.hpp"
 #include "utils.hpp"
 
@@ -82,7 +83,7 @@
                     << "Illegal change of list style near column " << pos.column << ".\n";
                 detail::outwarn(pos.file,pos.line)
                     << "Ignoring change of list style" << std::endl;
-                ++actions.error_count;
+                ++actions.state_.error_count;
             }
         }
 
Modified: branches/quickbook-1.5-spirit2/boostbook.cpp
==============================================================================
--- branches/quickbook-1.5-spirit2/boostbook.cpp	(original)
+++ branches/quickbook-1.5-spirit2/boostbook.cpp	2010-02-07 04:12:02 EST (Sun, 07 Feb 2010)
@@ -3,18 +3,18 @@
 #include "fwd.hpp"
 #include "boostbook.hpp"
 #include "phrase.hpp"
-#include "actions_class.hpp"
+#include "state.hpp"
 
 namespace quickbook
 {
     struct output_action
     {
-        output_action(quickbook::actions& actions) : actions(actions) {}    
-        quickbook::actions& actions;
+        output_action(quickbook::state& state) : state(state) {}    
+        quickbook::state& state;
 
         template <typename T>
         void operator()(T const& x) const {
-            output(actions, x);
+            output(state, x);
         }
     };
 
@@ -119,45 +119,45 @@
         } initialize_instance;
     }
 
-    void output(quickbook::actions& actions, std::string const& x)
+    void output(quickbook::state& state, std::string const& x)
     {
-        actions.phrase << x;
+        state.phrase << x;
     }
 
-    void output(quickbook::actions& actions, char x)
+    void output(quickbook::state& state, char x)
     {
-        actions.phrase << encode(x);
+        state.phrase << encode(x);
     }
 
-    void output(quickbook::actions& actions, anchor const& x) {
-        actions.phrase << "<anchor id=\"";
-        actions.phrase << encode(x.id);
-        actions.phrase << "\"/>\n";
+    void output(quickbook::state& state, anchor const& x) {
+        state.phrase << "<anchor id=\"";
+        state.phrase << encode(x.id);
+        state.phrase << "\"/>\n";
     }
 
-    void output(quickbook::actions& actions, link const& x) {
+    void output(quickbook::state& state, link const& x) {
         boostbook_markup m = markup_map.at(x.type);
-        actions.phrase << m.pre;
-        actions.phrase << encode(x.destination);
-        actions.phrase << "\">";
-        actions.phrase << x.content;
-        actions.phrase << m.post;
+        state.phrase << m.pre;
+        state.phrase << encode(x.destination);
+        state.phrase << "\">";
+        state.phrase << x.content;
+        state.phrase << m.post;
     }
 
-    void output(quickbook::actions& actions, formatted const& x) {
+    void output(quickbook::state& state, formatted const& x) {
         boostbook_markup m = markup_map.at(x.type);
-        actions.phrase << m.pre << x.content << m.post;
+        state.phrase << m.pre << x.content << m.post;
     }
 
-    void output(quickbook::actions& actions, break_ const& x) {
+    void output(quickbook::state& state, break_ const& x) {
         boostbook_markup m = markup_map.at("break");
-        actions.phrase << m.pre;
+        state.phrase << m.pre;
     }
 
-    void output(quickbook::actions& actions, image2 const& x) {
-        actions.phrase << "<inlinemediaobject>";
+    void output(quickbook::state& state, image2 const& x) {
+        state.phrase << "<inlinemediaobject>";
 
-        actions.phrase << "<imageobject><imagedata";
+        state.phrase << "<imageobject><imagedata";
         
         for(image2::attribute_map::const_iterator
             attr_first = x.attributes.begin(), attr_last  = x.attributes.end();
@@ -165,7 +165,7 @@
         {
             if(attr_first->first == "alt") continue;
         
-            actions.phrase
+            state.phrase
                 << " "
                 << attr_first->first
                 << "=\""
@@ -173,35 +173,35 @@
                 << "\"";
         }
 
-        actions.phrase << "></imagedata></imageobject>";
+        state.phrase << "></imagedata></imageobject>";
 
         image2::attribute_map::const_iterator it = x.attributes.find("alt");
         if(it != x.attributes.end()) {
             // Also add a textobject -- use the basename of the image file.
             // This will mean we get "alt" attributes of the HTML img.
-            actions.phrase << "<textobject><phrase>";
-            actions.phrase << encode(it->second);
-            actions.phrase << "</phrase></textobject>";
+            state.phrase << "<textobject><phrase>";
+            state.phrase << encode(it->second);
+            state.phrase << "</phrase></textobject>";
         }
 
-        actions.phrase << "</inlinemediaobject>";
+        state.phrase << "</inlinemediaobject>";
     }
 
-    void output(quickbook::actions& actions, hr) {
-        actions.phrase << markup_map.at("hr").pre;
+    void output(quickbook::state& state, hr) {
+        state.phrase << markup_map.at("hr").pre;
     }
 
-    void output(quickbook::actions& actions, begin_section2 const& x) {
-        actions.phrase << "\n<section id=\"" << x.id << "\">\n";
+    void output(quickbook::state& state, begin_section2 const& x) {
+        state.phrase << "\n<section id=\"" << x.id << "\">\n";
         if(x.linkend.empty()) {
-            actions.phrase
+            state.phrase
                 << "<title>"
                 << x.content
                 << "</title>\n"
                 ;
         }
         else {
-            actions.phrase
+            state.phrase
                 << "<title>"
                 << "<link linkend=\""
                 << x.linkend
@@ -213,169 +213,169 @@
         }
     }
 
-    void output(quickbook::actions& actions, end_section2 const& x) {
-        actions.phrase << "</section>";
+    void output(quickbook::state& state, end_section2 const& x) {
+        state.phrase << "</section>";
     }
 
-    void output(quickbook::actions& actions, heading2 const& x) {
-        actions.phrase
+    void output(quickbook::state& state, heading2 const& x) {
+        state.phrase
             << "<anchor id=\"" << x.id << "\"/>"
             << "<bridgehead renderas=\"sect" << x.level << "\">";
 
         if(x.linkend.empty()) {
-            actions.phrase << x.content;
+            state.phrase << x.content;
         }
         else {
-            actions.phrase
+            state.phrase
                 << "<link linkend=\"" << x.linkend << "\">"
                 << x.content << "</link>";
         }
 
-        actions.phrase << "</bridgehead>";
+        state.phrase << "</bridgehead>";
     }
 
-    void output(quickbook::actions& actions, variablelist const& x)
+    void output(quickbook::state& state, variablelist const& x)
     {
-        actions.phrase << "<variablelist>\n";
+        state.phrase << "<variablelist>\n";
 
-        actions.phrase << "<title>";
-        actions.phrase << encode(x.title);
-        actions.phrase << "</title>\n";
+        state.phrase << "<title>";
+        state.phrase << encode(x.title);
+        state.phrase << "</title>\n";
 
         boostbook_markup m = markup_map.at("varlistentry");
 
         for(std::vector<varlistentry>::const_iterator
             it = x.entries.begin(); it != x.entries.end(); ++it)
         {
-            actions.phrase << m.pre;
-            std::for_each(it->begin(), it->end(), output_action(actions));
-            actions.phrase << m.post;
+            state.phrase << m.pre;
+            std::for_each(it->begin(), it->end(), output_action(state));
+            state.phrase << m.post;
         }
 
-        actions.phrase << "</variablelist>\n";
+        state.phrase << "</variablelist>\n";
     }
 
-    void output(quickbook::actions& actions, table2 const& x)
+    void output(quickbook::state& state, table2 const& x)
     {
         if (x.title)
         {
-            actions.phrase << "<table frame=\"all\"";
+            state.phrase << "<table frame=\"all\"";
             if(x.id)
-                actions.phrase << " id=\"" << *x.id << "\"";
-            actions.phrase << ">\n";
-            actions.phrase << "<title>";
-            actions.phrase << encode(*x.title);
-            actions.phrase << "</title>";
+                state.phrase << " id=\"" << *x.id << "\"";
+            state.phrase << ">\n";
+            state.phrase << "<title>";
+            state.phrase << encode(*x.title);
+            state.phrase << "</title>";
         }
         else
         {
-            actions.phrase << "<informaltable frame=\"all\"";
+            state.phrase << "<informaltable frame=\"all\"";
             if(x.id)
-                actions.phrase << " id=\"" << *x.id << "\"";
-            actions.phrase << ">\n";
+                state.phrase << " id=\"" << *x.id << "\"";
+            state.phrase << ">\n";
         }
 
         // This is a bit odd for backwards compatability: the old version just
         // used the last count that was calculated.
-        actions.phrase << "<tgroup cols=\"" << x.cols << "\">\n";
+        state.phrase << "<tgroup cols=\"" << x.cols << "\">\n";
 
         boostbook_markup m = markup_map.at("row");
 
         if (x.head)
         {
-            actions.phrase << "<thead>";
-            actions.phrase << m.pre;
-            std::for_each(x.head->begin(), x.head->end(), actions.process);
-            actions.phrase << m.post;
-            actions.phrase << "</thead>\n";
+            state.phrase << "<thead>";
+            state.phrase << m.pre;
+            std::for_each(x.head->begin(), x.head->end(), output_action(state));
+            state.phrase << m.post;
+            state.phrase << "</thead>\n";
         }
 
-        actions.phrase << "<tbody>\n";
+        state.phrase << "<tbody>\n";
 
         for(std::vector<table_row>::const_iterator
             it = x.rows.begin(); it != x.rows.end(); ++it)
         {
-            actions.phrase << m.pre;
-            std::for_each(it->begin(), it->end(), actions.process);
-            actions.phrase << m.post;
+            state.phrase << m.pre;
+            std::for_each(it->begin(), it->end(), output_action(state));
+            state.phrase << m.post;
         }
 
-        actions.phrase << "</tbody>\n" << "</tgroup>\n";
+        state.phrase << "</tbody>\n" << "</tgroup>\n";
 
         if (x.title)
         {
-            actions.phrase << "</table>\n";
+            state.phrase << "</table>\n";
         }
         else
         {
-            actions.phrase << "</informaltable>\n";
+            state.phrase << "</informaltable>\n";
         }
     }
 
-    void output(quickbook::actions& actions, xinclude2 const& x)
+    void output(quickbook::state& state, xinclude2 const& x)
     {
-        actions.phrase << "\n<xi:include href=\"" << x.path << "\" />\n";
+        state.phrase << "\n<xi:include href=\"" << x.path << "\" />\n";
     }
 
-    void output(quickbook::actions& actions, list2 const& x)
+    void output(quickbook::state& state, list2 const& x)
     {
-        actions.phrase << std::string(x.mark == '#' ? "<orderedlist>\n" : "<itemizedlist>\n");
+        state.phrase << std::string(x.mark == '#' ? "<orderedlist>\n" : "<itemizedlist>\n");
 
         for(std::vector<list_item2>::const_iterator
             it = x.items.begin(), end = x.items.end(); it != end; ++it)
         {
-            actions.phrase << "<listitem>\n" << it->content;
-            if(!it->sublist.items.empty()) output(actions, it->sublist);
-            actions.phrase << std::string("\n</listitem>");
+            state.phrase << "<listitem>\n" << it->content;
+            if(!it->sublist.items.empty()) output(state, it->sublist);
+            state.phrase << std::string("\n</listitem>");
         }
 
-        actions.phrase << std::string(x.mark == '#' ? "\n</orderedlist>" : "\n</itemizedlist>");
+        state.phrase << std::string(x.mark == '#' ? "\n</orderedlist>" : "\n</itemizedlist>");
     }
 
-    void output(quickbook::actions& actions, code_token const& x)
+    void output(quickbook::state& state, code_token const& x)
     {
         std::string type = x.type;
         if(type == "space") {
-            actions.phrase << x.text;
+            state.phrase << x.text;
         }
         else {
-            actions.phrase
+            state.phrase
                 << "<phrase role=\"" << x.type << "\">"
                 << encode(x.text)
                 << "</phrase>";
         }
     }
 
-    void output(quickbook::actions& actions, doc_info const& info)
+    void output(quickbook::state& state, doc_info const& info)
     {
         // if we're ignoring the document info, we're done.
         if (info.ignore) return;
 
-        actions.phrase
+        state.phrase
             << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
             << "<!DOCTYPE library PUBLIC \"-//Boost//DTD BoostBook XML V1.0//EN\""
             << " \"http://www.boost.org/tools/boostbook/dtd/boostbook.dtd\">";
 
         // Document tag
 
-        actions.phrase
+        state.phrase
             << '<' << info.doc_type << " id=\"" << info.doc_id << "\"\n";
         
         if(info.doc_type == "library")
         {
-            actions.phrase << " name=\"" << info.doc_title << "\"\n";
+            state.phrase << " name=\"" << info.doc_title << "\"\n";
         }
 
         if(!info.doc_dirname.empty())
         {
-            actions.phrase << " dirname=\"" << info.doc_dirname << "\"\n";
+            state.phrase << " dirname=\"" << info.doc_dirname << "\"\n";
         }
 
-        actions.phrase
+        state.phrase
             << "last-revision=\"" << info.doc_last_revision << "\""
             << " xmlns:xi=\"http://www.w3.org/2001/XInclude\"";
 
-        actions.phrase << ">"; // end document tag.
+        state.phrase << ">"; // end document tag.
 
         // Title tag
 
@@ -389,35 +389,35 @@
         }
 
         // For 'library', the title comes after the info block.
-        if(info.doc_type != "library") actions.phrase << title;
+        if(info.doc_type != "library") state.phrase << title;
 
         // Info tag
 
-        actions.phrase << "<" << info.doc_type << "info>\n";
+        state.phrase << "<" << info.doc_type << "info>\n";
 
         if(!info.doc_authors.empty())
         {
-            actions.phrase << "<authorgroup>\n";
+            state.phrase << "<authorgroup>\n";
             BOOST_FOREACH(doc_info::author const& author, info.doc_authors) {
-                actions.phrase
+                state.phrase
                     << "<author>\n"
                     << "<firstname>" << author.first << "</firstname>\n"
                     << "<surname>" << author.second << "</surname>\n"
                     << "</author>\n";
             }
-            actions.phrase << "</authorgroup>\n";
+            state.phrase << "</authorgroup>\n";
         }
 
         BOOST_FOREACH(doc_info::copyright_entry const& copyright,
             info.doc_copyrights)
         {
-            actions.phrase << "<copyright>\n";
+            state.phrase << "<copyright>\n";
 
             BOOST_FOREACH(std::string const& year, copyright.first) {
-                actions.phrase << "<year>" << year << "</year>\n";
+                state.phrase << "<year>" << year << "</year>\n";
             }
 
-            actions.phrase
+            state.phrase
                 << "<holder>" << copyright.second << "</holder>\n"
                 << "</copyright>\n"
             ;
@@ -425,7 +425,7 @@
 
         if (!info.doc_license.empty())
         {
-            actions.phrase
+            state.phrase
                 << "<legalnotice>\n"
                 << "<para>\n"
                 << info.doc_license
@@ -438,7 +438,7 @@
 
         if (!info.doc_purpose.empty())
         {
-            actions.phrase
+            state.phrase
                 << "<" << info.doc_type << "purpose>\n"
                 << info.doc_purpose
                 << "</" << info.doc_type << "purpose>\n"
@@ -448,7 +448,7 @@
 
         if (!info.doc_category.empty())
         {
-            actions.phrase
+            state.phrase
                 << "<" << info.doc_type << "category name=\"category:"
                 << info.doc_category
                 << "\"></" << info.doc_type << "category>\n"
@@ -456,20 +456,20 @@
             ;
         }
 
-        actions.phrase
+        state.phrase
             << "</" << info.doc_type << "info>\n"
         ;
 
-        if(info.doc_type == "library") actions.phrase << title;
+        if(info.doc_type == "library") state.phrase << title;
     }
 
-    void output(quickbook::actions& actions, doc_info_post const& x)
+    void output(quickbook::state& state, doc_info_post const& x)
     {
         // if we're ignoring the document info, do nothing.
         if (x.info.ignore) return;
 
         // We've finished generating our output. Here's what we'll do
         // *after* everything else.
-        actions.phrase << "</" << x.info.doc_type << ">";
+        state.phrase << "</" << x.info.doc_type << ">";
     }
 }
Modified: branches/quickbook-1.5-spirit2/boostbook.hpp
==============================================================================
--- branches/quickbook-1.5-spirit2/boostbook.hpp	(original)
+++ branches/quickbook-1.5-spirit2/boostbook.hpp	2010-02-07 04:12:02 EST (Sun, 07 Feb 2010)
@@ -25,33 +25,33 @@
 
     // Output function for boostbook, these should eventually become an
     // interface with implementations for boostbook and html.
-    // They probably shouldn't use quickbook::actions, instead they
+    // They probably shouldn't use quickbook::state, instead they
     // should either take a stream/collector to write to, or return their
     // output by value.
 
-    void output(quickbook::actions&, doc_info const&);
-    void output(quickbook::actions&, doc_info_post const&);
+    void output(quickbook::state&, doc_info const&);
+    void output(quickbook::state&, doc_info_post const&);
 
     // Note: char is a plain quickbook character, string is an encoded
     // boostbook string. Oops.
-    void output(quickbook::actions&, char);
-    void output(quickbook::actions&, std::string const&);
-    void output(quickbook::actions&, anchor const&);
-    void output(quickbook::actions&, link const&);
-    void output(quickbook::actions&, formatted const&);
-    void output(quickbook::actions&, break_ const&);
-    void output(quickbook::actions&, image2 const&);
-
-    void output(quickbook::actions&, hr);
-    void output(quickbook::actions&, begin_section2 const&);
-    void output(quickbook::actions&, end_section2 const&);
-    void output(quickbook::actions&, heading2 const&);
-    void output(quickbook::actions&, variablelist const&);
-    void output(quickbook::actions&, table2 const&);
-    void output(quickbook::actions&, xinclude2 const&);
-    void output(quickbook::actions&, list2 const&);
+    void output(quickbook::state&, char);
+    void output(quickbook::state&, std::string const&);
+    void output(quickbook::state&, anchor const&);
+    void output(quickbook::state&, link const&);
+    void output(quickbook::state&, formatted const&);
+    void output(quickbook::state&, break_ const&);
+    void output(quickbook::state&, image2 const&);
+
+    void output(quickbook::state&, hr);
+    void output(quickbook::state&, begin_section2 const&);
+    void output(quickbook::state&, end_section2 const&);
+    void output(quickbook::state&, heading2 const&);
+    void output(quickbook::state&, variablelist const&);
+    void output(quickbook::state&, table2 const&);
+    void output(quickbook::state&, xinclude2 const&);
+    void output(quickbook::state&, list2 const&);
 
-    void output(quickbook::actions&, code_token const&);
+    void output(quickbook::state&, code_token const&);
 
     std::string encode(std::string const&);
     std::string encode(char);
Modified: branches/quickbook-1.5-spirit2/code_snippet.cpp
==============================================================================
--- branches/quickbook-1.5-spirit2/code_snippet.cpp	(original)
+++ branches/quickbook-1.5-spirit2/code_snippet.cpp	2010-02-07 04:12:02 EST (Sun, 07 Feb 2010)
@@ -16,9 +16,9 @@
 #include <iterator>
 #include <boost/lexical_cast.hpp>
 #include "utils.hpp"
-#include "actions_class.hpp"
 #include "grammars.hpp"
 #include "code_snippet_types.hpp"
+#include "template.hpp"
 
 namespace quickbook
 {
Modified: branches/quickbook-1.5-spirit2/doc_info.cpp
==============================================================================
--- branches/quickbook-1.5-spirit2/doc_info.cpp	(original)
+++ branches/quickbook-1.5-spirit2/doc_info.cpp	2010-02-07 04:12:02 EST (Sun, 07 Feb 2010)
@@ -10,7 +10,8 @@
 
 #include "doc_info.hpp"
 #include "grammars.hpp"
-#include "actions_class.hpp"
+#include "actions.hpp"
+#include "state.hpp"
 #include "parse_utils.hpp"
 #include <boost/spirit/include/qi_core.hpp>
 #include <boost/spirit/include/qi_uint.hpp>
@@ -112,7 +113,7 @@
                     | doc_last_revision     [member_assign(&doc_info::doc_last_revision)]
                       // This has to be set in actions so that source code in phrases use the
                       // correct encoding.
-                    | doc_source_mode       [ph::ref(actions.source_mode) = qi::_1]
+                    | doc_source_mode       [ph::ref(actions.state_.source_mode) = qi::_1]
                     )
                     >> space >> ']' >> +qi::eol
                 )
Modified: branches/quickbook-1.5-spirit2/doc_info_actions.cpp
==============================================================================
--- branches/quickbook-1.5-spirit2/doc_info_actions.cpp	(original)
+++ branches/quickbook-1.5-spirit2/doc_info_actions.cpp	2010-02-07 04:12:02 EST (Sun, 07 Feb 2010)
@@ -16,7 +16,8 @@
 #include "collector.hpp"
 #include "quickbook.hpp"
 #include "doc_info_actions.hpp"
-#include "actions_class.hpp"
+#include "actions.hpp"
+#include "state.hpp"
 #include "utils.hpp"
 
 namespace quickbook
Modified: branches/quickbook-1.5-spirit2/fwd.hpp
==============================================================================
--- branches/quickbook-1.5-spirit2/fwd.hpp	(original)
+++ branches/quickbook-1.5-spirit2/fwd.hpp	2010-02-07 04:12:02 EST (Sun, 07 Feb 2010)
@@ -16,9 +16,11 @@
 {
     struct nothing {};
 
+    struct template_stack;
     struct macro;
     struct doc_info;
 
+    struct state;
     struct actions;
     struct code_snippet_actions;
 
Modified: branches/quickbook-1.5-spirit2/phrase.cpp
==============================================================================
--- branches/quickbook-1.5-spirit2/phrase.cpp	(original)
+++ branches/quickbook-1.5-spirit2/phrase.cpp	2010-02-07 04:12:02 EST (Sun, 07 Feb 2010)
@@ -21,7 +21,8 @@
 #include "code.hpp"
 #include "phrase.hpp"
 #include "grammars.hpp"
-#include "actions_class.hpp"
+#include "actions.hpp"
+#include "template.hpp"
 #include "parse_utils.hpp"
 
 BOOST_FUSION_ADAPT_STRUCT(
Modified: branches/quickbook-1.5-spirit2/phrase_actions.cpp
==============================================================================
--- branches/quickbook-1.5-spirit2/phrase_actions.cpp	(original)
+++ branches/quickbook-1.5-spirit2/phrase_actions.cpp	2010-02-07 04:12:02 EST (Sun, 07 Feb 2010)
@@ -10,7 +10,8 @@
 
 #include <boost/assert.hpp>
 #include "phrase.hpp"
-#include "actions_class.hpp"
+#include "actions.hpp"
+#include "state.hpp"
 #include "utils.hpp"
 #include "code.hpp"
 #include "boostbook.hpp"
@@ -19,7 +20,7 @@
 namespace quickbook
 {    
     nothing process(quickbook::actions& actions, source_mode const& s) {
-        actions.source_mode = s.mode;
+        actions.state_.source_mode = s.mode;
         return nothing();
     }
 
@@ -97,12 +98,12 @@
 
         // TODO: I don't need to save this, do I?
         std::string save;
-        actions.phrase.swap(save);
+        actions.state_.phrase.swap(save);
 
         // print the code with syntax coloring
         std::string str = actions.syntax_p(first_, last_);
 
-        actions.phrase.swap(save);
+        actions.state_.phrase.swap(save);
         
         r.type = x.block ? "programlisting" : "code";
         r.content = str;
Modified: branches/quickbook-1.5-spirit2/phrase_image.cpp
==============================================================================
--- branches/quickbook-1.5-spirit2/phrase_image.cpp	(original)
+++ branches/quickbook-1.5-spirit2/phrase_image.cpp	2010-02-07 04:12:02 EST (Sun, 07 Feb 2010)
@@ -12,7 +12,8 @@
 #include <boost/filesystem/fstream.hpp>
 #include "phrase.hpp"
 #include "gen_types.hpp"
-#include "actions_class.hpp"
+#include "actions.hpp"
+#include "state.hpp"
 #include "utils.hpp"
 
 namespace quickbook
@@ -41,7 +42,7 @@
                     << "Duplicate image attribute: "
                     << begin->first
                     << std::endl;
-                ++actions.error_count;
+                ++actions.state_.error_count;
             }
         }
     
Modified: branches/quickbook-1.5-spirit2/process.cpp
==============================================================================
--- branches/quickbook-1.5-spirit2/process.cpp	(original)
+++ branches/quickbook-1.5-spirit2/process.cpp	2010-02-07 04:12:02 EST (Sun, 07 Feb 2010)
@@ -25,7 +25,7 @@
     template <typename T>
     void process_action::operator()(T const& x) const
     {
-        output(actions, process(actions, x));
+        output(actions.state_, process(actions, x));
     }
 
     template <typename T>
@@ -34,11 +34,9 @@
         return x;
     }
 
-    void output(quickbook::actions&, nothing) {
+    void output(quickbook::state&, nothing) {
     }
 
-    void output(quickbook::actions&, std::string const&);
-
     template void process_action::operator()<formatted>(formatted const&) const;
     template void process_action::operator()<source_mode>(source_mode const&) const;
     template void process_action::operator()<macro>(macro const&) const;
Modified: branches/quickbook-1.5-spirit2/quickbook.cpp
==============================================================================
--- branches/quickbook-1.5-spirit2/quickbook.cpp	(original)
+++ branches/quickbook-1.5-spirit2/quickbook.cpp	2010-02-07 04:12:02 EST (Sun, 07 Feb 2010)
@@ -18,7 +18,8 @@
 #include <boost/ref.hpp>
 #include "fwd.hpp"
 #include "quickbook.hpp"
-#include "actions_class.hpp"
+#include "state.hpp"
+#include "actions.hpp"
 #include "grammars.hpp"
 #include "post_process.hpp"
 #include "utils.hpp"
@@ -56,7 +57,7 @@
         std::string storage;
         int err = detail::load(filein_, storage);
         if (err != 0) {
-            ++actor.error_count;
+            ++actor.state_.error_count;
             return err;
         }
 
@@ -94,24 +95,25 @@
             file_position const pos = first.get_position();
             detail::outerr(pos.file,pos.line)
                 << "Syntax Error near column " << pos.column << ".\n";
-            ++actor.error_count;
+            ++actor.state_.error_count;
         }
         
-        if(actor.error_count)
+        if(actor.state_.error_count)
         {
             detail::outerr(filein_)
-                << "Error count: " << actor.error_count << ".\n";
+                << "Error count: " << actor.state_.error_count << ".\n";
         }
 
-        return actor.error_count ? 1 : 0;
+        return actor.state_.error_count ? 1 : 0;
     }
 
     static int
     parse(char const* filein_, fs::path const& outdir, string_stream& out, bool ignore_docinfo = false)
     {
-        actions actor(filein_, outdir, out);
+        quickbook::state state(filein_, outdir, out);
+        actions actor(state);
         bool r = parse(filein_, actor);
-        if (actor.section_level != 0)
+        if (actor.state_.section_level != 0)
             detail::outwarn(filein_)
                 << "Warning missing [endsect] detected at end of file."
                 << std::endl;
Copied: branches/quickbook-1.5-spirit2/state.cpp (from r59562, /branches/quickbook-1.5-spirit2/actions_class.cpp)
==============================================================================
--- /branches/quickbook-1.5-spirit2/actions_class.cpp	(original)
+++ branches/quickbook-1.5-spirit2/state.cpp	2010-02-07 04:12:02 EST (Sun, 07 Feb 2010)
@@ -10,7 +10,8 @@
 =============================================================================*/
 
 #include <boost/filesystem/operations.hpp>
-#include "actions_class.hpp"
+#include "actions.hpp"
+#include "state.hpp"
 #include "quickbook.hpp"
 
 #if (defined(BOOST_MSVC) && (BOOST_MSVC <= 1310))
@@ -21,7 +22,7 @@
 {
     namespace fs = boost::filesystem;
 
-    actions::actions(char const* filein_, fs::path const& outdir_, string_stream& out_)
+    state::state(char const* filein_, fs::path const& outdir_, string_stream& out_)
     // header info
         : doc_id()
         , doc_title()
@@ -42,14 +43,6 @@
         , template_depth(0)
         , templates()
         , error_count(0)
-
-    // actions
-        , process(*this)
-        , phrase_push(phrase)
-        , phrase_pop(phrase)
-        , error(error_count)
-
-        , syntax_p(source_mode, *this)
     {
         // turn off __FILENAME__ macro on debug mode = true
         std::string filename_str = debug_mode ?
@@ -64,7 +57,7 @@
         ;
     }
 
-    void actions::push()
+    void state::push()
     {
         state_stack.push(
             boost::make_tuple(
@@ -82,7 +75,7 @@
         templates.push();
     }
 
-    void actions::pop()
+    void state::pop()
     {
         boost::tie(
             filename
Copied: branches/quickbook-1.5-spirit2/state.hpp (from r59562, /branches/quickbook-1.5-spirit2/actions_class.hpp)
==============================================================================
--- /branches/quickbook-1.5-spirit2/actions_class.hpp	(original)
+++ branches/quickbook-1.5-spirit2/state.hpp	2010-02-07 04:12:02 EST (Sun, 07 Feb 2010)
@@ -14,18 +14,18 @@
 #include <boost/tuple/tuple.hpp>
 #include <boost/filesystem/path.hpp>
 #include "fwd.hpp"
-#include "actions.hpp"
 #include "collector.hpp"
 #include "template.hpp"
+#include "actions.hpp"
 
 namespace quickbook
 {
     namespace qi = boost::spirit::qi;
     namespace fs = boost::filesystem;
 
-    struct actions
+    struct state
     {
-        actions(char const* filein_, fs::path const& outdir, string_stream& out_);
+        state(char const* filein_, fs::path const& outdir, string_stream& out_);
 
     ///////////////////////////////////////////////////////////////////////////
     // State
@@ -70,19 +70,7 @@
     // push/pop the states and the streams
         void push();
         void pop();
-
-    ///////////////////////////////////////////////////////////////////////////
-    // actions
-    ///////////////////////////////////////////////////////////////////////////
-        process_action          process;
-        phrase_push_action      phrase_push;
-        phrase_pop_action       phrase_pop;
-        error_action            error;
-
-        syntax_highlight        syntax_p;
-
-        element_id_warning_action element_id_warning;
-    };
+    };    
 }
 
 #endif // BOOST_SPIRIT_ACTIONS_CLASS_HPP
Modified: branches/quickbook-1.5-spirit2/syntax_highlight.cpp
==============================================================================
--- branches/quickbook-1.5-spirit2/syntax_highlight.cpp	(original)
+++ branches/quickbook-1.5-spirit2/syntax_highlight.cpp	2010-02-07 04:12:02 EST (Sun, 07 Feb 2010)
@@ -13,7 +13,7 @@
 #include <boost/spirit/include/qi_string.hpp>
 #include <boost/spirit/include/qi_directive.hpp>
 #include <boost/fusion/include/adapt_struct.hpp>
-#include "actions_class.hpp"
+#include "actions.hpp"
 #include "grammars.hpp"
 #include "phrase.hpp"
 #include "utils.hpp"
@@ -370,7 +370,7 @@
 
     std::string syntax_highlight::operator()(iterator first, iterator last) const
     {
-        escape_actions.phrase.push();
+        escape_actions.phrase_push();
 
         // print the code with syntax coloring
         if (source_mode == "c++")
@@ -393,10 +393,6 @@
             BOOST_ASSERT(0);
         }
 
-        std::string str;
-        escape_actions.phrase.swap(str);
-        escape_actions.phrase.pop();
-
-        return str;
+        return escape_actions.phrase_pop();
     }
 }
Modified: branches/quickbook-1.5-spirit2/template.cpp
==============================================================================
--- branches/quickbook-1.5-spirit2/template.cpp	(original)
+++ branches/quickbook-1.5-spirit2/template.cpp	2010-02-07 04:12:02 EST (Sun, 07 Feb 2010)
@@ -11,7 +11,7 @@
 #include "template.hpp"
 #include "phrase_actions.hpp"
 #include "grammars.hpp"
-#include "actions_class.hpp"
+#include "state.hpp"
 #include "utils.hpp"
 
 #ifdef BOOST_MSVC
@@ -268,13 +268,13 @@
             {
                 std::vector<std::string> empty_params;
 
-                if (!actions.templates.add(
+                if (!actions.state_.templates.add(
                         define_template(*tpl, empty_params, *arg, pos),
                         &scope))
                 {
                     detail::outerr(pos.file,pos.line)
                         << "Duplicate Symbol Found" << std::endl;
-                    ++actions.error_count;
+                    ++actions.state_.error_count;
                     return std::make_pair(false, tpl);
                 }
                 ++arg; ++tpl;
@@ -315,11 +315,11 @@
                 simple_phrase_grammar phrase_p(actions);
 
                 //  do a phrase level parse
-                iterator first(body.begin(), body.end(), actions.filename.native_file_string().c_str());
+                iterator first(body.begin(), body.end(), actions.state_.filename.native_file_string().c_str());
                 first.set_position(template_pos);
                 iterator last(body.end(), body.end());
                 r = boost::spirit::qi::parse(first, last, phrase_p) && first == last;
-                actions.phrase.swap(result);
+                actions.state_.phrase.swap(result);
             }
             else
             {
@@ -331,11 +331,11 @@
                 body += "\n\n";
                 while (iter != body.end() && ((*iter == '\r') || (*iter == '\n')))
                     ++iter; // skip initial newlines
-                iterator first(iter, body.end(), actions.filename.native_file_string().c_str());
+                iterator first(iter, body.end(), actions.state_.filename.native_file_string().c_str());
                 first.set_position(template_pos);
                 iterator last(body.end(), body.end());
                 r = boost::spirit::qi::parse(first, last, block_p) && first == last;
-                actions.phrase.swap(result);
+                actions.state_.phrase.swap(result);
             }
             return r;
         }
@@ -343,13 +343,13 @@
 
     std::string process(quickbook::actions& actions, call_template const& x)
     {
-        ++actions.template_depth;
-        if (actions.template_depth > actions.max_template_depth)
+        ++actions.state_.template_depth;
+        if (actions.state_.template_depth > actions.state_.max_template_depth)
         {
             detail::outerr(x.position.file, x.position.line)
                 << "Infinite loop detected" << std::endl;
-            --actions.template_depth;
-            ++actions.error_count;
+            --actions.state_.template_depth;
+            ++actions.state_.error_count;
             return "";
         }
 
@@ -358,17 +358,17 @@
         //
         // Note that for quickbook 1.4- this value is just ignored when the
         // arguments are expanded.
-        template_scope const& call_scope = actions.templates.top_scope();
+        template_scope const& call_scope = actions.state_.templates.top_scope();
 
         std::string result;
-        actions.push(); // scope the actions' states
+        actions.state_.push(); // scope the actions' states
         {
             // Quickbook 1.4-: When expanding the tempalte continue to use the
             //                 current scope (the dynamic scope).
             // Quickbook 1.5+: Use the scope the template was defined in
             //                 (the static scope).
             if (qbk_version_n >= 105)
-                actions.templates.set_parent_scope(*x.symbol->parent);
+                actions.state_.templates.set_parent_scope(*x.symbol->parent);
 
             std::vector<std::string> args = x.args;
     
@@ -376,9 +376,9 @@
             // Break the arguments
             if (!break_arguments(args, x.symbol->params, x.position))
             {
-                actions.pop(); // restore the actions' states
-                --actions.template_depth;
-                ++actions.error_count;
+                actions.state_.pop(); // restore the actions' states
+                --actions.state_.template_depth;
+                ++actions.state_.error_count;
                 return "";
             }
 
@@ -392,8 +392,8 @@
 
             if (!get_arg_result)
             {
-                actions.pop(); // restore the actions' states
-                --actions.template_depth;
+                actions.state_.pop(); // restore the actions' states
+                --actions.state_.template_depth;
                 return "";
             }
 
@@ -409,15 +409,15 @@
                     << x.symbol->body
                     << "------------------end--------------------" << std::endl
                     << std::endl;
-                actions.pop(); // restore the actions' states
-                --actions.template_depth;
-                ++actions.error_count;
+                actions.state_.pop(); // restore the actions' states
+                --actions.state_.template_depth;
+                ++actions.state_.error_count;
                 return "";
             }
         }
 
-        actions.pop(); // restore the actions' states
-        --actions.template_depth;
+        actions.state_.pop(); // restore the actions' states
+        --actions.state_.template_depth;
         
         return result;
     }