pub mod beleriand;
#[cfg(feature = "mode-custom")]
pub mod custom;
pub mod gondor;
pub mod quenya;
mod tests;
mod tokenizer;
pub use beleriand::Beleriand;
#[cfg(feature = "mode-custom")]
pub use custom::CustomMode;
pub use gondor::Gondor;
pub use quenya::Quenya;
pub use tokenizer::Tokenizer;
use crate::{Numeral, Token, Transcriber};
#[derive(Clone, Debug)]
pub enum ParseAction {
MatchedNone,
MatchedPart(usize),
MatchedToken {
token: Token,
len: usize,
},
Skip(usize),
Escape {
len_seq: usize,
n_skip: usize,
},
}
impl ParseAction {
pub const ESC_BACKSLASH: Self = Self::Escape { len_seq: 1, n_skip: 1 };
pub const fn matched_opt(token: Option<Token>, len: usize) -> Self {
match token {
Some(token) => Self::MatchedToken { token, len },
None => Self::MatchedPart(len),
}
}
}
#[allow(unused_variables)]
pub trait TengwarMode {
const MAX_CHUNK: usize = 3;
fn transcribe<T: FromIterator<Token>>(input: impl AsRef<str>) -> T
where Self: Default,
{
Self::default_transcriber(input).collect()
}
fn default_transcriber(input: impl AsRef<str>) -> Transcriber<Self>
where Self: Default,
{
Self::default().into_transcriber(input)
}
fn into_transcriber(self, input: impl AsRef<str>) -> Transcriber<Self>
where Self: Sized,
{
Tokenizer::<Self>::with_mode(input, self).into_transcriber()
}
fn finalize(&self, token: &mut Token, next: Option<&Token>) {}
fn find_index(&mut self, slice: &[char]) -> Option<(char, usize)> {
crate::characters::numeral::find_index(slice)
}
fn find_numeral(&mut self, slice: &[char]) -> Option<(Numeral, usize)> {
Numeral::parse(slice)
}
fn find_secondary(&mut self, slice: &[char]) -> Option<(Token, usize)> {
if let Some((char, len)) = self.find_index(slice) {
Some((Token::Char(char), len))
}
else if let Some((num, len)) = self.find_numeral(slice) {
Some((Token::Number(num), len))
}
else {
let first: char = *slice.first()?;
let punct: char = crate::characters::punctuation(first)?;
Some((Token::Char(punct), 1))
}
}
fn finish_current(&mut self) -> Option<Token>;
fn process(&mut self, chunk: &[char]) -> ParseAction;
}