@@ -1345,6 +1345,55 @@ impl<'a> Markdown<'a> {
1345
1345
let p = TableWrapper :: new ( p) ;
1346
1346
CodeBlocks :: new ( p, codes, edition, playground)
1347
1347
}
1348
+
1349
+ /// Convert markdown to (summary, remaining) HTML.
1350
+ ///
1351
+ /// - The summary is the first top-level Markdown element (usually a paragraph, but potentially
1352
+ /// any block).
1353
+ /// - The remaining docs contain everything after the summary.
1354
+ pub ( crate ) fn split_summary_and_content ( self ) -> ( Option < String > , Option < String > ) {
1355
+ if self . content . is_empty ( ) {
1356
+ return ( None , None ) ;
1357
+ }
1358
+ let mut p = self . into_iter ( ) ;
1359
+
1360
+ let mut event_level = 0 ;
1361
+ let mut summary_events = Vec :: new ( ) ;
1362
+ let mut get_next_tag = false ;
1363
+
1364
+ let mut end_of_summary = false ;
1365
+ while let Some ( event) = p. next ( ) {
1366
+ match event {
1367
+ Event :: Start ( _) => event_level += 1 ,
1368
+ Event :: End ( kind) => {
1369
+ event_level -= 1 ;
1370
+ if event_level == 0 {
1371
+ // We're back at the "top" so it means we're done with the summary.
1372
+ end_of_summary = true ;
1373
+ // We surround tables with `<div>` HTML tags so this is a special case.
1374
+ get_next_tag = kind == TagEnd :: Table ;
1375
+ }
1376
+ }
1377
+ _ => { }
1378
+ }
1379
+ summary_events. push ( event) ;
1380
+ if end_of_summary {
1381
+ if get_next_tag && let Some ( event) = p. next ( ) {
1382
+ summary_events. push ( event) ;
1383
+ }
1384
+ break ;
1385
+ }
1386
+ }
1387
+ let mut summary = String :: new ( ) ;
1388
+ html:: push_html ( & mut summary, summary_events. into_iter ( ) ) ;
1389
+ if summary. is_empty ( ) {
1390
+ return ( None , None ) ;
1391
+ }
1392
+ let mut content = String :: new ( ) ;
1393
+ html:: push_html ( & mut content, p) ;
1394
+
1395
+ if content. is_empty ( ) { ( Some ( summary) , None ) } else { ( Some ( summary) , Some ( content) ) }
1396
+ }
1348
1397
}
1349
1398
1350
1399
impl MarkdownWithToc < ' _ > {
@@ -1416,52 +1465,6 @@ impl MarkdownItemInfo<'_> {
1416
1465
}
1417
1466
}
1418
1467
1419
- pub ( crate ) fn markdown_split_summary_and_content (
1420
- md : Markdown < ' _ > ,
1421
- ) -> ( Option < String > , Option < String > ) {
1422
- if md. content . is_empty ( ) {
1423
- return ( None , None ) ;
1424
- }
1425
- let mut p = md. into_iter ( ) ;
1426
-
1427
- let mut event_level = 0 ;
1428
- let mut summary_events = Vec :: new ( ) ;
1429
- let mut get_next_tag = false ;
1430
-
1431
- let mut end_of_summary = false ;
1432
- while let Some ( event) = p. next ( ) {
1433
- match event {
1434
- Event :: Start ( _) => event_level += 1 ,
1435
- Event :: End ( kind) => {
1436
- event_level -= 1 ;
1437
- if event_level == 0 {
1438
- // We're back at the "top" so it means we're done with the summary.
1439
- end_of_summary = true ;
1440
- // We surround tables with `<div>` HTML tags so this is a special case.
1441
- get_next_tag = kind == TagEnd :: Table ;
1442
- }
1443
- }
1444
- _ => { }
1445
- }
1446
- summary_events. push ( event) ;
1447
- if end_of_summary {
1448
- if get_next_tag && let Some ( event) = p. next ( ) {
1449
- summary_events. push ( event) ;
1450
- }
1451
- break ;
1452
- }
1453
- }
1454
- let mut summary = String :: new ( ) ;
1455
- html:: push_html ( & mut summary, summary_events. into_iter ( ) ) ;
1456
- if summary. is_empty ( ) {
1457
- return ( None , None ) ;
1458
- }
1459
- let mut content = String :: new ( ) ;
1460
- html:: push_html ( & mut content, p) ;
1461
-
1462
- if content. is_empty ( ) { ( Some ( summary) , None ) } else { ( Some ( summary) , Some ( content) ) }
1463
- }
1464
-
1465
1468
impl MarkdownSummaryLine < ' _ > {
1466
1469
pub ( crate ) fn into_string_with_has_more_content ( self ) -> ( String , bool ) {
1467
1470
let MarkdownSummaryLine ( md, links) = self ;
0 commit comments