Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
11 / 11
100.00% covered (success)
100.00%
1 / 1
CRAP
100.00% covered (success)
100.00%
1 / 1
ReferenceRewriter
100.00% covered (success)
100.00%
11 / 11
100.00% covered (success)
100.00%
1 / 1
5
100.00% covered (success)
100.00%
1 / 1
 rewrite
100.00% covered (success)
100.00%
11 / 11
100.00% covered (success)
100.00%
1 / 1
5
1<?php
2declare(strict_types=1);
3/**
4 * Pop PHP Framework (https://www.popphp.org/)
5 *
6 * @link       https://github.com/popphp/popphp-framework
7 * @author     Nick Sagona, III <nick@popphp.org>
8 * @copyright  Copyright (c) 2009-2026 Nick Sagona, III
9 * @license    https://www.popphp.org/license     New BSD License
10 */
11
12/**
13 * @namespace
14 */
15namespace Pop\Pdf\Build\Import;
16
17use Pop\Pdf\Extract\Value;
18
19/**
20 * Pdf build import reference rewriter class
21 *
22 * Recursively rewrites every indirect reference in a decoded Extract\Value
23 * tree through a per-source object-number renumbering map. Stream bytes are
24 * never touched - only a stream's own dictionary is walked.
25 *
26 * @category   Pop
27 * @package    Pop\Pdf
28 * @author     Nick Sagona, III <nick@popphp.org>
29 * @copyright  Copyright (c) 2009-2026 Nick Sagona, III
30 * @license    https://www.popphp.org/license     New BSD License
31 * @version    6.0.0
32 */
33class ReferenceRewriter
34{
35
36    /**
37     * Rewrite every reference in a value through a renumbering map
38     *
39     * @param  mixed $value
40     * @param  array $map
41     * @return mixed
42     */
43    public static function rewrite(mixed $value, array $map): mixed
44    {
45        if ($value instanceof Value\Reference) {
46            $newObjNum = $map[$value->objNum] ?? $value->objNum;
47            return new Value\Reference($newObjNum, 0);
48        }
49
50        if ($value instanceof Value\Stream) {
51            return new Value\Stream(self::rewrite($value->dict, $map), $value->raw);
52        }
53
54        if (is_array($value)) {
55            $rewritten = [];
56            foreach ($value as $key => $item) {
57                $rewritten[$key] = self::rewrite($item, $map);
58            }
59            return $rewritten;
60        }
61
62        return $value;
63    }
64
65}