Files
pkgs.lux/packages/path/lib.lux
Brandon Lucas cbb66fbb73 Add frontmatter, markdown, path, xml, rss, and web packages
Sync local packages into the registry repo and update index.json
and README.md to include all 9 packages.
2026-02-24 21:04:20 -05:00

94 lines
3.0 KiB
Plaintext

// path - File path utilities for Lux
// Get the last component of a path (filename)
// basename("/foo/bar/baz.txt") => "baz.txt"
// basename("file.txt") => "file.txt"
pub fn basename(path: String): String =
match String.lastIndexOf(path, "/") {
Some(idx) => String.substring(path, idx + 1, String.length(path)),
None => path,
}
// Get the directory portion of a path
// dirname("/foo/bar/baz.txt") => "/foo/bar"
// dirname("file.txt") => "."
pub fn dirname(path: String): String =
match String.lastIndexOf(path, "/") {
Some(idx) => if idx == 0 then "/" else String.substring(path, 0, idx),
None => ".",
}
// Get the file extension (without the dot)
// extension("file.txt") => Some("txt")
// extension("file") => None
// extension("file.tar.gz") => Some("gz")
pub fn extension(path: String): Option<String> = {
let name = basename(path)
match String.lastIndexOf(name, ".") {
Some(idx) => if idx == 0 then None
else Some(String.substring(name, idx + 1, String.length(name))),
None => None,
}
}
// Remove the file extension
// stripExtension("file.txt") => "file"
// stripExtension("file") => "file"
// stripExtension("/foo/bar.txt") => "/foo/bar"
pub fn stripExtension(path: String): String =
match String.lastIndexOf(path, ".") {
Some(dotIdx) => match String.lastIndexOf(path, "/") {
Some(slashIdx) => if dotIdx > slashIdx then String.substring(path, 0, dotIdx) else path,
None => String.substring(path, 0, dotIdx),
},
None => path,
}
// Join two path components with a separator
// join("/foo", "bar") => "/foo/bar"
// join("/foo/", "bar") => "/foo/bar"
// join("", "bar") => "bar"
pub fn join(a: String, b: String): String =
if a == "" then b
else if b == "" then a
else if String.endsWith(a, "/") then
if String.startsWith(b, "/") then a + String.substring(b, 1, String.length(b))
else a + b
else if String.startsWith(b, "/") then a + b
else a + "/" + b
// Check if a path has a given extension
// hasExtension("file.txt", "txt") => true
// hasExtension("file.md", "txt") => false
pub fn hasExtension(path: String, ext: String): Bool =
String.endsWith(path, "." + ext)
// Replace the file extension
// replaceExtension("file.txt", "md") => "file.md"
// replaceExtension("file", "md") => "file.md"
pub fn replaceExtension(path: String, newExt: String): String =
stripExtension(path) + "." + newExt
// Get the filename without extension (stem)
// stem("file.txt") => "file"
// stem("/foo/bar.txt") => "bar"
// stem("file") => "file"
pub fn stem(path: String): String = {
let name = basename(path)
match String.lastIndexOf(name, ".") {
Some(idx) => if idx == 0 then name
else String.substring(name, 0, idx),
None => name,
}
}
// Check if a path is absolute (starts with /)
pub fn isAbsolute(path: String): Bool =
String.startsWith(path, "/")
// Check if a path is relative (does not start with /)
pub fn isRelative(path: String): Bool =
if path == "" then true
else if String.startsWith(path, "/") then false
else true