Highlight search results

FossilOrigin-Name: 07c38c75955f3af6c80852b40b0665f7edd48054ef8d688e0981b5a0971b2d6b
This commit is contained in:
me@ow.nekobit.net 2022-05-04 19:38:45 +00:00
parent 06e86437ae
commit 486e8d1623
7 changed files with 64 additions and 18 deletions

5
dist/treebird20.css vendored
View file

@ -260,6 +260,11 @@ table.present th, table.present td
font-weight: bold;
}
.search-highlight
{
background-color: yellow;
}
/*************************************************
* BUTTONS *
*************************************************/

View file

@ -72,7 +72,7 @@ static char* account_statuses_cb(struct session* ssn,
statuses_html = construct_error(storage.error, E_ERROR, 1, NULL);
}
else {
statuses_html = construct_statuses(api, statuses, statuses_len, NULL);
statuses_html = construct_statuses(api, statuses, statuses_len, NULL, NULL);
if (!statuses_html)
statuses_html = construct_error("No statuses", E_NOTICE, 1, NULL);
}
@ -438,7 +438,7 @@ void content_account_bookmarks(struct session* ssn, mastodont_t* api, char** dat
}
else {
// Construct statuses into HTML
status_format = construct_statuses(api, statuses, status_count, &statuses_html_count);
status_format = construct_statuses(api, statuses, status_count, NULL, &statuses_html_count);
if (!status_format)
status_format = construct_error("Couldn't load posts", E_ERROR, 1, NULL);
}
@ -498,7 +498,7 @@ void content_account_favourites(struct session* ssn, mastodont_t* api, char** da
}
else {
// Construct statuses into HTML
status_format = construct_statuses(api, statuses, status_count, &statuses_html_count);
status_format = construct_statuses(api, statuses, status_count, NULL, &statuses_html_count);
if (!status_format)
status_format = construct_error("Couldn't load posts", E_ERROR, 1, NULL);
}

View file

@ -53,7 +53,7 @@ char* construct_notification(mastodont_t* api,
if (notif->status)
{
// Construct status with notification_info
notif_html = construct_status(api, notif->status, &s, notif, 0);
notif_html = construct_status(api, notif->status, &s, notif, NULL, 0);
}
else {
notif_html = construct_notification_action(notif, &s);

View file

@ -83,7 +83,10 @@ void content_search_statuses(struct session* ssn, mastodont_t* api, char** data)
&args,
&results) == 0)
{
statuses_html = construct_statuses(api, results.statuses, results.statuses_len, NULL);
struct construct_statuses_args statuses_args = {
.highlight_word = ssn->query.query,
};
statuses_html = construct_statuses(api, results.statuses, results.statuses_len, &statuses_args, NULL);
if (!statuses_html)
statuses_html = construct_error("No statuses", E_ERROR, 1, NULL);
}

View file

@ -50,6 +50,7 @@ struct status_args
{
mastodont_t* api;
struct mstdnt_status* status;
struct construct_statuses_args* args;
};
int try_post_status(struct session* ssn, mastodont_t* api)
@ -348,6 +349,7 @@ char* construct_status(mastodont_t* api,
struct mstdnt_status* local_status,
int* size,
struct mstdnt_notification* local_notif,
struct construct_statuses_args* args,
uint8_t flags)
{
char* stat_html;
@ -409,7 +411,24 @@ char* construct_status(mastodont_t* api,
notif_reblog.type = MSTDNT_NOTIFICATION_REBLOG;
notif = &notif_reblog;
}
// Format status
char* parse_content = reformat_status(status->content, status->emojis, status->emojis_len);
// Find and replace
if (args && args->highlight_word)
{
char* parse_content_tmp;
char* repl_str;
easprintf(&repl_str, "<span class=\"search-highlight\">%s</span>", args->highlight_word);
parse_content_tmp = parse_content;
parse_content = strrepl(parse_content, args->highlight_word, repl_str, STRREPL_ALL);
if (parse_content != parse_content_tmp)
free(parse_content_tmp);
else // No results, move back
parse_content = parse_content_tmp;
free(repl_str);
}
if (status->replies_count)
easprintf(&reply_count, NUM_STR, status->replies_count);
@ -498,17 +517,22 @@ char* construct_status(mastodont_t* api,
static char* construct_status_voidwrap(void* passed, size_t index, int* res)
{
struct status_args* args = passed;
return construct_status(args->api, args->status + index, res, NULL, 0);
return construct_status(args->api, args->status + index, res, NULL, args->args, 0);
}
char* construct_statuses(mastodont_t* api, struct mstdnt_status* statuses, size_t size, size_t* ret_size)
char* construct_statuses(mastodont_t* api,
struct mstdnt_status* statuses,
size_t size,
struct construct_statuses_args* args,
size_t* ret_size)
{
if (!(statuses && size)) return NULL;
struct status_args args = {
struct status_args stat_args = {
.api = api,
.status = statuses,
.args = args,
};
return construct_func_strings(construct_status_voidwrap, &args, size, ret_size);
return construct_func_strings(construct_status_voidwrap, &stat_args, size, ret_size);
}
void status_interact(struct session* ssn, mastodont_t* api, char** data)
@ -556,10 +580,10 @@ void content_status(struct session* ssn, mastodont_t* api, char** data, int is_r
stat_html = construct_error("Status not found", E_ERROR, 1, NULL);
}
else {
before_html = construct_statuses(api, statuses_before, stat_before_len, NULL);
before_html = construct_statuses(api, statuses_before, stat_before_len, NULL, 0);
// Current status
stat_html = construct_status(api, &status, NULL, NULL, STATUS_FOCUSED);
stat_html = construct_status(api, &status, NULL, NULL, NULL, STATUS_FOCUSED);
if (is_reply)
{
stat_reply = reply_status(data[0],
@ -568,7 +592,7 @@ void content_status(struct session* ssn, mastodont_t* api, char** data, int is_r
}
// After...
after_html = construct_statuses(api, statuses_after, stat_after_len, NULL);
after_html = construct_statuses(api, statuses_after, stat_after_len, NULL, 0);
easprintf(&output, "%s%s%s%s",
before_html ? before_html : "",

View file

@ -27,6 +27,11 @@
#define STATUS_FOCUSED (1<<0)
#define STATUS_EMOJI_PICKER (1<<1)
struct construct_statuses_args
{
char* highlight_word;
};
struct interact_profile_args
{
struct mstdnt_account* reblogs;
@ -43,8 +48,17 @@ void content_status_create(struct session* ssn, mastodont_t* api, char** data);
char* construct_post_box(char* reply_id,
char* default_content,
int* size);
char* construct_status(mastodont_t* api, struct mstdnt_status* status, int* size, struct mstdnt_notification* notif, uint8_t flags);
char* construct_statuses(mastodont_t* api, struct mstdnt_status* statuses, size_t size, size_t* ret_size);
char* construct_status(mastodont_t* api,
struct mstdnt_status* status,
int* size,
struct mstdnt_notification* notif,
struct construct_statuses_args* args,
uint8_t flags);
char* construct_statuses(mastodont_t* api,
struct mstdnt_status* statuses,
size_t size,
struct construct_statuses_args* args,
size_t* ret_size);
// Reply to
char* get_in_reply_to(mastodont_t* api, struct mstdnt_status* status, size_t* size);

View file

@ -61,7 +61,7 @@ void tl_home(struct session* ssn, mastodont_t* api, int local)
}
else {
// Construct statuses into HTML
status_format = construct_statuses(api, statuses, status_count, &statuses_html_count);
status_format = construct_statuses(api, statuses, status_count, NULL, &statuses_html_count);
if (!status_format)
status_format = construct_error("Couldn't load posts", E_ERROR, 1, NULL);
}
@ -126,7 +126,7 @@ void tl_direct(struct session* ssn, mastodont_t* api)
}
else {
// Construct statuses into HTML
status_format = construct_statuses(api, statuses, status_count, &statuses_html_count);
status_format = construct_statuses(api, statuses, status_count, NULL, &statuses_html_count);
if (!status_format)
status_format = construct_error("Couldn't load posts", E_ERROR, 1, NULL);
}
@ -196,7 +196,7 @@ void tl_public(struct session* ssn, mastodont_t* api, int local, enum base_categ
}
else {
// Construct statuses into HTML
status_format = construct_statuses(api, statuses, status_count, &statuses_html_count);
status_format = construct_statuses(api, statuses, status_count, NULL, &statuses_html_count);
if (!status_format)
status_format = construct_error("Couldn't load posts", E_ERROR, 1, NULL);
}
@ -259,7 +259,7 @@ void tl_list(struct session* ssn, mastodont_t* api, char* list_id)
}
else {
// Construct statuses into HTML
status_format = construct_statuses(api, statuses, status_count, &statuses_html_count);
status_format = construct_statuses(api, statuses, status_count, NULL, &statuses_html_count);
if (!status_format)
status_format = construct_error("No statuses", E_ERROR, 1, NULL);
}