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)
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.
*/
let contentPath: String
var contentPath: String
/**
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.
@ -62,6 +62,15 @@ struct Configuration: Codable {
.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() {
print(" Source folder: \(contentDirectory.path)")
print(" Output folder: \(outputDirectory.path)")

View File

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