pub use crate::phighlighter::{
pnodehighlight::PNodeHighLight,
pactionhighlight::{
PTypeHighLight,
PActionHighLight
},
phighlither_configuration::{
PHighlighterGetUntil,
PHighlighterGetUntilReplace,
PHighlighterSequence
},
pfileparser::{PFileParser, PFileParserIter},
planguage::PLanguage,
};
#[derive(Debug,Default,Clone)]
pub struct PHighlighter{
p_language: PLanguage,
p_node: PNodeHighLight,
p_vec_action: Vec<PActionHighLight>,
}
impl PHighlighter{
pub fn new() -> Self{
PHighlighter{
p_language: Default::default(),
p_node: Default::default(),
p_vec_action: vec![PActionHighLight::new(&String::from(""), &PTypeHighLight::None)]
}
}
pub fn set_language(&mut self, language: &PLanguage){
self.p_language = language.clone();
}
pub fn get_language(&self) -> &PLanguage{
&self.p_language
}
pub fn highlight_example(&self) -> String{
return self.highlight(&self.p_language.get_example());
}
pub fn highlight(&self, input_str: &String) -> String{
if input_str.trim().is_empty() {
return String::from("");
}
let parser: PFileParser = PFileParser::from_content(input_str);
let mut it: PFileParserIter = parser.iter(self.p_language.get_is_escape_char());
let mut body = String::from("");
let mut vec_available_oneof: Vec<PNodeHighLight> = Default::default();
let mut current_match_token = String::from("");
while !it.is_end_of_file() {
self.p_node.highlight(&mut body, &mut current_match_token, &mut it, &mut vec_available_oneof, &self.p_vec_action, &self.p_language.get_token_charset());
}
return body;
}
pub fn highlight_iter(&self, file_iter: &mut PFileParserIter) -> String {
let mut body = String::from("");
let mut current_match_token = String::from("");
let mut vec_available_oneof: Vec<PNodeHighLight> = Default::default();
self.p_node.highlight(&mut body, &mut current_match_token, file_iter, &mut vec_available_oneof, &self.p_vec_action, &self.p_language.get_token_charset());
return body;
}
pub fn add_vec_token(&mut self, vec_token: &Vec<String>, css_style: &String){
let action_index: usize = self.add_style(css_style, &PTypeHighLight::Token);
for token in vec_token.iter(){
self.p_node.add_token(&token, action_index);
}
}
pub fn add_vec_match(&mut self, vec_match: &Vec<String>, css_style: &String){
let action_index: usize = self.add_style(css_style, &PTypeHighLight::Match);
for token in vec_match.iter(){
self.p_node.add_token(&token, action_index);
}
}
pub fn add_replace(&mut self, pattern: &String, replace: &String){
let action_index: usize = self.add_style(&String::from(""), &PTypeHighLight::Replace(replace.clone()));
self.p_node.add_token(&pattern, action_index);
}
pub fn add_vec_getuntil(&mut self, vec_getuntil: &Vec<PHighlighterGetUntil>){
for getuntil in vec_getuntil.iter(){
let action_index: usize = self.add_style(&getuntil.style, &PTypeHighLight::GetUntil(getuntil.end_token.clone()));
self.p_node.add_getuntil(getuntil, action_index);
}
}
pub fn add_vec_getuntilreplace(&mut self, vec_getuntilreplace: &Vec<PHighlighterGetUntilReplace>){
for getuntilreplace in vec_getuntilreplace.iter(){
let action_index: usize = self.add_style(&String::from(""),
&PTypeHighLight::GetUntilReplace(
getuntilreplace.end_token.clone(),
getuntilreplace.replace_start.clone(),
getuntilreplace.replace_end.clone()));
self.p_node.add_getuntilreplace(getuntilreplace, action_index);
}
}
pub fn add_vec_sequence(&mut self, vec_sequence: &Vec<PHighlighterSequence>){
for sequence in vec_sequence.iter() {
let action_index: usize = self.add_style(&sequence.style, &PTypeHighLight::Token);
self.p_node.add_sequence(sequence, action_index);
}
}
fn add_style(&mut self, css_style: &String, action_type: &PTypeHighLight) -> usize{
let action: PActionHighLight = PActionHighLight::new(css_style, action_type);
let action_index: usize = self.p_vec_action.len();
self.p_vec_action.push(action);
return action_index;
}
}