64 lines
2.1 KiB
Lua
64 lines
2.1 KiB
Lua
local A = {}
|
|
|
|
local o = require 'zettelkasten.options'
|
|
|
|
local function deduplicate(anchor, anchorfct)
|
|
while A.is_duplicate(anchor, anchorfct) do anchor = anchor - 1 end
|
|
return anchor
|
|
end
|
|
|
|
-- Return a valid zettelkasten anchor,
|
|
-- composed of yymmddHHMM.
|
|
--
|
|
-- date can be passed in as a table containing a year, a month, a day, an hour,
|
|
-- and a minute key. Returns nil if the date passed in is invalid.
|
|
-- If no date is passed in, returns Zettel anchor for current moment.
|
|
function A.create(date, anchorfct)
|
|
local timestamp
|
|
if pcall(function() timestamp = os.time(date) end) then
|
|
local anchor = os.date('%y%m%d%H%M', timestamp)
|
|
if anchorfct then anchor = deduplicate(anchor, anchorfct) end
|
|
return tostring(anchor)
|
|
else
|
|
return nil
|
|
end
|
|
end
|
|
|
|
-- TODO think about making clean/anchor/extension function module private
|
|
-- Returns the text passed in with the anchor passed in prepended.
|
|
function A.prepend(anchor, text)
|
|
if not text or text == "" then return anchor end
|
|
|
|
text = anchor .. o.anchor().separator .. text
|
|
return text
|
|
end
|
|
|
|
-- Returns anchor contents if an anchor is contained in the input string.
|
|
-- It takes an optional regex parameter with which the plugin option
|
|
-- of which anchor to look for can be overwritten.
|
|
--
|
|
-- If multiple anchors are contained, returns the contents of the first
|
|
-- one encountered.
|
|
function A.extract(input, regex)
|
|
regex = regex or o.anchor().regex
|
|
return input:match(regex)
|
|
end
|
|
|
|
-- Returns a set of all anchors created by the function passed in
|
|
-- (if argument is set) or all anchors currently in zettel root dir
|
|
-- (if no argument passed).
|
|
function A.list(anchor_function)
|
|
if not anchor_function then return {} end
|
|
return anchor_function()
|
|
end
|
|
|
|
-- Returns true if anchor passed in already exists, false otherwise.
|
|
-- Takes an optional set of anchors to compare against, will
|
|
-- compare against all anchors in zettel root dir otherwise.
|
|
function A.is_duplicate(anchor, anchor_function)
|
|
local all_anchors = A.list(anchor_function)
|
|
if all_anchors[anchor] ~= nil then return true end
|
|
return false
|
|
end
|
|
|
|
return A
|