ToDo R6.3 📌

2

R 6.3

Roadmap
dev repo
ChangeLog
Diff:6.3.1...master – Diff since last release


Version 6.3 focuses on two main improvements: modernizing WikiEdit and preparing the code base for refactoring.

  1. WackoFormatter
    • special cases
    • missing cases
    • quirks
    • Unit tests
    • move formatter in own repo (but constraints)
  2. Markup conversion (JS + PHP API)

1. PHP

  1. https://php.watch/articles/php-regex-readability

1.1. PHP 8.5

  1. https://php.watch/versions/8.5
  2. https://www.php.net/releases/8.5/en.php
  3. https://getrector.com/find-rul[...]rectorSet=php-php-85
  4. https://wiki.php.net/rfc/url_parsing_api

Requires at least PHP 8.4 to fix:

  • PHP Deprecated: Method PDO::sqliteCreateFunction() is deprecated since 8.5, use Pdo\\Sqlite::createFunction() instead

2. Features

  • customizable secondary navigation (Menu) out of the box apart from the so called bookmarks
  • add option to set font root size (small – standard – big) (0.875rem -> 1rem -> 1.25rem)
    • What makes this so ambivalent is that we all use different devices with various resolutions and may also adjust the viewport (e.g. scaling to 125% in the desktop environment or the browser).
    • designer control / user agency

3. Core

  1. check: when it writes a page it no longer seems to delete the cached version of this page (fix if so – or is this a web proxy issue?)
  2. Mitigate PHP Fatal error: Uncaught Error: Undefined constant “MYSQLI_REPORT_OFF” in /wiki/class/dbmysqli.php:19 – can happen when user switching stack with existing config -> Show : The MySQLi extension is missing or disabled.
  3. reoccurring ERR_HTTP2_PROTOCOL_ERROR
    • What is causing the browser to show ERR_HTTP2_PROTOCOL_ERROR before it finally loads the site correctly and how it can be fixed?
  4. $utc_time = DateTimeImmutable::now('UTC');
    • $now = new DateTimeImmutable('now', new DateTimeZone('UTC'));
  5. Clear-Site-Data Header
    • <meta http-equiv="cache-control" content="no-cache, no-store, must-revalidate">
  6. user:UserName link must be case sensitiv but seems not – check
  7. improve notification options for moderators
    • send only a summary
  8. replace col attribute in input and textarea element with CSS percent width and max-width for mobile usage
  9. declared visibility on all properties, constants and methods
  10. unwrap_link() strip also last slash if user provides page="/Cluster/SubPage/" to match tag Cluster/SubPage in database
    • utf8_rtrim(new_tag, '/') or better already via regex
  11. add option to overwrite upload pre-selection (global/local)
  12. The user name regex allows . and - in usernames however the sanitizer removes it 
  13. Why does it store interwiki in session and not as JSON in _cache/config/interwiki.conf?
    • get_inter_wiki_url($name, $tag)
  14. move interwiki.conf and antispam.conf into table & _cache/config/*
  15. COLLATE utf8mb4_bin for tag eats 𝓦𝓲𝓴𝓲𝓦𝓸𝓻𝓭𝓼 in LIKE '/%' query, without slash it finds it, whO_Ot
  16. UTF-8 text must be checked for well-formedness
    • static function is_utf8($string)
      {
        return (bool) preg_match('//u', $string);
      }		
  17. fix client side JS input validation patterns
    1. new, clone and rename handler, import action
    2. $tpl->pattern = $this->lang['TAG'] . '+';
  18. allow also login with email address instead of user name
  19. individual CSP per page
  20. move link and notifications functions in own class
    • $this->msg->notify_user()
    • $this->ref->link()
  21. Implement a quasi mailing lists where users can register and participate, WackoWiki already comes with all functions for realization
    • similar to personal messages, but on topics that send outgoing messages to all users subscribed to that topic
  22. improve page export and import feature (see export handler)
    • add option (handler) to add meta-data like keywords, description, language, etc.
    • json format
    • files
  23. provide simple migration script for page and files
  24. add warning about too long page tag
    • https + domain + base path + page tag + reserve for handler name and parameters
    • roundabout 2000 max 
    • parent tags + page tag – suggested max size triggering a warning (?)
  25. Improve sending emails (bcc, timing, digest, diff options, mailing lists)

4. Installer

  1. sql_mode 'session strict' lets installer stall with MariaDB (debug!), going back and changing it to 'server (default)' and it works
  2. language selection is behind authorization, it always defaults to English if you do a new installation, except you change the 'language' => 'de' in the config_defaults.php file
    • set language via user_agent_language()?
  3. commented out auto-creation of empty help, terms and privacy page – needs FEEDBACK
    • make creation optional, the default theme shows the links when set in the config
    • either the user defines them individually in the admin panel or sets an additional option in the installer to create them
  4. user pages: only the user should be able to write and create sub-pages by default in his namespace
  5. validate username
  6. use dbal also for installer: $db->sql_query($sql)
  7. raise DB version requirement (there is a technical minimum requirement as well as a end of support) DONE
    • enforces version for technical requirement
    • show warning for versions with end of support
  8. show error message if variable $fatal_error is true
  9. set default bookmarks for new languages with multi-language mode after installation / upgrade
    • if the user adds new langages later by hand or activates it via Admin Panel, the default menu for newly activated languages are then missing
    • currently the admin can fix this only by manually adding the missing bookmarks with the {{menu system=1}} action or re-runs the upgrade process by setting back the WackoWiki version in the config file
  10. PHP
    <?php
    
    test($lang['TestDatabaseConnection'] . ' ...', 
        $dblink = @mysqli_connect($config['db_host'], $config['db_user'], $config['db_password']));
    
    $test_db = test(
        $lang['SearchForDatabase'] . ' ...',
        @mysqli_select_db($dblink, $config['db_name']),
        $lang['NoDatabaseFoundTryToCreate'] . '.',
    );
    
    if ($test_db)
    {
        test(
            $lang['TryingToCreateDatabase'] . ' ...',
            @mysqli_query($dblink, 'CREATE DATABASE ' . $config['db_name']),
            $lang['DatabaseCouldNotbeCreatedYouMustCreateItManually'] . ' !'
        );
    
        test(
            $lang['SearchForDatabase'] . ' ...',
            @mysqli_select_db($dblink, $config['db_name']),
            $lang['DatabaseDoesntExistYouMustCreateIt'] . ' !',
        );
    }
  11. robots.txt: noindex,nofollow,max-image-preview:none,noarchive,noimageindex

5. Handler

  • moderate:
    • it is possible to move comments to a forum main page and then they become inaccessible for the moderation handler, the only way is then to change to comment_on_id in the database to another accessible forum page – FIXME
    • the has_access() validation for the lock/unlock feature as well as for the indicator needs a special option for the Admin and the page owner, both have always access, and the handler always assumes only system read & comment defaults, so it won't show the correct indicator and lock/unlock mode
    • a forum or a topic however allows individual read and comment rights
  • export.xml: add option for cluster and if the handler should show the xml or offer it for direct download, some browsers modify the XML in presentation mode or show it as feed – however the user needs the original source text including the line feeds!
  • send notice on comment edit and make change visible in actions like it is done for pages, to not miss possible important content changes
  • diff: add page title to diff
  • print: pass arguments? e.g. ?phrase=canonical&lang=&p=2
  • add feature to move attachments between pages and global, useful for page and content refactoring
  • rename: cluster
    • update bookmarks in user session
    • update link table

6. Action

  • search: improve search, highlighting, ideographic languages
    • add regex search option and feature (similar to admin_replace)
    • add more filters
  • registration: add option to enforce certain user name patterns
  • blog: improve options, sorting and filtering, add content templates
  • paragraphs: add option to set permalinks to paragraphs (to page version) for export (PDF) or other external reference
  • forums: check not only for deleted topic but also for deleted comment in last comment query
  • gallery: add media query for small displays
    • add filter like in files action
  • usersettings: Sessions – [Log Out Everywhere Else] You are only logged in at this location.
  • search: add help for search syntax, e.g. "exact phrase", operators (+, -, *), ...
  • edit and comment: allow inline usage to be included in text without line break, template however is parsed in a way that it always produce line breaks and a new paragraph (evaluate)

7. Formatter

  • checks for base_url in URL in string, but should check only at the beginning of the string to decide to add icon for external URL 
    • PHP
      <?php
      
      if (!mb_stristr($tag, $this->db->base_url))
      {
          $title    = $this->_t('OuterLink2');
          $icon    = $this->_t('Icon.Outer');
      }
  • add Accordion, Carousel, Tabs
  • check typografica options
    • update default settings of options, some options are mostly more annoying than useful, e.g. (c)
    • turnoff option should also affect all page related comments
    • interference with other syntax, e.g. striketrough
    • Unicode context
    • create test cases
  • multi-line strikethrough (marker similar) may break correct tag nesting and parsing, how this should work anyways across paragraphs, lists, etc. by only wrapping it via <del> tag 
    • WikiEdit as well the Formatter must recognize a new paragraph, list as terminators to avoid invalid tag nesting!
  • evaluate syntax for definition list, e.g. ;term:ex
    • there is a working patch, however the current workaround for the random <dt> to <dd> tag transition, prevents wiki text formatting
  • add option to wrap caption around code blocks (DONE) and option to enable / disable <figcaption> like caption=0|1
    • HTML
      <figure>
        <figcaption>Language of code</figcaption>
        <pre>
          <code>
            <!-- your code here -->
          </code>
        </pre>
      </figure>
      
  • str_replace("\xc2\xa0", " ", $string);		
    (nbsp;)
  • removes intentional left empty lines inside info formatter (see paragrafica class)
  • ((../ Go Back)) goes back two levels, but should go to parent page only
  • interwiki links are not tracked
  • relative links were not parsed in the context of the page they are included, what is the default behavior?
  • re-parsing all pages and links may result in wrong toc references, when the included page gets parsed after the page which includes them
    • HOTFIX: save all included pages with wrong toc reference again, this will update body_toc
  • add debug to WackoFormatter to check where it breaks, e.g. returns only white page after saving page
    • add example text the formatter fails on 
    • if you set the text in %% it shows the content, happens usually with large bodies of texts like a transcript
    • is this caused by a timeout, memory or other other cause (?)
  • evaluate syntax for label tag (aka badges), like text marker however with special border, !!(label-blue)Feature!!
    • cite syntax !! uses <span> (better)
    • mark syntax ?? uses <mark>
    • CSS
      /* label (blue) */
      .cl-label-blue {
      	border-radius: .375rem;
      	color: #0969da;
      	background-color: #ddf4ff;
      	padding: .125rem .375rem;
      	font-family: var(--ww-font-monospace);
      	font-size: .75rem;
      }
      

8. Cache


9. Admin Panel

  • rewrite users and groups module
  • support templates
  • check for admin password length only for members of admin group and not for other accounts
  • Email of user becomes invalid, give Admin a possibility to unset email confirmation
    • workaround: change the users email domain to example.com and it sets the email address again as unconfirmed
    • make user setting editable for Admin (?)
  • Users: Provide link to user profile for each user
  • ###[AllowDynamicProperties]##
  • resync: no result page if dataset is smaller than number for next redirect

10. Database

11. WikiEdit

Help wanted

  1. select and remember the color of the highlighter or marker, keep selected color in session
  2. do not set multi-line markup beyond paragraph, list and other terminators, only valid tag nesting
  3. list auto-indentation sometimes fails
  4. conversion of Markdown \| ↔ | (table syntax)
  5. ES2023 ECMAScript 2023 (ES14)
  6. merge and minimize the modules from src/ into a wikiedit.min.js

Converter Error (MD -> Wacko):
  • (docs/CONFIGURATION.md ##(CONFIGURATION.md##))		

12. Translations

  • vollständiger Vergleich → Detailed
  • einfacher Vergleich → Simple
  • installer: set correct tags and titles for default pages for all new languages
    • see ConfigDefaults in installer.<lang>.php
    • change home_page_body in inserts.<lang>.php accordingly

12.1. Crowdin 🚩

New strings can be filtered in the editor via Advanced Filter -> Strings Added: [Date From] – [Date To]


  • Crowdin Pre-MT requires proofreading by native speakers (only supported languages)
    • Quality
      • [MT] Arabic, Czech, Finnish, Norwegian, Romanian, Portuguese Brazilian, Swedish, Ukrainian, Korean, Chinese Traditional, Turkish, Croatian, Thai, Vietnamese
      • [A] other languages with partial translations, e.g. Persian, Tamil
      • [B] Italian, Danish, French, Polish, Dutch, Greek, Japanese
      • [C] English, German, Simplified Chinese, Spanish, Russian
    • check for obvious errors (file & diff)
    • Pre-MT produces a lot of none-sense which needs to be fixed again by hand, mixed results – depending on target language and context, English as source language with little context is sometimes hard to translate
      • A small change in an English source file like setting a comma or removing a <tag>, suddenly it discards all existing translations and replaces them with a new auto-translated version – very frustrating
    • ToDo & Workflow guide
      • completeness -> proofreading
    • Crowdin export scheme should mirror original file structure for simple drop-in replacement, but does not -> WHY ???

13. Libs

  • SimplePie

Replace outdated pear highlighting lib, evaluate


The large size of grammar files in Phiki is primarily due to the exponential state growth that occurs when compiling complex JSON schemas into finite-state automata, particularly when using nullable types and deep nesting.

  • Nullable Types Cause Branching: Each type definition that allows null (e.g., ["number", "null"]) compiles into an anyOf branch within the grammar. With multiple nullable fields per object, this creates dozens of branching points that multiply the number of states exponentially.
  • Lack of Efficient Deduplication: Even when schemas use $ref and $defs to define shared structures, the grammar compiler often expands everything inline rather than reusing grammar rules. This means repeated sub-schemas are duplicated in the compiled output, significantly increasing file size.
  • Deep Nesting Compounds Complexity: Paths with multiple levels of nested objects (e.g., schema → array → object → fields → constraints) compound the complexity, as each level adds its own set of properties and constraints to the state machine.

These factors mean that moderately complex schemas (e.g., 5 levels deep with 50 properties) can trigger errors like “compiled grammar is too large” because the resulting finite-state automaton becomes too large for efficient performance.


https://joelgustafson.com/post[...]lighting-on-the-web/

14. Refactoring

15. Offline usage improvements

Intranet usage, offline, etc.


  1. manual, help
    • installer(option to add help/)
    • provide help cluster as XML for import (de, fr, en, es, ru, zh)
    • add all essential instruction to a doc/ folder
  2. XML export / import
    • improve options (chose cluster, direct download)
    • make import / export more accessible

16. Themes

  • Browser CSS defaults fun: try this in Firefox then in Chrome
    • --test-- ##test## --##test##-- ##--test--##
    • test test test --test--
  • reset font-size back to var(--ww-font-size-sm) for menu, revision handler and similar lists
  • move toc to left side
    • position: fixed;
          width: 200px;
          margin-left: -270px;
          top: 6em;		
  • CSS: [dir=rtl]
  • https://css-tricks.com/solved-with-css-dropdown-menus/
  • dark mode
  • CSS
     #page-edit form textarea {
      height: 400px;
      min-height: 5em;
    }
    
    • change to height: auto; -> rows="40" cols="60" ?
  • make WikiEdit toolbar sticky for mobile form factor so it is always visible
  • unify CSS style for diff, patch formatter
  • add very simple theme for the use of the wiki as a website as frontend for guests
  • default theme: move properties bar over files and comments bar like in tabs theme (?)

16.1. Graphics

  • icon for HTML header
    • 48 – PNG, SVG 
  • WackoWiki logo as SVG 
    • if possible a one to one copy of the original logo

17. Tooling


18. Ideas

19. Documentation

  • add a small user guide for the site
    • e.g. stay for testing in your Namespace (/Users/YourName/WorkHere) and do not litter the global or other namespaces
  • add FlyEnv HowTo / guide for WackoWiki (static & homebrew settings, screenshots)
  • ␣␣ visual syntax for text indention
  • action lists – improve explanation for page parameter (default value, syntax)
    • page="Cluster" – determines for which cluster to display the list.
    • The default value is “!”, i.e. the current page / namespace.
    • The value page="/" will build a list of the entire site.
  • temporary write permissions for image/ folder -> AP Appearance settings: logo and favicon upload
    • chmod 0755 image/
  • Screenshots
    • store example text for Wabi-Sabi and diff handler in sub-pages for each language
    • add missing diff handler screenshots for languages other than English
    • replace PNG, JPEG and GIF with WebP format
  • add README.md file to action, handler and formatter folder with a short introduction and HowTo
  • differentiate update instructions between minor and major upgrade
  • add a page for Terms in WackoWiki
    • cluster, free link, wikilink, etc.
  • add CSP help page
  • order config page according the sections in the Admin panel via sub-headings DONE
    • do the same for the other languages
  • write your own action
  • write your own formatter
  • write your own theme
  • When a upgrade should be done?
  • add guide to write your own forms, e.g. contact, membership application or registration for event
    • action sending form data to table or email
    • with template and localization
  • How I reduce the applications footprint?

20. Feedback


Any major release like this is bound to have some issues, and we will continue to fix them as they arise.

21. Testing

  • file:lotus_flower.jxl?direct

21.1. Debug


declare(strict_types=1);


Show Files (1 file)

Comments

  1. New inline code syntax rules

    ##code## -> <code>code</code>


    Inline code content is literal: it is HTML-escaped and displayed as typed, without processing wiki markup, HTML, links, actions, macros, or typography. Macros inside code spans are also not resolved when the page is saved.


    Delimiters may contain two or more # characters. The closing delimiter must be a maximal run of exactly the same length as the opening delimiter; shorter runs are ordinary content. To include ## literally, use a longer delimiter:


    ### ## code ## ### -> <code>## code ##</code>


    For example, #### code #### uses a four-# delimiter; it is not an escaped ##. Delimiters cannot be escaped in any other way.

    • WikiAdmin
    • 11/12/2026 16:05 edited
  2. Code-block delimiters

    Code-block delimiters are maximal runs of %. A top-level block opens with %% or a longer run and closes only with a run of exactly the same length; runs of any other length inside it are ordinary content. Delimiters longer than %% must be alone on their line.


    Use a longer delimiter to include a shorter code fence literally:


    %%%
    %%(hl css wrapper=shade)
    .d2 { font-size: 70% }
    %%
    %%%		

    Here, the inner %% lines are displayed as typed. The same rule applies during pre-save processing, so macros inside code blocks are not resolved when the page is saved.