fix: library IDs stay hidden without library access (ruling P13)

Outline, node-get, write outlines, the render summary and replace-text's
opaque-node match name no library ID unless the library group is visible
and the user has divi_library; read-only still names them.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-27 15:00:39 +02:00
co-authored by Claude Opus 5.5
parent 06f13799de
commit c7ce924e5a
19 changed files with 351 additions and 28 deletions
@@ -183,4 +183,27 @@ final class OutlineTest extends TestCase
{
return (string) file_get_contents(dirname(__DIR__, 4) . '/Fixtures/divi/' . $name);
}
/** Ruling P13: without library access the outline says "global", but not which entry. */
public function testGlobalIdsCanBeHidden(): void
{
$content = DiviFixtures::markup('stage3/page--globale-instanzen.html');
$outline = new Outline([], false);
$rows = $outline->rows(NodeIndex::build((new Parser())->parse($content)));
$byId = array_column($rows, null, 'id');
self::assertNull($byId['g0']['global_id']);
self::assertSame('section', $byId['g0']['type']);
self::assertStringNotContainsString('1058', $outline->text($rows));
self::assertStringNotContainsString('1059', $outline->text($rows));
self::assertStringNotContainsString('[global', $outline->text($rows));
self::assertStringContainsString('g0 section "Global Abschnitt" (nur lesbar)', $outline->text($rows));
self::assertStringNotContainsString('1058', (string) json_encode($rows));
self::assertStringNotContainsString('1059', (string) json_encode($rows));
$summary = $outline->summary(NodeIndex::build((new Parser())->parse($content)));
self::assertStringNotContainsString('1058', (string) $summary['text']);
$shown = new Outline();
self::assertStringContainsString('[global 1058]', $shown->text($shown->rows(NodeIndex::build((new Parser())->parse($content)))));
}
}