From 138257d306d2ea2b52a2f8e9e8e2755853ae3c39 Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Thu, 23 Jan 2014 10:53:24 +0800 Subject: [PATCH 01/52] Update CoreParse to latest version. --- vendor/CoreParse | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/CoreParse b/vendor/CoreParse index 034f0dc..a8d3021 160000 --- a/vendor/CoreParse +++ b/vendor/CoreParse @@ -1 +1 @@ -Subproject commit 034f0dc33c82aaf7a38b623d0e9552291268c71e +Subproject commit a8d302163c28e30021e8c716e1455701f62f4fa5 From e841c379474f2c9d1d5a67e0c6de877006c964cb Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Thu, 23 Jan 2014 11:02:23 +0800 Subject: [PATCH 02/52] Bump version - 1.1.0 --- CSSSelectorConverter.podspec | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/CSSSelectorConverter.podspec b/CSSSelectorConverter.podspec index 3df04d3..5592cde 100644 --- a/CSSSelectorConverter.podspec +++ b/CSSSelectorConverter.podspec @@ -1,25 +1,36 @@ Pod::Spec.new do |s| s.name = 'CSSSelectorConverter' - s.version = '1.0.0' + s.version = '1.1.0' s.license = 'MIT' s.summary = 'Objective-C/Cocoa String Tokenizer and Parser toolkit. Supports Grammars.' - s.homepage = 'https://github.com/siuying/CSSToXPathConverter' + s.homepage = 'https://github.com/siuying/CSSSelectorConverter' s.author = { 'Francis Chong' => 'francis@ignition.hk' } - s.source = { :git => 'https://github.com/siuying/CSSSelectorConverter.git', :tag => '1.0.0'} + s.source = { :git => 'https://github.com/siuying/CSSSelectorConverter.git', :tag => '1.0.0', :submodules => true} s.description = %{ A CSS Selector to XPath Selector for Objective-C. Support mostly used subset of CSS Selector Level 3. } - s.source_files = 'CSSSelectorConverter/CSS*.{m,h}' - s.prefix_header_contents = "#import \"CSSSelectorConverter.h\"" - s.ios.deployment_target = '6.0' s.osx.deployment_target = '10.8' - s.dependency 'ParseKit', '~> 0.7' s.dependency 'CocoaLumberjack', '>= 1.6.4' - s.library = 'icucore' s.requires_arc = true + + s.subspec 'Core' do |ss| + ss.source_files = 'CSSSelectorConverter/CSS*.{m,h}' + ss.prefix_header_contents = "#import \"CSSSelectorConverter.h\"" + end + + # Use the submodule version of CoreParse + # If you are using your own version of CoreParse + # only add 'CSSSelectorConverter/Core' + s.subspec 'CoreParse' do |ss| + ss.requires_arc = false + ss.source_files = 'vendor/CoreParse/CoreParse/**/*.{h,m}' + ss.osx.frameworks = 'Cocoa' + ss.ios.frameworks = 'Foundation' + ss.requires_arc = false + end end \ No newline at end of file From 6afd51e2e85db41c202df3e7617b248da88deb9d Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Thu, 23 Jan 2014 11:05:11 +0800 Subject: [PATCH 03/52] bump version --- CSSSelectorConverter.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CSSSelectorConverter.podspec b/CSSSelectorConverter.podspec index 5592cde..a6f4a6a 100644 --- a/CSSSelectorConverter.podspec +++ b/CSSSelectorConverter.podspec @@ -6,7 +6,7 @@ Pod::Spec.new do |s| s.homepage = 'https://github.com/siuying/CSSSelectorConverter' s.author = { 'Francis Chong' => 'francis@ignition.hk' } - s.source = { :git => 'https://github.com/siuying/CSSSelectorConverter.git', :tag => '1.0.0', :submodules => true} + s.source = { :git => 'https://github.com/siuying/CSSSelectorConverter.git', :tag => '1.1.0', :submodules => true} s.description = %{ A CSS Selector to XPath Selector for Objective-C. Support mostly used subset of CSS Selector Level 3. From c93ef98a62b29b44d9f187b5b7f3c2744f88f761 Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Thu, 23 Jan 2014 11:31:34 +0800 Subject: [PATCH 04/52] add docs --- CSSSelectorConverter.podspec | 1 + .../project.pbxproj | 2 - CSSSelectorConverter/CSSSelectorParser.h | 24 +++++- CSSSelectorConverter/CSSSelectorParser.m | 25 ++++-- .../CSSSelectorToXPathConverter.h | 16 +++- .../CSSSelectorToXPathConverter.m | 14 +-- CSSSelectorConverter/CSSSelectorTokeniser.h | 5 ++ CSSSelectorConverter/css_selector.grammar | 85 ------------------- .../CSSSelectorParserSpec.m | 2 +- .../CSSToXPathConverterSpec.m | 46 +++++----- 10 files changed, 96 insertions(+), 124 deletions(-) delete mode 100644 CSSSelectorConverter/css_selector.grammar diff --git a/CSSSelectorConverter.podspec b/CSSSelectorConverter.podspec index a6f4a6a..16da145 100644 --- a/CSSSelectorConverter.podspec +++ b/CSSSelectorConverter.podspec @@ -27,6 +27,7 @@ Pod::Spec.new do |s| # If you are using your own version of CoreParse # only add 'CSSSelectorConverter/Core' s.subspec 'CoreParse' do |ss| + ss.prefix_header_contents = "#import \"CoreParse.h\"" ss.requires_arc = false ss.source_files = 'vendor/CoreParse/CoreParse/**/*.{h,m}' ss.osx.frameworks = 'Cocoa' diff --git a/CSSSelectorConverter.xcodeproj/project.pbxproj b/CSSSelectorConverter.xcodeproj/project.pbxproj index 93bff64..b3b3884 100644 --- a/CSSSelectorConverter.xcodeproj/project.pbxproj +++ b/CSSSelectorConverter.xcodeproj/project.pbxproj @@ -176,7 +176,6 @@ 543F5AA6187C0A1D00F3CC22 /* CSSSelectors.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSSelectors.m; sourceTree = ""; }; 5454C0D3187D79AA005C034F /* CSSNthChild.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSNthChild.h; sourceTree = ""; }; 5454C0D4187D79AA005C034F /* CSSNthChild.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSNthChild.m; sourceTree = ""; }; - 547F4955187C021C0041264E /* css_selector.grammar */ = {isa = PBXFileReference; lastKnownFileType = text; path = css_selector.grammar; sourceTree = ""; }; 548A929F187D1CF70045D4CA /* CSSSelectorAttribute.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSSelectorAttribute.h; sourceTree = ""; }; 548A92A0187D1CF70045D4CA /* CSSSelectorAttribute.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSSelectorAttribute.m; sourceTree = ""; }; 54D62F25187D06150075A755 /* CSSSelectorGroup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSSelectorGroup.h; sourceTree = ""; }; @@ -282,7 +281,6 @@ 540AA352187BC5F60012AA44 /* Supporting Files */ = { isa = PBXGroup; children = ( - 547F4955187C021C0041264E /* css_selector.grammar */, 540AA353187BC5F60012AA44 /* CSSSelectorConverter-Info.plist */, 540AA354187BC5F60012AA44 /* InfoPlist.strings */, 540AA357187BC5F60012AA44 /* main.m */, diff --git a/CSSSelectorConverter/CSSSelectorParser.h b/CSSSelectorConverter/CSSSelectorParser.h index 779f7e9..213206f 100644 --- a/CSSSelectorConverter/CSSSelectorParser.h +++ b/CSSSelectorConverter/CSSSelectorParser.h @@ -2,12 +2,34 @@ #import "CSSSelectorGroup.h" extern NSString* const CSSSelectorParserException; +extern NSString* const CSSSelectorParserErrorDomain; +extern NSString* const CSSSelectorParserErrorInputStreamKey; +extern NSString* const CSSSelectorParserErrorAcceptableTokenKey; @class CSSSelectorGroup; +/** + * CSSSelectorParser parse a CSS Selector and return a CSSSelectorGroup. + * + * Use ``CSSSelectorXPathVisitor`` to convert the returned tree into a XPath. + * @see CSSSelectorParser + */ @interface CSSSelectorParser : NSObject -- (CSSSelectorGroup*)parse:(NSString *)css; +/** + Last error encountered by the parser. + */ +@property (nonatomic, strong) NSError* lastError; + +/** + * Parse a CSS Selector and return a CSSSelectorGroup object. + * + * + * @param css The css selector + * @param error If the parse failed and parser return nil, error is set to last known error. + * @return CSSSelectorGroup the parsed selector. Or nil if error occurred. + */ +- (CSSSelectorGroup*)parse:(NSString *)css error:(NSError**)error; @end diff --git a/CSSSelectorConverter/CSSSelectorParser.m b/CSSSelectorConverter/CSSSelectorParser.m index 0cc0814..1b5e860 100644 --- a/CSSSelectorConverter/CSSSelectorParser.m +++ b/CSSSelectorConverter/CSSSelectorParser.m @@ -9,6 +9,9 @@ static const int cssSelectorLogLevel = LOG_LEVEL_ERROR; NSString* const CSSSelectorParserException = @"CSSSelectorParserException"; +NSString* const CSSSelectorParserErrorDomain = @"CSSSelectorParserErrorDomain"; +NSString* const CSSSelectorParserErrorInputStreamKey = @"input stream"; +NSString* const CSSSelectorParserErrorAcceptableTokenKey = @"acceptable token"; enum { CSSSelectorParserRuleQuotedString = 1 @@ -32,10 +35,18 @@ - (id)init { return self; } -- (CSSSelectorGroup*)parse:(NSString *)css +- (CSSSelectorGroup*)parse:(NSString *)css error:(NSError*__autoreleasing*)error { CPTokenStream *tokenStream = [self.tokeniser tokenise:css]; - return [self.parser parse:tokenStream]; + CSSSelectorGroup* result = [self.parser parse:tokenStream]; + if (!result) { + if (error) { + *error = self.lastError; + } else { + DDLogError(@"CSSSelectorParser: parse error: %@", self.lastError); + } + } + return result; } #pragma mark - CPParserDelegate @@ -48,7 +59,8 @@ - (id)parser:(CPParser *)parser didProduceSyntaxTree:(CPSyntaxTree *)syntaxTree if ([children count] == 1 && [children[0] isQuotedToken]) { return [children[0] content]; } else { - [NSException raise:CSSSelectorParserException format:@"unexpected token: should be a quoted token, now: %@", syntaxTree]; + [NSException raise:CSSSelectorParserException + format:@"unexpected token: should be a quoted token, now: %@", syntaxTree]; } } break; @@ -61,9 +73,10 @@ - (id)parser:(CPParser *)parser didProduceSyntaxTree:(CPSyntaxTree *)syntaxTree - (CPRecoveryAction *)parser:(CPParser *)parser didEncounterErrorOnInput:(CPTokenStream *)inputStream expecting:(NSSet *)acceptableTokens { - DDLogError(@"Error parsing input: %@ tokens: %@", - [inputStream description], - [acceptableTokens description]); + NSError* error = [NSError errorWithDomain:CSSSelectorParserErrorDomain + code:1 + userInfo:@{CSSSelectorParserErrorInputStreamKey: inputStream, CSSSelectorParserErrorAcceptableTokenKey: acceptableTokens}]; + self.lastError = error; return [CPRecoveryAction recoveryActionStop]; } diff --git a/CSSSelectorConverter/CSSSelectorToXPathConverter.h b/CSSSelectorConverter/CSSSelectorToXPathConverter.h index 3194978..af47a29 100644 --- a/CSSSelectorConverter/CSSSelectorToXPathConverter.h +++ b/CSSSelectorConverter/CSSSelectorToXPathConverter.h @@ -9,6 +9,12 @@ #import #import "CSSSelectorParser.h" +/** + * Convert a CSS Selector to XPath. + * + * @see CSSSelectorParser + * @see CSSSelectorXPathVisitor + */ @interface CSSSelectorToXPathConverter : NSObject @property (nonatomic, strong) CSSSelectorParser* parser; @@ -17,6 +23,14 @@ -(id) initWithParser:(CSSSelectorParser*)parser; --(NSString*)xpathWithCSS:(NSString*)css ; +/** + * Parse a CSS Selector and return a XPath string. + * + * + * @param css The css selector + * @param error If the parse failed and parser return nil, error is set to last known error. + * @return XPath representation of the given CSS Selector. + */ +-(NSString*)xpathWithCSS:(NSString*)css error:(NSError*__autoreleasing*)error; @end diff --git a/CSSSelectorConverter/CSSSelectorToXPathConverter.m b/CSSSelectorConverter/CSSSelectorToXPathConverter.m index 15cc042..93e3392 100644 --- a/CSSSelectorConverter/CSSSelectorToXPathConverter.m +++ b/CSSSelectorConverter/CSSSelectorToXPathConverter.m @@ -26,11 +26,15 @@ -(id) init { return [self initWithParser:[[CSSSelectorParser alloc] init]]; } --(NSString*)xpathWithCSS:(NSString*)css { - CSSSelectorGroup* group = [self.parser parse:css]; - CSSSelectorXPathVisitor* visitor = [[CSSSelectorXPathVisitor alloc] init]; - [visitor visit:group]; - return [visitor xpathString]; +-(NSString*)xpathWithCSS:(NSString*)css error:(NSError*__autoreleasing*)error{ + CSSSelectorGroup* group = [self.parser parse:css error:error]; + if (group) { + CSSSelectorXPathVisitor* visitor = [[CSSSelectorXPathVisitor alloc] init]; + [visitor visit:group]; + return [visitor xpathString]; + } else { + return nil; + } } @end diff --git a/CSSSelectorConverter/CSSSelectorTokeniser.h b/CSSSelectorConverter/CSSSelectorTokeniser.h index 65c2558..ab4e809 100644 --- a/CSSSelectorConverter/CSSSelectorTokeniser.h +++ b/CSSSelectorConverter/CSSSelectorTokeniser.h @@ -8,6 +8,11 @@ #import "CPTokeniser.h" +/** + * Tokenize the CSS Selector for the CSSSelectorGrammar to consume. + * + * @see CSSSelectorGrammar + */ @interface CSSSelectorTokeniser : CPTokeniser @end diff --git a/CSSSelectorConverter/css_selector.grammar b/CSSSelectorConverter/css_selector.grammar deleted file mode 100644 index 4dff65b..0000000 --- a/CSSSelectorConverter/css_selector.grammar +++ /dev/null @@ -1,85 +0,0 @@ -/* -A CSS Selector to XPath Selector Grammar -*/ -@start -@before{ - PKTokenizer *t = self.tokenizer; - [t.symbolState add:@"~="]; - [t.symbolState add:@"|="]; - [t.symbolState add:@":"]; - [t.symbolState add:@"-"]; - [t.wordState setWordChars:NO from:'-' to:'-']; - [t.numberState setAllowsScientificNotation:NO]; - [t.numberState setAllowsTrailingDecimalSeparator:NO]; - -} = selectorsGroup; - -selectorsGroup = selector ( ','! selector )* { - PUSH_SELECTORS_GROUP(); -}; - -selector = simpleSelectorSequence ((combinator { - PUSH_COMBINATOR(); -} simpleSelectorSequence) | simpleSelectorSequence)* { - PUSH_SELECTORS(); -}; - -simpleSelectorSequence = (universalSelector | typeSelector)? (classSelector | idSelector | attributeSelector | pseudoSelector)* { - PUSH_SELECTOR_SEQUENCE(); -}; - -attributeSelector = '['! Word (Empty | ((equal | includes | dashmatch) QuotedString )) ']'! { - PUSH_ATTRIBUTE(); -}; - -/* disabled pseudo selector with params */ -pseudoSelector = ':'! ( /*(paramPseudoSelector) | */ pseudoSelectorName { - PUSH_PSEUDO_CLASS(); -}); - -paramPseudoSelector = paramPseudoSelectorName '('! paramPseudoSelectorParam ')'! { - PUSH_NTH_CHILD(); -}; - -paramPseudoSelectorParam = ( sign? Number? nthChildConstant (sign? Number)? ) | Number | even | odd ; - -dimension = Number Word; - -classSelector = '.'! Word { - PUSH_CSS_CLASS(POP_STR()); -}; - -idSelector = '#'! Word { - PUSH_CSS_ID(POP_STR()); -}; - -typeSelector = Word { - PUSH_CSS_TYPE(POP_STR()); -}; - -universalSelector = '*'! { - PUSH_CSS_UNIVERSAL(); -}; - -paramPseudoSelectorName = nthConstant minus last minus child | nthConstant minus last minus of minus type | nthConstant minus of minus type | nthConstant minus child; -pseudoSelectorName = first minus child | last minus child | first minus of minus type | last minus of minus type | - only minus child | only minus of minus type | empty; - -nthChildConstant = 'n'; -first = 'first'; -last = 'last'; -child = 'child'; -type = 'type'; -of = 'of'; -only = 'only'; -empty = 'empty'; -nthConstant = 'nth'; -odd = 'odd'; -even = 'even'; -combinator = '>' | '~' | plus; -sign = minus | plus; -plus = '+'; -minus = '-'; -equal = "="; -includes = "~="; -dashmatch = "|="; \ No newline at end of file diff --git a/CSSSelectorConverterTests/CSSSelectorParserSpec.m b/CSSSelectorConverterTests/CSSSelectorParserSpec.m index 35ecbb1..0366833 100644 --- a/CSSSelectorConverterTests/CSSSelectorParserSpec.m +++ b/CSSSelectorConverterTests/CSSSelectorParserSpec.m @@ -14,7 +14,7 @@ describe(@"CSSSelectorParser", ^{ it(@"parse css", ^{ CSSSelectorParser *parser = [[CSSSelectorParser alloc] init]; - CSSSelectorGroup* tree = [parser parse:@"table:first-child"]; + CSSSelectorGroup* tree = [parser parse:@"table:first-child" error:nil]; [[tree shouldNot] beNil]; NSLog(@"result = %@", tree); }); diff --git a/CSSSelectorConverterTests/CSSToXPathConverterSpec.m b/CSSSelectorConverterTests/CSSToXPathConverterSpec.m index dcbe4cf..2936743 100644 --- a/CSSSelectorConverterTests/CSSToXPathConverterSpec.m +++ b/CSSSelectorConverterTests/CSSToXPathConverterSpec.m @@ -29,94 +29,94 @@ }); it(@"should parse universal selector", ^{ - NSString* css = [converter xpathWithCSS:@"*"]; + NSString* css = [converter xpathWithCSS:@"*" error:nil]; [[css should] equal:@"//*"]; }); it(@"should parse type selector", ^{ - NSString* css = [converter xpathWithCSS:@"p"]; + NSString* css = [converter xpathWithCSS:@"p" error:nil]; [[css should] equal:@"//p"]; }); it(@"should parse id selector", ^{ - NSString* css = [converter xpathWithCSS:@"#header"]; + NSString* css = [converter xpathWithCSS:@"#header" error:nil]; [[css should] equal:@"//*[@id = 'header']"]; }); it(@"should parse class selector", ^{ - NSString* css = [converter xpathWithCSS:@".header"]; + NSString* css = [converter xpathWithCSS:@".header" error:nil]; [[css should] equal:@"//*[contains(concat(' ', normalize-space(@class), ' '), ' header ')]"]; }); it(@"should parse type with mixed class and id selector", ^{ - NSString* css = [converter xpathWithCSS:@"p#header.red"]; + NSString* css = [converter xpathWithCSS:@"p#header.red" error:nil]; [[css should] equal:@"//p[@id = 'header' and contains(concat(' ', normalize-space(@class), ' '), ' red ')]"]; }); it(@"should parse simple selector sequence", ^{ - NSString* css = [converter xpathWithCSS:@"div p"]; + NSString* css = [converter xpathWithCSS:@"div p" error:nil]; [[css should] equal:@"//div//p"]; - css = [converter xpathWithCSS:@"div *"]; + css = [converter xpathWithCSS:@"div *" error:nil]; [[css should] equal:@"//div//*"]; - css = [converter xpathWithCSS:@"div#main p"]; + css = [converter xpathWithCSS:@"div#main p" error:nil]; [[css should] equal:@"//div[@id = 'main']//p"]; }); it(@"should parse descendant selector sequence", ^{ - NSString* descendantCss = [converter xpathWithCSS:@"div#main p > a"]; + NSString* descendantCss = [converter xpathWithCSS:@"div#main p > a" error:nil]; [[descendantCss should] equal:@"//div[@id = 'main']//p/a"]; - descendantCss = [converter xpathWithCSS:@"div#main p > a p > div"]; + descendantCss = [converter xpathWithCSS:@"div#main p > a p > div" error:nil]; [[descendantCss shouldNot] beNil]; [[descendantCss should] equal:@"//div[@id = 'main']//p/a//p/div"]; }); it(@"should parse adjacent selector sequence", ^{ - NSString* adjacentCss = [converter xpathWithCSS:@"h1 ~ p"]; + NSString* adjacentCss = [converter xpathWithCSS:@"h1 ~ p" error:nil]; [[adjacentCss should] equal:@"//h1/following-sibling::p"]; }); it(@"should parse selector group", ^{ - NSString* css = [converter xpathWithCSS:@"div, p"]; + NSString* css = [converter xpathWithCSS:@"div, p" error:nil]; [[css should] equal:@"//div | //p"]; }); it(@"should parse attribute", ^{ - NSString* css = [converter xpathWithCSS:@"div[foo]"]; + NSString* css = [converter xpathWithCSS:@"div[foo]" error:nil]; [[css should] equal:@"//div[@foo]"]; - NSString* cssWithValue = [converter xpathWithCSS:@"div[width=\"100\"]"]; + NSString* cssWithValue = [converter xpathWithCSS:@"div[width=\"100\"]" error:nil]; [[cssWithValue should] equal:@"//div[@width = \"100\"]"]; - NSString* cssWithIncludesValue = [converter xpathWithCSS:@"div[class~=\"100\"]"]; + NSString* cssWithIncludesValue = [converter xpathWithCSS:@"div[class~=\"100\"]" error:nil]; [[cssWithIncludesValue should] equal:@"//div[contains(concat(\" \", @class, \" \"),concat(\" \", \"100\", \" \"))]"]; - NSString* cssWithDashValue = [converter xpathWithCSS:@"div[att|=\"val\"]"]; + NSString* cssWithDashValue = [converter xpathWithCSS:@"div[att|=\"val\"]" error:nil]; [[cssWithDashValue should] equal:@"//div[@att = \"val\" or starts-with(@att, concat(\"val\", '-'))]"]; }); it(@"should parse pseudo class", ^{ - NSString* firstChild = [converter xpathWithCSS:@"div > p:first-child"]; + NSString* firstChild = [converter xpathWithCSS:@"div > p:first-child" error:nil]; [[firstChild should] equal:@"//div/*[position() = 1 and self::p]"]; - NSString* lastChild = [converter xpathWithCSS:@"ol > li:last-child"]; + NSString* lastChild = [converter xpathWithCSS:@"ol > li:last-child" error:nil]; [[lastChild should] equal:@"//ol/*[position() = last() and self::li]"]; - NSString* firstOfType = [converter xpathWithCSS:@"dl dt:first-of-type"]; + NSString* firstOfType = [converter xpathWithCSS:@"dl dt:first-of-type" error:nil]; [[firstOfType should] equal:@"//dl//dt[position() = 1]"]; - NSString* lastOfType = [converter xpathWithCSS:@"tr > td:last-of-type"]; + NSString* lastOfType = [converter xpathWithCSS:@"tr > td:last-of-type" error:nil]; [[lastOfType should] equal:@"//tr/td[position() = last()]"]; - NSString* onlyChild = [converter xpathWithCSS:@"p:only-child"]; + NSString* onlyChild = [converter xpathWithCSS:@"p:only-child" error:nil]; [[onlyChild should] equal:@"//*[last() = 1 and self::p]"]; - NSString* onlyOfType = [converter xpathWithCSS:@"p:only-of-type"]; + NSString* onlyOfType = [converter xpathWithCSS:@"p:only-of-type" error:nil]; [[onlyOfType should] equal:@"//p[last() = 1]"]; - NSString* empty = [converter xpathWithCSS:@"div:empty"]; + NSString* empty = [converter xpathWithCSS:@"div:empty" error:nil]; [[empty should] equal:@"//div[not(node())]"]; }); From 3b1439656eed76088fb813484fb7358efaee66ec Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Thu, 23 Jan 2014 11:33:26 +0800 Subject: [PATCH 05/52] update README --- CHANGELOG | 8 ++++++++ README.md | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 CHANGELOG diff --git a/CHANGELOG b/CHANGELOG new file mode 100644 index 0000000..a72f2a4 --- /dev/null +++ b/CHANGELOG @@ -0,0 +1,8 @@ +## 1.1.0 + +- Use [CoreParse](https://github.com/beelsebob/CoreParse) instead of [ParseKit](https://github.com/itod/parsekit) as parser generator. +- Fix #1, properly handle selector sequence. + +## 1.0.0 + +- Initial version. \ No newline at end of file diff --git a/README.md b/README.md index d8c6273..56872d8 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ I build this converter so that I can use `.class` instead of `//*[contains(conca ```objective-c #import "CSSSelectorConverter.h" -CSSToXPathConverter* converter = [[CSSToXPathConverter alloc] init]; +CSSSelectorToXPathConverter* converter = [[CSSSelectorToXPathConverter alloc] init]; [converter xpathWithCSS:@"p" error:nil]; // => "//p" From e9402446f67efc0908ba2d54f1c1fc6684fd0342 Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Thu, 23 Jan 2014 11:51:55 +0800 Subject: [PATCH 06/52] Add NSCoding support to CSSSelectorParser --- CSSSelectorConverter/CSSSelectorParser.h | 2 +- CSSSelectorConverter/CSSSelectorParser.m | 30 +++++++++++++++++++++--- bin/ParserGenerator.m | 7 ++++++ 3 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 bin/ParserGenerator.m diff --git a/CSSSelectorConverter/CSSSelectorParser.h b/CSSSelectorConverter/CSSSelectorParser.h index 213206f..9bfda4c 100644 --- a/CSSSelectorConverter/CSSSelectorParser.h +++ b/CSSSelectorConverter/CSSSelectorParser.h @@ -14,7 +14,7 @@ extern NSString* const CSSSelectorParserErrorAcceptableTokenKey; * Use ``CSSSelectorXPathVisitor`` to convert the returned tree into a XPath. * @see CSSSelectorParser */ -@interface CSSSelectorParser : NSObject +@interface CSSSelectorParser : NSObject /** Last error encountered by the parser. diff --git a/CSSSelectorConverter/CSSSelectorParser.m b/CSSSelectorConverter/CSSSelectorParser.m index 1b5e860..02d1bb2 100644 --- a/CSSSelectorConverter/CSSSelectorParser.m +++ b/CSSSelectorConverter/CSSSelectorParser.m @@ -18,19 +18,19 @@ }; @interface CSSSelectorParser () -@property (nonatomic, strong) CSSSelectorGrammar* grammar; @property (nonatomic, strong) CSSSelectorTokeniser *tokeniser; @property (nonatomic, strong) CPParser* parser; @end +#define CSSSelectorParserParserKey @"p" + @implementation CSSSelectorParser - (id)init { self = [super init]; self.tokeniser = [[CSSSelectorTokeniser alloc] init]; self.tokeniser.delegate = self; - self.grammar = [[CSSSelectorGrammar alloc] init]; - self.parser = [CPLALR1Parser parserWithGrammar:self.grammar]; + self.parser = [CPLALR1Parser parserWithGrammar:[[CSSSelectorGrammar alloc] init]]; self.parser.delegate = self; return self; } @@ -49,6 +49,30 @@ - (CSSSelectorGroup*)parse:(NSString *)css error:(NSError*__autoreleasing*)error return result; } +#pragma mark - NSCoding + +- (id)initWithCoder:(NSCoder *)aDecoder +{ + self = [super init]; + + if (nil != self) + { + self.parser = [aDecoder decodeObjectForKey:CSSSelectorParserParserKey]; + self.parser.delegate = self; + + // CSSSelectorTokeniser is not nscoder compatible! + self.tokeniser = [[CSSSelectorTokeniser alloc] init]; + self.tokeniser.delegate = self; + } + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder +{ + [aCoder encodeObject:self.parser forKey:CSSSelectorParserParserKey]; +} + #pragma mark - CPParserDelegate - (id)parser:(CPParser *)parser didProduceSyntaxTree:(CPSyntaxTree *)syntaxTree diff --git a/bin/ParserGenerator.m b/bin/ParserGenerator.m new file mode 100644 index 0000000..5b08ebb --- /dev/null +++ b/bin/ParserGenerator.m @@ -0,0 +1,7 @@ +/* +podfile-start +platform :osx, '10.9' +pod 'CSSSelectorConverter', '1.1.0' +podfile-end +*/ + From c2bb7d43ade110da043a21ca4e7c60ac2b70f648 Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Thu, 23 Jan 2014 11:52:16 +0800 Subject: [PATCH 07/52] WIP: adding a script to generate the parser --- CSSSelectorConverter.xcodeproj/project.pbxproj | 10 ++++++++++ bin/ParserGenerator.m | 18 ++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/CSSSelectorConverter.xcodeproj/project.pbxproj b/CSSSelectorConverter.xcodeproj/project.pbxproj index b3b3884..9b22358 100644 --- a/CSSSelectorConverter.xcodeproj/project.pbxproj +++ b/CSSSelectorConverter.xcodeproj/project.pbxproj @@ -159,6 +159,7 @@ 5419722D188FB97E004240B4 /* CSSSelectorXPathVisitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSSelectorXPathVisitor.h; sourceTree = ""; }; 5419722E188FB97E004240B4 /* CSSSelectorXPathVisitor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSSelectorXPathVisitor.m; sourceTree = ""; }; 54197230188FBAF0004240B4 /* CSSSelectorXPathVisitorSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSSelectorXPathVisitorSpec.m; sourceTree = ""; }; + 5419723B1890C5B1004240B4 /* ParserGenerator.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ParserGenerator.m; sourceTree = ""; }; 541EC6FE187D34AB00F08D19 /* CSSSelectorAttributeOperator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSSelectorAttributeOperator.h; sourceTree = ""; }; 541EC6FF187D34AB00F08D19 /* CSSSelectorAttributeOperator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSSelectorAttributeOperator.m; sourceTree = ""; }; 541EC702187D43A300F08D19 /* CSSCombinator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSCombinator.h; sourceTree = ""; }; @@ -217,6 +218,7 @@ 540AA33F187BC5F60012AA44 = { isa = PBXGroup; children = ( + 5419723A1890C5B1004240B4 /* bin */, 540AA351187BC5F60012AA44 /* CSSSelectorConverter */, 540AA373187BC5F70012AA44 /* CSSSelectorConverterTests */, 540AA34A187BC5F60012AA44 /* Frameworks */, @@ -357,6 +359,14 @@ name = Products; sourceTree = ""; }; + 5419723A1890C5B1004240B4 /* bin */ = { + isa = PBXGroup; + children = ( + 5419723B1890C5B1004240B4 /* ParserGenerator.m */, + ); + path = bin; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ diff --git a/bin/ParserGenerator.m b/bin/ParserGenerator.m index 5b08ebb..1635552 100644 --- a/bin/ParserGenerator.m +++ b/bin/ParserGenerator.m @@ -5,3 +5,21 @@ podfile-end */ + +@import Foundation; +#import "CSSSelectorParser.h" + +int main(int argc, char *argv[]) { + @autoreleasepool { + if (argc >= 2) + { + CSSSelectorParser* parser = [[CSSSelectorParser alloc] init]; + [NSKeyedArchiver archiveRootObject:@{@"parser" : parser} + toFile:[[NSString stringWithCString:argv[1] encoding:NSASCIIStringEncoding] stringByExpandingTildeInPath]]; + } + else + { + NSLog(@"Usage: ParserGenerator "); + } + } +} From 1fc0eca7c8df3961074b404d5b5a71b7501bbcd2 Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Thu, 23 Jan 2014 12:06:20 +0800 Subject: [PATCH 08/52] Remove the pch include of CoreParse, replace with include in implementation directly adding parser generator. --- .../project.pbxproj | 4 - CSSSelectorConverter/CSSClassSelector.h | 1 + CSSSelectorConverter/CSSClassSelector.m | 1 + CSSSelectorConverter/CSSCombinator.h | 1 + CSSSelectorConverter/CSSCombinator.m | 2 + CSSSelectorConverter/CSSIDSelector.h | 1 + CSSSelectorConverter/CSSIDSelector.m | 1 + CSSSelectorConverter/CSSNthChild.h | 24 ----- CSSSelectorConverter/CSSNthChild.m | 100 ------------------ CSSSelectorConverter/CSSPseudoClass.h | 1 + CSSSelectorConverter/CSSPseudoClass.m | 2 +- CSSSelectorConverter/CSSSelectorAttribute.h | 1 + CSSSelectorConverter/CSSSelectorAttribute.m | 1 + .../CSSSelectorAttributeOperator.h | 1 + .../CSSSelectorAttributeOperator.m | 1 + .../CSSSelectorConverter-Prefix.pch | 1 - CSSSelectorConverter/CSSSelectorGroup.h | 1 + CSSSelectorConverter/CSSSelectorGroup.m | 2 + CSSSelectorConverter/CSSSelectorParser.h | 2 + CSSSelectorConverter/CSSSelectorParser.m | 2 +- CSSSelectorConverter/CSSSelectorSequence.h | 1 + CSSSelectorConverter/CSSSelectorSequence.m | 1 + CSSSelectorConverter/CSSSelectorTokeniser.m | 1 + CSSSelectorConverter/CSSSelectors.h | 1 + CSSSelectorConverter/CSSSelectors.m | 2 + CSSSelectorConverter/CSSTypeSelector.h | 1 + CSSSelectorConverter/CSSTypeSelector.m | 1 + CSSSelectorConverter/CSSUniversalSelector.h | 1 + CSSSelectorConverter/CSSUniversalSelector.m | 1 + bin/ParserGenerator.m | 4 +- 30 files changed, 30 insertions(+), 134 deletions(-) delete mode 100644 CSSSelectorConverter/CSSNthChild.h delete mode 100644 CSSSelectorConverter/CSSNthChild.m diff --git a/CSSSelectorConverter.xcodeproj/project.pbxproj b/CSSSelectorConverter.xcodeproj/project.pbxproj index 9b22358..16d363f 100644 --- a/CSSSelectorConverter.xcodeproj/project.pbxproj +++ b/CSSSelectorConverter.xcodeproj/project.pbxproj @@ -175,8 +175,6 @@ 5433BA62188D1629006C5F59 /* CSSSelectorParserSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSSelectorParserSpec.m; sourceTree = ""; }; 543F5AA5187C0A1D00F3CC22 /* CSSSelectors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSSelectors.h; sourceTree = ""; }; 543F5AA6187C0A1D00F3CC22 /* CSSSelectors.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSSelectors.m; sourceTree = ""; }; - 5454C0D3187D79AA005C034F /* CSSNthChild.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSNthChild.h; sourceTree = ""; }; - 5454C0D4187D79AA005C034F /* CSSNthChild.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSNthChild.m; sourceTree = ""; }; 548A929F187D1CF70045D4CA /* CSSSelectorAttribute.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSSelectorAttribute.h; sourceTree = ""; }; 548A92A0187D1CF70045D4CA /* CSSSelectorAttribute.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSSelectorAttribute.m; sourceTree = ""; }; 54D62F25187D06150075A755 /* CSSSelectorGroup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSSelectorGroup.h; sourceTree = ""; }; @@ -341,8 +339,6 @@ 541EC703187D43A300F08D19 /* CSSCombinator.m */, 541EC706187D589000F08D19 /* CSSPseudoClass.h */, 541EC707187D589000F08D19 /* CSSPseudoClass.m */, - 5454C0D3187D79AA005C034F /* CSSNthChild.h */, - 5454C0D4187D79AA005C034F /* CSSNthChild.m */, ); name = Selector; sourceTree = ""; diff --git a/CSSSelectorConverter/CSSClassSelector.h b/CSSSelectorConverter/CSSClassSelector.h index 585e4d9..b46d414 100644 --- a/CSSSelectorConverter/CSSClassSelector.h +++ b/CSSSelectorConverter/CSSClassSelector.h @@ -8,6 +8,7 @@ #import #import "CSSNamedSelector.h" +#import "CPParser.h" @interface CSSClassSelector : CSSNamedSelector diff --git a/CSSSelectorConverter/CSSClassSelector.m b/CSSSelectorConverter/CSSClassSelector.m index 26fdc89..88e0678 100644 --- a/CSSSelectorConverter/CSSClassSelector.m +++ b/CSSSelectorConverter/CSSClassSelector.m @@ -7,6 +7,7 @@ // #import "CSSClassSelector.h" +#import "CoreParse.h" @implementation CSSClassSelector diff --git a/CSSSelectorConverter/CSSCombinator.h b/CSSSelectorConverter/CSSCombinator.h index 475387d..80a0a46 100644 --- a/CSSSelectorConverter/CSSCombinator.h +++ b/CSSSelectorConverter/CSSCombinator.h @@ -7,6 +7,7 @@ // #import "CSSBaseSelector.h" +#import "CPParser.h" typedef NS_ENUM(NSInteger, CSSCombinatorType) { CSSCombinatorTypeNone = 0, diff --git a/CSSSelectorConverter/CSSCombinator.m b/CSSSelectorConverter/CSSCombinator.m index bca0484..5f6bec6 100644 --- a/CSSSelectorConverter/CSSCombinator.m +++ b/CSSSelectorConverter/CSSCombinator.m @@ -8,6 +8,8 @@ #import "CSSCombinator.h" #import "DDLog.h" +#import "CoreParse.h" + #undef LOG_LEVEL_DEF #define LOG_LEVEL_DEF cssSelectorLogLevel static const int cssSelectorLogLevel = LOG_LEVEL_WARN; diff --git a/CSSSelectorConverter/CSSIDSelector.h b/CSSSelectorConverter/CSSIDSelector.h index 8833b04..d63797f 100644 --- a/CSSSelectorConverter/CSSIDSelector.h +++ b/CSSSelectorConverter/CSSIDSelector.h @@ -8,6 +8,7 @@ #import #import "CSSNamedSelector.h" +#import "CPParser.h" @interface CSSIDSelector : CSSNamedSelector diff --git a/CSSSelectorConverter/CSSIDSelector.m b/CSSSelectorConverter/CSSIDSelector.m index 17c6460..33b75a9 100644 --- a/CSSSelectorConverter/CSSIDSelector.m +++ b/CSSSelectorConverter/CSSIDSelector.m @@ -7,6 +7,7 @@ // #import "CSSIDSelector.h" +#import "CoreParse.h" @implementation CSSIDSelector diff --git a/CSSSelectorConverter/CSSNthChild.h b/CSSSelectorConverter/CSSNthChild.h deleted file mode 100644 index 6617ba6..0000000 --- a/CSSSelectorConverter/CSSNthChild.h +++ /dev/null @@ -1,24 +0,0 @@ -// -// CSSNthChild.h -// CSSSelectorConverter -// -// Created by Chong Francis on 14年1月8日. -// Copyright (c) 2014年 Ignition Soft. All rights reserved. -// - -#import "CSSPseudoClass.h" - -/** - nth-child pseudo class. - - it support: nth-child(an+b), nth-child(a), nth-child(odd), nth-child(even) - */ -@interface CSSNthChild : CSSPseudoClass - -// nth-child: an + b -@property (nonatomic, assign) NSInteger constantA; - -// nth-child: an + b -@property (nonatomic, assign) NSInteger constantB; - -@end diff --git a/CSSSelectorConverter/CSSNthChild.m b/CSSSelectorConverter/CSSNthChild.m deleted file mode 100644 index c0e35d6..0000000 --- a/CSSSelectorConverter/CSSNthChild.m +++ /dev/null @@ -1,100 +0,0 @@ -// -// CSSNthChild.m -// CSSSelectorConverter -// -// Created by Chong Francis on 14年1月8日. -// Copyright (c) 2014年 Ignition Soft. All rights reserved. -// -#import "DDLog.h" -#undef LOG_LEVEL_DEF -#define LOG_LEVEL_DEF cssSelectorLogLevel -static const int cssSelectorLogLevel = LOG_LEVEL_WARN; - -#import "CSSNthChild.h" - -static const NSInteger CSSNthChildUnassigned = NSIntegerMax; - -@interface CSSNthChild() -@property (nonatomic, assign) BOOL nAssigned; -@end - -@implementation CSSNthChild - --(instancetype) init { - self = [super init]; - self.constantA = CSSNthChildUnassigned; - self.constantB = CSSNthChildUnassigned; - self.nAssigned = NO; - return self; -} - --(NSString*) description { - return [NSString stringWithFormat:@"", self.constantA, self.constantB]; -} - --(NSString*) toXPath { - NSString* parentName = self.parent ? self.parent.name : @"*"; - NSString* positionSign = self.constantA > 0 ? @">=" : @"<="; - if (self.constantB == 0) { - return [NSString stringWithFormat:@"%@[(position() mod %d) = 0]", parentName, self.constantA]; - } else { - if (self.constantB > 0) { - return [NSString stringWithFormat:@"%@[(position() %@ %d) and (((position()-%d) mod %d) = 0)]", parentName, positionSign, - self.constantB, self.constantB, self.constantA]; - } else { - return [NSString stringWithFormat:@"%@[(position() %@ %d) and (((position()-%d) mod %d) = 0)]", parentName, positionSign, - self.constantA + self.constantB, self.constantA + self.constantB, self.constantA]; - } - } -} - -+(void) pushPseudoClass:(PKAssembly*)assembly { - CSSNthChild* nthChild = [[CSSNthChild alloc] init]; - id token = nil; - while ((token = [assembly pop])) { - if ([token isKindOfClass:[PKToken class]]) { - PKToken* pkToken = token; - NSString* stringValue = [pkToken stringValue]; - if ([stringValue isEqualToString:@"nth"]) { - if (nthChild.constantA == CSSNthChildUnassigned) { - nthChild.constantA = nthChild.constantB; - nthChild.constantB = CSSNthChildUnassigned; - } - [assembly push:nthChild]; - DDLogVerbose(@"Pushed: %@", nthChild); - return; - } else if ([stringValue isEqualToString:@"-"] || [stringValue isEqualToString:@"+"] || [stringValue isEqualToString:@"child"]) { - // do nothing - - } else if ([stringValue isEqualToString:@"odd"]) { - nthChild.constantA = 2; - nthChild.constantB = 1; - - } else if ([stringValue isEqualToString:@"even"]) { - nthChild.constantA = 2; - nthChild.constantB = 0; - - } else if ([stringValue isEqualToString:@"even"]) { - nthChild.constantA = 2; - nthChild.constantB = 0; - - } else if ([stringValue isEqualToString:@"n"]) { - nthChild.nAssigned = YES; - - } else if ([token isNumber]) { - NSInteger intVal = [@([pkToken floatValue]) integerValue]; - if (nthChild.nAssigned) { - nthChild.constantA = intVal; - } else { - nthChild.constantB = intVal; - } - } - } else { - [assembly push:token]; - [assembly push:nthChild]; - return; - } - } -} - -@end diff --git a/CSSSelectorConverter/CSSPseudoClass.h b/CSSSelectorConverter/CSSPseudoClass.h index 06efff8..3f18a8a 100644 --- a/CSSSelectorConverter/CSSPseudoClass.h +++ b/CSSSelectorConverter/CSSPseudoClass.h @@ -7,6 +7,7 @@ // #import "CSSNamedSelector.h" +#import "CPParser.h" @interface CSSPseudoClass : CSSNamedSelector diff --git a/CSSSelectorConverter/CSSPseudoClass.m b/CSSSelectorConverter/CSSPseudoClass.m index 3244ab0..de0675d 100644 --- a/CSSSelectorConverter/CSSPseudoClass.m +++ b/CSSSelectorConverter/CSSPseudoClass.m @@ -11,7 +11,7 @@ static const int cssSelectorLogLevel = LOG_LEVEL_WARN; #import "CSSPseudoClass.h" -#import "CSSNthChild.h" +#import "CoreParse.h" @implementation CSSPseudoClass diff --git a/CSSSelectorConverter/CSSSelectorAttribute.h b/CSSSelectorConverter/CSSSelectorAttribute.h index 3a21458..2994344 100644 --- a/CSSSelectorConverter/CSSSelectorAttribute.h +++ b/CSSSelectorConverter/CSSSelectorAttribute.h @@ -8,6 +8,7 @@ #import "CSSBaseSelector.h" #import "CSSSelectorAttributeOperator.h" +#import "CPParser.h" @interface CSSSelectorAttribute : CSSBaseSelector diff --git a/CSSSelectorConverter/CSSSelectorAttribute.m b/CSSSelectorConverter/CSSSelectorAttribute.m index f091556..0311c7a 100644 --- a/CSSSelectorConverter/CSSSelectorAttribute.m +++ b/CSSSelectorConverter/CSSSelectorAttribute.m @@ -13,6 +13,7 @@ #undef LOG_LEVEL_DEF #define LOG_LEVEL_DEF cssSelectorLogLevel static const int cssSelectorLogLevel = LOG_LEVEL_VERBOSE; +#import "CoreParse.h" @implementation CSSSelectorAttribute diff --git a/CSSSelectorConverter/CSSSelectorAttributeOperator.h b/CSSSelectorConverter/CSSSelectorAttributeOperator.h index dbe87ce..1357af9 100644 --- a/CSSSelectorConverter/CSSSelectorAttributeOperator.h +++ b/CSSSelectorConverter/CSSSelectorAttributeOperator.h @@ -7,6 +7,7 @@ // #import "CSSNamedSelector.h" +#import "CPParser.h" typedef NS_ENUM(NSInteger, CSSSelectorAttributeOperatorType) { CSSSelectorAttributeOperatorTypeNone = 0, diff --git a/CSSSelectorConverter/CSSSelectorAttributeOperator.m b/CSSSelectorConverter/CSSSelectorAttributeOperator.m index c80f6dc..02ec5d2 100644 --- a/CSSSelectorConverter/CSSSelectorAttributeOperator.m +++ b/CSSSelectorConverter/CSSSelectorAttributeOperator.m @@ -9,6 +9,7 @@ #undef LOG_LEVEL_DEF #define LOG_LEVEL_DEF cssSelectorLogLevel static const int cssSelectorLogLevel = LOG_LEVEL_VERBOSE; +#import "CoreParse.h" #import "CSSSelectorAttributeOperator.h" diff --git a/CSSSelectorConverter/CSSSelectorConverter-Prefix.pch b/CSSSelectorConverter/CSSSelectorConverter-Prefix.pch index c3ced0f..4412bec 100644 --- a/CSSSelectorConverter/CSSSelectorConverter-Prefix.pch +++ b/CSSSelectorConverter/CSSSelectorConverter-Prefix.pch @@ -13,5 +13,4 @@ #ifdef __OBJC__ #import #import - #import "CoreParse.h" #endif \ No newline at end of file diff --git a/CSSSelectorConverter/CSSSelectorGroup.h b/CSSSelectorConverter/CSSSelectorGroup.h index 6a0dd11..24eb746 100644 --- a/CSSSelectorConverter/CSSSelectorGroup.h +++ b/CSSSelectorConverter/CSSSelectorGroup.h @@ -8,6 +8,7 @@ #import "CSSBaseSelector.h" #import "CSSSelectors.h" +#import "CPParser.h" @interface CSSSelectorGroup : CSSBaseSelector diff --git a/CSSSelectorConverter/CSSSelectorGroup.m b/CSSSelectorConverter/CSSSelectorGroup.m index 1b5fef9..a5073c3 100644 --- a/CSSSelectorConverter/CSSSelectorGroup.m +++ b/CSSSelectorConverter/CSSSelectorGroup.m @@ -7,6 +7,8 @@ // #import "CSSSelectorGroup.h" +#import "CoreParse.h" + #import "DDLog.h" #undef LOG_LEVEL_DEF #define LOG_LEVEL_DEF cssSelectorLogLevel diff --git a/CSSSelectorConverter/CSSSelectorParser.h b/CSSSelectorConverter/CSSSelectorParser.h index 9bfda4c..4036f7b 100644 --- a/CSSSelectorConverter/CSSSelectorParser.h +++ b/CSSSelectorConverter/CSSSelectorParser.h @@ -1,5 +1,7 @@ #import #import "CSSSelectorGroup.h" +#import "CPParser.h" +#import "CPTokeniser.h" extern NSString* const CSSSelectorParserException; extern NSString* const CSSSelectorParserErrorDomain; diff --git a/CSSSelectorConverter/CSSSelectorParser.m b/CSSSelectorConverter/CSSSelectorParser.m index 02d1bb2..b547fd8 100644 --- a/CSSSelectorConverter/CSSSelectorParser.m +++ b/CSSSelectorConverter/CSSSelectorParser.m @@ -1,7 +1,7 @@ #import "CSSSelectorParser.h" #import "CSSSelectorGrammar.h" #import "CSSSelectorTokeniser.h" - +#import "CoreParse.h" #import "DDLog.h" #undef LOG_LEVEL_DEF diff --git a/CSSSelectorConverter/CSSSelectorSequence.h b/CSSSelectorConverter/CSSSelectorSequence.h index 97cdc46..9d50dee 100644 --- a/CSSSelectorConverter/CSSSelectorSequence.h +++ b/CSSSelectorConverter/CSSSelectorSequence.h @@ -8,6 +8,7 @@ #import #import "CSSBaseSelector.h" +#import "CPParser.h" @class CSSCombinator; @class CSSPseudoClass; diff --git a/CSSSelectorConverter/CSSSelectorSequence.m b/CSSSelectorConverter/CSSSelectorSequence.m index 57016ad..f1de1b5 100644 --- a/CSSSelectorConverter/CSSSelectorSequence.m +++ b/CSSSelectorConverter/CSSSelectorSequence.m @@ -7,6 +7,7 @@ // #import "DDLog.h" +#import "CoreParse.h" #undef LOG_LEVEL_DEF #define LOG_LEVEL_DEF cssSelectorLogLevel diff --git a/CSSSelectorConverter/CSSSelectorTokeniser.m b/CSSSelectorConverter/CSSSelectorTokeniser.m index 4a7908e..dd09d99 100644 --- a/CSSSelectorConverter/CSSSelectorTokeniser.m +++ b/CSSSelectorConverter/CSSSelectorTokeniser.m @@ -12,6 +12,7 @@ #import "CPQuotedRecogniser.h" #import "CPKeywordRecogniser.h" #import "CPIdentifierRecogniser.h" +#import "CPRegexpRecogniser.h" @implementation CSSSelectorTokeniser diff --git a/CSSSelectorConverter/CSSSelectors.h b/CSSSelectorConverter/CSSSelectors.h index 76e451e..d4a830c 100644 --- a/CSSSelectorConverter/CSSSelectors.h +++ b/CSSSelectorConverter/CSSSelectors.h @@ -7,6 +7,7 @@ // #import "CSSBaseSelector.h" +#import "CPParser.h" @interface CSSSelectors : CSSBaseSelector diff --git a/CSSSelectorConverter/CSSSelectors.m b/CSSSelectorConverter/CSSSelectors.m index c7561d6..8e3fb5e 100644 --- a/CSSSelectorConverter/CSSSelectors.m +++ b/CSSSelectorConverter/CSSSelectors.m @@ -11,6 +11,8 @@ #define LOG_LEVEL_DEF cssSelectorLogLevel static const int cssSelectorLogLevel = LOG_LEVEL_VERBOSE; +#import "CoreParse.h" + #import "CSSSelectors.h" #import "CSSCombinator.h" #import "CSSSelectorSequence.h" diff --git a/CSSSelectorConverter/CSSTypeSelector.h b/CSSSelectorConverter/CSSTypeSelector.h index c94ba31..70bdcf9 100644 --- a/CSSSelectorConverter/CSSTypeSelector.h +++ b/CSSSelectorConverter/CSSTypeSelector.h @@ -8,6 +8,7 @@ #import #import "CSSNamedSelector.h" +#import "CPParser.h" @interface CSSTypeSelector : CSSNamedSelector diff --git a/CSSSelectorConverter/CSSTypeSelector.m b/CSSSelectorConverter/CSSTypeSelector.m index e909eee..be58058 100644 --- a/CSSSelectorConverter/CSSTypeSelector.m +++ b/CSSSelectorConverter/CSSTypeSelector.m @@ -7,6 +7,7 @@ // #import "CSSTypeSelector.h" +#import "CoreParse.h" @implementation CSSTypeSelector diff --git a/CSSSelectorConverter/CSSUniversalSelector.h b/CSSSelectorConverter/CSSUniversalSelector.h index b9fc710..5f6d3b0 100644 --- a/CSSSelectorConverter/CSSUniversalSelector.h +++ b/CSSSelectorConverter/CSSUniversalSelector.h @@ -8,6 +8,7 @@ #import #import "CSSTypeSelector.h" +#import "CPParser.h" @interface CSSUniversalSelector : CSSTypeSelector diff --git a/CSSSelectorConverter/CSSUniversalSelector.m b/CSSSelectorConverter/CSSUniversalSelector.m index a058ed4..b5ec721 100644 --- a/CSSSelectorConverter/CSSUniversalSelector.m +++ b/CSSSelectorConverter/CSSUniversalSelector.m @@ -7,6 +7,7 @@ // #import "CSSUniversalSelector.h" +#import "CoreParse.h" @implementation CSSUniversalSelector diff --git a/bin/ParserGenerator.m b/bin/ParserGenerator.m index 1635552..fa0d33e 100644 --- a/bin/ParserGenerator.m +++ b/bin/ParserGenerator.m @@ -1,11 +1,9 @@ /* podfile-start platform :osx, '10.9' -pod 'CSSSelectorConverter', '1.1.0' +pod 'CSSSelectorConverter', :local => '/Users/siuying/workspace/opensource/CSSSelectorConverter' podfile-end */ - - @import Foundation; #import "CSSSelectorParser.h" From 96dd4710f6a7eb13c7a1f92232336b18bedcccad Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Thu, 23 Jan 2014 12:12:20 +0800 Subject: [PATCH 09/52] remove Nth-Child --- CSSSelectorConverter/CSSSelectorConverter.h | 1 - 1 file changed, 1 deletion(-) diff --git a/CSSSelectorConverter/CSSSelectorConverter.h b/CSSSelectorConverter/CSSSelectorConverter.h index 9e13e4b..212159a 100644 --- a/CSSSelectorConverter/CSSSelectorConverter.h +++ b/CSSSelectorConverter/CSSSelectorConverter.h @@ -24,6 +24,5 @@ #import "CSSCombinator.h" #import "CSSNamedSelector.h" #import "CSSPseudoClass.h" -#import "CSSNthChild.h" #endif From a67c3e8848453a379a2e1ca7d44145e27a5daaae Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Thu, 23 Jan 2014 12:13:57 +0800 Subject: [PATCH 10/52] Remove files used to fix ParseKit --- .../CSSSelectorParser+FixWhitespace.h | 24 ------------------- .../CSSSelectorParser+FixWhitespace.m | 17 ------------- 2 files changed, 41 deletions(-) delete mode 100644 CSSSelectorConverter/CSSSelectorParser+FixWhitespace.h delete mode 100644 CSSSelectorConverter/CSSSelectorParser+FixWhitespace.m diff --git a/CSSSelectorConverter/CSSSelectorParser+FixWhitespace.h b/CSSSelectorConverter/CSSSelectorParser+FixWhitespace.h deleted file mode 100644 index 9340ba8..0000000 --- a/CSSSelectorConverter/CSSSelectorParser+FixWhitespace.h +++ /dev/null @@ -1,24 +0,0 @@ -// -// CSSSelectorParser+FixWhitespace.h -// CSSSelectorConverter -// -// Created by Francis Chong on 1/20/14. -// Copyright (c) 2014 Ignition Soft. All rights reserved. -// - -#import "CSSSelectorParser.h" - -/** - workaround for whitespace parsing (https://github.com/itod/parsekit/issues/29) - */ - - -enum { - TOKEN_KIND_BUILTIN_S = TOKEN_KIND_BUILTIN_WHITESPACE -}; - -@interface CSSSelectorParser (FixWhitespace) - -- (void) matchS:(BOOL)discard; - -@end diff --git a/CSSSelectorConverter/CSSSelectorParser+FixWhitespace.m b/CSSSelectorConverter/CSSSelectorParser+FixWhitespace.m deleted file mode 100644 index 3c6dba4..0000000 --- a/CSSSelectorConverter/CSSSelectorParser+FixWhitespace.m +++ /dev/null @@ -1,17 +0,0 @@ -// -// CSSSelectorParser+FixWhitespace.m -// CSSSelectorConverter -// -// Created by Francis Chong on 1/20/14. -// Copyright (c) 2014 Ignition Soft. All rights reserved. -// - -#import "CSSSelectorParser+FixWhitespace.h" - -@implementation CSSSelectorParser (FixWhitespace) - -- (void) matchS:(BOOL)discard { - [self matchWhitespace:discard]; -} - -@end From b302f2feeff3b16073f646d0b5a15007244a156e Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Thu, 23 Jan 2014 12:24:53 +0800 Subject: [PATCH 11/52] update podspec --- CSSSelectorConverter.podspec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CSSSelectorConverter.podspec b/CSSSelectorConverter.podspec index 16da145..62b7c9c 100644 --- a/CSSSelectorConverter.podspec +++ b/CSSSelectorConverter.podspec @@ -19,8 +19,11 @@ Pod::Spec.new do |s| s.requires_arc = true s.subspec 'Core' do |ss| - ss.source_files = 'CSSSelectorConverter/CSS*.{m,h}' + ss.source_files = 'CSSSelectorConverter/CSS*.{m,h}' ss.prefix_header_contents = "#import \"CSSSelectorConverter.h\"" + + # the grammar and the serialized parser + ss.resources = 'CSSSelectorConverter/*.{txt,par}' end # Use the submodule version of CoreParse From 1bd2bde8347ba33bc9141176a8e600fb14b13687 Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Thu, 23 Jan 2014 13:02:02 +0800 Subject: [PATCH 12/52] fixes spec by include headers of coreparse --- CSSSelectorConverterTests/CSSSelectorParserSpec.m | 1 + CSSSelectorConverterTests/CSSSelectorTokeniserSpec.m | 2 +- CSSSelectorConverterTests/CSSSelectorXPathVisitorSpec.m | 1 + CSSSelectorConverterTests/CSSToXPathConverterSpec.m | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CSSSelectorConverterTests/CSSSelectorParserSpec.m b/CSSSelectorConverterTests/CSSSelectorParserSpec.m index 0366833..fc82499 100644 --- a/CSSSelectorConverterTests/CSSSelectorParserSpec.m +++ b/CSSSelectorConverterTests/CSSSelectorParserSpec.m @@ -8,6 +8,7 @@ #import #import "CSSSelectorParser.h" +#import "CoreParse.h" SPEC_BEGIN(CSSSelectorParserSpec) diff --git a/CSSSelectorConverterTests/CSSSelectorTokeniserSpec.m b/CSSSelectorConverterTests/CSSSelectorTokeniserSpec.m index 0af7751..919b9b3 100644 --- a/CSSSelectorConverterTests/CSSSelectorTokeniserSpec.m +++ b/CSSSelectorConverterTests/CSSSelectorTokeniserSpec.m @@ -8,7 +8,7 @@ #import #import "CSSSelectorTokeniser.h" - +#import "CoreParse.h" SPEC_BEGIN(CSSSelectorTokeniserSpec) diff --git a/CSSSelectorConverterTests/CSSSelectorXPathVisitorSpec.m b/CSSSelectorConverterTests/CSSSelectorXPathVisitorSpec.m index c97c1cf..47b1840 100644 --- a/CSSSelectorConverterTests/CSSSelectorXPathVisitorSpec.m +++ b/CSSSelectorConverterTests/CSSSelectorXPathVisitorSpec.m @@ -18,6 +18,7 @@ #import "CSSCombinator.h" #import "CSSSelectorAttribute.h" #import "CSSSelectorAttributeOperator.h" +#import "CoreParse.h" SPEC_BEGIN(CSSSelectorXPathVisitorSpec) diff --git a/CSSSelectorConverterTests/CSSToXPathConverterSpec.m b/CSSSelectorConverterTests/CSSToXPathConverterSpec.m index 2936743..fa4ea32 100644 --- a/CSSSelectorConverterTests/CSSToXPathConverterSpec.m +++ b/CSSSelectorConverterTests/CSSToXPathConverterSpec.m @@ -10,6 +10,7 @@ #import "DDLog.h" #import "DDTTYLogger.h" #import "CSSSelectorConverter.h" +#import "CoreParse.h" SPEC_BEGIN(CSSToXPathConverterSpec) __block CSSSelectorToXPathConverter *converter; From e1d2fa33bf1cdc1f8c2c1ef42aca6230a2a911f4 Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Thu, 23 Jan 2014 13:11:46 +0800 Subject: [PATCH 13/52] Correct unit test setting (ref: http://stackoverflow.com/questions/5364074/iskindofclass-and-nsstringfromclass-disagree-about-uiapplicationdelegate) --- .../project.pbxproj | 56 ++++++------------- 1 file changed, 16 insertions(+), 40 deletions(-) diff --git a/CSSSelectorConverter.xcodeproj/project.pbxproj b/CSSSelectorConverter.xcodeproj/project.pbxproj index 16d363f..2f49a8a 100644 --- a/CSSSelectorConverter.xcodeproj/project.pbxproj +++ b/CSSSelectorConverter.xcodeproj/project.pbxproj @@ -27,45 +27,29 @@ 541971F2188ED36A004240B4 /* libCoreParse.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 541971ED188ED293004240B4 /* libCoreParse.a */; }; 5419722F188FB97E004240B4 /* CSSSelectorXPathVisitor.m in Sources */ = {isa = PBXBuildFile; fileRef = 5419722E188FB97E004240B4 /* CSSSelectorXPathVisitor.m */; }; 54197231188FBAF0004240B4 /* CSSSelectorXPathVisitorSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 54197230188FBAF0004240B4 /* CSSSelectorXPathVisitorSpec.m */; }; - 54197232188FBBA6004240B4 /* CSSSelectorXPathVisitor.m in Sources */ = {isa = PBXBuildFile; fileRef = 5419722E188FB97E004240B4 /* CSSSelectorXPathVisitor.m */; }; 5433BA57188D0C5B006C5F59 /* CSSSelectorTokeniser.m in Sources */ = {isa = PBXBuildFile; fileRef = 5433BA56188D0C5B006C5F59 /* CSSSelectorTokeniser.m */; }; - 5433BA58188D0C5B006C5F59 /* CSSSelectorTokeniser.m in Sources */ = {isa = PBXBuildFile; fileRef = 5433BA56188D0C5B006C5F59 /* CSSSelectorTokeniser.m */; }; 5433BA5B188D0D71006C5F59 /* CSSSelectorTokeniserSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5433BA59188D0D71006C5F59 /* CSSSelectorTokeniserSpec.m */; }; 5433BA5E188D136A006C5F59 /* CSSSelectorGrammar.m in Sources */ = {isa = PBXBuildFile; fileRef = 5433BA5D188D136A006C5F59 /* CSSSelectorGrammar.m */; }; - 5433BA5F188D136A006C5F59 /* CSSSelectorGrammar.m in Sources */ = {isa = PBXBuildFile; fileRef = 5433BA5D188D136A006C5F59 /* CSSSelectorGrammar.m */; }; 5433BA61188D1450006C5F59 /* CSSSelectorGrammar.txt in Resources */ = {isa = PBXBuildFile; fileRef = 5433BA60188D1450006C5F59 /* CSSSelectorGrammar.txt */; }; 5433BA63188D1629006C5F59 /* CSSSelectorParserSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5433BA62188D1629006C5F59 /* CSSSelectorParserSpec.m */; }; 5433BA64188D17CE006C5F59 /* CSSSelectorGrammar.txt in Resources */ = {isa = PBXBuildFile; fileRef = 5433BA60188D1450006C5F59 /* CSSSelectorGrammar.txt */; }; - 5433BA65188D1807006C5F59 /* CSSUniversalSelector.m in Sources */ = {isa = PBXBuildFile; fileRef = 540AA3A1187BEF380012AA44 /* CSSUniversalSelector.m */; }; 5433BA66188D1808006C5F59 /* CSSUniversalSelector.m in Sources */ = {isa = PBXBuildFile; fileRef = 540AA3A1187BEF380012AA44 /* CSSUniversalSelector.m */; }; - 5433BA6D188D1905006C5F59 /* CSSBaseSelector.m in Sources */ = {isa = PBXBuildFile; fileRef = 540AA3B5187BF2D60012AA44 /* CSSBaseSelector.m */; }; - 5433BA6E188D1907006C5F59 /* CSSNamedSelector.m in Sources */ = {isa = PBXBuildFile; fileRef = 540AA3B1187BF1660012AA44 /* CSSNamedSelector.m */; }; 5433BA6F188D1940006C5F59 /* CSSNamedSelector.m in Sources */ = {isa = PBXBuildFile; fileRef = 540AA3B1187BF1660012AA44 /* CSSNamedSelector.m */; }; 5433BA70188D1949006C5F59 /* CSSBaseSelector.m in Sources */ = {isa = PBXBuildFile; fileRef = 540AA3B5187BF2D60012AA44 /* CSSBaseSelector.m */; }; - 5433BA71188D1D9C006C5F59 /* CSSTypeSelector.m in Sources */ = {isa = PBXBuildFile; fileRef = 540AA3A5187BEF8B0012AA44 /* CSSTypeSelector.m */; }; 5433BA72188D1D9E006C5F59 /* CSSTypeSelector.m in Sources */ = {isa = PBXBuildFile; fileRef = 540AA3A5187BEF8B0012AA44 /* CSSTypeSelector.m */; }; 54BC925B188E736000443230 /* CSSSelectors.m in Sources */ = {isa = PBXBuildFile; fileRef = 543F5AA6187C0A1D00F3CC22 /* CSSSelectors.m */; }; - 54BC925C188E736000443230 /* CSSSelectors.m in Sources */ = {isa = PBXBuildFile; fileRef = 543F5AA6187C0A1D00F3CC22 /* CSSSelectors.m */; }; 54BC925D188E770A00443230 /* CSSSelectorGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = 54D62F26187D06150075A755 /* CSSSelectorGroup.m */; }; - 54BC925E188E770A00443230 /* CSSSelectorGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = 54D62F26187D06150075A755 /* CSSSelectorGroup.m */; }; 54D41BAA188E7A9D00D8521A /* CSSPseudoClass.m in Sources */ = {isa = PBXBuildFile; fileRef = 541EC707187D589000F08D19 /* CSSPseudoClass.m */; }; - 54D41BAB188E7A9D00D8521A /* CSSPseudoClass.m in Sources */ = {isa = PBXBuildFile; fileRef = 541EC707187D589000F08D19 /* CSSPseudoClass.m */; }; - 54FA2F70188D76A90065B628 /* CSSClassSelector.m in Sources */ = {isa = PBXBuildFile; fileRef = 540AA3AD187BF1510012AA44 /* CSSClassSelector.m */; }; + 54ECE0BB1890D6C200C2A4ED /* CSSSelectorParser.arc in Resources */ = {isa = PBXBuildFile; fileRef = 54ECE0BA1890D6C200C2A4ED /* CSSSelectorParser.arc */; }; + 54ECE0BC1890D6C200C2A4ED /* CSSSelectorParser.arc in Resources */ = {isa = PBXBuildFile; fileRef = 54ECE0BA1890D6C200C2A4ED /* CSSSelectorParser.arc */; }; 54FA2F71188D76AA0065B628 /* CSSClassSelector.m in Sources */ = {isa = PBXBuildFile; fileRef = 540AA3AD187BF1510012AA44 /* CSSClassSelector.m */; }; 54FA2F72188D7AEB0065B628 /* CSSSelectorParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 540AA39C187BEE660012AA44 /* CSSSelectorParser.m */; }; - 54FA2F73188D7AEB0065B628 /* CSSSelectorParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 540AA39C187BEE660012AA44 /* CSSSelectorParser.m */; }; 54FA2F74188D7C650065B628 /* CSSSelectorToXPathConverter.m in Sources */ = {isa = PBXBuildFile; fileRef = 540AA397187BE4900012AA44 /* CSSSelectorToXPathConverter.m */; }; - 54FA2F75188D7C660065B628 /* CSSSelectorToXPathConverter.m in Sources */ = {isa = PBXBuildFile; fileRef = 540AA397187BE4900012AA44 /* CSSSelectorToXPathConverter.m */; }; 54FA2F76188D7CDD0065B628 /* CSSToXPathConverterSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 540AA388187BDD5B0012AA44 /* CSSToXPathConverterSpec.m */; }; 54FA2F79188D826F0065B628 /* CSSIDSelector.m in Sources */ = {isa = PBXBuildFile; fileRef = 540AA3A9187BF1460012AA44 /* CSSIDSelector.m */; }; - 54FA2F7A188D826F0065B628 /* CSSIDSelector.m in Sources */ = {isa = PBXBuildFile; fileRef = 540AA3A9187BF1460012AA44 /* CSSIDSelector.m */; }; 54FA2F7D188D867F0065B628 /* CSSSelectorAttribute.m in Sources */ = {isa = PBXBuildFile; fileRef = 548A92A0187D1CF70045D4CA /* CSSSelectorAttribute.m */; }; - 54FA2F7E188D867F0065B628 /* CSSSelectorAttribute.m in Sources */ = {isa = PBXBuildFile; fileRef = 548A92A0187D1CF70045D4CA /* CSSSelectorAttribute.m */; }; - 54FA2F7F188D88B90065B628 /* CSSSelectorAttributeOperator.m in Sources */ = {isa = PBXBuildFile; fileRef = 541EC6FF187D34AB00F08D19 /* CSSSelectorAttributeOperator.m */; }; 54FA2F80188D88BA0065B628 /* CSSSelectorAttributeOperator.m in Sources */ = {isa = PBXBuildFile; fileRef = 541EC6FF187D34AB00F08D19 /* CSSSelectorAttributeOperator.m */; }; - 54FA2F81188D8E6C0065B628 /* CSSCombinator.m in Sources */ = {isa = PBXBuildFile; fileRef = 541EC703187D43A300F08D19 /* CSSCombinator.m */; }; 54FA2F82188D8E6C0065B628 /* CSSCombinator.m in Sources */ = {isa = PBXBuildFile; fileRef = 541EC703187D43A300F08D19 /* CSSCombinator.m */; }; - 54FA2F83188D8F610065B628 /* CSSSelectorSequence.m in Sources */ = {isa = PBXBuildFile; fileRef = 540AA3B9187BF3630012AA44 /* CSSSelectorSequence.m */; }; 54FA2F84188D8F610065B628 /* CSSSelectorSequence.m in Sources */ = {isa = PBXBuildFile; fileRef = 540AA3B9187BF3630012AA44 /* CSSSelectorSequence.m */; }; /* End PBXBuildFile section */ @@ -159,7 +143,6 @@ 5419722D188FB97E004240B4 /* CSSSelectorXPathVisitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSSelectorXPathVisitor.h; sourceTree = ""; }; 5419722E188FB97E004240B4 /* CSSSelectorXPathVisitor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSSelectorXPathVisitor.m; sourceTree = ""; }; 54197230188FBAF0004240B4 /* CSSSelectorXPathVisitorSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSSelectorXPathVisitorSpec.m; sourceTree = ""; }; - 5419723B1890C5B1004240B4 /* ParserGenerator.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ParserGenerator.m; sourceTree = ""; }; 541EC6FE187D34AB00F08D19 /* CSSSelectorAttributeOperator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSSelectorAttributeOperator.h; sourceTree = ""; }; 541EC6FF187D34AB00F08D19 /* CSSSelectorAttributeOperator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSSelectorAttributeOperator.m; sourceTree = ""; }; 541EC702187D43A300F08D19 /* CSSCombinator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSCombinator.h; sourceTree = ""; }; @@ -180,6 +163,9 @@ 54D62F25187D06150075A755 /* CSSSelectorGroup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSSelectorGroup.h; sourceTree = ""; }; 54D62F26187D06150075A755 /* CSSSelectorGroup.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSSelectorGroup.m; sourceTree = ""; }; 54D62F29187D0B0E0075A755 /* CSSSelectorConverter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CSSSelectorConverter.h; sourceTree = ""; }; + 54ECE09A1890D30000C2A4ED /* libPods.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libPods.a; path = "Pods/build/Debug-iphoneos/libPods.a"; sourceTree = ""; }; + 54ECE0B81890D5C700C2A4ED /* CSSSelectorParserGenerator.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CSSSelectorParserGenerator.m; sourceTree = ""; }; + 54ECE0BA1890D6C200C2A4ED /* CSSSelectorParser.arc */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; path = CSSSelectorParser.arc; sourceTree = ""; }; 645CC76B14924389A7C750E3 /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; }; C89C0A8F74244B1F8AECA338 /* libPods-CSSSelectorConverterTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-CSSSelectorConverterTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; CE2CA43EDD52451AA75BA409 /* Pods.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.xcconfig; path = Pods/Pods.xcconfig; sourceTree = ""; }; @@ -216,7 +202,7 @@ 540AA33F187BC5F60012AA44 = { isa = PBXGroup; children = ( - 5419723A1890C5B1004240B4 /* bin */, + 54ECE0B71890D5C700C2A4ED /* bin */, 540AA351187BC5F60012AA44 /* CSSSelectorConverter */, 540AA373187BC5F70012AA44 /* CSSSelectorConverterTests */, 540AA34A187BC5F60012AA44 /* Frameworks */, @@ -238,6 +224,7 @@ 540AA34A187BC5F60012AA44 /* Frameworks */ = { isa = PBXGroup; children = ( + 54ECE09A1890D30000C2A4ED /* libPods.a */, 541971DE188ED293004240B4 /* CoreParse.xcodeproj */, 540AA34B187BC5F60012AA44 /* Foundation.framework */, 540AA34D187BC5F60012AA44 /* CoreGraphics.framework */, @@ -281,6 +268,7 @@ 540AA352187BC5F60012AA44 /* Supporting Files */ = { isa = PBXGroup; children = ( + 54ECE0BA1890D6C200C2A4ED /* CSSSelectorParser.arc */, 540AA353187BC5F60012AA44 /* CSSSelectorConverter-Info.plist */, 540AA354187BC5F60012AA44 /* InfoPlist.strings */, 540AA357187BC5F60012AA44 /* main.m */, @@ -355,10 +343,10 @@ name = Products; sourceTree = ""; }; - 5419723A1890C5B1004240B4 /* bin */ = { + 54ECE0B71890D5C700C2A4ED /* bin */ = { isa = PBXGroup; children = ( - 5419723B1890C5B1004240B4 /* ParserGenerator.m */, + 54ECE0B81890D5C700C2A4ED /* CSSSelectorParserGenerator.m */, ); path = bin; sourceTree = ""; @@ -490,6 +478,7 @@ files = ( 540AA367187BC5F70012AA44 /* Images.xcassets in Resources */, 5433BA61188D1450006C5F59 /* CSSSelectorGrammar.txt in Resources */, + 54ECE0BB1890D6C200C2A4ED /* CSSSelectorParser.arc in Resources */, 540AA356187BC5F60012AA44 /* InfoPlist.strings in Resources */, 540AA35F187BC5F60012AA44 /* Main.storyboard in Resources */, ); @@ -499,6 +488,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 54ECE0BC1890D6C200C2A4ED /* CSSSelectorParser.arc in Resources */, 540AA378187BC5F70012AA44 /* InfoPlist.strings in Resources */, 5433BA64188D17CE006C5F59 /* CSSSelectorGrammar.txt in Resources */, ); @@ -603,28 +593,10 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 54BC925C188E736000443230 /* CSSSelectors.m in Sources */, - 54D41BAB188E7A9D00D8521A /* CSSPseudoClass.m in Sources */, 54FA2F76188D7CDD0065B628 /* CSSToXPathConverterSpec.m in Sources */, - 54FA2F73188D7AEB0065B628 /* CSSSelectorParser.m in Sources */, - 54FA2F75188D7C660065B628 /* CSSSelectorToXPathConverter.m in Sources */, - 54BC925E188E770A00443230 /* CSSSelectorGroup.m in Sources */, - 54FA2F7F188D88B90065B628 /* CSSSelectorAttributeOperator.m in Sources */, - 5433BA71188D1D9C006C5F59 /* CSSTypeSelector.m in Sources */, - 54FA2F81188D8E6C0065B628 /* CSSCombinator.m in Sources */, - 5433BA58188D0C5B006C5F59 /* CSSSelectorTokeniser.m in Sources */, - 54FA2F83188D8F610065B628 /* CSSSelectorSequence.m in Sources */, - 54197232188FBBA6004240B4 /* CSSSelectorXPathVisitor.m in Sources */, - 5433BA6D188D1905006C5F59 /* CSSBaseSelector.m in Sources */, - 54FA2F7E188D867F0065B628 /* CSSSelectorAttribute.m in Sources */, - 5433BA5F188D136A006C5F59 /* CSSSelectorGrammar.m in Sources */, - 54FA2F70188D76A90065B628 /* CSSClassSelector.m in Sources */, 54197231188FBAF0004240B4 /* CSSSelectorXPathVisitorSpec.m in Sources */, 5433BA5B188D0D71006C5F59 /* CSSSelectorTokeniserSpec.m in Sources */, - 5433BA6E188D1907006C5F59 /* CSSNamedSelector.m in Sources */, - 54FA2F7A188D826F0065B628 /* CSSIDSelector.m in Sources */, 5433BA63188D1629006C5F59 /* CSSSelectorParserSpec.m in Sources */, - 5433BA65188D1807006C5F59 /* CSSUniversalSelector.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -779,6 +751,7 @@ baseConfigurationReference = 120C8E845AC74187B385721E /* Pods-CSSSelectorConverterTests.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; + BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/CSSSelectorConverter.app/CSSSelectorConverter"; FRAMEWORK_SEARCH_PATHS = ( "$(SDKROOT)/Developer/Library/Frameworks", "$(inherited)", @@ -796,6 +769,7 @@ ); INFOPLIST_FILE = "CSSSelectorConverterTests/CSSSelectorConverterTests-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUNDLE_LOADER)"; WRAPPER_EXTENSION = xctest; }; name = Debug; @@ -805,6 +779,7 @@ baseConfigurationReference = 120C8E845AC74187B385721E /* Pods-CSSSelectorConverterTests.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; + BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/CSSSelectorConverter.app/CSSSelectorConverter"; FRAMEWORK_SEARCH_PATHS = ( "$(SDKROOT)/Developer/Library/Frameworks", "$(inherited)", @@ -818,6 +793,7 @@ ); INFOPLIST_FILE = "CSSSelectorConverterTests/CSSSelectorConverterTests-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUNDLE_LOADER)"; WRAPPER_EXTENSION = xctest; }; name = Release; From 35e173a88227b714292b42a8d8eba746fdcc97f8 Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Thu, 23 Jan 2014 15:41:49 +0800 Subject: [PATCH 14/52] WIP: Serialize the parser and use the serialized data to create new parser - add a script to serialize the parser (use objc-run) - prepare interface to support serialize parser --- CSSSelectorConverter.podspec | 2 +- .../project.pbxproj | 12 ++--- CSSSelectorConverter/CSSSelectorGrammar.h | 11 +++++ CSSSelectorConverter/CSSSelectorGrammar.m | 15 ++++-- CSSSelectorConverter/CSSSelectorGrammar.txt | 2 - CSSSelectorConverter/CSSSelectorParser.h | 6 ++- CSSSelectorConverter/CSSSelectorParser.m | 44 +++++++----------- CSSSelectorConverter/CSSSelectorParser.plist | Bin 0 -> 154538 bytes CSSSelectorConverter/CSSSelectorSequence.m | 2 +- .../CSSSelectorXPathVisitor.m | 11 +++-- .../CSSSelectorParserSpec.m | 23 +++++++++ Podfile | 2 + README.md | 13 ++++++ Rakefile | 0 bin/CSSSelectorParserGenerator.m | 32 +++++++++++++ bin/ParserGenerator.m | 23 --------- vendor/CoreParse | 2 +- 17 files changed, 132 insertions(+), 68 deletions(-) create mode 100644 CSSSelectorConverter/CSSSelectorParser.plist create mode 100644 Rakefile create mode 100644 bin/CSSSelectorParserGenerator.m delete mode 100644 bin/ParserGenerator.m diff --git a/CSSSelectorConverter.podspec b/CSSSelectorConverter.podspec index 62b7c9c..5052882 100644 --- a/CSSSelectorConverter.podspec +++ b/CSSSelectorConverter.podspec @@ -23,7 +23,7 @@ Pod::Spec.new do |s| ss.prefix_header_contents = "#import \"CSSSelectorConverter.h\"" # the grammar and the serialized parser - ss.resources = 'CSSSelectorConverter/*.{txt,par}' + ss.resources = 'CSSSelectorConverter/*.{txt,plist}' end # Use the submodule version of CoreParse diff --git a/CSSSelectorConverter.xcodeproj/project.pbxproj b/CSSSelectorConverter.xcodeproj/project.pbxproj index 2f49a8a..1b7c03d 100644 --- a/CSSSelectorConverter.xcodeproj/project.pbxproj +++ b/CSSSelectorConverter.xcodeproj/project.pbxproj @@ -40,8 +40,8 @@ 54BC925B188E736000443230 /* CSSSelectors.m in Sources */ = {isa = PBXBuildFile; fileRef = 543F5AA6187C0A1D00F3CC22 /* CSSSelectors.m */; }; 54BC925D188E770A00443230 /* CSSSelectorGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = 54D62F26187D06150075A755 /* CSSSelectorGroup.m */; }; 54D41BAA188E7A9D00D8521A /* CSSPseudoClass.m in Sources */ = {isa = PBXBuildFile; fileRef = 541EC707187D589000F08D19 /* CSSPseudoClass.m */; }; - 54ECE0BB1890D6C200C2A4ED /* CSSSelectorParser.arc in Resources */ = {isa = PBXBuildFile; fileRef = 54ECE0BA1890D6C200C2A4ED /* CSSSelectorParser.arc */; }; - 54ECE0BC1890D6C200C2A4ED /* CSSSelectorParser.arc in Resources */ = {isa = PBXBuildFile; fileRef = 54ECE0BA1890D6C200C2A4ED /* CSSSelectorParser.arc */; }; + 54ECE0CF1890F23500C2A4ED /* CSSSelectorParser.plist in Resources */ = {isa = PBXBuildFile; fileRef = 54ECE0CE1890F23500C2A4ED /* CSSSelectorParser.plist */; }; + 54ECE0D01890F23500C2A4ED /* CSSSelectorParser.plist in Resources */ = {isa = PBXBuildFile; fileRef = 54ECE0CE1890F23500C2A4ED /* CSSSelectorParser.plist */; }; 54FA2F71188D76AA0065B628 /* CSSClassSelector.m in Sources */ = {isa = PBXBuildFile; fileRef = 540AA3AD187BF1510012AA44 /* CSSClassSelector.m */; }; 54FA2F72188D7AEB0065B628 /* CSSSelectorParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 540AA39C187BEE660012AA44 /* CSSSelectorParser.m */; }; 54FA2F74188D7C650065B628 /* CSSSelectorToXPathConverter.m in Sources */ = {isa = PBXBuildFile; fileRef = 540AA397187BE4900012AA44 /* CSSSelectorToXPathConverter.m */; }; @@ -165,7 +165,7 @@ 54D62F29187D0B0E0075A755 /* CSSSelectorConverter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CSSSelectorConverter.h; sourceTree = ""; }; 54ECE09A1890D30000C2A4ED /* libPods.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libPods.a; path = "Pods/build/Debug-iphoneos/libPods.a"; sourceTree = ""; }; 54ECE0B81890D5C700C2A4ED /* CSSSelectorParserGenerator.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CSSSelectorParserGenerator.m; sourceTree = ""; }; - 54ECE0BA1890D6C200C2A4ED /* CSSSelectorParser.arc */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; path = CSSSelectorParser.arc; sourceTree = ""; }; + 54ECE0CE1890F23500C2A4ED /* CSSSelectorParser.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; path = CSSSelectorParser.plist; sourceTree = ""; }; 645CC76B14924389A7C750E3 /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; }; C89C0A8F74244B1F8AECA338 /* libPods-CSSSelectorConverterTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-CSSSelectorConverterTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; CE2CA43EDD52451AA75BA409 /* Pods.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.xcconfig; path = Pods/Pods.xcconfig; sourceTree = ""; }; @@ -268,7 +268,7 @@ 540AA352187BC5F60012AA44 /* Supporting Files */ = { isa = PBXGroup; children = ( - 54ECE0BA1890D6C200C2A4ED /* CSSSelectorParser.arc */, + 54ECE0CE1890F23500C2A4ED /* CSSSelectorParser.plist */, 540AA353187BC5F60012AA44 /* CSSSelectorConverter-Info.plist */, 540AA354187BC5F60012AA44 /* InfoPlist.strings */, 540AA357187BC5F60012AA44 /* main.m */, @@ -476,9 +476,9 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 54ECE0CF1890F23500C2A4ED /* CSSSelectorParser.plist in Resources */, 540AA367187BC5F70012AA44 /* Images.xcassets in Resources */, 5433BA61188D1450006C5F59 /* CSSSelectorGrammar.txt in Resources */, - 54ECE0BB1890D6C200C2A4ED /* CSSSelectorParser.arc in Resources */, 540AA356187BC5F60012AA44 /* InfoPlist.strings in Resources */, 540AA35F187BC5F60012AA44 /* Main.storyboard in Resources */, ); @@ -488,7 +488,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 54ECE0BC1890D6C200C2A4ED /* CSSSelectorParser.arc in Resources */, + 54ECE0D01890F23500C2A4ED /* CSSSelectorParser.plist in Resources */, 540AA378187BC5F70012AA44 /* InfoPlist.strings in Resources */, 5433BA64188D17CE006C5F59 /* CSSSelectorGrammar.txt in Resources */, ); diff --git a/CSSSelectorConverter/CSSSelectorGrammar.h b/CSSSelectorConverter/CSSSelectorGrammar.h index 44dbc10..503b287 100644 --- a/CSSSelectorConverter/CSSSelectorGrammar.h +++ b/CSSSelectorConverter/CSSSelectorGrammar.h @@ -10,4 +10,15 @@ @interface CSSSelectorGrammar : CPGrammar +/** + * Create a Grammar object using the grammar file in the bundle. + */ +-(instancetype) init; + +/** + * Create a Grammar object using the grammar file supplied. + * @param path Path to the grammar defintion + */ +-(instancetype) initWithPath:(NSString*)path; + @end diff --git a/CSSSelectorConverter/CSSSelectorGrammar.m b/CSSSelectorConverter/CSSSelectorGrammar.m index 1c01888..42c7373 100644 --- a/CSSSelectorConverter/CSSSelectorGrammar.m +++ b/CSSSelectorConverter/CSSSelectorGrammar.m @@ -14,11 +14,20 @@ @implementation CSSSelectorGrammar -(instancetype) init { - NSError* error; NSString* path = [[NSBundle bundleForClass:[self class]] pathForResource:@"CSSSelectorGrammar" ofType:@"txt"]; - NSString* grammar = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil]; + return [self initWithPath:path]; +} + +-(instancetype) initWithPath:(NSString*)path +{ + NSError* error; + NSString* grammar = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error]; if (!grammar) { - [NSException raise:NSInvalidArgumentException format:@"missing grammar file CSSSelectorGrammar.txt"]; + if (error) { + [NSException raise:NSInvalidArgumentException format:@"missing grammar file %@, error: %@", path, error]; + } else { + [NSException raise:NSInvalidArgumentException format:@"missing grammar file %@", path]; + } } self = [super initWithStart:@"CSSSelectorGroup" backusNaurForm:grammar error:&error]; if (!self) { diff --git a/CSSSelectorConverter/CSSSelectorGrammar.txt b/CSSSelectorConverter/CSSSelectorGrammar.txt index 40e6c6b..e076655 100644 --- a/CSSSelectorConverter/CSSSelectorGrammar.txt +++ b/CSSSelectorConverter/CSSSelectorGrammar.txt @@ -10,12 +10,10 @@ CSSIDSelector ::= '#' idName@'Identifier'; CSSTypeSelector ::= typeName@'Identifier'; CSSUniversalSelector ::= '*'; CSSPseudoExpression ::= (( '+' | '-' | 'Number' 'Identifier' | 'Number' | 'Identifier' ) 'Whitespace'* )+; - QuotedString ::= 'String'; Dashmatch ::= '|='; Includes ::= '~='; Equal ::= '='; - Comma ::= ','; Plus ::= '+'; Greater ::= '>'; diff --git a/CSSSelectorConverter/CSSSelectorParser.h b/CSSSelectorConverter/CSSSelectorParser.h index 4036f7b..a508dba 100644 --- a/CSSSelectorConverter/CSSSelectorParser.h +++ b/CSSSelectorConverter/CSSSelectorParser.h @@ -16,13 +16,17 @@ extern NSString* const CSSSelectorParserErrorAcceptableTokenKey; * Use ``CSSSelectorXPathVisitor`` to convert the returned tree into a XPath. * @see CSSSelectorParser */ -@interface CSSSelectorParser : NSObject +@interface CSSSelectorParser : NSObject /** Last error encountered by the parser. */ @property (nonatomic, strong) NSError* lastError; +-(instancetype) init; + +-(instancetype) initWithParser:(CPParser*)parser; + /** * Parse a CSS Selector and return a CSSSelectorGroup object. * diff --git a/CSSSelectorConverter/CSSSelectorParser.m b/CSSSelectorConverter/CSSSelectorParser.m index b547fd8..4d2260e 100644 --- a/CSSSelectorConverter/CSSSelectorParser.m +++ b/CSSSelectorConverter/CSSSelectorParser.m @@ -22,15 +22,29 @@ @interface CSSSelectorParser () @property (nonatomic, strong) CPParser* parser; @end -#define CSSSelectorParserParserKey @"p" - @implementation CSSSelectorParser - (id)init { +// NSString* path = [[NSBundle bundleForClass:[self class]] pathForResource:@"CSSSelectorParser" ofType:@"plist"]; +// if (!path) { +// [NSException raise:NSInternalInconsistencyException format:@"Cannot find parser file CSSSelectorParser.plist"]; +// } +// +// NSDictionary *pt = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; +// CPParser* parser = pt[@"parser"]; +// if (!parser) { +// [NSException raise:NSInternalInconsistencyException format:@"Cannot load parser from CSSSelectorParser.plist (%@)", path]; +// } + CPLALR1Parser* parser = [CPLALR1Parser parserWithGrammar:[[CSSSelectorGrammar alloc] initWithPath:[[NSBundle bundleForClass:[self class]] pathForResource:@"CSSSelectorGrammar" ofType:@"txt"]]]; + return [self initWithParser:parser]; +} + +-(instancetype) initWithParser:(CPParser*)parser +{ self = [super init]; self.tokeniser = [[CSSSelectorTokeniser alloc] init]; self.tokeniser.delegate = self; - self.parser = [CPLALR1Parser parserWithGrammar:[[CSSSelectorGrammar alloc] init]]; + self.parser = parser; self.parser.delegate = self; return self; } @@ -49,30 +63,6 @@ - (CSSSelectorGroup*)parse:(NSString *)css error:(NSError*__autoreleasing*)error return result; } -#pragma mark - NSCoding - -- (id)initWithCoder:(NSCoder *)aDecoder -{ - self = [super init]; - - if (nil != self) - { - self.parser = [aDecoder decodeObjectForKey:CSSSelectorParserParserKey]; - self.parser.delegate = self; - - // CSSSelectorTokeniser is not nscoder compatible! - self.tokeniser = [[CSSSelectorTokeniser alloc] init]; - self.tokeniser.delegate = self; - } - - return self; -} - -- (void)encodeWithCoder:(NSCoder *)aCoder -{ - [aCoder encodeObject:self.parser forKey:CSSSelectorParserParserKey]; -} - #pragma mark - CPParserDelegate - (id)parser:(CPParser *)parser didProduceSyntaxTree:(CPSyntaxTree *)syntaxTree diff --git a/CSSSelectorConverter/CSSSelectorParser.plist b/CSSSelectorConverter/CSSSelectorParser.plist new file mode 100644 index 0000000000000000000000000000000000000000..3041ede2870c455a446b912f0d287f61ffcb9961 GIT binary patch literal 154538 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%0A?eY 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Ⓢ%*F->=zf3=4tN(E9H7Sm-?JGT9I%^1 zoW>>w*x-N%f#ASg*xgIIug;8~8K6HE;_yHgFq%^A9^n#u)=skZoWp z2RVYA15e`YfoHiu8tyUh3Yoaiz?>z`X|*p%@X!Fvv~@ z>26RN%2AOjyvPDx;|&(G1e+YR9D5w}5v#DpL0_9!JzHPKWG=S z58991gXA7`oKwg=NajK5WN?ie$UEo`vJMWA9XSW*LB_!aDU5uB{RRfhGq^hSX-+%3 z(GMFQJf7)1&U4u2V4EDgf=~Gd8yviqf7yq(8GIfa9IX2xHaH|NHaJ9&Ln;%E4Gw8d zCwgHMLu_!!6lP@l$j;n-qgY06NZN>rr=wW*5^5_OQ+6!{Zlkv*|J zawp22*qxrpoG5eRAciuWQOKJ(0a+81n1P&$bC5A{F7uEt(QhD8p2TH*#20+WFKokx z6AyBVbZ%gq!)$U`L5foj8yr@j=Cs4x4C{vt4%7WG8yxmHHaJX=!`@~EHaP4Xeq<{) zG0X;s9pgMUIP7*HI6ND9DT)max544jIB)oJd~5hhY;5>yK4T4EvKD6yUx#eNH?WaS z$T|EsoIU&x{$e}sF+7<)xX)<(&Tx(kq;ZK1+gOlD(~Bc8+_M?A|5*y4y+Sjd~a#XG#q`+SHFM(AL~=g2?eYh)ks zJ#vqbd&Fk8AoB>BNBqN1cC#0GM;t=d5hpl}oFgtGT5yvQ5qZIm||?OUV0$>LwZ zQUPa=u0nNc;vS>x(g61vt%uRgXhADl6GwYG(1|W|qX+Iix)1#rfDEH`H#(8wj6{#4 z$FrRs>>`Ez9OMYcImKBnkWL2IxWP^Ca6b?n6CgV}7^8zR`H+81VPqdu9J$BHJ*FHL zk$H^FV`@={`ZPq|G0l;6jQ1bY4mroz!5A6GBw!C?(dB#j)7Edvs*ICL+*07$R z`IBT0aFR5xb1x7ao09@W;BCfMqaL~++m^2MMUP|0F%7@9vCr}fZ($Q-{f5SV%|^EH z4|_SvIc#vO4UP-qym3?Ut#LE4v2k;FoF|#fGdN@1^T;;tB^K}+a*kVsv&SuA8Smj9 z<38kL+-KZp=waNKtmPZl@jXBABb)ezUvckof3S_ekzt&jjMLq?-K4OegMr}qrnDfI zINH+@n;hRAdmP_~{@CL9p$umfW0}BYl9+)G#_M4G6UaY)9#iqxVZ zwmHEjCnPYCk=WpbSvBA*x&@+Pq4uWKVyRv^f=)FC$Yf^*SQx6PRxl-Otis? zWvPY@PHaY7y3!XLoM?j+r{TPb$MLO+XRxt}7fI(bSGa~VCT1bq#M|8EK_ECu&PmyE z_M}{dk`MQoREVOu&!iIQVNxVzC`Sb(+S8HG z`I4_$$MD|3$u*F1a$OoA-(Nl+8do~7w zNhOJ-EET9sHEc2|8hcENp)t0Y)RNY;C7w=nr3byxL6Q!V1|xsc2xLzhhuleWCrx7} zGAGHL^dwL7EH5B$(ksZC^d@g1XVSaKnDikZBVUr=K$1L3oA`sBq;i6b*l^O_KyX?P z@)M42PP55rb!kc*HaM*hLm7*=nKlO-oTmF}HaKlLHaJa>(|+JLY;al%M>va3OtZo1 z0rFsj(@Rm2S~SE4r`zE41e`a0Grl$bcWi9>-~7W4lG%+jrtd?x=?6K?G31|}=SW|X4>m8r(d zyvpk=;%$~_PS!2atP)+%ryc z2AOBbJmWG~xz2ycJL4X*&df$m&&WfW8eXxmHHaIJZ zIoRN=1uSMctFXaYHaP1ywsV>bf#4%SLMcu;qG?Ar`Z1U(%;3?$|NSe6|Kqd&{ne!H O|NGzn|M%b{kNqEScWV*= literal 0 HcmV?d00001 diff --git a/CSSSelectorConverter/CSSSelectorSequence.m b/CSSSelectorConverter/CSSSelectorSequence.m index f1de1b5..3957468 100644 --- a/CSSSelectorConverter/CSSSelectorSequence.m +++ b/CSSSelectorConverter/CSSSelectorSequence.m @@ -50,7 +50,7 @@ - (id)initWithSyntaxTree:(CPSyntaxTree *)syntaxTree { [self addSelector:selector]; }]; } else { - [NSException raise:NSInvalidArgumentException format:@"expected NSArray, receive: %@", selectors]; + [NSException raise:NSInvalidArgumentException format:@"expected NSArray, receive: %@", syntaxTree]; } } return self; diff --git a/CSSSelectorConverter/CSSSelectorXPathVisitor.m b/CSSSelectorConverter/CSSSelectorXPathVisitor.m index db4645c..759286a 100644 --- a/CSSSelectorConverter/CSSSelectorXPathVisitor.m +++ b/CSSSelectorConverter/CSSSelectorXPathVisitor.m @@ -8,15 +8,20 @@ #import "CSSSelectorXPathVisitor.h" -#import "CSSSelectorGroup.h" #import "CSSUniversalSelector.h" +#import "CSSNamedSelector.h" +#import "CSSTypeSelector.h" #import "CSSIDSelector.h" #import "CSSClassSelector.h" #import "CSSSelectorSequence.h" -#import "CSSPseudoClass.h" -#import "CSSCombinator.h" #import "CSSSelectors.h" +#import "CSSSelectorGroup.h" +#import "CSSSelectorParser.h" #import "CSSSelectorAttribute.h" +#import "CSSNamedSelector.h" +#import "CSSCombinator.h" +#import "CSSNamedSelector.h" +#import "CSSPseudoClass.h" @interface CSSSelectorXPathVisitor() @property (nonatomic, strong) NSMutableString* output; diff --git a/CSSSelectorConverterTests/CSSSelectorParserSpec.m b/CSSSelectorConverterTests/CSSSelectorParserSpec.m index fc82499..3d709ca 100644 --- a/CSSSelectorConverterTests/CSSSelectorParserSpec.m +++ b/CSSSelectorConverterTests/CSSSelectorParserSpec.m @@ -9,6 +9,8 @@ #import #import "CSSSelectorParser.h" #import "CoreParse.h" +#import "CSSSelectorGrammar.h" +#import "CSSSelectorTokeniser.h" SPEC_BEGIN(CSSSelectorParserSpec) @@ -19,6 +21,27 @@ [[tree shouldNot] beNil]; NSLog(@"result = %@", tree); }); + +// context(@"serialization", ^{ +// it(@"should serialize and deserialize a parser", ^{ +// NSString* path = [[NSBundle bundleForClass:[CSSSelectorGrammar class]] pathForResource:@"CSSSelectorGrammar" ofType:@"txt"]; +// CPGrammar* grammar1 = [[CPGrammar alloc] initWithStart:@"CSSSelectorGroup" backusNaurForm:[[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil] error:nil]; +// +// NSString* outputFile = [NSTemporaryDirectory() stringByAppendingPathComponent:@"grammar.plist"]; +// [NSKeyedArchiver archiveRootObject:@{@"grammar" : grammar1} +// toFile:outputFile]; +// +// CPGrammar* grammar2 = [NSKeyedUnarchiver unarchiveObjectWithFile:outputFile][@"grammar"]; +// [[grammar2 should] equal:grammar1]; +// [[[grammar2 allRules] should] equal:[grammar1 allRules]]; +// +// CSSSelectorTokeniser* tokeniser = [[CSSSelectorTokeniser alloc] init]; +// CPTokenStream *tokenStream = [tokeniser tokenise:@"table"]; +// CPParser* parser = [CPLALR1Parser parserWithGrammar:grammar2]; +// id result = [parser parse:tokenStream]; +// NSLog(@"result = %@", result); +// }); +// }); }); SPEC_END diff --git a/Podfile b/Podfile index 7574807..9f15780 100644 --- a/Podfile +++ b/Podfile @@ -2,6 +2,8 @@ platform :ios, '7.0' pod 'CocoaLumberjack' +link_with :CSSSelectorParserSerializer + target :'CSSSelectorConverterTests' do pod 'Kiwi/XCTest' end \ No newline at end of file diff --git a/README.md b/README.md index 56872d8..fcf38be 100644 --- a/README.md +++ b/README.md @@ -62,6 +62,19 @@ Following pseduo classes will not be supported: - :lang - :root +## Development + +### Building the project + +1. Install cocoapods +2. Install pods: ``pod install`` +3. Get submodule (CoreParse): ``git submodule update --init`` + +### Serialize the parser + +1. Install objc-run ``brew install objc-run`` +2. Run the generator: ``objc-run ./bin/ParserGenerator.m CSSSelectorConverter/CSSSelectorParser.par`` + ## License MIT License. See License.txt. \ No newline at end of file diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..e69de29 diff --git a/bin/CSSSelectorParserGenerator.m b/bin/CSSSelectorParserGenerator.m new file mode 100644 index 0000000..22b0ee2 --- /dev/null +++ b/bin/CSSSelectorParserGenerator.m @@ -0,0 +1,32 @@ +/* + podfile-start + platform :osx, '10.9' + pod 'CSSSelectorConverter', :local => '/Users/siuying/workspace/opensource/CSSSelectorConverter' + podfile-end + */ + +#include +@import Foundation; +#import "CSSSelectorConverter.h" +#import "CSSSelectorGrammar.h" +#import "CPLALR1Parser.h" + +int main(int argc, const char * argv[]) +{ + @autoreleasepool { + if (argc >= 3) + { + NSString* grammaFile = [[NSString stringWithCString:argv[1] encoding:NSASCIIStringEncoding] stringByExpandingTildeInPath]; + NSString* outputFile = [[NSString stringWithCString:argv[2] encoding:NSASCIIStringEncoding] stringByExpandingTildeInPath]; + CSSSelectorGrammar* grammar = [[CSSSelectorGrammar alloc] initWithPath:grammaFile]; + CPLALR1Parser* parser1 = [CPLALR1Parser parserWithGrammar:grammar]; + [NSKeyedArchiver archiveRootObject:@{@"parser" : parser1} + toFile:outputFile]; + } + else + { + NSLog(@"Usage: CSSSelectorParserGenerator "); + } + } +} + diff --git a/bin/ParserGenerator.m b/bin/ParserGenerator.m deleted file mode 100644 index fa0d33e..0000000 --- a/bin/ParserGenerator.m +++ /dev/null @@ -1,23 +0,0 @@ -/* -podfile-start -platform :osx, '10.9' -pod 'CSSSelectorConverter', :local => '/Users/siuying/workspace/opensource/CSSSelectorConverter' -podfile-end -*/ -@import Foundation; -#import "CSSSelectorParser.h" - -int main(int argc, char *argv[]) { - @autoreleasepool { - if (argc >= 2) - { - CSSSelectorParser* parser = [[CSSSelectorParser alloc] init]; - [NSKeyedArchiver archiveRootObject:@{@"parser" : parser} - toFile:[[NSString stringWithCString:argv[1] encoding:NSASCIIStringEncoding] stringByExpandingTildeInPath]]; - } - else - { - NSLog(@"Usage: ParserGenerator "); - } - } -} diff --git a/vendor/CoreParse b/vendor/CoreParse index a8d3021..af94425 160000 --- a/vendor/CoreParse +++ b/vendor/CoreParse @@ -1 +1 @@ -Subproject commit a8d302163c28e30021e8c716e1455701f62f4fa5 +Subproject commit af94425844fafcdf5840cb94dc3d24ba9d571f58 From c1667d34a4e15d8c955688318f4ae529d82149b5 Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Thu, 23 Jan 2014 15:43:54 +0800 Subject: [PATCH 15/52] replace NSLog with CocoaLumberjack --- CSSSelectorConverter/CSSSelectorGrammar.m | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/CSSSelectorConverter/CSSSelectorGrammar.m b/CSSSelectorConverter/CSSSelectorGrammar.m index 42c7373..d7f22f2 100644 --- a/CSSSelectorConverter/CSSSelectorGrammar.m +++ b/CSSSelectorConverter/CSSSelectorGrammar.m @@ -10,6 +10,11 @@ #import "CSSTypeSelector.h" #import "CSSUniversalSelector.h" +#import "DDLog.h" +#undef LOG_LEVEL_DEF +#define LOG_LEVEL_DEF cssSelectorLogLevel +static const int cssSelectorLogLevel = LOG_LEVEL_VERBOSE; + @implementation CSSSelectorGrammar -(instancetype) init @@ -24,15 +29,17 @@ -(instancetype) initWithPath:(NSString*)path NSString* grammar = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error]; if (!grammar) { if (error) { + DDLogError(@"missing grammar file %@, error: %@", path, error); [NSException raise:NSInvalidArgumentException format:@"missing grammar file %@, error: %@", path, error]; } else { + DDLogError(@"missing grammar file %@", path); [NSException raise:NSInvalidArgumentException format:@"missing grammar file %@", path]; } } self = [super initWithStart:@"CSSSelectorGroup" backusNaurForm:grammar error:&error]; if (!self) { if (error) { - NSLog(@"error compile language = %@", error); + DDLogError(@"error compile language = %@", error); } } return self; From 2c5fff6e2bc8d68ba63323b698e6a553685a0d33 Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Thu, 23 Jan 2014 15:46:14 +0800 Subject: [PATCH 16/52] Update podfile --- Podfile | 2 -- 1 file changed, 2 deletions(-) diff --git a/Podfile b/Podfile index 9f15780..7574807 100644 --- a/Podfile +++ b/Podfile @@ -2,8 +2,6 @@ platform :ios, '7.0' pod 'CocoaLumberjack' -link_with :CSSSelectorParserSerializer - target :'CSSSelectorConverterTests' do pod 'Kiwi/XCTest' end \ No newline at end of file From 91a7d076b609f01f7d5f0fc7ec86a15a6d092eab Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Thu, 23 Jan 2014 15:46:38 +0800 Subject: [PATCH 17/52] update podspec --- CSSSelectorConverter.podspec | 1 - 1 file changed, 1 deletion(-) diff --git a/CSSSelectorConverter.podspec b/CSSSelectorConverter.podspec index 5052882..9220cd7 100644 --- a/CSSSelectorConverter.podspec +++ b/CSSSelectorConverter.podspec @@ -30,7 +30,6 @@ Pod::Spec.new do |s| # If you are using your own version of CoreParse # only add 'CSSSelectorConverter/Core' s.subspec 'CoreParse' do |ss| - ss.prefix_header_contents = "#import \"CoreParse.h\"" ss.requires_arc = false ss.source_files = 'vendor/CoreParse/CoreParse/**/*.{h,m}' ss.osx.frameworks = 'Cocoa' From d71ec4b522d4b3762a41c23038d249cb3a066660 Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Thu, 23 Jan 2014 15:47:52 +0800 Subject: [PATCH 18/52] remove section serializing parser as it is not working properly right now due to https://github.com/beelsebob/CoreParse/issues/32 --- README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/README.md b/README.md index fcf38be..02741fe 100644 --- a/README.md +++ b/README.md @@ -70,11 +70,6 @@ Following pseduo classes will not be supported: 2. Install pods: ``pod install`` 3. Get submodule (CoreParse): ``git submodule update --init`` -### Serialize the parser - -1. Install objc-run ``brew install objc-run`` -2. Run the generator: ``objc-run ./bin/ParserGenerator.m CSSSelectorConverter/CSSSelectorParser.par`` - ## License MIT License. See License.txt. \ No newline at end of file From 8a61c344bcc701b5381bc2aea60aa580f209eb94 Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Thu, 23 Jan 2014 15:51:11 +0800 Subject: [PATCH 19/52] correct vendor version --- vendor/CoreParse | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/CoreParse b/vendor/CoreParse index af94425..a429b6b 160000 --- a/vendor/CoreParse +++ b/vendor/CoreParse @@ -1 +1 @@ -Subproject commit af94425844fafcdf5840cb94dc3d24ba9d571f58 +Subproject commit a429b6b7c6a715bb1b5fd10cba42aaf3301a86a2 From b1fc40157f924e21baf42eb5f49944301855ea46 Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Thu, 23 Jan 2014 16:40:35 +0800 Subject: [PATCH 20/52] Fix the podspec by require the subspec (embedded CoreParse). TODO: Need a better solution. --- CSSSelectorConverter.podspec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CSSSelectorConverter.podspec b/CSSSelectorConverter.podspec index 9220cd7..f9b61f6 100644 --- a/CSSSelectorConverter.podspec +++ b/CSSSelectorConverter.podspec @@ -19,6 +19,7 @@ Pod::Spec.new do |s| s.requires_arc = true s.subspec 'Core' do |ss| + ss.dependency 'CSSSelectorConverter/CoreParse' ss.source_files = 'CSSSelectorConverter/CSS*.{m,h}' ss.prefix_header_contents = "#import \"CSSSelectorConverter.h\"" @@ -27,11 +28,10 @@ Pod::Spec.new do |s| end # Use the submodule version of CoreParse - # If you are using your own version of CoreParse - # only add 'CSSSelectorConverter/Core' s.subspec 'CoreParse' do |ss| ss.requires_arc = false ss.source_files = 'vendor/CoreParse/CoreParse/**/*.{h,m}' + ss.public_header_files = 'vendor/CoreParse/CoreParse/**/*.{h}' ss.osx.frameworks = 'Cocoa' ss.ios.frameworks = 'Foundation' ss.requires_arc = false From ab3b11c4f5dcba6df467400ef8546d23265fc237 Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Tue, 28 Jan 2014 00:05:16 +0800 Subject: [PATCH 21/52] update spec to make CSSSelectorConverter based on submoduled CoreParse - fix this until CoreParse added an updated tag! --- CSSSelectorConverter.podspec | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/CSSSelectorConverter.podspec b/CSSSelectorConverter.podspec index f9b61f6..a7c431d 100644 --- a/CSSSelectorConverter.podspec +++ b/CSSSelectorConverter.podspec @@ -16,24 +16,21 @@ Pod::Spec.new do |s| s.osx.deployment_target = '10.8' s.dependency 'CocoaLumberjack', '>= 1.6.4' - s.requires_arc = true s.subspec 'Core' do |ss| - ss.dependency 'CSSSelectorConverter/CoreParse' ss.source_files = 'CSSSelectorConverter/CSS*.{m,h}' ss.prefix_header_contents = "#import \"CSSSelectorConverter.h\"" + ss.requires_arc = true # the grammar and the serialized parser ss.resources = 'CSSSelectorConverter/*.{txt,plist}' + ss.dependency 'CSSSelectorConverter/CoreParse' end - # Use the submodule version of CoreParse + # Until CoreParse release a new update, we're force to use our own version s.subspec 'CoreParse' do |ss| - ss.requires_arc = false - ss.source_files = 'vendor/CoreParse/CoreParse/**/*.{h,m}' - ss.public_header_files = 'vendor/CoreParse/CoreParse/**/*.{h}' - ss.osx.frameworks = 'Cocoa' - ss.ios.frameworks = 'Foundation' - ss.requires_arc = false + ss.source_files = 'vendor/CoreParse/CoreParse/**/*.{h,m}' + ss.exclude_files = 'vendor/CoreParse/CoreParse/CPSenTestKitAssertions.h' + ss.requires_arc = false end end \ No newline at end of file From 9370d1192b53a425b149a8a441ef141968247350 Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Tue, 28 Jan 2014 00:35:29 +0800 Subject: [PATCH 22/52] Update CHANGELOG --- CHANGELOG | 8 -------- CHANGELOG.md | 13 +++++++++++++ 2 files changed, 13 insertions(+), 8 deletions(-) delete mode 100644 CHANGELOG create mode 100644 CHANGELOG.md diff --git a/CHANGELOG b/CHANGELOG deleted file mode 100644 index a72f2a4..0000000 --- a/CHANGELOG +++ /dev/null @@ -1,8 +0,0 @@ -## 1.1.0 - -- Use [CoreParse](https://github.com/beelsebob/CoreParse) instead of [ParseKit](https://github.com/itod/parsekit) as parser generator. -- Fix #1, properly handle selector sequence. - -## 1.0.0 - -- Initial version. \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..f32cd60 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,13 @@ +Changelog +--------- + +1.1.0 (28/01/2014) +------------------ + +- Fix #1, properly handle selector sequence. +* Use [CoreParse](https://github.com/beelsebob/CoreParse) instead of [ParseKit](https://github.com/itod/parsekit) as parser generator. + +1.0.0 (09/01/2014) +-------------- + ++ Initial version. \ No newline at end of file From 63b23abb0707478a3f855d3481795d636444f1c1 Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Tue, 28 Jan 2014 00:54:30 +0800 Subject: [PATCH 23/52] add Travis CI config. --- .travis.yml | 2 ++ Rakefile | 7 +++++++ 2 files changed, 9 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..c601ab6 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,2 @@ +language: objective-c +script: rake test \ No newline at end of file diff --git a/Rakefile b/Rakefile index e69de29..3f09fd4 100644 --- a/Rakefile +++ b/Rakefile @@ -0,0 +1,7 @@ +require 'rubygems' +require 'rake' + +desc "Run tests" +task :test do + system("xcodebuild -workspace CSSSelectorConverter.xcworkspace -scheme CSSSelectorConverter -sdk iphonesimulator test") +end \ No newline at end of file From d839b2e572109e5664495fcee846a0aa6b55de58 Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Tue, 28 Jan 2014 01:29:19 +0800 Subject: [PATCH 24/52] fixes Travis config --- .travis.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c601ab6..8830433 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,2 +1,5 @@ +rvm: 2.0.0 +before_install: gem install cocoapods language: objective-c -script: rake test \ No newline at end of file +xcode_workspace: CSSSelectorConverter.xcworkspace +xcode_scheme: CSSSelectorConverter \ No newline at end of file From 539a1892f96e03611302a19c4923d8cae550adad Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Tue, 28 Jan 2014 01:34:40 +0800 Subject: [PATCH 25/52] Shared CSSSelectorConverter scheme. --- .../xcschemes/CSSSelectorConverter.xcscheme | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 CSSSelectorConverter.xcodeproj/xcshareddata/xcschemes/CSSSelectorConverter.xcscheme diff --git a/CSSSelectorConverter.xcodeproj/xcshareddata/xcschemes/CSSSelectorConverter.xcscheme b/CSSSelectorConverter.xcodeproj/xcshareddata/xcschemes/CSSSelectorConverter.xcscheme new file mode 100644 index 0000000..a96ce86 --- /dev/null +++ b/CSSSelectorConverter.xcodeproj/xcshareddata/xcschemes/CSSSelectorConverter.xcscheme @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 20c503f5a5f396158c8825051da2e886e9fbb157 Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Tue, 28 Jan 2014 01:40:51 +0800 Subject: [PATCH 26/52] specify simulator sdk, fixes travisci --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 8830433..df8690c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,4 +2,5 @@ rvm: 2.0.0 before_install: gem install cocoapods language: objective-c xcode_workspace: CSSSelectorConverter.xcworkspace -xcode_scheme: CSSSelectorConverter \ No newline at end of file +xcode_scheme: CSSSelectorConverter +xcode_sdk: iphonesimulator From f541fa20bb59404bcbae558055a0b4670f6c957b Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Tue, 28 Jan 2014 13:16:47 +0800 Subject: [PATCH 27/52] fixes TravisCI test --- .travis.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index df8690c..81ce3be 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,3 @@ -rvm: 2.0.0 -before_install: gem install cocoapods +rvm: 1.9.3 language: objective-c -xcode_workspace: CSSSelectorConverter.xcworkspace -xcode_scheme: CSSSelectorConverter -xcode_sdk: iphonesimulator +script: xcodebuild -workspace CSSSelectorConverter.xcworkspace -scheme CSSSelectorConverter -sdk iphonesimulator test From 2966a9d2c6f9c1e303d3786b1552ecc6aa0aa768 Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Tue, 28 Jan 2014 13:26:56 +0800 Subject: [PATCH 28/52] use xcpretty --- .travis.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 81ce3be..1ebe701 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,6 @@ rvm: 1.9.3 language: objective-c -script: xcodebuild -workspace CSSSelectorConverter.xcworkspace -scheme CSSSelectorConverter -sdk iphonesimulator test +before_script: + - export LANG=en_US.UTF-8 + - gem install xcpretty +script: xcodebuild -workspace CSSSelectorConverter.xcworkspace -scheme CSSSelectorConverter -sdk iphonesimulator test | xcpretty -c; exit ${PIPESTATUS[0]} From 5a88bbbc985f8b302b4ebc9abe92a4acdd93e0e1 Mon Sep 17 00:00:00 2001 From: Adar Porat Date: Tue, 12 Aug 2014 15:50:05 -0400 Subject: [PATCH 29/52] fix CocoaLumberjack dependency --- CSSSelectorConverter.podspec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CSSSelectorConverter.podspec b/CSSSelectorConverter.podspec index a7c431d..2a1e247 100644 --- a/CSSSelectorConverter.podspec +++ b/CSSSelectorConverter.podspec @@ -15,7 +15,7 @@ Pod::Spec.new do |s| s.ios.deployment_target = '6.0' s.osx.deployment_target = '10.8' - s.dependency 'CocoaLumberjack', '>= 1.6.4' + s.dependency 'CocoaLumberjack', '~> 1.9.0' s.subspec 'Core' do |ss| ss.source_files = 'CSSSelectorConverter/CSS*.{m,h}' @@ -33,4 +33,4 @@ Pod::Spec.new do |s| ss.exclude_files = 'vendor/CoreParse/CoreParse/CPSenTestKitAssertions.h' ss.requires_arc = false end -end \ No newline at end of file +end From e67e3d88ad504aaaf530edd3d102bb62d6c44717 Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Thu, 14 Aug 2014 15:27:51 +0800 Subject: [PATCH 30/52] add requires_arc to podspec --- CSSSelectorConverter.podspec | 1 + 1 file changed, 1 insertion(+) diff --git a/CSSSelectorConverter.podspec b/CSSSelectorConverter.podspec index 2a1e247..a7251bc 100644 --- a/CSSSelectorConverter.podspec +++ b/CSSSelectorConverter.podspec @@ -16,6 +16,7 @@ Pod::Spec.new do |s| s.osx.deployment_target = '10.8' s.dependency 'CocoaLumberjack', '~> 1.9.0' + s.requires_arc = true s.subspec 'Core' do |ss| ss.source_files = 'CSSSelectorConverter/CSS*.{m,h}' From a0bc5c1fadcf4234dfe003c4da15cde9995a2f0a Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Thu, 14 Aug 2014 15:48:03 +0800 Subject: [PATCH 31/52] update spec to requiring 1.9.x of CocoaLumberjack --- CSSSelectorConverter.podspec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CSSSelectorConverter.podspec b/CSSSelectorConverter.podspec index a7251bc..77087a9 100644 --- a/CSSSelectorConverter.podspec +++ b/CSSSelectorConverter.podspec @@ -1,12 +1,12 @@ Pod::Spec.new do |s| s.name = 'CSSSelectorConverter' - s.version = '1.1.0' + s.version = '1.1.1' s.license = 'MIT' s.summary = 'Objective-C/Cocoa String Tokenizer and Parser toolkit. Supports Grammars.' s.homepage = 'https://github.com/siuying/CSSSelectorConverter' s.author = { 'Francis Chong' => 'francis@ignition.hk' } - s.source = { :git => 'https://github.com/siuying/CSSSelectorConverter.git', :tag => '1.1.0', :submodules => true} + s.source = { :git => 'https://github.com/siuying/CSSSelectorConverter.git', :tag => '1.1.1', :submodules => true} s.description = %{ A CSS Selector to XPath Selector for Objective-C. Support mostly used subset of CSS Selector Level 3. From a623b9c69002cfeb775c4bd634798d533f15fe7f Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Mon, 15 Sep 2014 16:52:02 +0800 Subject: [PATCH 32/52] Use NUIParse instead of CoreParse --- .gitmodules | 3 - CSSSelectorConverter.podspec | 25 +--- .../project.pbxproj | 139 +++--------------- .../CSSSelectorConverter.xccheckout | 16 +- CSSSelectorConverter/CSSClassSelector.h | 4 +- CSSSelectorConverter/CSSClassSelector.m | 6 +- CSSSelectorConverter/CSSCombinator.h | 4 +- CSSSelectorConverter/CSSCombinator.m | 4 +- CSSSelectorConverter/CSSIDSelector.h | 4 +- CSSSelectorConverter/CSSIDSelector.m | 6 +- CSSSelectorConverter/CSSPseudoClass.h | 4 +- CSSSelectorConverter/CSSPseudoClass.m | 4 +- CSSSelectorConverter/CSSSelectorAttribute.h | 4 +- CSSSelectorConverter/CSSSelectorAttribute.m | 4 +- .../CSSSelectorAttributeOperator.h | 4 +- .../CSSSelectorAttributeOperator.m | 6 +- CSSSelectorConverter/CSSSelectorGrammar.h | 4 +- CSSSelectorConverter/CSSSelectorGroup.h | 4 +- CSSSelectorConverter/CSSSelectorGroup.m | 4 +- CSSSelectorConverter/CSSSelectorParser.h | 8 +- CSSSelectorConverter/CSSSelectorParser.m | 28 ++-- CSSSelectorConverter/CSSSelectorSequence.h | 4 +- CSSSelectorConverter/CSSSelectorSequence.m | 4 +- CSSSelectorConverter/CSSSelectorTokeniser.h | 4 +- CSSSelectorConverter/CSSSelectorTokeniser.m | 60 ++++---- CSSSelectorConverter/CSSSelectors.h | 4 +- CSSSelectorConverter/CSSSelectors.m | 4 +- CSSSelectorConverter/CSSTypeSelector.h | 4 +- CSSSelectorConverter/CSSTypeSelector.m | 6 +- CSSSelectorConverter/CSSUniversalSelector.h | 4 +- CSSSelectorConverter/CSSUniversalSelector.m | 4 +- .../CSSSelectorParserSpec.m | 2 +- .../CSSSelectorTokeniserSpec.m | 138 ++++++++--------- .../CSSSelectorXPathVisitorSpec.m | 2 +- .../CSSToXPathConverterSpec.m | 2 +- Podfile | 5 +- Podfile.lock | 26 ++-- vendor/CoreParse | 1 - 38 files changed, 221 insertions(+), 338 deletions(-) delete mode 160000 vendor/CoreParse diff --git a/.gitmodules b/.gitmodules index 12f40c0..e69de29 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +0,0 @@ -[submodule "vendor/CoreParse"] - path = vendor/CoreParse - url = https://github.com/beelsebob/CoreParse.git diff --git a/CSSSelectorConverter.podspec b/CSSSelectorConverter.podspec index 77087a9..b563865 100644 --- a/CSSSelectorConverter.podspec +++ b/CSSSelectorConverter.podspec @@ -1,12 +1,12 @@ Pod::Spec.new do |s| s.name = 'CSSSelectorConverter' - s.version = '1.1.1' + s.version = '1.1.2' s.license = 'MIT' s.summary = 'Objective-C/Cocoa String Tokenizer and Parser toolkit. Supports Grammars.' s.homepage = 'https://github.com/siuying/CSSSelectorConverter' s.author = { 'Francis Chong' => 'francis@ignition.hk' } - s.source = { :git => 'https://github.com/siuying/CSSSelectorConverter.git', :tag => '1.1.1', :submodules => true} + s.source = { :git => 'https://github.com/siuying/CSSSelectorConverter.git', :tag => '1.1.2'} s.description = %{ A CSS Selector to XPath Selector for Objective-C. Support mostly used subset of CSS Selector Level 3. @@ -16,22 +16,11 @@ Pod::Spec.new do |s| s.osx.deployment_target = '10.8' s.dependency 'CocoaLumberjack', '~> 1.9.0' + s.dependency 'NUIParse' s.requires_arc = true - s.subspec 'Core' do |ss| - ss.source_files = 'CSSSelectorConverter/CSS*.{m,h}' - ss.prefix_header_contents = "#import \"CSSSelectorConverter.h\"" - ss.requires_arc = true - - # the grammar and the serialized parser - ss.resources = 'CSSSelectorConverter/*.{txt,plist}' - ss.dependency 'CSSSelectorConverter/CoreParse' - end - - # Until CoreParse release a new update, we're force to use our own version - s.subspec 'CoreParse' do |ss| - ss.source_files = 'vendor/CoreParse/CoreParse/**/*.{h,m}' - ss.exclude_files = 'vendor/CoreParse/CoreParse/CPSenTestKitAssertions.h' - ss.requires_arc = false - end + s.source_files = 'CSSSelectorConverter/CSS*.{m,h}' + s.prefix_header_contents = "#import \"CSSSelectorConverter.h\"" + s.requires_arc = true + s.resources = 'CSSSelectorConverter/*.{txt,plist}' end diff --git a/CSSSelectorConverter.xcodeproj/project.pbxproj b/CSSSelectorConverter.xcodeproj/project.pbxproj index 1b7c03d..18c5279 100644 --- a/CSSSelectorConverter.xcodeproj/project.pbxproj +++ b/CSSSelectorConverter.xcodeproj/project.pbxproj @@ -23,8 +23,6 @@ 540AA36F187BC5F70012AA44 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 540AA34B187BC5F60012AA44 /* Foundation.framework */; }; 540AA370187BC5F70012AA44 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 540AA34F187BC5F60012AA44 /* UIKit.framework */; }; 540AA378187BC5F70012AA44 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 540AA376187BC5F70012AA44 /* InfoPlist.strings */; }; - 541971F1188ED2A3004240B4 /* libCoreParse.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 541971ED188ED293004240B4 /* libCoreParse.a */; }; - 541971F2188ED36A004240B4 /* libCoreParse.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 541971ED188ED293004240B4 /* libCoreParse.a */; }; 5419722F188FB97E004240B4 /* CSSSelectorXPathVisitor.m in Sources */ = {isa = PBXBuildFile; fileRef = 5419722E188FB97E004240B4 /* CSSSelectorXPathVisitor.m */; }; 54197231188FBAF0004240B4 /* CSSSelectorXPathVisitorSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 54197230188FBAF0004240B4 /* CSSSelectorXPathVisitorSpec.m */; }; 5433BA57188D0C5B006C5F59 /* CSSSelectorTokeniser.m in Sources */ = {isa = PBXBuildFile; fileRef = 5433BA56188D0C5B006C5F59 /* CSSSelectorTokeniser.m */; }; @@ -61,45 +59,13 @@ remoteGlobalIDString = 540AA347187BC5F60012AA44; remoteInfo = CSSSelectorConverter; }; - 541971E6188ED293004240B4 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 541971DE188ED293004240B4 /* CoreParse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 1F0E88F6130462F300537D04; - remoteInfo = CoreParse; - }; - 541971E8188ED293004240B4 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 541971DE188ED293004240B4 /* CoreParse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 1F0E890B130462F300537D04; - remoteInfo = CoreParseTests; - }; - 541971EA188ED293004240B4 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 541971DE188ED293004240B4 /* CoreParse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 1FE77D821375EA8F00879A41; - remoteInfo = "CoreParse Documentation"; - }; - 541971EC188ED293004240B4 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 541971DE188ED293004240B4 /* CoreParse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 1F92817F145C11050033BC34; - remoteInfo = iOSCoreParse; - }; - 541971EE188ED293004240B4 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 541971DE188ED293004240B4 /* CoreParse.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 1F92818C145C11050033BC34; - remoteInfo = iOSCoreParseTests; - }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 120C8E845AC74187B385721E /* Pods-CSSSelectorConverterTests.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CSSSelectorConverterTests.xcconfig"; path = "Pods/Pods-CSSSelectorConverterTests.xcconfig"; sourceTree = ""; }; + 2FA369A0A3C034B1BA4E570B /* Pods-CSSSelectorConverterTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CSSSelectorConverterTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-CSSSelectorConverterTests/Pods-CSSSelectorConverterTests.release.xcconfig"; sourceTree = ""; }; + 31A43E848921BC4A334A76A7 /* Pods-CSSSelectorConverterTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CSSSelectorConverterTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-CSSSelectorConverterTests/Pods-CSSSelectorConverterTests.debug.xcconfig"; sourceTree = ""; }; + 4654C27EDB914CB3303D3F76 /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = ""; }; + 48679CA62B498976F68DA0ED /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = ""; }; 540AA348187BC5F60012AA44 /* CSSSelectorConverter.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CSSSelectorConverter.app; sourceTree = BUILT_PRODUCTS_DIR; }; 540AA34B187BC5F60012AA44 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 540AA34D187BC5F60012AA44 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; @@ -139,7 +105,6 @@ 540AA3B5187BF2D60012AA44 /* CSSBaseSelector.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSBaseSelector.m; sourceTree = ""; }; 540AA3B8187BF3630012AA44 /* CSSSelectorSequence.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSSelectorSequence.h; sourceTree = ""; }; 540AA3B9187BF3630012AA44 /* CSSSelectorSequence.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSSelectorSequence.m; sourceTree = ""; }; - 541971DE188ED293004240B4 /* CoreParse.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = CoreParse.xcodeproj; path = vendor/CoreParse/CoreParse.xcodeproj; sourceTree = ""; }; 5419722D188FB97E004240B4 /* CSSSelectorXPathVisitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSSelectorXPathVisitor.h; sourceTree = ""; }; 5419722E188FB97E004240B4 /* CSSSelectorXPathVisitor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSSelectorXPathVisitor.m; sourceTree = ""; }; 54197230188FBAF0004240B4 /* CSSSelectorXPathVisitorSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSSelectorXPathVisitorSpec.m; sourceTree = ""; }; @@ -168,7 +133,6 @@ 54ECE0CE1890F23500C2A4ED /* CSSSelectorParser.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; path = CSSSelectorParser.plist; sourceTree = ""; }; 645CC76B14924389A7C750E3 /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; }; C89C0A8F74244B1F8AECA338 /* libPods-CSSSelectorConverterTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-CSSSelectorConverterTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - CE2CA43EDD52451AA75BA409 /* Pods.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.xcconfig; path = Pods/Pods.xcconfig; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -176,7 +140,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 541971F1188ED2A3004240B4 /* libCoreParse.a in Frameworks */, 540AA34E187BC5F60012AA44 /* CoreGraphics.framework in Frameworks */, 540AA350187BC5F60012AA44 /* UIKit.framework in Frameworks */, 540AA34C187BC5F60012AA44 /* Foundation.framework in Frameworks */, @@ -188,7 +151,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 541971F2188ED36A004240B4 /* libCoreParse.a in Frameworks */, 540AA36E187BC5F70012AA44 /* XCTest.framework in Frameworks */, 540AA370187BC5F70012AA44 /* UIKit.framework in Frameworks */, 540AA36F187BC5F70012AA44 /* Foundation.framework in Frameworks */, @@ -199,6 +161,17 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 4E499CA610DCD32F6D114FC8 /* Pods */ = { + isa = PBXGroup; + children = ( + 48679CA62B498976F68DA0ED /* Pods.debug.xcconfig */, + 4654C27EDB914CB3303D3F76 /* Pods.release.xcconfig */, + 31A43E848921BC4A334A76A7 /* Pods-CSSSelectorConverterTests.debug.xcconfig */, + 2FA369A0A3C034B1BA4E570B /* Pods-CSSSelectorConverterTests.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; 540AA33F187BC5F60012AA44 = { isa = PBXGroup; children = ( @@ -207,8 +180,7 @@ 540AA373187BC5F70012AA44 /* CSSSelectorConverterTests */, 540AA34A187BC5F60012AA44 /* Frameworks */, 540AA349187BC5F60012AA44 /* Products */, - CE2CA43EDD52451AA75BA409 /* Pods.xcconfig */, - 120C8E845AC74187B385721E /* Pods-CSSSelectorConverterTests.xcconfig */, + 4E499CA610DCD32F6D114FC8 /* Pods */, ); sourceTree = ""; }; @@ -225,7 +197,6 @@ isa = PBXGroup; children = ( 54ECE09A1890D30000C2A4ED /* libPods.a */, - 541971DE188ED293004240B4 /* CoreParse.xcodeproj */, 540AA34B187BC5F60012AA44 /* Foundation.framework */, 540AA34D187BC5F60012AA44 /* CoreGraphics.framework */, 540AA34F187BC5F60012AA44 /* UIKit.framework */, @@ -331,18 +302,6 @@ name = Selector; sourceTree = ""; }; - 541971DF188ED293004240B4 /* Products */ = { - isa = PBXGroup; - children = ( - 541971E7188ED293004240B4 /* CoreParse.framework */, - 541971E9188ED293004240B4 /* CoreParseTests.octest */, - 541971EB188ED293004240B4 /* CoreParse Documentation */, - 541971ED188ED293004240B4 /* libCoreParse.a */, - 541971EF188ED293004240B4 /* CoreParseTests.octest */, - ); - name = Products; - sourceTree = ""; - }; 54ECE0B71890D5C700C2A4ED /* bin */ = { isa = PBXGroup; children = ( @@ -419,12 +378,6 @@ mainGroup = 540AA33F187BC5F60012AA44; productRefGroup = 540AA349187BC5F60012AA44 /* Products */; projectDirPath = ""; - projectReferences = ( - { - ProductGroup = 541971DF188ED293004240B4 /* Products */; - ProjectRef = 541971DE188ED293004240B4 /* CoreParse.xcodeproj */; - }, - ); projectRoot = ""; targets = ( 540AA347187BC5F60012AA44 /* CSSSelectorConverter */, @@ -433,44 +386,6 @@ }; /* End PBXProject section */ -/* Begin PBXReferenceProxy section */ - 541971E7188ED293004240B4 /* CoreParse.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = CoreParse.framework; - remoteRef = 541971E6188ED293004240B4 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 541971E9188ED293004240B4 /* CoreParseTests.octest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = CoreParseTests.octest; - remoteRef = 541971E8188ED293004240B4 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 541971EB188ED293004240B4 /* CoreParse Documentation */ = { - isa = PBXReferenceProxy; - fileType = "compiled.mach-o.executable"; - path = "CoreParse Documentation"; - remoteRef = 541971EA188ED293004240B4 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 541971ED188ED293004240B4 /* libCoreParse.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libCoreParse.a; - remoteRef = 541971EC188ED293004240B4 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 541971EF188ED293004240B4 /* CoreParseTests.octest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = CoreParseTests.octest; - remoteRef = 541971EE188ED293004240B4 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; -/* End PBXReferenceProxy section */ - /* Begin PBXResourcesBuildPhase section */ 540AA346187BC5F60012AA44 /* Resources */ = { isa = PBXResourcesBuildPhase; @@ -524,7 +439,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Pods-CSSSelectorConverterTests-resources.sh\"\n"; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-CSSSelectorConverterTests/Pods-CSSSelectorConverterTests-resources.sh\"\n"; showEnvVarsInLog = 0; }; D4177FD04A764743819E8D91 /* Copy Pods Resources */ = { @@ -539,7 +454,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Pods-resources.sh\"\n"; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh\"\n"; showEnvVarsInLog = 0; }; E9DFBE05A0034D26B921C88E /* Check Pods Manifest.lock */ = { @@ -712,16 +627,13 @@ }; 540AA37E187BC5F70012AA44 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = CE2CA43EDD52451AA75BA409 /* Pods.xcconfig */; + baseConfigurationReference = 48679CA62B498976F68DA0ED /* Pods.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "CSSSelectorConverter/CSSSelectorConverter-Prefix.pch"; - HEADER_SEARCH_PATHS = ( - "vendor/CoreParse/CoreParse/**", - "$(inherited)", - ); + HEADER_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = "CSSSelectorConverter/CSSSelectorConverter-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; @@ -730,16 +642,13 @@ }; 540AA37F187BC5F70012AA44 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = CE2CA43EDD52451AA75BA409 /* Pods.xcconfig */; + baseConfigurationReference = 4654C27EDB914CB3303D3F76 /* Pods.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "CSSSelectorConverter/CSSSelectorConverter-Prefix.pch"; - HEADER_SEARCH_PATHS = ( - "vendor/CoreParse/CoreParse/**", - "$(inherited)", - ); + HEADER_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = "CSSSelectorConverter/CSSSelectorConverter-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; @@ -748,7 +657,7 @@ }; 540AA381187BC5F70012AA44 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 120C8E845AC74187B385721E /* Pods-CSSSelectorConverterTests.xcconfig */; + baseConfigurationReference = 31A43E848921BC4A334A76A7 /* Pods-CSSSelectorConverterTests.debug.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/CSSSelectorConverter.app/CSSSelectorConverter"; @@ -776,7 +685,7 @@ }; 540AA382187BC5F70012AA44 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 120C8E845AC74187B385721E /* Pods-CSSSelectorConverterTests.xcconfig */; + baseConfigurationReference = 2FA369A0A3C034B1BA4E570B /* Pods-CSSSelectorConverterTests.release.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/CSSSelectorConverter.app/CSSSelectorConverter"; diff --git a/CSSSelectorConverter.xcworkspace/xcshareddata/CSSSelectorConverter.xccheckout b/CSSSelectorConverter.xcworkspace/xcshareddata/CSSSelectorConverter.xccheckout index aefc0aa..e0edd19 100644 --- a/CSSSelectorConverter.xcworkspace/xcshareddata/CSSSelectorConverter.xccheckout +++ b/CSSSelectorConverter.xcworkspace/xcshareddata/CSSSelectorConverter.xccheckout @@ -10,33 +10,33 @@ CSSSelectorConverter IDESourceControlProjectOriginsDictionary - 36A6D4CA-6BB3-414E-BFBE-97B75EEBBCA3 + 122DB07625ACCDABC9818C06D3A839B56B29D4FD ssh://github.com/siuying/CSSSelectorConverter.git - 933D72C4-BB34-468B-8A2A-F9A5F6A06A65 + 20B5E220B44D3958A2219B13999BCD96DC9444FE https://github.com/beelsebob/CoreParse.git IDESourceControlProjectPath CSSSelectorConverter.xcworkspace IDESourceControlProjectRelativeInstallPathDictionary - 36A6D4CA-6BB3-414E-BFBE-97B75EEBBCA3 + 122DB07625ACCDABC9818C06D3A839B56B29D4FD .. - 933D72C4-BB34-468B-8A2A-F9A5F6A06A65 + 20B5E220B44D3958A2219B13999BCD96DC9444FE ../vendor/CoreParse IDESourceControlProjectURL ssh://github.com/siuying/CSSSelectorConverter.git IDESourceControlProjectVersion - 110 + 111 IDESourceControlProjectWCCIdentifier - 36A6D4CA-6BB3-414E-BFBE-97B75EEBBCA3 + 122DB07625ACCDABC9818C06D3A839B56B29D4FD IDESourceControlProjectWCConfigurations IDESourceControlRepositoryExtensionIdentifierKey public.vcs.git IDESourceControlWCCIdentifierKey - 933D72C4-BB34-468B-8A2A-F9A5F6A06A65 + 20B5E220B44D3958A2219B13999BCD96DC9444FE IDESourceControlWCCName CoreParse @@ -44,7 +44,7 @@ IDESourceControlRepositoryExtensionIdentifierKey public.vcs.git IDESourceControlWCCIdentifierKey - 36A6D4CA-6BB3-414E-BFBE-97B75EEBBCA3 + 122DB07625ACCDABC9818C06D3A839B56B29D4FD IDESourceControlWCCName CSSSelectorConverter diff --git a/CSSSelectorConverter/CSSClassSelector.h b/CSSSelectorConverter/CSSClassSelector.h index b46d414..c31a99b 100644 --- a/CSSSelectorConverter/CSSClassSelector.h +++ b/CSSSelectorConverter/CSSClassSelector.h @@ -8,8 +8,8 @@ #import #import "CSSNamedSelector.h" -#import "CPParser.h" +#import "NUIPParser.h" -@interface CSSClassSelector : CSSNamedSelector +@interface CSSClassSelector : CSSNamedSelector @end diff --git a/CSSSelectorConverter/CSSClassSelector.m b/CSSSelectorConverter/CSSClassSelector.m index 88e0678..fcb0dae 100644 --- a/CSSSelectorConverter/CSSClassSelector.m +++ b/CSSSelectorConverter/CSSClassSelector.m @@ -7,16 +7,16 @@ // #import "CSSClassSelector.h" -#import "CoreParse.h" +#import "NUIParse.h" @implementation CSSClassSelector -- (id)initWithSyntaxTree:(CPSyntaxTree *)syntaxTree { +- (id)initWithSyntaxTree:(NUIPSyntaxTree *)syntaxTree { self = [self init]; if (self) { NSArray *components = [syntaxTree children]; if ([components count] == 2) { - CPIdentifierToken* token = components[1]; + NUIPIdentifierToken* token = components[1]; if ([token isIdentifierToken]) { self.name = [token identifier]; } diff --git a/CSSSelectorConverter/CSSCombinator.h b/CSSSelectorConverter/CSSCombinator.h index 80a0a46..f33fd46 100644 --- a/CSSSelectorConverter/CSSCombinator.h +++ b/CSSSelectorConverter/CSSCombinator.h @@ -7,7 +7,7 @@ // #import "CSSBaseSelector.h" -#import "CPParser.h" +#import "NUIPParser.h" typedef NS_ENUM(NSInteger, CSSCombinatorType) { CSSCombinatorTypeNone = 0, @@ -16,7 +16,7 @@ typedef NS_ENUM(NSInteger, CSSCombinatorType) { CSSCombinatorTypeGeneralSibling }; -@interface CSSCombinator : CSSBaseSelector +@interface CSSCombinator : CSSBaseSelector @property (nonatomic, assign) CSSCombinatorType type; diff --git a/CSSSelectorConverter/CSSCombinator.m b/CSSSelectorConverter/CSSCombinator.m index 5f6bec6..c85b886 100644 --- a/CSSSelectorConverter/CSSCombinator.m +++ b/CSSSelectorConverter/CSSCombinator.m @@ -8,7 +8,7 @@ #import "CSSCombinator.h" #import "DDLog.h" -#import "CoreParse.h" +#import "NUIParse.h" #undef LOG_LEVEL_DEF #define LOG_LEVEL_DEF cssSelectorLogLevel @@ -16,7 +16,7 @@ @implementation CSSCombinator -- (id)initWithSyntaxTree:(CPSyntaxTree *)syntaxTree { +- (id)initWithSyntaxTree:(NUIPSyntaxTree *)syntaxTree { self = [self init]; NSArray *components = [syntaxTree children]; if ([components count] >= 1) { diff --git a/CSSSelectorConverter/CSSIDSelector.h b/CSSSelectorConverter/CSSIDSelector.h index d63797f..4b15538 100644 --- a/CSSSelectorConverter/CSSIDSelector.h +++ b/CSSSelectorConverter/CSSIDSelector.h @@ -8,8 +8,8 @@ #import #import "CSSNamedSelector.h" -#import "CPParser.h" +#import "NUIPParser.h" -@interface CSSIDSelector : CSSNamedSelector +@interface CSSIDSelector : CSSNamedSelector @end diff --git a/CSSSelectorConverter/CSSIDSelector.m b/CSSSelectorConverter/CSSIDSelector.m index 33b75a9..a2742be 100644 --- a/CSSSelectorConverter/CSSIDSelector.m +++ b/CSSSelectorConverter/CSSIDSelector.m @@ -7,16 +7,16 @@ // #import "CSSIDSelector.h" -#import "CoreParse.h" +#import "NUIParse.h" @implementation CSSIDSelector -- (id)initWithSyntaxTree:(CPSyntaxTree *)syntaxTree { +- (id)initWithSyntaxTree:(NUIPSyntaxTree *)syntaxTree { self = [self init]; if (self) { NSArray *components = [syntaxTree children]; if ([components count] == 2) { - CPIdentifierToken* token = components[1]; + NUIPIdentifierToken* token = components[1]; if ([token isIdentifierToken]) { self.name = [token identifier]; } diff --git a/CSSSelectorConverter/CSSPseudoClass.h b/CSSSelectorConverter/CSSPseudoClass.h index 3f18a8a..8e70067 100644 --- a/CSSSelectorConverter/CSSPseudoClass.h +++ b/CSSSelectorConverter/CSSPseudoClass.h @@ -7,9 +7,9 @@ // #import "CSSNamedSelector.h" -#import "CPParser.h" +#import "NUIPParser.h" -@interface CSSPseudoClass : CSSNamedSelector +@interface CSSPseudoClass : CSSNamedSelector @property (nonatomic, weak) CSSNamedSelector* parent; diff --git a/CSSSelectorConverter/CSSPseudoClass.m b/CSSSelectorConverter/CSSPseudoClass.m index de0675d..0c2e9c1 100644 --- a/CSSSelectorConverter/CSSPseudoClass.m +++ b/CSSSelectorConverter/CSSPseudoClass.m @@ -11,11 +11,11 @@ static const int cssSelectorLogLevel = LOG_LEVEL_WARN; #import "CSSPseudoClass.h" -#import "CoreParse.h" +#import "NUIParse.h" @implementation CSSPseudoClass -- (id)initWithSyntaxTree:(CPSyntaxTree *)syntaxTree { +- (id)initWithSyntaxTree:(NUIPSyntaxTree *)syntaxTree { self = [self init]; id token = [syntaxTree valueForTag:@"className"]; diff --git a/CSSSelectorConverter/CSSSelectorAttribute.h b/CSSSelectorConverter/CSSSelectorAttribute.h index 2994344..6261818 100644 --- a/CSSSelectorConverter/CSSSelectorAttribute.h +++ b/CSSSelectorConverter/CSSSelectorAttribute.h @@ -8,9 +8,9 @@ #import "CSSBaseSelector.h" #import "CSSSelectorAttributeOperator.h" -#import "CPParser.h" +#import "NUIPParser.h" -@interface CSSSelectorAttribute : CSSBaseSelector +@interface CSSSelectorAttribute : CSSBaseSelector @property (nonatomic, strong) CSSSelectorAttributeOperator* attributeOperator; @property (nonatomic, copy) NSString* name; diff --git a/CSSSelectorConverter/CSSSelectorAttribute.m b/CSSSelectorConverter/CSSSelectorAttribute.m index 0311c7a..94b6375 100644 --- a/CSSSelectorConverter/CSSSelectorAttribute.m +++ b/CSSSelectorConverter/CSSSelectorAttribute.m @@ -13,11 +13,11 @@ #undef LOG_LEVEL_DEF #define LOG_LEVEL_DEF cssSelectorLogLevel static const int cssSelectorLogLevel = LOG_LEVEL_VERBOSE; -#import "CoreParse.h" +#import "NUIParse.h" @implementation CSSSelectorAttribute -- (id)initWithSyntaxTree:(CPSyntaxTree *)syntaxTree { +- (id)initWithSyntaxTree:(NUIPSyntaxTree *)syntaxTree { self = [self init]; if (self) { self.attributeOperator = [syntaxTree valueForTag:@"op"]; diff --git a/CSSSelectorConverter/CSSSelectorAttributeOperator.h b/CSSSelectorConverter/CSSSelectorAttributeOperator.h index 1357af9..71edbd4 100644 --- a/CSSSelectorConverter/CSSSelectorAttributeOperator.h +++ b/CSSSelectorConverter/CSSSelectorAttributeOperator.h @@ -7,7 +7,7 @@ // #import "CSSNamedSelector.h" -#import "CPParser.h" +#import "NUIPParser.h" typedef NS_ENUM(NSInteger, CSSSelectorAttributeOperatorType) { CSSSelectorAttributeOperatorTypeNone = 0, @@ -16,7 +16,7 @@ typedef NS_ENUM(NSInteger, CSSSelectorAttributeOperatorType) { CSSSelectorAttributeOperatorTypeDash }; -@interface CSSSelectorAttributeOperator : CSSNamedSelector +@interface CSSSelectorAttributeOperator : CSSNamedSelector @property (nonatomic, assign) CSSSelectorAttributeOperatorType attributeOperator; diff --git a/CSSSelectorConverter/CSSSelectorAttributeOperator.m b/CSSSelectorConverter/CSSSelectorAttributeOperator.m index 02ec5d2..4039546 100644 --- a/CSSSelectorConverter/CSSSelectorAttributeOperator.m +++ b/CSSSelectorConverter/CSSSelectorAttributeOperator.m @@ -9,18 +9,18 @@ #undef LOG_LEVEL_DEF #define LOG_LEVEL_DEF cssSelectorLogLevel static const int cssSelectorLogLevel = LOG_LEVEL_VERBOSE; -#import "CoreParse.h" +#import "NUIParse.h" #import "CSSSelectorAttributeOperator.h" @implementation CSSSelectorAttributeOperator -- (id)initWithSyntaxTree:(CPSyntaxTree *)syntaxTree { +- (id)initWithSyntaxTree:(NUIPSyntaxTree *)syntaxTree { self = [self init]; if (self) { NSArray *components = [syntaxTree children]; if ([components count] == 1) { - CPKeywordToken* token = [components[0] children][0]; + NUIPKeywordToken* token = [components[0] children][0]; if ([token isKeywordToken]) { self.name = [token keyword]; self.attributeOperator = [[self class] operatorWithString:[token keyword]]; diff --git a/CSSSelectorConverter/CSSSelectorGrammar.h b/CSSSelectorConverter/CSSSelectorGrammar.h index 503b287..7ceffc4 100644 --- a/CSSSelectorConverter/CSSSelectorGrammar.h +++ b/CSSSelectorConverter/CSSSelectorGrammar.h @@ -6,9 +6,9 @@ // Copyright (c) 2014 Ignition Soft. All rights reserved. // -#import "CPGrammar.h" +#import "NUIPGrammar.h" -@interface CSSSelectorGrammar : CPGrammar +@interface CSSSelectorGrammar : NUIPGrammar /** * Create a Grammar object using the grammar file in the bundle. diff --git a/CSSSelectorConverter/CSSSelectorGroup.h b/CSSSelectorConverter/CSSSelectorGroup.h index 24eb746..3561181 100644 --- a/CSSSelectorConverter/CSSSelectorGroup.h +++ b/CSSSelectorConverter/CSSSelectorGroup.h @@ -8,9 +8,9 @@ #import "CSSBaseSelector.h" #import "CSSSelectors.h" -#import "CPParser.h" +#import "NUIPParser.h" -@interface CSSSelectorGroup : CSSBaseSelector +@interface CSSSelectorGroup : CSSBaseSelector @property (nonatomic, strong) NSMutableArray* selectors; diff --git a/CSSSelectorConverter/CSSSelectorGroup.m b/CSSSelectorConverter/CSSSelectorGroup.m index a5073c3..1bc1f39 100644 --- a/CSSSelectorConverter/CSSSelectorGroup.m +++ b/CSSSelectorConverter/CSSSelectorGroup.m @@ -7,7 +7,7 @@ // #import "CSSSelectorGroup.h" -#import "CoreParse.h" +#import "NUIParse.h" #import "DDLog.h" #undef LOG_LEVEL_DEF @@ -16,7 +16,7 @@ @implementation CSSSelectorGroup -- (id)initWithSyntaxTree:(CPSyntaxTree *)syntaxTree { +- (id)initWithSyntaxTree:(NUIPSyntaxTree *)syntaxTree { self = [self init]; if (self) { CSSSelectors* selector = [syntaxTree valueForTag:@"firstSelector"]; diff --git a/CSSSelectorConverter/CSSSelectorParser.h b/CSSSelectorConverter/CSSSelectorParser.h index a508dba..88e44c5 100644 --- a/CSSSelectorConverter/CSSSelectorParser.h +++ b/CSSSelectorConverter/CSSSelectorParser.h @@ -1,7 +1,7 @@ #import #import "CSSSelectorGroup.h" -#import "CPParser.h" -#import "CPTokeniser.h" +#import "NUIPParser.h" +#import "NUIPTokeniser.h" extern NSString* const CSSSelectorParserException; extern NSString* const CSSSelectorParserErrorDomain; @@ -16,7 +16,7 @@ extern NSString* const CSSSelectorParserErrorAcceptableTokenKey; * Use ``CSSSelectorXPathVisitor`` to convert the returned tree into a XPath. * @see CSSSelectorParser */ -@interface CSSSelectorParser : NSObject +@interface CSSSelectorParser : NSObject /** Last error encountered by the parser. @@ -25,7 +25,7 @@ extern NSString* const CSSSelectorParserErrorAcceptableTokenKey; -(instancetype) init; --(instancetype) initWithParser:(CPParser*)parser; +-(instancetype) initWithParser:(NUIPParser*)parser; /** * Parse a CSS Selector and return a CSSSelectorGroup object. diff --git a/CSSSelectorConverter/CSSSelectorParser.m b/CSSSelectorConverter/CSSSelectorParser.m index 4d2260e..c43bb3b 100644 --- a/CSSSelectorConverter/CSSSelectorParser.m +++ b/CSSSelectorConverter/CSSSelectorParser.m @@ -1,7 +1,7 @@ #import "CSSSelectorParser.h" #import "CSSSelectorGrammar.h" #import "CSSSelectorTokeniser.h" -#import "CoreParse.h" +#import "NUIParse.h" #import "DDLog.h" #undef LOG_LEVEL_DEF @@ -19,27 +19,17 @@ @interface CSSSelectorParser () @property (nonatomic, strong) CSSSelectorTokeniser *tokeniser; -@property (nonatomic, strong) CPParser* parser; +@property (nonatomic, strong) NUIPParser* parser; @end @implementation CSSSelectorParser - (id)init { -// NSString* path = [[NSBundle bundleForClass:[self class]] pathForResource:@"CSSSelectorParser" ofType:@"plist"]; -// if (!path) { -// [NSException raise:NSInternalInconsistencyException format:@"Cannot find parser file CSSSelectorParser.plist"]; -// } -// -// NSDictionary *pt = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; -// CPParser* parser = pt[@"parser"]; -// if (!parser) { -// [NSException raise:NSInternalInconsistencyException format:@"Cannot load parser from CSSSelectorParser.plist (%@)", path]; -// } - CPLALR1Parser* parser = [CPLALR1Parser parserWithGrammar:[[CSSSelectorGrammar alloc] initWithPath:[[NSBundle bundleForClass:[self class]] pathForResource:@"CSSSelectorGrammar" ofType:@"txt"]]]; + NUIPLALR1Parser* parser = [NUIPLALR1Parser parserWithGrammar:[[CSSSelectorGrammar alloc] initWithPath:[[NSBundle bundleForClass:[self class]] pathForResource:@"CSSSelectorGrammar" ofType:@"txt"]]]; return [self initWithParser:parser]; } --(instancetype) initWithParser:(CPParser*)parser +-(instancetype) initWithParser:(NUIPParser*)parser { self = [super init]; self.tokeniser = [[CSSSelectorTokeniser alloc] init]; @@ -51,7 +41,7 @@ -(instancetype) initWithParser:(CPParser*)parser - (CSSSelectorGroup*)parse:(NSString *)css error:(NSError*__autoreleasing*)error { - CPTokenStream *tokenStream = [self.tokeniser tokenise:css]; + NUIPTokenStream *tokenStream = [self.tokeniser tokenise:css]; CSSSelectorGroup* result = [self.parser parse:tokenStream]; if (!result) { if (error) { @@ -65,7 +55,7 @@ - (CSSSelectorGroup*)parse:(NSString *)css error:(NSError*__autoreleasing*)error #pragma mark - CPParserDelegate -- (id)parser:(CPParser *)parser didProduceSyntaxTree:(CPSyntaxTree *)syntaxTree +- (id)parser:(NUIPParser *)parser didProduceSyntaxTree:(NUIPSyntaxTree *)syntaxTree { switch ([[syntaxTree rule] tag]) { case CSSSelectorParserRuleQuotedString: { @@ -85,18 +75,18 @@ - (id)parser:(CPParser *)parser didProduceSyntaxTree:(CPSyntaxTree *)syntaxTree return syntaxTree; } -- (CPRecoveryAction *)parser:(CPParser *)parser didEncounterErrorOnInput:(CPTokenStream *)inputStream expecting:(NSSet *)acceptableTokens +- (NUIPRecoveryAction *)parser:(NUIPParser *)parser didEncounterErrorOnInput:(NUIPTokenStream *)inputStream expecting:(NSSet *)acceptableTokens { NSError* error = [NSError errorWithDomain:CSSSelectorParserErrorDomain code:1 userInfo:@{CSSSelectorParserErrorInputStreamKey: inputStream, CSSSelectorParserErrorAcceptableTokenKey: acceptableTokens}]; self.lastError = error; - return [CPRecoveryAction recoveryActionStop]; + return [NUIPRecoveryAction recoveryActionStop]; } #pragma mark - CPTokeniserDelegate -- (BOOL)tokeniser:(CPTokeniser *)tokeniser shouldConsumeToken:(CPToken *)token +- (BOOL)tokeniser:(NUIPTokeniser *)tokeniser shouldConsumeToken:(NUIPToken *)token { return YES; } diff --git a/CSSSelectorConverter/CSSSelectorSequence.h b/CSSSelectorConverter/CSSSelectorSequence.h index 9d50dee..b51496c 100644 --- a/CSSSelectorConverter/CSSSelectorSequence.h +++ b/CSSSelectorConverter/CSSSelectorSequence.h @@ -8,13 +8,13 @@ #import #import "CSSBaseSelector.h" -#import "CPParser.h" +#import "NUIPParser.h" @class CSSCombinator; @class CSSPseudoClass; @class CSSTypeSelector; -@interface CSSSelectorSequence : CSSBaseSelector +@interface CSSSelectorSequence : CSSBaseSelector @property (nonatomic, strong) CSSPseudoClass* pseudoClass; diff --git a/CSSSelectorConverter/CSSSelectorSequence.m b/CSSSelectorConverter/CSSSelectorSequence.m index 3957468..975d91b 100644 --- a/CSSSelectorConverter/CSSSelectorSequence.m +++ b/CSSSelectorConverter/CSSSelectorSequence.m @@ -7,7 +7,7 @@ // #import "DDLog.h" -#import "CoreParse.h" +#import "NUIParse.h" #undef LOG_LEVEL_DEF #define LOG_LEVEL_DEF cssSelectorLogLevel @@ -25,7 +25,7 @@ @implementation CSSSelectorSequence -- (id)initWithSyntaxTree:(CPSyntaxTree *)syntaxTree { +- (id)initWithSyntaxTree:(NUIPSyntaxTree *)syntaxTree { self = [self init]; if (self) { NSArray* selectors = nil; diff --git a/CSSSelectorConverter/CSSSelectorTokeniser.h b/CSSSelectorConverter/CSSSelectorTokeniser.h index ab4e809..64c9490 100644 --- a/CSSSelectorConverter/CSSSelectorTokeniser.h +++ b/CSSSelectorConverter/CSSSelectorTokeniser.h @@ -6,13 +6,13 @@ // Copyright (c) 2014 Ignition Soft. All rights reserved. // -#import "CPTokeniser.h" +#import "NUIPTokeniser.h" /** * Tokenize the CSS Selector for the CSSSelectorGrammar to consume. * * @see CSSSelectorGrammar */ -@interface CSSSelectorTokeniser : CPTokeniser +@interface CSSSelectorTokeniser : NUIPTokeniser @end diff --git a/CSSSelectorConverter/CSSSelectorTokeniser.m b/CSSSelectorConverter/CSSSelectorTokeniser.m index dd09d99..d29f6a0 100644 --- a/CSSSelectorConverter/CSSSelectorTokeniser.m +++ b/CSSSelectorConverter/CSSSelectorTokeniser.m @@ -7,58 +7,58 @@ // #import "CSSSelectorTokeniser.h" -#import "CPNumberRecogniser.h" -#import "CPWhiteSpaceRecogniser.h" -#import "CPQuotedRecogniser.h" -#import "CPKeywordRecogniser.h" -#import "CPIdentifierRecogniser.h" -#import "CPRegexpRecogniser.h" +#import "NUIPNumberRecogniser.h" +#import "NUIPWhiteSpaceRecogniser.h" +#import "NUIPQuotedRecogniser.h" +#import "NUIPKeywordRecogniser.h" +#import "NUIPIdentifierRecogniser.h" +#import "NUIPRegexpRecogniser.h" @implementation CSSSelectorTokeniser -(id) init { self = [super init]; - [self addTokenRecogniser:[CPIdentifierRecogniser identifierRecogniser]]; - [self addTokenRecogniser:[CPNumberRecogniser numberRecogniser]]; - [self addTokenRecogniser:[CPQuotedRecogniser quotedRecogniserWithStartQuote:@"\"" + [self addTokenRecogniser:[NUIPIdentifierRecogniser identifierRecogniser]]; + [self addTokenRecogniser:[NUIPNumberRecogniser numberRecogniser]]; + [self addTokenRecogniser:[NUIPQuotedRecogniser quotedRecogniserWithStartQuote:@"\"" endQuote:@"\"" name:@"String"]]; - [self addTokenRecogniser:[CPQuotedRecogniser quotedRecogniserWithStartQuote:@"\'" + [self addTokenRecogniser:[NUIPQuotedRecogniser quotedRecogniserWithStartQuote:@"\'" endQuote:@"\'" name:@"String"]]; - CPRegexpKeywordRecogniserMatchHandler trimSpaceHandler = ^(NSString* tokenString, NSTextCheckingResult* match){ + NUIPRegexpKeywordRecogniserMatchHandler trimSpaceHandler = ^(NSString* tokenString, NSTextCheckingResult* match){ NSString* matched = [tokenString substringWithRange:match.range]; - return [CPKeywordToken tokenWithKeyword:[matched stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]]; + return [NUIPKeywordToken tokenWithKeyword:[matched stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]]; }; - [self addTokenRecogniser:[CPRegexpRecogniser recogniserForRegexp:[NSRegularExpression regularExpressionWithPattern:@"[ \t\r\n\f]*(\\~\\=)[ \t\r\n\f]*" options:0 error:nil] + [self addTokenRecogniser:[NUIPRegexpRecogniser recogniserForRegexp:[NSRegularExpression regularExpressionWithPattern:@"[ \t\r\n\f]*(\\~\\=)[ \t\r\n\f]*" options:0 error:nil] matchHandler:trimSpaceHandler]]; - [self addTokenRecogniser:[CPRegexpRecogniser recogniserForRegexp:[NSRegularExpression regularExpressionWithPattern:@"[ \t\r\n\f]*(\\|\\=)[ \t\r\n\f]*" options:0 error:nil] + [self addTokenRecogniser:[NUIPRegexpRecogniser recogniserForRegexp:[NSRegularExpression regularExpressionWithPattern:@"[ \t\r\n\f]*(\\|\\=)[ \t\r\n\f]*" options:0 error:nil] matchHandler:trimSpaceHandler]]; - [self addTokenRecogniser:[CPRegexpRecogniser recogniserForRegexp:[NSRegularExpression regularExpressionWithPattern:@"[ \t\r\n\f]*(\\=)[ \t\r\n\f]*" options:0 error:nil] + [self addTokenRecogniser:[NUIPRegexpRecogniser recogniserForRegexp:[NSRegularExpression regularExpressionWithPattern:@"[ \t\r\n\f]*(\\=)[ \t\r\n\f]*" options:0 error:nil] matchHandler:trimSpaceHandler]]; - [self addTokenRecogniser:[CPRegexpRecogniser recogniserForRegexp:[NSRegularExpression regularExpressionWithPattern:@"[ \t\r\n\f]*(\\~)[ \t\r\n\f]*" options:0 error:nil] + [self addTokenRecogniser:[NUIPRegexpRecogniser recogniserForRegexp:[NSRegularExpression regularExpressionWithPattern:@"[ \t\r\n\f]*(\\~)[ \t\r\n\f]*" options:0 error:nil] matchHandler:trimSpaceHandler]]; - [self addTokenRecogniser:[CPRegexpRecogniser recogniserForRegexp:[NSRegularExpression regularExpressionWithPattern:@"[ \t\r\n\f]*(\\+)[ \t\r\n\f]*" options:0 error:nil] + [self addTokenRecogniser:[NUIPRegexpRecogniser recogniserForRegexp:[NSRegularExpression regularExpressionWithPattern:@"[ \t\r\n\f]*(\\+)[ \t\r\n\f]*" options:0 error:nil] matchHandler:trimSpaceHandler]]; - [self addTokenRecogniser:[CPRegexpRecogniser recogniserForRegexp:[NSRegularExpression regularExpressionWithPattern:@"[ \t\r\n\f]*(\\>)[ \t\r\n\f]*" options:0 error:nil] + [self addTokenRecogniser:[NUIPRegexpRecogniser recogniserForRegexp:[NSRegularExpression regularExpressionWithPattern:@"[ \t\r\n\f]*(\\>)[ \t\r\n\f]*" options:0 error:nil] matchHandler:trimSpaceHandler]]; - [self addTokenRecogniser:[CPRegexpRecogniser recogniserForRegexp:[NSRegularExpression regularExpressionWithPattern:@"[ \t\r\n\f]*(\\,)[ \t\r\n\f]*" options:0 error:nil] + [self addTokenRecogniser:[NUIPRegexpRecogniser recogniserForRegexp:[NSRegularExpression regularExpressionWithPattern:@"[ \t\r\n\f]*(\\,)[ \t\r\n\f]*" options:0 error:nil] matchHandler:trimSpaceHandler]]; - [self addTokenRecogniser:[CPWhiteSpaceRecogniser whiteSpaceRecogniser]]; - [self addTokenRecogniser:[CPKeywordRecogniser recogniserForKeyword:@":"]]; - [self addTokenRecogniser:[CPKeywordRecogniser recogniserForKeyword:@"."]]; - [self addTokenRecogniser:[CPKeywordRecogniser recogniserForKeyword:@"#"]]; - [self addTokenRecogniser:[CPKeywordRecogniser recogniserForKeyword:@"-"]]; - [self addTokenRecogniser:[CPKeywordRecogniser recogniserForKeyword:@"("]]; - [self addTokenRecogniser:[CPKeywordRecogniser recogniserForKeyword:@")"]]; - [self addTokenRecogniser:[CPKeywordRecogniser recogniserForKeyword:@"["]]; - [self addTokenRecogniser:[CPKeywordRecogniser recogniserForKeyword:@"]"]]; - [self addTokenRecogniser:[CPKeywordRecogniser recogniserForKeyword:@"*"]]; - [self addTokenRecogniser:[CPKeywordRecogniser recogniserForKeyword:@"@"]]; + [self addTokenRecogniser:[NUIPWhiteSpaceRecogniser whiteSpaceRecogniser]]; + [self addTokenRecogniser:[NUIPKeywordRecogniser recogniserForKeyword:@":"]]; + [self addTokenRecogniser:[NUIPKeywordRecogniser recogniserForKeyword:@"."]]; + [self addTokenRecogniser:[NUIPKeywordRecogniser recogniserForKeyword:@"#"]]; + [self addTokenRecogniser:[NUIPKeywordRecogniser recogniserForKeyword:@"-"]]; + [self addTokenRecogniser:[NUIPKeywordRecogniser recogniserForKeyword:@"("]]; + [self addTokenRecogniser:[NUIPKeywordRecogniser recogniserForKeyword:@")"]]; + [self addTokenRecogniser:[NUIPKeywordRecogniser recogniserForKeyword:@"["]]; + [self addTokenRecogniser:[NUIPKeywordRecogniser recogniserForKeyword:@"]"]]; + [self addTokenRecogniser:[NUIPKeywordRecogniser recogniserForKeyword:@"*"]]; + [self addTokenRecogniser:[NUIPKeywordRecogniser recogniserForKeyword:@"@"]]; return self; } diff --git a/CSSSelectorConverter/CSSSelectors.h b/CSSSelectorConverter/CSSSelectors.h index d4a830c..8808a81 100644 --- a/CSSSelectorConverter/CSSSelectors.h +++ b/CSSSelectorConverter/CSSSelectors.h @@ -7,9 +7,9 @@ // #import "CSSBaseSelector.h" -#import "CPParser.h" +#import "NUIPParser.h" -@interface CSSSelectors : CSSBaseSelector +@interface CSSSelectors : CSSBaseSelector @property (nonatomic, strong) NSMutableArray* selectors; diff --git a/CSSSelectorConverter/CSSSelectors.m b/CSSSelectorConverter/CSSSelectors.m index 8e3fb5e..47057eb 100644 --- a/CSSSelectorConverter/CSSSelectors.m +++ b/CSSSelectorConverter/CSSSelectors.m @@ -11,7 +11,7 @@ #define LOG_LEVEL_DEF cssSelectorLogLevel static const int cssSelectorLogLevel = LOG_LEVEL_VERBOSE; -#import "CoreParse.h" +#import "NUIParse.h" #import "CSSSelectors.h" #import "CSSCombinator.h" @@ -19,7 +19,7 @@ @implementation CSSSelectors -- (id)initWithSyntaxTree:(CPSyntaxTree *)syntaxTree { +- (id)initWithSyntaxTree:(NUIPSyntaxTree *)syntaxTree { self = [self init]; if (self) { CSSSelectorSequence* seq = [syntaxTree valueForTag:@"firstSequence"]; diff --git a/CSSSelectorConverter/CSSTypeSelector.h b/CSSSelectorConverter/CSSTypeSelector.h index 70bdcf9..1cf2c72 100644 --- a/CSSSelectorConverter/CSSTypeSelector.h +++ b/CSSSelectorConverter/CSSTypeSelector.h @@ -8,8 +8,8 @@ #import #import "CSSNamedSelector.h" -#import "CPParser.h" +#import "NUIPParser.h" -@interface CSSTypeSelector : CSSNamedSelector +@interface CSSTypeSelector : CSSNamedSelector @end diff --git a/CSSSelectorConverter/CSSTypeSelector.m b/CSSSelectorConverter/CSSTypeSelector.m index be58058..17e0417 100644 --- a/CSSSelectorConverter/CSSTypeSelector.m +++ b/CSSSelectorConverter/CSSTypeSelector.m @@ -7,16 +7,16 @@ // #import "CSSTypeSelector.h" -#import "CoreParse.h" +#import "NUIParse.h" @implementation CSSTypeSelector -- (id)initWithSyntaxTree:(CPSyntaxTree *)syntaxTree { +- (id)initWithSyntaxTree:(NUIPSyntaxTree *)syntaxTree { self = [self init]; if (self) { NSArray *components = [syntaxTree children]; if ([components count] == 1) { - CPIdentifierToken* token = components[0]; + NUIPIdentifierToken* token = components[0]; if ([token isIdentifierToken]) { self.name = [token identifier]; } diff --git a/CSSSelectorConverter/CSSUniversalSelector.h b/CSSSelectorConverter/CSSUniversalSelector.h index 5f6d3b0..3ce7c8e 100644 --- a/CSSSelectorConverter/CSSUniversalSelector.h +++ b/CSSSelectorConverter/CSSUniversalSelector.h @@ -8,8 +8,8 @@ #import #import "CSSTypeSelector.h" -#import "CPParser.h" +#import "NUIPParser.h" -@interface CSSUniversalSelector : CSSTypeSelector +@interface CSSUniversalSelector : CSSTypeSelector @end diff --git a/CSSSelectorConverter/CSSUniversalSelector.m b/CSSSelectorConverter/CSSUniversalSelector.m index b5ec721..ea0b47f 100644 --- a/CSSSelectorConverter/CSSUniversalSelector.m +++ b/CSSSelectorConverter/CSSUniversalSelector.m @@ -7,11 +7,11 @@ // #import "CSSUniversalSelector.h" -#import "CoreParse.h" +#import "NUIParse.h" @implementation CSSUniversalSelector -- (id)initWithSyntaxTree:(CPSyntaxTree *)syntaxTree { +- (id)initWithSyntaxTree:(NUIPSyntaxTree *)syntaxTree { return [self init]; } diff --git a/CSSSelectorConverterTests/CSSSelectorParserSpec.m b/CSSSelectorConverterTests/CSSSelectorParserSpec.m index 3d709ca..1854a73 100644 --- a/CSSSelectorConverterTests/CSSSelectorParserSpec.m +++ b/CSSSelectorConverterTests/CSSSelectorParserSpec.m @@ -8,7 +8,7 @@ #import #import "CSSSelectorParser.h" -#import "CoreParse.h" +#import "NUIParse.h" #import "CSSSelectorGrammar.h" #import "CSSSelectorTokeniser.h" diff --git a/CSSSelectorConverterTests/CSSSelectorTokeniserSpec.m b/CSSSelectorConverterTests/CSSSelectorTokeniserSpec.m index 919b9b3..f7d4a76 100644 --- a/CSSSelectorConverterTests/CSSSelectorTokeniserSpec.m +++ b/CSSSelectorConverterTests/CSSSelectorTokeniserSpec.m @@ -8,126 +8,126 @@ #import #import "CSSSelectorTokeniser.h" -#import "CoreParse.h" +#import "NUIParse.h" SPEC_BEGIN(CSSSelectorTokeniserSpec) describe(@"CSSSelectorTokeniser", ^{ it(@"tokenize basic css", ^{ CSSSelectorTokeniser* tokeniser = [[CSSSelectorTokeniser alloc] init]; - CPTokenStream *tokenStream = [tokeniser tokenise:@"table"]; - CPTokenStream *expected = [CPTokenStream tokenStreamWithTokens:[NSArray arrayWithObjects: - [CPIdentifierToken tokenWithIdentifier:@"table"], - [CPEOFToken eof], + NUIPTokenStream *tokenStream = [tokeniser tokenise:@"table"]; + NUIPTokenStream *expected = [NUIPTokenStream tokenStreamWithTokens:[NSArray arrayWithObjects: + [NUIPIdentifierToken tokenWithIdentifier:@"table"], + [NUIPEOFToken eof], nil]]; [[tokenStream should] equal:expected]; tokenStream = [tokeniser tokenise:@"table.a"]; - expected = [CPTokenStream tokenStreamWithTokens:@[ - [CPIdentifierToken tokenWithIdentifier:@"table"], - [CPKeywordToken tokenWithKeyword:@"."], - [CPIdentifierToken tokenWithIdentifier:@"a"], - [CPEOFToken eof] + expected = [NUIPTokenStream tokenStreamWithTokens:@[ + [NUIPIdentifierToken tokenWithIdentifier:@"table"], + [NUIPKeywordToken tokenWithKeyword:@"."], + [NUIPIdentifierToken tokenWithIdentifier:@"a"], + [NUIPEOFToken eof] ]]; [[tokenStream should] equal:expected]; }); it(@"tokenize complex selector", ^{ CSSSelectorTokeniser* tokeniser = [[CSSSelectorTokeniser alloc] init]; - CPTokenStream *tokenStream = [tokeniser tokenise:@"table a"]; - CPTokenStream *expected = [CPTokenStream tokenStreamWithTokens:@[ - [CPIdentifierToken tokenWithIdentifier:@"table"], - [CPWhiteSpaceToken whiteSpace:@" "], - [CPIdentifierToken tokenWithIdentifier:@"a"], - [CPEOFToken eof] + NUIPTokenStream *tokenStream = [tokeniser tokenise:@"table a"]; + NUIPTokenStream *expected = [NUIPTokenStream tokenStreamWithTokens:@[ + [NUIPIdentifierToken tokenWithIdentifier:@"table"], + [NUIPWhiteSpaceToken whiteSpace:@" "], + [NUIPIdentifierToken tokenWithIdentifier:@"a"], + [NUIPEOFToken eof] ]]; [[tokenStream should] equal:expected]; tokenStream = [tokeniser tokenise:@"table > a"]; - expected = [CPTokenStream tokenStreamWithTokens:@[ - [CPIdentifierToken tokenWithIdentifier:@"table"], - [CPKeywordToken tokenWithKeyword:@">"], - [CPIdentifierToken tokenWithIdentifier:@"a"], - [CPEOFToken eof] + expected = [NUIPTokenStream tokenStreamWithTokens:@[ + [NUIPIdentifierToken tokenWithIdentifier:@"table"], + [NUIPKeywordToken tokenWithKeyword:@">"], + [NUIPIdentifierToken tokenWithIdentifier:@"a"], + [NUIPEOFToken eof] ]]; [[tokenStream should] equal:expected]; tokenStream = [tokeniser tokenise:@"table ~ a"]; - expected = [CPTokenStream tokenStreamWithTokens:@[ - [CPIdentifierToken tokenWithIdentifier:@"table"], - [CPKeywordToken tokenWithKeyword:@"~"], - [CPIdentifierToken tokenWithIdentifier:@"a"], - [CPEOFToken eof] + expected = [NUIPTokenStream tokenStreamWithTokens:@[ + [NUIPIdentifierToken tokenWithIdentifier:@"table"], + [NUIPKeywordToken tokenWithKeyword:@"~"], + [NUIPIdentifierToken tokenWithIdentifier:@"a"], + [NUIPEOFToken eof] ]]; [[tokenStream should] equal:expected]; tokenStream = [tokeniser tokenise:@"table ~ a"]; - expected = [CPTokenStream tokenStreamWithTokens:@[ - [CPIdentifierToken tokenWithIdentifier:@"table"], - [CPKeywordToken tokenWithKeyword:@"~"], - [CPIdentifierToken tokenWithIdentifier:@"a"], - [CPEOFToken eof] + expected = [NUIPTokenStream tokenStreamWithTokens:@[ + [NUIPIdentifierToken tokenWithIdentifier:@"table"], + [NUIPKeywordToken tokenWithKeyword:@"~"], + [NUIPIdentifierToken tokenWithIdentifier:@"a"], + [NUIPEOFToken eof] ]]; [[tokenStream should] equal:expected]; tokenStream = [tokeniser tokenise:@"table , a"]; - expected = [CPTokenStream tokenStreamWithTokens:@[ - [CPIdentifierToken tokenWithIdentifier:@"table"], - [CPKeywordToken tokenWithKeyword:@","], - [CPIdentifierToken tokenWithIdentifier:@"a"], - [CPEOFToken eof] + expected = [NUIPTokenStream tokenStreamWithTokens:@[ + [NUIPIdentifierToken tokenWithIdentifier:@"table"], + [NUIPKeywordToken tokenWithKeyword:@","], + [NUIPIdentifierToken tokenWithIdentifier:@"a"], + [NUIPEOFToken eof] ]]; [[tokenStream should] equal:expected]; }); it(@"tokenize pseudo class", ^{ CSSSelectorTokeniser* tokeniser = [[CSSSelectorTokeniser alloc] init]; - CPTokenStream *tokenStream = [tokeniser tokenise:@"div > p:first-child"]; - CPTokenStream *expected = [CPTokenStream tokenStreamWithTokens:@[ - [CPIdentifierToken tokenWithIdentifier:@"div"], - [CPKeywordToken tokenWithKeyword:@">"], - [CPIdentifierToken tokenWithIdentifier:@"p"], - [CPKeywordToken tokenWithKeyword:@":"], - [CPIdentifierToken tokenWithIdentifier:@"first-child"], - [CPEOFToken eof]]]; + NUIPTokenStream *tokenStream = [tokeniser tokenise:@"div > p:first-child"]; + NUIPTokenStream *expected = [NUIPTokenStream tokenStreamWithTokens:@[ + [NUIPIdentifierToken tokenWithIdentifier:@"div"], + [NUIPKeywordToken tokenWithKeyword:@">"], + [NUIPIdentifierToken tokenWithIdentifier:@"p"], + [NUIPKeywordToken tokenWithKeyword:@":"], + [NUIPIdentifierToken tokenWithIdentifier:@"first-child"], + [NUIPEOFToken eof]]]; [[tokenStream should] equal:expected]; }); it(@"tokenize attribute", ^{ CSSSelectorTokeniser* tokeniser = [[CSSSelectorTokeniser alloc] init]; - CPTokenStream *tokenStream = [tokeniser tokenise:@"div[class~=\"100\"]"]; - CPTokenStream *expected = [CPTokenStream tokenStreamWithTokens:[NSArray arrayWithObjects: - [CPIdentifierToken tokenWithIdentifier:@"div"], - [CPKeywordToken tokenWithKeyword:@"["], - [CPIdentifierToken tokenWithIdentifier:@"class"], - [CPKeywordToken tokenWithKeyword:@"~="], - [CPQuotedToken content:@"100" quotedWith:@"\"" name:@"String"], - [CPKeywordToken tokenWithKeyword:@"]"], - [CPEOFToken eof], + NUIPTokenStream *tokenStream = [tokeniser tokenise:@"div[class~=\"100\"]"]; + NUIPTokenStream *expected = [NUIPTokenStream tokenStreamWithTokens:[NSArray arrayWithObjects: + [NUIPIdentifierToken tokenWithIdentifier:@"div"], + [NUIPKeywordToken tokenWithKeyword:@"["], + [NUIPIdentifierToken tokenWithIdentifier:@"class"], + [NUIPKeywordToken tokenWithKeyword:@"~="], + [NUIPQuotedToken content:@"100" quotedWith:@"\"" name:@"String"], + [NUIPKeywordToken tokenWithKeyword:@"]"], + [NUIPEOFToken eof], nil]]; [[tokenStream should] equal:expected]; tokenStream = [tokeniser tokenise:@"div[class |= \"100\"]"]; - expected = [CPTokenStream tokenStreamWithTokens:[NSArray arrayWithObjects: - [CPIdentifierToken tokenWithIdentifier:@"div"], - [CPKeywordToken tokenWithKeyword:@"["], - [CPIdentifierToken tokenWithIdentifier:@"class"], - [CPKeywordToken tokenWithKeyword:@"|="], - [CPQuotedToken content:@"100" quotedWith:@"\"" name:@"String"], - [CPKeywordToken tokenWithKeyword:@"]"], - [CPEOFToken eof], + expected = [NUIPTokenStream tokenStreamWithTokens:[NSArray arrayWithObjects: + [NUIPIdentifierToken tokenWithIdentifier:@"div"], + [NUIPKeywordToken tokenWithKeyword:@"["], + [NUIPIdentifierToken tokenWithIdentifier:@"class"], + [NUIPKeywordToken tokenWithKeyword:@"|="], + [NUIPQuotedToken content:@"100" quotedWith:@"\"" name:@"String"], + [NUIPKeywordToken tokenWithKeyword:@"]"], + [NUIPEOFToken eof], nil]]; [[tokenStream should] equal:expected]; tokenStream = [tokeniser tokenise:@"div[class = '100']"]; - expected = [CPTokenStream tokenStreamWithTokens:[NSArray arrayWithObjects: - [CPIdentifierToken tokenWithIdentifier:@"div"], - [CPKeywordToken tokenWithKeyword:@"["], - [CPIdentifierToken tokenWithIdentifier:@"class"], - [CPKeywordToken tokenWithKeyword:@"="], - [CPQuotedToken content:@"100" quotedWith:@"'" name:@"String"], - [CPKeywordToken tokenWithKeyword:@"]"], - [CPEOFToken eof], + expected = [NUIPTokenStream tokenStreamWithTokens:[NSArray arrayWithObjects: + [NUIPIdentifierToken tokenWithIdentifier:@"div"], + [NUIPKeywordToken tokenWithKeyword:@"["], + [NUIPIdentifierToken tokenWithIdentifier:@"class"], + [NUIPKeywordToken tokenWithKeyword:@"="], + [NUIPQuotedToken content:@"100" quotedWith:@"'" name:@"String"], + [NUIPKeywordToken tokenWithKeyword:@"]"], + [NUIPEOFToken eof], nil]]; [[tokenStream should] equal:expected]; }); diff --git a/CSSSelectorConverterTests/CSSSelectorXPathVisitorSpec.m b/CSSSelectorConverterTests/CSSSelectorXPathVisitorSpec.m index 47b1840..7293f74 100644 --- a/CSSSelectorConverterTests/CSSSelectorXPathVisitorSpec.m +++ b/CSSSelectorConverterTests/CSSSelectorXPathVisitorSpec.m @@ -18,7 +18,7 @@ #import "CSSCombinator.h" #import "CSSSelectorAttribute.h" #import "CSSSelectorAttributeOperator.h" -#import "CoreParse.h" +#import "NUIParse.h" SPEC_BEGIN(CSSSelectorXPathVisitorSpec) diff --git a/CSSSelectorConverterTests/CSSToXPathConverterSpec.m b/CSSSelectorConverterTests/CSSToXPathConverterSpec.m index fa4ea32..aef6f00 100644 --- a/CSSSelectorConverterTests/CSSToXPathConverterSpec.m +++ b/CSSSelectorConverterTests/CSSToXPathConverterSpec.m @@ -10,7 +10,7 @@ #import "DDLog.h" #import "DDTTYLogger.h" #import "CSSSelectorConverter.h" -#import "CoreParse.h" +#import "NUIParse.h" SPEC_BEGIN(CSSToXPathConverterSpec) __block CSSSelectorToXPathConverter *converter; diff --git a/Podfile b/Podfile index 7574807..7a9bc08 100644 --- a/Podfile +++ b/Podfile @@ -1,7 +1,8 @@ platform :ios, '7.0' -pod 'CocoaLumberjack' +pod 'CocoaLumberjack', '~> 1.9.0' +pod 'NUIParse' target :'CSSSelectorConverterTests' do - pod 'Kiwi/XCTest' + pod 'Kiwi', '>= 2.3.0' end \ No newline at end of file diff --git a/Podfile.lock b/Podfile.lock index 0cadf74..eae6f3f 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,22 +1,20 @@ PODS: - - CocoaLumberjack (1.7.0): - - CocoaLumberjack/Core + - CocoaLumberjack (1.9.2): - CocoaLumberjack/Extensions - - CocoaLumberjack/Core (1.7.0) - - CocoaLumberjack/Extensions (1.7.0): + - CocoaLumberjack/Core (1.9.2) + - CocoaLumberjack/Extensions (1.9.2): - CocoaLumberjack/Core - - Kiwi/ARC (2.2.3) - - Kiwi/NonARC (2.2.3) - - Kiwi/XCTest (2.2.3): - - Kiwi/ARC - - Kiwi/NonARC + - Kiwi (2.3.0) + - NUIParse (1.2.1) DEPENDENCIES: - - CocoaLumberjack - - Kiwi/XCTest + - CocoaLumberjack (~> 1.9.0) + - Kiwi (>= 2.3.0) + - NUIParse SPEC CHECKSUMS: - CocoaLumberjack: be87113f649942f020a37c061c58009b6ee5ff68 - Kiwi: 04c51e880831d291748ec702d42c4101f7eb95c9 + CocoaLumberjack: 205769c032b5fef85b92472046bcc8b7e7c8a817 + Kiwi: 54bece5b35564d9b8e03c608d926f1a22fcfc589 + NUIParse: f29eb240cfc9848b216c827884f37ae64abd19e4 -COCOAPODS: 0.29.0 +COCOAPODS: 0.34.0.rc1 diff --git a/vendor/CoreParse b/vendor/CoreParse deleted file mode 160000 index a429b6b..0000000 --- a/vendor/CoreParse +++ /dev/null @@ -1 +0,0 @@ -Subproject commit a429b6b7c6a715bb1b5fd10cba42aaf3301a86a2 From 646e12b85f6e322ce3f037ddd8357f29dd222e72 Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Mon, 10 Nov 2014 12:43:42 +0800 Subject: [PATCH 33/52] workaround for unit test isKindOfClass: error, simply compare string name for class in such case --- CSSSelectorConverter/CSSSelectorXPathVisitor.m | 3 ++- Podfile.lock | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CSSSelectorConverter/CSSSelectorXPathVisitor.m b/CSSSelectorConverter/CSSSelectorXPathVisitor.m index 759286a..0952734 100644 --- a/CSSSelectorConverter/CSSSelectorXPathVisitor.m +++ b/CSSSelectorConverter/CSSSelectorXPathVisitor.m @@ -153,7 +153,8 @@ -(void) visitCSSCombinator:(CSSCombinator*)node -(void) visitCSSSelectors:(CSSSelectors*)node { [node.selectors enumerateObjectsUsingBlock:^(CSSBaseSelector* selector, NSUInteger idx, BOOL *stop) { - if ([selector isKindOfClass:[CSSSelectorSequence class]]) { + if ([selector isKindOfClass:[CSSSelectorSequence class]] || + [NSStringFromClass([selector class]) isEqualToString:NSStringFromClass([CSSSelectorSequence class])]) { // work around for isKindOfClass: match error in unit test // if not specified, the combinator is none if (idx == 0 || ![[node.selectors objectAtIndex:idx - 1] isKindOfClass:[CSSCombinator class]]) { [self visit:[CSSCombinator noneCombinator]]; diff --git a/Podfile.lock b/Podfile.lock index eae6f3f..3b9fda9 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -17,4 +17,4 @@ SPEC CHECKSUMS: Kiwi: 54bece5b35564d9b8e03c608d926f1a22fcfc589 NUIParse: f29eb240cfc9848b216c827884f37ae64abd19e4 -COCOAPODS: 0.34.0.rc1 +COCOAPODS: 0.34.4 From 954b6601f6267c2aea366942fcd586198d8a460b Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Mon, 10 Nov 2014 12:44:25 +0800 Subject: [PATCH 34/52] bump version --- CSSSelectorConverter.podspec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CSSSelectorConverter.podspec b/CSSSelectorConverter.podspec index b563865..aea7dbb 100644 --- a/CSSSelectorConverter.podspec +++ b/CSSSelectorConverter.podspec @@ -1,12 +1,12 @@ Pod::Spec.new do |s| s.name = 'CSSSelectorConverter' - s.version = '1.1.2' + s.version = '1.1.3' s.license = 'MIT' s.summary = 'Objective-C/Cocoa String Tokenizer and Parser toolkit. Supports Grammars.' s.homepage = 'https://github.com/siuying/CSSSelectorConverter' s.author = { 'Francis Chong' => 'francis@ignition.hk' } - s.source = { :git => 'https://github.com/siuying/CSSSelectorConverter.git', :tag => '1.1.2'} + s.source = { :git => 'https://github.com/siuying/CSSSelectorConverter.git', :tag => s.version.to_s } s.description = %{ A CSS Selector to XPath Selector for Objective-C. Support mostly used subset of CSS Selector Level 3. From d95c5a2e1fb596bb2d569a97c886b6373bea4273 Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Mon, 10 Nov 2014 12:58:46 +0800 Subject: [PATCH 35/52] workaround more matching error related in unit test, related to isKindOfClass: --- CSSSelectorConverter/CSSSelectorXPathVisitor.m | 12 ++++++------ CSSSelectorConverterTests/CSSToXPathConverterSpec.m | 5 +++++ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/CSSSelectorConverter/CSSSelectorXPathVisitor.m b/CSSSelectorConverter/CSSSelectorXPathVisitor.m index 0952734..ae625ae 100644 --- a/CSSSelectorConverter/CSSSelectorXPathVisitor.m +++ b/CSSSelectorConverter/CSSSelectorXPathVisitor.m @@ -153,12 +153,12 @@ -(void) visitCSSCombinator:(CSSCombinator*)node -(void) visitCSSSelectors:(CSSSelectors*)node { [node.selectors enumerateObjectsUsingBlock:^(CSSBaseSelector* selector, NSUInteger idx, BOOL *stop) { - if ([selector isKindOfClass:[CSSSelectorSequence class]] || - [NSStringFromClass([selector class]) isEqualToString:NSStringFromClass([CSSSelectorSequence class])]) { // work around for isKindOfClass: match error in unit test - // if not specified, the combinator is none - if (idx == 0 || ![[node.selectors objectAtIndex:idx - 1] isKindOfClass:[CSSCombinator class]]) { - [self visit:[CSSCombinator noneCombinator]]; - } + // added NSStringFromClass() to work around for isKindOfClass: match error in unit test + BOOL isSequence = [selector isKindOfClass:[CSSSelectorSequence class]] || [NSStringFromClass([selector class]) isEqualToString:NSStringFromClass([CSSSelectorSequence class])]; + BOOL hasCombinator = idx == 0 || (![[node.selectors objectAtIndex:idx - 1] isKindOfClass:[CSSCombinator class]] && ![NSStringFromClass([[node.selectors objectAtIndex:idx - 1] class]) isEqualToString:NSStringFromClass([CSSCombinator class])]); + + if (isSequence && hasCombinator) { + [self visit:[CSSCombinator noneCombinator]]; } [self visit:selector]; }]; diff --git a/CSSSelectorConverterTests/CSSToXPathConverterSpec.m b/CSSSelectorConverterTests/CSSToXPathConverterSpec.m index aef6f00..6f4a4c2 100644 --- a/CSSSelectorConverterTests/CSSToXPathConverterSpec.m +++ b/CSSSelectorConverterTests/CSSToXPathConverterSpec.m @@ -38,6 +38,11 @@ NSString* css = [converter xpathWithCSS:@"p" error:nil]; [[css should] equal:@"//p"]; }); + + it(@"should parse multiple type selector", ^{ + NSString* css = [converter xpathWithCSS:@"h3 strong a, #fbPhotoPageAuthorName, title" error:nil]; + [[css should] equal:@"//h3//strong//a | //*[@id = 'fbPhotoPageAuthorName'] | //title"]; + }); it(@"should parse id selector", ^{ NSString* css = [converter xpathWithCSS:@"#header" error:nil]; From 91f3625eb382dd864c7d83164aebd74c0d51072c Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Mon, 10 Nov 2014 12:59:21 +0800 Subject: [PATCH 36/52] 1.1.4 --- CSSSelectorConverter.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CSSSelectorConverter.podspec b/CSSSelectorConverter.podspec index aea7dbb..e0af26d 100644 --- a/CSSSelectorConverter.podspec +++ b/CSSSelectorConverter.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'CSSSelectorConverter' - s.version = '1.1.3' + s.version = '1.1.4' s.license = 'MIT' s.summary = 'Objective-C/Cocoa String Tokenizer and Parser toolkit. Supports Grammars.' s.homepage = 'https://github.com/siuying/CSSSelectorConverter' From c24276c9ad0aa2f953d325e4ac8a61de3d31325b Mon Sep 17 00:00:00 2001 From: Ole Gammelgaard Poulsen Date: Fri, 9 Jan 2015 12:34:47 +0100 Subject: [PATCH 37/52] Fixed podspec resource pattern to not include the demo app info plist file (CSSSelectorConverter/CSSSelectorConverter-Info.plist) --- CSSSelectorConverter.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CSSSelectorConverter.podspec b/CSSSelectorConverter.podspec index e0af26d..0e2ad51 100644 --- a/CSSSelectorConverter.podspec +++ b/CSSSelectorConverter.podspec @@ -22,5 +22,5 @@ Pod::Spec.new do |s| s.source_files = 'CSSSelectorConverter/CSS*.{m,h}' s.prefix_header_contents = "#import \"CSSSelectorConverter.h\"" s.requires_arc = true - s.resources = 'CSSSelectorConverter/*.{txt,plist}' + s.resources = ['CSSSelectorConverter/*.{txt}', 'CSSSelectorConverter/CSSSelectorParser.plist'] end From 2ca4c87651d96b4623c2237a96ac6d1bf062acd9 Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Tue, 20 Jan 2015 11:34:25 +0800 Subject: [PATCH 38/52] bump version --- CSSSelectorConverter.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CSSSelectorConverter.podspec b/CSSSelectorConverter.podspec index 0e2ad51..3f8758c 100644 --- a/CSSSelectorConverter.podspec +++ b/CSSSelectorConverter.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'CSSSelectorConverter' - s.version = '1.1.4' + s.version = '1.1.5' s.license = 'MIT' s.summary = 'Objective-C/Cocoa String Tokenizer and Parser toolkit. Supports Grammars.' s.homepage = 'https://github.com/siuying/CSSSelectorConverter' From 8d23b0ddac5f5be5b93051c66f70c5909a12106c Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Tue, 20 Jan 2015 11:42:04 +0800 Subject: [PATCH 39/52] install gems and pods before test --- .travis.yml | 2 ++ Podfile.lock | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1ebe701..223b8c3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,4 +3,6 @@ language: objective-c before_script: - export LANG=en_US.UTF-8 - gem install xcpretty + - bundle install + - pod install script: xcodebuild -workspace CSSSelectorConverter.xcworkspace -scheme CSSSelectorConverter -sdk iphonesimulator test | xcpretty -c; exit ${PIPESTATUS[0]} diff --git a/Podfile.lock b/Podfile.lock index 3b9fda9..a3d72df 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,6 +1,6 @@ PODS: - CocoaLumberjack (1.9.2): - - CocoaLumberjack/Extensions + - CocoaLumberjack/Extensions (= 1.9.2) - CocoaLumberjack/Core (1.9.2) - CocoaLumberjack/Extensions (1.9.2): - CocoaLumberjack/Core @@ -17,4 +17,4 @@ SPEC CHECKSUMS: Kiwi: 54bece5b35564d9b8e03c608d926f1a22fcfc589 NUIParse: f29eb240cfc9848b216c827884f37ae64abd19e4 -COCOAPODS: 0.34.4 +COCOAPODS: 0.35.0 From cf9f697b60a8b8766b430ea79608cb8051fd10c7 Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Tue, 20 Jan 2015 11:46:01 +0800 Subject: [PATCH 40/52] skip pod install --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 223b8c3..81910a7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,5 @@ language: objective-c before_script: - export LANG=en_US.UTF-8 - gem install xcpretty - - bundle install - pod install script: xcodebuild -workspace CSSSelectorConverter.xcworkspace -scheme CSSSelectorConverter -sdk iphonesimulator test | xcpretty -c; exit ${PIPESTATUS[0]} From 3f8f668345ba5e2e8ff7dce56ee971b7ad9f3e11 Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Fri, 27 Mar 2015 17:54:27 +0800 Subject: [PATCH 41/52] remove unused log (clear warnings) --- CSSSelectorConverter/CSSCombinator.m | 5 ----- CSSSelectorConverter/CSSPseudoClass.m | 5 ----- CSSSelectorConverter/CSSSelectorAttribute.m | 5 ----- CSSSelectorConverter/CSSSelectorGroup.m | 5 ----- CSSSelectorConverter/CSSSelectorToXPathConverter.m | 4 ---- CSSSelectorConverter/CSSSelectors.m | 7 ------- Podfile.lock | 2 +- 7 files changed, 1 insertion(+), 32 deletions(-) diff --git a/CSSSelectorConverter/CSSCombinator.m b/CSSSelectorConverter/CSSCombinator.m index c85b886..18355b7 100644 --- a/CSSSelectorConverter/CSSCombinator.m +++ b/CSSSelectorConverter/CSSCombinator.m @@ -7,13 +7,8 @@ // #import "CSSCombinator.h" -#import "DDLog.h" #import "NUIParse.h" -#undef LOG_LEVEL_DEF -#define LOG_LEVEL_DEF cssSelectorLogLevel -static const int cssSelectorLogLevel = LOG_LEVEL_WARN; - @implementation CSSCombinator - (id)initWithSyntaxTree:(NUIPSyntaxTree *)syntaxTree { diff --git a/CSSSelectorConverter/CSSPseudoClass.m b/CSSSelectorConverter/CSSPseudoClass.m index 0c2e9c1..6214c8e 100644 --- a/CSSSelectorConverter/CSSPseudoClass.m +++ b/CSSSelectorConverter/CSSPseudoClass.m @@ -5,11 +5,6 @@ // Created by Chong Francis on 14年1月8日. // Copyright (c) 2014年 Ignition Soft. All rights reserved. // -#import "DDLog.h" -#undef LOG_LEVEL_DEF -#define LOG_LEVEL_DEF cssSelectorLogLevel -static const int cssSelectorLogLevel = LOG_LEVEL_WARN; - #import "CSSPseudoClass.h" #import "NUIParse.h" diff --git a/CSSSelectorConverter/CSSSelectorAttribute.m b/CSSSelectorConverter/CSSSelectorAttribute.m index 94b6375..389260d 100644 --- a/CSSSelectorConverter/CSSSelectorAttribute.m +++ b/CSSSelectorConverter/CSSSelectorAttribute.m @@ -8,11 +8,6 @@ #import "CSSSelectorParser.h" #import "CSSSelectorAttribute.h" -#import "DDLog.h" - -#undef LOG_LEVEL_DEF -#define LOG_LEVEL_DEF cssSelectorLogLevel -static const int cssSelectorLogLevel = LOG_LEVEL_VERBOSE; #import "NUIParse.h" @implementation CSSSelectorAttribute diff --git a/CSSSelectorConverter/CSSSelectorGroup.m b/CSSSelectorConverter/CSSSelectorGroup.m index 1bc1f39..b89fb40 100644 --- a/CSSSelectorConverter/CSSSelectorGroup.m +++ b/CSSSelectorConverter/CSSSelectorGroup.m @@ -9,11 +9,6 @@ #import "CSSSelectorGroup.h" #import "NUIParse.h" -#import "DDLog.h" -#undef LOG_LEVEL_DEF -#define LOG_LEVEL_DEF cssSelectorLogLevel -static const int cssSelectorLogLevel = LOG_LEVEL_VERBOSE; - @implementation CSSSelectorGroup - (id)initWithSyntaxTree:(NUIPSyntaxTree *)syntaxTree { diff --git a/CSSSelectorConverter/CSSSelectorToXPathConverter.m b/CSSSelectorConverter/CSSSelectorToXPathConverter.m index 93e3392..1ea74b5 100644 --- a/CSSSelectorConverter/CSSSelectorToXPathConverter.m +++ b/CSSSelectorConverter/CSSSelectorToXPathConverter.m @@ -5,10 +5,6 @@ // Created by Francis Chong on 7/1/14. // Copyright (c) 2014 Ignition Soft. All rights reserved. // -#import "DDLog.h" -#undef LOG_LEVEL_DEF -#define LOG_LEVEL_DEF cssSelectorLogLevel -static const int cssSelectorLogLevel = LOG_LEVEL_VERBOSE; #import "CSSSelectorToXPathConverter.h" #import "CSSBaseSelector.h" diff --git a/CSSSelectorConverter/CSSSelectors.m b/CSSSelectorConverter/CSSSelectors.m index 47057eb..1cfc9a1 100644 --- a/CSSSelectorConverter/CSSSelectors.m +++ b/CSSSelectorConverter/CSSSelectors.m @@ -5,14 +5,7 @@ // Created by Francis Chong on 7/1/14. // Copyright (c) 2014 Ignition Soft. All rights reserved. // - -#import "DDLog.h" -#undef LOG_LEVEL_DEF -#define LOG_LEVEL_DEF cssSelectorLogLevel -static const int cssSelectorLogLevel = LOG_LEVEL_VERBOSE; - #import "NUIParse.h" - #import "CSSSelectors.h" #import "CSSCombinator.h" #import "CSSSelectorSequence.h" diff --git a/Podfile.lock b/Podfile.lock index a3d72df..312ea2b 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -17,4 +17,4 @@ SPEC CHECKSUMS: Kiwi: 54bece5b35564d9b8e03c608d926f1a22fcfc589 NUIParse: f29eb240cfc9848b216c827884f37ae64abd19e4 -COCOAPODS: 0.35.0 +COCOAPODS: 0.36.1 From 904de154f871b9accae113a98a0023b724bd9a34 Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Fri, 27 Mar 2015 17:55:53 +0800 Subject: [PATCH 42/52] update podspec to only expose CSSSelectorToXPathConverter.h --- CSSSelectorConverter.podspec | 1 + CSSSelectorConverter/CSSSelectorConverter.h | 15 --------------- .../CSSSelectorToXPathConverter.h | 3 ++- .../CSSSelectorToXPathConverter.m | 2 +- 4 files changed, 4 insertions(+), 17 deletions(-) diff --git a/CSSSelectorConverter.podspec b/CSSSelectorConverter.podspec index 3f8758c..bed21aa 100644 --- a/CSSSelectorConverter.podspec +++ b/CSSSelectorConverter.podspec @@ -19,6 +19,7 @@ Pod::Spec.new do |s| s.dependency 'NUIParse' s.requires_arc = true + s.public_header_files = "CSSSelectorConverter/CSSSelectorConverter.h", "CSSSelectorConverter/CSSSelectorToXPathConverter.h" s.source_files = 'CSSSelectorConverter/CSS*.{m,h}' s.prefix_header_contents = "#import \"CSSSelectorConverter.h\"" s.requires_arc = true diff --git a/CSSSelectorConverter/CSSSelectorConverter.h b/CSSSelectorConverter/CSSSelectorConverter.h index 212159a..53f6605 100644 --- a/CSSSelectorConverter/CSSSelectorConverter.h +++ b/CSSSelectorConverter/CSSSelectorConverter.h @@ -9,20 +9,5 @@ #ifndef _CSSSelectorConverter_ #define _CSSSelectorConverter_ -#import "CSSUniversalSelector.h" -#import "CSSNamedSelector.h" -#import "CSSTypeSelector.h" -#import "CSSIDSelector.h" -#import "CSSClassSelector.h" -#import "CSSSelectorSequence.h" -#import "CSSSelectors.h" -#import "CSSSelectorGroup.h" -#import "CSSSelectorParser.h" #import "CSSSelectorToXPathConverter.h" -#import "CSSSelectorAttribute.h" -#import "CSSNamedSelector.h" -#import "CSSCombinator.h" -#import "CSSNamedSelector.h" -#import "CSSPseudoClass.h" - #endif diff --git a/CSSSelectorConverter/CSSSelectorToXPathConverter.h b/CSSSelectorConverter/CSSSelectorToXPathConverter.h index af47a29..a16c5a9 100644 --- a/CSSSelectorConverter/CSSSelectorToXPathConverter.h +++ b/CSSSelectorConverter/CSSSelectorToXPathConverter.h @@ -7,7 +7,8 @@ // #import -#import "CSSSelectorParser.h" + +@class CSSSelectorParser; /** * Convert a CSS Selector to XPath. diff --git a/CSSSelectorConverter/CSSSelectorToXPathConverter.m b/CSSSelectorConverter/CSSSelectorToXPathConverter.m index 1ea74b5..9a00c90 100644 --- a/CSSSelectorConverter/CSSSelectorToXPathConverter.m +++ b/CSSSelectorConverter/CSSSelectorToXPathConverter.m @@ -5,7 +5,7 @@ // Created by Francis Chong on 7/1/14. // Copyright (c) 2014 Ignition Soft. All rights reserved. // - +#import "CSSSelectorParser.h" #import "CSSSelectorToXPathConverter.h" #import "CSSBaseSelector.h" #import "CSSSelectorXPathVisitor.h" From 2e323d063e91cc2a56ad5da30962eddbf7ed5bcd Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Fri, 27 Mar 2015 17:56:42 +0800 Subject: [PATCH 43/52] update to 1.2.0 --- CSSSelectorConverter.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CSSSelectorConverter.podspec b/CSSSelectorConverter.podspec index bed21aa..fb87051 100644 --- a/CSSSelectorConverter.podspec +++ b/CSSSelectorConverter.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'CSSSelectorConverter' - s.version = '1.1.5' + s.version = '1.2.0' s.license = 'MIT' s.summary = 'Objective-C/Cocoa String Tokenizer and Parser toolkit. Supports Grammars.' s.homepage = 'https://github.com/siuying/CSSSelectorConverter' From 6e58bf9e72bf1ac36605e02cbd4901b7a5f7356d Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Sat, 28 Mar 2015 00:26:10 +0800 Subject: [PATCH 44/52] update readme --- .gitmodules | 0 README.md | 1 - 2 files changed, 1 deletion(-) delete mode 100644 .gitmodules diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index e69de29..0000000 diff --git a/README.md b/README.md index 02741fe..b6982da 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,6 @@ Following pseduo classes will not be supported: 1. Install cocoapods 2. Install pods: ``pod install`` -3. Get submodule (CoreParse): ``git submodule update --init`` ## License From 6bdfcb038217c325614f9cce317c76a7758da908 Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Sat, 28 Mar 2015 13:01:40 +0800 Subject: [PATCH 45/52] update pods --- Podfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Podfile.lock b/Podfile.lock index 312ea2b..567bac8 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -4,7 +4,7 @@ PODS: - CocoaLumberjack/Core (1.9.2) - CocoaLumberjack/Extensions (1.9.2): - CocoaLumberjack/Core - - Kiwi (2.3.0) + - Kiwi (2.3.1) - NUIParse (1.2.1) DEPENDENCIES: @@ -14,7 +14,7 @@ DEPENDENCIES: SPEC CHECKSUMS: CocoaLumberjack: 205769c032b5fef85b92472046bcc8b7e7c8a817 - Kiwi: 54bece5b35564d9b8e03c608d926f1a22fcfc589 + Kiwi: 73e1400209055ee9c8ba78c6012b6b642d0fb9f7 NUIParse: f29eb240cfc9848b216c827884f37ae64abd19e4 COCOAPODS: 0.36.1 From f189f9e13d9abc4547a5e647dd67551364b42b0c Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Sat, 28 Mar 2015 13:01:57 +0800 Subject: [PATCH 46/52] add shared instance of the converter --- CSSSelectorConverter/CSSSelectorToXPathConverter.h | 2 ++ CSSSelectorConverter/CSSSelectorToXPathConverter.m | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/CSSSelectorConverter/CSSSelectorToXPathConverter.h b/CSSSelectorConverter/CSSSelectorToXPathConverter.h index a16c5a9..279560f 100644 --- a/CSSSelectorConverter/CSSSelectorToXPathConverter.h +++ b/CSSSelectorConverter/CSSSelectorToXPathConverter.h @@ -20,6 +20,8 @@ @property (nonatomic, strong) CSSSelectorParser* parser; ++(instancetype) sharedConverter; + -(id) init; -(id) initWithParser:(CSSSelectorParser*)parser; diff --git a/CSSSelectorConverter/CSSSelectorToXPathConverter.m b/CSSSelectorConverter/CSSSelectorToXPathConverter.m index 9a00c90..1ca0309 100644 --- a/CSSSelectorConverter/CSSSelectorToXPathConverter.m +++ b/CSSSelectorConverter/CSSSelectorToXPathConverter.m @@ -12,6 +12,16 @@ @implementation CSSSelectorToXPathConverter ++(instancetype) sharedConverter +{ + static dispatch_once_t onceToken; + static CSSSelectorToXPathConverter* _converter; + dispatch_once(&onceToken, ^{ + _converter = [[self alloc] init]; + }); + return _converter; +} + -(id) initWithParser:(CSSSelectorParser*)parser { self = [super init]; self.parser = parser; From 37cb6d6e4f3a5555375bd1667487df48aee3215a Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Sat, 28 Mar 2015 13:08:25 +0800 Subject: [PATCH 47/52] 1.2.1 --- CHANGELOG.md | 15 +++++++ CSSSelectorConverter.podspec | 2 +- .../CSSSelectorParserSpec.m | 40 +++++++------------ 3 files changed, 30 insertions(+), 27 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f32cd60..df37db5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,21 @@ Changelog --------- +1.2.1 +----- + +- Added [CSSSelectorToXPathConverter sharedConverter]. + +1.2.0 +----- + +- Update podspec to only expose minimal files. + +1.1.2 +----- + +- Use NUIParse. + 1.1.0 (28/01/2014) ------------------ diff --git a/CSSSelectorConverter.podspec b/CSSSelectorConverter.podspec index fb87051..57505ad 100644 --- a/CSSSelectorConverter.podspec +++ b/CSSSelectorConverter.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'CSSSelectorConverter' - s.version = '1.2.0' + s.version = '1.2.1' s.license = 'MIT' s.summary = 'Objective-C/Cocoa String Tokenizer and Parser toolkit. Supports Grammars.' s.homepage = 'https://github.com/siuying/CSSSelectorConverter' diff --git a/CSSSelectorConverterTests/CSSSelectorParserSpec.m b/CSSSelectorConverterTests/CSSSelectorParserSpec.m index 1854a73..ed51623 100644 --- a/CSSSelectorConverterTests/CSSSelectorParserSpec.m +++ b/CSSSelectorConverterTests/CSSSelectorParserSpec.m @@ -15,33 +15,21 @@ SPEC_BEGIN(CSSSelectorParserSpec) describe(@"CSSSelectorParser", ^{ - it(@"parse css", ^{ - CSSSelectorParser *parser = [[CSSSelectorParser alloc] init]; - CSSSelectorGroup* tree = [parser parse:@"table:first-child" error:nil]; - [[tree shouldNot] beNil]; - NSLog(@"result = %@", tree); + context(@"serialization", ^{ + xit(@"should serialize and deserialize a parser", ^{ + CSSSelectorTokeniser* tokenizer1 = [[CSSSelectorTokeniser alloc] init]; + CSSSelectorTokeniser* tokenizer2 = [[CSSSelectorTokeniser alloc] init]; + + NUIPLALR1Parser* parser1 = [NUIPLALR1Parser parserWithGrammar:[[CSSSelectorGrammar alloc] initWithPath:[[NSBundle bundleForClass:[self class]] pathForResource:@"CSSSelectorGrammar" ofType:@"txt"]]]; + NUIPSyntaxTree* result1 = [parser1 parse:[tokenizer1 tokenise:@"title .article"]]; + + NSData* data = [NSKeyedArchiver archivedDataWithRootObject:parser1]; + NUIPLALR1Parser *parser2 = [NSKeyedUnarchiver unarchiveObjectWithData:data]; + NUIPSyntaxTree* result2 = [parser2 parse:[tokenizer2 tokenise:@"title .article"]]; + + [[result1 should] equal:result2]; + }); }); - -// context(@"serialization", ^{ -// it(@"should serialize and deserialize a parser", ^{ -// NSString* path = [[NSBundle bundleForClass:[CSSSelectorGrammar class]] pathForResource:@"CSSSelectorGrammar" ofType:@"txt"]; -// CPGrammar* grammar1 = [[CPGrammar alloc] initWithStart:@"CSSSelectorGroup" backusNaurForm:[[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil] error:nil]; -// -// NSString* outputFile = [NSTemporaryDirectory() stringByAppendingPathComponent:@"grammar.plist"]; -// [NSKeyedArchiver archiveRootObject:@{@"grammar" : grammar1} -// toFile:outputFile]; -// -// CPGrammar* grammar2 = [NSKeyedUnarchiver unarchiveObjectWithFile:outputFile][@"grammar"]; -// [[grammar2 should] equal:grammar1]; -// [[[grammar2 allRules] should] equal:[grammar1 allRules]]; -// -// CSSSelectorTokeniser* tokeniser = [[CSSSelectorTokeniser alloc] init]; -// CPTokenStream *tokenStream = [tokeniser tokenise:@"table"]; -// CPParser* parser = [CPLALR1Parser parserWithGrammar:grammar2]; -// id result = [parser parse:tokenStream]; -// NSLog(@"result = %@", result); -// }); -// }); }); SPEC_END From dc101e08d608d139c9c6a10c6679f592145f5b88 Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Tue, 26 Jan 2016 12:39:04 +0800 Subject: [PATCH 48/52] Update CSSSelectorConverter --- CSSSelectorConverter.podspec | 2 +- .../project.pbxproj | 32 +++++++++++++++++++ Podfile | 2 +- Podfile.lock | 25 ++++++++------- 4 files changed, 48 insertions(+), 13 deletions(-) diff --git a/CSSSelectorConverter.podspec b/CSSSelectorConverter.podspec index 57505ad..d284d04 100644 --- a/CSSSelectorConverter.podspec +++ b/CSSSelectorConverter.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'CSSSelectorConverter' - s.version = '1.2.1' + s.version = '1.2.2' s.license = 'MIT' s.summary = 'Objective-C/Cocoa String Tokenizer and Parser toolkit. Supports Grammars.' s.homepage = 'https://github.com/siuying/CSSSelectorConverter' diff --git a/CSSSelectorConverter.xcodeproj/project.pbxproj b/CSSSelectorConverter.xcodeproj/project.pbxproj index 18c5279..6fdcadc 100644 --- a/CSSSelectorConverter.xcodeproj/project.pbxproj +++ b/CSSSelectorConverter.xcodeproj/project.pbxproj @@ -322,6 +322,7 @@ 540AA345187BC5F60012AA44 /* Frameworks */, 540AA346187BC5F60012AA44 /* Resources */, D4177FD04A764743819E8D91 /* Copy Pods Resources */, + CCBB5AE69B0EE716A45BE69F /* Embed Pods Frameworks */, ); buildRules = ( ); @@ -341,6 +342,7 @@ 540AA369187BC5F70012AA44 /* Frameworks */, 540AA36A187BC5F70012AA44 /* Resources */, B54882A65CA547AA967484DE /* Copy Pods Resources */, + 36C248A9A97CC7EC8A6F38F8 /* Embed Pods Frameworks */, ); buildRules = ( ); @@ -427,6 +429,21 @@ shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; showEnvVarsInLog = 0; }; + 36C248A9A97CC7EC8A6F38F8 /* Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-CSSSelectorConverterTests/Pods-CSSSelectorConverterTests-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; B54882A65CA547AA967484DE /* Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -442,6 +459,21 @@ shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-CSSSelectorConverterTests/Pods-CSSSelectorConverterTests-resources.sh\"\n"; showEnvVarsInLog = 0; }; + CCBB5AE69B0EE716A45BE69F /* Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; D4177FD04A764743819E8D91 /* Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; diff --git a/Podfile b/Podfile index 7a9bc08..f299695 100644 --- a/Podfile +++ b/Podfile @@ -1,6 +1,6 @@ platform :ios, '7.0' -pod 'CocoaLumberjack', '~> 1.9.0' +pod 'CocoaLumberjack', '~> 2.0' pod 'NUIParse' target :'CSSSelectorConverterTests' do diff --git a/Podfile.lock b/Podfile.lock index 567bac8..4a3c844 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,20 +1,23 @@ PODS: - - CocoaLumberjack (1.9.2): - - CocoaLumberjack/Extensions (= 1.9.2) - - CocoaLumberjack/Core (1.9.2) - - CocoaLumberjack/Extensions (1.9.2): + - CocoaLumberjack (2.2.0): + - CocoaLumberjack/Default (= 2.2.0) + - CocoaLumberjack/Extensions (= 2.2.0) + - CocoaLumberjack/Core (2.2.0) + - CocoaLumberjack/Default (2.2.0): - CocoaLumberjack/Core - - Kiwi (2.3.1) - - NUIParse (1.2.1) + - CocoaLumberjack/Extensions (2.2.0): + - CocoaLumberjack/Default + - Kiwi (2.4.0) + - NUIParse (1.3) DEPENDENCIES: - - CocoaLumberjack (~> 1.9.0) + - CocoaLumberjack (~> 2.0) - Kiwi (>= 2.3.0) - NUIParse SPEC CHECKSUMS: - CocoaLumberjack: 205769c032b5fef85b92472046bcc8b7e7c8a817 - Kiwi: 73e1400209055ee9c8ba78c6012b6b642d0fb9f7 - NUIParse: f29eb240cfc9848b216c827884f37ae64abd19e4 + CocoaLumberjack: 17fe8581f84914d5d7e6360f7c70022b173c3ae0 + Kiwi: f49c9d54b28917df5928fe44968a39ed198cb8a8 + NUIParse: 2e3885ba7807477266396292626bd387d34c2338 -COCOAPODS: 0.36.1 +COCOAPODS: 0.39.0 From cdbff9e2b6614c53a585ce76677a5402b7a339bb Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Tue, 26 Jan 2016 12:42:02 +0800 Subject: [PATCH 49/52] bump version - 1.2.3 --- CSSSelectorConverter.podspec | 4 +-- .../CSSSelectorConverter.xcscmblueprint | 30 +++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 CSSSelectorConverter.xcworkspace/xcshareddata/CSSSelectorConverter.xcscmblueprint diff --git a/CSSSelectorConverter.podspec b/CSSSelectorConverter.podspec index d284d04..27d9fa6 100644 --- a/CSSSelectorConverter.podspec +++ b/CSSSelectorConverter.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'CSSSelectorConverter' - s.version = '1.2.2' + s.version = '1.2.3' s.license = 'MIT' s.summary = 'Objective-C/Cocoa String Tokenizer and Parser toolkit. Supports Grammars.' s.homepage = 'https://github.com/siuying/CSSSelectorConverter' @@ -15,7 +15,7 @@ Pod::Spec.new do |s| s.ios.deployment_target = '6.0' s.osx.deployment_target = '10.8' - s.dependency 'CocoaLumberjack', '~> 1.9.0' + s.dependency 'CocoaLumberjack', '~> 2.0.0' s.dependency 'NUIParse' s.requires_arc = true diff --git a/CSSSelectorConverter.xcworkspace/xcshareddata/CSSSelectorConverter.xcscmblueprint b/CSSSelectorConverter.xcworkspace/xcshareddata/CSSSelectorConverter.xcscmblueprint new file mode 100644 index 0000000..3d5c2ff --- /dev/null +++ b/CSSSelectorConverter.xcworkspace/xcshareddata/CSSSelectorConverter.xcscmblueprint @@ -0,0 +1,30 @@ +{ + "DVTSourceControlWorkspaceBlueprintPrimaryRemoteRepositoryKey" : "122DB07625ACCDABC9818C06D3A839B56B29D4FD", + "DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey" : { + + }, + "DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey" : { + "20B5E220B44D3958A2219B13999BCD96DC9444FE" : 0, + "122DB07625ACCDABC9818C06D3A839B56B29D4FD" : 0 + }, + "DVTSourceControlWorkspaceBlueprintIdentifierKey" : "F3C80365-7344-4DF4-8217-F1266652B9AD", + "DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey" : { + "20B5E220B44D3958A2219B13999BCD96DC9444FE" : "CSSSelectorConverter\/vendor\/CoreParse", + "122DB07625ACCDABC9818C06D3A839B56B29D4FD" : "CSSSelectorConverter" + }, + "DVTSourceControlWorkspaceBlueprintNameKey" : "CSSSelectorConverter", + "DVTSourceControlWorkspaceBlueprintVersion" : 204, + "DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey" : "CSSSelectorConverter.xcworkspace", + "DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey" : [ + { + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "ssh:\/\/github.com\/siuying\/CSSSelectorConverter.git", + "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "122DB07625ACCDABC9818C06D3A839B56B29D4FD" + }, + { + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/beelsebob\/CoreParse.git", + "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "20B5E220B44D3958A2219B13999BCD96DC9444FE" + } + ] +} \ No newline at end of file From ede7cf93e4e799b7dca750ea8cc083ab410d3989 Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Tue, 26 Jan 2016 12:45:37 +0800 Subject: [PATCH 50/52] update travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 81910a7..706c2ff 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,4 @@ -rvm: 1.9.3 +rvm: 2.2.3 language: objective-c before_script: - export LANG=en_US.UTF-8 From 783af63a34b1b4f888188a22d3629421e1564d1d Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Tue, 26 Jan 2016 12:48:28 +0800 Subject: [PATCH 51/52] fix travisci!! --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 706c2ff..9f07064 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,6 @@ -rvm: 2.2.3 language: objective-c before_script: - export LANG=en_US.UTF-8 - - gem install xcpretty + - gem install xcpretty cocoapods - pod install script: xcodebuild -workspace CSSSelectorConverter.xcworkspace -scheme CSSSelectorConverter -sdk iphonesimulator test | xcpretty -c; exit ${PIPESTATUS[0]} From e69938f5c75b2298266b730d31405ab4db0aaff6 Mon Sep 17 00:00:00 2001 From: Francis Chong Date: Tue, 26 Jan 2016 12:55:22 +0800 Subject: [PATCH 52/52] fix travisci, again --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 9f07064..3212e0a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,4 @@ +rvm: 2.2.3 language: objective-c before_script: - export LANG=en_US.UTF-8