Main Heading
First paragraph with bold and italic.
A link in text.
- Item one
- Item two
let x = 42;
No links here
"); assert!(p.links(None).is_empty()); } #[test] fn test_links_multiple() { let p = ParsedHtml::parse(r#"ABC"#); let links = p.links(None); assert_eq!(links.len(), 3); assert_eq!(links[0].i, 0); assert_eq!(links[1].i, 1); assert_eq!(links[2].i, 2); } // --- Markdown conversion --- #[test] fn test_basic_heading() { let p = ParsedHtml::parse("Hello world
Second para
"); let md = p.to_markdown(); assert!(md.contains("Hello world")); assert!(md.contains("Second para")); // Should have blank line between paragraphs assert!(md.contains("Hello world\n\nSecond para")); } #[test] fn test_link_markdown() { let p = ParsedHtml::parse(r#"Click here"#); assert_eq!(p.to_markdown(), "[Click here](https://example.com)"); } #[test] fn test_bold() { let p = ParsedHtml::parse("bold"); assert_eq!(p.to_markdown(), "**bold**"); } #[test] fn test_italic() { let p = ParsedHtml::parse("italic"); assert_eq!(p.to_markdown(), "*italic*"); } #[test] fn test_inline_code() { let p = ParsedHtml::parse("x = 1");
assert_eq!(p.to_markdown(), "`x = 1`");
}
#[test]
fn test_code_block() {
let p = ParsedHtml::parse("fn main() {}");
let md = p.to_markdown();
assert!(md.contains("```\nfn main() {}\n```"));
}
#[test]
fn test_unordered_list() {
let p = ParsedHtml::parse("Quote text"); let md = p.to_markdown(); assert!(md.contains("> Quote text")); } #[test] fn test_image() { let p = ParsedHtml::parse(r#"
"#);
assert_eq!(p.to_markdown(), "");
}
#[test]
fn test_hr() {
let p = ParsedHtml::parse("Above
Below
"); let md = p.to_markdown(); assert!(md.contains("---")); } #[test] fn test_br() { let p = ParsedHtml::parse("Line1| Name | Age |
|---|---|
| Alice | 30 |
| H1 | H2 |
|---|---|
| A | B |
Hello
World
"); let md = p.to_markdown(); assert!(!md.contains("alert")); assert!(md.contains("Hello")); assert!(md.contains("World")); } #[test] fn test_strip_style() { let p = ParsedHtml::parse("Content
"); let md = p.to_markdown(); assert!(!md.contains("color")); assert!(md.contains("Content")); } #[test] fn test_unknown_tags_transparent() { let p = ParsedHtml::parse("inner text"); assert_eq!(p.to_markdown(), "inner text"); } #[test] fn test_nested_formatting() { let p = ParsedHtml::parse("bold italic"); assert_eq!(p.to_markdown(), "***bold italic***"); } // --- Icon font / empty formatting --- #[test] fn test_empty_italic_icon_font() { // Font Awesome style: with no text let p = ParsedHtml::parse(r#""#); assert_eq!(p.to_markdown(), ""); } #[test] fn test_empty_bold_suppressed() { let p = ParsedHtml::parse(""); assert_eq!(p.to_markdown(), ""); } #[test] fn test_link_with_icon_font_skipped() { // containing only an empty — no meaningful text, no img, no label let p = ParsedHtml::parse( r#""#, ); assert_eq!(p.to_markdown(), ""); } #[test] fn test_link_with_aria_label() { let p = ParsedHtml::parse( r#""#, ); assert_eq!(p.to_markdown(), "[Facebook](https://facebook.com)"); } #[test] fn test_link_with_title_fallback() { let p = ParsedHtml::parse( r#""#, ); assert_eq!(p.to_markdown(), "[Twitter](https://twitter.com)"); } #[test] fn test_links_extraction_aria_label() { let p = ParsedHtml::parse( r#""#, ); let links = p.links(None); assert_eq!(links.len(), 1); assert_eq!(links[0].text, "Facebook"); } // --- Link dedup & heading-in-link --- #[test] fn test_duplicate_link_dedup() { let p = ParsedHtml::parse( r#"First mention Second mention"#, ); let md = p.to_markdown(); assert!(md.contains("[First mention](https://example.com)")); assert!(!md.contains("Second mention")); } #[test] fn test_heading_inside_link_no_markers() { let p = ParsedHtml::parse(r#"First paragraph with bold and italic.
A link in text.
let x = 42;
Content with a link and
.
{}
", lines.join("Short content
"); let opts = FetchOptions { max_tokens: Some(10000), strip_nav: false, ..Default::default() }; let result = p.to_markdown_with_options(&opts, None); assert!(!result.truncated); assert_eq!(result.next_offset, None); assert!(result.markdown.contains("Short content")); } #[test] fn test_offset_pagination() { let mut lines = Vec::new(); for i in 0..40 { lines.push(format!("Line {i}: some padding text here abcdef")); } let html = format!("{}
", lines.join("Short
"); let opts = FetchOptions { offset: 99999, strip_nav: false, ..Default::default() }; let result = p.to_markdown_with_options(&opts, None); assert!(result.markdown.is_empty()); assert!(!result.truncated); } #[test] fn test_default_options_match_to_markdown() { let p = ParsedHtml::parse(page_html()); let plain = p.to_markdown(); let opts = FetchOptions { strip_nav: false, include_images: true, ..Default::default() }; let with_opts = p.to_markdown_with_options(&opts, None); assert_eq!(plain, with_opts.markdown); } #[test] fn test_full_options_integration() { let html = r#"Paragraph with a link and
.