diff --git a/Wikipedia/Code/NSURL+WMFLinkParsing.h b/Wikipedia/Code/NSURL+WMFLinkParsing.h index 682cb13b51..2c05b5e7cb 100644 --- a/Wikipedia/Code/NSURL+WMFLinkParsing.h +++ b/Wikipedia/Code/NSURL+WMFLinkParsing.h @@ -1,37 +1,39 @@ // // NSURL+WMFLinkParsing.h // Wikipedia // // Created by Brian Gerstle on 8/5/15. // Copyright (c) 2015 Wikimedia Foundation. All rights reserved. // #import NS_ASSUME_NONNULL_BEGIN @interface NSURL (WMFLinkParsing) @property (nonatomic, readonly) BOOL wmf_isInternalLink; @property (nonatomic, readonly) BOOL wmf_isCitation; @property (nonatomic, copy, readonly, nullable) NSString* wmf_internalLinkPath; @property (nonatomic, copy, readonly, nullable) NSString* wmf_domain; @property (nonatomic, copy, readonly, nullable) NSString* wmf_language; @property (nonatomic, copy, readonly, nullable) NSString* wmf_title; @property (nonatomic, copy, readonly, nullable) NSURL* wmf_mobileURL; @property (nonatomic, copy, readonly, nullable) NSURL* wmf_desktopURL; @property (nonatomic, readonly) BOOL wmf_isNonStandardURL; + (NSURL*)wmf_URLWithDomain:(NSString*)domain language:(NSString* __nullable)language; ++ (NSURL*)wmf_URLWithDomain:(NSString*)domain language:(NSString* __nullable)language title:(NSString*)title fragment:(NSString* __nullable)fragment; + @end NS_ASSUME_NONNULL_END diff --git a/Wikipedia/Code/NSURL+WMFLinkParsing.m b/Wikipedia/Code/NSURL+WMFLinkParsing.m index 247d5605f3..c3cb2f7d66 100644 --- a/Wikipedia/Code/NSURL+WMFLinkParsing.m +++ b/Wikipedia/Code/NSURL+WMFLinkParsing.m @@ -1,109 +1,113 @@ // // NSURL+WMFLinkParsing.m // Wikipedia // // Created by Brian Gerstle on 8/5/15. // Copyright (c) 2015 Wikimedia Foundation. All rights reserved. // #import "NSURL+WMFLinkParsing.h" #import "NSString+WMFExtras.h" #import "NSString+WMFPageUtilities.h" #import "NSURL+WMFExtras.h" #import "NSURLComponents+WMFLinkParsing.h" @interface NSURL (WMFLinkParsing_Private) @property (nonatomic, readonly) NSInteger wmf_domainIndex; @end @implementation NSURL (WMFLinkParsing) - (BOOL)wmf_isInternalLink { return [self.path wmf_isInternalLink]; } - (BOOL)wmf_isCitation { return [self.fragment wmf_isCitationFragment]; } - (NSString*)wmf_internalLinkPath { return [self.path wmf_internalLinkPath]; } - (NSString*)wmf_domain { return [self.host substringFromIndex:self.wmf_domainIndex]; } - (NSString*)wmf_language { NSRange dotRange = [self.host rangeOfString:@"."]; if (dotRange.length == 1 && dotRange.location < 4 && dotRange.location > 1) { return [self.host substringToIndex:dotRange.location]; } else { return nil; } } - (NSString*)wmf_title { NSString* title = [[self.path wmf_internalLinkPath] wmf_unescapedNormalizedPageTitle]; if (title == nil) { title = @""; } return title; } - (NSURL*)wmf_mobileURL { - NSURLComponents *components = [NSURLComponents componentsWithURL:self resolvingAgainstBaseURL:NO]; + NSURLComponents* components = [NSURLComponents componentsWithURL:self resolvingAgainstBaseURL:NO]; components.host = [NSURLComponents wmf_hostWithDomain:self.wmf_domain language:self.wmf_language isMobile:YES]; return components.URL; } - (NSURL*)wmf_desktopURL { NSURLComponents* components = [NSURLComponents componentsWithURL:self resolvingAgainstBaseURL:NO]; components.host = [NSURLComponents wmf_hostWithDomain:self.wmf_domain language:self.wmf_language isMobile:NO]; return components.URL; } - (BOOL)wmf_isNonStandardURL { return self.wmf_language == nil; } + (NSURL*)wmf_URLWithDomain:(NSString*)domain language:(NSString* __nullable)language { return [[NSURLComponents wmf_componentsWithDomain:domain language:language] URL]; } ++ (NSURL*)wmf_URLWithDomain:(NSString*)domain language:(NSString* __nullable)language title:(NSString*)title fragment:(NSString* __nullable)fragment { + return [[NSURLComponents wmf_componentsWithDomain:domain language:language title:title fragment:fragment] URL]; +} + @end @implementation NSURL (WMFLinkParsing_Private) + (NSRegularExpression*)WMFURLParsingDomainIndexRegularExpression { static NSRegularExpression* WMFURLParsingDomainIndexRegularExpression = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSError* regexError = nil; WMFURLParsingDomainIndexRegularExpression = [NSRegularExpression regularExpressionWithPattern:@"^[^.]*(.m){0,1}[.]" options:NSRegularExpressionCaseInsensitive error:®exError]; if (regexError) { DDLogError(@"Error creating domain parsing regex: %@", regexError); } }); return WMFURLParsingDomainIndexRegularExpression; } - (NSInteger)wmf_domainIndex { if (self.host == nil) { return 0; } NSTextCheckingResult* regexResult = [[NSURL WMFURLParsingDomainIndexRegularExpression] firstMatchInString:self.host options:NSMatchingAnchored range:NSMakeRange(0, self.host.length)]; NSInteger index = 0; if (regexResult != nil) { index = regexResult.range.location + regexResult.range.length; } return index; } @end