6 Commits

Author SHA1 Message Date
iska 8038ec9654 TEMP 2018-07-16 21:44:56 +02:00
iska c13abcb833 Add implementation for HTML Attributes sanitizing policy 2018-06-01 17:18:23 +02:00
iska 785ca48f52 Add implementation for HTML Element sanitizing policy 2018-06-01 16:34:56 +02:00
iska 1c8be332a4 Add implementation for HTML Token sanitizing policy 2018-06-01 00:27:38 +02:00
iska ef29e27f39 Add stubs for HTML sanitizing 2018-06-01 00:26:56 +02:00
iska 482d936196 Add HTML-escaping category method for NSString
Escapes HTML as described in:
https://html.spec.whatwg.org/multipage/parsing.html#escapingString
2018-05-10 23:11:32 +02:00
72 changed files with 919 additions and 1073 deletions
+1 -4
View File
@@ -1,5 +1,5 @@
module: HTMLKit
module_version: 3.1.0
module_version: 2.1.4
author: Iskandar Abudiab
author_url: https://twitter.com/iabudiab
github_url: https://github.com/iabudiab/HTMLKit
@@ -33,7 +33,6 @@ custom_categories:
- HTMLTemplate
- HTMLDOMTokenList
- HTMLRange
- HTMLSerializer
- name: Iteration & Filtering
children:
@@ -42,9 +41,7 @@ custom_categories:
- HTMLNodeFilterShowOptions
- HTMLNodeFilterValue
- HTMLNodeFilterBlock
- HTMLNodeVisitor
- HTMLSelectorNodeFilter
- HTMLTreeVisitor
- HTMLTreeWalker
- name: Structures
-33
View File
@@ -1,38 +1,5 @@
# Change Log
## [3.1.0](https://github.com/iabudiab/HTMLKit/releases/tag/3.1.0)
Release on 2019.08.20
### Added
- `HTMLTreeVisitor` that walks the DOM in tree order
- New HTML serialization implementation based on visitor pattern
### Fixes
- HTML serialization for deeply nested DOM trees (issue #33)
- Occasional Internal Consistency exceptions when deallocating node iterator (issue #36)
## [3.0.0](https://github.com/iabudiab/HTMLKit/releases/tag/3.0.0)
Released on 2019.03.28
### Breaking Change
- Introduce prefix for `NSString` and `NSCharacterSet` categories to prevent collision with existing code (issue #35)
## [2.1.5](https://github.com/iabudiab/HTMLKit/releases/tag/2.1.5)
Released on 2018.07.16
### Fixes
- Parser would handle foreign attributes incorrectly (issue #30)
## [2.1.4](https://github.com/iabudiab/HTMLKit/releases/tag/2.1.4)
Released on 2018.05.01
@@ -112,7 +112,7 @@ do {
try scraper.load()
// Parse the selector
let repositoryContent = try CSSSelectorParser.parseSelector(".repository-content > .file-wrap > table.files tr.js-navigation-item")
let repositoryContent = try CSSSelectorParser.parseSelector("[role='main'] .repository-content > .file-wrap > .files tr.js-navigation-item")
// Query matching elements
let files = try scraper.listElements(matching: repositoryContent)
@@ -131,10 +131,13 @@ do {
// The following selector: "[role='main'] div.file table.js-file-line-container td:nth-child(2)"
// can be defined in type-safe manner:
let selector = allOf([
descendantOfElementSelector(
attributeSelector(.exactMatch, "role", "main")
),
descendantOfElementSelector(
allOf([
typeSelector("div"),
classSelector("repository-content")
classSelector("file")
])
),
descendantOfElementSelector(
@@ -0,0 +1,29 @@
import HTMLKit
HTMLSanitizingPolicy { (builder) in
builder
.allowCommonBlockElements()
.allowCommonInlineFormattingElements()
.allowElements(["p", "div"])
.allow(HTMLElementPolicy.identity(), onElements: ["b", "p"])
.allow(HTMLAttributePolicy.init(), onElements: [])
.disallowText(inElements: ["a"])
}
HTMLElementPolicy { (str) -> String in
return str
}
HTMLSanitizer { (builder) in
builder
.allowCommonBlockElements()
.allowCommonInlineFormattingElements()
.allowElements(["p", "div"])
.allow(HTMLElementPolicy.identity() , onElements: ["b", "p"])
.allow(HTMLAttributePolicy.init(), onElements: [])
.disallowText(inElements: ["a"])
}
+2 -1
View File
@@ -1,10 +1,11 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<playground version='6.0' target-platform='macos' display-mode='rendered' last-migration='0800'>
<playground version='6.0' target-platform='macos' display-mode='raw' last-migration='0800'>
<pages>
<page name='Intro'/>
<page name='Parsing Documents'/>
<page name='Parsing Fragments'/>
<page name='The DOM'/>
<page name='CSS Selectors'/>
<page name='Sanitizing HTML'/>
</pages>
</playground>
+1 -1
View File
@@ -1,6 +1,6 @@
Pod::Spec.new do |s|
s.name = "HTMLKit"
s.version = "3.1.0"
s.version = "2.1.4"
s.summary = "HTMLKit, an Objective-C framework for your everyday HTML needs."
s.license = "MIT"
s.homepage = "https://github.com/iabudiab/HTMLKit"
+148 -134
View File
@@ -58,18 +58,6 @@
625A14B019C7829400AD0C32 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 625A14AF19C7829400AD0C32 /* Cocoa.framework */; };
625A14C519C7829400AD0C32 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 625A14C419C7829400AD0C32 /* XCTest.framework */; };
625A14C919C7829400AD0C32 /* HTMLKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 625A14AC19C7829400AD0C32 /* HTMLKit.framework */; };
625A67C9224AC62C00C6D57D /* NSString+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 625A67C7224AC62C00C6D57D /* NSString+Private.h */; settings = {ATTRIBUTES = (Private, ); }; };
625A67CA224AC62C00C6D57D /* NSString+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 625A67C7224AC62C00C6D57D /* NSString+Private.h */; settings = {ATTRIBUTES = (Private, ); }; };
625A67CB224AC62C00C6D57D /* NSString+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 625A67C7224AC62C00C6D57D /* NSString+Private.h */; settings = {ATTRIBUTES = (Private, ); }; };
625A67CC224AC62C00C6D57D /* NSString+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 625A67C7224AC62C00C6D57D /* NSString+Private.h */; settings = {ATTRIBUTES = (Private, ); }; };
625A67CD224AC62C00C6D57D /* NSString+Private.m in Sources */ = {isa = PBXBuildFile; fileRef = 625A67C8224AC62C00C6D57D /* NSString+Private.m */; };
625A67CE224AC62C00C6D57D /* NSString+Private.m in Sources */ = {isa = PBXBuildFile; fileRef = 625A67C8224AC62C00C6D57D /* NSString+Private.m */; };
625A67CF224AC62C00C6D57D /* NSString+Private.m in Sources */ = {isa = PBXBuildFile; fileRef = 625A67C8224AC62C00C6D57D /* NSString+Private.m */; };
625A67D0224AC62C00C6D57D /* NSString+Private.m in Sources */ = {isa = PBXBuildFile; fileRef = 625A67C8224AC62C00C6D57D /* NSString+Private.m */; };
625A67D2224ADC7700C6D57D /* HTMLQuircksMode.m in Sources */ = {isa = PBXBuildFile; fileRef = 625A67D1224ADC7700C6D57D /* HTMLQuircksMode.m */; };
625A67D3224ADC7700C6D57D /* HTMLQuircksMode.m in Sources */ = {isa = PBXBuildFile; fileRef = 625A67D1224ADC7700C6D57D /* HTMLQuircksMode.m */; };
625A67D4224ADC7700C6D57D /* HTMLQuircksMode.m in Sources */ = {isa = PBXBuildFile; fileRef = 625A67D1224ADC7700C6D57D /* HTMLQuircksMode.m */; };
625A67D5224ADC7700C6D57D /* HTMLQuircksMode.m in Sources */ = {isa = PBXBuildFile; fileRef = 625A67D1224ADC7700C6D57D /* HTMLQuircksMode.m */; };
625D0F031C2717DE00D7BEB0 /* HTMLNode+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 625D0F011C2717DE00D7BEB0 /* HTMLNode+Private.h */; settings = {ATTRIBUTES = (Private, ); }; };
625D0F041C2717DE00D7BEB0 /* HTMLNode+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 625D0F011C2717DE00D7BEB0 /* HTMLNode+Private.h */; settings = {ATTRIBUTES = (Private, ); }; };
625EE4571CBAA41D00F2CC8E /* HTMLKitTestObserver.m in Sources */ = {isa = PBXBuildFile; fileRef = 625EE4561CBAA41D00F2CC8E /* HTMLKitTestObserver.m */; };
@@ -88,6 +76,38 @@
626BE1E71DF3819600C49514 /* HTMLDOMUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 626BE1E11DF3819500C49514 /* HTMLDOMUtils.m */; };
626BE1E81DF3819600C49514 /* HTMLDOMUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 626BE1E11DF3819500C49514 /* HTMLDOMUtils.m */; };
626BE1E91DF3819600C49514 /* HTMLDOMUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 626BE1E11DF3819500C49514 /* HTMLDOMUtils.m */; };
627E609D20B9C55400AB06E8 /* HTMLSanitizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 627E609B20B9C55400AB06E8 /* HTMLSanitizer.h */; settings = {ATTRIBUTES = (Public, ); }; };
627E609E20B9C55400AB06E8 /* HTMLSanitizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 627E609B20B9C55400AB06E8 /* HTMLSanitizer.h */; };
627E609F20B9C55400AB06E8 /* HTMLSanitizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 627E609B20B9C55400AB06E8 /* HTMLSanitizer.h */; settings = {ATTRIBUTES = (Public, ); }; };
627E60A020B9C55400AB06E8 /* HTMLSanitizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 627E609B20B9C55400AB06E8 /* HTMLSanitizer.h */; settings = {ATTRIBUTES = (Public, ); }; };
627E60A120B9C55400AB06E8 /* HTMLSanitizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 627E609C20B9C55400AB06E8 /* HTMLSanitizer.m */; };
627E60A220B9C55400AB06E8 /* HTMLSanitizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 627E609C20B9C55400AB06E8 /* HTMLSanitizer.m */; };
627E60A320B9C55400AB06E8 /* HTMLSanitizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 627E609C20B9C55400AB06E8 /* HTMLSanitizer.m */; };
627E60A420B9C55400AB06E8 /* HTMLSanitizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 627E609C20B9C55400AB06E8 /* HTMLSanitizer.m */; };
627E60A820B9C58F00AB06E8 /* HTMLElementPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = 627E60A620B9C58F00AB06E8 /* HTMLElementPolicy.h */; settings = {ATTRIBUTES = (Public, ); }; };
627E60A920B9C58F00AB06E8 /* HTMLElementPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = 627E60A620B9C58F00AB06E8 /* HTMLElementPolicy.h */; settings = {ATTRIBUTES = (Public, ); }; };
627E60AA20B9C58F00AB06E8 /* HTMLElementPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = 627E60A620B9C58F00AB06E8 /* HTMLElementPolicy.h */; settings = {ATTRIBUTES = (Public, ); }; };
627E60AB20B9C58F00AB06E8 /* HTMLElementPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = 627E60A620B9C58F00AB06E8 /* HTMLElementPolicy.h */; settings = {ATTRIBUTES = (Public, ); }; };
627E60AC20B9C58F00AB06E8 /* HTMLElementPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = 627E60A720B9C58F00AB06E8 /* HTMLElementPolicy.m */; };
627E60AD20B9C58F00AB06E8 /* HTMLElementPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = 627E60A720B9C58F00AB06E8 /* HTMLElementPolicy.m */; };
627E60AE20B9C58F00AB06E8 /* HTMLElementPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = 627E60A720B9C58F00AB06E8 /* HTMLElementPolicy.m */; };
627E60AF20B9C58F00AB06E8 /* HTMLElementPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = 627E60A720B9C58F00AB06E8 /* HTMLElementPolicy.m */; };
627E60BC20BA015100AB06E8 /* HTMLSanitizingPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = 627E60BA20BA015100AB06E8 /* HTMLSanitizingPolicy.h */; settings = {ATTRIBUTES = (Public, ); }; };
627E60BD20BA015100AB06E8 /* HTMLSanitizingPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = 627E60BA20BA015100AB06E8 /* HTMLSanitizingPolicy.h */; settings = {ATTRIBUTES = (Public, ); }; };
627E60BE20BA015100AB06E8 /* HTMLSanitizingPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = 627E60BA20BA015100AB06E8 /* HTMLSanitizingPolicy.h */; settings = {ATTRIBUTES = (Public, ); }; };
627E60BF20BA015100AB06E8 /* HTMLSanitizingPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = 627E60BA20BA015100AB06E8 /* HTMLSanitizingPolicy.h */; settings = {ATTRIBUTES = (Public, ); }; };
627E60C020BA015100AB06E8 /* HTMLSanitizingPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = 627E60BB20BA015100AB06E8 /* HTMLSanitizingPolicy.m */; };
627E60C120BA015100AB06E8 /* HTMLSanitizingPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = 627E60BB20BA015100AB06E8 /* HTMLSanitizingPolicy.m */; };
627E60C220BA015100AB06E8 /* HTMLSanitizingPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = 627E60BB20BA015100AB06E8 /* HTMLSanitizingPolicy.m */; };
627E60C320BA015100AB06E8 /* HTMLSanitizingPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = 627E60BB20BA015100AB06E8 /* HTMLSanitizingPolicy.m */; };
627E60C620BA02E900AB06E8 /* HTMLSanitizingPolicyBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 627E60C420BA02E900AB06E8 /* HTMLSanitizingPolicyBuilder.h */; settings = {ATTRIBUTES = (Public, ); }; };
627E60C720BA02E900AB06E8 /* HTMLSanitizingPolicyBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 627E60C420BA02E900AB06E8 /* HTMLSanitizingPolicyBuilder.h */; settings = {ATTRIBUTES = (Public, ); }; };
627E60C820BA02E900AB06E8 /* HTMLSanitizingPolicyBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 627E60C420BA02E900AB06E8 /* HTMLSanitizingPolicyBuilder.h */; settings = {ATTRIBUTES = (Public, ); }; };
627E60C920BA02E900AB06E8 /* HTMLSanitizingPolicyBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 627E60C420BA02E900AB06E8 /* HTMLSanitizingPolicyBuilder.h */; settings = {ATTRIBUTES = (Public, ); }; };
627E60CA20BA02E900AB06E8 /* HTMLSanitizingPolicyBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 627E60C520BA02E900AB06E8 /* HTMLSanitizingPolicyBuilder.m */; };
627E60CB20BA02E900AB06E8 /* HTMLSanitizingPolicyBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 627E60C520BA02E900AB06E8 /* HTMLSanitizingPolicyBuilder.m */; };
627E60CC20BA02E900AB06E8 /* HTMLSanitizingPolicyBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 627E60C520BA02E900AB06E8 /* HTMLSanitizingPolicyBuilder.m */; };
627E60CD20BA02E900AB06E8 /* HTMLSanitizingPolicyBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 627E60C520BA02E900AB06E8 /* HTMLSanitizingPolicyBuilder.m */; };
62857C6B1D3988EE008DC254 /* HTMLKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 625A14BC19C7829400AD0C32 /* HTMLKit.h */; settings = {ATTRIBUTES = (Public, ); }; };
62857C6C1D3988EE008DC254 /* HTMLKitErrorDomain.h in Headers */ = {isa = PBXBuildFile; fileRef = 626652F81C03D30F00C3F121 /* HTMLKitErrorDomain.h */; settings = {ATTRIBUTES = (Public, ); }; };
62857C6D1D398907008DC254 /* HTMLInputStreamReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 625A150619C78ABA00AD0C32 /* HTMLInputStreamReader.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -321,31 +341,17 @@
62857D8F1D39A47F008DC254 /* CSSCombinatorSelector.h in Headers */ = {isa = PBXBuildFile; fileRef = 62FA04E11BCC360D009ABF98 /* CSSCombinatorSelector.h */; settings = {ATTRIBUTES = (Public, ); }; };
62857D901D39A47F008DC254 /* CSSCompoundSelector.h in Headers */ = {isa = PBXBuildFile; fileRef = 620C87791BD44CBE00FB3EEE /* CSSCompoundSelector.h */; settings = {ATTRIBUTES = (Public, ); }; };
628AF6301BC99A6C00496128 /* CSSNthExpressionsParserTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 628AF62E1BC99A6C00496128 /* CSSNthExpressionsParserTests.m */; };
6295FB0722F0E770005C6DE8 /* HTMLNodeVisitor.h in Headers */ = {isa = PBXBuildFile; fileRef = 6295FB0522F0E770005C6DE8 /* HTMLNodeVisitor.h */; settings = {ATTRIBUTES = (Public, ); }; };
6295FB0822F0E770005C6DE8 /* HTMLNodeVisitor.h in Headers */ = {isa = PBXBuildFile; fileRef = 6295FB0522F0E770005C6DE8 /* HTMLNodeVisitor.h */; settings = {ATTRIBUTES = (Public, ); }; };
6295FB0922F0E770005C6DE8 /* HTMLNodeVisitor.h in Headers */ = {isa = PBXBuildFile; fileRef = 6295FB0522F0E770005C6DE8 /* HTMLNodeVisitor.h */; settings = {ATTRIBUTES = (Public, ); }; };
6295FB0A22F0E770005C6DE8 /* HTMLNodeVisitor.h in Headers */ = {isa = PBXBuildFile; fileRef = 6295FB0522F0E770005C6DE8 /* HTMLNodeVisitor.h */; settings = {ATTRIBUTES = (Public, ); }; };
6295FB0B22F0E770005C6DE8 /* HTMLNodeVisitor.m in Sources */ = {isa = PBXBuildFile; fileRef = 6295FB0622F0E770005C6DE8 /* HTMLNodeVisitor.m */; };
6295FB0C22F0E770005C6DE8 /* HTMLNodeVisitor.m in Sources */ = {isa = PBXBuildFile; fileRef = 6295FB0622F0E770005C6DE8 /* HTMLNodeVisitor.m */; };
6295FB0D22F0E770005C6DE8 /* HTMLNodeVisitor.m in Sources */ = {isa = PBXBuildFile; fileRef = 6295FB0622F0E770005C6DE8 /* HTMLNodeVisitor.m */; };
6295FB0E22F0E770005C6DE8 /* HTMLNodeVisitor.m in Sources */ = {isa = PBXBuildFile; fileRef = 6295FB0622F0E770005C6DE8 /* HTMLNodeVisitor.m */; };
6295FB1122F0ECEE005C6DE8 /* HTMLTreeVisitor.h in Headers */ = {isa = PBXBuildFile; fileRef = 6295FB0F22F0ECEE005C6DE8 /* HTMLTreeVisitor.h */; settings = {ATTRIBUTES = (Public, ); }; };
6295FB1222F0ECEE005C6DE8 /* HTMLTreeVisitor.h in Headers */ = {isa = PBXBuildFile; fileRef = 6295FB0F22F0ECEE005C6DE8 /* HTMLTreeVisitor.h */; settings = {ATTRIBUTES = (Public, ); }; };
6295FB1322F0ECEE005C6DE8 /* HTMLTreeVisitor.h in Headers */ = {isa = PBXBuildFile; fileRef = 6295FB0F22F0ECEE005C6DE8 /* HTMLTreeVisitor.h */; settings = {ATTRIBUTES = (Public, ); }; };
6295FB1422F0ECEE005C6DE8 /* HTMLTreeVisitor.h in Headers */ = {isa = PBXBuildFile; fileRef = 6295FB0F22F0ECEE005C6DE8 /* HTMLTreeVisitor.h */; settings = {ATTRIBUTES = (Public, ); }; };
6295FB1522F0ECEE005C6DE8 /* HTMLTreeVisitor.m in Sources */ = {isa = PBXBuildFile; fileRef = 6295FB1022F0ECEE005C6DE8 /* HTMLTreeVisitor.m */; };
6295FB1622F0ECEE005C6DE8 /* HTMLTreeVisitor.m in Sources */ = {isa = PBXBuildFile; fileRef = 6295FB1022F0ECEE005C6DE8 /* HTMLTreeVisitor.m */; };
6295FB1722F0ECEE005C6DE8 /* HTMLTreeVisitor.m in Sources */ = {isa = PBXBuildFile; fileRef = 6295FB1022F0ECEE005C6DE8 /* HTMLTreeVisitor.m */; };
6295FB1822F0ECEE005C6DE8 /* HTMLTreeVisitor.m in Sources */ = {isa = PBXBuildFile; fileRef = 6295FB1022F0ECEE005C6DE8 /* HTMLTreeVisitor.m */; };
6295FB1A22F0F309005C6DE8 /* HTMLTreeVisitorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6295FB1922F0F309005C6DE8 /* HTMLTreeVisitorTests.m */; };
6295FB1B22F0F309005C6DE8 /* HTMLTreeVisitorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6295FB1922F0F309005C6DE8 /* HTMLTreeVisitorTests.m */; };
6295FB1C22F0F309005C6DE8 /* HTMLTreeVisitorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6295FB1922F0F309005C6DE8 /* HTMLTreeVisitorTests.m */; };
62A6CDCE20BC9A3D00351AAE /* HTMLAttributePolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = 62A6CDCC20BC9A3D00351AAE /* HTMLAttributePolicy.h */; settings = {ATTRIBUTES = (Public, ); }; };
62A6CDCF20BC9A3D00351AAE /* HTMLAttributePolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = 62A6CDCC20BC9A3D00351AAE /* HTMLAttributePolicy.h */; settings = {ATTRIBUTES = (Public, ); }; };
62A6CDD020BC9A3D00351AAE /* HTMLAttributePolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = 62A6CDCC20BC9A3D00351AAE /* HTMLAttributePolicy.h */; settings = {ATTRIBUTES = (Public, ); }; };
62A6CDD120BC9A3D00351AAE /* HTMLAttributePolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = 62A6CDCC20BC9A3D00351AAE /* HTMLAttributePolicy.h */; settings = {ATTRIBUTES = (Public, ); }; };
62A6CDD220BC9A3D00351AAE /* HTMLAttributePolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = 62A6CDCD20BC9A3D00351AAE /* HTMLAttributePolicy.m */; };
62A6CDD320BC9A3D00351AAE /* HTMLAttributePolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = 62A6CDCD20BC9A3D00351AAE /* HTMLAttributePolicy.m */; };
62A6CDD420BC9A3D00351AAE /* HTMLAttributePolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = 62A6CDCD20BC9A3D00351AAE /* HTMLAttributePolicy.m */; };
62A6CDD520BC9A3D00351AAE /* HTMLAttributePolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = 62A6CDCD20BC9A3D00351AAE /* HTMLAttributePolicy.m */; };
62A95A4D1FB0FBFC0009FF26 /* HTMLSerializationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 62A95A4C1FB0FBFC0009FF26 /* HTMLSerializationTests.m */; };
62A95A4E1FB0FBFC0009FF26 /* HTMLSerializationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 62A95A4C1FB0FBFC0009FF26 /* HTMLSerializationTests.m */; };
62A95A4F1FB0FBFC0009FF26 /* HTMLSerializationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 62A95A4C1FB0FBFC0009FF26 /* HTMLSerializationTests.m */; };
62C82E0D20FD2FFD008497A8 /* HTMLKitParserIssuesTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 62C82E0C20FD2FFD008497A8 /* HTMLKitParserIssuesTests.m */; };
62C82E0E20FD2FFD008497A8 /* HTMLKitParserIssuesTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 62C82E0C20FD2FFD008497A8 /* HTMLKitParserIssuesTests.m */; };
62C82E0F20FD2FFD008497A8 /* HTMLKitParserIssuesTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 62C82E0C20FD2FFD008497A8 /* HTMLKitParserIssuesTests.m */; };
62D8345A19FB1AC4009205A9 /* HTML5LibTokenizerTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 62D8345819FB1AC4009205A9 /* HTML5LibTokenizerTest.m */; };
62D91C231DE218A500BEFADE /* HTMLRange.h in Headers */ = {isa = PBXBuildFile; fileRef = 62D91C211DE218A500BEFADE /* HTMLRange.h */; settings = {ATTRIBUTES = (Public, ); }; };
62D91C241DE218A500BEFADE /* HTMLRange.h in Headers */ = {isa = PBXBuildFile; fileRef = 62D91C211DE218A500BEFADE /* HTMLRange.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -355,20 +361,20 @@
62D91C281DE218A500BEFADE /* HTMLRange.m in Sources */ = {isa = PBXBuildFile; fileRef = 62D91C221DE218A500BEFADE /* HTMLRange.m */; };
62D91C291DE218A500BEFADE /* HTMLRange.m in Sources */ = {isa = PBXBuildFile; fileRef = 62D91C221DE218A500BEFADE /* HTMLRange.m */; };
62D91C2A1DE218A500BEFADE /* HTMLRange.m in Sources */ = {isa = PBXBuildFile; fileRef = 62D91C221DE218A500BEFADE /* HTMLRange.m */; };
62E0917F22EDEB9D00C61073 /* HTMLSerializer.h in Headers */ = {isa = PBXBuildFile; fileRef = 62E0917D22EDEB9D00C61073 /* HTMLSerializer.h */; settings = {ATTRIBUTES = (Public, ); }; };
62E0918022EDEB9D00C61073 /* HTMLSerializer.h in Headers */ = {isa = PBXBuildFile; fileRef = 62E0917D22EDEB9D00C61073 /* HTMLSerializer.h */; settings = {ATTRIBUTES = (Public, ); }; };
62E0918122EDEB9D00C61073 /* HTMLSerializer.h in Headers */ = {isa = PBXBuildFile; fileRef = 62E0917D22EDEB9D00C61073 /* HTMLSerializer.h */; settings = {ATTRIBUTES = (Public, ); }; };
62E0918222EDEB9D00C61073 /* HTMLSerializer.h in Headers */ = {isa = PBXBuildFile; fileRef = 62E0917D22EDEB9D00C61073 /* HTMLSerializer.h */; settings = {ATTRIBUTES = (Public, ); }; };
62E0918322EDEB9D00C61073 /* HTMLSerializer.m in Sources */ = {isa = PBXBuildFile; fileRef = 62E0917E22EDEB9D00C61073 /* HTMLSerializer.m */; };
62E0918422EDEB9D00C61073 /* HTMLSerializer.m in Sources */ = {isa = PBXBuildFile; fileRef = 62E0917E22EDEB9D00C61073 /* HTMLSerializer.m */; };
62E0918522EDEB9D00C61073 /* HTMLSerializer.m in Sources */ = {isa = PBXBuildFile; fileRef = 62E0917E22EDEB9D00C61073 /* HTMLSerializer.m */; };
62E0918622EDEB9D00C61073 /* HTMLSerializer.m in Sources */ = {isa = PBXBuildFile; fileRef = 62E0917E22EDEB9D00C61073 /* HTMLSerializer.m */; };
62E0BA971E25456700E4D193 /* HTMLCharacterDataTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 62E0BA961E25456700E4D193 /* HTMLCharacterDataTests.m */; };
62E0BA981E25456700E4D193 /* HTMLCharacterDataTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 62E0BA961E25456700E4D193 /* HTMLCharacterDataTests.m */; };
62E0BA991E25456700E4D193 /* HTMLCharacterDataTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 62E0BA961E25456700E4D193 /* HTMLCharacterDataTests.m */; };
62E1A3B51E610E5300C41C3B /* Fixtures in Resources */ = {isa = PBXBuildFile; fileRef = 62E1A3B41E610E5300C41C3B /* Fixtures */; };
62E1A3B61E610E5300C41C3B /* Fixtures in Resources */ = {isa = PBXBuildFile; fileRef = 62E1A3B41E610E5300C41C3B /* Fixtures */; };
62E1A3B71E610E5300C41C3B /* Fixtures in Resources */ = {isa = PBXBuildFile; fileRef = 62E1A3B41E610E5300C41C3B /* Fixtures */; };
62E2BC0D20C0A93300979D71 /* HTMLTokenPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = 62E2BC0B20C0A93300979D71 /* HTMLTokenPolicy.h */; };
62E2BC0E20C0A93300979D71 /* HTMLTokenPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = 62E2BC0B20C0A93300979D71 /* HTMLTokenPolicy.h */; };
62E2BC0F20C0A93300979D71 /* HTMLTokenPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = 62E2BC0B20C0A93300979D71 /* HTMLTokenPolicy.h */; };
62E2BC1020C0A93300979D71 /* HTMLTokenPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = 62E2BC0B20C0A93300979D71 /* HTMLTokenPolicy.h */; };
62E2BC1120C0A93300979D71 /* HTMLTokenPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = 62E2BC0C20C0A93300979D71 /* HTMLTokenPolicy.m */; };
62E2BC1220C0A93300979D71 /* HTMLTokenPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = 62E2BC0C20C0A93300979D71 /* HTMLTokenPolicy.m */; };
62E2BC1320C0A93300979D71 /* HTMLTokenPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = 62E2BC0C20C0A93300979D71 /* HTMLTokenPolicy.m */; };
62E2BC1420C0A93300979D71 /* HTMLTokenPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = 62E2BC0C20C0A93300979D71 /* HTMLTokenPolicy.m */; };
62EC0A851E158BD80007786B /* HTMLRangeTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 62EC0A841E158BD80007786B /* HTMLRangeTests.m */; };
62EC0A861E158BD80007786B /* HTMLRangeTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 62EC0A841E158BD80007786B /* HTMLRangeTests.m */; };
62EC0A871E158BD80007786B /* HTMLRangeTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 62EC0A841E158BD80007786B /* HTMLRangeTests.m */; };
@@ -731,9 +737,6 @@
625A14DF19C7834100AD0C32 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
625A150619C78ABA00AD0C32 /* HTMLInputStreamReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HTMLInputStreamReader.h; path = include/HTMLInputStreamReader.h; sourceTree = "<group>"; };
625A150719C78ABA00AD0C32 /* HTMLInputStreamReader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLInputStreamReader.m; sourceTree = "<group>"; };
625A67C7224AC62C00C6D57D /* NSString+Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "NSString+Private.h"; path = "include/NSString+Private.h"; sourceTree = "<group>"; };
625A67C8224AC62C00C6D57D /* NSString+Private.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSString+Private.m"; sourceTree = "<group>"; };
625A67D1224ADC7700C6D57D /* HTMLQuircksMode.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HTMLQuircksMode.m; sourceTree = "<group>"; };
625D0F011C2717DE00D7BEB0 /* HTMLNode+Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "HTMLNode+Private.h"; path = "include/HTMLNode+Private.h"; sourceTree = "<group>"; };
625EE4551CBAA41D00F2CC8E /* HTMLKitTestObserver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HTMLKitTestObserver.h; path = HTMLKitTests/HTMLKitTestObserver.h; sourceTree = "<group>"; };
625EE4561CBAA41D00F2CC8E /* HTMLKitTestObserver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HTMLKitTestObserver.m; path = HTMLKitTests/HTMLKitTestObserver.m; sourceTree = "<group>"; };
@@ -746,6 +749,14 @@
6279F87119E17DC700F12EE5 /* HTMLParserInsertionModes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = HTMLParserInsertionModes.h; path = include/HTMLParserInsertionModes.h; sourceTree = "<group>"; };
6279F87219E1808D00F12EE5 /* HTMLElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HTMLElement.h; path = include/HTMLElement.h; sourceTree = "<group>"; };
6279F87319E1808D00F12EE5 /* HTMLElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLElement.m; sourceTree = "<group>"; };
627E609B20B9C55400AB06E8 /* HTMLSanitizer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HTMLSanitizer.h; sourceTree = "<group>"; };
627E609C20B9C55400AB06E8 /* HTMLSanitizer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HTMLSanitizer.m; sourceTree = "<group>"; };
627E60A620B9C58F00AB06E8 /* HTMLElementPolicy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HTMLElementPolicy.h; sourceTree = "<group>"; };
627E60A720B9C58F00AB06E8 /* HTMLElementPolicy.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HTMLElementPolicy.m; sourceTree = "<group>"; };
627E60BA20BA015100AB06E8 /* HTMLSanitizingPolicy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HTMLSanitizingPolicy.h; sourceTree = "<group>"; };
627E60BB20BA015100AB06E8 /* HTMLSanitizingPolicy.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HTMLSanitizingPolicy.m; sourceTree = "<group>"; };
627E60C420BA02E900AB06E8 /* HTMLSanitizingPolicyBuilder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HTMLSanitizingPolicyBuilder.h; sourceTree = "<group>"; };
627E60C520BA02E900AB06E8 /* HTMLSanitizingPolicyBuilder.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HTMLSanitizingPolicyBuilder.m; sourceTree = "<group>"; };
62857C4E1D398642008DC254 /* HTMLKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = HTMLKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
62857CEA1D39A262008DC254 /* HTMLKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = HTMLKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
62857CF31D39A262008DC254 /* HTMLKit-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "HTMLKit-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -755,11 +766,8 @@
628AF63C1BC9D6FB00496128 /* CSSStructuralPseudoSelectors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSSStructuralPseudoSelectors.h; path = include/CSSStructuralPseudoSelectors.h; sourceTree = "<group>"; };
628AF63D1BC9D6FB00496128 /* CSSStructuralPseudoSelectors.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSStructuralPseudoSelectors.m; sourceTree = "<group>"; };
628B7CE61A080E1000602C87 /* HTMLNamespaces.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = HTMLNamespaces.h; path = include/HTMLNamespaces.h; sourceTree = "<group>"; };
6295FB0522F0E770005C6DE8 /* HTMLNodeVisitor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = HTMLNodeVisitor.h; path = include/HTMLNodeVisitor.h; sourceTree = "<group>"; };
6295FB0622F0E770005C6DE8 /* HTMLNodeVisitor.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HTMLNodeVisitor.m; sourceTree = "<group>"; };
6295FB0F22F0ECEE005C6DE8 /* HTMLTreeVisitor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = HTMLTreeVisitor.h; path = include/HTMLTreeVisitor.h; sourceTree = "<group>"; };
6295FB1022F0ECEE005C6DE8 /* HTMLTreeVisitor.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HTMLTreeVisitor.m; sourceTree = "<group>"; };
6295FB1922F0F309005C6DE8 /* HTMLTreeVisitorTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = HTMLTreeVisitorTests.m; path = HTMLKitTests/HTMLTreeVisitorTests.m; sourceTree = "<group>"; };
62A6CDCC20BC9A3D00351AAE /* HTMLAttributePolicy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HTMLAttributePolicy.h; sourceTree = "<group>"; };
62A6CDCD20BC9A3D00351AAE /* HTMLAttributePolicy.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HTMLAttributePolicy.m; sourceTree = "<group>"; };
62A95A4C1FB0FBFC0009FF26 /* HTMLSerializationTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = HTMLSerializationTests.m; path = HTMLKitTests/HTMLSerializationTests.m; sourceTree = "<group>"; };
62ACB8DB1BC5C13E00E283C1 /* CSSPseudoFunctionSelector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CSSPseudoFunctionSelector.h; path = include/CSSPseudoFunctionSelector.h; sourceTree = "<group>"; };
62ACB8DC1BC5C13E00E283C1 /* CSSPseudoFunctionSelector.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSPseudoFunctionSelector.m; sourceTree = "<group>"; };
@@ -773,15 +781,14 @@
62AE594319F992F30043F069 /* HTMLCommentToken.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLCommentToken.m; sourceTree = "<group>"; };
62AE594719F9948A0043F069 /* HTMLCharacterToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HTMLCharacterToken.h; path = include/HTMLCharacterToken.h; sourceTree = "<group>"; };
62AE594819F9948A0043F069 /* HTMLCharacterToken.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLCharacterToken.m; sourceTree = "<group>"; };
62C82E0C20FD2FFD008497A8 /* HTMLKitParserIssuesTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = HTMLKitParserIssuesTests.m; path = HTMLKitTests/HTMLKitParserIssuesTests.m; sourceTree = "<group>"; };
62D8345719FB1AC4009205A9 /* HTML5LibTokenizerTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HTML5LibTokenizerTest.h; path = HTMLKitTests/HTML5LibTokenizerTest.h; sourceTree = "<group>"; };
62D8345819FB1AC4009205A9 /* HTML5LibTokenizerTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HTML5LibTokenizerTest.m; path = HTMLKitTests/HTML5LibTokenizerTest.m; sourceTree = "<group>"; };
62D91C211DE218A500BEFADE /* HTMLRange.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HTMLRange.h; path = include/HTMLRange.h; sourceTree = "<group>"; };
62D91C221DE218A500BEFADE /* HTMLRange.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLRange.m; sourceTree = "<group>"; };
62E0917D22EDEB9D00C61073 /* HTMLSerializer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = HTMLSerializer.h; path = include/HTMLSerializer.h; sourceTree = "<group>"; };
62E0917E22EDEB9D00C61073 /* HTMLSerializer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HTMLSerializer.m; sourceTree = "<group>"; };
62E0BA961E25456700E4D193 /* HTMLCharacterDataTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HTMLCharacterDataTests.m; path = HTMLKitTests/HTMLCharacterDataTests.m; sourceTree = "<group>"; };
62E1A3B41E610E5300C41C3B /* Fixtures */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Fixtures; sourceTree = "<group>"; };
62E2BC0B20C0A93300979D71 /* HTMLTokenPolicy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HTMLTokenPolicy.h; sourceTree = "<group>"; };
62E2BC0C20C0A93300979D71 /* HTMLTokenPolicy.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HTMLTokenPolicy.m; sourceTree = "<group>"; };
62E7CAAE19CDFFB500465A83 /* HTMLTokenizerCharacters.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = HTMLTokenizerCharacters.h; path = include/HTMLTokenizerCharacters.h; sourceTree = "<group>"; };
62EC0A841E158BD80007786B /* HTMLRangeTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HTMLRangeTests.m; path = HTMLKitTests/HTMLRangeTests.m; sourceTree = "<group>"; };
62EC7AE51AEEAC6F0015D3BE /* HTMLMutationAlgorithmsTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HTMLMutationAlgorithmsTests.m; path = HTMLKitTests/HTMLMutationAlgorithmsTests.m; sourceTree = "<group>"; };
@@ -909,23 +916,18 @@
623406E01ADB04F9004677A3 /* HTMLTemplate.m */,
62567F4E1C0CB5750025D458 /* HTMLDOMTokenList.h */,
62567F4F1C0CB5750025D458 /* HTMLDOMTokenList.m */,
6247A9461B152F8C00CCF25C /* HTMLNodeFilter.h */,
624717B71B21FE5400B38302 /* HTMLNodeFilter.m */,
6247A9411B152F4F00CCF25C /* HTMLNodeIterator.h */,
6247A9421B152F4F00CCF25C /* HTMLNodeIterator.m */,
6295FB0522F0E770005C6DE8 /* HTMLNodeVisitor.h */,
6295FB0622F0E770005C6DE8 /* HTMLNodeVisitor.m */,
6295FB0F22F0ECEE005C6DE8 /* HTMLTreeVisitor.h */,
6295FB1022F0ECEE005C6DE8 /* HTMLTreeVisitor.m */,
624717BA1B22009200B38302 /* HTMLTreeWalker.h */,
624717BB1B22009200B38302 /* HTMLTreeWalker.m */,
6247A9461B152F8C00CCF25C /* HTMLNodeFilter.h */,
624717B71B21FE5400B38302 /* HTMLNodeFilter.m */,
62D91C211DE218A500BEFADE /* HTMLRange.h */,
62D91C221DE218A500BEFADE /* HTMLRange.m */,
6238C9831AB8D6330006512E /* HTMLKitDOMExceptions.h */,
6238C9841AB8D6330006512E /* HTMLKitDOMExceptions.m */,
628B7CE61A080E1000602C87 /* HTMLNamespaces.h */,
623719431AA12EE8002E03C8 /* HTMLQuirksMode.h */,
625A67D1224ADC7700C6D57D /* HTMLQuircksMode.m */,
625D0F071C2717E400D7BEB0 /* Private */,
);
name = DOM;
@@ -946,12 +948,12 @@
isa = PBXGroup;
children = (
623916C61AC7209E0066B4FE /* HTMLNodeIteratorTests.m */,
6295FB1922F0F309005C6DE8 /* HTMLTreeVisitorTests.m */,
6247171B1B2240B800C11912 /* HTMLTreeWalkerTests.m */,
624FC3791AE591D80015DDF9 /* HTMLNodesTests.m */,
62EC7AE51AEEAC6F0015D3BE /* HTMLMutationAlgorithmsTests.m */,
62EC0A841E158BD80007786B /* HTMLRangeTests.m */,
62E0BA961E25456700E4D193 /* HTMLCharacterDataTests.m */,
62A95A4C1FB0FBFC0009FF26 /* HTMLSerializationTests.m */,
);
name = DOM;
sourceTree = "<group>";
@@ -1024,9 +1026,9 @@
625A14BC19C7829400AD0C32 /* HTMLKit.h */,
626652F81C03D30F00C3F121 /* HTMLKitErrorDomain.h */,
62AE593219F97CCA0043F069 /* Tokenizing */,
627E609A20B9C53B00AB06E8 /* Sanitizing */,
628E16EC1ADAE71700B15A06 /* Parsing */,
623719441AA1472B002E03C8 /* DOM */,
62E0917C22EDEB8700C61073 /* Serializing */,
628E16ED1ADAE73700B15A06 /* Categories */,
628E16EE1ADAE75300B15A06 /* Structures */,
62079BE61AF5656600D3B402 /* CSS */,
@@ -1052,8 +1054,6 @@
625EE45A1CBB171300F2CC8E /* HTMLKitTestUtil.m */,
6236738C1AC0CD2400FF89B3 /* Tokenizer */,
623975581AC362A5007E26F1 /* Tree Construction */,
62C82E0B20FD2FCB008497A8 /* Parser */,
629621A222F5A24400F81B5A /* Serialization */,
624B9FB71AE072CB00646C4C /* DOM */,
624B9FB81AE072D500646C4C /* Categories */,
624E1A2D1B1D1C8A00E66AAC /* Structures */,
@@ -1090,6 +1090,33 @@
name = Private;
sourceTree = "<group>";
};
627E609A20B9C53B00AB06E8 /* Sanitizing */ = {
isa = PBXGroup;
children = (
627E609B20B9C55400AB06E8 /* HTMLSanitizer.h */,
627E609C20B9C55400AB06E8 /* HTMLSanitizer.m */,
627E60BA20BA015100AB06E8 /* HTMLSanitizingPolicy.h */,
627E60BB20BA015100AB06E8 /* HTMLSanitizingPolicy.m */,
627E60C420BA02E900AB06E8 /* HTMLSanitizingPolicyBuilder.h */,
627E60C520BA02E900AB06E8 /* HTMLSanitizingPolicyBuilder.m */,
627E60A520B9C55900AB06E8 /* Policies */,
);
name = Sanitizing;
sourceTree = "<group>";
};
627E60A520B9C55900AB06E8 /* Policies */ = {
isa = PBXGroup;
children = (
62E2BC0B20C0A93300979D71 /* HTMLTokenPolicy.h */,
62E2BC0C20C0A93300979D71 /* HTMLTokenPolicy.m */,
627E60A620B9C58F00AB06E8 /* HTMLElementPolicy.h */,
627E60A720B9C58F00AB06E8 /* HTMLElementPolicy.m */,
62A6CDCC20BC9A3D00351AAE /* HTMLAttributePolicy.h */,
62A6CDCD20BC9A3D00351AAE /* HTMLAttributePolicy.m */,
);
name = Policies;
sourceTree = "<group>";
};
628E16EC1ADAE71700B15A06 /* Parsing */ = {
isa = PBXGroup;
children = (
@@ -1111,8 +1138,6 @@
628E16ED1ADAE73700B15A06 /* Categories */ = {
isa = PBXGroup;
children = (
625A67C7224AC62C00C6D57D /* NSString+Private.h */,
625A67C8224AC62C00C6D57D /* NSString+Private.m */,
6235CE991AA509430026937B /* NSString+HTMLKit.h */,
6235CE9A1AA509430026937B /* NSString+HTMLKit.m */,
624B28C21B04190D0048D328 /* NSCharacterSet+HTMLKit.h */,
@@ -1130,14 +1155,6 @@
name = Structures;
sourceTree = "<group>";
};
629621A222F5A24400F81B5A /* Serialization */ = {
isa = PBXGroup;
children = (
62A95A4C1FB0FBFC0009FF26 /* HTMLSerializationTests.m */,
);
name = Serialization;
sourceTree = "<group>";
};
62AE593219F97CCA0043F069 /* Tokenizing */ = {
isa = PBXGroup;
children = (
@@ -1149,6 +1166,14 @@
62E7CAAE19CDFFB500465A83 /* HTMLTokenizerCharacters.h */,
62F31FDB19E9DCCF007F0657 /* HTMLTokenizerEntities.h */,
62F31FDC19E9DCCF007F0657 /* HTMLTokenizerEntities.m */,
62E2BC1520C0AAD000979D71 /* Tokens */,
);
name = Tokenizing;
sourceTree = "<group>";
};
62E2BC1520C0AAD000979D71 /* Tokens */ = {
isa = PBXGroup;
children = (
624AC8FE19FBF4F700BD3C4A /* HTMLTokens.h */,
624493AA19CD0CBE00BCDDF4 /* HTMLToken.h */,
624493AB19CD0CBE00BCDDF4 /* HTMLToken.m */,
@@ -1165,24 +1190,7 @@
6238039D1AB63A8C008A53D0 /* HTMLEOFToken.h */,
6238039E1AB63A8C008A53D0 /* HTMLEOFToken.m */,
);
name = Tokenizing;
sourceTree = "<group>";
};
62C82E0B20FD2FCB008497A8 /* Parser */ = {
isa = PBXGroup;
children = (
62C82E0C20FD2FFD008497A8 /* HTMLKitParserIssuesTests.m */,
);
name = Parser;
sourceTree = "<group>";
};
62E0917C22EDEB8700C61073 /* Serializing */ = {
isa = PBXGroup;
children = (
62E0917D22EDEB9D00C61073 /* HTMLSerializer.h */,
62E0917E22EDEB9D00C61073 /* HTMLSerializer.m */,
);
name = Serializing;
name = Tokens;
sourceTree = "<group>";
};
62ECBEDF1C0B671000AF847B /* Parsing */ = {
@@ -1256,16 +1264,16 @@
62D91C231DE218A500BEFADE /* HTMLRange.h in Headers */,
62ECBEE51C0B69FD00AF847B /* HTMLTokenizerCharacters.h in Headers */,
62ECBEE61C0B69FD00AF847B /* HTMLTokenizerEntities.h in Headers */,
627E60A820B9C58F00AB06E8 /* HTMLElementPolicy.h in Headers */,
625D0F031C2717DE00D7BEB0 /* HTMLNode+Private.h in Headers */,
62ECBEE71C0B69FD00AF847B /* HTMLTokens.h in Headers */,
62ECBF1B1C0B6ABF00AF847B /* HTMLElement.h in Headers */,
62ECBEE81C0B69FD00AF847B /* HTMLToken.h in Headers */,
62ECBEE91C0B69FD00AF847B /* HTMLCharacterToken.h in Headers */,
627E60C620BA02E900AB06E8 /* HTMLSanitizingPolicyBuilder.h in Headers */,
62ECBEEA1C0B69FD00AF847B /* HTMLCommentToken.h in Headers */,
62ECBEEB1C0B69FD00AF847B /* HTMLDOCTYPEToken.h in Headers */,
626BE1E21DF3819500C49514 /* HTMLDOMUtils.h in Headers */,
6295FB1122F0ECEE005C6DE8 /* HTMLTreeVisitor.h in Headers */,
625A67C9224AC62C00C6D57D /* NSString+Private.h in Headers */,
62ECBEEC1C0B69FD00AF847B /* HTMLParseErrorToken.h in Headers */,
62ECBEED1C0B69FD00AF847B /* HTMLTagToken.h in Headers */,
62ECBEEE1C0B69FD00AF847B /* HTMLEOFToken.h in Headers */,
@@ -1277,20 +1285,21 @@
62ECBEF11C0B69FD00AF847B /* HTMLListOfActiveFormattingElements.h in Headers */,
62ECBEF21C0B69FD00AF847B /* HTMLElementTypes.h in Headers */,
62ECBEF31C0B69FD00AF847B /* HTMLElementAdjustment.h in Headers */,
627E60BC20BA015100AB06E8 /* HTMLSanitizingPolicy.h in Headers */,
62ECBEF41C0B69FD00AF847B /* HTMLParserInsertionModes.h in Headers */,
624C777A1DE9D05E00DD6DFA /* HTMLCharacterData.h in Headers */,
62ECBEF51C0B69FD00AF847B /* HTMLMarker.h in Headers */,
62ECBEF61C0B69FE00AF847B /* HTMLDOM.h in Headers */,
6295FB0722F0E770005C6DE8 /* HTMLNodeVisitor.h in Headers */,
62ECBEF71C0B69FE00AF847B /* HTMLNode.h in Headers */,
621CC4A51DEA721A00D1992A /* HTMLParser+Private.h in Headers */,
62ECBEF81C0B69FE00AF847B /* HTMLDocument.h in Headers */,
62E2BC0D20C0A93300979D71 /* HTMLTokenPolicy.h in Headers */,
62ECBEF91C0B69FE00AF847B /* HTMLDocumentType.h in Headers */,
62ECBEFA1C0B69FE00AF847B /* HTMLDocumentFragment.h in Headers */,
62E0917F22EDEB9D00C61073 /* HTMLSerializer.h in Headers */,
62ECBEFC1C0B69FE00AF847B /* HTMLComment.h in Headers */,
62ECBEFD1C0B69FE00AF847B /* HTMLText.h in Headers */,
62ECBEFE1C0B69FE00AF847B /* HTMLTemplate.h in Headers */,
627E609D20B9C55400AB06E8 /* HTMLSanitizer.h in Headers */,
62ECBEFF1C0B69FE00AF847B /* HTMLNodeIterator.h in Headers */,
62ECBF001C0B69FF00AF847B /* HTMLTreeWalker.h in Headers */,
62ECBF011C0B69FF00AF847B /* HTMLNodeTraversal.h in Headers */,
@@ -1316,6 +1325,7 @@
62ECBF131C0B6A0200AF847B /* CSSPseudoClassSelector.h in Headers */,
62ECBF141C0B6A0200AF847B /* CSSNthExpressionSelector.h in Headers */,
62ECBF151C0B6A0200AF847B /* CSSPseudoFunctionSelector.h in Headers */,
62A6CDCE20BC9A3D00351AAE /* HTMLAttributePolicy.h in Headers */,
62ECBF161C0B6A0300AF847B /* CSSCombinatorSelector.h in Headers */,
62ECBF171C0B6A0300AF847B /* CSSCompoundSelector.h in Headers */,
);
@@ -1333,16 +1343,16 @@
62857CA31D398973008DC254 /* HTMLDocumentType.h in Headers */,
62D91C261DE218A500BEFADE /* HTMLRange.h in Headers */,
62857C6B1D3988EE008DC254 /* HTMLKit.h in Headers */,
627E60AB20B9C58F00AB06E8 /* HTMLElementPolicy.h in Headers */,
62857C701D398907008DC254 /* HTMLTokenizerCharacters.h in Headers */,
62857C6F1D398907008DC254 /* HTMLTokenizerStates.h in Headers */,
62857C721D398907008DC254 /* HTMLTokens.h in Headers */,
62857CBF1D398999008DC254 /* NSCharacterSet+HTMLKit.h in Headers */,
62857CDD1D3989CE008DC254 /* CSSNthExpressionSelector.h in Headers */,
627E60C920BA02E900AB06E8 /* HTMLSanitizingPolicyBuilder.h in Headers */,
62857C841D398917008DC254 /* HTMLParser.h in Headers */,
62857CDB1D3989CE008DC254 /* CSSAttributeSelector.h in Headers */,
62857C791D398907008DC254 /* HTMLEOFToken.h in Headers */,
6295FB1422F0ECEE005C6DE8 /* HTMLTreeVisitor.h in Headers */,
625A67CC224AC62C00C6D57D /* NSString+Private.h in Headers */,
626BE1E51DF3819500C49514 /* HTMLDOMUtils.h in Headers */,
62857CC41D3989A9008DC254 /* CSSSelectors.h in Headers */,
62857C731D398907008DC254 /* HTMLToken.h in Headers */,
@@ -1354,20 +1364,21 @@
62857CA61D398973008DC254 /* HTMLText.h in Headers */,
62857C751D398907008DC254 /* HTMLCommentToken.h in Headers */,
62857C891D398927008DC254 /* HTMLParserInsertionModes.h in Headers */,
627E60BF20BA015100AB06E8 /* HTMLSanitizingPolicy.h in Headers */,
62857CA81D398973008DC254 /* HTMLDOMTokenList.h in Headers */,
62857C851D398927008DC254 /* HTMLStackOfOpenElements.h in Headers */,
624C777D1DE9D05E00DD6DFA /* HTMLCharacterData.h in Headers */,
62857CDF1D3989CE008DC254 /* CSSCombinatorSelector.h in Headers */,
6295FB0A22F0E770005C6DE8 /* HTMLNodeVisitor.h in Headers */,
62857CA91D398973008DC254 /* HTMLNodeIterator.h in Headers */,
62857CAE1D398973008DC254 /* HTMLQuirksMode.h in Headers */,
621CC4A81DEA721A00D1992A /* HTMLParser+Private.h in Headers */,
62E2BC1020C0A93300979D71 /* HTMLTokenPolicy.h in Headers */,
62857CAF1D398977008DC254 /* HTMLNodeTraversal.h in Headers */,
62857C771D398907008DC254 /* HTMLParseErrorToken.h in Headers */,
62E0918222EDEB9D00C61073 /* HTMLSerializer.h in Headers */,
62857CDC1D3989CE008DC254 /* CSSPseudoClassSelector.h in Headers */,
62857CC21D3989A1008DC254 /* HTMLOrderedDictionary.h in Headers */,
62857C761D398907008DC254 /* HTMLDOCTYPEToken.h in Headers */,
627E60A020B9C55400AB06E8 /* HTMLSanitizer.h in Headers */,
62857CE21D39A119008DC254 /* HTMLNode+Private.h in Headers */,
62857CD71D3989C2008DC254 /* CSSNthExpressionParser.h in Headers */,
62857CAD1D398973008DC254 /* HTMLNamespaces.h in Headers */,
@@ -1393,6 +1404,7 @@
62857C6C1D3988EE008DC254 /* HTMLKitErrorDomain.h in Headers */,
62857CD51D3989BF008DC254 /* CSSInputStream.h in Headers */,
62857C741D398907008DC254 /* HTMLCharacterToken.h in Headers */,
62A6CDD120BC9A3D00351AAE /* HTMLAttributePolicy.h in Headers */,
62857CE31D39A1B5008DC254 /* HTMLElement.h in Headers */,
62857CA71D398973008DC254 /* HTMLTemplate.h in Headers */,
);
@@ -1410,16 +1422,16 @@
62857D7E1D39A45B008DC254 /* HTMLNode+Private.h in Headers */,
62D91C251DE218A500BEFADE /* HTMLRange.h in Headers */,
62857D701D39A44E008DC254 /* HTMLDocumentType.h in Headers */,
627E60AA20B9C58F00AB06E8 /* HTMLElementPolicy.h in Headers */,
62857D861D39A476008DC254 /* CSSCodePoints.h in Headers */,
62857D8A1D39A47F008DC254 /* CSSTypeSelector.h in Headers */,
62857D491D39A3F4008DC254 /* HTMLKit.h in Headers */,
62857D8D1D39A47F008DC254 /* CSSNthExpressionSelector.h in Headers */,
62857D721D39A44E008DC254 /* HTMLElement.h in Headers */,
627E60C820BA02E900AB06E8 /* HTMLSanitizingPolicyBuilder.h in Headers */,
62857D4E1D39A40A008DC254 /* HTMLTokenizerCharacters.h in Headers */,
62857D4D1D39A40A008DC254 /* HTMLTokenizerStates.h in Headers */,
62857D501D39A411008DC254 /* HTMLTokens.h in Headers */,
6295FB1322F0ECEE005C6DE8 /* HTMLTreeVisitor.h in Headers */,
625A67CB224AC62C00C6D57D /* NSString+Private.h in Headers */,
626BE1E41DF3819500C49514 /* HTMLDOMUtils.h in Headers */,
62857D7B1D39A452008DC254 /* HTMLNamespaces.h in Headers */,
62857D581D39A416008DC254 /* HTMLParser.h in Headers */,
@@ -1431,20 +1443,21 @@
62857D531D39A411008DC254 /* HTMLCommentToken.h in Headers */,
62857D741D39A44E008DC254 /* HTMLText.h in Headers */,
62857D5D1D39A41D008DC254 /* HTMLParserInsertionModes.h in Headers */,
627E60BE20BA015100AB06E8 /* HTMLSanitizingPolicy.h in Headers */,
62857D591D39A41D008DC254 /* HTMLStackOfOpenElements.h in Headers */,
62857D781D39A44E008DC254 /* HTMLTreeWalker.h in Headers */,
624C777C1DE9D05E00DD6DFA /* HTMLCharacterData.h in Headers */,
62857D551D39A411008DC254 /* HTMLParseErrorToken.h in Headers */,
6295FB0922F0E770005C6DE8 /* HTMLNodeVisitor.h in Headers */,
62857D541D39A411008DC254 /* HTMLDOCTYPEToken.h in Headers */,
62857D871D39A476008DC254 /* CSSInputStream.h in Headers */,
621CC4A71DEA721A00D1992A /* HTMLParser+Private.h in Headers */,
62E2BC0F20C0A93300979D71 /* HTMLTokenPolicy.h in Headers */,
62857D8F1D39A47F008DC254 /* CSSCombinatorSelector.h in Headers */,
62857D5C1D39A41D008DC254 /* HTMLElementAdjustment.h in Headers */,
62E0918122EDEB9D00C61073 /* HTMLSerializer.h in Headers */,
62857D891D39A47F008DC254 /* CSSSelectorBlock.h in Headers */,
62857D6D1D39A44E008DC254 /* HTMLDOM.h in Headers */,
62857D751D39A44E008DC254 /* HTMLTemplate.h in Headers */,
627E609F20B9C55400AB06E8 /* HTMLSanitizer.h in Headers */,
62857D771D39A44E008DC254 /* HTMLNodeIterator.h in Headers */,
62857D711D39A44E008DC254 /* HTMLDocumentFragment.h in Headers */,
62857D851D39A472008DC254 /* CSSNthExpressionParser.h in Headers */,
@@ -1470,6 +1483,7 @@
62857D4A1D39A3F4008DC254 /* HTMLKitErrorDomain.h in Headers */,
62857D7C1D39A452008DC254 /* HTMLQuirksMode.h in Headers */,
62857D791D39A44E008DC254 /* HTMLNodeFilter.h in Headers */,
62A6CDD020BC9A3D00351AAE /* HTMLAttributePolicy.h in Headers */,
62857D521D39A411008DC254 /* HTMLCharacterToken.h in Headers */,
62857D811D39A466008DC254 /* HTMLOrderedDictionary.h in Headers */,
);
@@ -1487,16 +1501,16 @@
62D91C241DE218A500BEFADE /* HTMLRange.h in Headers */,
62ECBFA81C0B6D3A00AF847B /* HTMLDocument.h in Headers */,
62ECBFA91C0B6D3A00AF847B /* HTMLDocumentType.h in Headers */,
627E60A920B9C58F00AB06E8 /* HTMLElementPolicy.h in Headers */,
62ECBFAA1C0B6D3A00AF847B /* HTMLDocumentFragment.h in Headers */,
62ECBFAB1C0B6D3B00AF847B /* HTMLElement.h in Headers */,
62ECBFAC1C0B6D3B00AF847B /* HTMLComment.h in Headers */,
62ECBFAD1C0B6D3B00AF847B /* HTMLText.h in Headers */,
62ECBFAE1C0B6D3B00AF847B /* HTMLTemplate.h in Headers */,
627E60C720BA02E900AB06E8 /* HTMLSanitizingPolicyBuilder.h in Headers */,
62ECBFAF1C0B6D3B00AF847B /* HTMLNodeIterator.h in Headers */,
62ECBFB01C0B6D3C00AF847B /* HTMLTreeWalker.h in Headers */,
62ECBFB21C0B6D3C00AF847B /* HTMLNodeFilter.h in Headers */,
6295FB1222F0ECEE005C6DE8 /* HTMLTreeVisitor.h in Headers */,
625A67CA224AC62C00C6D57D /* NSString+Private.h in Headers */,
62567F511C0CB5750025D458 /* HTMLDOMTokenList.h in Headers */,
62ECBFB31C0B6D3C00AF847B /* HTMLKitDOMExceptions.h in Headers */,
62ECBFB41C0B6D3D00AF847B /* HTMLNamespaces.h in Headers */,
@@ -1508,20 +1522,21 @@
62ECBFB81C0B6D3E00AF847B /* HTMLOrderedDictionary.h in Headers */,
62ECBFB91C0B6D3E00AF847B /* CSSSelectors.h in Headers */,
62ECBFBA1C0B6D3E00AF847B /* CSSStructuralPseudoSelectors.h in Headers */,
627E60BD20BA015100AB06E8 /* HTMLSanitizingPolicy.h in Headers */,
624C777B1DE9D05E00DD6DFA /* HTMLCharacterData.h in Headers */,
62ECBFBD1C0B6D3F00AF847B /* CSSSelectorParser.h in Headers */,
62ECBFBE1C0B6D4000AF847B /* CSSNthExpressionParser.h in Headers */,
62ECBFBF1C0B6D4000AF847B /* CSSSelector.h in Headers */,
6295FB0822F0E770005C6DE8 /* HTMLNodeVisitor.h in Headers */,
621CC4A61DEA721A00D1992A /* HTMLParser+Private.h in Headers */,
62ECBFC01C0B6D4000AF847B /* CSSSelectorBlock.h in Headers */,
62ECBFC11C0B6D4100AF847B /* CSSTypeSelector.h in Headers */,
62E2BC0E20C0A93300979D71 /* HTMLTokenPolicy.h in Headers */,
62ECBFC21C0B6D4100AF847B /* CSSAttributeSelector.h in Headers */,
62ECBFC31C0B6D4100AF847B /* CSSPseudoClassSelector.h in Headers */,
62E0918022EDEB9D00C61073 /* HTMLSerializer.h in Headers */,
62ECBFC41C0B6D4200AF847B /* CSSNthExpressionSelector.h in Headers */,
62ECBFC51C0B6D4200AF847B /* CSSPseudoFunctionSelector.h in Headers */,
62ECBFC61C0B6D4300AF847B /* CSSCombinatorSelector.h in Headers */,
627E609E20B9C55400AB06E8 /* HTMLSanitizer.h in Headers */,
62F7E5A31DEB63F900DEF09B /* HTMLRange+Private.h in Headers */,
626BE1E31DF3819500C49514 /* HTMLDOMUtils.h in Headers */,
625D0F041C2717DE00D7BEB0 /* HTMLNode+Private.h in Headers */,
@@ -1547,6 +1562,7 @@
62ECBFA31C0B6D3900AF847B /* HTMLElementAdjustment.h in Headers */,
62ECBFA41C0B6D3900AF847B /* HTMLParserInsertionModes.h in Headers */,
62ECBFA51C0B6D3900AF847B /* HTMLMarker.h in Headers */,
62A6CDCF20BC9A3D00351AAE /* HTMLAttributePolicy.h in Headers */,
62ECBFBB1C0B6D3F00AF847B /* CSSCodePoints.h in Headers */,
62ECBFBC1C0B6D3F00AF847B /* CSSInputStream.h in Headers */,
);
@@ -1807,6 +1823,8 @@
62ECBF1D1C0B6B7900AF847B /* HTMLTokenizer.m in Sources */,
62ECBF1E1C0B6B7900AF847B /* HTMLTokenizerEntities.m in Sources */,
62ECBF1F1C0B6B7900AF847B /* HTMLToken.m in Sources */,
62E2BC1120C0A93300979D71 /* HTMLTokenPolicy.m in Sources */,
627E60A120B9C55400AB06E8 /* HTMLSanitizer.m in Sources */,
62ECBF201C0B6B7900AF847B /* HTMLCharacterToken.m in Sources */,
62ECBF211C0B6B7900AF847B /* HTMLCommentToken.m in Sources */,
62ECBF221C0B6B7900AF847B /* HTMLDOCTYPEToken.m in Sources */,
@@ -1816,18 +1834,15 @@
62ECBF251C0B6B7900AF847B /* HTMLEOFToken.m in Sources */,
62ECBF261C0B6B7900AF847B /* HTMLParser.m in Sources */,
62ECBF271C0B6B7900AF847B /* HTMLStackOfOpenElements.m in Sources */,
62E0918322EDEB9D00C61073 /* HTMLSerializer.m in Sources */,
62ECBF281C0B6B7900AF847B /* HTMLListOfActiveFormattingElements.m in Sources */,
6295FB0B22F0E770005C6DE8 /* HTMLNodeVisitor.m in Sources */,
62ECBF291C0B6B7900AF847B /* HTMLMarker.m in Sources */,
62ECBF2A1C0B6B7900AF847B /* HTMLNode.m in Sources */,
62ECBF2B1C0B6B7900AF847B /* HTMLDocument.m in Sources */,
62ECBF2C1C0B6B7900AF847B /* HTMLDocumentType.m in Sources */,
625A67D2224ADC7700C6D57D /* HTMLQuircksMode.m in Sources */,
62ECBF2D1C0B6B7900AF847B /* HTMLDocumentFragment.m in Sources */,
62ECBF2E1C0B6B7900AF847B /* HTMLElement.m in Sources */,
6295FB1522F0ECEE005C6DE8 /* HTMLTreeVisitor.m in Sources */,
62ECBF2F1C0B6B7900AF847B /* HTMLComment.m in Sources */,
62A6CDD220BC9A3D00351AAE /* HTMLAttributePolicy.m in Sources */,
62ECBF301C0B6B7900AF847B /* HTMLText.m in Sources */,
62ECBF311C0B6B7900AF847B /* HTMLTemplate.m in Sources */,
62ECBF321C0B6B7900AF847B /* HTMLNodeIterator.m in Sources */,
@@ -1837,13 +1852,14 @@
62ECBF361C0B6B7900AF847B /* HTMLKitDOMExceptions.m in Sources */,
62ECBF371C0B6B7900AF847B /* NSString+HTMLKit.m in Sources */,
62ECBF381C0B6B7900AF847B /* NSCharacterSet+HTMLKit.m in Sources */,
627E60AC20B9C58F00AB06E8 /* HTMLElementPolicy.m in Sources */,
62ECBF391C0B6B7900AF847B /* HTMLOrderedDictionary.m in Sources */,
62ECBF3A1C0B6B7900AF847B /* CSSSelectors.m in Sources */,
62ECBF3B1C0B6B7900AF847B /* CSSStructuralPseudoSelectors.m in Sources */,
62ECBF3C1C0B6B7900AF847B /* CSSInputStream.m in Sources */,
627E60CA20BA02E900AB06E8 /* HTMLSanitizingPolicyBuilder.m in Sources */,
62ECBF3D1C0B6B7900AF847B /* CSSSelectorParser.m in Sources */,
62ECBF3E1C0B6B7900AF847B /* CSSNthExpressionParser.m in Sources */,
625A67CD224AC62C00C6D57D /* NSString+Private.m in Sources */,
62ECBF3F1C0B6B7900AF847B /* CSSSelector.m in Sources */,
62ECBF401C0B6B7900AF847B /* CSSSelectorBlock.m in Sources */,
62ECBF411C0B6B7900AF847B /* CSSTypeSelector.m in Sources */,
@@ -1855,6 +1871,7 @@
62ECBF471C0B6B7A00AF847B /* CSSCompoundSelector.m in Sources */,
62567F521C0CB5750025D458 /* HTMLDOMTokenList.m in Sources */,
624C777E1DE9D05E00DD6DFA /* HTMLCharacterData.m in Sources */,
627E60C020BA015100AB06E8 /* HTMLSanitizingPolicy.m in Sources */,
626BE1E61DF3819600C49514 /* HTMLDOMUtils.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -1867,7 +1884,6 @@
620AB7B12087F18D00AFCCC7 /* CSSStructuralPseudoSelectors.m in Sources */,
62E0BA971E25456700E4D193 /* HTMLCharacterDataTests.m in Sources */,
6216ACFD1C28DCC80074CAB4 /* CSSExtensionSelectorsParsingTests.m in Sources */,
62C82E0D20FD2FFD008497A8 /* HTMLKitParserIssuesTests.m in Sources */,
62132E5A1C01F83200084175 /* CSSSelectorTest.m in Sources */,
6239755B1AC362CA007E26F1 /* HTMLKitTreeConstructionTests.m in Sources */,
62F658711BD83C8E0045F137 /* CSSNThExpressionSelectorTests.m in Sources */,
@@ -1889,7 +1905,6 @@
624FC37B1AE591D80015DDF9 /* HTMLNodesTests.m in Sources */,
621FBE5B1BDAD68700BC9555 /* CSSSelectorParserTests.m in Sources */,
621FBE5E1BDAD90200BC9555 /* CSSCombinatorSelectorTests.m in Sources */,
6295FB1A22F0F309005C6DE8 /* HTMLTreeVisitorTests.m in Sources */,
625EE45B1CBB171300F2CC8E /* HTMLKitTestUtil.m in Sources */,
628AF6301BC99A6C00496128 /* CSSNthExpressionsParserTests.m in Sources */,
);
@@ -1903,6 +1918,8 @@
62857CB31D398992008DC254 /* HTMLDocumentFragment.m in Sources */,
62857CB61D398992008DC254 /* HTMLText.m in Sources */,
62857C7D1D398912008DC254 /* HTMLToken.m in Sources */,
62E2BC1420C0A93300979D71 /* HTMLTokenPolicy.m in Sources */,
627E60A420B9C55400AB06E8 /* HTMLSanitizer.m in Sources */,
62857CB41D398992008DC254 /* HTMLElement.m in Sources */,
62857CCB1D3989B8008DC254 /* CSSSelector.m in Sources */,
62857C8B1D39892D008DC254 /* HTMLParser.m in Sources */,
@@ -1912,18 +1929,15 @@
62857C7B1D398912008DC254 /* HTMLTokenizer.m in Sources */,
62857CB21D398992008DC254 /* HTMLDocument.m in Sources */,
62857CBD1D398992008DC254 /* HTMLKitDOMExceptions.m in Sources */,
62E0918622EDEB9D00C61073 /* HTMLSerializer.m in Sources */,
62857CD11D3989B8008DC254 /* CSSPseudoFunctionSelector.m in Sources */,
6295FB0E22F0E770005C6DE8 /* HTMLNodeVisitor.m in Sources */,
62857C7F1D398912008DC254 /* HTMLCommentToken.m in Sources */,
62857C811D398912008DC254 /* HTMLParseErrorToken.m in Sources */,
62857CD21D3989B8008DC254 /* CSSCombinatorSelector.m in Sources */,
62857CB91D398992008DC254 /* HTMLNodeIterator.m in Sources */,
625A67D5224ADC7700C6D57D /* HTMLQuircksMode.m in Sources */,
62857CCF1D3989B8008DC254 /* CSSPseudoClassSelector.m in Sources */,
62857C7A1D398912008DC254 /* HTMLInputStreamReader.m in Sources */,
6295FB1822F0ECEE005C6DE8 /* HTMLTreeVisitor.m in Sources */,
62857CC11D39899C008DC254 /* NSCharacterSet+HTMLKit.m in Sources */,
62A6CDD520BC9A3D00351AAE /* HTMLAttributePolicy.m in Sources */,
62857CCD1D3989B8008DC254 /* CSSTypeSelector.m in Sources */,
62857C8E1D39892D008DC254 /* HTMLMarker.m in Sources */,
62857CB51D398992008DC254 /* HTMLComment.m in Sources */,
@@ -1933,13 +1947,14 @@
62857CC81D3989B8008DC254 /* CSSSelectorParser.m in Sources */,
62857CBA1D398992008DC254 /* HTMLTreeWalker.m in Sources */,
62857CE11D39A108008DC254 /* HTMLDocumentType.m in Sources */,
627E60AF20B9C58F00AB06E8 /* HTMLElementPolicy.m in Sources */,
62857CC71D3989AF008DC254 /* CSSStructuralPseudoSelectors.m in Sources */,
62857C8D1D39892D008DC254 /* HTMLListOfActiveFormattingElements.m in Sources */,
62857CB71D398992008DC254 /* HTMLTemplate.m in Sources */,
62857CBC1D398992008DC254 /* HTMLNodeFilter.m in Sources */,
627E60CD20BA02E900AB06E8 /* HTMLSanitizingPolicyBuilder.m in Sources */,
62857CC01D39899C008DC254 /* NSString+HTMLKit.m in Sources */,
62857CCA1D3989B8008DC254 /* CSSInputStream.m in Sources */,
625A67D0224AC62C00C6D57D /* NSString+Private.m in Sources */,
62857CCE1D3989B8008DC254 /* CSSAttributeSelector.m in Sources */,
62857CC31D3989A3008DC254 /* HTMLOrderedDictionary.m in Sources */,
62857CC91D3989B8008DC254 /* CSSNthExpressionParser.m in Sources */,
@@ -1951,6 +1966,7 @@
62857CB81D398992008DC254 /* HTMLDOMTokenList.m in Sources */,
62857C831D398912008DC254 /* HTMLEOFToken.m in Sources */,
624C77811DE9D05E00DD6DFA /* HTMLCharacterData.m in Sources */,
627E60C320BA015100AB06E8 /* HTMLSanitizingPolicy.m in Sources */,
626BE1E91DF3819600C49514 /* HTMLDOMUtils.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -1963,6 +1979,8 @@
62857D121D39A32A008DC254 /* HTMLDocumentFragment.m in Sources */,
62857D151D39A32A008DC254 /* HTMLText.m in Sources */,
62857D0B1D39A328008DC254 /* HTMLParser.m in Sources */,
62E2BC1320C0A93300979D71 /* HTMLTokenPolicy.m in Sources */,
627E60A320B9C55400AB06E8 /* HTMLSanitizer.m in Sources */,
62857D131D39A32A008DC254 /* HTMLElement.m in Sources */,
62857D251D39A334008DC254 /* CSSSelector.m in Sources */,
62857D021D39A324008DC254 /* HTMLTokenizer.m in Sources */,
@@ -1972,18 +1990,15 @@
62857D061D39A324008DC254 /* HTMLCommentToken.m in Sources */,
62857D111D39A32A008DC254 /* HTMLDocumentType.m in Sources */,
62857D1C1D39A32A008DC254 /* HTMLKitDOMExceptions.m in Sources */,
62E0918522EDEB9D00C61073 /* HTMLSerializer.m in Sources */,
62857D2B1D39A334008DC254 /* CSSPseudoFunctionSelector.m in Sources */,
6295FB0D22F0E770005C6DE8 /* HTMLNodeVisitor.m in Sources */,
62857D081D39A324008DC254 /* HTMLParseErrorToken.m in Sources */,
62857D0F1D39A32A008DC254 /* HTMLNode.m in Sources */,
62857D2C1D39A334008DC254 /* CSSCombinatorSelector.m in Sources */,
62857D181D39A32A008DC254 /* HTMLNodeIterator.m in Sources */,
625A67D4224ADC7700C6D57D /* HTMLQuircksMode.m in Sources */,
62857D291D39A334008DC254 /* CSSPseudoClassSelector.m in Sources */,
62857D011D39A324008DC254 /* HTMLInputStreamReader.m in Sources */,
6295FB1722F0ECEE005C6DE8 /* HTMLTreeVisitor.m in Sources */,
62857D1E1D39A334008DC254 /* NSCharacterSet+HTMLKit.m in Sources */,
62A6CDD420BC9A3D00351AAE /* HTMLAttributePolicy.m in Sources */,
62857D271D39A334008DC254 /* CSSTypeSelector.m in Sources */,
62857D0E1D39A328008DC254 /* HTMLMarker.m in Sources */,
62857D071D39A324008DC254 /* HTMLDOCTYPEToken.m in Sources */,
@@ -1993,13 +2008,14 @@
62857D0D1D39A328008DC254 /* HTMLListOfActiveFormattingElements.m in Sources */,
62857D221D39A334008DC254 /* CSSSelectorParser.m in Sources */,
62857D191D39A32A008DC254 /* HTMLTreeWalker.m in Sources */,
627E60AE20B9C58F00AB06E8 /* HTMLElementPolicy.m in Sources */,
62857D211D39A334008DC254 /* CSSStructuralPseudoSelectors.m in Sources */,
62857D091D39A324008DC254 /* HTMLTagToken.m in Sources */,
62857D161D39A32A008DC254 /* HTMLTemplate.m in Sources */,
62857D1B1D39A32A008DC254 /* HTMLNodeFilter.m in Sources */,
627E60CC20BA02E900AB06E8 /* HTMLSanitizingPolicyBuilder.m in Sources */,
62857D1D1D39A334008DC254 /* NSString+HTMLKit.m in Sources */,
62857D241D39A334008DC254 /* CSSInputStream.m in Sources */,
625A67CF224AC62C00C6D57D /* NSString+Private.m in Sources */,
62857D281D39A334008DC254 /* CSSAttributeSelector.m in Sources */,
62857D1F1D39A334008DC254 /* HTMLOrderedDictionary.m in Sources */,
62857D231D39A334008DC254 /* CSSNthExpressionParser.m in Sources */,
@@ -2011,6 +2027,7 @@
62857D171D39A32A008DC254 /* HTMLDOMTokenList.m in Sources */,
62857D0A1D39A324008DC254 /* HTMLEOFToken.m in Sources */,
624C77801DE9D05E00DD6DFA /* HTMLCharacterData.m in Sources */,
627E60C220BA015100AB06E8 /* HTMLSanitizingPolicy.m in Sources */,
626BE1E81DF3819600C49514 /* HTMLDOMUtils.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -2023,7 +2040,6 @@
620AB7B32087F18D00AFCCC7 /* CSSStructuralPseudoSelectors.m in Sources */,
62E0BA991E25456700E4D193 /* HTMLCharacterDataTests.m in Sources */,
62857D3B1D39A345008DC254 /* CSSSelectorTest.m in Sources */,
62C82E0F20FD2FFD008497A8 /* HTMLKitParserIssuesTests.m in Sources */,
62857D421D39A345008DC254 /* CSSCombinatorSelectorTests.m in Sources */,
62857D3C1D39A345008DC254 /* CSSSelectorParserTests.m in Sources */,
62857D301D39A339008DC254 /* HTMLKitTokenizerPerformance.m in Sources */,
@@ -2045,7 +2061,6 @@
62857D341D39A33F008DC254 /* HTMLNodeIteratorTests.m in Sources */,
62857D2E1D39A339008DC254 /* HTML5LibTokenizerTest.m in Sources */,
62857D351D39A33F008DC254 /* HTMLTreeWalkerTests.m in Sources */,
6295FB1C22F0F309005C6DE8 /* HTMLTreeVisitorTests.m in Sources */,
62857D441D39A34D008DC254 /* HTMLKitTestUtil.m in Sources */,
62857D2F1D39A339008DC254 /* HTMLKitTokenizerTests.m in Sources */,
);
@@ -2059,6 +2074,8 @@
62ECBF651C0B6D2A00AF847B /* HTMLTokenizer.m in Sources */,
62ECBF661C0B6D2A00AF847B /* HTMLTokenizerEntities.m in Sources */,
62ECBF671C0B6D2A00AF847B /* HTMLToken.m in Sources */,
62E2BC1220C0A93300979D71 /* HTMLTokenPolicy.m in Sources */,
627E60A220B9C55400AB06E8 /* HTMLSanitizer.m in Sources */,
62ECBF681C0B6D2A00AF847B /* HTMLCharacterToken.m in Sources */,
62ECBF691C0B6D2A00AF847B /* HTMLCommentToken.m in Sources */,
62ECBF6A1C0B6D2A00AF847B /* HTMLDOCTYPEToken.m in Sources */,
@@ -2068,18 +2085,15 @@
62ECBF6D1C0B6D2A00AF847B /* HTMLEOFToken.m in Sources */,
62ECBF6E1C0B6D2A00AF847B /* HTMLParser.m in Sources */,
62ECBF6F1C0B6D2A00AF847B /* HTMLStackOfOpenElements.m in Sources */,
62E0918422EDEB9D00C61073 /* HTMLSerializer.m in Sources */,
62ECBF701C0B6D2A00AF847B /* HTMLListOfActiveFormattingElements.m in Sources */,
6295FB0C22F0E770005C6DE8 /* HTMLNodeVisitor.m in Sources */,
62ECBF711C0B6D2A00AF847B /* HTMLMarker.m in Sources */,
62ECBF721C0B6D2A00AF847B /* HTMLNode.m in Sources */,
62ECBF731C0B6D2A00AF847B /* HTMLDocument.m in Sources */,
62ECBF741C0B6D2A00AF847B /* HTMLDocumentType.m in Sources */,
625A67D3224ADC7700C6D57D /* HTMLQuircksMode.m in Sources */,
62ECBF751C0B6D2A00AF847B /* HTMLDocumentFragment.m in Sources */,
62ECBF761C0B6D2A00AF847B /* HTMLElement.m in Sources */,
6295FB1622F0ECEE005C6DE8 /* HTMLTreeVisitor.m in Sources */,
62ECBF771C0B6D2A00AF847B /* HTMLComment.m in Sources */,
62A6CDD320BC9A3D00351AAE /* HTMLAttributePolicy.m in Sources */,
62ECBF781C0B6D2A00AF847B /* HTMLText.m in Sources */,
62ECBF791C0B6D2A00AF847B /* HTMLTemplate.m in Sources */,
62ECBF7A1C0B6D2A00AF847B /* HTMLNodeIterator.m in Sources */,
@@ -2089,13 +2103,14 @@
62ECBF7E1C0B6D2A00AF847B /* HTMLKitDOMExceptions.m in Sources */,
62ECBF7F1C0B6D2A00AF847B /* NSString+HTMLKit.m in Sources */,
62ECBF801C0B6D2A00AF847B /* NSCharacterSet+HTMLKit.m in Sources */,
627E60AD20B9C58F00AB06E8 /* HTMLElementPolicy.m in Sources */,
62ECBF811C0B6D2A00AF847B /* HTMLOrderedDictionary.m in Sources */,
62ECBF821C0B6D2A00AF847B /* CSSSelectors.m in Sources */,
62ECBF831C0B6D2A00AF847B /* CSSStructuralPseudoSelectors.m in Sources */,
62ECBF841C0B6D2A00AF847B /* CSSInputStream.m in Sources */,
627E60CB20BA02E900AB06E8 /* HTMLSanitizingPolicyBuilder.m in Sources */,
62ECBF851C0B6D2A00AF847B /* CSSSelectorParser.m in Sources */,
62ECBF861C0B6D2A00AF847B /* CSSNthExpressionParser.m in Sources */,
625A67CE224AC62C00C6D57D /* NSString+Private.m in Sources */,
62ECBF871C0B6D2A00AF847B /* CSSSelector.m in Sources */,
62ECBF881C0B6D2A00AF847B /* CSSSelectorBlock.m in Sources */,
62ECBF891C0B6D2A00AF847B /* CSSTypeSelector.m in Sources */,
@@ -2107,6 +2122,7 @@
62ECBF8F1C0B6D2A00AF847B /* CSSCompoundSelector.m in Sources */,
62567F531C0CB5750025D458 /* HTMLDOMTokenList.m in Sources */,
624C777F1DE9D05E00DD6DFA /* HTMLCharacterData.m in Sources */,
627E60C120BA015100AB06E8 /* HTMLSanitizingPolicy.m in Sources */,
626BE1E71DF3819600C49514 /* HTMLDOMUtils.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -2119,7 +2135,6 @@
620AB7B22087F18D00AFCCC7 /* CSSStructuralPseudoSelectors.m in Sources */,
62E0BA981E25456700E4D193 /* HTMLCharacterDataTests.m in Sources */,
6216ACFE1C28DCC80074CAB4 /* CSSExtensionSelectorsParsingTests.m in Sources */,
62C82E0E20FD2FFD008497A8 /* HTMLKitParserIssuesTests.m in Sources */,
62ECBFCA1C0B6E2E00AF847B /* HTML5LibTokenizerTest.m in Sources */,
62ECBFCB1C0B6E2E00AF847B /* HTMLKitTokenizerTests.m in Sources */,
62ECBFCC1C0B6E2E00AF847B /* HTMLKitTokenizerPerformance.m in Sources */,
@@ -2141,7 +2156,6 @@
62ECBFD91C0B6E2E00AF847B /* CSSTypeSelectorTests.m in Sources */,
62ECBFDA1C0B6E2E00AF847B /* CSSAttributeSelectorTests.m in Sources */,
62ECBFDB1C0B6E2E00AF847B /* CSSNThExpressionSelectorTests.m in Sources */,
6295FB1B22F0F309005C6DE8 /* HTMLTreeVisitorTests.m in Sources */,
625EE45C1CBB171300F2CC8E /* HTMLKitTestUtil.m in Sources */,
62ECBFDC1C0B6E2E00AF847B /* CSSCombinatorSelectorTests.m in Sources */,
);
+2 -2
View File
@@ -77,7 +77,7 @@ To add `HTMLKit` as a dependency into your project using CocoaPods just add the
```ruby
target 'MyTarget' do
pod 'HTMLKit', '~> 3.1'
pod 'HTMLKit', '~> 2.1'
end
```
@@ -94,7 +94,7 @@ $ pod install
Add `HTMLKit` to your `Package.swift` dependecies:
```swift
.Package(url: "https://github.com/iabudiab/HTMLKit", majorVersion: 3)
.Package(url: "https://github.com/iabudiab/HTMLKit", majorVersion: 2)
```
Then run:
+1 -1
View File
@@ -61,7 +61,7 @@
}
case CSSAttributeSelectorIncludes:
{
NSArray *components = [element[_name] componentsSeparatedByCharactersInSet:[NSCharacterSet htmlkit_HTMLWhitespaceCharacterSet]];
NSArray *components = [element[_name] componentsSeparatedByCharactersInSet:[NSCharacterSet HTMLWhitespaceCharacterSet]];
return [components containsObject:_value];
}
case CSSAttributeSelectorBegins:
+2 -2
View File
@@ -8,7 +8,7 @@
#import "CSSNthExpressionParser.h"
#import "CSSCodePoints.h"
#import "NSString+Private.h"
#import "NSString+HTMLKit.h"
#import "NSCharacterSet+HTMLKit.h"
@implementation CSSNthExpressionParser
@@ -26,7 +26,7 @@
return CSSNthExpressionEven;
}
NSCharacterSet *set = [[NSCharacterSet htmlkit_CSSNthExpressionCharacterSet] invertedSet];
NSCharacterSet *set = [[NSCharacterSet CSSNthExpressionCharacterSet] invertedSet];
if ([string rangeOfCharacterFromSet:set].location != NSNotFound) {
return CSSNthExpressionMake(0, 0);
}
+1 -1
View File
@@ -10,7 +10,7 @@
#import "CSSInputStream.h"
#import "CSSCodePoints.h"
#import "CSSSelectors.h"
#import "NSString+Private.h"
#import "NSString+HTMLKit.h"
#import "NSCharacterSet+HTMLKit.h"
#import "CSSNthExpressionParser.h"
#import "CSSCompoundSelector.h"
+1 -1
View File
@@ -9,7 +9,7 @@
#import "CSSStructuralPseudoSelectors.h"
#import "CSSSelectors.h"
#import "HTMLElement.h"
#import "NSString+Private.h"
#import "NSString+HTMLKit.h"
#pragma mark - Elements
+1 -1
View File
@@ -8,7 +8,7 @@
#import "CSSTypeSelector.h"
#import "HTMLElement.h"
#import "NSString+Private.h"
#import "NSString+HTMLKit.h"
@interface CSSTypeSelector ()
{
+25
View File
@@ -0,0 +1,25 @@
//
// HTMLAttributePolicy.h
// HTMLKit
//
// Created by Iska on 28.05.18.
// Copyright © 2018 BrainCookie. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
typedef NSString * _Nullable (^ SanitizeAttrbiuteValueBlock) (NSString * _Nullable value, NSString * key);
@interface HTMLAttributePolicy : NSObject
+ (instancetype)identity;
+ (instancetype)rejectAll;
+ (instancetype)policyWithBlock:(SanitizeAttrbiuteValueBlock)block;
- (NSString *)sanitizeValue:(NSString *)value forKey:(NSString *)key;
@end
NS_ASSUME_NONNULL_END
+56
View File
@@ -0,0 +1,56 @@
//
// HTMLAttributePolicy.m
// HTMLKit
//
// Created by Iska on 28.05.18.
// Copyright © 2018 BrainCookie. All rights reserved.
//
#import "HTMLAttributePolicy.h"
@interface HTMLAttributePolicy()
{
SanitizeAttrbiuteValueBlock _block;
}
@end
@implementation HTMLAttributePolicy
+ (instancetype)identity
{
return [self policyWithBlock:^NSString * _Nullable (NSString * _Nullable value, NSString * _Nonnull key) {
return value;
}];
}
+ (instancetype)rejectAll
{
return [self policyWithBlock:^NSString * _Nullable (NSString * _Nullable value, NSString * _Nonnull key) {
return nil;
}];
}
+ (instancetype)policyWithBlock:(SanitizeAttrbiuteValueBlock)block
{
HTMLAttributePolicy *policy = [[HTMLAttributePolicy alloc] initWithBlock:block];
return policy;
}
- (instancetype)initWithBlock:(SanitizeAttrbiuteValueBlock)block
{
self = [super init];
if (self) {
_block = block;
}
return self;
}
- (NSString *)sanitizeValue:(NSString *)value forKey:(NSString *)key
{
if (_block) {
return _block(value, key);
}
return value;
}
@end
+4 -4
View File
@@ -36,7 +36,7 @@
- (BOOL)isWhitespaceToken
{
return [_characters htmlkit_isHTMLWhitespaceString];
return [_characters isHTMLWhitespaceString];
}
- (BOOL)isEmpty
@@ -46,7 +46,7 @@
- (void)retainLeadingWhitespace
{
NSUInteger index = _characters.htmlkit_leadingHTMLWhitespaceLength;
NSUInteger index = _characters.leadingHTMLWhitespaceLength;
if (index > 0) {
[_characters setString:[_characters substringToIndex:index]];
}
@@ -54,7 +54,7 @@
- (void)trimLeadingWhitespace
{
NSUInteger index = _characters.htmlkit_leadingHTMLWhitespaceLength;
NSUInteger index = _characters.leadingHTMLWhitespaceLength;
if (index > 0) {
[_characters setString:[_characters substringFromIndex:index]];
}
@@ -67,7 +67,7 @@
- (HTMLCharacterToken *)tokenBySplitingLeadingWhiteSpace
{
NSUInteger index = _characters.htmlkit_leadingHTMLWhitespaceLength;
NSUInteger index = _characters.leadingHTMLWhitespaceLength;
if (index > 0) {
NSString *leading = [_characters substringToIndex:index];
[_characters setString:[_characters substringFromIndex:index]];
+7
View File
@@ -21,6 +21,13 @@
return [super initWithName:@"#comment" type:HTMLNodeComment data:data];
}
#pragma mark - Serialization
- (NSString *)outerHTML
{
return [NSString stringWithFormat:@"<!--%@-->", self.data];
}
#pragma mark - Description
- (NSString *)description
+2 -2
View File
@@ -141,7 +141,7 @@
- (void)detachNodeIterator:(HTMLNodeIterator *)iterator
{
// NOOP
[_nodeIterators removeObject:iterator];
}
#pragma mark - Ranges
@@ -153,7 +153,7 @@
- (void)detachRange:(HTMLRange *)range
{
// NOOP
[_ranges removeObject:range];
}
- (void)didRemoveCharacterDataInNode:(HTMLCharacterData *)node atOffset:(NSUInteger)offset withLength:(NSUInteger)length
+8 -1
View File
@@ -7,7 +7,7 @@
//
#import "HTMLDocumentType.h"
#import "NSString+Private.h"
#import "NSString+HTMLKit.h"
#import "HTMLNode+Private.h"
NS_INLINE BOOL nilOrEqual(id first, id second) {
@@ -144,6 +144,13 @@ NS_INLINE BOOL nilOrEqual(id first, id second) {
return copy;
}
#pragma mark - Serialization
- (NSString *)outerHTML
{
return [NSString stringWithFormat:@"<!DOCTYPE %@>", self.name];
}
#pragma mark - Description
- (NSString *)description
+37 -1
View File
@@ -12,7 +12,7 @@
#import "HTMLText.h"
#import "HTMLDOMTokenList.h"
#import "HTMLOrderedDictionary.h"
#import "NSString+Private.h"
#import "NSString+HTMLKit.h"
#import "HTMLNode+Private.h"
@interface HTMLElement ()
@@ -149,6 +149,42 @@
return copy;
}
#pragma mark - Serialization
- (NSString *)outerHTML
{
NSMutableString *result = [NSMutableString string];
[result appendFormat:@"<%@", self.tagName];
[self.attributes enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *value, BOOL *stop) {
NSMutableString *escaped = [value mutableCopy];
[escaped replaceOccurrencesOfString:@"&" withString:@"&amp;" options:0 range:NSMakeRange(0, escaped.length)];
[escaped replaceOccurrencesOfString:@"0x00A0" withString:@"&nbsp;" options:0 range:NSMakeRange(0, escaped.length)];
[escaped replaceOccurrencesOfString:@"\"" withString:@"&quot;" options:0 range:NSMakeRange(0, escaped.length)];
[result appendFormat:@" %@=\"%@\"", key, escaped];
}];
[result appendString:@">"];
if ([self.tagName isEqualToAny:@"area", @"base", @"basefont", @"bgsound", @"br", @"col", @"embed",
@"frame", @"hr", @"img", @"input", @"keygen", @"link", @"menuitem", @"meta", @"param", @"source",
@"track", @"wbr", nil]) {
return result;
}
if ([self.tagName isEqualToAny:@"pre", @"textarea", @"listing", nil] && self.firstChild.nodeType == HTMLNodeText) {
HTMLText *textNode = (HTMLText *)self.firstChild;
if ([textNode.data hasPrefix:@"\n"]) {
[result appendString:@"\n"];
}
}
[result appendString:self.innerHTML];
[result appendFormat:@"</%@>", self.tagName];
return result;
}
#pragma mark - Description
- (NSString *)description
+31
View File
@@ -0,0 +1,31 @@
//
// HTMLElementPolicy.h
// HTMLKit
//
// Created by Iska on 26.05.18.
// Copyright © 2018 BrainCookie. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "HTMLSanitizingPolicy.h"
#import "HTMLOrderedDictionary.h"
NS_ASSUME_NONNULL_BEGIN
typedef NSString * _Nullable (^ SanitizeElementNameBlock) (NSString *);
typedef HTMLOrderedDictionary * _Nullable (^ SanitizeElementAttributesBlock) (HTMLOrderedDictionary * _Nullable);
@interface HTMLElementPolicy : NSObject
+ (instancetype)identity;
+ (instancetype)rejectAll;
+ (instancetype)policyWithNameBlock:(SanitizeElementNameBlock)nameBlock;
+ (instancetype)policyWithNameBlock:(SanitizeElementNameBlock)nameBlock
attributesBlock:(nullable SanitizeElementAttributesBlock)attributesBlock;
- (NSString *)sanitizeName:(NSString *)name;
- (HTMLOrderedDictionary *)sanitzeAttributes:(HTMLOrderedDictionary *)attributes;
@end
NS_ASSUME_NONNULL_END
+73
View File
@@ -0,0 +1,73 @@
//
// HTMLElementPolicy.m
// HTMLKit
//
// Created by Iska on 26.05.18.
// Copyright © 2018 BrainCookie. All rights reserved.
//
#import "HTMLElementPolicy.h"
@interface HTMLElementPolicy()
{
SanitizeElementNameBlock _nameBlock;
SanitizeElementAttributesBlock _attributesBlock;
}
@end
@implementation HTMLElementPolicy
+ (instancetype)identity
{
return [self policyWithNameBlock:^NSString * _Nullable (NSString * _Nonnull name) {
return name;
}];
}
+ (instancetype)rejectAll
{
return [self policyWithNameBlock:^NSString *_Nullable (NSString * _Nonnull name) {
return nil;
}];
}
+ (instancetype)policyWithNameBlock:(NSString * _Nonnull (^)(NSString * _Nonnull))nameBlock
{
return [self policyWithNameBlock:nameBlock attributesBlock:nil];
}
+ (instancetype)policyWithNameBlock:(SanitizeElementNameBlock)nameBlock
attributesBlock:(SanitizeElementAttributesBlock)attributesBlock
{
HTMLElementPolicy *policy = [[HTMLElementPolicy alloc] initWithNameBlock:nameBlock attributesBlock:attributesBlock];
return policy;
}
- (instancetype)initWithNameBlock:(SanitizeElementNameBlock)nameBlock
attributesBlock:(SanitizeElementAttributesBlock)attributesBlock
{
self = [super init];
if (self) {
_nameBlock = nameBlock;
_attributesBlock = attributesBlock;
}
return self;
}
- (NSString *)sanitizeName:(NSString *)name
{
if (_nameBlock) {
return _nameBlock(name);
}
return name;
}
- (HTMLOrderedDictionary *)sanitzeAttributes:(HTMLOrderedDictionary *)attributes
{
if (_attributesBlock) {
return _attributesBlock(attributes);
}
return attributes;
}
@end
+1 -1
View File
@@ -170,7 +170,7 @@
- (BOOL)consumeHexNumber:(unsigned long long *)result
{
NSCharacterSet *set = [NSCharacterSet htmlkit_HTMLHexNumberCharacterSet];
NSCharacterSet *set = [NSCharacterSet HTMLHexNumberCharacterSet];
NSString *string = nil;
BOOL success = [_scanner scanCharactersFromSet:set intoString:&string];
+1 -1
View File
@@ -17,7 +17,7 @@
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>3.1.0</string>
<string>2.1.4</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
+3 -17
View File
@@ -18,7 +18,6 @@
#import "CSSSelector.h"
#import "HTMLDocument+Private.h"
#import "HTMLDOMUtils.h"
#import "HTMLSerializer.h"
NSString * const ValidationNodePreInsertion = @"-ensurePreInsertionValidityOfNode:beforeChildNode:";
NSString * const ValidationNodeReplacement = @"-ensureReplacementValidityOfChildNode:withNode:";
@@ -157,20 +156,6 @@ NSString * const RemoveChildNode = @"-removeChildNode:";
return (HTMLElement *)self;
}
- (HTMLText *)asText
{
return (HTMLText *)self;
}
- (HTMLComment *)asComment
{
return (HTMLComment *)self;
}
- (HTMLDocumentType *)asDocumentType
{
return (HTMLDocumentType *)self;
}
#pragma mark - Child Nodes
- (BOOL)hasChildNodes
@@ -733,12 +718,13 @@ NS_INLINE void CheckInvalidCombination(HTMLNode *parent, HTMLNode *node, NSStrin
- (NSString *)outerHTML
{
return [HTMLSerializer serializeNode:self scope:HTMLSerializationScopeIncludeRoot];
[self doesNotRecognizeSelector:_cmd];
return nil;
}
- (NSString *)innerHTML
{
return [HTMLSerializer serializeNode:self scope:HTMLSerializationScopeChildrenOnly];
return [[self.childNodes.array valueForKey:@"outerHTML"] componentsJoinedByString:@""];
}
- (void)setInnerHTML:(NSString *)outerHTML
-54
View File
@@ -1,54 +0,0 @@
//
// HTMLNodeVisitor.m
// HTMLKit
//
// Created by Iska on 30.07.19.
// Copyright © 2019 BrainCookie. All rights reserved.
//
#import "HTMLNodeVisitor.h"
#pragma mark - Block Visitor
@interface HTMLNodeVisitorBlock ()
{
void (^ _enter)(HTMLNode *);
void (^ _leave)(HTMLNode *);
}
@end
@implementation HTMLNodeVisitorBlock
+ (instancetype)visitorWithEnterBlock:(void (^)(HTMLNode * _Nonnull))enterBlock
leaveBlock:(void (^)(HTMLNode * _Nonnull))leaveBlock
{
return [[HTMLNodeVisitorBlock alloc] initWithEnterBlock:enterBlock leaveBlock:leaveBlock];
}
- (instancetype)initWithEnterBlock:(void (^)(HTMLNode * _Nonnull))enterBlock
leaveBlock:(void (^)(HTMLNode * _Nonnull))leaveBlock
{
self = [super init];
if (self) {
_enter = [enterBlock copy];
_leave = [leaveBlock copy];
}
return self;
}
- (void)enter:(HTMLNode *)node
{
if (_enter) {
_enter(node);
}
}
- (void)leave:(HTMLNode *)node
{
if (_leave) {
_leave(node);
}
}
@end
+4 -4
View File
@@ -1142,7 +1142,7 @@
if (charactes.length > 0) {
[self reconstructActiveFormattingElements];
[self insertCharacters:charactes];
if (!charactes.htmlkit_isHTMLWhitespaceString) {
if (!charactes.isHTMLWhitespaceString) {
_framesetOkFlag = NO;
}
}
@@ -2313,7 +2313,7 @@
[characters enumerateSubstringsInRange:NSMakeRange(0, characters.length)
options:NSStringEnumerationByComposedCharacterSequences
usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
if (substring.htmlkit_isHTMLWhitespaceString) {
if (substring.isHTMLWhitespaceString) {
[self insertCharacters:substring];
} else {
[self emitParseError:@"Unexpected Character (%@) in <frameset>", substring];
@@ -2381,7 +2381,7 @@
[characters enumerateSubstringsInRange:NSMakeRange(0, characters.length)
options:NSStringEnumerationByComposedCharacterSequences
usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
if (substring.htmlkit_isHTMLWhitespaceString) {
if (substring.isHTMLWhitespaceString) {
[self insertCharacters:substring];
} else {
[self emitParseError:@"Unexpected Character (%@) after <frameset>", substring];
@@ -2515,7 +2515,7 @@
usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
if ([substring isEqualToString:@"\uFFFD"]) {
[self emitParseError:@"Unexpected Character (0x0000) in foreign content"];
} else if (!substring.htmlkit_isHTMLWhitespaceString) {
} else if (!substring.isHTMLWhitespaceString) {
_framesetOkFlag = NO;
}
[self insertCharacters:substring];
-21
View File
@@ -1,21 +0,0 @@
//
// HTMLQuircksMode.m
// HTMLKit
//
// Created by Iska on 26.03.19.
// Copyright © 2019 BrainCookie. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "HTMLQuirksMode.h"
#import "NSString+Private.h"
BOOL QuirksModePrefixMatch(NSString *publicIdentifier)
{
for (int i = 0; i < sizeof(HTMLQuirksModePrefixes) / sizeof(HTMLQuirksModePrefixes[0]); i++) {
if ([publicIdentifier hasPrefixIgnoringCase:HTMLQuirksModePrefixes[i]]) {
return YES;
}
}
return NO;
}
+21
View File
@@ -0,0 +1,21 @@
//
// HTMLSanitizer.h
// HTMLKit
//
// Created by Iska on 26.05.18.
// Copyright © 2018 BrainCookie. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "HTMLSanitizingPolicyBuilder.h"
#import "HTMLSanitizingPolicy.h"
NS_ASSUME_NONNULL_BEGIN
@interface HTMLSanitizer : NSObject
+ (instancetype)sanitizerWithPolicy:(void (^)(HTMLSanitizingPolicyBuilder *))block;
@end
NS_ASSUME_NONNULL_END
+45
View File
@@ -0,0 +1,45 @@
//
// HTMLSanitizer.m
// HTMLKit
//
// Created by Iska on 26.05.18.
// Copyright © 2018 BrainCookie. All rights reserved.
//
#import "HTMLSanitizer.h"
#import "HTMLTokenizer.h"
#import "HTMLTokens.h"
@interface HTMLSanitizer()
{
HTMLTokenizer *_tokenizer;
}
@end
@implementation HTMLSanitizer
+ (instancetype)sanitizerWithPolicy:(void (^)(HTMLSanitizingPolicyBuilder *))block
{
HTMLSanitizingPolicyBuilder *builder = [HTMLSanitizingPolicyBuilder new];
block(builder);
return nil; //[[HTMLSanitizingPolicy alloc] initWithBuilder:builder];
}
- (instancetype)initWithString:(NSString *)string
{
self = [super init];
if (self) {
_tokenizer = [[HTMLTokenizer alloc] initWithString:string ?: @""];
}
return self;
}
- (void)sanitize
{
// for (HTMLToken *token in _tokenizer) {
//
// }
}
@end
+20
View File
@@ -0,0 +1,20 @@
//
// HTMLSanitizingPolicy.h
// HTMLKit
//
// Created by Iska on 26.05.18.
// Copyright © 2018 BrainCookie. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface HTMLSanitizingPolicy : NSObject
- (HTMLSanitizingPolicy *)combineWith:(nullable HTMLSanitizingPolicy *)other;
@end
NS_ASSUME_NONNULL_END
+36
View File
@@ -0,0 +1,36 @@
//
// HTMLSanitizingPolicy.m
// HTMLKit
//
// Created by Iska on 26.05.18.
// Copyright © 2018 BrainCookie. All rights reserved.
//
#import "HTMLSanitizingPolicy.h"
@interface HTMLSanitizingPolicy()
{
NSMutableArray *_policies;
}
@end
@implementation HTMLSanitizingPolicy
- (instancetype)init
{
self = [super init];
if (self) {
_policies = [NSMutableArray new];
}
return self;
}
- (HTMLSanitizingPolicy *)combineWith:(HTMLSanitizingPolicy *)other
{
if (other) {
[_policies addObject:other];
}
return self;
}
@end
+39
View File
@@ -0,0 +1,39 @@
//
// HTMLSanitizingPolicyBuilder.h
// HTMLKit
//
// Created by Iska on 26.05.18.
// Copyright © 2018 BrainCookie. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "HTMLElementPolicy.h"
#import "HTMLTokenPolicy.h"
#import "HTMLAttributePolicy.h"
NS_ASSUME_NONNULL_BEGIN
@interface HTMLSanitizingPolicyBuilder : NSObject
- (HTMLSanitizingPolicyBuilder *)allowElements:(NSArray<NSString *> *)elementNames;
- (HTMLSanitizingPolicyBuilder *)disallowElements:(NSArray<NSString *> *)elementNames;
- (HTMLSanitizingPolicyBuilder *)allowPolicy:(HTMLElementPolicy *)policy onElements:(NSArray<NSString *> *)elementNames;
- (HTMLSanitizingPolicyBuilder *)allowCommonInlineFormattingElements;
- (HTMLSanitizingPolicyBuilder *)allowCommonBlockElements;
- (HTMLSanitizingPolicyBuilder *)allowTextInElements:(NSArray<NSString *> *)elementNames;
- (HTMLSanitizingPolicyBuilder *)disallowTextInElements:(NSArray<NSString *> *)elementNames;
//- (HTMLSanitizingPolicyBuilder *)allowAttributes:(NSArray<NSString *> *)attributeName
// onElements:(NSArray<NSString *> *)elementNames;
//- (HTMLSanitizingPolicyBuilder *)disallowAttributes:(NSArray<NSString *> *)attributeName
// onElements:(NSArray<NSString *> *)elementNames;
//
//- (HTMLSanitizingPolicyBuilder *)allowAttributePolicy:(HTMLAttributePolicy *)policy
// onElements:(NSArray<NSString *> *)elementNames;
//- (HTMLSanitizingPolicyBuilder *)disallowAttributePolicy:(HTMLAttributePolicy *)policy
// onElements:(NSArray<NSString *> *)elementNames;
@end
NS_ASSUME_NONNULL_END
+94
View File
@@ -0,0 +1,94 @@
//
// HTMLSanitizingPolicyBuilder.m
// HTMLKit
//
// Created by Iska on 26.05.18.
// Copyright © 2018 BrainCookie. All rights reserved.
//
#import "HTMLSanitizingPolicyBuilder.h"
@interface HTMLSanitizingPolicyBuilder()
{
NSMutableDictionary<NSString *, NSMutableArray<HTMLElementPolicy *> *> * elementPolicies;
NSMutableDictionary<NSString *, HTMLAttributePolicy *> * attributePolicies;
NSMutableDictionary<NSString *, NSNumber *> * textContainers;
}
@end
@implementation HTMLSanitizingPolicyBuilder
- (HTMLSanitizingPolicyBuilder *)allowElements:(NSArray<NSString *> *)elementNames
{
return [self allowPolicy:HTMLElementPolicy.identity onElements:elementNames];
}
- (HTMLSanitizingPolicyBuilder *)disallowElements:(NSArray<NSString *> *)elementNames
{
return [self allowPolicy:HTMLElementPolicy.rejectAll onElements:elementNames];
}
- (HTMLSanitizingPolicyBuilder *)allowPolicy:(HTMLElementPolicy *)policy onElements:(NSArray<NSString *> *)elementNames
{
for (NSString *name in elementNames) {
NSMutableArray<HTMLElementPolicy *> *list = elementPolicies[name];
if (list == nil) {
list = [NSMutableArray new];
}
[list addObject:policy];
elementPolicies[name] = list;
}
return self;
}
- (HTMLSanitizingPolicyBuilder *)allowCommonInlineFormattingElements
{
return [self allowElements:@[@"b", @"i", @"font", @"s", @"u", @"o", @"sup", @"sub", @"ins", @"del",
@"strong", @"strike", @"tt", @"code", @"big", @"small", @"br", @"span", @"em"]];
}
- (HTMLSanitizingPolicyBuilder *)allowCommonBlockElements
{
return [self allowElements:@[@"p", @"div", @"h1", @"h2", @"h3", @"h4", @"h5", @"h6", @"ul", @"ol", @"li",
@"blockquote"]];
}
- (HTMLSanitizingPolicyBuilder *)allowTextInElements:(NSArray<NSString *> *)elementNames;
{
for (NSString *name in elementNames) {
textContainers[name] = @YES;
}
return self;
}
- (HTMLSanitizingPolicyBuilder *)disallowTextInElements:(NSArray<NSString *> *)elementNames
{
for (NSString *name in elementNames) {
textContainers[name] = @NO;
}
return self;
}
//- (HTMLSanitizingPolicyBuilder *)allowAttributes:(NSArray<NSString *> *)attributeNames
// onElements:(NSArray<NSString *> *)elementNames
//{
// for (NSString *attribute in attributeNames) {
// [self allowAttributePolicy:HTMLAttributePolicy.identity onElements:elementNames];
// }
// return self;
//}
//
//- (HTMLSanitizingPolicyBuilder *)disallowAttributes:(NSArray<NSString *> *)attributeName
// onElements:(NSArray<NSString *> *)elementNames;
//
//- (HTMLSanitizingPolicyBuilder *)allowAttributePolicy:(HTMLAttributePolicy *)policy onElements:(NSArray<NSString *> *)elementNames
//{
// return self;
//}
//
//- (HTMLSanitizingPolicyBuilder *)disallowAttributePolicy:(HTMLAttributePolicy *)policy onElements:(NSArray<NSString *> *)elementNames
//{
// return self;
//}
@end
-155
View File
@@ -1,155 +0,0 @@
//
// HTMLSerializer.m
// HTMLKit
//
// Created by Iska on 28.07.19.
// Copyright © 2019 BrainCookie. All rights reserved.
//
#import "HTMLSerializer.h"
#import "HTMLDOM.h"
#import "HTMLNode+Private.h"
#import "HTMLTreeVisitor.h"
#import "NSString+Private.h"
#pragma mark - Serializer
@interface HTMLSerializer ()
{
HTMLNode *_root;
HTMLTreeVisitor *_treeVisitor;
NSUInteger _ignore;
NSMutableString *_result;
}
- (instancetype)initWithNode:(HTMLNode *)node;
- (NSString *)serializeWithScope:(HTMLSerializationScope)scope;
@end
@implementation HTMLSerializer
+ (NSString *)serializeNode:(HTMLNode *)node scope:(HTMLSerializationScope)scope
{
HTMLSerializer *serializer = [[HTMLSerializer alloc] initWithNode:node];
return [serializer serializeWithScope:scope];
}
#pragma mark - Lifecycle
- (instancetype)initWithNode:(HTMLNode *)node
{
self = [super init];
if (self) {
_root = node;
_treeVisitor = [[HTMLTreeVisitor alloc] initWithNode:node];
_result = [NSMutableString new];
_ignore = 0;
}
return self;
}
#pragma mark - Serialization
- (NSString *)serializeWithScope:(HTMLSerializationScope)scope
{
[_result setString:@""];
HTMLNodeVisitorBlock *nodeVisitor = [HTMLNodeVisitorBlock visitorWithEnterBlock:^(HTMLNode * node) {
if (scope == HTMLSerializationScopeChildrenOnly && node == _root) {
return;
}
if (_ignore > 0) {
return;
}
switch (node.nodeType) {
case HTMLNodeElement:
[self openElement:node.asElement];
break;
case HTMLNodeComment:
[self serializeComment:node.asComment];
break;
case HTMLNodeText:
[self serializeText:node.asText];
break;
case HTMLNodeDocumentFragment:
[self serializeDocumentType:node.asDocumentType];
break;
default:
break;
}
} leaveBlock:^(HTMLNode * _Nonnull node) {
if (scope == HTMLSerializationScopeChildrenOnly && node == _root) {
return;
}
switch (node.nodeType) {
case HTMLNodeElement:
if ([node.asElement.tagName isEqualToAny:@"area", @"base", @"basefont", @"bgsound", @"br", @"col", @"embed",
@"frame", @"hr", @"img", @"input", @"keygen", @"link", @"menuitem", @"meta", @"param", @"source",
@"track", @"wbr", nil]) {
_ignore--;
break;
}
[self closeElement:node.asElement];
default:
break;
}
}];
[_treeVisitor walkWithNodeVisitor:nodeVisitor];
return [_result copy];
}
- (void)openElement:(HTMLElement *)element
{
[_result appendFormat:@"<%@", element.tagName];
[element.attributes enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *value, BOOL *stop) {
NSMutableString *escaped = [value mutableCopy];
[escaped replaceOccurrencesOfString:@"&" withString:@"&amp;" options:0 range:NSMakeRange(0, escaped.length)];
[escaped replaceOccurrencesOfString:@"0x00A0" withString:@"&nbsp;" options:0 range:NSMakeRange(0, escaped.length)];
[escaped replaceOccurrencesOfString:@"\"" withString:@"&quot;" options:0 range:NSMakeRange(0, escaped.length)];
[_result appendFormat:@" %@=\"%@\"", key, escaped];
}];
[_result appendString:@">"];
if ([element.tagName isEqualToAny:@"area", @"base", @"basefont", @"bgsound", @"br", @"col", @"embed",
@"frame", @"hr", @"img", @"input", @"keygen", @"link", @"menuitem", @"meta", @"param", @"source",
@"track", @"wbr", nil]) {
_ignore++;
}
}
- (void)closeElement:(HTMLElement *)element
{
[_result appendFormat:@"</%@>", element.tagName];
}
- (void)serializeText:(HTMLText *)text
{
if ([text.parentElement.tagName isEqualToAny:@"style", @"script", @"xmp", @"iframe", @"noembed", @"noframes",
@"plaintext", @"noscript", nil]) {
[_result appendString:text.data];
} else {
NSMutableString *escaped = [text.data mutableCopy];
[escaped replaceOccurrencesOfString:@"&" withString:@"&amp;" options:0 range:NSMakeRange(0, escaped.length)];
[escaped replaceOccurrencesOfString:@"\00A0" withString:@"&nbsp;" options:0 range:NSMakeRange(0, escaped.length)];
[escaped replaceOccurrencesOfString:@"<" withString:@"&lt;" options:0 range:NSMakeRange(0, escaped.length)];
[escaped replaceOccurrencesOfString:@">" withString:@"&gt;" options:0 range:NSMakeRange(0, escaped.length)];
[_result appendString:escaped];
}
}
- (void)serializeComment:(HTMLComment *)comment
{
[_result appendFormat:@"<!--%@-->", comment.data];
}
- (void)serializeDocumentType:(HTMLDocumentType *)doctype
{
[_result appendFormat:@"<!DOCTYPE %@>", doctype.name];
}
@end
+18 -1
View File
@@ -8,7 +8,7 @@
#import "HTMLText.h"
#import "HTMLElement.h"
#import "NSString+Private.h"
#import "NSString+HTMLKit.h"
#import "HTMLCharacterData+Private.h"
#import "HTMLKitDOMExceptions.h"
#import "HTMLDocument+Private.h"
@@ -66,6 +66,23 @@ NS_INLINE void CheckValidOffset(HTMLNode *node, NSUInteger offset, NSString *cmd
return newNode;
}
#pragma mark - Serialization
- (NSString *)outerHTML
{
if ([self.parentElement.tagName isEqualToAny:@"style", @"script", @"xmp", @"iframe", @"noembed", @"noframes",
@"plaintext", @"noscript", nil]) {
return self.data;
} else {
NSMutableString *escaped = [self.data mutableCopy];
[escaped replaceOccurrencesOfString:@"&" withString:@"&amp;" options:0 range:NSMakeRange(0, escaped.length)];
[escaped replaceOccurrencesOfString:@"\00A0" withString:@"&nbsp;" options:0 range:NSMakeRange(0, escaped.length)];
[escaped replaceOccurrencesOfString:@"<" withString:@"&lt;" options:0 range:NSMakeRange(0, escaped.length)];
[escaped replaceOccurrencesOfString:@">" withString:@"&gt;" options:0 range:NSMakeRange(0, escaped.length)];
return escaped;
}
}
#pragma mark - Description
- (NSString *)description
+22
View File
@@ -0,0 +1,22 @@
//
// HTMLTokenPolicy.h
// HTMLKit
//
// Created by Iska on 01.06.18.
// Copyright © 2018 BrainCookie. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "HTMLTokens.h"
NS_ASSUME_NONNULL_BEGIN
@interface HTMLTokenPolicy : NSObject
+ (instancetype)policy:(HTMLToken * _Nullable (^)(HTMLToken *))block;
- (nullable HTMLToken *)apply:(HTMLToken *)token;
@end
NS_ASSUME_NONNULL_END
+38
View File
@@ -0,0 +1,38 @@
//
// HTMLTokenPolicy.m
// HTMLKit
//
// Created by Iska on 01.06.18.
// Copyright © 2018 BrainCookie. All rights reserved.
//
#import "HTMLTokenPolicy.h"
@interface HTMLTokenPolicy()
{
HTMLToken * (^ _policyBlock)(HTMLToken *);
}
@end
@implementation HTMLTokenPolicy
+ (instancetype)policy:(HTMLToken * _Nullable (^)(HTMLToken * _Nonnull))block
{
return [[HTMLTokenPolicy alloc] initWithBlock:block];
}
- (instancetype)initWithBlock:(HTMLToken * _Nullable (^)(HTMLToken * _Nonnull))block
{
self = [super init];
if (self) {
_policyBlock = block;
}
return self;
}
- (HTMLToken *)apply:(HTMLToken *)token
{
return _policyBlock(token);
}
@end
-63
View File
@@ -1,63 +0,0 @@
//
// HTMLTreeVisitor.m
// HTMLKit
//
// Created by Iska on 30.07.19.
// Copyright © 2019 BrainCookie. All rights reserved.
//
#import "HTMLTreeVisitor.h"
#import "HTMLNode.h"
#import "HTMLTreeWalker.h"
@interface HTMLTreeVisitor()
{
HTMLNode *_root;
HTMLTreeWalker *_treeWalker;
}
@end
@implementation HTMLTreeVisitor
- (instancetype)initWithNode:(HTMLNode *)node
{
self = [super init];
if (self) {
_root = node;
_treeWalker = [[HTMLTreeWalker alloc] initWithNode:node];
}
return self;
}
- (void)walkWithNodeVisitor:(id<HTMLNodeVisitor>)visitor
{
HTMLNode *currentNode = _treeWalker.currentNode;
while (currentNode) {
[visitor enter:currentNode];
if (currentNode.hasChildNodes) {
currentNode = [_treeWalker firstChild];
continue;
}
HTMLNode *next = [_treeWalker nextSibling];
if (next) {
[visitor leave:currentNode];
currentNode = next;
continue;
}
while (!next && _treeWalker.currentNode != _root) {
[visitor leave:_treeWalker.currentNode];
currentNode = [_treeWalker parentNode];
next = [_treeWalker nextSibling];
}
[visitor leave:currentNode];
currentNode = _treeWalker.currentNode;
if (currentNode == _root) {
break;
}
}
}
@end
+3 -3
View File
@@ -10,7 +10,7 @@
@implementation NSCharacterSet (HTMLKit)
+ (instancetype)htmlkit_HTMLWhitespaceCharacterSet
+ (instancetype)HTMLWhitespaceCharacterSet
{
static NSCharacterSet *set = nil;
static dispatch_once_t onceToken;
@@ -20,7 +20,7 @@
return set;
}
+ (instancetype)htmlkit_HTMLHexNumberCharacterSet
+ (instancetype)HTMLHexNumberCharacterSet
{
static NSCharacterSet *set = nil;
static dispatch_once_t onceToken;
@@ -30,7 +30,7 @@
return set;
}
+ (instancetype)htmlkit_CSSNthExpressionCharacterSet
+ (instancetype)CSSNthExpressionCharacterSet
{
static NSCharacterSet *set = nil;
static dispatch_once_t onceToken;
+39 -3
View File
@@ -15,12 +15,37 @@ NS_INLINE BOOL isHtmlWhitespaceChar(unichar c)
@implementation NSString (HTMLKit)
- (BOOL)htmlkit_isHTMLWhitespaceString
- (BOOL)isEqualToStringIgnoringCase:(NSString *)aString
{
return self.htmlkit_leadingHTMLWhitespaceLength == self.length;
return [self caseInsensitiveCompare:aString] == NSOrderedSame;
}
- (NSUInteger)htmlkit_leadingHTMLWhitespaceLength
- (BOOL)isEqualToAny:(NSString *)first, ... NS_REQUIRES_NIL_TERMINATION
{
va_list list;
va_start(list, first);
for (NSString *next = first; next != nil; next = va_arg(list, NSString *)) {
if ([self isEqualToString:next]) {
return YES;
}
}
va_end(list);
return NO;
}
- (BOOL)hasPrefixIgnoringCase:(NSString *)aString
{
NSRange reange = [self rangeOfString:aString
options:NSAnchoredSearch|NSCaseInsensitiveSearch];
return reange.location != NSNotFound;
}
- (BOOL)isHTMLWhitespaceString
{
return self.leadingHTMLWhitespaceLength == self.length;
}
- (NSUInteger)leadingHTMLWhitespaceLength
{
size_t idx = 0;
NSUInteger length = self.length;
@@ -33,4 +58,15 @@ NS_INLINE BOOL isHtmlWhitespaceChar(unichar c)
return idx;
}
- (NSString *)stringByEscapingForHTML
{
NSMutableString *escaped = [self mutableCopy];
[escaped replaceOccurrencesOfString:@"&" withString:@"&amp;" options:0 range:NSMakeRange(0, escaped.length)];
[escaped replaceOccurrencesOfString:@"0x00A0" withString:@"&nbsp;" options:0 range:NSMakeRange(0, escaped.length)];
[escaped replaceOccurrencesOfString:@"\"" withString:@"&quot;" options:0 range:NSMakeRange(0, escaped.length)];
[escaped replaceOccurrencesOfString:@"<" withString:@"&lt;" options:0 range:NSMakeRange(0, escaped.length)];
[escaped replaceOccurrencesOfString:@">" withString:@"&gt;" options:0 range:NSMakeRange(0, escaped.length)];
return escaped;
}
@end
-38
View File
@@ -1,38 +0,0 @@
//
// NSString+Private.m
// HTMLKit
//
// Created by Iska on 26.03.19.
// Copyright © 2019 BrainCookie. All rights reserved.
//
#import "NSString+Private.h"
@implementation NSString (Private)
- (BOOL)isEqualToStringIgnoringCase:(NSString *)aString
{
return [self caseInsensitiveCompare:aString] == NSOrderedSame;
}
- (BOOL)isEqualToAny:(NSString *)first, ... NS_REQUIRES_NIL_TERMINATION
{
va_list list;
va_start(list, first);
for (NSString *next = first; next != nil; next = va_arg(list, NSString *)) {
if ([self isEqualToString:next]) {
return YES;
}
}
va_end(list);
return NO;
}
- (BOOL)hasPrefixIgnoringCase:(NSString *)aString
{
NSRange reange = [self rangeOfString:aString
options:NSAnchoredSearch|NSCaseInsensitiveSearch];
return reange.location != NSNotFound;
}
@end
-4
View File
@@ -6,10 +6,6 @@
// Copyright (c) 2014 BrainCookie. All rights reserved.
//
///------------------------------------------------------
/// HTMLKit private header
///------------------------------------------------------
#import <Foundation/Foundation.h>
#import "HTMLToken.h"
-4
View File
@@ -6,10 +6,6 @@
// Copyright (c) 2014 BrainCookie. All rights reserved.
//
///------------------------------------------------------
/// HTMLKit private header
///------------------------------------------------------
#import <Foundation/Foundation.h>
#import "HTMLToken.h"
-4
View File
@@ -6,10 +6,6 @@
// Copyright (c) 2014 BrainCookie. All rights reserved.
//
///------------------------------------------------------
/// HTMLKit private header
///------------------------------------------------------
#import <Foundation/Foundation.h>
#import "HTMLToken.h"
-1
View File
@@ -18,7 +18,6 @@
#import "HTMLRange.h"
#import "HTMLDOMTokenList.h"
#import "HTMLNodeIterator.h"
#import "HTMLTreeVisitor.h"
#import "HTMLTreeWalker.h"
#import "HTMLNodeFilter.h"
-4
View File
@@ -6,10 +6,6 @@
// Copyright (c) 2015 BrainCookie. All rights reserved.
//
///------------------------------------------------------
/// HTMLKit private header
///------------------------------------------------------
#import "HTMLToken.h"
/**
+1 -13
View File
@@ -10,10 +10,9 @@
/// HTMLKit private header
///------------------------------------------------------
#import "HTMLNode+Private.h"
#import "HTMLElement.h"
#import "HTMLNamespaces.h"
#import "NSString+Private.h"
#import "NSString+HTMLKit.h"
NS_INLINE BOOL IsNodeMathMLTextIntegrationPoint(HTMLElement *node)
{
@@ -53,14 +52,3 @@ NS_INLINE BOOL IsSpecialElement(HTMLElement *element)
}
return NO;
}
NS_INLINE BOOL DoesNodeSerializeAsVoid(HTMLNode *node)
{
if (node.nodeType != HTMLNodeElement) {
return false;
}
return [node.asElement.tagName isEqualToAny:@"area", @"base", @"basefont", @"bgsound", @"br", @"col", @"embed",
@"frame", @"hr", @"img", @"input", @"keygen", @"link", @"meta", @"param", @"source", @"track", @"wbr", nil];
}
+2 -1
View File
@@ -16,7 +16,8 @@ extern const unsigned char HTMLKitVersionString[];
#import "HTMLDOM.h"
#import "HTMLParser.h"
#import "HTMLSerializer.h"
#import "HTMLSanitizer.h"
#import "HTMLKitErrorDomain.h"
#import "HTMLOrderedDictionary.h"
-19
View File
@@ -12,10 +12,6 @@
#import "HTMLNode.h"
@class HTMLText;
@class HTMLComment;
@class HTMLDocumentType;
/**
Private HTML Node methods which are not intended for public API.
*/
@@ -48,21 +44,6 @@
*/
- (HTMLElement *)asElement;
/**
Casts this node to a HTML Text. This cast should only be performed after the appropriate check.
*/
- (HTMLText *)asText;
/**
Casts this node to a HTML Comment. This cast should only be performed after the appropriate check.
*/
- (HTMLComment *)asComment;
/**
Casts this node to a HTML Document Type. This cast should only be performed after the appropriate check.
*/
- (HTMLDocumentType *)asDocumentType;
/**
Returns the same string representation of the DOM tree rooted at this node that is used by html5lib-tests.
-1
View File
@@ -8,7 +8,6 @@
#import <Foundation/Foundation.h>
#import "HTMLNodeIterator.h"
#import "HTMLTreeVisitor.h"
NS_ASSUME_NONNULL_BEGIN
-59
View File
@@ -1,59 +0,0 @@
//
// HTMLNodeVisitor.h
// HTMLKit
//
// Created by Iska on 30.07.19.
// Copyright © 2019 BrainCookie. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@class HTMLNode;
#pragma mark - Node Visitor
/**
A HTML Node Visitor which can be used with a tree visitor.
@see HTMLTreeVisitor
*/
@protocol HTMLNodeVisitor <NSObject>
@required
/**
Called when visiting the node for the first time
@param node The node that is beaing visited for the first time.
*/
- (void)enter:(HTMLNode *)node;
/**
Called when leaving a previously entered node, i.e. when all its child nodes are visited.
@param node The node that beaing leaved.
*/
- (void)leave:(HTMLNode *)node;
@end
#pragma mark - Block Node Visitor
/**
A concrete block-based HTML Node Visitor implementation.
*/
@interface HTMLNodeVisitorBlock : NSObject <HTMLNodeVisitor>
/**
Initializes and returns a new instance of this visitor.
@param enterBlock The block to apply on entering a visited node.
@param leaveBlock The block to apply on leaving a visited node.
*/
+ (instancetype)visitorWithEnterBlock:(void (^)(HTMLNode *node))enterBlock
leaveBlock:(void (^)(HTMLNode *node))leaveBlock;
@end
NS_ASSUME_NONNULL_END
-4
View File
@@ -6,10 +6,6 @@
// Copyright (c) 2014 BrainCookie. All rights reserved.
//
///------------------------------------------------------
/// HTMLKit private header
///------------------------------------------------------
#import <Foundation/Foundation.h>
#import "HTMLToken.h"
+11 -1
View File
@@ -6,6 +6,8 @@
// Copyright (c) 2015 BrainCookie. All rights reserved.
//
#import "NSString+HTMLKit.h"
/**
HTML quirks modes
https://html.spec.whatwg.org/multipage/infrastructure.html#quirks-mode
@@ -80,4 +82,12 @@ static NSString * HTMLQuirksModePrefixes[] = {
#undef QUIRKS_ENTRY
};
extern BOOL QuirksModePrefixMatch(NSString *publicIdentifier);
NS_INLINE BOOL QuirksModePrefixMatch(NSString *publicIdentifier)
{
for (int i = 0; i < sizeof(HTMLQuirksModePrefixes) / sizeof(HTMLQuirksModePrefixes[0]); i++) {
if ([publicIdentifier hasPrefixIgnoringCase:HTMLQuirksModePrefixes[i]]) {
return YES;
}
}
return NO;
}
-45
View File
@@ -1,45 +0,0 @@
//
// HTMLSerializer.h
// HTMLKit
//
// Created by Iska on 28.07.19.
// Copyright © 2019 BrainCookie. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@class HTMLNode;
/**
The scope for HTML Serialization.
*/
typedef NS_ENUM(unsigned short, HTMLSerializationScope)
{
HTMLSerializationScopeIncludeRoot = 1,
HTMLSerializationScopeChildrenOnly = 2
};
/**
A HTML DOM Serializer. Used to serialize HTML Tree rooted at a given node with the desired scope:
- IncludeRoot scope includes the given node into the serialized result, e.g. HTML Node's `outerHTML`
- ChildrenOnly scope serializes only the child nodes of the given node, e.g. HTML Node's `innerHTML`
https://html.spec.whatwg.org/multipage/parsing.html#serialising-html-fragments
*/
@interface HTMLSerializer : NSObject
/**
Serializes the given node with the given scope.
@param node The root node of the tree to serialize
@param scope The scope for serialization
*/
+ (NSString *)serializeNode:(HTMLNode *)node scope:(HTMLSerializationScope)scope;
@end
NS_ASSUME_NONNULL_END
-4
View File
@@ -6,10 +6,6 @@
// Copyright (c) 2014 BrainCookie. All rights reserved.
//
///------------------------------------------------------
/// HTMLKit private header
///------------------------------------------------------
#import <Foundation/Foundation.h>
#import "HTMLToken.h"
#import "HTMLOrderedDictionary.h"
-4
View File
@@ -6,10 +6,6 @@
// Copyright (c) 2014 BrainCookie. All rights reserved.
//
///------------------------------------------------------
/// HTMLKit private header
///------------------------------------------------------
#import <Foundation/Foundation.h>
@class HTMLDOCTYPEToken;
-4
View File
@@ -6,10 +6,6 @@
// Copyright (c) 2014 BrainCookie. All rights reserved.
//
///------------------------------------------------------
/// HTMLKit private header
///------------------------------------------------------
#import "HTMLToken.h"
#import "HTMLCharacterToken.h"
#import "HTMLCommentToken.h"
-44
View File
@@ -1,44 +0,0 @@
//
// HTMLTreeVisitor.h
// HTMLKit
//
// Created by Iska on 30.07.19.
// Copyright © 2019 BrainCookie. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "HTMLNodeVisitor.h"
NS_ASSUME_NONNULL_BEGIN
@class HTMLNode;
/**
A HTML Tree Visitor that walks the DOM in tree order. Nodes are visited exacly once
The provided node visitor is called for each node twice, once when entering the node,
and once again when leaving the node.
@see HTMLNodeVisitor
*/
@interface HTMLTreeVisitor : NSObject
/**
Initializes a new tree visitor with.
@param node The root node.
@return A new instance of a tree visitor.
*/
- (instancetype)initWithNode:(HTMLNode *)node;
/**
Walks the DOM tree rooted at the provided node with the given node visitor.
@param visitor A HTMLNodeVisitor implementation.
*/
- (void)walkWithNodeVisitor:(id<HTMLNodeVisitor>)visitor;
@end
NS_ASSUME_NONNULL_END
+3 -4
View File
@@ -19,18 +19,17 @@ NS_ASSUME_NONNULL_BEGIN
A character set for HTML whitespace characters: CHARACTER TABULATION U+0009, LINE FEED U+000A, FORM FEED U+000C,
CARRIAGE RETURN U+000D, and SPACE U+0020.
*/
+ (instancetype)htmlkit_HTMLWhitespaceCharacterSet;
+ (instancetype)HTMLWhitespaceCharacterSet;
/**
A character set for HTML HEX-Number characters: The digits 0-9, latin small letters a-f, and latin capital letters A-F.
*/
+ (instancetype)htmlkit_HTMLHexNumberCharacterSet;
+ (instancetype)HTMLHexNumberCharacterSet;
/**
A character set for CSS Nth-Expression: The digits 0-9, space, latin small n, latin capital N, plus sing and minus sign.
*/
+ (instancetype)htmlkit_CSSNthExpressionCharacterSet;
+ (instancetype)CSSNthExpressionCharacterSet;
@end
+30 -2
View File
@@ -15,17 +15,45 @@ NS_ASSUME_NONNULL_BEGIN
*/
@interface NSString (HTMLKit)
/**
Checks whether this string is equal to another ignoring the case.
@return `YES` if the two string are equal ignroing the case, `NO` otherwise.
*/
- (BOOL)isEqualToStringIgnoringCase:(NSString *)aString;
/**
Checks whether this string is equal to any of the given strings.
@return `YES` if there is an equal string, `NO` otherwise.
*/
- (BOOL)isEqualToAny:(NSString *)first, ... NS_REQUIRES_NIL_TERMINATION;
/**
Checks whether this string has a prefix ignoring the case.
@return `YES` if this string has a given prefix ignroing the case, `NO` otherwise.
*/
- (BOOL)hasPrefixIgnoringCase:(NSString *)aString;
/**
Checks whether this string is a HTML whitespace string.
@return `YES` if this string is a HTML whitespace string, `NO` otherwise.
*/
- (BOOL)htmlkit_isHTMLWhitespaceString;
- (BOOL)isHTMLWhitespaceString;
/**
@return The length of the leading HTML whitespace characters in this string.
*/
- (NSUInteger)htmlkit_leadingHTMLWhitespaceLength;
- (NSUInteger)leadingHTMLWhitespaceLength;
/**
Escapes this string as specified in `https://html.spec.whatwg.org/multipage/parsing.html#escapingString`
@return A copy of this string by HTML-escaping this stirng.
*/
- (NSString *)stringByEscapingForHTML;
@end
-41
View File
@@ -1,41 +0,0 @@
//
// NSString+Private.h
// HTMLKit
//
// Created by Iska on 26.03.19.
// Copyright © 2019 BrainCookie. All rights reserved.
//
///------------------------------------------------------
/// HTMLKit private header
///------------------------------------------------------
#import <Foundation/Foundation.h>
/**
NSStirng category for common helper methods.
*/
@interface NSString (Private)
/**
Checks whether this string is equal to another ignoring the case.
@return `YES` if the two string are equal ignroing the case, `NO` otherwise.
*/
- (BOOL)isEqualToStringIgnoringCase:(NSString *)aString;
/**
Checks whether this string is equal to any of the given strings.
@return `YES` if there is an equal string, `NO` otherwise.
*/
- (BOOL)isEqualToAny:(NSString *)first, ... NS_REQUIRES_NIL_TERMINATION;
/**
Checks whether this string has a prefix ignoring the case.
@return `YES` if this string has a given prefix ignroing the case, `NO` otherwise.
*/
- (BOOL)hasPrefixIgnoringCase:(NSString *)aString;
@end
-1
View File
@@ -34,6 +34,5 @@ module HTMLKit {
header "HTMLParser+Private.h"
header "HTMLNodeTraversal.h"
header "HTMLDOMUtils.h"
header "NSString+Private.h"
}
}
File diff suppressed because one or more lines are too long
@@ -1,43 +0,0 @@
//
// HTMLKitParserTests.m
// HTMLKit
//
// Created by Iska on 16.07.18.
// Copyright © 2018 BrainCookie. All rights reserved.
//
#import <XCTest/XCTest.h>
#import "HTMLDOM.h"
@interface HTMLKitParserIssuesTests : XCTestCase
@end
@implementation HTMLKitParserIssuesTests
#pragma mark - Bug Fixes
- (void)testBugFix_Issue_30 {
NSString *html =
@"<body>"
" <svg id='draw_area' width='600' height='800' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1'>"
" <image id='overlay_img' xlink:href='foo.png' width='600' height='800'/>"
" </svg>"
"</body>";
HTMLDocument* document = [HTMLDocument documentWithString:html];
HTMLElement *svg = [document querySelector:@"#draw_area"];
XCTAssertNil(svg.attributes[@"xlink"]);
XCTAssertEqualObjects(svg.attributes[@"xmlns"], @"http://www.w3.org/2000/svg");
XCTAssertEqualObjects(svg.attributes[@"xmlns:xlink"], @"http://www.w3.org/1999/xlink");
HTMLElement *image = [document querySelector:@"#overlay_img"];
XCTAssertNil(image.attributes[@"xlink"]);
XCTAssertNil(image.attributes[@"href"]);
XCTAssertEqualObjects(image.attributes[@"xlink:href"], @"foo.png");
XCTAssertEqualObjects(image.outerHTML, @"<image id=\"overlay_img\" xlink:href=\"foo.png\" width=\"600\" height=\"800\"></image>");
}
@end
+5 -7
View File
@@ -580,20 +580,19 @@ static HTMLNode * (^ LastDescendant)(HTMLNode *) = ^ HTMLNode * (HTMLNode *node)
XCTAssertNotNil(body);
// iterator should be deallocated and detached at this point
XCTAssertEqual(0, nodeIterators.allObjects.count);
XCTAssertEqual(0, nodeIterators.count);
// iterator should be autoreleased, deallocated and detached after autoreleasepool
@autoreleasepool {
HTMLNodeIterator *iterator = [[HTMLNodeIterator alloc] initWithNode:body];
[iterator nextNode];
XCTAssertEqual(1, nodeIterators.allObjects.count);
XCTAssertEqual(1, nodeIterators.count);
}
XCTAssertEqual(0, nodeIterators.allObjects.count);
XCTAssertEqual(0, nodeIterators.count);
}
- (void)testBugFix_Issue_22
{
- (void)testBugFix_Issue_22 {
// The issue is applicable only for devices. On simulator the test is passed.
HTMLDocument *document = [HTMLDocument documentWithString:@"<div id=\"id\"></div>"];
@@ -609,8 +608,7 @@ static HTMLNode * (^ LastDescendant)(HTMLNode *) = ^ HTMLNode * (HTMLNode *node)
XCTAssertTrue([element.elementId isEqualToString:divId]);
}
- (void)testBugFix_Issue_28
{
- (void)testBugFix_Issue_28 {
HTMLDocument *document = self.document;
HTMLNodeIterator *iterator = document.body.nodeIterator;
+2 -2
View File
@@ -2112,10 +2112,10 @@
@autoreleasepool {
HTMLRange *range = [[HTMLRange alloc] initWithDocument:document];
[range cloneContents];
XCTAssertEqual(1, ranges.allObjects.count);
XCTAssertEqual(1, ranges.count);
}
XCTAssertEqual(0, ranges.allObjects.count);
XCTAssertEqual(0, ranges.count);
}
@end
+6 -69
View File
@@ -8,19 +8,6 @@
#import <XCTest/XCTest.h>
#import "HTMLDOM.h"
#import "HTMLKitTestUtil.h"
#define Assert(input, expected) \
do { \
HTMLDocument *document = [HTMLDocument documentWithString:input]; \
XCTAssertEqualObjects(document.body.innerHTML, expected); \
} while(0)
#define AssertH(input, expected) \
do { \
HTMLDocument *document = [HTMLDocument documentWithString:input]; \
XCTAssertEqualObjects(document.head.innerHTML, expected); \
} while(0)
@interface HTMLSerializationTests : XCTestCase
@@ -28,47 +15,12 @@
@implementation HTMLSerializationTests
- (void)testSerializer
{
Assert(@"", @"");
Assert(@"<a a=\r\n", @"");
Assert(@"<p><i>Hello!</p>, World!</i>", @"<p><i>Hello!</i></p><i>, World!</i>");
Assert(@"<p><i>Hello</i>, World!</p>", @"<p><i>Hello</i>, World!</p>");
AssertH(@"<base foo=\"<'>\">", @"<base foo=\"<'>\">");
AssertH(@"<base foo=\"&amp;\">", @"<base foo=\"&amp;\">");
AssertH(@"<base foo=&amp>", @"<base foo=\"&amp;\">");
AssertH(@"<base foo=x0x00A0y>", @"<base foo=\"x&nbsp;y\">");
AssertH(@"<base foo='\"'>", @"<base foo=\"&quot;\">");
Assert(@"<span foo=3 title='test \"with\" &amp;quot;'>", @"<span foo=\"3\" title=\"test &quot;with&quot; &amp;quot;\"></span>");
Assert(@"<p>\"'\"</p>", @"<p>\"'\"</p>");
Assert(@"<p>&amp;</p>", @"<p>&amp;</p>");
Assert(@"<p>&amp</p>", @"<p>&amp;</p>");
Assert(@"<p>&lt;</p>", @"<p>&lt;</p>");
Assert(@"<p>&gt;</p>", @"<p>&gt;</p>");
Assert(@"<p>></p>", @"<p>&gt;</p>");
AssertH(@"<script>(x & 1) < 2; y > \"foo\" + 'bar'</script>", @"<script>(x & 1) < 2; y > \"foo\" + 'bar'</script>");
AssertH(@"<style>(x & 1) < 2; y > \"foo\" + 'bar'</style>", @"<style>(x & 1) < 2; y > \"foo\" + 'bar'</style>");
Assert(@"<xmp>(x & 1) < 2; y > \"foo\" + 'bar'</xmp>", @"<xmp>(x & 1) < 2; y > \"foo\" + 'bar'</xmp>");
Assert(@"<iframe>(x & 1) < 2; y > \"foo\" + 'bar'</iframe>", @"<iframe>(x & 1) < 2; y > \"foo\" + 'bar'</iframe>");
Assert(@"<noembed>(x & 1) < 2; y > \"foo\" + 'bar'</noembed>", @"<noembed>(x & 1) < 2; y > \"foo\" + 'bar'</noembed>");
AssertH(@"<noframes>(x & 1) < 2; y > \"foo\" + 'bar'</noframes>", @"<noframes>(x & 1) < 2; y > \"foo\" + 'bar'</noframes>");
Assert(@"<pre>foo bar</pre>", @"<pre>foo bar</pre>");
Assert(@"<pre>\nfoo bar</pre>", @"<pre>foo bar</pre>");
Assert(@"<pre>\n\nfoo bar</pre>", @"<pre>\nfoo bar</pre>");
Assert(@"<textarea>foo bar</textarea>", @"<textarea>foo bar</textarea>");
Assert(@"<textarea>\nfoo bar</textarea>", @"<textarea>foo bar</textarea>");
Assert(@"<textarea>\n\nfoo bar</textarea>", @"<textarea>\nfoo bar</textarea>");
Assert(@"<listing>foo bar</listing>", @"<listing>foo bar</listing>");
Assert(@"<listing>\nfoo bar</listing>", @"<listing>foo bar</listing>");
Assert(@"<listing>\n\nfoo bar</listing>", @"<listing>\nfoo bar</listing>");
Assert(@"<p>hi <!--world--></p>", @"<p>hi <!--world--></p>");
Assert(@"<p>hi <!-- world--></p>", @"<p>hi <!-- world--></p>");
Assert(@"<p>hi <!--world --></p>", @"<p>hi <!--world --></p>");
Assert(@"<p>hi <!-- world --></p>", @"<p>hi <!-- world --></p>");
Assert(@"<svg xmlns=\"bleh\"></svg>", @"<svg xmlns=\"bleh\"></svg>");
Assert(@"<svg xmlns:foo=\"bleh\"></svg>", @"<svg xmlns:foo=\"bleh\"></svg>");
Assert(@"<svg xmlns:xlink=\"bleh\"></svg>", @"<svg xmlns:xlink=\"bleh\"></svg>");
Assert(@"<svg xlink:href=\"bleh\"></svg>", @"<svg xlink:href=\"bleh\"></svg>");
- (void)setUp {
[super setUp];
}
- (void)tearDown {
[super tearDown];
}
#pragma mark - Bug Fixes
@@ -89,19 +41,4 @@
XCTAssertEqualObjects(document.body.outerHTML, @"<body key=\"&amp; testing &nbsp;\"></body>");
}
- (void)testBugFix_Issue_33
{
NSString *path = [HTMLKitTestUtil pathForFixture:@"bug33" ofType:@"html" inDirectory:@"Fixtures"];
NSString *html = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
HTMLDocument *document = [HTMLDocument documentWithString:html];
XCTestExpectation *expectation = [self expectationWithDescription:@"HTML serializes despite limited recursion depth"];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
[document.rootElement outerHTML];
[expectation fulfill];
});
[self waitForExpectationsWithTimeout:500 handler:nil];
}
@end
+36 -20
View File
@@ -7,8 +7,8 @@
//
#import <XCTest/XCTest.h>
#import "NSString+Private.h"
#import "NSString+HTMLKit.h"
#import "HTMLDOM.h"
@interface HTMLKitStringCategoryTests : XCTestCase
@@ -51,33 +51,49 @@
- (void)testIsHTMLWhitespaceString
{
XCTAssertTrue([@" " htmlkit_isHTMLWhitespaceString]);
XCTAssertTrue([@"\t" htmlkit_isHTMLWhitespaceString]);
XCTAssertTrue([@"\n" htmlkit_isHTMLWhitespaceString]);
XCTAssertTrue([@"\f" htmlkit_isHTMLWhitespaceString]);
XCTAssertTrue([@"\r" htmlkit_isHTMLWhitespaceString]);
XCTAssertTrue([@" \t\n\f\r" htmlkit_isHTMLWhitespaceString]);
XCTAssertTrue([@"\t\n\f\r " htmlkit_isHTMLWhitespaceString]);
XCTAssertTrue([@" \t \n \f \r" htmlkit_isHTMLWhitespaceString]);
XCTAssertFalse([@"html kit" htmlkit_isHTMLWhitespaceString]);
XCTAssertTrue([@" " isHTMLWhitespaceString]);
XCTAssertTrue([@"\t" isHTMLWhitespaceString]);
XCTAssertTrue([@"\n" isHTMLWhitespaceString]);
XCTAssertTrue([@"\f" isHTMLWhitespaceString]);
XCTAssertTrue([@"\r" isHTMLWhitespaceString]);
XCTAssertTrue([@" \t\n\f\r" isHTMLWhitespaceString]);
XCTAssertTrue([@"\t\n\f\r " isHTMLWhitespaceString]);
XCTAssertTrue([@" \t \n \f \r" isHTMLWhitespaceString]);
XCTAssertFalse([@"html kit" isHTMLWhitespaceString]);
}
- (void)testLeadingWhitespaceLength
{
XCTAssertEqual([@"" htmlkit_leadingHTMLWhitespaceLength], 0);
XCTAssertEqual([@"\0" htmlkit_leadingHTMLWhitespaceLength], 0);
XCTAssertEqual([@"" leadingHTMLWhitespaceLength], 0);
XCTAssertEqual([@"\0" leadingHTMLWhitespaceLength], 0);
XCTAssertEqual([@" " htmlkit_leadingHTMLWhitespaceLength], 1);
XCTAssertEqual([@"\0 " htmlkit_leadingHTMLWhitespaceLength], 0);
XCTAssertEqual([@" " leadingHTMLWhitespaceLength], 1);
XCTAssertEqual([@"\0 " leadingHTMLWhitespaceLength], 0);
XCTAssertEqual([@" " htmlkit_leadingHTMLWhitespaceLength], 2);
XCTAssertEqual([@" \0 " htmlkit_leadingHTMLWhitespaceLength], 1);
XCTAssertEqual([@" " leadingHTMLWhitespaceLength], 2);
XCTAssertEqual([@" \0 " leadingHTMLWhitespaceLength], 1);
XCTAssertEqual([@"\t\r\n\f" htmlkit_leadingHTMLWhitespaceLength], 4);
XCTAssertEqual([@"\t\r\n\0\f" htmlkit_leadingHTMLWhitespaceLength], 3);
XCTAssertEqual([@"\t\r\n\f" leadingHTMLWhitespaceLength], 4);
XCTAssertEqual([@"\t\r\n\0\f" leadingHTMLWhitespaceLength], 3);
XCTAssertEqual([@"\t\r\n\f " htmlkit_leadingHTMLWhitespaceLength], 5);
XCTAssertEqual([@"\t\r\n\f\0 " htmlkit_leadingHTMLWhitespaceLength], 4);
XCTAssertEqual([@"\t\r\n\f " leadingHTMLWhitespaceLength], 5);
XCTAssertEqual([@"\t\r\n\f\0 " leadingHTMLWhitespaceLength], 4);
}
- (void)testStringByEscapingForHTML
{
XCTAssertEqualObjects(@"".stringByEscapingForHTML, @"");
XCTAssertEqualObjects(@"&".stringByEscapingForHTML, @"&amp;");
XCTAssertEqualObjects(@"0x00A0".stringByEscapingForHTML, @"&nbsp;");
XCTAssertEqualObjects(@"\"".stringByEscapingForHTML, @"&quot;");
XCTAssertEqualObjects(@"<".stringByEscapingForHTML, @"&lt;");
XCTAssertEqualObjects(@">".stringByEscapingForHTML, @"&gt;");
XCTAssertEqualObjects(@"&0x00A0\"<>".stringByEscapingForHTML, @"&amp;&nbsp;&quot;&lt;&gt;");
NSString *input = @"This is an <b>email</b>: John Do <john@do.com>";
NSString *escaped = input.stringByEscapingForHTML;
XCTAssertNotEqual(input, escaped);
XCTAssertEqualObjects(escaped, @"This is an &lt;b&gt;email&lt;/b&gt;: John Do &lt;john@do.com&gt;");
}
@end
-108
View File
@@ -1,108 +0,0 @@
//
// HTMLTreeVisitorTests.m
// HTMLKit
//
// Created by Iska on 30.07.19.
// Copyright © 2019 BrainCookie. All rights reserved.
//
#import <XCTest/XCTest.h>
#import "HTMLDOM.h"
#import "HTMLElement.h"
#import "HTMLNode+Private.h"
@interface HTMLTreeVisitorTests : XCTestCase
@end
@implementation HTMLTreeVisitorTests
#pragma mark - Asserts
#define AssertElementWithId(input, id) \
do { \
HTMLNode *node = input;\
XCTAssertEqual(node.nodeType, HTMLNodeElement);\
XCTAssertEqualObjects(node.asElement[@"id"], id);\
} while(0)
#define AssertTextWithValue(input, value) \
do { \
HTMLNode *node = input;\
XCTAssertEqual(node.nodeType, HTMLNodeText);\
XCTAssertEqualObjects(node.textContent, value);\
} while(0)
#define AssertCommentWithValue(input, value) \
do { \
HTMLNode *node = input;\
XCTAssertEqual(node.nodeType, HTMLNodeComment);\
XCTAssertEqualObjects(node.textContent, value);\
} while(0)
#pragma mark - Basic Walking
- (HTMLNode *)testDOM
{
// Tree structure:
// #a
// |
// +----+----+
// | |
// #b #c
// |
// +----+----+
// | |
// #d #j
// |
// +----+----+
// | | |
// #e #f #i
// |
// +--+--+
// | |
// #g #h
HTMLElement *div = [[HTMLElement alloc] initWithTagName:@"div" attributes:@{@"id": @"a"}];
[div appendNode:[[HTMLElement alloc] initWithTagName:@"div" attributes:@{@"id": @"b"}]];
HTMLElement *c = [[HTMLElement alloc] initWithTagName:@"div" attributes:@{@"id": @"c"}];
[div appendNode:c];
HTMLElement *d = [[HTMLElement alloc] initWithTagName:@"div" attributes:@{@"id": @"d"}];
[c appendNode:d];
[c appendNode:[[HTMLElement alloc] initWithTagName:@"div" attributes:@{@"id": @"j"}]];
[d appendNode:[[HTMLElement alloc] initWithTagName:@"div" attributes:@{@"id": @"e"}]];
HTMLElement *f = [[HTMLElement alloc] initWithTagName:@"div" attributes:@{@"id": @"f"}];
[d appendNode:f];
[d appendNode:[[HTMLElement alloc] initWithTagName:@"div" attributes:@{@"id": @"i"}]];
[f appendNode:[[HTMLElement alloc] initWithTagName:@"g" attributes:@{@"id": @"g"}]];
[f appendNode:[[HTMLElement alloc] initWithTagName:@"h" attributes:@{@"id": @"h"}]];
return div;
}
- (void)testTreeVisitor
{
HTMLNode *root = self.testDOM;
HTMLTreeVisitor *visitor = [[HTMLTreeVisitor alloc] initWithNode:root];
NSMutableArray *visited = [NSMutableArray array];
[visitor walkWithNodeVisitor:[HTMLNodeVisitorBlock visitorWithEnterBlock:^(HTMLNode *node) {
[visited addObject:[NSString stringWithFormat:@"E %@", node.asElement.elementId]];
} leaveBlock:^(HTMLNode *node) {
[visited addObject:[NSString stringWithFormat:@"L %@", node.asElement.elementId]];
}]];
NSArray *expected = @[@"E a", @"E b", @"L b", @"E c", @"E d", @"E e", @"L e", @"E f", @"E g", @"L g", @"E h", @"L h",
@"L f", @"E i", @"L i", @"L d", @"E j", @"L j", @"L c", @"L a"];
XCTAssertEqualObjects(visited, expected);
}
@end
+1
View File
@@ -7,6 +7,7 @@
//
#import <XCTest/XCTest.h>
#import "HTMLTreeWalker.h"
#import "HTMLDOM.h"
#import "HTMLNode+Private.h"