The One with the Thoughts of Frans

Author Archive

KOReader 2021.10 “Seagull”

As one of the maintainers of KOReader, a versatile a document and image viewer, I’m proud to announce the latest release.


koreader-2021-10-seagull-fs8

You can see many seagulls out and about this time of year, often even far inland.

The biggest news this month may well be @zwim‘s new Autowarmth plugin (#8129), which improves on and replaces all prior implementations. In advanced mode, it offers a smorgasbord of customization options, but luckily there’s no need to dive into the nitty gritty of all the different kinds of dusk and dawn. Who knew there were so many!

Logo credit: @bubapet

We’d like to thank all contributors for their efforts. Some highlights since the previous release include:

Full changelogclosed milestone issues

CommentsTags: ,

Web Apps Opera Bork Edition

It’s been 18 years since Opera published their classic bork edition, to protest that MSN would have loaded properly in the browser if only it were served the same code as Internet Explorer.

“Hergee berger snooger bork,” says Mary Lambert, product line manager desktop, Opera Software. “This is a joke. However, we are trying to make an important point. The MSN site is sending Opera users what appear to be intentionally distorted pages. The Bork edition illustrates how browsers could also distort content, as the Bork edition does. The real point here is that the success of the Web depends on software and Web site developers behaving well and rising above corporate rivalry.”

Since I’m a Vivaldi user, today’s the first time I noticed that Chrome on Android artificially restricts installing webpages as apps on the homescreen. Only webpages that specify a manifest.json can receive such a hallowed treatment, instead of every single webpage ever made. For the rest of the internet, there’s only a shortcut. While the situation is not quite comparable, I found the design principle sufficiently distasteful to revive Opera’s classic bork script, in this case specifically targeting the Chrome browser.

You can put it on your website or in your TamperMonkey to remind you when you accidentally open Chrome. The classic result looks like this:

A borked Vivaldi announcement as seen in Chrome.
// http://web.archive.org/web/20050301075735/http://www.opera.com/js/bork/enchefizer.js

/* -*- mode: C++; mode: font-lock; tab-width: 4 -*-
 * 2003-02-10
 *
 * The Enchefizer code is based on a script fetched from 
 *   http://tbrowne.best.vwh.net/chef/
 * written by Andriy Rozeluk , which is
 * based on a Java version written by Josh Vura-Weis
 * , which is based on a UNIX version
 * from 1993 written by John Hagerman  and
 * Jeff Allen 
 *
 * Subsequently hacked by Opera Software to work inside a page by 
 * traversing the DOM tree, and to improve performance. 
 *
 * Typical usage is to add the following text to the bottom of a page:
 *       
 */

const classicOperaBork = () => {
    /* USER CONFIGURATION BEGINS */
    var victim=false;   // false (apply to any page) or regex to match page URL
    //var victim=/^http:\/\/(?:(?:www|msdn).microsoft.com|www.msn.com)/;
    var delay=50;       // ms between replacements, set to 0 to disable waiting
    var units=30;       // number of text nodes to translate each time
    var highlight=true; // highlight the text we're working on
    /* USER CONFIGURATION ENDS */

    var textnodes=[];   // text nodes in the doc
    var nextnode=0;     // next node to process

    function nextWordPos(line)
    {
		var p = line.search(/[ \n\t\\,<.>/?;:\'\"\[{\]}|=+\-_!@#$%^&*()~`]/);
        return p == -1 ? line.length+1 : p;
    }

    function encheferizeLine(line)
    {
		var buff="", word="", t="", out="", wp;

		while(line.length > 0)
		{
			wp = nextWordPos(line);
			word = line.substring(0,wp);
			t = line.charAt(wp);
			line = line.substring(wp+1,line.length);
			out = out + encheferizeWord(word) + t;
		}
		if(t == ".")
		{
	        out = out + "\nBork Bork Bork!";
		}

		return out;
    }

    function encheferizeWord(word)
    {
		if(word.toLowerCase() == "bork") return word;
      
		var letter, count, len, buff, i_seen, isLast;
      
		count=0;
		len=word.length;
		buff=""
		i_seen=false;
      
		while(count0){
               
				} 
			} else if(letter=='t'){
				if(count==len-2 && word.charAt(count+1)=='h'){
					buff = buff + "t";
					count+=2;
					continue;
				} else if(count<=len-3 && word.charAt(count+1)=='h'
						  && word.charAt(count+2)=='e'){
					buff = buff + "zee";
					count+=3;
					continue;
				} 
			} else if(letter=='T' && count<=len-3 && word.charAt(count+1)=='h'
					  && word.charAt(count+2)=='e'){                                                
				buff = buff + "Zee";
				count+=3;
				continue;
			} else if(letter=='v'){
				buff = buff + "f";
				count++;
				continue;
			} else if(letter=='V'){
				buff = buff + "F";
				count++;
				continue;
			} else if(letter=='w'){
				buff = buff + "v";
				count++;
				continue;
			} else if(letter=='W'){
				buff = buff + "V";
				count++;
				continue;
			}
			//End of rules.  Whatever is left stays itself
			buff = buff + letter;
			count++;
		}
		
		return(buff);
    }

    function bork()
    {
		var limit = delay == 0 ? Number.MAX_VALUE : units;
		var start=nextnode;
		var oldc = new Array();
		var n, i, candidate;

		if (highlight)
		{
			for ( n=start, i=0 ; i < limit && n < textnodes.length ; n++, i++ )
			{
				candidate = textnodes[n];
				oldc[i] = candidate.parentNode.style.backgroundColor;
			}

			for ( n=start, i=0 ; i < limit && n < textnodes.length ; n++, i++ )
			{
				candidate = textnodes[n];
				candidate.parentNode.style.backgroundColor = 'red';
			}
		}

		for ( i=0 ; i < limit && nextnode < textnodes.length ; nextnode++, i++ )
		{
			candidate = textnodes[nextnode];
            candidate.replaceData(0,candidate.length,encheferizeLine(candidate.data));
		}

		if (highlight)
		{
			for ( n=start, i=0 ; i < limit && n < textnodes.length ; n++, i++ )
			{
				candidate = textnodes[n];
				candidate.parentNode.style.backgroundColor = oldc[i];
			}
		}

		bork_more();
    }

    function bork_more()
    {
		if (nextnode < textnodes.length)
		{
			setTimeout( bork, delay );
		}
    }

    /* In large docs traversal is a bottleneck at startup; we could
       CPS it or otherwise reify the traversal state to interleave
       traversal with the translation.
	*/
    function find_textnodes(elm, acc)
    {
		if (elm.nodeType == 3)
		{
			if (!elm.data.match(/^[\s\n\r]*$/))
			{
				acc.push(elm);
			}
		}
		else
		{
			var c = elm.childNodes;
			for ( var i=0 ; i < c.length ; i++ )
			{
				find_textnodes(c.item(i),acc);
			}
		}
		return acc;
    }

    /* run page's onload handler, then do our thing */
    var res = false;

    if (typeof old_onload == "function")
	{
		res = old_onload();
	}

    if (/*window == top &&*/ (!victim || window.location.href.match(victim)) )
    {
		textnodes = find_textnodes(document.body, new Array());
		nextnode=0;
		bork_more();
    }
    return res;
}
if (window.navigator.userAgentData.brands.filter(e => e.brand === 'Google Chrome').length > 0) {
    document.addEventListener('DOMContentLoaded', classicOperaBork);
}

CommentsTags:

KOReader 2021.09 “September Cheese”

As one of the maintainers of KOReader, a versatile a document and image viewer, I’m proud to announce the latest release.


133938026-bd5bea2c-6af1-4513-a76c-e875d6b46c71-fs8

Traditionally, September cheese is made in — you guessed it — September. This is when the grass and milk are at their best. We hope this release won’t take as long to ripen though.

This month the keyboard sports a new coat of paint (#8089), and crengine (the EPUB renderer) has received various improvements (#8165, #8197).

The Evernote plugin has been deprecated due to changes in the Evernote API. It has been replaced by the more generically named Exporter plugin, which supports Joplin, HTML, and plain text export (#7983).

Logo credit: @bubapet

We’d like to thank all contributors for their efforts. Some highlights since the previous release include:

  • WebDAV: Handle non-self-closing tag for empty collection (#8121) @johnbeard
  • Kindle: don’t kill kb service on start (#8122) @hius07
  • [plugin] Change OPDS filetype algorithm to extension first, mimetype second (#8115) @Frenzie
  • VirtualKeyboard: redesign and enhancements (#8089) @MoreFoxBeans @mergen3107
    • Virtual keyboard: default layout, compact mode (#8142) @hius07
    • Keyboard preferred layouts: usability fixes (#8159) @hius07
  • [UX] HE keyboard: Use updated symbols from new layout (#8131) @yparitcher
  • Various WebDAV fixes (#8121, #8137, #8138) @johnbeard
  • [plugin] Exporter plugin without evernote (#7983) @pazos
  • Paged documents can now be controlled through Dispatcher (#7671) @yparitcher
  • calibre: gui to choose default extension (#8146) @pazos
  • crengine: support for ‘box-sizing’, and other fixes (#8165) @poire-z
    Includes among others:
    • (Upstream) Various CHM handling fixes, and others
    • HTML documents: rebuild TOC from headings after load
    • Font: use metrics for underline offset and thickness
    • epub.css, html5.css: tweak ruby styling
    • CSS: fix EPUB’s head>style content encoding
    • CSS: add support for ‘box-sizing: content-box/border-box’
    • CSS: support for styling the element
      Also bump KoboUSBMS to v1.2.2 and FBInk to v1.24.0.
      ReaderFont’s “Generate font test document”: update the generated HTML so its ToC is build from proper HTML headings.
  • Footer: add Warmth as footer item (#8060) @zwim
  • Style tweaks: add a few ruby specific tweaks (#8189) @poire-z @davidvelosa
  • crengine: CSS: parse/skip at-rules (#8197) @poire-z
  • Readersearch: add button to recall search input dialog (#8190) @hius07
  • Add passwordless wifi support (#8196) @Mel-kior
  • Fix OPDS plugin bug wherein Arxiv PDF document acquisition URLs are not given a callback to download (#8210) @roygbyte
  • [plugin] NewsDownloader: fix XML, better error messages, change default feed, and more (#8145) @roygbyte
  • Dispatcher: Revamp sections and item order (#8200) @yparitcher

Full changelogclosed milestone issues

CommentsTags: ,

PipeWire on Ubuntu 21.10

On Debian 11 and Ubuntu 21.04, you can use the Debian wiki to get a basic setup working, but adapting that to newer version is a bit laborious. Instead a kind soul has already taken care of everything over at pipewire-debian. It’s also a more recent version.

So why use it? In my case, I’ve had PulseAudio crap out when having to deal with more over 20 or so things at once. PipeWire deals with load rather significantly better. I understand latency’s much better too, but that’s never bothered me too much for my fairly regular uses. What’s nice though, is that you can use JACK tools like catia to map stuff around. I don’t think PA had any graphical tools like that, and cryptic command-line commands are too much of a bother for quick one-offs. For the moment I mildly miss PulseAudio’s networking ability.

In short, I’ve switched over my laptops. But I might give it a try on my desktop too.

CommentsTags: , ,

KOReader 2021.08 “Fall Weather”

As one of the maintainers of KOReader, a versatile a document and image viewer, I’m proud to announce the latest release.


koreader-logo

We now have a user guide thanks to @offset-torque‘s hard work. This should make it easier for new users to find their way across the program’s features.

Starting with 2021.08, the Kobo Elipsa is supported (#7986, #8004, #8057).

The zsync plugin has been unmaintained for a long time, so it’s now been deprecated (#7957).

We’d like to thank all contributors for their efforts. Some highlights since the previous release include:

Full changelogclosed milestone issues

CommentsTags: ,

Put Save Dialog Buttons Back at the Bottom on Debian 11 Xfce 4.16

Apparently action buttons have moved to the top now, even though people scan from the top left to the bottom right?
xfconf-query -c xsettings -p /Gtk/DialogsUseHeader -s false

CommentsTags:

KOReader 2021.05 “Yellow Daffodil”

As one of the maintainers of KOReader, a versatile a document and image viewer, I’m proud to announce the latest release.


koreader-fs8

It was a nice spring month with a great quantity of smaller bug fixes, but nothing huge. In other news, there’s a new contrib repository that can more freely accept most user plugin submissions regardless whether we think it fits in with the rest of the program. Please see the README over there for more information.

Image credit: Daffodil, Harmsworth’s Universal Encyclopedia, 1900

We’d like to thank all contributors for their efforts. Some highlights since the previous release include:

  • [plugin] Add a caching mechanism for CoverImage (#7510) @zwim
  • Gestures: Allow disabling tap and/or swipes for page turns (#7572) @gbyl
  • PocketBook: Workaround platform shenanigans when aplying an OTA (#7585) @NiLuJe
  • CloudStorage (FTP): Do not buffer entire download in memory (#7597) @null-dev
  • Dispatcher: add “Toggle status bar” action (#7606) @hius07
  • bump crengine: more granular font weights (#7616) @poire-z
  • Kindle: Enable AutoSuspend plugin (#7612) @NiLuJe
  • FM/RD lifecycle cleanup; Cache revamp; unbreak AutoSuspend (#7624) @NiLuJe
  • DropboxAPI: Handle pagination (#7621) @reuning
  • android: Prompt for install updates when they’re downloaded (#7632, #7649, #7657) @pazos
  • [chore] Move SDL check to the end of Device’s probe function (#7682) @pazos
  • InputDialog: add ‘Go to line’ button (#7673) @hius07

Full changelogclosed milestone issues

CommentsTags: ,

KOReader 2021.04 “Gouty Gauss”

As one of the maintainers of KOReader, a versatile a document and image viewer, I’m proud to announce the latest release.


koreader-gaussian-fs8

In a big step forward, this month @poire-z decided to add MathML support! In short, that means we can now read ourselves about Gaussian math in KOReader the way it was meant to be (#7465).

We now do multitouch on the H2O, exciting times. I must admit I couldn’t quite figure it out back in 2014 myself.

We’d like to thank all contributors for their efforts. Some highlights since the previous release include:

  • Standardize directory/folder to folder (#7410) @hius07
  • PdfDocument: Unbreak highlights (#7457) @NiLuJe
  • Rotation icons: make ’em dynamic. (#7440) @NiLuJe
  • The great Input/GestureDetector/TimeVal spring cleanup (a.k.a., a saner main loop) (#7415) @NiLuJe
  • Kindle: Fix gyro events on Zelda (#7459) @NiLuJe
  • crengine: add support for MathML (#7465) @poire-z
  • ReaderZooming: Fix defaults handling (#7463) @NiLuJe
  • Add DBNL footnotes styletweak (#7467) @Frenzie
  • Text editor: option to show/hide keyboard on start (#7460) @hius07
  • Fulltext search: show notification when nothing found (#7436) @hius07
  • Standardize search/find to search (#7398) @hius07
  • Search dialogs: don’t close when nothing entered (#7501) @hius07
  • Input: Process input events in batches (#7483) @NiLuJe
  • Inputtext: don’t allow the cursor to move within a hint (#7507) @hius07
  • remarkable FW 2.6: use explicit busybox for ‘sync’ (#7509) @gbyl
  • FileManager: Hold the “+” button to refresh content (#7559) @hius07
  • FileManager: Also refresh content when tapping the “Home” button (#7564) @gbyl
  • Style tweaks: add links italic style (#7567) @hius07
  • ReaderToc: Unbreak ToC depth detection (#7569) @NiLuJe

Full changelogclosed milestone issues

CommentsTags: ,

KOReader 2021.03 “Magnificent Mullet”

As one of the maintainers of KOReader, a versatile a document and image viewer, I’m proud to announce the latest release.


koreader-2021 03-magnificent-mullet-fs8

There have been many behind the scenes code cleanups and speed improvements, but the one thing that stood out most to me personally was the new show QR code plugin (#7310) contributed by @AntonLee. It’s perfect to quickly check out an external link on your phone.

Image credit: “The Fisheries and Fisheries Industries of the United States”, by George Brown Goode (1887). Via.

We’d like to thank all contributors for their efforts. Some highlights since the previous release include:

  • Switch ConfigDialog’s rotation toggle to custom icons (#7306) @NiLuJe
  • Revamp flash_ui handling, once more, with feeling 😉 (#7262) @NiLuJe
  • History: avoid opening non-existent files (#7280) @poire-z
  • TOC settings: add bind chapter navigation/titles to ticks (#7280) @poire-z
  • SkimToWidget: remove title bar, add bookmark button (#7280) @poire-z
  • Goto dialog: use “Go to Page” also with CreDocuments (#7280) @poire-z
  • Bookmarks dogear: fix position with CRe top status bar (#7312) @poire-z
  • When displaying a date (as opposed to a time), pad the hour with blanks if necessary in order to get a consistent alignment (#7322) @NiLuJe
  • CoverBrowser: list mode: limit font size of components (#7324) @poire-z
  • flash_ui: Workaround potential EPDC races (#7332) @NiLuJe
  • Legacy Kindle: Actually handle (system) power events (#7336) @NiLuJe
  • TOC: expand to show all chapters on current page (#7339) @poire-z
  • Kindle: Unbreak Zelda/Rex (#7341) @NiLuJe
  • crengine: CSS line-break/word-break, various fixes (#7342) @poire-z
  • External link: adds “Show QR code” (#7310) @AntonLee
  • Add Bulgarian keyboard layout (#7367) @josdion
  • OPDS: Parse Open Search Definition for feeds that support it (#7380) @ajvpot
  • reMarkable 2 clean wakeup from sleep (#7345) @snelg
  • SkimToWidget: swap ‘1’ and ’10’ buttons (#7408) @hius07
  • Unbreak HTTP authentication in WebDAV (#7425) @johnbeard
  • Update PDF annotations when changing bookmark text (#7411) @Toromtomtom
  • TOC settings: fix ticks disappearing (#7443) @poire-z
  • Initial KOA3 support (#7446) @NiLuJe

Full changelogclosed milestone issues

CommentsTags: ,

KOReader 2021.01 “Magnetic Flux”

As one of the maintainers of KOReader, a versatile a document and image viewer, I’m proud to announce the latest release.


koreader-logo-magnetic-field-fs8

It’s a new year, so we got ourselves a new haircut (#6937). A big thanks to @johnbeard for the effort! Here are a couple of screenshots of the new icons to whet your appetite.

The dictionary will now be significantly faster on dictionaries with synonyms (#7068).

The quite active reMarkable community has added initial support for the reMarkable 2 (#6992, #7066, #7065, #7122). Please keep in mind that it’s still in an early state and installation instructions on the KOReader wiki may not yet be fully updated either (see here).

Finally, book thumbnails will now load faster (after initial caching) thanks to ZSTD, although I never thought they were particularly slow in the first place (#6976).

Image credit: Magnetic field produced by current flow

We’d like to thank all contributors for their efforts. Some highlights since the previous release include:

  • kodev: Use getopt instead of a hand-rolled hack (#6980) @NiLuJe
  • remarkable2 support (#6992) @ddvk
  • BookInfoManager: Convert thumbnail compression to ZSTD (and many more behind the screens improvements) (#6976) @NiLuJe
  • Radius corners of more boxes (#6997) @johnbeard
  • Add MaterialDesignLight SVG icons (#6937) @johnbeard
  • Update UI layout code to use new SVG icons (#6977, #7019) @poire-z
  • Implement proper alpha-blending of SVG icons (#7011) @NiLuJe
  • Fix y origin of the configmenu extended tapzone (#7015) @NiLuJe
  • NetworkManager: Slightly more accurate wifi strength icons (#7020) @NiLuJe
  • Revert ManyBooks and Flibusta to HTTP (#7031) @Frenzie
    The OPDS servers for ManyBooks and Flibusta don’t actually have proper HTTPS support.
  • OPDSBrowser: Update the title during navigation (#7034) @NiLuJe
  • rM: Switch to plain dumb sleep during the crash screen (#7038) @NiLuJe
  • rM: Unbreak PowerEvents (#7043) @NiLuJe
  • Add fall back to text selection option to panel zoom (#6960) @Galunid
  • OPDS: Inform and warn about downgrade attack (#7032) @Frenzie
  • htmlToPlainText(): Format paragraphs with indentation (#7027, #7095) @Frenzie @poire-z
  • Quickstart: add long press sets default (#7048) @yparitcher
  • UI: Make button radius match default window radius (#7054) @johnbeard
  • bump sdcv for fast synonym search (#7068) @pazos
  • Time-adjust on all reMarkable events, not just EV_ABS (#7066) @snelg
  • Fix double-pressing reMarkable 2 power button twice to wake up (#7065) @snelg
  • UI: Clicking menu icon returns to top of menu (#7074) @johnbeard
  • Keyboard input in InputText (#7037) @johnbeard
    On desktop builds, you’ll now be able to use your regular keyboard in input fields.
  • Footer: add “Pages left in book” as footer item (#7047) @JasonInOttawa
  • LuaJIT on Android fixes (#7094) @NiLuJe
    KOReader depends on just-in-time compilation (JIT) provided by LuaJIT to be fast. A small minority of Android devices isn’t too fond of that, so on Android JIT has always been disabled in various parts of the program. With any luck you’ll notice the difference.
  • Dict/Wiki lookup: less text cleanup on manual input (#7099) @poire-z
  • DictQuickLookup: hold prev/next buttons go to first/last result (#7099) @poire-z
  • CRE: allow both Top/Bottom margins fine tuning (#7104) @poire-z
  • Legacy Kindle: Unbreak screensavers (#7112) @NiLuJe
  • add noop callback to cache size to prevent artifacts (#7106) @yparitcher
  • reader.lua: rework file/directory argument handling. (#7053) @yparitcher
  • Add menu to configure the top/alt status bar in crengine (#7107) @zwim
  • Add deprecation messages to plugins (#7101) @pazos
  • Dispatcher: update document.configurable (#7116) @yparitcher
  • Save rotation across restarts (#7096) @yparitcher
  • show AltStatusBar when changing the font size (#7119) @zwim
  • Revamp “flash_ui” handling (#7118) @NiLuJe
  • [UX] Footer: add prefix option “Compact items” (#7127) @JasonInOttawa
  • add table persistence module (#7120) @pazos
  • bump crengine: parsing, lists, 2-pages mode fixes & tweaks (#7138) @poire-z
  • Mark calibrecompanion plugin as obsolete (#7147) @pazos
  • Address assorted Weblate comments (#7154) @Frenzie
  • [reMarkable] Don’t need to keep attempting WiFi connection after success (#7121) @snelg
  • [feat] Support mimetypes in DocumentRegistry:hasProvider() (#7155) @Frenzie
  • [feat] Add skimming support for Non-Touch devices (#7163) @rezaarifandee

Full changelogclosed milestone issues

CommentsTags: ,

Older Entries »