$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r63809 - in trunk/tools/quickbook: detail doc test
From: daniel_james_at_[hidden]
Date: 2010-07-10 07:24:55
Author: danieljames
Date: 2010-07-10 07:24:54 EDT (Sat, 10 Jul 2010)
New Revision: 63809
URL: http://svn.boost.org/trac/boost/changeset/63809
Log:
Generate different ids when reusing code snippets.
Generates the ids during template expansion instead of when parsing the
code snippet - so that different ids are used for different exapnsions.
Refs #4416
Text files modified: 
   trunk/tools/quickbook/detail/actions.cpp        |    99 ++++++++++++++++++++++++++++----------- 
   trunk/tools/quickbook/detail/template_stack.hpp |     2                                         
   trunk/tools/quickbook/doc/quickbook.qbk         |     1                                         
   trunk/tools/quickbook/test/callouts.gold        |    22 ++++++++                                
   trunk/tools/quickbook/test/callouts.quickbook   |     4 +                                       
   5 files changed, 99 insertions(+), 29 deletions(-)
Modified: trunk/tools/quickbook/detail/actions.cpp
==============================================================================
--- trunk/tools/quickbook/detail/actions.cpp	(original)
+++ trunk/tools/quickbook/detail/actions.cpp	2010-07-10 07:24:54 EDT (Sat, 10 Jul 2010)
@@ -808,6 +808,11 @@
         }
     }
 
+    namespace detail
+    {
+        int callout_id = 0;
+    }
+
     void do_template_action::operator()(iterator first, iterator) const
     {
         // Get the arguments and clear values stored in action.
@@ -854,13 +859,56 @@
                 actions.templates.set_parent_scope(*symbol->parent);
 
             ///////////////////////////////////
-            // Break the arguments
-            if (!break_arguments(args, symbol->params, pos))
+            // Initialise the arguments
+            
+            if (!symbol->callout)
             {
-                actions.pop(); // restore the actions' states
-                --actions.template_depth;
-                ++actions.error_count;
-                return;
+                // Break the arguments for a template
+            
+                if (!break_arguments(args, symbol->params, pos))
+                {
+                    actions.pop(); // restore the actions' states
+                    --actions.template_depth;
+                    ++actions.error_count;
+                    return;
+                }
+            }
+            else
+            {
+                if (!args.empty())
+                {
+                    detail::outerr(pos.file, pos.line)
+                        << "Arguments for code snippet."
+                        <<std::endl;
+                    ++actions.error_count;
+
+                    args.clear();
+                }
+
+                BOOST_ASSERT(symbol->params.size() % 2 == 0);
+                unsigned int size = symbol->params.size() / 2;
+
+                for(unsigned int i = 0; i < size; ++i)
+                {
+                    std::string callout_id = actions.doc_id +
+                        boost::lexical_cast<std::string>(detail::callout_id++);
+
+                    std::string code;
+                    code += "'''";
+                    code += "<co id=\"" + callout_id + "co\" ";
+                    code += "linkends=\"" + callout_id + "\" />";
+                    code += "'''";
+
+                    args.push_back(code);
+                    
+                    code.clear();
+                    code += "'''";
+                    code += "<callout arearefs=\"" + callout_id + "co\" ";
+                    code += "id=\"" + callout_id + "\">";
+                    code += "'''";
+
+                    args.push_back(code);
+                }
             }
 
             ///////////////////////////////////
@@ -1198,21 +1246,10 @@
         code += *first;
     }
 
-    namespace detail
-    {
-        int callout_id = 0;
-    }
-
     void code_snippet_actions::callout(iterator first, iterator last)
     {
-        using detail::callout_id;
-        code += "``'''";
-        code += "<co id=\"";
-        code += doc_id + boost::lexical_cast<std::string>(callout_id + callouts.size()) + "co\" ";
-        code += "linkends=\"";
-        code += doc_id + boost::lexical_cast<std::string>(callout_id + callouts.size()) + "\" />";
-        code += "'''``";
-
+        code += "``[[callout" + boost::lexical_cast<std::string>(callouts.size()) + "]]``";
+    
         callouts.push_back(std::string(first, last));
     }
 
@@ -1239,7 +1276,8 @@
 
     void code_snippet_actions::compile(iterator first, iterator last)
     {
-        using detail::callout_id;
+        std::vector<std::string> params;
+    
         if (!code.empty())
         {
             detail::unindent(code); // remove all indents
@@ -1252,29 +1290,32 @@
 
             if(callouts.size() > 0)
             {
+              std::vector<std::string> callout_items;
+            
               snippet += "'''<calloutlist>'''";
               for (size_t i = 0; i < callouts.size(); ++i)
               {
-                  snippet += "'''<callout arearefs=\"";
-                  snippet += doc_id + boost::lexical_cast<std::string>(callout_id + i) + "co\" ";
-                  snippet += "id=\"";
-                  snippet += doc_id + boost::lexical_cast<std::string>(callout_id + i) + "\">";
-                  snippet += "'''";
-
+                  std::string callout_template = "[callout" + boost::lexical_cast<std::string>(i) + "]";
+                  std::string calloutitem_template = "[calloutitem" + boost::lexical_cast<std::string>(i) + "]";
+              
+                  snippet += "[" + calloutitem_template + "]";
                   snippet += "'''<para>'''";
                   snippet += callouts[i];
                   snippet += "\n";
                   snippet += "'''</para>'''";
                   snippet += "'''</callout>'''";
+                  
+                  params.push_back(callout_template);
+                  params.push_back(calloutitem_template);
               }
               snippet += "'''</calloutlist>'''";
             }
         }
 
-        std::vector<std::string> empty_params;
-        storage.push_back(template_symbol(id, empty_params, snippet, first.get_position()));
+        template_symbol symbol(id, params, snippet, first.get_position());
+        symbol.callout = true;
+        storage.push_back(symbol);
 
-        callout_id += callouts.size();
         callouts.clear();
         code.clear();
         snippet.clear();
Modified: trunk/tools/quickbook/detail/template_stack.hpp
==============================================================================
--- trunk/tools/quickbook/detail/template_stack.hpp	(original)
+++ trunk/tools/quickbook/detail/template_stack.hpp	2010-07-10 07:24:54 EDT (Sat, 10 Jul 2010)
@@ -32,12 +32,14 @@
                 boost::spirit::classic::file_position const& position,
                 template_scope const* parent = 0)
            : identifier(identifier)
+           , callout(false)
            , params(params)
            , body(body)
            , position(position)
            , parent(parent) {}
 
         std::string identifier;
+        bool callout;
         std::vector<std::string> params;
         std::string body;
         boost::spirit::classic::file_position position;
Modified: trunk/tools/quickbook/doc/quickbook.qbk
==============================================================================
--- trunk/tools/quickbook/doc/quickbook.qbk	(original)
+++ trunk/tools/quickbook/doc/quickbook.qbk	2010-07-10 07:24:54 EDT (Sat, 10 Jul 2010)
@@ -210,6 +210,7 @@
     followed by whitespace or a list character.
   * Doesn't treat several consecutive blank lines as multiple paragraph breaks.
 * Fixes duplicate image attribute detection.
+* Fixes using code snippets more than once.
 * Early work on quickbook 1.6, available using the `[quickbook 1.6]` version switch,
   but liable to change in future versions.
   * When automatically generating ids for headers, use the quickbook
Modified: trunk/tools/quickbook/test/callouts.gold
==============================================================================
--- trunk/tools/quickbook/test/callouts.gold	(original)
+++ trunk/tools/quickbook/test/callouts.gold	2010-07-10 07:24:54 EDT (Sat, 10 Jul 2010)
@@ -66,4 +66,26 @@
   <para>
     </para></callout></calloutlist>
   </para>
+  <para>
+    Example 3 (again!):
+  </para>
+  <para>
+    
+<programlisting><phrase role="keyword">int</phrase> <phrase role="identifier">roll_die</phrase><phrase role="special">()</phrase> <phrase role="special">{</phrase>
+  <!--quickbook-escape-prefix--><co id="callout_tests3co" linkends="callout_tests3" /><!--quickbook-escape-postfix--><phrase role="identifier">boost</phrase><phrase role="special">::</phrase><phrase role="identifier">variate_generator</phrase><phrase role="special"><</phrase><phrase role="identifier">boost</phrase><phrase role="special">::</phrase><phrase role="identifier">mt19937</phrase><phrase role="special">&,</phrase> <phrase role="identifier">boost</phrase><phrase role="special">::</phrase><phrase role="identifier">uniform_int</phrase><phrase role="special"><></phrase> <phrase role="special">></phrase> <phrase role="identifier">die</phrase><phrase role="special">(</phrase><phrase role="identifier">gen</phrase><phrase role="special">,</phrase> <phrase role="identifier">dist</phrase><phrase role="special">);</phrase>
+<phrase role="special">}</phrase>
+
+</programlisting>
+  </para>
+  <para>
+    <calloutlist><callout arearefs="callout_tests3co" id="callout_tests3"><para>
+  </para>
+  <important>
+    <para>
+      test
+    </para>
+  </important>
+  <para>
+    </para></callout></calloutlist>
+  </para>
 </article>
Modified: trunk/tools/quickbook/test/callouts.quickbook
==============================================================================
--- trunk/tools/quickbook/test/callouts.quickbook	(original)
+++ trunk/tools/quickbook/test/callouts.quickbook	2010-07-10 07:24:54 EDT (Sat, 10 Jul 2010)
@@ -15,3 +15,7 @@
 Example 3:
 
 [example3]
+
+Example 3 (again!):
+
+[example3]