| 1f443476 | 16-Apr-2026 |
Andreas Gohr <andi@splitbrain.org> |
split Formatting into individual classes per formatting type
Introduce AbstractFormatting as a base class and seven concrete classes (Strong, Emphasis, Underline, Monospace, Subscript, Superscript,
split Formatting into individual classes per formatting type
Introduce AbstractFormatting as a base class and seven concrete classes (Strong, Emphasis, Underline, Monospace, Subscript, Superscript, Deleted) that each define their own patterns and sort order. Delete the old Formatting class and update tests to use the new classes directly. ModeRegistry now treats formatting modes as regular built-in modes.
show more ...
|
| c8dd1b9d | 16-Apr-2026 |
Andreas Gohr <andi@splitbrain.org> |
introduce ModeRegistry to encapsulate parser mode categories
Replace the global $PARSER_MODES definition in inc/parser/parser.php with a ModeRegistry singleton that initializes and manages the mode
introduce ModeRegistry to encapsulate parser mode categories
Replace the global $PARSER_MODES definition in inc/parser/parser.php with a ModeRegistry singleton that initializes and manages the mode categories. The global array is still populated for backward compatibility with plugins that access it directly.
Mode constructors now use ModeRegistry::getModesForCategories() instead of accessing the global directly. p_get_parsermodes() and p_sort_modes() are moved to inc/deprecated.php as thin wrappers.
show more ...
|
| 8c5fa126 | 16-Apr-2026 |
Andreas Gohr <gohr@cosmocode.de> |
deduplicate finalise() across rewriter subclasses
Move the identical finalise() logic into AbstractRewriter with an abstract getClosingCall() method. Lists, Quote, Table, Preformatted and Nest each
deduplicate finalise() across rewriter subclasses
Move the identical finalise() logic into AbstractRewriter with an abstract getClosingCall() method. Lists, Quote, Table, Preformatted and Nest each provide their closing call name instead of duplicating the full method.
show more ...
|
| 57d61403 | 16-Apr-2026 |
Andreas Gohr <gohr@cosmocode.de> |
remove unused Doku_Handler::fetch() method
Confirmed zero callers in core and plugin ecosystem. |
| 8ab4ec30 | 16-Apr-2026 |
Andreas Gohr <gohr@cosmocode.de> |
remove dead ParallelRegex::apply() method
Remove apply() which was never called from production code. Rewrite the inherited SimpleTest tests to use split() instead, and add a test for pre/post-match
remove dead ParallelRegex::apply() method
Remove apply() which was never called from production code. Rewrite the inherited SimpleTest tests to use split() instead, and add a test for pre/post-match splitting.
show more ...
|
| f8026da1 | 16-Apr-2026 |
Andreas Gohr <gohr@cosmocode.de> |
replace magic strings with class constants in Lexer
Introduce MODE_EXIT and MODE_SPECIAL_PREFIX constants to replace the undocumented "__exit" and "_" string conventions used for mode transitions. |
| b929bbff | 15-Apr-2026 |
Vyacheslav <bryanskmap@ya.ru> |
Translation update (ru) |
| fe6048cc | 14-Apr-2026 |
Alexander Lehmann <alexlehm@gmail.com> |
remove realip option, add default in conf/dokuwiki.php |
| bfc167db | 11-Apr-2026 |
Andreas Gohr <andi@splitbrain.org> |
Limit namespace depth in io_createNamespace() #4613
Throw a RuntimeException when the given ID contains 128 or more colon-separated segments, preventing creation of excessively deep directory hierar
Limit namespace depth in io_createNamespace() #4613
Throw a RuntimeException when the given ID contains 128 or more colon-separated segments, preventing creation of excessively deep directory hierarchies.
show more ...
|
| 743a6908 | 11-Apr-2026 |
splitbrain <86426+splitbrain@users.noreply.github.com> |
Rector and PHPCS fixes |
| 867da04d | 11-Apr-2026 |
Andreas Gohr <andi@splitbrain.org> |
Less ubiquitous feed caching. addresses #4574
Instead of creating caches for each and every requested feed, only the recent feed is still cached.
The number of items is clamped to conf[recent]*5.
Less ubiquitous feed caching. addresses #4574
Instead of creating caches for each and every requested feed, only the recent feed is still cached.
The number of items is clamped to conf[recent]*5.
Plugins can influence the caching behavior via the existing FEED_OPTS_POSTPROCESS event by setting cache_allow to true and optionally adding their own cache key in cache_key
Additionally the per-namespace feed autodiscovery link from <head> pointing to list-mode feeds has been removed.
show more ...
|
| b7c3b74a | 02-Oct-2025 |
Anna Dabrowska <dabrowska@cosmocode.de> |
Add copy-to-clipboard functionality to code blocks |
| 06053dca | 10-Apr-2026 |
Andreas Gohr <andi@splitbrain.org> |
SearchIndex: remove write side effect from retrieveRow()
retrieveRow() padded the index file when the requested RID was beyond the current length. This was an optimization for subsequent changeRow()
SearchIndex: remove write side effect from retrieveRow()
retrieveRow() padded the index file when the requested RID was beyond the current length. This was an optimization for subsequent changeRow() calls, but changeRow() already handles padding on its own. The side effect was also inconsistent with retrieveRows() which is a pure read.
Added a cross-index integration test verifying RID consistency across entity, token, frequency and reverse indexes when multiple entities share tokens.
show more ...
|
| 1e5f7f1f | 10-Apr-2026 |
Andreas Gohr <andi@splitbrain.org> |
Manifest: add UTF-8 to entity decoding
As recommended in the PHP manual |
| 6beb5edc | 10-Apr-2026 |
Andreas Gohr <andi@splitbrain.org> |
add gzfile_get_contents() to handle multi-stream gz and corruption
The initial gzdecode() fix only decoded the first gzip stream, breaking append mode where gzopen() creates concatenated streams.
R
add gzfile_get_contents() to handle multi-stream gz and corruption
The initial gzdecode() fix only decoded the first gzip stream, breaking append mode where gzopen() creates concatenated streams.
Replace with a chunk-based reader using inflate_* functions that loops through all streams and still correctly detects corrupt data.
show more ...
|
| 3b335c64 | 10-Apr-2026 |
Andreas Gohr <andi@splitbrain.org> |
use gzdecode instead of gzfile to work around PHP 8.5.3+ regression
gzfile() no longer detects corrupt gzip data due to a bug in PHP's zlib stream wrapper (php/php-src#21376). Using file_get_content
use gzdecode instead of gzfile to work around PHP 8.5.3+ regression
gzfile() no longer detects corrupt gzip data due to a bug in PHP's zlib stream wrapper (php/php-src#21376). Using file_get_contents() with gzdecode() avoids the stream wrapper and correctly returns false for corrupt files.
show more ...
|
| c553d38d | 08-Apr-2026 |
Andreas Gohr <andi@splitbrain.org> |
SearchIndex: fix TypeError when $QUERY global is null
QueryParser::convert() requires a string argument, but the global $QUERY can be null. Coalesce to empty string to match prior behavior. |
| 9313ce6d | 08-Apr-2026 |
Andreas Gohr <andi@splitbrain.org> |
SearchIndex: fix TypeError when $highlight is passed uninitialized
FulltextSearch::pageSearch() type-hints $highlight as array, but callers passed uninitialized variables (null). Initialize to [] at
SearchIndex: fix TypeError when $highlight is passed uninitialized
FulltextSearch::pageSearch() type-hints $highlight as array, but callers passed uninitialized variables (null). Initialize to [] at all call sites and add a guard in the deprecated ft_pageSearch() wrapper.
show more ...
|
| 5d034a75 | 08-Apr-2026 |
Andreas Gohr <andi@splitbrain.org> |
SearchIndex: increase index version |
| 9369b4a9 | 08-Apr-2026 |
Andreas Gohr <andi@splitbrain.org> |
SearchIndex: rector, phpcs, type hint fixes |
| db8be586 | 08-Apr-2026 |
Andreas Gohr <andi@splitbrain.org> |
SearchIndex: review fixes — auto-save MemoryIndex, cast TupleOps counts, style cleanups
- MemoryIndex: auto-save dirty data on unlock/destruction to prevent silent index corruption when indexes ar
SearchIndex: review fixes — auto-save MemoryIndex, cast TupleOps counts, style cleanups
- MemoryIndex: auto-save dirty data on unlock/destruction to prevent silent index corruption when indexes are used in tandem - TupleOps::parseTuples(): cast exploded count strings to int - FileIndex::retrieveRow(): document the write-on-read padding behavior - Fix whitespace issues in ApiCore, common.php, Sitemap/Mapper - Update concept.txt to reflect MemoryIndex auto-save behavior
show more ...
|
| 2a22d4b9 | 08-Apr-2026 |
Andreas Gohr <andi@splitbrain.org> |
SearchIndex: document Tokenizer::isValidSearchTerm() in concept.txt |
| 1148921d | 08-Apr-2026 |
Andreas Gohr <andi@splitbrain.org> |
SearchIndex: unify CollectionSearch API and optimize search pipeline
- Remove separate lookup() API from CollectionSearch. All searches now use addTerm()/execute() with a single unified pipeline.
SearchIndex: unify CollectionSearch API and optimize search pipeline
- Remove separate lookup() API from CollectionSearch. All searches now use addTerm()/execute() with a single unified pipeline. - Add matches() predicate to Term using efficient string functions (===, str_starts_with, str_ends_with, str_contains) instead of regex. - Add caseInsensitive() support on CollectionSearch and Term for metadata/title searches where indexed values preserve case. - Remove callback support from MetadataSearch::lookupKey() — the only real usage (case-insensitive substring) is replaced by caseInsensitive() + wildcards. - Remove min-length validation from Term. Add Tokenizer::isValidSearchTerm() for callers that need it (FulltextSearch, Indexer::lookup). - Optimize execute() from 4 group passes to 2: scan tokens + resolve frequencies in one pass per group, batch entity name resolution, then populate Terms. - Store full match detail in Term: entity → token → frequency. New accessors getMatches(), getEntityTokens(), getEntityFrequencies() derive different views from this single data structure. - Term no longer used as scratch pad by CollectionSearch. Index-internal data (token IDs, entity IDs) stays local to execute(). Terms receive only final resolved results. - Use title from search results in MetadataSearch::pageLookupCallBack() instead of re-fetching via p_get_first_heading(). - Update concept.txt documentation.
show more ...
|
| b9d7a615 | 07-Apr-2026 |
Andreas Gohr <andi@splitbrain.org> |
SearchIndex: updated documentation
to be moved into the wiki later |
| 0b52f0de | 07-Apr-2026 |
Andreas Gohr <andi@splitbrain.org> |
SearchIndex: use FileIndex for title token index
PageTitleCollection accesses titles by RID (one line at a time), so loading the entire index into memory is wasteful. Override getTokenIndex() to ret
SearchIndex: use FileIndex for title token index
PageTitleCollection accesses titles by RID (one line at a time), so loading the entire index into memory is wasteful. Override getTokenIndex() to return a FileIndex, matching the line-by-line access pattern used on master.
show more ...
|