External plugins that load files may load them using relative paths instead of absolute paths. This enables these plugins to make use of the per-directory document settings feature.
### what's new
* Added logic in `init` to override FocusManager's `onHold` key event.
* Implemented the `CalendarDayView:onHoldNonTouch()` method to handle keyboard-triggered hold events by invoking the `onHold()` method on the currently focused calendar item.
### related issues
* fix#14238
* same as #14252
The `getServerFileName` function could result in a filename without an extension in two main scenarios. First, a server might provide a `content-disposition` header where the `filename` attribute is present but lacks a file extension. Second, the fallback logic of extracting the name from the URL path often fails for dynamic endpoints (e.g., `/download?id=123`) which do not contain a filename.
This change improves the logic by checking if the extracted filename has an extension. If one is missing, the expected `filetype` (which is already known at this point) is appended. This ensures files are always saved with the correct extension (e.g., `.cbz`, `.epub`).
* Ensure the default download filename is consistent across different platforms.
The OPDS plugin correctly uses util.getSafeFilename() to remove any special characters from the filename for downloads. However this function works differently on different platforms, with some common characters like : and ? being allowed on some platforms but not others. In particular this may break Process Sync if it is configured to rely on file names. This change gives a better default behaviour by ensuring the default filename is the same across different platforms, while still letting the user change the filename to include special characters if the platform supports them.
* Make util.replaceAllInvalidChars() global and call it rather than copying code.
This commit enhances the new facet context menu by adding icons for better visual distinction of actions like "Add catalog," "Search," and facet groups.
It also corrects the main menu trigger icon to `appbar.menu` for consistency with its function.
This commit introduces support for OPDS 1.2 facets, enabling advanced filtering and sorting in compatible catalogs.
To maintain a clean and uncluttered book list, facet options are presented in a dedicated context menu. When a catalog provides facets or a search link, the top-left button now triggers a menu with all available actions.
- Facet links are parsed and grouped by the `opds:facetGroup` attribute.
- The context menu includes facet groups, search, and bookmarking.
- Adds support for `opds:activeFacet` and `thr:count`.
- The parsing logic now cleanly separates feed-level links from entries, correctly handling catalogs with facets but no initial items.
- Unrelated style changes were reverted and the test suite was improved for reliability.
When reading `CHUNK_SIZE` characters. Additionally, avoid suboptimal
code (`ffi.string(…)` on the whole buffer followed by `string.sub(…)`
+ concatenation) by using a string buffer.