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