177 lines
6.1 KiB
Swift

import Foundation
public enum WikimediaProject: Hashable {
public typealias LanguageCode = String
public typealias LocalizedLanguageName = String
public typealias LanguageVariantCode = String
case wikipedia(LanguageCode, LocalizedLanguageName, LanguageVariantCode?)
case wikibooks(LanguageCode, LocalizedLanguageName)
case wiktionary(LanguageCode, LocalizedLanguageName)
case wikiquote(LanguageCode, LocalizedLanguageName)
case wikisource(LanguageCode, LocalizedLanguageName)
case wikinews(LanguageCode, LocalizedLanguageName)
case wikiversity(LanguageCode, LocalizedLanguageName)
case wikivoyage(LanguageCode, LocalizedLanguageName)
case mediawiki
case wikispecies
case commons
case wikidata
public var projectIconName: String? {
switch self {
case .commons:
return "wikimedia-project-commons"
case .wikidata:
return "wikimedia-project-wikidata"
case .wikiquote:
return "wikimedia-project-wikiquote"
case .wikipedia:
return nil
case .wikibooks:
return "wikimedia-project-wikibooks"
case .wiktionary:
return "wikimedia-project-wiktionary"
case .wikisource:
return "wikimedia-project-wikisource"
case .wikinews:
return "wikimedia-project-wikinews"
case .wikiversity:
return "wikimedia-project-wikiversity"
case .wikivoyage:
return "wikimedia-project-wikivoyage"
case .mediawiki:
return "wikimedia-project-mediawiki"
case .wikispecies:
return "wikimedia-project-wikispecies"
}
}
public var languageCode: String? {
switch self {
case .commons:
return nil
case .wikidata:
return nil
case .wikiquote(let languageCode, _):
return languageCode
case .wikipedia(let languageCode, _, _):
return languageCode
case .wikibooks(let languageCode, _):
return languageCode
case .wiktionary(let languageCode, _):
return languageCode
case .wikisource(let languageCode, _):
return languageCode
case .wikinews(let languageCode, _):
return languageCode
case .wikiversity(let languageCode, _):
return languageCode
case .wikivoyage(let languageCode, _):
return languageCode
case .mediawiki:
return nil
case .wikispecies:
return nil
}
}
public init?(siteURL: URL, languageLinkController: MWKLanguageLinkController? = nil) {
let canonicalSiteURL = siteURL.canonical
let siteURLString = canonicalSiteURL.absoluteString
// Assign non-language specific project
if siteURLString.contains(Configuration.Domain.mediaWiki) {
self = .mediawiki
return
} else if siteURLString.contains(Configuration.Domain.wikispecies) {
self = .wikispecies
return
} else if siteURLString.contains(Configuration.Domain.commons) || siteURLString.contains(Configuration.Domain.commonsBetaLabs) {
self = .commons
return
} else if siteURLString.contains(Configuration.Domain.wikidata) || siteURLString.contains(Configuration.Domain.wikidataBetaLabs) {
self = .wikidata
return
}
guard let languageCode = canonicalSiteURL.wmf_languageCode else {
return nil
}
let recognizedLanguage = languageLinkController?.allLanguages.first { languageLink in
languageLink.languageCode == languageCode
}
let localizedLanguageName = recognizedLanguage?.localizedName ?? ""
if siteURLString.contains(Configuration.current.defaultSiteDomain) {
self = .wikipedia(languageCode, localizedLanguageName, nil)
} else if siteURLString.contains(Configuration.Domain.wikiquote) {
self = .wikiquote(languageCode, localizedLanguageName)
} else if siteURLString.contains(Configuration.Domain.wikibooks) {
self = .wikibooks(languageCode, localizedLanguageName)
} else if siteURLString.contains(Configuration.Domain.wiktionary) {
self = .wiktionary(languageCode, localizedLanguageName)
} else if siteURLString.contains(Configuration.Domain.wikisource) {
self = .wikisource(languageCode, localizedLanguageName)
} else if siteURLString.contains(Configuration.Domain.wikinews) {
self = .wikinews(languageCode, localizedLanguageName)
} else if siteURLString.contains(Configuration.Domain.wikiversity) {
self = .wikiversity(languageCode, localizedLanguageName)
} else if siteURLString.contains(Configuration.Domain.wikivoyage) {
self = .wikivoyage(languageCode, localizedLanguageName)
} else {
return nil
}
}
// MARK: Routing Helpers
public var supportsNativeArticleTalkPages: Bool {
// Can switch on this in the future if we add more projects that don't support them
return true
}
public var supportsNativeUserTalkPages: Bool {
// Can switch on this in the future if we add more projects that don't support them
return true
}
public var supportsNativeDiffPages: Bool {
switch self {
case .wikipedia:
return true
default:
return false
}
}
public var mainNamespaceGoesToNativeArticleView: Bool {
switch self {
case .wikipedia:
return true
default:
return false
}
}
public var considersWikipediaNamespaceForRouting: Bool {
switch self {
case .wikipedia:
return true
default:
return false
}
}
public var considersWResourcePathsForRouting: Bool {
switch self {
case .wikipedia:
return true
default:
return false
}
}
}