added iOS source code
[wl-app.git] / iOS / Pods / FolioReaderKit / Source / EPUBCore / FRSmils.swift
1 //
2 //  FRSmils.swift
3 //  Pods
4 //
5 //  Created by Kevin Jantzer on 12/30/15.
6 //
7 //
8
9
10 import UIKit
11
12 struct FRSmilFile {
13     var resource: FRResource
14     var data = [FRSmilElement]()
15
16     init(resource: FRResource){
17         self.resource = resource;
18     }
19
20     // MARK: - shortcuts
21
22     func ID() -> String {
23         return self.resource.id;
24     }
25
26     func href() -> String {
27         return self.resource.href;
28     }
29
30     // MARK: - data methods
31
32     /**
33      Returns a smil <par> tag which contains info about parallel audio and text to be played
34      */
35     func parallelAudioForFragment(_ fragment: String!) -> FRSmilElement! {
36         return findParElement(forTextSrc: fragment, inData: data)
37     }
38
39     fileprivate func findParElement(forTextSrc src:String!, inData _data:[FRSmilElement]) -> FRSmilElement! {
40         for el in _data {
41
42             // if its a <par> (parallel) element and has a <text> node with the matching fragment
43             if( el.name == "par" && (src == nil || el.textElement().attributes["src"]?.contains(src) != false ) ){
44                 return el
45
46                 // if its a <seq> (sequence) element, it should have children (<par>)
47             }else if el.name == "seq" && el.children.count > 0 {
48                 let parEl = findParElement(forTextSrc: src, inData: el.children)
49                 if parEl != nil { return parEl }
50             }
51         }
52         return nil
53     }
54
55     /**
56      Returns a smil <par> element after the given fragment
57      */
58     func nextParallelAudioForFragment(_ fragment: String) -> FRSmilElement! {
59         return findNextParElement(forTextSrc: fragment, inData: data)
60     }
61
62     fileprivate func findNextParElement(forTextSrc src:String!, inData _data:[FRSmilElement]) -> FRSmilElement! {
63         var foundPrev = false
64         for el in _data {
65
66             if foundPrev { return el }
67
68             // if its a <par> (parallel) element and has a <text> node with the matching fragment
69             if( el.name == "par" && (src == nil || el.textElement().attributes["src"]?.contains(src) != false) ){
70                 foundPrev = true
71
72                 // if its a <seq> (sequence) element, it should have children (<par>)
73             }else if el.name == "seq" && el.children.count > 0 {
74                 let parEl = findNextParElement(forTextSrc: src, inData: el.children)
75                 if parEl != nil { return parEl }
76             }
77         }
78         return nil
79     }
80
81
82     func childWithName(_ name:String) -> FRSmilElement! {
83         for el in data {
84             if( el.name == name ){
85                 return el
86             }
87         }
88         return nil;
89     }
90
91     func childrenWithNames(_ name:[String]) -> [FRSmilElement]! {
92         var matched = [FRSmilElement]()
93         for el in data {
94             if( name.contains(el.name) ){
95                 matched.append(el)
96             }
97         }
98         return matched;
99     }
100
101     func childrenWithName(_ name:String) -> [FRSmilElement]! {
102         return childrenWithNames([name])
103     }
104 }
105
106 /**
107  Holds array of `FRSmilFile`
108  */
109 class FRSmils: NSObject {
110     var basePath            : String!
111     var smils               = [String: FRSmilFile]()
112
113     /**
114      Adds a smil to the smils.
115      */
116     func add(_ smil: FRSmilFile) {
117         self.smils[smil.resource.href] = smil
118     }
119
120     /**
121      Gets the resource with the given href.
122      */
123     func findByHref(_ href: String) -> FRSmilFile? {
124         for smil in smils.values {
125             if smil.resource.href == href {
126                 return smil
127             }
128         }
129         return nil
130     }
131
132     /**
133      Gets the resource with the given id.
134      */
135     func findById(_ ID: String) -> FRSmilFile? {
136         for smil in smils.values {
137             if smil.resource.id == ID {
138                 return smil
139             }
140         }
141         return nil
142     }
143 }