mirror of
https://github.com/rkd77/elinks.git
synced 2025-05-18 00:48:57 -04:00
bug 153, 1066: Convert bookmarks to/from UTF-8 when searching.
This commit is contained in:
parent
8c0fa7f09c
commit
311d95358d
@ -641,13 +641,15 @@ bookmark_manager(struct session *ses)
|
|||||||
* rapid search of an already existing bookmark. --Zas */
|
* rapid search of an already existing bookmark. --Zas */
|
||||||
|
|
||||||
struct bookmark_search_ctx {
|
struct bookmark_search_ctx {
|
||||||
unsigned char *url;
|
unsigned char *url; /* UTF-8 */
|
||||||
unsigned char *title;
|
unsigned char *title; /* system charset */
|
||||||
int found;
|
int found;
|
||||||
int offset;
|
int offset;
|
||||||
|
int utf8_cp;
|
||||||
|
int system_cp;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define NULL_BOOKMARK_SEARCH_CTX {NULL, NULL, 0, 0}
|
#define NULL_BOOKMARK_SEARCH_CTX {NULL, NULL, 0, 0, -1, -1}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
test_search(struct listbox_item *item, void *data_, int *offset)
|
test_search(struct listbox_item *item, void *data_, int *offset)
|
||||||
@ -661,10 +663,37 @@ test_search(struct listbox_item *item, void *data_, int *offset)
|
|||||||
|
|
||||||
assert(ctx->title && ctx->url);
|
assert(ctx->title && ctx->url);
|
||||||
|
|
||||||
/** @todo Bug 153: bm->title should be UTF-8.
|
ctx->found = (*ctx->url && c_strcasestr(bm->url, ctx->url));
|
||||||
* @todo Bug 1066: bm->url should be UTF-8. */
|
if (!ctx->found && *ctx->title) {
|
||||||
ctx->found = (*ctx->title && strcasestr(bm->title, ctx->title))
|
/* The comparison of bookmark titles should
|
||||||
|| (*ctx->url && c_strcasestr(bm->url, ctx->url));
|
* be case-insensitive and locale-sensitive
|
||||||
|
* (Turkish dotless i). ELinks doesn't have
|
||||||
|
* such a function for UTF-8. The best we
|
||||||
|
* have is strcasestr, which uses the system
|
||||||
|
* charset. So convert bm->title to that.
|
||||||
|
* (ctx->title has already been converted.) */
|
||||||
|
struct conv_table *convert_table;
|
||||||
|
unsigned char *title = NULL;
|
||||||
|
|
||||||
|
convert_table = get_translation_table(ctx->utf8_cp,
|
||||||
|
ctx->system_cp);
|
||||||
|
if (convert_table) {
|
||||||
|
title = convert_string(convert_table,
|
||||||
|
bm->title,
|
||||||
|
strlen(bm->title),
|
||||||
|
ctx->system_cp,
|
||||||
|
CSM_NONE, NULL,
|
||||||
|
NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (title) {
|
||||||
|
ctx->found = strcasecmp(title,
|
||||||
|
ctx->title);
|
||||||
|
mem_free(title);
|
||||||
|
}
|
||||||
|
/** @todo Tell the user that the string could
|
||||||
|
* not be converted. */
|
||||||
|
}
|
||||||
|
|
||||||
if (ctx->found) *offset = 0;
|
if (ctx->found) *offset = 0;
|
||||||
}
|
}
|
||||||
@ -673,7 +702,9 @@ test_search(struct listbox_item *item, void *data_, int *offset)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Last searched values */
|
/* Last searched values. Both are in UTF-8. (The title could be kept
|
||||||
|
* in the system charset, but that would be a bit risky, because
|
||||||
|
* setlocale calls from Lua scripts can change the system charset.) */
|
||||||
static unsigned char *bm_last_searched_title = NULL;
|
static unsigned char *bm_last_searched_title = NULL;
|
||||||
static unsigned char *bm_last_searched_url = NULL;
|
static unsigned char *bm_last_searched_url = NULL;
|
||||||
|
|
||||||
@ -685,14 +716,15 @@ free_last_searched_bookmark(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
memorize_last_searched_bookmark(struct bookmark_search_ctx *ctx)
|
memorize_last_searched_bookmark(const unsigned char *title,
|
||||||
|
const unsigned char *url)
|
||||||
{
|
{
|
||||||
/* Memorize last searched title */
|
/* Memorize last searched title */
|
||||||
mem_free_set(&bm_last_searched_title, stracpy(ctx->title));
|
mem_free_set(&bm_last_searched_title, stracpy(title));
|
||||||
if (!bm_last_searched_title) return 0;
|
if (!bm_last_searched_title) return 0;
|
||||||
|
|
||||||
/* Memorize last searched url */
|
/* Memorize last searched url */
|
||||||
mem_free_set(&bm_last_searched_url, stracpy(ctx->url));
|
mem_free_set(&bm_last_searched_url, stracpy(url));
|
||||||
if (!bm_last_searched_url) {
|
if (!bm_last_searched_url) {
|
||||||
mem_free_set(&bm_last_searched_title, NULL);
|
mem_free_set(&bm_last_searched_title, NULL);
|
||||||
return 0;
|
return 0;
|
||||||
@ -709,38 +741,94 @@ bookmark_search_do(void *data)
|
|||||||
struct bookmark_search_ctx ctx = NULL_BOOKMARK_SEARCH_CTX;
|
struct bookmark_search_ctx ctx = NULL_BOOKMARK_SEARCH_CTX;
|
||||||
struct listbox_data *box;
|
struct listbox_data *box;
|
||||||
struct dialog_data *dlg_data;
|
struct dialog_data *dlg_data;
|
||||||
|
struct conv_table *convert_table;
|
||||||
|
int term_cp;
|
||||||
|
unsigned char *url_term;
|
||||||
|
unsigned char *title_term;
|
||||||
|
unsigned char *title_utf8 = NULL;
|
||||||
|
|
||||||
assertm(dlg->udata != NULL, "Bookmark search with NULL udata in dialog");
|
assertm(dlg->udata != NULL, "Bookmark search with NULL udata in dialog");
|
||||||
if_assert_failed return;
|
if_assert_failed return;
|
||||||
|
|
||||||
ctx.title = dlg->widgets[0].data;
|
|
||||||
ctx.url = dlg->widgets[1].data;
|
|
||||||
|
|
||||||
if (!ctx.title || !ctx.url)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!memorize_last_searched_bookmark(&ctx))
|
|
||||||
return;
|
|
||||||
|
|
||||||
dlg_data = (struct dialog_data *) dlg->udata;
|
dlg_data = (struct dialog_data *) dlg->udata;
|
||||||
|
term_cp = get_terminal_codepage(dlg_data->win->term);
|
||||||
|
ctx.system_cp = get_cp_index("System");
|
||||||
|
ctx.utf8_cp = get_cp_index("UTF-8");
|
||||||
|
|
||||||
|
title_term = dlg->widgets[0].data; /* need not be freed */
|
||||||
|
url_term = dlg->widgets[1].data; /* likewise */
|
||||||
|
|
||||||
|
convert_table = get_translation_table(term_cp, ctx.system_cp);
|
||||||
|
if (!convert_table) goto free_all;
|
||||||
|
ctx.title = convert_string(convert_table,
|
||||||
|
title_term, strlen(title_term),
|
||||||
|
ctx.system_cp, CSM_NONE, NULL, NULL, NULL);
|
||||||
|
if (!ctx.title) goto free_all;
|
||||||
|
|
||||||
|
convert_table = get_translation_table(term_cp, ctx.utf8_cp);
|
||||||
|
if (!convert_table) goto free_all;
|
||||||
|
ctx.url = convert_string(convert_table,
|
||||||
|
url_term, strlen(url_term),
|
||||||
|
ctx.utf8_cp, CSM_NONE, NULL, NULL, NULL);
|
||||||
|
if (!ctx.url) goto free_all;
|
||||||
|
title_utf8 = convert_string(convert_table,
|
||||||
|
title_term, strlen(title_term),
|
||||||
|
ctx.utf8_cp, CSM_NONE, NULL, NULL, NULL);
|
||||||
|
if (!title_utf8) goto free_all;
|
||||||
|
|
||||||
|
if (!memorize_last_searched_bookmark(title_utf8, ctx.url))
|
||||||
|
goto free_all;
|
||||||
|
|
||||||
box = get_dlg_listbox_data(dlg_data);
|
box = get_dlg_listbox_data(dlg_data);
|
||||||
|
|
||||||
traverse_listbox_items_list(box->sel, box, 0, 0, test_search, &ctx);
|
traverse_listbox_items_list(box->sel, box, 0, 0, test_search, &ctx);
|
||||||
if (!ctx.found) return;
|
if (!ctx.found) goto free_all;
|
||||||
|
|
||||||
listbox_sel_move(dlg_data->widgets_data, ctx.offset - 1);
|
listbox_sel_move(dlg_data->widgets_data, ctx.offset - 1);
|
||||||
}
|
|
||||||
|
|
||||||
|
free_all:
|
||||||
|
mem_free_if(ctx.title);
|
||||||
|
mem_free_if(ctx.url);
|
||||||
|
mem_free_if(title_utf8);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
launch_bm_search_doc_dialog(struct terminal *term,
|
launch_bm_search_doc_dialog(struct terminal *term,
|
||||||
struct dialog_data *parent,
|
struct dialog_data *parent,
|
||||||
struct session *ses)
|
struct session *ses)
|
||||||
{
|
{
|
||||||
|
unsigned char *title = NULL;
|
||||||
|
unsigned char *url = NULL;
|
||||||
|
|
||||||
|
if (bm_last_searched_title && bm_last_searched_url) {
|
||||||
|
int utf8_cp, term_cp;
|
||||||
|
struct conv_table *convert_table;
|
||||||
|
|
||||||
|
utf8_cp = get_cp_index("UTF-8");
|
||||||
|
term_cp = get_terminal_codepage(term);
|
||||||
|
|
||||||
|
convert_table = get_translation_table(utf8_cp, term_cp);
|
||||||
|
if (convert_table) {
|
||||||
|
title = convert_string(convert_table, bm_last_searched_title,
|
||||||
|
strlen(bm_last_searched_title), term_cp,
|
||||||
|
CSM_NONE, NULL, NULL, NULL);
|
||||||
|
url = convert_string(convert_table, bm_last_searched_url,
|
||||||
|
strlen(bm_last_searched_url), term_cp,
|
||||||
|
CSM_NONE, NULL, NULL, NULL);
|
||||||
|
}
|
||||||
|
if (!title || !url) {
|
||||||
|
mem_free_set(&title, NULL);
|
||||||
|
mem_free_set(&url, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
do_edit_dialog(term, 1, N_("Search bookmarks"),
|
do_edit_dialog(term, 1, N_("Search bookmarks"),
|
||||||
bm_last_searched_title, bm_last_searched_url,
|
title, url,
|
||||||
ses, parent, bookmark_search_do, NULL, NULL,
|
ses, parent, bookmark_search_do, NULL, NULL,
|
||||||
EDIT_DLG_SEARCH);
|
EDIT_DLG_SEARCH);
|
||||||
|
|
||||||
|
mem_free_if(title);
|
||||||
|
mem_free_if(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user