$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r67324 - in trunk/tools/quickbook: src test
From: dnljms_at_[hidden]
Date: 2010-12-19 08:26:58
Author: danieljames
Date: 2010-12-19 08:26:55 EST (Sun, 19 Dec 2010)
New Revision: 67324
URL: http://svn.boost.org/trac/boost/changeset/67324
Log:
Smarter anchor support.
Added:
   trunk/tools/quickbook/test/anchor.gold   (contents, props changed)
   trunk/tools/quickbook/test/anchor.quickbook   (contents, props changed)
Text files modified: 
   trunk/tools/quickbook/src/actions.cpp          |   132 ++++++++++++++++++++++---               
   trunk/tools/quickbook/src/actions.hpp          |   183 +++++++++++++++++++++++++++---------    
   trunk/tools/quickbook/src/actions_class.cpp    |   199 ++++++++++++++++++++------------------- 
   trunk/tools/quickbook/src/actions_class.hpp    |     7 +                                       
   trunk/tools/quickbook/src/block_grammar.cpp    |    35 ++++--                                  
   trunk/tools/quickbook/src/syntax_highlight.cpp |     6                                         
   trunk/tools/quickbook/src/syntax_highlight.hpp |     2                                         
   trunk/tools/quickbook/test/Jamfile.v2          |     1                                         
   trunk/tools/quickbook/test/link.gold           |    19 ++-                                     
   9 files changed, 396 insertions(+), 188 deletions(-)
Modified: trunk/tools/quickbook/src/actions.cpp
==============================================================================
--- trunk/tools/quickbook/src/actions.cpp	(original)
+++ trunk/tools/quickbook/src/actions.cpp	2010-12-19 08:26:55 EST (Sun, 19 Dec 2010)
@@ -47,6 +47,8 @@
     // Handles line-breaks (DEPRECATED!!!)
     void break_action::operator()(iterator first, iterator) const
     {
+        actions.output_pre(phrase);
+
         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
     {
+        actions.output_pre(out);
+
         out << pre << str << post;
     }
 
     void phrase_action::operator()(iterator first, iterator last) const
     {
+        actions.output_pre(phrase);
+
         std::string str;
         phrase.swap(str);
         out << pre << str << post;
@@ -91,7 +97,10 @@
         }
 
         if(pos != end) {
-            out << pre << str << post;
+            out << pre << str;
+            // TODO: Is this right place?
+            actions.output_pre(out);
+            out << post;
         }
     }
 
@@ -100,27 +109,37 @@
         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>"
@@ -147,8 +166,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 +182,7 @@
 
     void simple_phrase_action::operator()(iterator first, iterator last) const
     {
+        actions.output_pre(out);
         out << pre;
         std::string str(first, last);
         if (std::string const* ptr = find(macro, str.c_str()))
@@ -175,6 +199,10 @@
 
     void cond_phrase_action_pre::operator()(iterator first, iterator last) const
     {
+        // TODO: It would probably be better to save the anchors and restore
+        // them if the phrase isn't used.
+        actions.output_pre(out);
+
         std::string str(first, last);
         conditions.push_back(find(macro, str.c_str()));
         out.push(); // save the stream
@@ -187,6 +215,8 @@
 
         if (first == last || !symbol_found)
         {
+            // clear any anchors defined in the conditional phrase.
+            actions.anchors.clear();
             out.pop(); // restore the stream
         }
         else
@@ -218,6 +248,11 @@
 
     void list_format_action::operator()(iterator first, iterator last) const
     {
+        // I think this will only have an effect on the first item,
+        // it would have been called when outputting the previous
+        // item on other items. But might as well call it every time.
+        actions.output_pre(out);
+    
         int new_indent = 0;
         while (first != last && (*first == ' ' || *first == '\t'))
         {
@@ -315,14 +350,13 @@
 
     void anchor_action::operator()(iterator first, iterator last) const
     {
-        out << "<anchor id=\"";
-        while (first != last)
-            detail::print_char(*first++, out.get());
-        out << "\" />\n";
+        actions.anchors.push_back(std::string(first, last));
     }
 
     void do_macro_action::operator()(std::string const& str) const
     {
+        actions.output_pre(phrase);
+
         if (str == quickbook_get_date)
         {
             char strdate[64];
@@ -343,7 +377,6 @@
 
     void space::operator()(char ch) const
     {
-
         detail::print_space(ch, out.get());
     }
 
@@ -360,6 +393,7 @@
 
     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
     }
@@ -376,6 +410,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);
 
@@ -388,6 +424,7 @@
         // We must not place a \n after the <programlisting> tag
         // otherwise PDF output starts code blocks with a blank line:
         //
+        actions.output_pre(out);
         out << "<programlisting>";
         out << str;
         out << "</programlisting>\n";
@@ -403,6 +440,7 @@
 
         out.swap(save);
 
+        actions.output_pre(out);
         out << "<code>";
         out << str;
         out << "</code>";
@@ -410,26 +448,32 @@
 
     void raw_char_action::operator()(char ch) const
     {
+        actions.output_pre(phrase);
         phrase << ch;
     }
 
     void raw_char_action::operator()(iterator first, iterator /*last*/) const
     {
+        actions.output_pre(phrase);
         phrase << *first;
     }
 
     void plain_char_action::operator()(char ch) const
     {
+        actions.output_pre(phrase);
         detail::print_char(ch, phrase.get());
     }
 
     void plain_char_action::operator()(iterator first, iterator /*last*/) const
     {
+        actions.output_pre(phrase);
         detail::print_char(*first, phrase.get());
     }
 
     void escape_unicode_action::operator()(iterator first, iterator last) const
     {
+        actions.output_pre(phrase);
+
         while(first != last && *first == '0') ++first;
 
         // Just ignore \u0000
@@ -462,6 +506,8 @@
 
     void image_action::operator()(iterator, iterator) const
     {
+        actions.output_pre(phrase);
+
         fs::path const img_path(image_fileref);
         
         attribute_map::iterator it = attributes.find("alt");
@@ -994,6 +1040,8 @@
 
     void link_action::operator()(iterator first, iterator last) const
     {
+        actions.output_pre(phrase);
+
         iterator save = first;
         phrase << tag;
         while (first != last)
@@ -1126,7 +1174,7 @@
     }
 
     void begin_section_action::operator()(iterator first, iterator last) const
-    {
+    {    
         section_id = element_id.empty() ?
             detail::make_identifier(first, last) :
             element_id;
@@ -1138,6 +1186,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 +1201,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 +1222,8 @@
 
     void end_section_action::operator()(iterator first, iterator last) const
     {
+        actions.output_pre(out);
+
         if (section_level <= min_section_level)
         {
             position const pos = first.get_position();
@@ -1236,6 +1291,8 @@
 
     void xinclude_action::operator()(iterator first, iterator last) const
     {
+        actions.output_pre(out);
+
         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,6 +1332,8 @@
 
     void import_action::operator()(iterator first, iterator last) const
     {
+        actions.output_pre(actions.out);
+
         fs::path path = include_search(actions.filename.parent_path(), std::string(first,last));
         std::string ext = path.extension();
         std::vector<template_symbol> storage;
@@ -1297,6 +1356,8 @@
 
     void include_action::operator()(iterator first, iterator last) const
     {
+        actions.output_pre(actions.out);
+
         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;
@@ -1367,14 +1428,49 @@
 
     void phrase_to_string_action::operator()(iterator first, iterator last) const
     {
+        actions.output_pre(phrase);
+
         out.clear();
         phrase.swap(out);
     }
 
     void phrase_to_docinfo_action::operator()(iterator first, iterator last) const
     {
+        actions.output_pre(phrase);
+
         out.encoded.clear();
         phrase.swap(out.encoded);
         out.raw = std::string(first, last);
     }
+    
+    void inner_phrase_action_pre::operator()(iterator, iterator) const
+    {
+        actions.saved_anchors.clear();
+        actions.saved_anchors.swap(actions.anchors);
+    }
+
+    void inner_phrase_action_post::operator()(iterator, iterator) const
+    {
+        actions.output_pre(actions.phrase);
+    }
+
+    void pre_output_action::operator()(collector& tgt) const
+    {
+        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();
+    }
+    
+    void pre_output_action::operator()(iterator, iterator) const
+    {
+        (*this)(actions.out);
+    }
 }
Modified: trunk/tools/quickbook/src/actions.hpp
==============================================================================
--- trunk/tools/quickbook/src/actions.hpp	(original)
+++ trunk/tools/quickbook/src/actions.hpp	2010-12-19 08:26:55 EST (Sun, 19 Dec 2010)
@@ -91,16 +91,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,11 +115,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()(iterator first, iterator last) const;
 
@@ -124,6 +129,7 @@
         collector& phrase;
         std::string pre;
         std::string post;
+        quickbook::actions& actions;
     };
 
     struct implicit_paragraph_action
@@ -135,11 +141,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 +156,7 @@
         collector& phrase;
         std::string pre;
         std::string post;
+        quickbook::actions& actions;
     };
 
     struct header_action
@@ -162,7 +171,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 +180,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 +193,7 @@
         std::string const& qualified_section_id;
         std::string pre;
         std::string post;
+        quickbook::actions& actions;
     };
 
     struct generic_header_action
@@ -195,14 +207,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 +227,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 +238,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 +252,7 @@
         std::string pre;
         std::string post;
         string_symbols const& macro;
+        quickbook::actions& actions;
     };
 
     struct cond_phrase_action_pre
@@ -244,16 +262,19 @@
         cond_phrase_action_pre(
             collector& out
           , std::vector<bool>& conditions
-          , string_symbols const& macro)
+          , string_symbols const& macro
+          , quickbook::actions& actions)
         : out(out)
         , conditions(conditions)
-        , macro(macro) {}
+        , macro(macro)
+        , actions(actions) {}
 
         void operator()(iterator first, iterator last) const;
 
         collector& out;
         std::vector<bool>& conditions;
         string_symbols const& macro;
+        quickbook::actions& actions;
     };
 
     struct cond_phrase_action_post
@@ -263,16 +284,19 @@
         cond_phrase_action_post(
             collector& out
           , std::vector<bool>& conditions
-          , string_symbols const& macro)
+          , string_symbols const& macro
+          , quickbook::actions& actions)
         : out(out)
         , conditions(conditions)
-        , macro(macro) {}
+        , macro(macro)
+        , actions(actions) {}
 
         void operator()(iterator first, iterator last) const;
 
         collector& out;
         std::vector<bool>& conditions;
         string_symbols const& macro;
+        quickbook::actions& actions;
     };
 
     struct list_action
@@ -284,11 +308,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 +322,7 @@
         collector& list_buffer;
         int& list_indent;
         std::stack<mark_type>& list_marks;
+        quickbook::actions& actions;
     };
 
     struct list_format_action
@@ -307,11 +334,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 +348,7 @@
         int& list_indent;
         std::stack<mark_type>& list_marks;
         int& error_count;
+        quickbook::actions& actions;
     };
 
     struct span
@@ -350,12 +380,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 +395,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 +449,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 +465,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 +513,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 +552,7 @@
 
         collector& phrase;
         std::string str;
+        quickbook::actions& actions;
     };
     
     struct code_action
@@ -551,12 +597,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 +670,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
@@ -693,14 +744,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 +764,7 @@
         int& section_level;
         std::string& qualified_section_id;
         std::string& element_id;
+        quickbook::actions& actions;
     };
 
     struct end_section_action
@@ -720,12 +774,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 +790,7 @@
         int& min_section_level;
         std::string& qualified_section_id;
         int& error_count;
+        quickbook::actions& actions;
    };
    
    struct element_id_warning_action
@@ -805,25 +862,59 @@
 
     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) {}
+            
+        void operator()(collector& tgt) const;
+        void operator()(iterator, iterator) const;
+        
+        quickbook::actions& actions;
     };
 }
 
Modified: trunk/tools/quickbook/src/actions_class.cpp
==============================================================================
--- trunk/tools/quickbook/src/actions_class.cpp	(original)
+++ trunk/tools/quickbook/src/actions_class.cpp	2010-12-19 08:26:55 EST (Sun, 19 Dec 2010)
@@ -71,123 +71,128 @@
 
     // 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_lang(doc_lang, 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)
         , 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)
+        , 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(phrase, conditions, macro, *this)
+        , cond_phrase_post(phrase, conditions, macro, *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_)
+        , end_row(phrase, end_row_, *this)
         , cell(phrase, table_span)
-        , anchor(out)
+        , 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 ?
Modified: trunk/tools/quickbook/src/actions_class.hpp
==============================================================================
--- trunk/tools/quickbook/src/actions_class.hpp	(original)
+++ trunk/tools/quickbook/src/actions_class.hpp	2010-12-19 08:26:55 EST (Sun, 19 Dec 2010)
@@ -115,6 +115,8 @@
         std::string             image_fileref;
         std::string             attribute_name;
         attribute_map           attributes;
+        string_list             anchors;
+        string_list             saved_anchors;
 
     // push/pop the states and the streams
         void copy_macros_for_write();
@@ -149,6 +151,7 @@
         tagged_action           blurb, blockquote;
         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;
@@ -234,6 +237,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;
     };
 }
 
Modified: trunk/tools/quickbook/src/block_grammar.cpp
==============================================================================
--- trunk/tools/quickbook/src/block_grammar.cpp	(original)
+++ trunk/tools/quickbook/src/block_grammar.cpp	2010-12-19 08:26:55 EST (Sun, 19 Dec 2010)
@@ -34,7 +34,7 @@
                         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,
+                        inner_phrase, 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,
@@ -180,7 +180,7 @@
             >> hard_space
             >> element_id
             >> space
-            >> phrase                           [actions.begin_section]
+            >> inner_phrase                     [actions.begin_section]
             ;
 
         end_section =
@@ -191,13 +191,13 @@
             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];
+        h = "heading" >> hard_space >> element_id_1_6 >> space >> inner_phrase   [actions.h];
+        h1 = "h1" >> hard_space >> element_id_1_6 >> space >> inner_phrase       [actions.h1];
+        h2 = "h2" >> hard_space >> element_id_1_6 >> space >> inner_phrase       [actions.h2];
+        h3 = "h3" >> hard_space >> element_id_1_6 >> space >> inner_phrase       [actions.h3];
+        h4 = "h4" >> hard_space >> element_id_1_6 >> space >> inner_phrase       [actions.h4];
+        h5 = "h5" >> hard_space >> element_id_1_6 >> space >> inner_phrase       [actions.h5];
+        h6 = "h6" >> hard_space >> element_id_1_6 >> space >> inner_phrase       [actions.h6];
 
         static const bool true_ = true;
         static const bool false_ = false;
@@ -297,7 +297,7 @@
             "variablelist"
             >>  (cl::eps_p(*cl::blank_p >> cl::eol_p) | hard_space)
             >>  (*(cl::anychar_p - eol))        [cl::assign_a(actions.table_title)]
-            >>  +eol
+            >>  (+eol)                          [actions.output_pre]
             >>  *varlistentry
             >>  cl::eps_p                       [actions.variablelist]
             ;
@@ -354,7 +354,7 @@
             >> 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
+            >>  (+eol)                          [actions.output_pre]
             >>  *table_row
             >>  cl::eps_p                       [actions.table]
             ;
@@ -464,13 +464,20 @@
 
         paragraph =
            +(   common
-            |   (cl::anychar_p -                // Make sure we don't go past
-                    paragraph_end               // a single block.
-                )                               [actions.plain_char]
+            |   (cl::eps_p - paragraph_end)
+            >>  (   cl::space_p                 [actions.space_char]
+                |   cl::anychar_p               [actions.plain_char]
+                )
             )
             >> (cl::eps_p('[') | +eol)
             ;
 
+        inner_phrase =
+                cl::eps_p                       [actions.inner_phrase_pre]
+            >>  phrase
+            >>  cl::eps_p                       [actions.inner_phrase_post]
+            ;
+
         phrase =
            *(   common
             |   comment
Modified: trunk/tools/quickbook/src/syntax_highlight.cpp
==============================================================================
--- trunk/tools/quickbook/src/syntax_highlight.cpp	(original)
+++ trunk/tools/quickbook/src/syntax_highlight.cpp	2010-12-19 08:26:55 EST (Sun, 19 Dec 2010)
@@ -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
Modified: trunk/tools/quickbook/src/syntax_highlight.hpp
==============================================================================
--- trunk/tools/quickbook/src/syntax_highlight.hpp	(original)
+++ trunk/tools/quickbook/src/syntax_highlight.hpp	2010-12-19 08:26:55 EST (Sun, 19 Dec 2010)
@@ -355,7 +355,7 @@
                     =
                     *(  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)]
                     )
                     ;
 
Modified: trunk/tools/quickbook/test/Jamfile.v2
==============================================================================
--- trunk/tools/quickbook/test/Jamfile.v2	(original)
+++ trunk/tools/quickbook/test/Jamfile.v2	2010-12-19 08:26:55 EST (Sun, 19 Dec 2010)
@@ -56,6 +56,7 @@
     [ quickbook-test xml-escape_1_5 ]
     [ quickbook-test blocks ]
     [ quickbook-test newline ]
+    [ quickbook-test anchor ]
     [ quickbook-test command_line_macro : : : <quickbook-test-define>__macro__=*bold* ]
     [ quickbook-fail-test fail-include ]
     [ quickbook-fail-test fail-import ]
Added: trunk/tools/quickbook/test/anchor.gold
==============================================================================
--- (empty file)
+++ trunk/tools/quickbook/test/anchor.gold	2010-12-19 08:26:55 EST (Sun, 19 Dec 2010)
@@ -0,0 +1,43 @@
+<?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="anchor_test" last-revision="DEBUG MODE Date: 2000/12/20 12:00:00 $"
+ xmlns:xi="http://www.w3.org/2001/XInclude">
+  <title>Anchor Test</title>
+  <section id="anchor_test.anchors">
+    <title>Anchors</title>
+    <para>
+      <anchor id="a1"/> A paragraph containing several anchors. <anchor id="a2"/>
+      We want to make sure they appear in the correct place. <anchor id="a3"/>
+    </para>
+    <anchor id="anchor_test.anchors.this_heading_shouldn_t_pick_up_the_previous_anchor"/>
+    <bridgehead renderas="sect3">
+      <link linkend="anchor_test.anchors.this_heading_shouldn_t_pick_up_the_previous_anchor">This
+      heading shouldn't pick up the previous anchor</link>
+    </bridgehead>
+    <anchor id="a4"/> <anchor id="anchor_test.anchors.this_heading_should_pick_up_the_previous_anchor"/>
+    <bridgehead renderas="sect3">
+      <link linkend="anchor_test.anchors.this_heading_should_pick_up_the_previous_anchor">This
+      heading should pick up the previous anchor</link>
+    </bridgehead>
+    <anchor id="a5"/> <anchor id="anchor_test.anchors.and_this_one"/>
+    <bridgehead renderas="sect3">
+      <link linkend="anchor_test.anchors.and_this_one">And this one</link>
+    </bridgehead>
+    <anchor id="a6"/> <anchor id="anchor_test.anchors.also_this_one"/>
+    <bridgehead renderas="sect3">
+      <link linkend="anchor_test.anchors.also_this_one">Also this one</link>
+    </bridgehead>
+    <anchor id="a7"/> <anchor id="anchors.finally_this"/>
+    <bridgehead renderas="sect3">
+      Finally this
+    </bridgehead>
+    <anchor id="a8"/>
+  </section>
+  <section id="anchor_test.section_anchor">
+    <anchor id="a8"/> <title>Section Anchor</title>
+    <section id="anchor_test.nested_section">
+      <title>Nested Section</title>
+    </section>
+    <anchor id="a9"/>
+  </section>
+</article>
Added: trunk/tools/quickbook/test/anchor.quickbook
==============================================================================
--- (empty file)
+++ trunk/tools/quickbook/test/anchor.quickbook	2010-12-19 08:26:55 EST (Sun, 19 Dec 2010)
@@ -0,0 +1,32 @@
+[article Anchor Test
+]
+
+[section Anchors]
+
+[#a1] A paragraph containing several anchors. [#a2] We want to make sure
+they appear in the correct place. [#a3]
+
+[heading This heading shouldn't pick up the previous anchor]
+
+[#a4]
+
+[heading This heading should pick up the previous anchor]
+
+[#a5]
+[heading And this one]
+
+[#a6][heading Also this one]
+
+[#a7][h3 Finally this]
+
+[#a8]
+
+[endsect]
+
+[#a8]
+[section Section Anchor]
+[section Nested Section]
+[endsect]
+[/ This anchor is invalid, I'm not sure what to do with it]
+[#a9]
+[endsect]
Modified: trunk/tools/quickbook/test/link.gold
==============================================================================
--- trunk/tools/quickbook/test/link.gold	(original)
+++ trunk/tools/quickbook/test/link.gold	2010-12-19 08:26:55 EST (Sun, 19 Dec 2010)
@@ -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">