// // MediaType.swift // FolioReaderKit // // Created by Heberti Almeida on 29/04/15. // Copyright (c) 2015 Folio Reader. All rights reserved. // import UIKit /** MediaType is used to tell the type of content a resource is. Examples of mediatypes are image/gif, text/css and application/xhtml+xml */ public struct MediaType: Equatable { public let name: String public let defaultExtension: String public let extensions: [String] public init(name: String, defaultExtension: String, extensions: [String] = []) { self.name = name self.defaultExtension = defaultExtension self.extensions = extensions } } // MARK: - Equatable public func == (lhs: MediaType, rhs: MediaType) -> Bool { guard lhs.name == rhs.name else { return false } guard lhs.defaultExtension == rhs.defaultExtension else { return false } guard lhs.extensions == rhs.extensions else { return false } return true } /** Manages mediatypes that are used by epubs. */ extension MediaType { static let xhtml = MediaType(name: "application/xhtml+xml", defaultExtension: "xhtml", extensions: ["htm", "html", "xhtml", "xml"]) static let epub = MediaType(name: "application/epub+zip", defaultExtension: "epub") static let ncx = MediaType(name: "application/x-dtbncx+xml", defaultExtension: "ncx") static let opf = MediaType(name: "application/oebps-package+xml", defaultExtension: "opf") static let javaScript = MediaType(name: "text/javascript", defaultExtension: "js") static let css = MediaType(name: "text/css", defaultExtension: "css") // images static let jpg = MediaType(name: "image/jpeg", defaultExtension: "jpg", extensions: ["jpg", "jpeg"]) static let png = MediaType(name: "image/png", defaultExtension: "png") static let gif = MediaType(name: "image/gif", defaultExtension: "gif") static let svg = MediaType(name: "image/svg+xml", defaultExtension: "svg") // fonts static let ttf = MediaType(name: "application/x-font-ttf", defaultExtension: "ttf") static let ttf1 = MediaType(name: "application/x-font-truetype", defaultExtension: "ttf") static let ttf2 = MediaType(name: "application/x-truetype-font", defaultExtension: "ttf") static let openType = MediaType(name: "application/vnd.ms-opentype", defaultExtension: "otf") static let woff = MediaType(name: "application/font-woff", defaultExtension: "woff") // audio static let mp3 = MediaType(name: "audio/mpeg", defaultExtension: "mp3") static let mp4 = MediaType(name: "audio/mp4", defaultExtension: "mp4") static let ogg = MediaType(name: "audio/ogg", defaultExtension: "ogg") static let smil = MediaType(name: "application/smil+xml", defaultExtension: "smil") static let xpgt = MediaType(name: "application/adobe-page-template+xml", defaultExtension: "xpgt") static let pls = MediaType(name: "application/pls+xml", defaultExtension: "pls") static let mediatypes = [xhtml, epub, ncx, opf, jpg, png, gif, javaScript, css, svg, ttf, ttf1, ttf2, openType, woff, mp3, mp4, ogg, smil, xpgt, pls] /** Gets the MediaType based on the file mimetype. - parameter name: The mediaType name - parameter fileName: The file name to extract the extension - returns: A know mediatype or create a new one. */ static func by(name: String, fileName: String?) -> MediaType { for mediatype in mediatypes { if mediatype.name == name { return mediatype } } let ext = fileName?.pathExtension ?? "" return MediaType(name: name, defaultExtension: ext) } /** Gets the MediaType based on the file extension. */ static func by(fileName: String) -> MediaType? { let ext = "." + (fileName as NSString).pathExtension return mediatypes.filter({ $0.extensions.contains(ext) }).first } /** Compare if the resource is a image. - returns: `true` if is a image and `false` if not */ static func isBitmapImage(_ mediaType: MediaType) -> Bool { return mediaType == jpg || mediaType == png || mediaType == gif } /** Gets the MediaType based on the file extension. */ static func determineMediaType(_ fileName: String) -> MediaType? { let ext = fileName.pathExtension for mediatype in mediatypes { if mediatype.defaultExtension == ext { return mediatype } if mediatype.extensions.contains(ext) { return mediatype } } return nil } }