Hiroyuki Ikezoe
ikezo****@users*****
Sun Dec 3 15:02:03 JST 2006
Index: kazehakase/src/utils/estsearch.c diff -u kazehakase/src/utils/estsearch.c:1.38 kazehakase/src/utils/estsearch.c:removed --- kazehakase/src/utils/estsearch.c:1.38 Sun Dec 3 11:17:41 2006 +++ kazehakase/src/utils/estsearch.c Sun Dec 3 15:02:03 2006 @@ -1,659 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * Copyright (C) 2004 Hiroyuki Ikezoe - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include <ctype.h> -#include <glib/gi18n.h> - -#include "kazehakase.h" -#include "utils/utils.h" -#include "glib-utils.h" -#include "estsearch.h" -#include "egg-pixbuf-thumbnail.h" - - -#define ESTRAIER_URI "http://hyperestraier.sourceforge.net/" -#define DTD "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">" -#define HEAD "<head>\n" \ - " <title>Full-text search in history</title>\n" \ - " <link rel=\"stylesheet\" type=\"text/css\" href=\"history-search:?css=search-result.css\">\n" \ - "</head>\n" -#define HEADER "" -#define CONTENT "<div class=\"content\">\n" \ - " <div class=\"header\"><span class=\"title\"><a href=\"%s\">%s</a></span></div>\n" \ - " <div class=\"summary\"><img src=\"%s\" class=\"thumbnail\">\n" \ - " <span class=\"sentence\">%s</span>\n" \ - " </div>\n" \ - " <div class=\"footer\">\n" \ - " <span class=\"uri\">%s</span>\n" \ - " <span class=\"cache\"><a href=\"%s\">cache</a></span>\n" \ - " <span class=\"date\">%s</span>\n" \ - " </div>\n" \ - "</div>\n" -#define FOOTER "<div class=\"footer\">\n" \ - "Powered by <a href=\"%s\">Hyper Estraier</a> version %s\n" \ - "</div>\n" - -typedef struct _KzSearchEstPrivate KzSearchEstPrivate; -struct _KzSearchEstPrivate -{ -}; - -#define KZ_SEARCH_EST_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), KZ_TYPE_SEARCH_EST, KzSearchEstPrivate)) - -static GObject *constructor (GType type, - guint n_props, - GObjectConstructParam *props); -static void dispose (GObject *object); - -static gchar *get_search_result_html (KzSearch *search, const gchar *text); -static KzBookmark *get_search_result_bookmark (KzSearch *search, const gchar *text); -static gboolean register_document (KzSearch *search, const gchar *filename); -static gboolean update_index (KzSearch *search); -static gboolean purge_index (KzSearch *search); -static GPid optimize_index (KzSearch *search); -static void make_index (KzSearch *search); -static gboolean exist_index_dir (KzSearch *search); - -static gchar *estsearch_get_version (void); -static gboolean _update_index (gpointer data); - -static KzSearchEst *the_kz_search_est = NULL; - -G_DEFINE_TYPE(KzSearchEst, kz_search_est, KZ_TYPE_SEARCH) - -static void -kz_search_est_class_init (KzSearchEstClass *klass) -{ - GObjectClass *object_class; - KzSearchClass *search_class; - - kz_search_est_parent_class = g_type_class_peek_parent (klass); - object_class = (GObjectClass *) klass; - search_class = (KzSearchClass *) klass; - - object_class->constructor = constructor; - object_class->dispose = dispose; - - search_class->get_search_result_html = get_search_result_html; - search_class->get_search_result_bookmark = get_search_result_bookmark; - search_class->register_document = register_document; - search_class->update_index = update_index; - search_class->purge_index = purge_index; - search_class->optimize_index = optimize_index; - search_class->make_index = make_index; - search_class->exist_index_dir = exist_index_dir; - - g_type_class_add_private (object_class, sizeof(KzSearchEstPrivate)); -} - - -static void -kz_search_est_init (KzSearchEst *est) -{ -} - -static GObject* -constructor (GType type, - guint n_props, - GObjectConstructParam *props) -{ - GObject *object; - - if (!the_kz_search_est) - { - GObjectClass *klass = G_OBJECT_CLASS(kz_search_est_parent_class); - object = klass->constructor(type, n_props, props); - /* singleton does not work */ - /*the_kz_search_est = KZ_SEARCH_EST(object);*/ - } - else - { - object = g_object_ref(G_OBJECT(the_kz_search_est)); - } - return object; -} - -static void -dispose (GObject *object) -{ - if (G_OBJECT_CLASS (kz_search_est_parent_class)->dispose) - G_OBJECT_CLASS (kz_search_est_parent_class)->dispose(object); -} - - -KzSearch * -kz_search_est_get_instance (void) -{ - return KZ_SEARCH(g_object_new(KZ_TYPE_SEARCH_EST, NULL)); -} - -static gboolean -execute_search_command(const gchar *search_text, gint *standard_output) -{ - gboolean ret; - const gchar *estsearch_com = "estcmd search -vx "; - gchar *command; - gint argc; - gchar **argv = NULL; - GSpawnFlags flags; - GPid pid; - gint err; - gchar **split = NULL; - gchar *join = NULL; - gint max_results = 20, num_summary = 128, half_of_summary; - gchar *except_word; - gchar **except_keywords = NULL; - - KZ_CONF_GET("History", "num_summary", num_summary, INT); - KZ_CONF_GET("History", "max_results", max_results, INT); - half_of_summary = num_summary / 2; - - split = g_strsplit(search_text, " ", -1); - if (split) - { - join = g_strjoinv(" AND ", split); - g_strfreev(split); - } - - except_word = KZ_CONF_GET_STR("History", "except_keyword"); - if (except_word && *except_word) - { - except_keywords = g_strsplit(except_word, ",", -1); - g_free(except_word); - except_word = g_strjoinv(" ANDNOT ", except_keywords); - g_strfreev(except_keywords); - - command = g_strdup_printf("%s -max %d -sn %d %d %d %s%s %s ANDNOT %s", - estsearch_com, - max_results, - num_summary, - half_of_summary, - half_of_summary, - g_get_home_dir(), - HISTORY_INDEX" ", - join, - except_word); - g_free(except_word); - } - else - { - command = g_strdup_printf("%s -max %d -sn %d %d %d %s%s %s", - estsearch_com, - max_results, - num_summary, - half_of_summary, - half_of_summary, - g_get_home_dir(), - HISTORY_INDEX" ", - join); - } - - if (join) - g_free(join); - - g_shell_parse_argv(command, - &argc, - &argv, - NULL); - - flags = G_SPAWN_SEARCH_PATH; - ret = g_spawn_async_with_pipes(NULL, - argv, - NULL, - flags, - NULL, - NULL, - &pid, - NULL, - standard_output, - &err, - NULL); - g_strfreev(argv); - g_free(command); - - return ret; -} - - -static gchar * -create_search_result_html (gint out, const gchar *text) -{ - GIOChannel *io; - gchar *line; - gsize length; - gchar *title = NULL, *uri = NULL, *date = NULL, *desc = NULL; - gchar *cache_link = NULL; - gchar *estversion = estsearch_get_version(); - GString *html; - - io = g_io_channel_unix_new(out); - g_io_channel_set_encoding(io, NULL, NULL); - - html = g_string_sized_new(0); - - g_string_append(html, DTD"\n"); - g_string_append(html, "<html>\n"); - g_string_append(html, HEAD); - g_string_append(html, "<body>\n"); - - g_string_append_printf(html, "<h1>Search results for %s</h1>", - text); - - while (g_io_channel_read_line(io, &line, &length, NULL, NULL) == G_IO_STATUS_NORMAL) - { - if (g_str_has_prefix(line, "<document")) - { - size_t len; - gchar *dirname = g_strconcat(g_get_home_dir(), - HISTORY_DIR, - NULL); - len = strlen(dirname); - - cache_link = xml_get_attr(line, "uri"); - uri = create_uri_from_filename(cache_link + - strlen("file://") + - len); - g_free(dirname); - } - else if (g_str_has_prefix(line, "</document>")) - { - gchar *thumb_filename, *thumb_uri; - thumb_filename = egg_pixbuf_get_thumb_filename(uri, - EGG_PIXBUF_THUMB_LARGE); - thumb_uri = g_strdup_printf("history-search:?image=%s", - thumb_filename); - g_string_append_printf(html, - CONTENT, - uri, - title, - thumb_uri, /* thumbnail */ - desc, - uri, - cache_link, - date); - - g_free(desc); - g_free(title); - g_free(uri); - g_free(date); - g_free(cache_link); - g_free(thumb_filename); - g_free(thumb_uri); - } - else if (g_str_has_prefix(line, "<attribute name=\"@title\"")) - { - title = xml_get_attr(line, "value"); - } - else if (g_str_has_prefix(line, "<attribute name=\"@mdate\"")) - { - date = xml_get_attr(line, "value"); - } - else if (g_str_has_prefix(line, "<snippet")) - { - gchar *summary = xml_get_content(line); - desc = remove_tag(summary, g_strlen(summary)); - g_free(summary); - } - g_free(line); - } - g_io_channel_unref(io); - g_string_append_printf(html, FOOTER, ESTRAIER_URI, estversion); - g_string_append(html, "</body></html>"); - - if (estversion) - g_free(estversion); - return g_string_free(html, FALSE); -} - - -gchar * -get_search_result_html (KzSearch *search, const gchar *text) -{ - gint out; - - if (!text) return NULL; - if (!exists_search_cmd) return NULL; - - if (!execute_search_command(text, &out)) - return NULL; - - return create_search_result_html(out, text); -} - -static gboolean -_update_index (gpointer data) -{ - const gchar *estindex_prefix = "estcmd gather -sd -cm "; - gchar *index_dir; - gchar *command; - gchar *filename; - gint in; - gint argc; - gchar **argv = NULL; - GSpawnFlags flags; - GPid pid; - GIOChannel *io; - - index_dir = g_strconcat(g_get_home_dir(), HISTORY_INDEX, NULL); - - command = g_strconcat(estindex_prefix, - index_dir, - " - ", /* read filename from stdin */ - NULL); - g_free(index_dir); - - g_shell_parse_argv(command, - &argc, - &argv, - NULL); - - flags = G_SPAWN_SEARCH_PATH | - G_SPAWN_STDOUT_TO_DEV_NULL; - g_spawn_async_with_pipes(NULL, - argv, - NULL, - flags, - NULL, - NULL, - &pid, - &in, - NULL, - NULL, - NULL); - g_strfreev(argv); - g_free(command); - - /* set filename to add index */ - filename = g_strconcat((gchar*)data, "\n", NULL); - io = g_io_channel_unix_new(in); - g_io_channel_set_encoding(io, NULL, NULL); - g_io_channel_write_chars(io, filename, strlen(filename), NULL, NULL); - g_io_channel_shutdown(io, TRUE, NULL); - g_io_channel_unref(io); - - g_free(filename); - g_free(data); - - return FALSE; -} -gboolean -register_document (KzSearch *search, const gchar *filename) -{ - g_idle_add (_update_index, (gpointer)filename); - - return TRUE; -} - -gboolean -update_index (KzSearch *search) -{ - return TRUE; -} - -static gboolean -purge_index (KzSearch *search) -{ - const gchar *estpurge = "estcmd purge "; - gchar *command; - gint argc; - gchar **argv = NULL; - GSpawnFlags flags; - GPid pid; - - /* purge index */ - flags = G_SPAWN_SEARCH_PATH | - G_SPAWN_STDOUT_TO_DEV_NULL; - command = g_strconcat(estpurge, - g_get_home_dir(), - HISTORY_INDEX, - NULL); - - g_shell_parse_argv(command, - &argc, - &argv, - NULL); - flags = G_SPAWN_SEARCH_PATH | - G_SPAWN_STDOUT_TO_DEV_NULL; - - g_spawn_async(NULL, - argv, - NULL, - flags, - NULL, - NULL, - &pid, - NULL); - - g_strfreev(argv); - g_free(command); - - return FALSE; -} - -static GPid -optimize_index (KzSearch *search) -{ - const gchar *estoptimize = "estcmd optimize "; - gchar *command; - gint argc; - gchar **argv = NULL; - GSpawnFlags flags; - GPid pid; - - /* optimize index process */ - command = g_strconcat(estoptimize, - g_get_home_dir(), HISTORY_INDEX, - NULL); - - g_shell_parse_argv(command, - &argc, - &argv, - NULL); - flags = G_SPAWN_SEARCH_PATH | - G_SPAWN_STDOUT_TO_DEV_NULL; - - g_spawn_async(NULL, - argv, - NULL, - flags, - NULL, - NULL, - &pid, - NULL); - g_strfreev(argv); - g_free(command); - - return pid; -} - -static gchar* -estsearch_get_version (void) -{ - gchar *version, *estcmd_output; - gchar **splited_estcmd_output = NULL; - const gchar *estversion = "estcmd version"; - gint argc; - gchar **argv = NULL; - GSpawnFlags flags; - GPid pid; - gint out, err; - gboolean ret; - GIOChannel *io; - gsize length; - - if (!exists_search_cmd) return NULL; - - g_shell_parse_argv(estversion, - &argc, - &argv, - NULL); - - flags = G_SPAWN_SEARCH_PATH; - ret = g_spawn_async_with_pipes(NULL, - argv, - NULL, - flags, - NULL, - NULL, - &pid, - NULL, - &out, - &err, - NULL); - g_strfreev(argv); - if (!ret) return NULL; - - io = g_io_channel_unix_new(out); - g_io_channel_set_encoding(io, NULL, NULL); - g_io_channel_read_line(io, &estcmd_output, &length, NULL, NULL); - g_io_channel_shutdown(io, TRUE, NULL); - g_io_channel_unref(io); - - splited_estcmd_output = g_strsplit(estcmd_output, " ", -1); - version = g_strdup(splited_estcmd_output[2]); - - g_free(estcmd_output); - g_strfreev(splited_estcmd_output); - - return version; -} - -static KzBookmark * -create_search_result_bookmark (gint out, const gchar *text) -{ - GIOChannel *io; - gchar *line; - gsize length; - gchar *title = NULL, *uri = NULL, *desc = NULL; - KzBookmark *result; - - io = g_io_channel_unix_new(out); - g_io_channel_set_encoding(io, NULL, NULL); - - result = kz_bookmark_pure_folder_new(); - - while (g_io_channel_read_line(io, &line, &length, NULL, NULL) == G_IO_STATUS_NORMAL) - { - if (g_str_has_prefix(line, "</document>")) - { - KzBookmark *child; - child = kz_bookmark_new_with_attrs(title, uri, desc); - kz_bookmark_append(result, child); - g_object_unref(child); - g_free(desc); - g_free(title); - g_free(uri); - } - else if (g_str_has_prefix(line, "<uri>")) - { - gchar *dirname, *orig_uri; - gchar *link; - size_t len; - link = xml_get_attr(line, "uri"); - dirname = g_strconcat(g_get_home_dir(), - HISTORY_DIR, - NULL); - len = strlen(dirname); - orig_uri = create_uri_from_filename(link + strlen("file://") + len); - uri = url_decode(orig_uri); - g_free(orig_uri); - g_free(dirname); - g_free(link); - } - else if (g_str_has_prefix(line, "<title>")) - { - title = xml_get_content(line); - } - else if (g_str_has_prefix(line, "<summary")) - { - gchar *summary = xml_get_content(line); - desc = remove_tag(summary, g_strlen(summary)); - g_free(summary); - } - g_free(line); - } - g_io_channel_unref(io); - - return result; -} - -static KzBookmark * -get_search_result_bookmark (KzSearch *search, const gchar *text) -{ - gint out; - - if (!text) return NULL; - if (!exists_search_cmd) return NULL; - - if (!execute_search_command(text, &out)) - return NULL; - - return create_search_result_bookmark(out, text); -} - -static void -make_index (KzSearch *search) -{ - const gchar *estgather = "estcmd gather -sd "; - gchar *command; - gint argc; - gchar **argv = NULL; - GSpawnFlags flags; - GPid pid; - - command = g_strconcat(estgather, - g_get_home_dir(), - HISTORY_INDEX" ", - g_get_home_dir(), - HISTORY_DIR, - NULL); - - g_shell_parse_argv(command, - &argc, - &argv, - NULL); - flags = G_SPAWN_SEARCH_PATH | - G_SPAWN_STDOUT_TO_DEV_NULL; - - g_spawn_async(NULL, - argv, - NULL, - flags, - NULL, - NULL, - &pid, - NULL); - g_strfreev(argv); - g_free(command); -} - -static gboolean -exist_index_dir(KzSearch *search) -{ - gchar *index_dir; - gboolean exist = FALSE; - - index_dir = g_build_filename(g_get_home_dir(), - HISTORY_INDEX, NULL); - exist = g_file_test(index_dir, G_FILE_TEST_IS_DIR); - g_free(index_dir); - - return exist; -} Index: kazehakase/src/utils/estsearch.h diff -u kazehakase/src/utils/estsearch.h:1.10 kazehakase/src/utils/estsearch.h:removed --- kazehakase/src/utils/estsearch.h:1.10 Sun Dec 3 11:17:41 2006 +++ kazehakase/src/utils/estsearch.h Sun Dec 3 15:02:03 2006 @@ -1,56 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * Copyright (C) 2004 Hiroyuki Ikezoe - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifndef __ESTSEARCH_H__ -#define __ESTSEARCH_H__ - -#include <glib-object.h> -#include "kz-search.h" -#include "kz-bookmark.h" - -G_BEGIN_DECLS - -#define KZ_TYPE_SEARCH_EST (kz_search_est_get_type ()) -#define KZ_SEARCH_EST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), KZ_TYPE_SEARCH_EST, KzSearchEst)) -#define KZ_SEARCH_EST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), KZ_TYPE_SEARCH_EST, KzSearchEstClass)) -#define KZ_IS_SEARCH_EST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), KZ_TYPE_SEARCH_EST)) -#define KZ_IS_SEARCH_EST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), KZ_TYPE_SEARCH_EST)) -#define KZ_SEARCH_EST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), KZ_TYPE_SEARCH_EST, KzSearchEstClass)) - -typedef struct _KzSearchEst KzSearchEst; -typedef struct _KzSearchEstClass KzSearchEstClass; - -struct _KzSearchEst -{ - KzSearch parent; -}; - -struct _KzSearchEstClass -{ - KzSearchClass parent_class; -}; - -GType kz_search_est_get_type (void) G_GNUC_CONST; - -KzSearch *kz_search_est_get_instance (void); - -G_END_DECLS - -#endif /* __ESTSEARCH_H__ */