summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlbert Krewinkel <albert@zeitkraut.de>2021-12-31 20:12:23 +0100
committerJohn MacFarlane <jgm@berkeley.edu>2022-01-04 11:55:59 -0800
commit6a5ac90bf18f46beb6df4921f428dfb48ccb1fa8 (patch)
treeb358acdadb46c61cb06d29b88259ef4957a8d0eb
parent0d1d52f0a00753691663572da5f87dd4791d65fd (diff)
Lua: add `pandoc.WriterOptions` constructor
-rw-r--r--doc/lua-filters.md141
-rw-r--r--src/Text/Pandoc/Lua/Marshal/WriterOptions.hs13
-rw-r--r--src/Text/Pandoc/Lua/Module/Pandoc.hs9
-rw-r--r--test/Tests/Lua.hs6
-rw-r--r--test/Tests/Lua/Module.hs2
-rw-r--r--test/lua/module/globals.lua108
6 files changed, 271 insertions, 8 deletions
diff --git a/doc/lua-filters.md b/doc/lua-filters.md
index 5a8705326..9e776d954 100644
--- a/doc/lua-filters.md
+++ b/doc/lua-filters.md
@@ -261,11 +261,13 @@ variables.
`PANDOC_READER_OPTIONS`
: Table of the options which were provided to the parser.
+ ([ReaderOptions](#type-readeroptions))
`PANDOC_WRITER_OPTIONS`
: Table of the options that will be passed to the writer.
While the object can be modified, the changes will **not**
be picked up by pandoc.
+ ([WriterOptions](#type-writeroptions))
This variable is also set in custom writers.
@@ -2021,6 +2023,121 @@ Fields:
: track changes setting for docx; one of `accept-changes`,
`reject-changes`, and `all-changes` (string)
+## WriterOptions {#type-writeroptions}
+
+Pandoc writer options
+
+Fields:
+
+`cite_method`
+: How to print cites -- one of 'citeproc', 'natbib', or
+ 'biblatex' (string)
+
+`columns`
+: Characters in a line (for text wrapping) (integer)
+
+`dpi`
+: DPI for pixel to/from inch/cm conversions (integer)
+
+`email_obfuscation`
+: How to obfuscate emails -- one of 'none', 'references', or
+ 'javascript' (string)
+
+`epub_chapter_level`
+: Header level for chapters, i.e., how the document is split
+ into separate files (integer)
+
+`epub_fonts`
+: Paths to fonts to embed (sequence of strings)
+
+`epub_metadata`
+: Metadata to include in EPUB (string|nil)
+
+`epub_subdirectory`
+: Subdir for epub in OCF (string)
+
+`extensions`
+: Markdown extensions that can be used (sequence of strings)
+
+`highlight_style`
+: Style to use for highlighting; see the output of `pandoc
+ --print-highlight-style=...` for an example structure. The
+ value `nil` means that no highlighting is used. (table|nil)
+
+`html_math_method`
+: How to print math in HTML; one 'plain', 'gladtex', 'webtex',
+ 'mathml', 'mathjax', or a table with keys `method` and
+ `url`. (string|table)
+
+`html_q_tags`
+: Use `<q>` tags for quotes in HTML (boolean)
+
+`identifier_prefix`
+: Prefix for section & note ids in HTML and for footnote marks
+ in markdown (string)
+
+`incremental`
+: True if lists should be incremental (boolean)
+
+`listings`
+: Use listings package for code (boolean)
+
+`number_offset`
+: Starting number for section, subsection, ... (sequence of
+ integers)
+
+`number_sections`
+: Number sections in LaTeX (boolean)
+
+`prefer_ascii`
+: Prefer ASCII representations of characters when possible
+ (boolean)
+
+`reference_doc`
+: Path to reference document if specified (string|nil)
+
+`reference_links`
+: Use reference links in writing markdown, rst (boolean)
+
+`reference_location`
+: Location of footnotes and references for writing markdown;
+ one of 'end-of-block', 'end-of-section', 'end-of-document'.
+ The common prefix may be omitted when setting this value.
+ (string)
+
+`section_divs`
+: Put sections in div tags in HTML (boolean)
+
+`setext_headers`
+: Use setext headers for levels 1-2 in markdown (boolean)
+
+`slide_level`
+: Force header level of slides (integer\|nil)
+
+`tab_stop`
+: Tabstop for conversion btw spaces and tabs (integer)
+
+`table_of_contents`
+: Include table of contents (boolean)
+
+`toc_depth`
+: Number of levels to include in TOC (integer)
+
+`top_level_division`
+: Type of top-level divisions; one of 'top-level-part',
+ 'top-level-chapter', 'top-level-section', or
+ 'top-level-default'. The prefix `top-level` may be omitted
+ when setting this value. (string)
+
+`variables`
+: Variables to set in template; string-indexed table (table)
+
+`wrap_text`
+: Option for wrapping text; one of 'wrap-auto', 'wrap-none',
+ or 'wrap-preserve'. The `wrap-` prefix may be omitted when
+ setting this value. (string)
+
+
## CommonState {#type-commonstate}
The state used by pandoc to collect information and make it
@@ -3170,6 +3287,30 @@ format, and functions to filter and modify a subtree.
-- default reader options, but columns set to 66.
local short_colums_opts = pandoc.ReaderOptions {columns = 66}
+[`WriterOptions (opts)`]{#pandoc.writeroptions}
+
+: Creates a new [WriterOptions][] value.
+
+ Parameters
+
+ `opts`:
+ : Either a table with a subset of the properties of a
+ [WriterOptions] object, or another WriterOptions object.
+ Uses the defaults specified in the manual for all
+ properties that are not explicitly specified. Throws an
+ error if a table contains properties which are not present
+ in a WriterOptions object. ([WriterOptions]|table)
+
+ Returns: new [WriterOptions] object
+
+ Usage:
+
+ -- copy of the writer options that were defined on the command line.
+ local cli_opts = pandoc.WriterOptions(PANDOC_WRITER_OPTIONS)
+
+ -- default writer options, but DPI set to 300.
+ local short_colums_opts = pandoc.WriterOptions {dpi = 300}
+
## Helper functions
### pipe {#pandoc.pipe}
diff --git a/src/Text/Pandoc/Lua/Marshal/WriterOptions.hs b/src/Text/Pandoc/Lua/Marshal/WriterOptions.hs
index 781ae3f7c..b5b1f715e 100644
--- a/src/Text/Pandoc/Lua/Marshal/WriterOptions.hs
+++ b/src/Text/Pandoc/Lua/Marshal/WriterOptions.hs
@@ -93,7 +93,8 @@ typeWriterOptions = deftype "WriterOptions"
(pushText, writerEpubSubdirectory)
(peekText, \opts x -> opts{ writerEpubSubdirectory = x })
- , property "extensions" "Markdown extensions that can be used"
+ , property "extensions"
+ "Markdown extensions that can be used"
(pushViaJSON, writerExtensions)
(peekViaJSON, \opts x -> opts{ writerExtensions = x })
@@ -147,16 +148,16 @@ typeWriterOptions = deftype "WriterOptions"
(maybe pushnil pushString, writerReferenceDoc)
(optional . peekString, \opts x -> opts{ writerReferenceDoc = x })
- , property "reference_location"
- "Location of footnotes and references for writing markdown"
- (pushViaJSON, writerReferenceLocation)
- (peekViaJSON, \opts x -> opts{ writerReferenceLocation = x })
-
, property "reference_links"
"Use reference links in writing markdown, rst"
(pushBool, writerReferenceLinks)
(peekBool, \opts x -> opts{ writerReferenceLinks = x })
+ , property "reference_location"
+ "Location of footnotes and references for writing markdown"
+ (pushViaJSON, writerReferenceLocation)
+ (peekViaJSON, \opts x -> opts{ writerReferenceLocation = x })
+
, property "section_divs"
"Put sections in div tags in HTML"
(pushBool, writerSectionDivs)
diff --git a/src/Text/Pandoc/Lua/Module/Pandoc.hs b/src/Text/Pandoc/Lua/Module/Pandoc.hs
index e9603f827..c0127cdfe 100644
--- a/src/Text/Pandoc/Lua/Module/Pandoc.hs
+++ b/src/Text/Pandoc/Lua/Module/Pandoc.hs
@@ -34,6 +34,8 @@ import Text.Pandoc.Lua.Marshal.AST
import Text.Pandoc.Lua.Marshal.Filter (peekFilter)
import Text.Pandoc.Lua.Marshal.ReaderOptions ( peekReaderOptions
, pushReaderOptions)
+import Text.Pandoc.Lua.Marshal.WriterOptions ( peekWriterOptions
+ , pushWriterOptions)
import Text.Pandoc.Lua.Module.Utils (sha1)
import Text.Pandoc.Lua.PandocLua (PandocLua (unPandocLua), liftPandocLua)
import Text.Pandoc.Options ( ReaderOptions (readerExtensions)
@@ -129,6 +131,13 @@ otherConstructors =
<#> parameter peekReaderOptions "ReaderOptions|table" "opts" "reader options"
=#> functionResult pushReaderOptions "ReaderOptions" "new object"
#? "Creates a new ReaderOptions value."
+
+ , defun "WriterOptions"
+ ### liftPure id
+ <#> parameter peekWriterOptions "WriterOptions|table" "opts"
+ "writer options"
+ =#> functionResult pushWriterOptions "WriterOptions" "new object"
+ #? "Creates a new WriterOptions value."
]
stringConstants :: [Field e]
diff --git a/test/Tests/Lua.hs b/test/Tests/Lua.hs
index dae30c302..3381c6dbf 100644
--- a/test/Tests/Lua.hs
+++ b/test/Tests/Lua.hs
@@ -29,7 +29,7 @@ import Text.Pandoc.Definition (Attr, Block (BlockQuote, Div, Para), Pandoc,
Inline (Emph, Str), pandocTypesVersion)
import Text.Pandoc.Error (PandocError (PandocLuaError))
import Text.Pandoc.Filter (Filter (LuaFilter), applyFilters)
-import Text.Pandoc.Lua (runLua)
+import Text.Pandoc.Lua (Global (..), runLua, setGlobals)
import Text.Pandoc.Options (def)
import Text.Pandoc.Shared (pandocVersion)
@@ -239,7 +239,9 @@ assertFilterConversion msg filterPath docIn expectedDoc = do
runLuaTest :: HasCallStack => Lua.LuaE PandocError a -> IO a
runLuaTest op = runIOorExplode $ do
- res <- runLua op
+ res <- runLua $ do
+ setGlobals [ PANDOC_WRITER_OPTIONS def ]
+ op
case res of
Left e -> error (show e)
Right x -> return x
diff --git a/test/Tests/Lua/Module.hs b/test/Tests/Lua/Module.hs
index 3d3b5233b..2f1a54e5c 100644
--- a/test/Tests/Lua/Module.hs
+++ b/test/Tests/Lua/Module.hs
@@ -31,6 +31,8 @@ tests =
("lua" </> "module" </> "pandoc-types.lua")
, testPandocLua "pandoc.utils"
("lua" </> "module" </> "pandoc-utils.lua")
+ , testPandocLua "globals"
+ ("lua" </> "module" </> "globals.lua")
]
testPandocLua :: TestName -> FilePath -> TestTree
diff --git a/test/lua/module/globals.lua b/test/lua/module/globals.lua
new file mode 100644
index 000000000..85b287cf2
--- /dev/null
+++ b/test/lua/module/globals.lua
@@ -0,0 +1,108 @@
+local tasty = require 'tasty'
+
+local test = tasty.test_case
+local group = tasty.test_group
+local assert = tasty.assert
+
+-- These tests exist mainly to catch changes to the JSON representation of
+-- WriterOptions and its components. UPDATE THE DOCS if anything changes.
+return {
+ group 'PANDOC_WRITER_OPTIONS' {
+ test('cite_method', function ()
+ assert.are_equal(type(PANDOC_WRITER_OPTIONS.cite_method), 'string')
+ end),
+ test('columns', function ()
+ assert.are_equal(type(PANDOC_WRITER_OPTIONS.columns), 'number')
+ end),
+ test('dpi', function ()
+ assert.are_equal(type(PANDOC_WRITER_OPTIONS.dpi), 'number')
+ end),
+ test('email_obfuscation', function ()
+ assert.are_equal(type(PANDOC_WRITER_OPTIONS.email_obfuscation), 'string')
+ end),
+ test('epub_chapter_level', function ()
+ assert.are_equal(type(PANDOC_WRITER_OPTIONS.epub_chapter_level), 'number')
+ end),
+ test('epub_fonts', function ()
+ assert.are_equal(type(PANDOC_WRITER_OPTIONS.epub_fonts), 'table')
+ end),
+ test('epub_metadata', function ()
+ assert.are_equal(type(PANDOC_WRITER_OPTIONS.epub_metadata), 'nil')
+ end),
+ test('epub_subdirectory', function ()
+ assert.are_equal(type(PANDOC_WRITER_OPTIONS.epub_subdirectory), 'string')
+ end),
+ test('extensions', function ()
+ assert.are_equal(type(PANDOC_WRITER_OPTIONS.extensions), 'table')
+ for _, v in ipairs(PANDOC_WRITER_OPTIONS.extensions) do
+ assert.are_equal(type(v), 'string')
+ end
+ end),
+ test('highlight_style', function ()
+ assert.are_equal(type(PANDOC_WRITER_OPTIONS.highlight_style), 'table')
+ end),
+ test('html_math_method', function ()
+ assert.are_equal(type(PANDOC_WRITER_OPTIONS.html_math_method), 'string')
+ end),
+ test('html_q_tags', function ()
+ assert.are_equal(type(PANDOC_WRITER_OPTIONS.html_q_tags), 'boolean')
+ end),
+ test('identifier_prefix', function ()
+ assert.are_equal(type(PANDOC_WRITER_OPTIONS.identifier_prefix), 'string')
+ end),
+ test('incremental', function ()
+ assert.are_equal(type(PANDOC_WRITER_OPTIONS.incremental), 'boolean')
+ end),
+ test('listings', function ()
+ assert.are_equal(type(PANDOC_WRITER_OPTIONS.listings), 'boolean')
+ end),
+ test('number_offset', function ()
+ assert.are_equal(type(PANDOC_WRITER_OPTIONS.number_offset), 'table')
+ for _, v in ipairs(PANDOC_WRITER_OPTIONS.number_offset) do
+ assert.are_equal(type(v), 'number')
+ end
+ end),
+ test('number_sections', function ()
+ assert.are_equal(type(PANDOC_WRITER_OPTIONS.number_sections), 'boolean')
+ end),
+ test('prefer_ascii', function ()
+ assert.are_equal(type(PANDOC_WRITER_OPTIONS.prefer_ascii), 'boolean')
+ end),
+ test('reference_doc', function ()
+ assert.are_equal(type(PANDOC_WRITER_OPTIONS.reference_doc), 'nil')
+ end),
+ test('reference_links', function ()
+ assert.are_equal(type(PANDOC_WRITER_OPTIONS.reference_links), 'boolean')
+ end),
+ test('reference_location', function ()
+ assert.are_equal(type(PANDOC_WRITER_OPTIONS.reference_location), 'string')
+ end),
+ test('section_divs', function ()
+ assert.are_equal(type(PANDOC_WRITER_OPTIONS.section_divs), 'boolean')
+ end),
+ test('setext_headers', function ()
+ assert.are_equal(type(PANDOC_WRITER_OPTIONS.setext_headers), 'boolean')
+ end),
+ test('slide_level', function ()
+ assert.are_equal(type(PANDOC_WRITER_OPTIONS.slide_level), 'nil')
+ end),
+ test('tab_stop', function ()
+ assert.are_equal(type(PANDOC_WRITER_OPTIONS.tab_stop), 'number')
+ end),
+ test('table_of_contents', function ()
+ assert.are_equal(type(PANDOC_WRITER_OPTIONS.table_of_contents), 'boolean')
+ end),
+ test('toc_depth', function ()
+ assert.are_equal(type(PANDOC_WRITER_OPTIONS.toc_depth), 'number')
+ end),
+ test('top_level_division', function ()
+ assert.are_equal(type(PANDOC_WRITER_OPTIONS.top_level_division), 'string')
+ end),
+ test('variables', function ()
+ assert.are_equal(type(PANDOC_WRITER_OPTIONS.variables), 'table')
+ end),
+ test('wrap_text', function ()
+ assert.are_equal(type(PANDOC_WRITER_OPTIONS.wrap_text), 'string')
+ end),
+ }
+}