Allow relative paths in configuration file

This commit is contained in:
Christoph Hagen 2022-12-09 12:09:57 +01:00
parent a563c56ec2
commit 3991211e37
3 changed files with 32 additions and 3 deletions

View File

@ -50,4 +50,23 @@ extension URL {
let attributes = try? FileManager.default.attributesOfItem(atPath: path) let attributes = try? FileManager.default.attributesOfItem(atPath: path)
return (attributes?[.size] as? NSNumber)?.intValue return (attributes?[.size] as? NSNumber)?.intValue
} }
func resolvingFolderTraversal() -> URL? {
var components = [String]()
absoluteString.components(separatedBy: "/").forEach { part in
if part == ".." {
if !components.isEmpty {
_ = components.dropLast()
} else {
components.append("..")
}
return
}
if part == "." {
return
}
components.append(part)
}
return URL(string: components.joined(separator: "/"))
}
} }

View File

@ -31,12 +31,12 @@ struct Configuration: Codable {
/** /**
The path to the directory where the root element metadata is located. The path to the directory where the root element metadata is located.
*/ */
let contentPath: String var contentPath: String
/** /**
The path where the generated website should be written. The path where the generated website should be written.
*/ */
let outputPath: String var outputPath: String
/** /**
Create .md files for content pages, if they don't exist. Create .md files for content pages, if they don't exist.
@ -62,6 +62,15 @@ struct Configuration: Codable {
.init(fileURLWithPath: outputPath) .init(fileURLWithPath: outputPath)
} }
mutating func adjustPathsRelative(to folder: URL) {
if !contentPath.hasPrefix("/") {
contentPath = folder.appendingPathComponent(contentPath).resolvingFolderTraversal()!.path
}
if !outputPath.hasPrefix("/") {
outputPath = folder.appendingPathComponent(outputPath).resolvingFolderTraversal()!.path
}
}
func printOverview() { func printOverview() {
print(" Source folder: \(contentDirectory.path)") print(" Source folder: \(contentDirectory.path)")
print(" Output folder: \(outputDirectory.path)") print(" Output folder: \(outputDirectory.path)")

View File

@ -18,10 +18,11 @@ private func loadConfiguration(at configPath: String) -> Configuration? {
print(" ") print(" ")
print(" Configuration file: \(configPath)") print(" Configuration file: \(configPath)")
let configUrl = URL(fileURLWithPath: configPath) let configUrl = URL(fileURLWithPath: configPath)
let config: Configuration var config: Configuration
do { do {
let data = try Data(contentsOf: configUrl) let data = try Data(contentsOf: configUrl)
config = try JSONDecoder().decode(from: data) config = try JSONDecoder().decode(from: data)
config.adjustPathsRelative(to: configUrl.deletingLastPathComponent())
} catch { } catch {
print(" Configuration error: \(error)") print(" Configuration error: \(error)")
return nil return nil