Parse reference. Assumes string begins with '[' character. Modify refmap if a reference is encountered. Return 0 if no reference found, otherwise position of subject after reference is parsed.
| 1441 | // Return 0 if no reference found, otherwise position of subject |
| 1442 | // after reference is parsed. |
| 1443 | bufsize_t cmark_parse_reference_inline(cmark_mem *mem, cmark_chunk *input, |
| 1444 | cmark_reference_map *refmap) { |
| 1445 | subject subj; |
| 1446 | |
| 1447 | cmark_chunk lab; |
| 1448 | cmark_chunk url; |
| 1449 | cmark_chunk title; |
| 1450 | |
| 1451 | bufsize_t matchlen = 0; |
| 1452 | bufsize_t beforetitle; |
| 1453 | |
| 1454 | subject_from_buf(mem, -1, 0, &subj, input, NULL); |
| 1455 | |
| 1456 | // parse label: |
| 1457 | if (!link_label(&subj, &lab) || lab.len == 0) |
| 1458 | return 0; |
| 1459 | |
| 1460 | // colon: |
| 1461 | if (peek_char(&subj) == ':') { |
| 1462 | advance(&subj); |
| 1463 | } else { |
| 1464 | return 0; |
| 1465 | } |
| 1466 | |
| 1467 | // parse link url: |
| 1468 | spnl(&subj); |
| 1469 | if ((matchlen = manual_scan_link_url(&subj.input, subj.pos, &url)) > -1) { |
| 1470 | subj.pos += matchlen; |
| 1471 | } else { |
| 1472 | return 0; |
| 1473 | } |
| 1474 | |
| 1475 | // parse optional link_title |
| 1476 | beforetitle = subj.pos; |
| 1477 | spnl(&subj); |
| 1478 | matchlen = subj.pos == beforetitle ? 0 : scan_link_title(&subj.input, subj.pos); |
| 1479 | if (matchlen) { |
| 1480 | title = cmark_chunk_dup(&subj.input, subj.pos, matchlen); |
| 1481 | subj.pos += matchlen; |
| 1482 | } else { |
| 1483 | subj.pos = beforetitle; |
| 1484 | title = cmark_chunk_literal(""); |
| 1485 | } |
| 1486 | |
| 1487 | // parse final spaces and newline: |
| 1488 | skip_spaces(&subj); |
| 1489 | if (!skip_line_end(&subj)) { |
| 1490 | if (matchlen) { // try rewinding before title |
| 1491 | subj.pos = beforetitle; |
| 1492 | skip_spaces(&subj); |
| 1493 | if (!skip_line_end(&subj)) { |
| 1494 | return 0; |
| 1495 | } |
| 1496 | } else { |
| 1497 | return 0; |
| 1498 | } |
| 1499 | } |
| 1500 | // insert reference into refmap |
no test coverage detected