added iOS source code
[wl-app.git] / iOS / Pods / FolioReaderKit / Source / EPUBCore / MediaType.swift
1 //
2 //  MediaType.swift
3 //  FolioReaderKit
4 //
5 //  Created by Heberti Almeida on 29/04/15.
6 //  Copyright (c) 2015 Folio Reader. All rights reserved.
7 //
8
9 import UIKit
10
11 /**
12  MediaType is used to tell the type of content a resource is.
13
14  Examples of mediatypes are image/gif, text/css and application/xhtml+xml
15  */
16 public struct MediaType: Equatable {
17     public let name: String
18     public let defaultExtension: String
19     public let extensions: [String]
20
21     public init(name: String, defaultExtension: String, extensions: [String] = []) {
22         self.name = name
23         self.defaultExtension = defaultExtension
24         self.extensions = extensions
25     }
26
27 }
28
29 // MARK: - Equatable
30
31 public func == (lhs: MediaType, rhs: MediaType) -> Bool {
32     guard lhs.name == rhs.name else { return false }
33     guard lhs.defaultExtension == rhs.defaultExtension else { return false }
34     guard lhs.extensions == rhs.extensions else { return false }
35     return true
36 }
37
38
39 /**
40  Manages mediatypes that are used by epubs.
41  */
42 extension MediaType {
43     static let xhtml = MediaType(name: "application/xhtml+xml", defaultExtension: "xhtml", extensions: ["htm", "html", "xhtml", "xml"])
44     static let epub = MediaType(name: "application/epub+zip", defaultExtension: "epub")
45     static let ncx = MediaType(name: "application/x-dtbncx+xml", defaultExtension: "ncx")
46     static let opf = MediaType(name: "application/oebps-package+xml", defaultExtension: "opf")
47     static let javaScript = MediaType(name: "text/javascript", defaultExtension: "js")
48     static let css = MediaType(name: "text/css", defaultExtension: "css")
49
50     // images
51     static let jpg = MediaType(name: "image/jpeg", defaultExtension: "jpg", extensions: ["jpg", "jpeg"])
52     static let png = MediaType(name: "image/png", defaultExtension: "png")
53     static let gif = MediaType(name: "image/gif", defaultExtension: "gif")
54     static let svg = MediaType(name: "image/svg+xml", defaultExtension: "svg")
55
56     // fonts
57     static let ttf = MediaType(name: "application/x-font-ttf", defaultExtension: "ttf")
58     static let ttf1 = MediaType(name: "application/x-font-truetype", defaultExtension: "ttf")
59     static let ttf2 = MediaType(name: "application/x-truetype-font", defaultExtension: "ttf")
60     static let openType = MediaType(name: "application/vnd.ms-opentype", defaultExtension: "otf")
61     static let woff = MediaType(name: "application/font-woff", defaultExtension: "woff")
62
63     // audio
64     static let mp3 = MediaType(name: "audio/mpeg", defaultExtension: "mp3")
65     static let mp4 = MediaType(name: "audio/mp4", defaultExtension: "mp4")
66     static let ogg = MediaType(name: "audio/ogg", defaultExtension: "ogg")
67
68     static let smil = MediaType(name: "application/smil+xml", defaultExtension: "smil")
69     static let xpgt = MediaType(name: "application/adobe-page-template+xml", defaultExtension: "xpgt")
70     static let pls = MediaType(name: "application/pls+xml", defaultExtension: "pls")
71
72     static let mediatypes = [xhtml, epub, ncx, opf, jpg, png, gif, javaScript, css, svg, ttf, ttf1, ttf2, openType, woff, mp3, mp4, ogg, smil, xpgt, pls]
73
74     /**
75      Gets the MediaType based on the file mimetype.
76      - parameter name:     The mediaType name
77      - parameter fileName: The file name to extract the extension
78      - returns: A know mediatype or create a new one.
79      */
80     static func by(name: String, fileName: String?) -> MediaType {
81         for mediatype in mediatypes {
82             if mediatype.name == name {
83                 return mediatype
84             }
85         }
86         let ext = fileName?.pathExtension ?? ""
87         return MediaType(name: name, defaultExtension: ext)
88     }
89
90     /**
91      Gets the MediaType based on the file extension.
92      */
93     static func by(fileName: String) -> MediaType? {
94         let ext = "." + (fileName as NSString).pathExtension
95         return mediatypes.filter({ $0.extensions.contains(ext) }).first
96     }
97
98     /**
99      Compare if the resource is a image.
100      - returns: `true` if is a image and `false` if not
101      */
102     static func isBitmapImage(_ mediaType: MediaType) -> Bool {
103         return mediaType == jpg || mediaType == png || mediaType == gif
104     }
105
106     /**
107      Gets the MediaType based on the file extension.
108      */
109     static func determineMediaType(_ fileName: String) -> MediaType? {
110         let ext = fileName.pathExtension
111
112         for mediatype in mediatypes {
113             if mediatype.defaultExtension == ext {
114                 return mediatype
115             }
116             if mediatype.extensions.contains(ext) {
117                 return mediatype
118             }
119         }
120         return nil
121     }
122 }