diff options
| author | Fuwn <[email protected]> | 2025-06-07 13:34:17 +0000 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2025-06-07 13:34:17 +0000 |
| commit | 22bce5a842dc365a5a18644d0fbdcc75e6aa5d5e (patch) | |
| tree | 17f02d84656a586e826fae5c2802644a045e6b13 /src/html.rs | |
| parent | chore: Bump version patch (diff) | |
| download | september-22bce5a842dc365a5a18644d0fbdcc75e6aa5d5e.tar.xz september-22bce5a842dc365a5a18644d0fbdcc75e6aa5d5e.zip | |
feat!: Overhaul KEEP_GEMINI configuration option
Diffstat (limited to 'src/html.rs')
| -rw-r--r-- | src/html.rs | 51 |
1 files changed, 26 insertions, 25 deletions
diff --git a/src/html.rs b/src/html.rs index c0425df..341286c 100644 --- a/src/html.rs +++ b/src/html.rs @@ -1,16 +1,21 @@ use { + crate::url::matches_pattern, germ::ast::Node, std::{env::var, fmt::Write}, url::Url, }; fn link_from_host_href(url: &Url, href: &str) -> Option<String> { - Some(format!( - "gemini://{}{}{}", - url.domain()?, - { if href.starts_with('/') { "" } else { "/" } }, - href - )) + if href.starts_with("/proxy/") { + Some(format!("gemini://{}", href.replace("/proxy/", ""))) + } else { + Some(format!( + "gemini://{}{}{}", + url.domain()?, + { if href.starts_with('/') { "" } else { "/" } }, + href + )) + } } fn safe(text: &str) -> String { @@ -181,30 +186,26 @@ pub fn from_gemini( } } - if let Ok(keeps) = var("KEEP_GEMINI_EXACT") { - let mut keeps = keeps.split(','); + if let Ok(keeps) = var("KEEP_GEMINI") { + let patterns = keeps.split(',').collect::<Vec<_>>(); if (href.starts_with('/') || !href.contains("://")) && !surface { let temporary_href = link_from_host_href(url, &href)?; + let should_exclude = patterns + .iter() + .filter(|p| p.starts_with('!')) + .any(|p| matches_pattern(&p[1..], &temporary_href)); - if keeps.any(|k| k == &*temporary_href) { - href = temporary_href; - } - } - } - - if let Ok(keeps) = var("KEEP_GEMINI_DOMAIN") { - let host = if let Some(host) = url.host() { - host.to_string() - } else { - return None; - }; + if !should_exclude { + let should_include = patterns + .iter() + .filter(|p| !p.starts_with('!')) + .any(|p| matches_pattern(p, &temporary_href)); - if (href.starts_with('/') - || !href.contains("://") && keeps.split(',').any(|k| k == &*host)) - && !surface - { - href = link_from_host_href(url, &href)?; + if should_include { + href = temporary_href; + } + } } } |