Manipulating a deep copy of the templated Pandoc fragment instead of regenerating it at every call

This commit is contained in:
Bastien Dumont 2022-06-12 12:23:17 +02:00
parent 77a1f21c30
commit 7853500bca

View File

@ -419,23 +419,35 @@ end
local function template_to_function(template)
--[[
inlines_with_placeholders cannot be memoized
for it is a reference to a table that will be changed
by replace_placeholders.
paths_to_placeholders can be memoized
because it is only traversed once it has been created.
Returns a function that takes data and inserts it
into the given template.
]]--
--[[
inlines_with_placeholders and paths_to_placeholders
are created and memoized the first time the returned
function is called.
inlines_with_placeholders cannot be used directly
for it is a reference to a table that would be changed
by replace_placeholders. That's why we create a deep
copy of it via the walk function at every call.
paths_to_placeholders can be used directly by
replace_placeholders because it is only traversed.
]]--
if template then
local paths_to_placeholders
local inlines_with_placeholders
return
function(instance_content, instance_attr)
local inlines_with_placeholders = template_to_pandoc_fragment(template)
if not inlines_with_placeholders then
inlines_with_placeholders = template_to_pandoc_fragment(template)
end
local inlines_copy = inlines_with_placeholders:walk({})
if not paths_to_placeholders then
paths_to_placeholders =
get_paths_to_placeholders(inlines_with_placeholders)
end
return replace_placeholders(
inlines_with_placeholders, paths_to_placeholders,
inlines_copy, paths_to_placeholders,
instance_content, instance_attr)
end
end