appjam 0.1.8.7 → 0.1.8.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. data/README.md +9 -1
  2. data/lib/appjam/generators/help.rb +1 -1
  3. data/lib/appjam/generators/templates/blank/EiffelApplication.xcodeproj/project.pbxproj +356 -0
  4. data/lib/appjam/generators/templates/blank/EiffelApplication.xcodeproj/project.xcworkspace/xcuserdata/eiffel.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  5. data/lib/appjam/generators/templates/blank/EiffelApplication/AppDelegate.h.tt +3 -3
  6. data/lib/appjam/generators/templates/blank/EiffelApplication/AppDelegate.m.tt +5 -5
  7. data/lib/appjam/generators/templates/blank/EiffelApplication/EiffelApplication-Info.plist +1 -1
  8. data/lib/appjam/generators/templates/blank/EiffelApplication/EiffelApplication-Prefix.pch.tt +1 -1
  9. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/Toast/Toast+UIView.h +51 -0
  10. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/components/Toast/Toast+UIView.m +315 -0
  11. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/frameworks/RaptureXML/RXMLElement.h +97 -0
  12. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/frameworks/RaptureXML/RXMLElement.m +450 -0
  13. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/Objective-C-HMTL-Parser/HTMLNode.h +111 -0
  14. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/Objective-C-HMTL-Parser/HTMLNode.m +412 -0
  15. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/Objective-C-HMTL-Parser/HTMLParser.h +37 -0
  16. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/Objective-C-HMTL-Parser/HTMLParser.m +130 -0
  17. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/ObjectiveSugar/NSArray+ObjectiveSugar.h +39 -0
  18. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/ObjectiveSugar/NSArray+ObjectiveSugar.m +145 -0
  19. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/ObjectiveSugar/NSDictionary+ObjectiveSugar.h +18 -0
  20. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/ObjectiveSugar/NSDictionary+ObjectiveSugar.m +42 -0
  21. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/ObjectiveSugar/NSMutableArray+ObjectiveSugar.h +18 -0
  22. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/ObjectiveSugar/NSMutableArray+ObjectiveSugar.m +37 -0
  23. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/ObjectiveSugar/NSNumber+ObjectiveSugar.h +45 -0
  24. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/ObjectiveSugar/NSNumber+ObjectiveSugar.m +117 -0
  25. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/ObjectiveSugar/NSSet+ObjectiveSugar.h +21 -0
  26. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/ObjectiveSugar/NSSet+ObjectiveSugar.m +50 -0
  27. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/ObjectiveSugar/NSString+ObjectiveSugar.h +17 -0
  28. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/ObjectiveSugar/NSString+ObjectiveSugar.m +43 -0
  29. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/ObjectiveSugar/ObjectiveSugar.h +10 -0
  30. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SSKeychain/SSKeychain.h +160 -0
  31. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SSKeychain/SSKeychain.m +79 -0
  32. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SSKeychain/SSKeychainQuery.h +80 -0
  33. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SSKeychain/SSKeychainQuery.m +228 -0
  34. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SecureUDID/SecureUDID.h +75 -0
  35. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SecureUDID/SecureUDID.m +679 -0
  36. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/Helpers/NSString+Versioning.h +41 -0
  37. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/Helpers/NSString+Versioning.m +71 -0
  38. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/Helpers/SS+Functions.h +38 -0
  39. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/Helpers/SS+Functions.m +122 -0
  40. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/Helpers/SS+System.h +41 -0
  41. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/Helpers/SS+System.m +132 -0
  42. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/Helpers/SSArguments.h +156 -0
  43. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/JavaScript/NSArray+JavaScript.h +46 -0
  44. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/JavaScript/NSArray+JavaScript.m +135 -0
  45. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/JavaScript/NSDate+JavaScript.h +42 -0
  46. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/JavaScript/NSDate+JavaScript.m +90 -0
  47. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/JavaScript/NSDictionary+JavaScript.h +38 -0
  48. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/JavaScript/NSDictionary+JavaScript.m +38 -0
  49. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/JavaScript/NSMutableArray+JavaScript.h +46 -0
  50. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/JavaScript/NSMutableArray+JavaScript.m +131 -0
  51. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/JavaScript/NSMutableDictionary+JavaScript.h +36 -0
  52. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/JavaScript/NSMutableDictionary+JavaScript.m +42 -0
  53. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/JavaScript/NSMutableString+JavaScript.h +36 -0
  54. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/JavaScript/NSMutableString+JavaScript.m +42 -0
  55. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/JavaScript/NSNumber+JavaScript.h +36 -0
  56. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/JavaScript/NSNumber+JavaScript.m +44 -0
  57. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/JavaScript/NSObject+JavaScript.h +50 -0
  58. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/JavaScript/NSObject+JavaScript.m +114 -0
  59. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/JavaScript/NSString+JavaScript.h +43 -0
  60. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/JavaScript/NSString+JavaScript.m +94 -0
  61. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/JavaScript/SS+JavaScript.h +52 -0
  62. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/JavaScript/SS+JavaScript.m +168 -0
  63. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/JavaScript/SS+Types.h +42 -0
  64. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/JavaScript/SS+Types.m +42 -0
  65. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/NSDictionary+NamedProperties.h +41 -0
  66. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/NSDictionary+NamedProperties.m +271 -0
  67. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/SS.h +36 -0
  68. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/SS.m +38 -0
  69. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/SubjectiveScript.h +67 -0
  70. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/SubjectiveScript.m +30 -0
  71. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/Types/NSArray+SS.h +58 -0
  72. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/Types/NSArray+SS.m +152 -0
  73. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/Types/NSDate+SS.h +37 -0
  74. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/Types/NSDate+SS.m +47 -0
  75. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/Types/NSDictionary+SS.h +45 -0
  76. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/Types/NSDictionary+SS.m +61 -0
  77. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/Types/NSMutableArray+SS.h +43 -0
  78. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/Types/NSMutableArray+SS.m +83 -0
  79. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/Types/NSMutableDictionary+SS.h +47 -0
  80. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/Types/NSMutableDictionary+SS.m +100 -0
  81. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/Types/NSMutableString+SS.h +42 -0
  82. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/Types/NSMutableString+SS.m +70 -0
  83. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/Types/NSNumber+SS.h +51 -0
  84. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/Types/NSNumber+SS.m +86 -0
  85. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/Types/NSObject+SS.h +54 -0
  86. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/Types/NSObject+SS.m +153 -0
  87. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/Types/NSString+SS.h +46 -0
  88. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/Types/NSString+SS.m +91 -0
  89. data/lib/appjam/generators/templates/blank/EiffelApplication/libs/toolkit/SubjectiveScript/Types/SSTypes.h +67 -0
  90. data/lib/appjam/generators/templates/blank/EiffelApplicationTests/EiffelApplicationTests-Info.plist +1 -1
  91. data/lib/appjam/generators/templates/blank/EiffelApplicationTests/EiffelApplicationTests.h.tt +5 -5
  92. data/lib/appjam/generators/templates/blank/EiffelApplicationTests/EiffelApplicationTests.m.tt +7 -7
  93. data/lib/appjam/version.rb +1 -1
  94. metadata +84 -3
@@ -0,0 +1,412 @@
1
+ //
2
+ // HTMLNode.m
3
+ // StackOverflow
4
+ //
5
+ // Created by Ben Reeves on 09/03/2010.
6
+ // Copyright 2010 Ben Reeves. All rights reserved.
7
+ //
8
+
9
+ #import "HTMLNode.h"
10
+ #import <libxml/HTMLtree.h>
11
+
12
+ @implementation HTMLNode
13
+
14
+ -(HTMLNode*)parent
15
+ {
16
+ return [[HTMLNode alloc] initWithXMLNode:_node->parent];
17
+ }
18
+
19
+ -(HTMLNode*)nextSibling {
20
+ return [[HTMLNode alloc] initWithXMLNode:_node->next];
21
+ }
22
+
23
+ -(HTMLNode*)previousSibling {
24
+ return [[HTMLNode alloc] initWithXMLNode:_node->prev];
25
+ }
26
+
27
+ void setAttributeNamed(xmlNode * node, const char * nameStr, const char * value) {
28
+
29
+ char * newVal = (char *)malloc(strlen(value)+1);
30
+ memcpy (newVal, value, strlen(value)+1);
31
+
32
+ for(xmlAttrPtr attr = node->properties; NULL != attr; attr = attr->next)
33
+ {
34
+ if (strcmp((char*)attr->name, nameStr) == 0)
35
+ {
36
+ for(xmlNode * child = attr->children; NULL != child; child = child->next)
37
+ {
38
+ free(child->content);
39
+ child->content = (xmlChar*)newVal;
40
+ break;
41
+ }
42
+ break;
43
+ }
44
+ }
45
+
46
+
47
+ }
48
+
49
+ NSString * getAttributeNamed(xmlNode * node, const char * nameStr)
50
+ {
51
+ for(xmlAttrPtr attr = node->properties; NULL != attr; attr = attr->next)
52
+ {
53
+ if (strcmp((char*)attr->name, nameStr) == 0)
54
+ {
55
+ for(xmlNode * child = attr->children; NULL != child; child = child->next)
56
+ {
57
+ return [NSString stringWithCString:(void*)child->content encoding:NSUTF8StringEncoding];
58
+
59
+ }
60
+ break;
61
+ }
62
+ }
63
+
64
+ return NULL;
65
+ }
66
+
67
+ -(NSString*)getAttributeNamed:(NSString*)name
68
+ {
69
+ const char * nameStr = [name UTF8String];
70
+
71
+ return getAttributeNamed(_node, nameStr);
72
+ }
73
+
74
+ //Returns the class name
75
+ -(NSString*)className
76
+ {
77
+ return [self getAttributeNamed:@"class"];
78
+ }
79
+
80
+ //Returns the tag name
81
+ -(NSString*)tagName
82
+ {
83
+ return [NSString stringWithCString:(void*)_node->name encoding:NSUTF8StringEncoding];
84
+ }
85
+
86
+
87
+ -(HTMLNode*)firstChild
88
+ {
89
+ return [[HTMLNode alloc] initWithXMLNode:_node->children];
90
+ }
91
+
92
+
93
+ -(void)findChildrenWithAttribute:(const char*)attribute matchingName:(const char*)className inXMLNode:(xmlNode *)node inArray:(NSMutableArray*)array allowPartial:(BOOL)partial
94
+ {
95
+ xmlNode *cur_node = NULL;
96
+ const char * classNameStr = className;
97
+ //BOOL found = NO;
98
+
99
+ for (cur_node = node; cur_node; cur_node = cur_node->next)
100
+ {
101
+ for(xmlAttrPtr attr = cur_node->properties; NULL != attr; attr = attr->next)
102
+ {
103
+
104
+ if (strcmp((char*)attr->name, attribute) == 0)
105
+ {
106
+ for(xmlNode * child = attr->children; NULL != child; child = child->next)
107
+ {
108
+
109
+ BOOL match = NO;
110
+ if (!partial && strcmp((char*)child->content, classNameStr) == 0)
111
+ match = YES;
112
+ else if (partial && strstr ((char*)child->content, classNameStr) != NULL)
113
+ match = YES;
114
+
115
+ if (match)
116
+ {
117
+ //Found node
118
+ HTMLNode * nNode = [[HTMLNode alloc] initWithXMLNode:cur_node];
119
+ [array addObject:nNode];
120
+ break;
121
+ }
122
+ }
123
+ break;
124
+ }
125
+ }
126
+
127
+ [self findChildrenWithAttribute:attribute matchingName:className inXMLNode:cur_node->children inArray:array allowPartial:partial];
128
+ }
129
+
130
+ }
131
+
132
+ -(void)findChildTags:(NSString*)tagName inXMLNode:(xmlNode *)node inArray:(NSMutableArray*)array
133
+ {
134
+ xmlNode *cur_node = NULL;
135
+ const char * tagNameStr = [tagName UTF8String];
136
+
137
+ if (tagNameStr == nil)
138
+ return;
139
+
140
+ for (cur_node = node; cur_node; cur_node = cur_node->next)
141
+ {
142
+ if (cur_node->name && strcmp((char*)cur_node->name, tagNameStr) == 0)
143
+ {
144
+ HTMLNode * node = [[HTMLNode alloc] initWithXMLNode:cur_node];
145
+ [array addObject:node];
146
+
147
+ }
148
+
149
+ [self findChildTags:tagName inXMLNode:cur_node->children inArray:array];
150
+ }
151
+ }
152
+
153
+
154
+ -(NSArray*)findChildTags:(NSString*)tagName
155
+ {
156
+ NSMutableArray * array = [NSMutableArray array];
157
+
158
+ [self findChildTags:tagName inXMLNode:_node->children inArray:array];
159
+
160
+ return array;
161
+ }
162
+
163
+ -(HTMLNode*)findChildTag:(NSString*)tagName inXMLNode:(xmlNode *)node
164
+ {
165
+ xmlNode *cur_node = NULL;
166
+ const char * tagNameStr = [tagName UTF8String];
167
+
168
+ for (cur_node = node; cur_node; cur_node = cur_node->next)
169
+ {
170
+ if (cur_node && cur_node->name && strcmp((char*)cur_node->name, tagNameStr) == 0)
171
+ {
172
+ return [[HTMLNode alloc] initWithXMLNode:cur_node];
173
+ }
174
+
175
+ HTMLNode * cNode = [self findChildTag:tagName inXMLNode:cur_node->children];
176
+ if (cNode != NULL)
177
+ {
178
+ return cNode;
179
+ }
180
+ }
181
+
182
+ return NULL;
183
+ }
184
+
185
+ -(HTMLNode*)findChildTag:(NSString*)tagName
186
+ {
187
+ return [self findChildTag:tagName inXMLNode:_node->children];
188
+ }
189
+
190
+
191
+ -(NSArray*)children
192
+ {
193
+ xmlNode *cur_node = NULL;
194
+ NSMutableArray * array = [NSMutableArray array];
195
+
196
+ for (cur_node = _node->children; cur_node; cur_node = cur_node->next)
197
+ {
198
+ HTMLNode * node = [[HTMLNode alloc] initWithXMLNode:cur_node];
199
+ [array addObject:node];
200
+ }
201
+
202
+ return array;
203
+ }
204
+
205
+ /*
206
+ -(NSString*)description
207
+ {
208
+ NSString * string = [NSString stringWithFormat:@"<%s>%@\n", _node->name, [self contents]];
209
+
210
+ for (HTMLNode * child in [self children])
211
+ {
212
+ string = [string stringByAppendingString:[child description]];
213
+ }
214
+
215
+ string = [string stringByAppendingString:[NSString stringWithFormat:@"<%s>\n", _node->name]];
216
+
217
+ return string;
218
+ }*/
219
+
220
+ -(HTMLNode*)findChildWithAttribute:(const char*)attribute matchingName:(const char*)name inXMLNode:(xmlNode *)node allowPartial:(BOOL)partial
221
+ {
222
+ xmlNode *cur_node = NULL;
223
+ const char * classNameStr = name;
224
+ //BOOL found = NO;
225
+
226
+ if (node == NULL)
227
+ return NULL;
228
+
229
+ for (cur_node = node; cur_node; cur_node = cur_node->next)
230
+ {
231
+ for(xmlAttrPtr attr = cur_node->properties; NULL != attr; attr = attr->next)
232
+ {
233
+ if (strcmp((char*)attr->name, attribute) == 0)
234
+ {
235
+ for(xmlNode * child = attr->children; NULL != child; child = child->next)
236
+ {
237
+
238
+ BOOL match = NO;
239
+ if (!partial && strcmp((char*)child->content, classNameStr) == 0)
240
+ match = YES;
241
+ else if (partial && strstr ((char*)child->content, classNameStr) != NULL)
242
+ match = YES;
243
+
244
+ if (match)
245
+ {
246
+ return [[HTMLNode alloc] initWithXMLNode:cur_node];
247
+ }
248
+ }
249
+ break;
250
+ }
251
+ }
252
+
253
+ HTMLNode * cNode = [self findChildWithAttribute:attribute matchingName:name inXMLNode:cur_node->children allowPartial:partial];
254
+ if (cNode != NULL)
255
+ {
256
+ return cNode;
257
+ }
258
+ }
259
+
260
+ return NULL;
261
+ }
262
+
263
+ -(HTMLNode*)findChildWithAttribute:(NSString*)attribute matchingName:(NSString*)className allowPartial:(BOOL)partial
264
+ {
265
+ return [self findChildWithAttribute:[attribute UTF8String] matchingName:[className UTF8String] inXMLNode:_node->children allowPartial:partial];
266
+ }
267
+
268
+ -(HTMLNode*)findChildOfClass:(NSString*)className
269
+ {
270
+ HTMLNode * node = [self findChildWithAttribute:"class" matchingName:[className UTF8String] inXMLNode:_node->children allowPartial:NO];
271
+ return node;
272
+ }
273
+
274
+ -(NSArray*)findChildrenWithAttribute:(NSString*)attribute matchingName:(NSString*)className allowPartial:(BOOL)partial
275
+ {
276
+ NSMutableArray * array = [NSMutableArray array];
277
+
278
+ [self findChildrenWithAttribute:[attribute UTF8String] matchingName:[className UTF8String] inXMLNode:_node->children inArray:array allowPartial:partial];
279
+
280
+ return array;
281
+ }
282
+
283
+
284
+ -(NSArray*)findChildrenOfClass:(NSString*)className
285
+ {
286
+ return [self findChildrenWithAttribute:@"class" matchingName:className allowPartial:NO];
287
+ }
288
+
289
+ -(id)initWithXMLNode:(xmlNode*)xmlNode
290
+ {
291
+ if (self = [super init])
292
+ {
293
+ _node = xmlNode;
294
+ }
295
+ return self;
296
+ }
297
+
298
+ -(void)appendChildContentsToString:(NSMutableString*)string inNode:(xmlNode*)node
299
+ {
300
+ if (node == NULL)
301
+ return;
302
+
303
+ xmlNode *cur_node = NULL;
304
+ for (cur_node = node; cur_node; cur_node = cur_node->next)
305
+ {
306
+ if (cur_node->content)
307
+ {
308
+ [string appendString:[NSString stringWithCString:(void*)cur_node->content encoding:NSUTF8StringEncoding]];
309
+ }
310
+
311
+ [self appendChildContentsToString:string inNode:cur_node->children];
312
+ }
313
+ }
314
+
315
+ -(NSString*)contents
316
+ {
317
+ if (_node->children && _node->children->content)
318
+ {
319
+ return [NSString stringWithCString:(void*)_node->children->content encoding:NSUTF8StringEncoding];
320
+ }
321
+
322
+ return nil;
323
+ }
324
+
325
+ HTMLNodeType nodeType(xmlNode * _node)
326
+ {
327
+ if (_node == NULL || _node->name == NULL)
328
+ return HTMLUnkownNode;
329
+
330
+ const char * tagName = (const char*)_node->name;
331
+ if (strcmp(tagName, "a") == 0)
332
+ return HTMLHrefNode;
333
+ else if (strcmp(tagName, "text") == 0)
334
+ return HTMLTextNode;
335
+ else if (strcmp(tagName, "code") == 0)
336
+ return HTMLCodeNode;
337
+ else if (strcmp(tagName, "span") == 0)
338
+ return HTMLSpanNode;
339
+ else if (strcmp(tagName, "p") == 0)
340
+ return HTMLPNode;
341
+ else if (strcmp(tagName, "ul") == 0)
342
+ return HTMLUlNode;
343
+ else if (strcmp(tagName, "li") == 0)
344
+ return HTMLLiNode;
345
+ else if (strcmp(tagName, "image") == 0)
346
+ return HTMLImageNode;
347
+ else if (strcmp(tagName, "ol") == 0)
348
+ return HTMLOlNode;
349
+ else if (strcmp(tagName, "strong") == 0)
350
+ return HTMLStrongNode;
351
+ else if (strcmp(tagName, "pre") == 0)
352
+ return HTMLPreNode;
353
+ else if (strcmp(tagName, "blockquote") == 0)
354
+ return HTMLBlockQuoteNode;
355
+ else
356
+ return HTMLUnkownNode;
357
+
358
+ }
359
+
360
+ -(HTMLNodeType)nodetype
361
+ {
362
+ return nodeType(_node);
363
+ }
364
+
365
+ NSString * allNodeContents(xmlNode*node)
366
+ {
367
+ if (node == NULL)
368
+ return nil;
369
+
370
+ void * contents = xmlNodeGetContent(node);
371
+ if (contents)
372
+ {
373
+
374
+ NSString * string = [NSString stringWithCString:contents encoding:NSUTF8StringEncoding];
375
+ xmlFree(contents);
376
+ return string;
377
+ }
378
+
379
+ return @"";
380
+ }
381
+
382
+ -(NSString*)allContents
383
+ {
384
+ return allNodeContents(_node);
385
+ }
386
+
387
+ NSString * rawContentsOfNode(xmlNode * node)
388
+ {
389
+ xmlBufferPtr buffer = xmlBufferCreateSize(1000);
390
+ xmlOutputBufferPtr buf = xmlOutputBufferCreateBuffer(buffer, NULL);
391
+
392
+ htmlNodeDumpOutput(buf, node->doc, node, (const char*)node->doc->encoding);
393
+
394
+ xmlOutputBufferFlush(buf);
395
+
396
+ NSString * string = nil;
397
+
398
+ if (buffer->content) {
399
+ string = [[NSString alloc] initWithBytes:(const void *)xmlBufferContent(buffer) length:xmlBufferLength(buffer) encoding:NSUTF8StringEncoding];
400
+ }
401
+
402
+ xmlOutputBufferClose(buf);
403
+ xmlBufferFree(buffer);
404
+
405
+ return string;
406
+ }
407
+
408
+ -(NSString*)rawContents {
409
+ return rawContentsOfNode(_node);
410
+ }
411
+
412
+ @end
@@ -0,0 +1,37 @@
1
+ //
2
+ // HTMLParser.h
3
+ // StackOverflow
4
+ //
5
+ // Created by Ben Reeves on 09/03/2010.
6
+ // Copyright 2010 Ben Reeves. All rights reserved.
7
+ //
8
+
9
+ #import <Foundation/Foundation.h>
10
+ #import <libxml/HTMLparser.h>
11
+ #import "HTMLNode.h"
12
+
13
+ @class HTMLNode;
14
+
15
+ @interface HTMLParser : NSObject
16
+ {
17
+ @public
18
+ htmlDocPtr _doc;
19
+ }
20
+
21
+ -(id)initWithContentsOfURL:(NSURL*)url error:(NSError**)error;
22
+ -(id)initWithData:(NSData*)data error:(NSError**)error;
23
+ -(id)initWithString:(NSString*)string error:(NSError**)error;
24
+
25
+ //Returns the doc tag
26
+ -(HTMLNode*)doc;
27
+
28
+ //Returns the body tag
29
+ -(HTMLNode*)body;
30
+
31
+ //Returns the html tag
32
+ -(HTMLNode*)html;
33
+
34
+ //Returns the head tag
35
+ - (HTMLNode*)head;
36
+
37
+ @end
@@ -0,0 +1,130 @@
1
+ //
2
+ // HTMLParser.m
3
+ // StackOverflow
4
+ //
5
+ // Created by Ben Reeves on 09/03/2010.
6
+ // Copyright 2010 Ben Reeves. All rights reserved.
7
+ //
8
+
9
+ #import "HTMLParser.h"
10
+
11
+
12
+ @implementation HTMLParser
13
+
14
+ -(HTMLNode*)doc
15
+ {
16
+ if (_doc == NULL)
17
+ return NULL;
18
+
19
+ return [[HTMLNode alloc] initWithXMLNode:(xmlNode*)_doc];
20
+ }
21
+
22
+ -(HTMLNode*)html
23
+ {
24
+ if (_doc == NULL)
25
+ return NULL;
26
+
27
+ return [[self doc] findChildTag:@"html"];
28
+ }
29
+
30
+ -(HTMLNode*)head
31
+ {
32
+ if (_doc == NULL)
33
+ return NULL;
34
+
35
+ return [[self doc] findChildTag:@"head"];
36
+ }
37
+
38
+ -(HTMLNode*)body
39
+ {
40
+ if (_doc == NULL)
41
+ return NULL;
42
+
43
+ return [[self doc] findChildTag:@"body"];
44
+ }
45
+
46
+ -(id)initWithString:(NSString*)string error:(NSError**)error
47
+ {
48
+ if (self = [super init])
49
+ {
50
+ _doc = NULL;
51
+
52
+ if ([string length] > 0)
53
+ {
54
+ CFStringEncoding cfenc = CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding);
55
+ CFStringRef cfencstr = CFStringConvertEncodingToIANACharSetName(cfenc);
56
+ const char *enc = CFStringGetCStringPtr(cfencstr, 0);
57
+ // _doc = htmlParseDoc((xmlChar*)[string UTF8String], enc);
58
+ int optionsHtml = HTML_PARSE_RECOVER;
59
+ optionsHtml = optionsHtml | HTML_PARSE_NOERROR; //Uncomment this to see HTML errors
60
+ optionsHtml = optionsHtml | HTML_PARSE_NOWARNING;
61
+ _doc = htmlReadDoc ((xmlChar*)[string UTF8String], NULL, enc, optionsHtml);
62
+ }
63
+ else
64
+ {
65
+ if (error) {
66
+ *error = [NSError errorWithDomain:@"HTMLParserdomain" code:1 userInfo:nil];
67
+ }
68
+ }
69
+ }
70
+
71
+ return self;
72
+ }
73
+
74
+ -(id)initWithData:(NSData*)data error:(NSError**)error
75
+ {
76
+ if (self = [super init])
77
+ {
78
+ _doc = NULL;
79
+
80
+ if (data)
81
+ {
82
+ CFStringEncoding cfenc = CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding);
83
+ CFStringRef cfencstr = CFStringConvertEncodingToIANACharSetName(cfenc);
84
+ const char *enc = CFStringGetCStringPtr(cfencstr, 0);
85
+ //_doc = htmlParseDoc((xmlChar*)[data bytes], enc);
86
+
87
+ _doc = htmlReadDoc((xmlChar*)[data bytes],
88
+ "",
89
+ enc,
90
+ XML_PARSE_NOERROR | XML_PARSE_NOWARNING);
91
+ }
92
+ else
93
+ {
94
+ if (error)
95
+ {
96
+ *error = [NSError errorWithDomain:@"HTMLParserdomain" code:1 userInfo:nil];
97
+ }
98
+
99
+ }
100
+ }
101
+
102
+ return self;
103
+ }
104
+
105
+ -(id)initWithContentsOfURL:(NSURL*)url error:(NSError**)error
106
+ {
107
+
108
+ NSData * _data = [[NSData alloc] initWithContentsOfURL:url options:0 error:error];
109
+
110
+ if (_data == nil || *error)
111
+ {
112
+ return nil;
113
+ }
114
+
115
+ self = [self initWithData:_data error:error];
116
+
117
+ return self;
118
+ }
119
+
120
+
121
+ -(void)dealloc
122
+ {
123
+ if (_doc)
124
+ {
125
+ xmlFreeDoc(_doc);
126
+ }
127
+
128
+ }
129
+
130
+ @end