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 candidate = &mut buffer.candidate;
|
||||
if candidate.text.is_empty() {
|
||||
if lexeme.next == "|" {
|
||||
if lexeme.next() == "|" {
|
||||
buffer.text.push_str(&lexeme.text());
|
||||
candidate.text.clone_from(&buffer.text);
|
||||
} else {
|
||||
|
|
@ -125,19 +125,19 @@ fn lex(text: &str, map: LexMap, config: &Config) -> Vec<Token> {
|
|||
state.context.inline = InlineContext::None;
|
||||
// non-whitespace after pipe is the destination
|
||||
} else {
|
||||
candidate.destination = Some(lexeme.next.clone());
|
||||
candidate.destination = Some(lexeme.next().clone());
|
||||
let token = Token::Anchor(candidate.clone());
|
||||
tokens.push(token);
|
||||
state.context.inline = InlineContext::None;
|
||||
// if there is a trailing pipe, consume it
|
||||
if let Some(next) = iterator.next()
|
||||
&& next.next == "|"
|
||||
&& next.next() == "|"
|
||||
{
|
||||
iterator.next();
|
||||
}
|
||||
}
|
||||
// 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());
|
||||
tokens.push(Token::Anchor(candidate.clone()));
|
||||
state.context.inline = InlineContext::None;
|
||||
|
|
|
|||
|
|
@ -1,7 +1,10 @@
|
|||
use crate::prelude::*;
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Lexeme {
|
||||
text: String,
|
||||
pub next: String,
|
||||
next: String,
|
||||
last: bool,
|
||||
}
|
||||
|
||||
impl Lexeme {
|
||||
|
|
@ -9,6 +12,7 @@ impl Lexeme {
|
|||
Lexeme {
|
||||
text: raw.to_owned(),
|
||||
next: next.to_owned(),
|
||||
last: false,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -16,6 +20,21 @@ impl Lexeme {
|
|||
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 {
|
||||
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 {
|
||||
if let Some(first) = self.next.chars().nth(0) {
|
||||
first == query
|
||||
|
|
@ -79,11 +106,17 @@ impl Lexeme {
|
|||
let mut iterator = raw_strings.iter().peekable();
|
||||
|
||||
while let Some(raw) = iterator.next() {
|
||||
let next =
|
||||
iterator.peek().map(|s| (*s).clone()).unwrap_or_default();
|
||||
let mut next = String::new();
|
||||
let mut last = false;
|
||||
if let Some(peeked) = iterator.peek() {
|
||||
next.clone_from(*peeked);
|
||||
} else {
|
||||
last = true;
|
||||
}
|
||||
out_vector.push(Lexeme {
|
||||
text: raw.to_owned(),
|
||||
next,
|
||||
last,
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -9,7 +9,8 @@ pub struct Anchor {
|
|||
|
||||
impl Parseable for Anchor {
|
||||
fn probe(lexeme: &Lexeme) -> bool {
|
||||
lexeme.text() == "|" || (!lexeme.is_whitespace() && lexeme.next == "|")
|
||||
lexeme.text() == "|"
|
||||
|| (!lexeme.is_whitespace() && lexeme.next() == "|")
|
||||
}
|
||||
|
||||
fn lex(_lexeme: &Lexeme) -> Anchor {
|
||||
|
|
|
|||
|
|
@ -31,8 +31,9 @@ impl Header {
|
|||
next_lexeme: &Lexeme,
|
||||
ids: &mut HashMap<String, Vec<String>>,
|
||||
) -> String {
|
||||
let base_id = if !config.ascii_dom_ids || next_lexeme.next.is_ascii() {
|
||||
next_lexeme.next.clone()
|
||||
let base_id = if !config.ascii_dom_ids || next_lexeme.next().is_ascii()
|
||||
{
|
||||
next_lexeme.next().clone()
|
||||
} else {
|
||||
String::from("h")
|
||||
};
|
||||
|
|
@ -92,7 +93,7 @@ impl Parseable for Header {
|
|||
Header::new(
|
||||
lexeme.text().len().into(),
|
||||
true,
|
||||
Some(&lexeme.next.to_ascii_lowercase()),
|
||||
Some(&lexeme.next().to_ascii_lowercase()),
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue