@@ -108,14 +108,20 @@ function M.extract_all_placeholders(prompts)
108108 return all_placeholders
109109end
110110
111+ --- @param str string The string to escape percent signs in for gsub replacement
112+ --- @return string The escaped string , safe for use as a gsub replacement
113+ local function escape_gsub_replacement (str )
114+ return (str :gsub (" %%" , " %%%%" ))
115+ end
116+
111117--- Replace any placeholders (e.g. ${placeholder}) in a string or table
112118--- @param t table | string The content to process
113119--- @param replacements table<string , string> Map of placeholder names to replacement values
114120--- @return string | nil The replaced string if input was string , or nil if input was table (modified in place )
115121function M .replace_placeholders (t , replacements )
116122 if type (t ) == " string" then
117123 for placeholder , replacement in pairs (replacements ) do
118- t = t :gsub (" %${" .. vim .pesc (placeholder ) .. " }" , replacement )
124+ t = t :gsub (" %${" .. vim .pesc (placeholder ) .. " }" , escape_gsub_replacement ( replacement ) )
119125 end
120126 return t
121127 else
@@ -124,7 +130,7 @@ function M.replace_placeholders(t, replacements)
124130 M .replace_placeholders (value , replacements )
125131 elseif type (value ) == " string" then
126132 for placeholder , replacement in pairs (replacements ) do
127- value = value :gsub (" %${" .. vim .pesc (placeholder ) .. " }" , replacement )
133+ value = value :gsub (" %${" .. vim .pesc (placeholder ) .. " }" , escape_gsub_replacement ( replacement ) )
128134 end
129135 t [key ] = value
130136 end
0 commit comments