add custom filter command (Ctrl+F)

This commit is contained in:
NunoSempere 2024-09-19 15:16:15 +02:00
parent 2a5f09ce7c
commit 5e3cab2a63
5 changed files with 65 additions and 12 deletions

View File

@ -92,6 +92,7 @@ typedef enum {
show_finder, show_finder,
finder_next, finder_next,
finder_prev, finder_prev,
filter,
halve_window, halve_window,
rebig_window, rebig_window,
@ -134,6 +135,7 @@ static struct {
{ CTRL, KEY(f), show_finder }, { CTRL, KEY(f), show_finder },
{ CTRL, KEY(n), finder_next }, { CTRL, KEY(n), finder_next },
{ CTRL, KEY(N), finder_prev }, { CTRL, KEY(N), finder_prev },
{ CTRL | SFT, KEY(F), filter },
{ CTRL, KEY(Up), halve_window }, { CTRL, KEY(Up), halve_window },
{ CTRL, KEY(Down), rebig_window }, { CTRL, KEY(Down), rebig_window },
{ CTRL, KEY(p), prettify }, { CTRL, KEY(p), prettify },

View File

@ -1,7 +1,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#define STYLE_N 8049 + 1000 #define STYLE_N 8675 + 1000
void read_style_js(char* string) void read_style_js(char* string)
{ {

View File

@ -1,5 +1,5 @@
#pragma once #pragma once
#define STYLE_N 8049 + 1000 #define STYLE_N 8675 + 1000
void read_style_js(char* string); void read_style_js(char* string);

View File

@ -299,3 +299,25 @@ if (document.domain == "twitter.com" || document.domain == "x.com") {
} }
// document.body.style.visibility = "visible"; // document.body.style.visibility = "visible";
// Add some code to filter out articles for Sentinel
function filterDetailsByKeywordHide(keyword) {
// Get all the <details> elements on the page
const detailsElements = document.querySelectorAll("details");
// Loop through each <details> element
detailsElements.forEach((element) => {
// Find the <p> element inside the <details> that follows the first <h3> (assumed to be the summary here)
const summaryElement = element.querySelector("h3 + p");
// Check if the summary text includes the keyword (case-insensitive match)
if (
summaryElement &&
summaryElement.textContent.toLowerCase().includes(keyword.toLowerCase())
) {
// If the keyword is found, hide this <details> element
element.style.display = "none";
}
});
}
console.log("Hello world");

View File

@ -9,7 +9,7 @@
/* Global variables */ /* Global variables */
static GtkNotebook* notebook; static GtkNotebook* notebook;
static GtkWindow* window; static GtkWindow* window;
typedef enum { _SEARCH, _FIND, _HIDDEN } Bar_entry_mode; typedef enum { _SEARCH, _FIND, _FILTER, _HIDDEN } Bar_entry_mode;
static struct { static struct {
GtkHeaderBar* widget; GtkHeaderBar* widget;
GtkEntry* line; GtkEntry* line;
@ -227,6 +227,13 @@ void toggle_bar(GtkNotebook* notebook, Bar_entry_mode mode)
gtk_window_set_focus(window, GTK_WIDGET(bar.line)); gtk_window_set_focus(window, GTK_WIDGET(bar.line));
break; break;
} }
case _FILTER: {
gtk_entry_set_placeholder_text(bar.line, "Filter");
gtk_entry_buffer_set_text(bar.line_text, "", strlen(""));
gtk_widget_set_visible(GTK_WIDGET(bar.widget), 1);
gtk_window_set_focus(window, GTK_WIDGET(bar.line));
break;
}
case _HIDDEN: case _HIDDEN:
gtk_widget_set_visible(GTK_WIDGET(bar.widget), 0); gtk_widget_set_visible(GTK_WIDGET(bar.widget), 0);
} }
@ -236,16 +243,35 @@ void toggle_bar(GtkNotebook* notebook, Bar_entry_mode mode)
void handle_signal_bar_press_enter(GtkEntry* self, GtkNotebook* notebook) /* consider passing notebook as the data here? */ void handle_signal_bar_press_enter(GtkEntry* self, GtkNotebook* notebook) /* consider passing notebook as the data here? */
{ {
WebKitWebView* view = notebook_get_webview(notebook); WebKitWebView* view = notebook_get_webview(notebook);
if (bar.entry_mode == _SEARCH) const char* bar_line_text = gtk_entry_buffer_get_text(bar.line_text);
load_uri(view, gtk_entry_buffer_get_text(bar.line_text)); switch (bar.entry_mode) {
else if (bar.entry_mode == _FIND) case _SEARCH: {
webkit_find_controller_search( load_uri(view, bar_line_text);
webkit_web_view_get_find_controller(view), gtk_widget_set_visible(GTK_WIDGET(bar.widget), 0);
gtk_entry_buffer_get_text(bar.line_text), break;
WEBKIT_FIND_OPTIONS_CASE_INSENSITIVE | WEBKIT_FIND_OPTIONS_WRAP_AROUND, }
G_MAXUINT); case _FIND: {
webkit_find_controller_search(
webkit_web_view_get_find_controller(view),
bar_line_text,
WEBKIT_FIND_OPTIONS_CASE_INSENSITIVE | WEBKIT_FIND_OPTIONS_WRAP_AROUND,
G_MAXUINT);
gtk_widget_set_visible(GTK_WIDGET(bar.widget), 0);
break;
}
case _FILTER: {
const char* js_template = "filterDetailsByKeywordHide(\"%s\")";
char js_command[strlen(js_template) + strlen(bar_line_text) + 2];
snprintf(js_command, sizeof(js_command) + 1, js_template, bar_line_text);
webkit_web_view_evaluate_javascript(view, js_command, -1, NULL, "rosenrot-filter-plugin", NULL, NULL, NULL);
gtk_widget_set_visible(GTK_WIDGET(bar.widget), 0);
break;
}
case _HIDDEN:
// no op
}
gtk_widget_set_visible(GTK_WIDGET(bar.widget), 0);
} }
/* Shortcuts */ /* Shortcuts */
@ -332,6 +358,9 @@ int handle_shortcut(func id)
case show_finder: case show_finder:
toggle_bar(notebook, _FIND); toggle_bar(notebook, _FIND);
break; break;
case filter:
toggle_bar(notebook, _FILTER);
break;
case finder_next: case finder_next:
webkit_find_controller_search_next(webkit_web_view_get_find_controller(view)); webkit_find_controller_search_next(webkit_web_view_get_find_controller(view));