Allow relative paths in configuration file
This commit is contained in:
parent
a563c56ec2
commit
3991211e37
@ -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: "/"))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)")
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user