-
Notifications
You must be signed in to change notification settings - Fork 0
/
CKPage.m
136 lines (121 loc) · 4.04 KB
/
CKPage.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
/*
* 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.
*
* CKPage.m - A single page.
*/
#import "CKPost.h"
#import "CKThread.h"
#import "CKPage.h"
@implementation CKPage
- (id)init {
if((self = [super init]))
threads = [[NSMutableArray alloc] init];
return self;
}
- (BOOL)parseURL:(NSURL*)url {
if(url && url != URL && ![[url absoluteURL] isEqual:[URL absoluteURL]]) {
[URL release];
[board release];
URL = [url retain];
board = [[CKUtil parseBoard:URL] retain];
index = [CKUtil parsePage:URL];
DLog(@"URL: %@", URL);
DLog(@"Board: %@", board);
DLog(@"Index: %d",index);
}
return url != nil;
}
- (id)initByReferencingURL:(NSURL*)url {
if((self = [self init]) && [self parseURL:url])
return self;
[self release];
return nil;
}
+ (CKPage*)pageReferencingURL:(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;
}
+ (CKPage*)pageFromURL:(NSURL*)url { return [[[self alloc] initWithURL:url] autorelease]; }
- (id)initWithXML:(NSXMLDocument*)doc {
if((self = [self initByReferencingURL:[NSURL URLWithString:[doc URI]]]))
[self populate:doc];
return self;
}
+ (CKPage*)pageFromXML:(NSXMLDocument*)doc { return [[[self alloc] initWithXML:doc] autorelease]; }
- (void)dealloc {
[URL release];
[board release];
[threads release];
[super dealloc];
}
- (int)populate {
NSXMLDocument* doc;
int error = [CKUtil fetchXML:&doc fromURL:URL];
if(error != CK_ERR_SUCCESS)
return error;
if(![self parseURL:[NSURL URLWithString:[doc URI]]])
return CK_ERR_REDIRECT;
[self populate:doc];
return CK_ERR_SUCCESS;
}
- (void)populate:(NSXMLDocument*)doc {
index = [[[CKRecipe sharedRecipe] lookup:@"Page.Number" inDocument:doc] integerValue];
DLog(@"Index: %d",index);
[threads removeAllObjects];
NSString* URI = [doc URI];
for(NSString* href in [[[CKRecipe sharedRecipe] lookup:@"Page.Threads" inDocument:doc] componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]]) {
[doc setURI:[[NSURL URLWithString:href relativeToURL:URL] absoluteString]];
CKThread* thread = [[CKThread alloc] initWithPage:doc];
if(thread) {
[threads addObject:thread];
[thread release];
}
}
[doc setURI:URI];
DLog(@"Threads: %lu",(unsigned long)[threads count]);
}
@synthesize URL;
@synthesize board;
@synthesize index;
@synthesize threads;
- (CKThread*)getThread:(int)idx {
if(idx >= [threads count]) return nil;
if(![[threads objectAtIndex:idx] initialized])
[[threads objectAtIndex:idx] populate];
return [threads objectAtIndex:idx];
}
- (CKPost*)newestPost {
CKPost* result = nil;
CKPost* candidate;
for(CKThread* thread in threads)
if((candidate = [[thread posts] lastObject]).ID > result.ID)
result = candidate;
return result;
}
- (CKPost*)oldestPost {
CKPost* result = [[[threads objectAtIndex:0] posts] objectAtIndex:0];
CKPost* candidate;
for(int i = 1; i < [threads count]; i++)
if((candidate = [[[threads objectAtIndex:i] posts] objectAtIndex:0]).ID < result.ID)
result = candidate;
return result;
}
- (NSTimeInterval)rangeOfPosts { return [[[self newestPost] date] timeIntervalSinceDate:[[self oldestPost] date]]; }
- (NSString*)prettyPrint {
NSMutableString* print = [NSMutableString string];
for(CKThread* t in threads) {
int disp = fmin([t.posts count] - 5,1);
[print appendFormat:@"\n\e[4m\t%122s\e[0m\n%@\n\e[4m\t%122s\e[0m\n\t| %d posts and %d images",
"",[[t.posts objectAtIndex:0] prettyPrint],"",t.postcount,t.imagecount];
for(CKPost* p in [[t posts] subarrayWithRange:NSMakeRange(disp,[t.posts count] - disp)])
[print appendFormat:@"\n\t|\e[4m%120s\e[0m\n\t| %@","",
[[[p prettyPrint] componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]] componentsJoinedByString:@"\n\t| "]];
}
return [print stringByAppendingFormat:@"\n\t|\e[4m%120s\e[0m\n",""];
}
@end