From aa997cfd7b0110761e945f3caecfa1dab3782069 Mon Sep 17 00:00:00 2001 From: nam Date: Mon, 1 Jul 2019 17:13:17 +0900 Subject: [PATCH] Added function that include file extension & URL --- FileBrowser/FileBrowser.swift | 16 ++++- FileBrowser/FileParser.swift | 91 ++++++++++++++++++++++--- FileBrowserTests/FileBrowserTests.swift | 13 +++- 3 files changed, 107 insertions(+), 13 deletions(-) diff --git a/FileBrowser/FileBrowser.swift b/FileBrowser/FileBrowser.swift index aad61e3..5ca7430 100644 --- a/FileBrowser/FileBrowser.swift +++ b/FileBrowser/FileBrowser.swift @@ -21,13 +21,27 @@ open class FileBrowser: UINavigationController { parser.excludesFileExtensions = excludesFileExtensions } } - + + /// File types to include from the file browser. + open var includesFileExtensions: [String]? { + didSet { + parser.includesFileExtensions = includesFileExtensions + } + } + /// File paths to exclude from the file browser. open var excludesFilepaths: [URL]? { didSet { parser.excludesFilepaths = excludesFilepaths } } + + /// File paths to include from the file browser. + open var includesFilepaths: [URL]? { + didSet { + parser.includesFilepaths = includesFilepaths + } + } /// Override default preview and actionsheet behaviour in favour of custom file handling. open var didSelectFile: ((FBFile) -> ())? { diff --git a/FileBrowser/FileParser.swift b/FileBrowser/FileParser.swift index c0e364f..0b91350 100644 --- a/FileBrowser/FileParser.swift +++ b/FileBrowser/FileParser.swift @@ -9,10 +9,17 @@ import Foundation class FileParser { + + enum DefaultExtensionVisibilityType { + case Allow + case Deny + } static let sharedInstance = FileParser() - + + var _defaultExtensionVisibilityType = DefaultExtensionVisibilityType.Allow var _excludesFileExtensions = [String]() + var _includesFileExtensions = [String]() /// Mapped for case insensitivity var excludesFileExtensions: [String]? { @@ -21,12 +28,50 @@ class FileParser { } set { if let newValue = newValue { + _defaultExtensionVisibilityType = .Allow _excludesFileExtensions = newValue } } } + + var includesFileExtensions: [String]? { + get { + return _includesFileExtensions.map({$0.lowercased()}) + } + set { + if let newValue = newValue { + _defaultExtensionVisibilityType = .Deny + _includesFileExtensions = newValue + } + } + } - var excludesFilepaths: [URL]? + var _excludesFilepaths: [URL]? + var _includesFilepaths: [URL]? + + var excludesFilepaths : [URL]? { + get { + return _excludesFilepaths + } + set { + if let newValue = newValue { + _defaultExtensionVisibilityType = .Allow + _excludesFilepaths = newValue + } + } + } + + var includesFilepaths : [URL]? { + get { + return _includesFilepaths + } + set { + if let newValue = newValue { + _defaultExtensionVisibilityType = .Deny + _includesFilepaths = newValue + } + } + } let fileManager = FileManager.default @@ -43,18 +88,42 @@ class FileParser { } catch { return files } + // Parse - for filePath in filePaths { - let file = FBFile(filePath: filePath) - if let excludesFileExtensions = excludesFileExtensions, let fileExtensions = file.fileExtension , excludesFileExtensions.contains(fileExtensions) { - continue - } - if let excludesFilepaths = excludesFilepaths , excludesFilepaths.contains(file.filePath) { - continue + switch _defaultExtensionVisibilityType { + /// if user set excludesFileExtensions, default is allowed all files + case .Allow : + for filePath in filePaths { + let file = FBFile(filePath: filePath) + if let excludesFileExtensions = excludesFileExtensions, let fileExtensions = file.fileExtension , excludesFileExtensions.contains(fileExtensions) { + continue + } + if let excludesFilepaths = excludesFilepaths , excludesFilepaths.contains(file.filePath) { + continue + } + if file.displayName.isEmpty == false { + files.append(file) + } } - if file.displayName.isEmpty == false { - files.append(file) + break + + case .Deny : + for filePath in filePaths { + let file = FBFile(filePath: filePath) + if let includesFileExtensions = includesFileExtensions, let fileExtensions = file.fileExtension , includesFileExtensions.contains(fileExtensions) { + if file.displayName.isEmpty == false { + files.append(file) + } + continue + } + if let includesFilepaths = includesFilepaths , includesFilepaths.contains(file.filePath) { + if file.displayName.isEmpty == false { + files.append(file) + } + continue + } } + break } // Sort files = files.sorted(){$0.displayName < $1.displayName} diff --git a/FileBrowserTests/FileBrowserTests.swift b/FileBrowserTests/FileBrowserTests.swift index 286b019..4b55a3b 100644 --- a/FileBrowserTests/FileBrowserTests.swift +++ b/FileBrowserTests/FileBrowserTests.swift @@ -69,5 +69,16 @@ class FileBrowserTests: XCTestCase { } } - + func testCaseIncludeExtension() { + let parser = FileParser.sharedInstance + parser.includesFileExtensions = ["JpG", "gIf"] + let directoryPath = Bundle(for: FileBrowserTests.self).bundleURL + let directoryContents = parser.filesForDirectory(directoryPath) + XCTAssertTrue(directoryContents.count > 0) + for file in directoryContents { + if let fileExtension = file.fileExtension { + XCTAssertTrue((fileExtension == "jpg") || (fileExtension == "gif")) + } + } + } }