local q = require "vim.treesitter.query" local ts_utils = require("nvim-treesitter.ts_utils") local tprint = require("setup.utils").tprint local M = {} M.config_values = { server = 'http://localhost:7700', dateformat = '%Y%m%d%H%M-', prefix = os.getenv("HOME") .. "/notes/", replace_pattern = { [1] = { ['@'] = '_AT_' }, [2] = { ['[.]'] = '_DOT_' }, [3] = { ['[%$]'] = '_DOLLAR_' }, [4] = { ['%~'] = '_TILDE_' }, [5] = { ['[%|]'] = '_PIPE_' }, [6] = { ['[^a-zA-Z0-9-]'] = '_' }, [7] = { ['__+'] = '_' }, [8] = { ['^_'] = '' }, [9] = { ['_$'] = '' }, }, } local function hexdecode(hex) return (hex:gsub("%x%x", function(digits) return string.char(tonumber(digits, 16)) end)) end local function hexencode(str) return (string.upper(str:gsub(".", function(char) return string.format("%2x", char:byte()) end))) end local function dirLookup(dir) local files = {} local p = io.popen('find "' .. dir .. '" -type f') --Open directory look for files, save data in p. By giving '-type f' as parameter, it returns all files. if p then for file in p:lines() do --Loop through all files if file:match('.*norg$') then table.insert(files, file) end end end return files end local function isempty(s) return s == nil or s == '' end local createfilename = function(suffix) local name = vim.fn.input("Please enter a title: ") if string.len(name) == 0 then print(" ") print("Title missing: request ignored!") return end local date = os.date(M.config_values.dateformat) for index, pv in ipairs(M.config_values.replace_pattern) do for key, value in pairs(pv) do if name.find(name, key) then name = string.gsub(name, key, value) end end end return M.config_values.prefix .. date .. name .. suffix, date, name end function M.newNeorgNote() local name, date, title = createfilename(".norg") local template = { "* " .. string.gsub(title or "", "_", " "), " ", } vim.cmd(":e" .. name) vim.api.nvim_buf_set_text(0, 0, 0, 0, 0, template) vim.cmd(":Neorg inject-metadata") vim.cmd('startinsert!') end function M.newMarkdownNote() local name, date, title = createfilename(".md") local template = { "---", "title: " .. date .. title, "description: ", "authors:", " - nige", "categories:", "project: ", "created: " .. os.date('%Y-%m-%d'), "version: na", "---", "", "# " .. string.gsub(title or "", "_", " "), "", "", } vim.cmd(":e" .. name) vim.api.nvim_buf_set_text(0, 0, 0, 0, 0, template) vim.cmd('startinsert!') end function M.createWorknote() local date = os.date('%Y-%m-%d %H:%M') vim.cmd(':normal o') local pos = vim.api.nvim_win_get_cursor(0)[2] local line = vim.api.nvim_get_current_line() local nline = line:sub(0, pos) .. '- Note tagen on /' .. date .. "/: " .. line:sub(pos + 1) vim.api.nvim_set_current_line(nline) vim.cmd(':normal $') vim.api.nvim_set_mode = 'i' vim.cmd('startinsert!') end -------------------------------------------------------------------------------- local index = "notes" local fillqflist = function(items, query) local title = "Meilisearch - index: '" .. index .. "'" if type(query) ~= "nil" then title = title .. ", query: '" .. query .. "'" end vim.fn.setqflist( {}, ' ', -- 'a' to add item(s) to an existing list { title = title, id = 999, items = items } ) end function M.search() local query = vim.fn.input("Meilisearch: ") local curl = require "plenary.curl" local json = require('json') local prefix = M.config_values.prefix local hits = {} -- print("----" .. query) local res = curl.get(M.config_values.server .. "/indexes/notes/search", { accept = "application/json", query = { q = query, showMatchesPosition = "true" } }) if res then local tab = json.parse(res.body) if tab and type(tab['hits']) ~= "nil" then for i, v in ipairs(tab['hits']) do local hit = { text = "", pattern = query, filename = prefix .. v['title'], -- filename = prefix .. hexdecode(v['id']), } --print("id: '" .. hexdecode(v['id']) .. "'") table.insert(hits, hit) end else print("No data in table") end fillqflist(hits, query) vim.cmd("copen") end end ------------------------------------------------------------------------------- local function i(value) print(vim.inspect(value)) end local removeLines = function(str, lines) local multistring = str for ii = 1, lines, 1 do multistring = multistring:gsub("^[^\n]*\n", "") end return multistring end local keywords = { ["title"] = false, ["description"] = false, ["authors"] = true, ["categories"] = true, ["project"] = false, ["created"] = false, ["version"] = false } local contains = function(array, val) for k, v in pairs(array) do if k == val then return true, v end end return false, false end local function splitValue(s, delimiter) local result = {}; for match in (s .. delimiter):gmatch("(.-)" .. delimiter) do table.insert(result, match); end return result; end local function trim(s) return (s:gsub("^%s*(.-)%s*$", "%1")) end local function trimTable(t) local newTable = {} for key, value in pairs(t) do if type(value) == "string" then newTable[key] = trim(value) end end return newTable end local split = function(lines) local metadata = {} for line in lines:gmatch("[^\n]*\n?") do local key = string.match(line, "^[^:]+:") if type(key) ~= "nil" then key = string.sub(key, 1, key:len() - 1) local isContained, isArray = contains(keywords, key:lower()) if isContained then local value = string.match(line, ":.*$") if type(value) == "string" then value = string.match(value, "[^: ]+.*$") value = string.gsub(value, "\n", "") if isArray then value = splitValue(value, ",") value = trimTable(value) end else value = "" if isArray then value = { "" } end end metadata[key] = value end end end return metadata end function M.upsertNote(bufnr) if isempty(bufnr) then bufnr = vim.api.nvim_get_current_buf() end -- local language_tree = vim.treesitter.get_parser(bufnr, 'norg') local language_tree = vim.treesitter.get_parser(bufnr) local syntax_tree = language_tree:parse() local root = syntax_tree[1]:root() local query = vim.treesitter.parse_query('norg', [[ (ranged_tag name: (tag_name) @name (#eq? @name "document.meta") content: (ranged_tag_content) @content (ranged_tag_end) @end (#offset! @end) ) ]]) local header_lines = 0 local note for s, captures, metadata in query:iter_matches(root, bufnr) do local headerText = q.get_node_text(captures[2], bufnr) note = split(headerText) local text = q.get_node_text(captures[2], bufnr) print('######### s') tprint(s) print('######### captures') tprint(captures) print('######### metadata') tprint(metadata) print('#########') header_lines = metadata['ranged_verbatim_tag'][1][1] end -- if header_lines then -- note["headerlines"] = header_lines -- end note["id"] = hexencode(string.gsub(vim.api.nvim_buf_get_name(bufnr), M.config_values.prefix, "")) note["body"] = removeLines(q.get_node_text(root, bufnr), header_lines) --i(note) local curl = require "plenary.curl" local json = require('json') local prefix = "/Users/nige/notes/" local hits = {} local header = {} header = { header = "\"Content-Type\" = \"application/json\"" } i(curl.post(M.config_values.server .. "/indexes/notes/documents", { raw = { "-H", "Content-Type: application/json" }, body = json.stringify(note) } )) return tonumber(bufnr) end M.updateAll = function() local files = dirLookup(M.config_values.prefix) for key, value in pairs(files) do if value:match(".*norg") then vim.cmd("e " .. value) local bufnr = M.upsertNote() --vim.cmd("bw") --print("number:" .. bufnr .. type(bufnr)) --[[ pcall(vim.api.nvim_buf_delete, bufnr {}) ]] end end end --M.yaml = function() -- print ("START") -- local yaml_string = [[ --title -- list -- - item 1 -- - item 2 -- - item 3 -- key: value -- ]] -- print ("load require") -- local yaml = require("lyaml") -- print ("load table") -- local tbl = yaml.load(yaml_string) -- print ("print values") -- print(tbl.title.list) -- print(tbl.title.key) --end return M