Passed
Branch master (f7fac8)
by Sebastien
02:47
created

Element::equals()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 1
dl 0
loc 3
rs 10
1
<?php
2
3
/**
4
 * @file
5
 *          This file is part of the PdfParser library.
6
 *
7
 * @author  Sébastien MALOT <[email protected]>
8
 * @date    2017-01-03
9
 * @license LGPLv3
10
 * @url     <https://github.com/smalot/pdfparser>
11
 *
12
 *  PdfParser is a pdf library written in PHP, extraction oriented.
13
 *  Copyright (C) 2017 - Sébastien MALOT <[email protected]>
14
 *
15
 *  This program is free software: you can redistribute it and/or modify
16
 *  it under the terms of the GNU Lesser General Public License as published by
17
 *  the Free Software Foundation, either version 3 of the License, or
18
 *  (at your option) any later version.
19
 *
20
 *  This program is distributed in the hope that it will be useful,
21
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
22
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23
 *  GNU Lesser General Public License for more details.
24
 *
25
 *  You should have received a copy of the GNU Lesser General Public License
26
 *  along with this program.
27
 *  If not, see <http://www.pdfparser.org/sites/default/LICENSE.txt>.
28
 *
29
 */
30
31
namespace Smalot\PdfParser;
32
33
use Smalot\PdfParser\Element\ElementArray;
34
use Smalot\PdfParser\Element\ElementBoolean;
35
use Smalot\PdfParser\Element\ElementDate;
36
use Smalot\PdfParser\Element\ElementHexa;
37
use Smalot\PdfParser\Element\ElementName;
38
use Smalot\PdfParser\Element\ElementNull;
39
use Smalot\PdfParser\Element\ElementNumeric;
40
use Smalot\PdfParser\Element\ElementString;
41
use Smalot\PdfParser\Element\ElementStruct;
42
use Smalot\PdfParser\Element\ElementXRef;
43
44
/**
45
 * Class Element
46
 *
47
 * @package Smalot\PdfParser
48
 */
49
class Element
50
{
51
    /**
52
     * @var Document
53
     */
54
    protected $document = null;
55
56
    /**
57
     * @var mixed
58
     */
59
    protected $value = null;
60
61
    /**
62
     * @param mixed    $value
63
     * @param Document $document
64
     */
65
    public function __construct($value, Document $document = null)
66
    {
67
        $this->value    = $value;
68
        $this->document = $document;
69
    }
70
71
    /**
72
     *
73
     */
74
    public function init()
75
    {
76
77
    }
78
79
    /**
80
     * @param mixed $value
81
     *
82
     * @return bool
83
     */
84
    public function equals($value)
85
    {
86
        return ($value == $this->value);
87
    }
88
89
    /**
90
     * @param mixed $value
91
     *
92
     * @return bool
93
     */
94
    public function contains($value)
95
    {
96
        if (is_array($this->value)) {
97
            /** @var Element $val */
98
            foreach ($this->value as $val) {
99
                if ($val->equals($value)) {
100
                    return true;
101
                }
102
            }
103
104
            return false;
105
        } else {
106
            return $this->equals($value);
107
        }
108
    }
109
110
    /**
111
     * @return mixed
112
     */
113
    public function getContent()
114
    {
115
        return $this->value;
116
    }
117
118
    /**
119
     * @return string
120
     */
121
    public function __toString()
122
    {
123
        return (string)($this->value);
124
    }
125
126
    /**
127
     * @param string   $content
128
     * @param Document $document
129
     * @param int      $position
130
     *
131
     * @return array
132
     * @throws \Exception
133
     */
134
    public static function parse($content, Document $document = null, &$position = 0)
135
    {
136
        $args        = func_get_args();
137
        $only_values = isset($args[3]) ? $args[3] : false;
138
        $content     = trim($content);
139
        $values      = array();
140
141
        do {
142
            $old_position = $position;
143
144
            if (!$only_values) {
145
                if (!preg_match('/^\s*(?P<name>\/[A-Z0-9\._]+)(?P<value>.*)/si', substr($content, $position), $match)) {
146
                    break;
147
                } else {
148
                    $name     = ltrim($match['name'], '/');
149
                    $value    = $match['value'];
150
                    $position = strpos($content, $value, $position + strlen($match['name']));
151
                }
152
            } else {
153
                $name  = count($values);
154
                $value = substr($content, $position);
155
            }
156
157
            if ($element = ElementName::parse($value, $document, $position)) {
158
                $values[$name] = $element;
159
            } elseif ($element = ElementXRef::parse($value, $document, $position)) {
160
                $values[$name] = $element;
161
            } elseif ($element = ElementNumeric::parse($value, $document, $position)) {
162
                $values[$name] = $element;
163
            } elseif ($element = ElementStruct::parse($value, $document, $position)) {
164
                $values[$name] = $element;
165
            } elseif ($element = ElementBoolean::parse($value, $document, $position)) {
166
                $values[$name] = $element;
167
            } elseif ($element = ElementNull::parse($value, $document, $position)) {
168
                $values[$name] = $element;
169
            } elseif ($element = ElementDate::parse($value, $document, $position)) {
170
                $values[$name] = $element;
171
            } elseif ($element = ElementString::parse($value, $document, $position)) {
172
                $values[$name] = $element;
173
            } elseif ($element = ElementHexa::parse($value, $document, $position)) {
174
                $values[$name] = $element;
175
            } elseif ($element = ElementArray::parse($value, $document, $position)) {
176
                $values[$name] = $element;
177
            } else {
178
                $position = $old_position;
179
                break;
180
            }
181
        } while ($position < strlen($content));
182
183
        return $values;
184
    }
185
}
186