summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Fischer <martin@push-f.com>2021-11-30 18:54:39 +0100
committerMartin Fischer <martin@push-f.com>2021-12-05 02:52:36 +0100
commit042409a2c40bb997739326928eab7d0430cec50b (patch)
treef7566682a4a75d24dc33924fa7f985c68605558f
parentfff865a98aa288930d6e363f03ad57570e429e92 (diff)
spans: fix spans for quoted attribute values
-rw-r--r--src/emitter.rs4
-rw-r--r--src/machine.rs6
-rw-r--r--src/spans.rs5
-rw-r--r--tests/span-tests/demo.out8
4 files changed, 13 insertions, 10 deletions
diff --git a/src/emitter.rs b/src/emitter.rs
index 1ab01f0..48ac391 100644
--- a/src/emitter.rs
+++ b/src/emitter.rs
@@ -132,9 +132,11 @@ pub trait Emitter<R> {
fn init_attribute_name(&mut self, reader: &R);
/// Called before the first push_attribute_value call.
+ /// If the value is wrappend in double or single quotes `quoted` is set to true, otherwise false.
///
/// If there is no current attribute, this method may panic.
- fn init_attribute_value(&mut self, #[allow(unused_variables)] reader: &R) {}
+ #[allow(unused_variables)]
+ fn init_attribute_value(&mut self, reader: &R, quoted: bool) {}
/// Append a string to the current attribute's name.
///
diff --git a/src/machine.rs b/src/machine.rs
index 80b37d6..4300f45 100644
--- a/src/machine.rs
+++ b/src/machine.rs
@@ -763,12 +763,12 @@ pub fn consume<R: Reader, E: Emitter<R>>(
State::BeforeAttributeValue => match slf.read_char()? {
Some(whitespace_pat!()) => Ok(ControlToken::Continue),
Some('"') => {
- slf.emitter.init_attribute_value(&slf.reader);
+ slf.emitter.init_attribute_value(&slf.reader, true);
slf.state = State::AttributeValueDoubleQuoted;
Ok(ControlToken::Continue)
}
Some('\'') => {
- slf.emitter.init_attribute_value(&slf.reader);
+ slf.emitter.init_attribute_value(&slf.reader, true);
slf.state = State::AttributeValueSingleQuoted;
Ok(ControlToken::Continue)
}
@@ -779,7 +779,7 @@ pub fn consume<R: Reader, E: Emitter<R>>(
Ok(ControlToken::Continue)
}
c => {
- slf.emitter.init_attribute_value(&slf.reader);
+ slf.emitter.init_attribute_value(&slf.reader, false);
slf.state = State::AttributeValueUnquoted;
slf.unread_char(c);
Ok(ControlToken::Continue)
diff --git a/src/spans.rs b/src/spans.rs
index ab455f9..6d7c18e 100644
--- a/src/spans.rs
+++ b/src/spans.rs
@@ -273,9 +273,10 @@ impl<R: GetPos> Emitter<R> for SpanEmitter<R> {
));
}
- fn init_attribute_value(&mut self, reader: &R) {
+ fn init_attribute_value(&mut self, reader: &R, quoted: bool) {
let current_attr = self.current_attribute.as_mut().unwrap();
- current_attr.1.value_span = reader.get_pos() - 1..reader.get_pos() - 1;
+ let offset = if quoted { 0 } else { 1 };
+ current_attr.1.value_span = reader.get_pos() - offset..reader.get_pos() - offset;
}
fn push_attribute_name(&mut self, s: &str) {
diff --git a/tests/span-tests/demo.out b/tests/span-tests/demo.out
index 156247e..ad9cfb8 100644
--- a/tests/span-tests/demo.out
+++ b/tests/span-tests/demo.out
@@ -12,8 +12,8 @@ note:
│ attr name
4 │
5 │ Attribute values can be quoted: <input name = 'age' type = "number">
- │ ^^^^ ^^^ ^^^^ ^^^^^^ attr value
- │ │ │ │
- │ │ │ attr name
- │ │ attr value
+ │ ^^^^ ^^^ ^^^^ ^^^^^^ attr value
+ │ │ │ │
+ │ │ │ attr name
+ │ │ attr value
│ attr name