Ios12 compatibility (#207)

* dependencies update

* welcome controller

* ios 12 build

* icon and buttons

* init and search bar config

* buttonsss

* fixing welcome controller

* fix main controller

* refactor

* main controller fix

* bookmark widget data update

* parser

* tests

* geo location

* tests

* test
This commit is contained in:
ChrisLi 2020-01-02 16:29:57 -05:00 committed by GitHub
parent fdb809ded2
commit bce6d19e9f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
46 changed files with 1777 additions and 191 deletions

View File

@ -12,6 +12,11 @@
97028C54201A7D43001259CB /* WebViewControllerProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 972B665B2006BEBA003F5365 /* WebViewControllerProtocols.swift */; };
9702BE221F97FA4300E6B4EE /* LibraryRefreshOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9702BE211F97FA4300E6B4EE /* LibraryRefreshOperation.swift */; };
9707B8F61F4B4F1500075D4F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9707B8F51F4B4F1500075D4F /* Assets.xcassets */; };
970EC39F23BCEBA4008DCA27 /* BookmarkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 970EC39C23BCE2B5008DCA27 /* BookmarkManager.swift */; };
970EC3A123BCEC84008DCA27 /* Parser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 970EC3A023BCEC84008DCA27 /* Parser.swift */; };
970EC3A423BCED7F008DCA27 /* SwiftSoup in Frameworks */ = {isa = PBXBuildFile; productRef = 970EC3A323BCED7F008DCA27 /* SwiftSoup */; };
970EC3FB23BE8E25008DCA27 /* ParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 970EC3AB23BCF31F008DCA27 /* ParserTests.swift */; };
970EC3FC23BE8E31008DCA27 /* Parser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 970EC3A023BCEC84008DCA27 /* Parser.swift */; };
97161A861F8FFD1E00A89DE3 /* LibraryCategoryController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97161A851F8FFD1E00A89DE3 /* LibraryCategoryController.swift */; };
97161A891F90072A00A89DE3 /* LibraryTableCells.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97161A881F90072A00A89DE3 /* LibraryTableCells.swift */; };
9719F60320DAF7A600B5D0EB /* SearchQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97AC121420879252004779D1 /* SearchQueue.swift */; };
@ -105,7 +110,6 @@
97CAFA942051EC4B00AC1F68 /* BackupManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97598E08202B60E0005A9055 /* BackupManager.swift */; };
97CAFA952051EC4E00AC1F68 /* DirectoryMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97E4298F1FBDF48800ABE62E /* DirectoryMonitor.swift */; };
97CAFA962051EC5100AC1F68 /* TableOfContentItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97D00A7E1FBB92D400165629 /* TableOfContentItem.swift */; };
97CE15AE23B245FB00378D9F /* MainController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97C99B47205AF58D00439C77 /* MainController.swift */; };
97CE15AF23B2668500378D9F /* TableViewSectionFooterLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97D0C4DC211BF72B00B00DAA /* TableViewSectionFooterLabel.swift */; };
97CE15B223B26BBC00378D9F /* SwiftyUserDefaults in Frameworks */ = {isa = PBXBuildFile; productRef = 97CE15B123B26BBC00378D9F /* SwiftyUserDefaults */; };
97CE15B423B26CC600378D9F /* SwiftyUserDefaults in Frameworks */ = {isa = PBXBuildFile; productRef = 97CE15B323B26CC600378D9F /* SwiftyUserDefaults */; };
@ -132,7 +136,7 @@
97D757D9238B7BA8008FB7E2 /* libicutest.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 97D757C8238B7BA8008FB7E2 /* libicutest.a */; };
97D757DA238B7BA8008FB7E2 /* libcurl.la in Resources */ = {isa = PBXBuildFile; fileRef = 97D757C9238B7BA8008FB7E2 /* libcurl.la */; };
97D757DB238B7BA8008FB7E2 /* liblzma.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 97D757CA238B7BA8008FB7E2 /* liblzma.a */; };
97D757E2238B90EC008FB7E2 /* RootSplitController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97D757E1238B90EC008FB7E2 /* RootSplitController.swift */; };
97D757E2238B90EC008FB7E2 /* RootController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97D757E1238B90EC008FB7E2 /* RootController.swift */; };
97D757E5238F3161008FB7E2 /* SideBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97D757E4238F3161008FB7E2 /* SideBarController.swift */; };
97DBCF9D203CA254004EE274 /* SettingExternalLinkController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97DBCF9C203CA254004EE274 /* SettingExternalLinkController.swift */; };
97E34E0C20124F33005080B2 /* SearchNoTextController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97E34E0B20124F33005080B2 /* SearchNoTextController.swift */; };
@ -148,6 +152,13 @@
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
970EC3F623BE8E20008DCA27 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 97A2AB801C1B80FF00052E74 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 97A36C241F8C21210079B452;
remoteInfo = iOS;
};
97C575FC202CB0E900E37502 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 97A2AB801C1B80FF00052E74 /* Project object */;
@ -207,6 +218,11 @@
97041F7E1F9652D4007D63F5 /* WikiMed.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = WikiMed.plist; sourceTree = "<group>"; };
97050D001F6733400021DE78 /* WebKitWebController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebKitWebController.swift; sourceTree = "<group>"; };
9707B8F51F4B4F1500075D4F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
970EC39C23BCE2B5008DCA27 /* BookmarkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarkManager.swift; sourceTree = "<group>"; };
970EC3A023BCEC84008DCA27 /* Parser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Parser.swift; sourceTree = "<group>"; };
970EC3AB23BCF31F008DCA27 /* ParserTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParserTests.swift; sourceTree = "<group>"; };
970EC3F123BE8E20008DCA27 /* ModelTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ModelTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
970EC3F523BE8E20008DCA27 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
97161A851F8FFD1E00A89DE3 /* LibraryCategoryController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibraryCategoryController.swift; sourceTree = "<group>"; };
97161A881F90072A00A89DE3 /* LibraryTableCells.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibraryTableCells.swift; sourceTree = "<group>"; };
9717A2521FB2592D00837492 /* Main.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = "<group>"; };
@ -273,7 +289,7 @@
97A9F6F41E2E990500F423AA /* Inject.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = Inject.js; sourceTree = "<group>"; };
97AC121420879252004779D1 /* SearchQueue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchQueue.swift; sourceTree = "<group>"; };
97B1046E1F8FC63C00488444 /* LibraryMasterController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibraryMasterController.swift; sourceTree = "<group>"; };
97B44894210FBC2C0004B056 /* WikiMed.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WikiMed.app; sourceTree = BUILT_PRODUCTS_DIR; };
97B44894210FBC2C0004B056 /* WikiMed.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; name = WikiMed.app; path = "/Users/chrisli/Developer/Kiwix/build/Debug-iphoneos/WikiMed.app"; sourceTree = "<absolute>"; };
97B44896210FBC2C0004B056 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
97B44898210FBC2C0004B056 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
97B4489B210FBC2C0004B056 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
@ -579,7 +595,7 @@
97D757C8238B7BA8008FB7E2 /* libicutest.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libicutest.a; sourceTree = "<group>"; };
97D757C9238B7BA8008FB7E2 /* libcurl.la */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = libcurl.la; sourceTree = "<group>"; };
97D757CA238B7BA8008FB7E2 /* liblzma.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = liblzma.a; sourceTree = "<group>"; };
97D757E1238B90EC008FB7E2 /* RootSplitController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RootSplitController.swift; sourceTree = "<group>"; };
97D757E1238B90EC008FB7E2 /* RootController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RootController.swift; sourceTree = "<group>"; };
97D757E4238F3161008FB7E2 /* SideBarController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SideBarController.swift; sourceTree = "<group>"; };
97DBCF9C203CA254004EE274 /* SettingExternalLinkController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingExternalLinkController.swift; sourceTree = "<group>"; };
97E34E0B20124F33005080B2 /* SearchNoTextController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchNoTextController.swift; sourceTree = "<group>"; };
@ -597,6 +613,13 @@
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
970EC3EE23BE8E20008DCA27 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
9793157E1E5127930093D3BA /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
@ -639,6 +662,7 @@
97CA4A6D20A0F583008CEA6D /* libzim.a in Frameworks */,
97CA4A6920A0F583008CEA6D /* libz.a in Frameworks */,
97CA4A6620A0F583008CEA6D /* libicui18n.a in Frameworks */,
970EC3A423BCED7F008DCA27 /* SwiftSoup in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -694,6 +718,24 @@
path = Web;
sourceTree = "<group>";
};
970EC39E23BCE7F5008DCA27 /* Model */ = {
isa = PBXGroup;
children = (
970EC39C23BCE2B5008DCA27 /* BookmarkManager.swift */,
970EC3A023BCEC84008DCA27 /* Parser.swift */,
);
path = Model;
sourceTree = "<group>";
};
970EC3F223BE8E20008DCA27 /* ModelTests */ = {
isa = PBXGroup;
children = (
970EC3AB23BCF31F008DCA27 /* ParserTests.swift */,
970EC3F523BE8E20008DCA27 /* Info.plist */,
);
path = ModelTests;
sourceTree = "<group>";
};
97252106200F9D3C00B60A80 /* Setting */ = {
isa = PBXGroup;
children = (
@ -802,7 +844,7 @@
isa = PBXGroup;
children = (
97C99B47205AF58D00439C77 /* MainController.swift */,
97D757E1238B90EC008FB7E2 /* RootSplitController.swift */,
97D757E1238B90EC008FB7E2 /* RootController.swift */,
97EF586C239DB83E007549B8 /* ContentViewController.swift */,
97B4ADFA239C6C3800264AF6 /* TabsController.swift */,
97D757E3238F29DC008FB7E2 /* SideBar */,
@ -887,14 +929,16 @@
97A2AB7F1C1B80FF00052E74 = {
isa = PBXGroup;
children = (
970EC39E23BCE7F5008DCA27 /* Model */,
973BCD1F1CEB412E00F10B44 /* Shared */,
979315821E5127930093D3BA /* macOS */,
975FDAD81F6082DA00A10E8C /* iOS */,
97B44895210FBC2C0004B056 /* WikiMed */,
970EC3F223BE8E20008DCA27 /* ModelTests */,
3B93EAF9B5C5AA23046BDEAC /* Frameworks */,
97A36C4E1F8C21210079B452 /* Kiwix.app */,
97C575F2202CB0E800E37502 /* Bookmarks.appex */,
97B44894210FBC2C0004B056 /* WikiMed.app */,
970EC3F123BE8E20008DCA27 /* ModelTests.xctest */,
);
sourceTree = "<group>";
wrapsLines = 0;
@ -1360,6 +1404,24 @@
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
970EC3F023BE8E20008DCA27 /* ModelTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 970EC3F823BE8E20008DCA27 /* Build configuration list for PBXNativeTarget "ModelTests" */;
buildPhases = (
970EC3ED23BE8E20008DCA27 /* Sources */,
970EC3EE23BE8E20008DCA27 /* Frameworks */,
970EC3EF23BE8E20008DCA27 /* Resources */,
);
buildRules = (
);
dependencies = (
970EC3F723BE8E20008DCA27 /* PBXTargetDependency */,
);
name = ModelTests;
productName = ModelTests;
productReference = 970EC3F123BE8E20008DCA27 /* ModelTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
979315801E5127930093D3BA /* macOS */ = {
isa = PBXNativeTarget;
buildConfigurationList = 979315A31E5127940093D3BA /* Build configuration list for PBXNativeTarget "macOS" */;
@ -1403,6 +1465,7 @@
97CE15B123B26BBC00378D9F /* SwiftyUserDefaults */,
97CE15B623B26EB300378D9F /* Realm */,
97CE15B823B26EB300378D9F /* RealmSwift */,
970EC3A323BCED7F008DCA27 /* SwiftSoup */,
);
productName = WikiMed;
productReference = 97A36C4E1F8C21210079B452 /* Kiwix.app */;
@ -1449,10 +1512,14 @@
97A2AB801C1B80FF00052E74 /* Project object */ = {
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 0940;
LastUpgradeCheck = 1100;
LastSwiftUpdateCheck = 1130;
LastUpgradeCheck = 1130;
ORGANIZATIONNAME = "Chris Li";
TargetAttributes = {
970EC3F023BE8E20008DCA27 = {
CreatedOnToolsVersion = 11.3;
TestTargetID = 97A36C241F8C21210079B452;
};
979315801E5127930093D3BA = {
CreatedOnToolsVersion = 8.2.1;
DevelopmentTeam = L7HWM3SP3L;
@ -1519,6 +1586,7 @@
packageReferences = (
97CE15B023B26BBC00378D9F /* XCRemoteSwiftPackageReference "SwiftyUserDefaults" */,
97CE15B523B26EB300378D9F /* XCRemoteSwiftPackageReference "realm-cocoa" */,
970EC3A223BCED7F008DCA27 /* XCRemoteSwiftPackageReference "SwiftSoup" */,
);
productRefGroup = 97A2AB7F1C1B80FF00052E74;
projectDirPath = "";
@ -1528,11 +1596,19 @@
979315801E5127930093D3BA /* macOS */,
97B44893210FBC2C0004B056 /* WikiMed */,
97C575F1202CB0E800E37502 /* Bookmarks */,
970EC3F023BE8E20008DCA27 /* ModelTests */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
970EC3EF23BE8E20008DCA27 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
9793157F1E5127930093D3BA /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
@ -1581,6 +1657,15 @@
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
970EC3ED23BE8E20008DCA27 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
970EC3FC23BE8E31008DCA27 /* Parser.swift in Sources */,
970EC3FB23BE8E25008DCA27 /* ParserTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
9793157D1E5127930093D3BA /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
@ -1623,7 +1708,6 @@
97252103200D3C4B00B60A80 /* HUDController.swift in Sources */,
977D7BB41F9E6A43009A8703 /* SearchResult.swift in Sources */,
97A2180C2024EC3800D1E67B /* SettingFontSizeController.swift in Sources */,
97CE15AE23B245FB00378D9F /* MainController.swift in Sources */,
9702BE221F97FA4300E6B4EE /* LibraryRefreshOperation.swift in Sources */,
9742596920FCE7BA000BB88A /* SettingLibraryController.swift in Sources */,
97242E2B2093B38A00AA4436 /* Preference.swift in Sources */,
@ -1634,11 +1718,12 @@
97DBCF9D203CA254004EE274 /* SettingExternalLinkController.swift in Sources */,
977D7BB81F9E6A43009A8703 /* ZimMultiReader.swift in Sources */,
97028C4F20192F65001259CB /* OutlineController.swift in Sources */,
970EC39F23BCEBA4008DCA27 /* BookmarkManager.swift in Sources */,
97161A861F8FFD1E00A89DE3 /* LibraryCategoryController.swift in Sources */,
97E34E0C20124F33005080B2 /* SearchNoTextController.swift in Sources */,
97B1046F1F8FC63C00488444 /* LibraryMasterController.swift in Sources */,
977D7BBE1F9FC618009A8703 /* Queue.swift in Sources */,
97D757E2238B90EC008FB7E2 /* RootSplitController.swift in Sources */,
97D757E2238B90EC008FB7E2 /* RootController.swift in Sources */,
972B6662200808D6003F5365 /* WelcomeController.swift in Sources */,
97252108200F9D6A00B60A80 /* SettingController.swift in Sources */,
97A36C2D1F8C21210079B452 /* WebKitHandler.swift in Sources */,
@ -1646,6 +1731,7 @@
97BAA542202B4C5E00500644 /* SettingBackupController.swift in Sources */,
97CA45D2209BB23F008CEA6D /* ZimFileProcessing.swift in Sources */,
97A6882E207D3DE300DBBE0D /* ZimFile.swift in Sources */,
970EC3A123BCEC84008DCA27 /* Parser.swift in Sources */,
971B8E58202246ED00C5C939 /* RecentSearchCells.swift in Sources */,
975F97A820D00EAE0005D642 /* SettingSearchController.swift in Sources */,
97242E162093A9AC00AA4436 /* Bookmark.swift in Sources */,
@ -1699,6 +1785,11 @@
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
970EC3F723BE8E20008DCA27 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 97A36C241F8C21210079B452 /* iOS */;
targetProxy = 970EC3F623BE8E20008DCA27 /* PBXContainerItemProxy */;
};
97C575FD202CB0E900E37502 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
platformFilter = ios;
@ -1743,6 +1834,66 @@
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
970EC3F923BE8E20008DCA27 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = L7HWM3SP3L;
GCC_C_LANGUAGE_STANDARD = gnu11;
INFOPLIST_FILE = ModelTests/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 13.2;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = org.kiwix.ModelTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Kiwix.app/Kiwix";
};
name = Debug;
};
970EC3FA23BE8E20008DCA27 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = L7HWM3SP3L;
GCC_C_LANGUAGE_STANDARD = gnu11;
INFOPLIST_FILE = ModelTests/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 13.2;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = org.kiwix.ModelTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Kiwix.app/Kiwix";
};
name = Release;
};
979315A41E5127940093D3BA /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
@ -1932,7 +2083,6 @@
97A36C4C1F8C21210079B452 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = "$(ARCHS_STANDARD)";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon_iOS;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
@ -1971,7 +2121,6 @@
97A36C4D1F8C21210079B452 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = "$(ARCHS_STANDARD)";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon_iOS;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
@ -2123,6 +2272,15 @@
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
970EC3F823BE8E20008DCA27 /* Build configuration list for PBXNativeTarget "ModelTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
970EC3F923BE8E20008DCA27 /* Debug */,
970EC3FA23BE8E20008DCA27 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
979315A31E5127940093D3BA /* Build configuration list for PBXNativeTarget "macOS" */ = {
isa = XCConfigurationList;
buildConfigurations = (
@ -2171,6 +2329,14 @@
/* End XCConfigurationList section */
/* Begin XCRemoteSwiftPackageReference section */
970EC3A223BCED7F008DCA27 /* XCRemoteSwiftPackageReference "SwiftSoup" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/scinfu/SwiftSoup";
requirement = {
kind = upToNextMajorVersion;
minimumVersion = 2.3.0;
};
};
97CE15B023B26BBC00378D9F /* XCRemoteSwiftPackageReference "SwiftyUserDefaults" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/sunshinejr/SwiftyUserDefaults";
@ -2183,14 +2349,18 @@
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/realm/realm-cocoa";
requirement = {
kind = versionRange;
maximumVersion = 4.0.0;
minimumVersion = 3.0.0;
kind = upToNextMajorVersion;
minimumVersion = 4.0.0;
};
};
/* End XCRemoteSwiftPackageReference section */
/* Begin XCSwiftPackageProductDependency section */
970EC3A323BCED7F008DCA27 /* SwiftSoup */ = {
isa = XCSwiftPackageProductDependency;
package = 970EC3A223BCED7F008DCA27 /* XCRemoteSwiftPackageReference "SwiftSoup" */;
productName = SwiftSoup;
};
97CE15B123B26BBC00378D9F /* SwiftyUserDefaults */ = {
isa = XCSwiftPackageProductDependency;
package = 97CE15B023B26BBC00378D9F /* XCRemoteSwiftPackageReference "SwiftyUserDefaults" */;

View File

@ -24,8 +24,8 @@
"repositoryURL": "https://github.com/realm/realm-cocoa",
"state": {
"branch": null,
"revision": "40732f2ec0cdc32d9d3df8219b2e655deb3077f1",
"version": "3.21.0"
"revision": "c49cddd98fb37ad57a5703b25c5dd7be387c0180",
"version": "4.0.0"
}
},
{
@ -37,6 +37,15 @@
"version": "5.23.5"
}
},
{
"package": "SwiftSoup",
"repositoryURL": "https://github.com/scinfu/SwiftSoup",
"state": {
"branch": null,
"revision": "7f187fd8804e63dea89879c95d7c2f7703727d0f",
"version": "2.3.0"
}
},
{
"package": "SwiftyUserDefaults",
"repositoryURL": "https://github.com/sunshinejr/SwiftyUserDefaults",

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1120"
LastUpgradeVersion = "1130"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
@ -28,6 +28,26 @@
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "970EC3B723BE8A11008DCA27"
BuildableName = "ModelTest.xctest"
BlueprintName = "ModelTest"
ReferencedContainer = "container:Kiwix.xcodeproj">
</BuildableReference>
</TestableReference>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "970EC3F023BE8E20008DCA27"
BuildableName = "ModelTests.xctest"
BlueprintName = "ModelTests"
ReferencedContainer = "container:Kiwix.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
</TestAction>
<LaunchAction

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1120"
LastUpgradeVersion = "1130"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"

View File

@ -0,0 +1,39 @@
//
// BookmarkManager.swift
// Kiwix
//
// Created by Chris Li on 1/1/20.
// Copyright © 2020 Chris Li. All rights reserved.
//
import Foundation
import NotificationCenter
import RealmSwift
class BookmarkManager {
private let database = try? Realm(configuration: Realm.defaultConfig)
func updateBookmarkWidgetData() {
let bookmarks: [Bookmark] = {
var bookmarks = [Bookmark]()
if let result = database?.objects(Bookmark.self).sorted(byKeyPath: "date", ascending: false) {
for bookmark in result {
guard bookmarks.count < 8 else {break}
bookmarks.append(bookmark)
}
}
return bookmarks
}()
let bookmarksData = bookmarks.compactMap { (bookmark) -> [String: Any]? in
guard let zimFile = bookmark.zimFile,
let url = URL(bookID: zimFile.id, contentPath: bookmark.path) else {return nil}
return [
"title": bookmark.title,
"url": url.absoluteString,
"thumbImageData": bookmark.thumbImageData ?? bookmark.zimFile?.icon ?? Data()
]
}
UserDefaults(suiteName: "group.kiwix")?.set(bookmarksData, forKey: "bookmarks")
NCWidgetController().setHasContent(bookmarks.count > 0, forWidgetWithBundleIdentifier: "self.Kiwix.Bookmarks")
}
}

39
Model/Parser.swift Normal file
View File

@ -0,0 +1,39 @@
//
// Parser.swift
// Kiwix
//
// Created by Chris Li on 1/1/20.
// Copyright © 2020 Chris Li. All rights reserved.
//
import CoreLocation
import SwiftSoup
class Parser {
private let document: Document
init?(html: String) throws {
self.document = try SwiftSoup.parse(html)
}
convenience init?(zimFileId: String, path: String) throws {
try self.init(html: "")
}
func getTitle() -> String? {
do {
let elements = try document.select("head > title")
return try elements.first()?.text()
} catch { return nil }
}
func getGeoCoordinate() -> CLLocationCoordinate2D? {
do {
let elements = try document.select("head > meta[name='geo.position']")
let content = try elements.first()?.attr("content")
guard let parts = content?.split(separator: ";"), parts.count == 2,
let lat = Double(parts[0]), let lon = Double(parts[1]) else { return nil }
return CLLocationCoordinate2D(latitude: lat, longitude: lon)
} catch { return nil }
}
}

22
ModelTests/Info.plist Normal file
View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>

View File

@ -0,0 +1,33 @@
//
// ModelTests.swift
// ModelTests
//
// Created by Chris Li on 1/2/20.
// Copyright © 2020 Chris Li. All rights reserved.
//
import XCTest
class ModelTests: XCTestCase {
override func setUp() {
// Put setup code here. This method is called before the invocation of each test method in the class.
}
override func tearDown() {
// Put teardown code here. This method is called after the invocation of each test method in the class.
}
func testExample() {
// This is an example of a functional test case.
// Use XCTAssert and related functions to verify your tests produce the correct results.
}
func testPerformanceExample() {
// This is an example of a performance test case.
measure {
// Put the code you want to measure the time of here.
}
}
}

View File

@ -0,0 +1,45 @@
//
// ParserTest.swift
// ParserTest
//
// Created by Chris Li on 1/1/20.
// Copyright © 2020 Chris Li. All rights reserved.
//
import XCTest
import CoreLocation
class TitleTest: XCTestCase {
func test() {
[
("<html><head><title>I am a title!</title></head></html>", "I am a title!"),
("<html><head></head></html>", nil),
].forEach { html, expected in
let parser = try? Parser(html: html)
let title = parser?.getTitle()
XCTAssert(title == expected)
}
}
}
class GeoCoordinateTest: XCTestCase {
func testSuccess() {
let html = "<html><head><meta name='geo.position' content='42.10833333;-72.07916667'></head></html>"
let parser = try? Parser(html: html)
let coordinate = parser?.getGeoCoordinate()
assert(coordinate?.latitude == 42.10833333)
assert(coordinate?.longitude == -72.07916667)
}
func testFailure() {
[
"<html><head><meta name='geo.position' content='-72.07916667'></head></html>",
"<html><head><meta name='geo.position'></head></html>",
"<html><head><h1>I am a header</h1></head></html>"
].forEach { html in
let parser = try? Parser(html: html)
let coordinate = parser?.getGeoCoordinate()
XCTAssertNil(coordinate)
}
}
}

View File

@ -16,15 +16,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate, DirectoryMonitorDelegate
let fileMonitor = DirectoryMonitor(url: URL.documentDirectory)
func applicationDidFinishLaunching(_ application: UIApplication) {
let mainController: UIViewController = {
if #available(iOS 13.0, *) {
return UIViewController()
} else {
return UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController()!
}
}()
window = UIWindow(frame: UIScreen.main.bounds)
window?.rootViewController = mainController
window?.rootViewController = RootController()
window?.makeKeyAndVisible()
print(URL.documentDirectory)
@ -57,19 +50,18 @@ class AppDelegate: UIResponder, UIApplicationDelegate, DirectoryMonitorDelegate
func application(_ app: UIApplication, open url: URL,
options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
guard let rootNavigationController = window?.rootViewController as? UINavigationController,
let mainController = rootNavigationController.topViewController as? MainController else {return false}
window?.rootViewController?.dismiss(animated: false)
guard let rootController = window?.rootViewController as? RootController else {return false}
rootController.dismiss(animated: false)
if url.scheme?.caseInsensitiveCompare("kiwix") == .orderedSame {
mainController.load(url: url)
rootController.contentViewController.load(url: url)
return true
} else if url.scheme == "file" {
if let _ = ZimMultiReader.getMetaData(url: url) {
let canOpenInPlace = options[.openInPlace] as? Bool ?? false
let fileImportController = FileImportController(fileURL: url, canOpenInPlace: canOpenInPlace)
mainController.present(fileImportController, animated: true)
rootController.present(fileImportController, animated: true)
} else {
mainController.present(FileImportAlertController(fileName: url.lastPathComponent), animated: true)
rootController.present(FileImportAlertController(fileName: url.lastPathComponent), animated: true)
}
return true
} else {
@ -115,15 +107,14 @@ class AppDelegate: UIResponder, UIApplicationDelegate, DirectoryMonitorDelegate
// MARK: - Home Screen Quick Actions
func application(_ application: UIApplication, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) {
guard let rootNavigationController = window?.rootViewController as? UINavigationController,
let mainController = rootNavigationController.topViewController as? MainController,
guard let rootController = window?.rootViewController as? RootController,
let shortcutItemType = ShortcutItemType(rawValue: shortcutItem.type) else { completionHandler(false); return }
switch shortcutItemType {
case .search:
mainController.shouldShowSearch = true
rootController.contentViewController.searchController.isActive = true
case .bookmark:
mainController.presentedViewController?.dismiss(animated: false)
mainController.presentAdaptively(controller: mainController.bookmarkController, animated: true)
rootController.dismiss(animated: false)
rootController.contentViewController.openBookmark()
case .continueReading:
break
}
@ -135,9 +126,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate, DirectoryMonitorDelegate
let search = UIApplicationShortcutItem(type: ShortcutItemType.search.rawValue, localizedTitle: NSLocalizedString("Search", comment: "3D Touch Menu Title"))
var shortcutItems = [search, bookmark]
if let rootNavigationController = window?.rootViewController as? UINavigationController,
let mainController = rootNavigationController.topViewController as? MainController,
let title = mainController.currentWebController?.currentTitle, let url = mainController.currentWebController?.currentURL {
if let rootController = window?.rootViewController as? RootController,
let title = rootController.contentViewController.currentWebViewController?.title,
let url = rootController.contentViewController.currentWebViewController?.currentURL {
shortcutItems.append(UIApplicationShortcutItem(type: ShortcutItemType.continueReading.rawValue,
localizedTitle: title , localizedSubtitle: NSLocalizedString("Continue Reading", comment: "3D Touch Menu Title"),
icon: nil, userInfo: ["URL": url.absoluteString as NSSecureCoding]))

View File

@ -10,6 +10,7 @@
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "template",
"preserves-vector-representation" : true
}
}

View File

@ -2,14 +2,11 @@
"images" : [
{
"idiom" : "universal",
"filename" : "star.pdf"
"filename" : "Regular-M.pdf"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"preserves-vector-representation" : true
}
}

View File

@ -0,0 +1,114 @@
%PDF-1.7
1 0 obj
<< >>
endobj
2 0 obj
<< /Length 3 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 0.000000 -0.160767 cm
0.000000 0.000000 0.000000 scn
5.019138 0.376961 m
5.502104 0.000021 6.114616 0.129591 6.844951 0.659670 c
13.076244 5.241846 l
19.319309 0.659670 l
20.049620 0.129591 20.650360 0.000021 21.145098 0.376961 c
21.628063 0.742128 21.734114 1.342865 21.439583 2.190989 c
18.977688 9.529544 l
25.267818 14.041026 l
25.998299 14.559334 26.292614 15.112959 26.104204 15.690153 c
25.915794 16.267349 25.362146 16.550035 24.455078 16.538261 c
16.739618 16.479374 l
14.395521 23.853262 l
14.112810 24.713142 13.688757 25.160767 13.076244 25.160767 c
12.475481 25.160767 12.051426 24.713142 11.768715 23.853262 c
9.424619 16.479374 l
1.709136 16.538261 l
0.802116 16.550035 0.248490 16.267349 0.060032 15.690153 c
-0.140222 15.112959 0.166034 14.559334 0.896368 14.041026 c
7.186549 9.529544 l
4.724655 2.190989 l
4.430171 1.342865 4.536197 0.742128 5.019138 0.376961 c
h
6.715380 2.697504 m
6.691810 2.732841 6.703583 2.744619 6.715380 2.815296 c
9.059476 9.541316 l
9.224388 10.000712 9.130136 10.377653 8.717877 10.660364 c
2.851727 14.712474 l
2.792840 14.747791 2.781068 14.771361 2.792840 14.794907 c
2.804613 14.830248 2.828182 14.830248 2.898866 14.830248 c
10.025382 14.712474 l
10.508324 14.700677 10.814604 14.889160 10.967720 15.372101 c
13.017333 22.192360 l
13.029105 22.263044 13.052675 22.286591 13.076244 22.286591 c
13.111562 22.286591 13.135132 22.263044 13.146904 22.192360 c
15.196517 15.372101 l
15.349657 14.889160 15.655911 14.700677 16.138878 14.712474 c
23.265274 14.830248 l
23.335958 14.830248 23.359598 14.830248 23.371420 14.794907 c
23.383240 14.771361 23.359600 14.747791 23.312557 14.712474 c
17.446383 10.660364 l
17.034100 10.377653 16.939871 10.000712 17.104784 9.541316 c
19.448881 2.815296 l
19.460653 2.744619 19.472425 2.732841 19.448881 2.697504 c
19.425312 2.673944 19.389971 2.685724 19.342855 2.721062 c
13.676983 7.044081 l
13.300043 7.338564 12.864192 7.338564 12.487277 7.044081 c
6.821381 2.721062 l
6.774267 2.685724 6.738925 2.673944 6.715380 2.697504 c
h
f
n
Q
endstream
endobj
3 0 obj
2090
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 26.159668 25.000000 ]
/Resources 1 0 R
/Contents 2 0 R
/Parent 5 0 R
>>
endobj
5 0 obj
<< /Kids [ 4 0 R ]
/Count 1
/Type /Pages
>>
endobj
6 0 obj
<< /Type /Catalog
/Pages 5 0 R
>>
endobj
xref
0 7
0000000000 65535 f
0000000010 00000 n
0000000034 00000 n
0000002180 00000 n
0000002203 00000 n
0000002376 00000 n
0000002450 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
2509
%%EOF

Binary file not shown.

View File

@ -0,0 +1,12 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "Regular-M.pdf"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

View File

@ -0,0 +1,79 @@
%PDF-1.7
1 0 obj
<< >>
endobj
2 0 obj
<< /Length 3 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm
0.000000 0.000000 0.000000 scn
10.411055 0.341969 m
10.626374 0.126656 10.905011 -0.000002 11.234307 -0.000002 c
11.892923 -0.000002 12.386880 0.493956 12.386880 1.152561 c
12.386880 1.469202 12.260221 1.760506 12.057559 1.975821 c
2.837077 10.993670 l
12.057559 20.011517 l
12.260221 20.226837 12.386880 20.530815 12.386880 20.834793 c
12.386880 21.493385 11.892923 22.000000 11.234307 22.000000 c
10.905011 22.000000 10.626374 21.873365 10.411055 21.658047 c
0.379955 11.842264 l
0.139319 11.639604 0.000000 11.322966 0.000000 10.993670 c
0.000000 10.677033 0.126660 10.385738 0.367296 10.145077 c
10.411055 0.341969 l
h
f
n
Q
endstream
endobj
3 0 obj
717
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 12.386719 22.000000 ]
/Resources 1 0 R
/Contents 2 0 R
/Parent 5 0 R
>>
endobj
5 0 obj
<< /Kids [ 4 0 R ]
/Count 1
/Type /Pages
>>
endobj
6 0 obj
<< /Type /Catalog
/Pages 5 0 R
>>
endobj
xref
0 7
0000000000 65535 f
0000000010 00000 n
0000000034 00000 n
0000000807 00000 n
0000000829 00000 n
0000001002 00000 n
0000001076 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
1135
%%EOF

View File

@ -0,0 +1,12 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "Regular-M.pdf"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

View File

@ -0,0 +1,79 @@
%PDF-1.7
1 0 obj
<< >>
endobj
2 0 obj
<< /Length 3 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm
0.000000 0.000000 0.000000 scn
1.151884 0.000002 m
1.481016 0.000002 1.759492 0.126581 1.974688 0.341770 c
12.012670 10.151897 l
12.253167 10.392422 12.379754 10.683548 12.379754 11.000004 c
12.379754 11.329109 12.253167 11.632914 12.012670 11.848109 c
1.987339 21.645592 l
1.759493 21.873438 1.481016 22.000000 1.151884 22.000000 c
0.493672 22.000000 0.000000 21.493675 0.000000 20.835464 c
0.000000 20.531660 0.126587 20.227858 0.329106 20.012661 c
9.544310 11.000004 l
0.329106 1.987343 l
0.126587 1.772152 0.000000 1.481014 0.000000 1.164557 c
0.000000 0.506329 0.493672 0.000002 1.151884 0.000002 c
h
f
n
Q
endstream
endobj
3 0 obj
700
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 12.379761 22.000000 ]
/Resources 1 0 R
/Contents 2 0 R
/Parent 5 0 R
>>
endobj
5 0 obj
<< /Kids [ 4 0 R ]
/Count 1
/Type /Pages
>>
endobj
6 0 obj
<< /Type /Catalog
/Pages 5 0 R
>>
endobj
xref
0 7
0000000000 65535 f
0000000010 00000 n
0000000034 00000 n
0000000790 00000 n
0000000812 00000 n
0000000985 00000 n
0000001059 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
1118
%%EOF

View File

@ -0,0 +1,12 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "Regular-M.pdf"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

View File

@ -0,0 +1,99 @@
%PDF-1.7
1 0 obj
<< >>
endobj
2 0 obj
<< /Length 3 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm
0.000000 0.000000 0.000000 scn
3.721974 0.000000 m
23.849039 0.000000 l
25.982643 0.000000 27.215614 1.232756 27.215614 3.674564 c
27.215614 16.156242 l
27.215614 18.598055 25.970991 19.818960 23.493639 19.818960 c
11.960133 19.818960 l
11.154077 19.818960 10.679945 20.020473 10.087275 20.518322 c
9.364218 21.122841 l
8.581880 21.774769 7.965516 22.000000 6.803868 22.000000 c
3.271536 22.000000 l
1.197188 22.000000 0.000000 20.814659 0.000000 18.420258 c
0.000000 3.674564 l
0.000000 1.220901 1.244599 0.000000 3.721974 0.000000 c
h
1.908398 18.325438 m
1.908398 19.498907 2.524786 20.091578 3.662717 20.091578 c
6.306018 20.091578 l
7.100203 20.091578 7.574335 19.901936 8.178877 19.380392 c
8.901934 18.787722 l
9.672400 18.147615 10.300635 17.910563 11.474130 17.910563 c
23.469849 17.910563 l
24.643343 17.910563 25.307045 17.282326 25.307045 16.049574 c
25.307045 15.338366 l
1.908398 15.338366 l
1.908398 18.325438 l
h
3.745692 1.908401 m
2.560326 1.908401 1.908398 2.536634 1.908398 3.769394 c
1.908398 13.548481 l
25.307045 13.548481 l
25.307045 3.757540 l
25.307045 2.536634 24.643343 1.908401 23.469849 1.908401 c
3.745692 1.908401 l
h
f
n
Q
endstream
endobj
3 0 obj
1244
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 27.215576 22.000000 ]
/Resources 1 0 R
/Contents 2 0 R
/Parent 5 0 R
>>
endobj
5 0 obj
<< /Kids [ 4 0 R ]
/Count 1
/Type /Pages
>>
endobj
6 0 obj
<< /Type /Catalog
/Pages 5 0 R
>>
endobj
xref
0 7
0000000000 65535 f
0000000010 00000 n
0000000034 00000 n
0000001334 00000 n
0000001357 00000 n
0000001530 00000 n
0000001604 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
1663
%%EOF

View File

@ -0,0 +1,12 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "Regular-M.pdf"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

View File

@ -0,0 +1,189 @@
%PDF-1.7
1 0 obj
<< >>
endobj
2 0 obj
<< /Length 3 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 0.000000 -0.072388 cm
0.000000 0.000000 0.000000 scn
12.682625 1.601536 m
12.975467 1.601536 13.257051 1.635330 13.561172 1.657845 c
14.203189 0.418865 l
14.327085 0.171074 14.574876 0.035919 14.890255 0.080971 c
15.171841 0.137278 15.363324 0.340019 15.408375 0.644142 c
15.599858 2.007015 l
16.163029 2.153448 16.714941 2.367441 17.244318 2.603975 c
18.258020 1.691637 l
18.472040 1.488897 18.742344 1.443846 19.023930 1.601536 c
19.271744 1.736689 19.373102 2.007017 19.316795 2.299864 c
19.035210 3.651474 l
19.508255 3.978113 19.970068 4.349806 20.386805 4.766554 c
21.637041 4.237171 l
21.918695 4.124538 22.189045 4.180855 22.402882 4.439913 c
22.594341 4.642654 22.616947 4.935505 22.448093 5.183302 c
21.715931 6.354696 l
22.053869 6.827757 22.324221 7.334618 22.583269 7.875252 c
23.968473 7.807686 l
24.261431 7.796406 24.497871 7.954096 24.599369 8.235682 c
24.689333 8.517265 24.610672 8.787596 24.374001 8.967821 c
23.292826 9.823833 l
23.439304 10.364491 23.551874 10.950173 23.608158 11.558394 c
24.903399 11.963876 l
25.196356 12.065257 25.365210 12.279254 25.365210 12.583377 c
25.365210 12.876219 25.196356 13.090239 24.903399 13.191597 c
23.608158 13.608357 l
23.551874 14.216578 23.439304 14.779749 23.292826 15.331662 c
24.374001 16.198931 l
24.599369 16.367878 24.689333 16.626949 24.599369 16.908535 c
24.497871 17.190119 24.261431 17.347809 23.968473 17.336552 c
22.583269 17.280220 l
22.324221 17.820877 22.053869 18.327717 21.715931 18.800785 c
22.448093 19.972176 l
22.605644 20.208710 22.583269 20.501575 22.402882 20.704317 c
22.189045 20.963364 21.918695 21.030952 21.637041 20.907057 c
20.386805 20.400192 l
19.970068 20.794416 19.508255 21.177383 19.035210 21.504021 c
19.316795 22.844358 l
19.373102 23.148479 19.271744 23.418785 19.023930 23.553961 c
18.742344 23.700394 18.472040 23.677855 18.258020 23.452578 c
17.244318 22.562773 l
16.714941 22.799307 16.163029 22.990789 15.599858 23.148479 c
15.408375 24.511354 l
15.363324 24.804197 15.160583 25.018194 14.878999 25.063269 c
14.574877 25.108318 14.327085 24.984423 14.203189 24.736609 c
13.561172 23.497629 l
13.257051 23.520166 12.975467 23.542704 12.682625 23.542704 c
12.378502 23.542704 12.108198 23.520166 11.804076 23.497629 c
11.150804 24.736609 l
11.026908 24.984423 10.779117 25.108318 10.474995 25.063269 c
10.193409 25.018194 9.990669 24.804197 9.956876 24.511354 c
9.754135 23.159737 l
9.190965 22.990791 8.650309 22.799307 8.109675 22.562773 c
7.095973 23.452578 l
6.881953 23.677855 6.611625 23.700394 6.330040 23.553961 c
6.082249 23.418785 5.980891 23.148479 6.037199 22.844358 c
6.318784 21.504021 l
5.856995 21.177383 5.383926 20.794416 4.967165 20.400192 c
3.716930 20.907057 l
3.435345 21.030952 3.176297 20.963364 2.962277 20.704317 c
2.770816 20.501575 2.748279 20.208712 2.905969 19.983458 c
3.638085 18.800785 l
3.311449 18.327717 3.029865 17.820877 2.770816 17.280220 c
1.396662 17.336552 l
1.103820 17.347809 0.856028 17.190119 0.754647 16.908535 c
0.664545 16.626949 0.743390 16.367878 0.979924 16.198931 c
2.061213 15.331662 l
1.914781 14.779749 1.802142 14.216578 1.768348 13.608357 c
0.450548 13.191597 l
0.157690 13.101496 0.000000 12.887499 0.000000 12.583377 c
0.000000 12.279254 0.157690 12.065257 0.450548 11.963876 c
1.768348 11.547138 l
1.802142 10.950174 1.914781 10.364491 2.061213 9.823833 c
0.979924 8.967821 l
0.754647 8.787596 0.675802 8.517265 0.754647 8.235682 c
0.856028 7.954096 1.103820 7.796406 1.396662 7.807686 c
2.770816 7.875252 l
3.029865 7.334618 3.311449 6.827757 3.638085 6.354696 c
2.905969 5.183302 l
2.748279 4.935505 2.770816 4.642654 2.962277 4.439913 c
3.176297 4.180855 3.435345 4.124538 3.716930 4.237171 c
4.967165 4.766554 l
5.383926 4.349806 5.856995 3.978113 6.318784 3.651474 c
6.037199 2.299864 l
5.980891 2.007017 6.082249 1.736689 6.330040 1.601536 c
6.611625 1.443846 6.881953 1.488897 7.095973 1.691637 c
8.109675 2.603975 l
8.650309 2.367441 9.190965 2.153448 9.754135 2.007015 c
9.956876 0.644142 l
9.990669 0.340019 10.193409 0.137278 10.474995 0.080971 c
10.779117 0.035919 11.026908 0.171074 11.150804 0.418865 c
11.804076 1.657845 l
12.096918 1.635330 12.378502 1.601536 12.682625 1.601536 c
h
15.509756 13.292979 m
14.991637 14.712161 13.944140 15.489328 12.660088 15.489328 c
12.457348 15.489328 12.243350 15.466815 11.871663 15.387970 c
8.639051 20.907057 l
9.855494 21.504021 11.218369 21.830656 12.682625 21.830656 c
17.593489 21.830656 21.445581 18.102463 21.805895 13.292979 c
15.509756 13.292979 l
h
3.536727 12.572119 m
3.536727 15.703349 5.023496 18.462893 7.343765 20.129866 c
10.610147 14.577008 l
9.990669 13.946250 9.709085 13.259185 9.709085 12.527068 c
9.709085 11.817466 9.979412 11.164170 10.598890 10.510899 c
7.276177 5.059404 l
4.989703 6.737656 3.536727 9.463404 3.536727 12.572119 c
h
11.308493 12.538325 m
11.308493 13.304235 11.950508 13.901199 12.682625 13.901199 c
13.437278 13.901199 14.068036 13.304235 14.068036 12.538325 c
14.068036 11.783671 13.437278 11.164171 12.682625 11.164171 c
11.950508 11.164171 11.308493 11.783671 11.308493 12.538325 c
h
12.682625 3.313572 m
11.184597 3.313572 9.787930 3.662737 8.560207 4.270962 c
11.871663 9.688682 l
12.220837 9.598557 12.457348 9.576042 12.660088 9.576042 c
13.955398 9.576042 15.002894 10.375747 15.509756 11.828723 c
21.794823 11.828723 l
21.434277 7.041777 17.593489 3.313572 12.682625 3.313572 c
h
f
n
Q
endstream
endobj
3 0 obj
5427
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 25.365234 25.000000 ]
/Resources 1 0 R
/Contents 2 0 R
/Parent 5 0 R
>>
endobj
5 0 obj
<< /Kids [ 4 0 R ]
/Count 1
/Type /Pages
>>
endobj
6 0 obj
<< /Type /Catalog
/Pages 5 0 R
>>
endobj
xref
0 7
0000000000 65535 f
0000000010 00000 n
0000000034 00000 n
0000005517 00000 n
0000005540 00000 n
0000005713 00000 n
0000005787 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
5846
%%EOF

View File

@ -0,0 +1,12 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "Regular-M.pdf"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

View File

@ -0,0 +1,107 @@
%PDF-1.7
1 0 obj
<< >>
endobj
2 0 obj
<< /Length 3 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm
0.000000 0.000000 0.000000 scn
1.375671 13.210924 m
2.139945 13.210924 2.751364 13.822323 2.751364 14.575685 c
2.751364 15.339936 2.139945 15.951355 1.375671 15.951355 c
0.611397 15.951355 0.000000 15.339936 0.000000 14.575685 c
0.000000 13.822323 0.611397 13.210924 1.375671 13.210924 c
h
6.201465 13.702225 m
21.115652 13.702225 l
21.606907 13.702225 22.000000 14.084362 22.000000 14.575685 c
22.000000 15.077919 21.606907 15.460032 21.115652 15.460032 c
6.201465 15.460032 l
5.699253 15.460032 5.317116 15.077919 5.317116 14.575685 c
5.317116 14.084362 5.699253 13.702225 6.201465 13.702225 c
h
1.375671 6.605455 m
2.139945 6.605455 2.751364 7.216874 2.751364 7.981148 c
2.751364 8.745399 2.139945 9.356819 1.375671 9.356819 c
0.611397 9.356819 0.000000 8.745399 0.000000 7.981148 c
0.000000 7.216874 0.611397 6.605455 1.375671 6.605455 c
h
6.201465 7.096777 m
21.115652 7.096777 l
21.606907 7.096777 22.000000 7.489826 22.000000 7.981148 c
22.000000 8.472448 21.606907 8.854586 21.115652 8.854586 c
6.201465 8.854586 l
5.699253 8.854586 5.317116 8.472448 5.317116 7.981148 c
5.317116 7.489826 5.699253 7.096777 6.201465 7.096777 c
h
1.375671 0.000012 m
2.139945 0.000012 2.751364 0.622344 2.751364 1.375692 c
2.751364 2.139960 2.139945 2.751371 1.375671 2.751371 c
0.611397 2.751371 0.000000 2.139960 0.000000 1.375692 c
0.000000 0.622344 0.611397 0.000012 1.375671 0.000012 c
h
6.201465 0.502245 m
21.115652 0.502245 l
21.606907 0.502245 22.000000 0.884379 22.000000 1.375692 c
22.000000 1.877927 21.606907 2.260058 21.115652 2.260058 c
6.201465 2.260058 l
5.699253 2.260058 5.317116 1.877927 5.317116 1.375692 c
5.317116 0.884379 5.699253 0.502245 6.201465 0.502245 c
h
f
n
Q
endstream
endobj
3 0 obj
1770
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 22.000000 15.951355 ]
/Resources 1 0 R
/Contents 2 0 R
/Parent 5 0 R
>>
endobj
5 0 obj
<< /Kids [ 4 0 R ]
/Count 1
/Type /Pages
>>
endobj
6 0 obj
<< /Type /Catalog
/Pages 5 0 R
>>
endobj
xref
0 7
0000000000 65535 f
0000000010 00000 n
0000000034 00000 n
0000001860 00000 n
0000001883 00000 n
0000002056 00000 n
0000002130 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
2189
%%EOF

View File

@ -0,0 +1,12 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "Regular-M.pdf"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

View File

@ -0,0 +1,115 @@
%PDF-1.7
1 0 obj
<< >>
endobj
2 0 obj
<< /Length 3 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm
0.000000 0.000000 0.000000 scn
3.752299 0.000000 m
24.425873 0.000000 l
26.935400 0.000000 28.178171 1.242802 28.178171 3.704506 c
28.178171 18.295473 l
28.178171 20.757179 26.935400 22.000000 24.425873 22.000000 c
3.752299 22.000000 l
1.254739 22.000000 0.000000 20.769146 0.000000 18.295473 c
0.000000 3.704506 l
0.000000 1.230852 1.254739 0.000000 3.752299 0.000000 c
h
3.776210 1.923952 m
2.581187 1.923952 1.923947 2.557302 1.923947 3.800106 c
1.923947 18.199881 l
1.923947 19.442677 2.581187 20.076029 3.776210 20.076029 c
9.105909 20.076029 l
9.105909 1.923952 l
3.776210 1.923952 l
h
24.401888 20.076029 m
25.584944 20.076029 26.254299 19.442677 26.254299 18.199881 c
26.254299 3.800106 l
26.254299 2.557302 25.584944 1.923952 24.401888 1.923952 c
10.982059 1.923952 l
10.982059 20.076029 l
24.401888 20.076029 l
h
6.799563 15.642579 m
7.169996 15.642579 7.480713 15.965240 7.480713 16.311787 c
7.480713 16.670277 7.169996 16.980968 6.799563 16.980968 c
4.242262 16.980968 l
3.883747 16.980968 3.561112 16.670277 3.561112 16.311787 c
3.561112 15.965240 3.883747 15.642579 4.242262 15.642579 c
6.799563 15.642579 l
h
6.799563 12.547520 m
7.169996 12.547520 7.480713 12.870181 7.480713 13.228671 c
7.480713 13.587185 7.169996 13.885934 6.799563 13.885934 c
4.242262 13.885934 l
3.883747 13.885934 3.561112 13.587185 3.561112 13.228671 c
3.561112 12.870181 3.883747 12.547520 4.242262 12.547520 c
6.799563 12.547520 l
h
6.799563 9.464404 m
7.169996 9.464404 7.480713 9.763178 7.480713 10.121668 c
7.480713 10.480158 7.169996 10.790874 6.799563 10.790874 c
4.242262 10.790874 l
3.883747 10.790874 3.561112 10.480158 3.561112 10.121668 c
3.561112 9.763178 3.883747 9.464404 4.242262 9.464404 c
6.799563 9.464404 l
h
f
n
Q
endstream
endobj
3 0 obj
1813
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 28.178223 22.000000 ]
/Resources 1 0 R
/Contents 2 0 R
/Parent 5 0 R
>>
endobj
5 0 obj
<< /Kids [ 4 0 R ]
/Count 1
/Type /Pages
>>
endobj
6 0 obj
<< /Type /Catalog
/Pages 5 0 R
>>
endobj
xref
0 7
0000000000 65535 f
0000000010 00000 n
0000000034 00000 n
0000001903 00000 n
0000001926 00000 n
0000002099 00000 n
0000002173 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
2232
%%EOF

View File

@ -0,0 +1,12 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "Regular-M.pdf"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

View File

@ -0,0 +1,93 @@
%PDF-1.7
1 0 obj
<< >>
endobj
2 0 obj
<< /Length 3 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm
0.000000 0.000000 0.000000 scn
12.499991 0.000000 m
19.338226 0.000000 25.000092 5.661768 25.000092 12.500000 c
25.000092 19.325987 19.325979 25.000000 12.487744 25.000000 c
5.661757 25.000000 0.000000 19.325987 0.000000 12.500000 c
0.000000 5.661768 5.674029 0.000000 12.499991 0.000000 c
h
7.610293 5.674023 m
7.328442 5.894613 7.267152 6.250013 7.438722 6.752451 c
8.933812 11.225497 l
5.110303 13.958346 l
4.669130 14.264718 4.509807 14.607834 4.620088 14.950974 c
4.718146 15.281866 5.061262 15.453436 5.600493 15.453436 c
10.294127 15.416668 l
11.727951 19.914209 l
11.887248 20.416672 12.132356 20.686275 12.499991 20.686275 c
12.867653 20.686275 13.125009 20.416672 13.272058 19.914209 c
14.705883 15.416668 l
19.399517 15.453436 l
19.938725 15.453436 20.269615 15.281866 20.379896 14.950974 c
20.502449 14.607834 20.330879 14.264718 19.889706 13.958346 c
16.066172 11.225497 l
17.561262 6.752451 l
17.732832 6.250013 17.671568 5.894613 17.389690 5.674023 c
17.095592 5.441181 16.740206 5.526962 16.299007 5.845591 c
12.499991 8.627449 l
8.700978 5.845591 l
8.259805 5.526962 7.916665 5.441181 7.610293 5.674023 c
h
f
n
Q
endstream
endobj
3 0 obj
1218
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 25.000122 25.000000 ]
/Resources 1 0 R
/Contents 2 0 R
/Parent 5 0 R
>>
endobj
5 0 obj
<< /Kids [ 4 0 R ]
/Count 1
/Type /Pages
>>
endobj
6 0 obj
<< /Type /Catalog
/Pages 5 0 R
>>
endobj
xref
0 7
0000000000 65535 f
0000000010 00000 n
0000000034 00000 n
0000001308 00000 n
0000001331 00000 n
0000001504 00000 n
0000001578 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
1637
%%EOF

View File

@ -0,0 +1,12 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "Regular-M.pdf"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

View File

@ -0,0 +1,99 @@
%PDF-1.7
1 0 obj
<< >>
endobj
2 0 obj
<< /Length 3 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm
0.000000 0.000000 0.000000 scn
12.499991 0.000000 m
19.338226 0.000000 25.000092 5.661768 25.000092 12.500000 c
25.000092 19.325987 19.325979 25.000000 12.487744 25.000000 c
5.661757 25.000000 0.000000 19.325987 0.000000 12.500000 c
0.000000 5.661768 5.674029 0.000000 12.499991 0.000000 c
h
12.499991 2.083338 m
6.715673 2.083338 2.095578 6.715681 2.095578 12.500000 c
2.095578 18.272070 6.703426 22.916662 12.487744 22.916662 c
18.272062 22.916662 22.904408 18.272070 22.916706 12.500000 c
22.929005 6.715681 18.284309 2.083338 12.499991 2.083338 c
h
7.610293 5.772064 m
7.916665 5.539221 8.259805 5.625004 8.700978 5.943632 c
12.499991 8.725481 l
16.299007 5.943632 l
16.740206 5.625004 17.095592 5.539221 17.389690 5.772064 c
17.671568 5.992651 17.732832 6.348047 17.561262 6.850485 c
16.066172 11.323529 l
19.889706 14.056379 l
20.330879 14.362751 20.502449 14.693618 20.379896 15.049031 c
20.269615 15.379898 19.938725 15.551470 19.399517 15.551470 c
14.705883 15.514700 l
13.272058 20.012243 l
13.125009 20.514706 12.867653 20.784309 12.499991 20.784309 c
12.132356 20.784309 11.887248 20.514706 11.727951 20.012243 c
10.294127 15.514700 l
5.600493 15.551470 l
5.061262 15.551470 4.718146 15.379898 4.620088 15.049031 c
4.509807 14.693618 4.669130 14.362751 5.110303 14.056379 c
8.933812 11.323529 l
7.438722 6.850485 l
7.267152 6.348047 7.328442 5.992651 7.610293 5.772064 c
h
f
n
Q
endstream
endobj
3 0 obj
1479
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 25.000000 25.000000 ]
/Resources 1 0 R
/Contents 2 0 R
/Parent 5 0 R
>>
endobj
5 0 obj
<< /Kids [ 4 0 R ]
/Count 1
/Type /Pages
>>
endobj
6 0 obj
<< /Type /Catalog
/Pages 5 0 R
>>
endobj
xref
0 7
0000000000 65535 f
0000000010 00000 n
0000000034 00000 n
0000001569 00000 n
0000001592 00000 n
0000001765 00000 n
0000001839 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
1898
%%EOF

View File

@ -0,0 +1,12 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "star.circle.plus.pdf"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

View File

@ -0,0 +1,129 @@
%PDF-1.7
1 0 obj
<< >>
endobj
2 0 obj
<< /Length 3 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm
0.000000 0.000000 0.000000 scn
18.700602 25.000000 m
12.500011 25.000000 7.287553 20.244572 6.534099 14.241598 c
7.262839 14.216908 7.954544 14.093386 8.609191 13.895770 c
9.177375 18.984682 13.438738 22.900219 18.700602 22.900219 c
24.332983 22.900219 28.853710 18.367094 28.866106 12.734688 c
28.878502 7.089937 24.345377 2.556822 18.712946 2.556822 c
16.934301 2.556822 15.279158 3.013838 13.846341 3.816704 c
13.624011 3.137356 13.315216 2.519768 12.932329 1.951584 c
14.661570 1.000500 16.637854 0.469376 18.712946 0.469376 c
25.407576 0.469376 30.965963 6.027672 30.965963 12.734688 c
30.965963 19.429367 25.395180 25.000000 18.700602 25.000000 c
h
6.274708 0.000000 m
9.683809 0.000000 12.549417 2.840912 12.549417 6.274708 c
12.549417 9.708498 9.720843 12.549417 6.274708 12.549417 c
2.840918 12.549417 0.000000 9.708498 0.000000 6.274708 c
0.000000 2.816208 2.840918 0.000000 6.274708 0.000000 c
h
6.287053 2.198622 m
5.854737 2.198622 5.471850 2.495062 5.471850 2.964430 c
5.471850 5.521250 l
3.112653 5.521250 l
2.692681 5.521250 2.346828 5.867098 2.346828 6.274708 c
2.346828 6.694679 2.692681 7.040508 3.112653 7.040508 c
5.471850 7.040508 l
5.471850 9.597347 l
5.471850 10.054353 5.854737 10.350801 6.287053 10.350801 c
6.707025 10.350801 7.089912 10.054353 7.089912 9.597347 c
7.089912 7.040508 l
9.449109 7.040508 l
9.869081 7.040508 10.202564 6.694679 10.202564 6.274708 c
10.202564 5.867098 9.869081 5.521250 9.449109 5.521250 c
7.089912 5.521250 l
7.089912 2.964430 l
7.089912 2.495062 6.707025 2.198622 6.287053 2.198622 c
h
f
n
Q
q
1.000000 0.000000 -0.000000 1.000000 10.962402 5.875031 cm
0.000000 0.000000 0.000000 scn
2.967083 0.228466 m
3.267695 -0.000001 3.604384 0.084171 4.037263 0.396809 c
7.764855 3.126358 l
11.492450 0.396809 l
11.925354 0.084171 12.274060 -0.000001 12.562630 0.228466 c
12.839207 0.444905 12.899319 0.793620 12.730974 1.286612 c
11.263991 5.675564 l
15.015644 8.357037 l
15.448524 8.657648 15.616868 8.982294 15.496618 9.331026 c
15.388411 9.655672 15.063739 9.824018 14.534670 9.824018 c
9.929276 9.787941 l
8.522408 14.200930 l
8.378122 14.693946 8.125604 14.958481 7.764855 14.958481 c
7.404130 14.958481 7.163632 14.693946 7.007329 14.200930 c
5.600461 9.787941 l
0.995068 9.824018 l
0.465975 9.824018 0.129309 9.655672 0.033094 9.331026 c
-0.075113 8.982294 0.081214 8.657648 0.514093 8.357037 c
4.265721 5.675564 l
2.798738 1.286612 l
2.630394 0.793620 2.690531 0.444905 2.967083 0.228466 c
h
f
n
Q
endstream
endobj
3 0 obj
2544
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 30.965820 25.000000 ]
/Resources 1 0 R
/Contents 2 0 R
/Parent 5 0 R
>>
endobj
5 0 obj
<< /Kids [ 4 0 R ]
/Count 1
/Type /Pages
>>
endobj
6 0 obj
<< /Type /Catalog
/Pages 5 0 R
>>
endobj
xref
0 7
0000000000 65535 f
0000000010 00000 n
0000000034 00000 n
0000002634 00000 n
0000002657 00000 n
0000002830 00000 n
0000002904 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
2963
%%EOF

View File

@ -0,0 +1,12 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "Regular-M.png"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 365 B

View File

@ -9,17 +9,16 @@
import UIKit
import RealmSwift
@available(iOS 13.0, *)
class ContentViewController: UIViewController, UISearchControllerDelegate, WebViewControllerDelegate,
OutlineControllerDelegate, BookmarkControllerDelegate {
private let sideBarButton = Button(imageSystemName: "sidebar.left")
private let chevronLeftButton = Button(imageSystemName: "chevron.left")
private let chevronRightButton = Button(imageSystemName: "chevron.right")
private let outlineButton = Button(imageSystemName: "list.bullet")
private let bookmarkButton = BookmarkButton()
private let bookmarkToggleButton = BookmarkToggleButton()
private let libraryButton = Button(imageSystemName: "folder")
private let settingButton = Button(imageSystemName: "gear")
private let sideBarButton = Button(imageName: "sidebar.left")
private let chevronLeftButton = Button(imageName: "chevron.left")
private let chevronRightButton = Button(imageName: "chevron.right")
private let outlineButton = Button(imageName: "list.bullet")
private let bookmarkButton = BookmarkButton(imageName: "star", bookmarkedImageName: "star.fill")
private let bookmarkToggleButton = BookmarkButton(imageName: "star.circle.fill", bookmarkedImageName: "star.circle")
private let libraryButton = Button(imageName: "folder")
private let settingButton = Button(imageName: "gear")
private let bookmarkLongPressGestureRecognizer = UILongPressGestureRecognizer()
let searchController: UISearchController
@ -28,6 +27,8 @@ class ContentViewController: UIViewController, UISearchControllerDelegate, WebVi
barButtonSystemItem: .cancel, target: self, action: #selector(cancelSearch))
private var webViewControllers: [WebKitWebController] = []
var currentWebViewController: WebKitWebController? { return webViewControllers.first }
private(set) lazy var welcomeController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "WelcomeController") as! WelcomeController
private(set) lazy var libraryController = LibraryController()
init() {
self.searchResultsController = SearchResultsController()
@ -46,6 +47,25 @@ class ContentViewController: UIViewController, UISearchControllerDelegate, WebVi
bookmarkButton.addGestureRecognizer(bookmarkLongPressGestureRecognizer)
bookmarkLongPressGestureRecognizer.addTarget(self, action: #selector(toggleBookmark))
if #available(iOS 13.0, *) {
view.backgroundColor = .systemBackground
} else {
view.backgroundColor = .white
}
searchController.delegate = self
searchController.searchBar.autocorrectionType = .no
searchController.searchBar.autocapitalizationType = .none
searchController.hidesNavigationBarDuringPresentation = false
searchController.searchResultsUpdater = searchResultsController
if #available(iOS 13.0, *) {
searchController.automaticallyShowsCancelButton = false
searchController.showsSearchResultsController = true
} else {
searchController.searchBar.searchBarStyle = .minimal
searchController.obscuresBackgroundDuringPresentation = true
}
}
required init?(coder: NSCoder) {
@ -58,16 +78,9 @@ class ContentViewController: UIViewController, UISearchControllerDelegate, WebVi
navigationItem.hidesBackButton = true
navigationItem.titleView = searchController.searchBar
definesPresentationContext = true
view.backgroundColor = .systemBackground
searchController.delegate = self
searchController.searchBar.autocapitalizationType = .none
searchController.automaticallyShowsCancelButton = false
searchController.hidesNavigationBarDuringPresentation = false
searchController.showsSearchResultsController = true
searchController.searchResultsUpdater = searchResultsController
configureToolbar()
createNewTab()
setChildControllerIfNeeded(welcomeController)
}
func load(url: URL) {
@ -77,13 +90,8 @@ class ContentViewController: UIViewController, UISearchControllerDelegate, WebVi
// MARK: - View and Controller Management
func configureToolbar() {
if splitViewController?.isCollapsed == true {
let group = ButtonGroupView(buttons: [
chevronLeftButton, chevronRightButton, outlineButton, bookmarkButton, libraryButton, settingButton,
])
toolbarItems = [UIBarButtonItem(customView: group)]
} else {
func configureToolbar(isGrouped: Bool) {
if isGrouped {
let left = ButtonGroupView(buttons: [sideBarButton, chevronLeftButton, chevronRightButton], spacing: 10)
let right = ButtonGroupView(buttons: [bookmarkToggleButton, libraryButton, settingButton], spacing: 10)
toolbarItems = [
@ -91,6 +99,11 @@ class ContentViewController: UIViewController, UISearchControllerDelegate, WebVi
UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil),
UIBarButtonItem(customView: right),
]
} else {
let group = ButtonGroupView(buttons: [
chevronLeftButton, chevronRightButton, outlineButton, bookmarkButton, libraryButton, settingButton,
])
toolbarItems = [UIBarButtonItem(customView: group)]
}
}
@ -207,10 +220,10 @@ class ContentViewController: UIViewController, UISearchControllerDelegate, WebVi
}
// if outline view is visible, update outline items
if let rootSplitController = splitViewController as? RootSplitController,
!rootSplitController.isCollapsed,
rootSplitController.displayMode != .primaryHidden {
let selectedNavController = rootSplitController.sideBarViewController.selectedViewController
if let rootController = splitViewController as? RootController,
!rootController.isCollapsed,
rootController.displayMode != .primaryHidden {
let selectedNavController = rootController.sideBarViewController.selectedViewController
let selectedController = (selectedNavController as? UINavigationController)?.topViewController
if let outlineController = selectedController as? OutlineController {
outlineController.updateContent()
@ -292,6 +305,7 @@ class ContentViewController: UIViewController, UISearchControllerDelegate, WebVi
try database.write {
database.delete(bookmark)
}
BookmarkManager().updateBookmarkWidgetData()
} else {
guard let zimFile = database.object(ofType: ZimFile.self, forPrimaryKey: zimFileID) else {return}
let bookmark = Bookmark()
@ -321,14 +335,15 @@ class ContentViewController: UIViewController, UISearchControllerDelegate, WebVi
database.add(bookmark)
}
} catch {}
BookmarkManager().updateBookmarkWidgetData()
})
}
} catch {return}
}
@objc func openLibrary() {
guard let splitController = splitViewController as? RootSplitController else {return}
splitController.present(splitController.libraryController, animated: true)
guard let splitController = splitViewController as? RootController else {return}
splitController.present(libraryController, animated: true)
}
@objc func openSettings() {
@ -340,7 +355,11 @@ class ContentViewController: UIViewController, UISearchControllerDelegate, WebVi
}
}
// MARK: - BarButton
// MARK: - Buttons
private extension UIControl.State {
static let bookmarked = UIControl.State(rawValue: 1 << 16)
}
private class ButtonGroupView: UIStackView {
convenience init(buttons: [UIButton], spacing: CGFloat? = nil) {
@ -352,12 +371,15 @@ private class ButtonGroupView: UIStackView {
}
}
@available(iOS 13.0, *)
private class Button: UIButton {
fileprivate let configuration = UIImage.SymbolConfiguration(scale: .large)
convenience init(imageSystemName: String) {
convenience init(imageName: String) {
self.init(type: .system)
setImage(UIImage(systemName: imageSystemName, withConfiguration: configuration), for: .normal)
if #available(iOS 13.0, *) {
let configuration = UIImage.SymbolConfiguration(scale: .large)
setImage(UIImage(systemName: imageName, withConfiguration: configuration), for: .normal)
} else {
setImage(UIImage(named: imageName), for: .normal)
}
}
override var intrinsicContentSize: CGSize {
@ -365,32 +387,24 @@ private class Button: UIButton {
}
}
@available(iOS 13.0, *)
private class BookmarkButton: Button {
var isBookmarked: Bool = false { didSet { setNeedsLayout() } }
override var state: UIControl.State{ get { isBookmarked ? [.bookmarked, super.state] : super.state } }
convenience init() {
self.init(imageSystemName: "star")
let filledImage = UIImage(systemName: "star.fill", withConfiguration: configuration)
setImage(filledImage, for: .bookmarked)
setImage(filledImage, for: [.bookmarked, .highlighted])
convenience init(imageName: String, bookmarkedImageName: String) {
if #available(iOS 13.0, *) {
self.init(imageName: imageName)
let configuration = UIImage.SymbolConfiguration(scale: .large)
let bookmarkedImage = UIImage(systemName: bookmarkedImageName, withConfiguration: configuration)?
.withTintColor(.systemYellow, renderingMode: .alwaysOriginal)
setImage(bookmarkedImage, for: .bookmarked)
setImage(bookmarkedImage, for: [.bookmarked, .highlighted])
} else {
self.init(type: .system)
setImage(UIImage(named: imageName), for: .normal)
let bookmarkedImage = UIImage(named: bookmarkedImageName)
setImage(bookmarkedImage, for: .bookmarked)
setImage(bookmarkedImage, for: [.bookmarked, .highlighted])
}
}
}
@available(iOS 13.0, *)
private class BookmarkToggleButton: Button {
var isBookmarked: Bool = false { didSet { setNeedsLayout() } }
override var state: UIControl.State{ get { isBookmarked ? [.bookmarked, super.state] : super.state } }
convenience init() {
self.init(imageSystemName: "star")
let filledImage = UIImage(systemName: "star.slash.fill", withConfiguration: configuration)
setImage(filledImage, for: .bookmarked)
setImage(filledImage, for: [.bookmarked, .highlighted])
}
}
private extension UIControl.State {
static let bookmarked = UIControl.State(rawValue: 1 << 16)
}

View File

@ -265,9 +265,9 @@ class LibraryZimFileDetailController: UIViewController, UITableViewDataSource, U
case .deleteFile, .deleteBookmarks, .deleteFileAndBookmarks, .unlink:
present(ActionConfirmationController(zimFile: zimFile, action: action), animated: true)
case .openMainPage:
guard let main = (presentingViewController as? UINavigationController)?.topViewController as? MainController,
guard let rootController = presentingViewController as? RootController,
let url = ZimMultiReader.shared.getMainPageURL(zimFileID: zimFile.id) else {break}
main.load(url: url)
rootController.contentViewController.load(url: url)
dismiss(animated: true, completion: nil)
}
}

View File

@ -7,25 +7,24 @@
//
import UIKit
import WebKit
@available(iOS 13.0, *)
class RootSplitController: UISplitViewController, UISplitViewControllerDelegate {
class RootController: UISplitViewController, UISplitViewControllerDelegate {
let sideBarViewController = SideBarController()
let contentViewController = ContentViewController()
private(set) lazy var libraryController = LibraryController()
let contentNavigationController: UINavigationController
init() {
super.init(nibName: nil, bundle: nil)
preferredDisplayMode = .allVisible
self.contentNavigationController = UINavigationController(rootViewController: contentViewController)
self.contentNavigationController.isToolbarHidden = false
let contentNavController = UINavigationController(rootViewController: contentViewController)
contentNavController.isToolbarHidden = false
viewControllers = [sideBarViewController, contentNavController]
super.init(nibName: nil, bundle: nil)
viewControllers = [sideBarViewController, self.contentNavigationController]
delegate = self
preferredDisplayMode = .allVisible
sideBarViewController.favoriteController.delegate = contentViewController
sideBarViewController.outlineController.delegate = contentViewController
contentViewController.configureToolbar(isGrouped: !isCollapsed)
}
required init?(coder aDecoder: NSCoder) {
@ -33,13 +32,13 @@ class RootSplitController: UISplitViewController, UISplitViewControllerDelegate
}
override func overrideTraitCollection(forChild childViewController: UIViewController) -> UITraitCollection? {
let traitCollection = super.overrideTraitCollection(forChild: childViewController)
if viewControllers.count > 1,
childViewController == viewControllers.last,
preferredDisplayMode == .allVisible {
return UITraitCollection(horizontalSizeClass: .compact)
} else {
return super.overrideTraitCollection(forChild: childViewController)
}
return traitCollection
}
// MARK: UISplitViewControllerDelegate
@ -49,17 +48,13 @@ class RootSplitController: UISplitViewController, UISplitViewControllerDelegate
}
func primaryViewController(forCollapsing splitViewController: UISplitViewController) -> UIViewController? {
contentViewController.configureToolbar()
let navigationController = UINavigationController(rootViewController: contentViewController)
navigationController.isToolbarHidden = false
return navigationController
contentViewController.configureToolbar(isGrouped: false)
return contentNavigationController
}
func splitViewController(_ splitViewController: UISplitViewController,
separateSecondaryFrom primaryViewController: UIViewController) -> UIViewController? {
contentViewController.configureToolbar()
let navigationController = UINavigationController(rootViewController: contentViewController)
navigationController.isToolbarHidden = false
return navigationController
contentViewController.configureToolbar(isGrouped: true)
return contentNavigationController
}
}

View File

@ -244,10 +244,8 @@ class SearchNoTextController: UIViewController, UITableViewDelegate, UITableView
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
collectionView.deselectItem(at: indexPath, animated: true)
let searchText = recentSearchTexts[indexPath.row]
if #available(iOS 13.0, *), let controller = presentingViewController as? ContentViewController {
if let controller = presentingViewController as? ContentViewController {
controller.searchController.searchBar.text = searchText
} else if let main = presentingViewController as? MainController {
main.searchController.searchBar.text = searchText
}
}

View File

@ -104,18 +104,11 @@ class SearchResultsListController: UITableViewController {
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if #available(iOS 13, *) {
guard let content = presentingViewController as? ContentViewController else {return}
update(recentSearchText: searchText)
content.load(url: results[indexPath.row].url)
content.searchController.dismiss(animated: true)
content.searchController.isActive = false
} else {
guard let main = presentingViewController as? MainController else {return}
update(recentSearchText: searchText)
main.load(url: results[indexPath.row].url)
main.searchController.isActive = false
}
}
override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {

View File

@ -73,9 +73,8 @@ class SettingFontSizeViewController: UIViewController, UITableViewDelegate, UITa
tableView.reloadRows(at: indexPaths, with: .automatic)
label.font = UIFont.systemFont(ofSize: CGFloat(14.0 * percentages[indexPath.row]))
if let navigation = navigationController?.presentingViewController as? UINavigationController,
let main = navigation.topViewController as? MainController {
main.currentWebController?.adjustFontSize(scale: selected)
if let rootController = presentingViewController as? RootController {
rootController.contentViewController.currentWebViewController?.adjustFontSize(scale: selected)
}
}
}

View File

@ -32,8 +32,10 @@ class BookmarkController: UIViewController, UITableViewDataSource, UITableViewDe
title = NSLocalizedString("Bookmark", comment: "Bookmark view title")
if #available(iOS 13.0, *) {
tabBarItem = UITabBarItem(title: "Bookmark",
image: UIImage(systemName: "star.circle"),
selectedImage: UIImage(systemName: "star.circle.fill"))
image: UIImage(systemName: "star"),
selectedImage: UIImage(systemName: "star.fill"))
} else {
tabBarItem = UITabBarItem(tabBarSystemItem: .favorites, tag: 0)
}
}

View File

@ -32,6 +32,10 @@ class OutlineController: UITableViewController {
tabBarItem = UITabBarItem(title: "Outline",
image: UIImage(systemName: "list.bullet"),
selectedImage: UIImage(systemName: "list.bullet"))
} else {
tabBarItem = UITabBarItem(title: "Outline",
image: UIImage(named: "list.bullet"),
selectedImage: UIImage(named: "list.bullet"))
}
}
@ -61,8 +65,8 @@ class OutlineController: UITableViewController {
// update items
if #available(iOS 13.0, *) {
if let rootSplitController = (splitViewController ?? presentingViewController) as? RootSplitController,
let currentWebViewController = rootSplitController.contentViewController.currentWebViewController {
if let rootController = (splitViewController ?? presentingViewController) as? RootController,
let currentWebViewController = rootController.contentViewController.currentWebViewController {
currentWebViewController.extractTableOfContents(completion: { (url, items) in
self.items = items
})

View File

@ -8,7 +8,6 @@
import UIKit
@available(iOS 13.0, *)
class SideBarController: UITabBarController {
let favoriteController = BookmarkController()
let outlineController = OutlineController()
@ -17,7 +16,6 @@ class SideBarController: UITabBarController {
super.init(nibName: nil, bundle: nil)
viewControllers = [
UINavigationController(rootViewController: favoriteController),
// UINavigationController(rootViewController: MapController()),
UINavigationController(rootViewController: outlineController),
]
}

View File

@ -14,14 +14,12 @@ class WelcomeController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
logoImageView.image = #imageLiteral(resourceName: "Kiwix").withRenderingMode(.alwaysTemplate)
logoImageView.tintColor = .darkGray
button.setTitle(NSLocalizedString("Open Library", comment: "Welcome"), for: .normal)
}
@IBAction func leftButtonTapped(_ sender: Any) {
guard let mainController = parent as? MainController else {return}
mainController.present(mainController.libraryController, animated: true, completion: nil)
guard let presenter = parent as? ContentViewController else {return}
presenter.openLibrary()
}
@IBAction func rightButtonTapped(_ sender: Any) {

View File

@ -1,13 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14109" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="84U-cN-X4E">
<device id="ipad9_7" orientation="landscape">
<adaptation id="splitview1_3"/>
</device>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="15702" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="84U-cN-X4E">
<device id="retina6_1" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/>
<capability name="Aspect ratio constraints" minToolsVersion="5.1"/>
<capability name="Constraints with non-1.0 multipliers" minToolsVersion="5.1"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15704"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="Stack View standard spacing" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
@ -18,24 +14,24 @@
<objects>
<viewController id="sgR-df-kDZ" customClass="MainController" customModule="Kiwix" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="Lnk-x9-o6o">
<rect key="frame" x="0.0" y="0.0" width="320" height="768"/>
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="W03-ad-Ivv">
<rect key="frame" x="-300" y="64" width="300" height="704"/>
<rect key="frame" x="-300" y="88" width="300" height="774"/>
<constraints>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="300" id="7xS-W5-bXd"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ShV-5f-7OD">
<rect key="frame" x="-1" y="64" width="1" height="704"/>
<rect key="frame" x="-1" y="88" width="1" height="774"/>
<color key="backgroundColor" name="systemGrayColor" catalog="System" colorSpace="catalog"/>
<constraints>
<constraint firstAttribute="width" constant="1" id="RnR-f1-Q7L"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="nGW-m1-b0h">
<rect key="frame" x="0.0" y="0.0" width="320" height="768"/>
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
</view>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
@ -74,17 +70,17 @@
<objects>
<viewController storyboardIdentifier="SettingFontSizeViewController" id="ixK-lM-nyu" customClass="SettingFontSizeViewController" customModule="Kiwix" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="fXk-M7-fW2">
<rect key="frame" x="0.0" y="0.0" width="320" height="768"/>
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="dvp-sd-HfU">
<rect key="frame" x="0.0" y="20" width="320" height="748"/>
<rect key="frame" x="0.0" y="44" width="414" height="818"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="yer-2Q-hiy">
<rect key="frame" x="0.0" y="0.0" width="320" height="50"/>
<rect key="frame" x="0.0" y="0.0" width="414" height="36.5"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" layoutMarginsFollowReadableWidth="YES" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Hjn-0d-dSY">
<rect key="frame" x="20" y="8" width="280" height="34"/>
<rect key="frame" x="20" y="8" width="374" height="20.5"/>
<string key="text">Kiwix for iOS is an offline reader for wikipedia. Our mission is to give people equal and easy access to free knowledge of the world.</string>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
@ -100,25 +96,25 @@
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="oPm-la-aFL">
<rect key="frame" x="0.0" y="50" width="320" height="1"/>
<rect key="frame" x="0.0" y="36.5" width="414" height="1"/>
<color key="backgroundColor" white="0.66666666666666663" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="height" constant="1" id="JTP-l0-oMQ"/>
</constraints>
</view>
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="fme-ig-r8Q">
<rect key="frame" x="0.0" y="51" width="320" height="697"/>
<rect key="frame" x="0.0" y="37.5" width="414" height="780.5"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<prototypes>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" reuseIdentifier="Cell" textLabel="sky-Py-4ld" style="IBUITableViewCellStyleDefault" id="bcr-PB-cyc">
<rect key="frame" x="0.0" y="28" width="320" height="44"/>
<rect key="frame" x="0.0" y="28" width="414" height="43.5"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="bcr-PB-cyc" id="BGf-yG-PRY">
<rect key="frame" x="0.0" y="0.0" width="320" height="43.5"/>
<rect key="frame" x="0.0" y="0.0" width="414" height="43.5"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Title" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="sky-Py-4ld">
<rect key="frame" x="15" y="0.0" width="290" height="43.5"/>
<rect key="frame" x="20" y="0.0" width="374" height="43.5"/>
<autoresizingMask key="autoresizingMask"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
@ -162,7 +158,7 @@
<navigationController automaticallyAdjustsScrollViewInsets="NO" id="84U-cN-X4E" sceneMemberID="viewController">
<toolbarItems/>
<navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="RM6-7R-BiT">
<rect key="frame" x="0.0" y="20" width="320" height="44"/>
<rect key="frame" x="0.0" y="44" width="414" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<nil name="viewControllers"/>
@ -182,17 +178,18 @@
<objects>
<viewController storyboardIdentifier="WelcomeController" id="1qf-Qn-OTE" customClass="WelcomeController" customModule="Kiwix" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="hKl-AZ-y4g">
<rect key="frame" x="0.0" y="0.0" width="320" height="768"/>
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="center" spacing="20" translatesAutoresizingMaskIntoConstraints="NO" id="gqV-bc-IWP">
<rect key="frame" x="16" y="294.5" width="288" height="179"/>
<rect key="frame" x="63" y="358.5" width="288" height="179"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="8pR-57-foL">
<rect key="frame" x="88" y="0.0" width="112.5" height="108"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="Kiwix" translatesAutoresizingMaskIntoConstraints="NO" id="tqt-hB-1ni">
<rect key="frame" x="26" y="0.0" width="60" height="60"/>
<color key="tintColor" systemColor="labelColor" cocoaTouchSystemColor="darkTextColor"/>
<constraints>
<constraint firstAttribute="width" constant="60" id="DsZ-wM-gGQ"/>
<constraint firstAttribute="height" constant="60" id="UCh-XH-DCh"/>
@ -201,7 +198,6 @@
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="KIWIX" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="QJS-qn-q6W">
<rect key="frame" x="0.0" y="60" width="112.5" height="48"/>
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="40"/>
<color key="textColor" white="0.33333333333333331" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
<variation key="widthClass=regular">
<fontDescription key="fontDescription" type="boldSystem" pointSize="50"/>
@ -211,7 +207,7 @@
</stackView>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="FzP-vy-Q8J">
<rect key="frame" x="0.0" y="128" width="288" height="1"/>
<color key="backgroundColor" white="0.66666666666666663" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<color key="backgroundColor" systemColor="secondarySystemFillColor" red="0.47058823529999999" green="0.47058823529999999" blue="0.50196078430000002" alpha="0.16" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstAttribute="height" constant="1" id="cQZ-xj-Vgm"/>
</constraints>
@ -254,7 +250,7 @@
</variation>
</stackView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
<constraints>
<constraint firstItem="fkg-ea-ep8" firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="gqV-bc-IWP" secondAttribute="trailing" constant="16" id="0rs-zI-ACJ"/>
<constraint firstItem="fkg-ea-ep8" firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="gqV-bc-IWP" secondAttribute="trailing" constant="16" id="7kO-54-VNT"/>
@ -304,14 +300,14 @@
<objects>
<viewController storyboardIdentifier="LibraryOnboardingController" id="pDz-Ac-jhD" customClass="LibraryOnboardingController" customModule="Kiwix" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="Dwj-PX-Ijj">
<rect key="frame" x="0.0" y="0.0" width="320" height="768"/>
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="center" spacing="40" translatesAutoresizingMaskIntoConstraints="NO" id="8oA-El-aTo">
<rect key="frame" x="16" y="254" width="288" height="324"/>
<rect key="frame" x="16" y="313" width="382" height="324"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="ztY-Ie-nWP">
<rect key="frame" x="94" y="0.0" width="100" height="100"/>
<rect key="frame" x="141" y="0.0" width="100" height="100"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="Book" translatesAutoresizingMaskIntoConstraints="NO" id="LNA-fY-BDE">
<rect key="frame" x="0.0" y="0.0" width="100" height="100"/>
@ -324,16 +320,16 @@
<variation key="heightClass=compact" hidden="YES"/>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="center" spacingType="standard" translatesAutoresizingMaskIntoConstraints="NO" id="v2d-zr-nei">
<rect key="frame" x="0.0" y="140" width="288" height="54"/>
<rect key="frame" x="0.0" y="140" width="382" height="54"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="20" translatesAutoresizingMaskIntoConstraints="NO" id="Z7u-05-WXc">
<rect key="frame" x="114" y="0.0" width="60" height="29"/>
<rect key="frame" x="161" y="0.0" width="60" height="29"/>
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="24"/>
<color key="textColor" white="0.33333333329999998" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kLk-ns-EG2">
<rect key="frame" x="0.0" y="37" width="288" height="17"/>
<rect key="frame" x="0.0" y="37" width="382" height="17"/>
<string key="text">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla tincidunt commodo enim, sed condimentum odio tristique vel. Pellentesque a mauris eu eros interdum pharetra. </string>
<fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
<color key="textColor" white="0.66666666666666663" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
@ -342,7 +338,7 @@
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="URz-zo-RNo">
<rect key="frame" x="134" y="234" width="20" height="20"/>
<rect key="frame" x="181" y="234" width="20" height="20"/>
<subviews>
<activityIndicatorView hidden="YES" opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" hidesWhenStopped="YES" style="gray" translatesAutoresizingMaskIntoConstraints="NO" id="gaI-kr-Za5">
<rect key="frame" x="0.0" y="0.0" width="20" height="20"/>
@ -353,7 +349,7 @@
</constraints>
</stackView>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="FcF-Yh-Bcn" customClass="RoundedButton" customModule="Kiwix" customModuleProvider="target">
<rect key="frame" x="121" y="294" width="46" height="30"/>
<rect key="frame" x="168" y="294" width="46" height="30"/>
<constraints>
<constraint firstAttribute="width" relation="lessThanOrEqual" constant="300" id="D21-SR-4MG"/>
</constraints>
@ -395,7 +391,7 @@
<navigationController storyboardIdentifier="LibraryOnboardingNavController" automaticallyAdjustsScrollViewInsets="NO" id="ktd-TF-FVo" sceneMemberID="viewController">
<toolbarItems/>
<navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="V7G-Dj-goh">
<rect key="frame" x="0.0" y="20" width="320" height="44"/>
<rect key="frame" x="0.0" y="44" width="414" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<nil name="viewControllers"/>

View File

@ -16,7 +16,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
options connectionOptions: UIScene.ConnectionOptions) {
if let windowScene = scene as? UIWindowScene {
window = UIWindow(windowScene: windowScene)
window?.rootViewController = RootSplitController()
window?.rootViewController = RootController()
window?.makeKeyAndVisible()
}
}