Unquote the text.
This commit is contained in:
parent
b3e182d7fe
commit
2ac0449630
@ -889,11 +889,12 @@ fn compare_plain_text<'s>(
|
||||
let mut this_status = DiffStatus::Good;
|
||||
let mut message = None;
|
||||
let text = emacs.as_text()?;
|
||||
if text.text != rust.source {
|
||||
let unquoted_text = text.unquote()?;
|
||||
if unquoted_text != rust.source {
|
||||
this_status = DiffStatus::Bad;
|
||||
message = Some(format!(
|
||||
"(emacs != rust) {:?} != {:?}",
|
||||
text.text, rust.source
|
||||
unquoted_text, rust.source
|
||||
));
|
||||
}
|
||||
|
||||
|
@ -32,6 +32,45 @@ pub struct TextWithProperties<'s> {
|
||||
pub properties: Vec<Token<'s>>,
|
||||
}
|
||||
|
||||
impl<'s> TextWithProperties<'s> {
|
||||
pub fn unquote(&self) -> Result<String, Box<dyn std::error::Error>> {
|
||||
let mut out = String::with_capacity(self.text.len());
|
||||
if !self.text.starts_with(r#"""#) {
|
||||
return Err("Quoted text does not start with quote.".into());
|
||||
}
|
||||
if !self.text.ends_with(r#"""#) {
|
||||
return Err("Quoted text does not end with quote.".into());
|
||||
}
|
||||
let interior_text = &self.text[1..(self.text.len() - 1)];
|
||||
let mut state = ParseState::Normal;
|
||||
for current_char in interior_text.chars().into_iter() {
|
||||
state = match (state, current_char) {
|
||||
(ParseState::Normal, '\\') => ParseState::Escape,
|
||||
(ParseState::Normal, _) => {
|
||||
out.push(current_char);
|
||||
ParseState::Normal
|
||||
}
|
||||
(ParseState::Escape, 'n') => {
|
||||
out.push('\n');
|
||||
ParseState::Normal
|
||||
}
|
||||
(ParseState::Escape, '\\') => {
|
||||
out.push('\\');
|
||||
ParseState::Normal
|
||||
}
|
||||
_ => todo!(),
|
||||
};
|
||||
}
|
||||
|
||||
Ok(out)
|
||||
}
|
||||
}
|
||||
|
||||
enum ParseState {
|
||||
Normal,
|
||||
Escape,
|
||||
}
|
||||
|
||||
impl<'s> Token<'s> {
|
||||
pub fn as_list<'p>(&'p self) -> Result<&'p Vec<Token<'s>>, Box<dyn std::error::Error>> {
|
||||
Ok(match self {
|
||||
|
Loading…
x
Reference in New Issue
Block a user