refactor char utils to separate file
This commit is contained in:
parent
3fd9692ce5
commit
760c95792c
54
src/utils/chars.rs
Normal file
54
src/utils/chars.rs
Normal file
@ -0,0 +1,54 @@
|
||||
use std::iter::Iterator;
|
||||
|
||||
use peekmore::PeekMoreIterator;
|
||||
|
||||
use super::read_until_closing_quote;
|
||||
|
||||
use crate::Token;
|
||||
|
||||
pub(crate) fn read_until_char<I: Iterator<Item = Token>>(
|
||||
toks: &mut PeekMoreIterator<I>,
|
||||
c: char,
|
||||
) -> Vec<Token> {
|
||||
let mut v = Vec::new();
|
||||
while let Some(tok) = toks.next() {
|
||||
match tok.kind {
|
||||
'"' | '\'' => {
|
||||
v.push(tok.clone());
|
||||
v.extend(read_until_closing_quote(toks, tok.kind));
|
||||
continue;
|
||||
}
|
||||
t if t == c => break,
|
||||
_ => {}
|
||||
}
|
||||
v.push(tok)
|
||||
}
|
||||
v
|
||||
}
|
||||
|
||||
pub(crate) fn is_ident_char(c: char) -> bool {
|
||||
c.is_ascii_alphabetic() || c == '_' || c == '\\' || (!c.is_ascii() && !c.is_control())
|
||||
}
|
||||
|
||||
pub(crate) fn hex_char_for(number: u32) -> char {
|
||||
assert!(number < 0x10);
|
||||
std::char::from_u32(if number < 0xA {
|
||||
0x30 + number
|
||||
} else {
|
||||
0x61 - 0xA + number
|
||||
})
|
||||
.unwrap()
|
||||
}
|
||||
|
||||
pub(crate) fn is_name(c: char) -> bool {
|
||||
is_name_start(c) || c.is_digit(10) || c == '-'
|
||||
}
|
||||
|
||||
pub(crate) fn is_name_start(c: char) -> bool {
|
||||
// NOTE: in the dart-sass implementation, identifiers cannot start
|
||||
// with numbers. We explicitly differentiate from the reference
|
||||
// implementation here in order to support selectors beginning with numbers.
|
||||
// This can be considered a hack and in the future it would be nice to refactor
|
||||
// how this is handled.
|
||||
c == '_' || c.is_alphanumeric() || c as u32 >= 0x0080
|
||||
}
|
@ -10,6 +10,10 @@ use crate::selector::Selector;
|
||||
use crate::value::Value;
|
||||
use crate::{Scope, Token};
|
||||
|
||||
pub(crate) use chars::*;
|
||||
|
||||
mod chars;
|
||||
|
||||
pub(crate) trait IsWhitespace {
|
||||
fn is_whitespace(&self) -> bool;
|
||||
}
|
||||
@ -416,19 +420,6 @@ fn interpolated_ident_body<I: Iterator<Item = Token>>(
|
||||
Ok(Spanned { node: buf, span })
|
||||
}
|
||||
|
||||
fn is_name(c: char) -> bool {
|
||||
is_name_start(c) || c.is_digit(10) || c == '-'
|
||||
}
|
||||
|
||||
fn is_name_start(c: char) -> bool {
|
||||
// NOTE: in the dart-sass implementation, identifiers cannot start
|
||||
// with numbers. We explicitly differentiate from the reference
|
||||
// implementation here in order to support selectors beginning with numbers.
|
||||
// This can be considered a hack and in the future it would be nice to refactor
|
||||
// how this is handled.
|
||||
c == '_' || c.is_alphanumeric() || c as u32 >= 0x0080
|
||||
}
|
||||
|
||||
fn escape<I: Iterator<Item = Token>>(
|
||||
toks: &mut PeekMoreIterator<I>,
|
||||
identifier_start: bool,
|
||||
@ -822,37 +813,3 @@ pub(crate) fn read_until_closing_square_brace<I: Iterator<Item = Token>>(
|
||||
}
|
||||
v
|
||||
}
|
||||
|
||||
pub(crate) fn read_until_char<I: Iterator<Item = Token>>(
|
||||
toks: &mut PeekMoreIterator<I>,
|
||||
c: char,
|
||||
) -> Vec<Token> {
|
||||
let mut v = Vec::new();
|
||||
while let Some(tok) = toks.next() {
|
||||
match tok.kind {
|
||||
'"' | '\'' => {
|
||||
v.push(tok.clone());
|
||||
v.extend(read_until_closing_quote(toks, tok.kind));
|
||||
continue;
|
||||
}
|
||||
t if t == c => break,
|
||||
_ => {}
|
||||
}
|
||||
v.push(tok)
|
||||
}
|
||||
v
|
||||
}
|
||||
|
||||
pub(crate) fn is_ident_char(c: char) -> bool {
|
||||
c.is_ascii_alphabetic() || c == '_' || c == '\\' || (!c.is_ascii() && !c.is_control())
|
||||
}
|
||||
|
||||
pub(crate) fn hex_char_for(number: u32) -> char {
|
||||
assert!(number < 0x10);
|
||||
std::char::from_u32(if number < 0xA {
|
||||
0x30 + number
|
||||
} else {
|
||||
0x61 - 0xA + number
|
||||
})
|
||||
.unwrap()
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user