From 6a5ac90bf18f46beb6df4921f428dfb48ccb1fa8 Mon Sep 17 00:00:00 2001 From: Albert Krewinkel Date: Fri, 31 Dec 2021 20:12:23 +0100 Subject: [PATCH] Lua: add `pandoc.WriterOptions` constructor --- doc/lua-filters.md | 141 +++++++++++++++++++ src/Text/Pandoc/Lua/Marshal/WriterOptions.hs | 13 +- src/Text/Pandoc/Lua/Module/Pandoc.hs | 9 ++ test/Tests/Lua.hs | 6 +- test/Tests/Lua/Module.hs | 2 + test/lua/module/globals.lua | 108 ++++++++++++++ 6 files changed, 271 insertions(+), 8 deletions(-) create mode 100644 test/lua/module/globals.lua 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 `` 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), + } +}