Table of contents

This commit is contained in:
Chris Li 2016-06-26 18:02:25 -04:00
parent 9f5e12f54d
commit 2dbaad1d9a
14 changed files with 223 additions and 92 deletions

View File

@ -10,7 +10,7 @@
},
{
"idiom" : "universal",
"filename" : "wikipedia5.png",
"filename" : "compass.png",
"scale" : "3x"
}
],

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -10,7 +10,7 @@
},
{
"idiom" : "universal",
"filename" : "list.png",
"filename" : "list-1.png",
"scale" : "3x"
}
],

Binary file not shown.

After

Width:  |  Height:  |  Size: 525 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -1,5 +1,5 @@
//
// MainVC2.swift
// MainVC.swift
// Kiwix
//
// Created by Chris Li on 1/22/16.
@ -11,9 +11,10 @@ import UIKit
class MainVC: UIViewController {
@IBOutlet weak var webView: UIWebView!
var bookmarkVC: UIViewController?
var libraryVC: UIViewController?
var settingVC: UIViewController?
var tableOfContentController: TableOfContentController?
var bookmarkController: UIViewController?
var libraryController: UIViewController?
var settingController: UIViewController?
var searchVC: SearchVC?
let searchBar = SearchBar()
@ -53,15 +54,18 @@ class MainVC: UIViewController {
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
bookmarkVC = nil
libraryVC = nil
settingVC = nil
tableOfContentController = nil
bookmarkController = nil
libraryController = nil
settingController = nil
searchVC = nil
}
override func traitCollectionDidChange(previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
configureUIElements(self.traitCollection)
if previousTraitCollection?.horizontalSizeClass != traitCollection.horizontalSizeClass {
configureUIElements(traitCollection.horizontalSizeClass)
}
}
// MARK: - First Time Launch Alert
@ -75,19 +79,19 @@ class MainVC: UIViewController {
// MARK: - Configure
func configureUIElements(traitCollection: UITraitCollection) {
switch traitCollection.horizontalSizeClass {
func configureUIElements(horizontalSizeClass: UIUserInterfaceSizeClass) {
switch horizontalSizeClass {
case .Regular:
navigationController?.toolbarHidden = true
toolbarItems?.removeAll()
navigationItem.leftBarButtonItems = [navigateLeftButton, navigateRightButton, blankButton]
navigationItem.leftBarButtonItems = [navigateLeftButton, navigateRightButton, tableOfContentButton]
navigationItem.rightBarButtonItems = [settingButton, libraryButton, bookmarkButton]
case .Compact:
if !searchBar.isFirstResponder() {navigationController?.toolbarHidden = false}
navigationItem.leftBarButtonItems?.removeAll()
navigationItem.rightBarButtonItems?.removeAll()
let spaceButton = UIBarButtonItem(barButtonSystemItem: .FlexibleSpace, target: nil, action: nil)
toolbarItems = [navigateLeftButton, spaceButton, navigateRightButton, spaceButton, bookmarkButton, spaceButton, libraryButton, spaceButton, settingButton]
toolbarItems = [navigateLeftButton, spaceButton, navigateRightButton, spaceButton, tableOfContentButton, spaceButton, bookmarkButton, spaceButton, libraryButton, spaceButton, settingButton]
if UIDevice.currentDevice().userInterfaceIdiom == .Pad && searchBar.isFirstResponder() {
navigationItem.setRightBarButtonItem(cancelButton, animated: true)
}
@ -99,6 +103,7 @@ class MainVC: UIViewController {
func configureButtonColor() {
configureNavigationButtonTint()
tableOfContentButton.tintColor = UIColor.grayColor()
libraryButton.tintColor = UIColor.grayColor()
settingButton.tintColor = UIColor.grayColor()
UIBarButtonItem.appearanceWhenContainedInInstancesOfClasses([UISearchBar.self]).tintColor = UIColor.themeColor
@ -198,10 +203,10 @@ class MainVC: UIViewController {
lazy var navigateLeftButton: UIBarButtonItem = UIBarButtonItem(imageNamed: "LeftArrow", target: self, action: #selector(MainVC.navigateLeftButtonTapped))
lazy var navigateRightButton: UIBarButtonItem = UIBarButtonItem(imageNamed: "RightArrow", target: self, action: #selector(MainVC.navigateRightButtonTapped))
lazy var tableOfContentButton: UIBarButtonItem = UIBarButtonItem(imageNamed: "TableOfContent", target: self, action: #selector(MainVC.showTableOfContentButtonTapped))
lazy var bookmarkButton: LPTBarButtonItem = LPTBarButtonItem(imageName: "Star", highlightedImageName: "StarHighlighted", delegate: self)
lazy var libraryButton: UIBarButtonItem = UIBarButtonItem(imageNamed: "Library", target: self, action: #selector(MainVC.showLibraryButtonTapped))
lazy var settingButton: UIBarButtonItem = UIBarButtonItem(imageNamed: "Setting", target: self, action: #selector(MainVC.showSettingButtonTapped))
lazy var blankButton: UIBarButtonItem = UIBarButtonItem(imageNamed: "BlankImage", target: nil, action: nil)
lazy var cancelButton: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Cancel, target: self, action: #selector(MainVC.cancelButtonTapped))
// MARK: - Actions
@ -214,19 +219,26 @@ class MainVC: UIViewController {
webView.goForward()
}
func showTableOfContentButtonTapped(sender: UIBarButtonItem) {
guard let controller = tableOfContentController ?? UIStoryboard.main.initViewController(TableOfContentController.self) else {return}
controller.modalPresentationStyle = .Popover
controller.popoverPresentationController?.barButtonItem = sender
controller.popoverPresentationController?.permittedArrowDirections = [.Up, .Down]
controller.popoverPresentationController?.delegate = self
presentViewController(controller, animated: true, completion: nil)
}
func showLibraryButtonTapped() {
guard let viewController = libraryVC ?? UIStoryboard.library.instantiateInitialViewController() else {return}
//let viewController = UITabBarController()
//viewController.viewControllers = [UITableViewController(), UITableViewController(), UITableViewController()]
guard let viewController = libraryController ?? UIStoryboard.library.instantiateInitialViewController() else {return}
viewController.modalPresentationStyle = .FormSheet
libraryVC = viewController
libraryController = viewController
presentViewController(viewController, animated: true, completion: nil)
}
func showSettingButtonTapped() {
guard let viewController = settingVC ?? UIStoryboard.setting.instantiateInitialViewController() else {return}
guard let viewController = settingController ?? UIStoryboard.setting.instantiateInitialViewController() else {return}
viewController.modalPresentationStyle = .FormSheet
settingVC = viewController
settingController = viewController
presentViewController(viewController, animated: true, completion: nil)
}
@ -234,5 +246,4 @@ class MainVC: UIViewController {
hideSearch()
navigationItem.setRightBarButtonItem(nil, animated: true)
}
}

View File

@ -1,5 +1,5 @@
//
// MainVCWebViewD.swift
// MainVCOtherD.swift
// Kiwix
//
// Created by Chris Li on 1/22/16.
@ -8,7 +8,54 @@
import UIKit
extension MainVC: UIWebViewDelegate, UIScrollViewDelegate {
extension MainVC: LPTBarButtonItemDelegate, UISearchBarDelegate, UIPopoverPresentationControllerDelegate, UIWebViewDelegate, UIScrollViewDelegate {
// MARK: - LPTBarButtonItemDelegate
func barButtonTapped(sender: LPTBarButtonItem, gestureRecognizer: UIGestureRecognizer) {
guard sender == bookmarkButton else {return}
guard let controller = bookmarkController ?? UIStoryboard.main.initViewController("BookmarkNav", type: UINavigationController.self) else {return}
bookmarkController = controller
controller.modalPresentationStyle = .FormSheet
presentViewController(controller, animated: true, completion: nil)
}
func barButtonLongPressedStart(sender: LPTBarButtonItem, gestureRecognizer: UIGestureRecognizer) {
guard sender == bookmarkButton else {return}
guard !webView.hidden else {return}
guard let article = article else {return}
guard let bookmarkHUDVC = UIStoryboard.main.initViewController(BookmarkHUDVC.self) else {return}
UIApplication.appDelegate.window?.addSubview(bookmarkHUDVC.view)
article.isBookmarked = !article.isBookmarked
bookmarkHUDVC.show(article.isBookmarked)
configureBookmarkButton()
}
// MARK: - UISearchBarDelegate
func searchBarTextDidBeginEditing(searchBar: UISearchBar) {
showSearch()
}
func searchBarCancelButtonClicked(searchBar: UISearchBar) {
hideSearch()
configureSearchBarPlaceHolder()
}
func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
searchVC?.searchText = searchText
}
func searchBarSearchButtonClicked(searchBar: UISearchBar) {
searchVC?.searchResultTBVC?.selectFirstResultIfPossible()
}
// MARK: - UIPopoverPresentationControllerDelegate
func adaptivePresentationStyleForPresentationController(controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
return .None
}
// MARK: - UIWebViewDelegate
@ -132,4 +179,5 @@ extension MainVC: UIWebViewDelegate, UIScrollViewDelegate {
}
}
}
}

View File

@ -29,10 +29,34 @@ extension MainVC {
// MARK: - JS
func getTOC(webView: UIWebView) {
guard let context = webView.valueForKeyPath("documentView.webView.mainFrame.javaScriptContext") as? JSContext else {return}
guard let path = NSBundle.mainBundle().pathForResource("getTableOfContents", ofType: "js") else {return}
guard let jString = Utilities.contentOfFileAtPath(path) else {return}
let value: JSValue = context.evaluateScript(jString)
print(value.toArray())
guard let context = webView.valueForKeyPath("documentView.webView.mainFrame.javaScriptContext") as? JSContext,
let path = NSBundle.mainBundle().pathForResource("getTableOfContents", ofType: "js"),
let jString = Utilities.contentOfFileAtPath(path),
let elements = context.evaluateScript(jString).toArray() as? [[String: String]] else {return}
var headings = [HTMLHeading]()
for element in elements {
guard let heading = HTMLHeading(rawValue: element) else {continue}
headings.append(heading)
}
}
}
class HTMLHeading {
let id: String
let tagName: String
let textContent: String
let level: Int
init?(rawValue: [String: String]) {
let tagName = rawValue["tagName"] ?? ""
self.id = rawValue["id"] ?? ""
self.textContent = rawValue["textContent"] ?? ""
self.tagName = tagName
self.level = Int(tagName.stringByReplacingOccurrencesOfString("H", withString: "")) ?? -1
if id == "" {return nil}
if tagName == "" {return nil}
if textContent == "" {return nil}
if level == -1 {return nil}
}
}

View File

@ -1,53 +0,0 @@
//
// MainVCOtherD.swift
// Kiwix
//
// Created by Chris Li on 1/22/16.
// Copyright © 2016 Chris. All rights reserved.
//
import UIKit
extension MainVC: LPTBarButtonItemDelegate, UISearchBarDelegate {
// MARK: - LPTBarButtonItemDelegate
func barButtonTapped(sender: LPTBarButtonItem, gestureRecognizer: UIGestureRecognizer) {
guard sender == bookmarkButton else {return}
guard let controller = bookmarkVC ?? UIStoryboard.main.initViewController("BookmarkNav", type: UINavigationController.self) else {return}
bookmarkVC = controller
controller.modalPresentationStyle = .FormSheet
presentViewController(controller, animated: true, completion: nil)
}
func barButtonLongPressedStart(sender: LPTBarButtonItem, gestureRecognizer: UIGestureRecognizer) {
guard sender == bookmarkButton else {return}
guard !webView.hidden else {return}
guard let article = article else {return}
guard let bookmarkHUDVC = UIStoryboard.main.initViewController(BookmarkHUDVC.self) else {return}
UIApplication.appDelegate.window?.addSubview(bookmarkHUDVC.view)
article.isBookmarked = !article.isBookmarked
bookmarkHUDVC.show(article.isBookmarked)
configureBookmarkButton()
}
// MARK: - UISearchBarDelegate
func searchBarTextDidBeginEditing(searchBar: UISearchBar) {
showSearch()
}
func searchBarCancelButtonClicked(searchBar: UISearchBar) {
hideSearch()
configureSearchBarPlaceHolder()
}
func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
searchVC?.searchText = searchText
}
func searchBarSearchButtonClicked(searchBar: UISearchBar) {
searchVC?.searchResultTBVC?.selectFirstResultIfPossible()
}
}

View File

@ -0,0 +1,73 @@
//
// TableOfContentController.swift
// Kiwix
//
// Created by Chris Li on 6/26/16.
// Copyright © 2016 Chris. All rights reserved.
//
import UIKit
import DZNEmptyDataSet
class TableOfContentController: UITableViewController, DZNEmptyDataSetSource, DZNEmptyDataSetDelegate {
var headings = [String]()
override func viewDidLoad() {
super.viewDidLoad()
tableView.emptyDataSetSource = self
tableView.emptyDataSetDelegate = self
tableView.tableFooterView = UIView()
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
configurePreferredContentSize()
}
func configurePreferredContentSize() {
let count = headings.count
preferredContentSize = CGSizeMake(300, count == 0 ? 350 : CGFloat(count) * 44.0)
}
// MARK: - Table view data source
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 0
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
return cell
}
// MARK: - Empty table datasource & delegate
func imageForEmptyDataSet(scrollView: UIScrollView!) -> UIImage! {
return UIImage(named: "Compass")
}
func titleForEmptyDataSet(scrollView: UIScrollView!) -> NSAttributedString! {
let text = NSLocalizedString("Table Of Contents Not Available", comment: "Table Of Content, empty text")
let attributes = [NSFontAttributeName: UIFont.boldSystemFontOfSize(18.0),
NSForegroundColorAttributeName: UIColor.darkGrayColor()]
return NSAttributedString(string: text, attributes: attributes)
}
func verticalOffsetForEmptyDataSet(scrollView: UIScrollView!) -> CGFloat {
return 0
}
func spaceHeightForEmptyDataSet(scrollView: UIScrollView!) -> CGFloat {
return 30.0
}
}

View File

@ -36,7 +36,7 @@
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>706</string>
<string>745</string>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>LSRequiresIPhoneOS</key>

View File

@ -711,6 +711,34 @@
</objects>
<point key="canvasLocation" x="2607" y="433"/>
</scene>
<!--Table Of Content Controller-->
<scene sceneID="iw2-hs-BiG">
<objects>
<tableViewController storyboardIdentifier="TableOfContentController" id="p5i-v1-okn" customClass="TableOfContentController" customModule="Kiwix" customModuleProvider="target" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="28" sectionFooterHeight="28" id="2on-Ss-GkQ">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<prototypes>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="Cell" id="au4-iz-tLz">
<rect key="frame" x="0.0" y="28" width="600" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="au4-iz-tLz" id="3UD-lZ-hs0">
<rect key="frame" x="0.0" y="0.0" width="600" height="43.5"/>
<autoresizingMask key="autoresizingMask"/>
</tableViewCellContentView>
</tableViewCell>
</prototypes>
<connections>
<outlet property="dataSource" destination="p5i-v1-okn" id="Khv-9C-1Wx"/>
<outlet property="delegate" destination="p5i-v1-okn" id="8sr-CM-fnw"/>
</connections>
</tableView>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="coI-7Y-cLO" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="3393" y="432"/>
</scene>
<!--MainVC-->
<scene sceneID="WWO-2R-Y9G">
<objects>

View File

@ -94,8 +94,7 @@
971A10601D022DF2007FC62C /* LanguageTBVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 971A105F1D022DF2007FC62C /* LanguageTBVC.swift */; };
971A10651D022E0A007FC62C /* MainVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 971A10611D022E0A007FC62C /* MainVC.swift */; };
971A10661D022E0A007FC62C /* MainVCLoading.swift in Sources */ = {isa = PBXBuildFile; fileRef = 971A10621D022E0A007FC62C /* MainVCLoading.swift */; };
971A10671D022E0A007FC62C /* MainVCOtherD.swift in Sources */ = {isa = PBXBuildFile; fileRef = 971A10631D022E0A007FC62C /* MainVCOtherD.swift */; };
971A10681D022E0A007FC62C /* MainVCWebViewD.swift in Sources */ = {isa = PBXBuildFile; fileRef = 971A10641D022E0A007FC62C /* MainVCWebViewD.swift */; };
971A10671D022E0A007FC62C /* MainVCDelegates.swift in Sources */ = {isa = PBXBuildFile; fileRef = 971A10631D022E0A007FC62C /* MainVCDelegates.swift */; };
971A106A1D022E15007FC62C /* BookmarkHUDVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 971A10691D022E15007FC62C /* BookmarkHUDVC.swift */; };
971A106C1D022E50007FC62C /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 971A106B1D022E50007FC62C /* Utilities.swift */; };
971A106F1D022E62007FC62C /* DownloadProgress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 971A106D1D022E62007FC62C /* DownloadProgress.swift */; };
@ -260,6 +259,7 @@
97BA32A51CEBC36300339A47 /* RootWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97BA32A31CEBC29500339A47 /* RootWindowController.swift */; };
97D452BC1D16FF010033666F /* RecentSearchCVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97D452BB1D16FF010033666F /* RecentSearchCVC.swift */; };
97D452BE1D1723FF0033666F /* CollectionViewCells.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97D452BD1D1723FF0033666F /* CollectionViewCells.swift */; };
97D55EF61D2075180081B523 /* TableOfContentController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97D55EF51D2075180081B523 /* TableOfContentController.swift */; };
97DF23551CE807A1003E1E5A /* GlobalOperationQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97DF23541CE807A1003E1E5A /* GlobalOperationQueue.swift */; };
97E609F11D103DED00EBCB9D /* NotificationCenter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 97E609F01D103DED00EBCB9D /* NotificationCenter.framework */; };
97E609F41D103DED00EBCB9D /* TodayViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97E609F31D103DED00EBCB9D /* TodayViewController.swift */; };
@ -407,8 +407,7 @@
971A105F1D022DF2007FC62C /* LanguageTBVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LanguageTBVC.swift; path = "Kiwix-iOS/Controller/LanguageTBVC.swift"; sourceTree = SOURCE_ROOT; };
971A10611D022E0A007FC62C /* MainVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MainVC.swift; path = "Kiwix-iOS/Controller/MainVC.swift"; sourceTree = SOURCE_ROOT; };
971A10621D022E0A007FC62C /* MainVCLoading.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MainVCLoading.swift; path = "Kiwix-iOS/Controller/MainVCLoading.swift"; sourceTree = SOURCE_ROOT; };
971A10631D022E0A007FC62C /* MainVCOtherD.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MainVCOtherD.swift; path = "Kiwix-iOS/Controller/MainVCOtherD.swift"; sourceTree = SOURCE_ROOT; };
971A10641D022E0A007FC62C /* MainVCWebViewD.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MainVCWebViewD.swift; path = "Kiwix-iOS/Controller/MainVCWebViewD.swift"; sourceTree = SOURCE_ROOT; };
971A10631D022E0A007FC62C /* MainVCDelegates.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MainVCDelegates.swift; path = "Kiwix-iOS/Controller/MainVCDelegates.swift"; sourceTree = SOURCE_ROOT; };
971A10691D022E15007FC62C /* BookmarkHUDVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BookmarkHUDVC.swift; path = "Kiwix-iOS/Controller/BookmarkHUDVC.swift"; sourceTree = SOURCE_ROOT; };
971A106B1D022E50007FC62C /* Utilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Utilities.swift; path = "Kiwix-iOS/Model/Utilities.swift"; sourceTree = SOURCE_ROOT; };
971A106D1D022E62007FC62C /* DownloadProgress.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DownloadProgress.swift; path = "Kiwix-iOS/Model/DownloadProgress.swift"; sourceTree = SOURCE_ROOT; };
@ -538,6 +537,7 @@
97D452BF1D1871E70033666F /* SearchHistoryTBVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = SearchHistoryTBVC.swift; path = "Kiwix-iOS/Controller/Search/SearchHistoryTBVC.swift"; sourceTree = SOURCE_ROOT; };
97D452C01D1871E70033666F /* SearchLocalBooksCVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = SearchLocalBooksCVC.swift; path = "Kiwix-iOS/Controller/Search/SearchLocalBooksCVC.swift"; sourceTree = SOURCE_ROOT; };
97D452C11D1871E70033666F /* SearchTabController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = SearchTabController.swift; path = "Kiwix-iOS/Controller/Search/SearchTabController.swift"; sourceTree = SOURCE_ROOT; };
97D55EF51D2075180081B523 /* TableOfContentController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TableOfContentController.swift; path = "Kiwix-iOS/Controller/TableOfContentController.swift"; sourceTree = SOURCE_ROOT; };
97DF23541CE807A1003E1E5A /* GlobalOperationQueue.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GlobalOperationQueue.swift; sourceTree = "<group>"; };
97E609EF1D103DED00EBCB9D /* Kiwix-iOSWidget.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "Kiwix-iOSWidget.appex"; sourceTree = BUILT_PRODUCTS_DIR; };
97E609F01D103DED00EBCB9D /* NotificationCenter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NotificationCenter.framework; path = System/Library/Frameworks/NotificationCenter.framework; sourceTree = SDKROOT; };
@ -844,9 +844,7 @@
children = (
971A10611D022E0A007FC62C /* MainVC.swift */,
971A10621D022E0A007FC62C /* MainVCLoading.swift */,
971A10631D022E0A007FC62C /* MainVCOtherD.swift */,
971A10641D022E0A007FC62C /* MainVCWebViewD.swift */,
971A10691D022E15007FC62C /* BookmarkHUDVC.swift */,
971A10631D022E0A007FC62C /* MainVCDelegates.swift */,
);
name = MainVC;
sourceTree = "<group>";
@ -1028,6 +1026,8 @@
972B007D1C35DBAB00B5FDC5 /* MainVC */,
97E108221C5D5A0D00E27FD3 /* Search */,
9771DC4B1C37278E009ECFF0 /* Setting */,
97D55EF51D2075180081B523 /* TableOfContentController.swift */,
971A10691D022E15007FC62C /* BookmarkHUDVC.swift */,
);
name = Controllers;
path = Kiwix;
@ -1822,7 +1822,6 @@
979CB6711D05C44F005E1BA1 /* SilentCondition.swift in Sources */,
97D452BC1D16FF010033666F /* RecentSearchCVC.swift in Sources */,
979CB6651D05C44F005E1BA1 /* NoCancelledDependencies.swift in Sources */,
971A10681D022E0A007FC62C /* MainVCWebViewD.swift in Sources */,
970103FB1C6824FA00DC48F6 /* RefreshLibraryOperation.swift in Sources */,
971A10651D022E0A007FC62C /* MainVC.swift in Sources */,
971A106F1D022E62007FC62C /* DownloadProgress.swift in Sources */,
@ -1833,7 +1832,7 @@
971A105A1D022DAD007FC62C /* LibraryLocalTBVC.swift in Sources */,
97E60A021D10423A00EBCB9D /* ShadowView.swift in Sources */,
979CB6BD1D05C520005E1BA1 /* Operation.swift in Sources */,
971A10671D022E0A007FC62C /* MainVCOtherD.swift in Sources */,
971A10671D022E0A007FC62C /* MainVCDelegates.swift in Sources */,
978C58981C1CD86E0077AE47 /* Book.swift in Sources */,
978C58961C1CD86E0077AE47 /* Language.swift in Sources */,
971A10701D022E62007FC62C /* Network.swift in Sources */,
@ -1886,6 +1885,7 @@
979CB6B71D05C520005E1BA1 /* LocationOperation.swift in Sources */,
971A102F1D022AD5007FC62C /* Logo.swift in Sources */,
979CB6451D05C44F005E1BA1 /* Capability.swift in Sources */,
97D55EF61D2075180081B523 /* TableOfContentController.swift in Sources */,
971A104B1D022CBE007FC62C /* SearchScopeSelectVC.swift in Sources */,
977998771C1E0B7900B1DD5E /* Article+CoreDataProperties.swift in Sources */,
971187301CEB50FC00B9909D /* ZimReader.mm in Sources */,