regexp: add priority field to regular expressions
parent
465c78e903
commit
c07185a3aa
|
@ -1167,14 +1167,8 @@ impl CompactListing {
|
||||||
debug!(crate::conf::text_format_regexps(context, "listing.from"))
|
debug!(crate::conf::text_format_regexps(context, "listing.from"))
|
||||||
{
|
{
|
||||||
let t = self.data_columns.columns[2].insert_tag(text_formatter.tag);
|
let t = self.data_columns.columns[2].insert_tag(text_formatter.tag);
|
||||||
for _match in text_formatter.regexp.0.find_iter(strings.from.as_bytes()) {
|
for (start, end) in text_formatter.regexp.find_iter(strings.from.as_str()) {
|
||||||
if let Ok(_match) = _match {
|
self.data_columns.columns[2].set_tag(t, (start, idx), (end, idx));
|
||||||
self.data_columns.columns[2].set_tag(
|
|
||||||
t,
|
|
||||||
(_match.start(), idx),
|
|
||||||
(_match.end(), idx),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1212,18 +1206,8 @@ impl CompactListing {
|
||||||
debug!(crate::conf::text_format_regexps(context, "listing.subject"))
|
debug!(crate::conf::text_format_regexps(context, "listing.subject"))
|
||||||
{
|
{
|
||||||
let t = self.data_columns.columns[4].insert_tag(text_formatter.tag);
|
let t = self.data_columns.columns[4].insert_tag(text_formatter.tag);
|
||||||
for _match in text_formatter
|
for (start, end) in text_formatter.regexp.find_iter(strings.subject.as_str()) {
|
||||||
.regexp
|
self.data_columns.columns[4].set_tag(t, (start, idx), (end, idx));
|
||||||
.0
|
|
||||||
.find_iter(strings.subject.as_bytes())
|
|
||||||
{
|
|
||||||
if let Ok(_match) = _match {
|
|
||||||
self.data_columns.columns[4].set_tag(
|
|
||||||
t,
|
|
||||||
(_match.start(), idx),
|
|
||||||
(_match.end(), idx),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -571,10 +571,8 @@ impl Component for Pager {
|
||||||
{
|
{
|
||||||
let t = content.insert_tag(text_formatter.tag);
|
let t = content.insert_tag(text_formatter.tag);
|
||||||
for (i, l) in lines.iter().enumerate() {
|
for (i, l) in lines.iter().enumerate() {
|
||||||
for _match in text_formatter.regexp.0.find_iter(l.as_bytes()) {
|
for (start, end) in text_formatter.regexp.find_iter(l) {
|
||||||
if let Ok(_match) = _match {
|
content.set_tag(t, (start, i), (end, i));
|
||||||
content.set_tag(t, (_match.start(), i), (_match.end(), i));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -516,6 +516,7 @@ mod regexp {
|
||||||
pub(super) fg: Option<ThemeValue<Color>>,
|
pub(super) fg: Option<ThemeValue<Color>>,
|
||||||
pub(super) bg: Option<ThemeValue<Color>>,
|
pub(super) bg: Option<ThemeValue<Color>>,
|
||||||
pub(super) attrs: Option<ThemeValue<Attr>>,
|
pub(super) attrs: Option<ThemeValue<Attr>>,
|
||||||
|
pub(super) priority: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
|
@ -572,6 +573,57 @@ mod regexp {
|
||||||
.build(pattern)?
|
.build(pattern)?
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn find_iter<'w, 's>(&'w self, s: &'s str) -> FindIter<'w, 's> {
|
||||||
|
FindIter {
|
||||||
|
pcre_iter: self.0.find_iter(s.as_bytes()),
|
||||||
|
char_indices: s.char_indices(),
|
||||||
|
char_offset: 0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct FindIter<'r, 's> {
|
||||||
|
pcre_iter: pcre2::bytes::Matches<'r, 's>,
|
||||||
|
char_indices: std::str::CharIndices<'s>,
|
||||||
|
char_offset: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'r, 's> Iterator for FindIter<'r, 's> {
|
||||||
|
type Item = (usize, usize);
|
||||||
|
|
||||||
|
fn next(&mut self) -> Option<Self::Item> {
|
||||||
|
loop {
|
||||||
|
let next_byte_offset = self.pcre_iter.next();
|
||||||
|
if next_byte_offset.is_none() {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
let next_byte_offset = next_byte_offset.unwrap();
|
||||||
|
if next_byte_offset.is_err() {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
let next_byte_offset = next_byte_offset.unwrap();
|
||||||
|
|
||||||
|
while next_byte_offset.start() < self.char_indices.next().unwrap().0 {
|
||||||
|
self.char_offset += 1;
|
||||||
|
}
|
||||||
|
let start = self.char_offset;
|
||||||
|
|
||||||
|
while next_byte_offset.end()
|
||||||
|
>= self
|
||||||
|
.char_indices
|
||||||
|
.next()
|
||||||
|
.map(|(v, _)| v)
|
||||||
|
.unwrap_or(next_byte_offset.end())
|
||||||
|
+ 1
|
||||||
|
{
|
||||||
|
self.char_offset += 1;
|
||||||
|
}
|
||||||
|
let end = self.char_offset + 1;
|
||||||
|
|
||||||
|
return Some((start, end));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
|
@ -669,7 +721,7 @@ mod regexp {
|
||||||
}
|
}
|
||||||
ThemeValue::Value(val) => *val,
|
ThemeValue::Value(val) => *val,
|
||||||
}),
|
}),
|
||||||
priority: 0,
|
priority: v.priority,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
.collect()
|
.collect()
|
||||||
|
@ -739,6 +791,8 @@ impl<'de> Deserialize<'de> for Themes {
|
||||||
ucp: bool,
|
ucp: bool,
|
||||||
#[serde(default = "false_val")]
|
#[serde(default = "false_val")]
|
||||||
jit_if_available: bool,
|
jit_if_available: bool,
|
||||||
|
#[serde(default)]
|
||||||
|
priority: u8,
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
rest: ThemeAttributeInnerOptions,
|
rest: ThemeAttributeInnerOptions,
|
||||||
}
|
}
|
||||||
|
@ -804,6 +858,7 @@ impl<'de> Deserialize<'de> for Themes {
|
||||||
fg: v.rest.fg,
|
fg: v.rest.fg,
|
||||||
bg: v.rest.bg,
|
bg: v.rest.bg,
|
||||||
attrs: v.rest.attrs,
|
attrs: v.rest.attrs,
|
||||||
|
priority: v.priority,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
|
@ -859,6 +914,7 @@ impl<'de> Deserialize<'de> for Themes {
|
||||||
fg: v.rest.fg,
|
fg: v.rest.fg,
|
||||||
bg: v.rest.bg,
|
bg: v.rest.bg,
|
||||||
attrs: v.rest.attrs,
|
attrs: v.rest.attrs,
|
||||||
|
priority: v.priority,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
|
@ -917,6 +973,7 @@ impl<'de> Deserialize<'de> for Themes {
|
||||||
fg: v.rest.fg,
|
fg: v.rest.fg,
|
||||||
bg: v.rest.bg,
|
bg: v.rest.bg,
|
||||||
attrs: v.rest.attrs,
|
attrs: v.rest.attrs,
|
||||||
|
priority: v.priority,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
|
|
|
@ -1717,9 +1717,11 @@ pub fn copy_area(grid_dest: &mut CellBuffer, grid_src: &CellBuffer, dest: Area,
|
||||||
.binary_search_by(|probe| probe.0.cmp(&start_idx))
|
.binary_search_by(|probe| probe.0.cmp(&start_idx))
|
||||||
.unwrap_or_else(|i| i);
|
.unwrap_or_else(|i| i);
|
||||||
let mut stack: HashSet<u64> = HashSet::default();
|
let mut stack: HashSet<u64> = HashSet::default();
|
||||||
|
let mut sorted_stack: SmallVec<[u64; 64]> = SmallVec::new();
|
||||||
for y in get_y(upper_left!(dest))..=get_y(bottom_right!(dest)) {
|
for y in get_y(upper_left!(dest))..=get_y(bottom_right!(dest)) {
|
||||||
'for_x: for x in get_x(upper_left!(dest))..=get_x(bottom_right!(dest)) {
|
'for_x: for x in get_x(upper_left!(dest))..=get_x(bottom_right!(dest)) {
|
||||||
let idx = grid_src.pos_to_index(src_x, src_y).unwrap();
|
let idx = grid_src.pos_to_index(src_x, src_y).unwrap();
|
||||||
|
let resort_stack = tag_offset < tag_associations.len() && tag_associations[tag_offset].0 <= idx;
|
||||||
while tag_offset < tag_associations.len() && tag_associations[tag_offset].0 <= idx {
|
while tag_offset < tag_associations.len() && tag_associations[tag_offset].0 <= idx {
|
||||||
if tag_associations[tag_offset].2 {
|
if tag_associations[tag_offset].2 {
|
||||||
stack.insert(tag_associations[tag_offset].1);
|
stack.insert(tag_associations[tag_offset].1);
|
||||||
|
@ -1728,8 +1730,13 @@ pub fn copy_area(grid_dest: &mut CellBuffer, grid_src: &CellBuffer, dest: Area,
|
||||||
}
|
}
|
||||||
tag_offset += 1;
|
tag_offset += 1;
|
||||||
}
|
}
|
||||||
|
if resort_stack {
|
||||||
|
sorted_stack.clear();
|
||||||
|
sorted_stack.extend(stack.iter().cloned());
|
||||||
|
sorted_stack.sort_by_key(|h| grid_src.tag_table()[h].priority);
|
||||||
|
}
|
||||||
grid_dest[(x, y)] = grid_src[(src_x, src_y)];
|
grid_dest[(x, y)] = grid_src[(src_x, src_y)];
|
||||||
for t in &stack {
|
for t in &sorted_stack {
|
||||||
if let Some(fg) = grid_src.tag_table()[&t].fg {
|
if let Some(fg) = grid_src.tag_table()[&t].fg {
|
||||||
grid_dest[(x, y)].set_fg(fg).set_keep_fg(true);
|
grid_dest[(x, y)].set_fg(fg).set_keep_fg(true);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue