
Throughout this e-mail, I assume the following aliases: namespace io = boost::io; namespace fmt = boost::io::format; namespace css = boost::io::css; NOTE: This is a design outline for features in a future version of the library. David Abrahams has suggested the ability to specify default formatting on a stream. I have implemented a simple version of this so that you can do: io::sequence_decorators< char > seq( "; " ); std::cout << '"' << seq.open( std::cout ) << "\"\n" // "[ " << '"' << seq.close( std::cout ) << "\"\n" // " ]" << '"' << seq.separator( std::cout ) << "\"\n"; // "; " where separator( std::cout ) uses the separator value specified by seq and the others use the values set on the std::cout stream. To change these defaults, you can use: std::cout << io::cdecorate( "[{ ", " }]" ); // [{ a, b, c }] The problem with this is that it changes the defaults for all the formatting used, thus you cannot have different defaults for sequences and n-ary types. Cascading Style Sheets (CSS) are a web standard [http://www.w3.org/Style/CSS/] used for controlling how HTML tags are displayed to different devices (screen, printer and speech). == Inlined Styles In HTML you can specify "inlined" styles using a style attribute, e.g.: <div style = "color: red;">Red Text</div> My library equivalent is to use the decorate() function, e.g.: fmt::range().decorate( "<-- ", " -->" ); == Dynamic Styles 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 = " >>"; A more complex example that uses nested format objects: fmt::container_t< char, fmt::pair_t< char > > my_fo = fmt::container( fmt::pair()); my_fo.elem.open = "<< "; my_ob.elem.close = " >>"; my_ob.separator = " | "; std::cout << io::object( ob, my_ob ); // output: [ << a, 5 >> | << b, -1
]
== Cascading Style Sheets HTML provides a <style> tag to specify styling across the document without linking to an external file, e.g.: <style>h1{ color: orange; font-size: 2pc; }</style> The equivalent within my library would be to define the styling on a stream, e.g.: std::cout << css::element( "pair" ) [ ( css::attribute( "open" ) = "<< " ) + ( css::attribute( "close" ) = " >>" ) ] << css::element( "container" ) [ css::attribute( "separator" ) = " | " ] << io::object( ob ) // output: [ << a, 5 >> | << b, -1 >> ] << css::element( "pair" ) [ css::attribute( "separator" ) = " = " ] << io::object( ob ); // output: [ << a = 5 >> | << b = -1 >> ] HTML can import styling from an external CSS file. The equivalent would be to use an object to hold the styling, e.g.: css::stylesheet< char > style = css::element( "pair" ) [ css::attribute( "separator" ) = " = " ] + css::element( "container" ) [ ( css::attribute( "open" ) = "{ " ) + ( css::attribute( "close" ) = " }" ) ] ; std::cout << style << io::object( ob ); // output: { [ a = 5 ], [ b = -1 ] } It should be possible to provide the ability to save/load styling to/from a file and allow copying of style objects, e.g.: css::stylesheet< char > style2( "mystyles.style" ); // load styling style.load( "newstyles.style" ); style = style2; style.save( "stylings.sty" ); NOTE: The css::stylesheet class will store the styles using something like: std::map< std::string, std::map< std::string, std::string > > therefore it will be possible to use my library to implement the load and save facilities! Regards, Reece _________________________________________________________________ It's fast, it's easy and it's free. Get MSN Messenger today! http://www.msn.co.uk/messenger