feat: add default search engine option
This commit is contained in:
parent
10d44e7ff5
commit
a20a9e8878
8 changed files with 96 additions and 7 deletions
|
|
@ -21,6 +21,10 @@ display_language_label = "Display Language"
|
||||||
language_desc = "Choose your preferred language."
|
language_desc = "Choose your preferred language."
|
||||||
engines_label = "Search Engines"
|
engines_label = "Search Engines"
|
||||||
engines_desc = "Choose which search engines to use. Only engines enabled on the server are shown."
|
engines_desc = "Choose which search engines to use. Only engines enabled on the server are shown."
|
||||||
|
other_label = "Other Settings"
|
||||||
|
other_desc = "Choose additional settings."
|
||||||
|
default_engine_label = "Default Search Engine"
|
||||||
|
all_engines_option = "All enabled engines"
|
||||||
save_settings_button = "Save Settings"
|
save_settings_button = "Save Settings"
|
||||||
no_results = "No results found"
|
no_results = "No results found"
|
||||||
error_images = "Error fetching images"
|
error_images = "Error fetching images"
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,10 @@ display_language_label = "Display Language"
|
||||||
language_desc = "Choose your preferred language."
|
language_desc = "Choose your preferred language."
|
||||||
engines_label = "Search Engines"
|
engines_label = "Search Engines"
|
||||||
engines_desc = "Choose which search engines to use. Only engines enabled on the server are shown."
|
engines_desc = "Choose which search engines to use. Only engines enabled on the server are shown."
|
||||||
|
other_label = "Other Settings"
|
||||||
|
other_desc = "Choose additional settings."
|
||||||
|
default_engine_label = "Default Search Engine"
|
||||||
|
all_engines_option = "All enabled engines"
|
||||||
save_settings_button = "Save Settings"
|
save_settings_button = "Save Settings"
|
||||||
no_results = "No results found"
|
no_results = "No results found"
|
||||||
error_images = "Error fetching images"
|
error_images = "Error fetching images"
|
||||||
|
|
|
||||||
|
|
@ -417,7 +417,11 @@ int results_handler(UrlParams *params) {
|
||||||
extern Config global_config;
|
extern Config global_config;
|
||||||
TemplateContext ctx = new_context();
|
TemplateContext ctx = new_context();
|
||||||
char *raw_query = "";
|
char *raw_query = "";
|
||||||
const char *selected_engine_id = "all";
|
char selected_engine_id[32];
|
||||||
|
char *default_engine = get_default_search_engine();
|
||||||
|
snprintf(selected_engine_id, sizeof(selected_engine_id), "%s",
|
||||||
|
default_engine);
|
||||||
|
free(default_engine);
|
||||||
int page = 1;
|
int page = 1;
|
||||||
int btnI = 0;
|
int btnI = 0;
|
||||||
|
|
||||||
|
|
@ -435,7 +439,8 @@ int results_handler(UrlParams *params) {
|
||||||
if (parsed > 1)
|
if (parsed > 1)
|
||||||
page = parsed;
|
page = parsed;
|
||||||
} else if (strcmp(params->params[i].key, "engine") == 0) {
|
} else if (strcmp(params->params[i].key, "engine") == 0) {
|
||||||
selected_engine_id = params->params[i].value;
|
snprintf(selected_engine_id, sizeof(selected_engine_id), "%s",
|
||||||
|
params->params[i].value);
|
||||||
} else if (strcmp(params->params[i].key, "btnI") == 0) {
|
} else if (strcmp(params->params[i].key, "btnI") == 0) {
|
||||||
btnI = atoi(params->params[i].value);
|
btnI = atoi(params->params[i].value);
|
||||||
}
|
}
|
||||||
|
|
@ -481,8 +486,17 @@ int results_handler(UrlParams *params) {
|
||||||
}
|
}
|
||||||
|
|
||||||
const SearchEngine *selected_engine = find_enabled_engine(selected_engine_id);
|
const SearchEngine *selected_engine = find_enabled_engine(selected_engine_id);
|
||||||
if (!selected_engine)
|
if (selected_engine &&
|
||||||
selected_engine_id = "all";
|
!engine_allowed_for_user(selected_engine, user_engines,
|
||||||
|
user_engine_count, has_user_pref)) {
|
||||||
|
selected_engine = NULL;
|
||||||
|
}
|
||||||
|
if (selected_engine) {
|
||||||
|
snprintf(selected_engine_id, sizeof(selected_engine_id), "%s",
|
||||||
|
selected_engine->id);
|
||||||
|
} else {
|
||||||
|
snprintf(selected_engine_id, sizeof(selected_engine_id), "all");
|
||||||
|
}
|
||||||
|
|
||||||
context_set(&ctx, "selected_engine", selected_engine_id);
|
context_set(&ctx, "selected_engine", selected_engine_id);
|
||||||
char *search_href = build_search_href(raw_query, selected_engine_id, 1);
|
char *search_href = build_search_href(raw_query, selected_engine_id, 1);
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,14 @@ int settings_handler(UrlParams *params) {
|
||||||
int user_engine_count = 0;
|
int user_engine_count = 0;
|
||||||
int has_user_pref =
|
int has_user_pref =
|
||||||
(get_user_engines(&user_engines, &user_engine_count) == 0);
|
(get_user_engines(&user_engines, &user_engine_count) == 0);
|
||||||
|
char *default_engine = get_default_search_engine();
|
||||||
|
|
||||||
|
if (strcmp(default_engine, "all") != 0 && has_user_pref &&
|
||||||
|
!user_engines_contains(default_engine, user_engines,
|
||||||
|
user_engine_count)) {
|
||||||
|
free(default_engine);
|
||||||
|
default_engine = strdup("all");
|
||||||
|
}
|
||||||
|
|
||||||
int enabled_count = 0;
|
int enabled_count = 0;
|
||||||
for (int i = 0; i < ENGINE_COUNT; i++) {
|
for (int i = 0; i < ENGINE_COUNT; i++) {
|
||||||
|
|
@ -63,11 +71,13 @@ int settings_handler(UrlParams *params) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
engine_data[idx] = malloc(sizeof(char *) * 3);
|
engine_data[idx] = malloc(sizeof(char *) * 4);
|
||||||
engine_data[idx][0] = (char *)ENGINE_REGISTRY[i].id;
|
engine_data[idx][0] = (char *)ENGINE_REGISTRY[i].id;
|
||||||
engine_data[idx][1] = (char *)ENGINE_REGISTRY[i].name;
|
engine_data[idx][1] = (char *)ENGINE_REGISTRY[i].name;
|
||||||
engine_data[idx][2] = is_selected ? "checked" : "";
|
engine_data[idx][2] = is_selected ? "checked" : "";
|
||||||
engine_inner[idx] = 3;
|
engine_data[idx][3] =
|
||||||
|
strcmp(default_engine, ENGINE_REGISTRY[i].id) == 0 ? "selected" : "";
|
||||||
|
engine_inner[idx] = 4;
|
||||||
|
|
||||||
idx++;
|
idx++;
|
||||||
}
|
}
|
||||||
|
|
@ -78,6 +88,7 @@ int settings_handler(UrlParams *params) {
|
||||||
context_set(&ctx, "query", query);
|
context_set(&ctx, "query", query);
|
||||||
context_set(&ctx, "theme", theme);
|
context_set(&ctx, "theme", theme);
|
||||||
context_set(&ctx, "locale", locale);
|
context_set(&ctx, "locale", locale);
|
||||||
|
context_set(&ctx, "default_engine", default_engine);
|
||||||
context_set_array_of_arrays(&ctx, "locales", locale_data, locale_count,
|
context_set_array_of_arrays(&ctx, "locales", locale_data, locale_count,
|
||||||
inner_counts);
|
inner_counts);
|
||||||
|
|
||||||
|
|
@ -132,6 +143,7 @@ int settings_handler(UrlParams *params) {
|
||||||
send_response(rendered_html);
|
send_response(rendered_html);
|
||||||
|
|
||||||
free(rendered_html);
|
free(rendered_html);
|
||||||
|
free(default_engine);
|
||||||
free(theme);
|
free(theme);
|
||||||
free(locale);
|
free(locale);
|
||||||
free_context(&ctx);
|
free_context(&ctx);
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,8 @@ int settings_save_handler(UrlParams *params) {
|
||||||
const char *theme = "";
|
const char *theme = "";
|
||||||
const char *locale = "";
|
const char *locale = "";
|
||||||
const char *query = "";
|
const char *query = "";
|
||||||
|
const char *default_engine = "all";
|
||||||
|
int default_engine_present = 0;
|
||||||
int engines_present = 0;
|
int engines_present = 0;
|
||||||
char selected_ids[ENGINE_COUNT][32];
|
char selected_ids[ENGINE_COUNT][32];
|
||||||
int selected_count = 0;
|
int selected_count = 0;
|
||||||
|
|
@ -22,6 +24,9 @@ int settings_save_handler(UrlParams *params) {
|
||||||
locale = params->params[i].value;
|
locale = params->params[i].value;
|
||||||
} else if (strcmp(params->params[i].key, "q") == 0) {
|
} else if (strcmp(params->params[i].key, "q") == 0) {
|
||||||
query = params->params[i].value;
|
query = params->params[i].value;
|
||||||
|
} else if (strcmp(params->params[i].key, "default_engine") == 0) {
|
||||||
|
default_engine = params->params[i].value;
|
||||||
|
default_engine_present = 1;
|
||||||
} else if (strcmp(params->params[i].key, "engines_present") == 0) {
|
} else if (strcmp(params->params[i].key, "engines_present") == 0) {
|
||||||
engines_present = 1;
|
engines_present = 1;
|
||||||
} else if (strncmp(params->params[i].key, "engine_", 7) == 0 &&
|
} else if (strncmp(params->params[i].key, "engine_", 7) == 0 &&
|
||||||
|
|
@ -58,6 +63,31 @@ int settings_save_handler(UrlParams *params) {
|
||||||
false, false);
|
false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (default_engine_present) {
|
||||||
|
const char *validated_default = "all";
|
||||||
|
|
||||||
|
for (int i = 0; i < ENGINE_COUNT; i++) {
|
||||||
|
if (!ENGINE_REGISTRY[i].enabled ||
|
||||||
|
strcmp(default_engine, ENGINE_REGISTRY[i].id) != 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
int selected = !engines_present;
|
||||||
|
for (int j = 0; j < selected_count; j++) {
|
||||||
|
if (strcmp(selected_ids[j], ENGINE_REGISTRY[i].id) == 0) {
|
||||||
|
selected = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (selected)
|
||||||
|
validated_default = ENGINE_REGISTRY[i].id;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
set_cookie("default_engine", validated_default,
|
||||||
|
"Fri, 31 Dec 2038 23:59:59 GMT", "/", false, false);
|
||||||
|
}
|
||||||
|
|
||||||
char redirect_url[512];
|
char redirect_url[512];
|
||||||
snprintf(redirect_url, sizeof(redirect_url), "/settings?q=%s", query);
|
snprintf(redirect_url, sizeof(redirect_url), "/settings?q=%s", query);
|
||||||
send_redirect(redirect_url);
|
send_redirect(redirect_url);
|
||||||
|
|
|
||||||
|
|
@ -217,6 +217,15 @@ int user_engines_contains(const char *engine_id, char **ids, int count) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *get_default_search_engine(void) {
|
||||||
|
char *cookie = get_cookie("default_engine");
|
||||||
|
if (cookie && (strcmp(cookie, "all") == 0 || is_engine_id_enabled(cookie)))
|
||||||
|
return cookie;
|
||||||
|
|
||||||
|
free(cookie);
|
||||||
|
return strdup("all");
|
||||||
|
}
|
||||||
|
|
||||||
void free_string_matrix(char ***matrix, int *inner_counts, int row_count) {
|
void free_string_matrix(char ***matrix, int *inner_counts, int row_count) {
|
||||||
if (matrix) {
|
if (matrix) {
|
||||||
for (int i = 0; i < row_count; i++) {
|
for (int i = 0; i < row_count; i++) {
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@ char *get_locale(const char *default_locale);
|
||||||
int is_engine_id_enabled(const char *engine_id);
|
int is_engine_id_enabled(const char *engine_id);
|
||||||
int get_user_engines(char ***out_ids, int *out_count);
|
int get_user_engines(char ***out_ids, int *out_count);
|
||||||
int user_engines_contains(const char *engine_id, char **ids, int count);
|
int user_engines_contains(const char *engine_id, char **ids, int count);
|
||||||
|
char *get_default_search_engine(void);
|
||||||
|
|
||||||
void free_string_matrix(char ***matrix, int *inner_counts, int row_count);
|
void free_string_matrix(char ***matrix, int *inner_counts, int row_count);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -87,6 +87,21 @@
|
||||||
</div>
|
</div>
|
||||||
{{endfor}}
|
{{endfor}}
|
||||||
</section>
|
</section>
|
||||||
|
<section class="settings-section">
|
||||||
|
<h3 class="settings-section-title">{{l("other_label")}}</h3>
|
||||||
|
<p class="settings-section-desc">{{l("other_desc")}}</p>
|
||||||
|
<div class="settings-field">
|
||||||
|
<label class="settings-label" for="default_engine">{{l("default_engine_label")}}</label>
|
||||||
|
<select id="default_engine" name="default_engine" class="settings-select">
|
||||||
|
<option value="all" {{if default_engine == "all"}}selected{{endif}}>{{l("all_engines_option")}}</option>
|
||||||
|
{{for eng in enabled_engines}}
|
||||||
|
{{if eng[2] != ""}}
|
||||||
|
<option value="{{eng[0]}}" {{eng[3]}}>{{eng[1]}}</option>
|
||||||
|
{{endif}}
|
||||||
|
{{endfor}}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
{{endif}}
|
{{endif}}
|
||||||
<div class="settings-actions">
|
<div class="settings-actions">
|
||||||
<button type="submit" class="btn-primary">{{l("save_settings_button")}}</button>
|
<button type="submit" class="btn-primary">{{l("save_settings_button")}}</button>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue