Make Lexeme text field private, add last field
This commit is contained in:
parent
bb5dde6c2e
commit
a71a9f4224
4 changed files with 46 additions and 11 deletions
|
|
@ -101,7 +101,7 @@ fn lex(text: &str, map: LexMap, config: &Config) -> Vec<Token> {
|
||||||
let buffer = &mut state.buffers.anchor;
|
let buffer = &mut state.buffers.anchor;
|
||||||
let candidate = &mut buffer.candidate;
|
let candidate = &mut buffer.candidate;
|
||||||
if candidate.text.is_empty() {
|
if candidate.text.is_empty() {
|
||||||
if lexeme.next == "|" {
|
if lexeme.next() == "|" {
|
||||||
buffer.text.push_str(&lexeme.text());
|
buffer.text.push_str(&lexeme.text());
|
||||||
candidate.text.clone_from(&buffer.text);
|
candidate.text.clone_from(&buffer.text);
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -125,19 +125,19 @@ fn lex(text: &str, map: LexMap, config: &Config) -> Vec<Token> {
|
||||||
state.context.inline = InlineContext::None;
|
state.context.inline = InlineContext::None;
|
||||||
// non-whitespace after pipe is the destination
|
// non-whitespace after pipe is the destination
|
||||||
} else {
|
} else {
|
||||||
candidate.destination = Some(lexeme.next.clone());
|
candidate.destination = Some(lexeme.next().clone());
|
||||||
let token = Token::Anchor(candidate.clone());
|
let token = Token::Anchor(candidate.clone());
|
||||||
tokens.push(token);
|
tokens.push(token);
|
||||||
state.context.inline = InlineContext::None;
|
state.context.inline = InlineContext::None;
|
||||||
// if there is a trailing pipe, consume it
|
// if there is a trailing pipe, consume it
|
||||||
if let Some(next) = iterator.next()
|
if let Some(next) = iterator.next()
|
||||||
&& next.next == "|"
|
&& next.next() == "|"
|
||||||
{
|
{
|
||||||
iterator.next();
|
iterator.next();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// candidate is nonleading and we found a second pipe
|
// candidate is nonleading and we found a second pipe
|
||||||
} else if !candidate.leading && lexeme.next == "|" {
|
} else if !candidate.leading && lexeme.next() == "|" {
|
||||||
candidate.destination = Some(lexeme.text());
|
candidate.destination = Some(lexeme.text());
|
||||||
tokens.push(Token::Anchor(candidate.clone()));
|
tokens.push(Token::Anchor(candidate.clone()));
|
||||||
state.context.inline = InlineContext::None;
|
state.context.inline = InlineContext::None;
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,10 @@
|
||||||
|
use crate::prelude::*;
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct Lexeme {
|
pub struct Lexeme {
|
||||||
text: String,
|
text: String,
|
||||||
pub next: String,
|
next: String,
|
||||||
|
last: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Lexeme {
|
impl Lexeme {
|
||||||
|
|
@ -9,6 +12,7 @@ impl Lexeme {
|
||||||
Lexeme {
|
Lexeme {
|
||||||
text: raw.to_owned(),
|
text: raw.to_owned(),
|
||||||
next: next.to_owned(),
|
next: next.to_owned(),
|
||||||
|
last: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -16,6 +20,21 @@ impl Lexeme {
|
||||||
self.text.clone()
|
self.text.clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn next(&self) -> String {
|
||||||
|
if self.next.is_empty() && !self.last {
|
||||||
|
log!("Returning an empty string for next of non-last {self:?}");
|
||||||
|
}
|
||||||
|
self.next.clone()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn last(&self) -> bool {
|
||||||
|
self.last
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn mutate_text(&mut self, new: &str) {
|
||||||
|
self.text = new.to_string();
|
||||||
|
}
|
||||||
|
|
||||||
pub fn is_whitespace(&self) -> bool {
|
pub fn is_whitespace(&self) -> bool {
|
||||||
self.text == " " || self.text == "\n"
|
self.text == " " || self.text == "\n"
|
||||||
}
|
}
|
||||||
|
|
@ -41,6 +60,14 @@ impl Lexeme {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn match_last_char(&self, query: char) -> bool {
|
||||||
|
if let Some(last) = self.text.chars().last() {
|
||||||
|
last == query
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn match_next_first_char(&self, query: char) -> bool {
|
pub fn match_next_first_char(&self, query: char) -> bool {
|
||||||
if let Some(first) = self.next.chars().nth(0) {
|
if let Some(first) = self.next.chars().nth(0) {
|
||||||
first == query
|
first == query
|
||||||
|
|
@ -79,11 +106,17 @@ impl Lexeme {
|
||||||
let mut iterator = raw_strings.iter().peekable();
|
let mut iterator = raw_strings.iter().peekable();
|
||||||
|
|
||||||
while let Some(raw) = iterator.next() {
|
while let Some(raw) = iterator.next() {
|
||||||
let next =
|
let mut next = String::new();
|
||||||
iterator.peek().map(|s| (*s).clone()).unwrap_or_default();
|
let mut last = false;
|
||||||
|
if let Some(peeked) = iterator.peek() {
|
||||||
|
next.clone_from(*peeked);
|
||||||
|
} else {
|
||||||
|
last = true;
|
||||||
|
}
|
||||||
out_vector.push(Lexeme {
|
out_vector.push(Lexeme {
|
||||||
text: raw.to_owned(),
|
text: raw.to_owned(),
|
||||||
next,
|
next,
|
||||||
|
last,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,8 @@ pub struct Anchor {
|
||||||
|
|
||||||
impl Parseable for Anchor {
|
impl Parseable for Anchor {
|
||||||
fn probe(lexeme: &Lexeme) -> bool {
|
fn probe(lexeme: &Lexeme) -> bool {
|
||||||
lexeme.text() == "|" || (!lexeme.is_whitespace() && lexeme.next == "|")
|
lexeme.text() == "|"
|
||||||
|
|| (!lexeme.is_whitespace() && lexeme.next() == "|")
|
||||||
}
|
}
|
||||||
|
|
||||||
fn lex(_lexeme: &Lexeme) -> Anchor {
|
fn lex(_lexeme: &Lexeme) -> Anchor {
|
||||||
|
|
|
||||||
|
|
@ -31,8 +31,9 @@ impl Header {
|
||||||
next_lexeme: &Lexeme,
|
next_lexeme: &Lexeme,
|
||||||
ids: &mut HashMap<String, Vec<String>>,
|
ids: &mut HashMap<String, Vec<String>>,
|
||||||
) -> String {
|
) -> String {
|
||||||
let base_id = if !config.ascii_dom_ids || next_lexeme.next.is_ascii() {
|
let base_id = if !config.ascii_dom_ids || next_lexeme.next().is_ascii()
|
||||||
next_lexeme.next.clone()
|
{
|
||||||
|
next_lexeme.next().clone()
|
||||||
} else {
|
} else {
|
||||||
String::from("h")
|
String::from("h")
|
||||||
};
|
};
|
||||||
|
|
@ -92,7 +93,7 @@ impl Parseable for Header {
|
||||||
Header::new(
|
Header::new(
|
||||||
lexeme.text().len().into(),
|
lexeme.text().len().into(),
|
||||||
true,
|
true,
|
||||||
Some(&lexeme.next.to_ascii_lowercase()),
|
Some(&lexeme.next().to_ascii_lowercase()),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue