use crate::highlighter;
use crate::syntax::{Commenting, Highlight, Plain, color};
use logos::Logos;
use ratatui::style::Color;
#[derive(Logos, Debug)]
#[logos(skip r"[ \t\n]+")]
enum XmlToken {
#[regex("<[[:alpha:]][[:alpha:][:digit:]_]*")]
#[regex("<![[:upper:]]+")]
TagStart,
#[regex("</[[:alpha:]][[:alpha:][:digit:]_]*>")]
#[token(">")]
#[token("/>")]
TagEnd,
#[regex("[[:alpha:]][[:alpha:][:digit:]_]*=")]
FieldName,
#[regex("&[^;[:space:]]*;")]
CharRef,
#[regex(r#"\"[^\"]*\""#)]
String,
#[token("<!--")]
StartComment,
#[token("-->")]
EndComment,
}
impl TryFrom<XmlToken> for Highlight {
type Error = ();
fn try_from(t: XmlToken) -> Result<Highlight, ()> {
match t {
XmlToken::TagStart | XmlToken::TagEnd => Ok(Color::Cyan.into()),
XmlToken::CharRef => Ok(Color::Red.into()),
XmlToken::FieldName => Ok(Color::Blue.into()),
XmlToken::String => Ok(color::STRING),
XmlToken::StartComment | XmlToken::EndComment => Ok(color::COMMENT),
}
}
}
#[derive(Debug)]
pub struct Xml;
impl std::fmt::Display for Xml {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
"XML".fmt(f)
}
}
highlighter!(
Xml,
XmlToken,
StartComment,
EndComment,
"<!--",
"-->",
color::COMMENT
);