| #
21d6f176
|
| 05-Jul-2026 |
Andreas Gohr <andi@splitbrain.org> |
fix(parser): restore BC for manual Handler/Parser construction
The parser rework made ModeRegistry a required constructor argument on Handler and Parser and dropped the Doku_Parser class alias, brea
fix(parser): restore BC for manual Handler/Parser construction
The parser rework made ModeRegistry a required constructor argument on Handler and Parser and dropped the Doku_Parser class alias, breaking the long-documented manual sub-parsing pattern used by many plugins (new Doku_Handler(); new Parser($handler); ...): both threw ArgumentCountError and new Doku_Parser() fatalled as an unknown class.
Default the ModeRegistry argument on both constructors: Handler builds a registry for the configured syntax, Parser takes it from the handler. Re-add the Doku_Parser alias. Constructing without a registry emits a deprecation pointing at p_get_instructions().
show more ...
|
| #
47a02a10
|
| 04-Jun-2026 |
Andreas Gohr <gohr@cosmocode.de> |
Parsing: make parse syntax a per-parse value, drop ModeInterface
The active parse's syntax flavour is a per-parse question, not process- global state: within a single request a plugin can render bun
Parsing: make parse syntax a per-parse value, drop ModeInterface
The active parse's syntax flavour is a per-parse question, not process- global state: within a single request a plugin can render bundled DokuWiki-syntax text inside an otherwise-Markdown page. Yet ModeRegistry was a singleton that read $conf['syntax'] and the $PARSER_MODES global, and every mode reached it through ModeRegistry::getInstance() — so the flavour lived in shared mutable state that two parses in one request would fight over.
Make the registry a short-lived value instead:
- ModeRegistry is constructed once per parse with an explicit $syntax and injected into Parser, Handler and every mode. getSyntax() / isDwPreferred() / isMdPreferred() consult $this->syntax; the DOKU_UNITTEST-gated mode-list cache hack is gone (each registry is fresh, nothing to invalidate). - p_get_instructions() is now the single place in the pipeline where $conf['syntax'] is read; from there the flavour travels as a parameter. No code under inc/Parsing/ reads $conf['syntax'] directly anymore — the five syntax-reading modes (Preformatted, GfmHr, GfmEscape, Externallink, GfmQuote) route through $this->registry.
Keep the two concepts apart, as documented in the ModeRegistry and AbstractMode docblocks: the user's configured *preference* stays in $conf['syntax'] for UI code (toolbar, settings), while the active parse's syntax is a parameter carried by the registry.
$PARSER_MODES is demoted to a deprecated, read-only mirror, published during loadPluginModes() — third-party syntax plugins (columnlist, alphalist2, phpwikify, skipentity) and the bundled info plugin read the global directly, often from their constructors, so the taxonomy must stay visible there. No core code reads the mirror.
Fold ModeInterface into AbstractMode while here: getSort()/handle() are abstract, the connect callbacks carry defaults, and the public $Lexer "FIXME should be done by setter" becomes setLexer()/getLexer() injected by Parser::addMode() alongside the registry. Nested-content resolution moves to the allowedCategories()/filterAllowedModes() hooks, resolved once when the registry is attached.
Tests build their own parser/registry through ParserTestBase::setSyntax() instead of mutating $conf and calling the removed ModeRegistry::reset().
show more ...
|
| #
9172eccf
|
| 28-Apr-2026 |
Andreas Gohr <andi@splitbrain.org> |
add sub-parser support to Handler / Parser / ModeRegistry
A block mode that wants to parse the body of one of its captured matches needs a second Parser instance configured with the active modes min
add sub-parser support to Handler / Parser / ModeRegistry
A block mode that wants to parse the body of one of its captured matches needs a second Parser instance configured with the active modes minus whatever would re-enter the outer mode. Doing this by hand is verbose and easy to get wrong — modes hold a $Lexer slot that addMode() overwrites, so the same mode object can't be shared between the main parser and a sub-parser.
Three small additions:
Handler::reset() — clears calls, status, currentModeName, and installs a fresh CallWriter. Lets one Handler instance be parsed against repeatedly without state bleed.
Parser::getHandler() — accessor; sub-parser callers need it to reach the handler for reset() and for harvesting the produced call list.
ModeRegistry::getSubParser($excludeCategories, $excludeModes) — returns a cached Parser preconfigured with every active mode except those excluded. Mode objects are cloned before being attached so connectTo()'s assignment to $Lexer does not clobber the main parser's references. Cache key is the exclusion-set; default exclusion is CATEGORY_BASEONLY (no Header inside the sub-parsed content).
Tests cover Handler::reset's full clear, sub-parser caching, default and custom exclusions, registry-reset propagation, and the clone-not-share invariant for $Lexer.
show more ...
|
| #
71096e46
|
| 18-Apr-2026 |
Andreas Gohr <andi@splitbrain.org> |
move handler methods into ParserMode classes and rename Handler
Each ParserMode class now implements handle() from ModeInterface, containing the token handling logic that previously lived as individ
move handler methods into ParserMode classes and rename Handler
Each ParserMode class now implements handle() from ModeInterface, containing the token handling logic that previously lived as individual methods on Doku_Handler.
The Handler class (formerly Doku_Handler) is the single dispatch point: Lexer passes tokens to Handler::handleToken() which routes to mode objects, plugins, or returns false. The Lexer only tokenizes and resolves mapHandler aliases.
Key changes: - Add handle() to ModeInterface, implemented by all mode classes - Move Doku_Handler to dokuwiki\Parsing\Handler namespace - File extends Code (shared parsing via $type property) - Quotes uses mapHandler() + Handler::getModeName() for sub-modes - Media::parseMedia() replaces Doku_Handler_Parse_Media() - Code::parseHighlightOptions() replaces parse_highlight_options() - Per-parse state (footnote, doublequote) stays on Handler - Deprecated wrappers kept for base/header/internallink/media - Class alias and rector rules added for backward compatibility
show more ...
|
| #
7958e698
|
| 16-Apr-2026 |
Andreas Gohr <andi@splitbrain.org> |
decouple hardcoded mode names in Eol and Preformatted
Eol.php hardcoded ['listblock', 'table'] as modes to skip, and Preformatted.php hardcoded [\*\-] as a negative lookahead for list markers. Both
decouple hardcoded mode names in Eol and Preformatted
Eol.php hardcoded ['listblock', 'table'] as modes to skip, and Preformatted.php hardcoded [\*\-] as a negative lookahead for list markers. Both embed knowledge that belongs to the respective block modes, not to Eol/Preformatted. Adding a new block mode that handles its own EOL or uses different line start markers would require editing these unrelated files — a hidden coupling.
Listblock and Table now register themselves on ModeRegistry during preConnect(). Eol queries getBlockEolModes() and Preformatted queries getLineStartMarkers() to build its lookahead dynamically. Each mode owns its own data, and new block modes can participate without touching unrelated files.
show more ...
|
| #
093fe67e
|
| 07-Mar-2026 |
Andreas Gohr <andi@splitbrain.org> |
updated rector and applied it
|
| #
d4f83172
|
| 31-Aug-2023 |
Andreas Gohr <andi@splitbrain.org> |
code style: line breaks
|
| #
177d6836
|
| 31-Aug-2023 |
Andreas Gohr <andi@splitbrain.org> |
coding style: control flow whitespaces
|
| #
d868eb89
|
| 30-Aug-2023 |
Andreas Gohr <andi@splitbrain.org> |
codestyle adjustments: function declaration braces/spaces
|
| #
8c7c53b0
|
| 30-Aug-2023 |
Andreas Gohr <andi@splitbrain.org> |
codestyle adjustments: class declaration braces
|
| #
bcaec9f4
|
| 29-Aug-2023 |
Andreas Gohr <andi@splitbrain.org> |
Apply rector fixes to inc/Parsing
|
| #
1b008e87
|
| 14-Jan-2020 |
Michael Große <mic.grosse@googlemail.com> |
Restore some backwards compatibility for injected handlers
Some plugins, for example the move plugin, use their own handler class. We need to give these plugins time to adjust their code.
This shou
Restore some backwards compatibility for injected handlers
Some plugins, for example the move plugin, use their own handler class. We need to give these plugins time to adjust their code.
This should restore the functionality of the move plugin. We still need to extract the handler class itself.
It also adds another debug method for triggering the deprecation event, since none of the two existing methods are suitable here. This dbgCustomDeprecationEvent method should be used sparingly and only where the other two don't work.
Co-authored-by: Phy <git@phy25.com>
show more ...
|
| #
d4d8fb18
|
| 04-May-2018 |
Andreas Gohr <andi@splitbrain.org> |
moved Parser to Parsing namespace
|