Example #1
0
/**
 * normalize_terms:
 * @terms: (element-type utf8): Input search terms
 *
 * Returns: (element-type utf8) (transfer full): Unicode-normalized and lowercased terms
 */
static GSList *
normalize_terms (GSList *terms)
{
  GSList *normalized_terms = NULL;
  GSList *iter;
  for (iter = terms; iter; iter = iter->next)
    {
      const char *term = iter->data;
      normalized_terms = g_slist_prepend (normalized_terms, cinnamon_util_normalize_and_casefold (term));
    }
  return normalized_terms;
}
Example #2
0
static void
cinnamon_app_init_search_data (CinnamonApp *app)
{
  const char *name;
  const char *exec;
  const char *comment;
  char *normalized_exec;
  GDesktopAppInfo *appinfo;

  appinfo = gmenu_tree_entry_get_app_info (app->entry);
  name = g_app_info_get_name (G_APP_INFO (appinfo));
  app->casefolded_name = cinnamon_util_normalize_and_casefold (name);

  comment = g_app_info_get_description (G_APP_INFO (appinfo));
  app->casefolded_description = cinnamon_util_normalize_and_casefold (comment);

  exec = g_app_info_get_executable (G_APP_INFO (appinfo));
  normalized_exec = cinnamon_util_normalize_and_casefold (exec);
  app->casefolded_exec = trim_exec_line (normalized_exec);
  g_free (normalized_exec);
}
Example #3
0
static guint
do_match (CinnamonContactSystem  *self,
          FolksIndividual     *individual,
          GSList              *terms)
{
  GSList *term_iter;
  guint weight = 0;

  char *alias = cinnamon_util_normalize_and_casefold (folks_alias_details_get_alias (FOLKS_ALIAS_DETAILS (individual)));
  char *name = cinnamon_util_normalize_and_casefold (folks_name_details_get_full_name (FOLKS_NAME_DETAILS (individual)));
  char *nick = cinnamon_util_normalize_and_casefold (folks_name_details_get_nickname (FOLKS_NAME_DETAILS (individual)));

  GeeMultiMap *im_addr_map = folks_im_details_get_im_addresses (FOLKS_IM_DETAILS (individual));
  GeeCollection *im_addrs = gee_multi_map_get_values (im_addr_map);
  GeeSet *email_addrs = folks_email_details_get_email_addresses (FOLKS_EMAIL_DETAILS (individual));
  GeeIterator *addrs_iter;

  gboolean have_name_prefix = FALSE;
  gboolean have_name_substring = FALSE;
  
  gboolean have_addr_prefix = FALSE;
  gboolean have_addr_substring = FALSE;

  for (term_iter = terms; term_iter; term_iter = term_iter->next)
    {
      const char *term = term_iter->data;
      const char *p;
      gboolean matched;

      matched = FALSE;

      /* Match on alias, name, nickname */
      if (alias != NULL)
	{
	  p = strstr (alias, term);
	  if (p == alias)
            {
	      have_name_prefix = TRUE;
              matched = TRUE;
            }
	  else if (p != NULL)
            {
	      have_name_substring = TRUE;
              matched = TRUE;
            }
	}
      if (name != NULL)
	{
	  p = strstr (name, term);
	  if (p == name)
            {
	      have_name_prefix = TRUE;
              matched = TRUE;
            }
	  else if (p != NULL)
            {
	      have_name_substring = TRUE;
              matched = TRUE;
            }
	}
      if (nick != NULL)
	{
	  p = strstr (nick, term);
	  if (p == nick)
            {
	      have_name_prefix = TRUE;
              matched = TRUE;
            }
	  else if (p != NULL)
            {
	      have_name_substring = TRUE;
              matched = TRUE;
            }
	}

      /* Match on one or more IM or email addresses */
      addrs_iter = gee_iterable_iterator (GEE_ITERABLE (im_addrs));

      while (gee_iterator_next (addrs_iter))
        {
          FolksImFieldDetails *field = gee_iterator_get (addrs_iter);
          const gchar *addr = folks_abstract_field_details_get_value ((FolksAbstractFieldDetails*)field);

          p = strstr (addr, term);
          if (p == addr)
            {
              have_addr_prefix = TRUE;
              matched = TRUE;
            }
          else if (p != NULL)
            {
              have_addr_substring = TRUE;
              matched = TRUE;
            }

          g_object_unref (field);
        }

      g_object_unref (addrs_iter);
      addrs_iter = gee_iterable_iterator (GEE_ITERABLE (email_addrs));
      while (gee_iterator_next (addrs_iter))
        {
          FolksEmailFieldDetails *field = gee_iterator_get (addrs_iter);
          const gchar *addr = folks_abstract_field_details_get_value ((FolksAbstractFieldDetails*)field);

          p = strstr (addr, term);
          if (p == addr)
            {
              have_addr_prefix = TRUE;
              matched = TRUE;
            }
          else if (p != NULL)
            {
              have_addr_substring = TRUE;
              matched = TRUE;
            }

          g_object_unref (field);
        }

      g_object_unref (addrs_iter);

      if (!matched)
        {
          have_name_prefix = FALSE;
          have_name_substring = FALSE;
          have_addr_prefix = FALSE;
          have_addr_substring = FALSE;
          break;
        }
    }

    if (have_name_prefix)
      weight += NAME_PREFIX_MATCH_WEIGHT;
    else if (have_name_substring)
      weight += NAME_SUBSTRING_MATCH_WEIGHT;

    if (have_addr_prefix)
      weight += ADDR_PREFIX_MATCH_WEIGHT;
    else if (have_addr_substring)
      weight += ADDR_SUBSTRING_MATCH_WEIGHT;

  g_free (alias);
  g_free (name);
  g_free (nick);
  g_object_unref (im_addrs);

  return weight;
}