GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Push — master ( 43c55c...1f3e86 )
by Michael
08:24
created

HtmlProcessor::process()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 9
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 1 Features 1
Metric Value
c 1
b 1
f 1
dl 0
loc 9
rs 9.6666
cc 2
eloc 5
nc 2
nop 1
1
<?php
2
/**
3
 * HtmlProcessor.php
4
 *
5
 * @package Embera
6
 * @author  Michael Pratt <[email protected]>
7
 * @link    http://www.michael-pratt.com/
8
 *
9
 * For the full copyright and license information, please view the LICENSE
10
 * file that was distributed with this source code.
11
 *
12
 */
13
namespace Embera;
14
15
/**
16
 * This Class is in charge of replacing content, ignoring specific
17
 * html tags.
18
 */
19
class HtmlProcessor
20
{
21
    /** @var array with tags that should be ignored */
22
    protected $tags = array();
23
24
    /** @var array With url to html conversion code */
25
    protected $replacementTable = array();
26
27
    /** @var array with placeholders to be reserved/restored */
28
    protected $holder = array();
29
30
    /**
31
     * Constructor
32
     *
33
     * @param array $tags The tags that should be ignored
34
     * @param array $replacementTable Array with the conversions that should be made
35
     *                                Normally in the url -> html mode.
36
     * @return void
0 ignored issues
show
Comprehensibility Best Practice introduced by
Adding a @return annotation to constructors is generally not recommended as a constructor does not have a meaningful return value.

Adding a @return annotation to a constructor is not recommended, since a constructor does not have a meaningful return value.

Please refer to the PHP core documentation on constructors.

Loading history...
37
     */
38
    public function __construct(array $tags, array $replacementTable)
39
    {
40
        $this->replacementTable = $replacementTable;
41
        $this->tags = $tags;
42
    }
43
44
    /**
45
     * Process the content and does the replacements
46
     *
47
     * @param string $content
48
     * @return string
49
     */
50
    public function process($content)
51
    {
52
        foreach ($this->tags as $t) {
53
            $content = $this->reserveTag($content, $t);
54
        }
55
56
        $content = strtr($content, $this->replacementTable);
57
        return $this->restoreHolders($content);
58
    }
59
60
    /**
61
     * Reserves a tag, which in this case, all it does is replace the html tag
62
     * with a placeholder.
63
     *
64
     * @param string $content
65
     * @param string $tag
66
     * @return string
67
     */
68
    protected function reserveTag($content, $tag)
69
    {
70
        if (stripos($content, '<' . $tag) !== false) {
71
72
            if (in_array(strtolower($tag), array('img'))) {
73
                $pattern = '~(<' . preg_quote($tag, '~') . '[^>]+\>)~i';
74
            } else {
75
                $pattern = '~(<' . preg_quote($tag, '~') . '\\b[^>]*?>[\\s\\S]*?<\\/' . preg_quote($tag, '~') . '>)~i';
76
            }
77
78
            return preg_replace_callback($pattern, array($this, 'placeHolder'), $content);
79
        }
80
81
        return $content;
82
    }
83
84
    /**
85
     * Assigns a placeholder to the matched content. Its used by preg_replace_callback
86
     *
87
     * @param array $matches
88
     * @return string
89
     */
90
    protected function placeHolder(array $matches)
91
    {
92
        $placeholder = '%{{' . md5(time() . count($this->holder) . mt_rand(0, 500)) . '}}%';
93
        $this->holder[$placeholder] = $matches['1'];
94
95
        return $placeholder;
96
    }
97
98
    /**
99
     * Restores all the dummy placeholders with the original content
100
     *
101
     * @param string $content
102
     * @return string
103
     */
104
    protected function restoreHolders($content)
105
    {
106
        if (!empty($this->holder)) {
107
108
            /**
109
             * Now the question that you might be asking yourself is, why use a 'for' loop instead
110
             * of the plain 'str_replace' function once?
111
             *
112
             * Well, since html can be nested, there might be cases were a placeholder was placed inside
113
             * another placeholder and if we do just one 'str_replace', we might not get the full original
114
             * content.
115
             *
116
             * In order to ensure that no data is lost, we need to run 'str_replace' for each time a tag
117
             * was registered in the constructor. That is the worst case scenario, most of the times, the loop
118
             * is just going to run once and repeat the cycle only if there are signs that another placeholder is in
119
             * the content.
120
             */
121
            for ($i=0; $i < count($this->tags); $i++) {
0 ignored issues
show
Performance Best Practice introduced by
It seems like you are calling the size function count() as part of the test condition. You might want to compute the size beforehand, and not on each iteration.

If the size of the collection does not change during the iteration, it is generally a good practice to compute it beforehand, and not on each iteration:

for ($i=0; $i<count($array); $i++) { // calls count() on each iteration
}

// Better
for ($i=0, $c=count($array); $i<$c; $i++) { // calls count() just once
}
Loading history...
122
                $content = str_replace(array_keys($this->holder), array_values($this->holder), $content);
123
                if (strpos($content, '%{{') === false) {
124
                    break;
125
                }
126
            }
127
128
        }
129
130
        return $content;
131
    }
132
}
133
134
?>
0 ignored issues
show
Best Practice introduced by
It is not recommended to use PHP's closing tag ?> in files other than templates.

Using a closing tag in PHP files that only contain PHP code is not recommended as you might accidentally add whitespace after the closing tag which would then be output by PHP. This can cause severe problems, for example headers cannot be sent anymore.

A simple precaution is to leave off the closing tag as it is not required, and it also has no negative effects whatsoever.

Loading history...
135