This repository has been archived by the owner on May 19, 2018. It is now read-only.
/
NSURL+Extensions.m
139 lines (114 loc) · 4.72 KB
/
NSURL+Extensions.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
#import "NSURL+Extensions.h"
#import "NSString+Extensions.h"
@implementation NSURL (Extensions)
+ (NSURL *)URLWithFormat:(NSString *)formatString, ... {
va_list args;
va_start(args, formatString);
NSString *urlString = [[NSString alloc] initWithFormat:formatString arguments:args];
va_end(args);
return [NSURL URLWithString:urlString];
}
+ (NSURL *)smartURLFromString:(NSString *)string {
return [self smartURLFromString:string defaultScheme:@"http"];
}
+ (NSURL *)smartURLFromString:(NSString *)string defaultScheme:(NSString *)defaultScheme {
if (!string || [string isKindOfClass:NSNull.class] || string.isEmpty) {
return nil;
} else {
NSURL *url = [NSURL URLWithString:string];
if (url.scheme) {
return url;
} else {
return [NSURL URLWithString:[NSString stringWithFormat:@"%@://%@", defaultScheme, string]];
}
}
}
// Taken from https://gist.github.com/1256354
- (NSURL *)URLByAppendingParams:(NSDictionary *)params {
NSMutableString *query = [[self query] mutableCopy];
if (!query) {
query = [NSMutableString stringWithString:@""];
}
// Sort parameters to be appended so that our solution is stable (and testable)
NSArray *parameterNames = [params allKeys];
parameterNames = [parameterNames sortedArrayUsingSelector:@selector(compare:)];
for (NSString *parameterName in parameterNames) {
id value = params[parameterName];
NSAssert3([parameterName isKindOfClass:NSString.class], @"Got '%@' of type %@ as key for parameter with value '%@'. Expected an NSString.", parameterName, NSStringFromClass(parameterName.class), value);
// The value needs to be an NSString, or be able to give us an NSString
if (![value isKindOfClass:NSString.class]) {
if ([value respondsToSelector:@selector(stringValue)]) {
value = [value stringValue];
} else {
// Fallback to simply giving the description
value = [value description];
}
}
if ([query length] == 0) {
[query appendFormat:@"%@=%@", [parameterName stringByEscapingForURLArgument], [value stringByEscapingForURLArgument]];
} else {
[query appendFormat:@"&%@=%@", [parameterName stringByEscapingForURLArgument], [value stringByEscapingForURLArgument]];
}
}
// scheme://username:password@domain:port/path?query_string#fragment_id
// Chop off query and fragment from absoluteString, then add new query and put back fragment
NSString *absoluteString = [self absoluteString];
NSUInteger endIndex = [absoluteString length];
NSString *fragment = [self fragment];
if (fragment) {
endIndex -= [fragment length];
endIndex--; // The # character
}
NSString *originalQuery = [self query];
if (originalQuery) {
endIndex -= [originalQuery length];
endIndex--; // The ? character
}
absoluteString = [absoluteString substringToIndex:endIndex];
absoluteString = [absoluteString stringByAppendingString:@"?"];
absoluteString = [absoluteString stringByAppendingString:query];
if (fragment) {
absoluteString = [absoluteString stringByAppendingString:@"#"];
absoluteString = [absoluteString stringByAppendingString:fragment];
}
return [NSURL URLWithString:absoluteString];
}
- (NSDictionary *)queryDictionary {
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
NSArray *components = [self.query componentsSeparatedByString:@"&"];
for (NSString *component in components) {
NSArray *comps = [component componentsSeparatedByString:@"="];
if (comps.count == 2) {
[dict setObject:comps[1] forKey:comps[0]];
}
}
return dict;
}
- (NSURL *)URLByAppendingFragment:(NSString *)fragment {
NSString *oldFragment = self.fragment;
NSString *absoluteString = self.absoluteString;
if (oldFragment) [absoluteString substringWithRange:NSMakeRange(0, absoluteString.length - oldFragment.length + 1)];
absoluteString = [absoluteString stringByAppendingString:@"#"];
absoluteString = [absoluteString stringByAppendingString:fragment];
return [NSURL URLWithString:absoluteString];
}
// Checks the host to see whether or not this is a GitHub URL.
// Assumes that relative links are also GitHubcom URLs.
- (BOOL)isGitHubURL {
return !self.host || ([self.host isEqualToString:@"github.com"] || [self.host isEqualToString:@"gist.github.com"]);
}
// Taken from https://github.com/ReactiveCocoa/ReactiveCocoaIO/blob/master/ReactiveCocoaIO/NSURL%2BTrailingSlash.m
- (BOOL)hasTrailingSlash {
return [self.absoluteString hasSuffix:@"/"];
}
- (NSURL *)URLByAppendingTrailingSlash {
NSURL *url = self;
if (!self.hasTrailingSlash) url = [NSURL URLWithString:[self.absoluteString stringByAppendingString:@"/"]];
return url;
}
- (NSURL *)URLByDeletingTrailingSlash {
NSURL *url = self;
if (self.hasTrailingSlash) url = [NSURL URLWithString:[self.absoluteString substringToIndex:self.absoluteString.length - 1]];
return url;
}
@end