From aa3e1eb7546333e56364a3c173bb9d012db27271 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Fri, 30 Oct 2020 18:20:04 +0100 Subject: [PATCH] Refactor link cleaning and transformation functions --- README.md | 1 + lua/zettelkasten/link.lua | 55 ++++++++++++++--- lua/zettelkasten/link_spec.lua | 107 ++++++++++++++++++++++----------- 3 files changed, 119 insertions(+), 44 deletions(-) diff --git a/README.md b/README.md index 428b754..d940c5a 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ start neovim with `nvim --cmd "set rtp+=$(pwd)" .` to automatically load the fi * [ ] options * [x] zettel anchor separator * [x] zettel extension + * [ ] link style (wiki/markdown) custom? * [ ] recursive lookup for zettel * [ ] zettel anchor regex * [ ] backlinks (via rg for filename anchor?) diff --git a/lua/zettelkasten/link.lua b/lua/zettelkasten/link.lua index 8103193..b7ae5f9 100644 --- a/lua/zettelkasten/link.lua +++ b/lua/zettelkasten/link.lua @@ -3,17 +3,52 @@ local L = {} local o = require 'zettelkasten.options' local a = require 'zettelkasten.anchor' --- Returns a link to a markdown file with the date replaced with a zettel anchor, --- and the text cleaned up to be useful in a link. -function L.create_link_text(text, date) +-- TODO split up into clean/anchor/style functions, make private +-- Returns a link to a markdown file with the anchor replaced with a zettel anchor, +-- Returns the text passed in with the anchor passed in prepended, +function L.prepend_anchor(anchor, text) + if not text or text == "" then return anchor end + + text = anchor .. o.anchor().separator .. text + return text +end + +-- Returns the text cleaned up to be more useful in a link. +-- Spaces are replaced by dashes and everything is lowercased. +function L.clean(text) text = text or "" - if text == "" then - text = "" .. a.create_anchor(date) - else - text = text:lower():gsub(" ", "-") - text = "" .. a.create_anchor(date) .. o.anchor().separator .. text - end - return text .. o.zettel().extension + return text:lower():gsub(" ", "-") +end + +-- Returns the untouched text with the extension set in options appended +-- at the end. +function L.append_extension(text) return text .. o.zettel().extension end + +local function check_link_empty(link) + if not link or link == "" then error("Link is not allowed to be empty.") end +end + +local function trimmed(text) + return text:match '^()%s*$' and '' or text:match '^%s*(.*%S)' +end + +-- Returns a markdown-compatible transformation of the link and text combination +-- passed in. +function L.style_markdown(link, text) + check_link_empty(link) + + return "[" .. trimmed(text) .. "](" .. link .. ")" +end + +-- Returns a wikilink-compatible transformation of the link and text combination +-- passed in, adding the text as a pipe if it exists. +function L.style_wiki(link, text) + check_link_empty(link) + local pipe = "" + text = trimmed(text) + + if text and text ~= "" then pipe = "|" .. text end + return "[[" .. link .. pipe .. "]]" end return L diff --git a/lua/zettelkasten/link_spec.lua b/lua/zettelkasten/link_spec.lua index 9cdf212..66a26e3 100644 --- a/lua/zettelkasten/link_spec.lua +++ b/lua/zettelkasten/link_spec.lua @@ -1,52 +1,91 @@ -ZK = require 'zettelkasten.link' +link = require 'zettelkasten.link' Test_date = {year = 2019, month = 10, day = 29, hour = 16, min = 45} before_each(function() _G.vim = {g = {}, b = {}} end) after_each(function() _G.vim = nil end) -describe("link creation", function() - it( - "should return a markdown link with only zettel anchor on no text passed in", - function() - assert.same("1910291645.md", ZK.create_link_text(nil, Test_date)) - end) - - it("should text to link", function() - assert.same("1910291645_isappended.md", - ZK.create_link_text("isappended", Test_date)) +describe("prepend_anchor", function() + it("should append text to link", function() + assert.same("1910291645_isappended", + link.prepend_anchor("1910291645", "isappended")) + end) + it("should not add a separator if no text appended", function() + assert.same("1910291645", link.prepend_anchor("1910291645", "")) end) - it("should return lowercased link text", function() - assert.same("1910291645_yesiamshouting.md", - ZK.create_link_text("YESIAMSHOUTING", Test_date)) + it("should return solely the anchor if no text is passed in", function() + assert.same("1910291645", link.prepend_anchor("1910291645", nil)) end) - - it("should return spaces in text replaced with dashes", function() - assert.same("1910291645_yes-indeed-a-space.md", - ZK.create_link_text("yes indeed a space", Test_date)) + it("should return solely the anchor if empty text is passed in", function() + assert.same("1910291645", link.prepend_anchor("1910291645", "")) end) - it("should add contents of g:zettel_anchor_separator variable to link", function() vim.g.zettel_anchor_separator = "SEP" - assert.same("1910291645SEParated.md", - ZK.create_link_text("arated", Test_date)) + assert.same("1910291645SEParated", + link.prepend_anchor("1910291645", "arated")) end) it("should add contents of b:zettel_anchor_separator variable to link", function() vim.b.zettel_anchor_separator = "---" - assert.same("1910291645---arated.md", - ZK.create_link_text("arated", Test_date)) - end) - - it("should append the filetype set in g:zettel_extension", function() - vim.g.zettel_extension = ".something" - assert.same("1910291645_theworld.something", - ZK.create_link_text("theworld", Test_date)) - end) - it("should append the filetype set in b:zettel_extension", function() - vim.b.zettel_extension = ".somethingelse" - assert.same("1910291645_theworld.somethingelse", - ZK.create_link_text("theworld", Test_date)) + assert.same("1910291645---arated", + link.prepend_anchor("1910291645", "arated")) + end) +end) + +describe("clean", function() + it("should return lowercased link text", function() + assert.same("yesiamshouting", link.clean("YESIAMSHOUTING")) + end) + + it("should return spaces in text replaced with dashes", function() + assert.same("yes-indeed-a-space", link.clean("yes indeed a space")) + end) +end) + +describe("append_extension", function() + it("should append the contents set in global zettel extension option", + function() + vim.g.zettel_extension = ".extension" + assert.same("myfile.extension", link.append_extension("myfile")) + end) + it("should append the contents set in global zettel extension option", + function() + vim.b.zettel_extension = ".bufext" + assert.same("myfile.bufext", link.append_extension("myfile")) + end) +end) + +describe("style_markdown", function() + it("should correctly apply transformations to link and text", function() + assert.same("[My AWESOME Link](1910291645_my-awesome-link.md)", + link.style_markdown("1910291645_my-awesome-link.md", + "My AWESOME Link")) + end) + it("should trim whitespace for the text area", function() + assert.same("[](1910291645_my-awesome-link.md)", + link.style_markdown("1910291645_my-awesome-link.md", " ")) + assert.same("[hi](1910291645_my-awesome-link.md)", link.style_markdown( + "1910291645_my-awesome-link.md", " hi ")) + end) + it("should error if no link provided", function() + assert.is_error(function() link.style_markdown("", "mytext") end) + assert.is_error(function() link.style_markdown(nil, "mytext") end) + end) +end) + +describe("style_wiki", function() + it("should error if no link provided", function() + assert.is_error(function() link.style_wiki("", "mytext") end) + assert.is_error(function() link.style_wiki(nil, "mytext") end) + end) + it("should correctly apply transformations to link and text", function() + assert.same("[[1910291645|My AWESOME Link]]", + link.style_wiki("1910291645", "My AWESOME Link")) + end) + it("should trim whitespace for the text area", function() + assert.same("[[1910291645]]", link.style_wiki("1910291645", " ")) + assert.same("[[1910291645|hi]]", + link.style_wiki("1910291645", " hi ")) end) end)