From 5d3ea61a04ec8b4fd61a9a0def1957a42f49a5b7 Mon Sep 17 00:00:00 2001 From: iska Date: Thu, 23 Oct 2014 23:52:43 +0200 Subject: [PATCH] Refactor HTML Tokens into separate files --- HTMLKit.xcodeproj/project.pbxproj | 60 +++++++++++++++ HTMLKit/HTMLCharacterToken.h | 19 +++++ HTMLKit/HTMLCharacterToken.m | 40 ++++++++++ HTMLKit/HTMLCommentToken.h | 20 +++++ HTMLKit/HTMLCommentToken.m | 35 +++++++++ HTMLKit/HTMLDOCTYPEToken.h | 23 ++++++ HTMLKit/HTMLDOCTYPEToken.m | 36 +++++++++ HTMLKit/HTMLEOFToken.h | 14 ++++ HTMLKit/HTMLEOFToken.m | 22 ++++++ HTMLKit/HTMLParseErrorToken.h | 18 +++++ HTMLKit/HTMLParseErrorToken.m | 30 ++++++++ HTMLKit/HTMLTagToken.h | 31 ++++++++ HTMLKit/HTMLTagToken.m | 64 ++++++++++++++++ HTMLKit/HTMLToken.h | 119 ++---------------------------- HTMLKit/HTMLToken.m | 7 +- HTMLKit/HTMLTokenizer.m | 68 ++++++++--------- 16 files changed, 460 insertions(+), 146 deletions(-) create mode 100644 HTMLKit/HTMLCharacterToken.h create mode 100644 HTMLKit/HTMLCharacterToken.m create mode 100644 HTMLKit/HTMLCommentToken.h create mode 100644 HTMLKit/HTMLCommentToken.m create mode 100644 HTMLKit/HTMLDOCTYPEToken.h create mode 100644 HTMLKit/HTMLDOCTYPEToken.m create mode 100644 HTMLKit/HTMLEOFToken.h create mode 100644 HTMLKit/HTMLEOFToken.m create mode 100644 HTMLKit/HTMLParseErrorToken.h create mode 100644 HTMLKit/HTMLParseErrorToken.m create mode 100644 HTMLKit/HTMLTagToken.h create mode 100644 HTMLKit/HTMLTagToken.m 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; } }