PANDOC_VERSION:must_be_at_least'3.0'-- Mermaid → SVG via Mermaid CLI (mmdc), same pattern as plantuml.lua---- Puppeteer/Chromium often needs --no-sandbox on Linux (Ubuntu 23.10+ AppArmor).-- By default we write a small JSON next to Pandoc's cwd and pass `mmdc -p ...`.-- Override with metadata `mmdc-puppeteer-config` (path to JSON), or disable with-- `mmdc-no-sandbox: false` (e.g. from extension setting).localmmdc_path='mmdc'-- Path passed to `mmdc -p` when non-nillocalpuppeteer_config_for_mmdc=nil-- Track if we created a temp file so we can delete itlocalcreated_temp_config=nil-- True only when key is present and reads as boolean false (opt out of default -p JSON).localfunctionmeta_is_false(m,key)localv=m[key]ifv==nilthenreturnfalseendlocals=pandoc.utils.stringify(v):lower()returns=='false'ors=='0'ors=='no'ors==''endlocalfunctionclass_signals_mermaid(c)ifc=='mermaid'thenreturntrueendifstring.find(c,'{.mermaid',1,true)==1thenreturntrueendreturnfalseendlocalfunctionblock_is_mermaid(block)for_,cinipairs(block.classes)doifclass_signals_mermaid(c)thenreturntrueendendreturnfalseendlocalfunctionwrite_default_puppeteer_config(rel_path)localjson='{"args":["--no-sandbox","--disable-setuid-sandbox","--disable-dev-shm-usage"]}'localf=io.open(rel_path,'w')ifnotfthenio.stderr:write('[mermaid.lua] could not write '..rel_path..'\n')returnnilendf:write(json)f:close()returnrel_pathendfunctionMeta(m)ifm['mmdc-path']thenmmdc_path=pandoc.utils.stringify(m['mmdc-path'])endpuppeteer_config_for_mmdc=nilifm['mmdc-puppeteer-config']thenlocalp=pandoc.utils.stringify(m['mmdc-puppeteer-config'])ifp~=''thenpuppeteer_config_for_mmdc=pendelseifnotmeta_is_false(m,'mmdc-no-sandbox')then-- absent or true → write default Chromium args for restricted Linux sandboxeslocaltmp=os.tmpname()puppeteer_config_for_mmdc=write_default_puppeteer_config(tmp)created_temp_config=puppeteer_config_for_mmdcendreturnmendfunctionPandoc(doc)ifcreated_temp_configthenos.remove(created_temp_config)endreturndocendfunctionCodeBlock(block)ifnotblock_is_mermaid(block)thenreturnnilendlocalargs={'--input','-','--output','-','--outputFormat','pdf','--quiet','--pdfFit'}ifpuppeteer_config_for_mmdcthentable.insert(args,'-p')table.insert(args,puppeteer_config_for_mmdc)endlocalsuccess,pdf=pcall(pandoc.pipe,mmdc_path,args,block.text)ifnotsuccessornotpdfor#pdf==0thenio.stderr:write('[mermaid.lua] mmdc error: '..tostring(pdf)..'\n')returnnilendlocalfname=pandoc.sha1(pdf)..'.pdf'pandoc.mediabag.insert(fname,'application/pdf',pdf)localalt_raw=block.attributes.captionlocalalt=alt_rawandpandoc.utils.stringify(alt_raw)or''localimg=pandoc.Image(alt_rawor{},fname,'',block.attr)ifalt~=''thenreturnpandoc.Figure({pandoc.Plain{img}},{pandoc.Plain{pandoc.Str(alt)}},block.attr)endreturnpandoc.Para{img}endreturn{{Meta=Meta},{CodeBlock=CodeBlock},{Pandoc=Pandoc}}