From 815c9bead48a0119305d36de4ce9d4d33cb58e7d Mon Sep 17 00:00:00 2001 From: Matt Friedman Date: Tue, 22 Sep 2026 15:03:11 -0700 Subject: [PATCH 1/4] =?UTF-8?q?Parse=20Tables=20and=20TOC=E2=80=99s=20in?= =?UTF-8?q?=20markdown?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/textformatter/factory_test.php | 96 +++++++++++++++++++++++++++- textformatter/factory.php | 7 ++ 2 files changed, 102 insertions(+), 1 deletion(-) diff --git a/tests/textformatter/factory_test.php b/tests/textformatter/factory_test.php index 97bc0bb..2398aba 100644 --- a/tests/textformatter/factory_test.php +++ b/tests/textformatter/factory_test.php @@ -48,7 +48,7 @@ public function get_styles_templates() class factory_test extends \phpbb_test_case { - public function test_configurator_enables_litedown() + public function test_configurator_enables_markdown_plugins() { global $config, $phpbb_root_path, $request, $symfony_request, $user; @@ -83,5 +83,99 @@ public function test_configurator_enables_litedown() $configurator = $factory->get_configurator(); self::assertTrue(isset($configurator->Litedown)); + self::assertTrue(isset($configurator->PipeTables)); + } + + public function test_markdown_headers_have_litedown_ids() + { + global $config, $phpbb_root_path, $request, $symfony_request, $user; + + $config = new \phpbb\config\config(array( + 'allowed_schemes_links' => 'http,https', + 'cookie_secure' => false, + 'force_server_vars' => true, + 'script_path' => '/phpbb', + 'server_name' => 'localhost', + 'server_port' => 80, + 'server_protocol' => 'http://', + )); + $request = new \phpbb_mock_request(); + $symfony_request = new \phpbb\symfony_request($request); + $user = new \phpbb_mock_user(); + + $data_access = new factory_data_access( + file_get_contents($phpbb_root_path . 'styles/prosilver/template/bbcode.html') + ); + $factory = new \phpbb\pages\textformatter\factory( + $data_access, + new \phpbb_mock_cache(), + new \phpbb_mock_event_dispatcher(), + $config, + new \phpbb\textformatter\s9e\link_helper(), + new \phpbb\log\dummy(), + sys_get_temp_dir() . '/', + '_pages_test_parser', + '_pages_test_renderer' + ); + + $objects = $factory->get_configurator()->finalize(); + $xml = $objects['parser']->parse( + "# Basic usage\n\n" + . "## Global options (work on every command)\n\n" + . "## cache — cache management\n\n" + . "## Quick-reference table" + ); + $html = $objects['renderer']->render($xml); + + self::assertStringContainsString('

Basic usage

', $html); + self::assertStringContainsString('

Global options (work on every command)

', $html); + self::assertStringContainsString('

cache — cache management

', $html); + self::assertStringContainsString('

Quick-reference table

', $html); + } + + public function test_markdown_pipe_tables_are_rendered() + { + global $config, $phpbb_root_path, $request, $symfony_request, $user; + + $config = new \phpbb\config\config(array( + 'allowed_schemes_links' => 'http,https', + 'cookie_secure' => false, + 'force_server_vars' => true, + 'script_path' => '/phpbb', + 'server_name' => 'localhost', + 'server_port' => 80, + 'server_protocol' => 'http://', + )); + $request = new \phpbb_mock_request(); + $symfony_request = new \phpbb\symfony_request($request); + $user = new \phpbb_mock_user(); + + $data_access = new factory_data_access( + file_get_contents($phpbb_root_path . 'styles/prosilver/template/bbcode.html') + ); + $factory = new \phpbb\pages\textformatter\factory( + $data_access, + new \phpbb_mock_cache(), + new \phpbb_mock_event_dispatcher(), + $config, + new \phpbb\textformatter\s9e\link_helper(), + new \phpbb\log\dummy(), + sys_get_temp_dir() . '/', + '_pages_table_test_parser', + '_pages_table_test_renderer' + ); + + $objects = $factory->get_configurator()->finalize(); + $xml = $objects['parser']->parse( + "| Option | Meaning |\n" + . "|---|---|\n" + . "| `--safe-mode` | Boot without extensions |" + ); + $html = $objects['renderer']->render($xml); + + self::assertStringContainsString('', $html); + self::assertStringContainsString('', $html); + self::assertStringContainsString('', $html); + self::assertStringContainsString('', $html); } } diff --git a/textformatter/factory.php b/textformatter/factory.php index 37f525d..9975fdb 100644 --- a/textformatter/factory.php +++ b/textformatter/factory.php @@ -27,6 +27,13 @@ public function get_configurator() $configurator->Litedown; } + $configurator->Litedown->addHeadersId(); + + if (!isset($configurator->PipeTables)) + { + $configurator->PipeTables; + } + return $configurator; } } From 584d6bd9582fe13e65bb13fcee4cfa5466a7924f Mon Sep 17 00:00:00 2001 From: Matt Friedman Date: Tue, 22 Sep 2026 15:24:29 -0700 Subject: [PATCH 2/4] Delete version check functional test - it does not test Pages functionality --- tests/functional/version_check_test.php | 36 ------------------------- 1 file changed, 36 deletions(-) delete mode 100644 tests/functional/version_check_test.php diff --git a/tests/functional/version_check_test.php b/tests/functional/version_check_test.php deleted file mode 100644 index da3580f..0000000 --- a/tests/functional/version_check_test.php +++ /dev/null @@ -1,36 +0,0 @@ - -* @license GNU General Public License, version 2 (GPL-2.0) -* -*/ - -namespace phpbb\pages\tests\functional; - -/** -* @group functional -*/ -class version_check_test extends pages_functional_base -{ - /** - * Test extension manager version check - */ - public function test_version_check() - { - // Log in to the ACP - $this->login(); - $this->admin_login(); - - $this->add_lang('acp/extensions'); - - // Load the Pages extension details - $crawler = self::request('GET', 'adm/index.php?i=acp_extensions&mode=main&action=details&ext_name=phpbb%2Fpages&sid=' . $this->sid); - - // Assert extension is up to date - self::assertGreaterThan(0, $crawler->filter('.successbox')->count()); - self::assertStringContainsString($this->lang('UP_TO_DATE', 'Pages'), $crawler->text()); - } -} From 888bcc95e98e662e4b4f90784458d3c6dcf18dcc Mon Sep 17 00:00:00 2001 From: Matt Friedman Date: Tue, 22 Sep 2026 17:01:55 -0700 Subject: [PATCH 3/4] =?UTF-8?q?Fix=20viewonline=20tests=E2=80=A6as=20usual?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/functional/viewonline_test.php | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/tests/functional/viewonline_test.php b/tests/functional/viewonline_test.php index c8a0eb5..0d1b895 100644 --- a/tests/functional/viewonline_test.php +++ b/tests/functional/viewonline_test.php @@ -63,18 +63,27 @@ public function test_viewonline_check($page_title) // Check each entry in the viewonline table // Skip the first row (header) + $admin_found = false; + $expected_location = $this->lang('PAGES_VIEWONLINE', $page_title); + $matching_session_found = false; for ($i = 1; $i < $session_entries; $i++) { - // If we found the admin, we check his page info and leave + // Multiple admin sessions can exist from earlier functional tests. + // Look for the session visiting this test page rather than relying + // on database row order. $subcrawler = $crawler->filter('#page-body table.table1 tr')->eq($i); if (strpos($subcrawler->filter('td')->text(), 'admin') !== false) { - self::assertStringContainsString($this->lang('PAGES_VIEWONLINE', $page_title), $subcrawler->filter('td.info')->text()); - return; + $admin_found = true; + if (strpos($subcrawler->filter('td.info')->text(), $expected_location) !== false) + { + $matching_session_found = true; + break; + } } } - // If we did not find the admin, we fail - self::fail('User "admin" was not found on viewonline page.'); + self::assertTrue($admin_found, 'User "admin" was not found on viewonline page.'); + self::assertTrue($matching_session_found, 'The admin session for the Viewonline test page was not found.'); } } From aaaf297ce292743997fc2ef31f94fb7f41a993a6 Mon Sep 17 00:00:00 2001 From: Matt Friedman Date: Tue, 22 Sep 2026 17:07:46 -0700 Subject: [PATCH 4/4] Fix for textformatter aliases (not an issue on 3.3 but fatal on 4.0) --- config/services.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config/services.yml b/config/services.yml index 20daeca..b80f1e1 100644 --- a/config/services.yml +++ b/config/services.yml @@ -14,13 +14,13 @@ services: alias: text_formatter.s9e.renderer phpbb\textformatter\cache_interface: - alias: text_formatter.cache + alias: text_formatter.s9e.factory phpbb\textformatter\parser_interface: - alias: text_formatter.parser + alias: text_formatter.s9e.parser phpbb\textformatter\renderer_interface: - alias: text_formatter.renderer + alias: text_formatter.s9e.renderer phpbb.pages.admin.controller: class: phpbb\pages\controller\admin_controller
Option--safe-modeBoot without extensions