From 04006ea81e5fbfa340fbdb38e42476cdb2f5db05 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 11 Jan 2020 15:22:12 +0530 Subject: [PATCH] Wrapper functions to handle passing matching values to C code --- kitty/line.c | 1 + kitty/marks.py | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 kitty/marks.py diff --git a/kitty/line.c b/kitty/line.c index eb952bb18..eac42f392 100644 --- a/kitty/line.c +++ b/kitty/line.c @@ -708,6 +708,7 @@ apply_marker(Marker *marker, Line *line, const PyObject *text) { } while(x < line->xnum) line->gpu_cells[x++].attrs &= ATTRS_MASK_WITHOUT_MARK; Py_DECREF(iter); +#undef INCREMENT_MATCH_POS } void diff --git a/kitty/marks.py b/kitty/marks.py new file mode 100644 index 000000000..168c37481 --- /dev/null +++ b/kitty/marks.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python +# vim:fileencoding=utf-8 +# License: GPLv3 Copyright: 2020, Kovid Goyal + +import re +from ctypes import c_void_p, cast, c_uint, POINTER + + +pointer_to_uint = POINTER(c_uint) + + +def null_marker(*a): + return iter(()) + + +def get_output_variables(left_address, right_address, color_address): + return ( + cast(c_void_p(left_address, pointer_to_uint)).contents, + cast(c_void_p(right_address, pointer_to_uint)).contents, + cast(c_void_p(color_address, pointer_to_uint)).contents, + ) + + +def marker_from_regex(expression, color): + color = max(1, min(color, 3)) + pat = re.compile(expression) + + def marker(text, left_address, right_address, color_address): + left, right, colorv = get_output_variables(left_address, right_address, color_address) + colorv.value = color + for match in pat.finditer(text): + left.value = match.start() + right.value = match.end() + yield + + return marker + + +def marker_from_text(expression, color): + return marker_from_regex(re.escape(expression), color) + + +def marker_from_function(func): + def marker(text, left_address, right_address, color_address): + left, right, colorv = get_output_variables(left_address, right_address, color_address) + for (l, r, c) in func(text): + left.value = l + right.value = r + colorv.value = c + yield + + return marker