$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r67784 - in branches/release/tools/quickbook: . doc src test
From: dnljms_at_[hidden]
Date: 2011-01-08 10:22:23
Author: danieljames
Date: 2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
New Revision: 67784
URL: http://svn.boost.org/trac/boost/changeset/67784
Log:
Merge quickbook from trunk.
Left docs out of this merge, I want to do a little work on them.
- Add 'lang' element to docinfo.
- Improved anchor implementation. Especially for using an anchor before a
  section or heading.
- Reorganize the grammar, there's now a single main grammar. Elements are added
  separately using the Nabialek trick.
- Fixed some more issues where lines containing comments were treated as blank
  lines.
- Introduce a spirit rule for scoped actions when parsing. Could do with some
  improvement, but works okay.
- Allow import, include and xinclude in conditional phrases. Will allow more
  block elements in a future version.
- Use filesystem 3. Remove cygwin support.
Added:
   branches/release/tools/quickbook/src/block_element_grammar.cpp
      - copied unchanged from r67782, /trunk/tools/quickbook/src/block_element_grammar.cpp
   branches/release/tools/quickbook/src/grammar.cpp
      - copied, changed from r67335, /trunk/tools/quickbook/src/grammar.cpp
   branches/release/tools/quickbook/src/grammar_impl.hpp
      - copied, changed from r67335, /trunk/tools/quickbook/src/grammar_impl.hpp
   branches/release/tools/quickbook/src/main_grammar.cpp
      - copied, changed from r67335, /trunk/tools/quickbook/src/main_grammar.cpp
   branches/release/tools/quickbook/src/phrase_element_grammar.cpp
      - copied unchanged from r67782, /trunk/tools/quickbook/src/phrase_element_grammar.cpp
   branches/release/tools/quickbook/src/rule_store.hpp
      - copied unchanged from r67335, /trunk/tools/quickbook/src/rule_store.hpp
   branches/release/tools/quickbook/src/scoped_parser.hpp
      - copied unchanged from r67637, /trunk/tools/quickbook/src/scoped_parser.hpp
   branches/release/tools/quickbook/test/anchor.gold
      - copied, changed from r67335, /trunk/tools/quickbook/test/anchor.gold
   branches/release/tools/quickbook/test/anchor.quickbook
      - copied, changed from r67335, /trunk/tools/quickbook/test/anchor.quickbook
Removed:
   branches/release/tools/quickbook/src/block_grammar.cpp
   branches/release/tools/quickbook/src/phrase_grammar.cpp
   branches/release/tools/quickbook/src/phrase_grammar.hpp
   branches/release/tools/quickbook/src/scoped_block.hpp
Properties modified: 
   branches/release/tools/quickbook/   (props changed)
   branches/release/tools/quickbook/src/   (props changed)
   branches/release/tools/quickbook/test/   (props changed)
Text files modified: 
   branches/release/tools/quickbook/doc/Jamfile.v2             |     2                                         
   branches/release/tools/quickbook/doc/quickbook.qbk          |   145 ++++++++++++-------                     
   branches/release/tools/quickbook/src/Jamfile.v2             |     6                                         
   branches/release/tools/quickbook/src/actions.cpp            |   282 ++++++++++++++++++++++++++++++--------- 
   branches/release/tools/quickbook/src/actions.hpp            |   273 ++++++++++++++++++++++++++++---------   
   branches/release/tools/quickbook/src/actions_class.cpp      |   227 +++++++++++++++++--------------         
   branches/release/tools/quickbook/src/actions_class.hpp      |    28 +++                                     
   branches/release/tools/quickbook/src/doc_info_actions.cpp   |    15 +                                       
   branches/release/tools/quickbook/src/doc_info_grammar.cpp   |   155 ++++++++-------------                   
   branches/release/tools/quickbook/src/fwd.hpp                |     3                                         
   branches/release/tools/quickbook/src/grammar.cpp            |     5                                         
   branches/release/tools/quickbook/src/grammar.hpp            |    89 ++++--------                            
   branches/release/tools/quickbook/src/grammar_impl.hpp       |     8                                         
   branches/release/tools/quickbook/src/input_path.cpp         |    33 ----                                    
   branches/release/tools/quickbook/src/main_grammar.cpp       |    43 ++++-                                   
   branches/release/tools/quickbook/src/quickbook.cpp          |    17 -                                       
   branches/release/tools/quickbook/src/syntax_highlight.cpp   |     8                                         
   branches/release/tools/quickbook/src/syntax_highlight.hpp   |    28 +--                                     
   branches/release/tools/quickbook/src/utils.hpp              |    25 +++                                     
   branches/release/tools/quickbook/test/Jamfile.v2            |     3                                         
   branches/release/tools/quickbook/test/anchor.gold           |     9                                         
   branches/release/tools/quickbook/test/anchor.quickbook      |    10                                         
   branches/release/tools/quickbook/test/blocks.gold           |    23 +++                                     
   branches/release/tools/quickbook/test/blocks.quickbook      |     6                                         
   branches/release/tools/quickbook/test/cond_phrase.gold      |     3                                         
   branches/release/tools/quickbook/test/cond_phrase.quickbook |     8                                         
   branches/release/tools/quickbook/test/doc-info-1.gold       |     4                                         
   branches/release/tools/quickbook/test/doc-info-1.quickbook  |     1                                         
   branches/release/tools/quickbook/test/include_1_5.gold      |    12 +                                       
   branches/release/tools/quickbook/test/include_1_5.quickbook |     6                                         
   branches/release/tools/quickbook/test/include_1_6.gold      |    12 +                                       
   branches/release/tools/quickbook/test/include_1_6.quickbook |     7                                         
   branches/release/tools/quickbook/test/link.gold             |    19 +-                                      
   branches/release/tools/quickbook/test/quickbook-testing.jam |     4                                         
   branches/release/tools/quickbook/test/table_1_5.gold        |    60 ++++++++                                
   branches/release/tools/quickbook/test/table_1_5.quickbook   |    29 ++++                                    
   36 files changed, 1052 insertions(+), 556 deletions(-)
Modified: branches/release/tools/quickbook/doc/Jamfile.v2
==============================================================================
--- branches/release/tools/quickbook/doc/Jamfile.v2	(original)
+++ branches/release/tools/quickbook/doc/Jamfile.v2	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
@@ -23,7 +23,7 @@
     :
         <xsl:param>boost.root=../../../..
         <xsl:param>generate.section.toc.level=3
-        <xsl:param>chunk.section.depth=2
+        <xsl:param>chunk.section.depth=1
         <xsl:param>chunk.first.sections=1
 
         #<xsl:param>callout.graphics.path=../../images/callouts//
Modified: branches/release/tools/quickbook/doc/quickbook.qbk
==============================================================================
--- branches/release/tools/quickbook/doc/quickbook.qbk	(original)
+++ branches/release/tools/quickbook/doc/quickbook.qbk	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
@@ -106,7 +106,7 @@
 * automatic syntax coloring of code samples
 * CSS support
 
-[endsect]
+[endsect] [/Introduction]
 
 [section:change_log Change Log]
 
@@ -238,7 +238,7 @@
   * XML escape documentation fields, with escapes to allow encoding unicode
     in ASCII.
 
-[endsect]
+[endsect] [/Change log]
 
 [section:syntax Syntax Summary]
 
@@ -278,7 +278,7 @@
 
 [/ for testing [*only ] ]
 
-[endsect]
+[endsect] [/Comments]
 
 [section:phrase Phrase Level Elements]
 
@@ -302,7 +302,7 @@
 
 [*['bold-italic]]
 
-[endsect]
+[endsect] [/Font Styles]
 
 [section Replaceable]
 
@@ -316,7 +316,7 @@
 
 [~replacement]
 
-[endsect]
+[endsect] [/Replaceable]
 
 [section Quotations]
 
@@ -344,7 +344,8 @@
 ["Here's the rule for bargains: ["Do other men, for they would do you.]
 That's the true business precept.]
 
-[endsect]
+[endsect] [/Quotations]
+
 [section Simple formatting]
 
 Simple markup for formatting text, common in many applications, is now supported:
@@ -426,7 +427,8 @@
 One for the master, one for the dame,
 And one for the little boy who lives down the lane.
 
-[endsect]
+[endsect] [/Simple Formatting]
+
 [section Inline code]
 
 Inlining code in paragraphs is quite common when writing C++ documentation. We
@@ -445,7 +447,8 @@
 single quote: `"'"`. Note too that [^'''`some code`'''] is preferred over
 [^'''[^some code]''']. ]
 
-[endsect]
+[endsect] [/Inline Code]
+
 [section Code blocks]
 
 Preformatted code simply starts with a space or a tab (See __code__).
@@ -482,7 +485,8 @@
     }
 ``
 
-[endsect]
+[endsect] [/Code blocks]
+
 [section Source Mode]
 
 If a document contains more than one type of source code then the source
@@ -514,7 +518,8 @@
 
 [note The source mode strings are lowercase.]
 
-[endsect]
+[endsect] [/Source Mode]
+
 [section line-break]
 
 [pre'''
@@ -539,7 +544,8 @@
 quickbook documentation. Be careful to avoid clashes with anchors in
 other sections.
 
-[endsect]
+[endsect] [/Line break]
+
 [section Links]
 
 [pre'''
@@ -578,7 +584,8 @@
 Note that this is only available when using BoostBook, and only for links
 - it can't be used for images.
 
-[endsect]
+[endsect] [/Links]
+
 [section Anchor links]
 
 You can link within a document using:
@@ -589,7 +596,8 @@
 
 See sections __section__ and __heading__ for more info.
 
-[endsect]
+[endsect] [/Anchor links]
+
 [section refentry links]
 
 In addition, you can link internally to an XML refentry like:
@@ -609,7 +617,8 @@
 
 This gets converted into [^<link linkend="xml.refentry">xml.refentry</link>].
 
-[endsect]
+[endsect] [/refentry links]
+
 [section:code_links Code Links]
 
 If you want to link to a function, class, member, enum, concept, global, or header in
@@ -636,7 +645,8 @@
 
 would have "boost::bar::baz" as the link text.
 
-[endsect]
+[endsect] [/Code Links]
+
 [section Escape]
 
 The escape mark-up is used when we don't want to do any processing.
@@ -662,7 +672,8 @@
 [important Be careful when using the escape. The text must conform to
 __boostbook__/__docbook__ syntax.]
 
-[endsect]
+[endsect] [/Escape]
+
 [section Single char escape]
 
 The backslash may be used to escape a single punctuation character. The
@@ -679,7 +690,8 @@
 The escaped space: `\ ` also has a special meaning. The escaped space is removed
 from the output.
 
-[endsect]
+[endsect] [/Single char escape]
+
 [section Unicode escape]
 
 You can enter any 16-bit unicode character by using `\u` followed by its 4 digit
@@ -696,7 +708,8 @@
 \u03B1 + \u03B2
 ]
 
-[endsect]
+[endsect] [/Unicode escape]
+
 [section Images]
 
 [pre'''
@@ -711,7 +724,8 @@
 [$image.jpg [width 200in] [height 200in]]
 ''']
 
-[endsect]
+[endsect] [/Images]
+
 [section Footnotes]
 
 As of version 1.3, QuickBook supports footnotes. Just put the text of the
@@ -724,6 +738,8 @@
 
 will generate this[footnote A sample footnote].
 
+[endsect] [/Footnotes]
+
 [section Macro Expansion]
 
 [pre'''
@@ -732,7 +748,7 @@
 
 See __macros__ for details.
 
-[endsect]
+[endsect] [/Macro Expansion]
 
 [section Template Expansion]
 
@@ -742,9 +758,7 @@
 
 See __templates__ for details.
 
-[endsect]
-
-[endsect]
+[endsect] [/Template Expansion]
 
 [section:cond Conditional Generation]
 
@@ -774,9 +788,10 @@
 
 Yes![footnote Conditional Generation makes quickbook turing complete.]
 
-[endsect]
+[endsect] [/Condition Generation]
+
+[endsect] [/Phrase Level Elements]
 
-[endsect]
 [section:block Block Level Elements]
 
 [section Document]
@@ -827,7 +842,8 @@
 =source-type= is a lowercase string setting the initial __source_mode__. If
 the =source-mode= field is omitted, a default value of =c++= will be used.
 
-[endsect]
+[endsect] [/Document]
+
 [section Section]
 
 Starting a new section is accomplished with:
@@ -850,7 +866,8 @@
 
 Sections can nest, and that results in a hierarchy in the table of contents.
 
-[endsect]
+[endsect] [/Section]
+
 [section xinclude]
 
 You can include another XML file with:
@@ -862,7 +879,8 @@
 This is useful when file.xml has been generated by Doxygen and contains your
 reference section.
 
-[endsect]
+[endsect] [/xinclude]
+
 [section Paragraphs]
 
 Paragraphs start left-flushed and are terminated by two or more newlines. No
@@ -872,7 +890,7 @@
  [/ <-- There's a space here. Don't remove. this is intentianal, for testing]
 This is a new paragraph...
 
-[endsect]
+[endsect] [/Paragraphs]
 
 [section Lists]
 [section Ordered lists]
@@ -889,7 +907,7 @@
 # Two
 # Three
 
-[endsect]
+[endsect] [/Ordered lists]
 [section List Hierarchies]
 
 List hierarchies are supported. Example:
@@ -922,7 +940,7 @@
         # Four.a.ii
 # Five
 
-[endsect]
+[endsect] [/List Hierarchies]
 [section Long List Lines]
 
 Long lines will be wrapped appropriately. Example:
@@ -945,7 +963,7 @@
   A very long item. A very long item. A very long item.
 # A short item.
 
-[endsect]
+[endsect] [/Long list lines]
 [section Unordered lists]
 
 [pre'''
@@ -960,7 +978,7 @@
 * Second
 * Third
 
-[endsect]
+[endsect] [/Unordered lists]
 [section Mixed lists]
 
 Mixed lists (ordered and unordered) are supported. Example:
@@ -1017,8 +1035,8 @@
             * 2.b.2.a
             * 2.b.2.b
 
-[endsect]
-[endsect]
+[endsect] [/Mixed lists]
+[endsect] [/Lists]
 
 [section Code]
 
@@ -1063,7 +1081,8 @@
 
     using __boost__::__array__;
 
-[endsect]
+[endsect] [/Code]
+
 [section:escape_back Escaping Back To QuickBook]
 
 Inside code, code blocks and inline code, QuickBook does not allow any
@@ -1087,7 +1106,8 @@
 When escaping from code to QuickBook, only phrase level markups are
 allowed. Block level markups like lists, tables etc. are not allowed.
 
-[endsect]
+[endsect] [/Escaping back to quickbook]
+
 [section Preformatted]
 
 Sometimes, you don't want some preformatted text to be parsed as C++. In such
@@ -1122,7 +1142,8 @@
 Notice that unlike Code, phrase markup such as font style is still permitted
 inside =pre= blocks.
 
-[endsect]
+[endsect] [/Preformatted]
+
 [section Blockquote]
 
 [pre
@@ -1131,7 +1152,8 @@
 
 [:Indents the paragraph. This applies to one paragraph only.]
 
-[endsect]
+[endsect] [/Blockquote]
+
 [section Admonitions]
 
 [pre'''
@@ -1154,7 +1176,8 @@
 for example [^\[information This is some information\]] is unlikely
 to produce the desired effect.
 
-[endsect]
+[endsect] [/Admonitions]
+
 [section Headings]
 
 [pre'''
@@ -1187,7 +1210,8 @@
 
 to link to them. See __anchor_links__ and __section__ for more info.
 
-[endsect]
+[endsect] [/Headings]
+
 [section Generic Heading]
 
 In cases when you don't want to care about the heading level (1 to 6), you
@@ -1232,7 +1256,8 @@
 with /section/ and /heading/, you have all you need. /h1/../h6/ becomes
 redundant. /h1/../h6/ might be deprecated in the future.
 
-[endsect]
+[endsect] [/Generic Heading]
+
 [section Macros]
 
 [pre'''
@@ -1284,7 +1309,8 @@
 
 Hi __spirit__ :-)
 
-[endsect]
+[endsect] [/Macros]
+
 [section Predefined Macros]
 
 Quickbook has some predefined macros that you can already use.
@@ -1296,7 +1322,8 @@
     [['''__FILENAME__''']   [Quickbook source filename]     [__FILENAME__]]
 ]
 
-[endsect]
+[endsect] [/Predefined Macros]
+
 [section Templates]
 
 Templates provide a more versatile text substitution mechanism. Templates
@@ -1550,7 +1577,8 @@
 <hey>baz</hey>
 ]
 
-[endsect]
+[endsect] [/Templates]
+
 [section Blurbs]
 
 [pre'''
@@ -1576,7 +1604,8 @@
 [note Prefer [link quickbook.syntax.block.admonitions admonitions] wherever
 appropriate.]
 
-[endsect]
+[endsect] [/Blurbs]
+
 [section Tables]
 
 [pre'''
@@ -1699,7 +1728,8 @@
     ]
 ]
 
-[endsect]
+[endsect] [/Tables]
+
 [section Variable Lists]
 
 [pre'''
@@ -1731,7 +1761,8 @@
 the second column contains the definitions. Those familiar with HTML
 will recognize this as a "definition list".
 
-[endsect]
+[endsect] [/Variable Lists]
+
 [section Include]
 
 You can include one QuickBook file from another. The syntax is simply:
@@ -1761,7 +1792,7 @@
 named anchor for that section will be "someid.intro", and you can link to
 it with [^\[link someid.intro The Intro\]].
 
-[endsect]
+[endsect] [/Include]
 
 [section Import]
 
@@ -1896,10 +1927,11 @@
 
 See the actual code here: [@boost:/tools/quickbook/test/stub.cpp]
 
-[endsect]
+[endsect] [/Import]
 
-[endsect]
-[endsect]
+[endsect] [/Block Level Elements]
+
+[endsect] [/Syntax Summary]
 
 [section:install Installation and configuration]
 
@@ -1993,7 +2025,7 @@
 package system to avoid manual management of the installations.  In that
 case, check out [@http://www.pkgsrc.org pkgsrc].
 
-[endsect]
+[endsect] [/Mac OS X]
 
 [section:windows Windows 2000, XP, 2003, Vista]
 
@@ -2065,7 +2097,7 @@
      : "C:/Users/example/Documents/boost/xml/bin/quickbook.exe"
      ;
 
-[endsect]
+[endsect] [/Windows]
 
 [section:linux Debian, Ubuntu]
 
@@ -2116,7 +2148,8 @@
      : /usr/local/bin/quickbook
      ;
 
-[endsect]
+[endsect] [/Linux]
+
 [endsect] [/Installation and configuration]
 
 [section:editors Editor Support]
@@ -2301,4 +2334,4 @@
                             [[^'''[? symbol phrase]''']]                    [__cond__]]
 ]
 
-[endsect]
+[endsect] [/ quick reference]
Modified: branches/release/tools/quickbook/src/Jamfile.v2
==============================================================================
--- branches/release/tools/quickbook/src/Jamfile.v2	(original)
+++ branches/release/tools/quickbook/src/Jamfile.v2	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
@@ -30,8 +30,10 @@
     code_snippet.cpp
     markups.cpp
     syntax_highlight.cpp
-    block_grammar.cpp
-    phrase_grammar.cpp
+    grammar.cpp
+    main_grammar.cpp
+    block_element_grammar.cpp
+    phrase_element_grammar.cpp
     doc_info_grammar.cpp
     /boost//program_options
     /boost//filesystem
Modified: branches/release/tools/quickbook/src/actions.cpp
==============================================================================
--- branches/release/tools/quickbook/src/actions.cpp	(original)
+++ branches/release/tools/quickbook/src/actions.cpp	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
@@ -11,8 +11,8 @@
 #include <numeric>
 #include <functional>
 #include <algorithm>
-#include <boost/filesystem/v2/convenience.hpp>
-#include <boost/filesystem/v2/fstream.hpp>
+#include <boost/filesystem/v3/convenience.hpp>
+#include <boost/filesystem/v3/fstream.hpp>
 #include <boost/lexical_cast.hpp>
 #include "quickbook.hpp"
 #include "actions.hpp"
@@ -47,6 +47,8 @@
     // Handles line-breaks (DEPRECATED!!!)
     void break_action::operator()(iterator first, iterator) const
     {
+        if(!actions.output_pre(phrase)) return;
+
         position const pos = first.get_position();
         detail::outwarn(pos.file,pos.line) << "in column:" << pos.column << ", "
             << "[br] and \\n are deprecated" << ".\n";
@@ -63,11 +65,15 @@
 
     void tagged_action::operator()(std::string const& str) const
     {
+        if(!actions.output_pre(out)) return;
+
         out << pre << str << post;
     }
 
-    void phrase_action::operator()(iterator first, iterator last) const
+    void phrase_action::operator()() const
     {
+        if(!actions.output_pre(phrase)) return;
+
         std::string str;
         phrase.swap(str);
         out << pre << str << post;
@@ -75,6 +81,8 @@
 
     void implicit_paragraph_action::operator()() const
     {
+        if(actions.suppress) return;
+    
         std::string str;
         phrase.swap(str);
 
@@ -91,36 +99,51 @@
         }
 
         if(pos != end) {
-            out << pre << str << post;
+            out << pre << str;
+            // TODO: Is this right place?
+            actions.output_pre(out);
+            out << post;
         }
     }
 
     void header_action::operator()(iterator first, iterator last) const
     {
+        if(actions.suppress) return;
+
         std::string str;
         phrase.swap(str);
 
+        std::string anchor;
+
         if (qbk_version_n < 103) // version 1.2 and below
         {
-            out << "<anchor id=\""
-                << section_id << '.'
-                << detail::make_identifier(str.begin(), str.end())
-                << "\" />"
-                << pre << str << post
-                ;
+            anchor = section_id + '.' +
+                detail::make_identifier(str.begin(), str.end());
         }
-        else // version 1.3 and above
+        else
         {
             std::string id =
                 !element_id.empty() ? element_id :
                 qbk_version_n >= 106 ? detail::make_identifier(first, last) :
                 detail::make_identifier(str.begin(), str.end());
 
-            std::string anchor =
+            anchor =
                 fully_qualified_id(library_id, qualified_section_id, id);
+        }
 
-            out << "<anchor id=\"" << anchor << "\"/>"
-                << pre
+        actions.output_pre(out);
+        actions.anchors.swap(actions.saved_anchors);
+        actions.anchors.push_back(anchor);
+        actions.output_pre(out);
+        
+        if (qbk_version_n < 103)
+        {        
+            out << pre << str << post
+                ;
+        }
+        else // version 1.3 and above
+        {
+            out << pre
                 << "<link linkend=\"" << anchor << "\">"
                 << str
                 << "</link>"
@@ -131,6 +154,8 @@
 
     void generic_header_action::operator()(iterator first, iterator last) const
     {
+        if(actions.suppress) return;
+
         int level_ = section_level + 2;     // section_level is zero-based. We need to use a
                                             // 0ne-based heading which is one greater
                                             // than the current. Thus: section_level + 2.
@@ -147,8 +172,12 @@
         std::string anchor =
             fully_qualified_id(library_id, qualified_section_id, id);
 
+        actions.output_pre(out);
+        actions.anchors.swap(actions.saved_anchors);
+        actions.anchors.push_back(anchor);
+        actions.output_pre(out);
+
         out
-            << "<anchor id=\"" << anchor << "\"/>"
             << "<bridgehead renderas=\"sect" << level_ << "\">"
             << "<link linkend=\"" << anchor << "\">"
             << str
@@ -159,6 +188,8 @@
 
     void simple_phrase_action::operator()(iterator first, iterator last) const
     {
+        if(!actions.output_pre(out)) return;
+
         out << pre;
         std::string str(first, last);
         if (std::string const* ptr = find(macro, str.c_str()))
@@ -176,30 +207,25 @@
     void cond_phrase_action_pre::operator()(iterator first, iterator last) const
     {
         std::string str(first, last);
-        conditions.push_back(find(macro, str.c_str()));
-        out.push(); // save the stream
+        condition = find(macro, str.c_str());
     }
 
-    void cond_phrase_action_post::operator()(iterator first, iterator last) const
+    cond_phrase_push::cond_phrase_push(quickbook::actions& actions)
+        : actions(actions)
+        , saved_suppress(actions.suppress)
     {
-        bool symbol_found = conditions.back();
-        conditions.pop_back();
-
-        if (first == last || !symbol_found)
-        {
-            out.pop(); // restore the stream
-        }
-        else
-        {
-            std::string save;
-            out.swap(save);
-            out.pop(); // restore the stream
-            out << save; // print the body
-        }
+        actions.suppress = actions.suppress || !actions.condition;
+    }
+    
+    cond_phrase_push::~cond_phrase_push()
+    {
+        actions.suppress = saved_suppress;
     }
 
     void list_action::operator()(iterator first, iterator last) const
     {
+        if(actions.suppress) return;
+    
         BOOST_ASSERT(!list_marks.empty()); // there must be at least one item in the stack
         out << list_buffer.str();
         list_buffer.clear();
@@ -218,6 +244,8 @@
 
     void list_format_action::operator()(iterator first, iterator last) const
     {
+        if(!actions.output_pre(out)) return;
+    
         int new_indent = 0;
         while (first != last && (*first == ' ' || *first == '\t'))
         {
@@ -289,6 +317,8 @@
         }
     }
 
+    // TODO: No need to check suppress since this is only used in the syntax
+    //       highlighter. I should moved this or something.
     void span::operator()(iterator first, iterator last) const
     {
         out << "<phrase role=\"" << name << "\">";
@@ -315,14 +345,14 @@
 
     void anchor_action::operator()(iterator first, iterator last) const
     {
-        out << "<anchor id=\"";
-        while (first != last)
-            detail::print_char(*first++, out.get());
-        out << "\" />\n";
+        if(!actions.suppress)
+            actions.anchors.push_back(std::string(first, last));
     }
 
     void do_macro_action::operator()(std::string const& str) const
     {
+        if(!actions.output_pre(phrase)) return;
+
         if (str == quickbook_get_date)
         {
             char strdate[64];
@@ -343,7 +373,6 @@
 
     void space::operator()(char ch) const
     {
-
         detail::print_space(ch, out.get());
     }
 
@@ -360,12 +389,15 @@
 
     void post_escape_back::operator()(iterator first, iterator last) const
     {
+        escape_actions.output_pre(escape_actions.phrase);
         out << escape_actions.phrase.str();
         escape_actions.phrase.pop(); // restore the stream
     }
 
     void code_action::operator()(iterator first, iterator last) const
     {
+        if(!actions.output_pre(out)) return;
+
         // preprocess the code section to remove the initial indentation
         std::string program(first, last);
         detail::unindent(program);
@@ -376,6 +408,8 @@
         iterator last_(program.end(), program.end());
         first_.set_position(first.get_position());
 
+        // TODO: Shouldn't phrase be empty here? Why would it be output
+        // after the code block?
         std::string save;
         phrase.swap(save);
 
@@ -395,6 +429,8 @@
 
     void inline_code_action::operator()(iterator first, iterator last) const
     {
+        if(!actions.output_pre(out)) return;
+
         std::string save;
         out.swap(save);
 
@@ -410,26 +446,32 @@
 
     void raw_char_action::operator()(char ch) const
     {
+        if(!actions.output_pre(phrase)) return;
         phrase << ch;
     }
 
     void raw_char_action::operator()(iterator first, iterator /*last*/) const
     {
+        if(!actions.output_pre(phrase)) return;
         phrase << *first;
     }
 
     void plain_char_action::operator()(char ch) const
     {
+        if(!actions.output_pre(phrase)) return;
         detail::print_char(ch, phrase.get());
     }
 
     void plain_char_action::operator()(iterator first, iterator /*last*/) const
     {
+        if(!actions.output_pre(phrase)) return;
         detail::print_char(*first, phrase.get());
     }
 
     void escape_unicode_action::operator()(iterator first, iterator last) const
     {
+        if(!actions.output_pre(phrase)) return;
+
         while(first != last && *first == '0') ++first;
 
         // Just ignore \u0000
@@ -462,10 +504,14 @@
 
     void image_action::operator()(iterator, iterator) const
     {
+        if(!actions.output_pre(phrase)) return;
+
         fs::path const img_path(image_fileref);
         
         attribute_map::iterator it = attributes.find("alt");
-        std::string alt_text = it != attributes.end() ? it->second : img_path.stem();
+        std::string alt_text = it != attributes.end() ?
+            it->second :
+            img_path.stem().generic_string();
         attributes.erase("alt");
 
         attributes.insert(attribute_map::value_type("fileref", image_fileref));
@@ -566,12 +612,14 @@
 
     void macro_identifier_action::operator()(iterator first, iterator last) const
     {
+        if(actions.suppress) return;
         actions.macro_id.assign(first, last);
         actions.phrase.push(); // save the phrase
     }
 
     void macro_definition_action::operator()(iterator first, iterator last) const
     {
+        if(actions.suppress) return;
         actions.copy_macros_for_write();
         actions.macro.add(
             actions.macro_id.begin()
@@ -582,6 +630,7 @@
 
     void template_body_action::operator()(iterator first, iterator last) const
     {
+        if(actions.suppress) return;
         if (!actions.templates.add(
             template_symbol(actions.template_identifier, actions.template_info,
                 std::string(first, last), first.get_position(),
@@ -762,29 +811,28 @@
                 (body.is_block ? actions.out : actions.phrase) << body.content;
                 return true;
             }
-            else if (!body.is_block)
-            {
-                simple_phrase_grammar phrase_p(actions);
-
-                //  do a phrase level parse
-                iterator first(body.content.begin(), body.content.end(),
-                    position(body.position.file.c_str(), body.position.line, body.position.column));
-                iterator last(body.content.end(), body.content.end());
-                return call_parse(first, last, phrase_p).full;
-            }
             else
             {
-                block_grammar block_p(actions, true);
-
-                //  do a block level parse
-                //  ensure that we have enough trailing newlines to eliminate
-                //  the need to check for end of file in the grammar.
-                
-                std::string content = body.content + "\n\n";
-                iterator first(content.begin(), content.end(),
-                    position(body.position.file.c_str(), body.position.line, body.position.column));
-                iterator last(content.end(), content.end());
-                return call_parse(first, last, block_p).full;
+                if (!body.is_block)
+                {
+                    //  do a phrase level parse
+                    iterator first(body.content.begin(), body.content.end(),
+                        position(body.position.file.c_str(), body.position.line, body.position.column));
+                    iterator last(body.content.end(), body.content.end());
+                    return cl::parse(first, last, actions.grammar().simple_phrase).full;
+                }
+                else
+                {
+                    //  do a block level parse
+                    //  ensure that we have enough trailing newlines to eliminate
+                    //  the need to check for end of file in the grammar.
+                    
+                    std::string content = body.content + "\n\n";
+                    iterator first(content.begin(), content.end(),
+                        position(body.position.file.c_str(), body.position.line, body.position.column));
+                    iterator last(content.end(), content.end());
+                    return cl::parse(first, last, actions.grammar().block).full;
+                }
             }
         }
     }
@@ -796,6 +844,8 @@
 
     void template_arg_action::operator()(iterator first, iterator last) const
     {
+        if(actions.suppress) return;
+
         actions.template_args.push_back(
             template_body(
                 std::string(first, last),
@@ -805,6 +855,8 @@
 
     void do_template_action::operator()(iterator first, iterator) const
     {
+        if(actions.suppress) return;
+
         // Get the arguments and clear values stored in action.
 
         std::vector<template_body> args;
@@ -994,6 +1046,8 @@
 
     void link_action::operator()(iterator first, iterator last) const
     {
+        if(!actions.output_pre(phrase)) return;
+
         iterator save = first;
         phrase << tag;
         while (first != last)
@@ -1015,6 +1069,8 @@
 
     void variablelist_action::operator()(iterator, iterator) const
     {
+        if(actions.suppress) return;
+
         actions.out << "<variablelist>\n";
 
         actions.out << "<title>";
@@ -1036,6 +1092,8 @@
 
     void table_action::operator()(iterator, iterator) const
     {
+        if(actions.suppress) return;
+
         std::string::iterator first = actions.table_title.begin();
         std::string::iterator last = actions.table_title.end();
         bool has_title = first != last;
@@ -1104,6 +1162,8 @@
 
     void start_row_action::operator()(char) const
     {
+        if (actions.suppress) return;
+
         // the first row is the header
         if (header.empty() && !phrase.str().empty())
         {
@@ -1121,12 +1181,15 @@
 
     void col_action::operator()(std::string const& contents) const
     {
+        if(actions.suppress) return;
         phrase << start_cell_ << contents << end_cell_;
         ++span;
     }
 
     void begin_section_action::operator()(iterator first, iterator last) const
-    {
+    {    
+        if(actions.suppress) return;
+
         section_id = element_id.empty() ?
             detail::make_identifier(first, last) :
             element_id;
@@ -1138,6 +1201,8 @@
         qualified_section_id += section_id;
         ++section_level;
 
+        actions.output_pre(out);
+
         if (qbk_version_n < 103) // version 1.2 and below
         {
             out << "\n<section id=\""
@@ -1151,6 +1216,9 @@
         std::string str;
         phrase.swap(str);
 
+        actions.anchors.swap(actions.saved_anchors);
+        actions.output_pre(out);
+
         if (qbk_version_n < 103) // version 1.2 and below
         {
             out << "<title>" << str << "</title>\n";
@@ -1169,6 +1237,8 @@
 
     void end_section_action::operator()(iterator first, iterator last) const
     {
+        if(!actions.output_pre(out)) return;
+
         if (section_level <= min_section_level)
         {
             position const pos = first.get_position();
@@ -1226,9 +1296,9 @@
         fs::path path(std::string(first, last));
         if (!path.is_complete())
         {
-            fs::path infile = fs::complete(actions.filename).normalize();
+            fs::path infile = fs::absolute(actions.filename).normalize();
             path = (infile.parent_path() / path).normalize();
-            fs::path outdir = fs::complete(actions.outdir).normalize();
+            fs::path outdir = fs::absolute(actions.outdir).normalize();
             path = path_difference(outdir, path);
         }
         return path;
@@ -1236,6 +1306,8 @@
 
     void xinclude_action::operator()(iterator first, iterator last) const
     {
+        if(!actions.output_pre(out)) return;
+
         fs::path path = calculate_relative_path(first, last, actions);
         out << "\n<xi:include href=\"";
         detail::print_string(detail::escape_uri(path.string()), out.get());
@@ -1275,8 +1347,10 @@
 
     void import_action::operator()(iterator first, iterator last) const
     {
+        if(!actions.output_pre(actions.out)) return;
+
         fs::path path = include_search(actions.filename.parent_path(), std::string(first,last));
-        std::string ext = path.extension();
+        std::string ext = path.extension().generic_string();
         std::vector<template_symbol> storage;
         actions.error_count +=
             load_snippets(path.string(), storage, ext, actions.doc_id);
@@ -1297,6 +1371,8 @@
 
     void include_action::operator()(iterator first, iterator last) const
     {
+        if(!actions.output_pre(actions.out)) return;
+
         fs::path filein = include_search(actions.filename.parent_path(), std::string(first,last));
         std::string doc_type, doc_id;
         docinfo_string doc_dirname, doc_last_revision;
@@ -1338,10 +1414,10 @@
         }
 
         // update the __FILENAME__ macro
-        *boost::spirit::classic::find(actions.macro, "__FILENAME__") = actions.filename.file_string();
+        *boost::spirit::classic::find(actions.macro, "__FILENAME__") = actions.filename.native();
 
         // parse the file
-        quickbook::parse_file(actions.filename.file_string().c_str(), actions, true);
+        quickbook::parse_file(actions.filename.native().c_str(), actions, true);
 
         // restore the values
         std::swap(actions.filename, filein);
@@ -1367,14 +1443,90 @@
 
     void phrase_to_string_action::operator()(iterator first, iterator last) const
     {
+        if(!actions.output_pre(phrase)) return;
+
         out.clear();
         phrase.swap(out);
     }
 
     void phrase_to_docinfo_action::operator()(iterator first, iterator last) const
     {
+        if(!actions.output_pre(phrase)) return;
+
         out.encoded.clear();
         phrase.swap(out.encoded);
         out.raw = std::string(first, last);
     }
+    
+    void inner_phrase_action_pre::operator()(iterator, iterator) const
+    {
+        // TODO: Really?
+        if(actions.suppress) return;
+
+        actions.saved_anchors.clear();
+        actions.saved_anchors.swap(actions.anchors);
+    }
+
+    void inner_phrase_action_post::operator()(iterator, iterator) const
+    {
+        if(actions.suppress) return;
+
+        actions.output_pre(actions.phrase);
+    }
+
+    bool pre_output_action::operator()(collector& tgt) const
+    {
+        if(actions.suppress) return false;
+
+        for(quickbook::actions::string_list::iterator
+            it = actions.anchors.begin(),
+            end = actions.anchors.end();
+            it != end; ++it)
+        {
+            tgt << "<anchor id=\"";
+            detail::print_string(*it, tgt.get());
+            tgt << "\"/>\n";
+        }
+        
+        actions.anchors.clear();
+
+        return true;
+    }
+    
+    bool pre_output_action::operator()(iterator, iterator) const
+    {
+        return (*this)(actions.out);
+    }
+
+    scoped_block_push::scoped_block_push(quickbook::actions& actions)
+        : actions(actions)
+    {
+        actions.out.push();
+        actions.phrase.push();
+    }
+    
+    scoped_block_push::~scoped_block_push()
+    {
+        actions.phrase.pop();
+        actions.out.pop();
+    }
+
+    std::string const& scoped_block_push::success_impl()
+    {
+        // TODO: This should probably return an empty string
+        // if actions.suppress is true.
+        actions.inside_paragraph();
+        return actions.out.str();
+    }
+
+    set_no_eols_scoped::set_no_eols_scoped(quickbook::actions& actions)
+        : actions(actions), saved_no_eols(actions.no_eols)
+    {
+        actions.no_eols = false;
+    }
+
+    set_no_eols_scoped::~set_no_eols_scoped()
+    {
+        actions.no_eols = saved_no_eols;
+    }
 }
Modified: branches/release/tools/quickbook/src/actions.hpp
==============================================================================
--- branches/release/tools/quickbook/src/actions.hpp	(original)
+++ branches/release/tools/quickbook/src/actions.hpp	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
@@ -15,7 +15,7 @@
 #include <vector>
 #include <stack>
 #include <algorithm>
-#include <boost/filesystem/v2/operations.hpp>
+#include <boost/filesystem/v3/operations.hpp>
 #include <boost/foreach.hpp>
 #include <boost/tuple/tuple.hpp>
 #include "fwd.hpp"
@@ -73,6 +73,46 @@
         actions& escape_actions,
         std::string const& source_mode);        
 
+    template <typename Derived, typename DataT = void>
+    struct scoped_action_base
+    {
+        typedef quickbook::actions data_type;
+        
+        template <typename T>
+        struct result
+        {
+            typedef cl::match<DataT> type;
+        };
+
+        template <typename T>
+        DataT success(T const&)
+        {
+            return static_cast<Derived*>(this)->success_impl();
+        }
+        
+        void failure() {
+            return static_cast<Derived*>(this)->failure_impl();
+        }
+        
+        void failure_impl() {}
+    };
+
+    struct void_type {};
+
+    template <typename Derived>
+    struct scoped_action_base<Derived, void>
+        : scoped_action_base<Derived, void_type>
+    {
+        template <typename T>
+        void_type success(T const&)
+        {
+            static_cast<Derived*>(this)->success_impl();
+            return void_type();
+        }
+        
+        void success_impl() {}
+    };
+
     struct error_action
     {
         // Prints an error message to std::cerr
@@ -91,16 +131,19 @@
         tagged_action(
             collector& out,
             std::string const& pre,
-            std::string const& post)
+            std::string const& post,
+            quickbook::actions& actions)
         : out(out)
         , pre(pre)
-        , post(post) {}
+        , post(post)
+        , actions(actions) {}
 
         void operator()(std::string const&) const;
 
         collector& out;
         std::string pre;
         std::string post;
+        quickbook::actions& actions;
     };
 
     struct phrase_action
@@ -112,18 +155,24 @@
             collector& out,
             collector& phrase,
             std::string const& pre,
-            std::string const& post)
+            std::string const& post,
+            quickbook::actions& actions)
         : out(out)
         , phrase(phrase)
         , pre(pre)
-        , post(post) {}
+        , post(post)
+        , actions(actions) {}
 
-        void operator()(iterator first, iterator last) const;
+        void operator()(iterator first, iterator last) const { return (*this)(); }
+        template <typename T>
+        void operator()(T const&) const { return (*this)(); }
+        void operator()() const;
 
         collector& out;
         collector& phrase;
         std::string pre;
         std::string post;
+        quickbook::actions& actions;
     };
 
     struct implicit_paragraph_action
@@ -135,11 +184,13 @@
             collector& out,
             collector& phrase,
             std::string const& pre,
-            std::string const& post)
+            std::string const& post,
+            quickbook::actions& actions)
         : out(out)
         , phrase(phrase)
         , pre(pre)
-        , post(post) {}
+        , post(post)
+        , actions(actions) {}
 
         void operator()() const;
         void operator()(iterator first, iterator last) const { (*this)(); }
@@ -148,6 +199,7 @@
         collector& phrase;
         std::string pre;
         std::string post;
+        quickbook::actions& actions;
     };
 
     struct header_action
@@ -162,7 +214,8 @@
             std::string const& section_id,
             std::string const& qualified_section_id,
             std::string const& pre,
-            std::string const& post)
+            std::string const& post,
+            quickbook::actions& actions)
         : out(out)
         , phrase(phrase)
         , element_id(element_id)
@@ -170,7 +223,8 @@
         , section_id(section_id)
         , qualified_section_id(qualified_section_id)
         , pre(pre)
-        , post(post) {}
+        , post(post)
+        , actions(actions) {}
 
         void operator()(iterator first, iterator last) const;
 
@@ -182,6 +236,7 @@
         std::string const& qualified_section_id;
         std::string pre;
         std::string post;
+        quickbook::actions& actions;
     };
 
     struct generic_header_action
@@ -195,14 +250,16 @@
             std::string const& library_id,
             std::string const& section_id,
             std::string const& qualified_section_id,
-            int const& section_level)
+            int const& section_level,
+            quickbook::actions& actions)
         : out(out)
         , phrase(phrase)
         , element_id(element_id)
         , library_id(library_id)
         , section_id(section_id)
         , qualified_section_id(qualified_section_id)
-        , section_level(section_level) {}
+        , section_level(section_level)
+        , actions(actions) {}
 
         void operator()(iterator first, iterator last) const;
 
@@ -213,6 +270,7 @@
         std::string const& section_id;
         std::string const& qualified_section_id;
         int const& section_level;
+        quickbook::actions& actions;
     };
 
     struct simple_phrase_action
@@ -223,11 +281,13 @@
             collector& out
           , std::string const& pre
           , std::string const& post
-          , string_symbols const& macro)
+          , string_symbols const& macro
+          , quickbook::actions& actions)
         : out(out)
         , pre(pre)
         , post(post)
-        , macro(macro) {}
+        , macro(macro)
+        , actions(actions) {}
 
         void operator()(iterator first, iterator last) const;
 
@@ -235,6 +295,7 @@
         std::string pre;
         std::string post;
         string_symbols const& macro;
+        quickbook::actions& actions;
     };
 
     struct cond_phrase_action_pre
@@ -242,37 +303,24 @@
         //  Handles conditional phrases
 
         cond_phrase_action_pre(
-            collector& out
-          , std::vector<bool>& conditions
+            bool& condition
           , string_symbols const& macro)
-        : out(out)
-        , conditions(conditions)
+        : condition(condition)
         , macro(macro) {}
 
         void operator()(iterator first, iterator last) const;
 
-        collector& out;
-        std::vector<bool>& conditions;
+        bool& condition;
         string_symbols const& macro;
     };
 
-    struct cond_phrase_action_post
+    struct cond_phrase_push : scoped_action_base<cond_phrase_push>
     {
-        //  Handles conditional phrases
-
-        cond_phrase_action_post(
-            collector& out
-          , std::vector<bool>& conditions
-          , string_symbols const& macro)
-        : out(out)
-        , conditions(conditions)
-        , macro(macro) {}
+        cond_phrase_push(quickbook::actions&);
+        ~cond_phrase_push();
 
-        void operator()(iterator first, iterator last) const;
-
-        collector& out;
-        std::vector<bool>& conditions;
-        string_symbols const& macro;
+        quickbook::actions& actions;
+        bool saved_suppress;
     };
 
     struct list_action
@@ -284,11 +332,13 @@
             collector& out
           , collector& list_buffer
           , int& list_indent
-          , std::stack<mark_type>& list_marks)
+          , std::stack<mark_type>& list_marks
+          , quickbook::actions& actions)
         : out(out)
         , list_buffer(list_buffer)
         , list_indent(list_indent)
-        , list_marks(list_marks) {}
+        , list_marks(list_marks)
+        , actions(actions) {}
 
         void operator()(iterator first, iterator last) const;
 
@@ -296,6 +346,7 @@
         collector& list_buffer;
         int& list_indent;
         std::stack<mark_type>& list_marks;
+        quickbook::actions& actions;
     };
 
     struct list_format_action
@@ -307,11 +358,13 @@
             collector& out
           , int& list_indent
           , std::stack<mark_type>& list_marks
-          , int& error_count)
+          , int& error_count
+          , quickbook::actions& actions)
         : out(out)
         , list_indent(list_indent)
         , list_marks(list_marks)
-        , error_count(error_count) {}
+        , error_count(error_count)
+        , actions(actions) {}
 
         void operator()(iterator first, iterator last) const;
 
@@ -319,6 +372,7 @@
         int& list_indent;
         std::stack<mark_type>& list_marks;
         int& error_count;
+        quickbook::actions& actions;
     };
 
     struct span
@@ -350,12 +404,12 @@
     {
         // Handles anchors
 
-        anchor_action(collector& out)
-            : out(out) {}
+        anchor_action(quickbook::actions& actions)
+            : actions(actions) {}
 
         void operator()(iterator first, iterator last) const;
 
-        collector& out;
+        quickbook::actions& actions;
     };
 
     extern char const* quickbook_get_date;
@@ -365,11 +419,13 @@
     {
         // Handles macro substitutions
 
-        do_macro_action(collector& phrase)
-            : phrase(phrase) {}
+        do_macro_action(collector& phrase, quickbook::actions& actions)
+            : phrase(phrase)
+            , actions(actions) {}
 
         void operator()(std::string const& str) const;
         collector& phrase;
+        quickbook::actions& actions;
     };
 
     struct space
@@ -417,13 +473,15 @@
         // Prints a single raw (unprocessed) char.
         // Allows '<', '>'... etc.
 
-        raw_char_action(collector& phrase)
-        : phrase(phrase) {}
+        raw_char_action(collector& phrase, quickbook::actions& actions)
+        : phrase(phrase)
+        , actions(actions) {}
 
         void operator()(char ch) const;
         void operator()(iterator first, iterator /*last*/) const;
 
         collector& phrase;
+        quickbook::actions& actions;
     };
 
     struct plain_char_action
@@ -431,21 +489,26 @@
         // Prints a single plain char.
         // Converts '<' to "<"... etc See utils.hpp
 
-        plain_char_action(collector& phrase)
-        : phrase(phrase) {}
+        plain_char_action(collector& phrase, quickbook::actions& actions)
+        : phrase(phrase)
+        , actions(actions) {}
 
         void operator()(char ch) const;
         void operator()(iterator first, iterator /*last*/) const;
 
         collector& phrase;
+        quickbook::actions& actions;
     };
     
     struct escape_unicode_action
     {
-        escape_unicode_action(collector& phrase) : phrase(phrase) {}
+        escape_unicode_action(collector& phrase, quickbook::actions& actions)
+        : phrase(phrase)
+        , actions(actions) {}
         void operator()(iterator first, iterator last) const;
 
         collector& phrase;
+        quickbook::actions& actions;
     };
 
     struct attribute_action
@@ -474,24 +537,30 @@
         image_action(
             collector& phrase
           , attribute_map& attributes
-          , std::string& image_fileref)
+          , std::string& image_fileref
+          , quickbook::actions& actions)
         : phrase(phrase)
         , attributes(attributes)
-        , image_fileref(image_fileref) {}
+        , image_fileref(image_fileref)
+        , actions(actions) {}
 
         void operator()(iterator first, iterator last) const;
 
         collector& phrase;
         attribute_map& attributes;
         std::string& image_fileref;
+        quickbook::actions& actions;
     };
 
     struct markup_action
     {
         // A generic markup action
 
-        markup_action(collector& phrase, std::string const& str)
-        : phrase(phrase), str(str) {}
+        markup_action(
+            collector& phrase,
+            std::string const& str,
+            quickbook::actions& actions)
+        : phrase(phrase), str(str), actions(actions) {}
 
         template <typename T>
         void operator()(T const&) const
@@ -507,6 +576,7 @@
 
         collector& phrase;
         std::string str;
+        quickbook::actions& actions;
     };
     
     struct code_action
@@ -551,12 +621,13 @@
     {
         // Handles line-breaks (DEPRECATED!!!)
 
-        break_action(collector& phrase)
-        : phrase(phrase) {}
+        break_action(collector& phrase, quickbook::actions& actions)
+        : phrase(phrase), actions(actions) {}
 
         void operator()(iterator f, iterator) const;
 
         collector& phrase;
+        quickbook::actions& actions;
     };
 
     struct macro_identifier_action
@@ -623,13 +694,17 @@
     {
         // Handles links (URL, XML refentry, function, class, member)
 
-        link_action(collector& phrase, char const* tag)
-        : phrase(phrase), tag(tag) {}
+        link_action(
+            collector& phrase,
+            char const* tag,
+            quickbook::actions& actions)
+        : phrase(phrase), tag(tag), actions(actions) {}
 
         void operator()(iterator first, iterator last) const;
 
         collector& phrase;
         char const* tag;
+        quickbook::actions& actions;
     };
 
     struct variablelist_action
@@ -660,8 +735,8 @@
     {
         // Handles table rows
 
-        start_row_action(collector& phrase, unsigned& span, std::string& header)
-            : phrase(phrase), span(span), header(header) {}
+        start_row_action(collector& phrase, unsigned& span, std::string& header, quickbook::actions& actions)
+            : phrase(phrase), span(span), header(header), actions(actions) {}
 
         void operator()(char) const;
         void operator()(iterator f, iterator) const;
@@ -669,17 +744,19 @@
         collector& phrase;
         unsigned& span;
         std::string& header;
+        quickbook::actions& actions;
     };
 
     struct col_action
     {
-        col_action(collector& phrase, unsigned& span)
-        : phrase(phrase), span(span) {}
+        col_action(collector& phrase, unsigned& span, quickbook::actions& actions)
+        : phrase(phrase), span(span), actions(actions) {}
 
         void operator()(std::string const&) const;
 
         collector& phrase;
         unsigned& span;
+        quickbook::actions& actions;
     };
 
     struct begin_section_action
@@ -693,14 +770,16 @@
           , std::string& section_id
           , int& section_level
           , std::string& qualified_section_id
-          , std::string& element_id)
+          , std::string& element_id
+          , quickbook::actions& actions)
         : out(out)
         , phrase(phrase)
         , library_id(library_id)
         , section_id(section_id)
         , section_level(section_level)
         , qualified_section_id(qualified_section_id)
-        , element_id(element_id) {}
+        , element_id(element_id)
+        , actions(actions) {}
 
         void operator()(iterator first, iterator last) const;
 
@@ -711,6 +790,7 @@
         int& section_level;
         std::string& qualified_section_id;
         std::string& element_id;
+        quickbook::actions& actions;
     };
 
     struct end_section_action
@@ -720,12 +800,14 @@
           , int& section_level
           , int& min_section_level
           , std::string& qualified_section_id
-          , int& error_count)
+          , int& error_count
+          , quickbook::actions& actions)
         : out(out)
         , section_level(section_level)
         , min_section_level(min_section_level)
         , qualified_section_id(qualified_section_id)
-        , error_count(error_count) {}
+        , error_count(error_count)
+        , actions(actions) {}
 
         void operator()(iterator first, iterator last) const;
 
@@ -734,6 +816,7 @@
         int& min_section_level;
         std::string& qualified_section_id;
         int& error_count;
+        quickbook::actions& actions;
    };
    
    struct element_id_warning_action
@@ -805,25 +888,77 @@
 
     struct phrase_to_string_action
     {
-        phrase_to_string_action(std::string& out, collector& phrase)
-            : out(out) , phrase(phrase) {}
+        phrase_to_string_action(std::string& out, collector& phrase, quickbook::actions& actions)
+            : out(out) , phrase(phrase), actions(actions) {}
 
         void operator()(iterator first, iterator last) const;
 
         std::string& out;
         collector& phrase;
+        quickbook::actions& actions;
     };
 
     struct phrase_to_docinfo_action
     {
-        phrase_to_docinfo_action(docinfo_string& out, collector& phrase)
+        phrase_to_docinfo_action(docinfo_string& out, collector& phrase, quickbook::actions& actions)
             : out(out)
-            , phrase(phrase) {}
+            , phrase(phrase)
+            , actions(actions) {}
 
         void operator()(iterator first, iterator last) const;
 
         docinfo_string& out;
         collector& phrase;
+        quickbook::actions& actions;
+    };
+
+    struct inner_phrase_action_pre
+    {
+        inner_phrase_action_pre(quickbook::actions& actions)
+            : actions(actions) {}
+
+        void operator()(iterator, iterator) const;
+        
+        quickbook::actions& actions;
+    };
+
+    struct inner_phrase_action_post
+    {
+        inner_phrase_action_post(quickbook::actions& actions)
+            : actions(actions) {}
+
+        void operator()(iterator, iterator) const;
+        
+        quickbook::actions& actions;
+    };
+
+    struct pre_output_action
+    {
+        pre_output_action(quickbook::actions& actions)
+            : actions(actions) {}
+            
+        bool operator()(collector& tgt) const;
+        bool operator()(iterator, iterator) const;
+        
+        quickbook::actions& actions;
+    };
+
+    struct scoped_block_push : scoped_action_base<scoped_block_push, std::string>
+    {
+        scoped_block_push(quickbook::actions&);
+        ~scoped_block_push();
+        std::string const& success_impl();
+
+        quickbook::actions& actions;
+    };
+
+    struct set_no_eols_scoped : scoped_action_base<set_no_eols_scoped>
+    {
+        set_no_eols_scoped(quickbook::actions&);
+        ~set_no_eols_scoped();
+
+        quickbook::actions& actions;
+        bool saved_no_eols;
     };
 }
 
Modified: branches/release/tools/quickbook/src/actions_class.cpp
==============================================================================
--- branches/release/tools/quickbook/src/actions_class.cpp	(original)
+++ branches/release/tools/quickbook/src/actions_class.cpp	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
@@ -11,6 +11,7 @@
 #include "actions_class.hpp"
 #include "markups.hpp"
 #include "quickbook.hpp"
+#include "grammar.hpp"
 
 #if (defined(BOOST_MSVC) && (BOOST_MSVC <= 1310))
 #pragma warning(disable:4355)
@@ -19,8 +20,10 @@
 namespace quickbook
 {
     actions::actions(char const* filein_, fs::path const& outdir_, string_stream& out_)
+        : grammar_()
+
     // header info
-        : doc_type()
+        , doc_type()
         , doc_title()
         , doc_version()
         , doc_id()
@@ -41,7 +44,7 @@
         , list_buffer()
 
     // state
-        , filename(fs::complete(fs::path(filein_)))
+        , filename(fs::absolute(fs::path(filein_)))
         , outdir(outdir_)
         , macro_change_depth(0)
         , macro()
@@ -68,130 +71,142 @@
         , image_fileref()
         , attribute_name()
         , attributes()
+        , anchors()
+        , saved_anchors()
+        , no_eols(true)
+        , suppress(false)
 
     // actions
         , error(error_count)
-        , extract_doc_title(doc_title, phrase)
-        , extract_doc_license(doc_license, phrase)
-        , extract_doc_purpose(doc_purpose, phrase)
-        , extract_doc_version(doc_version, phrase)
-        , extract_doc_id(doc_id_tmp, phrase)
-        , extract_doc_dirname(doc_dirname, phrase)
-        , extract_copyright_second(copyright.second, phrase)
-        , extract_name_second(name.second, phrase)
-        , extract_name_first(name.first, phrase)
-        , extract_doc_last_revision(doc_last_revision, phrase)
-        , extract_doc_category(doc_category, phrase)
-        , extract_doc_biblioid(doc_biblioid.second, phrase)
+        , extract_doc_title(doc_title, phrase, *this)
+        , extract_doc_license(doc_license, phrase, *this)
+        , extract_doc_purpose(doc_purpose, phrase, *this)
+        , extract_doc_version(doc_version, phrase, *this)
+        , extract_doc_id(doc_id_tmp, phrase, *this)
+        , extract_doc_dirname(doc_dirname, phrase, *this)
+        , extract_copyright_second(copyright.second, phrase, *this)
+        , extract_name_second(name.second, phrase, *this)
+        , extract_name_first(name.first, phrase, *this)
+        , extract_doc_last_revision(doc_last_revision, phrase, *this)
+        , extract_doc_category(doc_category, phrase, *this)
+        , extract_doc_biblioid(doc_biblioid.second, phrase, *this)
+        , extract_doc_lang(doc_lang, phrase, *this)
+        , scoped_block(*this)
         , code(out, phrase, *this)
         , code_block(phrase, phrase, *this)
         , inline_code(phrase, *this)
-        , inside_paragraph(out, phrase, paragraph_pre, paragraph_post)
-        , h(out, phrase, element_id, doc_id, section_id, qualified_section_id, section_level)
-        , h1(out, phrase, element_id, doc_id, section_id, qualified_section_id, h1_pre, h1_post)
-        , h2(out, phrase, element_id, doc_id, section_id, qualified_section_id, h2_pre, h2_post)
-        , h3(out, phrase, element_id, doc_id, section_id, qualified_section_id, h3_pre, h3_post)
-        , h4(out, phrase, element_id, doc_id, section_id, qualified_section_id, h4_pre, h4_post)
-        , h5(out, phrase, element_id, doc_id, section_id, qualified_section_id, h5_pre, h5_post)
-        , h6(out, phrase, element_id, doc_id, section_id, qualified_section_id, h6_pre, h6_post)
-        , hr(out, hr_)
-        , blurb(out, blurb_pre, blurb_post)
-        , blockquote(out, blockquote_pre, blockquote_post)
-        , preformatted(out, phrase, preformatted_pre, preformatted_post)
-        , warning(out, warning_pre, warning_post)
-        , caution(out, caution_pre, caution_post)
-        , important(out, important_pre, important_post)
-        , note(out, note_pre, note_post)
-        , tip(out, tip_pre, tip_post)
-        , plain_char(phrase)
-        , raw_char(phrase)
-        , escape_unicode(phrase)
+        , inside_paragraph(out, phrase, paragraph_pre, paragraph_post, *this)
+        , h(out, phrase, element_id, doc_id, section_id, qualified_section_id, section_level, *this)
+        , h1(out, phrase, element_id, doc_id, section_id, qualified_section_id, h1_pre, h1_post, *this)
+        , h2(out, phrase, element_id, doc_id, section_id, qualified_section_id, h2_pre, h2_post, *this)
+        , h3(out, phrase, element_id, doc_id, section_id, qualified_section_id, h3_pre, h3_post, *this)
+        , h4(out, phrase, element_id, doc_id, section_id, qualified_section_id, h4_pre, h4_post, *this)
+        , h5(out, phrase, element_id, doc_id, section_id, qualified_section_id, h5_pre, h5_post, *this)
+        , h6(out, phrase, element_id, doc_id, section_id, qualified_section_id, h6_pre, h6_post, *this)
+        , hr(out, hr_, *this)
+        , blurb(out, blurb_pre, blurb_post, *this)
+        , blockquote(out, blockquote_pre, blockquote_post, *this)
+        , set_no_eols(*this)
+        , preformatted(out, phrase, preformatted_pre, preformatted_post, *this)
+        , warning(out, warning_pre, warning_post, *this)
+        , caution(out, caution_pre, caution_post, *this)
+        , important(out, important_pre, important_post, *this)
+        , note(out, note_pre, note_post, *this)
+        , tip(out, tip_pre, tip_post, *this)
+        , space_char(phrase)
+        , plain_char(phrase, *this)
+        , raw_char(phrase, *this)
+        , escape_unicode(phrase, *this)
         , attribute(attributes, attribute_name, error_count)
-        , image(phrase, attributes, image_fileref)
-        , cond_phrase_pre(phrase, conditions, macro)
-        , cond_phrase_post(phrase, conditions, macro)
-
-        , list(out, list_buffer, list_indent, list_marks)
-        , list_format(list_buffer, list_indent, list_marks, error_count)
-        , list_item(list_buffer, phrase, list_item_pre, list_item_post)
-
-        , funcref_pre(phrase, funcref_pre_)
-        , funcref_post(phrase, funcref_post_)
-        , classref_pre(phrase, classref_pre_)
-        , classref_post(phrase, classref_post_)
-        , memberref_pre(phrase, memberref_pre_)
-        , memberref_post(phrase, memberref_post_)
-        , enumref_pre(phrase, enumref_pre_)
-        , enumref_post(phrase, enumref_post_)
-        , macroref_pre(phrase, macroref_pre_)
-        , macroref_post(phrase, macroref_post_)
-        , headerref_pre(phrase, headerref_pre_)
-        , headerref_post(phrase, headerref_post_)
-        , conceptref_pre(phrase, conceptref_pre_)
-        , conceptref_post(phrase, conceptref_post_)
-        , globalref_pre(phrase, globalref_pre_)
-        , globalref_post(phrase, globalref_post_)
-
-        , bold_pre(phrase, bold_pre_)
-        , bold_post(phrase, bold_post_)
-        , italic_pre(phrase, italic_pre_)
-        , italic_post(phrase, italic_post_)
-        , underline_pre(phrase, underline_pre_)
-        , underline_post(phrase, underline_post_)
-        , teletype_pre(phrase, teletype_pre_)
-        , teletype_post(phrase, teletype_post_)
-        , strikethrough_pre(phrase, strikethrough_pre_)
-        , strikethrough_post(phrase, strikethrough_post_)
-        , quote_pre(phrase, quote_pre_)
-        , quote_post(phrase, quote_post_)
-        , replaceable_pre(phrase, replaceable_pre_)
-        , replaceable_post(phrase, replaceable_post_)
-        , footnote_pre(phrase, footnote_pre_)
-        , footnote_post(phrase, footnote_post_)
-
-        , simple_bold(phrase, bold_pre_, bold_post_, macro)
-        , simple_italic(phrase, italic_pre_, italic_post_, macro)
-        , simple_underline(phrase, underline_pre_, underline_post_, macro)
-        , simple_teletype(phrase, teletype_pre_, teletype_post_, macro)
-        , simple_strikethrough(phrase, strikethrough_pre_, strikethrough_post_, macro)
+        , image(phrase, attributes, image_fileref, *this)
+        , cond_phrase_pre(condition, macro)
+        , scoped_cond_phrase(*this)
+
+        , list(out, list_buffer, list_indent, list_marks, *this)
+        , list_format(list_buffer, list_indent, list_marks, error_count, *this)
+        , list_item(list_buffer, phrase, list_item_pre, list_item_post, *this)
+
+        , funcref_pre(phrase, funcref_pre_, *this)
+        , funcref_post(phrase, funcref_post_, *this)
+        , classref_pre(phrase, classref_pre_, *this)
+        , classref_post(phrase, classref_post_, *this)
+        , memberref_pre(phrase, memberref_pre_, *this)
+        , memberref_post(phrase, memberref_post_, *this)
+        , enumref_pre(phrase, enumref_pre_, *this)
+        , enumref_post(phrase, enumref_post_, *this)
+        , macroref_pre(phrase, macroref_pre_, *this)
+        , macroref_post(phrase, macroref_post_, *this)
+        , headerref_pre(phrase, headerref_pre_, *this)
+        , headerref_post(phrase, headerref_post_, *this)
+        , conceptref_pre(phrase, conceptref_pre_, *this)
+        , conceptref_post(phrase, conceptref_post_, *this)
+        , globalref_pre(phrase, globalref_pre_, *this)
+        , globalref_post(phrase, globalref_post_, *this)
+
+        , bold_pre(phrase, bold_pre_, *this)
+        , bold_post(phrase, bold_post_, *this)
+        , italic_pre(phrase, italic_pre_, *this)
+        , italic_post(phrase, italic_post_, *this)
+        , underline_pre(phrase, underline_pre_, *this)
+        , underline_post(phrase, underline_post_, *this)
+        , teletype_pre(phrase, teletype_pre_, *this)
+        , teletype_post(phrase, teletype_post_, *this)
+        , strikethrough_pre(phrase, strikethrough_pre_, *this)
+        , strikethrough_post(phrase, strikethrough_post_, *this)
+        , quote_pre(phrase, quote_pre_, *this)
+        , quote_post(phrase, quote_post_, *this)
+        , replaceable_pre(phrase, replaceable_pre_, *this)
+        , replaceable_post(phrase, replaceable_post_, *this)
+        , footnote_pre(phrase, footnote_pre_, *this)
+        , footnote_post(phrase, footnote_post_, *this)
+
+        , simple_bold(phrase, bold_pre_, bold_post_, macro, *this)
+        , simple_italic(phrase, italic_pre_, italic_post_, macro, *this)
+        , simple_underline(phrase, underline_pre_, underline_post_, macro, *this)
+        , simple_teletype(phrase, teletype_pre_, teletype_post_, macro, *this)
+        , simple_strikethrough(phrase, strikethrough_pre_, strikethrough_post_, macro, *this)
 
         , variablelist(*this)
-        , start_varlistentry(phrase, start_varlistentry_)
-        , end_varlistentry(phrase, end_varlistentry_)
-        , start_varlistterm(phrase, start_varlistterm_)
-        , end_varlistterm(phrase, end_varlistterm_)
-        , varlistitem(phrase, start_varlistitem_, end_varlistitem_)
+        , start_varlistentry(phrase, start_varlistentry_, *this)
+        , end_varlistentry(phrase, end_varlistentry_, *this)
+        , start_varlistterm(phrase, start_varlistterm_, *this)
+        , end_varlistterm(phrase, end_varlistterm_, *this)
+        , varlistitem(phrase, start_varlistitem_, end_varlistitem_, *this)
 
-        , break_(phrase)
+        , break_(phrase, *this)
         , macro_identifier(*this)
         , macro_definition(*this)
-        , do_macro(phrase)
+        , do_macro(phrase, *this)
         , template_body(*this)
         , template_arg(*this)
         , do_template(*this)
-        , url_pre(phrase, url_pre_)
-        , url_post(phrase, url_post_)
-        , link_pre(phrase, link_pre_)
-        , link_post(phrase, link_post_)
+        , url_pre(phrase, url_pre_, *this)
+        , url_post(phrase, url_post_, *this)
+        , link_pre(phrase, link_pre_, *this)
+        , link_post(phrase, link_post_, *this)
         , table(*this)
-        , start_row(phrase, table_span, table_header)
-        , end_row(phrase, end_row_)
-        , cell(phrase, table_span)
-        , anchor(out)
+        , start_row(phrase, table_span, table_header, *this)
+        , end_row(phrase, end_row_, *this)
+        , cell(phrase, table_span, *this)
+        , anchor(*this)
 
-        , begin_section(out, phrase, doc_id, section_id, section_level, qualified_section_id, element_id)
-        , end_section(out, section_level, min_section_level, qualified_section_id, error_count)
+        , begin_section(out, phrase, doc_id, section_id, section_level, qualified_section_id, element_id, *this)
+        , end_section(out, section_level, min_section_level, qualified_section_id, error_count, *this)
         , xinclude(out, *this)
         , include(*this)
         , import(out, *this)
 
-        , escape_pre(phrase, escape_pre_)
-        , escape_post(phrase, escape_post_)
+        , escape_pre(phrase, escape_pre_, *this)
+        , escape_post(phrase, escape_post_, *this)
+        
+        , inner_phrase_pre(*this)
+        , inner_phrase_post(*this)
+        , output_pre(*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.file_string();
+            filename.native();
 
         // add the predefined macros
         macro.add
@@ -199,8 +214,12 @@
             ("__TIME__", std::string(quickbook_get_time))
             ("__FILENAME__", filename_str)
         ;
+        
+        boost::scoped_ptr<quickbook_grammar> g(
+            new quickbook_grammar(*this));
+        grammar_.swap(g);
     }
-
+    
     void actions::push()
     {
         state_stack.push(
@@ -261,4 +280,8 @@
         list_buffer.pop();
         templates.pop();
     }
+    
+    quickbook_grammar& actions::grammar() const {
+        return *grammar_;
+    }
 }
Modified: branches/release/tools/quickbook/src/actions_class.hpp
==============================================================================
--- branches/release/tools/quickbook/src/actions_class.hpp	(original)
+++ branches/release/tools/quickbook/src/actions_class.hpp	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
@@ -11,7 +11,9 @@
 #define BOOST_SPIRIT_ACTIONS_CLASS_HPP
 
 #include "actions.hpp"
+#include "scoped_parser.hpp"
 #include <boost/tuple/tuple.hpp>
+#include <boost/scoped_ptr.hpp>
 
 namespace quickbook
 {
@@ -22,6 +24,10 @@
     {
         actions(char const* filein_, fs::path const& outdir, string_stream& out_);
 
+    private:
+        boost::scoped_ptr<quickbook_grammar> grammar_;
+
+    public:
     ///////////////////////////////////////////////////////////////////////////
     // State
     ///////////////////////////////////////////////////////////////////////////
@@ -51,6 +57,7 @@
         docinfo_string          doc_license;
         docinfo_string          doc_last_revision;
         biblioid_list           doc_biblioid_items;
+        docinfo_string          doc_lang;
         std::string             include_doc_id;
         //temporary state
         biblioid_item           doc_biblioid;
@@ -101,7 +108,7 @@
         std::string             macro_id;
         std::stack<mark_type>   list_marks;
         int                     list_indent;
-        std::vector<bool>       conditions;
+        bool                    condition;
         std::string             template_identifier;
         string_list             template_info;
         int                     template_depth;
@@ -114,11 +121,16 @@
         std::string             image_fileref;
         std::string             attribute_name;
         attribute_map           attributes;
+        string_list             anchors;
+        string_list             saved_anchors;
+        bool                    no_eols;
+        bool                    suppress;
 
     // push/pop the states and the streams
         void copy_macros_for_write();
         void push();
         void pop();
+        quickbook_grammar& grammar() const;
 
     ///////////////////////////////////////////////////////////////////////////
     // actions
@@ -136,6 +148,10 @@
         phrase_to_docinfo_action extract_doc_last_revision;
         phrase_to_docinfo_action extract_doc_category;
         phrase_to_docinfo_action extract_doc_biblioid;
+        phrase_to_docinfo_action extract_doc_lang;
+
+        scoped_parser<scoped_block_push>
+                                scoped_block;
 
         code_action             code;
         code_action             code_block;
@@ -145,15 +161,19 @@
         header_action           h1, h2, h3, h4, h5, h6;
         markup_action           hr;
         tagged_action           blurb, blockquote;
+        scoped_parser<set_no_eols_scoped>
+                                set_no_eols;
         phrase_action           preformatted;
         tagged_action           warning, caution, important, note, tip;
+        space                   space_char;
         plain_char_action       plain_char;
         raw_char_action         raw_char;
         escape_unicode_action   escape_unicode;
         attribute_action        attribute;
         image_action            image;
         cond_phrase_action_pre  cond_phrase_pre;
-        cond_phrase_action_post cond_phrase_post;
+        scoped_parser<cond_phrase_push>
+                                scoped_cond_phrase;
 
         list_action             list;
         list_format_action      list_format;
@@ -232,6 +252,10 @@
 
         markup_action           escape_pre;
         markup_action           escape_post;
+
+        inner_phrase_action_pre inner_phrase_pre;
+        inner_phrase_action_post inner_phrase_post;
+        pre_output_action       output_pre;
     };
 }
 
Deleted: branches/release/tools/quickbook/src/block_grammar.cpp
==============================================================================
--- branches/release/tools/quickbook/src/block_grammar.cpp	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
+++ (empty file)
@@ -1,487 +0,0 @@
-/*=============================================================================
-    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 "phrase_grammar.hpp"
-#include "utils.hpp"
-#include "actions_class.hpp"
-#include "scoped_block.hpp"
-#include <boost/spirit/include/classic_confix.hpp>
-#include <boost/spirit/include/classic_chset.hpp>
-#include <boost/spirit/include/classic_assign_actor.hpp>
-#include <boost/spirit/include/classic_if.hpp>
-#include <boost/spirit/include/classic_symbols.hpp>
-#include <boost/spirit/include/classic_clear_actor.hpp>
-
-namespace quickbook
-{
-    namespace cl = boost::spirit::classic;
-
-    template <typename Scanner>
-    struct block_grammar::definition
-    {
-        definition(block_grammar const&);
-
-        bool no_eols;
-
-        cl::rule<Scanner>
-                        start_, blocks, block_markup, code, code_line, blank_line,
-                        paragraph, space, blank, comment, headings, h, h1, h2,
-                        h3, h4, h5, h6, hr, blurb, blockquote, admonition,
-                        phrase, list, phrase_end, ordered_list, def_macro,
-                        macro_identifier, table, table_row, variablelist,
-                        varlistentry, varlistterm, varlistitem, table_cell,
-                        preformatted, list_item, begin_section, end_section,
-                        xinclude, include, hard_space, eol, paragraph_end,
-                        template_, template_id, template_formal_arg,
-                        template_body, identifier, dummy_block, import,
-                        inside_paragraph,
-                        element_id, element_id_1_5, element_id_1_6;
-
-        cl::symbols<>   paragraph_end_markups;
-
-        phrase_grammar common;
-
-        cl::rule<Scanner> const&
-        start() const { return start_; }
-    };
-
-    template <typename Scanner>
-    block_grammar::definition<Scanner>::definition(block_grammar const& self)
-        : no_eols(true)
-        , common(self.actions, no_eols)
-    {
-        using detail::var;
-        quickbook::actions& actions = self.actions;
-
-        if (self.skip_initial_spaces)
-        {
-            start_ =
-                *(cl::blank_p | comment) >> blocks >> blank
-                ;
-        }
-        else
-        {
-            start_ =
-                blocks >> blank
-                ;
-        }
-
-        blocks =
-           *(   block_markup
-            |   code
-            |   list                            [actions.list]
-            |   hr                              [actions.hr]
-            |   +eol
-            |   paragraph                       [actions.inside_paragraph]
-            )
-            ;
-
-        space =
-            *(cl::space_p | comment)
-            ;
-
-        blank =
-            *(cl::blank_p | comment)
-            ;
-
-        eol = blank >> cl::eol_p
-            ;
-
-        phrase_end =
-            ']' |
-            cl::if_p(var(no_eols))
-            [
-                eol >> *cl::blank_p >> cl::eol_p
-                                                // Make sure that we don't go
-            ]                                   // past a single block, except
-            ;                                   // when preformatted.
-
-        // Follows after an alphanumeric identifier - ensures that it doesn't
-        // match an empty space in the middle of the identifier.
-        hard_space =
-            (cl::eps_p - (cl::alnum_p | '_')) >> space  // must not be preceded by
-            ;                                   // alpha-numeric or underscore
-
-        comment =
-            "[/" >> *(dummy_block | (cl::anychar_p - ']')) >> ']'
-            ;
-
-        dummy_block =
-            '[' >> *(dummy_block | (cl::anychar_p - ']')) >> ']'
-            ;
-
-        hr =
-            cl::str_p("----")
-            >> *(cl::anychar_p - eol)
-            >> +eol
-            ;
-
-        block_markup =
-                '[' >> space
-            >>  (   begin_section
-                |   end_section
-                |   headings
-                |   blurb
-                |   blockquote
-                |   admonition
-                |   preformatted
-                |   def_macro
-                |   table
-                |   variablelist
-                |   xinclude
-                |   include
-                |   import
-                |   template_
-                )
-            >>  (   (space >> ']' >> +eol)
-                |   cl::eps_p                   [actions.error]
-                )
-            ;
-        
-        element_id =
-                ':'
-            >>
-                (
-                    cl::if_p(qbk_since(105u))   [space]
-                >>  (+(cl::alnum_p | '_'))      [cl::assign_a(actions.element_id)]
-                |   cl::eps_p                   [actions.element_id_warning]
-                                                [cl::assign_a(actions.element_id)]
-                )
-            | cl::eps_p                         [cl::assign_a(actions.element_id)]
-            ;
-        
-        element_id_1_5 =
-                cl::if_p(qbk_since(105u)) [
-                    element_id
-                ]
-                .else_p [
-                    cl::eps_p                   [cl::assign_a(actions.element_id)]
-                ]
-                ;
-
-        element_id_1_6 =
-                cl::if_p(qbk_since(106u)) [
-                    element_id
-                ]
-                .else_p [
-                    cl::eps_p                   [cl::assign_a(actions.element_id)]
-                ]
-                ;
-
-        begin_section =
-               "section"
-            >> hard_space
-            >> element_id
-            >> space
-            >> phrase                           [actions.begin_section]
-            ;
-
-        end_section =
-            cl::str_p("endsect")                [actions.end_section]
-            ;
-
-        headings =
-            h1 | h2 | h3 | h4 | h5 | h6 | h
-            ;
-
-        h = "heading" >> hard_space >> element_id_1_6 >> space >> phrase   [actions.h];
-        h1 = "h1" >> hard_space >> element_id_1_6 >> space >> phrase       [actions.h1];
-        h2 = "h2" >> hard_space >> element_id_1_6 >> space >> phrase       [actions.h2];
-        h3 = "h3" >> hard_space >> element_id_1_6 >> space >> phrase       [actions.h3];
-        h4 = "h4" >> hard_space >> element_id_1_6 >> space >> phrase       [actions.h4];
-        h5 = "h5" >> hard_space >> element_id_1_6 >> space >> phrase       [actions.h5];
-        h6 = "h6" >> hard_space >> element_id_1_6 >> space >> phrase       [actions.h6];
-
-        static const bool true_ = true;
-        static const bool false_ = false;
-
-        inside_paragraph =
-            phrase                              [actions.inside_paragraph]
-            >> *(
-                +eol >> phrase                  [actions.inside_paragraph]
-            )
-            ;
-
-        blurb =
-            "blurb" >> hard_space
-            >> scoped_block(actions)[inside_paragraph]
-                                                [actions.blurb]
-            ;
-
-        blockquote =
-            ':' >> blank >>
-            scoped_block(actions)[inside_paragraph]
-                                                [actions.blockquote]
-            ;
-
-        admonition =
-            "warning" >> hard_space >>
-            scoped_block(actions)[inside_paragraph]
-                                                [actions.warning]
-            |
-            "caution" >> hard_space >>
-            scoped_block(actions)[inside_paragraph]
-                                                [actions.caution]
-            |
-            "important" >> hard_space >>
-            scoped_block(actions)[inside_paragraph]
-                                                [actions.important]
-            |
-            "note" >> hard_space >>
-            scoped_block(actions)[inside_paragraph]
-                                                [actions.note]
-            |
-            "tip" >> hard_space >>
-            scoped_block(actions)[inside_paragraph]
-                                                [actions.tip]
-            ;
-
-        preformatted =
-            "pre" >> hard_space                 [cl::assign_a(no_eols, false_)]
-            >> !eol >> phrase                   [actions.preformatted]
-            >> cl::eps_p                        [cl::assign_a(no_eols, true_)]
-            ;
-
-        macro_identifier =
-            +(cl::anychar_p - (cl::space_p | ']'))
-            ;
-
-        def_macro =
-            "def" >> hard_space
-            >> macro_identifier                 [actions.macro_identifier]
-            >> blank >> phrase                  [actions.macro_definition]
-            ;
-
-        identifier =
-            (cl::alpha_p | '_') >> *(cl::alnum_p | '_')
-            ;
-
-        template_id =
-            identifier | (cl::punct_p - (cl::ch_p('[') | ']'))
-            ;
-
-        template_ =
-            "template"
-            >> hard_space
-            >> template_id                      [cl::assign_a(actions.template_identifier)]
-                                                [cl::clear_a(actions.template_info)]
-            >>
-            !(
-                space >> '['
-                >> *(
-                        space >> template_id    [cl::push_back_a(actions.template_info)]
-                    )
-                >> space >> ']'
-            )
-            >>  (   cl::eps_p(*cl::blank_p >> cl::eol_p)
-                                                [cl::assign_a(actions.template_block, true_)]
-                |   cl::eps_p                   [cl::assign_a(actions.template_block, false_)]
-                )
-            >>  template_body                   [actions.template_body]
-            ;
-
-        template_body =
-           *(('[' >> template_body >> ']') | (cl::anychar_p - ']'))
-            >> cl::eps_p(space >> ']')
-            >> space
-            ;
-
-        variablelist =
-            "variablelist"
-            >>  (cl::eps_p(*cl::blank_p >> cl::eol_p) | hard_space)
-            >>  (*(cl::anychar_p - eol))        [cl::assign_a(actions.table_title)]
-            >>  +eol
-            >>  *varlistentry
-            >>  cl::eps_p                       [actions.variablelist]
-            ;
-
-        varlistentry =
-            space
-            >>  cl::ch_p('[')                   [actions.start_varlistentry]
-            >>
-            (
-                (
-                    varlistterm
-                    >>  (   scoped_block(actions) [+varlistitem]
-                                                [actions.varlistitem]
-                        |   cl::eps_p           [actions.error]
-                        )
-                    >>  cl::ch_p(']')           [actions.end_varlistentry]
-                    >>  space
-                )
-                | cl::eps_p                     [actions.error]
-            )
-            ;
-
-        varlistterm =
-            space
-            >>  cl::ch_p('[')                   [actions.start_varlistterm]
-            >>
-            (
-                (
-                    phrase
-                    >>  cl::ch_p(']')           [actions.end_varlistterm]
-                    >>  space
-                )
-                | cl::eps_p                     [actions.error]
-            )
-            ;
-
-        varlistitem =
-            space
-            >>  cl::ch_p('[')
-            >>
-            (
-                (
-                    inside_paragraph
-                    >>  cl::ch_p(']')
-                    >>  space
-                )
-                | cl::eps_p                     [actions.error]
-            )
-            ;
-
-        table =
-            "table"
-            >>  (cl::eps_p(*cl::blank_p >> cl::eol_p) | hard_space)
-            >> element_id_1_5
-            >>  (cl::eps_p(*cl::blank_p >> cl::eol_p) | space)
-            >>  (*(cl::anychar_p - eol))        [cl::assign_a(actions.table_title)]
-            >>  +eol
-            >>  *table_row
-            >>  cl::eps_p                       [actions.table]
-            ;
-
-        table_row =
-            space
-            >>  cl::ch_p('[')                   [actions.start_row]
-            >>
-            (
-                (
-                    *table_cell
-                    >>  cl::ch_p(']')           [actions.end_row]
-                    >>  space
-                )
-                | cl::eps_p                     [actions.error]
-            )
-            ;
-
-        table_cell =
-                space
-            >>  cl::ch_p('[')
-            >>  (   scoped_block(actions) [
-                        inside_paragraph
-                    >>  cl::ch_p(']')
-                    >>  space
-                    ]                           [actions.cell]
-                | cl::eps_p                     [actions.error]
-                )
-            ;
-
-        xinclude =
-               "xinclude"
-            >> hard_space
-            >> (*(cl::anychar_p -
-                    phrase_end))                [actions.xinclude]
-            ;
-
-        import =
-               "import"
-            >> hard_space
-            >> (*(cl::anychar_p -
-                    phrase_end))                [actions.import]
-            ;
-
-        include =
-               "include"
-            >> hard_space
-            >>
-           !(
-                ':'
-                >> (*((cl::alnum_p | '_') - cl::space_p))
-                                                [cl::assign_a(actions.include_doc_id)]
-                >> space
-            )
-            >> (*(cl::anychar_p -
-                    phrase_end))                [actions.include]
-            ;
-
-        code =
-            (
-                code_line
-                >> *(*blank_line >> code_line)
-            )                                   [actions.code]
-            >> *eol
-            ;
-
-        code_line =
-            cl::blank_p >> *(cl::anychar_p - cl::eol_p) >> cl::eol_p
-            ;
-
-        blank_line =
-            *cl::blank_p >> cl::eol_p
-            ;
-
-        list =
-            cl::eps_p(cl::ch_p('*') | '#') >>
-           +(
-                (*cl::blank_p
-                >> (cl::ch_p('*') | '#'))       [actions.list_format]
-                >> *cl::blank_p
-                >> list_item
-            )                                   [actions.list_item]
-            ;
-
-        list_item =
-           *(   common
-            |   (cl::anychar_p -
-                    (   cl::eol_p >> *cl::blank_p >> cl::eps_p(cl::ch_p('*') | '#')
-                    |   (eol >> eol)
-                    )
-                )                               [actions.plain_char]
-            )
-            >> +eol
-            ;
-
-        paragraph_end_markups =
-            "section", "endsect", "h1", "h2", "h3", "h4", "h5", "h6",
-            "blurb", ":", "pre", "def", "table", "include", "xinclude",
-            "variablelist", "import", "template", "warning", "caution",
-            "important", "note", "tip", ":"
-            ;
-
-        paragraph_end =
-            '[' >> space >> paragraph_end_markups >> hard_space | eol >> *cl::blank_p >> cl::eol_p
-            ;
-
-        paragraph =
-           +(   common
-            |   (cl::anychar_p -                // Make sure we don't go past
-                    paragraph_end               // a single block.
-                )                               [actions.plain_char]
-            )
-            >> (cl::eps_p('[') | +eol)
-            ;
-
-        phrase =
-           *(   common
-            |   comment
-            |   (cl::anychar_p -
-                    phrase_end)                 [actions.plain_char]
-            )
-            ;
-    }
-
-    cl::parse_info<iterator> call_parse(
-        iterator& first, iterator last, block_grammar& g)
-    {
-        return boost::spirit::classic::parse(first, last, g);
-    }
-}
Modified: branches/release/tools/quickbook/src/doc_info_actions.cpp
==============================================================================
--- branches/release/tools/quickbook/src/doc_info_actions.cpp	(original)
+++ branches/release/tools/quickbook/src/doc_info_actions.cpp	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
@@ -77,7 +77,7 @@
             qbk_major_version = 1;
             qbk_minor_version = 1;
             qbk_version_n = 101;
-            detail::outwarn(actions.filename.file_string(),1)
+            detail::outwarn(actions.filename.native(),1)
                 << "Warning: Quickbook version undefined. "
                 "Version 1.1 is assumed" << std::endl;
         }
@@ -89,13 +89,13 @@
         
         if (qbk_version_n == 106)
         {
-            detail::outwarn(actions.filename.file_string(),1)
+            detail::outwarn(actions.filename.native(),1)
                 << "Quickbook 1.6 is still under development and is "
                 "likely to change in the future." << std::endl;
         }
         else if(qbk_version_n < 100 || qbk_version_n > 106)
         {
-            detail::outerr(actions.filename.file_string(),1)
+            detail::outerr(actions.filename.native(),1)
                 << "Unknown version of quickbook: quickbook "
                 << qbk_major_version
                 << "."
@@ -121,7 +121,7 @@
 
             if(!invalid_attributes.empty())
             {
-                detail::outwarn(actions.filename.file_string(),1)
+                detail::outwarn(actions.filename.native(),1)
                     << (invalid_attributes.size() > 1 ?
                         "Invalid attributes" : "Invalid attribute")
                     << " for '" << actions.doc_type << " document info': "
@@ -143,6 +143,13 @@
             << actions.doc_id
             << "\"\n";
         
+        if(!actions.doc_lang.empty())
+        {
+            out << "    lang=\""
+                << actions.doc_lang.get(106)
+                << "\"\n";
+        }
+
         if(actions.doc_type == "library")
         {
             out << "    name=\"" << actions.doc_title.get(106) << "\"\n";
Modified: branches/release/tools/quickbook/src/doc_info_grammar.cpp
==============================================================================
--- branches/release/tools/quickbook/src/doc_info_grammar.cpp	(original)
+++ branches/release/tools/quickbook/src/doc_info_grammar.cpp	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
@@ -8,7 +8,7 @@
     http://www.boost.org/LICENSE_1_0.txt)
 =============================================================================*/
 
-#include "phrase_grammar.hpp"
+#include "grammar_impl.hpp"
 #include "actions_class.hpp"
 #include <boost/spirit/include/classic_core.hpp>
 #include <boost/spirit/include/classic_actor.hpp>
@@ -20,74 +20,65 @@
 {
     namespace cl = boost::spirit::classic;
 
-    template <typename Scanner>
-    struct doc_info_grammar::definition
+    struct doc_info_grammar_local
     {
-        definition(doc_info_grammar const&);
-
-        typedef cl::uint_parser<int, 10, 1, 2>  uint2_t;
-
-        bool unused;
-        std::string category;
-        cl::rule<Scanner>
-                        doc_info, doc_title, doc_version, doc_id, doc_dirname,
+        cl::rule<scanner>
+                        doc_title, doc_version, doc_id, doc_dirname,
                         doc_copyright, doc_purpose, doc_category, doc_authors,
-                        doc_author, space, hard_space, doc_license,
-                        doc_last_revision, doc_source_mode, doc_biblioid,
-                        phrase, quickbook_version, char_, comment, dummy_block;
-        phrase_grammar common;
+                        doc_author, doc_license,
+                        doc_last_revision, doc_source_mode, doc_biblioid, doc_lang,
+                        quickbook_version, char_;
         cl::symbols<> doc_types;
-
-        cl::rule<Scanner> const&
-        start() const { return doc_info; }
     };
 
-    template <typename Scanner>
-    doc_info_grammar::definition<Scanner>::definition(doc_info_grammar const& self)
-        : unused(false), common(self.actions, unused)
+    void quickbook_grammar::impl::init_doc_info()
     {
-        quickbook::actions& actions = self.actions;
+        doc_info_grammar_local& local = store_.create();
 
-        doc_types =
+        typedef cl::uint_parser<int, 10, 1, 2>  uint2_t;
+
+        local.doc_types =
             "book", "article", "library", "chapter", "part"
           , "appendix", "preface", "qandadiv", "qandaset"
           , "reference", "set"
         ;
         
-        doc_info =
+        doc_info_details =
             space
             >> '[' >> space
-            >> (doc_types >> cl::eps_p)     [cl::assign_a(actions.doc_type)]
+            >> (local.doc_types >> cl::eps_p)
+                                            [cl::assign_a(actions.doc_type)]
             >> hard_space
-            >>  (  *(~cl::eps_p(cl::ch_p('[') | ']' | cl::eol_p) >> char_)
+            >>  (  *(~cl::eps_p(cl::ch_p('[') | ']' | cl::eol_p) >> local.char_)
                 )                           [actions.extract_doc_title]
             >>  !(
                     space >> '[' >>
-                        quickbook_version
+                        local.quickbook_version
                     >> space >> ']'
                 )
             >>
                 *(
                     space >> '[' >>
                     (
-                      doc_version
-                    | doc_id
-                    | doc_dirname
-                    | doc_copyright         [cl::push_back_a(actions.doc_copyrights, actions.copyright)]
-                    | doc_purpose
-                    | doc_category
-                    | doc_authors
-                    | doc_license
-                    | doc_last_revision
-                    | doc_source_mode
-                    | doc_biblioid
+                      local.doc_version
+                    | local.doc_id
+                    | local.doc_dirname
+                    | local.doc_copyright   [cl::push_back_a(actions.doc_copyrights, actions.copyright)]
+                    | local.doc_purpose
+                    | local.doc_category
+                    | local.doc_authors
+                    | local.doc_license
+                    | local.doc_last_revision
+                    | local.doc_source_mode
+                    | local.doc_biblioid
+                    | local.doc_lang
                     )
                     >> space >> ']' >> +cl::eol_p
                 )
             >> space >> ']' >> +cl::eol_p
             ;
 
-        quickbook_version =
+        local.quickbook_version =
                 "quickbook" >> hard_space
             >>  (   cl::uint_p              [cl::assign_a(qbk_major_version)]
                     >> '.' 
@@ -95,82 +86,83 @@
                 )
             ;
 
-        doc_version =
+        local.doc_version =
                 "version" >> hard_space
-            >> (*(~cl::eps_p(']') >> char_))
+            >> (*(~cl::eps_p(']') >> local.char_))
                                             [actions.extract_doc_version]
             ;
 
         // TODO: Restrictions on doc_id?
-        doc_id =
+        local.doc_id =
                 "id" >> hard_space
-            >> (*(~cl::eps_p(']') >> char_))
+            >> (*(~cl::eps_p(']') >> local.char_))
                                             [actions.extract_doc_id]
             ;
 
         // TODO: Restrictions on doc_dirname?
-        doc_dirname =
+        local.doc_dirname =
                 "dirname" >> hard_space
-            >> (*(~cl::eps_p(']') >> char_))
+            >> (*(~cl::eps_p(']') >> local.char_))
                                             [actions.extract_doc_dirname]
             ;
 
-        doc_copyright =
-                "copyright" >> hard_space   [cl::clear_a(actions.copyright.first)]
+        local.doc_copyright =
+                "copyright"
+            >> hard_space                   [cl::clear_a(actions.copyright.first)]
             >> +( cl::repeat_p(4)[cl::digit_p]
                                             [cl::push_back_a(actions.copyright.first)]
                   >> space
                 )
             >> space
-            >> (*(~cl::eps_p(']') >> char_))
+            >> (*(~cl::eps_p(']') >> local.char_))
                                             [actions.extract_copyright_second]
             ;
 
-        doc_purpose =
+        local.doc_purpose =
                 "purpose" >> hard_space
-            >> phrase                       [actions.extract_doc_purpose]
+            >> simple_phrase                [actions.extract_doc_purpose]
             ;
 
-        doc_category =
+        local.doc_category =
                 "category" >> hard_space
-            >> (*(~cl::eps_p(']') >> char_))
+            >> (*(~cl::eps_p(']') >> local.char_))
                                             [actions.extract_doc_category]
                                             [cl::push_back_a(actions.doc_categories, actions.doc_category)]
             ;
 
-        doc_author =
+        local.doc_author =
                 '[' >> space
-            >>  (*(~cl::eps_p(',') >> char_))
+            >>  (*(~cl::eps_p(',') >> local.char_))
                                             [actions.extract_name_second]
             >>  ',' >> space
-            >>  (*(~cl::eps_p(']') >> char_))
+            >>  (*(~cl::eps_p(']') >> local.char_))
                                             [actions.extract_name_first]
             >>  ']'
             ;
 
-        doc_authors =
+        local.doc_authors =
                 "authors"
             >>  hard_space
-            >>  doc_author                  [cl::push_back_a(actions.doc_authors, actions.name)]
+            >>  local.doc_author            [cl::push_back_a(actions.doc_authors, actions.name)]
             >>  space
             >>  *(  !(cl::ch_p(',') >> space)
-                >>  doc_author              [cl::push_back_a(actions.doc_authors, actions.name)]
+                >>  local.doc_author        [cl::push_back_a(actions.doc_authors, actions.name)]
                 >>  space
                 )
             ;
 
-        doc_license =
+        local.doc_license =
                 "license" >> hard_space
-            >> phrase                       [actions.extract_doc_license]
+            >> simple_phrase                [actions.extract_doc_license]
             ;
 
-        doc_last_revision =
+        local.doc_last_revision =
                 "last-revision" >> hard_space
-            >> (*(~cl::eps_p(']') >> char_))
+            >> (*(~cl::eps_p(']') >> local.char_))
                                             [actions.extract_doc_last_revision]
             ;
 
-        doc_source_mode =
+        local.doc_source_mode =
                 "source-mode" >> hard_space
             >>  (
                    cl::str_p("c++") 
@@ -179,40 +171,23 @@
                 )                           [cl::assign_a(actions.source_mode)]
             ;
 
-        doc_biblioid =
+        local.doc_biblioid =
                 "biblioid"
             >>  hard_space
             >>  (+cl::alnum_p)              [cl::assign_a(actions.doc_biblioid.first)]
             >>  hard_space
-            >>  (+(~cl::eps_p(']') >> char_))
+            >>  (+(~cl::eps_p(']') >> local.char_))
                                             [actions.extract_doc_biblioid]
                                             [cl::push_back_a(actions.doc_biblioid_items, actions.doc_biblioid)]
             ;
 
-        comment =
-            "[/" >> *(dummy_block | (cl::anychar_p - ']')) >> ']'
-            ;
-
-        dummy_block =
-            '[' >> *(dummy_block | (cl::anychar_p - ']')) >> ']'
+        local.doc_lang =
+                "lang" >> hard_space
+            >> (*(~cl::eps_p(']') >> local.char_))
+                                            [actions.extract_doc_lang]
             ;
 
-        space =
-            *(cl::space_p | comment)
-            ;
-
-        hard_space =
-            (cl::eps_p - (cl::alnum_p | '_')) >> space  // must not be preceded by
-            ;                                   // alpha-numeric or underscore
-
-        phrase =
-           *(   common
-            |   comment
-            |   (cl::anychar_p - ']')       [actions.plain_char]
-            )
-            ;
-
-        char_ =
+        local.char_ =
                 cl::str_p("\\n")            [actions.break_]
             |   "\\ "                       // ignore an escaped space
             |   '\\' >> cl::punct_p         [actions.raw_char]
@@ -230,10 +205,4 @@
             |   cl::anychar_p               [actions.plain_char]
             ;
     }
-
-    cl::parse_info<iterator> call_parse(
-        iterator& first, iterator last, doc_info_grammar& g)
-    {
-        return boost::spirit::classic::parse(first, last, g);
-    }
 }
Modified: branches/release/tools/quickbook/src/fwd.hpp
==============================================================================
--- branches/release/tools/quickbook/src/fwd.hpp	(original)
+++ branches/release/tools/quickbook/src/fwd.hpp	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
@@ -18,10 +18,11 @@
 namespace quickbook
 {
     struct actions;
+    struct quickbook_grammar;
 
     typedef boost::spirit::classic::file_position_base<char const*> position;
     typedef boost::spirit::classic::position_iterator<
         std::string::const_iterator, position> iterator;
 }
 
-#endif
\ No newline at end of file
+#endif
Copied: branches/release/tools/quickbook/src/grammar.cpp (from r67335, /trunk/tools/quickbook/src/grammar.cpp)
==============================================================================
--- /trunk/tools/quickbook/src/grammar.cpp	(original)
+++ branches/release/tools/quickbook/src/grammar.cpp	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
@@ -30,12 +30,11 @@
 
     quickbook_grammar::impl::impl(quickbook::actions& a)
         : actions(a)
-        , no_eols(true)
         , store_()
     {
         init_main();
-        init_block_markup();
-        init_phrase_markup();
+        init_block_elements();
+        init_phrase_elements();
         init_doc_info();
     }
 }
Modified: branches/release/tools/quickbook/src/grammar.hpp
==============================================================================
--- branches/release/tools/quickbook/src/grammar.hpp	(original)
+++ branches/release/tools/quickbook/src/grammar.hpp	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
@@ -17,77 +17,52 @@
 {
     namespace cl = boost::spirit::classic;
 
-    struct doc_info_grammar
-    : public cl::grammar<doc_info_grammar>
-    {
-        doc_info_grammar(quickbook::actions& actions)
-            : actions(actions) {}
-
-        template <typename Scanner>
-        struct definition;
+    // The spirit scanner for explicitly instantiating grammars. This is a
+    // spirit implementation detail, but since classic is no longer under
+    // development, it won't change. And spirit 2 won't require such a hack.
 
-        quickbook::actions& actions;
-    };
+    typedef cl::scanner<iterator, cl::scanner_policies <
+        cl::iteration_policy, cl::match_policy, cl::action_policy> > scanner;
 
-    struct block_grammar : cl::grammar<block_grammar>
+    struct grammar
+        : public cl::grammar<grammar>
     {
-        block_grammar(quickbook::actions& actions_, bool skip_initial_spaces = false)
-            : actions(actions_), skip_initial_spaces(skip_initial_spaces) { }
+        grammar(cl::rule<scanner> const& start_rule, char const* /* name */)
+            : start_rule(start_rule) {}
 
         template <typename Scanner>
-        struct definition;
-
-        quickbook::actions& actions;
-        bool const skip_initial_spaces;
-    };
-
-    struct phrase_grammar
-        : cl::grammar<phrase_grammar>
-    {
-        phrase_grammar(quickbook::actions& actions, bool& no_eols)
-            : no_eols(no_eols), actions(actions) {}
+        struct definition {
+            // TODO: Statically assert that Scanner == scanner.
+        
+            definition(grammar const& self) : start_rule(self.start_rule) {}
+            
+            cl::rule<Scanner> const& start() const { return start_rule; }
 
-        template <typename Scanner>
-        struct definition;
+            cl::rule<Scanner> const& start_rule;
+        };
 
-        bool& no_eols;
-        quickbook::actions& actions;
+        cl::rule<scanner> const& start_rule;
     };
 
-    struct simple_phrase_grammar
-        : public cl::grammar<simple_phrase_grammar >
+    class quickbook_grammar
     {
-        simple_phrase_grammar(quickbook::actions& actions)
-            : actions(actions) {}
-
-        template <typename Scanner>
-        struct definition;
-
-        quickbook::actions& actions;
-    };
+    public:
+        struct impl;
 
-    struct command_line_grammar
-        : public cl::grammar<command_line_grammar>
-    {
-        command_line_grammar(quickbook::actions& actions)
-            : actions(actions) {}
+    private:
+        boost::scoped_ptr<impl> impl_;
 
-        template <typename Scanner>
-        struct definition;
+    public:
+        grammar command_line_macro;
+        grammar common;
+        grammar simple_phrase;
+        grammar block;
+        grammar block_skip_initial_spaces;
+        grammar doc_info;
 
-        quickbook::actions& actions;
+        quickbook_grammar(quickbook::actions&);
+        ~quickbook_grammar();
     };
-
-    cl::parse_info<iterator> call_parse(
-        iterator&, iterator, doc_info_grammar&);
-    cl::parse_info<iterator> call_parse(
-        iterator&, iterator, block_grammar&);
-    cl::parse_info<iterator> call_parse(
-        iterator&, iterator, phrase_grammar&);
-    cl::parse_info<iterator> call_parse(
-        iterator&, iterator, simple_phrase_grammar&);
-    cl::parse_info<iterator> call_parse(
-        iterator&, iterator, command_line_grammar&);
 }
 
 #endif
Copied: branches/release/tools/quickbook/src/grammar_impl.hpp (from r67335, /trunk/tools/quickbook/src/grammar_impl.hpp)
==============================================================================
--- /trunk/tools/quickbook/src/grammar_impl.hpp	(original)
+++ branches/release/tools/quickbook/src/grammar_impl.hpp	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
@@ -22,7 +22,6 @@
     struct quickbook_grammar::impl
     {
         quickbook::actions& actions;
-        bool no_eols;
         rule_store store_;
 
         // Main Grammar
@@ -31,6 +30,7 @@
         cl::rule<scanner> common;
         cl::rule<scanner> simple_phrase;
         cl::rule<scanner> phrase;
+        cl::rule<scanner> extended_phrase;
         cl::rule<scanner> inside_paragraph;
         cl::rule<scanner> command_line;
 
@@ -50,6 +50,8 @@
         cl::symbols<cl::rule<scanner>*> block_keyword_rules;
         cl::symbols<cl::rule<scanner>*> block_symbol_rules;
         
+        cl::symbols<cl::rule<scanner>*> extended_phrase_keyword_rules;
+        
         // Doc Info
         cl::rule<scanner> doc_info_details;
         
@@ -58,8 +60,8 @@
     private:
 
         void init_main();
-        void init_block_markup();
-        void init_phrase_markup();
+        void init_block_elements();
+        void init_phrase_elements();
         void init_doc_info();
     };
 }
Modified: branches/release/tools/quickbook/src/input_path.cpp
==============================================================================
--- branches/release/tools/quickbook/src/input_path.cpp	(original)
+++ branches/release/tools/quickbook/src/input_path.cpp	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
@@ -26,42 +26,11 @@
     }
 }}
 
-#elif defined(QUICKBOOK_CYGWIN_1_5)
-
-// Cygwin 1.5.x
-
-#include <boost/filesystem/v2/config.hpp>
-#include <windows.h>
-#include <sys/cygwin.h>
-
-namespace quickbook { namespace detail
-{
-    void validate(boost::any& v,
-            const std::vector<std::string>& values,
-            input_path*, int)
-    {
-        std::string path
-            = boost::program_options::validators::get_single_string(values);
-
-        char result[MAX_PATH + 1];
-
-#if defined(BOOST_WINDOWS_PATH)
-        cygwin_conv_to_win32_path(path.c_str(), result);
-#elif defined(BOOST_POSIX_PATH)
-        cygwin_conv_to_posix_path(path.c_str(), result);
-#else
-#    error "Boost filesystem path type doesn't seem to be set."
-#endif
-
-        v = input_path(result);
-    }
-}}
-
 #else
 
 // Cygwin 1.7.x
     
-#include <boost/filesystem/v2/config.hpp>
+#include <boost/filesystem/v3/config.hpp>
 #include <boost/scoped_array.hpp>
 #include <boost/program_options/errors.hpp>
 #include <windows.h>
Copied: branches/release/tools/quickbook/src/main_grammar.cpp (from r67335, /trunk/tools/quickbook/src/main_grammar.cpp)
==============================================================================
--- /trunk/tools/quickbook/src/main_grammar.cpp	(original)
+++ branches/release/tools/quickbook/src/main_grammar.cpp	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
@@ -11,7 +11,6 @@
 #include "grammar_impl.hpp"
 #include "actions_class.hpp"
 #include "utils.hpp"
-#include "scoped_block.hpp"
 #include <boost/spirit/include/classic_core.hpp>
 #include <boost/spirit/include/classic_confix.hpp>
 #include <boost/spirit/include/classic_chset.hpp>
@@ -61,10 +60,10 @@
     {
         cl::rule<scanner>
                         top_level, blocks, paragraph_separator,
-                        block_markup, block_markup_start,
+                        block_element, block_element_start,
                         code, code_line, blank_line, hr,
                         list, ordered_list, list_item,
-                        phrase_markup,
+                        phrase_element, extended_phrase_element,
                         simple_phrase_end,
                         escape,
                         inline_code, simple_format,
@@ -101,7 +100,7 @@
         local.top_level
             =   local.blocks
             >>  *(
-                    local.block_markup >> local.blocks
+                    local.block_element >> !(+eol >> local.blocks)
                 |   local.paragraph_separator >> local.blocks
                 |   common
                 |   cl::space_p                 [actions.space_char]
@@ -128,17 +127,17 @@
             >> +eol
             ;
 
-        local.block_markup
-            =   local.block_markup_start        [actions.inside_paragraph]
+        local.block_element
+            =   local.block_element_start       [actions.inside_paragraph]
             >>  (   local.block_keyword_rule
-                >>  (   (space >> ']' >> +eol)
+                >>  (   (space >> ']')
                     |   cl::eps_p               [actions.error]
                     )
                 |   cl::eps_p                   [actions.error]
                 )
             ;
 
-        local.block_markup_start
+        local.block_element_start
             =   '[' >> space
             >>  (   block_keyword_rules         [detail::assign_rule(local.block_keyword_rule)]
                 >>  (cl::eps_p - (cl::alnum_p | '_'))
@@ -185,7 +184,7 @@
 
         common =
                 local.macro
-            |   local.phrase_markup
+            |   local.phrase_element
             |   local.code_block
             |   local.inline_code
             |   local.simple_format
@@ -328,6 +327,13 @@
             )
             ;
 
+        extended_phrase =
+           *(   local.extended_phrase_element
+            |   common
+            |   (cl::anychar_p - phrase_end)    [actions.plain_char]
+            )
+            ;
+
         inside_paragraph =
             (*( common
             |   (cl::anychar_p - phrase_end)    [actions.plain_char]
@@ -335,8 +341,9 @@
             ))                                  [actions.inside_paragraph]
             ;
 
-        local.phrase_markup
+        local.phrase_element
             =   '['
+            >>  space
             >>  (   phrase_keyword_rules        [detail::assign_rule(local.phrase_keyword_rule)]
                 >>  (cl::eps_p - (cl::alnum_p | '_'))
                 >>  local.phrase_keyword_rule
@@ -348,6 +355,20 @@
             >>  ']'
             ;
 
+        local.extended_phrase_element
+            =   '['
+            >>  space
+            >>  extended_phrase_keyword_rules   [detail::assign_rule(local.block_keyword_rule)]
+            >>  (cl::eps_p - (cl::alnum_p | '_'))
+                                                [actions.inside_paragraph]
+            >>  (   local.block_keyword_rule
+                >>  (   (space >> ']')
+                    |   cl::eps_p               [actions.error]
+                    )
+                |   cl::eps_p                   [actions.error]
+                )
+            ;
+
         local.escape =
                 cl::str_p("\\n")                [actions.break_]
             |   cl::str_p("\\ ")                // ignore an escaped space
@@ -423,7 +444,7 @@
 
         phrase_end =
             ']' |
-            cl::if_p(var(no_eols))
+            cl::if_p(var(actions.no_eols))
             [
                 cl::eol_p >> *cl::blank_p >> cl::eol_p
                                                 // Make sure that we don't go
Deleted: branches/release/tools/quickbook/src/phrase_grammar.cpp
==============================================================================
--- branches/release/tools/quickbook/src/phrase_grammar.cpp	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
+++ (empty file)
@@ -1,103 +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)
-=============================================================================*/
-
-#include "phrase_grammar.hpp"
-
-namespace quickbook
-{
-    template <typename Scanner>
-    struct simple_phrase_grammar::definition
-    {
-        definition(simple_phrase_grammar const& self)
-            : unused(false), common(self.actions, unused)
-        {
-            quickbook::actions& actions = self.actions;
-
-            phrase =
-               *(   common
-                |   comment
-                |   (cl::anychar_p - ']')       [actions.plain_char]
-                )
-                ;
-
-            comment =
-                "[/" >> *(dummy_block | (cl::anychar_p - ']')) >> ']'
-                ;
-
-            dummy_block =
-                '[' >> *(dummy_block | (cl::anychar_p - ']')) >> ']'
-                ;
-        }
-
-        bool unused;
-        cl::rule<Scanner> phrase, comment, dummy_block;
-        phrase_grammar common;
-
-        cl::rule<Scanner> const&
-        start() const { return phrase; }
-    };
-
-    template <typename Scanner>
-    struct command_line_grammar::definition
-    {
-        definition(command_line_grammar const& self)
-            : unused(false), common(self.actions, unused)
-        {
-            quickbook::actions& actions = self.actions;
-
-            macro =
-                    *cl::space_p
-                >>  macro_identifier            [actions.macro_identifier]
-                >>  *cl::space_p
-                >>  (   '='
-                    >>  *cl::space_p
-                    >>  phrase                  [actions.macro_definition]
-                    >>  *cl::space_p
-                    )
-                |   cl::eps_p                   [actions.macro_definition]
-                ;
-
-            macro_identifier =
-                +(cl::anychar_p - (cl::space_p | ']' | '='))
-                ;
-
-            phrase =
-               *(   common
-                |   (cl::anychar_p - ']')       [actions.plain_char]
-                )
-                ;
-        }
-
-        bool unused;
-        cl::rule<Scanner> macro, macro_identifier, phrase;
-        phrase_grammar common;
-
-        cl::rule<Scanner> const&
-        start() const { return macro; }
-    };
-
-    cl::parse_info<iterator> call_parse(
-        iterator& first, iterator last, phrase_grammar& g)
-    {
-        return boost::spirit::classic::parse(first, last, g);
-    }
-
-    cl::parse_info<iterator> call_parse(
-        iterator& first, iterator last, simple_phrase_grammar& g)
-    {
-        return boost::spirit::classic::parse(first, last, g);
-    }
-
-    cl::parse_info<iterator> call_parse(
-        iterator& first, iterator last, command_line_grammar& g)
-    {
-        return boost::spirit::classic::parse(first, last, g);
-    }
-}
Deleted: branches/release/tools/quickbook/src/phrase_grammar.hpp
==============================================================================
--- branches/release/tools/quickbook/src/phrase_grammar.hpp	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
+++ (empty file)
@@ -1,487 +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_QUICKBOOK_PHRASE_HPP)
-#define BOOST_SPIRIT_QUICKBOOK_PHRASE_HPP
-
-#include "grammar.hpp"
-#include "actions_class.hpp"
-#include "utils.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_assign_actor.hpp>
-#include <boost/spirit/include/classic_clear_actor.hpp>
-#include <boost/spirit/include/classic_if.hpp>
-#include <boost/spirit/include/classic_loops.hpp>
-
-namespace quickbook
-{
-    namespace cl = boost::spirit::classic;
-
-    template <typename Rule, typename Action>
-    inline void
-    simple_markup(
-        Rule& simple
-      , char mark
-      , Action const& action
-      , Rule const& close
-    )
-    {
-        simple =
-            mark >>
-            (
-                (
-                    cl::graph_p                 // A single char. e.g. *c*
-                    >> cl::eps_p(mark
-                        >> (cl::space_p | cl::punct_p | cl::end_p))
-                                                // space_p, punct_p or end_p
-                )                               // must follow mark
-            |
-                (   cl::graph_p >>              // graph_p must follow mark
-                    *(cl::anychar_p -
-                        (   (cl::graph_p >> mark) // Make sure that we don't go
-                        |   close                 // past a single block
-                        )
-                    ) >> cl::graph_p            // graph_p must precede mark
-                    >> cl::eps_p(mark
-                        >> (cl::space_p | cl::punct_p | cl::end_p))
-                                                // space_p, punct_p or end_p
-                )                               // must follow mark
-            )                                   [action]
-            >> mark
-            ;
-    }
-
-    template <typename Scanner>
-    struct phrase_grammar::definition
-    {
-        definition(phrase_grammar const& self);
-
-        cl::rule<Scanner>
-                        space, blank, comment, phrase, phrase_markup, image,
-                        simple_phrase_end, phrase_end, bold, italic, underline, teletype,
-                        strikethrough, escape, url, common, funcref, classref,
-                        memberref, enumref, macroref, headerref, conceptref, globalref,
-                        anchor, link, hard_space, eol, inline_code, simple_format,
-                        simple_bold, simple_italic, simple_underline,
-                        simple_teletype, source_mode, template_,
-                        quote, code_block, footnote, replaceable, macro,
-                        dummy_block, cond_phrase, macro_identifier, template_args,
-                        template_args_1_4, template_arg_1_4,
-                        template_inner_arg_1_4, brackets_1_4,
-                        template_args_1_5, template_arg_1_5,
-                        template_inner_arg_1_5, brackets_1_5
-                        ;
-
-        cl::rule<Scanner> const&
-        start() const { return common; }
-    };
-
-    template <typename Scanner>
-    phrase_grammar::definition<Scanner>::definition(phrase_grammar const& self)
-    {
-        using detail::var;
-        quickbook::actions& actions = self.actions;
-
-        space =
-            *(cl::space_p | comment)
-            ;
-
-        blank =
-            *(cl::blank_p | comment)
-            ;
-
-        eol = blank >> cl::eol_p
-            ;
-
-        phrase_end =
-            ']' |
-            cl::if_p(var(self.no_eols))
-            [
-                eol >> eol                      // Make sure that we don't go
-            ]                                   // past a single block, except
-            ;                                   // when preformatted.
-
-        // Follows an alphanumeric identifier - ensures that it doesn't
-        // match an empty space in the middle of the identifier.
-        hard_space =
-            (cl::eps_p - (cl::alnum_p | '_')) >> space
-            ;
-
-        comment =
-            "[/" >> *(dummy_block | (cl::anychar_p - ']')) >> ']'
-            ;
-
-        dummy_block =
-            '[' >> *(dummy_block | (cl::anychar_p - ']')) >> ']'
-            ;
-
-        common =
-                macro
-            |   phrase_markup
-            |   code_block
-            |   inline_code
-            |   simple_format
-            |   escape
-            |   comment
-            ;
-
-        macro =
-            // must not be followed by alpha or underscore
-            cl::eps_p(actions.macro
-                >> (cl::eps_p - (cl::alpha_p | '_')))
-            >> actions.macro                    [actions.do_macro]
-            ;
-
-        static const bool true_ = true;
-        static const bool false_ = false;
-
-        template_ =
-            (
-                cl::ch_p('`')                   [cl::assign_a(actions.template_escape,true_)]
-                |
-                cl::eps_p                       [cl::assign_a(actions.template_escape,false_)]
-            )
-            >>
-            ( (
-                (cl::eps_p(cl::punct_p)
-                    >> actions.templates.scope
-                )                               [cl::assign_a(actions.template_identifier)]
-                                                [cl::clear_a(actions.template_args)]
-                >> !template_args
-            ) | (
-                (actions.templates.scope
-                    >> cl::eps_p(hard_space)
-                )                               [cl::assign_a(actions.template_identifier)]
-                                                [cl::clear_a(actions.template_args)]
-                >> space
-                >> !template_args
-            ) )
-            >> cl::eps_p(']')
-            ;
-
-        template_args =
-            cl::if_p(qbk_since(105u)) [
-                template_args_1_5
-            ].else_p [
-                template_args_1_4
-            ]
-            ;
-
-        template_args_1_4 = template_arg_1_4 >> *(".." >> template_arg_1_4);
-
-        template_arg_1_4 =
-                (   cl::eps_p(*cl::blank_p >> cl::eol_p)
-                                                [cl::assign_a(actions.template_block, true_)]
-                |   cl::eps_p                   [cl::assign_a(actions.template_block, false_)]
-                )
-            >>  template_inner_arg_1_4          [actions.template_arg]
-            ;
-
-        template_inner_arg_1_4 =
-            +(brackets_1_4 | (cl::anychar_p - (cl::str_p("..") | ']')))
-            ;
-
-        brackets_1_4 =
-            '[' >> template_inner_arg_1_4 >> ']'
-            ;
-
-        template_args_1_5 = template_arg_1_5 >> *(".." >> template_arg_1_5);
-
-        template_arg_1_5 =
-                (   cl::eps_p(*cl::blank_p >> cl::eol_p)
-                                                [cl::assign_a(actions.template_block, true_)]
-                |   cl::eps_p                   [cl::assign_a(actions.template_block, false_)]
-                )
-            >>  (+(brackets_1_5 | ('\\' >> cl::anychar_p) | (cl::anychar_p - (cl::str_p("..") | '[' | ']'))))
-                                                [actions.template_arg]
-            ;
-
-        template_inner_arg_1_5 =
-            +(brackets_1_5 | ('\\' >> cl::anychar_p) | (cl::anychar_p - (cl::str_p('[') | ']')))
-            ;
-
-        brackets_1_5 =
-            '[' >> template_inner_arg_1_5 >> ']'
-            ;
-
-        inline_code =
-            '`' >>
-            (
-               *(cl::anychar_p -
-                    (   '`'
-                    |   (eol >> eol)            // Make sure that we don't go
-                    )                           // past a single block
-                ) >> cl::eps_p('`')
-            )                                   [actions.inline_code]
-            >>  '`'
-            ;
-
-        code_block =
-                (
-                    "```" >>
-                    (
-                       *(cl::anychar_p - "```")
-                            >> cl::eps_p("```")
-                    )                           [actions.code_block]
-                    >>  "```"
-                )
-            |   (
-                    "``" >>
-                    (
-                       *(cl::anychar_p - "``")
-                            >> cl::eps_p("``")
-                    )                           [actions.code_block]
-                    >>  "``"
-                )
-            ;
-
-        simple_format =
-                simple_bold
-            |   simple_italic
-            |   simple_underline
-            |   simple_teletype
-            ;
-
-        simple_phrase_end = '[' | phrase_end;
-
-        simple_markup(simple_bold,
-            '*', actions.simple_bold, simple_phrase_end);
-        simple_markup(simple_italic,
-            '/', actions.simple_italic, simple_phrase_end);
-        simple_markup(simple_underline,
-            '_', actions.simple_underline, simple_phrase_end);
-        simple_markup(simple_teletype,
-            '=', actions.simple_teletype, simple_phrase_end);
-
-        phrase =
-           *(   common
-            |   comment
-            |   (cl::anychar_p - phrase_end)    [actions.plain_char]
-            )
-            ;
-
-        phrase_markup =
-                '['
-            >>  (   cond_phrase
-                |   image
-                |   url
-                |   link
-                |   anchor
-                |   source_mode
-                |   funcref
-                |   classref
-                |   memberref
-                |   enumref
-                |   macroref
-                |   headerref
-                |   conceptref
-                |   globalref
-                |   bold
-                |   italic
-                |   underline
-                |   teletype
-                |   strikethrough
-                |   quote
-                |   replaceable
-                |   footnote
-                |   template_                   [actions.do_template]
-                |   cl::str_p("br")             [actions.break_]
-                )
-            >>  ']'
-            ;
-
-        escape =
-                cl::str_p("\\n")                [actions.break_]
-            |   cl::str_p("\\ ")                // ignore an escaped space
-            |   '\\' >> cl::punct_p             [actions.raw_char]
-            |   "\\u" >> cl::repeat_p(4) [cl::chset<>("0-9a-fA-F")]
-                                                [actions.escape_unicode]
-            |   "\\U" >> cl::repeat_p(8) [cl::chset<>("0-9a-fA-F")]
-                                                [actions.escape_unicode]
-            |   (
-                    ("'''" >> !eol)             [actions.escape_pre]
-                >>  *(cl::anychar_p - "'''")    [actions.raw_char]
-                >>  cl::str_p("'''")            [actions.escape_post]
-                )
-            ;
-
-        macro_identifier =
-            +(cl::anychar_p - (cl::space_p | ']'))
-            ;
-
-        cond_phrase =
-                '?' >> blank
-            >>  macro_identifier                [actions.cond_phrase_pre]
-            >>  (!phrase)                       [actions.cond_phrase_post]
-            ;
-
-        image =
-                '$' >> blank                    [cl::clear_a(actions.attributes)]
-            >>  cl::if_p(qbk_since(105u)) [
-                        (+(
-                            *cl::space_p
-                        >>  +(cl::anychar_p - (cl::space_p | phrase_end | '['))
-                        ))                       [cl::assign_a(actions.image_fileref)]
-                    >>  hard_space
-                    >>  *(
-                            '['
-                        >>  (*(cl::alnum_p | '_'))  [cl::assign_a(actions.attribute_name)]
-                        >>  space
-                        >>  (*(cl::anychar_p - (phrase_end | '[')))
-                                                [actions.attribute]
-                        >>  ']'
-                        >>  space
-                        )
-                ].else_p [
-                        (*(cl::anychar_p - phrase_end))
-                                                [cl::assign_a(actions.image_fileref)]
-                ]
-            >>  cl::eps_p(']')                  [actions.image]
-            ;
-            
-        url =
-                '@'
-            >>  (*(cl::anychar_p -
-                    (']' | hard_space)))        [actions.url_pre]
-            >>  hard_space
-            >>  phrase                          [actions.url_post]
-            ;
-
-        link =
-                "link" >> hard_space
-            >>  (*(cl::anychar_p -
-                    (']' | hard_space)))        [actions.link_pre]
-            >>  hard_space
-            >>  phrase                          [actions.link_post]
-            ;
-
-        anchor =
-                "#"
-            >>  blank
-            >>  (*(cl::anychar_p - phrase_end)) [actions.anchor]
-            ;
-
-        funcref =
-            "funcref" >> hard_space
-            >>  (*(cl::anychar_p -
-                    (']' | hard_space)))        [actions.funcref_pre]
-            >>  hard_space
-            >>  phrase                          [actions.funcref_post]
-            ;
-
-        classref =
-            "classref" >> hard_space
-            >>  (*(cl::anychar_p -
-                    (']' | hard_space)))        [actions.classref_pre]
-            >>  hard_space
-            >>  phrase                          [actions.classref_post]
-            ;
-
-        memberref =
-            "memberref" >> hard_space
-            >>  (*(cl::anychar_p -
-                    (']' | hard_space)))        [actions.memberref_pre]
-            >>  hard_space
-            >>  phrase                          [actions.memberref_post]
-            ;
-
-        enumref =
-            "enumref" >> hard_space
-            >>  (*(cl::anychar_p -
-                    (']' | hard_space)))        [actions.enumref_pre]
-            >>  hard_space
-            >>  phrase                          [actions.enumref_post]
-            ;
-
-        macroref =
-            "macroref" >> hard_space
-            >>  (*(cl::anychar_p -
-                    (']' | hard_space)))        [actions.macroref_pre]
-            >>  hard_space
-            >>  phrase                          [actions.macroref_post]
-            ;
-
-        headerref =
-            "headerref" >> hard_space
-            >>  (*(cl::anychar_p -
-                    (']' | hard_space)))        [actions.headerref_pre]
-            >>  hard_space
-            >>  phrase                          [actions.headerref_post]
-            ;
-
-        conceptref =
-            "conceptref" >> hard_space
-            >>  (*(cl::anychar_p -
-                    (']' | hard_space)))        [actions.conceptref_pre]
-            >>  hard_space
-            >>  phrase                          [actions.conceptref_post]
-            ;
-
-        globalref =
-            "globalref" >> hard_space
-            >>  (*(cl::anychar_p -
-                    (']' | hard_space)))        [actions.globalref_pre]
-            >>  hard_space
-            >>  phrase                          [actions.globalref_post]
-            ;
-
-        bold =
-                cl::ch_p('*')                   [actions.bold_pre]
-            >>  blank >> phrase                 [actions.bold_post]
-            ;
-
-        italic =
-                cl::ch_p('\'')                  [actions.italic_pre]
-            >>  blank >> phrase                 [actions.italic_post]
-            ;
-
-        underline =
-                cl::ch_p('_')                   [actions.underline_pre]
-            >>  blank >> phrase                 [actions.underline_post]
-            ;
-
-        teletype =
-                cl::ch_p('^')                   [actions.teletype_pre]
-            >>  blank >> phrase                 [actions.teletype_post]
-            ;
-
-        strikethrough =
-                cl::ch_p('-')                   [actions.strikethrough_pre]
-            >>  blank >> phrase                 [actions.strikethrough_post]
-            ;
-
-        quote =
-                cl::ch_p('"')                   [actions.quote_pre]
-            >>  blank >> phrase                 [actions.quote_post]
-            ;
-
-        replaceable =
-                cl::ch_p('~')                   [actions.replaceable_pre]
-            >>  blank >> phrase                 [actions.replaceable_post]
-            ;
-
-        source_mode =
-            (
-                cl::str_p("c++")
-            |   "python"
-            |   "teletype"
-            )                                   [cl::assign_a(actions.source_mode)]
-            ;
-
-        footnote =
-                cl::str_p("footnote")           [actions.footnote_pre]
-            >>  blank >> phrase                 [actions.footnote_post]
-            ;
-    }
-}
-
-#endif // BOOST_SPIRIT_QUICKBOOK_PHRASE_HPP
-
Modified: branches/release/tools/quickbook/src/quickbook.cpp
==============================================================================
--- branches/release/tools/quickbook/src/quickbook.cpp	(original)
+++ branches/release/tools/quickbook/src/quickbook.cpp	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
@@ -15,8 +15,8 @@
 #include "input_path.hpp"
 #include <boost/spirit/include/classic_iterator.hpp>
 #include <boost/program_options.hpp>
-#include <boost/filesystem/v2/path.hpp>
-#include <boost/filesystem/v2/operations.hpp>
+#include <boost/filesystem/v3/path.hpp>
+#include <boost/filesystem/v3/operations.hpp>
 #include <boost/ref.hpp>
 
 #include <stdexcept>
@@ -28,7 +28,7 @@
 #pragma warning(disable:4355)
 #endif
 
-#define QUICKBOOK_VERSION "Quickbook Version 1.5.3"
+#define QUICKBOOK_VERSION "Quickbook Version 1.5.4"
 
 namespace quickbook
 {
@@ -44,8 +44,6 @@
 
     static void set_macros(actions& actor)
     {
-        quickbook::command_line_grammar grammar(actor);
-
         for(std::vector<std::string>::const_iterator
                 it = preset_defines.begin(),
                 end = preset_defines.end();
@@ -54,7 +52,7 @@
             iterator first(it->begin(), it->end(), "command line parameter");
             iterator last(it->end(), it->end());
 
-            call_parse(first, last, grammar);
+            cl::parse(first, last, actor.grammar().command_line_macro);
             // TODO: Check result?
         }
     }
@@ -81,15 +79,13 @@
         iterator first(storage.begin(), storage.end(), filein_);
         iterator last(storage.end(), storage.end());
 
-        doc_info_grammar l(actor);
-        cl::parse_info<iterator> info = call_parse(first, last, l);
+        cl::parse_info<iterator> info = cl::parse(first, last, actor.grammar().doc_info);
 
         if (info.hit || ignore_docinfo)
         {
             pre(actor.out, actor, ignore_docinfo);
 
-            block_grammar g(actor);
-            info = call_parse(info.hit ? info.stop : first, last, g);
+            info = cl::parse(info.hit ? info.stop : first, last, actor.grammar().block);
             if (info.full)
             {
                 post(actor.out, actor, ignore_docinfo);
@@ -111,6 +107,7 @@
     parse_document(char const* filein_, fs::path const& outdir, string_stream& out, bool ignore_docinfo = false)
     {
         actions actor(filein_, outdir, out);
+
         set_macros(actor);
         bool r = parse_file(filein_, actor);
         if (actor.section_level != 0)
Deleted: branches/release/tools/quickbook/src/scoped_block.hpp
==============================================================================
--- branches/release/tools/quickbook/src/scoped_block.hpp	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
+++ (empty file)
@@ -1,134 +0,0 @@
-/*=============================================================================
-    Copyright (c) 2010 Daniel James
-    Copyright (c) 2003 Martin Wille
-    http://spirit.sourceforge.net/
-
-  Distributed under 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)
- =============================================================================*/
- 
-// Used to parse an inner block, saves the streams and restores them if the
-// parse fails. On success the action is passed the resulting block.
-//
-// Might be a good idea to do something more generic in the future.
-//
-// This is based on `boost::spirit::classic::scoped_lock` by Martin Wille
-
-#ifndef BOOST_QUICKBOOK_SCOPED_BLOCK_HPP
-#define BOOST_QUICKBOOK_SCOPED_BLOCK_HPP
-
-#include <boost/spirit/home/classic/namespace.hpp>
-#include <boost/spirit/home/classic/core/composite/composite.hpp>
-#include "actions_class.hpp"
-
-namespace quickbook {
-
-    namespace cl = boost::spirit::classic;
-    
-    struct scoped_block_push
-    {
-        typedef std::string attribute;
-
-        scoped_block_push(quickbook::actions& actions)
-            : actions(actions)
-        {
-            actions.out.push();
-            actions.phrase.push();
-        }
-        
-        ~scoped_block_push()
-        {
-            actions.phrase.pop();
-            actions.out.pop();
-        }
-        
-        std::string const& finish() 
-        {
-            actions.inside_paragraph();
-            return actions.out.str();
-        }
-
-        quickbook::actions& actions;
-    };
-
-    template <typename ParserT>
-    struct scoped_block_parser
-        : public cl::unary< ParserT, cl::parser< scoped_block_parser<ParserT> > >
-    {
-        typedef scoped_block_parser<ParserT> self_t;
-        typedef cl::unary< ParserT, cl::parser< scoped_block_parser<ParserT> > > base_t;
-
-        template <typename ScannerT>
-        struct result
-        {
-            typedef cl::match<std::string> type;
-        };
-
-        scoped_block_parser(quickbook::actions& a, ParserT const &p)
-            : base_t(p)
-            , actions(a)
-        {}
-
-        template <typename ScannerT>
-        cl::match<std::string> parse(ScannerT const &scan) const
-        {
-            typedef typename ScannerT::iterator_t iterator_t;
-            iterator_t save = scan.first;
-
-            scoped_block_push push(actions);
-            typename cl::parser_result<ParserT, ScannerT>::type result
-                = this->subject().parse(scan);
-
-            if (result)
-                return scan.create_match(result.length(), push.finish(), save, scan.first);
-            else
-                return scan.no_match();
-        }
-        
-        quickbook::actions& actions;
-    };
-
-    ///////////////////////////////////////////////////////////////////////////
-    //
-    // scoped_block_parser_gen
-    //
-    //      generator for scoped_block_parser objects
-    //      operator[] returns scoped_block_parser according to its argument
-    //
-    ///////////////////////////////////////////////////////////////////////////
-    struct scoped_block_parser_gen
-    {
-        explicit scoped_block_parser_gen(quickbook::actions& actions)
-            : actions(actions) {}
-
-        template<typename ParserT>
-        scoped_block_parser
-        <
-            typename cl::as_parser<ParserT>::type
-        >
-        operator[](ParserT const &p) const
-        {
-            typedef cl::as_parser<ParserT> as_parser_t;
-            typedef typename as_parser_t::type parser_t;
-
-            return scoped_block_parser<parser_t>
-                (actions, as_parser_t::convert(p));
-        }
-        
-        quickbook::actions& actions;
-    };
-
-
-    ///////////////////////////////////////////////////////////////////////////
-    //
-    // scoped_block_d parser directive
-    //
-    //      constructs a scoped_block_parser generator from its argument
-    //
-    ///////////////////////////////////////////////////////////////////////////
-    inline scoped_block_parser_gen scoped_block(quickbook::actions& actions) {
-        return scoped_block_parser_gen(actions);
-    }
-
-}
-#endif // BOOST_QUICKBOOK_SCOPED_BLOCK_HPP
Modified: branches/release/tools/quickbook/src/syntax_highlight.cpp
==============================================================================
--- branches/release/tools/quickbook/src/syntax_highlight.cpp	(original)
+++ branches/release/tools/quickbook/src/syntax_highlight.cpp	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
@@ -53,17 +53,17 @@
         // print the code with syntax coloring
         if (source_mode == "c++")
         {
-            cpp_p_type cpp_p(temp, escape_actions.macro, do_macro_action(temp), escape_actions);
+            cpp_p_type cpp_p(temp, escape_actions.macro, do_macro_action(temp, escape_actions), escape_actions);
             boost::spirit::classic::parse(first, last, cpp_p);
         }
         else if (source_mode == "python")
         {
-            python_p_type python_p(temp, escape_actions.macro, do_macro_action(temp), escape_actions);
+            python_p_type python_p(temp, escape_actions.macro, do_macro_action(temp, escape_actions), escape_actions);
             boost::spirit::classic::parse(first, last, python_p);
         }
         else if (source_mode == "teletype")
         {
-            teletype_p_type teletype_p(temp, escape_actions.macro, do_macro_action(temp), escape_actions);
+            teletype_p_type teletype_p(temp, escape_actions.macro, do_macro_action(temp, escape_actions), escape_actions);
             boost::spirit::classic::parse(first, last, teletype_p);
         }
         else
@@ -76,4 +76,4 @@
         
         return str;
     }
-}
\ No newline at end of file
+}
Modified: branches/release/tools/quickbook/src/syntax_highlight.hpp
==============================================================================
--- branches/release/tools/quickbook/src/syntax_highlight.hpp	(original)
+++ branches/release/tools/quickbook/src/syntax_highlight.hpp	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
@@ -15,7 +15,7 @@
 #include <boost/spirit/include/classic_chset.hpp>
 #include <boost/spirit/include/classic_symbols.hpp>
 #include <boost/spirit/include/classic_loops.hpp>
-#include "phrase_grammar.hpp"
+#include "grammar.hpp"
 
 namespace quickbook
 {
@@ -41,8 +41,7 @@
         struct definition
         {
             definition(cpp_highlight const& self)
-                : common(self.escape_actions, unused)
-                , unused(false)
+                : g(self.escape_actions.grammar())
             {
                 program
                     =
@@ -70,7 +69,7 @@
                     ;
 
                 qbk_phrase =
-                   *(   common
+                   *(   g.common
                     |   (cl::anychar_p - cl::str_p("``"))
                                         [self.escape_actions.plain_char]
                     )
@@ -158,9 +157,8 @@
                             string_char;
 
             cl::symbols<> keyword_;
-            phrase_grammar common;
+            quickbook_grammar& g;
             std::string save;
-            bool unused;
 
             cl::rule<Scanner> const&
             start() const { return program; }
@@ -194,8 +192,7 @@
         struct definition
         {
             definition(python_highlight const& self)
-                : common(self.escape_actions, unused)
-                , unused(false)
+                : g(self.escape_actions.grammar())
             {
                 program
                     =
@@ -221,7 +218,7 @@
                     ;
 
                 qbk_phrase =
-                   *(   common
+                   *(   g.common
                     |   (cl::anychar_p - cl::str_p("``"))
                                         [self.escape_actions.plain_char]
                     )
@@ -316,9 +313,8 @@
                             qbk_phrase, escape, string_char;
 
             cl::symbols<> keyword_;
-            phrase_grammar common;
+            quickbook_grammar& g;
             std::string save;
-            bool unused;
 
             cl::rule<Scanner> const&
             start() const { return program; }
@@ -348,14 +344,13 @@
         struct definition
         {
             definition(teletype_highlight const& self)
-                : common(self.escape_actions, unused)
-                , unused(false)
+                : g(self.escape_actions.grammar())
             {
                 program
                     =
                     *(  macro
                     |   escape          
-                    |   cl::repeat_p(1)[cl::anychar_p]  [CharProcess(self.out)]
+                    |   cl::repeat_p(1)[cl::anychar_p]  [CharProcess(self.out, self.escape_actions)]
                     )
                     ;
 
@@ -367,7 +362,7 @@
                     ;
 
                 qbk_phrase =
-                   *(   common
+                   *(   g.common
                     |   (cl::anychar_p - cl::str_p("``"))
                                         [self.escape_actions.plain_char]
                     )
@@ -395,9 +390,8 @@
 
             cl::rule<Scanner> program, macro, qbk_phrase, escape;
 
-            phrase_grammar common;
+            quickbook_grammar& g;
             std::string save;
-            bool unused;
 
             cl::rule<Scanner> const&
             start() const { return program; }
Modified: branches/release/tools/quickbook/src/utils.hpp
==============================================================================
--- branches/release/tools/quickbook/src/utils.hpp	(original)
+++ branches/release/tools/quickbook/src/utils.hpp	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
@@ -51,6 +51,31 @@
         return var_wrapper<T>(t);
     }
 
+    template <typename Rule>
+    struct assign_rule_impl
+    {
+        assign_rule_impl(Rule& the_rule)
+            : m_the_rule(the_rule)
+        {
+        }
+    
+        void operator()(Rule* new_rule) const
+        {
+            m_the_rule = *new_rule;
+        }
+    
+    private:
+    
+        Rule& m_the_rule;
+    };
+
+    template <typename Rule>
+    assign_rule_impl<Rule> assign_rule(Rule& the_rule)
+    {
+        return assign_rule_impl<Rule>(the_rule);
+    }
+
+
     // un-indent a code segment
     void unindent(std::string& program);
 
Modified: branches/release/tools/quickbook/test/Jamfile.v2
==============================================================================
--- branches/release/tools/quickbook/test/Jamfile.v2	(original)
+++ branches/release/tools/quickbook/test/Jamfile.v2	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
@@ -56,7 +56,8 @@
     [ quickbook-test xml-escape_1_5 ]
     [ quickbook-test blocks ]
     [ quickbook-test newline ]
-    [ quickbook-test command_line_macro : : : <quickbook-define>__macro__=*bold* ]
+    [ quickbook-test anchor ]
+    [ quickbook-test command_line_macro : : : <quickbook-test-define>__macro__=*bold* ]
     [ quickbook-fail-test fail-include ]
     [ quickbook-fail-test fail-import ]
     [ quickbook-fail-test fail-template-arguments1 ]
Copied: branches/release/tools/quickbook/test/anchor.gold (from r67335, /trunk/tools/quickbook/test/anchor.gold)
==============================================================================
--- /trunk/tools/quickbook/test/anchor.gold	(original)
+++ branches/release/tools/quickbook/test/anchor.gold	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
@@ -34,10 +34,13 @@
     <anchor id="a8"/>
   </section>
   <section id="anchor_test.section_anchor">
-    <anchor id="a8"/> <title>Section Anchor</title>
+    <anchor id="a9"/> <title>Section Anchor</title>
     <section id="anchor_test.nested_section">
-      <title>Nested Section</title>
+      <anchor id="a10"/> <title>Nested Section</title>
     </section>
-    <anchor id="a9"/>
+    <anchor id="a11"/>
+  </section>
+  <section id="anchor_test.conditional_section_anchor">
+    <anchor id="a12"/> <title>Conditional Section Anchor</title>
   </section>
 </article>
Copied: branches/release/tools/quickbook/test/anchor.quickbook (from r67335, /trunk/tools/quickbook/test/anchor.quickbook)
==============================================================================
--- /trunk/tools/quickbook/test/anchor.quickbook	(original)
+++ branches/release/tools/quickbook/test/anchor.quickbook	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
@@ -23,10 +23,14 @@
 
 [endsect]
 
-[#a8]
+[#a9]
 [section Section Anchor]
-[section Nested Section]
+[#a10][section Nested Section]
 [endsect]
 [/ This anchor is invalid, I'm not sure what to do with it]
-[#a9]
+[#a11]
 [endsect]
+
+[#a12][?__not_defined__ #a13]
+[section Conditional Section Anchor]
+[endsect]
\ No newline at end of file
Modified: branches/release/tools/quickbook/test/blocks.gold
==============================================================================
--- branches/release/tools/quickbook/test/blocks.gold	(original)
+++ branches/release/tools/quickbook/test/blocks.gold	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
@@ -86,4 +86,27 @@
   <para>
     [tipping point]
   </para>
+  <para>
+    Multiple paragraphs because of the inline blocks.
+  </para>
+  <warning>
+    <para>
+      Warning
+    </para>
+  </warning>
+  <para>
+    This line should appear as a separate paragraph.
+  </para>
+  <warning>
+    <para>
+      Warning
+    </para>
+  </warning>
+  <itemizedlist>
+    <listitem>
+      <simpara>
+        This should be a list item because it's preceded by block markup.
+      </simpara>
+    </listitem>
+  </itemizedlist>
 </article>
Modified: branches/release/tools/quickbook/test/blocks.quickbook
==============================================================================
--- branches/release/tools/quickbook/test/blocks.quickbook	(original)
+++ branches/release/tools/quickbook/test/blocks.quickbook	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
@@ -39,4 +39,8 @@
 [/ Unfortunately footnotes currently can't contain blocks.]
 
 [/ Quickbook shouldn't think that this is a tip]
-[tipping point]
\ No newline at end of file
+[tipping point]
+
+Multiple paragraphs because of the inline blocks. [warning Warning] This
+line should appear as a separate paragraph.[warning Warning]
+* This should be a list item because it's preceded by block markup.
\ No newline at end of file
Modified: branches/release/tools/quickbook/test/cond_phrase.gold
==============================================================================
--- branches/release/tools/quickbook/test/cond_phrase.gold	(original)
+++ branches/release/tools/quickbook/test/cond_phrase.gold	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
@@ -6,4 +6,7 @@
   <para>
     This should show
   </para>
+  <para>
+    The should be no space inserted.
+  </para>
 </article>
Modified: branches/release/tools/quickbook/test/cond_phrase.quickbook
==============================================================================
--- branches/release/tools/quickbook/test/cond_phrase.quickbook	(original)
+++ branches/release/tools/quickbook/test/cond_phrase.quickbook	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
@@ -2,7 +2,9 @@
     [quickbook 1.5]
 ]
 
-[def defined]
+[def __defined__]
 
-[?defined This should show]
-[?undefined This should not show]
\ No newline at end of file
+[? __defined__ This should show]
+[? __undefined__ This should not show]
+
+The should be no sp[?__undefined__ just some junk]ace inserted.
\ No newline at end of file
Modified: branches/release/tools/quickbook/test/doc-info-1.gold
==============================================================================
--- branches/release/tools/quickbook/test/doc-info-1.gold	(original)
+++ branches/release/tools/quickbook/test/doc-info-1.gold	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE article PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN" "http://www.boost.org/tools/boostbook/dtd/boostbook.dtd">
-<article id="karel_vom_u00e1_u010dka_and_tom_u00e1_u0161_martin_u00edk" last-revision="DEBUG MODE Date: 2000/12/20 12:00:00 $"
- xmlns:xi="http://www.w3.org/2001/XInclude">
+<article id="karel_vom_u00e1_u010dka_and_tom_u00e1_u0161_martin_u00edk" lang="en"
+last-revision="DEBUG MODE Date: 2000/12/20 12:00:00 $" xmlns:xi="http://www.w3.org/2001/XInclude">
   <title>Karel Vomáčka and Tomáš Martiník</title>
   <articleinfo>
     <authorgroup>
Modified: branches/release/tools/quickbook/test/doc-info-1.quickbook
==============================================================================
--- branches/release/tools/quickbook/test/doc-info-1.quickbook	(original)
+++ branches/release/tools/quickbook/test/doc-info-1.quickbook	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
@@ -8,4 +8,5 @@
 [category irrelevance]
 [/ [category commented out] ]
 [biblioid uri http://www.boost.org/tools/quickbook/test/doc-info-1.quickbook]
+[lang en]
 ]
Modified: branches/release/tools/quickbook/test/include_1_5.gold
==============================================================================
--- branches/release/tools/quickbook/test/include_1_5.gold	(original)
+++ branches/release/tools/quickbook/test/include_1_5.gold	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
@@ -15,4 +15,16 @@
       Just testing.
     </para>
   </section>
+  <para>
+    Just trying including in a conditional macro.
+  </para>
+  <section id="foo2.test">
+    <title><link linkend="foo2.test">Test</link></title>
+    <para>
+      Just testing.
+    </para>
+  </section>
+  <para>
+    With some text around it.
+  </para>
 </article>
Modified: branches/release/tools/quickbook/test/include_1_5.quickbook
==============================================================================
--- branches/release/tools/quickbook/test/include_1_5.quickbook	(original)
+++ branches/release/tools/quickbook/test/include_1_5.quickbook	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
@@ -8,3 +8,9 @@
 [include:foo include-sub2.quickbook]
 [include empty.quickbook]
 
+[def __defined__]
+
+[? __undefined__ [include:foo1 include-sub2.quickbook] ]
+[? __defined__
+  Just trying including in a conditional macro. [include:foo2 include-sub2.quickbook]
+  With some text around it.]
Modified: branches/release/tools/quickbook/test/include_1_6.gold
==============================================================================
--- branches/release/tools/quickbook/test/include_1_6.gold	(original)
+++ branches/release/tools/quickbook/test/include_1_6.gold	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
@@ -15,4 +15,16 @@
       Just testing.
     </para>
   </section>
+  <para>
+    Just trying including in a conditional macro.
+  </para>
+  <section id="foo2.test">
+    <title><link linkend="foo2.test">Test</link></title>
+    <para>
+      Just testing.
+    </para>
+  </section>
+  <para>
+    With some text around it.
+  </para>
 </article>
Modified: branches/release/tools/quickbook/test/include_1_6.quickbook
==============================================================================
--- branches/release/tools/quickbook/test/include_1_6.quickbook	(original)
+++ branches/release/tools/quickbook/test/include_1_6.quickbook	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
@@ -5,3 +5,10 @@
 
 [include include-sub2.quickbook]
 [include:foo include-sub2.quickbook]
+
+[def __defined__]
+
+[? __undefined__ [include:foo1 include-sub2.quickbook] ]
+[? __defined__
+  Just trying including in a conditional macro. [include:foo2 include-sub2.quickbook]
+  With some text around it.]
Modified: branches/release/tools/quickbook/test/link.gold
==============================================================================
--- branches/release/tools/quickbook/test/link.gold	(original)
+++ branches/release/tools/quickbook/test/link.gold	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
@@ -3,18 +3,19 @@
 <article id="link_tests" last-revision="DEBUG MODE Date: 2000/12/20 12:00:00 $" xmlns:xi="http://www.w3.org/2001/XInclude">
   <title>Link tests</title>
   <section id="link_tests.different_types_of_links">
-    <title>Different types of links</title> <anchor id="link-id" />
+    <title>Different types of links</title>
     <para>
       <ulink url="http://www.boost.org/">http://www.boost.org/> <ulink url="http://www.boost.org/">Boost</ulink>
       <link linkend="link-id">link-id</link> <link linkend="link-id">Link Text</link>
-      <functionname alt="foo">foo</functionname> <functionname alt="foo">link text</functionname>
-      <classname alt="foo">foo</classname> <classname alt="foo">link text</classname>
-      <methodname alt="foo">foo</methodname> <methodname alt="foo">link text</methodname>
-      <enumname alt="foo">foo</enumname> <enumname alt="foo">link text</enumname>
-      <macroname alt="foo">foo</macroname> <macroname alt="foo">link text</macroname>
-      <headername alt="foo">foo</headername> <headername alt="foo">link text</headername>
-      <conceptname alt="foo">foo</conceptname> <conceptname alt="foo">link text</conceptname>
-      <globalname alt="foo">foo</globalname> <globalname alt="foo">link text</globalname>
+      <anchor id="link-id"/> <functionname alt="foo">foo</functionname> <functionname
+      alt="foo">link text</functionname> <classname alt="foo">foo</classname> <classname
+      alt="foo">link text</classname> <methodname alt="foo">foo</methodname> <methodname
+      alt="foo">link text</methodname> <enumname alt="foo">foo</enumname> <enumname
+      alt="foo">link text</enumname> <macroname alt="foo">foo</macroname> <macroname
+      alt="foo">link text</macroname> <headername alt="foo">foo</headername> <headername
+      alt="foo">link text</headername> <conceptname alt="foo">foo</conceptname>
+      <conceptname alt="foo">link text</conceptname> <globalname alt="foo">foo</globalname>
+      <globalname alt="foo">link text</globalname>
     </para>
   </section>
   <section id="link_tests.side_by_side_links">
Modified: branches/release/tools/quickbook/test/quickbook-testing.jam
==============================================================================
--- branches/release/tools/quickbook/test/quickbook-testing.jam	(original)
+++ branches/release/tools/quickbook/test/quickbook-testing.jam	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
@@ -16,7 +16,7 @@
 import type ;
 
 feature.feature quickbook-testing.quickbook-command : : free dependency ;
-feature.feature <quickbook-define> : : free ;
+feature.feature <quickbook-test-define> : : free ;
 
 type.register QUICKBOOK_INPUT : quickbook ;
 type.register QUICKBOOK_OUTPUT ;
@@ -95,7 +95,7 @@
 
 ################################################################################
 toolset.flags quickbook-testing.process-quickbook quickbook-command <quickbook-testing.quickbook-command> ;
-toolset.flags quickbook-testing.process-quickbook QB-DEFINES        <quickbook-define> ;
+toolset.flags quickbook-testing.process-quickbook QB-DEFINES        <quickbook-test-define> ;
 
 rule process-quickbook ( target : source : properties * )
 {
Modified: branches/release/tools/quickbook/test/table_1_5.gold
==============================================================================
--- branches/release/tools/quickbook/test/table_1_5.gold	(original)
+++ branches/release/tools/quickbook/test/table_1_5.gold	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
@@ -173,5 +173,65 @@
         </tbody>
       </tgroup>
     </table>
+    <table frame="all" id="table_1_5.section1.empty_table">
+      <title>Empty Table</title>
+      <tgroup cols="0">
+        <tbody>
+        </tbody>
+      </tgroup>
+    </table>
+    <table frame="all" id="table_1_5.section1.table_with_an_empty_cell">
+      <title>Table with an empty cell</title>
+      <tgroup cols="1">
+        <tbody>
+          <row>
+            <entry>
+              <para>
+                x
+              </para>
+            </entry>
+          </row>
+        </tbody>
+      </tgroup>
+    </table>
+    <table frame="all" id="table_1_5.section1.indentation">
+      <title>Indentation</title>
+      <tgroup cols="2">
+        <thead>
+          <row>
+            <entry>
+              <para>
+                Header 1. Paragraph 1
+              </para>
+              <para>
+                Header 1. Paragraph 2
+              </para>
+            </entry>
+            <entry>
+              <para>
+                Header 2
+              </para>
+            </entry>
+          </row>
+        </thead>
+        <tbody>
+          <row>
+            <entry>
+              <para>
+                Row 1. Cell 1.
+              </para>
+            </entry>
+            <entry>
+              <para>
+                Row 1. Cell 2.
+              </para>
+              <para>
+                Row 1. Cell 2. Paragraph 2.
+              </para>
+            </entry>
+          </row>
+        </tbody>
+      </tgroup>
+    </table>
   </section>
 </article>
Modified: branches/release/tools/quickbook/test/table_1_5.quickbook
==============================================================================
--- branches/release/tools/quickbook/test/table_1_5.quickbook	(original)
+++ branches/release/tools/quickbook/test/table_1_5.quickbook	2011-01-08 10:22:18 EST (Sat, 08 Jan 2011)
@@ -40,4 +40,33 @@
     [[a][b]]
 ]
 
+[table Empty Table
+]
+
+[table Table with an empty cell
+[[x]]]
+
+[table Indentation
+  [
+    [
+      Header 1. Paragraph 1
+      
+      Header 1. Paragraph 2
+    ]
+    [
+      Header 2
+    ]
+  ]
+  [
+    [
+      Row 1. Cell 1.
+    ]
+    [
+      Row 1. Cell 2.
+      
+      Row 1. Cell 2. Paragraph 2.
+    ]
+  ]
+]
+
 [endsect]
\ No newline at end of file