@@ -68,14 +68,14 @@ local mimetype = "image/svg+xml"
68
68
-- vector graphics. In these cases, we use a different format
69
69
-- such as PNG:
70
70
if FORMAT == " docx" then
71
- filetype = " png"
72
- mimetype = " image/png"
71
+ filetype = " png"
72
+ mimetype = " image/png"
73
73
elseif FORMAT == " pptx" then
74
- filetype = " png"
75
- mimetype = " image/png"
74
+ filetype = " png"
75
+ mimetype = " image/png"
76
76
elseif FORMAT == " rtf" then
77
- filetype = " png"
78
- mimetype = " image/png"
77
+ filetype = " png"
78
+ mimetype = " image/png"
79
79
end
80
80
81
81
-- Execute the meta data table to determine the paths. This function
@@ -212,46 +212,46 @@ end
212
212
-- Run Python to generate an image:
213
213
local function py2image (code , filetype )
214
214
215
- -- Define the temp files:
216
- local outfile = string.format (' %s.%s' , os.tmpname (), filetype )
217
- local pyfile = os.tmpname ()
215
+ -- Define the temp files:
216
+ local outfile = string.format (' %s.%s' , os.tmpname (), filetype )
217
+ local pyfile = os.tmpname ()
218
218
219
- -- Replace the desired destination's file type in the Python code:
220
- local extendedCode = string.gsub (code , " %$FORMAT%$" , filetype )
219
+ -- Replace the desired destination's file type in the Python code:
220
+ local extendedCode = string.gsub (code , " %$FORMAT%$" , filetype )
221
221
222
- -- Replace the desired destination's path in the Python code:
223
- extendedCode = string.gsub (extendedCode , " %$DESTINATION%$" , outfile )
222
+ -- Replace the desired destination's path in the Python code:
223
+ extendedCode = string.gsub (extendedCode , " %$DESTINATION%$" , outfile )
224
224
225
- -- Write the Python code:
226
- local f = io.open (pyfile , ' w' )
227
- f :write (extendedCode )
228
- f :close ()
225
+ -- Write the Python code:
226
+ local f = io.open (pyfile , ' w' )
227
+ f :write (extendedCode )
228
+ f :close ()
229
229
230
- -- Execute Python in the desired environment:
231
- local pycmd = python_path .. ' ' .. pyfile
232
- local command = python_activate_path
233
- and python_activate_path .. ' && ' .. pycmd
234
- or pycmd
235
- os.execute (command )
230
+ -- Execute Python in the desired environment:
231
+ local pycmd = python_path .. ' ' .. pyfile
232
+ local command = python_activate_path
233
+ and python_activate_path .. ' && ' .. pycmd
234
+ or pycmd
235
+ os.execute (command )
236
236
237
- -- Try to open the written image:
238
- local r = io.open (outfile , ' rb' )
239
- local imgData = nil
237
+ -- Try to open the written image:
238
+ local r = io.open (outfile , ' rb' )
239
+ local imgData = nil
240
240
241
- -- When the image exist, read it:
242
- if r then
243
- imgData = r :read (" *all" )
244
- r :close ()
245
- else
246
- io.stderr :write (string.format (" File '%s' could not be opened" , outfile ))
247
- error ' Could not create image from python code.'
248
- end
241
+ -- When the image exist, read it:
242
+ if r then
243
+ imgData = r :read (" *all" )
244
+ r :close ()
245
+ else
246
+ io.stderr :write (string.format (" File '%s' could not be opened" , outfile ))
247
+ error ' Could not create image from python code.'
248
+ end
249
249
250
- -- Delete the tmp files:
251
- os.remove (pyfile )
252
- os.remove (outfile )
250
+ -- Delete the tmp files:
251
+ os.remove (pyfile )
252
+ os.remove (outfile )
253
253
254
- return imgData
254
+ return imgData
255
255
end
256
256
257
257
--
@@ -300,97 +300,96 @@ end
300
300
301
301
-- Executes each document's code block to find matching code blocks:
302
302
function CodeBlock (block )
303
+ -- Predefine a potential image:
304
+ local fname = nil
305
+
306
+ -- Using a table with all known generators i.e. converters:
307
+ local converters = {
308
+ plantuml = plantuml ,
309
+ graphviz = graphviz ,
310
+ tikz = tikz2image ,
311
+ py2image = py2image ,
312
+ asymptote = asymptote ,
313
+ }
314
+
315
+ -- Check if a converter exists for this block. If not, return the block
316
+ -- unchanged.
317
+ local img_converter = converters [block .classes [1 ]]
318
+ if not img_converter then
319
+ return nil
320
+ end
303
321
304
- -- Predefine a potential image:
305
- local fname = nil
306
-
307
- -- Using a table with all known generators i.e. converters:
308
- local converters = {
309
- plantuml = plantuml ,
310
- graphviz = graphviz ,
311
- tikz = tikz2image ,
312
- py2image = py2image ,
313
- asymptote = asymptote ,
314
- }
315
-
316
- -- Check if a converter exists for this block. If not, return the block
317
- -- unchanged.
318
- local img_converter = converters [block .classes [1 ]]
319
- if not img_converter then
320
- return nil
321
- end
322
+ -- Call the correct converter which belongs to the used class:
323
+ local success , img = pcall (img_converter , block .text ,
324
+ filetype , block .attributes [" additionalPackages" ] or nil )
325
+
326
+ -- Was ok?
327
+ if success and img then
328
+ -- Hash the figure name and content:
329
+ fname = pandoc .sha1 (img ) .. " ." .. filetype
322
330
323
- -- Call the correct converter which belongs to the used class:
324
- local success , img = pcall (img_converter , block .text ,
325
- filetype , block .attributes [" additionalPackages" ] or nil )
331
+ -- Store the data in the media bag:
332
+ pandoc .mediabag .insert (fname , mimetype , img )
326
333
327
- -- Was ok?
328
- if success and img then
329
- -- Hash the figure name and content:
330
- fname = pandoc .sha1 (img ) .. " ." .. filetype
334
+ else
335
+
336
+ -- an error occured; img contains the error message
337
+ io.stderr :write (tostring (img ))
338
+ io.stderr :write (' \n ' )
339
+ error ' Image conversion failed. Aborting.'
340
+
341
+ end
331
342
332
- -- Store the data in the media bag :
333
- pandoc . mediabag . insert ( fname , mimetype , img )
343
+ -- Case: This code block was an image e.g. PlantUML or dot/Graphviz, etc. :
344
+ if fname then
334
345
335
- else
346
+ -- Define the default caption:
347
+ local caption = {}
348
+ local enableCaption = nil
336
349
337
- -- an error occured; img contains the error message
338
- io.stderr :write (tostring (img ))
339
- io.stderr :write (' \n ' )
340
- error ' Image conversion failed. Aborting.'
350
+ -- If the user defines a caption, use it:
351
+ if block .attributes [" caption" ] then
352
+ caption = pandoc .read (block .attributes .caption ).blocks [1 ].content
341
353
354
+ -- This is pandoc's current hack to enforce a caption:
355
+ enableCaption = " fig:"
342
356
end
343
357
344
- -- Case: This code block was an image e.g. PlantUML or dot/Graphviz, etc.:
345
- if fname then
346
-
347
- -- Define the default caption:
348
- local caption = {}
349
- local enableCaption = nil
350
-
351
- -- If the user defines a caption, use it:
352
- if block .attributes [" caption" ] then
353
- caption = pandoc .read (block .attributes .caption ).blocks [1 ].content
354
-
355
- -- This is pandoc's current hack to enforce a caption:
356
- enableCaption = " fig:"
357
- end
358
-
359
- -- Create a new image for the document's structure. Attach the user's
360
- -- caption. Also use a hack (fig:) to enforce pandoc to create a
361
- -- figure i.e. attach a caption to the image.
362
- local imgObj = pandoc .Image (caption , fname , enableCaption )
363
-
364
- -- Now, transfer the attribute "name" from the code block to the new
365
- -- image block. It might gets used by the figure numbering lua filter.
366
- -- If the figure numbering gets not used, this additional attribute
367
- -- gets ignored as well.
368
- if block .attributes [" name" ] then
369
- imgObj .attributes [" name" ] = block .attributes [" name" ]
370
- end
371
-
372
- -- Transfer the identifier from the code block to the new image block
373
- -- to enable downstream filters like pandoc-crossref. This allows a figure
374
- -- block starting with:
375
- --
376
- -- ```{#fig:pumlExample .plantuml caption="This is an image, created by **PlantUML**."}
377
- --
378
- -- to be referenced as @fig:pumlExample outside of the figure.
379
- if block .identifier then
380
- imgObj .identifier = block .identifier
381
- end
382
-
383
- -- Finally, put the image inside an empty paragraph. By returning the
384
- -- resulting paragraph object, the source code block gets replaced by
385
- -- the image:
386
- return pandoc .Para { imgObj }
358
+ -- Create a new image for the document's structure. Attach the user's
359
+ -- caption. Also use a hack (fig:) to enforce pandoc to create a
360
+ -- figure i.e. attach a caption to the image.
361
+ local imgObj = pandoc .Image (caption , fname , enableCaption )
362
+
363
+ -- Now, transfer the attribute "name" from the code block to the new
364
+ -- image block. It might gets used by the figure numbering lua filter.
365
+ -- If the figure numbering gets not used, this additional attribute
366
+ -- gets ignored as well.
367
+ if block .attributes [" name" ] then
368
+ imgObj .attributes [" name" ] = block .attributes [" name" ]
387
369
end
370
+
371
+ -- Transfer the identifier from the code block to the new image block
372
+ -- to enable downstream filters like pandoc-crossref. This allows a figure
373
+ -- block starting with:
374
+ --
375
+ -- ```{#fig:pumlExample .plantuml caption="This is an image, created by **PlantUML**."}
376
+ --
377
+ -- to be referenced as @fig:pumlExample outside of the figure.
378
+ if block .identifier then
379
+ imgObj .identifier = block .identifier
380
+ end
381
+
382
+ -- Finally, put the image inside an empty paragraph. By returning the
383
+ -- resulting paragraph object, the source code block gets replaced by
384
+ -- the image:
385
+ return pandoc .Para { imgObj }
386
+ end
388
387
end
389
388
390
389
-- Normally, pandoc will run the function in the built-in order Inlines ->
391
390
-- Blocks -> Meta -> Pandoc. We instead want Meta -> Blocks. Thus, we must
392
391
-- define our custom order:
393
392
return {
394
- {Meta = Meta },
395
- {CodeBlock = CodeBlock },
393
+ {Meta = Meta },
394
+ {CodeBlock = CodeBlock },
396
395
}
0 commit comments