diff --git a/Kiwix-iOS/Storyboard/Library.storyboard b/Kiwix-iOS/Storyboard/Library.storyboard index 3c5356c2..728a7046 100644 --- a/Kiwix-iOS/Storyboard/Library.storyboard +++ b/Kiwix-iOS/Storyboard/Library.storyboard @@ -340,10 +340,10 @@ - + - + @@ -351,7 +351,7 @@ - + @@ -360,7 +360,7 @@ - + diff --git a/Kiwix.xcodeproj/project.pbxproj b/Kiwix.xcodeproj/project.pbxproj index 1a0b66bf..8c51dbaa 100644 --- a/Kiwix.xcodeproj/project.pbxproj +++ b/Kiwix.xcodeproj/project.pbxproj @@ -11,7 +11,6 @@ 9705D5941E368189005292AC /* Library.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9705D5931E368189005292AC /* Library.storyboard */; }; 9705D5961E368712005292AC /* LibraryBooksController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9705D5951E368712005292AC /* LibraryBooksController.swift */; }; 9705D5981E368933005292AC /* CoreDataCollectionBaseController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9705D5971E368933005292AC /* CoreDataCollectionBaseController.swift */; }; - 970A2A221DD562CB0078BB7C /* BookOperations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 970A2A211DD562CB0078BB7C /* BookOperations.swift */; }; 970E7F741D9DB0FC00741290 /* 1.8.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = 970E7F731D9DB0FC00741290 /* 1.8.xcmappingmodel */; }; 970E7F831DA0305000741290 /* WelcomeController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 970E7F7F1DA0305000741290 /* WelcomeController.swift */; }; 9711871E1CEB449A00B9909D /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 9711871D1CEB449A00B9909D /* libz.tbd */; }; @@ -150,7 +149,6 @@ 9705D5951E368712005292AC /* LibraryBooksController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibraryBooksController.swift; sourceTree = ""; }; 9705D5971E368933005292AC /* CoreDataCollectionBaseController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoreDataCollectionBaseController.swift; sourceTree = ""; }; 970912551D7F452C00BBD5A1 /* 1.8.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = 1.8.xcdatamodel; sourceTree = ""; }; - 970A2A211DD562CB0078BB7C /* BookOperations.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BookOperations.swift; sourceTree = ""; }; 970E7F731D9DB0FC00741290 /* 1.8.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; name = 1.8.xcmappingmodel; path = Kiwix/CoreData/Migration/1.8.xcmappingmodel; sourceTree = SOURCE_ROOT; }; 970E7F7C1DA0305000741290 /* Alerts.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Alerts.swift; sourceTree = ""; }; 970E7F7F1DA0305000741290 /* WelcomeController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WelcomeController.swift; sourceTree = ""; }; @@ -251,7 +249,6 @@ 97C601DB1D7F15C400362D4F /* Bookmark.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Bookmark.storyboard; sourceTree = ""; }; 97C601DD1D7F342100362D4F /* HTMLHeading.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HTMLHeading.swift; sourceTree = ""; }; 97D0E9921DDA487E0029530E /* SearchBaseController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchBaseController.swift; sourceTree = ""; }; - 97D4D64E1D874E6E00C1B065 /* SearchOperation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchOperation.swift; sourceTree = ""; }; 97D6811C1D6F70AC00E5FA99 /* Queue.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Queue.swift; sourceTree = ""; }; 97D6811E1D6F70AC00E5FA99 /* ScanLocalBook.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScanLocalBook.swift; sourceTree = ""; }; 97D681211D6F70AC00E5FA99 /* UpdateWidgetDataSourceOperation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UpdateWidgetDataSourceOperation.swift; sourceTree = ""; }; @@ -678,12 +675,10 @@ children = ( 97D6811C1D6F70AC00E5FA99 /* Queue.swift */, 9764CBD21D8083AA00072D6A /* ArticleOperation.swift */, - 970A2A211DD562CB0078BB7C /* BookOperations.swift */, 973A5C981DEBC54800C7804C /* CloudKit.swift */, 973208281DD223DB00EDD3DC /* RefreshLibrary.swift */, 97D6811E1D6F70AC00E5FA99 /* ScanLocalBook.swift */, 972F81561DDBFC79008D7289 /* Search.swift */, - 97D4D64E1D874E6E00C1B065 /* SearchOperation.swift */, 97D681211D6F70AC00E5FA99 /* UpdateWidgetDataSourceOperation.swift */, 976C1DD31E300695005EDEC4 /* UIProcedure.swift */, ); @@ -916,7 +911,6 @@ 97A1FD161D6F71CE00A80EE2 /* DirectoryMonitor.swift in Sources */, 9726591D1D90A64600D1DFFB /* Notification.swift in Sources */, 971A102C1D022AD5007FC62C /* BarButtonItems.swift in Sources */, - 970A2A221DD562CB0078BB7C /* BookOperations.swift in Sources */, 97A1FD391D6F724E00A80EE2 /* pathTools.cpp in Sources */, 972F81591DDC1B71008D7289 /* Controllers.swift in Sources */, 976B86D81DDA0C7E00FA7FD1 /* SearchContainer.swift in Sources */, diff --git a/Kiwix/Operations/ArticleOperation.swift b/Kiwix/Operations/ArticleOperation.swift index 7534557c..75c3f505 100644 --- a/Kiwix/Operations/ArticleOperation.swift +++ b/Kiwix/Operations/ArticleOperation.swift @@ -96,15 +96,3 @@ class ArticleLoadOperation: Procedure { } } -class SpotlightIndexOperation: Procedure { - init(url: URL) { - assert(Thread.isMainThread, "This Operation can only be initialized in the main thread") - super.init() - } - - override func execute() { - AppDelegate.persistentContainer.viewContext.performAndWait { - - } - } -} diff --git a/Kiwix/Operations/BookOperations.swift b/Kiwix/Operations/BookOperations.swift deleted file mode 100644 index 867d5346..00000000 --- a/Kiwix/Operations/BookOperations.swift +++ /dev/null @@ -1,39 +0,0 @@ -// -// Book.swift -// Kiwix -// -// Created by Chris Li on 11/10/16. -// Copyright © 2016 Chris Li. All rights reserved. -// - -import ProcedureKit - -/* - Removes all zim file (single & chuncked) and the idx folder that belong to a book - */ - -class DeleteBookFileOperation: Procedure { - let zimID: ZimID - - init(zimID: ZimID) { - self.zimID = zimID - super.init() - } - - override func execute() { - guard let mainZimURL = ZimMultiReader.shared.readers[zimID]?.fileURL, - let fileName = mainZimURL.pathComponents.last else { - print("Cannot find reader") - finish() - return - } - - let urls = URLSnapShot.zimFileURLsInDocDir().union(URLSnapShot.indexFolderURLsInDocDir()) - urls.forEach { (url) in - guard url.pathComponents.last == fileName else {return} - try? FileManager.default.removeItem(at: url) - } - - finish() - } -} diff --git a/Kiwix/Operations/SearchOperation.swift b/Kiwix/Operations/SearchOperation.swift deleted file mode 100644 index 1025f224..00000000 --- a/Kiwix/Operations/SearchOperation.swift +++ /dev/null @@ -1,98 +0,0 @@ -// -// SearchOperation.swift -// Kiwix -// -// Created by Chris Li on 9/12/16. -// Copyright © 2016 Chris Li. All rights reserved. -// - -import CoreData -import ProcedureKit - -class SearchOperation: GroupProcedure { - fileprivate(set) var results = [SearchResult]() - let searchTerm: String - - init(searchTerm: String) { - self.searchTerm = searchTerm - super.init(operations: []) - } - - override func execute() { - let searches = Book.fetchLocal(NSManagedObjectContext.mainQueueContext) - .filter({ $1.includeInSearch }) - .map({ BookSearch(zimID: $1.id, searchTerm: searchTerm) }) - let sort = Sort() - searches.forEach { (search) in - sort.injectResultFromDependency(search, block: { (operation, dependency, errors) in - operation.requirement += dependency.results - }) - } - - sort.addObserver(DidFinishObserver { [unowned self] (operation, errors) in - guard let operation = operation as? Sort else {return} - self.results = operation.requirement - }) - - addOperations(searches) - addOperation(sort) - - super.execute() - } -} - -private class BookSearch: Procedure { - let zimID: String - let searchTerm: String - fileprivate var results = [SearchResult]() - - init(zimID: String, searchTerm: String) { - self.zimID = zimID - self.searchTerm = searchTerm - super.init() - } - - override fileprivate func execute() { - defer { finish() } - guard let reader = ZimMultiReader.shared.readers[zimID] else {return} - - guard !isCancelled else {return} - let indexedDics = reader.search(usingIndex: searchTerm) as? [[String: AnyObject]] ?? [[String: AnyObject]]() - - guard !isCancelled else {return} - let titleDics = reader.searchSuggestionsSmart(searchTerm) as? [[String: AnyObject]] ?? [[String: AnyObject]]() - - guard !isCancelled else {return} - let mixedDics = titleDics + indexedDics // It is important we process the title search result first, so that we always keep the indexed search result - for dic in mixedDics { - guard let result = SearchResult (rawResult: dic, lowerCaseSearchTerm: searchTerm) else {continue} - self.results.append(result) - } - } -} - -private class Sort: Procedure, AutomaticInjectionOperationType { - var requirement = [SearchResult]() - - fileprivate override func execute() { - defer { finish() } - guard !isCancelled else {return} - sort() - } - - fileprivate func sort() { - requirement.sort { (result0, result1) -> Bool in - if result0.score != result1.score { - return result0.score < result1.score - } else { - if result0.snippet != nil {return true} - if result1.snippet != nil {return false} - return titleCaseInsensitiveCompare(result0, result1: result1) - } - } - } - - fileprivate func titleCaseInsensitiveCompare(_ result0: SearchResult, result1: SearchResult) -> Bool { - return result0.title.caseInsensitiveCompare(result1.title) == ComparisonResult.orderedAscending - } -}