refactor: handle obsidian uri & templating in lua

This commit is contained in:
arne314
2024-12-13 22:56:28 +01:00
parent 5d29ba3f3e
commit 7b58c63b14
5 changed files with 43 additions and 70 deletions

View File

@@ -5,8 +5,10 @@ local default_config = {
excalidraw = {
assetsDir = 'assets',
filename = 'drawing-%Y-%m-%d-%H-%M-%S',
fileExtension = '.excalidraw.md',
fileExtensionInserted = '.excalidraw.svg',
obsidianOpenConfig = nil,
uriOpenCommand = 'xdg-open',
templatePath = nil,
},
snippets = {
enable = true,
@@ -22,8 +24,10 @@ local default_config = {
function M.merge_config(args)
M.config = vim.tbl_deep_extend('force', default_config, args or {})
M.config.excalidraw.obsidianOpenConfig = M.config.excalidraw.obsidianOpenConfig or
M.config.typstarRoot .. '/res/obsidian_open_config_example.json'
M.config.excalidraw.templatePath = M.config.excalidraw.templatePath or
{
['%.excalidraw%.md$'] = M.config.typstarRoot .. '/res/excalidraw_template.excalidraw.md',
}
end
M.merge_config(nil)

View File

@@ -2,32 +2,42 @@ local M = {}
local config = require('typstar.config')
local utils = require('typstar.utils')
local cfg = config.config.excalidraw
local affix = [[
#figure(
image("%s"),
image("%s"),
)
]]
local function launch_obsidian_open(path)
local function launch_obsidian(path)
print(string.format('Opening %s in Excalidraw', path))
utils.run_shell_command('python3 ' ..
config.config.typstarRoot .. '/python/obsidian_open.py ' ..
path .. ' --config ' .. cfg.obsidianOpenConfig)
utils.run_shell_command(string.format('%s "obsidian://open?path=%s"', cfg.uriOpenCommand, utils.urlencode(path)))
end
function M.insert_drawing()
local assets_dir = vim.fn.expand('%:p:h') .. '/' .. cfg.assetsDir
local filename = os.date(cfg.filename)
local path = assets_dir .. '/' .. filename .. cfg.fileExtension
local path_inserted = cfg.assetsDir .. '/' .. filename .. cfg.fileExtensionInserted
if vim.fn.isdirectory(assets_dir) == 0 then
vim.fn.mkdir(assets_dir, 'p')
end
local filename = os.date(cfg.filename)
local path = assets_dir .. '/' .. filename .. '.excalidraw.md'
local path_inserted = cfg.assetsDir .. '/' .. filename .. cfg.fileExtensionInserted
local found_match = false
for pattern, template_path in pairs(cfg.templatePath) do
if string.match(path, pattern) then
found_match = true
utils.run_shell_command(string.format('cat %s > %s', template_path, path)) -- don't copy file metadata
break
end
end
if not found_match then
print('No matching template found for the path: ' .. path)
return
end
utils.insert_text_block(string.format(affix, path_inserted))
launch_obsidian_open(path)
launch_obsidian(path)
end
function M.open_drawing()
@@ -35,7 +45,7 @@ function M.open_drawing()
local path = vim.fn.expand('%:p:h') ..
'/' .. string.match(line, '"(.*)' .. string.gsub(cfg.fileExtensionInserted, '%.', '%%%.')) ..
'.excalidraw.md'
launch_obsidian_open(path)
launch_obsidian(path)
end
return M

View File

@@ -30,6 +30,20 @@ function M.run_shell_command(cmd)
vim.fn.jobstart(cmd)
end
function M.char_to_hex(c)
return string.format("%%%02X", string.byte(c))
end
function M.urlencode(url)
if url == nil then
return ''
end
url = string.gsub(url, '\n', '\r\n')
url = string.gsub(url, '([^%w _%%%-%.~])', M.char_to_hex)
url = string.gsub(url, ' ', '%%20')
return url
end
function M.get_treesitter_root(bufnr)
return ts.get_parser(bufnr):parse()[1]:root()
end