[Groonga-commit] groonga/groonga at db9fb72 [master] proc_highlight: extract code

Back to archive index

naoa null+****@clear*****
Sun Feb 21 02:02:36 JST 2016


naoa	2016-02-21 02:02:36 +0900 (Sun, 21 Feb 2016)

  New Revision: db9fb726ff1069c42a8ef5201d22b8c89f6dc467
  https://github.com/groonga/groonga/commit/db9fb726ff1069c42a8ef5201d22b8c89f6dc467

  Merged 539872a: Merge pull request #487 from naoa/add-highlight

  Message:
    proc_highlight: extract code

  Modified files:
    lib/proc/proc_highlight.c
    test/command/suite/select/function/highlight_full/invalid/not_normalizer.expected

  Modified: lib/proc/proc_highlight.c (+118 -65)
===================================================================
--- lib/proc/proc_highlight.c    2016-02-21 00:32:56 +0900 (9af0389)
+++ lib/proc/proc_highlight.c    2016-02-21 02:02:36 +0900 (35cd0c4)
@@ -89,58 +89,66 @@ grn_pat_tag_keys(grn_ctx *ctx, grn_obj *keywords,
 }
 
 static grn_obj *
-func_highlight_full(grn_ctx *ctx, int nargs, grn_obj **args,
-                    grn_user_data *user_data)
+func_highlight_create_keywords_table(grn_ctx *ctx,
+                                     grn_user_data *user_data,
+                                     const char *normalizer_name,
+                                     unsigned int normalizer_name_length)
 {
-  grn_obj *highlighted = NULL;
+  grn_obj *keywords;
 
-#define N_REQUIRED_ARGS 3
+  keywords = grn_table_create(ctx, NULL, 0, NULL,
+                              GRN_OBJ_TABLE_PAT_KEY,
+                              grn_ctx_at(ctx, GRN_DB_SHORT_TEXT),
+                              NULL);
+
+  if (normalizer_name_length > 0) {
+    grn_obj *normalizer;
+    normalizer = grn_ctx_get(ctx,
+                             normalizer_name,
+                             normalizer_name_length);
+    if (!grn_obj_is_normalizer_proc(ctx, normalizer)) {
+      grn_obj inspected;
+      GRN_TEXT_INIT(&inspected, 0);
+      grn_inspect(ctx, &inspected, normalizer);
+      GRN_PLUGIN_ERROR(ctx, GRN_INVALID_ARGUMENT,
+                       "highlight_full() not normalizer: <%.*s>",
+                       (int)GRN_TEXT_LEN(&inspected),
+                       GRN_TEXT_VALUE(&inspected));
+      GRN_OBJ_FIN(ctx, &inspected);
+      grn_obj_unlink(ctx, normalizer);
+      grn_obj_unlink(ctx, keywords);
+      return NULL;
+    }
+    grn_obj_set_info(ctx, keywords, GRN_INFO_NORMALIZER, normalizer);
+    grn_obj_unlink(ctx, normalizer);
+  }
+
+  return keywords;
+}
+
+static grn_obj *
+highlight_keyword_sets(grn_ctx *ctx, grn_user_data *user_data,
+                       grn_obj **keyword_set_args, unsigned int n_keyword_args,
+                       grn_obj *string, grn_obj *keywords,
+                       grn_bool use_html_escape)
+{
+  grn_obj *highlighted = NULL;
 #define KEYWORD_SET_SIZE 3
-  if ((nargs >= (N_REQUIRED_ARGS + KEYWORD_SET_SIZE) &&
-      (nargs - N_REQUIRED_ARGS) % KEYWORD_SET_SIZE == 0)) {
-    grn_obj *string = args[0];
-    grn_obj *normalizer_name = args[1];
-    grn_obj *use_html_escape = args[2];
-    grn_obj **keyword_set_args = args + N_REQUIRED_ARGS;
-    unsigned int n_keyword_sets = (nargs - N_REQUIRED_ARGS) / KEYWORD_SET_SIZE;
+  {
     unsigned int i;
+    unsigned int n_keyword_sets;
     grn_obj open_tags;
     grn_obj open_tag_lengths;
     grn_obj close_tags;
     grn_obj close_tag_lengths;
-    grn_obj *keywords;
 
-    keywords = grn_table_create(ctx, NULL, 0, NULL,
-                                GRN_OBJ_TABLE_PAT_KEY,
-                                grn_ctx_at(ctx, GRN_DB_SHORT_TEXT),
-                                NULL);
-
-    if (GRN_TEXT_LEN(normalizer_name)) {
-      grn_obj *normalizer;
-      normalizer = grn_ctx_get(ctx,
-                               GRN_TEXT_VALUE(normalizer_name),
-                               GRN_TEXT_LEN(normalizer_name));
-      if (!grn_obj_is_normalizer_proc(ctx, normalizer)) {
-        grn_obj inspected;
-        GRN_TEXT_INIT(&inspected, 0);
-        grn_inspect(ctx, &inspected, normalizer);
-        GRN_PLUGIN_ERROR(ctx, GRN_INVALID_ARGUMENT,
-            "highlight_full(): not normalizer: <%.*s>",
-            (int)GRN_TEXT_LEN(&inspected),
-            GRN_TEXT_VALUE(&inspected));
-        GRN_OBJ_FIN(ctx, &inspected);
-        grn_obj_unlink(ctx, normalizer);
-        grn_obj_unlink(ctx, keywords);
-        return NULL;
-      }
-      grn_obj_set_info(ctx, keywords, GRN_INFO_NORMALIZER, normalizer);
-      grn_obj_unlink(ctx, normalizer);
-    }
+    n_keyword_sets = n_keyword_args / KEYWORD_SET_SIZE;
 
     GRN_OBJ_INIT(&open_tags, GRN_BULK, 0, GRN_DB_VOID);
     GRN_OBJ_INIT(&open_tag_lengths, GRN_BULK, 0, GRN_DB_VOID);
     GRN_OBJ_INIT(&close_tags, GRN_BULK, 0, GRN_DB_VOID);
     GRN_OBJ_INIT(&close_tag_lengths, GRN_BULK, 0, GRN_DB_VOID);
+
     for (i = 0; i < n_keyword_sets; i++) {
       grn_obj *keyword   = keyword_set_args[i * KEYWORD_SET_SIZE + 0];
       grn_obj *open_tag  = keyword_set_args[i * KEYWORD_SET_SIZE + 1];
@@ -150,7 +158,6 @@ func_highlight_full(grn_ctx *ctx, int nargs, grn_obj **args,
                     GRN_TEXT_VALUE(keyword),
                     GRN_TEXT_LEN(keyword),
                     NULL);
-
       {
         const char *open_tag_content = GRN_TEXT_VALUE(open_tag);
         grn_bulk_write(ctx, &open_tags,
@@ -186,20 +193,82 @@ func_highlight_full(grn_ctx *ctx, int nargs, grn_obj **args,
                      (unsigned int *)GRN_BULK_HEAD(&close_tag_lengths),
                      n_keyword_sets,
                      highlighted,
-                     GRN_BOOL_VALUE(use_html_escape));
-
-    grn_obj_unlink(ctx, keywords);
+                     use_html_escape);
     grn_obj_unlink(ctx, &open_tags);
     grn_obj_unlink(ctx, &open_tag_lengths);
     grn_obj_unlink(ctx, &close_tags);
     grn_obj_unlink(ctx, &close_tag_lengths);
   }
-#undef N_REQUIRED_ARGS
 #undef KEYWORD_SET_SIZE
+  return highlighted;
+}
+
+static grn_obj *
+highlight_keywords(grn_ctx *ctx, grn_user_data *user_data,
+                   grn_obj *string, grn_obj *keywords, grn_bool use_html_escape,
+                   const char *default_open_tag, unsigned int default_open_tag_length,
+                   const char *default_close_tag, unsigned int default_close_tag_length)
+{
+  grn_obj *highlighted = NULL;
+  const char *open_tags[1];
+  unsigned int open_tag_lengths[1];
+  const char *close_tags[1];
+  unsigned int close_tag_lengths[1];
+  unsigned int n_keyword_sets = 1;
+
+  open_tags[0] = default_open_tag;
+  open_tag_lengths[0] = default_open_tag_length;
+  close_tags[0] = default_close_tag;
+  close_tag_lengths[0] = default_close_tag_length;
+
+  highlighted = grn_plugin_proc_alloc(ctx, user_data, GRN_DB_TEXT, 0);
+  grn_pat_tag_keys(ctx, keywords,
+                   GRN_TEXT_VALUE(string), GRN_TEXT_LEN(string),
+                   open_tags,
+                   open_tag_lengths,
+                   close_tags,
+                   close_tag_lengths,
+                   n_keyword_sets,
+                   highlighted,
+                   use_html_escape);
+
+  return highlighted;
+}
+
+static grn_obj *
+func_highlight_full(grn_ctx *ctx, int nargs, grn_obj **args,
+                    grn_user_data *user_data)
+{
+  grn_obj *highlighted = NULL;
+
+#define N_REQUIRED_ARGS 3
+#define KEYWORD_SET_SIZE 3
+  if ((nargs >= (N_REQUIRED_ARGS + KEYWORD_SET_SIZE) &&
+      (nargs - N_REQUIRED_ARGS) % KEYWORD_SET_SIZE == 0)) {
+    grn_obj *string = args[0];
+    grn_obj *keywords;
+    const char *normalizer_name = GRN_TEXT_VALUE(args[1]);
+    unsigned int normalizer_name_length = GRN_TEXT_LEN(args[1]);
+    grn_bool use_html_escape = GRN_BOOL_VALUE(args[2]);
+
+    keywords =
+      func_highlight_create_keywords_table(ctx, user_data,
+                                           normalizer_name,
+                                           normalizer_name_length);
+    if (keywords) {
+      highlighted = highlight_keyword_sets(ctx, user_data,
+                                           args + N_REQUIRED_ARGS,
+                                           nargs - N_REQUIRED_ARGS,
+                                           string, keywords,
+                                           use_html_escape);
+    }
+  }
 
   if (!highlighted) {
     highlighted = grn_plugin_proc_alloc(ctx, user_data, GRN_DB_VOID, 0);
   }
+#undef KEYWORD_SET_SIZE
+#undef N_REQUIRED_ARGS
 
   return highlighted;
 }
@@ -271,11 +340,6 @@ func_highlight_html(grn_ctx *ctx, int nargs, grn_obj **args,
     grn_obj *keywords;
     grn_obj *keywords_ptr;
     grn_bool use_html_escape = GRN_TRUE;
-    unsigned int n_keyword_sets = 1;
-    const char *open_tags[1];
-    unsigned int open_tag_lengths[1];
-    const char *close_tags[1];
-    unsigned int close_tag_lengths[1];
 
     grn_proc_get_info(ctx, user_data, NULL, NULL, &expression);
 
@@ -296,23 +360,12 @@ func_highlight_html(grn_ctx *ctx, int nargs, grn_obj **args,
       GRN_PTR_SET(ctx, keywords_ptr, keywords);
     }
 
-    open_tags[0] = "<span class=\"keyword\">";
-    open_tag_lengths[0] = strlen("<span class=\"keyword\">");
-    close_tags[0]  = "</span>";
-    close_tag_lengths[0] = strlen("</span>");
-
-    highlighted = grn_plugin_proc_alloc(ctx, user_data, GRN_DB_TEXT, 0);
-
-    grn_pat_tag_keys(ctx, keywords,
-                     GRN_TEXT_VALUE(string), GRN_TEXT_LEN(string),
-                     open_tags,
-                     open_tag_lengths,
-                     close_tags,
-                     close_tag_lengths,
-                     n_keyword_sets,
-                     highlighted,
-                     use_html_escape);
-
+    highlighted = highlight_keywords(ctx, user_data,
+                                     string, keywords, use_html_escape,
+                                     "<span class=\"keyword\">",
+                                     strlen("<span class=\"keyword\">"),
+                                     "</span>",
+                                     strlen("</span>"));
   }
 #undef N_REQUIRED_ARGS
 

  Modified: test/command/suite/select/function/highlight_full/invalid/not_normalizer.expected (+3 -3)
===================================================================
--- test/command/suite/select/function/highlight_full/invalid/not_normalizer.expected    2016-02-21 00:32:56 +0900 (33878d1)
+++ test/command/suite/select/function/highlight_full/invalid/not_normalizer.expected    2016-02-21 02:02:36 +0900 (d4fcc15)
@@ -15,7 +15,7 @@ select Entries --output_columns   'highlight_full(body, "TokenBigram", true,   "
       0.0,
       0.0
     ],
-    "[highlight_full] not normalizer: #<proc:tokenizer TokenBigram arguments:[$1, $2, $3]>"
+    "highlight_full() not normalizer: <#<proc:tokenizer TokenBigram arguments:[$1, $2, $3]>>"
   ],
   [
     [
@@ -29,9 +29,9 @@ select Entries --output_columns   'highlight_full(body, "TokenBigram", true,   "
         ]
       ],
       [
-        "[highlight_full] not normalizer: #<proc:tokenizer TokenBigram arguments:[$1, $2, $3]>"
+        "highlight_full() not normalizer: <#<proc:tokenizer TokenBigram arguments:[$1, $2, $3]>>"
       ]
     ]
   ]
 ]
-#|e| [highlight_full] not normalizer: #<proc:tokenizer TokenBigram arguments:[$1, $2, $3]>
+#|e| highlight_full() not normalizer: <#<proc:tokenizer TokenBigram arguments:[$1, $2, $3]>>
-------------- next part --------------
HTML����������������������������...
Download 



More information about the Groonga-commit mailing list
Back to archive index