| 1 | //! Extract preview images from README files. |
| 2 | |
| 3 | use pulldown_cmark::{ |
| 4 | Event, |
| 5 | Parser, |
| 6 | Tag, |
| 7 | }; |
| 8 | |
| 9 | /// Extract the first "real" image from markdown content. |
| 10 | /// Returns the image URL (e.g., `` → `url`), or None if not found. |
| 11 | pub fn extract_preview_url(markdown: &str) -> Option<String> { |
| 12 | let parser = Parser::new(markdown); |
| 13 | |
| 14 | for event in parser { |
| 15 | if let Event::Start(Tag::Image { dest_url, .. }) = event { |
| 16 | let url_str = dest_url.to_string(); |
| 17 | |
| 18 | // Accept any image URL that's not data: or javascript: |
| 19 | if !url_str.is_empty() |
| 20 | && !url_str.starts_with("data:") |
| 21 | && !url_str.starts_with("javascript:") |
| 22 | { |
| 23 | return Some(url_str); |
| 24 | } |
| 25 | } |
| 26 | } |
| 27 | None |
| 28 | } |