local M = {} function M.get_path_type(path) if path:sub(1, 1) == '/' then return 'absolute' elseif path:sub(1, 1) == '~' then return 'home' else return 'relative' end end function M.resolve(filepath, current_file) local path_type = M.get_path_type(filepath) if path_type == 'relative' then local base = current_file and vim.fs.dirname(current_file) or vim.fs.dirname(vim.api.nvim_buf_get_name(0)) filepath = vim.fs.joinpath(base, filepath) end return vim.fs.normalize(filepath) end function M.strip_file_protocol(url) return url:gsub('^file://', '') end function M.is_within_wiki(filepath, wiki_root) local real_path = vim.fn.resolve(filepath) local real_root = vim.fn.resolve(wiki_root) local normalized_path = vim.fs.normalize(real_path) local normalized_root = vim.fs.normalize(real_root) return vim.startswith(normalized_path, normalized_root) end function M.validate_within_wiki(resolved_path, wiki_root, original_path) if not M.is_within_wiki(resolved_path, wiki_root) then vim.notify( string.format('Warning: Resolved path outside wiki root: %s', original_path), vim.log.levels.WARN ) end return resolved_path end local ALLOWED_SCHEMES = { http = true, https = true, file = true, } function M.validate_url_scheme(url) local scheme = url:match('^([a-zA-Z]+)://') if scheme and not ALLOWED_SCHEMES[scheme:lower()] then return false, string.format('URL scheme not allowed: %s', scheme) end return true, nil end return M