@@ -24,6 +24,9 @@ mod utils;
2424#[ cfg( feature = "csv" ) ]
2525pub mod csv;
2626
27+ #[ cfg( feature = "evcxr" ) ]
28+ pub mod evcxr;
29+
2730pub use row:: Row ;
2831pub use cell:: Cell ;
2932use format:: { TableFormat , LinePosition , consts} ;
@@ -204,6 +207,28 @@ impl<'a> TableSlice<'a> {
204207 pub fn printstd ( & self ) -> usize {
205208 self . print_tty ( false )
206209 }
210+
211+ /// Print table in HTML format to `out`.
212+ pub fn print_html < T : Write + ?Sized > ( & self , out : & mut T ) -> Result < ( ) , Error > {
213+ // Compute column width
214+ let column_num = self . get_column_num ( ) ;
215+ out. write_all ( b"<table>" ) ?;
216+ // Print titles / table header
217+ if let Some ( ref t) = * self . titles {
218+ out. write_all ( b"<th>" ) ?;
219+ t. print_html ( out, column_num) ?;
220+ out. write_all ( b"</th>" ) ?;
221+ }
222+ // Print rows
223+ for r in self . rows {
224+ out. write_all ( b"<tr>" ) ?;
225+ r. print_html ( out, column_num) ?;
226+ out. write_all ( b"</tr>" ) ?;
227+ }
228+ out. write_all ( b"</table>" ) ?;
229+ out. flush ( ) ?;
230+ Ok ( ( ) )
231+ }
207232}
208233
209234impl < ' a > IntoIterator for & ' a TableSlice < ' a > {
@@ -372,6 +397,10 @@ impl Table {
372397 self . as_ref ( ) . printstd ( )
373398 }
374399
400+ /// Print table in HTML format to `out`.
401+ pub fn print_html < T : Write + ?Sized > ( & self , out : & mut T ) -> Result < ( ) , Error > {
402+ self . as_ref ( ) . print_html ( out)
403+ }
375404}
376405
377406impl Index < usize > for Table {
@@ -980,4 +1009,69 @@ mod tests {
9801009 assert_eq ! ( out, table. to_string( ) . replace( "\r \n " , "\n " ) ) ;
9811010 assert_eq ! ( 7 , table. print( & mut StringWriter :: new( ) ) . unwrap( ) ) ;
9821011 }
1012+
1013+ #[ test]
1014+ fn table_html ( ) {
1015+ let mut table = Table :: new ( ) ;
1016+ table. add_row ( Row :: new ( vec ! [ Cell :: new( "a" ) , Cell :: new( "bc" ) , Cell :: new( "def" ) ] ) ) ;
1017+ table. add_row ( Row :: new ( vec ! [ Cell :: new( "def" ) , Cell :: new( "bc" ) , Cell :: new( "a" ) ] ) ) ;
1018+ table. set_titles ( Row :: new ( vec ! [ Cell :: new( "t1" ) , Cell :: new( "t2" ) , Cell :: new( "t3" ) ] ) ) ;
1019+ let out = "\
1020+ <table>\
1021+ <th><td style=\" text-align: left;\" >t1</td><td style=\" text-align: left;\" >t2</td><td style=\" text-align: left;\" >t3</td></th>\
1022+ <tr><td style=\" text-align: left;\" >a</td><td style=\" text-align: left;\" >bc</td><td style=\" text-align: left;\" >def</td></tr>\
1023+ <tr><td style=\" text-align: left;\" >def</td><td style=\" text-align: left;\" >bc</td><td style=\" text-align: left;\" >a</td></tr>\
1024+ </table>";
1025+ let mut writer = StringWriter :: new ( ) ;
1026+ assert ! ( table. print_html( & mut writer) . is_ok( ) ) ;
1027+ assert_eq ! ( writer. as_string( ) . replace( "\r \n " , "\n " ) , out) ;
1028+ table. unset_titles ( ) ;
1029+ let out = "\
1030+ <table>\
1031+ <tr><td style=\" text-align: left;\" >a</td><td style=\" text-align: left;\" >bc</td><td style=\" text-align: left;\" >def</td></tr>\
1032+ <tr><td style=\" text-align: left;\" >def</td><td style=\" text-align: left;\" >bc</td><td style=\" text-align: left;\" >a</td></tr>\
1033+ </table>";
1034+ let mut writer = StringWriter :: new ( ) ;
1035+ assert ! ( table. print_html( & mut writer) . is_ok( ) ) ;
1036+ assert_eq ! ( writer. as_string( ) . replace( "\r \n " , "\n " ) , out) ;
1037+ }
1038+
1039+ #[ test]
1040+ fn table_html_colors ( ) {
1041+ let mut table = Table :: new ( ) ;
1042+ table. add_row ( Row :: new ( vec ! [
1043+ Cell :: new( "bold" ) . style_spec( "b" ) ,
1044+ Cell :: new( "italic" ) . style_spec( "i" ) ,
1045+ Cell :: new( "underline" ) . style_spec( "u" ) ,
1046+ ] ) ) ;
1047+ table. add_row ( Row :: new ( vec ! [
1048+ Cell :: new( "left" ) . style_spec( "l" ) ,
1049+ Cell :: new( "center" ) . style_spec( "c" ) ,
1050+ Cell :: new( "right" ) . style_spec( "r" ) ,
1051+ ] ) ) ;
1052+ table. add_row ( Row :: new ( vec ! [
1053+ Cell :: new( "red" ) . style_spec( "Fr" ) ,
1054+ Cell :: new( "black" ) . style_spec( "Fd" ) ,
1055+ Cell :: new( "yellow" ) . style_spec( "Fy" ) ,
1056+ ] ) ) ;
1057+ table. add_row ( Row :: new ( vec ! [
1058+ Cell :: new( "bright magenta on cyan" ) . style_spec( "FMBc" ) ,
1059+ Cell :: new( "white on bright green" ) . style_spec( "FwBG" ) ,
1060+ Cell :: new( "default on blue" ) . style_spec( "Bb" ) ,
1061+ ] ) ) ;
1062+ table. set_titles ( Row :: new ( vec ! [
1063+ Cell :: new( "span horizontal" ) . style_spec( "H3" ) ,
1064+ ] ) ) ;
1065+ let out = "\
1066+ <table>\
1067+ <th><td colspan=\" 3\" style=\" text-align: left;\" >span horizontal</td></th>\
1068+ <tr><td style=\" font-weight: bold;text-align: left;\" >bold</td><td style=\" font-style: italic;text-align: left;\" >italic</td><td style=\" text-decoration: underline;text-align: left;\" >underline</td></tr>\
1069+ <tr><td style=\" text-align: left;\" >left</td><td style=\" text-align: center;\" >center</td><td style=\" text-align: right;\" >right</td></tr>\
1070+ <tr><td style=\" color: #aa0000;text-align: left;\" >red</td><td style=\" color: #000000;text-align: left;\" >black</td><td style=\" color: #aa5500;text-align: left;\" >yellow</td></tr>\
1071+ <tr><td style=\" color: #ff55ff;background-color: #00aaaa;text-align: left;\" >bright magenta on cyan</td><td style=\" color: #aaaaaa;background-color: #55ff55;text-align: left;\" >white on bright green</td><td style=\" background-color: #0000aa;text-align: left;\" >default on blue</td></tr>\
1072+ </table>";
1073+ let mut writer = StringWriter :: new ( ) ;
1074+ assert ! ( table. print_html( & mut writer) . is_ok( ) ) ;
1075+ assert_eq ! ( writer. as_string( ) . replace( "\r \n " , "\n " ) , out) ;
1076+ }
9831077}
0 commit comments