Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Initial Commit

  • Loading branch information...
commit a0e27f32aaf2b56ddb0e44b2d73355bd75b11aff 1 parent d8707dd
@AlvaroFranco authored
Showing with 9,411 additions and 0 deletions.
  1. +667 −0 AFFeedsReader.xcodeproj/project.pbxproj
  2. +44 −0 AFFeedsReader/AFFeedsReader-Info.plist
  3. +14 −0 AFFeedsReader/AFFeedsReader-Prefix.pch
  4. +19 −0 AFFeedsReader/AppDelegate.h
  5. +71 −0 AFFeedsReader/AppDelegate.m
  6. +35 −0 AFFeedsReader/CDataChunk.h
  7. +42 −0 AFFeedsReader/CDataChunk.m
  8. +47 −0 AFFeedsReader/CSSPartMatcher.h
  9. +105 −0 AFFeedsReader/CSSPartMatcher.m
  10. +68 −0 AFFeedsReader/CSSSelector.h
  11. +97 −0 AFFeedsReader/CSSSelector.m
  12. +48 −0 AFFeedsReader/CSSSelectorMatcher.h
  13. +60 −0 AFFeedsReader/CSSSelectorMatcher.m
  14. +67 −0 AFFeedsReader/CSSSelectorPart.h
  15. +161 −0 AFFeedsReader/CSSSelectorPart.m
  16. +117 −0 AFFeedsReader/Chunk.h
  17. +85 −0 AFFeedsReader/Chunk.m
  18. +36 −0 AFFeedsReader/CommentChunk.h
  19. +41 −0 AFFeedsReader/CommentChunk.m
  20. +36 −0 AFFeedsReader/DoctypeChunk.h
  21. +42 −0 AFFeedsReader/DoctypeChunk.m
  22. +30 −0 AFFeedsReader/DocumentRoot.h
  23. +48 −0 AFFeedsReader/DocumentRoot.m
  24. +243 −0 AFFeedsReader/Element.h
  25. +293 −0 AFFeedsReader/Element.m
  26. +115 −0 AFFeedsReader/ElementParser.h
  27. +276 −0 AFFeedsReader/ElementParser.m
  28. +37 −0 AFFeedsReader/EntityChunk.h
  29. +42 −0 AFFeedsReader/EntityChunk.m
  30. BIN  AFFeedsReader/Gotham-Regular.ttf
  31. +62 −0 AFFeedsReader/KMXMLParser.h
  32. +130 −0 AFFeedsReader/KMXMLParser.m
  33. +374 −0 AFFeedsReader/MBProgressHUD.h
  34. +756 −0 AFFeedsReader/MBProgressHUD.m
  35. +19 −0 AFFeedsReader/MainVC.h
  36. +163 −0 AFFeedsReader/MainVC.m
  37. +183 −0 AFFeedsReader/NSString_HTML.h
  38. +662 −0 AFFeedsReader/NSString_HTML.m
  39. +39 −0 AFFeedsReader/ODRefreshControl/ODRefreshControl.h
  40. +410 −0 AFFeedsReader/ODRefreshControl/ODRefreshControl.m
  41. +36 −0 AFFeedsReader/ProcessingInstructionChunk.h
  42. +42 −0 AFFeedsReader/ProcessingInstructionChunk.m
  43. +25 −0 AFFeedsReader/ReaderVC.h
  44. +82 −0 AFFeedsReader/ReaderVC.m
  45. +91 −0 AFFeedsReader/TagChunk.h
  46. +113 −0 AFFeedsReader/TagChunk.m
  47. +36 −0 AFFeedsReader/TxtChunk.h
  48. +38 −0 AFFeedsReader/TxtChunk.m
  49. +53 −0 AFFeedsReader/URLParser.h
  50. +127 −0 AFFeedsReader/URLParser.m
  51. +2 −0  AFFeedsReader/en.lproj/InfoPlist.strings
  52. +18 −0 AFFeedsReader/main.m
  53. BIN  AFFeedsReader/placeholder.png
  54. BIN  AFFeedsReader/placeholdera.png
  55. +22 −0 AFFeedsReaderTests/AFFeedsReaderTests-Info.plist
  56. +13 −0 AFFeedsReaderTests/AFFeedsReaderTests.h
  57. +32 −0 AFFeedsReaderTests/AFFeedsReaderTests.m
  58. +2 −0  AFFeedsReaderTests/en.lproj/InfoPlist.strings
  59. +93 −0 SDWebImage/MKAnnotationView+WebCache.h
  60. +80 −0 SDWebImage/MKAnnotationView+WebCache.m
  61. +147 −0 SDWebImage/SDImageCache.h
  62. +437 −0 SDWebImage/SDImageCache.m
  63. +39 −0 SDWebImage/SDImageCacheDelegate.h
  64. +92 −0 SDWebImage/SDWebImageCompat.h
  65. +67 −0 SDWebImage/SDWebImageDecoder.h
  66. +127 −0 SDWebImage/SDWebImageDecoder.m
  67. +78 −0 SDWebImage/SDWebImageDownloader.h
  68. +283 −0 SDWebImage/SDWebImageDownloader.m
  69. +46 −0 SDWebImage/SDWebImageDownloaderDelegate.h
  70. +156 −0 SDWebImage/SDWebImageManager.h
  71. +491 −0 SDWebImage/SDWebImageManager.m
  72. +55 −0 SDWebImage/SDWebImageManagerDelegate.h
  73. +57 −0 SDWebImage/SDWebImagePrefetcher.h
  74. +114 −0 SDWebImage/SDWebImagePrefetcher.m
  75. +162 −0 SDWebImage/UIButton+WebCache.h
  76. +168 −0 SDWebImage/UIButton+WebCache.m
  77. +121 −0 SDWebImage/UIImageView+WebCache.h
  78. +82 −0 SDWebImage/UIImageView+WebCache.m
View
667 AFFeedsReader.xcodeproj/project.pbxproj
@@ -0,0 +1,667 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 3875701D1608991F002D0CD0 /* placeholder.png in Resources */ = {isa = PBXBuildFile; fileRef = 3875701C1608991F002D0CD0 /* placeholder.png */; };
+ 387570291608A22F002D0CD0 /* libxml2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 387570281608A22F002D0CD0 /* libxml2.dylib */; };
+ 387F50AD16078692004746E4 /* MKAnnotationView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 387F509A16078692004746E4 /* MKAnnotationView+WebCache.m */; };
+ 387F50AE16078692004746E4 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 387F509C16078692004746E4 /* SDImageCache.m */; };
+ 387F50AF16078692004746E4 /* SDWebImageDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 387F50A016078692004746E4 /* SDWebImageDecoder.m */; };
+ 387F50B016078692004746E4 /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 387F50A216078692004746E4 /* SDWebImageDownloader.m */; };
+ 387F50B116078692004746E4 /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 387F50A516078692004746E4 /* SDWebImageManager.m */; };
+ 387F50B216078692004746E4 /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 387F50A816078692004746E4 /* SDWebImagePrefetcher.m */; };
+ 387F50B316078692004746E4 /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 387F50AA16078692004746E4 /* UIButton+WebCache.m */; };
+ 387F50B416078692004746E4 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 387F50AC16078692004746E4 /* UIImageView+WebCache.m */; };
+ 387F50C116078736004746E4 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 387F50C016078736004746E4 /* ImageIO.framework */; };
+ 387F50C316078767004746E4 /* MapKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 387F50C216078767004746E4 /* MapKit.framework */; };
+ 387F50E11607A1A8004746E4 /* ODRefreshControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 387F50E01607A1A8004746E4 /* ODRefreshControl.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
+ 387F50E31607A1F0004746E4 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 387F50E21607A1F0004746E4 /* QuartzCore.framework */; };
+ 387F50E91607AD14004746E4 /* Gotham-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 387F50E81607AD14004746E4 /* Gotham-Regular.ttf */; };
+ 3887B5761607716B005EBECF /* CDataChunk.m in Sources */ = {isa = PBXBuildFile; fileRef = 3887B5551607716B005EBECF /* CDataChunk.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
+ 3887B5771607716B005EBECF /* Chunk.m in Sources */ = {isa = PBXBuildFile; fileRef = 3887B5571607716B005EBECF /* Chunk.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
+ 3887B5781607716B005EBECF /* CommentChunk.m in Sources */ = {isa = PBXBuildFile; fileRef = 3887B5591607716B005EBECF /* CommentChunk.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
+ 3887B5791607716B005EBECF /* CSSPartMatcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 3887B55B1607716B005EBECF /* CSSPartMatcher.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
+ 3887B57A1607716B005EBECF /* CSSSelector.m in Sources */ = {isa = PBXBuildFile; fileRef = 3887B55D1607716B005EBECF /* CSSSelector.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
+ 3887B57B1607716B005EBECF /* CSSSelectorMatcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 3887B55F1607716B005EBECF /* CSSSelectorMatcher.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
+ 3887B57C1607716B005EBECF /* CSSSelectorPart.m in Sources */ = {isa = PBXBuildFile; fileRef = 3887B5611607716B005EBECF /* CSSSelectorPart.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
+ 3887B57D1607716B005EBECF /* DoctypeChunk.m in Sources */ = {isa = PBXBuildFile; fileRef = 3887B5631607716B005EBECF /* DoctypeChunk.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
+ 3887B57E1607716B005EBECF /* DocumentRoot.m in Sources */ = {isa = PBXBuildFile; fileRef = 3887B5651607716B005EBECF /* DocumentRoot.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
+ 3887B57F1607716B005EBECF /* Element.m in Sources */ = {isa = PBXBuildFile; fileRef = 3887B5671607716B005EBECF /* Element.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
+ 3887B5801607716B005EBECF /* ElementParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 3887B5691607716B005EBECF /* ElementParser.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
+ 3887B5811607716B005EBECF /* EntityChunk.m in Sources */ = {isa = PBXBuildFile; fileRef = 3887B56B1607716B005EBECF /* EntityChunk.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
+ 3887B5821607716B005EBECF /* NSString_HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = 3887B56D1607716B005EBECF /* NSString_HTML.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
+ 3887B5831607716B005EBECF /* ProcessingInstructionChunk.m in Sources */ = {isa = PBXBuildFile; fileRef = 3887B56F1607716B005EBECF /* ProcessingInstructionChunk.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
+ 3887B5841607716B005EBECF /* TagChunk.m in Sources */ = {isa = PBXBuildFile; fileRef = 3887B5711607716B005EBECF /* TagChunk.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
+ 3887B5851607716B005EBECF /* TxtChunk.m in Sources */ = {isa = PBXBuildFile; fileRef = 3887B5731607716B005EBECF /* TxtChunk.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
+ 3887B5861607716B005EBECF /* URLParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 3887B5751607716B005EBECF /* URLParser.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
+ 38CEA017160A5C5A00E9C793 /* MBProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = 38CEA016160A5C5A00E9C793 /* MBProgressHUD.m */; };
+ 38DD131F16071515001F600C /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 38DD131E16071515001F600C /* UIKit.framework */; };
+ 38DD132116071515001F600C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 38DD132016071515001F600C /* Foundation.framework */; };
+ 38DD132316071515001F600C /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 38DD132216071515001F600C /* CoreGraphics.framework */; };
+ 38DD132916071515001F600C /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 38DD132716071515001F600C /* InfoPlist.strings */; };
+ 38DD132B16071515001F600C /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 38DD132A16071515001F600C /* main.m */; };
+ 38DD132F16071515001F600C /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 38DD132E16071515001F600C /* AppDelegate.m */; };
+ 38DD133D16071516001F600C /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 38DD133C16071516001F600C /* SenTestingKit.framework */; };
+ 38DD133E16071516001F600C /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 38DD131E16071515001F600C /* UIKit.framework */; };
+ 38DD133F16071516001F600C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 38DD132016071515001F600C /* Foundation.framework */; };
+ 38DD134716071516001F600C /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 38DD134516071516001F600C /* InfoPlist.strings */; };
+ 38DD134A16071516001F600C /* AFFeedsReaderTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 38DD134916071516001F600C /* AFFeedsReaderTests.m */; };
+ 38DD135916071582001F600C /* MainVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 38DD135816071582001F600C /* MainVC.m */; };
+ 38DD136016071680001F600C /* KMXMLParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 38DD135F16071680001F600C /* KMXMLParser.m */; };
+ 38DD136316071705001F600C /* ReaderVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 38DD136216071705001F600C /* ReaderVC.m */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 38DD134016071516001F600C /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 38DD131116071515001F600C /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 38DD131916071515001F600C;
+ remoteInfo = AFFeedsReader;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXFileReference section */
+ 3875701C1608991F002D0CD0 /* placeholder.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = placeholder.png; sourceTree = "<group>"; };
+ 387570281608A22F002D0CD0 /* libxml2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libxml2.dylib; path = usr/lib/libxml2.dylib; sourceTree = SDKROOT; };
+ 387F509916078692004746E4 /* MKAnnotationView+WebCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MKAnnotationView+WebCache.h"; sourceTree = "<group>"; };
+ 387F509A16078692004746E4 /* MKAnnotationView+WebCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "MKAnnotationView+WebCache.m"; sourceTree = "<group>"; };
+ 387F509B16078692004746E4 /* SDImageCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDImageCache.h; sourceTree = "<group>"; };
+ 387F509C16078692004746E4 /* SDImageCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDImageCache.m; sourceTree = "<group>"; };
+ 387F509D16078692004746E4 /* SDImageCacheDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDImageCacheDelegate.h; sourceTree = "<group>"; };
+ 387F509E16078692004746E4 /* SDWebImageCompat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDWebImageCompat.h; sourceTree = "<group>"; };
+ 387F509F16078692004746E4 /* SDWebImageDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDWebImageDecoder.h; sourceTree = "<group>"; };
+ 387F50A016078692004746E4 /* SDWebImageDecoder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWebImageDecoder.m; sourceTree = "<group>"; };
+ 387F50A116078692004746E4 /* SDWebImageDownloader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDWebImageDownloader.h; sourceTree = "<group>"; };
+ 387F50A216078692004746E4 /* SDWebImageDownloader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWebImageDownloader.m; sourceTree = "<group>"; };
+ 387F50A316078692004746E4 /* SDWebImageDownloaderDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDWebImageDownloaderDelegate.h; sourceTree = "<group>"; };
+ 387F50A416078692004746E4 /* SDWebImageManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDWebImageManager.h; sourceTree = "<group>"; };
+ 387F50A516078692004746E4 /* SDWebImageManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWebImageManager.m; sourceTree = "<group>"; };
+ 387F50A616078692004746E4 /* SDWebImageManagerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDWebImageManagerDelegate.h; sourceTree = "<group>"; };
+ 387F50A716078692004746E4 /* SDWebImagePrefetcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDWebImagePrefetcher.h; sourceTree = "<group>"; };
+ 387F50A816078692004746E4 /* SDWebImagePrefetcher.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWebImagePrefetcher.m; sourceTree = "<group>"; };
+ 387F50A916078692004746E4 /* UIButton+WebCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIButton+WebCache.h"; sourceTree = "<group>"; };
+ 387F50AA16078692004746E4 /* UIButton+WebCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIButton+WebCache.m"; sourceTree = "<group>"; };
+ 387F50AB16078692004746E4 /* UIImageView+WebCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImageView+WebCache.h"; sourceTree = "<group>"; };
+ 387F50AC16078692004746E4 /* UIImageView+WebCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImageView+WebCache.m"; sourceTree = "<group>"; };
+ 387F50C016078736004746E4 /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = System/Library/Frameworks/ImageIO.framework; sourceTree = SDKROOT; };
+ 387F50C216078767004746E4 /* MapKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MapKit.framework; path = System/Library/Frameworks/MapKit.framework; sourceTree = SDKROOT; };
+ 387F50DF1607A1A8004746E4 /* ODRefreshControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ODRefreshControl.h; sourceTree = "<group>"; };
+ 387F50E01607A1A8004746E4 /* ODRefreshControl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ODRefreshControl.m; sourceTree = "<group>"; };
+ 387F50E21607A1F0004746E4 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+ 387F50E81607AD14004746E4 /* Gotham-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Gotham-Regular.ttf"; sourceTree = "<group>"; };
+ 3887B5541607716B005EBECF /* CDataChunk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDataChunk.h; sourceTree = "<group>"; };
+ 3887B5551607716B005EBECF /* CDataChunk.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDataChunk.m; sourceTree = "<group>"; };
+ 3887B5561607716B005EBECF /* Chunk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Chunk.h; sourceTree = "<group>"; };
+ 3887B5571607716B005EBECF /* Chunk.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Chunk.m; sourceTree = "<group>"; };
+ 3887B5581607716B005EBECF /* CommentChunk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CommentChunk.h; sourceTree = "<group>"; };
+ 3887B5591607716B005EBECF /* CommentChunk.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CommentChunk.m; sourceTree = "<group>"; };
+ 3887B55A1607716B005EBECF /* CSSPartMatcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSPartMatcher.h; sourceTree = "<group>"; };
+ 3887B55B1607716B005EBECF /* CSSPartMatcher.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSPartMatcher.m; sourceTree = "<group>"; };
+ 3887B55C1607716B005EBECF /* CSSSelector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSSelector.h; sourceTree = "<group>"; };
+ 3887B55D1607716B005EBECF /* CSSSelector.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSSelector.m; sourceTree = "<group>"; };
+ 3887B55E1607716B005EBECF /* CSSSelectorMatcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSSelectorMatcher.h; sourceTree = "<group>"; };
+ 3887B55F1607716B005EBECF /* CSSSelectorMatcher.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSSelectorMatcher.m; sourceTree = "<group>"; };
+ 3887B5601607716B005EBECF /* CSSSelectorPart.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSSelectorPart.h; sourceTree = "<group>"; };
+ 3887B5611607716B005EBECF /* CSSSelectorPart.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSSelectorPart.m; sourceTree = "<group>"; };
+ 3887B5621607716B005EBECF /* DoctypeChunk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DoctypeChunk.h; sourceTree = "<group>"; };
+ 3887B5631607716B005EBECF /* DoctypeChunk.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DoctypeChunk.m; sourceTree = "<group>"; };
+ 3887B5641607716B005EBECF /* DocumentRoot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DocumentRoot.h; sourceTree = "<group>"; };
+ 3887B5651607716B005EBECF /* DocumentRoot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DocumentRoot.m; sourceTree = "<group>"; };
+ 3887B5661607716B005EBECF /* Element.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Element.h; sourceTree = "<group>"; };
+ 3887B5671607716B005EBECF /* Element.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Element.m; sourceTree = "<group>"; };
+ 3887B5681607716B005EBECF /* ElementParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ElementParser.h; sourceTree = "<group>"; };
+ 3887B5691607716B005EBECF /* ElementParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ElementParser.m; sourceTree = "<group>"; };
+ 3887B56A1607716B005EBECF /* EntityChunk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EntityChunk.h; sourceTree = "<group>"; };
+ 3887B56B1607716B005EBECF /* EntityChunk.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EntityChunk.m; sourceTree = "<group>"; };
+ 3887B56C1607716B005EBECF /* NSString_HTML.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSString_HTML.h; sourceTree = "<group>"; };
+ 3887B56D1607716B005EBECF /* NSString_HTML.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSString_HTML.m; sourceTree = "<group>"; };
+ 3887B56E1607716B005EBECF /* ProcessingInstructionChunk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProcessingInstructionChunk.h; sourceTree = "<group>"; };
+ 3887B56F1607716B005EBECF /* ProcessingInstructionChunk.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ProcessingInstructionChunk.m; sourceTree = "<group>"; };
+ 3887B5701607716B005EBECF /* TagChunk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TagChunk.h; sourceTree = "<group>"; };
+ 3887B5711607716B005EBECF /* TagChunk.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TagChunk.m; sourceTree = "<group>"; };
+ 3887B5721607716B005EBECF /* TxtChunk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TxtChunk.h; sourceTree = "<group>"; };
+ 3887B5731607716B005EBECF /* TxtChunk.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TxtChunk.m; sourceTree = "<group>"; };
+ 3887B5741607716B005EBECF /* URLParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = URLParser.h; sourceTree = "<group>"; };
+ 3887B5751607716B005EBECF /* URLParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = URLParser.m; sourceTree = "<group>"; };
+ 38CEA015160A5C5900E9C793 /* MBProgressHUD.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MBProgressHUD.h; sourceTree = "<group>"; };
+ 38CEA016160A5C5A00E9C793 /* MBProgressHUD.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MBProgressHUD.m; sourceTree = "<group>"; };
+ 38DD131A16071515001F600C /* AFFeedsReader.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AFFeedsReader.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 38DD131E16071515001F600C /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+ 38DD132016071515001F600C /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+ 38DD132216071515001F600C /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
+ 38DD132616071515001F600C /* AFFeedsReader-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "AFFeedsReader-Info.plist"; sourceTree = "<group>"; };
+ 38DD132816071515001F600C /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+ 38DD132A16071515001F600C /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+ 38DD132C16071515001F600C /* AFFeedsReader-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "AFFeedsReader-Prefix.pch"; sourceTree = "<group>"; };
+ 38DD132D16071515001F600C /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
+ 38DD132E16071515001F600C /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
+ 38DD133B16071516001F600C /* AFFeedsReaderTests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AFFeedsReaderTests.octest; sourceTree = BUILT_PRODUCTS_DIR; };
+ 38DD133C16071516001F600C /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; };
+ 38DD134416071516001F600C /* AFFeedsReaderTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "AFFeedsReaderTests-Info.plist"; sourceTree = "<group>"; };
+ 38DD134616071516001F600C /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+ 38DD134816071516001F600C /* AFFeedsReaderTests.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AFFeedsReaderTests.h; sourceTree = "<group>"; };
+ 38DD134916071516001F600C /* AFFeedsReaderTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AFFeedsReaderTests.m; sourceTree = "<group>"; };
+ 38DD135716071582001F600C /* MainVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MainVC.h; sourceTree = "<group>"; };
+ 38DD135816071582001F600C /* MainVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MainVC.m; sourceTree = "<group>"; };
+ 38DD135E16071680001F600C /* KMXMLParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KMXMLParser.h; sourceTree = "<group>"; };
+ 38DD135F16071680001F600C /* KMXMLParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KMXMLParser.m; sourceTree = "<group>"; };
+ 38DD136116071705001F600C /* ReaderVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReaderVC.h; sourceTree = "<group>"; };
+ 38DD136216071705001F600C /* ReaderVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ReaderVC.m; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 38DD131716071515001F600C /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 387570291608A22F002D0CD0 /* libxml2.dylib in Frameworks */,
+ 387F50E31607A1F0004746E4 /* QuartzCore.framework in Frameworks */,
+ 387F50C316078767004746E4 /* MapKit.framework in Frameworks */,
+ 387F50C116078736004746E4 /* ImageIO.framework in Frameworks */,
+ 38DD131F16071515001F600C /* UIKit.framework in Frameworks */,
+ 38DD132116071515001F600C /* Foundation.framework in Frameworks */,
+ 38DD132316071515001F600C /* CoreGraphics.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 38DD133716071516001F600C /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 38DD133D16071516001F600C /* SenTestingKit.framework in Frameworks */,
+ 38DD133E16071516001F600C /* UIKit.framework in Frameworks */,
+ 38DD133F16071516001F600C /* Foundation.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 387F509816078692004746E4 /* SDWebImage */ = {
+ isa = PBXGroup;
+ children = (
+ 387F509916078692004746E4 /* MKAnnotationView+WebCache.h */,
+ 387F509A16078692004746E4 /* MKAnnotationView+WebCache.m */,
+ 387F509B16078692004746E4 /* SDImageCache.h */,
+ 387F509C16078692004746E4 /* SDImageCache.m */,
+ 387F509D16078692004746E4 /* SDImageCacheDelegate.h */,
+ 387F509E16078692004746E4 /* SDWebImageCompat.h */,
+ 387F509F16078692004746E4 /* SDWebImageDecoder.h */,
+ 387F50A016078692004746E4 /* SDWebImageDecoder.m */,
+ 387F50A116078692004746E4 /* SDWebImageDownloader.h */,
+ 387F50A216078692004746E4 /* SDWebImageDownloader.m */,
+ 387F50A316078692004746E4 /* SDWebImageDownloaderDelegate.h */,
+ 387F50A416078692004746E4 /* SDWebImageManager.h */,
+ 387F50A516078692004746E4 /* SDWebImageManager.m */,
+ 387F50A616078692004746E4 /* SDWebImageManagerDelegate.h */,
+ 387F50A716078692004746E4 /* SDWebImagePrefetcher.h */,
+ 387F50A816078692004746E4 /* SDWebImagePrefetcher.m */,
+ 387F50A916078692004746E4 /* UIButton+WebCache.h */,
+ 387F50AA16078692004746E4 /* UIButton+WebCache.m */,
+ 387F50AB16078692004746E4 /* UIImageView+WebCache.h */,
+ 387F50AC16078692004746E4 /* UIImageView+WebCache.m */,
+ );
+ name = SDWebImage;
+ path = ../SDWebImage;
+ sourceTree = "<group>";
+ };
+ 387F50DE1607A1A8004746E4 /* ODRefreshControl */ = {
+ isa = PBXGroup;
+ children = (
+ 387F50DF1607A1A8004746E4 /* ODRefreshControl.h */,
+ 387F50E01607A1A8004746E4 /* ODRefreshControl.m */,
+ );
+ path = ODRefreshControl;
+ sourceTree = "<group>";
+ };
+ 3887B588160771AA005EBECF /* HTML Parser */ = {
+ isa = PBXGroup;
+ children = (
+ 3887B5541607716B005EBECF /* CDataChunk.h */,
+ 3887B5551607716B005EBECF /* CDataChunk.m */,
+ 3887B5561607716B005EBECF /* Chunk.h */,
+ 3887B5571607716B005EBECF /* Chunk.m */,
+ 3887B5581607716B005EBECF /* CommentChunk.h */,
+ 3887B5591607716B005EBECF /* CommentChunk.m */,
+ 3887B55A1607716B005EBECF /* CSSPartMatcher.h */,
+ 3887B55B1607716B005EBECF /* CSSPartMatcher.m */,
+ 3887B55C1607716B005EBECF /* CSSSelector.h */,
+ 3887B55D1607716B005EBECF /* CSSSelector.m */,
+ 3887B55E1607716B005EBECF /* CSSSelectorMatcher.h */,
+ 3887B55F1607716B005EBECF /* CSSSelectorMatcher.m */,
+ 3887B5601607716B005EBECF /* CSSSelectorPart.h */,
+ 3887B5611607716B005EBECF /* CSSSelectorPart.m */,
+ 3887B5621607716B005EBECF /* DoctypeChunk.h */,
+ 3887B5631607716B005EBECF /* DoctypeChunk.m */,
+ 3887B5641607716B005EBECF /* DocumentRoot.h */,
+ 3887B5651607716B005EBECF /* DocumentRoot.m */,
+ 3887B5661607716B005EBECF /* Element.h */,
+ 3887B5671607716B005EBECF /* Element.m */,
+ 3887B5681607716B005EBECF /* ElementParser.h */,
+ 3887B5691607716B005EBECF /* ElementParser.m */,
+ 3887B56A1607716B005EBECF /* EntityChunk.h */,
+ 3887B56B1607716B005EBECF /* EntityChunk.m */,
+ 3887B56C1607716B005EBECF /* NSString_HTML.h */,
+ 3887B56D1607716B005EBECF /* NSString_HTML.m */,
+ 3887B56E1607716B005EBECF /* ProcessingInstructionChunk.h */,
+ 3887B56F1607716B005EBECF /* ProcessingInstructionChunk.m */,
+ 3887B5701607716B005EBECF /* TagChunk.h */,
+ 3887B5711607716B005EBECF /* TagChunk.m */,
+ 3887B5721607716B005EBECF /* TxtChunk.h */,
+ 3887B5731607716B005EBECF /* TxtChunk.m */,
+ 3887B5741607716B005EBECF /* URLParser.h */,
+ 3887B5751607716B005EBECF /* URLParser.m */,
+ );
+ name = "HTML Parser";
+ sourceTree = "<group>";
+ };
+ 38DD130F16071515001F600C = {
+ isa = PBXGroup;
+ children = (
+ 387570281608A22F002D0CD0 /* libxml2.dylib */,
+ 387F50E21607A1F0004746E4 /* QuartzCore.framework */,
+ 387F50C216078767004746E4 /* MapKit.framework */,
+ 387F50C016078736004746E4 /* ImageIO.framework */,
+ 38DD132416071515001F600C /* AFFeedsReader */,
+ 38DD134216071516001F600C /* AFFeedsReaderTests */,
+ 38DD131D16071515001F600C /* Frameworks */,
+ 38DD131B16071515001F600C /* Products */,
+ );
+ sourceTree = "<group>";
+ };
+ 38DD131B16071515001F600C /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 38DD131A16071515001F600C /* AFFeedsReader.app */,
+ 38DD133B16071516001F600C /* AFFeedsReaderTests.octest */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 38DD131D16071515001F600C /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 38DD131E16071515001F600C /* UIKit.framework */,
+ 38DD132016071515001F600C /* Foundation.framework */,
+ 38DD132216071515001F600C /* CoreGraphics.framework */,
+ 38DD133C16071516001F600C /* SenTestingKit.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "<group>";
+ };
+ 38DD132416071515001F600C /* AFFeedsReader */ = {
+ isa = PBXGroup;
+ children = (
+ 38DD132D16071515001F600C /* AppDelegate.h */,
+ 38DD132E16071515001F600C /* AppDelegate.m */,
+ 38DD135E16071680001F600C /* KMXMLParser.h */,
+ 38DD135F16071680001F600C /* KMXMLParser.m */,
+ 38DD135716071582001F600C /* MainVC.h */,
+ 38DD135816071582001F600C /* MainVC.m */,
+ 38DD136116071705001F600C /* ReaderVC.h */,
+ 38DD136216071705001F600C /* ReaderVC.m */,
+ 38CEA015160A5C5900E9C793 /* MBProgressHUD.h */,
+ 38CEA016160A5C5A00E9C793 /* MBProgressHUD.m */,
+ 387F509816078692004746E4 /* SDWebImage */,
+ 3887B588160771AA005EBECF /* HTML Parser */,
+ 387F50DE1607A1A8004746E4 /* ODRefreshControl */,
+ 38DD132516071515001F600C /* Supporting Files */,
+ );
+ path = AFFeedsReader;
+ sourceTree = "<group>";
+ };
+ 38DD132516071515001F600C /* Supporting Files */ = {
+ isa = PBXGroup;
+ children = (
+ 3875701C1608991F002D0CD0 /* placeholder.png */,
+ 387F50E81607AD14004746E4 /* Gotham-Regular.ttf */,
+ 38DD132616071515001F600C /* AFFeedsReader-Info.plist */,
+ 38DD132716071515001F600C /* InfoPlist.strings */,
+ 38DD132A16071515001F600C /* main.m */,
+ 38DD132C16071515001F600C /* AFFeedsReader-Prefix.pch */,
+ );
+ name = "Supporting Files";
+ sourceTree = "<group>";
+ };
+ 38DD134216071516001F600C /* AFFeedsReaderTests */ = {
+ isa = PBXGroup;
+ children = (
+ 38DD134816071516001F600C /* AFFeedsReaderTests.h */,
+ 38DD134916071516001F600C /* AFFeedsReaderTests.m */,
+ 38DD134316071516001F600C /* Supporting Files */,
+ );
+ path = AFFeedsReaderTests;
+ sourceTree = "<group>";
+ };
+ 38DD134316071516001F600C /* Supporting Files */ = {
+ isa = PBXGroup;
+ children = (
+ 38DD134416071516001F600C /* AFFeedsReaderTests-Info.plist */,
+ 38DD134516071516001F600C /* InfoPlist.strings */,
+ );
+ name = "Supporting Files";
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 38DD131916071515001F600C /* AFFeedsReader */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 38DD134D16071516001F600C /* Build configuration list for PBXNativeTarget "AFFeedsReader" */;
+ buildPhases = (
+ 38DD131616071515001F600C /* Sources */,
+ 38DD131716071515001F600C /* Frameworks */,
+ 38DD131816071515001F600C /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = AFFeedsReader;
+ productName = AFFeedsReader;
+ productReference = 38DD131A16071515001F600C /* AFFeedsReader.app */;
+ productType = "com.apple.product-type.application";
+ };
+ 38DD133A16071516001F600C /* AFFeedsReaderTests */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 38DD135016071516001F600C /* Build configuration list for PBXNativeTarget "AFFeedsReaderTests" */;
+ buildPhases = (
+ 38DD133616071516001F600C /* Sources */,
+ 38DD133716071516001F600C /* Frameworks */,
+ 38DD133816071516001F600C /* Resources */,
+ 38DD133916071516001F600C /* ShellScript */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 38DD134116071516001F600C /* PBXTargetDependency */,
+ );
+ name = AFFeedsReaderTests;
+ productName = AFFeedsReaderTests;
+ productReference = 38DD133B16071516001F600C /* AFFeedsReaderTests.octest */;
+ productType = "com.apple.product-type.bundle";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 38DD131116071515001F600C /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0420;
+ };
+ buildConfigurationList = 38DD131416071515001F600C /* Build configuration list for PBXProject "AFFeedsReader" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ );
+ mainGroup = 38DD130F16071515001F600C;
+ productRefGroup = 38DD131B16071515001F600C /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 38DD131916071515001F600C /* AFFeedsReader */,
+ 38DD133A16071516001F600C /* AFFeedsReaderTests */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 38DD131816071515001F600C /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 38DD132916071515001F600C /* InfoPlist.strings in Resources */,
+ 387F50E91607AD14004746E4 /* Gotham-Regular.ttf in Resources */,
+ 3875701D1608991F002D0CD0 /* placeholder.png in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 38DD133816071516001F600C /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 38DD134716071516001F600C /* InfoPlist.strings in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 38DD133916071516001F600C /* ShellScript */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n";
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 38DD131616071515001F600C /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 38DD132B16071515001F600C /* main.m in Sources */,
+ 38DD132F16071515001F600C /* AppDelegate.m in Sources */,
+ 38DD135916071582001F600C /* MainVC.m in Sources */,
+ 38DD136016071680001F600C /* KMXMLParser.m in Sources */,
+ 38DD136316071705001F600C /* ReaderVC.m in Sources */,
+ 3887B5761607716B005EBECF /* CDataChunk.m in Sources */,
+ 3887B5771607716B005EBECF /* Chunk.m in Sources */,
+ 3887B5781607716B005EBECF /* CommentChunk.m in Sources */,
+ 3887B5791607716B005EBECF /* CSSPartMatcher.m in Sources */,
+ 3887B57A1607716B005EBECF /* CSSSelector.m in Sources */,
+ 3887B57B1607716B005EBECF /* CSSSelectorMatcher.m in Sources */,
+ 3887B57C1607716B005EBECF /* CSSSelectorPart.m in Sources */,
+ 3887B57D1607716B005EBECF /* DoctypeChunk.m in Sources */,
+ 3887B57E1607716B005EBECF /* DocumentRoot.m in Sources */,
+ 3887B57F1607716B005EBECF /* Element.m in Sources */,
+ 3887B5801607716B005EBECF /* ElementParser.m in Sources */,
+ 3887B5811607716B005EBECF /* EntityChunk.m in Sources */,
+ 3887B5821607716B005EBECF /* NSString_HTML.m in Sources */,
+ 3887B5831607716B005EBECF /* ProcessingInstructionChunk.m in Sources */,
+ 3887B5841607716B005EBECF /* TagChunk.m in Sources */,
+ 3887B5851607716B005EBECF /* TxtChunk.m in Sources */,
+ 3887B5861607716B005EBECF /* URLParser.m in Sources */,
+ 387F50AD16078692004746E4 /* MKAnnotationView+WebCache.m in Sources */,
+ 387F50AE16078692004746E4 /* SDImageCache.m in Sources */,
+ 387F50AF16078692004746E4 /* SDWebImageDecoder.m in Sources */,
+ 387F50B016078692004746E4 /* SDWebImageDownloader.m in Sources */,
+ 387F50B116078692004746E4 /* SDWebImageManager.m in Sources */,
+ 387F50B216078692004746E4 /* SDWebImagePrefetcher.m in Sources */,
+ 387F50B316078692004746E4 /* UIButton+WebCache.m in Sources */,
+ 387F50B416078692004746E4 /* UIImageView+WebCache.m in Sources */,
+ 387F50E11607A1A8004746E4 /* ODRefreshControl.m in Sources */,
+ 38CEA017160A5C5A00E9C793 /* MBProgressHUD.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 38DD133616071516001F600C /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 38DD134A16071516001F600C /* AFFeedsReaderTests.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 38DD134116071516001F600C /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 38DD131916071515001F600C /* AFFeedsReader */;
+ targetProxy = 38DD134016071516001F600C /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+ 38DD132716071515001F600C /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 38DD132816071515001F600C /* en */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "<group>";
+ };
+ 38DD134516071516001F600C /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 38DD134616071516001F600C /* en */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "<group>";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 38DD134B16071516001F600C /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ CLANG_ENABLE_OBJC_ARC = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 5.1;
+ SDKROOT = iphoneos;
+ };
+ name = Debug;
+ };
+ 38DD134C16071516001F600C /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ CLANG_ENABLE_OBJC_ARC = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 5.1;
+ OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
+ SDKROOT = iphoneos;
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+ 38DD134E16071516001F600C /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "AFFeedsReader/AFFeedsReader-Prefix.pch";
+ HEADER_SEARCH_PATHS = /usr/include/libxml2;
+ INFOPLIST_FILE = "AFFeedsReader/AFFeedsReader-Info.plist";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ WRAPPER_EXTENSION = app;
+ };
+ name = Debug;
+ };
+ 38DD134F16071516001F600C /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "AFFeedsReader/AFFeedsReader-Prefix.pch";
+ HEADER_SEARCH_PATHS = /usr/include/libxml2;
+ INFOPLIST_FILE = "AFFeedsReader/AFFeedsReader-Info.plist";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ WRAPPER_EXTENSION = app;
+ };
+ name = Release;
+ };
+ 38DD135116071516001F600C /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/AFFeedsReader.app/AFFeedsReader";
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(SDKROOT)/Developer/Library/Frameworks",
+ "$(DEVELOPER_LIBRARY_DIR)/Frameworks",
+ );
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "AFFeedsReader/AFFeedsReader-Prefix.pch";
+ INFOPLIST_FILE = "AFFeedsReaderTests/AFFeedsReaderTests-Info.plist";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ TEST_HOST = "$(BUNDLE_LOADER)";
+ WRAPPER_EXTENSION = octest;
+ };
+ name = Debug;
+ };
+ 38DD135216071516001F600C /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/AFFeedsReader.app/AFFeedsReader";
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(SDKROOT)/Developer/Library/Frameworks",
+ "$(DEVELOPER_LIBRARY_DIR)/Frameworks",
+ );
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "AFFeedsReader/AFFeedsReader-Prefix.pch";
+ INFOPLIST_FILE = "AFFeedsReaderTests/AFFeedsReaderTests-Info.plist";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ TEST_HOST = "$(BUNDLE_LOADER)";
+ WRAPPER_EXTENSION = octest;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 38DD131416071515001F600C /* Build configuration list for PBXProject "AFFeedsReader" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 38DD134B16071516001F600C /* Debug */,
+ 38DD134C16071516001F600C /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 38DD134D16071516001F600C /* Build configuration list for PBXNativeTarget "AFFeedsReader" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 38DD134E16071516001F600C /* Debug */,
+ 38DD134F16071516001F600C /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 38DD135016071516001F600C /* Build configuration list for PBXNativeTarget "AFFeedsReaderTests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 38DD135116071516001F600C /* Debug */,
+ 38DD135216071516001F600C /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 38DD131116071515001F600C /* Project object */;
+}
View
44 AFFeedsReader/AFFeedsReader-Info.plist
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>en</string>
+ <key>CFBundleDisplayName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIconFiles</key>
+ <array/>
+ <key>CFBundleIdentifier</key>
+ <string>AlvaroFranco.${PRODUCT_NAME:rfc1034identifier}</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.0</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1.0</string>
+ <key>LSRequiresIPhoneOS</key>
+ <true/>
+ <key>UIAppFonts</key>
+ <array>
+ <string>Gotham-Regular</string>
+ </array>
+ <key>UIRequiredDeviceCapabilities</key>
+ <array>
+ <string>armv7</string>
+ </array>
+ <key>UISupportedInterfaceOrientations</key>
+ <array>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ </array>
+</dict>
+</plist>
View
14 AFFeedsReader/AFFeedsReader-Prefix.pch
@@ -0,0 +1,14 @@
+//
+// Prefix header for all source files of the 'AFFeedsReader' target in the 'AFFeedsReader' project
+//
+
+#import <Availability.h>
+
+#ifndef __IPHONE_4_0
+#warning "This project uses features only available in iOS SDK 4.0 and later."
+#endif
+
+#ifdef __OBJC__
+ #import <UIKit/UIKit.h>
+ #import <Foundation/Foundation.h>
+#endif
View
19 AFFeedsReader/AppDelegate.h
@@ -0,0 +1,19 @@
+//
+// AppDelegate.h
+// AFFeedsReader
+//
+// Created by Álvaro Franco on 17/09/12.
+// Copyright (c) 2012 __MyCompanyName__. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@class ViewController;
+
+@interface AppDelegate : UIResponder <UIApplicationDelegate>
+
+@property (strong, nonatomic) UIWindow *window;
+
+@property (strong, nonatomic) ViewController *viewController;
+
+@end
View
71 AFFeedsReader/AppDelegate.m
@@ -0,0 +1,71 @@
+//
+// AppDelegate.m
+// AFFeedsReader
+//
+// Created by Álvaro Franco on 17/09/12.
+// Copyright (c) 2012 __MyCompanyName__. All rights reserved.
+//
+
+#import "AppDelegate.h"
+
+#import "MainVC.h"
+
+@implementation AppDelegate
+
+@synthesize window = _window;
+@synthesize viewController = _viewController;
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
+{
+ self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
+ self.window.backgroundColor = [UIColor whiteColor];
+
+ MainVC *vc = [[MainVC alloc] initWithStyle:UITableViewStylePlain];
+ UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:vc];
+
+ [self.window makeKeyAndVisible];
+ [self.window setRootViewController:navController];
+ [navController setNavigationBarHidden:YES];
+ return YES;
+}
+
+- (void)applicationWillResignActive:(UIApplication *)application
+{
+ /*
+ Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
+ Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
+ */
+}
+
+- (void)applicationDidEnterBackground:(UIApplication *)application
+{
+ /*
+ Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
+ If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
+ */
+}
+
+- (void)applicationWillEnterForeground:(UIApplication *)application
+{
+ /*
+ Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
+ */
+}
+
+- (void)applicationDidBecomeActive:(UIApplication *)application
+{
+ /*
+ Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
+ */
+}
+
+- (void)applicationWillTerminate:(UIApplication *)application
+{
+ /*
+ Called when the application is about to terminate.
+ Save data if appropriate.
+ See also applicationDidEnterBackground:.
+ */
+}
+
+@end
View
35 AFFeedsReader/CDataChunk.h
@@ -0,0 +1,35 @@
+//
+// CDataChunk.h
+// Thumbprint
+//
+// Created by Lee Buck on 4/21/09.
+// Copyright 2009 Blue Bright Ventures. All rights reserved.
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// Commercial licences without many of the obligations of GPL
+// are available for a nomial fee at sales@touchtankapps.com.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#import <Foundation/Foundation.h>
+#import "Chunk.h"
+
+/**
+ CDataChunk a chunk corresponding to a CDATA section
+ */
+@interface CDataChunk : Chunk {
+
+}
+
+@end
View
42 AFFeedsReader/CDataChunk.m
@@ -0,0 +1,42 @@
+//
+// CDataChunk.m
+// Thumbprint
+//
+// Created by Lee Buck on 4/21/09.
+// Copyright 2009 Blue Bright Ventures. All rights reserved.
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// Commercial licences without many of the obligations of GPL
+// are available for a nomial fee at sales@touchtankapps.com.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#import "CDataChunk.h"
+
+
+@implementation CDataChunk
+
+-(NSString*)kind{
+ return ChunkKindCData;
+}
+
+-(NSRange)interiorRange{
+ return NSMakeRange(range.location + 9, range.length - 12);
+}
+
++(NSString*)humanName{
+ return @"cdata";
+}
+
+@end
View
47 AFFeedsReader/CSSPartMatcher.h
@@ -0,0 +1,47 @@
+//
+// CSSPartMatcher.h
+// Thumbprint
+//
+// Created by Lee Buck on 4/19/09.
+// Copyright 2009 Blue Bright Ventures. All rights reserved.
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// Commercial licences without many of the obligations of GPL
+// are available for a nomial fee at sales@touchtankapps.com.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#import <Foundation/Foundation.h>
+#import "Element.h"
+@class CSSSelectorMatcher;
+
+/**
+ * Responsible for representing a successful match on a part.
+ * It is presented elements in an attempt to complete the next part of the match
+ *
+ */
+@interface CSSPartMatcher : NSObject {
+ CSSSelectorMatcher* selectorMatcher; // not retained
+ Element* matchedElement;
+ int matchedPartIndex;
+ NSMutableArray* matchersForNextPart;
+}
+@property (nonatomic, retain) Element* matchedElement;
+@property int matchedPartIndex;
+
+-(id)initWithElement:(Element*) anElement selectorMatcher:(CSSSelectorMatcher*)aSelectorMatcher;
+//-(void)pruneMatchesForElement:(Element*)anElement;
+-(BOOL)matchNextElement:(Element*) nextElement forIndex: (int) index;
+
+@end
View
105 AFFeedsReader/CSSPartMatcher.m
@@ -0,0 +1,105 @@
+//
+// CSSPartMatcher.m
+// Thumbprint
+//
+// Created by Lee Buck on 4/19/09.
+// Copyright 2009 Blue Bright Ventures. All rights reserved.
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// Commercial licences without many of the obligations of GPL
+// are available for a nomial fee at sales@touchtankapps.com.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#import "CSSPartMatcher.h"
+#import "CSSSelectorPart.h"
+#import "CSSSelectorMatcher.h"
+
+@implementation CSSPartMatcher
+
+@synthesize matchedElement, matchedPartIndex;
+
+-(id)initWithElement:(Element*) anElement selectorMatcher:(CSSSelectorMatcher*)aSelectorMatcher{
+ self = [super init];
+ matchedElement = [anElement retain];
+ selectorMatcher = aSelectorMatcher;
+ return self;
+}
+
+-(void)dealloc{
+// NSLog(@"pruned: %@", [self description]);
+ [matchedElement release];
+ [matchersForNextPart release];
+ [super dealloc];
+}
+
+/* we don't do this yet...
+ -(void)pruneMatchesForElement: (Element*)anElement{
+ if (!matchersForNextPart) return;
+ for (CSSPartMatcher* match in matchersForNextPart){
+ if ([match scopeElement] == anElement)
+ [matchersForNextPart removeObject: match];
+ else
+ [match pruneMatchesForElement: anElement];
+ }
+}
+*/
+
+-(void)addNextMatch:(Element*)nextElement withIndex:(int)index{
+ CSSPartMatcher* nextMatch = [[CSSPartMatcher alloc] initWithElement: nextElement selectorMatcher: selectorMatcher];
+ nextMatch.matchedPartIndex = index;
+ if (!matchersForNextPart)
+ matchersForNextPart = [[NSMutableArray alloc] initWithCapacity: 4];
+ [matchersForNextPart addObject: nextMatch];
+ [nextMatch release];
+}
+
+-(BOOL)matchNextElement:(Element*) nextElement forIndex: (int) index{
+ CSSSelectorPart* nextPart = [[selectorMatcher selector] partAtIndex: index];
+ CSSVerb nextVerb = [[selectorMatcher selector] verbAtIndex: index];
+ BOOL verbMatches = NO;
+ if ([nextPart matchesElement: nextElement]){
+ if (nextVerb == CSSVerbAny)
+ verbMatches = YES;
+ else if (nextVerb == CSSVerbDescendant)
+ verbMatches = [nextElement hasAncestor: self.matchedElement];//wasteful to not prune matches as they go out of scope
+ else if (nextVerb == CSSVerbChild)
+ verbMatches = nextElement.parent == self.matchedElement;
+ else if (nextVerb == CSSVerbSuccessor)
+ verbMatches = nextElement == self.matchedElement.nextSybling;
+ }
+
+ BOOL completeMatch = verbMatches && (index == [[selectorMatcher selector] countOfParts] - 1);
+
+ if (matchersForNextPart){
+ for (CSSPartMatcher* match in matchersForNextPart){
+ completeMatch = completeMatch || [match matchNextElement: nextElement forIndex: index + 1];
+ }
+ }
+
+ if (!completeMatch && verbMatches)//actually part and verb match
+ [self addNextMatch: nextElement withIndex: index];
+
+ return completeMatch;
+}
+
+-(CSSSelectorPart*)matchedPart{
+ return [[selectorMatcher selector] partAtIndex: matchedPartIndex];
+}
+
+-(NSString*)description{
+ return [NSString stringWithFormat: @"%@ matched %@ -- %i matchersForNextPart", [[self matchedPart] description], [matchedElement description], (matchersForNextPart) ? [matchersForNextPart count] : 0];
+}
+
+@end
View
68 AFFeedsReader/CSSSelector.h
@@ -0,0 +1,68 @@
+//
+// CSSSelector.h
+// Thumbprint
+//
+// Created by Lee Buck on 4/17/09.
+// Copyright 2009 Blue Bright Ventures. All rights reserved.
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// Commercial licences without many of the obligations of GPL
+// are available for a nomial fee at sales@touchtankapps.com.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#import <Foundation/Foundation.h>
+#import "Element.h"
+
+@class CSSSelectorMatcher;
+@class CSSSelectorPart;
+
+#define CSSVerbChild @" > "
+#define CSSVerbSuccessor @" + "
+#define CSSVerbDescendant @" "
+#define CSSVerbAny @""
+#define CSSVerb NSString*
+
+/**
+ * CSSSelector is responsible for modeling a chain of CSSSelectorParts. For example
+ *
+ * body a.link
+ *
+ * is a chain of two parts "body" and "a.link"
+ *
+ * Parts are joined by "verbs" which correspond to symbols " ", "+", and ">"
+ * These parts define the relative position of the second part to the first
+ * Supported parts are:
+ * space within - the second part must match an Element within the
+ * Element matching the first part
+ *
+ * > child - the second part must match an Element whose parent is
+ * the Element matching the first part
+ *
+ * + successor - the second part must match an Element whose previous
+ * sybling was the Element matching the first part
+ */
+
+@interface CSSSelector : NSObject {
+ NSMutableArray* chain;
+}
+-(id)initWithString:(NSString*)string;
+-(NSString*)description;
+
+-(int)countOfParts;
+-(CSSSelectorPart*)partAtIndex:(int)index;
+-(CSSVerb)verbAtIndex:(int)index;
+-(CSSVerb)verbAfterIndex:(int)index;
+
+@end
View
97 AFFeedsReader/CSSSelector.m
@@ -0,0 +1,97 @@
+//
+// CSSSelector.m
+// Thumbprint
+//
+// Created by Lee Buck on 4/17/09.
+// Copyright 2009 Blue Bright Ventures. All rights reserved.
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// Commercial licences without many of the obligations of GPL
+// are available for a nomial fee at sales@touchtankapps.com.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#import "CSSSelector.h"
+#import "CSSSelectorPart.h"
+#import "NSString_HTML.h"
+#import "CSSSelectorMatcher.h"
+
+
+@implementation CSSSelector
+
+
+-(id)initWithString:(NSString*)string{
+ CFStringInlineBuffer buffer;
+ CFRange range = CFRangeMake(0, [string length]);
+ CFStringInitInlineBuffer((CFStringRef)string, &buffer, range);
+
+ chain = [[NSMutableArray alloc] initWithCapacity: 10];
+ unichar c;
+ CFIndex index = 0;
+ while (c = skipWhitespace(&buffer, &index)){
+ CSSSelectorPart* part = [[CSSSelectorPart alloc] initWithIndex: &index inBuffer: &buffer];
+ [chain addObject: part];
+ [part release];
+
+ c = skipWhitespace(&buffer, &index);
+ if (!c) break;
+
+ if (c=='+'){
+ [chain addObject: CSSVerbSuccessor];
+ index++;
+ }
+ else if (c=='>'){
+ [chain addObject: CSSVerbChild];
+ index++;
+ }
+ else
+ [chain addObject: CSSVerbDescendant];
+ }
+
+ return self;
+}
+
+-(void)dealloc{
+// NSLog(@"disposing of %@", [self description]);
+ [chain release];
+ [super dealloc];
+}
+
+-(NSString*)description{
+ NSMutableString* result = [NSMutableString string];
+ for (id item in chain){
+ [result appendString: [item description]];
+ }
+ return result;
+}
+
+-(int)countOfParts{
+ return ([chain count] + 1) / 2;
+}
+-(CSSSelectorPart*)partAtIndex:(int)index{
+ return [chain objectAtIndex: index * 2];
+}
+
+-(CSSVerb)verbAtIndex:(int)index{
+ return (index > 0) ? [chain objectAtIndex: index * 2 - 1] : CSSVerbAny;
+}
+
+// sometime we need to access the next verb after an index... see scopingElement
+-(CSSVerb)verbAfterIndex:(int)index{
+ return (index < [self countOfParts] - 1) ? [self verbAtIndex: index + 1] : CSSVerbAny;
+}
+
+@end
+
+
View
48 AFFeedsReader/CSSSelectorMatcher.h
@@ -0,0 +1,48 @@
+//
+// CSSSelectorMatcher.h
+// Thumbprint
+//
+// Created by Lee Buck on 4/19/09.
+// Copyright 2009 Blue Bright Ventures. All rights reserved.
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// Commercial licences without many of the obligations of GPL
+// are available for a nomial fee at sales@touchtankapps.com.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#import <Foundation/Foundation.h>
+#import "Element.h"
+#import "CSSSelector.h"
+#import "CSSPartMatcher.h"
+
+/**
+ * Responsible for matching a CSSSelector.
+ * It does this by minting matching parts and creating
+ * CSSPartMatchers for all intermediate potential matches
+ *
+ */
+
+@interface CSSSelectorMatcher : NSObject {
+ CSSSelector* selector;
+ CSSPartMatcher* rootMatch;
+ NSMutableArray* matches;
+}
+@property (nonatomic, retain) CSSSelector* selector;
+@property (nonatomic, retain) NSMutableArray* matches;
+
+-(id)initWithSelector:(CSSSelector*)selector;
+-(BOOL)matchElement:(Element*) element;
+-(Element*)firstMatch;
+@end
View
60 AFFeedsReader/CSSSelectorMatcher.m
@@ -0,0 +1,60 @@
+//
+// CSSSelectorMatcher.m
+// Thumbprint
+//
+// Created by Lee Buck on 4/19/09.
+// Copyright 2009 Blue Bright Ventures. All rights reserved.
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// Commercial licences without many of the obligations of GPL
+// are available for a nomial fee at sales@touchtankapps.com.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#import "CSSSelectorMatcher.h"
+#import "CSSSelectorPart.h"
+
+@implementation CSSSelectorMatcher
+
+@synthesize selector, matches;
+
+-(id)initWithSelector:(CSSSelector*)aSelector{
+ self = [super init];
+ selector = [aSelector retain];
+ rootMatch = [[CSSPartMatcher alloc] initWithElement: nil selectorMatcher: self];
+ matches = [[NSMutableArray alloc] initWithCapacity: 1];
+ return self;
+}
+
+-(void)dealloc{
+ [selector release];
+ [rootMatch release];
+ [matches release];
+ [super dealloc];
+}
+
+-(Element*)firstMatch{
+ return ([matches count] > 0) ? [matches objectAtIndex: 0] : nil;
+}
+
+-(BOOL)matchElement:(Element*) element{
+ if ([element isCloseTag]) return NO;
+ BOOL matchComplete = [rootMatch matchNextElement: element forIndex: 0];
+ if (matchComplete)
+ [matches addObject: element];
+ return matchComplete;
+}
+
+
+@end
View
67 AFFeedsReader/CSSSelectorPart.h
@@ -0,0 +1,67 @@
+//
+// CSSSelectorPart.h
+// Thumbprint
+//
+// Created by Lee Buck on 4/17/09.
+// Copyright 2009 Blue Bright Ventures. All rights reserved.
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// Commercial licences without many of the obligations of GPL
+// are available for a nomial fee at sales@touchtankapps.com.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#import <Foundation/Foundation.h>
+#import "Element.h"
+
+/**
+ * CSSSelectorPart is responsible for modeling one part of CSSSelector. For example
+ *
+ * a.link[target]
+ *
+ * is a part which matches <a> tags which have a link class name and an attribute 'target'
+ *
+ * A part can consist of one or more of the following:
+ *
+ * * All elements match (used when no tagname is supplied)
+ * tagname Matching elements have this tag name
+ * #id Matching elements have this as their id attribute
+ * .class Matching elements have this as one of their class names
+ * [attr] Matching elements have this attribute (regarless of its value)
+ * [attr=val] Matching elements have this attribute with this value
+ *
+ */
+
+
+@interface CSSSelectorPart : NSObject {
+ NSString* identifier;
+ NSString* tag;
+ NSMutableArray* classNames;
+ NSString* attrName;
+ NSString* attrValue;
+}
+
+
+@property (nonatomic, retain) NSString* identifier;
+@property (nonatomic, retain) NSString* tag;
+@property (nonatomic, retain) NSArray* classNames;
+@property (nonatomic, retain) NSString* attrName;
+@property (nonatomic, retain) NSString* attrValue;
+
+-(id)initWithIndex:(int*) index inString:(NSString*)string;
+-(id)initWithIndex:(CFIndex*) index inBuffer:(CFStringInlineBuffer*)buffer;
+-(NSString*)description;
+-(BOOL)matchesElement:(Element*)element;
+
+@end
View
161 AFFeedsReader/CSSSelectorPart.m
@@ -0,0 +1,161 @@
+//
+// CSSSelectorPart.m
+// Thumbprint
+//
+// Created by Lee Buck on 4/17/09.
+// Copyright 2009 Blue Bright Ventures. All rights reserved.
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// Commercial licences without many of the obligations of GPL
+// are available for a nomial fee at sales@touchtankapps.com.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#import "CSSSelectorPart.h"
+#import "NSString_HTML.h"
+
+@implementation CSSSelectorPart
+
+@synthesize identifier, tag, classNames, attrName, attrValue;
+
+-(id)initWithIndex:(int*) index inString:(NSString*)string{
+ CFStringInlineBuffer buffer;
+ CFRange range = CFRangeMake(0, [string length]);
+ CFStringInitInlineBuffer((CFStringRef)string, &buffer, range);
+ CFIndex i = 0;
+ self = [self initWithIndex: &i inBuffer: &buffer];
+ *index = i;
+ return self;
+
+}
+
+-(id)initWithIndex:(CFIndex*) index inBuffer:(CFStringInlineBuffer*)buffer{
+ unichar c;
+ CFIndex len;
+ c = skipWhitespace(buffer, index);
+ while (c > 32){
+ if (c=='#'){
+ len = lenToken(buffer, *index + 1);
+ assert(len);
+ self.identifier = createStringFromBuffer(buffer, *index + 1, len);
+ [self.identifier release];//retained by property setter
+ (*index) += len + 1;
+ }
+ else if (c == '.'){
+ len = lenToken(buffer, *index + 1);
+ assert(len);
+ NSString* className = createStringFromBuffer(buffer, *index + 1, len);
+ if (!classNames)
+ classNames = [[NSMutableArray alloc] initWithObjects: className, nil];
+ else
+ [classNames addObject: className];
+ [className release];
+ (*index) += len + 1;
+ }
+ else if (c == '['){
+ (*index)++;
+ c = skipWhitespace(buffer, index);
+ len = lenToken(buffer, *index);
+ assert(len);
+ self.attrName = createStringFromBuffer(buffer, *index, len);
+ [self.attrName release];//retained by property setter
+ (*index) += len;
+
+ c = skipWhitespace(buffer, index);
+
+ if (c == '='){
+ (*index)++;
+ c = skipWhitespace(buffer, index);
+ if (c=='\''){
+ len = lenThru(buffer, (*index) + 1, "'");
+ assert(len);
+ self.attrValue = createStringFromBuffer(buffer, *index + 1, len-1);
+ (*index)++;
+ }
+ else if (c == '"'){
+ len = lenThru(buffer, (*index) + 1, "\"");
+ assert(len);
+ self.attrValue = createStringFromBuffer(buffer, *index + 1, len-1);
+ (*index)++;
+ }
+ else{
+ len = lenToken(buffer, (*index));
+ assert(len);
+ self.attrValue = createStringFromBuffer(buffer, *index, len);
+ }
+ [self.attrValue release];//retained by property setter
+ (*index) += len;
+ c = skipWhitespace(buffer, index);
+ }
+ assert(c==']');
+ (*index) += 1;
+ }
+ else if (c == '*')
+ (*index)++;
+ else{
+ len = lenToken(buffer, (*index));
+ assert(len);
+ self.tag = createStringFromBuffer(buffer, *index, len);
+ [self.tag release];//retained by property setter
+ (*index) += len;
+ }
+ c = CFStringGetCharacterFromInlineBuffer(buffer, *index);
+ }
+ return self;
+}
+
+-(void)dealloc{
+ [identifier release];
+ [tag release];
+ [classNames release];
+ [attrName release];
+ [attrValue release];
+ [super dealloc];
+}
+
+-(BOOL)matchesElement:(Element*)element{
+ if(element.range.length == 0) return NO; //ElementParser's root
+ if (tag && ![element tagNameEquals: tag]) return NO;
+ if (identifier && ![identifier isEqualToString: [element attribute: @"id"]]) return NO;
+ if (classNames){
+ for (NSString* className in classNames)
+ if (![element hasClassName: className])
+ return NO;
+ }
+ if (attrName && attrValue && ![attrValue isEqualToString: [element attribute: attrName]]) return NO;
+ if (attrName && ![element hasAttribute: attrName]) return NO;
+ return YES;
+}
+
+-(NSString*)description{
+ NSMutableString* result = [NSMutableString string];
+ if (tag)
+ [result appendString: tag];
+ if (identifier)
+ [result appendFormat: @"#%@", identifier];
+ if (classNames){
+ for (NSString* className in classNames)
+ [result appendFormat: @".%@", className];
+ }
+ if (attrName){
+ [result appendFormat: @"[%@", attrName];
+ if (attrValue)
+ [result appendFormat: @"='%@']", attrValue];
+ else
+ [result appendString: @"]"];
+ }
+ return result;
+}
+
+@end
View
117 AFFeedsReader/Chunk.h
@@ -0,0 +1,117 @@
+//
+// Chunk.h
+// Thumbprint
+//
+// Created by Lee Buck on 4/21/09.
+// Copyright 2009 Blue Bright Ventures. All rights reserved.
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// Commercial licences without many of the obligations of GPL
+// are available for a nomial fee at sales@touchtankapps.com.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#import <Foundation/Foundation.h>
+
+#define ChunkKindDocument @"ChunkKindDocument"
+#define ChunkKindTag @"ChunkKindTag"
+#define ChunkKindPI @"ChunkKindPI"
+#define ChunkKindComment @"ChunkKindComment"
+#define ChunkKindEntity @"ChunkKindEntity"
+#define ChunkKindCData @"ChunkKindCData"
+#define ChunkKindDoctype @"ChunkKindDoctype"
+#define ChunkKindText @"ChunkKindText"
+
+/**
+ Chunk is a range of source text that has been divided into a meaningful "chunk" by
+ the NSString_HTML parser. Examples of a chunk include an element, a cdata section, an entity,
+ character data, etc. It is an abstract base class that handles basic housekeeping.
+ Subclasses include TagChunk, TxtChunk, CommentChunk, EntityChunk, etc.
+ */
+@interface Chunk : NSObject {
+ CFStringInlineBuffer* buffer;
+ NSString* source;
+ NSRange range;
+}
+
+
+
+/**
+ A human readable name for the chunk. Used for debugging purposes.
+ */
++(NSString*)humanName;
+
+
+/**
+ The string that contains the whole source being parsed.
+ */
+@property (nonatomic, retain) NSString* source;
+
+
+/**
+ The range within the source of this chunk. Includes delimiters like '<' and '>'
+ */
+@property NSRange range;
+
+
+/** During the parse (only) this buffer provides faster access to individual characters */
+@property CFStringInlineBuffer* buffer;
+
+
+/**
+ Only some of the whole string is buffered... when this chunk is delivered by the parser
+ the whole chunk will be available in the buffer
+ */
+@property (readonly) CFRange rangeInBuffer;
+
+
+/**
+ The interior of a chunk ususally excludes the delimiters. This method does the index
+ math to point inside the buffer. Currently only used to access the character
+ data within a cdata section.
+ */
+@property (readonly) CFRange interiorRangeInBuffer;
+
+
+/**
+ Creates a new chunk from the range aRange in aSource string
+ */
+-(id)initWithString: (NSString*)aSource range:(NSRange)aRange;
+
+
+/**
+ The interior of a chunk ususally excludes the delimiters of the chunk.
+ */
+-(NSRange)interiorRange;
+
+
+/**
+ Convenience method that returns a string corresponding to the interior of the chunk.
+ */
+-(NSString*)interiorString;
+
+
+/**
+ Each chunk has a kind denotes what type of chunk it is.
+ */
+-(NSString*)kind;
+
+
+/**
+ Convenience method to test kind
+ */
+-(BOOL)isKind:(NSString*)aKind;
+
+
+@end
View
85 AFFeedsReader/Chunk.m
@@ -0,0 +1,85 @@
+//
+// Chunk.m
+// Thumbprint
+//
+// Created by Lee Buck on 4/21/09.
+// Copyright 2009 Blue Bright Ventures. All rights reserved.
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// Commercial licences without many of the obligations of GPL
+// are available for a nomial fee at sales@touchtankapps.com.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#import "Chunk.h"
+
+
+@implementation Chunk
+
+@synthesize source, range, buffer;
+
+-(id)initWithString: (NSString*)aSource range:(NSRange)aRange{
+ source = [aSource retain];
+ range = aRange;
+ return self;
+}
+
+-(void)dealloc{
+ [source release];
+ [super dealloc];
+}
+
+-(CFRange)rangeInBuffer{
+ if (buffer)
+ return CFRangeMake(range.location + buffer->rangeToBuffer.location, range.length);
+ else
+ return CFRangeMake(kCFNotFound, 0);
+}
+
+-(CFRange)interiorRangeInBuffer{
+ if (buffer){
+ NSRange inRange = self.interiorRange;
+ return CFRangeMake(inRange.location + buffer->rangeToBuffer.location, inRange.length);
+ }
+ else
+ return CFRangeMake(kCFNotFound, 0);
+}
+
+-(NSRange)interiorRange{
+ return range;
+}
+
+-(NSString*)interiorString{
+ return [source substringWithRange: [self interiorRange]];
+}
+
+-(NSString*)kind{
+ [self doesNotRecognizeSelector: _cmd];
+ return nil;
+}
+
+-(BOOL)isKind:(NSString*)aKind{
+ return aKind == [self kind];
+}
+
+-(NSString*)description{
+ return [source substringWithRange: range];
+}
+
++(NSString*)humanName{
+ return @"generic";
+}
+
+
+@end
View
36 AFFeedsReader/CommentChunk.h
@@ -0,0 +1,36 @@
+//
+// CommentChunk.h
+// Thumbprint
+//
+// Created by Lee Buck on 4/21/09.
+// Copyright 2009 Blue Bright Ventures. All rights reserved.
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// Commercial licences without many of the obligations of GPL
+// are available for a nomial fee at sales@touchtankapps.com.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#import <Foundation/Foundation.h>
+#import "Chunk.h"
+
+
+/**
+ CommentChunk corresponds to a comment section.
+ */
+@interface CommentChunk : Chunk {
+
+}
+
+@end
View
41 AFFeedsReader/CommentChunk.m
@@ -0,0 +1,41 @@
+//
+// CommentChunk.m
+// Thumbprint
+//
+// Created by Lee Buck on 4/21/09.
+// Copyright 2009 Blue Bright Ventures. All rights reserved.
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// Commercial licences without many of the obligations of GPL
+// are available for a nomial fee at sales@touchtankapps.com.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#import "CommentChunk.h"
+
+
+@implementation CommentChunk
+
+-(NSRange)interiorRange{
+ return NSMakeRange(range.location + 4, range.length - 7);
+}
+-(NSString*)kind{
+ return ChunkKindComment;
+}
+
++(NSString*)humanName{
+ return @"comment";
+}
+
+@end
View
36 AFFeedsReader/DoctypeChunk.h
@@ -0,0 +1,36 @@
+//
+// DoctypeChunk.h
+// Thumbprint
+//
+// Created by Lee Buck on 4/25/09.
+// Copyright 2009 Blue Bright Ventures. All rights reserved.
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// Commercial licences without many of the obligations of GPL
+// are available for a nomial fee at sales@touchtankapps.com.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#import <Foundation/Foundation.h>
+#import "Chunk.h"
+
+/**
+ DoctypeChunk corresponds to a Doctype section. Note that the parser does not
+ extract declarations within an internal subset, and it ignores references to system and external ids.
+ */
+@interface DoctypeChunk : Chunk {
+
+}
+
+@end
View
42 AFFeedsReader/DoctypeChunk.m
@@ -0,0 +1,42 @@
+//
+// DoctypeChunk.m
+// Thumbprint
+//
+// Created by Lee Buck on 4/25/09.
+// Copyright 2009 Blue Bright Ventures. All rights reserved.
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// Commercial licences without many of the obligations of GPL
+// are available for a nomial fee at sales@touchtankapps.com.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#import "DoctypeChunk.h"
+
+
+@implementation DoctypeChunk
+
+-(NSString*)kind{
+ return ChunkKindDoctype;
+}
+
+-(NSRange)interiorRange{
+ return NSMakeRange(range.location + 9, range.length - 10);
+}
+
++(NSString*)humanName{
+ return @"doctype";
+}
+
+@end
View
30 AFFeedsReader/DocumentRoot.h
@@ -0,0 +1,30 @@
+//
+// DocumentRoot.h
+// Thumbprint
+//
+// Created by Lee Buck on 4/21/09.
+// Copyright 2009 Blue Bright Ventures. All rights reserved.
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// Commercial licences without many of the obligations of GPL
+// are available for a nomial fee at sales@touchtankapps.com.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#import <Foundation/Foundation.h>
+#import "Element.h"
+
+@interface DocumentRoot : Element {
+}
+@end
View
48 AFFeedsReader/DocumentRoot.m
@@ -0,0 +1,48 @@
+//
+// DocumentRoot.m
+// Thumbprint
+//
+// Created by Lee Buck on 4/21/09.
+// Copyright 2009 Blue Bright Ventures. All rights reserved.
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// Commercial licences without many of the obligations of GPL
+// are available for a nomial fee at sales@touchtankapps.com.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#import "DocumentRoot.h"
+
+@implementation DocumentRoot
+
+
+-(id)initWithString: (NSString*)aSource range:(NSRange)aRange{
+ self = [super initWithString: aSource range:aRange tagName: @"DOCUMENT ROOT"];
+ self.contentsLength = [aSource length];
+ return self;
+}
+
+-(NSString*)kind{
+ return ChunkKindDocument;
+}
+
+-(BOOL)isEmptyTag{
+ return NO;
+}
+
+-(BOOL)isCloseTag{
+ return NO;
+}
+
+@end
View
243 AFFeedsReader/Element.h
@@ -0,0 +1,243 @@
+//
+// Element.h
+// Thumbprint
+//
+// Created by Lee Buck on 4/18/09.
+// Copyright 2009 Blue Bright Ventures. All rights reserved.
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// Commercial licences without many of the obligations of GPL
+// are available for a nomial fee at sales@touchtankapps.com.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#import <Foundation/Foundation.h>
+#import "TagChunk.h"
+
+@class CSSSelector;
+@class DocumentRoot;
+
+/**
+ * An Element is the fundemental building block for ElementParser.
+ */
+@interface Element : TagChunk {
+ NSMutableDictionary* attributes;
+ BOOL attributesParsed;
+ Element* nextElement;
+ Element* nextSybling;
+ Element* parent;
+ int contentsLength;
+ NSString* contentsText;
+ NSString* key;
+ BOOL containsMarkup; // includes entities
+
+ NSObject* domainObject;
+}
+
+/**
+ * Returns a dictionary of attributes name/values.
+ * If an attribute had no value in the source (e.g. <table noborders>) then the value will be NSNull
+ * If the attributes have not yet been parsed, this will parser them first.
+ */
+@property (nonatomic, readonly) NSDictionary* attributes;
+
+
+/**
+ * The character data inside the element. This text is stripped of tags, whitespace, etc
+ * by stripTags. To see the actual source within the element, use contentsSource
+ */
+@property (nonatomic, retain) NSString* contentsText;
+
+
+/**
+ * A case-normalized version of the tagName when appropriate. Used in situations
+ * where the tag name might need to serve as a key into a dictionary
+ */
+@property (nonatomic, retain) NSString* key;
+
+/**
+ * One or more chunks where encountered within this element
+ * Used for more efficient return of contentsText
+ */
+@property BOOL containsMarkup;
+
+
+/**
+ * The length of the text from the end of the start tag to the start of the end tag
+ */
+@property int contentsLength;
+
+
+/**
+ * The next Element encountered in the document
+ */
+@property (nonatomic, retain) Element* nextElement;
+
+
+/**
+ * The next sybling Element (ie the Element at the same depth with the same parent)
+ */
+@property (nonatomic, retain) Element* nextSybling;
+
+
+/**
+ * The parent Element to this Element
+ */
+@property (nonatomic, assign) Element* parent;
+
+
+/**
+ * Available for developer's use to hang an object onto this Element
+ */
+@property (nonatomic, retain) NSObject* domainObject;
+
+
+/**
+ * Parses the supplied source and return an Element tree with Document element serving as the root
+ * or all top level elements. As HTML, Elements shall be considered case insensative and tag
+ * specific heuristics will be used to close tags intelligently. See ElementParser for details.
+ */
++(DocumentRoot*)parseHTML:(NSString*)source;
+
+
+/**
+ * Parses the supplied source and return an Element tree with Document element serving as the root
+ * or all top level elements. XML, Elements shall be considered case sensative. See ElementParser for details.
+ */
++(DocumentRoot*)parseXML:(NSString*)source;
+
+/**
+ * Initializer used by ElementParser. See TagChunk for other intializers
+ */
+-(id)initWithTag:(TagChunk*)tag caseSensative:(BOOL)aCaseSensative;
+
+
+/**
+ * Returns true if the element contains the specified attribute.
+ * If the attributes have not yet been parsed, this will parser them first.
+ */
+-(BOOL)hasAttribute:(NSString*)attr;
+
+
+/**
+ * Returns the value of a particular attribute (or nil if it doesn't exist)
+ * Note: ElementParser does not support default attributes
+ * If the attributes have not yet been parsed, this will parser them first.
+ */
+-(NSString*)attribute:(NSString*)attr;
+
+
+/**
+ * Convenience method to compare an element's tag name.
+ * Comparision will be cases sensative for XML elements and insensative for HTML elements.
+ */
+-(BOOL)isEqualToString:(NSString*)string;
+
+/**
+ * Convenience methods for getting NSObjects from elements and their children
+ */
+- (NSString*)contentsTextOfChildElement:(NSString*)selector;
+
+- (NSNumber*)contentsNumber;
+
+- (NSNumber*)contentsNumberOfChildElement:(NSString*)selector;
+
+
+/**
+ * An array of child Elements in document order
+ */
+-(NSArray*)childElements;
+
+/**
+ * An array of child Elements in document order
+ */
+-(NSArray*)syblingElements;
+
+
+/**
+ * The first child Element for this element (or nil if none).
+ */
+-(Element*)firstChild;
+
+
+/**
+ * A dictionary containing the tagnames of children as keys
+ * and the contentsText of the children as values.
+ * If duplicate children tag names are encountered, only the last will
+ * appear in the dictionary.
+ */
+-(NSDictionary*)contentsOfChildren;
+
+/**
+ * Returns true if the supplied Element is a parent of receiver or one of its parents
+ */
+-(BOOL)hasAncestor:(Element*)ancestor;
+
+
+/**
+ * Returns the nextElement but only if it has the scope Element as an ancestor
+ */
+-(Element*)nextElementWithinScope:(Element*)scope;
+
+
+/**
+ * Returns true if the class attribute contains the class name (perhaps as one of multiple classes).
+ */
+-(BOOL)hasClassName:(NSString*)aClassName;
+
+
+/**
+ * Returns true receiver can be a chlid of aParent. Used by ElementParser to prevent inappropriate
+ * nesting in HTML (e.g. <p><p>)
+ */
+-(BOOL)acceptsParent:(Element*)aParent;
+
+/**
+ * Debugging method
+ */
+-(NSString*)dumpTree;
+
+
+/**
+ * The source between the end of the open tag and the beginning of the close tag
+ */
+-(NSString*)contentsSource;
+
+
+/**
+ * Convenience method for using a selector to find elements within the receiver that match.
+ * See CSSSelector for details.
+ */
+-(Element*)elementWithCSSSelector:(CSSSelector*)selector;
+
+/**
+ * Convenience method for using a selector to find elements within the receiver that match
+ * See CSSSelector for details.
+ */
+-(Element*)selectElement:(NSString*)cssSelectorString;
+
+
+/**
+ * Convenience method for using a selector to find elements within the receiver that match
+ * See CSSSelector for details.
+ */
+-(NSArray*)elementsWithCSSSelector:(CSSSelector*)selector;
+
+/**
+ * Convenience method for using a selector to find elements within the receiver that match
+ * See CSSSelector for details.
+ */
+-(NSArray*)selectElements:(NSString*)cssSelectorString;
+
+@end
View
293 AFFeedsReader/Element.m
@@ -0,0 +1,293 @@
+//
+// Element.m
+// Thumbprint
+//
+// Created by Lee Buck on 4/18/09.
+// Copyright 2009 Blue Bright Ventures. All rights reserved.
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// Commercial licences without many of the obligations of GPL
+// are available for a nomial fee at sales@touchtankapps.com.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#import "Element.h"
+#import "NSString_HTML.h"
+#import "CSSSelectorMatcher.h"
+#import "ElementParser.h"
+
+@interface Element ()
+-(void)setAttributes:(NSDictionary*)dict;
+@end
+
+@implementation Element
+
+@synthesize nextElement, nextSybling, parent, contentsLength, contentsText, key, containsMarkup, domainObject;
+
+
++(DocumentRoot*)parseHTML:(NSString*)source{
+ ElementParser* parser = [[ElementParser alloc] init];
+ DocumentRoot* root = [parser parseHTML: source];
+ [[root retain] autorelease];
+ [parser release];
+ return root;
+}
+
++(DocumentRoot*)parseXML:(NSString*)source{
+ ElementParser* parser = [[ElementParser alloc] init];
+ DocumentRoot* root = [parser parseXML: source];
+ [[root retain] autorelease];
+ [parser release];
+ return root;
+}
+
+-(id)initWithString:(NSString*)string{
+ return [self initWithString: string range: NSMakeRange(0, [string length])];
+}
+
+-(id)initWithTag:(TagChunk*)tag caseSensative:(BOOL)aCaseSensative{
+ self = [self initWithString: tag.source range: tag.range tagName: tag.tagName];
+ [self setCaseSensative: aCaseSensative];
+ return self;
+}
+
+-(void)dealloc{
+ [attributes release];
+ [contentsText release];
+ [nextElement release];
+ [nextSybling release];
+ [key release];
+ [super dealloc];
+}
+
+
+-(void)setRange: (NSRange)aRange{
+ attributesParsed = NO;
+ [attributes removeAllObjects];
+ [super setRange: aRange];
+}
+
+//cleans up nested p tags
+-(BOOL)acceptsParent:(Element*)aParent{
+ if ([self tagNameEquals: @"p"] && [aParent tagNameEquals: @"p"])
+ return NO;
+ return YES;
+}
+
+
+-(BOOL)closesTag:(TagChunk*)aTag{
+ if (self == aTag || [self isEmptyTag]) //former case is true when shouldBeEmptyTag
+ return self == aTag;
+ else
+ return [super closesTag: aTag];
+}
+
+-(BOOL)hasAttribute:(NSString*)attr{
+ return [[[self attributes] allKeys] containsObject: attr];
+}
+
+-(NSString*)attribute:(NSString*)attr{
+ return [[self attributes] objectForKey: attr];
+}
+
+// warning, may contain empty classnames
+-(<