Files
su2026rwep/_extensions/shafayetShafee/nameref/nameref.lua
T
2024-10-08 16:50:47 +08:00

84 lines
2.4 KiB
Lua

local str = pandoc.utils.stringify
local p = quarto.log.output
function get_header_data(data, numbered)
local get_headers = {
-- get the Header text and header id from headers and
-- insert them into table `data` passed into `get_header_data`
Header = function(el)
local id = el.identifier
local number = numbered=="true" and el.attributes['number'] or ""
local text = str(el.content):gsub("^[%d.]+ ", "")
text = number .. " " .. text
table.insert(data, {id = id, text = text})
end,
-- get the id and title attribute from pandoc div, so the
-- generated output has this id and can be referred with.
Div = function(el)
if el.attributes["link-id"] then
local id = el.attributes["link-id"]
local text = el.attributes["link-title"]
table.insert(data, {id = id, text = text})
end
end
}
return get_headers
end
function change_ref(data)
local change_rawinline = {
-- change the nameref instance with pandoc.Link
RawInline = function(el)
for key, value in pairs(data) do
if el.text:match("\\nameref{(.*)}") == value.id then
local target = "#" .. value.id
local link = pandoc.Link(value.text, target)
return link
end
end
end
}
return change_rawinline
end
local function add_div_id(div)
return {
-- add id to div with `cell-output-stdout` or
-- `cell-output-display`
Div = function(elem)
if elem.classes:includes("cell-output-display")
or elem.classes:includes("cell-output-stdout") then
elem.identifier = div.attributes["link-id"]
return elem
end
end
}
end
function Div(el)
-- target those div with attribute `link-id`
if el.attributes["link-id"] then
-- for markdown syntax (image or table) wrapped withing
-- div with `link`
if el.classes:includes('link') then
el.identifier = el.attributes["link-id"]
end
return el:walk(add_div_id(el))
end
end
function Pandoc(doc)
local meta = doc.meta
local numbered
local numbered = meta.nameref and str(meta.nameref['section-number'])
local header_data = {}
-- populate the header_data table
doc:walk(get_header_data(header_data, numbered))
-- generate named link inplaces with `\nameref`
return doc:walk(change_ref(header_data))
end