@ -25,6 +25,7 @@ use std::{ffi::CStr, mem::ManuallyDrop, os::raw::c_char};
use base64 ::{ engine ::general_purpose as base64_engine_standard , Engine as _ } ;
use log ::{ debug , error , warn } ;
use thiserror ::Error ;
use unicode_segmentation ::UnicodeSegmentation ;
use crate ::sys ;
@ -73,12 +74,12 @@ impl<'a> CssImageExtractor<'a> {
} ;
// Skip whitespace until we find '('
for ( pos , c ) in self . remaining . chars ( ) . enumerate ( ) {
if c = = '(' {
for ( pos , c ) in self . remaining . grapheme_indices ( true ) {
if c = = "(" {
// Found left-paren.
( _ , self . remaining ) = self . remaining . split_at ( pos + 1 ) ;
break ;
} else if char ::is_whitespace ( c ) {
} else if c . contains ( char ::is_whitespace ) {
// Skipping whitespace.
continue ;
} else {
@ -90,11 +91,11 @@ impl<'a> CssImageExtractor<'a> {
// Find closing ')'
let mut depth = 1 ;
let mut url_parameter : Option < & str > = None ;
for ( pos , c ) in self . remaining . chars ( ) . enumerate ( ) {
if c = = '(' {
for ( pos , c ) in self . remaining . grapheme_indices ( true ) {
if c = = "(" {
// Found nested left-paren.
depth + = 1 ;
} else if c = = ')' {
} else if c = = ")" {
if depth > 1 {
// Found nested right-paren.
depth - = 1 ;
@ -121,8 +122,8 @@ impl<'a> CssImageExtractor<'a> {
// Strip optional whitespace and quotes from front and back.
// Trim off whitespace at beginning
for ( pos , c ) in url_parameter . chars ( ) . enumerate ( ) {
if char ::is_whitespace ( c ) {
for ( pos , c ) in url_parameter . grapheme_indices ( true ) {
if c . contains ( char ::is_whitespace ) {
// Skipping whitespace before url contents.
continue ;
} else {
@ -132,8 +133,8 @@ impl<'a> CssImageExtractor<'a> {
}
// Trim off whitespace at end
for ( pos , c ) in url_parameter . chars ( ) . rev ( ) . enumerate ( ) {
if char ::is_whitespace ( c ) {
for ( pos , c ) in url_parameter . graphemes ( true ) . rev ( ) . enumerate ( ) {
if c . contains ( char ::is_whitespace ) {
// Skipping whitespace after url contents.
continue ;
} else {
@ -143,24 +144,24 @@ impl<'a> CssImageExtractor<'a> {
}
// Trim off " at beginning.
let c = url_parameter . chars ( ) . next ( ) ;
let c = url_parameter . graphemes ( true ) . next ( ) ;
if let Some ( c ) = c {
if c = = '"' {
if c = = "\"" {
( _ , url_parameter ) = url_parameter . split_at ( 1 ) ;
}
} ;
// Trim off " at end.
let c = url_parameter . chars ( ) . rev ( ) . next ( ) ;
let c = url_parameter . graphemes ( true ) . rev ( ) . next ( ) ;
if let Some ( c ) = c {
if c = = '"' {
if c = = "\"" {
( url_parameter , _ ) = url_parameter . split_at ( url_parameter . len ( ) - 1 ) ;
}
} ;
// Trim off whitespace at beginning.
for ( pos , c ) in url_parameter . chars ( ) . enumerate ( ) {
if char ::is_whitespace ( c ) {
for ( pos , c ) in url_parameter . grapheme_indices ( true ) {
if c . contains ( char ::is_whitespace ) {
// Skipping whitespace before url contents.
continue ;
} else {
@ -170,8 +171,8 @@ impl<'a> CssImageExtractor<'a> {
}
// Trim off whitespace at end.
for ( pos , c ) in url_parameter . chars ( ) . rev ( ) . enumerate ( ) {
if char ::is_whitespace ( c ) {
for ( pos , c ) in url_parameter . graphemes ( true ) . rev ( ) . enumerate ( ) {
if c . contains ( char ::is_whitespace ) {
// Skipping whitespace after url contents.
continue ;
} else {
@ -203,12 +204,12 @@ impl<'a> CssImageExtractor<'a> {
} ;
// Skip whitespace until we find a 'b' (starting "base64")
for ( pos , c ) in url_parameter . chars ( ) . enumerate ( ) {
if c = = 'b' {
for ( pos , c ) in url_parameter . grapheme_indices ( true ) {
if c = = "b" {
// Found 'b'.
( _ , url_parameter ) = url_parameter . split_at ( pos + 1 ) ;
break ;
} else if char ::is_whitespace ( c ) {
} else if c . contains ( char ::is_whitespace ) {
// Skipping whitespace.
continue ;
} else {
@ -227,12 +228,12 @@ impl<'a> CssImageExtractor<'a> {
( _ , url_parameter ) = url_parameter . split_at ( "ase64" . len ( ) ) ;
// Skip whitespace until we find ','
for ( pos , c ) in url_parameter . chars ( ) . enumerate ( ) {
if c = = ',' {
for ( pos , c ) in url_parameter . grapheme_indices ( true ) {
if c = = "," {
// Found ','.
( _ , url_parameter ) = url_parameter . split_at ( pos + 1 ) ;
break ;
} else if char ::is_whitespace ( c ) {
} else if c . contains ( char ::is_whitespace ) {
// Skipping whitespace.
continue ;
} else {
@ -242,8 +243,8 @@ impl<'a> CssImageExtractor<'a> {
}
// Trim off whitespace at beginning.
for ( pos , c ) in url_parameter . chars ( ) . enumerate ( ) {
if char ::is_whitespace ( c ) {
for ( pos , c ) in url_parameter . grapheme_indices ( true ) {
if c . contains ( char ::is_whitespace ) {
// Skipping whitespace before url contents.
continue ;
} else {