77use base64:: Engine ;
88use encoding_rs:: Encoding ;
99
10+ /// Callback type for resolving a URI string to raw bytes.
11+ pub type ByteResolver < ' a > = Option < & ' a dyn Fn ( & str ) -> Option < Vec < u8 > > > ;
12+
1013// ---------------------------------------------------------------------------
1114// Encoding detection & conversion
1215// ---------------------------------------------------------------------------
@@ -73,12 +76,10 @@ fn detect_meta_charset(html: &str) -> Option<&'static Encoding> {
7376 let rest = rest. strip_prefix ( '=' ) ?;
7477 let rest = rest. trim_start ( ) ;
7578 // Strip optional quotes
76- let ( encoding_name, _) = if rest. starts_with ( '"' ) {
77- let inner = & rest[ 1 ..] ;
79+ let ( encoding_name, _) = if let Some ( inner) = rest. strip_prefix ( '"' ) {
7880 let end = inner. find ( '"' ) . unwrap_or ( inner. len ( ) ) ;
7981 ( & inner[ ..end] , & inner[ end..] )
80- } else if rest. starts_with ( '\'' ) {
81- let inner = & rest[ 1 ..] ;
82+ } else if let Some ( inner) = rest. strip_prefix ( '\'' ) {
8283 let end = inner. find ( '\'' ) . unwrap_or ( inner. len ( ) ) ;
8384 ( & inner[ ..end] , & inner[ end..] )
8485 } else {
@@ -236,12 +237,10 @@ fn is_stylesheet_link(tag_content: &str) -> bool {
236237 let rest = lower[ pos + 3 ..] . trim_start ( ) ;
237238 if let Some ( rest) = rest. strip_prefix ( '=' ) {
238239 let rest = rest. trim_start ( ) ;
239- let val = if rest. starts_with ( '"' ) {
240- let inner = & rest[ 1 ..] ;
240+ let val = if let Some ( inner) = rest. strip_prefix ( '"' ) {
241241 let end = inner. find ( '"' ) . unwrap_or ( inner. len ( ) ) ;
242242 & inner[ ..end]
243- } else if rest. starts_with ( '\'' ) {
244- let inner = & rest[ 1 ..] ;
243+ } else if let Some ( inner) = rest. strip_prefix ( '\'' ) {
245244 let end = inner. find ( '\'' ) . unwrap_or ( inner. len ( ) ) ;
246245 & inner[ ..end]
247246 } else {
@@ -492,8 +491,8 @@ pub type CidResolver = Box<dyn Fn(&str) -> Option<Vec<u8>>>;
492491/// - Remote URLs return `None` when no fetcher is given (no external fetching by default).
493492pub fn resolve_image_uri (
494493 uri : & str ,
495- cid_resolver : Option < & dyn Fn ( & str ) -> Option < Vec < u8 > > > ,
496- url_fetcher : Option < & dyn Fn ( & str ) -> Option < Vec < u8 > > > ,
494+ cid_resolver : ByteResolver < ' _ > ,
495+ url_fetcher : ByteResolver < ' _ > ,
497496) -> Option < Vec < u8 > > {
498497 if uri. starts_with ( "data:" ) {
499498 decode_data_uri ( uri)
@@ -544,16 +543,14 @@ fn preprocess_body_bgcolor(html: &str) -> String {
544543 let rest = rest. trim_start ( ) ;
545544
546545 // Extract the value (may be quoted or unquoted)
547- let ( value, attr_end_offset) = if rest. starts_with ( '"' ) {
548- let inner = & rest[ 1 ..] ;
546+ let ( value, attr_end_offset) = if let Some ( inner) = rest. strip_prefix ( '"' ) {
549547 let end = inner. find ( '"' ) . unwrap_or ( inner. len ( ) ) ;
550548 (
551549 & tag[ bg_pos + 7 + ( tag_lower. len ( ) - bg_pos - 7 - rest. len ( ) ) + 1
552550 ..bg_pos + 7 + ( tag_lower. len ( ) - bg_pos - 7 - rest. len ( ) ) + 1 + end] ,
553551 end + 2 ,
554552 )
555- } else if rest. starts_with ( '\'' ) {
556- let inner = & rest[ 1 ..] ;
553+ } else if let Some ( inner) = rest. strip_prefix ( '\'' ) {
557554 let end = inner. find ( '\'' ) . unwrap_or ( inner. len ( ) ) ;
558555 (
559556 & tag[ bg_pos + 7 + ( tag_lower. len ( ) - bg_pos - 7 - rest. len ( ) ) + 1
@@ -659,16 +656,14 @@ fn preprocess_cellpadding(html: &str) -> String {
659656 }
660657 let rest = rest[ 1 ..] . trim_start ( ) ;
661658
662- let ( value, _val_len) = if rest. starts_with ( '"' ) {
663- let inner = & rest[ 1 ..] ;
659+ let ( value, _val_len) = if let Some ( inner) = rest. strip_prefix ( '"' ) {
664660 let end = inner. find ( '"' ) . unwrap_or ( inner. len ( ) ) ;
665661 (
666662 & html[ abs_pos + 11 + ( lower. len ( ) - abs_pos - 11 - rest. len ( ) ) + 1
667663 ..abs_pos + 11 + ( lower. len ( ) - abs_pos - 11 - rest. len ( ) ) + 1 + end] ,
668664 end + 2 ,
669665 )
670- } else if rest. starts_with ( '\'' ) {
671- let inner = & rest[ 1 ..] ;
666+ } else if let Some ( inner) = rest. strip_prefix ( '\'' ) {
672667 let end = inner. find ( '\'' ) . unwrap_or ( inner. len ( ) ) ;
673668 (
674669 & html[ abs_pos + 11 + ( lower. len ( ) - abs_pos - 11 - rest. len ( ) ) + 1
@@ -773,8 +768,8 @@ pub struct PreparedHtml {
773768/// Without a fetcher, remote URIs are skipped (no external fetching by default).
774769pub fn prepare_html (
775770 raw : & [ u8 ] ,
776- cid_resolver : Option < & dyn Fn ( & str ) -> Option < Vec < u8 > > > ,
777- url_fetcher : Option < & dyn Fn ( & str ) -> Option < Vec < u8 > > > ,
771+ cid_resolver : ByteResolver < ' _ > ,
772+ url_fetcher : ByteResolver < ' _ > ,
778773) -> PreparedHtml {
779774 let decoded = decode_html ( raw) ;
780775 let preprocessed = preprocess_attrs ( & decoded) ;
@@ -794,12 +789,10 @@ pub fn prepare_html(
794789 }
795790
796791 let rest = & sanitized[ abs_pos..] ;
797- let ( uri, _) = if rest. starts_with ( '"' ) {
798- let inner = & rest[ 1 ..] ;
792+ let ( uri, _) = if let Some ( inner) = rest. strip_prefix ( '"' ) {
799793 let end = inner. find ( '"' ) . unwrap_or ( inner. len ( ) ) ;
800794 ( & inner[ ..end] , end + 2 )
801- } else if rest. starts_with ( '\'' ) {
802- let inner = & rest[ 1 ..] ;
795+ } else if let Some ( inner) = rest. strip_prefix ( '\'' ) {
803796 let end = inner. find ( '\'' ) . unwrap_or ( inner. len ( ) ) ;
804797 ( & inner[ ..end] , end + 2 )
805798 } else {
0 commit comments