3.8 KiB
3.8 KiB
author, description, name, tags, share.uri, share.hash, share.mode
| author | description | name | tags | share.uri | share.hash | share.mode |
|---|---|---|---|---|---|---|
| malys | Generate and copy links to specific cursor positions and headers in markdown documents | Library/Malys/CursorPosition | meta/library | https://github.com/malys/silverbullet-libraries/blob/main/src/CursorPosition.md | a8544328 | pull |
Cursor Position Link Generator
This script provides functionality to generate and copy links to specific cursor positions and headers within markdown documents. It's particularly useful for creating precise references within a document or across multiple documents.
Features
- External Links: Generate full URLs pointing to specific cursor positions or headers
- Internal Links: Create markdown-style internal links for use within the same document
Usage
External Links (Ctrl+Shift+C)
Copies a full URL to the current cursor position or header to the clipboard.
- If the cursor is on a header line: Creates a URL with the header as an anchor (e.g.,
https://your-host/Page#Header Name) - If not on a header: Creates a URL with the cursor position (e.g.,
https://your-host/Page@123)
Internal Links (Ctrl+Shift+L)
Copies a markdown-style internal link to the current cursor position or header.
- If on a header: Creates a link like
[Header Name@123] - If not on a header: Creates a link like
[Page Name@123]
Source
-- [[Page#Header]] -> http(s)://host/Page#Header
-- [[Page@pos]] -> http(s)://host/Page@pos
local function replace_space_with_percent20(s)
local parts = {}
for i = 1, #s do
local c = s:sub(i, i)
if c == " " then
parts[#parts+1] = "%20"
else
parts[#parts+1] = c
end
end
return table.concat(parts)
end
local function build_page_url(pageName)
-- get direct url from js
local BASE_URL = js.window.location.origin
local path = replace_space_with_percent20(pageName)
if BASE_URL:sub(-1) == "/" then
return BASE_URL .. path
else
return BASE_URL .. "/" .. path
end
end
command.define {
name = "Cursor: Copy external link",
key = "Ctrl-Shift-c",
run = function()
local currentLine = editor.getCurrentLine().text
local pageName = editor.getCurrentPage()
local pos = editor.getCursor()
local headerMarks, headerName = string.match(currentLine, "^(#+) +(.+)$")
local pageUrl = build_page_url(pageName)
local out
if headerMarks and headerName and headerName:match("%S") then
headerName = headerName:match("^%s*(.+)")
headerName = replace_space_with_percent20(headerName)
out = string.format("%s#%s", pageUrl, headerName)
-- editor.flashNotification("Copied header external link: " .. out, "info")
editor.flashNotification("Copied header link: " .. out, "info")
else
out = string.format("%s@%d", pageUrl, pos)
-- editor.flashNotification("Copied cursor external link: " .. out, "info")
editor.flashNotification("Copied cursor link: " .. out, "info")
end
editor.copyToClipboard(out)
end
}
command.define {
name = "Cursor: Copy internal link",
key = "Ctrl-Shift-l",
run = function()
local currentLine = editor.getCurrentLine().text
local pageName = editor.getCurrentPage()
local pos = editor.getCursor()
local headerMarks, headerName = string.match(currentLine, "^(#+) +(.+)$")
local out
if headerMarks and headerName and headerName:match("%S") then
headerName = headerName:match("^%s*(.+)")
out = string.format("[[%s@%s]]", replace_space_with_percent20(headerName), pos)
editor.flashNotification("Copied header internal link: " .. out, "info")
else
out = string.format("[[%s@%d]]", replace_space_with_percent20(pageName), pos)
editor.flashNotification("Copied cursor internal link: " .. out, "info")
end
editor.copyToClipboard(out)
end
}