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.
Passed
Pull Request — master (#14)
by Christoph
02:28
created
src/ComplexTagMatcher.php 1 patch
Indentation   +210 added lines, -210 removed lines patch added patch discarded remove patch
@@ -10,215 +10,215 @@
 block discarded – undo
10 10
 
11 11
 class ComplexTagMatcher extends TagMatcher {
12 12
 
13
-	/**
14
-	 * @link http://www.xmlsoft.org/html/libxml-xmlerror.html#xmlParserErrors
15
-	 * @link https://github.com/Chronic-Dev/libxml2/blob/683f296a905710ff285c28b8644ef3a3d8be9486/include/libxml/xmlerror.h#L257
16
-	 */
17
-	const XML_UNKNOWN_TAG_ERROR_CODE = 801;
18
-
19
-	/**
20
-	 * @var string
21
-	 */
22
-	private $tagHtmlOutline;
23
-
24
-	/**
25
-	 * @var Matcher
26
-	 */
27
-	private $matcher;
28
-
29
-	/**
30
-	 * @param string $htmlOutline
31
-	 *
32
-	 * @return self
33
-	 */
34
-	public static function tagMatchingOutline( $htmlOutline ) {
35
-		return new self( $htmlOutline );
36
-	}
37
-
38
-	/**
39
-	 * @param string $tagHtmlRepresentation
40
-	 */
41
-	public function __construct( $tagHtmlRepresentation ) {
42
-		parent::__construct();
43
-
44
-		$this->tagHtmlOutline = $tagHtmlRepresentation;
45
-		$this->matcher = $this->createMatcherFromHtml( $tagHtmlRepresentation );
46
-	}
47
-
48
-	public function describeTo( Description $description ) {
49
-		$description->appendText( 'tag matching outline `' )
50
-			->appendText( $this->tagHtmlOutline )
51
-			->appendText( '` ' );
52
-	}
53
-
54
-	/**
55
-	 * @param \DOMElement $item
56
-	 * @param Description $mismatchDescription
57
-	 *
58
-	 * @return bool
59
-	 */
60
-	protected function matchesSafelyWithDiagnosticDescription( $item, Description $mismatchDescription ) {
61
-		if ( $this->matcher->matches( $item ) ) {
62
-			return true;
63
-		}
64
-
65
-		$mismatchDescription->appendText( 'was `' )
66
-			->appendText( $this->elementToString( $item ) )
67
-			->appendText( '`' );
68
-		return false;
69
-	}
70
-
71
-	/**
72
-	 * @param string $htmlOutline
73
-	 *
74
-	 * @return Matcher
75
-	 */
76
-	private function createMatcherFromHtml( $htmlOutline ) {
77
-		$document = $this->parseHtml( $htmlOutline );
78
-		$targetTag = $this->getSingleTagFromThe( $document );
79
-
80
-		$this->assertTagDoesNotContainChildren( $targetTag );
81
-
82
-		$attributeMatchers = $this->createAttributeMatchers( $htmlOutline, $targetTag );
83
-		$classMatchers = $this->createClassMatchers( $targetTag );
84
-
85
-		return AllOf::allOf(
86
-			new TagNameMatcher( IsEqual::equalTo( $targetTag->tagName ) ),
87
-			call_user_func_array( [ AllOf::class, 'allOf' ], $attributeMatchers ),
88
-			call_user_func_array( [ AllOf::class, 'allOf' ], $classMatchers )
89
-		);
90
-	}
91
-
92
-	/**
93
-	 * @param \LibXMLError $error
94
-	 *
95
-	 * @return bool
96
-	 */
97
-	private function isUnknownTagError( \LibXMLError $error ) {
98
-		return $error->code === self::XML_UNKNOWN_TAG_ERROR_CODE;
99
-	}
100
-
101
-	/**
102
-	 * @param string $inputHtml
103
-	 * @param string $attributeName
104
-	 *
105
-	 * @return bool
106
-	 */
107
-	private function isBooleanAttribute( $inputHtml, $attributeName ) {
108
-		$quotedName = preg_quote( $attributeName, '/' );
109
-
110
-		$attributeHasValueAssigned = preg_match( "/\b{$quotedName}\s*=/ui", $inputHtml );
111
-		return !$attributeHasValueAssigned;
112
-	}
113
-
114
-	/**
115
-	 * @param string $html
116
-	 *
117
-	 * @return \DOMDocument
118
-	 * @throws \InvalidArgumentException
119
-	 */
120
-	private function parseHtml( $html ) {
121
-		$internalErrors = libxml_use_internal_errors( true );
122
-		$document = new \DOMDocument();
123
-
124
-		// phpcs:ignore Generic.PHP.NoSilencedErrors
125
-		if ( !@$document->loadHTML( $html ) ) {
126
-			throw new \InvalidArgumentException( "There was some parsing error of `$html`" );
127
-		}
128
-
129
-		$errors = libxml_get_errors();
130
-		libxml_clear_errors();
131
-		libxml_use_internal_errors( $internalErrors );
132
-
133
-		/** @var \LibXMLError $error */
134
-		foreach ( $errors as $error ) {
135
-			if ( $this->isUnknownTagError( $error ) ) {
136
-				continue;
137
-			}
138
-
139
-			throw new \InvalidArgumentException(
140
-				'There was parsing error: ' . trim( $error->message ) . ' on line ' . $error->line
141
-			);
142
-		}
143
-
144
-		return $document;
145
-	}
146
-
147
-	/**
148
-	 * @param \DOMDocument $document
149
-	 *
150
-	 * @return \DOMElement
151
-	 * @throws \InvalidArgumentException
152
-	 */
153
-	private function getSingleTagFromThe( \DOMDocument $document ) {
154
-		$directChildren = $document->documentElement->childNodes->item( 0 )->childNodes;
155
-
156
-		if ( $directChildren->length !== 1 ) {
157
-			throw new InvalidArgumentException(
158
-				'Expected exactly 1 tag description, got ' . $directChildren->length
159
-			);
160
-		}
161
-
162
-		return $directChildren->item( 0 );
163
-	}
164
-
165
-	private function assertTagDoesNotContainChildren( \DOMElement $targetTag ) {
166
-		if ( $targetTag->childNodes->length > 0 ) {
167
-			throw new InvalidArgumentException( 'Nested elements are not allowed' );
168
-		}
169
-	}
170
-
171
-	/**
172
-	 * @param string $inputHtml
173
-	 * @param \DOMElement $targetTag
174
-	 *
175
-	 * @return AttributeMatcher[]
176
-	 */
177
-	private function createAttributeMatchers( $inputHtml, \DOMElement $targetTag ) {
178
-		$attributeMatchers = [];
179
-		/** @var \DOMAttr $attribute */
180
-		foreach ( $targetTag->attributes as $attribute ) {
181
-			if ( $attribute->name === 'class' ) {
182
-				continue;
183
-			}
184
-
185
-			$attributeMatcher = new AttributeMatcher( IsEqual::equalTo( $attribute->name ) );
186
-			if ( !$this->isBooleanAttribute( $inputHtml, $attribute->name ) ) {
187
-				$attributeMatcher = $attributeMatcher->havingValue( IsEqual::equalTo( $attribute->value ) );
188
-			}
189
-
190
-			$attributeMatchers[] = $attributeMatcher;
191
-		}
192
-		return $attributeMatchers;
193
-	}
194
-
195
-	/**
196
-	 * @param \DOMElement $targetTag
197
-	 *
198
-	 * @return ClassMatcher[]
199
-	 */
200
-	private function createClassMatchers( \DOMElement $targetTag ) {
201
-		$classMatchers = [];
202
-		$classValue = $targetTag->getAttribute( 'class' );
203
-		foreach ( explode( ' ', $classValue ) as $expectedClass ) {
204
-			if ( $expectedClass === '' ) {
205
-				continue;
206
-			}
207
-			$classMatchers[] = new ClassMatcher( IsEqual::equalTo( $expectedClass ) );
208
-		}
209
-		return $classMatchers;
210
-	}
211
-
212
-	/**
213
-	 * @param \DOMElement $element
214
-	 *
215
-	 * @return string
216
-	 */
217
-	private function elementToString( \DOMElement $element ) {
218
-		$newDocument = new \DOMDocument();
219
-		$cloned = $element->cloneNode( true );
220
-		$newDocument->appendChild( $newDocument->importNode( $cloned, true ) );
221
-		return trim( $newDocument->saveHTML() );
222
-	}
13
+    /**
14
+     * @link http://www.xmlsoft.org/html/libxml-xmlerror.html#xmlParserErrors
15
+     * @link https://github.com/Chronic-Dev/libxml2/blob/683f296a905710ff285c28b8644ef3a3d8be9486/include/libxml/xmlerror.h#L257
16
+     */
17
+    const XML_UNKNOWN_TAG_ERROR_CODE = 801;
18
+
19
+    /**
20
+     * @var string
21
+     */
22
+    private $tagHtmlOutline;
23
+
24
+    /**
25
+     * @var Matcher
26
+     */
27
+    private $matcher;
28
+
29
+    /**
30
+     * @param string $htmlOutline
31
+     *
32
+     * @return self
33
+     */
34
+    public static function tagMatchingOutline( $htmlOutline ) {
35
+        return new self( $htmlOutline );
36
+    }
37
+
38
+    /**
39
+     * @param string $tagHtmlRepresentation
40
+     */
41
+    public function __construct( $tagHtmlRepresentation ) {
42
+        parent::__construct();
43
+
44
+        $this->tagHtmlOutline = $tagHtmlRepresentation;
45
+        $this->matcher = $this->createMatcherFromHtml( $tagHtmlRepresentation );
46
+    }
47
+
48
+    public function describeTo( Description $description ) {
49
+        $description->appendText( 'tag matching outline `' )
50
+            ->appendText( $this->tagHtmlOutline )
51
+            ->appendText( '` ' );
52
+    }
53
+
54
+    /**
55
+     * @param \DOMElement $item
56
+     * @param Description $mismatchDescription
57
+     *
58
+     * @return bool
59
+     */
60
+    protected function matchesSafelyWithDiagnosticDescription( $item, Description $mismatchDescription ) {
61
+        if ( $this->matcher->matches( $item ) ) {
62
+            return true;
63
+        }
64
+
65
+        $mismatchDescription->appendText( 'was `' )
66
+            ->appendText( $this->elementToString( $item ) )
67
+            ->appendText( '`' );
68
+        return false;
69
+    }
70
+
71
+    /**
72
+     * @param string $htmlOutline
73
+     *
74
+     * @return Matcher
75
+     */
76
+    private function createMatcherFromHtml( $htmlOutline ) {
77
+        $document = $this->parseHtml( $htmlOutline );
78
+        $targetTag = $this->getSingleTagFromThe( $document );
79
+
80
+        $this->assertTagDoesNotContainChildren( $targetTag );
81
+
82
+        $attributeMatchers = $this->createAttributeMatchers( $htmlOutline, $targetTag );
83
+        $classMatchers = $this->createClassMatchers( $targetTag );
84
+
85
+        return AllOf::allOf(
86
+            new TagNameMatcher( IsEqual::equalTo( $targetTag->tagName ) ),
87
+            call_user_func_array( [ AllOf::class, 'allOf' ], $attributeMatchers ),
88
+            call_user_func_array( [ AllOf::class, 'allOf' ], $classMatchers )
89
+        );
90
+    }
91
+
92
+    /**
93
+     * @param \LibXMLError $error
94
+     *
95
+     * @return bool
96
+     */
97
+    private function isUnknownTagError( \LibXMLError $error ) {
98
+        return $error->code === self::XML_UNKNOWN_TAG_ERROR_CODE;
99
+    }
100
+
101
+    /**
102
+     * @param string $inputHtml
103
+     * @param string $attributeName
104
+     *
105
+     * @return bool
106
+     */
107
+    private function isBooleanAttribute( $inputHtml, $attributeName ) {
108
+        $quotedName = preg_quote( $attributeName, '/' );
109
+
110
+        $attributeHasValueAssigned = preg_match( "/\b{$quotedName}\s*=/ui", $inputHtml );
111
+        return !$attributeHasValueAssigned;
112
+    }
113
+
114
+    /**
115
+     * @param string $html
116
+     *
117
+     * @return \DOMDocument
118
+     * @throws \InvalidArgumentException
119
+     */
120
+    private function parseHtml( $html ) {
121
+        $internalErrors = libxml_use_internal_errors( true );
122
+        $document = new \DOMDocument();
123
+
124
+        // phpcs:ignore Generic.PHP.NoSilencedErrors
125
+        if ( !@$document->loadHTML( $html ) ) {
126
+            throw new \InvalidArgumentException( "There was some parsing error of `$html`" );
127
+        }
128
+
129
+        $errors = libxml_get_errors();
130
+        libxml_clear_errors();
131
+        libxml_use_internal_errors( $internalErrors );
132
+
133
+        /** @var \LibXMLError $error */
134
+        foreach ( $errors as $error ) {
135
+            if ( $this->isUnknownTagError( $error ) ) {
136
+                continue;
137
+            }
138
+
139
+            throw new \InvalidArgumentException(
140
+                'There was parsing error: ' . trim( $error->message ) . ' on line ' . $error->line
141
+            );
142
+        }
143
+
144
+        return $document;
145
+    }
146
+
147
+    /**
148
+     * @param \DOMDocument $document
149
+     *
150
+     * @return \DOMElement
151
+     * @throws \InvalidArgumentException
152
+     */
153
+    private function getSingleTagFromThe( \DOMDocument $document ) {
154
+        $directChildren = $document->documentElement->childNodes->item( 0 )->childNodes;
155
+
156
+        if ( $directChildren->length !== 1 ) {
157
+            throw new InvalidArgumentException(
158
+                'Expected exactly 1 tag description, got ' . $directChildren->length
159
+            );
160
+        }
161
+
162
+        return $directChildren->item( 0 );
163
+    }
164
+
165
+    private function assertTagDoesNotContainChildren( \DOMElement $targetTag ) {
166
+        if ( $targetTag->childNodes->length > 0 ) {
167
+            throw new InvalidArgumentException( 'Nested elements are not allowed' );
168
+        }
169
+    }
170
+
171
+    /**
172
+     * @param string $inputHtml
173
+     * @param \DOMElement $targetTag
174
+     *
175
+     * @return AttributeMatcher[]
176
+     */
177
+    private function createAttributeMatchers( $inputHtml, \DOMElement $targetTag ) {
178
+        $attributeMatchers = [];
179
+        /** @var \DOMAttr $attribute */
180
+        foreach ( $targetTag->attributes as $attribute ) {
181
+            if ( $attribute->name === 'class' ) {
182
+                continue;
183
+            }
184
+
185
+            $attributeMatcher = new AttributeMatcher( IsEqual::equalTo( $attribute->name ) );
186
+            if ( !$this->isBooleanAttribute( $inputHtml, $attribute->name ) ) {
187
+                $attributeMatcher = $attributeMatcher->havingValue( IsEqual::equalTo( $attribute->value ) );
188
+            }
189
+
190
+            $attributeMatchers[] = $attributeMatcher;
191
+        }
192
+        return $attributeMatchers;
193
+    }
194
+
195
+    /**
196
+     * @param \DOMElement $targetTag
197
+     *
198
+     * @return ClassMatcher[]
199
+     */
200
+    private function createClassMatchers( \DOMElement $targetTag ) {
201
+        $classMatchers = [];
202
+        $classValue = $targetTag->getAttribute( 'class' );
203
+        foreach ( explode( ' ', $classValue ) as $expectedClass ) {
204
+            if ( $expectedClass === '' ) {
205
+                continue;
206
+            }
207
+            $classMatchers[] = new ClassMatcher( IsEqual::equalTo( $expectedClass ) );
208
+        }
209
+        return $classMatchers;
210
+    }
211
+
212
+    /**
213
+     * @param \DOMElement $element
214
+     *
215
+     * @return string
216
+     */
217
+    private function elementToString( \DOMElement $element ) {
218
+        $newDocument = new \DOMDocument();
219
+        $cloned = $element->cloneNode( true );
220
+        $newDocument->appendChild( $newDocument->importNode( $cloned, true ) );
221
+        return trim( $newDocument->saveHTML() );
222
+    }
223 223
 
224 224
 }
Please login to merge, or discard this patch.
src/HtmlMatcher.php 1 patch
Indentation   +102 added lines, -102 removed lines patch added patch discarded remove patch
@@ -8,107 +8,107 @@
 block discarded – undo
8 8
 
9 9
 class HtmlMatcher extends DiagnosingMatcher {
10 10
 
11
-	/**
12
-	 * @link http://www.xmlsoft.org/html/libxml-xmlerror.html#xmlParserErrors
13
-	 * @link https://github.com/Chronic-Dev/libxml2/blob/683f296a905710ff285c28b8644ef3a3d8be9486/include/libxml/xmlerror.h#L257
14
-	 */
15
-	const XML_UNKNOWN_TAG_ERROR_CODE = 801;
16
-
17
-	/**
18
-	 * @var Matcher
19
-	 */
20
-	private $elementMatcher;
21
-
22
-	/**
23
-	 * @param Matcher $elementMatcher
24
-	 *
25
-	 * @return self
26
-	 */
27
-	public static function htmlPiece( Matcher $elementMatcher = null ) {
28
-		return new static( $elementMatcher );
29
-	}
30
-
31
-	private function __construct( Matcher $elementMatcher = null ) {
32
-		$this->elementMatcher = $elementMatcher;
33
-	}
34
-
35
-	public function describeTo( Description $description ) {
36
-		$description->appendText( 'valid html piece ' );
37
-		if ( $this->elementMatcher ) {
38
-			$description->appendDescriptionOf( $this->elementMatcher );
39
-		}
40
-	}
41
-
42
-	/**
43
-	 * @param string $html
44
-	 * @param Description $mismatchDescription
45
-	 *
46
-	 * @return bool
47
-	 */
48
-	protected function matchesWithDiagnosticDescription( $html, Description $mismatchDescription ) {
49
-		$internalErrors = libxml_use_internal_errors( true );
50
-		libxml_clear_errors();
51
-		$document = new \DOMDocument();
52
-
53
-		$html = $this->escapeScriptTagContents( $html );
54
-
55
-		// phpcs:ignore Generic.PHP.NoSilencedErrors
56
-		if ( !@$document->loadHTML( mb_convert_encoding( $html, 'HTML-ENTITIES', 'UTF-8' ) ) ) {
57
-			$mismatchDescription->appendText( 'there was some parsing error' );
58
-			return false;
59
-		}
60
-
61
-		$errors = libxml_get_errors();
62
-		libxml_clear_errors();
63
-		libxml_use_internal_errors( $internalErrors );
64
-
65
-		$result = true;
66
-		/** @var \LibXMLError $error */
67
-		foreach ( $errors as $error ) {
68
-			if ( $this->isUnknownTagError( $error ) ) {
69
-				continue;
70
-			}
71
-
72
-			$mismatchDescription->appendText( 'there was parsing error: ' )
73
-				->appendText( trim( $error->message ) )
74
-				->appendText( ' on line ' )
75
-				->appendText( $error->line );
76
-			$result = false;
77
-		}
78
-
79
-		if ( !$result ) {
80
-			return false;
81
-		}
82
-		$mismatchDescription->appendText( 'valid html piece ' );
83
-
84
-		if ( $this->elementMatcher ) {
85
-			$result = $this->elementMatcher->matches( $document );
86
-			$this->elementMatcher->describeMismatch( $document, $mismatchDescription );
87
-		}
88
-
89
-		$mismatchDescription->appendText( "\nActual html:\n" )->appendText( $html );
90
-
91
-		return $result;
92
-	}
93
-
94
-	/**
95
-	 * @param \LibXMLError $error
96
-	 *
97
-	 * @return bool
98
-	 */
99
-	private function isUnknownTagError( \LibXMLError $error ) {
100
-		return $error->code === self::XML_UNKNOWN_TAG_ERROR_CODE;
101
-	}
102
-
103
-	/**
104
-	 * @param string $html
105
-	 *
106
-	 * @return string HTML
107
-	 */
108
-	private function escapeScriptTagContents( $html ) {
109
-		return preg_replace_callback( '#(<script.*>)(.*)(</script>)#isU', function ( $matches ) {
110
-			return $matches[1] . str_replace( '</', '<\/', $matches[2] ) . $matches[3];
111
-		}, $html );
112
-	}
11
+    /**
12
+     * @link http://www.xmlsoft.org/html/libxml-xmlerror.html#xmlParserErrors
13
+     * @link https://github.com/Chronic-Dev/libxml2/blob/683f296a905710ff285c28b8644ef3a3d8be9486/include/libxml/xmlerror.h#L257
14
+     */
15
+    const XML_UNKNOWN_TAG_ERROR_CODE = 801;
16
+
17
+    /**
18
+     * @var Matcher
19
+     */
20
+    private $elementMatcher;
21
+
22
+    /**
23
+     * @param Matcher $elementMatcher
24
+     *
25
+     * @return self
26
+     */
27
+    public static function htmlPiece( Matcher $elementMatcher = null ) {
28
+        return new static( $elementMatcher );
29
+    }
30
+
31
+    private function __construct( Matcher $elementMatcher = null ) {
32
+        $this->elementMatcher = $elementMatcher;
33
+    }
34
+
35
+    public function describeTo( Description $description ) {
36
+        $description->appendText( 'valid html piece ' );
37
+        if ( $this->elementMatcher ) {
38
+            $description->appendDescriptionOf( $this->elementMatcher );
39
+        }
40
+    }
41
+
42
+    /**
43
+     * @param string $html
44
+     * @param Description $mismatchDescription
45
+     *
46
+     * @return bool
47
+     */
48
+    protected function matchesWithDiagnosticDescription( $html, Description $mismatchDescription ) {
49
+        $internalErrors = libxml_use_internal_errors( true );
50
+        libxml_clear_errors();
51
+        $document = new \DOMDocument();
52
+
53
+        $html = $this->escapeScriptTagContents( $html );
54
+
55
+        // phpcs:ignore Generic.PHP.NoSilencedErrors
56
+        if ( !@$document->loadHTML( mb_convert_encoding( $html, 'HTML-ENTITIES', 'UTF-8' ) ) ) {
57
+            $mismatchDescription->appendText( 'there was some parsing error' );
58
+            return false;
59
+        }
60
+
61
+        $errors = libxml_get_errors();
62
+        libxml_clear_errors();
63
+        libxml_use_internal_errors( $internalErrors );
64
+
65
+        $result = true;
66
+        /** @var \LibXMLError $error */
67
+        foreach ( $errors as $error ) {
68
+            if ( $this->isUnknownTagError( $error ) ) {
69
+                continue;
70
+            }
71
+
72
+            $mismatchDescription->appendText( 'there was parsing error: ' )
73
+                ->appendText( trim( $error->message ) )
74
+                ->appendText( ' on line ' )
75
+                ->appendText( $error->line );
76
+            $result = false;
77
+        }
78
+
79
+        if ( !$result ) {
80
+            return false;
81
+        }
82
+        $mismatchDescription->appendText( 'valid html piece ' );
83
+
84
+        if ( $this->elementMatcher ) {
85
+            $result = $this->elementMatcher->matches( $document );
86
+            $this->elementMatcher->describeMismatch( $document, $mismatchDescription );
87
+        }
88
+
89
+        $mismatchDescription->appendText( "\nActual html:\n" )->appendText( $html );
90
+
91
+        return $result;
92
+    }
93
+
94
+    /**
95
+     * @param \LibXMLError $error
96
+     *
97
+     * @return bool
98
+     */
99
+    private function isUnknownTagError( \LibXMLError $error ) {
100
+        return $error->code === self::XML_UNKNOWN_TAG_ERROR_CODE;
101
+    }
102
+
103
+    /**
104
+     * @param string $html
105
+     *
106
+     * @return string HTML
107
+     */
108
+    private function escapeScriptTagContents( $html ) {
109
+        return preg_replace_callback( '#(<script.*>)(.*)(</script>)#isU', function ( $matches ) {
110
+            return $matches[1] . str_replace( '</', '<\/', $matches[2] ) . $matches[3];
111
+        }, $html );
112
+    }
113 113
 
114 114
 }
Please login to merge, or discard this patch.