Compare commits
	
		
			7 Commits
		
	
	
		
			b922d15f98
			...
			9136ab2565
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 9136ab2565 | |||
| 1438d3037a | |||
| fdf688cba2 | |||
| 82584d6a59 | |||
| 5e3cab2a63 | |||
| 2a5f09ce7c | |||
| 7a54b7bd99 | 
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							|  | @ -1,2 +1,3 @@ | |||
| rosenrot | ||||
| # don't save the binary file, as it doesn't play nicely with https://difftastic.wilfred.me.uk | ||||
| webkit/ | ||||
|  |  | |||
							
								
								
									
										2
									
								
								config.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								config.h
									
									
									
									
									
								
							|  | @ -92,6 +92,7 @@ typedef enum { | |||
|     show_finder, | ||||
|     finder_next, | ||||
|     finder_prev, | ||||
|     filter, | ||||
| 
 | ||||
|     halve_window, | ||||
|     rebig_window, | ||||
|  | @ -134,6 +135,7 @@ static struct { | |||
|     { CTRL,        KEY(f),             show_finder          }, | ||||
|     { CTRL,        KEY(n),             finder_next          }, | ||||
|     { CTRL,        KEY(N),             finder_prev          }, | ||||
|     { CTRL,        KEY(F),             filter               }, | ||||
|     { CTRL,        KEY(Up),            halve_window         }, | ||||
|     { CTRL,        KEY(Down),          rebig_window         }, | ||||
|     { CTRL,        KEY(p),             prettify             }, | ||||
|  |  | |||
|  | @ -22,7 +22,7 @@ int libre_redirect(const char* uri, char* output) | |||
|             // "https://google.com",
 | ||||
|             "https://medium.com", | ||||
|             "https://translate.google.com", | ||||
|             // "https://www.bloomberg.com",
 | ||||
|             "https://www.bloomberg.com", | ||||
|             "https://www.royalroad.com", | ||||
|             "https://genius.com", | ||||
|             // "https://twitter.com"
 | ||||
|  | @ -39,7 +39,7 @@ int libre_redirect(const char* uri, char* output) | |||
|             // "https://search.nunosempere.com",
 | ||||
|             "https://scribe.rip", | ||||
|             "https://translate.riverside.rocks", | ||||
|             // "https://archive.ph/https://www.bloomberg.com",
 | ||||
|             "https://archive.ph/https://www.bloomberg.com", | ||||
|             "https://royalread.nunosempere.com", | ||||
|             "https://dumb.vern.cc", | ||||
|             "https://example.com" | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #define STYLE_N 8049 + 1000 | ||||
| #define STYLE_N 9278 + 1000 | ||||
| 
 | ||||
| void read_style_js(char* string) | ||||
| { | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| #pragma once | ||||
| 
 | ||||
| #define STYLE_N 8049 + 1000 | ||||
| #define STYLE_N 9278 + 1000 | ||||
| 
 | ||||
| void read_style_js(char* string); | ||||
|  |  | |||
|  | @ -59,7 +59,8 @@ switch (document.domain) { | |||
| 	case "search.brave.com": | ||||
| 		styles = ` | ||||
|       .download-button, | ||||
|       a[href^="https://brave.com/download/"] { | ||||
|       a[href^="https://brave.com/download/"], .download-cta | ||||
| 			{ | ||||
|         display: none !important;  | ||||
|       } | ||||
|     `;
 | ||||
|  | @ -183,6 +184,8 @@ switch (document.domain) { | |||
|       } | ||||
|     `;
 | ||||
| 		break; | ||||
| 	case "": | ||||
| 		break; | ||||
| 	default: | ||||
| 		console.log(`Domain: ${document.domain}`); | ||||
| 		console.log("No custom style"); | ||||
|  | @ -297,3 +300,47 @@ if (document.domain == "twitter.com" || document.domain == "x.com") { | |||
| } | ||||
| 
 | ||||
| // document.body.style.visibility = "visible";
 | ||||
| 
 | ||||
| // Add some code to filter out articles for Sentinel
 | ||||
| 
 | ||||
| function filterByKeyword(str) { | ||||
| 	// e.g., "keyword" (equivalent to "keyword, p, 1")
 | ||||
| 	// e.g., "keyword, div, 3"
 | ||||
| 	// might not work with level=0, but not sure why
 | ||||
| 	const args = str.split(", "); | ||||
| 	let keword = null; | ||||
| 	let selector = "p"; /* or "*" for all */ | ||||
| 	let level = 1; | ||||
| 	if (args.length > 0) { | ||||
| 		keyword = args[0].trim(); | ||||
| 	} | ||||
| 	if (args.length > 1) { | ||||
| 		selector = args[1].trim(); | ||||
| 	} | ||||
| 	if (args.length > 2) { | ||||
| 		level = Number(args[2].trim()); | ||||
| 	} | ||||
| 	console.log(keyword, selector, level); | ||||
| 	// Get all elements matching the selector
 | ||||
| 	const elements = document.querySelectorAll(selector); | ||||
| 
 | ||||
| 	// Convert NodeList to Array to use array methods
 | ||||
| 	const elementsArray = Array.from(elements); | ||||
| 
 | ||||
| 	// Filter elements containing the keyword
 | ||||
| 	const matchingElements = elementsArray.filter((element) => | ||||
| 		element.textContent.toLowerCase().includes(keyword.toLowerCase()), | ||||
| 	); | ||||
| 
 | ||||
| 	// Remove parent of each matching element
 | ||||
| 	matchingElements.forEach((element) => { | ||||
| 		let ancestor = element; // Start with the current element
 | ||||
| 		// Loop to climb up the DOM tree according to the level required
 | ||||
| 		for (let i = 0; i < level && ancestor !== null; i++) { | ||||
| 			ancestor = ancestor.parentNode; // Move up in the DOM tree
 | ||||
| 		} | ||||
| 		if (ancestor) { | ||||
| 			ancestor.style.display = "none"; | ||||
| 		} | ||||
| 	}); | ||||
| } | ||||
|  |  | |||
							
								
								
									
										41
									
								
								rosenrot4.c
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								rosenrot4.c
									
									
									
									
									
								
							|  | @ -9,7 +9,7 @@ | |||
| /* Global variables */ | ||||
| static GtkNotebook* notebook; | ||||
| static GtkWindow* window; | ||||
| typedef enum { _SEARCH, _FIND, _HIDDEN } Bar_entry_mode; | ||||
| typedef enum { _SEARCH, _FIND, _FILTER, _HIDDEN } Bar_entry_mode; | ||||
| static struct { | ||||
|     GtkHeaderBar* widget; | ||||
|     GtkEntry* line; | ||||
|  | @ -227,6 +227,13 @@ void toggle_bar(GtkNotebook* notebook, Bar_entry_mode mode) | |||
|             gtk_window_set_focus(window, GTK_WIDGET(bar.line)); | ||||
|             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: | ||||
|             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? */ | ||||
| { | ||||
|     WebKitWebView* view = notebook_get_webview(notebook); | ||||
|     if (bar.entry_mode == _SEARCH) | ||||
|         load_uri(view, gtk_entry_buffer_get_text(bar.line_text)); | ||||
|     else if (bar.entry_mode == _FIND) | ||||
|     const char* bar_line_text = gtk_entry_buffer_get_text(bar.line_text); | ||||
|     switch (bar.entry_mode) { | ||||
|         case _SEARCH: { | ||||
|             load_uri(view, bar_line_text); | ||||
|             gtk_widget_set_visible(GTK_WIDGET(bar.widget), 0); | ||||
|             break; | ||||
|         } | ||||
|         case _FIND: { | ||||
|             webkit_find_controller_search( | ||||
|                 webkit_web_view_get_find_controller(view), | ||||
|             gtk_entry_buffer_get_text(bar.line_text), | ||||
|                 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 = "filterByKeyword(\"%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
 | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| /* Shortcuts */ | ||||
|  | @ -332,6 +358,9 @@ int handle_shortcut(func id) | |||
|         case show_finder: | ||||
|             toggle_bar(notebook, _FIND); | ||||
|             break; | ||||
|         case filter: | ||||
|             toggle_bar(notebook, _FILTER); | ||||
|             break; | ||||
| 
 | ||||
|         case finder_next: | ||||
|             webkit_find_controller_search_next(webkit_web_view_get_find_controller(view)); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user