This repository has been archived by the owner on Mar 7, 2023. It is now read-only.
/
GuideCatchingWebView.m
126 lines (106 loc) · 3.99 KB
/
GuideCatchingWebView.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
//
// GuideCatchingWebView.m
// iFixit
//
// Created by David Patierno on 4/21/11.
// Copyright 2011 iFixit. All rights reserved.
//
#import "GuideCatchingWebView.h"
#import "iFixitAppDelegate.h"
#import "Config.h"
#import "RegexKitLite.h"
#import "SVWebViewController.h"
#import "GuideViewController.h"
@implementation GuideCatchingWebView
@synthesize externalDelegate, externalURL, formatter, modalDelegate, linksOpenInSameWindow;
- (id)initWithCoder:(NSCoder *)aDecoder {
if ((self = [super initWithCoder:aDecoder])) {
self.delegate = self;
self.formatter = [[[NSNumberFormatter alloc] init] autorelease];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
}
return self;
}
- (id)initWithFrame:(CGRect)frame {
if ((self = [super initWithFrame:frame])) {
self.delegate = self;
self.formatter = [[[NSNumberFormatter alloc] init] autorelease];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
}
return self;
}
- (void)setDelegate:(id<UIWebViewDelegate>)newDelegate {
if (newDelegate == self) {
super.delegate = self;
}
else {
self.externalDelegate = newDelegate;
}
}
- (NSInteger)parseGuideURL:(NSString *)url {
/*
(
"http:",
"",
"www.ifixit.com",
Guide,
"Installing-iPhone-4-Speaker-Enclosure",
3149,
1
)
*/
NSString *regexString = [NSString stringWithFormat:@"https?://%@/(Guide|Teardown|Project)/(.*?)/([0-9]+)/([0-9]+)", [Config currentConfig].host];
NSString *guideidString = [url stringByMatching:regexString capture:3];
NSNumber *guideid = guideidString ? [formatter numberFromString:guideidString] : [NSNumber numberWithInt:-1];
return [guideid intValue];
}
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
// Open guides with the native viewer.
NSInteger guideid = [self parseGuideURL:[[request URL] absoluteString]];
iFixitAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
if (guideid != -1) {
GuideViewController *vc = [[GuideViewController alloc] initWithGuideid:guideid];
if (!modalDelegate)
[delegate.window.rootViewController presentModalViewController:vc animated:YES];
else
[modalDelegate presentModalViewController:vc animated:YES];
[vc release];
return NO;
}
BOOL shouldStart = YES;
if ([externalDelegate respondsToSelector:@selector(webView:shouldStartLoadWithRequest:navigationType:)])
shouldStart = [externalDelegate webView:webView shouldStartLoadWithRequest:request navigationType:navigationType];
if (shouldStart) {
if (linksOpenInSameWindow)
return YES;
// Open all other URLs with modal view.
if (navigationType == UIWebViewNavigationTypeLinkClicked) {
SVWebViewController *webViewController = [[SVWebViewController alloc] initWithAddress:[[request URL] absoluteString]];
if (!modalDelegate)
[delegate.window.rootViewController presentModalViewController:webViewController animated:YES];
else
[modalDelegate presentModalViewController:webViewController animated:YES];
[webViewController release];
return NO;
}
}
return shouldStart;
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
if (buttonIndex)
[[UIApplication sharedApplication] openURL:externalURL];
}
- (void)webViewDidFinishLoad:(UIWebView *)webView {
if ([externalDelegate respondsToSelector:@selector(webViewDidFinishLoad:)])
[externalDelegate webViewDidFinishLoad:webView];
}
- (void)webViewDidStartLoad:(UIWebView *)webView {
if ([externalDelegate respondsToSelector:@selector(webViewDidStartLoad:)])
[externalDelegate webViewDidStartLoad:webView];
}
- (void)dealloc {
[formatter release];
[externalURL release];
[super dealloc];
}
@end