aboutsummaryrefslogtreecommitdiff
path: root/lua/denote/internal.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua/denote/internal.lua')
-rw-r--r--lua/denote/internal.lua207
1 files changed, 81 insertions, 126 deletions
diff --git a/lua/denote/internal.lua b/lua/denote/internal.lua
index 83bc251..6ae8785 100644
--- a/lua/denote/internal.lua
+++ b/lua/denote/internal.lua
@@ -1,139 +1,94 @@
local M = {}
-local config = require("denote.config")
-local util = require("denote.util")
-
----@class DenoteDate
----@field year string
----@field month string
----@field day string
-
----@param name string
----@param tags table|nil
----@return string filename format of files in denote.nvim
-function M.file(name, tags)
- local file = ""
-
- local date = tostring(os.date("%Y%m%d"))
-
- local tags_str = ""
-
- if tags then
- for i, tag in pairs(tags) do
- tags_str = tags_str .. tag
- if i < #tags then
- tags_str = tags_str .. config.filename.tag_sep
- end
- end
- end
-
- file = date .. config.filename.date_sep .. config.filename.date_sep .. name
- if tags then
- file = file .. config.filename.name_sep .. config.filename.name_sep .. tags_str
- end
-
- return file .. "." .. config.filename.ext
-end
+---@param options table
---@param name string
---@param tags table|nil
--- Opens your note
-function M.note(name, tags)
- local filename = config.vault.dir .. M.file(name, tags)
-
- -- Echo template
-
- vim.cmd("!mkdir -p " .. config.vault.dir)
- vim.cmd("e " .. filename)
+function M.note(options, name, tags)
+ local path = options.dir
+ local file = ""
+ local date = os.date("%Y%m%dT%H%M%S")
+ local tags_str = ""
+ name = name:gsub("^%s*(.-)%s*$", "%1")
+ name = name:gsub("[^%w%s]","")
+ name = name:gsub("%s","-")
+ if tags then
+ for i, tag in pairs(tags) do
+ tag = tag:gsub("[^%w%s]","")
+ tags_str = tags_str .. tag
+ if i < #tags then
+ tags_str = tags_str .. "_"
+ end
+ end
+ end
+ file = date .. "--" .. name:lower()
+ if tags_str ~= "" then
+ file = file .. "__" .. tags_str:lower()
+ end
+ path = path .. file .. "." .. options.ext
+ vim.cmd("e " .. path)
end
----@param date DenoteDate|nil
----@param name string|nil
----@param tags table|nil
----@param func function
-function M.search(date, name, tags, func)
- local items = {}
- local matcher = ""
-
- if date then
- if date.year then
- matcher = date.year
- else
- matcher = "%d%d%d%d"
- end
- if date.month then
- matcher = matcher .. date.month
- else
- matcher = matcher .. "%d%d"
- end
- if date.day then
- matcher = matcher .. date.day
- else
- matcher = matcher .. "%d%d"
- end
-
- matcher = matcher .. config.filename.date_sep .. config.filename.date_sep
- else
- matcher = "%d+" .. config.filename.date_sep .. config.filename.date_sep
- end
-
- if name then
- matcher = matcher .. name
- else
- matcher = matcher .. ".+"
- end
-
- -- matcher = matcher .. config.filename.name_sep .. "?" .. M.config.filename.name_sep .. "?" .. ".-"
-
- for file in io.popen("ls " .. config.vault.dir):lines() do
- local matched = file:match(matcher)
-
- if matched then
- print("file " .. file)
- items[#items + 1] = file
- end
- end
-
- if not items or #items == 0 then
- return nil
- end
-
- if tags then
- local items_copy = items
- items = {}
- for _, item in pairs(items_copy) do
- local item_tags_pre = M.get_tags(item)
- local item_tags = {}
- for _, i in pairs(item_tags_pre) do
- item_tags[i] = 0
- end
- local good = true
- for _, tag in pairs(tags) do
- if item_tags[tag] == nil then
- good = false
- end
- end
- if good then
- items[#items + 1] = item
- end
- end
- end
-
- vim.ui.select(items, {
- prompt = "Select note",
- }, func)
-
- return true
+---@param options table
+---@param filename string
+---@param new_title string
+--- Retitles the filename and changes the first heading of the note
+function M.retitle(options, filename, new_title)
+ local new_filename = filename:match("^(.*%d%d%d%d%d%d%d%dT%d%d%d%d%d%d).*")
+ local tags = filename:match(".*(__.*)%..*")
+ if new_filename == nil then
+ error("Doesn't look like a Denote filename")
+ end
+ new_title = new_title:gsub("^%s*(.-)%s*$", "%1") -- Trim whitespace
+
+ -- Replace first line with new heading
+ if options.new_heading_on_retitle == true and new_title ~= "" then
+ local first_char = vim.api.nvim_buf_get_lines(0, 0, 1, false)[1]:sub(1, 1)
+ if (first_char == "#" and options.ext == "md") or
+ (first_char == "*" and (options.ext == "org" or options.ext == "norg")) then
+ vim.api.nvim_buf_set_lines(0, 0, 1, false, {first_char .. " " .. new_title})
+ end
+ end
+ new_title = new_title:lower()
+ new_title = new_title:gsub("[^%w%s]","")
+ new_title = new_title:gsub("%s","-")
+ if new_title ~= "" then
+ new_title = "--" .. new_title
+ end
+ new_filename = new_filename .. new_title .. (tags or "") .. "." .. options.ext
+ if filename ~= new_filename then
+ vim.cmd('saveas ' .. new_filename)
+ vim.cmd('silent !rm ' .. filename)
+ end
end
+---@param options table
---@param filename string
----@return table
-function M.get_tags(filename)
- local tags = {}
- local name = util.splitstring(filename, ".")[1]
- for _, s in pairs(util.splitstring(util.splitstring(name, config.filename.name_sep)[3], config.filename.tag_sep)) do
- tags[#tags + 1] = s
- end
- return tags
+---@param new_tags table
+---Replaces the tags in filename with the tags in new_tags
+function M.retag(options, filename, new_tags)
+ local tags_str = ""
+ local new_filename = filename:match("^(.*)__.*$")
+ if new_filename == nil then
+ new_filename = filename:match("^(.*)%..*$")
+ end
+ if new_tags then
+ for i, tag in pairs(new_tags) do
+ tag = tag:gsub("[^%w%s]","")
+ tags_str = tags_str .. tag
+ if i < #new_tags then
+ tags_str = tags_str .. "_"
+ end
+ end
+ end
+ if tags_str ~= "" then
+ new_filename = new_filename .. "__" .. tags_str:lower()
+ end
+ new_filename = new_filename .. "." .. options.ext
+ if filename ~= new_filename then
+ vim.cmd('saveas ' .. new_filename)
+ vim.cmd('silent !rm ' .. filename)
+ end
end
return M