diff --git a/AK/LexicalPath.cpp b/AK/LexicalPath.cpp index a699b5aa8c..cbe28d31de 100644 --- a/AK/LexicalPath.cpp +++ b/AK/LexicalPath.cpp @@ -119,4 +119,19 @@ String LexicalPath::canonicalized_path(const StringView& path) return LexicalPath(path).string(); } +String LexicalPath::relative_path(const String absolute_path, const String& prefix) +{ + if (!LexicalPath { absolute_path }.is_absolute() || !LexicalPath { prefix }.is_absolute()) + return {}; + + if (!absolute_path.starts_with(prefix)) + return absolute_path; + + size_t prefix_length = LexicalPath { prefix }.string().length() + 1; + if (prefix_length >= absolute_path.length()) + return {}; + + return absolute_path.substring(prefix_length); +} + } diff --git a/AK/LexicalPath.h b/AK/LexicalPath.h index f4d8e23269..1a71418e65 100644 --- a/AK/LexicalPath.h +++ b/AK/LexicalPath.h @@ -50,6 +50,7 @@ public: bool has_extension(const StringView&) const; static String canonicalized_path(const StringView&); + static String relative_path(const String absolute_path, const String& prefix); private: void canonicalize();