From 0e9de254d77c7022d2d063d48e18d2369c9b459d Mon Sep 17 00:00:00 2001 From: TEC Date: Sun, 22 Oct 2023 00:37:41 +0800 Subject: [PATCH] Add filesystem func to transform a path to a URI --- base/path.jl | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/base/path.jl b/base/path.jl index c439a2800acce3..096f0d6b230472 100644 --- a/base/path.jl +++ b/base/path.jl @@ -594,3 +594,21 @@ relpath(path::AbstractString, startpath::AbstractString) = for f in (:isdirpath, :splitdir, :splitdrive, :splitext, :normpath, :abspath) @eval $f(path::AbstractString) = $f(String(path)) end + +""" + uripath(path::AbstractString) + +Encode `path` as a URI as per RFC1738, RFC3986, and the +[Freedesktop File URI spec](https://www.freedesktop.org/wiki/Specifications/file-uri-spec/). +""" +function uripath(path::AbstractString) + percent_escape(s) = '%' * join(map( + b -> uppercase(string(b, base=16)), + Vector{UInt8}(s)), '%') + encode_uri_component(s) = replace( + s, r"[^A-Za-z0-9\-_.~]+" => percent_escape) + string("file://", gethostname(), '/', + join(map(encode_uri_component, + split(path, Filesystem.path_separator, keepempty=false)), + '/')) +end