@@ -720,9 +720,12 @@ fn table_to_render_tree<'a, 'b, T: Write>(
720
720
html_trace ! ( "Found in table: {:?}" , bodynode. info) ;
721
721
}
722
722
}
723
- Ok ( Some ( RenderNode :: new ( RenderNodeInfo :: Table ( RenderTable :: new (
724
- rows,
725
- ) ) ) ) )
723
+ if rows. is_empty ( ) {
724
+ Ok ( None )
725
+ } else {
726
+ Ok ( Some ( RenderNode :: new ( RenderNodeInfo :: Table ( RenderTable :: new (
727
+ rows) ) ) ) )
728
+ }
726
729
} )
727
730
}
728
731
@@ -731,7 +734,7 @@ fn tbody_to_render_tree<'a, 'b, T: Write>(
731
734
handle : Handle ,
732
735
_err_out : & ' b mut T ,
733
736
) -> TreeMapResult < ' a , HtmlContext , Handle , RenderNode > {
734
- pending ( handle, |_, rowchildren| {
737
+ pending_noempty ( handle, |_, rowchildren| {
735
738
let mut rows = rowchildren
736
739
. into_iter ( )
737
740
. flat_map ( |rownode| {
@@ -1038,6 +1041,24 @@ where
1038
1041
}
1039
1042
}
1040
1043
1044
+ fn pending_noempty < ' a , F > ( handle : Handle , f : F ) -> TreeMapResult < ' a , HtmlContext , Handle , RenderNode >
1045
+ where
1046
+ for < ' r > F : Fn ( & ' r mut HtmlContext , std:: vec:: Vec < RenderNode > ) -> Result < Option < RenderNode > > + ' static ,
1047
+ {
1048
+ TreeMapResult :: PendingChildren {
1049
+ children : handle. children . borrow ( ) . clone ( ) ,
1050
+ cons : Box :: new ( move |ctx, children| {
1051
+ if children. is_empty ( ) {
1052
+ Ok ( None )
1053
+ } else {
1054
+ f ( ctx, children)
1055
+ }
1056
+ } ) ,
1057
+ prefn : None ,
1058
+ postfn : None ,
1059
+ }
1060
+ }
1061
+
1041
1062
/// Prepend a FragmentStart (or analogous) marker to an existing
1042
1063
/// RenderNode.
1043
1064
fn prepend_marker ( prefix : RenderNode , mut orig : RenderNode ) -> RenderNode {
@@ -1160,7 +1181,7 @@ fn process_dom_node<'a, 'b, 'c, T: Write>(
1160
1181
}
1161
1182
expanded_name ! ( html "span" ) => {
1162
1183
/* process children, but don't add anything */
1163
- pending ( handle, |_, cs| Ok ( Some ( RenderNode :: new ( Container ( cs) ) ) ) )
1184
+ pending_noempty ( handle, |_, cs| Ok ( Some ( RenderNode :: new ( Container ( cs) ) ) ) )
1164
1185
}
1165
1186
#[ cfg( feature = "css" ) ]
1166
1187
expanded_name ! ( html "font" ) => {
@@ -1178,9 +1199,9 @@ fn process_dom_node<'a, 'b, 'c, T: Write>(
1178
1199
}
1179
1200
}
1180
1201
if let Some ( colour) = colour {
1181
- pending ( handle, move |_, cs| Ok ( Some ( RenderNode :: new ( Coloured ( colour, vec ! [ RenderNode :: new( Container ( cs) ) ] ) ) ) ) )
1202
+ pending_noempty ( handle, move |_, cs| Ok ( Some ( RenderNode :: new ( Coloured ( colour, vec ! [ RenderNode :: new( Container ( cs) ) ] ) ) ) ) )
1182
1203
} else {
1183
- pending ( handle, |_, cs| Ok ( Some ( RenderNode :: new ( Container ( cs) ) ) ) )
1204
+ pending_noempty ( handle, |_, cs| Ok ( Some ( RenderNode :: new ( Container ( cs) ) ) ) )
1184
1205
}
1185
1206
}
1186
1207
expanded_name ! ( html "a" ) => {
@@ -1257,13 +1278,13 @@ fn process_dom_node<'a, 'b, 'c, T: Write>(
1257
1278
} )
1258
1279
}
1259
1280
expanded_name ! ( html "p" ) => {
1260
- pending ( handle, |_, cs| Ok ( Some ( RenderNode :: new ( Block ( cs) ) ) ) )
1281
+ pending_noempty ( handle, |_, cs| Ok ( Some ( RenderNode :: new ( Block ( cs) ) ) ) )
1261
1282
}
1262
1283
expanded_name ! ( html "li" ) => {
1263
1284
pending ( handle, |_, cs| Ok ( Some ( RenderNode :: new ( ListItem ( cs) ) ) ) )
1264
1285
}
1265
1286
expanded_name ! ( html "div" ) => {
1266
- pending ( handle, |_, cs| Ok ( Some ( RenderNode :: new ( Div ( cs) ) ) ) )
1287
+ pending_noempty ( handle, |_, cs| Ok ( Some ( RenderNode :: new ( Div ( cs) ) ) ) )
1267
1288
}
1268
1289
expanded_name ! ( html "pre" ) => {
1269
1290
pending ( handle, |_, cs| Ok ( Some ( RenderNode :: new ( Pre ( cs) ) ) ) )
@@ -1278,10 +1299,10 @@ fn process_dom_node<'a, 'b, 'c, T: Write>(
1278
1299
td_to_render_tree ( handle. clone ( ) , err_out)
1279
1300
}
1280
1301
expanded_name ! ( html "blockquote" ) => {
1281
- pending ( handle, |_, cs| Ok ( Some ( RenderNode :: new ( BlockQuote ( cs) ) ) ) )
1302
+ pending_noempty ( handle, |_, cs| Ok ( Some ( RenderNode :: new ( BlockQuote ( cs) ) ) ) )
1282
1303
}
1283
1304
expanded_name ! ( html "ul" ) => {
1284
- pending ( handle, |_, cs| Ok ( Some ( RenderNode :: new ( Ul ( cs) ) ) ) )
1305
+ pending_noempty ( handle, |_, cs| Ok ( Some ( RenderNode :: new ( Ul ( cs) ) ) ) )
1285
1306
}
1286
1307
expanded_name ! ( html "ol" ) => {
1287
1308
let borrowed = attrs. borrow ( ) ;
@@ -1293,7 +1314,7 @@ fn process_dom_node<'a, 'b, 'c, T: Write>(
1293
1314
}
1294
1315
}
1295
1316
1296
- pending ( handle, move |_, cs| {
1317
+ pending_noempty ( handle, move |_, cs| {
1297
1318
dbg ! ( & cs) ;
1298
1319
let cs = cs. into_iter ( )
1299
1320
. filter ( |n| match & n. info {
@@ -1310,7 +1331,7 @@ fn process_dom_node<'a, 'b, 'c, T: Write>(
1310
1331
) ) ) ,
1311
1332
_ => {
1312
1333
html_trace ! ( "Unhandled element: {:?}\n " , name. local) ;
1313
- pending ( handle, |_, cs| Ok ( Some ( RenderNode :: new ( Container ( cs) ) ) ) )
1334
+ pending_noempty ( handle, |_, cs| Ok ( Some ( RenderNode :: new ( Container ( cs) ) ) ) )
1314
1335
//None
1315
1336
}
1316
1337
} ;
@@ -1742,6 +1763,10 @@ fn render_table_tree<T: Write, D: TextDecorator>(
1742
1763
. saturating_sub ( 1 )
1743
1764
} ;
1744
1765
1766
+ if table_width == 0 {
1767
+ return Ok ( TreeMapResult :: Nothing ) ;
1768
+ }
1769
+
1745
1770
renderer. add_horizontal_border_width ( table_width) ?;
1746
1771
1747
1772
Ok ( TreeMapResult :: PendingChildren {
0 commit comments