From aefbb7f4a30188b281becee9d61b4b519c625a9f Mon Sep 17 00:00:00 2001 From: Diego Escalante Urrelo Date: Thu, 14 Aug 2008 22:47:39 +0000 Subject: Port the location bar to use GRegex. Use a simple regex matching the input text, implements the same behaviour of the current bar, plus: - substring suggestions (closes: #151932) - unicode support (closes: #343906) - diacritics in topic keywords (closes: #328162) - completion on history items titles (closes: #534218) Also, of course, closes: #517960 - port the url bar to GRegex. svn path=/trunk/; revision=8419 --- src/ephy-location-action.c | 135 ++++++++++++++------------------------------- 1 file changed, 41 insertions(+), 94 deletions(-) (limited to 'src/ephy-location-action.c') diff --git a/src/ephy-location-action.c b/src/ephy-location-action.c index 5121a631d..1fdace52d 100644 --- a/src/ephy-location-action.c +++ b/src/ephy-location-action.c @@ -86,73 +86,35 @@ static guint signals[LAST_SIGNAL]; G_DEFINE_TYPE (EphyLocationAction, ephy_location_action, EPHY_TYPE_LINK_ACTION) -static const struct -{ - const char *prefix; - int len; -} -web_prefixes [] = -{ - { "http://www.", 11 }, - { "http://ftp.", 11 }, - { "http://", 7 }, - { "https://www.", 12 }, - { "https://", 8 }, - { "ftp://", 6}, - { "ftp://ftp.", 10}, - { "www.", 4 }, - { "ftp.", 4} -}; - - -static gboolean -keyword_match (const char *list, - const char *keyword) +typedef struct { - const char *p; - gsize keyword_len; - - p = list; - keyword_len = strlen (keyword); + EphyLocationEntry *entry; + EphyLocationAction *action; +} LocationEntryAction; - while (*p) - { - int i; - - for (i = 0; i < keyword_len; i++) - { - if (p[i] != keyword[i]) - { - goto next_token; - } - } - - return TRUE; - - next_token: - - while (*p && !g_ascii_ispunct(*p) && !g_ascii_isspace(*p)) p++; - while (*p && (g_ascii_ispunct(*p) || g_ascii_isspace(*p))) p++; - } - - return FALSE; +static void +destroy_match_func (gpointer data) +{ + g_slice_free (LocationEntryAction, data); } static gboolean -completion_func (GtkEntryCompletion *completion, - const char *key, - GtkTreeIter *iter, - gpointer data) +match_func (GtkEntryCompletion *completion, + const char *key, + GtkTreeIter *iter, + gpointer data) { - int i, len_key, len_prefix; char *item = NULL; char *url = NULL; char *keywords = NULL; + char *extra = NULL; + gboolean ret = FALSE; - GtkTreeModel *model; EphyLocationActionPrivate *priv; - - priv = EPHY_LOCATION_ACTION (data)->priv; + GtkTreeModel *model; + GRegex *regex; + + priv = EPHY_LOCATION_ACTION (((LocationEntryAction *) data)->action)->priv; model = gtk_entry_completion_get_model (completion); @@ -160,45 +122,24 @@ completion_func (GtkEntryCompletion *completion, EPHY_COMPLETION_TEXT_COL, &item, EPHY_COMPLETION_URL_COL, &url, EPHY_COMPLETION_KEYWORDS_COL, &keywords, + EPHY_COMPLETION_EXTRA_COL, &extra, -1); - - len_key = strlen (key); - if (!strncasecmp (key, item, len_key)) - { - ret = TRUE; - } - else if (keyword_match (keywords, key)) - { - ret = TRUE; - } - else if (!strncasecmp (key, url, len_key)) - { - ret = TRUE; - } - else - { - for (i = 0; i < G_N_ELEMENTS (web_prefixes); i++) - { - len_prefix = web_prefixes[i].len; - if (!strncmp (web_prefixes[i].prefix, item, len_prefix) && - !strncasecmp (key, item + len_prefix, len_key)) - { - ret = TRUE; - break; - } - else if (!strncmp (web_prefixes[i].prefix, url, len_prefix) && - !strncasecmp (key, url + len_prefix, len_key)) - { - ret = TRUE; - break; - } - - } - } + if (!key) + return FALSE; + + regex = ephy_location_entry_get_regex (((LocationEntryAction *) data)->entry); + + ret = (g_regex_match (regex, item, G_REGEX_MATCH_NOTEMPTY, NULL) + || g_regex_match (regex, url, G_REGEX_MATCH_NOTEMPTY, NULL) + || g_regex_match (regex, keywords, G_REGEX_MATCH_NOTEMPTY, NULL) + || (extra && g_regex_match (regex, extra, G_REGEX_MATCH_NOTEMPTY, NULL)) + ); + g_free (item); g_free (url); g_free (keywords); + g_free (extra); return ret; } @@ -496,6 +437,7 @@ connect_proxy (GtkAction *action, GtkWidget *proxy) EphyLocationEntry *lentry = EPHY_LOCATION_ENTRY (proxy); EphyCompletionModel *model; GtkWidget *entry; + LocationEntryAction *lea; model = ephy_completion_model_new (); ephy_location_entry_set_completion (EPHY_LOCATION_ENTRY (proxy), @@ -507,10 +449,15 @@ connect_proxy (GtkAction *action, GtkWidget *proxy) EPHY_COMPLETION_URL_COL, EPHY_COMPLETION_EXTRA_COL, EPHY_COMPLETION_FAVICON_COL); - - ephy_location_entry_set_completion_func (EPHY_LOCATION_ENTRY (proxy), - completion_func, - EPHY_LOCATION_ACTION (action)); + + lea = g_slice_new (LocationEntryAction); + lea->entry = EPHY_LOCATION_ENTRY (proxy); + lea->action = EPHY_LOCATION_ACTION (action); + + ephy_location_entry_set_match_func (EPHY_LOCATION_ENTRY (proxy), + match_func, + lea, + destroy_match_func); add_completion_actions (action, proxy); -- cgit v1.2.3