local config = require('muwiki.config') local paths = require('muwiki.paths') local fs = require('muwiki.fs') local M = {} function M.open_in_buffer(filepath) local bufnr = vim.fn.bufnr(filepath, true) vim.api.nvim_win_set_buf(0, bufnr) end function M.open_external(url) if type(url) ~= 'string' then vim.notify('Invalid URL type', vim.log.levels.ERROR) return false end local valid, err = paths.validate_url_scheme(url) if not valid then vim.notify(err, vim.log.levels.ERROR) return false end vim.system({ 'xdg-open', url }, { detach = true }) return true end function M.open_index(name) local wiki_path = config.wiki_path(name) if not wiki_path then return end local index_path = vim.fs.joinpath(wiki_path, config.options.index_file) M.open_in_buffer(index_path) end function M.resolve(filepath, wiki_root) if not wiki_root then error('wiki_root parameter is required for secure path resolution') end local path = paths.strip_file_protocol(filepath) local resolved = paths.resolve(path, wiki_root) return paths.validate_within_wiki(resolved, wiki_root, filepath) end function M.is_text_file(ext) local ext_lower = ext:lower() for _, text_ext in ipairs(config.options.text_extensions) do if ext_lower == text_ext then return true end end return false end function M.normalize_filename(text) local normalized = text:lower() normalized = normalized:gsub('%s+', '_') normalized = normalized:gsub('[^%w_%-%.]', '') return normalized end function M.open_wiki_file(filepath) local templates = require('muwiki.templates') local exists = fs.file_exists(filepath) if not exists and config.options.create_missing_dirs then local wiki_root = config.wiki_root(0) if wiki_root then local mode = config.options.create_missing_dirs if mode == 'prompt' then fs.ensure_parent_dirs(filepath, wiki_root, mode, function(success) if success then M.open_in_buffer(filepath) templates.init_file(vim.api.nvim_get_current_buf(), filepath) end end) return else local success = fs.ensure_parent_dirs(filepath, wiki_root, mode) if not success then return end end end end M.open_in_buffer(filepath) templates.init_file(vim.api.nvim_get_current_buf(), filepath) end return M