Skip to content

Commit e788c83

Browse files
committed
Merge branch 'release/0.3.0'
2 parents 0401118 + a33f4e0 commit e788c83

File tree

159 files changed

+6044
-141
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

159 files changed

+6044
-141
lines changed

.gitignore

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1-
# OS X
2-
.DS_Store
3-
41
# Xcode
2+
#
3+
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
4+
5+
## Build generated
56
build/
7+
DerivedData
8+
9+
## Various settings
610
*.pbxuser
711
!default.pbxuser
812
*.mode1v3
@@ -12,13 +16,28 @@ build/
1216
*.perspectivev3
1317
!default.perspectivev3
1418
xcuserdata
19+
20+
## Other
1521
*.xccheckout
16-
profile
1722
*.moved-aside
18-
DerivedData
23+
*.xcuserstate
24+
*.xcscmblueprint
25+
26+
## Obj-C/Swift specific
1927
*.hmap
2028
*.ipa
2129

2230
# CocoaPods
23-
Pods
31+
#
32+
# We recommend against adding the Pods directory to your .gitignore. However
33+
# you should judge for yourself, the pros and cons are mentioned at:
34+
# http://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
35+
#
36+
Pods/
37+
38+
# Carthage
39+
#
40+
# Add this line if you want to avoid checking in source code from Carthage dependencies.
41+
Carthage/Checkouts
2442

43+
Carthage/Build

HTMLKit.xcodeproj/project.pbxproj

Lines changed: 314 additions & 85 deletions
Large diffs are not rendered by default.

HTMLKit.xcworkspace/contents.xcworkspacedata

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

HTMLKit/CSSAttributeSelector.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
//
2+
// CSSAttributeSelector.h
3+
// HTMLKit
4+
//
5+
// Created by Iska on 14/05/15.
6+
// Copyright (c) 2015 BrainCookie. All rights reserved.
7+
//
8+
9+
#import <Foundation/Foundation.h>
10+
#import "CSSSelector.h"
11+
12+
NS_ASSUME_NONNULL_BEGIN
13+
14+
@interface CSSAttributeSelector : CSSSelector
15+
16+
@property (nonatomic, assign) CSSAttributeSelectorType type;
17+
@property (nonatomic, strong, readonly) NSString *name;
18+
@property (nonatomic, strong, readonly) NSString *value;
19+
20+
+ (instancetype)classSelector:(NSString *)className;
21+
+ (instancetype)idSelector:(NSString *)elementId;
22+
+ (instancetype)hasAttributeSelector:(NSString *)attributeName;
23+
24+
- (instancetype)initWithType:(CSSAttributeSelectorType)type
25+
attributeName:(NSString *)name
26+
attrbiuteValue:(NSString *)value;
27+
28+
@end
29+
30+
NS_ASSUME_NONNULL_END

HTMLKit/CSSAttributeSelector.m

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
//
2+
// CSSAttributeSelector.m
3+
// HTMLKit
4+
//
5+
// Created by Iska on 14/05/15.
6+
// Copyright (c) 2015 BrainCookie. All rights reserved.
7+
//
8+
9+
#import "CSSAttributeSelector.h"
10+
#import "HTMLElement.h"
11+
#import "NSCharacterSet+HTMLKit.h"
12+
13+
@interface CSSAttributeSelector ()
14+
{
15+
CSSAttributeSelectorType _type;
16+
NSString *_name;
17+
NSString *_value;
18+
}
19+
@end
20+
21+
@implementation CSSAttributeSelector
22+
23+
+ (instancetype)classSelector:(NSString *)className
24+
{
25+
return [[self alloc] initWithType:CSSAttributeSelectorIncludes attributeName:@"class" attrbiuteValue:className];
26+
}
27+
28+
+ (instancetype)idSelector:(NSString *)elementId
29+
{
30+
return [[self alloc] initWithType:CSSAttributeSelectorExactMatch attributeName:@"id" attrbiuteValue:elementId];
31+
}
32+
33+
+ (instancetype)hasAttributeSelector:(NSString *)attributeName
34+
{
35+
return [[self alloc] initWithType:CSSAttributeSelectorExists attributeName:attributeName attrbiuteValue:@""];
36+
}
37+
38+
- (instancetype)initWithType:(CSSAttributeSelectorType)type
39+
attributeName:(NSString *)name
40+
attrbiuteValue:(NSString *)value
41+
{
42+
self = [super init];
43+
if (self) {
44+
self.type = type;
45+
_name = [name copy];
46+
_value = value ? [value copy]: @"";
47+
}
48+
return self;
49+
}
50+
51+
- (BOOL)acceptElement:(HTMLElement *)element
52+
{
53+
switch (_type) {
54+
case CSSAttributeSelectorExists:
55+
{
56+
return !!element[_name];
57+
}
58+
case CSSAttributeSelectorExactMatch:
59+
{
60+
return [element[_name] isEqualToString:_value];
61+
}
62+
case CSSAttributeSelectorIncludes:
63+
{
64+
NSArray *components = [element[_name] componentsSeparatedByCharactersInSet:[NSCharacterSet HTMLWhitespaceCharacterSet]];
65+
return [components containsObject:_value];
66+
}
67+
case CSSAttributeSelectorBegins:
68+
{
69+
return [element[_name] hasPrefix:_value];
70+
}
71+
case CSSAttributeSelectorEnds:
72+
{
73+
return [element[_name] hasSuffix:_value];
74+
}
75+
case CSSAttributeSelectorContains:
76+
{
77+
return [element[_name] containsString:_value];
78+
}
79+
case CSSAttributeSelectorHyphen:
80+
{
81+
return [element[_name] isEqualToString:_value] || [element[_name] hasPrefix:[_value stringByAppendingString:@"-"]];
82+
}
83+
case CSSAttributeSelectorNot:
84+
{
85+
return ![element[_name] isEqualToString:_value];
86+
}
87+
default:
88+
return NO;
89+
}
90+
}
91+
92+
#pragma mark - Description
93+
94+
- (NSString *)debugDescription
95+
{
96+
if (self.type == CSSAttributeSelectorExists) {
97+
return [NSString stringWithFormat:@"[%@]", self.name];
98+
}
99+
100+
NSString *matcher = @{@(CSSAttributeSelectorExactMatch): @"=",
101+
@(CSSAttributeSelectorIncludes): @"~=",
102+
@(CSSAttributeSelectorBegins): @"^=",
103+
@(CSSAttributeSelectorEnds): @"$=",
104+
@(CSSAttributeSelectorContains): @"*=",
105+
@(CSSAttributeSelectorHyphen): @"|=",
106+
@(CSSAttributeSelectorNot): @"!="}[@(self.type)];
107+
108+
return [NSString stringWithFormat:@"[%@%@'%@']", self.name, matcher, self.value];
109+
}
110+
111+
@end

HTMLKit/CSSCodePoints.h

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
//
2+
// CSSTokenizer CODEPOINTs.h
3+
// HTMLKit
4+
//
5+
// Created by Iska on 08/06/15.
6+
// Copyright (c) 2015 BrainCookie. All rights reserved.
7+
//
8+
9+
#define CODEPOINTS \
10+
CODEPOINT( CONTROL, 0x0080 ) \
11+
CODEPOINT( CHARACTER_TABULATION, 0x0009 ) \
12+
CODEPOINT( LINE_FEED, 0x000A ) \
13+
CODEPOINT( SPACE, 0x0020 ) \
14+
CODEPOINT( QUOTATION_MARK, 0x0022 ) \
15+
CODEPOINT( NUMBER_SIGN, 0x0023 ) \
16+
CODEPOINT( DOLLAR_SIGN, 0x0024 ) \
17+
CODEPOINT( APOSTROPHE, 0x0027 ) \
18+
CODEPOINT( LEFT_PARENTHESIS, 0x0028 ) \
19+
CODEPOINT( RIGHT_PARENTHESIS, 0x0029 ) \
20+
CODEPOINT( ASTERIX, 0x002A ) \
21+
CODEPOINT( PLUS_SIGN, 0x002B ) \
22+
CODEPOINT( COMMA, 0x002C ) \
23+
CODEPOINT( HYPHEN_MINUS, 0x002D ) \
24+
CODEPOINT( FULL_STOP, 0x002E ) \
25+
CODEPOINT( DIGIT_ZERO, 0x0030 ) \
26+
CODEPOINT( DIGIT_NINE, 0x0039 ) \
27+
CODEPOINT( COLON, 0x003A ) \
28+
CODEPOINT( EQUALS_SIGN, 0x003D ) \
29+
CODEPOINT( GREATER_THAN_SIGN, 0x003E ) \
30+
CODEPOINT( LATIN_CAPITAL_LETTER_A, 0x0041 ) \
31+
CODEPOINT( LATIN_CAPITAL_LETTER_F, 0x0046 ) \
32+
CODEPOINT( LATIN_CAPITAL_LETTER_Z, 0x005A ) \
33+
CODEPOINT( LEFT_SQUARE_BRACKET, 0x005B ) \
34+
CODEPOINT( REVERSE_SOLIDUS, 0x005C ) \
35+
CODEPOINT( RIGHT_SQUARE_BRACKET, 0x005D ) \
36+
CODEPOINT( CIRCUMFLEX_ACCENT, 0x005E ) \
37+
CODEPOINT( LOW_LINE, 0x005F ) \
38+
CODEPOINT( LATIN_SMALL_LETTER_A, 0x0061 ) \
39+
CODEPOINT( LATIN_SMALL_LETTER_F, 0x0066 ) \
40+
CODEPOINT( LATIN_SMALL_LETTER_Z, 0x007A ) \
41+
CODEPOINT( VERTICAL_LINE, 0x007C ) \
42+
CODEPOINT( TILDE, 0x007E ) \
43+
CODEPOINT( REPLACEMENT_CHARACTER, 0xFFFD )
44+
45+
#define CODEPOINT( name, value ) static UniChar const name = value;
46+
CODEPOINTS
47+
#undef CODEPOINT
48+
49+
NS_INLINE BOOL isWhitespace(UTF32Char codePoint)
50+
{
51+
return (codePoint == CHARACTER_TABULATION ||
52+
codePoint == LINE_FEED ||
53+
codePoint == SPACE);
54+
}
55+
56+
NS_INLINE BOOL isCombinator(UTF32Char codePoint)
57+
{
58+
return (codePoint == SPACE ||
59+
codePoint == PLUS_SIGN ||
60+
codePoint == COMMA ||
61+
codePoint == GREATER_THAN_SIGN ||
62+
codePoint == TILDE);
63+
}
64+
65+
NS_INLINE BOOL isDigit(UTF32Char codePoint)
66+
{
67+
return codePoint >= DIGIT_ZERO && codePoint <= DIGIT_NINE;
68+
}
69+
70+
NS_INLINE BOOL isHexDigit(UTF32Char codePoint)
71+
{
72+
return ((codePoint >= DIGIT_ZERO && codePoint <= DIGIT_NINE) ||
73+
(codePoint >= LATIN_CAPITAL_LETTER_A && codePoint <= LATIN_CAPITAL_LETTER_F) ||
74+
(codePoint >= LATIN_SMALL_LETTER_A && codePoint <= LATIN_SMALL_LETTER_F));
75+
}
76+
77+
NS_INLINE BOOL isQuote(UTF32Char codePoint)
78+
{
79+
return codePoint == QUOTATION_MARK || codePoint == APOSTROPHE;
80+
}
81+
82+
NS_INLINE BOOL isNewLine(UTF32Char codePoint)
83+
{
84+
return codePoint == LINE_FEED;
85+
}
86+
87+
NS_INLINE BOOL isNameStart(UTF32Char codePoint)
88+
{
89+
return ((codePoint >= LATIN_CAPITAL_LETTER_A && codePoint <= LATIN_CAPITAL_LETTER_Z) ||
90+
(codePoint >= LATIN_SMALL_LETTER_A && codePoint <= LATIN_SMALL_LETTER_Z) ||
91+
codePoint >= CONTROL ||
92+
codePoint == LOW_LINE);
93+
}
94+
95+
NS_INLINE BOOL isName(UTF32Char codePoint)
96+
{
97+
return isNameStart(codePoint) || isDigit(codePoint) || codePoint == HYPHEN_MINUS;
98+
}
99+
100+
NS_INLINE BOOL isValidEscape(UTF32Char first, UTF32Char second)
101+
{
102+
if (first != REVERSE_SOLIDUS || isNewLine(second)) {
103+
return false;
104+
}
105+
106+
return YES;
107+
}
108+
109+
NS_INLINE BOOL isValidEscapedCodePoint(UTF32Char codePoint)
110+
{
111+
return (codePoint != 0 &&
112+
!(codePoint >= 0xD800 && codePoint <= 0x0DFFF) &&
113+
codePoint <= 0x10FFFF);
114+
}
115+
116+
NS_INLINE BOOL isValidIdentifierStart(UTF32Char first, UTF32Char second, UTF32Char third)
117+
{
118+
if (first == HYPHEN_MINUS) {
119+
if (isNameStart(second) ||
120+
second == HYPHEN_MINUS ||
121+
isValidEscape(second, third)) {
122+
return YES;
123+
} else {
124+
return NO;
125+
}
126+
} else if (isNameStart(first)) {
127+
return YES;
128+
} else if (first == REVERSE_SOLIDUS) {
129+
return isValidEscape(first, second);
130+
} else {
131+
return NO;
132+
}
133+
}
134+
135+
NS_INLINE void AppendCodePoint(CFMutableStringRef string, UTF32Char codePoint)
136+
{
137+
UniChar pair[2];
138+
Boolean isPair = CFStringGetSurrogatePairForLongCharacter(codePoint, pair);
139+
CFStringAppendCharacters(string, pair, isPair ? 2 : 1);
140+
}

HTMLKit/CSSCombinatorSelector.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
//
2+
// CSSCombinatorSelector.h
3+
// HTMLKit
4+
//
5+
// Created by Iska on 12/10/15.
6+
// Copyright © 2015 BrainCookie. All rights reserved.
7+
//
8+
9+
#import "CSSSelector.h"
10+
11+
NS_ASSUME_NONNULL_BEGIN
12+
13+
@interface CSSCombinatorSelector : CSSSelector
14+
15+
+ (instancetype)childOfElementCombinator:(CSSSelector *)selector;
16+
+ (instancetype)descendantOfElementCombinator:(CSSSelector *)selector;
17+
+ (instancetype)adjacentSiblingCombinator:(CSSSelector *)selector;
18+
+ (instancetype)generalSiblingCombinator:(CSSSelector *)selector;
19+
20+
@end
21+
22+
NS_ASSUME_NONNULL_END

0 commit comments

Comments
 (0)