diff --git a/HTMLKit.xcodeproj/project.pbxproj b/HTMLKit.xcodeproj/project.pbxproj
index 8b75ba6..89003b6 100644
--- a/HTMLKit.xcodeproj/project.pbxproj
+++ b/HTMLKit.xcodeproj/project.pbxproj
@@ -38,6 +38,24 @@
6279F87419E1808D00F12EE5 /* HTMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 6279F87219E1808D00F12EE5 /* HTMLElement.h */; };
6279F87519E1808D00F12EE5 /* HTMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 6279F87319E1808D00F12EE5 /* HTMLElement.m */; };
6279F87619E1808D00F12EE5 /* HTMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 6279F87319E1808D00F12EE5 /* HTMLElement.m */; };
+ 62AE593519F97D880043F069 /* HTMLParseErrorToken.h in Headers */ = {isa = PBXBuildFile; fileRef = 62AE593319F97D880043F069 /* HTMLParseErrorToken.h */; };
+ 62AE593619F97D880043F069 /* HTMLParseErrorToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 62AE593419F97D880043F069 /* HTMLParseErrorToken.m */; };
+ 62AE593719F97D880043F069 /* HTMLParseErrorToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 62AE593419F97D880043F069 /* HTMLParseErrorToken.m */; };
+ 62AE593A19F97E1C0043F069 /* HTMLDOCTYPEToken.h in Headers */ = {isa = PBXBuildFile; fileRef = 62AE593819F97E1C0043F069 /* HTMLDOCTYPEToken.h */; };
+ 62AE593B19F97E1C0043F069 /* HTMLDOCTYPEToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 62AE593919F97E1C0043F069 /* HTMLDOCTYPEToken.m */; };
+ 62AE593C19F97E1C0043F069 /* HTMLDOCTYPEToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 62AE593919F97E1C0043F069 /* HTMLDOCTYPEToken.m */; };
+ 62AE593F19F9907C0043F069 /* HTMLTagToken.h in Headers */ = {isa = PBXBuildFile; fileRef = 62AE593D19F9907C0043F069 /* HTMLTagToken.h */; };
+ 62AE594019F9907C0043F069 /* HTMLTagToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 62AE593E19F9907C0043F069 /* HTMLTagToken.m */; };
+ 62AE594119F9907C0043F069 /* HTMLTagToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 62AE593E19F9907C0043F069 /* HTMLTagToken.m */; };
+ 62AE594419F992F30043F069 /* HTMLCommentToken.h in Headers */ = {isa = PBXBuildFile; fileRef = 62AE594219F992F30043F069 /* HTMLCommentToken.h */; };
+ 62AE594519F992F30043F069 /* HTMLCommentToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 62AE594319F992F30043F069 /* HTMLCommentToken.m */; };
+ 62AE594619F992F30043F069 /* HTMLCommentToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 62AE594319F992F30043F069 /* HTMLCommentToken.m */; };
+ 62AE594919F9948A0043F069 /* HTMLCharacterToken.h in Headers */ = {isa = PBXBuildFile; fileRef = 62AE594719F9948A0043F069 /* HTMLCharacterToken.h */; };
+ 62AE594A19F9948A0043F069 /* HTMLCharacterToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 62AE594819F9948A0043F069 /* HTMLCharacterToken.m */; };
+ 62AE594B19F9948A0043F069 /* HTMLCharacterToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 62AE594819F9948A0043F069 /* HTMLCharacterToken.m */; };
+ 62AE594E19F9A17A0043F069 /* HTMLEOFToken.h in Headers */ = {isa = PBXBuildFile; fileRef = 62AE594C19F9A17A0043F069 /* HTMLEOFToken.h */; };
+ 62AE594F19F9A17A0043F069 /* HTMLEOFToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 62AE594D19F9A17A0043F069 /* HTMLEOFToken.m */; };
+ 62AE595019F9A17A0043F069 /* HTMLEOFToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 62AE594D19F9A17A0043F069 /* HTMLEOFToken.m */; };
62F31FDD19E9DCCF007F0657 /* HTMLTokenizerEntities.h in Headers */ = {isa = PBXBuildFile; fileRef = 62F31FDB19E9DCCF007F0657 /* HTMLTokenizerEntities.h */; };
62F31FDE19E9DCCF007F0657 /* HTMLTokenizerEntities.m in Sources */ = {isa = PBXBuildFile; fileRef = 62F31FDC19E9DCCF007F0657 /* HTMLTokenizerEntities.m */; };
62F31FDF19E9DCCF007F0657 /* HTMLTokenizerEntities.m in Sources */ = {isa = PBXBuildFile; fileRef = 62F31FDC19E9DCCF007F0657 /* HTMLTokenizerEntities.m */; };
@@ -107,6 +125,18 @@
6279F87119E17DC700F12EE5 /* HTMLParserInsertionModes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HTMLParserInsertionModes.h; sourceTree = ""; };
6279F87219E1808D00F12EE5 /* HTMLElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTMLElement.h; sourceTree = ""; };
6279F87319E1808D00F12EE5 /* HTMLElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLElement.m; sourceTree = ""; };
+ 62AE593319F97D880043F069 /* HTMLParseErrorToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTMLParseErrorToken.h; sourceTree = ""; };
+ 62AE593419F97D880043F069 /* HTMLParseErrorToken.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLParseErrorToken.m; sourceTree = ""; };
+ 62AE593819F97E1C0043F069 /* HTMLDOCTYPEToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTMLDOCTYPEToken.h; sourceTree = ""; };
+ 62AE593919F97E1C0043F069 /* HTMLDOCTYPEToken.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLDOCTYPEToken.m; sourceTree = ""; };
+ 62AE593D19F9907C0043F069 /* HTMLTagToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTMLTagToken.h; sourceTree = ""; };
+ 62AE593E19F9907C0043F069 /* HTMLTagToken.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLTagToken.m; sourceTree = ""; };
+ 62AE594219F992F30043F069 /* HTMLCommentToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTMLCommentToken.h; sourceTree = ""; };
+ 62AE594319F992F30043F069 /* HTMLCommentToken.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLCommentToken.m; sourceTree = ""; };
+ 62AE594719F9948A0043F069 /* HTMLCharacterToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTMLCharacterToken.h; sourceTree = ""; };
+ 62AE594819F9948A0043F069 /* HTMLCharacterToken.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLCharacterToken.m; sourceTree = ""; };
+ 62AE594C19F9A17A0043F069 /* HTMLEOFToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTMLEOFToken.h; sourceTree = ""; };
+ 62AE594D19F9A17A0043F069 /* HTMLEOFToken.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLEOFToken.m; sourceTree = ""; };
62E7CAAE19CDFFB500465A83 /* HTMLTokenizerCharacters.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HTMLTokenizerCharacters.h; sourceTree = ""; };
62F31FDB19E9DCCF007F0657 /* HTMLTokenizerEntities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTMLTokenizerEntities.h; sourceTree = ""; };
62F31FDC19E9DCCF007F0657 /* HTMLTokenizerEntities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLTokenizerEntities.m; sourceTree = ""; };
@@ -257,6 +287,18 @@
62F31FDC19E9DCCF007F0657 /* HTMLTokenizerEntities.m */,
624493AA19CD0CBE00BCDDF4 /* HTMLToken.h */,
624493AB19CD0CBE00BCDDF4 /* HTMLToken.m */,
+ 62AE594719F9948A0043F069 /* HTMLCharacterToken.h */,
+ 62AE594819F9948A0043F069 /* HTMLCharacterToken.m */,
+ 62AE594219F992F30043F069 /* HTMLCommentToken.h */,
+ 62AE594319F992F30043F069 /* HTMLCommentToken.m */,
+ 62AE593819F97E1C0043F069 /* HTMLDOCTYPEToken.h */,
+ 62AE593919F97E1C0043F069 /* HTMLDOCTYPEToken.m */,
+ 62AE594C19F9A17A0043F069 /* HTMLEOFToken.h */,
+ 62AE594D19F9A17A0043F069 /* HTMLEOFToken.m */,
+ 62AE593319F97D880043F069 /* HTMLParseErrorToken.h */,
+ 62AE593419F97D880043F069 /* HTMLParseErrorToken.m */,
+ 62AE593D19F9907C0043F069 /* HTMLTagToken.h */,
+ 62AE593E19F9907C0043F069 /* HTMLTagToken.m */,
);
name = Tokenizing;
sourceTree = "";
@@ -269,13 +311,19 @@
buildActionMask = 2147483647;
files = (
62F873EB19E088C90062683C /* HTMLParser.h in Headers */,
+ 62AE594419F992F30043F069 /* HTMLCommentToken.h in Headers */,
+ 62AE594E19F9A17A0043F069 /* HTMLEOFToken.h in Headers */,
624493AC19CD0CBE00BCDDF4 /* HTMLToken.h in Headers */,
62F31FDD19E9DCCF007F0657 /* HTMLTokenizerEntities.h in Headers */,
6279F87419E1808D00F12EE5 /* HTMLElement.h in Headers */,
+ 62AE593F19F9907C0043F069 /* HTMLTagToken.h in Headers */,
625A150D19C78BE900AD0C32 /* HTMLInputStreamReaderErrors.h in Headers */,
624493A619CCC54100BCDDF4 /* HTMLTokenizer.h in Headers */,
+ 62AE593A19F97E1C0043F069 /* HTMLDOCTYPEToken.h in Headers */,
625A150419C783EB00AD0C32 /* HTMLKit.h in Headers */,
625A150819C78ABA00AD0C32 /* HTMLInputStreamReader.h in Headers */,
+ 62AE593519F97D880043F069 /* HTMLParseErrorToken.h in Headers */,
+ 62AE594919F9948A0043F069 /* HTMLCharacterToken.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -422,13 +470,19 @@
buildActionMask = 2147483647;
files = (
624493AE19CD0CBE00BCDDF4 /* HTMLToken.m in Sources */,
+ 62AE594119F9907C0043F069 /* HTMLTagToken.m in Sources */,
+ 62AE594619F992F30043F069 /* HTMLCommentToken.m in Sources */,
+ 62AE593C19F97E1C0043F069 /* HTMLDOCTYPEToken.m in Sources */,
62F873ED19E088C90062683C /* HTMLParser.m in Sources */,
625A150F19C78BE900AD0C32 /* HTMLInputStreamReaderErrors.m in Sources */,
6279F87619E1808D00F12EE5 /* HTMLElement.m in Sources */,
625A150A19C78ABA00AD0C32 /* HTMLInputStreamReader.m in Sources */,
624493A819CCC54100BCDDF4 /* HTMLTokenizer.m in Sources */,
625A14BE19C7829400AD0C32 /* HTMLKit.m in Sources */,
+ 62AE594B19F9948A0043F069 /* HTMLCharacterToken.m in Sources */,
62F31FDF19E9DCCF007F0657 /* HTMLTokenizerEntities.m in Sources */,
+ 62AE593719F97D880043F069 /* HTMLParseErrorToken.m in Sources */,
+ 62AE595019F9A17A0043F069 /* HTMLEOFToken.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -445,13 +499,19 @@
buildActionMask = 2147483647;
files = (
624493AD19CD0CBE00BCDDF4 /* HTMLToken.m in Sources */,
+ 62AE594019F9907C0043F069 /* HTMLTagToken.m in Sources */,
+ 62AE594519F992F30043F069 /* HTMLCommentToken.m in Sources */,
+ 62AE593B19F97E1C0043F069 /* HTMLDOCTYPEToken.m in Sources */,
62F873EC19E088C90062683C /* HTMLParser.m in Sources */,
625A150E19C78BE900AD0C32 /* HTMLInputStreamReaderErrors.m in Sources */,
6279F87519E1808D00F12EE5 /* HTMLElement.m in Sources */,
625A150919C78ABA00AD0C32 /* HTMLInputStreamReader.m in Sources */,
624493A719CCC54100BCDDF4 /* HTMLTokenizer.m in Sources */,
625A150219C783DE00AD0C32 /* HTMLKit.m in Sources */,
+ 62AE594A19F9948A0043F069 /* HTMLCharacterToken.m in Sources */,
62F31FDE19E9DCCF007F0657 /* HTMLTokenizerEntities.m in Sources */,
+ 62AE593619F97D880043F069 /* HTMLParseErrorToken.m in Sources */,
+ 62AE594F19F9A17A0043F069 /* HTMLEOFToken.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
diff --git a/HTMLKit/HTMLCharacterToken.h b/HTMLKit/HTMLCharacterToken.h
new file mode 100644
index 0000000..77da6ae
--- /dev/null
+++ b/HTMLKit/HTMLCharacterToken.h
@@ -0,0 +1,19 @@
+//
+// HTMLCharacterToken.h
+// HTMLKit
+//
+// Created by Iska on 23/10/14.
+// Copyright (c) 2014 BrainCookie. All rights reserved.
+//
+
+#import
+#import "HTMLToken.h"
+
+@interface HTMLCharacterToken : HTMLToken
+
+@property (nonatomic, copy) NSString *characters;
+
+- (instancetype)initWithCharacter:(UTF32Char)character;
+- (instancetype)initWithString:(NSString *)string;
+
+@end
\ No newline at end of file
diff --git a/HTMLKit/HTMLCharacterToken.m b/HTMLKit/HTMLCharacterToken.m
new file mode 100644
index 0000000..01c57f2
--- /dev/null
+++ b/HTMLKit/HTMLCharacterToken.m
@@ -0,0 +1,40 @@
+//
+// HTMLCharacterToken.m
+// HTMLKit
+//
+// Created by Iska on 23/10/14.
+// Copyright (c) 2014 BrainCookie. All rights reserved.
+//
+
+#import "HTMLCharacterToken.h"
+
+@interface HTMLCharacterToken ()
+{
+#warning Find a better solution. Single characters vs String of multiple characters
+ UTF32Char _character;
+ NSString *_characters;
+}
+@end
+
+@implementation HTMLCharacterToken
+
+- (instancetype)initWithCharacter:(UTF32Char)character
+{
+ self = [super init];
+ if (self) {
+ self.type = HTMLTokenTypeCharacter;
+ _character = character;
+ }
+ return self;
+}
+
+- (instancetype)initWithString:(NSString *)string
+{
+ self = [super init];
+ if (self) {
+ _characters = [string copy];
+ }
+ return self;
+}
+
+@end
diff --git a/HTMLKit/HTMLCommentToken.h b/HTMLKit/HTMLCommentToken.h
new file mode 100644
index 0000000..74f68b6
--- /dev/null
+++ b/HTMLKit/HTMLCommentToken.h
@@ -0,0 +1,20 @@
+//
+// HTMLCommentToken.h
+// HTMLKit
+//
+// Created by Iska on 23/10/14.
+// Copyright (c) 2014 BrainCookie. All rights reserved.
+//
+
+#import
+#import "HTMLToken.h"
+
+@interface HTMLCommentToken : HTMLToken
+
+@property (nonatomic, copy) NSString *data;
+
+- (instancetype)initWithData:(NSString *)data;
+
+- (void)appendStringToData:(NSString *)string;
+
+@end
\ No newline at end of file
diff --git a/HTMLKit/HTMLCommentToken.m b/HTMLKit/HTMLCommentToken.m
new file mode 100644
index 0000000..07ee0e0
--- /dev/null
+++ b/HTMLKit/HTMLCommentToken.m
@@ -0,0 +1,35 @@
+//
+// HTMLCommentToken.m
+// HTMLKit
+//
+// Created by Iska on 23/10/14.
+// Copyright (c) 2014 BrainCookie. All rights reserved.
+//
+
+#import "HTMLCommentToken.h"
+
+@interface HTMLCommentToken ()
+{
+ NSMutableString *_data;
+}
+@end
+
+@implementation HTMLCommentToken
+@synthesize data = _data;
+
+- (instancetype)initWithData:(NSString *)data
+{
+ self = [super init];
+ if (self) {
+ self.type = HTMLTokenTypeComment;
+ _data = [[NSMutableString alloc] initWithString:data];
+ }
+ return self;
+}
+
+- (void)appendStringToData:(NSString *)string
+{
+ [_data appendString:string];
+}
+
+@end
diff --git a/HTMLKit/HTMLDOCTYPEToken.h b/HTMLKit/HTMLDOCTYPEToken.h
new file mode 100644
index 0000000..ba20094
--- /dev/null
+++ b/HTMLKit/HTMLDOCTYPEToken.h
@@ -0,0 +1,23 @@
+//
+// HTMLDOCTYPEToken.h
+// HTMLKit
+//
+// Created by Iska on 23/10/14.
+// Copyright (c) 2014 BrainCookie. All rights reserved.
+//
+
+#import
+#import "HTMLToken.h"
+
+@interface HTMLDOCTYPEToken : HTMLToken
+
+@property (nonatomic, copy) NSString *name;
+@property (nonatomic, strong) NSMutableString *publicIdentifier;
+@property (nonatomic, strong) NSMutableString *systemIdentifier;
+@property (nonatomic, assign) BOOL forceQuirks;
+
+- (instancetype)initWithName:(NSString *)name;
+
+- (void)appendStringToName:(NSString *)string;
+
+@end
diff --git a/HTMLKit/HTMLDOCTYPEToken.m b/HTMLKit/HTMLDOCTYPEToken.m
new file mode 100644
index 0000000..139b297
--- /dev/null
+++ b/HTMLKit/HTMLDOCTYPEToken.m
@@ -0,0 +1,36 @@
+//
+// HTMLDOCTYPEToken.m
+// HTMLKit
+//
+// Created by Iska on 23/10/14.
+// Copyright (c) 2014 BrainCookie. All rights reserved.
+//
+
+#import "HTMLDOCTYPEToken.h"
+
+@interface HTMLDOCTYPEToken ()
+{
+ NSMutableString *_name;
+}
+
+@end
+
+@implementation HTMLDOCTYPEToken
+@synthesize name = _name;
+
+ - (instancetype)initWithName:(NSString *)name
+{
+ self = [super init];
+ if (self) {
+ self.type = HTMLTokenTypeDoctype;
+ _name = [[NSMutableString alloc] initWithString:name];
+ }
+ return self;
+}
+
+- (void)appendStringToName:(NSString *)string
+{
+ [_name appendString:string];
+}
+
+@end
diff --git a/HTMLKit/HTMLEOFToken.h b/HTMLKit/HTMLEOFToken.h
new file mode 100644
index 0000000..52be86a
--- /dev/null
+++ b/HTMLKit/HTMLEOFToken.h
@@ -0,0 +1,14 @@
+//
+// HTMLEOFToken.h
+// HTMLKit
+//
+// Created by Iska on 23/10/14.
+// Copyright (c) 2014 BrainCookie. All rights reserved.
+//
+
+#import
+#import "HTMLToken.h"
+
+@interface HTMLEOFToken : HTMLToken
+
+@end
diff --git a/HTMLKit/HTMLEOFToken.m b/HTMLKit/HTMLEOFToken.m
new file mode 100644
index 0000000..63fb0c1
--- /dev/null
+++ b/HTMLKit/HTMLEOFToken.m
@@ -0,0 +1,22 @@
+//
+// HTMLEOFToken.m
+// HTMLKit
+//
+// Created by Iska on 23/10/14.
+// Copyright (c) 2014 BrainCookie. All rights reserved.
+//
+
+#import "HTMLEOFToken.h"
+
+@implementation HTMLEOFToken
+
+- (instancetype)init
+{
+ self = [super init];
+ if (self) {
+ self.type = HTMLTokenTypeEOF;
+ }
+ return self;
+}
+
+@end
diff --git a/HTMLKit/HTMLParseErrorToken.h b/HTMLKit/HTMLParseErrorToken.h
new file mode 100644
index 0000000..5aac863
--- /dev/null
+++ b/HTMLKit/HTMLParseErrorToken.h
@@ -0,0 +1,18 @@
+//
+// HTMLParseErrorToken.h
+// HTMLKit
+//
+// Created by Iska on 23/10/14.
+// Copyright (c) 2014 BrainCookie. All rights reserved.
+//
+
+#import
+#import "HTMLToken.h"
+
+@interface HTMLParseErrorToken : HTMLToken
+
+@property (nonatomic, copy) NSString *reason;
+
+- (instancetype)initWithReasonMessage:(NSString *)reason;
+
+@end
diff --git a/HTMLKit/HTMLParseErrorToken.m b/HTMLKit/HTMLParseErrorToken.m
new file mode 100644
index 0000000..e670b76
--- /dev/null
+++ b/HTMLKit/HTMLParseErrorToken.m
@@ -0,0 +1,30 @@
+//
+// HTMLParseErrorToken.m
+// HTMLKit
+//
+// Created by Iska on 23/10/14.
+// Copyright (c) 2014 BrainCookie. All rights reserved.
+//
+
+#import "HTMLParseErrorToken.h"
+
+@interface HTMLParseErrorToken ()
+{
+ NSString *_reason;
+}
+@end
+
+@implementation HTMLParseErrorToken
+@synthesize reason = _reason;
+
+- (instancetype)initWithReasonMessage:(NSString *)reason
+{
+ self = [super init];
+ if (self) {
+ self.type = HTMLTokenTypeParseError;
+ _reason = [reason copy];
+ }
+ return self;
+}
+
+@end
diff --git a/HTMLKit/HTMLTagToken.h b/HTMLKit/HTMLTagToken.h
new file mode 100644
index 0000000..ee04aa2
--- /dev/null
+++ b/HTMLKit/HTMLTagToken.h
@@ -0,0 +1,31 @@
+//
+// HTMLTagToken.h
+// HTMLKit
+//
+// Created by Iska on 23/10/14.
+// Copyright (c) 2014 BrainCookie. All rights reserved.
+//
+
+#import
+#import "HTMLToken.h"
+
+@interface HTMLTagToken : HTMLToken
+
+@property (nonatomic, copy) NSString *tagName;
+#warning Implement Ordered Dictionary
+@property (nonatomic, strong) NSMutableDictionary *attributes;
+@property (nonatomic, assign, getter = isSelfClosing) BOOL selfClosing;
+
+- (instancetype)initWithTagName:(NSString *)tagName;
+
+- (void)appendStringToTagName:(NSString *)string;
+
+@end
+
+@interface HTMLStartTagToken : HTMLTagToken
+
+@end
+
+@interface HTMLEndTagToken : HTMLTagToken
+
+@end
diff --git a/HTMLKit/HTMLTagToken.m b/HTMLKit/HTMLTagToken.m
new file mode 100644
index 0000000..3b23e5b
--- /dev/null
+++ b/HTMLKit/HTMLTagToken.m
@@ -0,0 +1,64 @@
+//
+// HTMLTagToken.m
+// HTMLKit
+//
+// Created by Iska on 23/10/14.
+// Copyright (c) 2014 BrainCookie. All rights reserved.
+//
+
+#import "HTMLTagToken.h"
+
+@interface HTMLTagToken ()
+{
+ NSMutableString *_tagName;
+#warning Implement Ordered Dictionary
+ NSMutableDictionary *_attributes;
+}
+
+@end
+
+@implementation HTMLTagToken
+@synthesize tagName = _tagName;
+
+- (instancetype)initWithTagName:(NSString *)tagName
+{
+ self = [super init];
+ if (self) {
+ _tagName = [[NSMutableString alloc] initWithString:tagName];
+ }
+ return self;
+}
+
+- (void)appendStringToTagName:(NSString *)string
+{
+ [_tagName appendString:string];
+}
+
+@end
+
+
+@implementation HTMLStartTagToken
+
+- (instancetype)initWithTagName:(NSString *)tagName
+{
+ self = [super initWithTagName:tagName];
+ if (self) {
+ self.type = HTMLTokenTypeStartTag;
+ }
+ return self;
+}
+
+@end
+
+@implementation HTMLEndTagToken
+
+- (instancetype)initWithTagName:(NSString *)tagName
+{
+ self = [super initWithTagName:tagName];
+ if (self) {
+ self.type = HTMLTokenTypeEndTag;
+ }
+ return self;
+}
+
+@end
diff --git a/HTMLKit/HTMLToken.h b/HTMLKit/HTMLToken.h
index 2cb4d25..3c366f5 100644
--- a/HTMLKit/HTMLToken.h
+++ b/HTMLKit/HTMLToken.h
@@ -10,17 +10,18 @@
typedef NS_ENUM(NSUInteger, HTMLTokenType)
{
- HTMLTokenTypeDoctype,
- HTMLTokenTypeStartTag,
- HTMLTokenTypeEndTag,
- HTMLTokenTypeComment,
HTMLTokenTypeCharacter,
- HTMLTokenTypeEOF
+ HTMLTokenTypeComment,
+ HTMLTokenTypeDoctype,
+ HTMLTokenTypeEndTag,
+ HTMLTokenTypeEOF,
+ HTMLTokenTypeParseError,
+ HTMLTokenTypeStartTag
};
@interface HTMLToken : NSObject
-@property (nonatomic, readonly) HTMLTokenType type;
+@property (nonatomic, assign) HTMLTokenType type;
- (BOOL)isDoctypeToken;
- (BOOL)isStartTagToken;
@@ -28,110 +29,6 @@ typedef NS_ENUM(NSUInteger, HTMLTokenType)
- (BOOL)isCommentToken;
- (BOOL)isCharacterToken;
- (BOOL)isEOFToken;
-
-@end
-
-#pragma mark - HTMLParseErrorToken
-
-@interface HTMLParseErrorToken : HTMLToken
-
-- (instancetype)initWithReasonMessage:(NSString *)reason;
-
-@end
-
-#pragma mark - HTMLDOCTYPEToken
-/*
- ##################################
- # TokenDoctype
- ##################################
- */
-@interface HTMLDOCTYPEToken : HTMLToken
-
-@property (nonatomic, strong) NSMutableString *publicIdentifier;
-@property (nonatomic, strong) NSMutableString *systemIdentifier;
-@property (nonatomic, assign) BOOL forceQuirks;
-
-- (instancetype)initWithName:(NSString *)string;
-
-- (void)appendCharacterToName:(UTF32Char)character;
-
-@end
-
-#pragma mark - HTMLTagToken
-/*
- ##################################
- # TokenTag
- ##################################
- */
-@interface HTMLTagToken : HTMLToken
-
-@property (nonatomic, copy) NSString *tagName;
-@property (nonatomic, strong) id attributes;
-@property (nonatomic, assign, getter = isSelfClosing) BOOL selfClosing;
-
-- (instancetype)initWithTagName:(NSString *)tagName;
-
-- (void)appendCharacterToTagName:(UTF32Char)character;
-
-@end
-
-#pragma mark - HTMLStartTagToken
-/*
- ##################################
- # TokenStartTag
- ##################################
- */
-@interface HTMLStartTagToken : HTMLTagToken
-
-@end
-
-#pragma mark - HTMLEndTagToken
-/*
- ##################################
- # TokenEndtTag
- ##################################
- */
-@interface HTMLEndTagToken : HTMLTagToken
-
-@end
-
-#pragma mark - HTMLCommentToken
-/*
- ##################################
- # TokenComment
- ##################################
- */
-@interface HTMLCommentToken : HTMLToken
-
-- (instancetype)initWithData:(NSString *)data;
-
-- (void)appendCharacterToData:(UTF32Char)character;
-- (void)appendStringToData:(NSString *)string;
-
-@end
-
-#pragma mark - HTMLCharacterToken
-/*
- ##################################
- # TokenCharecter
- ##################################
- */
-@interface HTMLCharacterToken : HTMLToken
-
-- (instancetype)initWithCharacter:(UTF32Char)character;
-- (instancetype)initWithString:(NSString *)string;
-
-- (void)appendCharacter:(UTF32Char)character;
-- (void)appendString:(NSString *)string;
-
-@end
-
-#pragma mark - HTMLEOFToken
-/*
- ##################################
- # TokenEOF
- ##################################
- */
-@interface HTMLEOFToken : HTMLToken
+- (BOOL)isParseError;
@end
diff --git a/HTMLKit/HTMLToken.m b/HTMLKit/HTMLToken.m
index 021e6e2..878acfa 100644
--- a/HTMLKit/HTMLToken.m
+++ b/HTMLKit/HTMLToken.m
@@ -13,8 +13,6 @@
HTMLTokenType _type;
}
-@property (nonatomic, assign) HTMLTokenType type;
-
@end
@implementation HTMLToken
@@ -50,4 +48,9 @@
return _type == HTMLTokenTypeEOF;
}
+- (BOOL)isParseError
+{
+ return _type == HTMLTokenTypeParseError;
+}
+
@end
diff --git a/HTMLKit/HTMLTokenizer.m b/HTMLKit/HTMLTokenizer.m
index 56e5b39..b6ce87b 100644
--- a/HTMLKit/HTMLTokenizer.m
+++ b/HTMLKit/HTMLTokenizer.m
@@ -9,6 +9,12 @@
#import "HTMLTokenizer.h"
#import "HTMLParser.h"
#import "HTMLToken.h"
+#import "HTMLCharacterToken.h"
+#import "HTMLCommentToken.h"
+#import "HTMLDOCTYPEToken.h"
+#import "HTMLEOFToken.h"
+#import "HTMLParseErrorToken.h"
+#import "HTMLTagToken.h"
#import "HTMLTokenizerStates.h"
#import "HTMLTokenizerCharacters.h"
#import "HTMLTokenizerEntities.h"
@@ -148,12 +154,8 @@
- (void)emitCharacterTokenWithString:(NSString *)string
{
- HTMLToken *previousToken = [_tokens lastObject];
- if ([previousToken isCharacterToken]) {
- [(HTMLCharacterToken *)previousToken appendString:string];
- } else {
- [self emitToken:[[HTMLCharacterToken alloc] initWithString:string]];
- }
+ HTMLToken *token = [[HTMLCharacterToken alloc] initWithString:string];
+ [self emitToken:token];
}
- (void)emitParseError:(NSString *)format, ... NS_FORMAT_FUNCTION(1, 2)
@@ -524,18 +526,18 @@
[self emitCurrentTagToken];
break;
case LATIN_CAPITAL_LETTER_A ... LATIN_CAPITAL_LETTER_Z:
- [_currentTagToken appendCharacterToTagName:(character + 0x0020)];
+ [_currentTagToken appendStringToTagName:StringFromUTF32Char(character + 0x0020)];
break;
case NULL_CHAR:
[self emitParseError:@"0x0000 NULL character in Tag Name state"];
- [_currentTagToken appendCharacterToTagName:REPLACEMENT_CHAR];
+ [_currentTagToken appendStringToTagName:StringFromUniChar(REPLACEMENT_CHAR)];
break;
case EOF:
[self emitParseError:@"EOF reached in Tag Name state"];
[_inputStreamReader unconsumeCurrentInputCharacter];
break;
default:
- [_currentTagToken appendCharacterToTagName:character];
+ [_currentTagToken appendStringToTagName:StringFromUTF32Char(character)];
break;
}
}
@@ -605,11 +607,11 @@
}
break;
case LATIN_CAPITAL_LETTER_A ... LATIN_CAPITAL_LETTER_Z:
- [_currentTagToken appendCharacterToTagName:(character + 0x0020)];
+ [_currentTagToken appendStringToTagName:StringFromUniChar(character + 0x0020)];
[_temporaryBuffer appendString:StringFromUniChar(character)];
return;
case LATIN_SMALL_LETTER_A ... LATIN_SMALL_LETTER_Z:
- [_currentTagToken appendCharacterToTagName:character];
+ [_currentTagToken appendStringToTagName:StringFromUniChar(character)];
[_temporaryBuffer appendString:StringFromUniChar(character)];
return;
}
@@ -685,11 +687,11 @@
}
break;
case LATIN_CAPITAL_LETTER_A ... LATIN_CAPITAL_LETTER_Z:
- [_currentTagToken appendCharacterToTagName:(character + 0x0020)];
+ [_currentTagToken appendStringToTagName:StringFromUniChar(character + 0x0020)];
[_temporaryBuffer appendString:StringFromUniChar(character)];
return;
case LATIN_SMALL_LETTER_A ... LATIN_SMALL_LETTER_Z:
- [_currentTagToken appendCharacterToTagName:character];
+ [_currentTagToken appendStringToTagName:StringFromUniChar(character)];
[_temporaryBuffer appendString:StringFromUniChar(character)];
return;
}
@@ -769,11 +771,11 @@
}
break;
case LATIN_CAPITAL_LETTER_A ... LATIN_CAPITAL_LETTER_Z:
- [_currentTagToken appendCharacterToTagName:(character + 0x0020)];
+ [_currentTagToken appendStringToTagName:StringFromUniChar(character + 0x0020)];
[_temporaryBuffer appendString:StringFromUniChar(character)];
return;
case LATIN_SMALL_LETTER_A ... LATIN_SMALL_LETTER_Z:
- [_currentTagToken appendCharacterToTagName:character];
+ [_currentTagToken appendStringToTagName:StringFromUniChar(character)];
[_temporaryBuffer appendString:StringFromUniChar(character)];
return;
}
@@ -977,11 +979,11 @@
}
break;
case LATIN_CAPITAL_LETTER_A ... LATIN_CAPITAL_LETTER_Z:
- [_currentTagToken appendCharacterToTagName:(character + 0x0020)];
+ [_currentTagToken appendStringToTagName:StringFromUniChar(character + 0x0020)];
[_temporaryBuffer appendString:StringFromUniChar(character)];
return;
case LATIN_SMALL_LETTER_A ... LATIN_SMALL_LETTER_Z:
- [_currentTagToken appendCharacterToTagName:character];
+ [_currentTagToken appendStringToTagName:StringFromUniChar(character)];
[_temporaryBuffer appendString:StringFromUniChar(character)];
return;
}
@@ -1531,7 +1533,7 @@
break;
case NULL_CHAR:
[self emitParseError:@"0x0000 NULL character in Comment Start state"];
- [_currentCommentToken appendCharacterToData:REPLACEMENT_CHAR];
+ [_currentCommentToken appendStringToData:StringFromUniChar(REPLACEMENT_CHAR)];
[self switchToState:HTMLTokenizerStateComment];
break;
case GREATER_THAN_SIGN:
@@ -1546,7 +1548,7 @@
[_inputStreamReader unconsumeCurrentInputCharacter];
break;
default:
- [_currentCommentToken appendCharacterToData:character];
+ [_currentCommentToken appendStringToData:StringFromUTF32Char(character)];
[self switchToState:HTMLTokenizerStateComment];
break;
}
@@ -1561,8 +1563,8 @@
break;
case NULL_CHAR:
[self emitParseError:@"0x0000 NULL character in Comment Start Dash state"];
- [_currentCommentToken appendCharacterToData:HYPHEN_MINUS];
- [_currentCommentToken appendCharacterToData:REPLACEMENT_CHAR];
+ [_currentCommentToken appendStringToData:StringFromUniChar(HYPHEN_MINUS)];
+ [_currentCommentToken appendStringToData:StringFromUniChar(REPLACEMENT_CHAR)];
[self switchToState:HTMLTokenizerStateComment];
break;
case GREATER_THAN_SIGN:
@@ -1577,8 +1579,8 @@
[_inputStreamReader unconsumeCurrentInputCharacter];
break;
default:
- [_currentCommentToken appendCharacterToData:HYPHEN_MINUS];
- [_currentCommentToken appendCharacterToData:character];
+ [_currentCommentToken appendStringToData:StringFromUniChar(HYPHEN_MINUS)];
+ [_currentCommentToken appendStringToData:StringFromUTF32Char(character)];
[self switchToState:HTMLTokenizerStateComment];
break;
}
@@ -1593,7 +1595,7 @@
break;
case NULL_CHAR:
[self emitParseError:@"0x0000 NULL character in Comment state"];
- [_currentCommentToken appendCharacterToData:REPLACEMENT_CHAR];
+ [_currentCommentToken appendStringToData:StringFromUniChar(REPLACEMENT_CHAR)];
break;
case EOF:
[self emitParseError:@"EOF reached in Comment state"];
@@ -1602,7 +1604,7 @@
[_inputStreamReader unconsumeCurrentInputCharacter];
break;
default:
- [_currentCommentToken appendCharacterToData:character];
+ [_currentCommentToken appendStringToData:StringFromUTF32Char(character)];
break;
}
}
@@ -1626,8 +1628,8 @@
[_inputStreamReader unconsumeCurrentInputCharacter];
break;
default:
- [_currentCommentToken appendCharacterToData:HYPHEN_MINUS];
- [_currentCommentToken appendCharacterToData:character];
+ [_currentCommentToken appendStringToData:StringFromUniChar(HYPHEN_MINUS)];
+ [_currentCommentToken appendStringToData:StringFromUTF32Char(character)];
[self switchToState:HTMLTokenizerStateComment];
break;
}
@@ -1652,7 +1654,7 @@
break;
case HYPHEN_MINUS:
[self emitParseError:@"0x002D unexpected - in Comment End state"];
- [_currentCommentToken appendCharacterToData:HYPHEN_MINUS];
+ [_currentCommentToken appendStringToData:StringFromUniChar(HYPHEN_MINUS)];
break;
case EOF:
[self emitParseError:@"EOF reached in Comment End state"];
@@ -1663,7 +1665,7 @@
default:
[self emitParseError:@"%@ unexpected character in Comment End state", StringFromUTF32Char(character)];
[_currentCommentToken appendStringToData:@"--"];
- [_currentCommentToken appendCharacterToData:character];
+ [_currentCommentToken appendStringToData:StringFromUTF32Char(character)];
[self switchToState:HTMLTokenizerStateComment];
break;
}
@@ -1695,7 +1697,7 @@
default:
[self emitParseError:@"%@ unexpected character in Comment End state", StringFromUTF32Char(character)];
[_currentCommentToken appendStringToData:@"--!"];
- [_currentCommentToken appendCharacterToData:character];
+ [_currentCommentToken appendStringToData:StringFromUTF32Char(character)];
[self switchToState:HTMLTokenizerStateComment];
break;
}
@@ -1782,11 +1784,11 @@
[self emitToken:_currentDoctypeToken];
break;
case LATIN_CAPITAL_LETTER_A ... LATIN_CAPITAL_LETTER_Z:
- [_currentDoctypeToken appendCharacterToName:(character + 0x0020)];
+ [_currentDoctypeToken appendStringToName:StringFromUTF32Char(character + 0x0020)];
break;
case NULL_CHAR:
[self emitParseError:@"0x0000 NULL character in DOCTYPE Name state"];
- [_currentDoctypeToken appendCharacterToName:REPLACEMENT_CHAR];
+ [_currentDoctypeToken appendStringToName:StringFromUniChar(REPLACEMENT_CHAR)];
break;
case EOF:
[self emitParseError:@"EOF reached in DOCTYPE Name state"];
@@ -1796,7 +1798,7 @@
[_inputStreamReader unconsumeCurrentInputCharacter];
break;
default:
- [_currentDoctypeToken appendCharacterToName:character];
+ [_currentDoctypeToken appendStringToName:StringFromUTF32Char(character)];
break;
}
}