diff --git a/moo/mooedit/gtksourceview/gtksourceview-api.h b/moo/mooedit/gtksourceview/gtksourceview-api.h
index 2b7a1e2c..59845546 100644
--- a/moo/mooedit/gtksourceview/gtksourceview-api.h
+++ b/moo/mooedit/gtksourceview/gtksourceview-api.h
@@ -35,6 +35,8 @@
#define _gtk_source_engine_set_style_scheme _moo_gtk_source_engine_set_style_scheme
#define gtk_source_iter_forward_search _moo_gtk_source_iter_forward_search
#define gtk_source_iter_backward_search _moo_gtk_source_iter_backward_search
+#define gtk_source_style_new _moo_gtk_source_style_new
+#define gtk_source_style_copy _moo_gtk_source_style_copy
#define gtk_source_style_free _moo_gtk_source_style_free
#define gtk_source_style_scheme_get_id _moo_gtk_source_style_scheme_get_id
#define gtk_source_style_scheme_get_name _moo_gtk_source_style_scheme_get_name
diff --git a/moo/mooedit/gtksourceview/upstream/gtksourcecontextengine.c b/moo/mooedit/gtksourceview/upstream/gtksourcecontextengine.c
index 834b6d65..9b6b4d69 100644
--- a/moo/mooedit/gtksourceview/upstream/gtksourcecontextengine.c
+++ b/moo/mooedit/gtksourceview/upstream/gtksourcecontextengine.c
@@ -78,7 +78,7 @@
#define LOOKUP_DEFINITION(ctx_data, id) \
(g_hash_table_lookup ((ctx_data)->definitions, (id)))
-#define HAS_OPTION(def,opt) (((def)->match_options & GTK_SOURCE_CONTEXT_##opt) != 0)
+#define HAS_OPTION(def,opt) (((def)->flags & GTK_SOURCE_CONTEXT_##opt) != 0)
/* Can the context be terminated by ancestor? */
/* Root context can't be terminated; its child may not be terminated by it;
@@ -92,6 +92,12 @@
((ctx)->parent == NULL || (ctx)->parent->parent == NULL || \
HAS_OPTION ((ctx)->definition, EXTEND_PARENT))
+/* Root and its children have this FALSE; grandchildren use the flag */
+#define CONTEXT_ENDS_PARENT(ctx) \
+ ((ctx)->parent != NULL && (ctx)->parent->parent != NULL && \
+ HAS_OPTION ((ctx)->definition, END_PARENT))
+#define SEGMENT_ENDS_PARENT(s) CONTEXT_ENDS_PARENT ((s)->context)
+
/* Does the segment terminate at line end? */
/* Root segment doesn't, children look at the flag */
#define CONTEXT_END_AT_LINE_END(ctx) \
@@ -187,7 +193,7 @@ struct _ContextDefinition
* context. */
Regex *reg_all;
- GtkSourceContextMatchOptions match_options;
+ GtkSourceContextFlags flags;
};
struct _SubPatternDefinition
@@ -295,6 +301,11 @@ struct _Segment
gint start_at;
gint end_at;
+ /* In case of container contexts, start_len/end_len is length in chars
+ * of start/end match. */
+ gint start_len;
+ gint end_len;
+
/* Whether this segment is a whole good segment, or it's an
* an end of bigger one left after erase_segments() call. */
guint is_start : 1;
@@ -529,6 +540,8 @@ set_tag_style (GtkSourceContextEngine *ce,
while (style == NULL)
{
+ /* XXX Style references really must be fixed, both parser for
+ * sane use in lang files, and engine for safe use. */
/* FIXME This may be an infinite loop *if* we allow circular
* references between lang files. */
map_to = g_hash_table_lookup (ENGINE_STYLES_MAP(ce), map_to);
@@ -711,9 +724,27 @@ apply_tags (GtkSourceContextEngine *ce,
if (tag != NULL)
{
- gtk_text_buffer_get_iter_at_offset (ce->priv->buffer, &start_iter, start_offset);
- gtk_text_buffer_get_iter_at_offset (ce->priv->buffer, &end_iter, end_offset);
- gtk_text_buffer_apply_tag (ce->priv->buffer, tag, &start_iter, &end_iter);
+ gint style_start_at, style_end_at;
+
+ style_start_at = start_offset;
+ style_end_at = end_offset;
+
+ if (HAS_OPTION (segment->context->definition, STYLE_INSIDE))
+ {
+ style_start_at = MAX (segment->start_at + segment->start_len, start_offset);
+ style_end_at = MIN (segment->end_at - segment->end_len, end_offset);
+ }
+
+ if (style_start_at > style_end_at)
+ {
+ g_critical ("%s: oops", G_STRLOC);
+ }
+ else
+ {
+ gtk_text_buffer_get_iter_at_offset (ce->priv->buffer, &start_iter, style_start_at);
+ gtk_text_buffer_get_iter_at_offset (ce->priv->buffer, &end_iter, style_end_at);
+ gtk_text_buffer_apply_tag (ce->priv->buffer, tag, &start_iter, &end_iter);
+ }
}
for (sp = segment->sub_patterns; sp != NULL; sp = sp->next)
@@ -840,7 +871,7 @@ ensure_highlighted (GtkSourceContextEngine *ce,
* refresh_region.
*
* Marks the area as updated - notifies view about it, and adds it to
- * refresh_region if @modify_refresh_region is TRUE (update_syntax may
+ * refresh_region if @modify_refresh_region is %TRUE (update_syntax may
* process huge area though actually updated is couple of lines, so in
* that case update_syntax() takes care of refresh_region, and this
* function only notifies the view).
@@ -1195,6 +1226,8 @@ find_insertion_place (Segment *segment,
*
* Finds invalid segment adjacent to offset (i.e. such that start <= offset <= end),
* if any.
+ *
+ * Returns: invalid segment or %NULL.
*/
static Segment *
get_invalid_at (GtkSourceContextEngine *ce,
@@ -1246,6 +1279,8 @@ segment_add_subpattern (Segment *state,
*
* Creates new subpattern and adds it to the segment's
* subpatterns list.
+ *
+ * Returns: new subpattern.
*/
static SubPattern *
sub_pattern_new (Segment *segment,
@@ -1312,6 +1347,8 @@ segment_make_invalid_ (GtkSourceContextEngine *ce,
ctx = segment->context;
segment->context = NULL;
segment->is_start = FALSE;
+ segment->start_len = 0;
+ segment->end_len = 0;
add_invalid (ce, segment);
context_unref (ctx);
}
@@ -1391,7 +1428,7 @@ simple_segment_split_ (GtkSourceContextEngine *ce,
* means insertion; 0 means "something happened here", it's
* treated as zero-length insertion.
*/
-static gboolean
+static void
invalidate_region (GtkSourceContextEngine *ce,
gint offset,
gint length)
@@ -1447,8 +1484,6 @@ invalidate_region (GtkSourceContextEngine *ce,
CHECK_TREE (ce);
install_first_update (ce);
-
- return TRUE;
}
/**
@@ -1461,7 +1496,7 @@ invalidate_region (GtkSourceContextEngine *ce,
* Updates segment tree after insertion: it updates tree
* offsets as appropriate, and inserts a new invalid segment
* or extends existing invalid segment as @offset, so
- * after the call segment [offset, offset + length) is marked
+ * after the call segment [@offset, @offset + @length) is marked
* invalid in the tree.
* It may be safely called with length == 0 at any moment
* to invalidate some offset (and it's used here and there).
@@ -1597,7 +1632,7 @@ gtk_source_context_engine_text_inserted (GtkSourceEngine *engine,
* @start: start of deleted text.
* @length: length of deleted text.
*
- * Returns new offset depending on location of @offset
+ * Returns: new offset depending on location of @offset
* relative to deleted text.
* Called only from fix_offsets_delete_().
*/
@@ -1722,7 +1757,7 @@ gtk_source_context_engine_text_deleted (GtkSourceEngine *engine,
*
* @ce: a #GtkSourceContextEngine.
*
- * Returns first invalid segment, or NULL.
+ * Returns: first invalid segment, or %NULL.
*/
static Segment *
get_invalid_segment (GtkSourceContextEngine *ce)
@@ -1736,7 +1771,7 @@ get_invalid_segment (GtkSourceContextEngine *ce)
*
* @ce: a #GtkSourceContextEngine.
*
- * Returns first invalid line, or -1.
+ * Returns: first invalid line, or -1.
*/
static gint
get_invalid_line (GtkSourceContextEngine *ce)
@@ -1846,7 +1881,7 @@ update_tree (GtkSourceContextEngine *ce)
* GtkSourceEngine::update_highlight method.
*
* Makes sure the area is analyzed and highlighted. If @asynchronous
- * is FALSE, then it queues idle worker.
+ * is %FALSE, then it queues idle worker.
*/
static void
gtk_source_context_engine_update_highlight (GtkSourceEngine *engine,
@@ -1940,7 +1975,7 @@ buffer_notify_highlight_cb (GtkSourceContextEngine *ce)
*
* @ce: a #GtkSourceContextEngine.
*
- * Returns whether everything is analyzed (but it doesn't care about the tags).
+ * Returns: whether everything is analyzed (but it doesn't care about the tags).
*/
static gboolean
all_analyzed (GtkSourceContextEngine *ce)
@@ -2095,7 +2130,7 @@ destroy_tags_hash (GtkSourceContextEngine *ce)
* @buffer: buffer.
*
* Detaches engine from previous buffer, and attaches to @buffer if
- * it's not NULL.
+ * it's not %NULL.
*/
static void
gtk_source_context_engine_attach_buffer (GtkSourceEngine *engine,
@@ -2184,8 +2219,17 @@ gtk_source_context_engine_attach_buffer (GtkSourceEngine *engine,
&start, TRUE);
ce->priv->invalid_region.end = gtk_text_buffer_create_mark (buffer, NULL,
&end, FALSE);
- ce->priv->invalid_region.empty = FALSE;
- ce->priv->invalid_region.delta = gtk_text_buffer_get_char_count (buffer);
+
+ if (gtk_text_buffer_get_char_count (buffer) != 0)
+ {
+ ce->priv->invalid_region.empty = FALSE;
+ ce->priv->invalid_region.delta = gtk_text_buffer_get_char_count (buffer);
+ }
+ else
+ {
+ ce->priv->invalid_region.empty = TRUE;
+ ce->priv->invalid_region.delta = 0;
+ }
g_object_get (ce->priv->buffer, "highlight", &ce->priv->highlight, NULL);
ce->priv->refresh_region = gtk_text_region_new (buffer);
@@ -2302,6 +2346,7 @@ _gtk_source_context_engine_new (GtkSourceContextData *ctx_data)
GtkSourceContextEngine *ce;
g_return_val_if_fail (ctx_data != NULL, NULL);
+ g_return_val_if_fail (ctx_data->lang != NULL, NULL);
ce = g_object_new (GTK_TYPE_SOURCE_CONTEXT_ENGINE, NULL);
ce->priv->ctx_data = _gtk_source_context_data_ref (ctx_data);
@@ -2351,7 +2396,7 @@ _gtk_source_context_data_ref (GtkSourceContextData *ctx_data)
*
* @ctx_data: #GtkSourceContextData.
*
- * Decreases reference count in ctx_data. Then reference count
+ * Decreases reference count in ctx_data. When reference count
* drops to zero, ctx_data is freed, and ctx_data->lang->priv->ctx_data
* is unset.
*/
@@ -2438,11 +2483,11 @@ find_single_byte_escape (const gchar *string)
*
* @pattern: the regular expression.
* @flags: compile options for @pattern.
- * @error: location to store the error occuring, or NULL to ignore errors.
+ * @error: location to store the error occuring, or %NULL to ignore errors.
*
* Creates a new regex.
*
- * Return value: a newly-allocated #Regex.
+ * Returns: a newly-allocated #Regex.
*/
static Regex *
regex_new (const gchar *pattern,
@@ -2457,7 +2502,7 @@ regex_new (const gchar *pattern,
{
g_set_error (error, GTK_SOURCE_CONTEXT_ENGINE_ERROR,
GTK_SOURCE_CONTEXT_ENGINE_ERROR_INVALID_REGEX,
- "using \\C is not supported");
+ _("using \\C is not supported in language definitions"));
return NULL;
}
@@ -2581,7 +2626,7 @@ replace_start_regex (const EggRegex *regex,
* them (they are extracted from @start_regex and @matched_text) and
* returns the new regular expression.
*
- * Return value: a #Regex.
+ * Returns: a #Regex.
*/
static Regex *
regex_resolve (Regex *regex,
@@ -2734,6 +2779,33 @@ apply_sub_patterns (Segment *state,
{
GSList *sub_pattern_list = state->context->definition->sub_patterns;
+ if (SEGMENT_IS_CONTAINER (state))
+ {
+ gint start_pos;
+ gint end_pos;
+
+ regex_fetch_pos (regex, line->text, 0, &start_pos, &end_pos);
+
+ if (where == SUB_PATTERN_WHERE_START)
+ {
+ if (line->start_at + start_pos != state->start_at)
+ g_critical ("%s: oops", G_STRLOC);
+ else if (line->start_at + end_pos > state->end_at)
+ g_critical ("%s: oops", G_STRLOC);
+ else
+ state->start_len = line->start_at + end_pos - state->start_at;
+ }
+ else
+ {
+ if (line->start_at + start_pos < state->start_at)
+ g_critical ("%s: oops", G_STRLOC);
+ else if (line->start_at + end_pos != state->end_at)
+ g_critical ("%s: oops", G_STRLOC);
+ else
+ state->end_len = state->end_at - line->start_at - start_pos;
+ }
+ }
+
while (sub_pattern_list != NULL)
{
SubPatternDefinition *sp_def = sub_pattern_list->data;
@@ -2770,25 +2842,18 @@ apply_sub_patterns (Segment *state,
}
/**
- * apply_match:
+ * can_apply_match:
*
* @state: the current state of the parser.
- * @line_starts_at: beginning offset of the line.
* @line: the line to analyze.
- * @line_pos: the position inside @line.
- * @line_length: the length of @line.
- * @regex: regex that matched.
+ * @match_start: start position of match.
+ * @match_end: where to put end of match.
* @where: kind of sub patterns to apply.
*
- * Moves @line_pos after the matched text. @line_pos is not
- * updated and the function returns %FALSE if the match cannot be
- * applied beacuse an ancestor ends in the middle of the matched
- * text.
+ * See apply_match(), this function is a helper function
+ * called from where, it doesn't modify syntax tree.
*
- * If the match can be applied the function applies the appropriate
- * sub patterns.
- *
- * Return value: %TRUE if the match can be applied.
+ * Returns: %TRUE if the match can be applied.
*/
static gboolean
can_apply_match (Context *state,
@@ -2850,6 +2915,24 @@ can_apply_match (Context *state,
return TRUE;
}
+/**
+ * apply_match:
+ *
+ * @state: the current state of the parser.
+ * @line: the line to analyze.
+ * @regex: regex that matched.
+ * @where: kind of sub patterns to apply.
+ *
+ * Moves @line_pos after the matched text. @line_pos is not
+ * updated and the function returns %FALSE if the match cannot be
+ * applied because an ancestor ends in the middle of the matched
+ * text.
+ *
+ * If the match can be applied the function applies the appropriate
+ * sub patterns.
+ *
+ * Returns: %TRUE if the match can be applied.
+ */
static gboolean
apply_match (Segment *state,
LineInfo *line,
@@ -2871,6 +2954,26 @@ apply_match (Segment *state,
return TRUE;
}
+/**
+ * create_reg_all:
+ *
+ * @context: context.
+ * @definition: context definition.
+ *
+ * Creates regular expression for all possible transitions: it
+ * combines terminating regex, terminating regexes of parent
+ * contexts if those can terminate this one, and start regexes
+ * of child contexts.
+ *
+ * It takes as an argument actual context or a context definition. In
+ * case when context end depends on start (\%{foo@start} references),
+ * it must use the context, definition is not enough. If there are no
+ * those references, then the reg_all is created right in the definition
+ * when no contexts exist yet. This is why this function has its funny
+ * arguments.
+ *
+ * Returns: resulting regex or %NULL when pcre failed to compile the regex.
+ */
static Regex *
create_reg_all (Context *context,
ContextDefinition *definition)
@@ -2920,6 +3023,9 @@ create_reg_all (Context *context,
{
gboolean append = TRUE;
+ /* Code as it is seems to be right, and seems working right.
+ * Remove FIXME's below if everything is fine. */
+
if (tmp->parent->end != NULL)
g_string_append (all, regex_get_pattern (tmp->parent->end));
/* FIXME ?
@@ -2981,14 +3087,12 @@ create_reg_all (Context *context,
if (regex == NULL)
{
/* regex_new could fail, for instance if there are different
- * named sub-patterns with the same name. */
- /* FIXME: this error also happens when some patterns are screwed up,
- * and printing error here actually helps. But the "for all the transitions"
- * part is questionable (and one would want to fix it in any case, even
- * if all patterns are correct). */
- g_warning ("Cannot create a regex for all the transitions, "
- "the syntax highlighting process will be slower "
- "than usual.\nThe error was: %s", error->message);
+ * named sub-patterns with the same name or if resulting regex is
+ * too long. In this case fixing lang file helps (e.g. renaming
+ * subpatterns, making huge keywords use bigger prefixes, etc.) */
+ g_warning (_("Cannot create a regex for all the transitions, "
+ "the syntax highlighting process will be slower "
+ "than usual.\nThe error was: %s"), error->message);
g_error_free (error);
}
@@ -3207,6 +3311,9 @@ context_freeze_hash_cb (G_GNUC_UNUSED gpointer text,
* and decrement it when we are done with analysis, so no more needed
* contexts go away. Keeping a list of referenced contexts is painful
* or slow, so we just reference all contexts present at the moment.
+ *
+ * Note this is not reentrant, context_freeze()/context_thaw() pair is called
+ * only from update_syntax().
*/
static void
context_freeze (Context *ctx)
@@ -3246,7 +3353,7 @@ get_child_contexts_hash_cb (G_GNUC_UNUSED gpointer text,
* @context: the context.
*
* Recursively decrements reference count in context and its children,
- * if it was incremented by context_freeze.
+ * if it was incremented by context_freeze().
*/
static void
context_thaw (Context *ctx)
@@ -3349,8 +3456,8 @@ create_child_context (Context *parent,
* segment_new:
*
* @ce: the engine.
- * @parent: parent segment (NULL for the root segment).
- * @context: context for this segment (NULL for invalid segments).
+ * @parent: parent segment (%NULL for the root segment).
+ * @context: context for this segment (%NULL for invalid segments).
* @start_at: start offset.
* @end_at: end offset.
* @is_start: is_start flag.
@@ -3457,7 +3564,7 @@ find_segment_position_backward_ (Segment *segment,
/**
* find_segment_position:
*
- * @parent: parent segment (not NULL).
+ * @parent: parent segment (not %NULL).
* @hint: segment somewhere near new segment position.
* @start_at: start offset.
* @end_at: end offset.
@@ -3511,8 +3618,8 @@ find_segment_position (Segment *parent,
* create_segment:
*
* @ce: the engine.
- * @parent: parent segment (NULL for the root segment).
- * @context: context for this segment (NULL for invalid segments).
+ * @parent: parent segment (%NULL for the root segment).
+ * @context: context for this segment (%NULL for invalid segments).
* @start_at: start offset.
* @end_at: end offset.
* @is_start: is_start flag.
@@ -3741,7 +3848,6 @@ simple_context_starts_here (GtkSourceContextEngine *ce,
{
gint match_end;
Context *new_context;
- Segment *new_segment;
ContextDefinition *definition = child_def->u.definition;
g_return_val_if_fail (definition->u.match != NULL, FALSE);
@@ -3754,27 +3860,54 @@ simple_context_starts_here (GtkSourceContextEngine *ce,
new_context = create_child_context (state->context, child_def, line->text);
g_return_val_if_fail (new_context != NULL, FALSE);
- if (!can_apply_match (new_context, line, *line_pos, &match_end, definition->u.match) ||
- /* if length of the match is zero, then we get zero-length segment and return to
- * the same state, so it's an infinite loop */
- *line_pos == match_end)
+ if (!can_apply_match (new_context, line, *line_pos, &match_end, definition->u.match))
+ {
+ context_unref (new_context);
+ return FALSE;
+ }
+
+ /* If length of the match is zero, then we get zero-length segment and return to
+ * the same state, so it's an infinite loop. But, if this child ends parent, we
+ * do want to terminate parent. Still, if match is at the beginning of the parent
+ * then we get an infinite loop again, so we check that (FIXME it really should destroy
+ * parent context then, but then we again can get parent context be recreated here and
+ * so on) */
+ if (*line_pos == match_end &&
+ (!CONTEXT_ENDS_PARENT (new_context) || *line_pos == state->start_at))
{
context_unref (new_context);
return FALSE;
}
g_assert (match_end <= line->length);
-
segment_extend (state, line->start_at + match_end);
- new_segment = create_segment (ce, state, new_context,
- line->start_at + *line_pos,
- line->start_at + match_end,
- TRUE,
- ce->priv->hint2);
- apply_sub_patterns (new_segment, line, definition->u.match, SUB_PATTERN_WHERE_DEFAULT);
+
+ if (*line_pos != match_end)
+ {
+ /* Normal non-zero-length match, create a child segment */
+ Segment *new_segment;
+ new_segment = create_segment (ce, state, new_context,
+ line->start_at + *line_pos,
+ line->start_at + match_end,
+ TRUE,
+ ce->priv->hint2);
+ apply_sub_patterns (new_segment, line, definition->u.match, SUB_PATTERN_WHERE_DEFAULT);
+ ce->priv->hint2 = new_segment;
+ }
+
+ /* Terminate parent if needed */
+ if (CONTEXT_ENDS_PARENT (new_context))
+ {
+ do
+ {
+ ce->priv->hint2 = state;
+ state = state->parent;
+ }
+ while (SEGMENT_ENDS_PARENT (state));
+ }
+
*line_pos = match_end;
*new_state = state;
- ce->priv->hint2 = new_segment;
context_unref (new_context);
return TRUE;
}
@@ -3793,7 +3926,7 @@ simple_context_starts_here (GtkSourceContextEngine *ce,
* @line_pos in @line. If the contexts start here @new_state and
* @line_pos are updated.
*
- * Return value: %TRUE if the context starts here.
+ * Returns: %TRUE if the context starts here.
*/
static gboolean
child_starts_here (GtkSourceContextEngine *ce,
@@ -3862,7 +3995,7 @@ segment_ends_here (Segment *state,
* This function only checks conetxts and does not modify the tree,
* it's used by ancestor_ends_here().
*
- * Return value: the ancestor context that terminates here or NULL.
+ * Returns: the ancestor context that terminates here or %NULL.
*/
static Context *
ancestor_context_ends_here (Context *state,
@@ -3922,11 +4055,11 @@ ancestor_context_ends_here (Context *state,
* @new_state: where to store the new state.
*
* Verifies if some ancestor context ends at given position. If
- * state changed and @new_state is not NULL, then the new state is stored
+ * state changed and @new_state is not %NULL, then the new state is stored
* in @new_state, and descendants of @new_state are closed, so the
* terminating segment becomes current state.
*
- * Return value: %TRUE if an ancestor ends at the given position.
+ * Returns: %TRUE if an ancestor ends at the given position.
*/
static gboolean
ancestor_ends_here (Segment *state,
@@ -3968,7 +4101,7 @@ ancestor_ends_here (Segment *state,
* Verifies if a context starts or ends in @line at @line_pos of after it.
* If the contexts starts or ends here @new_state and @line_pos are updated.
*
- * Return value: %FALSE is there are no more contexts in @line.
+ * Returns: %FALSE is there are no more contexts in @line.
*/
static gboolean
next_segment (GtkSourceContextEngine *ce,
@@ -4077,7 +4210,10 @@ next_segment (GtkSourceContextEngine *ce,
if (apply_match (state, line, &pos, state->context->end, SUB_PATTERN_WHERE_END))
{
g_assert (pos <= line->length);
- /* FIXME: if child may terminate parent */
+
+ while (SEGMENT_ENDS_PARENT (state))
+ state = state->parent;
+
*new_state = state->parent;
ce->priv->hint2 = state;
*line_pos = pos;
@@ -4101,7 +4237,7 @@ next_segment (GtkSourceContextEngine *ce,
* Closes the contexts that cannot contain end of lines if needed.
* Updates hint if new state is different from @state.
*
- * Return value: the new state.
+ * Returns: the new state.
*/
static Segment *
check_line_end (GtkSourceContextEngine *ce,
@@ -4210,7 +4346,7 @@ delete_zero_length_segments (GtkSourceContextEngine *ce,
*
* Finds contexts at the line and updates the syntax tree on it.
*
- * Return value: starting state at the next line.
+ * Returns: starting state at the next line.
*/
static Segment *
analyze_line (GtkSourceContextEngine *ce,
@@ -4572,7 +4708,7 @@ get_segment_ (Segment *segment,
* get_segment_at_offset:
*
* @ce: #GtkSoucreContextEngine.
- * @hint: segment to start search from or NULL.
+ * @hint: segment to start search from or %NULL.
* @offset: the offset.
*
* Finds the deepest segment "at @offset".
@@ -5061,11 +5197,11 @@ erase_segments (GtkSourceContextEngine *ce,
* update_syntax:
*
* @ce: #GtkSourceContextEngine.
- * @end: desired end of region to analyze or NULL.
+ * @end: desired end of region to analyze or %NULL.
* @time: maximal amount of time in milliseconds allowed to spend here
* or 0 for 'unlimited'.
*
- * Updates syntax tree. If @end is not NULL, then it analyzes
+ * Updates syntax tree. If @end is not %NULL, then it analyzes
* (reanalyzes invalid areas in) region from start of buffer
* to @end. Otherwise, it analyzes batch of text starting at
* first invalid line.
@@ -5073,7 +5209,7 @@ erase_segments (GtkSourceContextEngine *ce,
* when time elapsed is greater than @time, so analyzed region is
* not necessarily what's requested (unless @time is 0).
*/
-/* XXX it needs to be refactored. */
+/* XXX it must be refactored. */
static void
update_syntax (GtkSourceContextEngine *ce,
const GtkTextIter *end,
@@ -5201,6 +5337,8 @@ update_syntax (GtkSourceContextEngine *ce,
#endif
/* XXX this is wrong */
+ /* I don't know anymore why it's wrong, I guess it means
+ * "may be inefficient" */
if (ce->priv->hint2 != NULL)
ce->priv->hint = ce->priv->hint2;
else
@@ -5356,7 +5494,7 @@ context_definition_new (const gchar *id,
const gchar *start,
const gchar *end,
const gchar *style,
- GtkSourceContextMatchOptions options,
+ GtkSourceContextFlags flags,
GError **error)
{
ContextDefinition *definition;
@@ -5426,7 +5564,7 @@ context_definition_new (const gchar *id,
g_set_error (error,
GTK_SOURCE_CONTEXT_ENGINE_ERROR,
GTK_SOURCE_CONTEXT_ENGINE_ERROR_INVALID_START_REF,
- "context '%s' cannot contain a \\%%{...@start} command",
+ _("context '%s' cannot contain a \\%%{...@start} command"),
id);
regex_error = TRUE;
}
@@ -5440,7 +5578,7 @@ context_definition_new (const gchar *id,
definition->id = g_strdup (id);
definition->default_style = g_strdup (style);
definition->type = type;
- definition->match_options = options;
+ definition->flags = flags;
definition->children = NULL;
definition->sub_patterns = NULL;
definition->n_sub_patterns = 0;
@@ -5550,7 +5688,7 @@ _gtk_source_context_data_define_context (GtkSourceContextData *ctx_data,
const gchar *start_regex,
const gchar *end_regex,
const gchar *style,
- GtkSourceContextMatchOptions options,
+ GtkSourceContextFlags flags,
GError **error)
{
ContextDefinition *definition, *parent = NULL;
@@ -5569,7 +5707,7 @@ _gtk_source_context_data_define_context (GtkSourceContextData *ctx_data,
g_set_error (error,
GTK_SOURCE_CONTEXT_ENGINE_ERROR,
GTK_SOURCE_CONTEXT_ENGINE_ERROR_DUPLICATED_ID,
- "duplicated context id '%s'", id);
+ _("duplicated context id '%s'"), id);
return FALSE;
}
@@ -5596,7 +5734,8 @@ _gtk_source_context_data_define_context (GtkSourceContextData *ctx_data,
g_set_error (error,
GTK_SOURCE_CONTEXT_ENGINE_ERROR,
GTK_SOURCE_CONTEXT_ENGINE_ERROR_INVALID_ARGS,
- "insufficient or redunduant arguments creating "
+ /* do not translate, parser should take care of this */
+ "insufficient or redundant arguments creating "
"the context '%s'", id);
return FALSE;
}
@@ -5613,7 +5752,7 @@ _gtk_source_context_data_define_context (GtkSourceContextData *ctx_data,
definition = context_definition_new (id, type, match_regex,
start_regex, end_regex, style,
- options, error);
+ flags, error);
if (definition == NULL)
return FALSE;
@@ -5652,7 +5791,7 @@ _gtk_source_context_data_add_sub_pattern (GtkSourceContextData *ctx_data,
g_set_error (error,
GTK_SOURCE_CONTEXT_ENGINE_ERROR,
GTK_SOURCE_CONTEXT_ENGINE_ERROR_DUPLICATED_ID,
- "duplicated context id '%s'", id);
+ _("duplicated context id '%s'"), id);
return FALSE;
}
@@ -5679,6 +5818,7 @@ _gtk_source_context_data_add_sub_pattern (GtkSourceContextData *ctx_data,
g_set_error (error,
GTK_SOURCE_CONTEXT_ENGINE_ERROR,
GTK_SOURCE_CONTEXT_ENGINE_ERROR_INVALID_WHERE,
+ /* do not translate, parent takes care of this */
"invalid location ('%s') for sub pattern '%s'",
where, id);
return FALSE;
@@ -5751,7 +5891,8 @@ _gtk_source_context_data_add_ref (GtkSourceContextData *ctx_data,
g_set_error (error,
GTK_SOURCE_CONTEXT_ENGINE_ERROR,
GTK_SOURCE_CONTEXT_ENGINE_ERROR_INVALID_PARENT,
- _("invalid parent type for the context '%s'"),
+ /* do not translate, parent takes care of this */
+ "invalid parent type for the context '%s'",
ref_id);
return FALSE;
}
@@ -5823,8 +5964,8 @@ resolve_reference (G_GNUC_UNUSED const gchar *id,
{
g_set_error (&data->error, GTK_SOURCE_CONTEXT_ENGINE_ERROR,
GTK_SOURCE_CONTEXT_ENGINE_ERROR_INVALID_STYLE,
- "style override used with wildcard context reference"
- " in language '%s' in ref '%s'",
+ _("style override used with wildcard context reference"
+ " in language '%s' in ref '%s'"),
data->ctx_data->lang->priv->id, ref->id);
}
else
@@ -5837,7 +5978,7 @@ resolve_reference (G_GNUC_UNUSED const gchar *id,
{
g_set_error (&data->error, GTK_SOURCE_CONTEXT_ENGINE_ERROR,
GTK_SOURCE_CONTEXT_ENGINE_ERROR_INVALID_REF,
- "invalid reference '%s'", child_def->u.id);
+ _("invalid reference '%s'"), child_def->u.id);
}
}
}
@@ -5857,7 +5998,7 @@ resolve_reference (G_GNUC_UNUSED const gchar *id,
* May be called any number of times, must be called after parsing is
* done.
*
- * Return value: TRUE on success, FALSE if there were unresolved
+ * Returns: %TRUE on success, %FALSE if there were unresolved
* references.
*/
gboolean
diff --git a/moo/mooedit/gtksourceview/upstream/gtksourcecontextengine.h b/moo/mooedit/gtksourceview/upstream/gtksourcecontextengine.h
index bcbcd98a..5fe215d2 100644
--- a/moo/mooedit/gtksourceview/upstream/gtksourcecontextengine.h
+++ b/moo/mooedit/gtksourceview/upstream/gtksourcecontextengine.h
@@ -54,10 +54,12 @@ struct _GtkSourceContextEngineClass
typedef enum {
GTK_SOURCE_CONTEXT_EXTEND_PARENT = 1 << 0,
- GTK_SOURCE_CONTEXT_END_AT_LINE_END = 1 << 1,
- GTK_SOURCE_CONTEXT_FIRST_LINE_ONLY = 1 << 2,
- GTK_SOURCE_CONTEXT_ONCE_ONLY = 1 << 3
-} GtkSourceContextMatchOptions;
+ GTK_SOURCE_CONTEXT_END_PARENT = 1 << 1,
+ GTK_SOURCE_CONTEXT_END_AT_LINE_END = 1 << 2,
+ GTK_SOURCE_CONTEXT_FIRST_LINE_ONLY = 1 << 3,
+ GTK_SOURCE_CONTEXT_ONCE_ONLY = 1 << 4,
+ GTK_SOURCE_CONTEXT_STYLE_INSIDE = 1 << 5
+} GtkSourceContextFlags;
typedef enum {
GTK_SOURCE_CONTEXT_IGNORE_STYLE = 1 << 0,
@@ -80,7 +82,7 @@ gboolean _gtk_source_context_data_define_context
const gchar *start_regex,
const gchar *end_regex,
const gchar *style,
- GtkSourceContextMatchOptions options,
+ GtkSourceContextFlags flags,
GError **error);
gboolean _gtk_source_context_data_add_sub_pattern
diff --git a/moo/mooedit/gtksourceview/upstream/gtksourcelanguage-parser-1.c b/moo/mooedit/gtksourceview/upstream/gtksourcelanguage-parser-1.c
index ae87bb7b..c0b9dc0e 100644
--- a/moo/mooedit/gtksourceview/upstream/gtksourcelanguage-parser-1.c
+++ b/moo/mooedit/gtksourceview/upstream/gtksourcelanguage-parser-1.c
@@ -99,7 +99,7 @@ ctx_data_add_syntax_pattern (GtkSourceContextData *ctx_data,
gchar *real_id, *root_id;
gchar *fixed_start, *fixed_end;
GError *error = NULL;
- GtkSourceContextMatchOptions options = GTK_SOURCE_CONTEXT_EXTEND_PARENT;
+ GtkSourceContextFlags flags = GTK_SOURCE_CONTEXT_EXTEND_PARENT;
g_return_val_if_fail (id != NULL, FALSE);
@@ -110,14 +110,14 @@ ctx_data_add_syntax_pattern (GtkSourceContextData *ctx_data,
fixed_end = fix_pattern (pattern_end, &end_at_line_end);
if (end_at_line_end)
- options |= GTK_SOURCE_CONTEXT_END_AT_LINE_END;
+ flags |= GTK_SOURCE_CONTEXT_END_AT_LINE_END;
result = _gtk_source_context_data_define_context (ctx_data, real_id, root_id,
NULL,
pattern_start,
pattern_end,
style,
- options,
+ flags,
&error);
if (error != NULL)
diff --git a/moo/mooedit/gtksourceview/upstream/gtksourcelanguage-parser-2.c b/moo/mooedit/gtksourceview/upstream/gtksourcelanguage-parser-2.c
index 30bfdfaf..f36fcfdf 100644
--- a/moo/mooedit/gtksourceview/upstream/gtksourcelanguage-parser-2.c
+++ b/moo/mooedit/gtksourceview/upstream/gtksourcelanguage-parser-2.c
@@ -76,14 +76,15 @@ struct _ParserState
GHashTable *defined_regexes;
/* The mapping between style ids and their default styles.
- * If lang file contains this:
+ * If lang file 'mama' contains this:
*
*
- * then in styles_mapping: "foo"->"def:blah", "bar"->"bar". */
+ * then in styles_mapping: "mama:foo"->"def:blah", "mama:bar"->"mama:bar". */
GHashTable *styles_mapping;
- /* The list of loaded languages (the item are XmlChar pointers) */
- GSList **loaded_lang_ids;
+ /* The list of loaded languages (the item are xmlChar pointers),
+ * mapping is id -> id */
+ GHashTable *loaded_lang_ids;
/* A serial number incremented to get unique generated names */
guint id_cookie;
@@ -111,7 +112,7 @@ static ParserState *parser_state_new (GtkSourceLanguage *language
GHashTable *defined_regexes,
GHashTable *styles_mapping,
xmlTextReader *reader,
- GSList **loaded_lang_ids);
+ GHashTable *loaded_lang_ids);
static void parser_state_destroy (ParserState *parser_state);
static gboolean file_parse (gchar *filename,
@@ -119,7 +120,7 @@ static gboolean file_parse (gchar *filename
GtkSourceContextData *ctx_data,
GHashTable *defined_regexes,
GHashTable *styles,
- GSList **loaded_lang_ids,
+ GHashTable *loaded_lang_ids,
GError **error);
static EggRegexCompileFlags
@@ -194,34 +195,18 @@ id_is_decorated (const gchar *id,
/* This function is quite simple because the XML validator check for
* the correctness of the id with a regex */
- gchar **tokens;
- gboolean is_decorated;
+ const gchar *colon;
+ gboolean is_decorated = FALSE;
- tokens = g_strsplit (id, ":", 2);
+ colon = strchr (id, ':');
- g_return_val_if_fail (tokens != NULL, FALSE);
-
- if (tokens [1] == NULL)
- {
- /* There is no ":" in the id */
- is_decorated = FALSE;
- }
- else if (tokens [1] != NULL && strcmp ("*", tokens[1]) == 0)
- {
- /* This is an undecorated "import all", and not a decorated
- * reference */
- is_decorated = FALSE;
- }
- else
+ if (colon != NULL && strcmp ("*", colon + 1) != 0)
{
is_decorated = TRUE;
- if (lang_id != NULL)
- {
- *lang_id = g_strdup (tokens[0]);
- }
- }
- g_strfreev (tokens);
+ if (lang_id != NULL)
+ *lang_id = g_strndup (id, colon - id);
+ }
return is_decorated;
}
@@ -243,23 +228,7 @@ decorate_id (ParserState *parser_state,
static gboolean
lang_id_is_already_loaded (ParserState *parser_state, gchar *lang_id)
{
- GSList *l;
- gchar *loaded_lang;
-
- l = *(parser_state->loaded_lang_ids);
-
- g_return_val_if_fail (lang_id != NULL, FALSE);
-
- while (l != NULL)
- {
- loaded_lang = l->data;
- if (strcmp (loaded_lang, lang_id) == 0)
- {
- return TRUE;
- }
- l = g_slist_next (l);
- }
- return FALSE;
+ return g_hash_table_lookup (parser_state->loaded_lang_ids, lang_id) != NULL;
}
@@ -293,20 +262,27 @@ get_regex_flags (xmlNode *node,
return flags;
}
-static GtkSourceContextMatchOptions
-check_context_options (ParserState *parser_state,
- GtkSourceContextMatchOptions options)
+static GtkSourceContextFlags
+get_context_flags (ParserState *parser_state)
{
guint i;
xmlChar *value;
+ GtkSourceContextFlags flags = GTK_SOURCE_CONTEXT_EXTEND_PARENT;
const gchar *names[] = {
- "extend-parent", "end-at-line-end", "first-line-only", "once-only"
+ "extend-parent", "end-parent", "end-at-line-end",
+ "first-line-only", "once-only", "style-inside"
};
- GtkSourceContextMatchOptions flags[] = {
- GTK_SOURCE_CONTEXT_EXTEND_PARENT, GTK_SOURCE_CONTEXT_END_AT_LINE_END,
- GTK_SOURCE_CONTEXT_FIRST_LINE_ONLY, GTK_SOURCE_CONTEXT_ONCE_ONLY
+ GtkSourceContextFlags values[] = {
+ GTK_SOURCE_CONTEXT_EXTEND_PARENT,
+ GTK_SOURCE_CONTEXT_END_PARENT,
+ GTK_SOURCE_CONTEXT_END_AT_LINE_END,
+ GTK_SOURCE_CONTEXT_FIRST_LINE_ONLY,
+ GTK_SOURCE_CONTEXT_ONCE_ONLY,
+ GTK_SOURCE_CONTEXT_STYLE_INSIDE
};
+ g_assert (G_N_ELEMENTS (names) == G_N_ELEMENTS (values));
+
for (i = 0; i < G_N_ELEMENTS (names); ++i)
{
value = xmlTextReaderGetAttribute (parser_state->reader, BAD_CAST names[i]);
@@ -314,15 +290,15 @@ check_context_options (ParserState *parser_state,
if (value != NULL)
{
if (str_to_bool (value))
- options |= flags[i];
+ flags |= values[i];
else
- options &= ~flags[i];
+ flags &= ~values[i];
}
xmlFree (value);
}
- return options;
+ return flags;
}
static gboolean
@@ -334,7 +310,7 @@ create_definition (ParserState *parser_state,
{
gchar *match = NULL, *start = NULL, *end = NULL;
gchar *prefix = NULL, *suffix = NULL;
- GtkSourceContextMatchOptions options;
+ GtkSourceContextFlags flags;
xmlNode *context_node, *child;
@@ -348,7 +324,7 @@ create_definition (ParserState *parser_state,
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
- options = check_context_options (parser_state, GTK_SOURCE_CONTEXT_EXTEND_PARENT);
+ flags = get_context_flags (parser_state);
DEBUG (g_message ("creating context %s, child of %s", id, parent_id ? parent_id : "(null)"));
@@ -496,7 +472,7 @@ create_definition (ParserState *parser_state,
start,
end,
style,
- options,
+ flags,
&tmp_error);
g_free (match);
@@ -718,6 +694,7 @@ handle_context_element (ParserState *parser_state,
g_warning ("style-ref and ignore-style used simultaneously");
}
+ /* XXX */
if (!ignore_style && style_ref != NULL &&
g_hash_table_lookup (parser_state->styles_mapping, style_ref) == NULL)
{
@@ -821,10 +798,8 @@ handle_language_element (ParserState *parser_state,
lang_id = xmlTextReaderGetAttribute (parser_state->reader, BAD_CAST "id");
- parser_state->current_lang_id = g_strdup ((gchar *)lang_id);
-
- *(parser_state->loaded_lang_ids) = g_slist_prepend (
- *(parser_state->loaded_lang_ids), lang_id);
+ parser_state->current_lang_id = g_strdup ((gchar *) lang_id);
+ g_hash_table_insert (parser_state->loaded_lang_ids, lang_id, lang_id);
xmlFree (lang_version);
}
@@ -1298,46 +1273,6 @@ handle_default_regex_options_element (ParserState *parser_state,
xmlFree (options);
}
-static void
-map_style (ParserState *parser_state,
- gchar *style_id,
- gchar *map_to,
- GError **error)
-{
- const gchar *real_map_to;
-
- g_return_if_fail (error != NULL && *error == NULL);
- g_return_if_fail (style_id != NULL);
-
- if (map_to != NULL)
- {
- if (g_hash_table_lookup (parser_state->styles_mapping, map_to) != NULL)
- real_map_to = map_to;
- else
- real_map_to = NULL;
- }
- else
- {
- real_map_to = style_id;
- }
-
- DEBUG (g_message ("mapping the style of '%s' to '%s' -> '%s'",
- style_id,
- map_to ? map_to : "(null)",
- mapped_style));
-
- if (real_map_to != NULL)
- g_hash_table_insert (parser_state->styles_mapping,
- g_strdup (style_id),
- g_strdup (real_map_to));
- else
- g_set_error (error,
- PARSER_ERROR,
- PARSER_ERROR_WRONG_ID,
- "unable to map style '%s' to '%s'",
- style_id, map_to);
-}
-
static void
parse_language_with_id (ParserState *parser_state,
gchar *lang_id,
@@ -1403,6 +1338,7 @@ parse_style (ParserState *parser_state,
name = xmlTextReaderGetAttribute (parser_state->reader,
BAD_CAST "_name");
+ /* FIXME: actually use this name somehow */
if (name != NULL)
{
tmp = xmlStrdup (BAD_CAST dgettext (parser_state->language->priv->translation_domain,
@@ -1441,7 +1377,8 @@ parse_style (ParserState *parser_state,
name, id, map_to ? (char*) map_to : "(null)"));
if (tmp_error == NULL)
- map_style (parser_state, id, (gchar*) map_to, &tmp_error);
+ g_hash_table_insert (parser_state->styles_mapping, g_strdup (id),
+ map_to ? g_strdup ((char*) map_to) : g_strdup (id));
g_free (lang_id);
g_free (id);
@@ -1612,7 +1549,7 @@ file_parse (gchar *filename,
GtkSourceContextData *ctx_data,
GHashTable *defined_regexes,
GHashTable *styles,
- GSList **loaded_lang_ids,
+ GHashTable *loaded_lang_ids,
GError **error)
{
ParserState *parser_state;
@@ -1715,7 +1652,7 @@ parser_state_new (GtkSourceLanguage *language,
GHashTable *defined_regexes,
GHashTable *styles_mapping,
xmlTextReader *reader,
- GSList **loaded_lang_ids)
+ GHashTable *loaded_lang_ids)
{
ParserState *parser_state;
parser_state = g_new (ParserState, 1);
@@ -1780,8 +1717,7 @@ _gtk_source_language_file_parse_version2 (GtkSourceLanguage *language,
gboolean success;
GError *error = NULL;
gchar *filename;
- GSList *loaded_lang_ids = NULL;
- GSList *l;
+ GHashTable *loaded_lang_ids;
g_return_val_if_fail (ctx_data != NULL, FALSE);
@@ -1800,10 +1736,13 @@ _gtk_source_language_file_parse_version2 (GtkSourceLanguage *language,
g_free, g_free);
styles = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, g_free);
+ loaded_lang_ids = g_hash_table_new_full (g_str_hash, g_str_equal,
+ (GDestroyNotify) xmlFree,
+ NULL);
success = file_parse (filename, language, ctx_data,
defined_regexes, styles,
- &loaded_lang_ids, &error);
+ loaded_lang_ids, &error);
if (success)
success = _gtk_source_context_data_resolve_refs (ctx_data, &error);
@@ -1813,12 +1752,7 @@ _gtk_source_language_file_parse_version2 (GtkSourceLanguage *language,
(GHRFunc) steal_styles_mapping,
language->priv->styles);
- for (l = loaded_lang_ids; l != NULL; l = l->next)
- {
- xmlFree (l->data);
- }
- g_slist_free (loaded_lang_ids);
-
+ g_hash_table_destroy (loaded_lang_ids);
g_hash_table_destroy (defined_regexes);
g_hash_table_destroy (styles);
diff --git a/moo/mooedit/gtksourceview/upstream/gtksourcelanguage.c b/moo/mooedit/gtksourceview/upstream/gtksourcelanguage.c
index 515f96cc..f2bf1e5e 100644
--- a/moo/mooedit/gtksourceview/upstream/gtksourcelanguage.c
+++ b/moo/mooedit/gtksourceview/upstream/gtksourcelanguage.c
@@ -384,7 +384,7 @@ process_language_node (xmlTextReaderPtr reader, const gchar *filename)
*
* Returns the ID of the language. The ID is not locale-dependent.
*
- * Return value: the ID of @language, it must be freed it with g_free.
+ * Returns: the ID of @language, it must be freed it with g_free.
**/
gchar *
gtk_source_language_get_id (GtkSourceLanguage *language)
@@ -401,7 +401,7 @@ gtk_source_language_get_id (GtkSourceLanguage *language)
*
* Returns the localized name of the language.
*
- * Return value: the name of @language.
+ * Returns: the name of @language.
**/
gchar *
gtk_source_language_get_name (GtkSourceLanguage *language)
@@ -420,7 +420,7 @@ gtk_source_language_get_name (GtkSourceLanguage *language)
* Each language belong to a section (ex. HTML belogs to the
* Markup section).
*
- * Return value: the section of @language.
+ * Returns: the section of @language.
**/
gchar *
gtk_source_language_get_section (GtkSourceLanguage *language)
@@ -431,57 +431,14 @@ gtk_source_language_get_section (GtkSourceLanguage *language)
return g_strdup (language->priv->section);
}
-gint
-gtk_source_language_get_version (GtkSourceLanguage *language)
-{
- g_return_val_if_fail (GTK_IS_SOURCE_LANGUAGE (language), 0);
-
- return language->priv->version;
-}
-
-/**
- * gtk_source_language_get_mime_types:
- * @language: a #GtkSourceLanguage.
- *
- * Returns a list of mime types for the given @language. After usage you should
- * free each element of the list as well as the list itself.
- *
- * Return value: a list of mime types (strings).
- **/
-GSList *
-gtk_source_language_get_mime_types (GtkSourceLanguage *language)
-{
- const gchar *prop;
- gchar **mtl;
- gint i;
- GSList *list = NULL;
-
- g_return_val_if_fail (GTK_IS_SOURCE_LANGUAGE (language), NULL);
-
- prop = gtk_source_language_get_property (language, "mimetypes");
-
- if (!prop)
- return NULL;
-
- mtl = g_strsplit_set (prop, ";,", 0);
-
- for (i = 0; mtl[i] != NULL; i++)
- /* steal the strings from the array */
- list = g_slist_prepend (list, mtl[i]);
-
- g_free (mtl);
-
- return g_slist_reverse (list);
-}
-
/**
* gtk_source_language_get_property:
*
* @language: a #GtkSourceLanguage.
* @name: property name.
*
- * Returns value of property %name if it's set in the lang file
- * and NULL otherwise.
+ * Returns: value of property %name if it's set in @language
+ * and %NULL otherwise.
**/
const gchar *
gtk_source_language_get_property (GtkSourceLanguage *language,
@@ -497,9 +454,7 @@ gtk_source_language_get_property (GtkSourceLanguage *language,
* _gtk_source_language_get_languages_manager:
* @language: a #GtkSourceLanguage.
*
- * Returns the #GtkSourceLanguagesManager for the #GtkSourceLanguage.
- *
- * Return value: #GtkSourceLanguagesManager for @language.
+ * Returns: #GtkSourceLanguagesManager for @language.
**/
GtkSourceLanguagesManager *
_gtk_source_language_get_languages_manager (GtkSourceLanguage *language)
diff --git a/moo/mooedit/gtksourceview/upstream/gtksourcelanguage.h b/moo/mooedit/gtksourceview/upstream/gtksourcelanguage.h
index e69fd931..84507c30 100644
--- a/moo/mooedit/gtksourceview/upstream/gtksourcelanguage.h
+++ b/moo/mooedit/gtksourceview/upstream/gtksourcelanguage.h
@@ -57,10 +57,7 @@ gchar *gtk_source_language_get_id (GtkSourceLanguage *language);
gchar *gtk_source_language_get_name (GtkSourceLanguage *language);
gchar *gtk_source_language_get_section (GtkSourceLanguage *language);
-gint gtk_source_language_get_version (GtkSourceLanguage *language);
-/* Should free the list (and free each string in it also). */
-GSList *gtk_source_language_get_mime_types (GtkSourceLanguage *language);
const gchar *gtk_source_language_get_property (GtkSourceLanguage *language,
const gchar *name);
diff --git a/moo/mooedit/gtksourceview/upstream/gtksourcelanguagesmanager.c b/moo/mooedit/gtksourceview/upstream/gtksourcelanguagesmanager.c
index 9076c68d..43e000a2 100644
--- a/moo/mooedit/gtksourceview/upstream/gtksourcelanguagesmanager.c
+++ b/moo/mooedit/gtksourceview/upstream/gtksourcelanguagesmanager.c
@@ -39,6 +39,7 @@ enum {
struct _GtkSourceLanguagesManagerPrivate
{
+ GHashTable *language_ids;
GSList *available_languages;
GSList *language_specs_directories;
char *rng_file;
@@ -142,7 +143,7 @@ gtk_source_languages_manager_init (GtkSourceLanguagesManager *lm)
*
* Creates a new language manager.
*
- * Return value: a #GtkSourceLanguagesManager.
+ * Returns: a #GtkSourceLanguagesManager.
**/
GtkSourceLanguagesManager *
gtk_source_languages_manager_new (void)
@@ -157,6 +158,9 @@ gtk_source_languages_manager_finalize (GObject *object)
lm = GTK_SOURCE_LANGUAGES_MANAGER (object);
+ if (lm->priv->language_ids)
+ g_hash_table_destroy (lm->priv->language_ids);
+
g_slist_foreach (lm->priv->available_languages, (GFunc) g_object_unref, NULL);
g_slist_free (lm->priv->available_languages);
slist_deep_free (lm->priv->language_specs_directories);
@@ -234,7 +238,7 @@ gtk_source_languages_manager_set_specs_dirs (GtkSourceLanguagesManager *lm,
*
* Gets a list of language files directories for the given language manager.
*
- * Return value: a list of language files directories (as strings).
+ * Returns: a list of language files directories (as strings).
**/
const GSList *
gtk_source_languages_manager_get_lang_files_dirs (GtkSourceLanguagesManager *lm)
@@ -291,114 +295,61 @@ prepend_lang (G_GNUC_UNUSED gchar *id,
g_slist_prepend (lm->priv->available_languages, lang);
}
+static void
+ensure_languages (GtkSourceLanguagesManager *lm)
+{
+ GSList *filenames, *l;
+
+ if (lm->priv->language_ids != NULL)
+ return;
+
+ /* Build list of availables languages */
+ filenames = get_lang_files (lm);
+ lm->priv->language_ids = g_hash_table_new (g_str_hash, g_str_equal);
+
+ for (l = filenames; l != NULL; l = l->next)
+ {
+ GtkSourceLanguage *lang;
+ const gchar *filename;
+
+ filename = l->data;
+ lang = _gtk_source_language_new_from_file (filename, lm);
+
+ if (lang == NULL)
+ {
+ g_warning ("Error reading language specification file '%s'", filename);
+ continue;
+ }
+
+ if (g_hash_table_lookup (lm->priv->language_ids, lang->priv->id) == NULL)
+ g_hash_table_insert (lm->priv->language_ids,
+ lang->priv->id,
+ lang);
+ else
+ g_object_unref (lang);
+ }
+
+ g_hash_table_foreach (lm->priv->language_ids, (GHFunc) prepend_lang, lm);
+ slist_deep_free (filenames);
+}
+
/**
* gtk_source_languages_manager_get_available_languages:
* @lm: a #GtkSourceLanguagesManager.
*
* Gets a list of available languages for the given language manager.
- * This function returns a pointer to a internal list, so there is no need to
- * free it after usage.
*
- * Return value: a list of #GtkSourceLanguage.
+ * Returns: a list of #GtkSourceLanguage. Return value is owned by @lm and should
+ * not be modified or freed.
**/
const GSList *
gtk_source_languages_manager_get_available_languages (GtkSourceLanguagesManager *lm)
{
- GSList *filenames, *l;
- GHashTable *lang_hash;
-
g_return_val_if_fail (GTK_IS_SOURCE_LANGUAGES_MANAGER (lm), NULL);
-
- if (lm->priv->available_languages != NULL)
- {
- return lm->priv->available_languages;
- }
-
- /* Build list of availables languages */
- filenames = get_lang_files (lm);
-
- lang_hash = g_hash_table_new (g_str_hash, g_str_equal);
-
- for (l = filenames; l != NULL; l = l->next)
- {
- GtkSourceLanguage *lang;
-
- lang = _gtk_source_language_new_from_file ((const gchar*)l->data,
- lm);
-
- if (lang == NULL)
- {
- g_warning ("Error reading language specification file '%s'",
- (const gchar*)l->data);
- continue;
- }
-
- if (g_hash_table_lookup (lang_hash, lang->priv->id) == NULL)
- {
- g_hash_table_insert (lang_hash,
- lang->priv->id,
- lang);
- }
- }
-
- slist_deep_free (filenames);
-
- g_hash_table_foreach (lang_hash, (GHFunc) prepend_lang, lm);
-
- g_hash_table_destroy (lang_hash);
-
+ ensure_languages (lm);
return lm->priv->available_languages;
}
-/**
- * gtk_source_languages_manager_get_language_for_mime_type:
- * @lm: a #GtkSourceLanguagesManager.
- * @mime_type: a mime type.
- *
- * Gets the #GtkSourceLanguage which is associated with the given @mime_type
- * in the language manager.
- *
- * Return value: a #GtkSourceLanguage, or %NULL if there is no language
- * associated with the given @mime_type.
- **/
-/* FIXME use hash table here */
-GtkSourceLanguage *
-gtk_source_languages_manager_get_language_for_mime_type (GtkSourceLanguagesManager *lm,
- const gchar *mime_type)
-{
- const GSList *languages;
- g_return_val_if_fail (mime_type != NULL, NULL);
-
- languages = gtk_source_languages_manager_get_available_languages (lm);
-
- while (languages != NULL)
- {
- GSList *mime_types, *tmp;
-
- GtkSourceLanguage *lang = GTK_SOURCE_LANGUAGE (languages->data);
-
- tmp = mime_types = gtk_source_language_get_mime_types (lang);
-
- while (tmp != NULL)
- {
- if (strcmp ((const gchar*)tmp->data, mime_type) == 0)
- {
- break;
- }
-
- tmp = g_slist_next (tmp);
- }
-
- slist_deep_free (mime_types);
- if (tmp != NULL)
- return lang;
-
- languages = g_slist_next (languages);
- }
-
- return NULL;
-}
-
/**
* gtk_source_languages_manager_get_language_by_id:
* @lm: a #GtkSourceLanguagesManager.
@@ -407,41 +358,17 @@ gtk_source_languages_manager_get_language_for_mime_type (GtkSourceLanguagesManag
* Gets the #GtkSourceLanguage identified by the given @id in the language
* manager.
*
- * Return value: a #GtkSourceLanguage, or %NULL if there is no language
- * identified by the given @id.
+ * Returns: a #GtkSourceLanguage, or %NULL if there is no language
+ * identified by the given @id. Return value is owned by @lm and should not
+ * be freed.
**/
GtkSourceLanguage *
gtk_source_languages_manager_get_language_by_id (GtkSourceLanguagesManager *lm,
const gchar *id)
{
- const GSList *languages;
- gboolean found = FALSE;
g_return_val_if_fail (id != NULL, NULL);
-
- languages = gtk_source_languages_manager_get_available_languages (lm);
-
- while (languages != NULL)
- {
- gchar *lang_id;
-
- GtkSourceLanguage *lang = GTK_SOURCE_LANGUAGE (languages->data);
-
- lang_id = gtk_source_language_get_id (lang);
-
- if (lang_id != NULL && (strcmp (lang_id, id) == 0))
- {
- found = TRUE;
- }
-
- g_free (lang_id);
-
- if (found)
- return lang;
-
- languages = g_slist_next (languages);
- }
-
- return NULL;
+ ensure_languages (lm);
+ return g_hash_table_lookup (lm->priv->language_ids, id);
}
static GSList *
diff --git a/moo/mooedit/gtksourceview/upstream/gtksourcelanguagesmanager.h b/moo/mooedit/gtksourceview/upstream/gtksourcelanguagesmanager.h
index 449ebb21..d0904251 100644
--- a/moo/mooedit/gtksourceview/upstream/gtksourcelanguagesmanager.h
+++ b/moo/mooedit/gtksourceview/upstream/gtksourcelanguagesmanager.h
@@ -63,9 +63,6 @@ const GSList *gtk_source_languages_manager_get_available_languages (GtkSourceLan
GtkSourceLanguage *gtk_source_languages_manager_get_language_by_id (GtkSourceLanguagesManager *lm,
const gchar *id);
-GtkSourceLanguage *gtk_source_languages_manager_get_language_for_mime_type
- (GtkSourceLanguagesManager *lm,
- const gchar *mime_type);
/* Property */
const GSList *gtk_source_languages_manager_get_lang_files_dirs (GtkSourceLanguagesManager *lm);
diff --git a/moo/mooedit/gtksourceview/upstream/gtksourcestyle.c b/moo/mooedit/gtksourceview/upstream/gtksourcestyle.c
index 502cc344..1c4e48d7 100644
--- a/moo/mooedit/gtksourceview/upstream/gtksourcestyle.c
+++ b/moo/mooedit/gtksourceview/upstream/gtksourcestyle.c
@@ -25,7 +25,7 @@ gtk_source_style_get_type (void)
{
static GType type;
- if (type == 0)
+ if (G_UNLIKELY (type == 0))
type = g_boxed_type_register_static ("GtkSourceStyle",
(GBoxedCopyFunc) gtk_source_style_copy,
(GBoxedFreeFunc) gtk_source_style_free);
@@ -33,6 +33,15 @@ gtk_source_style_get_type (void)
return type;
}
+/**
+ * gtk_source_style_new:
+ * @mask: a #GtkSourceStyleMask which defines what fields will be used.
+ *
+ * Returns: newly allocated #GtkSourceStyle structure, free with
+ * gtk_source_style_free().
+ *
+ * Since: 2.0
+ */
GtkSourceStyle *
gtk_source_style_new (GtkSourceStyleMask mask)
{
@@ -41,18 +50,46 @@ gtk_source_style_new (GtkSourceStyleMask mask)
return style;
}
+/**
+ * gtk_source_style_copy:
+ * @style: a #GtkSourceStyle structure to copy.
+ *
+ * Returns: copy of @style, free it with gtk_source_style_free().
+ *
+ * Since: 2.0
+ */
GtkSourceStyle *
gtk_source_style_copy (const GtkSourceStyle *style)
{
return g_memdup (style, sizeof (GtkSourceStyle));
}
+/**
+ * gtk_source_style_free:
+ * @style: a #GtkSourceStyle structure to free.
+ *
+ * Frees #GtkSourceStyle structure allocated with gtk_source_style_new() or
+ * gtk_source_style_copy().
+ *
+ * Since: 2.0
+ */
void
gtk_source_style_free (GtkSourceStyle *style)
{
g_free (style);
}
+/**
+ * _gtk_source_style_apply:
+ * @style: a #GtkSourceStyle to apply.
+ * @tag: a #GtkTextTag to apply styles to.
+ *
+ * Applies text styles set in @style if it's not %NULL, or
+ * unsets style fields in @tag set with _gtk_source_style_apply()
+ * if @style is %NULL.
+ *
+ * Since: 2.0
+ */
void
_gtk_source_style_apply (const GtkSourceStyle *style,
GtkTextTag *tag)
diff --git a/moo/mooedit/gtksourceview/upstream/gtksourcestylescheme.c b/moo/mooedit/gtksourceview/upstream/gtksourcestylescheme.c
index 9cf1a23c..2d3bfa92 100644
--- a/moo/mooedit/gtksourceview/upstream/gtksourcestylescheme.c
+++ b/moo/mooedit/gtksourceview/upstream/gtksourcestylescheme.c
@@ -130,6 +130,14 @@ gtk_source_style_scheme_class_init (GtkSourceStyleSchemeClass *klass)
object_class->set_property = gtk_source_style_scheme_set_property;
object_class->get_property = gtk_source_style_scheme_get_property;
+ /**
+ * GtkSourceStyleScheme:id:
+ *
+ * Style scheme id, a unique string used to identify the style scheme
+ * in #GtkSourceStyleManager.
+ *
+ * Since: 2.0
+ */
g_object_class_install_property (object_class,
PROP_ID,
g_param_spec_string ("id",
@@ -138,6 +146,13 @@ gtk_source_style_scheme_class_init (GtkSourceStyleSchemeClass *klass)
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+ /**
+ * GtkSourceStyleScheme:name:
+ *
+ * Style scheme name, a translatable string to present to user.
+ *
+ * Since: 2.0
+ */
g_object_class_install_property (object_class,
PROP_NAME,
g_param_spec_string ("name",
@@ -158,6 +173,14 @@ gtk_source_style_scheme_init (GtkSourceStyleScheme *scheme)
(GDestroyNotify) gtk_source_style_free);
}
+/**
+ * gtk_source_style_scheme_get_id:
+ * @scheme: a #GtkSourceStyleScheme.
+ *
+ * Returns: @scheme id.
+ *
+ * Since: 2.0
+ */
const gchar *
gtk_source_style_scheme_get_id (GtkSourceStyleScheme *scheme)
{
@@ -166,6 +189,14 @@ gtk_source_style_scheme_get_id (GtkSourceStyleScheme *scheme)
return scheme->priv->id;
}
+/**
+ * gtk_source_style_scheme_get_name:
+ * @scheme: a #GtkSourceStyleScheme.
+ *
+ * Returns: @scheme name.
+ *
+ * Since: 2.0
+ */
const gchar *
gtk_source_style_scheme_get_name (GtkSourceStyleScheme *scheme)
{
@@ -174,6 +205,15 @@ gtk_source_style_scheme_get_name (GtkSourceStyleScheme *scheme)
return scheme->priv->name;
}
+/**
+ * _gtk_source_style_scheme_new:
+ * @id: scheme id.
+ * @name: scheme name.
+ *
+ * Returns: new empty #GtkSourceStyleScheme.
+ *
+ * Since: 2.0
+ */
GtkSourceStyleScheme *
_gtk_source_style_scheme_new (const gchar *id,
const gchar *name)
@@ -189,6 +229,17 @@ _gtk_source_style_scheme_new (const gchar *id,
return scheme;
}
+/**
+ * gtk_source_style_scheme_get_style:
+ * @scheme: a #GtkSourceStyleScheme.
+ * @style_name: style name to find.
+ *
+ * Returns: style which corresponds to @style_name in the @scheme,
+ * or %NULL when no style with this name found. Free it with
+ * gtk_source_style_free().
+ *
+ * Since: 2.0
+ */
GtkSourceStyle *
gtk_source_style_scheme_get_style (GtkSourceStyleScheme *scheme,
const gchar *style_name)
@@ -210,6 +261,14 @@ gtk_source_style_scheme_get_style (GtkSourceStyleScheme *scheme,
return NULL;
}
+/**
+ * gtk_source_style_scheme_set_style:
+ * @scheme: a #GtkSourceStyleScheme.
+ * @name: style name.
+ * @style: style to set or %NULL.
+ *
+ * Since: 2.0
+ */
void
gtk_source_style_scheme_set_style (GtkSourceStyleScheme *scheme,
const gchar *name,
@@ -225,6 +284,15 @@ gtk_source_style_scheme_set_style (GtkSourceStyleScheme *scheme,
g_hash_table_remove (scheme->priv->styles, name);
}
+/**
+ * gtk_source_style_scheme_get_matching_brackets_style:
+ * @scheme: a #GtkSourceStyleScheme.
+ *
+ * Returns: style which corresponds to "bracket-match" name, to use
+ * in an editor. Free it with gtk_source_style_free().
+ *
+ * Since: 2.0
+ */
GtkSourceStyle *
gtk_source_style_scheme_get_matching_brackets_style (GtkSourceStyleScheme *scheme)
{
@@ -232,6 +300,16 @@ gtk_source_style_scheme_get_matching_brackets_style (GtkSourceStyleScheme *schem
return gtk_source_style_scheme_get_style (scheme, STYLE_BRACKET_MATCH);
}
+/**
+ * gtk_source_style_scheme_get_current_line_color:
+ * @scheme: a #GtkSourceStyleScheme.
+ * @color: a #GdkColor structure to fill.
+ *
+ * Returns: %TRUE if @scheme has style for current line set, or %FALSE
+ * otherwise.
+ *
+ * Since: 2.0
+ */
gboolean
gtk_source_style_scheme_get_current_line_color (GtkSourceStyleScheme *scheme,
GdkColor *color)
@@ -290,6 +368,15 @@ set_cursor_color (GtkWidget *widget,
g_print ("implement me\n");
}
+/**
+ * _gtk_source_style_scheme_apply:
+ * @scheme: a #GtkSourceStyleScheme.
+ * @widget: a #GtkWidget to apply styles to.
+ *
+ * Sets text colors from @scheme in the @widget.
+ *
+ * Since: 2.0
+ */
void
_gtk_source_style_scheme_apply (GtkSourceStyleScheme *scheme,
GtkWidget *widget)
@@ -575,6 +662,15 @@ end_element (G_GNUC_UNUSED GMarkupParseContext *context,
data->done = TRUE;
}
+/**
+ * _gtk_source_style_scheme_new_from_file:
+ * @filename: file to parse.
+ *
+ * Returns: new #GtkSourceStyleScheme created from file, or
+ * %NULL on error.
+ *
+ * Since: 2.0
+ */
GtkSourceStyleScheme *
_gtk_source_style_scheme_new_from_file (const gchar *filename)
{
@@ -615,6 +711,14 @@ _gtk_source_style_scheme_new_from_file (const gchar *filename)
return data.scheme;
}
+/**
+ * _gtk_source_style_scheme_get_parent_id:
+ * @scheme: a #GtkSourceStyleScheme.
+ *
+ * Returns: parent style scheme id or %NULL.
+ *
+ * Since: 2.0
+ */
const gchar *
_gtk_source_style_scheme_get_parent_id (GtkSourceStyleScheme *scheme)
{
@@ -622,6 +726,17 @@ _gtk_source_style_scheme_get_parent_id (GtkSourceStyleScheme *scheme)
return scheme->priv->parent_id;
}
+/**
+ * _gtk_source_style_scheme_set_parent:
+ * @scheme: a #GtkSourceStyleScheme.
+ * @parent_scheme: parent #GtkSourceStyleScheme for @scheme.
+ *
+ * Sets @parent_scheme as parent scheme for @scheme, @scheme will
+ * look for styles in @parent_scheme if it doesn't have style set
+ * for given name.
+ *
+ * Since: 2.0
+ */
void
_gtk_source_style_scheme_set_parent (GtkSourceStyleScheme *scheme,
GtkSourceStyleScheme *parent_scheme)
@@ -636,6 +751,13 @@ _gtk_source_style_scheme_set_parent (GtkSourceStyleScheme *scheme,
scheme->priv->parent = parent_scheme;
}
+/**
+ * _gtk_source_style_scheme_default_new:
+ *
+ * Returns: new default style scheme. Not clear what it means though.
+ *
+ * Since: 2.0
+ */
GtkSourceStyleScheme *
_gtk_source_style_scheme_default_new (void)
{
diff --git a/moo/mooedit/gtksourceview/upstream/gtksourcestylescheme.h b/moo/mooedit/gtksourceview/upstream/gtksourcestylescheme.h
index da9e3563..3f541ed9 100644
--- a/moo/mooedit/gtksourceview/upstream/gtksourcestylescheme.h
+++ b/moo/mooedit/gtksourceview/upstream/gtksourcestylescheme.h
@@ -58,7 +58,7 @@ const gchar *gtk_source_style_scheme_get_name (GtkSourceStyleS
/* Return value must be freed with gtk_source_style_free */
GtkSourceStyle *gtk_source_style_scheme_get_style (GtkSourceStyleScheme *scheme,
- const gchar *style);
+ const gchar *style_name);
GtkSourceStyle *gtk_source_style_scheme_get_matching_brackets_style
(GtkSourceStyleScheme *scheme);
gboolean gtk_source_style_scheme_get_current_line_color
diff --git a/moo/mooedit/gtksourceview/upstream/mangle.sh b/moo/mooedit/gtksourceview/upstream/mangle.sh
index bf968c37..4669b940 100644
--- a/moo/mooedit/gtksourceview/upstream/mangle.sh
+++ b/moo/mooedit/gtksourceview/upstream/mangle.sh
@@ -1,3 +1,4 @@
+#!/bin/sh
# -%- strip: true; indent-width: 2 -%-
if test -z "$1"; then
diff --git a/moo/mooedit/language-specs/c.lang b/moo/mooedit/language-specs/c.lang
index b32676b2..91b42f99 100644
--- a/moo/mooedit/language-specs/c.lang
+++ b/moo/mooedit/language-specs/c.lang
@@ -61,7 +61,7 @@
@@ -69,7 +69,7 @@
\/\*
\*\/
-
+
@@ -89,6 +89,7 @@
\%{preproc-start}endif\b
+
@@ -97,7 +98,7 @@
\%{preproc-start}
- include\s*
+ (include|import)\s*
(".*?"|<.*>)
diff --git a/moo/mooedit/language-specs/cpp.lang b/moo/mooedit/language-specs/cpp.lang
index 1266c62b..f1b07846 100644
--- a/moo/mooedit/language-specs/cpp.lang
+++ b/moo/mooedit/language-specs/cpp.lang
@@ -68,7 +68,7 @@
__cplusplus
-
+
diff --git a/moo/mooedit/language-specs/def.lang b/moo/mooedit/language-specs/def.lang
index 3028c22c..7484c8e2 100644
--- a/moo/mooedit/language-specs/def.lang
+++ b/moo/mooedit/language-specs/def.lang
@@ -77,7 +77,7 @@
\%] # separator
-
diff --git a/moo/mooedit/language-specs/kate.styles b/moo/mooedit/language-specs/kate.styles
index 5328643c..c336698a 100644
--- a/moo/mooedit/language-specs/kate.styles
+++ b/moo/mooedit/language-specs/kate.styles
@@ -9,7 +9,7 @@
-
+
@@ -52,8 +52,13 @@
-
-
+
+
+
+
+
+
+
diff --git a/moo/mooedit/language-specs/language2.rng b/moo/mooedit/language-specs/language2.rng
index cd636c4e..817c55b8 100644
--- a/moo/mooedit/language-specs/language2.rng
+++ b/moo/mooedit/language-specs/language2.rng
@@ -184,6 +184,11 @@
+
+
+
+
+
@@ -236,11 +241,21 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/moo/mooedit/language-specs/latex.lang b/moo/mooedit/language-specs/latex.lang
index 358c5680..a89a462e 100644
--- a/moo/mooedit/language-specs/latex.lang
+++ b/moo/mooedit/language-specs/latex.lang
@@ -1,23 +1,247 @@
-
- text/x-tex
- *.tex;*.ltx;*.sty;*.cls;*.dtx;*.ins
- %
-
+
+ text/x-tex
+ *.tex;*.ltx;*.sty;*.cls;*.dtx;*.ins
+ %
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+ \\documentclass\b
+ (?=\S)
+
+
+
+
+ \[
+ \]
+
+
+
+
+
+ [^%]+
+
+
+
+
+ \{
+ \}
+
+
+
+
+
+ [^%]+
+
+
+
+
+ (?=\S)
+
+
+
+
+
+ \\usepackage\b
+ (?=\S)
+
+
+
+
+ \[
+ \]
+
+
+
+
+
+ [^%]+
+
+
+
+
+ \{
+ \}
+
+
+
+
+
+ [^%]+
+
+
+
+
+ (?=\S)
+
+
+
+
+
+ \\(re)?newcommand\b
+
+
+
+
+
+ \{
+ \}
+
+
+
+
+
+ \\[a-zA-Z]*
+
+
+ \S
+
+
+
+
+ \[
+ \]
+
+
+
+
+
+ [^%]+
+
+
+
+
+ \{
+ \}
+
+
+
+
+
+
+
+
+
+ (?=\S)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ (\\(begin|end)\{)(document)(\})
+
+
+
+
+
+ \\(sub)*section\*?
+
+
+
+ \{
+ \}
+
+
+
+
+
+ \S
+
+
+
+
+
+
+
+ \\begin\b
+
+
+
+ \{
+ \}
+
+
+
+
+
+
+
+
+
+
+
+ \$\$
+ \$\$
+
+
+
+
+
+ \$
+ \$
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/moo/mooedit/language-specs/m4.lang b/moo/mooedit/language-specs/m4.lang
index f8fccc01..a2300774 100644
--- a/moo/mooedit/language-specs/m4.lang
+++ b/moo/mooedit/language-specs/m4.lang
@@ -40,7 +40,7 @@
@@ -153,7 +153,7 @@
- \b(AC_ARG_ENABLE|AC_ARG_WITH|PKG_CHECK_MODULES)\s*(\()
+ \b(AC_ARG_ENABLE|AC_ARG_WITH|AC_TRY_LINK|AC_TRY_COMPILE|AC_CHECK_LIB|PKG_CHECK_MODULES|)\s*(\()
\)
@@ -164,7 +164,7 @@
- \b(AC_ENABLE|AC_WITH)\s*(\()
+ \b(AC_CONFIG_COMMANDS|AC_ENABLE|AC_WITH|AC_TRY_CPP|AC_CHECK_HEADER)\s*(\()
\)
diff --git a/moo/mooedit/language-specs/python-console.lang b/moo/mooedit/language-specs/python-console.lang
index 0a452b22..d6fdfdf0 100644
--- a/moo/mooedit/language-specs/python-console.lang
+++ b/moo/mooedit/language-specs/python-console.lang
@@ -11,7 +11,7 @@
^(>>>|\.\.\.)\
-
+
diff --git a/moo/mooedit/language-specs/python.lang b/moo/mooedit/language-specs/python.lang
index 088fdcd4..9b9a5a9b 100644
--- a/moo/mooedit/language-specs/python.lang
+++ b/moo/mooedit/language-specs/python.lang
@@ -109,7 +109,7 @@
`
`
-
+
diff --git a/moo/mooedit/language-specs/xml.lang b/moo/mooedit/language-specs/xml.lang
index 287a5978..17bc4d0d 100644
--- a/moo/mooedit/language-specs/xml.lang
+++ b/moo/mooedit/language-specs/xml.lang
@@ -34,20 +34,8 @@
- ((\%{prefix}:)?\%{name}\s*=\s*)"
- "
-
-
-
-
-
-
-
-
-
-
- ((\%{prefix}:)?\%{name}\s*=\s*)'
- '
+ ((\%{prefix}:)?\%{name}\s*=\s*)(["'])
+ \%{3@start}
@@ -63,7 +51,7 @@
--+
-
+
@@ -117,7 +105,6 @@
-
@@ -145,7 +132,6 @@
-