aboutsummaryrefslogtreecommitdiff
path: root/lib/gtk-experiment-widgets
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gtk-experiment-widgets')
-rw-r--r--lib/gtk-experiment-widgets/gtk-experiment-transcript-formats.c57
1 files changed, 31 insertions, 26 deletions
diff --git a/lib/gtk-experiment-widgets/gtk-experiment-transcript-formats.c b/lib/gtk-experiment-widgets/gtk-experiment-transcript-formats.c
index cc2697c..7b3b0f7 100644
--- a/lib/gtk-experiment-widgets/gtk-experiment-transcript-formats.c
+++ b/lib/gtk-experiment-widgets/gtk-experiment-transcript-formats.c
@@ -42,7 +42,6 @@
#define FORMAT_REGEX_COMPILE_FLAGS (G_REGEX_CASELESS)
#define FORMAT_REGEX_MATCH_FLAGS (0)
-/** @bug regexp after end of markup is ignored (e.g. "\b<u>ich</u>\b") */
static gboolean
gtk_experiment_transcript_parse_format(GtkExperimentTranscriptFormat *fmt,
const gchar *str,
@@ -50,6 +49,7 @@ gtk_experiment_transcript_parse_format(GtkExperimentTranscriptFormat *fmt,
{
PangoAttrIterator *iter;
+ /** @bug will crash for long patterns */
gchar *pattern, pattern_captures[255], *p;
gint capture_count = 0;
@@ -65,8 +65,10 @@ gtk_experiment_transcript_parse_format(GtkExperimentTranscriptFormat *fmt,
gint start, end;
pango_attr_iterator_range(iter, &start, &end);
+ if (end == G_MAXINT)
+ end = strlen(pattern);
- if (end < G_MAXINT) {
+ if (end - start > 0) {
*p++ = '(';
strncpy(p, pattern + start, end - start);
p += end - start;
@@ -119,35 +121,36 @@ gtk_experiment_transcript_apply_format(GtkExperimentTranscriptFormat *fmt,
while (g_match_info_matches(match_info)) {
PangoAttrIterator *iter;
- gint match_num = 1;
+ gint match_num = 0;
iter = pango_attr_list_get_iterator(fmt->attribs);
do {
gint start, end;
+ GSList *attribs;
pango_attr_iterator_range(iter, &start, &end);
if (end == G_MAXINT)
+ end = strlen(g_regex_get_pattern(fmt->regexp));
+
+ if (end - start == 0)
continue;
start = end = -1;
- g_match_info_fetch_pos(match_info, match_num,
+ g_match_info_fetch_pos(match_info, ++match_num,
&start, &end);
- if (start >= 0 && end >= 0) {
- GSList *attribs;
-
- attribs = pango_attr_iterator_get_attrs(iter);
- for (GSList *cur = attribs; cur != NULL; cur = cur->next) {
- PangoAttribute *attrib;
-
- attrib = pango_attribute_copy((PangoAttribute *)cur->data);
- attrib->start_index = (guint)start;
- attrib->end_index = (guint)end;
- pango_attr_list_change(attrib_list, attrib);
- }
- g_slist_free(attribs);
- }
+ if (start < 0 || end < 0)
+ continue;
- match_num++;
+ attribs = pango_attr_iterator_get_attrs(iter);
+ for (GSList *cur = attribs; cur != NULL; cur = cur->next) {
+ PangoAttribute *attrib;
+
+ attrib = pango_attribute_copy((PangoAttribute *)cur->data);
+ attrib->start_index = (guint)start;
+ attrib->end_index = (guint)end;
+ pango_attr_list_change(attrib_list, attrib);
+ }
+ g_slist_free(attribs);
} while (pango_attr_iterator_next(iter));
pango_attr_iterator_destroy(iter);
@@ -230,14 +233,16 @@ gtk_experiment_transcript_load_formats(GtkExperimentTranscript *trans,
cur_line++;
g_strchug(buf);
- switch (*buf) {
- case '#':
- case '\r':
- case '\n':
- case '\0':
- continue;
+ /* strip new line chars from end of `buf' */
+ for (gchar *p = buf + strlen(buf) - 1; p >= buf; p--) {
+ if (*p != '\r' && *p != '\n')
+ break;
+
+ *p = '\0';
}
- /** @todo null-terminate buf at line end to avoid confusing Pango parse errors referring to line 2 */
+
+ if (*buf == '#' || *buf == '\0')
+ continue;
fmt = g_new(GtkExperimentTranscriptFormat, 1);