|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r54138 - in branches/quickbook-1.5: . detail test
From: daniel_james_at_[hidden]
Date: 2009-06-21 04:22:08
Author: danieljames
Date: 2009-06-21 04:22:07 EDT (Sun, 21 Jun 2009)
New Revision: 54138
URL: http://svn.boost.org/trac/boost/changeset/54138
Log:
Support image attributes. Refs #1157.
Added:
branches/quickbook-1.5/test/image_1_5.gold (contents, props changed)
branches/quickbook-1.5/test/image_1_5.quickbook (contents, props changed)
Text files modified:
branches/quickbook-1.5/detail/actions.cpp | 63 ++++++++++++++++++++++++++++++---------
branches/quickbook-1.5/detail/actions.hpp | 28 ++++++++++++++++-
branches/quickbook-1.5/detail/actions_class.cpp | 6 +++
branches/quickbook-1.5/detail/actions_class.hpp | 4 ++
branches/quickbook-1.5/phrase.hpp | 29 +++++++++++++++---
branches/quickbook-1.5/test/Jamfile.v2 | 1
6 files changed, 108 insertions(+), 23 deletions(-)
Modified: branches/quickbook-1.5/detail/actions.cpp
==============================================================================
--- branches/quickbook-1.5/detail/actions.cpp (original)
+++ branches/quickbook-1.5/detail/actions.cpp 2009-06-21 04:22:07 EDT (Sun, 21 Jun 2009)
@@ -400,11 +400,29 @@
detail::print_char(*first, phrase.get());
}
- void image_action::operator()(iterator first, iterator last) const
+ void attribute_action::operator()(iterator first, iterator last) const
{
- fs::path const img_path(std::string(first, last));
+ boost::spirit::classic::file_position const pos = first.get_position();
+
+ if (!attributes.insert(
+ attribute_map::value_type(attribute_name, std::string(first, last))
+ ).second)
+ {
+ detail::outerr(pos.file,pos.line)
+ << "Repeated attribute: " << attribute_name << ".\n";
+ }
+ }
+
+ void image_action::operator()(iterator, iterator) const
+ {
+ fs::path const img_path(image_fileref);
+
+ attribute_map::iterator it = attributes.find("alt");
+ std::string alt_text = it != attributes.end() ? it->second : fs::basename(img_path);
+ attributes.erase("alt");
+
+ attributes.insert(attribute_map::value_type("fileref", image_fileref));
- std::string attr_text;
if(fs::extension(img_path) == ".svg")
{
//
@@ -418,7 +436,7 @@
// a tiny box with scrollbars (Firefox), or else cropped to
// fit in a tiny box (IE7).
//
- attr_text = " format=\"SVG\"";
+ attributes.insert(attribute_map::value_type("format", "SVG"));
//
// Image paths are relative to the html subdirectory:
//
@@ -452,8 +470,8 @@
b = svg_text.find('\"', a + 1);
if(a != std::string::npos)
{
- attr_text.append(" contentwidth=");
- attr_text.append(svg_text.begin() + a, svg_text.begin() + b + 1);
+ attributes.insert(attribute_map::value_type("contentwidth",
+ std::string(svg_text.begin() + a + 1, svg_text.begin() + b)));
}
a = svg_text.find("height");
a = svg_text.find('=', a);
@@ -461,24 +479,39 @@
b = svg_text.find('\"', a + 1);
if(a != std::string::npos)
{
- attr_text.append(" contentdepth=");
- attr_text.append(svg_text.begin() + a, svg_text.begin() + b + 1);
+ attributes.insert(attribute_map::value_type("contentdepth",
+ std::string(svg_text.begin() + a + 1, svg_text.begin() + b)));
}
}
phrase << "<inlinemediaobject>";
- phrase << "<imageobject><imagedata ";
- phrase << attr_text;
- phrase << " fileref=\"";
- while (first != last)
- detail::print_char(*first++, phrase.get());
- phrase << "\"></imagedata></imageobject>";
+ phrase << "<imageobject><imagedata";
+
+ for(attribute_map::const_iterator
+ attr_first = attributes.begin(), attr_last = attributes.end();
+ attr_first != attr_last; ++attr_first)
+ {
+ phrase << " " << attr_first->first << "=\"";
+
+ for(std::string::const_iterator
+ first = attr_first->second.begin(),
+ last = attr_first->second.end();
+ first != last; ++first)
+ {
+ if (*first == '\\' && ++first == last) break;
+ detail::print_char(*first, phrase.get());
+ }
+
+ phrase << "\"";
+ }
+
+ phrase << "></imagedata></imageobject>";
// Also add a textobject -- use the basename of the image file.
// This will mean we get "alt" attributes of the HTML img.
phrase << "<textobject><phrase>";
- detail::print_string(fs::basename(img_path), phrase.get());
+ detail::print_string(alt_text, phrase.get());
phrase << "</phrase></textobject>";
phrase << "</inlinemediaobject>";
Modified: branches/quickbook-1.5/detail/actions.hpp
==============================================================================
--- branches/quickbook-1.5/detail/actions.hpp (original)
+++ branches/quickbook-1.5/detail/actions.hpp 2009-06-21 04:22:07 EDT (Sun, 21 Jun 2009)
@@ -36,6 +36,7 @@
namespace fs = boost::filesystem;
typedef position_iterator<std::string::const_iterator> iterator;
typedef symbols<std::string> string_symbols;
+ typedef std::map<std::string, std::string> attribute_map;
struct actions;
extern tm* current_time; // the current time
@@ -369,17 +370,40 @@
collector& phrase;
};
+
+ struct attribute_action
+ {
+ // Handle image attributes
+
+ attribute_action(
+ attribute_map& attributes
+ , std::string& attribute_name)
+ : attributes(attributes)
+ , attribute_name(attribute_name) {}
+
+ void operator()(iterator first, iterator last) const;
+
+ attribute_map& attributes;
+ std::string& attribute_name;
+ };
struct image_action
{
// Handles inline images
- image_action(collector& phrase)
- : phrase(phrase) {}
+ image_action(
+ collector& phrase
+ , attribute_map& attributes
+ , std::string& image_fileref)
+ : phrase(phrase)
+ , attributes(attributes)
+ , image_fileref(image_fileref) {}
void operator()(iterator first, iterator last) const;
collector& phrase;
+ attribute_map& attributes;
+ std::string& image_fileref;
};
struct markup_action
Modified: branches/quickbook-1.5/detail/actions_class.cpp
==============================================================================
--- branches/quickbook-1.5/detail/actions_class.cpp (original)
+++ branches/quickbook-1.5/detail/actions_class.cpp 2009-06-21 04:22:07 EDT (Sun, 21 Jun 2009)
@@ -64,6 +64,9 @@
, template_escape(false)
, templates()
, error_count(0)
+ , image_fileref()
+ , attribute_name()
+ , attributes()
// actions
, error(error_count)
@@ -94,7 +97,8 @@
, tip(out, temp_para, tip_pre, tip_post)
, plain_char(phrase)
, raw_char(phrase)
- , image(phrase)
+ , attribute(attributes, attribute_name)
+ , image(phrase, attributes, image_fileref)
, cond_phrase_pre(phrase, conditions, macro)
, cond_phrase_post(phrase, conditions, macro)
Modified: branches/quickbook-1.5/detail/actions_class.hpp
==============================================================================
--- branches/quickbook-1.5/detail/actions_class.hpp (original)
+++ branches/quickbook-1.5/detail/actions_class.hpp 2009-06-21 04:22:07 EDT (Sun, 21 Jun 2009)
@@ -92,6 +92,9 @@
bool template_escape;
template_stack templates;
int error_count;
+ std::string image_fileref;
+ std::string attribute_name;
+ attribute_map attributes;
// push/pop the states and the streams
void push();
@@ -117,6 +120,7 @@
phrase_action warning, caution, important, note, tip;
plain_char_action plain_char;
raw_char_action raw_char;
+ attribute_action attribute;
image_action image;
cond_phrase_action_pre cond_phrase_pre;
cond_phrase_action_post cond_phrase_post;
Modified: branches/quickbook-1.5/phrase.hpp
==============================================================================
--- branches/quickbook-1.5/phrase.hpp (original)
+++ branches/quickbook-1.5/phrase.hpp 2009-06-21 04:22:07 EDT (Sun, 21 Jun 2009)
@@ -16,6 +16,7 @@
#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>
namespace quickbook
@@ -290,11 +291,29 @@
;
image =
- '$' >> blank
- >> (*(anychar_p -
- phrase_end)) [actions.image]
+ '$' >> blank [clear_a(actions.attributes)]
+ >> if_p(qbk_since(105u)) [
+ (+(
+ *space_p
+ >> +(anychar_p - (space_p | phrase_end | '['))
+ )) [assign_a(actions.image_fileref)]
+ >> hard_space
+ >> *(
+ '['
+ >> (*(alnum_p | '_')) [assign_a(actions.attribute_name)]
+ >> space
+ >> (*(anychar_p - (phrase_end | '[')))
+ [actions.attribute]
+ >> ']'
+ >> space
+ )
+ ].else_p [
+ (*(anychar_p -
+ phrase_end)) [assign_a(actions.image_fileref)]
+ ]
+ >> eps_p(']') [actions.image]
;
-
+
url =
'@'
>> (*(anychar_p -
@@ -453,7 +472,7 @@
dummy_block, cond_phrase, macro_identifier, template_args,
template_args_1_4, template_arg_1_4, brackets_1_4,
template_args_1_5, template_arg_1_5,
- template_inner_arg_1_5, brackets_1_5,
+ template_inner_arg_1_5, brackets_1_5
;
rule<Scanner> const&
Modified: branches/quickbook-1.5/test/Jamfile.v2
==============================================================================
--- branches/quickbook-1.5/test/Jamfile.v2 (original)
+++ branches/quickbook-1.5/test/Jamfile.v2 2009-06-21 04:22:07 EDT (Sun, 21 Jun 2009)
@@ -28,6 +28,7 @@
[ quickbook-test section_1_4 ]
[ quickbook-test section_1_5 ]
[ quickbook-test table_1_5 ]
+ [ quickbook-test image_1_5 ]
[ quickbook-fail-test fail-include ]
[ quickbook-fail-test fail-import ]
[ quickbook-fail-test fail-template-arguments1 ]
Added: branches/quickbook-1.5/test/image_1_5.gold
==============================================================================
--- (empty file)
+++ branches/quickbook-1.5/test/image_1_5.gold 2009-06-21 04:22:07 EDT (Sun, 21 Jun 2009)
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN" "http://www.boost.org/tools/boostbook/dtd/boostbook.dtd">
+<article id="images_1_5" last-revision="DEBUG MODE Date: 2000/12/20 12:00:00 $" xmlns:xi="http://www.w3.org/2001/XInclude">
+ <title>Images 1.5</title>
+ <articleinfo>
+ </articleinfo>
+ <para>
+ <inlinemediaobject><imageobject><imagedata fileref="test.gif"></imagedata></imageobject>
+ <textobject>
+ <phrase>test</phrase>
+ </textobject>
+ </inlinemediaobject> <inlinemediaobject><imageobject><imagedata fileref="test this.gif"></imagedata></imageobject>
+ <textobject>
+ <phrase>test this</phrase>
+ </textobject>
+ </inlinemediaobject> <inlinemediaobject><imageobject><imagedata fileref="test&this.gif"></imagedata></imageobject>
+ <textobject>
+ <phrase>test&this</phrase>
+ </textobject>
+ </inlinemediaobject> <inlinemediaobject><imageobject><imagedata fileref="test.gif"
+ height="10cm" width="10cm"></imagedata></imageobject>
+ <textobject>
+ <phrase>test</phrase>
+ </textobject>
+ </inlinemediaobject> <inlinemediaobject><imageobject><imagedata fileref="test.gif"></imagedata></imageobject>
+ <textobject>
+ <phrase>Foo</phrase>
+ </textobject>
+ </inlinemediaobject> <inlinemediaobject><imageobject><imagedata fileref="test.gif"></imagedata></imageobject>
+ <textobject>
+ <phrase>Foobie foobie foo</phrase>
+ </textobject>
+ </inlinemediaobject> <inlinemediaobject><imageobject><imagedata fileref="test.gif"></imagedata></imageobject>
+ <textobject>
+ <phrase>Foo & bar</phrase>
+ </textobject>
+ </inlinemediaobject> <inlinemediaobject><imageobject><imagedata fileref="test.gif"
+ height="10cm" width="10cm"></imagedata></imageobject>
+ <textobject>
+ <phrase>Foo</phrase>
+ </textobject>
+ </inlinemediaobject>
+ </para>
+ <para>
+ <inlinemediaobject><imageobject><imagedata fileref="test.gif"></imagedata></imageobject>
+ <textobject>
+ <phrase>test</phrase>
+ </textobject>
+ </inlinemediaobject> <inlinemediaobject><imageobject><imagedata fileref="test.gif"></imagedata></imageobject>
+ <textobject>
+ <phrase>test</phrase>
+ </textobject>
+ </inlinemediaobject> <inlinemediaobject><imageobject><imagedata fileref="test.gif"></imagedata></imageobject>
+ <textobject>
+ <phrase>comment</phrase>
+ </textobject>
+ </inlinemediaobject>
+ </para>
+</article>
Added: branches/quickbook-1.5/test/image_1_5.quickbook
==============================================================================
--- (empty file)
+++ branches/quickbook-1.5/test/image_1_5.quickbook 2009-06-21 04:22:07 EDT (Sun, 21 Jun 2009)
@@ -0,0 +1,16 @@
+[article Images 1.5
+ [quickbook 1.5]
+]
+
+[$test.gif]
+[$test this.gif]
+[$test&this.gif]
+[$test.gif [width 10cm] [height 10cm]]
+[$test.gif [alt Foo]]
+[$test.gif [alt Foobie foobie foo]]
+[$test.gif [alt Foo & bar]]
+[$test.gif [alt Foo] [width 10cm] [height 10cm]]
+
+[$ [/comment] test.gif ]
+[$ [/comment] test.gif [/comment] ]
+[$ [/comment] test.gif [/comment] [alt comment] ]
\ No newline at end of file
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk