-
Notifications
You must be signed in to change notification settings - Fork 0
/
CKChan.m
149 lines (128 loc) · 5.29 KB
/
CKChan.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/*
* ChanKit - Imageboard parsing and interaction.
* Copyright 2009-2012 command-Q.org. All rights reserved.
* This framework is distributed under the terms of the Do What The Fuck You Want To Public License, Version 2.
*
* CKChan.m - Top level object encapsulating an entire imageboard. All other objects can be navigated to from here.
*/
#import "CKImage.h"
#import "CKBoard.h"
#import "CKChan.h"
@implementation CKChan
- (id)init {
if((self = [super init]))
boards = [[NSMutableArray alloc] init];
return self;
}
- (id)initByReferencingURL:(NSURL*)url {
if((self = [self init])) {
URL = [url retain];
DLog(@"URL: %@",URL);
}
return self;
}
+ (CKChan*)chanReferencingURL:(NSURL*)url { return [[[self alloc] initByReferencingURL:url] autorelease]; }
- (id)initWithURL:(NSURL*)url {
if((self = [self initByReferencingURL:url]) && ![self populate])
return self;
[self release];
return nil;
}
+ (CKChan*)chanFromURL:(NSURL*)url { return [[[self alloc] initWithURL:url] autorelease]; }
// sitename must be part of the supported sites array of a recipe
- (id)initWithName:(NSString*)sitename {
NSURL* url;
if((url = [[CKRecipe sharedRecipe] URLForSite:sitename]))
return [self initWithURL:url];
[self release];
return nil;
}
+ (CKChan*)chanNamed:(NSString*)sitename { return [[[self alloc] initWithName:sitename] autorelease]; }
- (void)dealloc {
[URL release];
[name release];
[about release];
[slogan release];
[logo release];
[links release];
[categories release];
[boards release];
[super dealloc];
}
- (int)populate {
NSXMLDocument* doc;
int error = [CKUtil fetchXML:&doc fromURL:URL];
if(error != CK_ERR_SUCCESS)
return error;
NSURL* docURL = [[NSURL alloc] initWithString:[doc URI]];
if(!docURL) return CK_ERR_REDIRECT;
if(![[docURL absoluteURL] isEqual:[URL absoluteURL]]) {
[URL release];
URL = docURL;
}
else [docURL release];
name = [[[CKRecipe sharedRecipe] lookup:@"Chan.Name" inDocument:doc] retain];
DLog(@"Name: %@",name);
slogan = [[[CKRecipe sharedRecipe] lookup:@"Chan.Slogan" inDocument:doc] retain];
DLog(@"Slogan: %@",slogan);
about = [[[CKRecipe sharedRecipe] lookup:@"Chan.About" inDocument:doc] retain];
DLog(@"About: %@",about);
NSString* csshref = [[CKRecipe sharedRecipe] lookup:@"Chan.Stylesheet" inDocument:doc];
if(csshref) {
ASIHTTPRequest* fetch = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:csshref relativeToURL:URL]];
[CKUtil setProxy:[[NSUserDefaults standardUserDefaults] URLForKey:@"CKProxySetting"] onRequest:fetch];
[fetch startSynchronous];
if([CKUtil validateResponse:fetch] == CK_ERR_SUCCESS) {
NSString* logohref = [[fetch responseString] stringByMatching:[[CKRecipe sharedRecipe] lookup:@"Chan.Logo"] capture:1L];
if(logohref)
logo = [[CKImage alloc] initByReferencingURL:[NSURL URLWithString:logohref relativeToURL:URL]];
}
}
categories = [[[[CKRecipe sharedRecipe] lookup:@"Chan.Categories" inDocument:doc] componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]] retain];
DLog(@"Categories: \n%@",categories);
NSMutableArray* linkurls = [[[[CKRecipe sharedRecipe] lookup:@"Chan.Links.URLs" inDocument:doc]
componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]] mutableCopy];
for(int i = 0; i < [linkurls count]; i++)
[linkurls replaceObjectAtIndex:i withObject:[URL URLByAppendingPathComponent:[linkurls objectAtIndex:i]]];
links = [[NSDictionary alloc] initWithObjects:linkurls forKeys:[[[CKRecipe sharedRecipe] lookup:@"Chan.Links.Keys" inDocument:doc]
componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]]];
[linkurls release];
DLog(@"Links: %@",links);
for(NSString* boardlink in [[[CKRecipe sharedRecipe] lookup:@"Chan.Boards.URL" inDocument:doc] componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]]) {
CKBoard* board = [[CKBoard alloc] initByReferencingURL:[NSURL URLWithString:boardlink relativeToURL:URL]
title:[[CKRecipe sharedRecipe] lookup:@"Chan.Boards.Title" inDocument:doc test:boardlink]
category:[[CKRecipe sharedRecipe] lookup:@"Chan.Boards.Category" inDocument:doc test:boardlink]
is18plus:[[CKRecipe sharedRecipe] lookup:@"Chan.Boards.Age" inDocument:doc test:boardlink] != nil];
if(board) {
[boards addObject:board];
[board release];
}
}
DLog(@"# of Boards: %lu",(unsigned long)[boards count]);
return CK_ERR_SUCCESS;
}
@synthesize URL;
@synthesize name;
@synthesize about;
@synthesize slogan;
@synthesize logo;
@synthesize links;
@synthesize categories;
@synthesize boards;
- (NSArray*)workSafeBoards {
return [boards filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF.is18plus = NO"]];
}
- (NSArray*)boardsInCategory:(NSString*)category {
return [boards filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF.category = %@",category]];
}
- (CKBoard*)boardNamed:(NSString*)nm {
NSUInteger index = [boards indexOfObjectPassingTest:^(id board, NSUInteger idx, BOOL *stop) {
return *stop = [[board name] isEqualToString:nm];
}];
if(index != NSNotFound) {
[[boards objectAtIndex:index] populate];
return [boards objectAtIndex:index];
}
return nil;
}
@end