|
Boost : |
From: Reece Dunn (msclrhd_at_[hidden])
Date: 2004-09-17 04:01:07
Jonathan Turkanis wrote:
>"Reece Dunn" <msclrhd_at_[hidden]> wrote in message
>news:BAY24-F288Jecd92bXC000d4659_at_hotmail.com...
> > Although my library is still under review, I am re-architecturing it
>based
> > on the feedback thus far. This post is the code associated with what was
>the
> > delimiters/formatters part of the library. They are now given the better
> > name of "decorators".
>
>Hi Reece,
>
> I'm planning to post a review [ favorable, presumably ;-) ], but
>haven't
>started to read the thread yet.
Great.
> I'm sorry I was never able to follow through on my ideas for your
>library --
>I just got too busy with other things.
No worries.
>If there you feel there are some major
>architectural changes that need to be made, I'm still interested in
>collaborating. My main ideas were a introducing cascading style sheets and
>inline formatters using expression templates.
Formatters are dead! Long live decorators! ;) I am intrigued by the idea of
cascading style sheets (CSS), but have a question regarding inlined
formatters/decorators:
What can you do with inlined decorators that you can't do with the
format/decorate function? For example:
namespace io = boost::io;
namespace fmt = boost::io::format;
std::cout << io::object( ob,
fmt::container( fmt::pair().decorate( "( ", " )" )).decorate( "[{
", " }]" )
).decorate( " - " );
// output: [{ ( a, 5 ), ( b, -1 ) }]
How do you envision CSS working? The way I see it is that you are viewing
the format objects as HTML tags that have a style attribute associated with
them that contains a set of ( attribute, value ) pairs (a std::map<
std::string, std::string >?)
This way, the decorate function would be the equivalent of setting the style
attribute:
fmt::pair().decorate( "( ", " )" ); // <pair style = "open: '( '; close:
' )';"/>
You can also set CSS properties within script code, e.g.
tag.style.fontFamily = "Times New Roman";
This style behaviour is available in the new decorators, for example:
io::wrapper_decorators< char > wrap;
wrap.open = "<< ";
wrap.close = " >>";
If you save a format object for use later, e.g.:
fmt::container_t< char, fmt::pair_t< char > > my_fo = fmt::container(
fmt::pair());
The library should support decorating nested format objects, e.g.:
my_fo.elem.open = "<< ";
my_ob.elem.close = " >>";
my_ob.separator = " | ";
std::cout << io::object( ob, my_ob ); // output: [ << a, 5 >> | << b, -1
>> ]
HTML allows you to associate a stylesheet file with the HTML markup that
sets how certain tags are displayed, e.g.:
body{ color: red; }
This will set the font colour of the body element to red. I suppose the
equivalent here would be the various format objects (each having a "tag"
name) and the style being saved on a stream. This would allow something
like:
std::cout << ( io::css[ "container" ].separator = " : " )
<< io::object( ob ); // output: [ [ a, 5 ] : [ b, -1 ] ]
std::wcout << ( io::css[ L"pair" ].separator = L" = " )
<< io::object( ob ); // output: [ [ a = 5 ], [ b = -1 ] ]
With the "body{ color: red; }" example, the CSS attribute is inherited to
all its child tags. The question here would be: should styling be inherited?
Regards,
Reece
_________________________________________________________________
Express yourself with cool new emoticons http://www.msn.co.uk/specials/myemo
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk