packages feed

pandoc 2.16.2 → 2.17

raw patch · 397 files changed

+6699/−5221 lines, 397 filesdep +hslua-aesondep +pandoc-lua-marshaldep −QuickCheckdep ~citeprocdep ~commonmark-extensionsdep ~ipynbbinary-added

Dependencies added: hslua-aeson, pandoc-lua-marshal

Dependencies removed: QuickCheck

Dependency ranges changed: citeproc, commonmark-extensions, ipynb, texmath, text

Files

AUTHORS.md view
@@ -134,6 +134,7 @@ - Jan Larres - Jan Schulz - Jan Tojnar+- Jannik Buhr - Jan-Otto Kröpke - Jared Lander - Jason Ronallo@@ -141,6 +142,7 @@ - Jeff Runningen - Jens Getreu - Jens Petersen+- Jesse Hathaway - Jérémy Bobbio - Jeroen de Haas - Jerry Sky@@ -178,6 +180,7 @@ - Loïc Grobol - Lorenzo - Lucas Escot+- Lucas Viana - Luke Plant - Marc Schreiber - Mark Szepieniec@@ -250,6 +253,7 @@ - S.P.H - Salim B - Samuel Tardieu+- Saumel Lemmenmeier - Sascha Wilde - Scott Morrison - Sebastian Talmon@@ -272,6 +276,7 @@ - Thomas Hodgson - Thomas Weißschuh - Tim Lin+- Tim Wisotzki - Timm Albers - Timothy Humphries - Tiziano Müller@@ -279,6 +284,7 @@ - Tom Leese - Tristan Stenner - Tristan de Cacqueray+- Tuong Nguyen Manh - Uli Köhler - Urs Liska - Václav Haisman
@@ -1,5 +1,5 @@ Pandoc-Copyright (C) 2006-2021 John MacFarlane <jgm at berkeley dot edu>+Copyright (C) 2006-2022 John MacFarlane <jgm at berkeley dot edu>  With the exceptions noted below, this code is released under the [GPL], version 2 or later:@@ -83,19 +83,19 @@  ---------------------------------------------------------------------- src/Text/Pandoc/Writers/Texinfo.hs-Copyright (C) 2008-2021 John MacFarlane and Peter Wang+Copyright (C) 2008-2022 John MacFarlane and Peter Wang  Released under the GNU General Public License version 2 or later.  ---------------------------------------------------------------------- src/Text/Pandoc/Writers/OpenDocument.hs-Copyright (C) 2008-2021 Andrea Rossato and John MacFarlane+Copyright (C) 2008-2022 Andrea Rossato and John MacFarlane  Released under the GNU General Public License version 2 or later.  ---------------------------------------------------------------------- src/Text/Pandoc/Writers/Org.hs-Copyright (C) 2010-2021 Puneeth Chaganti, John MacFarlane, and+Copyright (C) 2010-2022 Puneeth Chaganti, John MacFarlane, and                         Albert Krewinkel  Released under the GNU General Public License version 2 or later.@@ -115,7 +115,7 @@  ---------------------------------------------------------------------- src/Text/Pandoc/Readers/Textile.hs-Copyright (C) 2010-2021 Paul Rivier and John MacFarlane+Copyright (C) 2010-2022 Paul Rivier and John MacFarlane  Released under the GNU General Public License version 2 or later. @@ -133,7 +133,7 @@  ---------------------------------------------------------------------- src/Text/Pandoc/Readers/EPUB.hs-Copyright (C) 2014-2021 Matthew Pickering and John MacFarlane+Copyright (C) 2014-2022 Matthew Pickering and John MacFarlane  Released under the GNU General Public License version 2 or later. @@ -141,7 +141,7 @@ src/Text/Pandoc/Readers/Org.hs src/Text/Pandoc/Readers/Org/* test/Tests/Readers/Org/*-Copyright (C) 2014-2021 Albert Krewinkel+Copyright (C) 2014-2022 Albert Krewinkel  Released under the GNU General Public License version 2 or later. @@ -149,7 +149,7 @@ src/Text/Pandoc/Lua.hs src/Text/Pandoc/Lua/* test/lua/*-Copyright (C) 2017--2021 Albert Krewinkel and John MacFarlane+Copyright (C) 2017--2022 Albert Krewinkel and John MacFarlane  Released under the GNU General Public License version 2 or later. @@ -157,19 +157,13 @@ src/Text/Pandoc/Readers/Jira.hs src/Text/Pandoc/Writers/Jira.hs test/Tests/Readers/Jira.hs-Copyright (C) 2019--2021 Albert Krewinkel+Copyright (C) 2019--2022 Albert Krewinkel  Released under the GNU General Public License version 2 or later.  ---------------------------------------------------------------------- src/Text/Pandoc/Readers/FB2.hs Copyright (C) 2018--2019 Alexander Krotov--Released under the GNU General Public License version 2 or later.-------------------------------------------------------------------------data/pandoc.lua-Copyright (C) 2017-2021 Albert Krewinkel  Released under the GNU General Public License version 2 or later. 
MANUAL.txt view
@@ -1,7 +1,7 @@ --- title: Pandoc User's Guide author: John MacFarlane-date: November 20, 2021+date: January 12, 2022 ---  # Synopsis@@ -316,6 +316,7 @@     - `markdown_mmd` ([MultiMarkdown])     - `markdown_phpextra` ([PHP Markdown Extra])     - `markdown_strict` (original unextended [Markdown])+    - `markua` ([Markua])     - `mediawiki` ([MediaWiki markup])     - `ms` ([roff ms])     - `muse` ([Muse]),@@ -502,6 +503,7 @@ [CSL JSON]: https://citeproc-js.readthedocs.io/en/latest/csl-json/markup.html [BibTeX]: https://ctan.org/pkg/bibtex [BibLaTeX]: https://ctan.org/pkg/biblatex+[Markua]: https://leanpub.com/markua/read  ## Reader options {.options} @@ -788,7 +790,6 @@     preserve the wrapping from the source document (that is,     where there are nonsemantic newlines in the source, there     will be nonsemantic newlines in the output as well).-    Automatic wrapping does not currently work in HTML output.     In `ipynb` output, this option affects wrapping of the     contents of markdown cells. @@ -2187,6 +2188,11 @@ :   document summary, included in LaTeX, ConTeXt, AsciiDoc, and docx     documents +`abstract-title`+:   title of abstract, currently used only in HTML and EPUB.+    This will be set automatically to a localized value,+    depending on `lang`, but can be manually overridden.+ `keywords` :   list of keywords to be included in HTML, PDF, ODT, pptx, docx     and AsciiDoc metadata; repeat as for `author`, above@@ -3161,6 +3167,15 @@ Some aspects of [Pandoc's Markdown citation syntax](#citations) are also accepted in `org` input. +#### Extension: `fancy_lists` {#org-fancy-lists}++Some aspects of [Pandoc's Markdown fancy lists](#extension-fancy_lists) are also+accepted in `org` input, mimicking the option `org-list-allow-alphabetical` in+Emacs. As in Org Mode, enabling this extension allows lowercase and uppercase+alphabetical markers for ordered lists to be parsed in addition to arabic ones.+Note that for Org, this does not include roman numerals or the `#` placeholder+that are enabled by the extension in Pandoc's Markdown.+ #### Extension: `element_citations` ####  In the `jats` output formats, this causes reference items to@@ -3181,7 +3196,7 @@  Pandoc understands an extended and slightly revised version of John Gruber's [Markdown] syntax.  This document explains the syntax,-noting differences from standard Markdown. Except where noted, these+noting differences from original Markdown. Except where noted, these differences can be suppressed by using the `markdown_strict` format instead of `markdown`. Extensions can be enabled or disabled to specify the behavior more granularly. They are described in the following. See also@@ -3256,7 +3271,7 @@  #### Extension: `blank_before_header` #### -Standard Markdown syntax does not require a blank line before a heading.+Original Markdown syntax does not require a blank line before a heading. Pandoc does require this (except, of course, at the beginning of the document). The reason for the requirement is that it is all too easy for a `#` to end up at the beginning of a line by accident (perhaps through line@@ -3397,7 +3412,7 @@  #### Extension: `blank_before_blockquote` #### -Standard Markdown syntax does not require a blank line before a+Original Markdown syntax does not require a blank line before a block quote.  Pandoc does require this (except, of course, at the beginning of the document). The reason for the requirement is that it is all too easy for a `>` to end up at the beginning@@ -3644,7 +3659,7 @@ Ordered lists work just like bulleted lists, except that the items begin with enumerators rather than bullets. -In standard Markdown, enumerators are decimal numbers followed+In original Markdown, enumerators are decimal numbers followed by a period and a space.  The numbers themselves are ignored, so there is no difference between this list: @@ -3660,7 +3675,7 @@  #### Extension: `fancy_lists` #### -Unlike standard Markdown, pandoc allows ordered list items to be marked+Unlike original Markdown, pandoc allows ordered list items to be marked with uppercase and lowercase letters and roman numerals, in addition to Arabic numerals. List markers may be enclosed in parentheses or followed by a single right-parentheses or period. They must be separated from the@@ -4055,12 +4070,12 @@     orange|3.09  The cells of pipe tables cannot contain block elements like paragraphs-and lists, and cannot span multiple lines.  If a pipe table contains a-row whose Markdown content is wider than the column width (see-`--columns`), then the table will take up the full text width and-the cell contents will wrap, with the relative cell widths determined-by the number of dashes in the line separating the table header from-the table body. (For example `---|-` would make the first column 3/4+and lists, and cannot span multiple lines.  If any line of the+markdown source is longer than the column width (see `--columns`),+then the table will take up the full text width and the cell+contents will wrap, with the relative cell widths determined by+the number of dashes in the line separating the table header+from the table body. (For example `---|-` would make the first column 3/4 and the second column 1/4 of the full text width.) On the other hand, if no lines are wider than column width, then cell contents will not be wrapped, and the cells will be sized@@ -4316,12 +4331,12 @@      <strong>hello</strong> -This rule is easier to remember than standard Markdown's rule,+This rule is easier to remember than original Markdown's rule, which allows only the following characters to be backslash-escaped:      \`*_{}[]()>#+-.! -(However, if the `markdown_strict` format is used, the standard Markdown rule+(However, if the `markdown_strict` format is used, the original Markdown rule will be used.)  A backslash-escaped space is parsed as a nonbreaking space. In TeX output,@@ -4558,7 +4573,7 @@  #### Extension: `markdown_in_html_blocks` #### -Standard Markdown allows you to include HTML "blocks":  blocks+Original Markdown allows you to include HTML "blocks":  blocks of HTML between balanced tags that are separated from the surrounding text with blank lines, and start and end at the left margin.  Within these blocks, everything is interpreted as HTML, not Markdown;@@ -4589,7 +4604,7 @@ There is one exception to this rule:  text between `<script>`, `<style>`, and `<textarea>` tags is not interpreted as Markdown. -This departure from standard Markdown should make it easier to mix+This departure from original Markdown should make it easier to mix Markdown with HTML block elements.  For example, one can surround a block of Markdown text with `<div>` tags without preventing it from being interpreted as Markdown.@@ -4845,7 +4860,7 @@     ![This image won't be a figure](/url/of/image.png)\  Note that in reveal.js slide shows, an image in a paragraph-by itself that has the `stretch` class will fill the screen,+by itself that has the `r-stretch` class will fill the screen, and the caption and figure tags will be omitted.  #### Extension: `link_attributes` ####@@ -5332,7 +5347,7 @@ Include source position attributes when parsing `commonmark`. For elements that accept attributes, a `data-pos` attribute is added; other elements are placed in a surrounding-Div or Span elemnet with a `data-pos` attribute.+Div or Span element with a `data-pos` attribute.  #### Extension: `short_subsuperscripts` #### @@ -6316,6 +6331,20 @@ only works for images; the other media elements have no native representation in pandoc's AST and requires the use of raw HTML. +## EPUB styling++By default, pandoc will include some basic styling+contained in its `epub.css` data file.  (To see this,+use `pandoc --print-default-data-file epub.css`.)+To use a different CSS file, just use the `--css` command+line option.  A few inline styles are defined in addition; these+are essential for correct formatting of pandoc's HTML output.++The `document-css` variable may be set if the more opinionated+styling of pandoc's default HTML templates is desired (and+in that case the variables defined in [Variables for HTML] may+be used to fine-tune the style).+ # Jupyter notebooks  When creating a [Jupyter notebook], pandoc will try to infer the@@ -6683,7 +6712,7 @@  # Authors -Copyright 2006--2021 John MacFarlane (jgm@berkeley.edu). Released+Copyright 2006--2022 John MacFarlane (jgm@berkeley.edu). Released under the [GPL], version 2 or greater.  This software carries no warranty of any kind.  (See COPYRIGHT for full copyright and warranty notices.) For a full list of contributors, see the file
README.md view
@@ -87,6 +87,9 @@ -   `twiki` ([TWiki     markup](https://twiki.org/cgi-bin/view/TWiki/TextFormattingRules)) -   `vimwiki` ([Vimwiki](https://vimwiki.github.io))+-   the path of a custom Lua reader, see [Custom readers and+    writers](https://pandoc.org/MANUAL.html#custom-readers-and-writers)+    below  </div> @@ -152,6 +155,7 @@     Extra](https://michelf.ca/projects/php-markdown/extra/)) -   `markdown_strict` (original unextended     [Markdown](https://daringfireball.net/projects/markdown/))+-   `markua` ([Markua](https://leanpub.com/markua/read)) -   `mediawiki` ([MediaWiki     markup](https://www.mediawiki.org/wiki/Help:Formatting)) -   `ms` ([roff ms](https://man.cx/groff_ms(7)))@@ -188,8 +192,9 @@     markup](https://www.xwiki.org/xwiki/bin/view/Documentation/UserGuide/Features/XWikiSyntax/)) -   `zimwiki` ([ZimWiki     markup](https://zim-wiki.org/manual/Help/Wiki_Syntax.html))--   the path of a custom Lua writer, see [Custom-    writers](https://pandoc.org/MANUAL.html#custom-writers) below+-   the path of a custom Lua writer, see [Custom readers and+    writers](https://pandoc.org/MANUAL.html#custom-readers-and-writers)+    below  </div> @@ -240,7 +245,7 @@  ## License -© 2006-2021 John MacFarlane (jgm@berkeley.edu). Released under the+© 2006-2022 John MacFarlane (jgm@berkeley.edu). Released under the [GPL](https://www.gnu.org/licenses/old-licenses/gpl-2.0.html "GNU General Public License"), version 2 or greater. This software carries no warranty of any kind. (See COPYRIGHT for full copyright and warranty notices.)
app/pandoc.hs view
@@ -1,6 +1,6 @@ {- |    Module      : Main-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley@edu>
benchmark/benchmark-pandoc.hs view
@@ -1,6 +1,6 @@ {-# LANGUAGE OverloadedStrings #-} {--Copyright (C) 2012-2021 John MacFarlane <jgm@berkeley.edu>+Copyright (C) 2012-2022 John MacFarlane <jgm@berkeley.edu>  This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by
cabal.project view
@@ -3,7 +3,8 @@ flags: +embed_data_files constraints: aeson >= 2.0.1.0 -source-repository-package-  type: git-  location: https://github.com/jgm/texmath.git-  tag: 674bcbaec03e5550f155623de6662953bd157625+-- source-repository-package+--   type: git+--   location: https://github.com/jgm/ipynb.git+--   tag: 00246af10885c2ad4413ace4f69a7e6c88297a08+
changelog.md view
@@ -1,4 +1,471 @@-## Revision history for pandoc+# Revision history for pandoc++## pandoc 2.17 (2022-01-12)++  * Support `markua` as an output format Add (#1871, Tim Wisotzki and+    Saumel Lemmenmeier). Markua is a markdown variant used by Leanpub.++  * Add text wrapping for HTML output (#7764). Previously the HTML writer+    was exceptional in not being sensitive to the `--wrap` option.  With+    this change `--wrap` now works for HTML. The default (as with other+    formats) is automatic wrapping.  Note that the contents of `script`,+    `textarea`, and `pre` tags are always laid out with the `flush`+    combinator, so that unwanted spaces won't be introduced if these occur+    in an indented context in a template.++  * Don't read sources until in/out format are verified (#7797).++  * Issue error with `--list-extensions` for invalid formats (#7797).++  * Make `--citeproc` recognize `.yml` as well as `.yaml` extensions+    as YAML bibliography files (#7707, Jörn Krenzer).++  * Use latest version of KaTeX with `--katex`.++  * Fix parsing of footnotes in `--metadata-file` (#7813).  Previously+    non-inline footnotes were not being parsed.++  * ODT reader:++    + Parse list-header as a list item (Tuong Nguyen Manh).++  * Commonmark reader:++    + Put sourcepos attribute on header, not enclosing div+      with `-f commonmark+sourcepos` (#7769).++  * Markdown reader:++    + Don't allow `^` at beginning of link or image label (#7723).+      This is reserved for footnotes. Fixes regression from 0a93acf.+    + Fix parsing of "bare locators" after author-in-text citations.+      Previously `@item [p. 12; @item2]` was incorrectly parsed as+      three citations rather than two.  This is now fixed by ensuring+      that `prefix` doesn't gobble any semicolons.+    + Revert changes to `inlinesInBlanacedBrackets` (commit fa83246),+      which caused regressions.+    + Improve detection of pipe table line widths (#7713).  Fixed+      calculation of maximum column widths in pipe tables.  It is+      now based on the length of the markdown line, rather than a+      "stringified" version of the parsed line.  This should be+      more predictable for users. In addition, we take into account+      double-wide characters such as emojis.++  * Custom (Lua) readers:++    + First argument is now a list of sources instead of the+      concatenated text (Albert Krewinkel).  The list+      structure can easily be converted to a string by applying+      `tostring`, but it is also possible to access the elements+      (each with a `text` and `name`). A small example is added+      to the custom reader documentation, showcasing its use in a+      reader that creates a syntax-highlighted code block for+      each source code file passed as input. Existing readers+      will still work through a fallback mechanism, issuing a+      deprecation notice.++  * Org reader:++    + Parse official org-cite citations (#7329). We also support the older+      org-ref style as a fallback. We no longer support the+      "markdown style" or "Berkeley style" citations.+    + Support alphabetical (fancy) lists (Lucas Viana). When the+      `fancy_lists` extension is enabled, alphabetical list markers are+      allowed, mimicking the behaviour of Org Mode when+      `org-list-allow-alphabetical` is enabled.+    + Support counter cookies in lists (Lucas Viana). Such cookies are+      used to override the item counter in ordered lists. In org it is+      possible to set the counter at any list item, but since Pandoc AST+      does not support this, we restrict the usage to setting an offset for+      the entire ordered list, by using the cookie in the first list item.+    + Allow trailing spaces after key/value pairs in directives (Albert+      Krewinkel). Ensures that spaces at the end of attribute directives like+      `#+ATTR_HTML: :width 100%` (note the trailing spaces) are accepted.++  * LaTeX reader:++    + Omit visible content for `\label{...}`. Previously we+      included the text of the label in square brackets, but this is+      undesirable in many cases. See discussion in+      <https://github.com/jgm/pandoc/issues/813#issuecomment-978232426>.+    + Improve references (#813). Resolve references to theorem environments.+      Remove the Span caused by "label" in figure, table, and theorem+      environments; this had an id that duplicated the environments' id.+    + Fix semantics of `\ref`. We were including the ams+      environment type in addition to the number. This is proper+      behavior for `\cref` but not for `\ref`.  To support `\cref`+      we need to store the environment label separately.+    + Add babel mappings for Guajati (gu) and Oriya (or) (#7815).+    + Fix typo `panjabi` -> `punjabi` in babel mappings (#7814).++  * HTML reader:++    + Parse attributes on links and images (#6970).++ * Docx reader:++    + Handle multiple pic elements inside a drawing (#7786).+    + Change `elemToParPart` to return `[ParPart]` instead of `ParPart`.+      Also remove `NullParPart `constructor, as it is no longer+      needed. This will allow us to handle elements that contain+      multiple ParParts, e.g. `w:drawing` elements with multiple `pic:pic`.++  * DocBook reader:++    + Collapse internal spaces in literal and other similar tags (#7821),+      as the standard docbook toolchain does.+    + Be sensitive to spacing="compact" in lists (#7799). When+      `spacing="compact"` is set, Para elements are turned into Plain,+      so we get a "tight" list.++  * Markdown writer:++    + Add new exported function `writeMarkua` from T.P.Writers.Markdown+      [API change] (#1871, Tim Wisotzki and Saumel Lemmenmeier).+    + Fix indentation issue in footnotes (#7801).+    + Avoid extra space before citation suffix if it already starts+      with a space.+    + Ensure semicolon between the locator and the next citation when an+      author-in-text citation has a locator and following citations.+    + Improve escaping for `#` (#7726).++  * Custom (Lua) writers:++    + Allow variables to be set via second return value of `Doc`+      (#6731, Albert Krewinkel). New templates variables can be added by+      giving variable-value pairs as a second return value of the+      global function `Doc`. Example:+      ```+      function Doc (body, meta, vars)+        vars.date = vars.date or os.date '%B %e, %Y'+        return body, vars+      end+      ```+    + Provide global `PANDOC_WRITER_OPTIONS` (#6731, Albert Krewinkel).+    + Assign default Pandoc object to global `PANDOC_DOCUMENT` (Albert+      Krewinkel). The default Pandoc object is now non-strict, i.e., only+      the parts of the document that are accessed will be marshaled to Lua.+      A special type is no longer necessary. This change also makes it+      possible to use the global variable with library functions such as+      `pandoc.utils.references`, or to inspect the document contents with+      `walk()`.++  * LaTeX writer:++    + Fix typo `panjabi` -> `punjabi` in babel mappings (#7814).++  * MediaWiki writer:++    + Remove redundant display text for wiki links (Jesse Hathaway).++  * Docx writer:++    + Handle bullets correctly in lists by not reusing numIds+      (#7689, Michael Hoffmann).  This fixes a bug in which a Div in+      a list item would receive bullets on its contained paragraphs.++  * Org writer:++    + Fix list items starting with a code block or other non-paragraph+      content (#7810).+    + Avoid blank lines after tight sublists (#7810).+    + Fix extra blank line inserted after empty list item (#7810).+    + Don't add blank line before lists (#7810).+    + Support starting number cookies (Lucas Viana).  This is necessary+      for lists that start at a number other than 1.+    + Support the new org-cite syntax (#7329).++  * Haddock writer:++    + Avoid blank lines after tight sublists (#7810).++  * Ipynb writer:++    + Ensure deterministic order of keys.+    + Handle cell output with raw block of markdown (#7563, Kolen Cheung).+      Write RawBlock of markdown in code-cell output. This is designed+      to fit the behavior of #7561, which makes the ipynb reader parse+      code-cell output with mime "text/markdown" to a RawBlock of markdown.+      This commit makes the ipynb writer writes this RawBlock of markdown+      back inside a code-cell output with the same mime, preserving this+      information in round-trip.+    + In choosing between multiple output options, always favor+      those marked with the output format over images (Kolen Cheung).+      Previously, both `fmt == f` case and Image have a rank of 1.++  * Ipynb reader & writer: properly handle cell "id" (#7728).+    This is passed through if it exists (in Nb4); otherwise+    the writer will add a random one so that all cells have an "id".++  * Ms writer:++    + Properly encode strings for PDF contents (#7731).++  * JATS writer:++    + Keep quotes in element-citations (Albert Krewinkel).+      Fixed a bug that lead to quote characters being lost in+      element-citations.++  * RTF writer:++    + Properly handle images in data URIs (#7771).++  * Commonmark writer:++    + Allow ')' delimiters on ordered lists.++  * RST writer:++    + Avoid extra blank line after empty list item (#7810).++  * HTML writer:++    + Make line breaks more consistent. With `--wrap=none`, we now+      output line breaks between block-level elements. Previously they+      were omitted entirely, so the whole document was on one line, unless+      there were literal line breaks in pre sections.  This makes+      the HTML writer's behavior more consistent with that of+      other writers. Also, regardless of wrap settings,+      put newline after `<dd>` and after block-level elements in+      the footnotes section. And add a line break between an `img` tag+      and the associated `figcaption`.+    + reveal.js: Make sure images with `r-stretch` are not in p tags.+      They must be direct children of the section. There was previously+      code to make this work with the older class name `stretch`, but+      the name has changed in reveal.js.+    + reveal.js:  don't add `r-fit-text` class to section. It must go on+      the header only.++  * AsciiDoc writer:++    + Improve detection of intraword emphasis (#7803).++  * OpenDocument writer:++    + Fix vertical alignment bug with display math (#7777).  Previously some+      displayed formulas would be floated above a preceding text line.+      This is fixed by setting `vertical-rel` to `text` rather than+      `paragraph-content`.++  * JATS template (Albert Krewinkel):++    + Fix position of contrib affiliations in authoring set. Any+      `<aff>` element must come before any `<email>` element.+    + Fix affiliation tagging in `articleauthoring` output.+      Affiliations were `xlink`ed even in the articleauthoring tag set, but+      `<aff>` are not allowed as children of `contrib-group` elements in that+      tag set. Each affiliation must be listed directly in the contrib+      element.+    + Add support for article subtitles.++  * EPUB template:++    + Include abstract in default template.+    + Ensure that the essential styles needed by pandoc (`styles.html`+      partial) are included in the templates. This is important for correct+      formatting of CSL bibliographies. Note that much of the styling in+      `styles.html` will be ignored for EPUB, because of the conditional on+      `document-css`.  Setting the `document-css` variable will cause it+      not to be ignored.++  * HTML template:++    + Add abstract (#7588, Jannik Buhr, John MacFarlane).  By default,+      a localized title (the word "Abstract") will be used, unless the+      variable `abstract-title` is set.++  * ConTeXt template:  Make title appear in PDF title bar.  This is+    recommended for accessibility reasons.  Note: doesn't work with macOS+    Preview.app.++  * `reference.pptx`: change to use 16:9 aspect ratio, Powerpoint's default.++  * Text.Pandoc.Writers:++    + Do not export `writeCustom` [API change]. This ensures that all+      writers exported in T.P.Writers are parameterized and work with any+      `PandocMonad` type. This is consistent with T.P.Readers, as+      `readCustom` is not exported from that module either.++  * Text.Pandoc.Writers.Shared:++    + `endsWithPlain` now returns True if the list ends with a list+      that ends with a Plain, and so on recursively (#7810).++  * Text.Pandoc.Class.IO:++    + `writeMedia`:  unescape percent-encoding in creating file path.+      This addresses a problem with spaces in image filenames+      when creating PDFs (#7819); it also affects `--extract-media`.++  * New internal module Text.Pandoc.Writers.Blaze, exporting `layoutMarkup`.+    This converts a blaze Html structure into a doclayout Doc Text.++  * Text.Pandoc.Extensions:++    + `parseFormatSpec`: cleaner error message for invalid extensions.++  * Text.Pandoc.MediaBag:++    + Fix bug in `extractMedia`, which caused the test for `..`+      in paths to fail, with the result that images with `..`+      in the path name could be extracted outside of the+      directory specified by `extractMedia`. It also led a check for+      `media` in resource paths to fail in the docx reader.++  * Text.Pandoc.Citeproc:++    + Avoid adding comma before an author-in-text citation in a note+      if it begins with a title (no author) (#7761).+    + Text.Pandoc.Citeproc.Locator now exports `toLocatorMap`,+      `LocatorInfo`, and `LocatorMap`.  The type of `parseLocator`+      has changed, so it now takes a `LocatorMap` rather than a `Locale`+      as parameter, and returns a `LocatorInfo` instead of a tuple.+    + Fix citation locator detection for German.  `toLocatorMap` now+      stores keys case-folded. We want to do a case-insensitive+      comparison when parsing locators, so that e.g. both+      `Chap.` and `chap.` work. Previously we case-folded terms+      when doing the lookup, but they weren't case-folded in the+      map itself, which led to locator-detection breaking for+      German (where the terms have uppercase letters).++  * Lua (Albert Krewinkel):++    + Allow single elements as singleton MetaBlocks/MetaInlines. Single+      elements should always be treated as singleton lists in the Lua+      subsystem.+    + Add `pandoc.template` module. The module provides a `compile`+      function to use strings as templates.+    + Add `pandoc.WriterOptions` constructor.+    + Add function `pandoc.write`.+    + Provide global `PANDOC_WRITER_OPTIONS` (#5221).+    + The function Text.Pandoc.Filter.applyFilters now takes a filter+      environment of type `Environment`, instead of a ReaderOptions value+      [API change].+    + The `Environment` type is exported from Text.Pandoc.Filter+      and allows to combine ReaderOptions and WriterOptions in a single+      value [API change].+    + Global, exported from Text.Pandoc.Lua, has a new type constructor+      `PANDOC_WRITER_OPTIONS` [API change].+    + Add constructors `pandoc.Blocks` and `pandoc.Inlines`.+      The functions convert their argument into a list of Block and Inline+      values, respectively. When applied to a string, they split the+      string into `Str` elements separated by `Space` or `SoftBreak`+      (#7712).+    + Support topdown traversals The traversal order of filters can now+      be selected by setting the key `traverse` of the filter to either+      `'topdown'` or `'typewise'`; the default remains `'typewise'`.+      Topdown traversals can be cut short by returning `false` as a+      second value from the filter function. No child-element of the+      returned element is processed in that case.+    + Marshal ReaderOptions field `extensions`, `track_changes` via JSON.+      Extensions are now available as a list of strings; the track-changes+      settings are given as the kebab-case representation used in JSON.+    + Allow binary (byte string) readers to be used with `pandoc.read`.+    + Use global state when parsing documents in `pandoc.read`.+      The function `pandoc.read` is updated to use the same state that was+      used while parsing the main input files. This ensures that log+      messages are preserved and that images embedded in the input are+      added to the mediabag.+    + Cleanup stack in `peekReadOptionsTable`. A ReaderOptions element was+      left on top of the stack when the `peekReadOptionsTable` function+      was invoked.+    + `walk` methods are added to `Pandoc`, `Block`, `Inline`,+      `Blocks`, `Inlines` values; the methods are similar to+      `pandoc.utils.walk_block` and `pandoc.utils.walk_inline`, but+      apply to filter to the element's contents.+    + Functions of name `Doc` are no longer accepted as alternatives for+      `Pandoc` filter functions. This functionality was undocumented.+    + Improve handling of empty caption, body by `from_simple_table`+      #7776). Create truly empty table caption and body when these are+      empty in the simple table.+    + Change representation of `TableHead`, `TableFoot`, and `Row` values+      (#7718).  The objects now also follow the principle that element+      attributes are accessible through the `.attr` field. Rows in `TableHead`+      and `TableFoot` are available via the `.rows` field. Row objects have a+      `.cells` field, containing the list of table cells.+    + Simplify code of `pandoc.utils.stringify`. Minor behavior change:+      plain strings nested in tables are now included in the result string.+    + Simplify and deprecate function `pandoc.utils.equals`. The function+      is no longer required for element comparisons; it is now an alias+      for the `==` operator.+    + Add function `pandoc.utils.references` (#7752).+    + Add new library function `pandoc.utils.type`.  The function behaves+      like the default `type` function from Lua's standard library,+      but is aware of pandoc userdata types. A typical use-case would be+      to determine the type of a metadata value.+    + Fix return types of `blocks_to_inlines`, `make_sections`.+      Ensures the returned lists have the correct type (`Inlines` and+      `Blocks`, respectively).+    + Use more natural representation for Reference values+      Omit `false` boolean values, push integers as numbers.++  * Lua: use package pandoc-lua-marshal (#7719, Albert Krewinkel).+    The marshaling functions for pandoc's AST are extracted into a separate+    package. The package comes with a number of changes:++    + Pandoc's List module was rewritten in C, and error messages were+      improved.+    + Lists of `Block` and `Inline` elements are marshaled using the new+      list types `Blocks` and `Inlines`, respectively. These types+      currently behave identical to the generic List type, but give better+      error messages. This also opens up the possibility of adding+      element-specific methods to these lists in the future.+    + Elements of type `MetaValue` are no longer pushed as values which+      have `.t` and `.tag` properties. This was already true for+      `MetaString` and `MetaBool` values, which are still marshaled as Lua+      strings and booleans, respectively. Affected values:+      - `MetaBlocks` values are marshaled as a `Blocks` list;+      - `MetaInlines` values are marshaled as a `Inlines` list;+      - `MetaList` values are marshaled as a generic pandoc `List`s.+      - `MetaMap` values are marshaled as plain tables and no longer+        given any metatable.+    + `Cell` values are now marshaled as userdata objects; a constructor+      function for table cells is provided as `pandoc.Cell`.+    + The test suite for marshaled objects and their constructors has+      been extended and improved.+    + A bug in `Citation` objects, where setting a citation's suffix+      modified it's prefix, has been fixed.+    + Inlines, Blocks, and List objects now have an `__eq` metamethod,+      testing equality by comparing two lists element-wise.++  * Powerpoint tests: shorten lines by grouping tests (Albert+    Krewinkel). This makes the test output more pleasant to read+    in narrow terminal windows.++  * make check: check for unreleased dependencies.++  * Add `tools/build-and-upload-api-docs.sh`.++  * Update cabal description.++  * `MANUAL.txt`: Add section on EPUB styling.++  * `MANUAL.txt`: clarify "standard Markdown" as "original Markdown"+    (#7802, Martin Fischer).++  * `doc/custom-writers.md`: use filter to include source of example.++  * Add an example to `doc/custom-readers.md`.++  * Fix typo in `custom-readers.md` (#7722, Mauro Bieg).++  * `doc/jats.md`: add link to JATS documentation (Martin Fischer).++  * `doc/lua-filters.md`: many improvements (Albert Krewinkel,+    John MacFarlane).++  * Use commonmark-extensions 0.2.3. This allows a bare-word class attribute+    on fenced divs.++  * Use ipynb 0.2.++  * Use citeproc 0.6.0.1.++  * Use texmath 0.12.4.++  * Use doctemplates 0.10.0.1.  ## pandoc 2.16.2 (2021-11-21) 
data/creole.lua view
@@ -186,5 +186,5 @@ }  function Reader(input, reader_options)-  return lpeg.match(G, input)+  return lpeg.match(G, tostring(input)) end
− data/pandoc.List.lua
@@ -1,142 +0,0 @@---[[-List.lua--Copyright © 2017–2020 Albert Krewinkel--Permission to use, copy, modify, and/or distribute this software for any-purpose with or without fee is hereby granted, provided that the above-copyright notice and this permission notice appear in all copies.--THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF-OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ]]----- Pandoc's List type and helper methods--- @classmod pandoc.List--- @author Albert Krewinkel--- @copyright © 2017–2020 Albert Krewinkel--- @license MIT-local List = {-  _VERSION = "1.0.0"-}----- Create a new list.--- @param[opt] o table that should be altered into a list (default: `{}`)--- @return the altered input table-function List:new (o)-  o = o or {}-  setmetatable(o, self)-  self.__index = self-  return o-end----- Concatenates two lists.--- @param list second list concatenated to the first--- @return a new list containing all elements from list1 and list2-function List:__concat (list)-  local res = List.clone(self)-  List.extend(res, list)-  return res-end----- Returns a (shallow) copy of the list.-function List:clone ()-  local lst = setmetatable({}, getmetatable(self))-  List.extend(lst, self)-  return lst-end----- Adds the given list to the end of this list.--- @param list list to appended-function List:extend (list)-  for i = 1, #list do-    self[#self + 1] = list[i]-  end-end----- Returns a new list containing all items satisfying a given condition.--- @param pred condition items must satisfy.--- @return a new list containing all items for which `test` was true.-function List:filter (pred)-  local res = setmetatable({}, getmetatable(self))-  for i = 1, #self do-    if pred(self[i], i) then-      res[#res + 1] = self[i]-    end-  end-  return res-end----- Returns the value and index of the first occurrence of the given item.--- @param needle item to search for--- @param[opt] init index at which the search is started (default: 1)--- @return first item equal to the needle, or nil if no such item exists.--- @return index of that element-function List:find (needle, init)-  return List.find_if(self, function(x) return x == needle end, init)-end----- Returns the value and index of the first element for which the predicate---- holds true.--- @param pred the predicate function--- @param[opt] init index at which the search is started (default: 1)--- @return first item for which `test` succeeds, or nil if no such item exists.--- @return index of that element-function List:find_if (pred, init)-  init = (init == nil and 1) or (init < 0 and #self - init) or init-  for i = init, #self do-    if pred(self[i], i) then-      return self[i], i-    end-  end-  return nil-end----- Checks if the list has an item equal to the given needle.--- @param needle item to search for--- @param[opt] init index at which the search is started; defaults to 1.--- @return true if a list item is equal to the needle, false otherwise-function List:includes (needle, init)-  return not (List.find(self, needle, init) == nil)-end----- Insert an element into the list. Alias for `table.insert`.--- @param list list--- @param[opt] pos position at which the new element is to be inserted--- @param value value to insert-List.insert = table.insert----- Returns a copy of the current list by applying the given function to--- all elements.--- @param fn function which is applied to all list items.-function List:map (fn)-  local res = setmetatable({}, getmetatable(self))-  for i = 1, #self do-    res[i] = fn(self[i], i)-  end-  return res-end----- Remove element from list (alias for `table.remove`)--- @param list list--- @param[opt] pos position of the element to be removed (default: #list)--- @return the removed element-List.remove = table.remove----- Sort list in-place (alias for `table.sort`)--- @param list list--- @param[opt] comp comparison function; default to `<` operator.-List.sort = table.sort---- Set metatable with __call metamethod. This allows the use of `List`--- as a constructor function.-local ListMT = {-  __call = List.new-}-setmetatable(List, ListMT)--return List
− data/pandoc.lua
@@ -1,247 +0,0 @@---[[-pandoc.lua--Copyright © 2017–2019 Albert Krewinkel--Permission to use, copy, modify, and/or distribute this software for any purpose-with or without fee is hereby granted, provided that the above copyright notice-and this permission notice appear in all copies.--THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH-REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND-FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,-INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS-OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER-TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF-THIS SOFTWARE.-]]-------- Lua functions for pandoc scripts.------ @author Albert Krewinkel--- @copyright © 2017–2019 Albert Krewinkel--- @license MIT-local M = {}---- Re-export bundled modules-M.List = require 'pandoc.List'-M.mediabag = require 'pandoc.mediabag'-M.path = require 'pandoc.path'-M.system = require 'pandoc.system'-M.types = require 'pandoc.types'-M.utils = require 'pandoc.utils'-M.text = require 'text'---- Local names for modules which this module depends on.-local List = M.List-local utils = M.utils------------------------------------------------------------------------------ Accessor objects------ Create metatables which allow to access numerical indices via accessor--- methods.--- @section--- @local----- Create a new table which allows to access numerical indices via accessor--- functions.--- @local-local function create_accessor_behavior (tag)-  local behavior = {tag = tag}-  behavior.__eq = utils.equals-  behavior.__index = function(t, k)-    if k == "t" then-      return getmetatable(t)["tag"]-    end-    return getmetatable(t)[k]-  end-  behavior.__pairs = function (t)-    return next, t-  end-  return behavior-end------------------------------------------------------------------------------ The base class for types--- @type Type--- @local-local Type = {}-Type.name = 'Type'-Type.__index = Type-Type.behavior = {-  __type = Type,-  new = function (obj)-    obj = obj or {}-    setmetatable(obj, self)-    return obj-  end-}-Type.behavior.__index = Type.behavior----- Set a new behavior for the type, inheriting that of the parent type if none---- is specified explicitly--- @param behavior the behavior object for this type.--- @local-function Type:set_behavior (behavior)-  behavior = behavior or {}-  behavior.__index = rawget(behavior, '__index') or behavior-  behavior.__type = self-  if not getmetatable(behavior) and getmetatable(self) then-    setmetatable(behavior, getmetatable(self).behavior)-  end-  self.behavior = behavior-end----- Create a new subtype, using the given table as base.--- @param name name of the new type--- @param[opt] behavior behavioral object for the new type.--- @return a new type--- @local-function Type:make_subtype(name, behavior)-  local newtype = setmetatable({}, self)-  newtype.name = name-  newtype.__index = newtype-  newtype:set_behavior(behavior)-  return newtype-end------------------------------------------------------------------------------ The base class for pandoc's AST elements.--- @type AstElement--- @local-local AstElement = Type:make_subtype 'AstElement'-AstElement.__call = function(t, ...)-  local success, ret = pcall(t.new, t, ...)-  if success then-    return setmetatable(ret, t.behavior)-  else-    error(string.format('Constructor for %s failed: %s\n', t.name, ret))-  end-end----- Make a new subtype which constructs a new value when called.--- @local-function AstElement:make_subtype(...)-  local newtype = Type.make_subtype(self, ...)-  newtype.__call = self.__call-  return newtype-end----- Create a new constructor--- @local--- @param tag Tag used to identify the constructor--- @param fn Function to be called when constructing a new element--- @param accessors names to use as accessors for numerical fields--- @return function that constructs a new element-function AstElement:create_constructor(tag, fn)-  local constr = self:make_subtype(tag, create_accessor_behavior(tag))-  function constr:new(...)-    return setmetatable(fn(...), self.behavior)-  end-  self.constructor = self.constructor or {}-  self.constructor[tag] = constr-  return constr-end----- Convert AstElement input into a list if necessary.--- @local-local function ensureList (x)-  if x.tag then-    -- Lists are not tagged, but all elements are-    return List:new{x}-  else-    return List:new(x)-  end-end----- Ensure a given object is an Inline element, or convert it into one.--- @local-local function ensureInlineList (x)-  if type(x) == 'string' then-    return List:new{M.Str(x)}-  else-    return ensureList(x)-  end-end----------------------------------------------------------------------------- Meta--- @section Meta----- Create a new Meta object. It sets the metatable of the given table to---- `Meta`.--- @function Meta--- @tparam meta table table containing document meta information-M.Meta = AstElement:make_subtype'Meta'-M.Meta.behavior.clone = M.types.clone.Meta-function M.Meta:new (meta) return meta end------------------------------------------------------------------------------ MetaValue--- @section MetaValue-M.MetaValue = AstElement:make_subtype('MetaValue')-M.MetaValue.behavior.clone = M.types.clone.MetaValue----- Meta blocks--- @function MetaBlocks--- @tparam {Block,...} blocks blocks-M.MetaBlocks = M.MetaValue:create_constructor(-  'MetaBlocks',-  function (content) return ensureList(content) end-)----- Meta inlines--- @function MetaInlines--- @tparam {Inline,...} inlines inlines-M.MetaInlines = M.MetaValue:create_constructor(-  'MetaInlines',-  function (content) return ensureInlineList(content) end-)----- Meta list--- @function MetaList--- @tparam {MetaValue,...} meta_values list of meta values-M.MetaList = M.MetaValue:create_constructor(-  'MetaList',-  function (content)-    if content.tag == 'MetaList' then-      return content-    end-    return ensureList(content)-  end-)-for k, v in pairs(List) do-  M.MetaList.behavior[k] = v-end----- Meta map--- @function MetaMap--- @tparam table key_value_map a string-indexed map of meta values-M.MetaMap = M.MetaValue:create_constructor(-  "MetaMap",-  function (mm) return mm end-)----- Creates string to be used in meta data.--- Does nothing, lua strings are meta strings.--- @function MetaString--- @tparam string str string value-function M.MetaString(str)-  return str-end----- Creates boolean to be used in meta data.--- Does nothing, lua booleans are meta booleans.--- @function MetaBool--- @tparam boolean bool boolean value-function M.MetaBool(bool)-  return bool-end--return M
data/pptx/docProps/app.xml view
@@ -1,2 +1,2 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"><TotalTime>2</TotalTime><Words>49</Words><Application>Microsoft Office PowerPoint</Application><PresentationFormat>On-screen Show (4:3)</PresentationFormat><Paragraphs>15</Paragraphs><Slides>4</Slides><Notes>2</Notes><HiddenSlides>0</HiddenSlides><MMClips>0</MMClips><ScaleCrop>false</ScaleCrop><HeadingPairs><vt:vector size="6" baseType="variant"><vt:variant><vt:lpstr>Fonts Used</vt:lpstr></vt:variant><vt:variant><vt:i4>2</vt:i4></vt:variant><vt:variant><vt:lpstr>Theme</vt:lpstr></vt:variant><vt:variant><vt:i4>1</vt:i4></vt:variant><vt:variant><vt:lpstr>Slide Titles</vt:lpstr></vt:variant><vt:variant><vt:i4>4</vt:i4></vt:variant></vt:vector></HeadingPairs><TitlesOfParts><vt:vector size="7" baseType="lpstr"><vt:lpstr>Arial</vt:lpstr><vt:lpstr>Calibri</vt:lpstr><vt:lpstr>Office Theme</vt:lpstr><vt:lpstr>Presentation Title</vt:lpstr><vt:lpstr>Slide Title</vt:lpstr><vt:lpstr>Section header</vt:lpstr><vt:lpstr>Slide Title for Two-Content</vt:lpstr></vt:vector></TitlesOfParts><Company></Company><LinksUpToDate>false</LinksUpToDate><SharedDoc>false</SharedDoc><HyperlinksChanged>false</HyperlinksChanged><AppVersion>15.0000</AppVersion></Properties>+<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"><TotalTime>2</TotalTime><Words>49</Words><Application>Microsoft Macintosh PowerPoint</Application><PresentationFormat>On-screen Show (16:9)</PresentationFormat><Paragraphs>15</Paragraphs><Slides>4</Slides><Notes>2</Notes><HiddenSlides>0</HiddenSlides><MMClips>0</MMClips><ScaleCrop>false</ScaleCrop><HeadingPairs><vt:vector size="6" baseType="variant"><vt:variant><vt:lpstr>Fonts Used</vt:lpstr></vt:variant><vt:variant><vt:i4>2</vt:i4></vt:variant><vt:variant><vt:lpstr>Theme</vt:lpstr></vt:variant><vt:variant><vt:i4>1</vt:i4></vt:variant><vt:variant><vt:lpstr>Slide Titles</vt:lpstr></vt:variant><vt:variant><vt:i4>4</vt:i4></vt:variant></vt:vector></HeadingPairs><TitlesOfParts><vt:vector size="7" baseType="lpstr"><vt:lpstr>Arial</vt:lpstr><vt:lpstr>Calibri</vt:lpstr><vt:lpstr>Office Theme</vt:lpstr><vt:lpstr>Presentation Title</vt:lpstr><vt:lpstr>Slide Title</vt:lpstr><vt:lpstr>Section header</vt:lpstr><vt:lpstr>Slide Title for Two-Content</vt:lpstr></vt:vector></TitlesOfParts><Company></Company><LinksUpToDate>false</LinksUpToDate><SharedDoc>false</SharedDoc><HyperlinksChanged>false</HyperlinksChanged><AppVersion>16.0000</AppVersion></Properties>
data/pptx/docProps/core.xml view
@@ -1,2 +1,2 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dcmitype="http://purl.org/dc/dcmitype/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><dc:title>Title</dc:title><dc:creator>Jesse Rosenthal</dc:creator><cp:lastModifiedBy>Jesse Rosenthal</cp:lastModifiedBy><cp:revision>4</cp:revision><dcterms:created xsi:type="dcterms:W3CDTF">2017-06-05T14:10:58Z</dcterms:created><dcterms:modified xsi:type="dcterms:W3CDTF">2019-04-05T11:11:56Z</dcterms:modified></cp:coreProperties>+<cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dcmitype="http://purl.org/dc/dcmitype/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><dc:title>Title</dc:title><dc:creator>Jesse Rosenthal</dc:creator><cp:lastModifiedBy>Jesse Rosenthal</cp:lastModifiedBy><cp:revision>5</cp:revision><dcterms:created xsi:type="dcterms:W3CDTF">2017-06-05T14:10:58Z</dcterms:created><dcterms:modified xsi:type="dcterms:W3CDTF">2022-01-02T22:49:03Z</dcterms:modified></cp:coreProperties>
data/pptx/ppt/notesMasters/notesMaster1.xml view
@@ -1,2 +1,2 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<p:notesMaster xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main"><p:cSld><p:bg><p:bgRef idx="1001"><a:schemeClr val="bg1"/></p:bgRef></p:bg><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Header Placeholder 1"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="hdr" sz="quarter"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="2971800" cy="458788"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></p:spPr><p:txBody><a:bodyPr vert="horz" lIns="91440" tIns="45720" rIns="91440" bIns="45720" rtlCol="0"/><a:lstStyle><a:lvl1pPr algn="l"><a:defRPr sz="1200"/></a:lvl1pPr></a:lstStyle><a:p><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Date Placeholder 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="dt" idx="1"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="3884613" y="0"/><a:ext cx="2971800" cy="458788"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></p:spPr><p:txBody><a:bodyPr vert="horz" lIns="91440" tIns="45720" rIns="91440" bIns="45720" rtlCol="0"/><a:lstStyle><a:lvl1pPr algn="r"><a:defRPr sz="1200"/></a:lvl1pPr></a:lstStyle><a:p><a:fld id="{0F9C1CCF-B725-44A7-AA57-5E433BD85C9F}" type="datetimeFigureOut"><a:rPr lang="en-US" smtClean="0"/><a:t>4/5/2019</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="4" name="Slide Image Placeholder 3"/><p:cNvSpPr><a:spLocks noGrp="1" noRot="1" noChangeAspect="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldImg" idx="2"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="1371600" y="1143000"/><a:ext cx="4114800" cy="3086100"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom><a:noFill/><a:ln w="12700"><a:solidFill><a:prstClr val="black"/></a:solidFill></a:ln></p:spPr><p:txBody><a:bodyPr vert="horz" lIns="91440" tIns="45720" rIns="91440" bIns="45720" rtlCol="0" anchor="ctr"/><a:lstStyle/><a:p><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="5" name="Notes Placeholder 4"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="body" sz="quarter" idx="3"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="685800" y="4400550"/><a:ext cx="5486400" cy="3600450"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></p:spPr><p:txBody><a:bodyPr vert="horz" lIns="91440" tIns="45720" rIns="91440" bIns="45720" rtlCol="0"/><a:lstStyle/><a:p><a:pPr lvl="0"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Click to edit Master text styles</a:t></a:r></a:p><a:p><a:pPr lvl="1"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Second level</a:t></a:r></a:p><a:p><a:pPr lvl="2"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Third level</a:t></a:r></a:p><a:p><a:pPr lvl="3"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Fourth level</a:t></a:r></a:p><a:p><a:pPr lvl="4"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Fifth level</a:t></a:r><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="6" name="Footer Placeholder 5"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="ftr" sz="quarter" idx="4"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="0" y="8685213"/><a:ext cx="2971800" cy="458787"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></p:spPr><p:txBody><a:bodyPr vert="horz" lIns="91440" tIns="45720" rIns="91440" bIns="45720" rtlCol="0" anchor="b"/><a:lstStyle><a:lvl1pPr algn="l"><a:defRPr sz="1200"/></a:lvl1pPr></a:lstStyle><a:p><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="7" name="Slide Number Placeholder 6"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldNum" sz="quarter" idx="5"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="3884613" y="8685213"/><a:ext cx="2971800" cy="458787"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></p:spPr><p:txBody><a:bodyPr vert="horz" lIns="91440" tIns="45720" rIns="91440" bIns="45720" rtlCol="0" anchor="b"/><a:lstStyle><a:lvl1pPr algn="r"><a:defRPr sz="1200"/></a:lvl1pPr></a:lstStyle><a:p><a:fld id="{18BDFEC3-8487-43E8-A154-7C12CBC1FFF2}" type="slidenum"><a:rPr lang="en-US" smtClean="0"/><a:t>‹#›</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="3782709779"/></p:ext></p:extLst></p:cSld><p:clrMap bg1="lt1" tx1="dk1" bg2="lt2" tx2="dk2" accent1="accent1" accent2="accent2" accent3="accent3" accent4="accent4" accent5="accent5" accent6="accent6" hlink="hlink" folHlink="folHlink"/><p:notesStyle><a:lvl1pPr marL="0" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1200" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl1pPr><a:lvl2pPr marL="457200" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1200" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl2pPr><a:lvl3pPr marL="914400" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1200" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl3pPr><a:lvl4pPr marL="1371600" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1200" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl4pPr><a:lvl5pPr marL="1828800" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1200" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl5pPr><a:lvl6pPr marL="2286000" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1200" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl6pPr><a:lvl7pPr marL="2743200" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1200" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl7pPr><a:lvl8pPr marL="3200400" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1200" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl8pPr><a:lvl9pPr marL="3657600" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1200" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl9pPr></p:notesStyle></p:notesMaster>+<p:notesMaster xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main"><p:cSld><p:bg><p:bgRef idx="1001"><a:schemeClr val="bg1"/></p:bgRef></p:bg><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Header Placeholder 1"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="hdr" sz="quarter"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="2971800" cy="458788"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></p:spPr><p:txBody><a:bodyPr vert="horz" lIns="91440" tIns="45720" rIns="91440" bIns="45720" rtlCol="0"/><a:lstStyle><a:lvl1pPr algn="l"><a:defRPr sz="1200"/></a:lvl1pPr></a:lstStyle><a:p><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Date Placeholder 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="dt" idx="1"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="3884613" y="0"/><a:ext cx="2971800" cy="458788"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></p:spPr><p:txBody><a:bodyPr vert="horz" lIns="91440" tIns="45720" rIns="91440" bIns="45720" rtlCol="0"/><a:lstStyle><a:lvl1pPr algn="r"><a:defRPr sz="1200"/></a:lvl1pPr></a:lstStyle><a:p><a:fld id="{0F9C1CCF-B725-44A7-AA57-5E433BD85C9F}" type="datetimeFigureOut"><a:rPr lang="en-US" smtClean="0"/><a:t>1/2/22</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="4" name="Slide Image Placeholder 3"/><p:cNvSpPr><a:spLocks noGrp="1" noRot="1" noChangeAspect="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldImg" idx="2"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="685800" y="1143000"/><a:ext cx="5486400" cy="3086100"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom><a:noFill/><a:ln w="12700"><a:solidFill><a:prstClr val="black"/></a:solidFill></a:ln></p:spPr><p:txBody><a:bodyPr vert="horz" lIns="91440" tIns="45720" rIns="91440" bIns="45720" rtlCol="0" anchor="ctr"/><a:lstStyle/><a:p><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="5" name="Notes Placeholder 4"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="body" sz="quarter" idx="3"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="685800" y="4400550"/><a:ext cx="5486400" cy="3600450"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></p:spPr><p:txBody><a:bodyPr vert="horz" lIns="91440" tIns="45720" rIns="91440" bIns="45720" rtlCol="0"/><a:lstStyle/><a:p><a:pPr lvl="0"/><a:r><a:rPr lang="en-US"/><a:t>Click to edit Master text styles</a:t></a:r></a:p><a:p><a:pPr lvl="1"/><a:r><a:rPr lang="en-US"/><a:t>Second level</a:t></a:r></a:p><a:p><a:pPr lvl="2"/><a:r><a:rPr lang="en-US"/><a:t>Third level</a:t></a:r></a:p><a:p><a:pPr lvl="3"/><a:r><a:rPr lang="en-US"/><a:t>Fourth level</a:t></a:r></a:p><a:p><a:pPr lvl="4"/><a:r><a:rPr lang="en-US"/><a:t>Fifth level</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="6" name="Footer Placeholder 5"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="ftr" sz="quarter" idx="4"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="0" y="8685213"/><a:ext cx="2971800" cy="458787"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></p:spPr><p:txBody><a:bodyPr vert="horz" lIns="91440" tIns="45720" rIns="91440" bIns="45720" rtlCol="0" anchor="b"/><a:lstStyle><a:lvl1pPr algn="l"><a:defRPr sz="1200"/></a:lvl1pPr></a:lstStyle><a:p><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="7" name="Slide Number Placeholder 6"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldNum" sz="quarter" idx="5"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="3884613" y="8685213"/><a:ext cx="2971800" cy="458787"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></p:spPr><p:txBody><a:bodyPr vert="horz" lIns="91440" tIns="45720" rIns="91440" bIns="45720" rtlCol="0" anchor="b"/><a:lstStyle><a:lvl1pPr algn="r"><a:defRPr sz="1200"/></a:lvl1pPr></a:lstStyle><a:p><a:fld id="{18BDFEC3-8487-43E8-A154-7C12CBC1FFF2}" type="slidenum"><a:rPr lang="en-US" smtClean="0"/><a:t>‹#›</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="3782709779"/></p:ext></p:extLst></p:cSld><p:clrMap bg1="lt1" tx1="dk1" bg2="lt2" tx2="dk2" accent1="accent1" accent2="accent2" accent3="accent3" accent4="accent4" accent5="accent5" accent6="accent6" hlink="hlink" folHlink="folHlink"/><p:notesStyle><a:lvl1pPr marL="0" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1200" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl1pPr><a:lvl2pPr marL="457200" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1200" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl2pPr><a:lvl3pPr marL="914400" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1200" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl3pPr><a:lvl4pPr marL="1371600" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1200" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl4pPr><a:lvl5pPr marL="1828800" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1200" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl5pPr><a:lvl6pPr marL="2286000" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1200" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl6pPr><a:lvl7pPr marL="2743200" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1200" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl7pPr><a:lvl8pPr marL="3200400" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1200" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl8pPr><a:lvl9pPr marL="3657600" algn="l" defTabSz="914400" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1200" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl9pPr></p:notesStyle></p:notesMaster>
data/pptx/ppt/notesSlides/notesSlide1.xml view
@@ -1,2 +1,2 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<p:notes xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main"><p:cSld><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Slide Image Placeholder 1"/><p:cNvSpPr><a:spLocks noGrp="1" noRot="1" noChangeAspect="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldImg"/></p:nvPr></p:nvSpPr><p:spPr/></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Notes Placeholder 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="body" idx="1"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang="en-US" dirty="0" smtClean="0"/><a:t>Here</a:t></a:r><a:r><a:rPr lang="en-US" baseline="0" dirty="0" smtClean="0"/><a:t> is a note</a:t></a:r></a:p><a:p><a:endParaRPr lang="en-US" baseline="0" dirty="0" smtClean="0"/></a:p><a:p><a:r><a:rPr lang="en-US" baseline="0" dirty="0" smtClean="0"/><a:t>With another paragraph.</a:t></a:r><a:endParaRPr lang="en-US" dirty="0"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="4" name="Slide Number Placeholder 3"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldNum" sz="quarter" idx="10"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{18BDFEC3-8487-43E8-A154-7C12CBC1FFF2}" type="slidenum"><a:rPr lang="en-US" smtClean="0"/><a:t>1</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="3171319170"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:notes>+<p:notes xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main"><p:cSld><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Slide Image Placeholder 1"/><p:cNvSpPr><a:spLocks noGrp="1" noRot="1" noChangeAspect="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldImg"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="685800" y="1143000"/><a:ext cx="5486400" cy="3086100"/></a:xfrm></p:spPr></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Notes Placeholder 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="body" idx="1"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang="en-US" dirty="0"/><a:t>Here</a:t></a:r><a:r><a:rPr lang="en-US" baseline="0" dirty="0"/><a:t> is a note</a:t></a:r></a:p><a:p><a:endParaRPr lang="en-US" baseline="0" dirty="0"/></a:p><a:p><a:r><a:rPr lang="en-US" baseline="0" dirty="0"/><a:t>With another paragraph.</a:t></a:r><a:endParaRPr lang="en-US" dirty="0"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="4" name="Slide Number Placeholder 3"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldNum" sz="quarter" idx="10"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{18BDFEC3-8487-43E8-A154-7C12CBC1FFF2}" type="slidenum"><a:rPr lang="en-US" smtClean="0"/><a:t>1</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="3171319170"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:notes>
data/pptx/ppt/notesSlides/notesSlide2.xml view
@@ -1,2 +1,2 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<p:notes xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main"><p:cSld><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Slide Image Placeholder 1"/><p:cNvSpPr><a:spLocks noGrp="1" noRot="1" noChangeAspect="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldImg"/></p:nvPr></p:nvSpPr><p:spPr/></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Notes Placeholder 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="body" idx="1"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang="en-US" dirty="0" smtClean="0"/><a:t>A</a:t></a:r><a:r><a:rPr lang="en-US" baseline="0" dirty="0" smtClean="0"/><a:t> speaker note on </a:t></a:r><a:r><a:rPr lang="en-US" baseline="0" smtClean="0"/><a:t>this slide too.</a:t></a:r><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="4" name="Slide Number Placeholder 3"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldNum" sz="quarter" idx="10"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{18BDFEC3-8487-43E8-A154-7C12CBC1FFF2}" type="slidenum"><a:rPr lang="en-US" smtClean="0"/><a:t>2</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="3016900036"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:notes>+<p:notes xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main"><p:cSld><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Slide Image Placeholder 1"/><p:cNvSpPr><a:spLocks noGrp="1" noRot="1" noChangeAspect="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldImg"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="685800" y="1143000"/><a:ext cx="5486400" cy="3086100"/></a:xfrm></p:spPr></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Notes Placeholder 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="body" idx="1"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang="en-US" dirty="0"/><a:t>A</a:t></a:r><a:r><a:rPr lang="en-US" baseline="0" dirty="0"/><a:t> speaker note on </a:t></a:r><a:r><a:rPr lang="en-US" baseline="0"/><a:t>this slide too.</a:t></a:r><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="4" name="Slide Number Placeholder 3"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldNum" sz="quarter" idx="10"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{18BDFEC3-8487-43E8-A154-7C12CBC1FFF2}" type="slidenum"><a:rPr lang="en-US" smtClean="0"/><a:t>2</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="3016900036"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:notes>
data/pptx/ppt/presentation.xml view
@@ -1,2 +1,2 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<p:presentation xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" saveSubsetFonts="1" autoCompressPictures="0"><p:sldMasterIdLst><p:sldMasterId id="2147483648" r:id="rId1"/></p:sldMasterIdLst><p:notesMasterIdLst><p:notesMasterId r:id="rId6"/></p:notesMasterIdLst><p:sldIdLst><p:sldId id="256" r:id="rId2"/><p:sldId id="257" r:id="rId3"/><p:sldId id="258" r:id="rId4"/><p:sldId id="259" r:id="rId5"/></p:sldIdLst><p:sldSz cx="9144000" cy="6858000" type="screen4x3"/><p:notesSz cx="6858000" cy="9144000"/><p:defaultTextStyle><a:defPPr><a:defRPr lang="en-US"/></a:defPPr><a:lvl1pPr marL="0" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl1pPr><a:lvl2pPr marL="457200" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl2pPr><a:lvl3pPr marL="914400" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl3pPr><a:lvl4pPr marL="1371600" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl4pPr><a:lvl5pPr marL="1828800" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl5pPr><a:lvl6pPr marL="2286000" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl6pPr><a:lvl7pPr marL="2743200" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl7pPr><a:lvl8pPr marL="3200400" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl8pPr><a:lvl9pPr marL="3657600" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl9pPr></p:defaultTextStyle><p:extLst><p:ext uri="{EFAFB233-063F-42B5-8137-9DF3F51BA10A}"><p15:sldGuideLst xmlns:p15="http://schemas.microsoft.com/office/powerpoint/2012/main"><p15:guide id="1" orient="horz" pos="2160"><p15:clr><a:srgbClr val="A4A3A4"/></p15:clr></p15:guide><p15:guide id="2" pos="2880"><p15:clr><a:srgbClr val="A4A3A4"/></p15:clr></p15:guide></p15:sldGuideLst></p:ext></p:extLst></p:presentation>+<p:presentation xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" saveSubsetFonts="1" autoCompressPictures="0"><p:sldMasterIdLst><p:sldMasterId id="2147483648" r:id="rId1"/></p:sldMasterIdLst><p:notesMasterIdLst><p:notesMasterId r:id="rId6"/></p:notesMasterIdLst><p:sldIdLst><p:sldId id="256" r:id="rId2"/><p:sldId id="257" r:id="rId3"/><p:sldId id="258" r:id="rId4"/><p:sldId id="259" r:id="rId5"/></p:sldIdLst><p:sldSz cx="9144000" cy="5143500" type="screen16x9"/><p:notesSz cx="6858000" cy="9144000"/><p:defaultTextStyle><a:defPPr><a:defRPr lang="en-US"/></a:defPPr><a:lvl1pPr marL="0" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl1pPr><a:lvl2pPr marL="457200" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl2pPr><a:lvl3pPr marL="914400" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl3pPr><a:lvl4pPr marL="1371600" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl4pPr><a:lvl5pPr marL="1828800" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl5pPr><a:lvl6pPr marL="2286000" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl6pPr><a:lvl7pPr marL="2743200" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl7pPr><a:lvl8pPr marL="3200400" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl8pPr><a:lvl9pPr marL="3657600" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl9pPr></p:defaultTextStyle><p:extLst><p:ext uri="{EFAFB233-063F-42B5-8137-9DF3F51BA10A}"><p15:sldGuideLst xmlns:p15="http://schemas.microsoft.com/office/powerpoint/2012/main"><p15:guide id="1" orient="horz" pos="1620" userDrawn="1"><p15:clr><a:srgbClr val="A4A3A4"/></p15:clr></p15:guide><p15:guide id="2" pos="2880" userDrawn="1"><p15:clr><a:srgbClr val="A4A3A4"/></p15:clr></p15:guide></p15:sldGuideLst></p:ext></p:extLst></p:presentation>
data/pptx/ppt/slideLayouts/slideLayout1.xml view
@@ -1,2 +1,2 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<p:sldLayout xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" type="title" preserve="1"><p:cSld name="Title Slide"><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Title 1"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="ctrTitle"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="685800" y="2130425"/><a:ext cx="7772400" cy="1470025"/></a:xfrm></p:spPr><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Click to edit Master title style</a:t></a:r><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Subtitle 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="subTitle" idx="1"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="1371600" y="3886200"/><a:ext cx="6400800" cy="1752600"/></a:xfrm></p:spPr><p:txBody><a:bodyPr/><a:lstStyle><a:lvl1pPr marL="0" indent="0" algn="ctr"><a:buNone/><a:defRPr><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl1pPr><a:lvl2pPr marL="457200" indent="0" algn="ctr"><a:buNone/><a:defRPr><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl2pPr><a:lvl3pPr marL="914400" indent="0" algn="ctr"><a:buNone/><a:defRPr><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl3pPr><a:lvl4pPr marL="1371600" indent="0" algn="ctr"><a:buNone/><a:defRPr><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl4pPr><a:lvl5pPr marL="1828800" indent="0" algn="ctr"><a:buNone/><a:defRPr><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl5pPr><a:lvl6pPr marL="2286000" indent="0" algn="ctr"><a:buNone/><a:defRPr><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl6pPr><a:lvl7pPr marL="2743200" indent="0" algn="ctr"><a:buNone/><a:defRPr><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl7pPr><a:lvl8pPr marL="3200400" indent="0" algn="ctr"><a:buNone/><a:defRPr><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl8pPr><a:lvl9pPr marL="3657600" indent="0" algn="ctr"><a:buNone/><a:defRPr><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl9pPr></a:lstStyle><a:p><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Click to edit Master subtitle style</a:t></a:r><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="4" name="Date Placeholder 3"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="dt" sz="half" idx="10"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{241EB5C9-1307-BA42-ABA2-0BC069CD8E7F}" type="datetimeFigureOut"><a:rPr lang="en-US" smtClean="0"/><a:t>4/5/2019</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="5" name="Footer Placeholder 4"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="ftr" sz="quarter" idx="11"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="6" name="Slide Number Placeholder 5"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldNum" sz="quarter" idx="12"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{C5EF2332-01BF-834F-8236-50238282D533}" type="slidenum"><a:rPr lang="en-US" smtClean="0"/><a:t>‹#›</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="1444357513"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sldLayout>+<p:sldLayout xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" type="title" preserve="1"><p:cSld name="Title Slide"><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Title 1"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="ctrTitle"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="685800" y="1597819"/><a:ext cx="7772400" cy="1102519"/></a:xfrm></p:spPr><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang="en-US"/><a:t>Click to edit Master title style</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Subtitle 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="subTitle" idx="1"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="1371600" y="2914650"/><a:ext cx="6400800" cy="1314450"/></a:xfrm></p:spPr><p:txBody><a:bodyPr/><a:lstStyle><a:lvl1pPr marL="0" indent="0" algn="ctr"><a:buNone/><a:defRPr><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl1pPr><a:lvl2pPr marL="342900" indent="0" algn="ctr"><a:buNone/><a:defRPr><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl2pPr><a:lvl3pPr marL="685800" indent="0" algn="ctr"><a:buNone/><a:defRPr><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl3pPr><a:lvl4pPr marL="1028700" indent="0" algn="ctr"><a:buNone/><a:defRPr><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl4pPr><a:lvl5pPr marL="1371600" indent="0" algn="ctr"><a:buNone/><a:defRPr><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl5pPr><a:lvl6pPr marL="1714500" indent="0" algn="ctr"><a:buNone/><a:defRPr><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl6pPr><a:lvl7pPr marL="2057400" indent="0" algn="ctr"><a:buNone/><a:defRPr><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl7pPr><a:lvl8pPr marL="2400300" indent="0" algn="ctr"><a:buNone/><a:defRPr><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl8pPr><a:lvl9pPr marL="2743200" indent="0" algn="ctr"><a:buNone/><a:defRPr><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl9pPr></a:lstStyle><a:p><a:r><a:rPr lang="en-US"/><a:t>Click to edit Master subtitle style</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="4" name="Date Placeholder 3"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="dt" sz="half" idx="10"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{241EB5C9-1307-BA42-ABA2-0BC069CD8E7F}" type="datetimeFigureOut"><a:rPr lang="en-US" smtClean="0"/><a:t>1/2/22</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="5" name="Footer Placeholder 4"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="ftr" sz="quarter" idx="11"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="6" name="Slide Number Placeholder 5"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldNum" sz="quarter" idx="12"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{C5EF2332-01BF-834F-8236-50238282D533}" type="slidenum"><a:rPr lang="en-US" smtClean="0"/><a:t>‹#›</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="1444357513"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sldLayout>
data/pptx/ppt/slideLayouts/slideLayout10.xml view
@@ -1,2 +1,2 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<p:sldLayout xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" type="vertTx" preserve="1"><p:cSld name="Title and Vertical Text"><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Title 1"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="title"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Click to edit Master title style</a:t></a:r><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Vertical Text Placeholder 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="body" orient="vert" idx="1"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr vert="eaVert"/><a:lstStyle/><a:p><a:pPr lvl="0"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Click to edit Master text styles</a:t></a:r></a:p><a:p><a:pPr lvl="1"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Second level</a:t></a:r></a:p><a:p><a:pPr lvl="2"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Third level</a:t></a:r></a:p><a:p><a:pPr lvl="3"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Fourth level</a:t></a:r></a:p><a:p><a:pPr lvl="4"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Fifth level</a:t></a:r><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="4" name="Date Placeholder 3"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="dt" sz="half" idx="10"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{241EB5C9-1307-BA42-ABA2-0BC069CD8E7F}" type="datetimeFigureOut"><a:rPr lang="en-US" smtClean="0"/><a:t>4/5/2019</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="5" name="Footer Placeholder 4"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="ftr" sz="quarter" idx="11"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="6" name="Slide Number Placeholder 5"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldNum" sz="quarter" idx="12"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{C5EF2332-01BF-834F-8236-50238282D533}" type="slidenum"><a:rPr lang="en-US" smtClean="0"/><a:t>‹#›</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="313914798"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sldLayout>+<p:sldLayout xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" type="vertTx" preserve="1"><p:cSld name="Title and Vertical Text"><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Title 1"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="title"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang="en-US"/><a:t>Click to edit Master title style</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Vertical Text Placeholder 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="body" orient="vert" idx="1"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr vert="eaVert"/><a:lstStyle/><a:p><a:pPr lvl="0"/><a:r><a:rPr lang="en-US"/><a:t>Click to edit Master text styles</a:t></a:r></a:p><a:p><a:pPr lvl="1"/><a:r><a:rPr lang="en-US"/><a:t>Second level</a:t></a:r></a:p><a:p><a:pPr lvl="2"/><a:r><a:rPr lang="en-US"/><a:t>Third level</a:t></a:r></a:p><a:p><a:pPr lvl="3"/><a:r><a:rPr lang="en-US"/><a:t>Fourth level</a:t></a:r></a:p><a:p><a:pPr lvl="4"/><a:r><a:rPr lang="en-US"/><a:t>Fifth level</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="4" name="Date Placeholder 3"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="dt" sz="half" idx="10"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{241EB5C9-1307-BA42-ABA2-0BC069CD8E7F}" type="datetimeFigureOut"><a:rPr lang="en-US" smtClean="0"/><a:t>1/2/22</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="5" name="Footer Placeholder 4"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="ftr" sz="quarter" idx="11"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="6" name="Slide Number Placeholder 5"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldNum" sz="quarter" idx="12"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{C5EF2332-01BF-834F-8236-50238282D533}" type="slidenum"><a:rPr lang="en-US" smtClean="0"/><a:t>‹#›</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="313914798"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sldLayout>
data/pptx/ppt/slideLayouts/slideLayout11.xml view
@@ -1,2 +1,2 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<p:sldLayout xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" type="vertTitleAndTx" preserve="1"><p:cSld name="Vertical Title and Text"><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Vertical Title 1"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="title" orient="vert"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="6629400" y="274638"/><a:ext cx="2057400" cy="5851525"/></a:xfrm></p:spPr><p:txBody><a:bodyPr vert="eaVert"/><a:lstStyle/><a:p><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Click to edit Master title style</a:t></a:r><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Vertical Text Placeholder 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="body" orient="vert" idx="1"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="457200" y="274638"/><a:ext cx="6019800" cy="5851525"/></a:xfrm></p:spPr><p:txBody><a:bodyPr vert="eaVert"/><a:lstStyle/><a:p><a:pPr lvl="0"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Click to edit Master text styles</a:t></a:r></a:p><a:p><a:pPr lvl="1"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Second level</a:t></a:r></a:p><a:p><a:pPr lvl="2"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Third level</a:t></a:r></a:p><a:p><a:pPr lvl="3"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Fourth level</a:t></a:r></a:p><a:p><a:pPr lvl="4"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Fifth level</a:t></a:r><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="4" name="Date Placeholder 3"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="dt" sz="half" idx="10"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{241EB5C9-1307-BA42-ABA2-0BC069CD8E7F}" type="datetimeFigureOut"><a:rPr lang="en-US" smtClean="0"/><a:t>4/5/2019</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="5" name="Footer Placeholder 4"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="ftr" sz="quarter" idx="11"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="6" name="Slide Number Placeholder 5"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldNum" sz="quarter" idx="12"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{C5EF2332-01BF-834F-8236-50238282D533}" type="slidenum"><a:rPr lang="en-US" smtClean="0"/><a:t>‹#›</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="2581529045"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sldLayout>+<p:sldLayout xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" type="vertTitleAndTx" preserve="1"><p:cSld name="Vertical Title and Text"><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Vertical Title 1"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="title" orient="vert"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="6629400" y="205979"/><a:ext cx="2057400" cy="4388644"/></a:xfrm></p:spPr><p:txBody><a:bodyPr vert="eaVert"/><a:lstStyle/><a:p><a:r><a:rPr lang="en-US"/><a:t>Click to edit Master title style</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Vertical Text Placeholder 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="body" orient="vert" idx="1"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="457200" y="205979"/><a:ext cx="6019800" cy="4388644"/></a:xfrm></p:spPr><p:txBody><a:bodyPr vert="eaVert"/><a:lstStyle/><a:p><a:pPr lvl="0"/><a:r><a:rPr lang="en-US"/><a:t>Click to edit Master text styles</a:t></a:r></a:p><a:p><a:pPr lvl="1"/><a:r><a:rPr lang="en-US"/><a:t>Second level</a:t></a:r></a:p><a:p><a:pPr lvl="2"/><a:r><a:rPr lang="en-US"/><a:t>Third level</a:t></a:r></a:p><a:p><a:pPr lvl="3"/><a:r><a:rPr lang="en-US"/><a:t>Fourth level</a:t></a:r></a:p><a:p><a:pPr lvl="4"/><a:r><a:rPr lang="en-US"/><a:t>Fifth level</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="4" name="Date Placeholder 3"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="dt" sz="half" idx="10"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{241EB5C9-1307-BA42-ABA2-0BC069CD8E7F}" type="datetimeFigureOut"><a:rPr lang="en-US" smtClean="0"/><a:t>1/2/22</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="5" name="Footer Placeholder 4"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="ftr" sz="quarter" idx="11"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="6" name="Slide Number Placeholder 5"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldNum" sz="quarter" idx="12"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{C5EF2332-01BF-834F-8236-50238282D533}" type="slidenum"><a:rPr lang="en-US" smtClean="0"/><a:t>‹#›</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="2581529045"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sldLayout>
data/pptx/ppt/slideLayouts/slideLayout2.xml view
@@ -1,2 +1,2 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<p:sldLayout xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" type="obj" preserve="1"><p:cSld name="Title and Content"><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Title 1"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="title"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Click to edit Master title style</a:t></a:r><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Content Placeholder 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph idx="1"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:pPr lvl="0"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Click to edit Master text styles</a:t></a:r></a:p><a:p><a:pPr lvl="1"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Second level</a:t></a:r></a:p><a:p><a:pPr lvl="2"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Third level</a:t></a:r></a:p><a:p><a:pPr lvl="3"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Fourth level</a:t></a:r></a:p><a:p><a:pPr lvl="4"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Fifth level</a:t></a:r><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="4" name="Date Placeholder 3"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="dt" sz="half" idx="10"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{241EB5C9-1307-BA42-ABA2-0BC069CD8E7F}" type="datetimeFigureOut"><a:rPr lang="en-US" smtClean="0"/><a:t>4/5/2019</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="5" name="Footer Placeholder 4"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="ftr" sz="quarter" idx="11"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="6" name="Slide Number Placeholder 5"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldNum" sz="quarter" idx="12"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{C5EF2332-01BF-834F-8236-50238282D533}" type="slidenum"><a:rPr lang="en-US" smtClean="0"/><a:t>‹#›</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="338346009"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sldLayout>+<p:sldLayout xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" type="obj" preserve="1"><p:cSld name="Title and Content"><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Title 1"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="title"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang="en-US"/><a:t>Click to edit Master title style</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Content Placeholder 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph idx="1"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:pPr lvl="0"/><a:r><a:rPr lang="en-US"/><a:t>Click to edit Master text styles</a:t></a:r></a:p><a:p><a:pPr lvl="1"/><a:r><a:rPr lang="en-US"/><a:t>Second level</a:t></a:r></a:p><a:p><a:pPr lvl="2"/><a:r><a:rPr lang="en-US"/><a:t>Third level</a:t></a:r></a:p><a:p><a:pPr lvl="3"/><a:r><a:rPr lang="en-US"/><a:t>Fourth level</a:t></a:r></a:p><a:p><a:pPr lvl="4"/><a:r><a:rPr lang="en-US"/><a:t>Fifth level</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="4" name="Date Placeholder 3"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="dt" sz="half" idx="10"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{241EB5C9-1307-BA42-ABA2-0BC069CD8E7F}" type="datetimeFigureOut"><a:rPr lang="en-US" smtClean="0"/><a:t>1/2/22</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="5" name="Footer Placeholder 4"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="ftr" sz="quarter" idx="11"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="6" name="Slide Number Placeholder 5"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldNum" sz="quarter" idx="12"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{C5EF2332-01BF-834F-8236-50238282D533}" type="slidenum"><a:rPr lang="en-US" smtClean="0"/><a:t>‹#›</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="338346009"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sldLayout>
data/pptx/ppt/slideLayouts/slideLayout3.xml view
@@ -1,2 +1,2 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<p:sldLayout xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" type="secHead" preserve="1"><p:cSld name="Section Header"><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Title 1"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="title"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="722313" y="4406900"/><a:ext cx="7772400" cy="1362075"/></a:xfrm></p:spPr><p:txBody><a:bodyPr anchor="t"/><a:lstStyle><a:lvl1pPr algn="l"><a:defRPr sz="4000" b="1" cap="all"/></a:lvl1pPr></a:lstStyle><a:p><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Click to edit Master title style</a:t></a:r><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Text Placeholder 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="body" idx="1"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="722313" y="2906713"/><a:ext cx="7772400" cy="1500187"/></a:xfrm></p:spPr><p:txBody><a:bodyPr anchor="b"/><a:lstStyle><a:lvl1pPr marL="0" indent="0"><a:buNone/><a:defRPr sz="2000"><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl1pPr><a:lvl2pPr marL="457200" indent="0"><a:buNone/><a:defRPr sz="1800"><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl2pPr><a:lvl3pPr marL="914400" indent="0"><a:buNone/><a:defRPr sz="1600"><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl3pPr><a:lvl4pPr marL="1371600" indent="0"><a:buNone/><a:defRPr sz="1400"><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl4pPr><a:lvl5pPr marL="1828800" indent="0"><a:buNone/><a:defRPr sz="1400"><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl5pPr><a:lvl6pPr marL="2286000" indent="0"><a:buNone/><a:defRPr sz="1400"><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl6pPr><a:lvl7pPr marL="2743200" indent="0"><a:buNone/><a:defRPr sz="1400"><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl7pPr><a:lvl8pPr marL="3200400" indent="0"><a:buNone/><a:defRPr sz="1400"><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl8pPr><a:lvl9pPr marL="3657600" indent="0"><a:buNone/><a:defRPr sz="1400"><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl9pPr></a:lstStyle><a:p><a:pPr lvl="0"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Click to edit Master text styles</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="4" name="Date Placeholder 3"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="dt" sz="half" idx="10"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{241EB5C9-1307-BA42-ABA2-0BC069CD8E7F}" type="datetimeFigureOut"><a:rPr lang="en-US" smtClean="0"/><a:t>4/5/2019</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="5" name="Footer Placeholder 4"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="ftr" sz="quarter" idx="11"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="6" name="Slide Number Placeholder 5"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldNum" sz="quarter" idx="12"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{C5EF2332-01BF-834F-8236-50238282D533}" type="slidenum"><a:rPr lang="en-US" smtClean="0"/><a:t>‹#›</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="1073069076"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sldLayout>+<p:sldLayout xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" type="secHead" preserve="1"><p:cSld name="Section Header"><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Title 1"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="title"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="722313" y="3305176"/><a:ext cx="7772400" cy="1021556"/></a:xfrm></p:spPr><p:txBody><a:bodyPr anchor="t"/><a:lstStyle><a:lvl1pPr algn="l"><a:defRPr sz="3000" b="1" cap="all"/></a:lvl1pPr></a:lstStyle><a:p><a:r><a:rPr lang="en-US"/><a:t>Click to edit Master title style</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Text Placeholder 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="body" idx="1"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="722313" y="2180035"/><a:ext cx="7772400" cy="1125140"/></a:xfrm></p:spPr><p:txBody><a:bodyPr anchor="b"/><a:lstStyle><a:lvl1pPr marL="0" indent="0"><a:buNone/><a:defRPr sz="1500"><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl1pPr><a:lvl2pPr marL="342900" indent="0"><a:buNone/><a:defRPr sz="1350"><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl2pPr><a:lvl3pPr marL="685800" indent="0"><a:buNone/><a:defRPr sz="1200"><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl3pPr><a:lvl4pPr marL="1028700" indent="0"><a:buNone/><a:defRPr sz="1050"><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl4pPr><a:lvl5pPr marL="1371600" indent="0"><a:buNone/><a:defRPr sz="1050"><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl5pPr><a:lvl6pPr marL="1714500" indent="0"><a:buNone/><a:defRPr sz="1050"><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl6pPr><a:lvl7pPr marL="2057400" indent="0"><a:buNone/><a:defRPr sz="1050"><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl7pPr><a:lvl8pPr marL="2400300" indent="0"><a:buNone/><a:defRPr sz="1050"><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl8pPr><a:lvl9pPr marL="2743200" indent="0"><a:buNone/><a:defRPr sz="1050"><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl9pPr></a:lstStyle><a:p><a:pPr lvl="0"/><a:r><a:rPr lang="en-US"/><a:t>Click to edit Master text styles</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="4" name="Date Placeholder 3"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="dt" sz="half" idx="10"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{241EB5C9-1307-BA42-ABA2-0BC069CD8E7F}" type="datetimeFigureOut"><a:rPr lang="en-US" smtClean="0"/><a:t>1/2/22</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="5" name="Footer Placeholder 4"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="ftr" sz="quarter" idx="11"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="6" name="Slide Number Placeholder 5"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldNum" sz="quarter" idx="12"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{C5EF2332-01BF-834F-8236-50238282D533}" type="slidenum"><a:rPr lang="en-US" smtClean="0"/><a:t>‹#›</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="1073069076"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sldLayout>
data/pptx/ppt/slideLayouts/slideLayout4.xml view
@@ -1,2 +1,2 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<p:sldLayout xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" type="twoObj" preserve="1"><p:cSld name="Two Content"><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Title 1"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="title"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Click to edit Master title style</a:t></a:r><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Content Placeholder 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph sz="half" idx="1"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="457200" y="1600200"/><a:ext cx="4038600" cy="4525963"/></a:xfrm></p:spPr><p:txBody><a:bodyPr/><a:lstStyle><a:lvl1pPr><a:defRPr sz="2800"/></a:lvl1pPr><a:lvl2pPr><a:defRPr sz="2400"/></a:lvl2pPr><a:lvl3pPr><a:defRPr sz="2000"/></a:lvl3pPr><a:lvl4pPr><a:defRPr sz="1800"/></a:lvl4pPr><a:lvl5pPr><a:defRPr sz="1800"/></a:lvl5pPr><a:lvl6pPr><a:defRPr sz="1800"/></a:lvl6pPr><a:lvl7pPr><a:defRPr sz="1800"/></a:lvl7pPr><a:lvl8pPr><a:defRPr sz="1800"/></a:lvl8pPr><a:lvl9pPr><a:defRPr sz="1800"/></a:lvl9pPr></a:lstStyle><a:p><a:pPr lvl="0"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Click to edit Master text styles</a:t></a:r></a:p><a:p><a:pPr lvl="1"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Second level</a:t></a:r></a:p><a:p><a:pPr lvl="2"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Third level</a:t></a:r></a:p><a:p><a:pPr lvl="3"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Fourth level</a:t></a:r></a:p><a:p><a:pPr lvl="4"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Fifth level</a:t></a:r><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="4" name="Content Placeholder 3"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph sz="half" idx="2"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="4648200" y="1600200"/><a:ext cx="4038600" cy="4525963"/></a:xfrm></p:spPr><p:txBody><a:bodyPr/><a:lstStyle><a:lvl1pPr><a:defRPr sz="2800"/></a:lvl1pPr><a:lvl2pPr><a:defRPr sz="2400"/></a:lvl2pPr><a:lvl3pPr><a:defRPr sz="2000"/></a:lvl3pPr><a:lvl4pPr><a:defRPr sz="1800"/></a:lvl4pPr><a:lvl5pPr><a:defRPr sz="1800"/></a:lvl5pPr><a:lvl6pPr><a:defRPr sz="1800"/></a:lvl6pPr><a:lvl7pPr><a:defRPr sz="1800"/></a:lvl7pPr><a:lvl8pPr><a:defRPr sz="1800"/></a:lvl8pPr><a:lvl9pPr><a:defRPr sz="1800"/></a:lvl9pPr></a:lstStyle><a:p><a:pPr lvl="0"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Click to edit Master text styles</a:t></a:r></a:p><a:p><a:pPr lvl="1"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Second level</a:t></a:r></a:p><a:p><a:pPr lvl="2"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Third level</a:t></a:r></a:p><a:p><a:pPr lvl="3"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Fourth level</a:t></a:r></a:p><a:p><a:pPr lvl="4"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Fifth level</a:t></a:r><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="5" name="Date Placeholder 4"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="dt" sz="half" idx="10"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{241EB5C9-1307-BA42-ABA2-0BC069CD8E7F}" type="datetimeFigureOut"><a:rPr lang="en-US" smtClean="0"/><a:t>4/5/2019</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="6" name="Footer Placeholder 5"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="ftr" sz="quarter" idx="11"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="7" name="Slide Number Placeholder 6"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldNum" sz="quarter" idx="12"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{C5EF2332-01BF-834F-8236-50238282D533}" type="slidenum"><a:rPr lang="en-US" smtClean="0"/><a:t>‹#›</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="2619886245"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sldLayout>+<p:sldLayout xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" type="twoObj" preserve="1"><p:cSld name="Two Content"><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Title 1"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="title"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang="en-US"/><a:t>Click to edit Master title style</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Content Placeholder 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph sz="half" idx="1"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="457200" y="1200151"/><a:ext cx="4038600" cy="3394472"/></a:xfrm></p:spPr><p:txBody><a:bodyPr/><a:lstStyle><a:lvl1pPr><a:defRPr sz="2100"/></a:lvl1pPr><a:lvl2pPr><a:defRPr sz="1800"/></a:lvl2pPr><a:lvl3pPr><a:defRPr sz="1500"/></a:lvl3pPr><a:lvl4pPr><a:defRPr sz="1350"/></a:lvl4pPr><a:lvl5pPr><a:defRPr sz="1350"/></a:lvl5pPr><a:lvl6pPr><a:defRPr sz="1350"/></a:lvl6pPr><a:lvl7pPr><a:defRPr sz="1350"/></a:lvl7pPr><a:lvl8pPr><a:defRPr sz="1350"/></a:lvl8pPr><a:lvl9pPr><a:defRPr sz="1350"/></a:lvl9pPr></a:lstStyle><a:p><a:pPr lvl="0"/><a:r><a:rPr lang="en-US"/><a:t>Click to edit Master text styles</a:t></a:r></a:p><a:p><a:pPr lvl="1"/><a:r><a:rPr lang="en-US"/><a:t>Second level</a:t></a:r></a:p><a:p><a:pPr lvl="2"/><a:r><a:rPr lang="en-US"/><a:t>Third level</a:t></a:r></a:p><a:p><a:pPr lvl="3"/><a:r><a:rPr lang="en-US"/><a:t>Fourth level</a:t></a:r></a:p><a:p><a:pPr lvl="4"/><a:r><a:rPr lang="en-US"/><a:t>Fifth level</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="4" name="Content Placeholder 3"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph sz="half" idx="2"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="4648200" y="1200151"/><a:ext cx="4038600" cy="3394472"/></a:xfrm></p:spPr><p:txBody><a:bodyPr/><a:lstStyle><a:lvl1pPr><a:defRPr sz="2100"/></a:lvl1pPr><a:lvl2pPr><a:defRPr sz="1800"/></a:lvl2pPr><a:lvl3pPr><a:defRPr sz="1500"/></a:lvl3pPr><a:lvl4pPr><a:defRPr sz="1350"/></a:lvl4pPr><a:lvl5pPr><a:defRPr sz="1350"/></a:lvl5pPr><a:lvl6pPr><a:defRPr sz="1350"/></a:lvl6pPr><a:lvl7pPr><a:defRPr sz="1350"/></a:lvl7pPr><a:lvl8pPr><a:defRPr sz="1350"/></a:lvl8pPr><a:lvl9pPr><a:defRPr sz="1350"/></a:lvl9pPr></a:lstStyle><a:p><a:pPr lvl="0"/><a:r><a:rPr lang="en-US"/><a:t>Click to edit Master text styles</a:t></a:r></a:p><a:p><a:pPr lvl="1"/><a:r><a:rPr lang="en-US"/><a:t>Second level</a:t></a:r></a:p><a:p><a:pPr lvl="2"/><a:r><a:rPr lang="en-US"/><a:t>Third level</a:t></a:r></a:p><a:p><a:pPr lvl="3"/><a:r><a:rPr lang="en-US"/><a:t>Fourth level</a:t></a:r></a:p><a:p><a:pPr lvl="4"/><a:r><a:rPr lang="en-US"/><a:t>Fifth level</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="5" name="Date Placeholder 4"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="dt" sz="half" idx="10"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{241EB5C9-1307-BA42-ABA2-0BC069CD8E7F}" type="datetimeFigureOut"><a:rPr lang="en-US" smtClean="0"/><a:t>1/2/22</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="6" name="Footer Placeholder 5"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="ftr" sz="quarter" idx="11"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="7" name="Slide Number Placeholder 6"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldNum" sz="quarter" idx="12"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{C5EF2332-01BF-834F-8236-50238282D533}" type="slidenum"><a:rPr lang="en-US" smtClean="0"/><a:t>‹#›</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="2619886245"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sldLayout>
data/pptx/ppt/slideLayouts/slideLayout5.xml view
@@ -1,2 +1,2 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<p:sldLayout xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" type="twoTxTwoObj" preserve="1"><p:cSld name="Comparison"><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Title 1"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="title"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle><a:lvl1pPr><a:defRPr/></a:lvl1pPr></a:lstStyle><a:p><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Click to edit Master title style</a:t></a:r><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Text Placeholder 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="body" idx="1"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="457200" y="1535113"/><a:ext cx="4040188" cy="639762"/></a:xfrm></p:spPr><p:txBody><a:bodyPr anchor="b"/><a:lstStyle><a:lvl1pPr marL="0" indent="0"><a:buNone/><a:defRPr sz="2400" b="1"/></a:lvl1pPr><a:lvl2pPr marL="457200" indent="0"><a:buNone/><a:defRPr sz="2000" b="1"/></a:lvl2pPr><a:lvl3pPr marL="914400" indent="0"><a:buNone/><a:defRPr sz="1800" b="1"/></a:lvl3pPr><a:lvl4pPr marL="1371600" indent="0"><a:buNone/><a:defRPr sz="1600" b="1"/></a:lvl4pPr><a:lvl5pPr marL="1828800" indent="0"><a:buNone/><a:defRPr sz="1600" b="1"/></a:lvl5pPr><a:lvl6pPr marL="2286000" indent="0"><a:buNone/><a:defRPr sz="1600" b="1"/></a:lvl6pPr><a:lvl7pPr marL="2743200" indent="0"><a:buNone/><a:defRPr sz="1600" b="1"/></a:lvl7pPr><a:lvl8pPr marL="3200400" indent="0"><a:buNone/><a:defRPr sz="1600" b="1"/></a:lvl8pPr><a:lvl9pPr marL="3657600" indent="0"><a:buNone/><a:defRPr sz="1600" b="1"/></a:lvl9pPr></a:lstStyle><a:p><a:pPr lvl="0"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Click to edit Master text styles</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="4" name="Content Placeholder 3"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph sz="half" idx="2"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="457200" y="2174875"/><a:ext cx="4040188" cy="3951288"/></a:xfrm></p:spPr><p:txBody><a:bodyPr/><a:lstStyle><a:lvl1pPr><a:defRPr sz="2400"/></a:lvl1pPr><a:lvl2pPr><a:defRPr sz="2000"/></a:lvl2pPr><a:lvl3pPr><a:defRPr sz="1800"/></a:lvl3pPr><a:lvl4pPr><a:defRPr sz="1600"/></a:lvl4pPr><a:lvl5pPr><a:defRPr sz="1600"/></a:lvl5pPr><a:lvl6pPr><a:defRPr sz="1600"/></a:lvl6pPr><a:lvl7pPr><a:defRPr sz="1600"/></a:lvl7pPr><a:lvl8pPr><a:defRPr sz="1600"/></a:lvl8pPr><a:lvl9pPr><a:defRPr sz="1600"/></a:lvl9pPr></a:lstStyle><a:p><a:pPr lvl="0"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Click to edit Master text styles</a:t></a:r></a:p><a:p><a:pPr lvl="1"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Second level</a:t></a:r></a:p><a:p><a:pPr lvl="2"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Third level</a:t></a:r></a:p><a:p><a:pPr lvl="3"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Fourth level</a:t></a:r></a:p><a:p><a:pPr lvl="4"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Fifth level</a:t></a:r><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="5" name="Text Placeholder 4"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="body" sz="quarter" idx="3"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="4645025" y="1535113"/><a:ext cx="4041775" cy="639762"/></a:xfrm></p:spPr><p:txBody><a:bodyPr anchor="b"/><a:lstStyle><a:lvl1pPr marL="0" indent="0"><a:buNone/><a:defRPr sz="2400" b="1"/></a:lvl1pPr><a:lvl2pPr marL="457200" indent="0"><a:buNone/><a:defRPr sz="2000" b="1"/></a:lvl2pPr><a:lvl3pPr marL="914400" indent="0"><a:buNone/><a:defRPr sz="1800" b="1"/></a:lvl3pPr><a:lvl4pPr marL="1371600" indent="0"><a:buNone/><a:defRPr sz="1600" b="1"/></a:lvl4pPr><a:lvl5pPr marL="1828800" indent="0"><a:buNone/><a:defRPr sz="1600" b="1"/></a:lvl5pPr><a:lvl6pPr marL="2286000" indent="0"><a:buNone/><a:defRPr sz="1600" b="1"/></a:lvl6pPr><a:lvl7pPr marL="2743200" indent="0"><a:buNone/><a:defRPr sz="1600" b="1"/></a:lvl7pPr><a:lvl8pPr marL="3200400" indent="0"><a:buNone/><a:defRPr sz="1600" b="1"/></a:lvl8pPr><a:lvl9pPr marL="3657600" indent="0"><a:buNone/><a:defRPr sz="1600" b="1"/></a:lvl9pPr></a:lstStyle><a:p><a:pPr lvl="0"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Click to edit Master text styles</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="6" name="Content Placeholder 5"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph sz="quarter" idx="4"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="4645025" y="2174875"/><a:ext cx="4041775" cy="3951288"/></a:xfrm></p:spPr><p:txBody><a:bodyPr/><a:lstStyle><a:lvl1pPr><a:defRPr sz="2400"/></a:lvl1pPr><a:lvl2pPr><a:defRPr sz="2000"/></a:lvl2pPr><a:lvl3pPr><a:defRPr sz="1800"/></a:lvl3pPr><a:lvl4pPr><a:defRPr sz="1600"/></a:lvl4pPr><a:lvl5pPr><a:defRPr sz="1600"/></a:lvl5pPr><a:lvl6pPr><a:defRPr sz="1600"/></a:lvl6pPr><a:lvl7pPr><a:defRPr sz="1600"/></a:lvl7pPr><a:lvl8pPr><a:defRPr sz="1600"/></a:lvl8pPr><a:lvl9pPr><a:defRPr sz="1600"/></a:lvl9pPr></a:lstStyle><a:p><a:pPr lvl="0"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Click to edit Master text styles</a:t></a:r></a:p><a:p><a:pPr lvl="1"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Second level</a:t></a:r></a:p><a:p><a:pPr lvl="2"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Third level</a:t></a:r></a:p><a:p><a:pPr lvl="3"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Fourth level</a:t></a:r></a:p><a:p><a:pPr lvl="4"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Fifth level</a:t></a:r><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="7" name="Date Placeholder 6"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="dt" sz="half" idx="10"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{241EB5C9-1307-BA42-ABA2-0BC069CD8E7F}" type="datetimeFigureOut"><a:rPr lang="en-US" smtClean="0"/><a:t>4/5/2019</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="8" name="Footer Placeholder 7"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="ftr" sz="quarter" idx="11"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="9" name="Slide Number Placeholder 8"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldNum" sz="quarter" idx="12"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{C5EF2332-01BF-834F-8236-50238282D533}" type="slidenum"><a:rPr lang="en-US" smtClean="0"/><a:t>‹#›</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="2535793967"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sldLayout>+<p:sldLayout xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" type="twoTxTwoObj" preserve="1"><p:cSld name="Comparison"><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Title 1"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="title"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle><a:lvl1pPr><a:defRPr/></a:lvl1pPr></a:lstStyle><a:p><a:r><a:rPr lang="en-US"/><a:t>Click to edit Master title style</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Text Placeholder 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="body" idx="1"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="457200" y="1151335"/><a:ext cx="4040188" cy="479822"/></a:xfrm></p:spPr><p:txBody><a:bodyPr anchor="b"/><a:lstStyle><a:lvl1pPr marL="0" indent="0"><a:buNone/><a:defRPr sz="1800" b="1"/></a:lvl1pPr><a:lvl2pPr marL="342900" indent="0"><a:buNone/><a:defRPr sz="1500" b="1"/></a:lvl2pPr><a:lvl3pPr marL="685800" indent="0"><a:buNone/><a:defRPr sz="1350" b="1"/></a:lvl3pPr><a:lvl4pPr marL="1028700" indent="0"><a:buNone/><a:defRPr sz="1200" b="1"/></a:lvl4pPr><a:lvl5pPr marL="1371600" indent="0"><a:buNone/><a:defRPr sz="1200" b="1"/></a:lvl5pPr><a:lvl6pPr marL="1714500" indent="0"><a:buNone/><a:defRPr sz="1200" b="1"/></a:lvl6pPr><a:lvl7pPr marL="2057400" indent="0"><a:buNone/><a:defRPr sz="1200" b="1"/></a:lvl7pPr><a:lvl8pPr marL="2400300" indent="0"><a:buNone/><a:defRPr sz="1200" b="1"/></a:lvl8pPr><a:lvl9pPr marL="2743200" indent="0"><a:buNone/><a:defRPr sz="1200" b="1"/></a:lvl9pPr></a:lstStyle><a:p><a:pPr lvl="0"/><a:r><a:rPr lang="en-US"/><a:t>Click to edit Master text styles</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="4" name="Content Placeholder 3"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph sz="half" idx="2"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="457200" y="1631156"/><a:ext cx="4040188" cy="2963466"/></a:xfrm></p:spPr><p:txBody><a:bodyPr/><a:lstStyle><a:lvl1pPr><a:defRPr sz="1800"/></a:lvl1pPr><a:lvl2pPr><a:defRPr sz="1500"/></a:lvl2pPr><a:lvl3pPr><a:defRPr sz="1350"/></a:lvl3pPr><a:lvl4pPr><a:defRPr sz="1200"/></a:lvl4pPr><a:lvl5pPr><a:defRPr sz="1200"/></a:lvl5pPr><a:lvl6pPr><a:defRPr sz="1200"/></a:lvl6pPr><a:lvl7pPr><a:defRPr sz="1200"/></a:lvl7pPr><a:lvl8pPr><a:defRPr sz="1200"/></a:lvl8pPr><a:lvl9pPr><a:defRPr sz="1200"/></a:lvl9pPr></a:lstStyle><a:p><a:pPr lvl="0"/><a:r><a:rPr lang="en-US"/><a:t>Click to edit Master text styles</a:t></a:r></a:p><a:p><a:pPr lvl="1"/><a:r><a:rPr lang="en-US"/><a:t>Second level</a:t></a:r></a:p><a:p><a:pPr lvl="2"/><a:r><a:rPr lang="en-US"/><a:t>Third level</a:t></a:r></a:p><a:p><a:pPr lvl="3"/><a:r><a:rPr lang="en-US"/><a:t>Fourth level</a:t></a:r></a:p><a:p><a:pPr lvl="4"/><a:r><a:rPr lang="en-US"/><a:t>Fifth level</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="5" name="Text Placeholder 4"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="body" sz="quarter" idx="3"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="4645026" y="1151335"/><a:ext cx="4041775" cy="479822"/></a:xfrm></p:spPr><p:txBody><a:bodyPr anchor="b"/><a:lstStyle><a:lvl1pPr marL="0" indent="0"><a:buNone/><a:defRPr sz="1800" b="1"/></a:lvl1pPr><a:lvl2pPr marL="342900" indent="0"><a:buNone/><a:defRPr sz="1500" b="1"/></a:lvl2pPr><a:lvl3pPr marL="685800" indent="0"><a:buNone/><a:defRPr sz="1350" b="1"/></a:lvl3pPr><a:lvl4pPr marL="1028700" indent="0"><a:buNone/><a:defRPr sz="1200" b="1"/></a:lvl4pPr><a:lvl5pPr marL="1371600" indent="0"><a:buNone/><a:defRPr sz="1200" b="1"/></a:lvl5pPr><a:lvl6pPr marL="1714500" indent="0"><a:buNone/><a:defRPr sz="1200" b="1"/></a:lvl6pPr><a:lvl7pPr marL="2057400" indent="0"><a:buNone/><a:defRPr sz="1200" b="1"/></a:lvl7pPr><a:lvl8pPr marL="2400300" indent="0"><a:buNone/><a:defRPr sz="1200" b="1"/></a:lvl8pPr><a:lvl9pPr marL="2743200" indent="0"><a:buNone/><a:defRPr sz="1200" b="1"/></a:lvl9pPr></a:lstStyle><a:p><a:pPr lvl="0"/><a:r><a:rPr lang="en-US"/><a:t>Click to edit Master text styles</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="6" name="Content Placeholder 5"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph sz="quarter" idx="4"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="4645026" y="1631156"/><a:ext cx="4041775" cy="2963466"/></a:xfrm></p:spPr><p:txBody><a:bodyPr/><a:lstStyle><a:lvl1pPr><a:defRPr sz="1800"/></a:lvl1pPr><a:lvl2pPr><a:defRPr sz="1500"/></a:lvl2pPr><a:lvl3pPr><a:defRPr sz="1350"/></a:lvl3pPr><a:lvl4pPr><a:defRPr sz="1200"/></a:lvl4pPr><a:lvl5pPr><a:defRPr sz="1200"/></a:lvl5pPr><a:lvl6pPr><a:defRPr sz="1200"/></a:lvl6pPr><a:lvl7pPr><a:defRPr sz="1200"/></a:lvl7pPr><a:lvl8pPr><a:defRPr sz="1200"/></a:lvl8pPr><a:lvl9pPr><a:defRPr sz="1200"/></a:lvl9pPr></a:lstStyle><a:p><a:pPr lvl="0"/><a:r><a:rPr lang="en-US"/><a:t>Click to edit Master text styles</a:t></a:r></a:p><a:p><a:pPr lvl="1"/><a:r><a:rPr lang="en-US"/><a:t>Second level</a:t></a:r></a:p><a:p><a:pPr lvl="2"/><a:r><a:rPr lang="en-US"/><a:t>Third level</a:t></a:r></a:p><a:p><a:pPr lvl="3"/><a:r><a:rPr lang="en-US"/><a:t>Fourth level</a:t></a:r></a:p><a:p><a:pPr lvl="4"/><a:r><a:rPr lang="en-US"/><a:t>Fifth level</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="7" name="Date Placeholder 6"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="dt" sz="half" idx="10"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{241EB5C9-1307-BA42-ABA2-0BC069CD8E7F}" type="datetimeFigureOut"><a:rPr lang="en-US" smtClean="0"/><a:t>1/2/22</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="8" name="Footer Placeholder 7"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="ftr" sz="quarter" idx="11"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="9" name="Slide Number Placeholder 8"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldNum" sz="quarter" idx="12"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{C5EF2332-01BF-834F-8236-50238282D533}" type="slidenum"><a:rPr lang="en-US" smtClean="0"/><a:t>‹#›</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="2535793967"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sldLayout>
data/pptx/ppt/slideLayouts/slideLayout6.xml view
@@ -1,2 +1,2 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<p:sldLayout xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" type="titleOnly" preserve="1"><p:cSld name="Title Only"><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Title 1"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="title"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Click to edit Master title style</a:t></a:r><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Date Placeholder 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="dt" sz="half" idx="10"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{241EB5C9-1307-BA42-ABA2-0BC069CD8E7F}" type="datetimeFigureOut"><a:rPr lang="en-US" smtClean="0"/><a:t>4/5/2019</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="4" name="Footer Placeholder 3"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="ftr" sz="quarter" idx="11"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="5" name="Slide Number Placeholder 4"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldNum" sz="quarter" idx="12"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{C5EF2332-01BF-834F-8236-50238282D533}" type="slidenum"><a:rPr lang="en-US" smtClean="0"/><a:t>‹#›</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="3472721253"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sldLayout>+<p:sldLayout xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" type="titleOnly" preserve="1"><p:cSld name="Title Only"><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Title 1"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="title"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang="en-US"/><a:t>Click to edit Master title style</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Date Placeholder 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="dt" sz="half" idx="10"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{241EB5C9-1307-BA42-ABA2-0BC069CD8E7F}" type="datetimeFigureOut"><a:rPr lang="en-US" smtClean="0"/><a:t>1/2/22</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="4" name="Footer Placeholder 3"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="ftr" sz="quarter" idx="11"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="5" name="Slide Number Placeholder 4"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldNum" sz="quarter" idx="12"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{C5EF2332-01BF-834F-8236-50238282D533}" type="slidenum"><a:rPr lang="en-US" smtClean="0"/><a:t>‹#›</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="3472721253"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sldLayout>
data/pptx/ppt/slideLayouts/slideLayout7.xml view
@@ -1,2 +1,2 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<p:sldLayout xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" type="blank" preserve="1"><p:cSld name="Blank"><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Date Placeholder 1"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="dt" sz="half" idx="10"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{241EB5C9-1307-BA42-ABA2-0BC069CD8E7F}" type="datetimeFigureOut"><a:rPr lang="en-US" smtClean="0"/><a:t>4/5/2019</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Footer Placeholder 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="ftr" sz="quarter" idx="11"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="4" name="Slide Number Placeholder 3"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldNum" sz="quarter" idx="12"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{C5EF2332-01BF-834F-8236-50238282D533}" type="slidenum"><a:rPr lang="en-US" smtClean="0"/><a:t>‹#›</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="2130901097"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sldLayout>+<p:sldLayout xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" type="blank" preserve="1"><p:cSld name="Blank"><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Date Placeholder 1"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="dt" sz="half" idx="10"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{241EB5C9-1307-BA42-ABA2-0BC069CD8E7F}" type="datetimeFigureOut"><a:rPr lang="en-US" smtClean="0"/><a:t>1/2/22</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Footer Placeholder 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="ftr" sz="quarter" idx="11"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="4" name="Slide Number Placeholder 3"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldNum" sz="quarter" idx="12"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{C5EF2332-01BF-834F-8236-50238282D533}" type="slidenum"><a:rPr lang="en-US" smtClean="0"/><a:t>‹#›</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="2130901097"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sldLayout>
data/pptx/ppt/slideLayouts/slideLayout8.xml view
@@ -1,2 +1,2 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<p:sldLayout xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" type="objTx" preserve="1"><p:cSld name="Content with Caption"><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Title 1"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="title"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="457200" y="273050"/><a:ext cx="3008313" cy="1162050"/></a:xfrm></p:spPr><p:txBody><a:bodyPr anchor="b"/><a:lstStyle><a:lvl1pPr algn="l"><a:defRPr sz="2000" b="1"/></a:lvl1pPr></a:lstStyle><a:p><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Click to edit Master title style</a:t></a:r><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Content Placeholder 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph idx="1"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="3575050" y="273050"/><a:ext cx="5111750" cy="5853113"/></a:xfrm></p:spPr><p:txBody><a:bodyPr/><a:lstStyle><a:lvl1pPr><a:defRPr sz="3200"/></a:lvl1pPr><a:lvl2pPr><a:defRPr sz="2800"/></a:lvl2pPr><a:lvl3pPr><a:defRPr sz="2400"/></a:lvl3pPr><a:lvl4pPr><a:defRPr sz="2000"/></a:lvl4pPr><a:lvl5pPr><a:defRPr sz="2000"/></a:lvl5pPr><a:lvl6pPr><a:defRPr sz="2000"/></a:lvl6pPr><a:lvl7pPr><a:defRPr sz="2000"/></a:lvl7pPr><a:lvl8pPr><a:defRPr sz="2000"/></a:lvl8pPr><a:lvl9pPr><a:defRPr sz="2000"/></a:lvl9pPr></a:lstStyle><a:p><a:pPr lvl="0"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Click to edit Master text styles</a:t></a:r></a:p><a:p><a:pPr lvl="1"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Second level</a:t></a:r></a:p><a:p><a:pPr lvl="2"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Third level</a:t></a:r></a:p><a:p><a:pPr lvl="3"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Fourth level</a:t></a:r></a:p><a:p><a:pPr lvl="4"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Fifth level</a:t></a:r><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="4" name="Text Placeholder 3"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="body" sz="half" idx="2"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="457200" y="1435100"/><a:ext cx="3008313" cy="4691063"/></a:xfrm></p:spPr><p:txBody><a:bodyPr/><a:lstStyle><a:lvl1pPr marL="0" indent="0"><a:buNone/><a:defRPr sz="1400"/></a:lvl1pPr><a:lvl2pPr marL="457200" indent="0"><a:buNone/><a:defRPr sz="1200"/></a:lvl2pPr><a:lvl3pPr marL="914400" indent="0"><a:buNone/><a:defRPr sz="1000"/></a:lvl3pPr><a:lvl4pPr marL="1371600" indent="0"><a:buNone/><a:defRPr sz="900"/></a:lvl4pPr><a:lvl5pPr marL="1828800" indent="0"><a:buNone/><a:defRPr sz="900"/></a:lvl5pPr><a:lvl6pPr marL="2286000" indent="0"><a:buNone/><a:defRPr sz="900"/></a:lvl6pPr><a:lvl7pPr marL="2743200" indent="0"><a:buNone/><a:defRPr sz="900"/></a:lvl7pPr><a:lvl8pPr marL="3200400" indent="0"><a:buNone/><a:defRPr sz="900"/></a:lvl8pPr><a:lvl9pPr marL="3657600" indent="0"><a:buNone/><a:defRPr sz="900"/></a:lvl9pPr></a:lstStyle><a:p><a:pPr lvl="0"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Click to edit Master text styles</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="5" name="Date Placeholder 4"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="dt" sz="half" idx="10"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{241EB5C9-1307-BA42-ABA2-0BC069CD8E7F}" type="datetimeFigureOut"><a:rPr lang="en-US" smtClean="0"/><a:t>4/5/2019</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="6" name="Footer Placeholder 5"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="ftr" sz="quarter" idx="11"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="7" name="Slide Number Placeholder 6"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldNum" sz="quarter" idx="12"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{C5EF2332-01BF-834F-8236-50238282D533}" type="slidenum"><a:rPr lang="en-US" smtClean="0"/><a:t>‹#›</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="3540895647"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sldLayout>+<p:sldLayout xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" type="objTx" preserve="1"><p:cSld name="Content with Caption"><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Title 1"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="title"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="457201" y="204787"/><a:ext cx="3008313" cy="871538"/></a:xfrm></p:spPr><p:txBody><a:bodyPr anchor="b"/><a:lstStyle><a:lvl1pPr algn="l"><a:defRPr sz="1500" b="1"/></a:lvl1pPr></a:lstStyle><a:p><a:r><a:rPr lang="en-US"/><a:t>Click to edit Master title style</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Content Placeholder 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph idx="1"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="3575050" y="204788"/><a:ext cx="5111750" cy="4389835"/></a:xfrm></p:spPr><p:txBody><a:bodyPr/><a:lstStyle><a:lvl1pPr><a:defRPr sz="2400"/></a:lvl1pPr><a:lvl2pPr><a:defRPr sz="2100"/></a:lvl2pPr><a:lvl3pPr><a:defRPr sz="1800"/></a:lvl3pPr><a:lvl4pPr><a:defRPr sz="1500"/></a:lvl4pPr><a:lvl5pPr><a:defRPr sz="1500"/></a:lvl5pPr><a:lvl6pPr><a:defRPr sz="1500"/></a:lvl6pPr><a:lvl7pPr><a:defRPr sz="1500"/></a:lvl7pPr><a:lvl8pPr><a:defRPr sz="1500"/></a:lvl8pPr><a:lvl9pPr><a:defRPr sz="1500"/></a:lvl9pPr></a:lstStyle><a:p><a:pPr lvl="0"/><a:r><a:rPr lang="en-US"/><a:t>Click to edit Master text styles</a:t></a:r></a:p><a:p><a:pPr lvl="1"/><a:r><a:rPr lang="en-US"/><a:t>Second level</a:t></a:r></a:p><a:p><a:pPr lvl="2"/><a:r><a:rPr lang="en-US"/><a:t>Third level</a:t></a:r></a:p><a:p><a:pPr lvl="3"/><a:r><a:rPr lang="en-US"/><a:t>Fourth level</a:t></a:r></a:p><a:p><a:pPr lvl="4"/><a:r><a:rPr lang="en-US"/><a:t>Fifth level</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="4" name="Text Placeholder 3"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="body" sz="half" idx="2"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="457201" y="1076326"/><a:ext cx="3008313" cy="3518297"/></a:xfrm></p:spPr><p:txBody><a:bodyPr/><a:lstStyle><a:lvl1pPr marL="0" indent="0"><a:buNone/><a:defRPr sz="1050"/></a:lvl1pPr><a:lvl2pPr marL="342900" indent="0"><a:buNone/><a:defRPr sz="900"/></a:lvl2pPr><a:lvl3pPr marL="685800" indent="0"><a:buNone/><a:defRPr sz="750"/></a:lvl3pPr><a:lvl4pPr marL="1028700" indent="0"><a:buNone/><a:defRPr sz="675"/></a:lvl4pPr><a:lvl5pPr marL="1371600" indent="0"><a:buNone/><a:defRPr sz="675"/></a:lvl5pPr><a:lvl6pPr marL="1714500" indent="0"><a:buNone/><a:defRPr sz="675"/></a:lvl6pPr><a:lvl7pPr marL="2057400" indent="0"><a:buNone/><a:defRPr sz="675"/></a:lvl7pPr><a:lvl8pPr marL="2400300" indent="0"><a:buNone/><a:defRPr sz="675"/></a:lvl8pPr><a:lvl9pPr marL="2743200" indent="0"><a:buNone/><a:defRPr sz="675"/></a:lvl9pPr></a:lstStyle><a:p><a:pPr lvl="0"/><a:r><a:rPr lang="en-US"/><a:t>Click to edit Master text styles</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="5" name="Date Placeholder 4"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="dt" sz="half" idx="10"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{241EB5C9-1307-BA42-ABA2-0BC069CD8E7F}" type="datetimeFigureOut"><a:rPr lang="en-US" smtClean="0"/><a:t>1/2/22</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="6" name="Footer Placeholder 5"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="ftr" sz="quarter" idx="11"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="7" name="Slide Number Placeholder 6"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldNum" sz="quarter" idx="12"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{C5EF2332-01BF-834F-8236-50238282D533}" type="slidenum"><a:rPr lang="en-US" smtClean="0"/><a:t>‹#›</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="3540895647"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sldLayout>
data/pptx/ppt/slideLayouts/slideLayout9.xml view
@@ -1,2 +1,2 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<p:sldLayout xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" type="picTx" preserve="1"><p:cSld name="Picture with Caption"><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Title 1"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="title"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="1792288" y="4800600"/><a:ext cx="5486400" cy="566738"/></a:xfrm></p:spPr><p:txBody><a:bodyPr anchor="b"/><a:lstStyle><a:lvl1pPr algn="l"><a:defRPr sz="2000" b="1"/></a:lvl1pPr></a:lstStyle><a:p><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Click to edit Master title style</a:t></a:r><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Picture Placeholder 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="pic" idx="1"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="1792288" y="612775"/><a:ext cx="5486400" cy="4114800"/></a:xfrm></p:spPr><p:txBody><a:bodyPr/><a:lstStyle><a:lvl1pPr marL="0" indent="0"><a:buNone/><a:defRPr sz="3200"/></a:lvl1pPr><a:lvl2pPr marL="457200" indent="0"><a:buNone/><a:defRPr sz="2800"/></a:lvl2pPr><a:lvl3pPr marL="914400" indent="0"><a:buNone/><a:defRPr sz="2400"/></a:lvl3pPr><a:lvl4pPr marL="1371600" indent="0"><a:buNone/><a:defRPr sz="2000"/></a:lvl4pPr><a:lvl5pPr marL="1828800" indent="0"><a:buNone/><a:defRPr sz="2000"/></a:lvl5pPr><a:lvl6pPr marL="2286000" indent="0"><a:buNone/><a:defRPr sz="2000"/></a:lvl6pPr><a:lvl7pPr marL="2743200" indent="0"><a:buNone/><a:defRPr sz="2000"/></a:lvl7pPr><a:lvl8pPr marL="3200400" indent="0"><a:buNone/><a:defRPr sz="2000"/></a:lvl8pPr><a:lvl9pPr marL="3657600" indent="0"><a:buNone/><a:defRPr sz="2000"/></a:lvl9pPr></a:lstStyle><a:p><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="4" name="Text Placeholder 3"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="body" sz="half" idx="2"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="1792288" y="5367338"/><a:ext cx="5486400" cy="804862"/></a:xfrm></p:spPr><p:txBody><a:bodyPr/><a:lstStyle><a:lvl1pPr marL="0" indent="0"><a:buNone/><a:defRPr sz="1400"/></a:lvl1pPr><a:lvl2pPr marL="457200" indent="0"><a:buNone/><a:defRPr sz="1200"/></a:lvl2pPr><a:lvl3pPr marL="914400" indent="0"><a:buNone/><a:defRPr sz="1000"/></a:lvl3pPr><a:lvl4pPr marL="1371600" indent="0"><a:buNone/><a:defRPr sz="900"/></a:lvl4pPr><a:lvl5pPr marL="1828800" indent="0"><a:buNone/><a:defRPr sz="900"/></a:lvl5pPr><a:lvl6pPr marL="2286000" indent="0"><a:buNone/><a:defRPr sz="900"/></a:lvl6pPr><a:lvl7pPr marL="2743200" indent="0"><a:buNone/><a:defRPr sz="900"/></a:lvl7pPr><a:lvl8pPr marL="3200400" indent="0"><a:buNone/><a:defRPr sz="900"/></a:lvl8pPr><a:lvl9pPr marL="3657600" indent="0"><a:buNone/><a:defRPr sz="900"/></a:lvl9pPr></a:lstStyle><a:p><a:pPr lvl="0"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Click to edit Master text styles</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="5" name="Date Placeholder 4"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="dt" sz="half" idx="10"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{241EB5C9-1307-BA42-ABA2-0BC069CD8E7F}" type="datetimeFigureOut"><a:rPr lang="en-US" smtClean="0"/><a:t>4/5/2019</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="6" name="Footer Placeholder 5"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="ftr" sz="quarter" idx="11"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="7" name="Slide Number Placeholder 6"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldNum" sz="quarter" idx="12"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{C5EF2332-01BF-834F-8236-50238282D533}" type="slidenum"><a:rPr lang="en-US" smtClean="0"/><a:t>‹#›</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="3566899855"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sldLayout>+<p:sldLayout xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" type="picTx" preserve="1"><p:cSld name="Picture with Caption"><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Title 1"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="title"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="1792288" y="3600450"/><a:ext cx="5486400" cy="425054"/></a:xfrm></p:spPr><p:txBody><a:bodyPr anchor="b"/><a:lstStyle><a:lvl1pPr algn="l"><a:defRPr sz="1500" b="1"/></a:lvl1pPr></a:lstStyle><a:p><a:r><a:rPr lang="en-US"/><a:t>Click to edit Master title style</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Picture Placeholder 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="pic" idx="1"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="1792288" y="459581"/><a:ext cx="5486400" cy="3086100"/></a:xfrm></p:spPr><p:txBody><a:bodyPr/><a:lstStyle><a:lvl1pPr marL="0" indent="0"><a:buNone/><a:defRPr sz="2400"/></a:lvl1pPr><a:lvl2pPr marL="342900" indent="0"><a:buNone/><a:defRPr sz="2100"/></a:lvl2pPr><a:lvl3pPr marL="685800" indent="0"><a:buNone/><a:defRPr sz="1800"/></a:lvl3pPr><a:lvl4pPr marL="1028700" indent="0"><a:buNone/><a:defRPr sz="1500"/></a:lvl4pPr><a:lvl5pPr marL="1371600" indent="0"><a:buNone/><a:defRPr sz="1500"/></a:lvl5pPr><a:lvl6pPr marL="1714500" indent="0"><a:buNone/><a:defRPr sz="1500"/></a:lvl6pPr><a:lvl7pPr marL="2057400" indent="0"><a:buNone/><a:defRPr sz="1500"/></a:lvl7pPr><a:lvl8pPr marL="2400300" indent="0"><a:buNone/><a:defRPr sz="1500"/></a:lvl8pPr><a:lvl9pPr marL="2743200" indent="0"><a:buNone/><a:defRPr sz="1500"/></a:lvl9pPr></a:lstStyle><a:p><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="4" name="Text Placeholder 3"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="body" sz="half" idx="2"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="1792288" y="4025503"/><a:ext cx="5486400" cy="603647"/></a:xfrm></p:spPr><p:txBody><a:bodyPr/><a:lstStyle><a:lvl1pPr marL="0" indent="0"><a:buNone/><a:defRPr sz="1050"/></a:lvl1pPr><a:lvl2pPr marL="342900" indent="0"><a:buNone/><a:defRPr sz="900"/></a:lvl2pPr><a:lvl3pPr marL="685800" indent="0"><a:buNone/><a:defRPr sz="750"/></a:lvl3pPr><a:lvl4pPr marL="1028700" indent="0"><a:buNone/><a:defRPr sz="675"/></a:lvl4pPr><a:lvl5pPr marL="1371600" indent="0"><a:buNone/><a:defRPr sz="675"/></a:lvl5pPr><a:lvl6pPr marL="1714500" indent="0"><a:buNone/><a:defRPr sz="675"/></a:lvl6pPr><a:lvl7pPr marL="2057400" indent="0"><a:buNone/><a:defRPr sz="675"/></a:lvl7pPr><a:lvl8pPr marL="2400300" indent="0"><a:buNone/><a:defRPr sz="675"/></a:lvl8pPr><a:lvl9pPr marL="2743200" indent="0"><a:buNone/><a:defRPr sz="675"/></a:lvl9pPr></a:lstStyle><a:p><a:pPr lvl="0"/><a:r><a:rPr lang="en-US"/><a:t>Click to edit Master text styles</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="5" name="Date Placeholder 4"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="dt" sz="half" idx="10"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{241EB5C9-1307-BA42-ABA2-0BC069CD8E7F}" type="datetimeFigureOut"><a:rPr lang="en-US" smtClean="0"/><a:t>1/2/22</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="6" name="Footer Placeholder 5"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="ftr" sz="quarter" idx="11"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="7" name="Slide Number Placeholder 6"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldNum" sz="quarter" idx="12"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:fld id="{C5EF2332-01BF-834F-8236-50238282D533}" type="slidenum"><a:rPr lang="en-US" smtClean="0"/><a:t>‹#›</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="3566899855"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sldLayout>
data/pptx/ppt/slideMasters/slideMaster1.xml view
@@ -1,2 +1,2 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<p:sldMaster xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main"><p:cSld><p:bg><p:bgRef idx="1001"><a:schemeClr val="bg1"/></p:bgRef></p:bg><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Title Placeholder 1"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="title"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="457200" y="274638"/><a:ext cx="8229600" cy="1143000"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></p:spPr><p:txBody><a:bodyPr vert="horz" lIns="91440" tIns="45720" rIns="91440" bIns="45720" rtlCol="0" anchor="ctr"><a:normAutofit/></a:bodyPr><a:lstStyle/><a:p><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Click to edit Master title style</a:t></a:r><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Text Placeholder 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="body" idx="1"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="457200" y="1600200"/><a:ext cx="8229600" cy="4525963"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></p:spPr><p:txBody><a:bodyPr vert="horz" lIns="91440" tIns="45720" rIns="91440" bIns="45720" rtlCol="0"><a:normAutofit/></a:bodyPr><a:lstStyle/><a:p><a:pPr lvl="0"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Click to edit Master text styles</a:t></a:r></a:p><a:p><a:pPr lvl="1"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Second level</a:t></a:r></a:p><a:p><a:pPr lvl="2"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Third level</a:t></a:r></a:p><a:p><a:pPr lvl="3"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Fourth level</a:t></a:r></a:p><a:p><a:pPr lvl="4"/><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>Fifth level</a:t></a:r><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="4" name="Date Placeholder 3"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="dt" sz="half" idx="2"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="457200" y="6356350"/><a:ext cx="2133600" cy="365125"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></p:spPr><p:txBody><a:bodyPr vert="horz" lIns="91440" tIns="45720" rIns="91440" bIns="45720" rtlCol="0" anchor="ctr"/><a:lstStyle><a:lvl1pPr algn="l"><a:defRPr sz="1200"><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl1pPr></a:lstStyle><a:p><a:fld id="{241EB5C9-1307-BA42-ABA2-0BC069CD8E7F}" type="datetimeFigureOut"><a:rPr lang="en-US" smtClean="0"/><a:t>4/5/2019</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="5" name="Footer Placeholder 4"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="ftr" sz="quarter" idx="3"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="3124200" y="6356350"/><a:ext cx="2895600" cy="365125"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></p:spPr><p:txBody><a:bodyPr vert="horz" lIns="91440" tIns="45720" rIns="91440" bIns="45720" rtlCol="0" anchor="ctr"/><a:lstStyle><a:lvl1pPr algn="ctr"><a:defRPr sz="1200"><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl1pPr></a:lstStyle><a:p><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="6" name="Slide Number Placeholder 5"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldNum" sz="quarter" idx="4"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="6553200" y="6356350"/><a:ext cx="2133600" cy="365125"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></p:spPr><p:txBody><a:bodyPr vert="horz" lIns="91440" tIns="45720" rIns="91440" bIns="45720" rtlCol="0" anchor="ctr"/><a:lstStyle><a:lvl1pPr algn="r"><a:defRPr sz="1200"><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl1pPr></a:lstStyle><a:p><a:fld id="{C5EF2332-01BF-834F-8236-50238282D533}" type="slidenum"><a:rPr lang="en-US" smtClean="0"/><a:t>‹#›</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="3676200875"/></p:ext></p:extLst></p:cSld><p:clrMap bg1="lt1" tx1="dk1" bg2="lt2" tx2="dk2" accent1="accent1" accent2="accent2" accent3="accent3" accent4="accent4" accent5="accent5" accent6="accent6" hlink="hlink" folHlink="folHlink"/><p:sldLayoutIdLst><p:sldLayoutId id="2147483649" r:id="rId1"/><p:sldLayoutId id="2147483650" r:id="rId2"/><p:sldLayoutId id="2147483651" r:id="rId3"/><p:sldLayoutId id="2147483652" r:id="rId4"/><p:sldLayoutId id="2147483653" r:id="rId5"/><p:sldLayoutId id="2147483654" r:id="rId6"/><p:sldLayoutId id="2147483655" r:id="rId7"/><p:sldLayoutId id="2147483656" r:id="rId8"/><p:sldLayoutId id="2147483657" r:id="rId9"/><p:sldLayoutId id="2147483658" r:id="rId10"/><p:sldLayoutId id="2147483659" r:id="rId11"/></p:sldLayoutIdLst><p:txStyles><p:titleStyle><a:lvl1pPr algn="ctr" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:spcBef><a:spcPct val="0"/></a:spcBef><a:buNone/><a:defRPr sz="4400" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mj-lt"/><a:ea typeface="+mj-ea"/><a:cs typeface="+mj-cs"/></a:defRPr></a:lvl1pPr></p:titleStyle><p:bodyStyle><a:lvl1pPr marL="457200" indent="-457200" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:spcBef><a:spcPct val="20000"/></a:spcBef><a:buFont typeface="Arial"/><a:buChar char="•"/><a:defRPr sz="3200" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl1pPr><a:lvl2pPr marL="914400" indent="-457200" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:spcBef><a:spcPct val="20000"/></a:spcBef><a:buFont typeface="Arial"/><a:buChar char="–"/><a:defRPr sz="2800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl2pPr><a:lvl3pPr marL="1371600" indent="-457200" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:spcBef><a:spcPct val="20000"/></a:spcBef><a:buFont typeface="Arial"/><a:buChar char="•"/><a:defRPr sz="2400" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl3pPr><a:lvl4pPr marL="1828800" indent="-457200" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:spcBef><a:spcPct val="20000"/></a:spcBef><a:buFont typeface="Arial"/><a:buChar char="–"/><a:defRPr sz="2000" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl4pPr><a:lvl5pPr marL="2286000" indent="-457200" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:spcBef><a:spcPct val="20000"/></a:spcBef><a:buFont typeface="Arial"/><a:buChar char="»"/><a:defRPr sz="2000" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl5pPr><a:lvl6pPr marL="2743200" indent="-457200" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:spcBef><a:spcPct val="20000"/></a:spcBef><a:buFont typeface="Arial"/><a:buChar char="•"/><a:defRPr sz="2000" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl6pPr><a:lvl7pPr marL="3200400" indent="-457200" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:spcBef><a:spcPct val="20000"/></a:spcBef><a:buFont typeface="Arial"/><a:buChar char="•"/><a:defRPr sz="2000" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl7pPr><a:lvl8pPr marL="3657600" indent="-457200" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:spcBef><a:spcPct val="20000"/></a:spcBef><a:buFont typeface="Arial"/><a:buChar char="•"/><a:defRPr sz="2000" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl8pPr><a:lvl9pPr marL="4114800" indent="-457200" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:spcBef><a:spcPct val="20000"/></a:spcBef><a:buFont typeface="Arial"/><a:buChar char="•"/><a:defRPr sz="2000" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl9pPr></p:bodyStyle><p:otherStyle><a:defPPr><a:defRPr lang="en-US"/></a:defPPr><a:lvl1pPr marL="0" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl1pPr><a:lvl2pPr marL="457200" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl2pPr><a:lvl3pPr marL="914400" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl3pPr><a:lvl4pPr marL="1371600" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl4pPr><a:lvl5pPr marL="1828800" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl5pPr><a:lvl6pPr marL="2286000" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl6pPr><a:lvl7pPr marL="2743200" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl7pPr><a:lvl8pPr marL="3200400" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl8pPr><a:lvl9pPr marL="3657600" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl9pPr></p:otherStyle></p:txStyles></p:sldMaster>
+<p:sldMaster xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main"><p:cSld><p:bg><p:bgRef idx="1001"><a:schemeClr val="bg1"/></p:bgRef></p:bg><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Title Placeholder 1"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="title"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="457200" y="205979"/><a:ext cx="8229600" cy="857250"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></p:spPr><p:txBody><a:bodyPr vert="horz" lIns="91440" tIns="45720" rIns="91440" bIns="45720" rtlCol="0" anchor="ctr"><a:normAutofit/></a:bodyPr><a:lstStyle/><a:p><a:r><a:rPr lang="en-US"/><a:t>Click to edit Master title style</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Text Placeholder 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="body" idx="1"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="457200" y="1200151"/><a:ext cx="8229600" cy="3394472"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></p:spPr><p:txBody><a:bodyPr vert="horz" lIns="91440" tIns="45720" rIns="91440" bIns="45720" rtlCol="0"><a:normAutofit/></a:bodyPr><a:lstStyle/><a:p><a:pPr lvl="0"/><a:r><a:rPr lang="en-US"/><a:t>Click to edit Master text styles</a:t></a:r></a:p><a:p><a:pPr lvl="1"/><a:r><a:rPr lang="en-US"/><a:t>Second level</a:t></a:r></a:p><a:p><a:pPr lvl="2"/><a:r><a:rPr lang="en-US"/><a:t>Third level</a:t></a:r></a:p><a:p><a:pPr lvl="3"/><a:r><a:rPr lang="en-US"/><a:t>Fourth level</a:t></a:r></a:p><a:p><a:pPr lvl="4"/><a:r><a:rPr lang="en-US"/><a:t>Fifth level</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="4" name="Date Placeholder 3"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="dt" sz="half" idx="2"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="457200" y="4767263"/><a:ext cx="2133600" cy="273844"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></p:spPr><p:txBody><a:bodyPr vert="horz" lIns="91440" tIns="45720" rIns="91440" bIns="45720" rtlCol="0" anchor="ctr"/><a:lstStyle><a:lvl1pPr algn="l"><a:defRPr sz="900"><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl1pPr></a:lstStyle><a:p><a:fld id="{241EB5C9-1307-BA42-ABA2-0BC069CD8E7F}" type="datetimeFigureOut"><a:rPr lang="en-US" smtClean="0"/><a:t>1/2/22</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="5" name="Footer Placeholder 4"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="ftr" sz="quarter" idx="3"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="3124200" y="4767263"/><a:ext cx="2895600" cy="273844"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></p:spPr><p:txBody><a:bodyPr vert="horz" lIns="91440" tIns="45720" rIns="91440" bIns="45720" rtlCol="0" anchor="ctr"/><a:lstStyle><a:lvl1pPr algn="ctr"><a:defRPr sz="900"><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl1pPr></a:lstStyle><a:p><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="6" name="Slide Number Placeholder 5"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="sldNum" sz="quarter" idx="4"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x="6553200" y="4767263"/><a:ext cx="2133600" cy="273844"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></p:spPr><p:txBody><a:bodyPr vert="horz" lIns="91440" tIns="45720" rIns="91440" bIns="45720" rtlCol="0" anchor="ctr"/><a:lstStyle><a:lvl1pPr algn="r"><a:defRPr sz="900"><a:solidFill><a:schemeClr val="tx1"><a:tint val="75000"/></a:schemeClr></a:solidFill></a:defRPr></a:lvl1pPr></a:lstStyle><a:p><a:fld id="{C5EF2332-01BF-834F-8236-50238282D533}" type="slidenum"><a:rPr lang="en-US" smtClean="0"/><a:t>‹#›</a:t></a:fld><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="3676200875"/></p:ext></p:extLst></p:cSld><p:clrMap bg1="lt1" tx1="dk1" bg2="lt2" tx2="dk2" accent1="accent1" accent2="accent2" accent3="accent3" accent4="accent4" accent5="accent5" accent6="accent6" hlink="hlink" folHlink="folHlink"/><p:sldLayoutIdLst><p:sldLayoutId id="2147483649" r:id="rId1"/><p:sldLayoutId id="2147483650" r:id="rId2"/><p:sldLayoutId id="2147483651" r:id="rId3"/><p:sldLayoutId id="2147483652" r:id="rId4"/><p:sldLayoutId id="2147483653" r:id="rId5"/><p:sldLayoutId id="2147483654" r:id="rId6"/><p:sldLayoutId id="2147483655" r:id="rId7"/><p:sldLayoutId id="2147483656" r:id="rId8"/><p:sldLayoutId id="2147483657" r:id="rId9"/><p:sldLayoutId id="2147483658" r:id="rId10"/><p:sldLayoutId id="2147483659" r:id="rId11"/></p:sldLayoutIdLst><p:txStyles><p:titleStyle><a:lvl1pPr algn="ctr" defTabSz="342900" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:spcBef><a:spcPct val="0"/></a:spcBef><a:buNone/><a:defRPr sz="3300" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mj-lt"/><a:ea typeface="+mj-ea"/><a:cs typeface="+mj-cs"/></a:defRPr></a:lvl1pPr></p:titleStyle><p:bodyStyle><a:lvl1pPr marL="342900" indent="-342900" algn="l" defTabSz="342900" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:spcBef><a:spcPct val="20000"/></a:spcBef><a:buFont typeface="Arial"/><a:buChar char="•"/><a:defRPr sz="2400" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl1pPr><a:lvl2pPr marL="685800" indent="-342900" algn="l" defTabSz="342900" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:spcBef><a:spcPct val="20000"/></a:spcBef><a:buFont typeface="Arial"/><a:buChar char="–"/><a:defRPr sz="2100" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl2pPr><a:lvl3pPr marL="1028700" indent="-342900" algn="l" defTabSz="342900" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:spcBef><a:spcPct val="20000"/></a:spcBef><a:buFont typeface="Arial"/><a:buChar char="•"/><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl3pPr><a:lvl4pPr marL="1371600" indent="-342900" algn="l" defTabSz="342900" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:spcBef><a:spcPct val="20000"/></a:spcBef><a:buFont typeface="Arial"/><a:buChar char="–"/><a:defRPr sz="1500" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl4pPr><a:lvl5pPr marL="1714500" indent="-342900" algn="l" defTabSz="342900" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:spcBef><a:spcPct val="20000"/></a:spcBef><a:buFont typeface="Arial"/><a:buChar char="»"/><a:defRPr sz="1500" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl5pPr><a:lvl6pPr marL="2057400" indent="-342900" algn="l" defTabSz="342900" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:spcBef><a:spcPct val="20000"/></a:spcBef><a:buFont typeface="Arial"/><a:buChar char="•"/><a:defRPr sz="1500" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl6pPr><a:lvl7pPr marL="2400300" indent="-342900" algn="l" defTabSz="342900" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:spcBef><a:spcPct val="20000"/></a:spcBef><a:buFont typeface="Arial"/><a:buChar char="•"/><a:defRPr sz="1500" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl7pPr><a:lvl8pPr marL="2743200" indent="-342900" algn="l" defTabSz="342900" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:spcBef><a:spcPct val="20000"/></a:spcBef><a:buFont typeface="Arial"/><a:buChar char="•"/><a:defRPr sz="1500" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl8pPr><a:lvl9pPr marL="3086100" indent="-342900" algn="l" defTabSz="342900" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:spcBef><a:spcPct val="20000"/></a:spcBef><a:buFont typeface="Arial"/><a:buChar char="•"/><a:defRPr sz="1500" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl9pPr></p:bodyStyle><p:otherStyle><a:defPPr><a:defRPr lang="en-US"/></a:defPPr><a:lvl1pPr marL="0" algn="l" defTabSz="342900" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1350" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl1pPr><a:lvl2pPr marL="342900" algn="l" defTabSz="342900" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1350" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl2pPr><a:lvl3pPr marL="685800" algn="l" defTabSz="342900" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1350" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl3pPr><a:lvl4pPr marL="1028700" algn="l" defTabSz="342900" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1350" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl4pPr><a:lvl5pPr marL="1371600" algn="l" defTabSz="342900" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1350" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl5pPr><a:lvl6pPr marL="1714500" algn="l" defTabSz="342900" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1350" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl6pPr><a:lvl7pPr marL="2057400" algn="l" defTabSz="342900" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1350" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl7pPr><a:lvl8pPr marL="2400300" algn="l" defTabSz="342900" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1350" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl8pPr><a:lvl9pPr marL="2743200" algn="l" defTabSz="342900" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1350" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mn-ea"/><a:cs typeface="+mn-cs"/></a:defRPr></a:lvl9pPr></p:otherStyle></p:txStyles></p:sldMaster>
data/pptx/ppt/slides/slide1.xml view
@@ -1,2 +1,2 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<p:sld xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main"><p:cSld><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Title 1"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="ctrTitle"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang="en-US" dirty="0" smtClean="0"/><a:t>Presentation Title</a:t></a:r><a:endParaRPr lang="en-US" dirty="0"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Subtitle 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="subTitle" idx="1"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang="en-US" dirty="0" smtClean="0"/><a:t>Presentation Subtitle</a:t></a:r><a:endParaRPr lang="en-US" dirty="0"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="392669009"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sld>+<p:sld xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main"><p:cSld><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Title 1"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="ctrTitle"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang="en-US" dirty="0"/><a:t>Presentation Title</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Subtitle 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="subTitle" idx="1"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang="en-US" dirty="0"/><a:t>Presentation Subtitle</a:t></a:r></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="392669009"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sld>
data/pptx/ppt/slides/slide2.xml view
@@ -1,2 +1,2 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<p:sld xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main"><p:cSld><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Title 1"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="title"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang="en-US" dirty="0" smtClean="0"/><a:t>Slide Title</a:t></a:r><a:endParaRPr lang="en-US" dirty="0"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Content Placeholder 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph idx="1"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:pPr marL="0" indent="0"><a:buNone/></a:pPr><a:r><a:rPr lang="en-US" dirty="0" smtClean="0"/><a:t>Hello</a:t></a:r><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>, world.</a:t></a:r><a:endParaRPr lang="en-US"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="572707455"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sld>+<p:sld xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main"><p:cSld><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Title 1"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="title"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang="en-US" dirty="0"/><a:t>Slide Title</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Content Placeholder 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph idx="1"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:pPr marL="0" indent="0"><a:buNone/></a:pPr><a:r><a:rPr lang="en-US" dirty="0"/><a:t>Hello</a:t></a:r><a:r><a:rPr lang="en-US"/><a:t>, world.</a:t></a:r></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="572707455"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sld>
data/pptx/ppt/slides/slide3.xml view
@@ -1,2 +1,2 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<p:sld xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main"><p:cSld><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Title 1"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="title"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang="en-US" dirty="0" smtClean="0"/><a:t>Section header</a:t></a:r><a:endParaRPr lang="en-US" dirty="0"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Text Placeholder 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="body" idx="1"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang="en-US" dirty="0" smtClean="0"/><a:t>Some explanatory text</a:t></a:r><a:endParaRPr lang="en-US" dirty="0"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="3996781534"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sld>+<p:sld xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main"><p:cSld><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="2" name="Title 1"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="title"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang="en-US" dirty="0"/><a:t>Section header</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="3" name="Text Placeholder 2"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="body" idx="1"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang="en-US" dirty="0"/><a:t>Some explanatory text</a:t></a:r></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="3996781534"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sld>
data/pptx/ppt/slides/slide4.xml view
@@ -1,2 +1,2 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<p:sld xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main"><p:cSld><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="4" name="Title 3"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="title"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang="en-US" dirty="0" smtClean="0"/><a:t>Slide Title for Two-Content</a:t></a:r><a:endParaRPr lang="en-US" dirty="0"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="5" name="Content Placeholder 4"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph sz="half" idx="1"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang="en-US" dirty="0" smtClean="0"/><a:t>Some content on </a:t></a:r><a:r><a:rPr lang="en-US" smtClean="0"/><a:t>the left.</a:t></a:r><a:endParaRPr lang="en-US" dirty="0" smtClean="0"/></a:p><a:p><a:pPr marL="0" indent="0"><a:buNone/></a:pPr><a:endParaRPr lang="en-US" dirty="0"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="6" name="Content Placeholder 5"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph sz="half" idx="2"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang="en-US" dirty="0" smtClean="0"/><a:t>Some content on the right.</a:t></a:r><a:endParaRPr lang="en-US" dirty="0"/></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="1324621109"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sld>+<p:sld xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main"><p:cSld><p:spTree><p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/><a:chOff x="0" y="0"/><a:chExt cx="0" cy="0"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id="4" name="Title 3"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph type="title"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang="en-US" dirty="0"/><a:t>Slide Title for Two-Content</a:t></a:r></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="5" name="Content Placeholder 4"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph sz="half" idx="1"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang="en-US" dirty="0"/><a:t>Some content on </a:t></a:r><a:r><a:rPr lang="en-US"/><a:t>the left.</a:t></a:r><a:endParaRPr lang="en-US" dirty="0"/></a:p><a:p><a:pPr marL="0" indent="0"><a:buNone/></a:pPr><a:endParaRPr lang="en-US" dirty="0"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id="6" name="Content Placeholder 5"/><p:cNvSpPr><a:spLocks noGrp="1"/></p:cNvSpPr><p:nvPr><p:ph sz="half" idx="2"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang="en-US" dirty="0"/><a:t>Some content on the right.</a:t></a:r></a:p></p:txBody></p:sp></p:spTree><p:extLst><p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}"><p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="1324621109"/></p:ext></p:extLst></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sld>
data/pptx/ppt/viewProps.xml view
@@ -1,2 +1,2 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<p:viewPr xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main"><p:normalViewPr><p:restoredLeft sz="15633" autoAdjust="0"/><p:restoredTop sz="94711" autoAdjust="0"/></p:normalViewPr><p:slideViewPr><p:cSldViewPr snapToGrid="0" snapToObjects="1"><p:cViewPr varScale="1"><p:scale><a:sx n="84" d="100"/><a:sy n="84" d="100"/></p:scale><p:origin x="1278" y="60"/></p:cViewPr><p:guideLst><p:guide orient="horz" pos="2160"/><p:guide pos="2880"/></p:guideLst></p:cSldViewPr></p:slideViewPr><p:outlineViewPr><p:cViewPr><p:scale><a:sx n="33" d="100"/><a:sy n="33" d="100"/></p:scale><p:origin x="0" y="0"/></p:cViewPr></p:outlineViewPr><p:notesTextViewPr><p:cViewPr><p:scale><a:sx n="100" d="100"/><a:sy n="100" d="100"/></p:scale><p:origin x="0" y="0"/></p:cViewPr></p:notesTextViewPr><p:gridSpacing cx="76200" cy="76200"/></p:viewPr>+<p:viewPr xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" lastView="sldThumbnailView"><p:normalViewPr><p:restoredLeft sz="15643" autoAdjust="0"/><p:restoredTop sz="94694" autoAdjust="0"/></p:normalViewPr><p:slideViewPr><p:cSldViewPr snapToGrid="0" snapToObjects="1"><p:cViewPr varScale="1"><p:scale><a:sx n="161" d="100"/><a:sy n="161" d="100"/></p:scale><p:origin x="560" y="200"/></p:cViewPr><p:guideLst><p:guide orient="horz" pos="1620"/><p:guide pos="2880"/></p:guideLst></p:cSldViewPr></p:slideViewPr><p:outlineViewPr><p:cViewPr><p:scale><a:sx n="33" d="100"/><a:sy n="33" d="100"/></p:scale><p:origin x="0" y="0"/></p:cViewPr></p:outlineViewPr><p:notesTextViewPr><p:cViewPr><p:scale><a:sx n="100" d="100"/><a:sy n="100" d="100"/></p:scale><p:origin x="0" y="0"/></p:cViewPr></p:notesTextViewPr><p:gridSpacing cx="76200" cy="76200"/></p:viewPr>
data/templates/affiliations.jats view
@@ -1,38 +1,36 @@ $-- $-- Affiliations $---$for(affiliation)$-<aff id="aff-$affiliation.id$">+<aff id="aff-$it.id$"> $-- wrap affiliation if it has a known institution identifier-$if(affiliation.group)$-<institution content-type="group">$affiliation.group$</institution>+$if(it.group)$+<institution content-type="group">${it.group}</institution> $endif$-$if(affiliation.department)$-<institution content-type="dept">$affiliation.department$</institution>+$if(it.department)$+<institution content-type="dept">${it.department}</institution> $endif$ <institution-wrap>-$if(affiliation.organization)$-<institution>$affiliation.organization$</institution>+$if(it.organization)$+<institution>${it.organization}</institution> $else$-<institution>$affiliation.name$</institution>+<institution>${it.name}</institution> $endif$-$if(affiliation.isni)$-<institution-id institution-id-type="ISNI">$affiliation.isni$</institution-id>+$if(it.isni)$+<institution-id institution-id-type="ISNI">${it.isni}</institution-id> $endif$-$if(affiliation.ringgold)$-<institution-id institution-id-type="Ringgold">$affiliation.ringgold$</institution-id>+$if(it.ringgold)$+<institution-id institution-id-type="Ringgold">${it.ringgold}</institution-id> $endif$-$if(affiliation.ror)$-<institution-id institution-id-type="ROR">$affiliation.ror$</institution-id>+$if(it.ror)$+<institution-id institution-id-type="ROR">${it.ror}</institution-id> $endif$-$for(affiliation.pid)$-<institution-id institution-id-type="$affiliation.pid.type$">$affiliation.pid.id$</institution-id>+$for(it.pid)$+<institution-id institution-id-type="${it.type}">${it.id}</institution-id> $endfor$-</institution-wrap>$if(affiliation.street-address)$,-$for(affiliation.street-address)$-<addr-line>$affiliation.street-address$</addr-line>$sep$,+</institution-wrap>$if(it.street-address)$,+$for(it.street-address)$+<addr-line>${it}</addr-line>$sep$, $endfor$-$else$$if(affiliation.city)$, <city>$affiliation.city$</city>$endif$$endif$$if(affiliation.country)$,-<country$if(affiliation.country-code)$ country="$affiliation.country-code$"$endif$>$affiliation.country$</country>$endif$+$else$$if(it.city)$, <city>$it.city$</city>$endif$$endif$$if(it.country)$,+<country$if(it.country-code)$ country="$it.country-code$"$endif$>$it.country$</country>$endif$ </aff>-$endfor$
data/templates/article.jats_publishing view
@@ -81,6 +81,9 @@ $if(title)$ <title-group> <article-title>$title$</article-title>+$if(subtitle)$+<subtitle>${subtitle}</subtitle>+$endif$ </title-group> $endif$ $if(author)$@@ -103,15 +106,25 @@ $if(author.email)$ <email>$author.email$</email> $endif$+$-- if affiliations are listed separately, then create links. Otherwise+$-- include them here.+$if(affiliation)$ $for(author.affiliation)$ <xref ref-type="aff" rid="aff-$author.affiliation$"/> $endfor$+$else$+$for(author.affiliation)$+${ it:affiliations.jats() }+$endfor$+$endif$ $if(author.cor-id)$ <xref ref-type="corresp" rid="cor-$author.cor-id$"><sup>*</sup></xref> $endif$ </contrib> $endfor$-${ affiliations.jats() }+$for(affiliation)$+${ it:affiliations.jats() }+$endfor$ </contrib-group> $endif$ $if(article.author-notes)$
data/templates/default.context view
@@ -26,7 +26,7 @@  % make chapter, section bookmarks visible when opening document \placebookmarks[chapter, section, subsection, subsubsection, subsubsubsection, subsubsubsubsection][chapter, section]-\setupinteractionscreen[option=bookmark]+\setupinteractionscreen[option={bookmark,title}]  $if(papersize)$ \setuppapersize[$for(papersize)$$papersize$$sep$,$endfor$]
data/templates/default.epub2 view
@@ -6,11 +6,12 @@   <meta http-equiv="Content-Style-Type" content="text/css" />   <meta name="generator" content="pandoc" />   <title>$pagetitle$</title>-$if(highlighting-css)$   <style type="text/css">-$highlighting-css$-  </style>+    $styles.html()$+$if(highlighting-css)$+    $highlighting-css$ $endif$+  </style> $for(css)$   <link rel="stylesheet" type="text/css" href="$css$" /> $endfor$@@ -44,6 +45,12 @@ $endif$ $if(rights)$   <div class="rights">$rights$</div>+$endif$+$if(abstract)$+<div class="abstract">+<div class="abstract-title">$abstract-title$</div>+$abstract$+</div> $endif$ $else$ $if(coverpage)$
data/templates/default.epub3 view
@@ -5,11 +5,12 @@   <meta charset="utf-8" />   <meta name="generator" content="pandoc" />   <title>$pagetitle$</title>-$if(highlighting-css)$   <style>-$highlighting-css$-  </style>+    $styles.html()$+$if(highlighting-css)$+    $highlighting-css$ $endif$+  </style> $for(css)$   <link rel="stylesheet" type="text/css" href="$css$" /> $endfor$@@ -44,6 +45,12 @@ $endif$ $if(rights)$   <div class="rights">$rights$</div>+$endif$+$if(abstract)$+<div class="abstract">+<div class="abstract-title">$abstract-title$</div>+$abstract$+</div> $endif$ </section> $else$
data/templates/default.html4 view
@@ -46,6 +46,12 @@ $if(date)$ <h3 class="date">$date$</h3> $endif$+$if(abstract)$+<div class="abstract">+<div class="abstract-title">$abstract-title$</div>+$abstract$+</div>+$endif$ </div> $endif$ $if(toc)$
data/templates/default.html5 view
@@ -49,6 +49,12 @@ $if(date)$ <p class="date">$date$</p> $endif$+$if(abstract)$+<div class="abstract">+<div class="abstract-title">$abstract-title$</div>+$abstract$+</div>+$endif$ </header> $endif$ $if(toc)$
data/templates/default.jats_articleauthoring view
@@ -14,6 +14,9 @@ $if(title)$ <title-group> <article-title>$title$</article-title>+$if(subtitle)$+<subtitle>${subtitle}</subtitle>+$endif$ </title-group> $endif$ $if(author)$@@ -33,18 +36,17 @@ $else$ <string-name>$author$</string-name> $endif$+$for(author.affiliation)$+${ it:affiliations.jats() }+$endfor$ $if(author.email)$ <email>$author.email$</email> $endif$-$for(author.affiliation)$-<xref ref-type="aff" rid="aff-$author.affiliation$"/>-$endfor$ $if(author.cor-id)$ <xref ref-type="corresp" rid="cor-$author.cor-id$"><sup>*</sup></xref> $endif$ </contrib> $endfor$-${ affiliations.jats() } </contrib-group> $endif$ $if(copyright)$
+ data/templates/default.markua view
@@ -0,0 +1,21 @@+$if(titleblock)$+$titleblock$++$endif$+$for(header-includes)$+$header-includes$++$endfor$+$for(include-before)$+$include-before$++$endfor$+$if(toc)$+$table-of-contents$++$endif$+$body$+$for(include-after)$++$include-after$+$endfor$
data/templates/styles.html view
@@ -73,6 +73,19 @@   border-left: 2px solid #e6e6e6;   color: #606060; }+$if(abstract)$+div.abstract {+  margin: 2em 2em 2em 2em;+  text-align: left;+  font-size: 85%;+}+div.abstract-title {+  font-weight: bold;+  text-align: center;+  padding: 0;+  margin-bottom: 0.5em;+}+$endif$ code {   font-family: $if(monofont)$$monofont$$else$Menlo, Monaco, 'Lucida Console', Consolas, monospace$endif$; $if(monobackgroundcolor)$
man/pandoc.1 view
@@ -1,7 +1,7 @@ '\" t-.\" Automatically generated by Pandoc 2.16.1+.\" Automatically generated by Pandoc 2.16.2 .\"-.TH "Pandoc User\[cq]s Guide" "" "November 20, 2021" "pandoc 2.16.2" ""+.TH "Pandoc User\[cq]s Guide" "" "January 12, 2022" "pandoc 2.17" "" .hy .SH NAME pandoc - general markup converter@@ -388,6 +388,8 @@ .IP \[bu] 2 \f[C]markdown_strict\f[R] (original unextended Markdown) .IP \[bu] 2+\f[C]markua\f[R] (Markua)+.IP \[bu] 2 \f[C]mediawiki\f[R] (MediaWiki markup) .IP \[bu] 2 \f[C]ms\f[R] (roff ms)@@ -823,7 +825,6 @@ from the source document (that is, where there are nonsemantic newlines in the source, there will be nonsemantic newlines in the output as well).-Automatic wrapping does not currently work in HTML output. In \f[C]ipynb\f[R] output, this option affects wrapping of the contents of markdown cells. .TP@@ -2478,6 +2479,11 @@ document summary, included in LaTeX, ConTeXt, AsciiDoc, and docx documents .TP+\f[B]\f[CB]abstract-title\f[B]\f[R]+title of abstract, currently used only in HTML and EPUB.+This will be set automatically to a localized value, depending on+\f[C]lang\f[R], but can be manually overridden.+.TP \f[B]\f[CB]keywords\f[B]\f[R] list of keywords to be included in HTML, PDF, ODT, pptx, docx and AsciiDoc metadata; repeat as for \f[C]author\f[R], above@@ -3540,6 +3546,17 @@ .PP Some aspects of Pandoc\[cq]s Markdown citation syntax are also accepted in \f[C]org\f[R] input.+.SS Extension: \f[C]fancy_lists\f[R]+.PP+Some aspects of Pandoc\[cq]s Markdown fancy lists are also accepted in+\f[C]org\f[R] input, mimicking the option+\f[C]org-list-allow-alphabetical\f[R] in Emacs.+As in Org Mode, enabling this extension allows lowercase and uppercase+alphabetical markers for ordered lists to be parsed in addition to+arabic ones.+Note that for Org, this does not include roman numerals or the+\f[C]#\f[R] placeholder that are enabled by the extension in+Pandoc\[cq]s Markdown. .SS Extension: \f[C]element_citations\f[R] .PP In the \f[C]jats\f[R] output formats, this causes reference items to be@@ -3556,7 +3573,7 @@ .PP Pandoc understands an extended and slightly revised version of John Gruber\[cq]s Markdown syntax.-This document explains the syntax, noting differences from standard+This document explains the syntax, noting differences from original Markdown. Except where noted, these differences can be suppressed by using the \f[C]markdown_strict\f[R] format instead of \f[C]markdown\f[R].@@ -3645,7 +3662,7 @@ .fi .SS Extension: \f[C]blank_before_header\f[R] .PP-Standard Markdown syntax does not require a blank line before a heading.+Original Markdown syntax does not require a blank line before a heading. Pandoc does require this (except, of course, at the beginning of the document). The reason for the requirement is that it is all too easy for a@@ -3849,7 +3866,7 @@ .fi .SS Extension: \f[C]blank_before_blockquote\f[R] .PP-Standard Markdown syntax does not require a blank line before a block+Original Markdown syntax does not require a blank line before a block quote. Pandoc does require this (except, of course, at the beginning of the document).@@ -4162,7 +4179,7 @@ Ordered lists work just like bulleted lists, except that the items begin with enumerators rather than bullets. .PP-In standard Markdown, enumerators are decimal numbers followed by a+In original Markdown, enumerators are decimal numbers followed by a period and a space. The numbers themselves are ignored, so there is no difference between this list:@@ -4186,7 +4203,7 @@ .fi .SS Extension: \f[C]fancy_lists\f[R] .PP-Unlike standard Markdown, pandoc allows ordered list items to be marked+Unlike original Markdown, pandoc allows ordered list items to be marked with uppercase and lowercase letters and roman numerals, in addition to Arabic numerals. List markers may be enclosed in parentheses or followed by a single@@ -4656,11 +4673,11 @@ .PP The cells of pipe tables cannot contain block elements like paragraphs and lists, and cannot span multiple lines.-If a pipe table contains a row whose Markdown content is wider than the-column width (see \f[C]--columns\f[R]), then the table will take up the-full text width and the cell contents will wrap, with the relative cell-widths determined by the number of dashes in the line separating the-table header from the table body.+If any line of the markdown source is longer than the column width (see+\f[C]--columns\f[R]), then the table will take up the full text width+and the cell contents will wrap, with the relative cell widths+determined by the number of dashes in the line separating the table+header from the table body. (For example \f[C]---|-\f[R] would make the first column 3/4 and the second column 1/4 of the full text width.) On the other hand, if no lines are wider than column width, then cell@@ -4995,7 +5012,7 @@ \f[R] .fi .PP-This rule is easier to remember than standard Markdown\[cq]s rule, which+This rule is easier to remember than original Markdown\[cq]s rule, which allows only the following characters to be backslash-escaped: .IP .nf@@ -5004,7 +5021,7 @@ \f[R] .fi .PP-(However, if the \f[C]markdown_strict\f[R] format is used, the standard+(However, if the \f[C]markdown_strict\f[R] format is used, the original Markdown rule will be used.) .PP A backslash-escaped space is parsed as a nonbreaking space.@@ -5295,7 +5312,7 @@ rendered with HTML syntax if they cannot use pipe syntax. .SS Extension: \f[C]markdown_in_html_blocks\f[R] .PP-Standard Markdown allows you to include HTML \[lq]blocks\[rq]: blocks of+Original Markdown allows you to include HTML \[lq]blocks\[rq]: blocks of HTML between balanced tags that are separated from the surrounding text with blank lines, and start and end at the left margin. Within these blocks, everything is interpreted as HTML, not Markdown; so@@ -5336,7 +5353,7 @@ \f[C]<style>\f[R], and \f[C]<textarea>\f[R] tags is not interpreted as Markdown. .PP-This departure from standard Markdown should make it easier to mix+This departure from original Markdown should make it easier to mix Markdown with HTML block elements. For example, one can surround a block of Markdown text with \f[C]<div>\f[R] tags without preventing it from being interpreted as@@ -5673,7 +5690,7 @@ .fi .PP Note that in reveal.js slide shows, an image in a paragraph by itself-that has the \f[C]stretch\f[R] class will fill the screen, and the+that has the \f[C]r-stretch\f[R] class will fill the screen, and the caption and figure tags will be omitted. .SS Extension: \f[C]link_attributes\f[R] .PP@@ -6226,7 +6243,7 @@ .PP Include source position attributes when parsing \f[C]commonmark\f[R]. For elements that accept attributes, a \f[C]data-pos\f[R] attribute is-added; other elements are placed in a surrounding Div or Span elemnet+added; other elements are placed in a surrounding Div or Span element with a \f[C]data-pos\f[R] attribute. .SS Extension: \f[C]short_subsuperscripts\f[R] .PP@@ -7534,6 +7551,20 @@ Note that this only works for images; the other media elements have no native representation in pandoc\[cq]s AST and requires the use of raw HTML.+.SS EPUB styling+.PP+By default, pandoc will include some basic styling contained in its+\f[C]epub.css\f[R] data file.+(To see this, use \f[C]pandoc --print-default-data-file epub.css\f[R].)+To use a different CSS file, just use the \f[C]--css\f[R] command line+option.+A few inline styles are defined in addition; these are essential for+correct formatting of pandoc\[cq]s HTML output.+.PP+The \f[C]document-css\f[R] variable may be set if the more opinionated+styling of pandoc\[cq]s default HTML templates is desired (and in that+case the variables defined in Variables for HTML may be used to+fine-tune the style). .SH JUPYTER NOTEBOOKS .PP When creating a Jupyter notebook, pandoc will try to infer the notebook@@ -7941,7 +7972,7 @@ sanitizer. .SH AUTHORS .PP-Copyright 2006\[en]2021 John MacFarlane (jgm\[at]berkeley.edu).+Copyright 2006\[en]2022 John MacFarlane (jgm\[at]berkeley.edu). Released under the GPL, version 2 or greater. This software carries no warranty of any kind. (See COPYRIGHT for full copyright and warranty notices.)
pandoc.cabal view
@@ -1,10 +1,10 @@ cabal-version:   2.4 name:            pandoc-version:         2.16.2+version:         2.17 build-type:      Simple license:         GPL-2.0-or-later license-file:    COPYING.md-copyright:       (c) 2006-2021 John MacFarlane+copyright:       (c) 2006-2022 John MacFarlane author:          John MacFarlane <jgm@berkeley.edu> maintainer:      John MacFarlane <jgm@berkeley.edu> bug-reports:     https://github.com/jgm/pandoc/issues@@ -15,31 +15,35 @@ synopsis:        Conversion between markup formats description:     Pandoc is a Haskell library for converting from one markup                  format to another, and a command-line tool that uses-                 this library. It can read several dialects of Markdown and-                 (subsets of) HTML, reStructuredText, LaTeX, DocBook, JATS,-                 MediaWiki markup, DokuWiki markup, TWiki markup,-                 TikiWiki markup, Jira markup, Creole 1.0, Haddock markup,-                 OPML, Emacs Org-Mode, Emacs Muse, txt2tags, ipynb (Jupyter-                 notebooks), Vimwiki, Word Docx, ODT, EPUB, FictionBook2,-                 roff man, Textile, BibTeX, BibLaTeX, CSL JSON,-                 , and CSV, and it can write Markdown,-                 reStructuredText, XHTML, HTML 5, LaTeX, ConTeXt, DocBook,-                 JATS, OPML, TEI, OpenDocument, ODT, Word docx,-                 PowerPoint pptx, RTF, MediaWiki, DokuWiki, XWiki,-                 ZimWiki, Textile, Jira, roff man, roff ms, plain text,-                 Emacs Org-Mode, AsciiDoc, Haddock markup,-                 EPUB (v2 and v3), ipynb, FictionBook2,-                 InDesign ICML, Muse, CSL JSON, LaTeX beamer slides,-                 and several kinds of HTML/JavaScript slide shows-                 (S5, Slidy, Slideous, DZSlides, reveal.js).+                 this library. The formats it can handle include                  .-                 In contrast to most existing tools for converting Markdown-                 to HTML, pandoc has a modular design: it consists of a set of-                 readers, which parse text in a given format and produce a-                 native representation of the document, and a set of writers,-                 which convert this native representation into a target-                 format. Thus, adding an input or output format requires-                 only adding a reader or writer.+                 - light markup formats (many variants of Markdown,+                   reStructuredText, AsciiDoc, Org-mode, Muse, Textile,+                   txt2tags)+                 - HTML formats (HTML 4 and 5)+                 - Ebook formats (EPUB v2 and v3, FB2)+                 - Documentation formats (GNU TexInfo, Haddock)+                 - Roff formats (man, ms)+                 - TeX formats (LaTeX, ConTeXt)+                 - XML formats (DocBook 4 and 5, JATS, TEI Simple, OpenDocument)+                 - Outline formats (OPML)+                 - Bibliography formats (BibTeX, BibLaTeX, CSL JSON, CSL YAML)+                 - Word processor formats (Docx, RTF, ODT)+                 - Interactive notebook formats (Jupyter notebook ipynb)+                 - Page layout formats (InDesign ICML)+                 - Wiki markup formats (MediaWiki, DokuWiki, TikiWiki, TWiki,+                   Vimwiki, XWiki, ZimWiki, Jira wiki, Creole)+                 - Slide show formats (LaTeX Beamer, PowerPoint, Slidy,+                   reveal.js, Slideous, S5, DZSlides)+                 - Data formats (CSV tables)+                 - PDF (via external programs such as pdflatex or wkhtmltopdf)+                 .+                 Pandoc can convert mathematical content in documents+                 between TeX, MathML, Word equations, roff eqn, and plain text.+                 It includes a powerful system for automatic citations+                 and bibliographies, and it can be customized extensively+                 using templates, filters, and custom readers and writers+                 written in Lua. data-files:                  -- templates                  data/templates/styles.html@@ -86,6 +90,7 @@                  data/templates/default.epub3                  data/templates/article.jats_publishing                  data/templates/affiliations.jats+                 data/templates/default.markua                  -- translations                  data/translations/*.yaml                  -- source files for reference.docx@@ -177,10 +182,6 @@                  data/creole.lua                  -- lua init script                  data/init.lua-                 -- pandoc lua module-                 data/pandoc.lua-                 -- lua List module-                 data/pandoc.List.lua                  -- bash completion template                  data/bash_completion.tpl                  -- citeproc@@ -245,6 +246,7 @@                  test/command/bar.tex                  test/command/bar-endinput.tex                  test/command/yaml-metadata.yaml+                 test/command/7813-meta.yaml                  test/command/3510-subdoc.org                  test/command/3510-export.latex                  test/command/3510-src.hs@@ -295,6 +297,7 @@                  test/tables.ms                  test/tables.plain                  test/tables.markdown+                 test/tables.markua                  test/tables.mediawiki                  test/tables.tei                  test/tables.textile@@ -330,6 +333,7 @@                  test/writer.man                  test/writer.ms                  test/writer.markdown+                 test/writer.markua                  test/writer.plain                  test/writer.mediawiki                  test/writer.textile@@ -383,9 +387,12 @@                  test/pptx/*.pptx                  test/pptx/**/*.pptx                  test/pptx/**/*.native+                 test/ipynb/*.native                  test/ipynb/*.in.native                  test/ipynb/*.out.native                  test/ipynb/*.ipynb+                 test/ipynb/*.out.ipynb+                 test/ipynb/*.out.html                  test/txt2tags.t2t                  test/twiki-reader.twiki                  test/tikiwiki-reader.tikiwiki@@ -394,6 +401,8 @@                  test/odt/native/*.native                  test/lua/*.lua                  test/lua/module/*.lua+                 test/lua/module/partial.test+                 test/lua/module/tiny.epub source-repository head   type:          git   location:      git://github.com/jgm/pandoc.git@@ -450,9 +459,9 @@                  blaze-markup          >= 0.8      && < 0.9,                  bytestring            >= 0.9      && < 0.12,                  case-insensitive      >= 1.2      && < 1.3,-                 citeproc              >= 0.6      && < 0.7,+                 citeproc              >= 0.6.0.1  && < 0.7,                  commonmark            >= 0.2.1.1  && < 0.3,-                 commonmark-extensions >= 0.2.2    && < 0.3,+                 commonmark-extensions >= 0.2.3    && < 0.3,                  commonmark-pandoc     >= 0.2.1.1  && < 0.3,                  connection            >= 0.3.1,                  containers            >= 0.4.2.1  && < 0.7,@@ -467,6 +476,7 @@                  filepath              >= 1.1      && < 1.5,                  haddock-library       >= 1.10     && < 1.11,                  hslua                 >= 2.0.1    && < 2.1,+                 hslua-aeson           >= 2.0.1    && < 2.1,                  hslua-marshalling     >= 2.0.1    && < 2.1,                  hslua-module-path     >= 1.0      && < 1.1,                  hslua-module-system   >= 1.0      && < 1.1,@@ -475,12 +485,13 @@                  http-client           >= 0.4.30   && < 0.8,                  http-client-tls       >= 0.2.4    && < 0.4,                  http-types            >= 0.8      && < 0.13,-                 ipynb                 >= 0.1.0.2  && < 0.2,+                 ipynb                 >= 0.2      && < 0.3,                  jira-wiki-markup      >= 1.4      && < 1.5,                  lpeg                  >= 1.0.1    && < 1.1,                  mtl                   >= 2.2      && < 2.3,                  network               >= 2.6,                  network-uri           >= 2.6      && < 2.8,+                 pandoc-lua-marshal    >= 0.1.3    && < 0.2,                  pandoc-types          >= 1.22.1   && < 1.23,                  parsec                >= 3.1      && < 3.2,                  pretty                >= 1.1      && < 1.2,@@ -495,12 +506,12 @@                  syb                   >= 0.1      && < 0.8,                  tagsoup               >= 0.14.6   && < 0.15,                  temporary             >= 1.1      && < 1.4,-                 texmath               >= 0.12.3.2 && < 0.12.4,-                 text                  >= 1.1.1.0  && < 1.3,+                 texmath               >= 0.12.4   && < 0.12.5,+                 text                  >= 1.1.1.0  && < 2.1,                  text-conversions      >= 0.3      && < 0.4,                  time                  >= 1.5      && < 1.14,                  unicode-collation     >= 0.1.1    && < 0.2,-                 unicode-transforms    >= 0.3      && < 0.4,+                 unicode-transforms    >= 0.3      && < 0.5,                  xml                   >= 1.3.12   && < 1.4,                  xml-conduit           >= 1.9.1.1  && < 1.10,                  yaml                  >= 0.11     && < 0.12,@@ -622,6 +633,7 @@                    Text.Pandoc.Class.PandocIO,                    Text.Pandoc.Class.PandocPure,                    Text.Pandoc.Class.Sandbox,+                   Text.Pandoc.Filter.Environment,                    Text.Pandoc.Filter.JSON,                    Text.Pandoc.Filter.Lua,                    Text.Pandoc.Filter.Path,@@ -683,31 +695,31 @@                    Text.Pandoc.Writers.Markdown.Types,                    Text.Pandoc.Writers.Markdown.Inline,                    Text.Pandoc.Writers.Roff,+                   Text.Pandoc.Writers.Blaze,                    Text.Pandoc.Writers.Powerpoint.Presentation,                    Text.Pandoc.Writers.Powerpoint.Output,                    Text.Pandoc.Lua.ErrorConversion,                    Text.Pandoc.Lua.Filter,                    Text.Pandoc.Lua.Global,                    Text.Pandoc.Lua.Init,-                   Text.Pandoc.Lua.Marshaling,-                   Text.Pandoc.Lua.Marshaling.AST,-                   Text.Pandoc.Lua.Marshaling.Attr,-                   Text.Pandoc.Lua.Marshaling.CommonState,-                   Text.Pandoc.Lua.Marshaling.Context,-                   Text.Pandoc.Lua.Marshaling.List,-                   Text.Pandoc.Lua.Marshaling.ListAttributes,-                   Text.Pandoc.Lua.Marshaling.PandocError,-                   Text.Pandoc.Lua.Marshaling.ReaderOptions,-                   Text.Pandoc.Lua.Marshaling.SimpleTable,+                   Text.Pandoc.Lua.Marshal.CommonState,+                   Text.Pandoc.Lua.Marshal.Context,+                   Text.Pandoc.Lua.Marshal.PandocError,+                   Text.Pandoc.Lua.Marshal.ReaderOptions,+                   Text.Pandoc.Lua.Marshal.Reference,+                   Text.Pandoc.Lua.Marshal.Sources,+                   Text.Pandoc.Lua.Marshal.Template,+                   Text.Pandoc.Lua.Marshal.WriterOptions,                    Text.Pandoc.Lua.Module.MediaBag,                    Text.Pandoc.Lua.Module.Pandoc,                    Text.Pandoc.Lua.Module.System,+                   Text.Pandoc.Lua.Module.Template,                    Text.Pandoc.Lua.Module.Types,                    Text.Pandoc.Lua.Module.Utils,+                   Text.Pandoc.Lua.Orphans,                    Text.Pandoc.Lua.Packages,                    Text.Pandoc.Lua.PandocLua,                    Text.Pandoc.Lua.Util,-                   Text.Pandoc.Lua.Walk,                    Text.Pandoc.XML.Light,                    Text.Pandoc.XML.Light.Types,                    Text.Pandoc.XML.Light.Proc,@@ -742,7 +754,11 @@   main-is:         trypandoc.hs   hs-source-dirs:  trypandoc   if flag(trypandoc)-    build-depends: aeson, http-types, text, wai >= 0.3, wai-extra >= 3.0.24+    build-depends: aeson,+                   http-types,+                   text,+                   wai >= 0.3,+                   wai-extra >= 3.0.24     buildable:     True   else     buildable:     False@@ -755,7 +771,6 @@   build-depends:  pandoc,                   Diff              >= 0.2     && < 0.5,                   Glob              >= 0.7     && < 0.11,-                  QuickCheck        >= 2.4     && < 2.15,                   bytestring        >= 0.9     && < 0.12,                   containers        >= 0.4.2.1 && < 0.7,                   directory         >= 1.2.3   && < 1.4,@@ -771,7 +786,7 @@                   tasty-hunit       >= 0.9     && < 0.11,                   tasty-lua         >= 1.0     && < 1.1,                   tasty-quickcheck  >= 0.8     && < 0.11,-                  text              >= 1.1.1.0  && < 1.3,+                  text              >= 1.1.1.0 && < 2.1,                   time              >= 1.5     && < 1.14,                   xml               >= 1.3.12  && < 1.4,                   zip-archive       >= 0.2.3.4 && < 0.5@@ -825,6 +840,7 @@                   Tests.Writers.Docx                   Tests.Writers.RST                   Tests.Writers.TEI+                  Tests.Writers.Markua                   Tests.Writers.Muse                   Tests.Writers.FB2                   Tests.Writers.Powerpoint@@ -840,7 +856,7 @@   build-depends:   bytestring,                    tasty-bench >= 0.2     && <= 0.4,                    mtl         >= 2.2     && < 2.3,-                   text        >= 1.1.1.0 && < 1.3,+                   text        >= 1.1.1.0 && < 2.1,                    deepseq   -- we increase heap size to avoid benchmarking garbage collection:   ghc-options:     -rtsopts -with-rtsopts=-A8m -threaded
src/Text/Pandoc.hs view
@@ -3,7 +3,7 @@ {-# LANGUAGE ScopedTypeVariables #-} {- |    Module      : Text.Pandoc-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/App.hs view
@@ -5,7 +5,7 @@ {-# LANGUAGE ScopedTypeVariables #-} {- |    Module      : Text.Pandoc.App-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley@edu>@@ -60,7 +60,8 @@                                            options) import Text.Pandoc.App.OutputSettings (OutputSettings (..), optToOutputSettings) import Text.Collate.Lang (Lang (..), parseLang)-import Text.Pandoc.Filter (Filter (JSONFilter, LuaFilter), applyFilters)+import Text.Pandoc.Filter (Filter (JSONFilter, LuaFilter), Environment (..),+                           applyFilters) import Text.Pandoc.PDF (makePDF) import Text.Pandoc.SelfContained (makeSelfContained) import Text.Pandoc.Shared (eastAsianLineBreakFilter, stripEmptyParagraphs,@@ -115,8 +116,6 @@     setInputFiles (fromMaybe ["-"] (optInputFiles opts))     setOutputFile (optOutputFile opts) -    inputs <- readSources sources-     -- assign reader and writer based on options and filenames     readerName <- case optFrom opts of                        Just f  -> return f@@ -280,6 +279,10 @@           maybe id (setMeta "citation-abbreviations")                          (optCitationAbbreviations opts) $ mempty +    let filterEnv = Environment readerOpts writerOptions++    inputs <- readSources sources+     doc <- (case reader of              TextReader r                | readerNameBase == "json" ->@@ -305,7 +308,7 @@               >=> return . adjustMetadata (<> optMetadata opts)               >=> return . adjustMetadata (<> cslMetadata)               >=> applyTransforms transforms-              >=> applyFilters readerOpts filters [T.unpack format]+              >=> applyFilters filterEnv filters [T.unpack format]               >=> maybe return extractMedia (optExtractMedia opts)               ) 
src/Text/Pandoc/App/CommandLineOptions.hs view
@@ -6,7 +6,7 @@ {-# LANGUAGE FlexibleContexts    #-} {- |    Module      : Text.Pandoc.App.CommandLineOptions-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley@edu>@@ -842,20 +842,23 @@                            case arg of                              Nothing  -> extensionsFromList extList                              Just fmt -> getAllExtensions $ T.pack fmt-                     let defExts =-                           case arg of-                             Nothing   -> getDefaultExtensions-                                           "markdown"-                             Just fmt  -> getDefaultExtensions $ T.pack fmt-                     let showExt x =-                           (if extensionEnabled x defExts-                               then '+'-                               else if extensionEnabled x allExts-                                       then '-'-                                       else ' ') : drop 4 (show x)-                     mapM_ (UTF8.hPutStrLn stdout . T.pack . showExt)-                       [ex | ex <- extList, extensionEnabled ex allExts]-                     exitSuccess )+                     let formatName = maybe "markdown" T.pack arg+                     if formatName `notElem`+                         (map fst (readers :: [(Text, Reader PandocPure)]) +++                          map fst (writers :: [(Text, Writer PandocPure)]))+                        then E.throwIO $ PandocOptionError $ formatName <>+                               " is not a recognized reader or writer format"+                        else do+                          let defExts = getDefaultExtensions formatName+                          let showExt x =+                               (if extensionEnabled x defExts+                                   then '+'+                                   else if extensionEnabled x allExts+                                           then '-'+                                           else ' ') : drop 4 (show x)+                          mapM_ (UTF8.hPutStrLn stdout . T.pack . showExt)+                             [ex | ex <- extList, extensionEnabled ex allExts]+                          exitSuccess )                   "FORMAT")                  "" @@ -973,7 +976,7 @@  copyrightMessage :: String copyrightMessage = intercalate "\n" [- "Copyright (C) 2006-2021 John MacFarlane. Web:  https://pandoc.org",+ "Copyright (C) 2006-2022 John MacFarlane. Web:  https://pandoc.org",  "This is free software; see the source for copying conditions. There is no",  "warranty, not even for merchantability or fitness for a particular purpose." ] 
src/Text/Pandoc/App/FormatHeuristics.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.App.FormatHeuristics-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley@edu>@@ -54,6 +54,7 @@     ".lhs"      -> Just "markdown+lhs"     ".ltx"      -> Just "latex"     ".markdown" -> Just "markdown"+    ".markua"   -> Just "markua"     ".mkdn"     -> Just "markdown"     ".mkd"      -> Just "markdown"     ".mdwn"     -> Just "markdown"
src/Text/Pandoc/App/Opt.hs view
@@ -7,7 +7,7 @@ {-# LANGUAGE FlexibleContexts    #-} {- |    Module      : Text.Pandoc.App.Opt-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley@edu>
src/Text/Pandoc/App/OutputSettings.hs view
@@ -5,7 +5,7 @@ {-# LANGUAGE TupleSections       #-} {- |    Module      : Text.Pandoc.App-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley@edu>@@ -39,6 +39,7 @@ import Text.Pandoc.App.Opt (Opt (..)) import Text.Pandoc.App.CommandLineOptions (engines, lookupHighlightStyle,                                           setVariable)+import Text.Pandoc.Writers.Custom (writeCustom) import qualified Text.Pandoc.UTF8 as UTF8  readUtf8File :: PandocMonad m => FilePath -> m T.Text
src/Text/Pandoc/Asciify.hs view
@@ -1,6 +1,6 @@ {- |    Module      : Text.Pandoc.Asciify-   Copyright   : Copyright (C) 2013-2021 John MacFarlane+   Copyright   : Copyright (C) 2013-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/CSS.hs view
@@ -1,6 +1,6 @@ {- | Module      : Text.Pandoc.CSS-Copyright   : © 2006-2021 John MacFarlane <jgm@berkeley.edu>,+Copyright   : © 2006-2022 John MacFarlane <jgm@berkeley.edu>,                 2015-2016 Mauro Bieg,                 2015      Ophir Lifshitz <hangfromthefloor@gmail.com> License     : GNU GPL, version 2 or above
src/Text/Pandoc/CSV.hs view
@@ -1,6 +1,6 @@ {- |    Module      : Text.Pandoc.CSV-   Copyright   : Copyright (C) 2017-2021 John MacFarlane <jgm@berkeley.edu>+   Copyright   : Copyright (C) 2017-2022 John MacFarlane <jgm@berkeley.edu>    License     : GNU GPL, version 2 or above    Maintainer  : John MacFarlane <jgm@berkeley.edu>    Stability   : alpha
src/Text/Pandoc/Citeproc.hs view
@@ -7,13 +7,13 @@ module Text.Pandoc.Citeproc   ( processCitations,     getReferences,-    getStyle   ) where  import Citeproc import Citeproc.Pandoc ()-import Text.Pandoc.Citeproc.Locator (parseLocator)+import Text.Pandoc.Citeproc.Locator (parseLocator, toLocatorMap,+                                     LocatorInfo(..)) import Text.Pandoc.Citeproc.CslJson (cslJsonToReferences) import Text.Pandoc.Citeproc.BibTeX (readBibtexString, Variant(..)) import Text.Pandoc.Citeproc.MetaValue (metaValueToReference, metaValueToText)@@ -49,15 +49,16 @@ import System.FilePath (takeExtension) import Safe (lastMay, initSafe) - processCitations  :: PandocMonad m => Pandoc -> m Pandoc processCitations (Pandoc meta bs) = do   style <- getStyle (Pandoc meta bs)--  mblang <- getLang meta+  mblang <- getCiteprocLang meta   let locale = Citeproc.mergeLocales mblang style -  refs <- getReferences (Just locale) (Pandoc meta bs)+  let addQuoteSpan (Quoted _ xs) = Span ("",["csl-quoted"],[]) xs+      addQuoteSpan x = x+  refs <- map (walk addQuoteSpan) <$>+          getReferences (Just locale) (Pandoc meta bs)    let otherIdsMap = foldr (\ref m ->                              case T.words . extractText <$>@@ -166,10 +167,9 @@   -- Retrieve citeproc lang based on metadata.-getLang :: PandocMonad m => Meta -> m (Maybe Lang)-getLang meta = maybe (return Nothing) bcp47LangToIETF-                 ((lookupMeta "lang" meta <|> lookupMeta "locale" meta) >>=-                   metaValueToText)+getCiteprocLang :: PandocMonad m => Meta -> m (Maybe Lang)+getCiteprocLang meta = maybe (return Nothing) bcp47LangToIETF+  ((lookupMeta "lang" meta <|> lookupMeta "locale" meta) >>= metaValueToText)  -- | Get references defined inline in the metadata and via an external -- bibliography.  Only references that are actually cited in the document@@ -181,7 +181,7 @@   locale <- case mblocale of                 Just l  -> return l                 Nothing -> do-                  mblang <- getLang meta+                  mblang <- getCiteprocLang meta                   case mblang of                     Just lang -> return $ either mempty id $ getLocale lang                     Nothing   -> return mempty@@ -209,10 +209,7 @@                         Just fp -> getRefsFromBib locale idpred fp                         Nothing -> return []                     Nothing -> return []-  let addQuoteSpan (Quoted _ xs) = Span ("",["csl-quoted"],[]) xs-      addQuoteSpan x = x-  return $ map (legacyDateRanges . walk addQuoteSpan)-               (externalRefs ++ inlineRefs)+  return $ map legacyDateRanges (externalRefs ++ inlineRefs)             -- note that inlineRefs can override externalRefs  @@ -307,17 +304,15 @@                     -> [CitationItem Inlines] fromPandocCitations locale otherIdsMap = concatMap go  where+  locmap = toLocatorMap locale   go c =-    let (loclab, suffix) = parseLocator locale (citationSuffix c)-        (mblab, mbloc) = case loclab of-                           Just (loc, lab) -> (Just loc, Just lab)-                           Nothing         -> (Nothing, Nothing)+    let (mblocinfo, suffix) = parseLocator locmap (citationSuffix c)         cit = CitationItem                { citationItemId = fromMaybe                    (ItemId $ Pandoc.citationId c)                    (M.lookup (Pandoc.citationId c) otherIdsMap)-               , citationItemLabel = mblab-               , citationItemLocator = mbloc+               , citationItemLabel = locatorLabel <$> mblocinfo+               , citationItemLocator = locatorLoc <$> mblocinfo                , citationItemType = NormalCite                , citationItemPrefix = case citationPrefix c of                                         [] -> Nothing@@ -357,6 +352,7 @@                            "bib"      -> Just Format_biblatex                            "json"     -> Just Format_json                            "yaml"     -> Just Format_yaml+                           "yml"      -> Just Format_yaml                            _          -> Nothing  @@ -547,7 +543,7 @@   addParens [] = []   addParens (Cite (c:cs) ils : zs)     | citationMode c == AuthorInText-      = Cite (c:cs) (concatMap (noteAfterComma (needsPeriod zs)) ils) :+      = Cite (c:cs) (addCommas (needsPeriod zs) ils) :         addParens zs     | otherwise       = Cite (c:cs) (concatMap noteInParens ils) : addParens zs@@ -568,13 +564,19 @@          removeFinalPeriod ils ++ [Str ")"]   noteInParens x = [x] -  noteAfterComma needsPer (Span ("",["csl-note"],[]) ils)-    | not (null ils)-       = Str "," : Space :-         if needsPer-            then ils-            else removeFinalPeriod ils-  noteAfterComma _ x = [x]+  -- We want to add a comma before a CSL note citation, but not+  -- before the author name, and not before the first citation+  -- if it doesn't begin with an author name.+  addCommas = addCommas' True -- boolean == "at beginning"++  addCommas' _ _ [] = []+  addCommas' atBeginning needsPer+    (Span ("",["csl-note"],[]) ils : rest)+      | not (null ils)+       = (if atBeginning then id else ([Str "," , Space] ++)) $+         (if needsPer then ils else removeFinalPeriod ils) +++         addCommas' False needsPer rest+  addCommas' _ needsPer (il : rest) = il : addCommas' False needsPer rest  deNote x = x 
src/Text/Pandoc/Citeproc/Locator.hs view
@@ -2,7 +2,10 @@ {-# LANGUAGE ViewPatterns #-} {-# LANGUAGE OverloadedStrings #-} module Text.Pandoc.Citeproc.Locator-  ( parseLocator )+  ( parseLocator+  , toLocatorMap+  , LocatorInfo(..)+  , LocatorMap(..) ) where import Citeproc.Types import Text.Pandoc.Citeproc.Util (splitStrWhen)@@ -17,9 +20,17 @@ import qualified Data.Map as M import Data.Char (isSpace, isPunctuation, isDigit) -parseLocator :: Locale -> [Inline] -> (Maybe (Text, Text), [Inline])-parseLocator locale inp =-  case parse (pLocatorWords (toLocatorMap locale)) "suffix" $ splitInp inp of++data LocatorInfo =+  LocatorInfo{ locatorRaw :: Text+             , locatorLabel :: Text+             , locatorLoc :: Text+             }+  deriving (Show)++parseLocator :: LocatorMap -> [Inline] -> (Maybe LocatorInfo, [Inline])+parseLocator locmap inp =+  case parse (pLocatorWords locmap) "suffix" $ splitInp inp of        Right r -> r        Left _  -> (Nothing, maybeAddComma inp) @@ -33,18 +44,16 @@ type LocatorParser = Parsec [Inline] ()  pLocatorWords :: LocatorMap-              -> LocatorParser (Maybe (Text, Text), [Inline])+              -> LocatorParser (Maybe LocatorInfo, [Inline]) pLocatorWords locMap = do   optional $ pMatchChar "," (== ',')   optional pSpace-  (la, lo) <- pLocatorDelimited locMap <|> pLocatorIntegrated locMap+  info <- pLocatorDelimited locMap <|> pLocatorIntegrated locMap   s <- getInput -- rest is suffix-  -- need to trim, otherwise "p. 9" and "9" will have 'different' locators later on-  -- i.e. the first one will be " 9"   return $-    if T.null la && T.null lo+    if T.null (locatorLabel info) && T.null (locatorLoc info)        then (Nothing, maybeAddComma s)-       else (Just (la, T.strip lo), s)+       else (Just info, s)  maybeAddComma :: [Inline] -> [Inline] maybeAddComma [] = []@@ -54,28 +63,30 @@   , isPunctuation c = ils maybeAddComma ils = Str "," : Space : ils -pLocatorDelimited :: LocatorMap -> LocatorParser (Text, Text)+pLocatorDelimited :: LocatorMap -> LocatorParser LocatorInfo pLocatorDelimited locMap = try $ do   _ <- pMatchChar "{" (== '{')   skipMany pSpace -- gobble pre-spaces so label doesn't try to include them-  (la, _) <- pLocatorLabelDelimited locMap+  (rawlab, la, _) <- pLocatorLabelDelimited locMap   -- we only care about balancing {} and [] (because of the outer [] scope);   -- the rest can be anything   let inner = do { t <- anyToken; return (True, stringify t) }   gs <- many (pBalancedBraces [('{','}'), ('[',']')] inner)   _ <- pMatchChar "}" (== '}')   let lo = T.concat $ map snd gs-  return (la, lo)+  return $ LocatorInfo{ locatorLoc = lo,+                        locatorLabel = la,+                        locatorRaw = rawlab <> "{" <> lo <> "}" } -pLocatorLabelDelimited :: LocatorMap -> LocatorParser (Text, Bool)+pLocatorLabelDelimited :: LocatorMap -> LocatorParser (Text, Text, Bool) pLocatorLabelDelimited locMap-  = pLocatorLabel' locMap lim <|> return ("page", True)+  = pLocatorLabel' locMap lim <|> return ("", "page", True)     where         lim = stringify <$> anyToken -pLocatorIntegrated :: LocatorMap -> LocatorParser (Text, Text)+pLocatorIntegrated :: LocatorMap -> LocatorParser LocatorInfo pLocatorIntegrated locMap = try $ do-  (la, wasImplicit) <- pLocatorLabelIntegrated locMap+  (rawlab, la, wasImplicit) <- pLocatorLabelIntegrated locMap   -- if we got the label implicitly, we have presupposed the first one is   -- going to have a digit, so guarantee that. You _can_ have p. (a)   -- because you specified it.@@ -85,17 +96,20 @@   g <- try $ pLocatorWordIntegrated (not wasImplicit) >>= modifier   gs <- many (try $ pLocatorWordIntegrated False >>= modifier)   let lo = T.concat (g:gs)-  return (la, lo)+  return $ LocatorInfo{ locatorLabel = la,+                        locatorLoc = lo,+                        locatorRaw = rawlab <> lo } -pLocatorLabelIntegrated :: LocatorMap -> LocatorParser (Text, Bool)+pLocatorLabelIntegrated :: LocatorMap -> LocatorParser (Text, Text, Bool) pLocatorLabelIntegrated locMap-  = pLocatorLabel' locMap lim <|> (lookAhead digital >> return ("page", True))+  = pLocatorLabel' locMap lim <|>+     (lookAhead digital >> return ("", "page", True))     where       lim = try $ pLocatorWordIntegrated True >>= requireRomansOrDigits       digital = try $ pLocatorWordIntegrated True >>= requireDigits  pLocatorLabel' :: LocatorMap -> LocatorParser Text-               -> LocatorParser (Text, Bool)+               -> LocatorParser (Text, Text, Bool) pLocatorLabel' locMap lim = go ""     where       -- grow the match string until we hit the end@@ -106,9 +120,9 @@           t <- anyToken           ts <- manyTill anyToken (try $ lookAhead lim)           let s = acc <> stringify (t:ts)-          case M.lookup (T.toCaseFold $ T.strip s) locMap of+          case M.lookup (T.toCaseFold $ T.strip s) (unLocatorMap locMap) of             -- try to find a longer one, or return this one-            Just l -> go s <|> return (l, False)+            Just l -> go s <|> return (s, l, False)             Nothing -> go s  -- hard requirement for a locator to have some real digits in it@@ -252,16 +266,19 @@ -- Locator Map -- -type LocatorMap = M.Map Text Text+newtype LocatorMap = LocatorMap { unLocatorMap :: M.Map Text Text }+  deriving (Show)  toLocatorMap :: Locale -> LocatorMap toLocatorMap locale =-  foldr go mempty locatorTerms+  LocatorMap $ foldr go mempty locatorTerms  where   go tname locmap =     case M.lookup tname (localeTerms locale) of       Nothing -> locmap-      Just ts -> foldr (\x -> M.insert (snd x) tname) locmap ts+      Just ts -> foldr (\x -> M.insert (T.toCaseFold $ snd x) tname) locmap ts+-- we store keys in "case-folded" (lowercase) form, so that both+-- "Chap." and "chap." will match, for example.  locatorTerms :: [Text] locatorTerms =
src/Text/Pandoc/Class/IO.hs view
@@ -214,13 +214,15 @@       return $ walk (adjustImagePath dir media) d  -- | Write the contents of a media bag to a path.+-- If the path contains URI escape sequences (percent-encoding),+-- these are resolved. writeMedia :: (PandocMonad m, MonadIO m)            => FilePath            -> (FilePath, MimeType, BL.ByteString)            -> m () writeMedia dir (fp, _mt, bs) = do   -- we normalize to get proper path separators for the platform-  let fullpath = normalise $ dir </> fp+  let fullpath = normalise $ dir </> unEscapeString fp   liftIOError (createDirectoryIfMissing True) (takeDirectory fullpath)   logIOError $ BL.writeFile fullpath bs 
src/Text/Pandoc/Class/Sandbox.hs view
@@ -1,6 +1,6 @@ {- | Module      : Text.Pandoc.Class.Sandbox-Copyright   : Copyright (C) 2021 John MacFarlane+Copyright   : Copyright (C) 2021-2022 John MacFarlane License     : GNU GPL, version 2 or above  Maintainer  : John MacFarlane (<jgm@berkeley.edu>)
src/Text/Pandoc/Data.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE TemplateHaskell #-} {- | Module      : Text.Pandoc.Data-Copyright   : Copyright (C) 2013-2021 John MacFarlane+Copyright   : Copyright (C) 2013-2022 John MacFarlane License     : GNU GPL, version 2 or above  Maintainer  : John MacFarlane <jgm@berkeley@edu>
src/Text/Pandoc/Error.hs view
@@ -3,7 +3,7 @@ {-# LANGUAGE OverloadedStrings  #-} {- |    Module      : Text.Pandoc.Error-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Extensions.hs view
@@ -6,7 +6,7 @@ {-# LANGUAGE OverloadedStrings          #-} {- |    Module      : Text.Pandoc.Extensions-   Copyright   : Copyright (C) 2012-2021 John MacFarlane+   Copyright   : Copyright (C) 2012-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>@@ -432,6 +432,8 @@ getDefaultExtensions "jats_publishing" = getDefaultExtensions "jats" getDefaultExtensions "jats_articleauthoring" = getDefaultExtensions "jats" getDefaultExtensions "opml"            = pandocExtensions -- affects notes+getDefaultExtensions "markua"          = extensionsFromList+                                          [] getDefaultExtensions _                 = extensionsFromList                                           [Ext_auto_identifiers] @@ -534,6 +536,7 @@     extensionsFromList     [ Ext_citations     , Ext_smart+    , Ext_fancy_lists     , Ext_task_lists     ]   getAll "html"            = autoIdExtensions <>@@ -622,8 +625,8 @@                        Just n  -> return n                        Nothing                          | name == "lhs" -> return Ext_literate_haskell-                         | otherwise -> Prelude.fail $-                                          "Unknown extension: " ++ name+                         | otherwise -> unexpected $+                                          "unknown extension: " ++ name           return $ \(extsToEnable, extsToDisable) ->                     case polarity of                         '+' -> (ext : extsToEnable, extsToDisable)
src/Text/Pandoc/Filter.hs view
@@ -1,10 +1,9 @@ {-# LANGUAGE CPP               #-} {-# LANGUAGE DeriveGeneric     #-}-{-# LANGUAGE TemplateHaskell   #-} {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Filter-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley@edu>@@ -15,6 +14,7 @@ -} module Text.Pandoc.Filter   ( Filter (..)+  , Environment (..)   , applyFilters   ) where @@ -23,7 +23,7 @@ import GHC.Generics (Generic) import Text.Pandoc.Class (report, getVerbosity, PandocMonad) import Text.Pandoc.Definition (Pandoc)-import Text.Pandoc.Options (ReaderOptions)+import Text.Pandoc.Filter.Environment (Environment (..)) import Text.Pandoc.Logging import Text.Pandoc.Citeproc (processCitations) import qualified Text.Pandoc.Filter.JSON as JSONFilter@@ -72,19 +72,19 @@  -- | Modify the given document using a filter. applyFilters :: (PandocMonad m, MonadIO m)-             => ReaderOptions+             => Environment              -> [Filter]              -> [String]              -> Pandoc              -> m Pandoc-applyFilters ropts filters args d = do+applyFilters fenv filters args d = do   expandedFilters <- mapM expandFilterPath filters   foldM applyFilter d expandedFilters  where   applyFilter doc (JSONFilter f) =-    withMessages f $ JSONFilter.apply ropts args f doc+    withMessages f $ JSONFilter.apply fenv args f doc   applyFilter doc (LuaFilter f)  =-    withMessages f $ LuaFilter.apply ropts args f doc+    withMessages f $ LuaFilter.apply fenv args f doc   applyFilter doc CiteprocFilter =     processCitations doc   withMessages f action = do
+ src/Text/Pandoc/Filter/Environment.hs view
@@ -0,0 +1,27 @@+{- |+   Module      : Text.Pandoc.Filter.Environment+   Copyright   : ©2020-2021 Albert Krewinkel+   License     : GNU GPL, version 2 or above++   Maintainer  : Albert Krewinkel <albert@zeitkraut.de>+   Stability   : alpha+   Portability : portable++Environment for pandoc filters.+-}+module Text.Pandoc.Filter.Environment+  ( Environment (..)+  ) where++import Data.Default (Default (def))+import Text.Pandoc.Options (ReaderOptions, WriterOptions)++-- | Environment in which a filter is run. This includes reader and+-- writer options.+data Environment = Environment+  { envReaderOptions :: ReaderOptions+  , envWriterOptions :: WriterOptions+  }++instance Default Environment where+  def = Environment def def
src/Text/Pandoc/Filter/JSON.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Filter-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley@edu>@@ -23,16 +23,16 @@ import System.Environment (getEnvironment) import System.Exit (ExitCode (..)) import System.FilePath ((</>), takeExtension)-import Text.Pandoc.Error (PandocError (PandocFilterError)) import Text.Pandoc.Definition (Pandoc)-import Text.Pandoc.Options (ReaderOptions)+import Text.Pandoc.Error (PandocError (PandocFilterError))+import Text.Pandoc.Filter.Environment (Environment (..)) import Text.Pandoc.Process (pipeProcess) import Text.Pandoc.Shared (pandocVersion, tshow) import qualified Control.Exception as E import qualified Text.Pandoc.UTF8 as UTF8  apply :: MonadIO m-      => ReaderOptions+      => Environment       -> [String]       -> FilePath       -> Pandoc@@ -40,8 +40,8 @@ apply ropts args f = liftIO . externalFilter ropts f args  externalFilter :: MonadIO m-               => ReaderOptions -> FilePath -> [String] -> Pandoc -> m Pandoc-externalFilter ropts f args' d = liftIO $ do+               => Environment -> FilePath -> [String] -> Pandoc -> m Pandoc+externalFilter fenv f args' d = liftIO $ do   exists <- doesFileExist f   isExecutable <- if exists                      then executable <$> getPermissions f@@ -62,6 +62,7 @@     mbExe <- findExecutable f'     when (isNothing mbExe) $       E.throwIO $ PandocFilterError fText (T.pack $ "Could not find executable " <> f')+  let ropts = envReaderOptions fenv   env <- getEnvironment   let env' = Just            ( ("PANDOC_VERSION", T.unpack pandocVersion)
src/Text/Pandoc/Filter/Lua.hs view
@@ -1,6 +1,6 @@ {- |    Module      : Text.Pandoc.Filter.Lua-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley@edu>@@ -18,25 +18,26 @@ import Control.Monad.Trans (MonadIO) import Text.Pandoc.Definition (Pandoc) import Text.Pandoc.Error (PandocError (PandocFilterError, PandocLuaError))+import Text.Pandoc.Filter.Environment (Environment (..)) import Text.Pandoc.Lua (Global (..), runLua, runFilterFile, setGlobals)-import Text.Pandoc.Options (ReaderOptions)  -- | Run the Lua filter in @filterPath@ for a transformation to the -- target format (first element in args). Pandoc uses Lua init files to -- setup the Lua interpreter. apply :: (PandocMonad m, MonadIO m)-      => ReaderOptions+      => Environment       -> [String]       -> FilePath       -> Pandoc       -> m Pandoc-apply ropts args fp doc = do+apply fenv args fp doc = do   let format = case args of                  (x:_) -> x                  _     -> error "Format not supplied for Lua filter"   runLua >=> forceResult fp $ do     setGlobals [ FORMAT $ T.pack format-               , PANDOC_READER_OPTIONS ropts+               , PANDOC_READER_OPTIONS (envReaderOptions fenv)+               , PANDOC_WRITER_OPTIONS (envWriterOptions fenv)                , PANDOC_SCRIPT_FILE fp                ]     runFilterFile fp doc
src/Text/Pandoc/Filter/Path.hs view
@@ -1,6 +1,6 @@ {- |    Module      : Text.Pandoc.Filter.Path-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley@edu>
src/Text/Pandoc/Highlighting.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Highlighting-   Copyright   : Copyright (C) 2008-2021 John MacFarlane+   Copyright   : Copyright (C) 2008-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Image.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings, ScopedTypeVariables, CPP #-} {- | Module      : Text.Pandoc.Image-Copyright   : Copyright (C) 2020-2021 John MacFarlane+Copyright   : Copyright (C) 2020-2022 John MacFarlane License     : GNU GPL, version 2 or above  Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/ImageSize.hs view
@@ -3,7 +3,7 @@ {-# OPTIONS_GHC -fno-warn-type-defaults #-} {- | Module      : Text.Pandoc.ImageSize-Copyright   : Copyright (C) 2011-2021 John MacFarlane+Copyright   : Copyright (C) 2011-2022 John MacFarlane License     : GNU GPL, version 2 or above  Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Logging.hs view
@@ -1,10 +1,9 @@ {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveGeneric      #-}-{-# LANGUAGE LambdaCase         #-} {-# LANGUAGE OverloadedStrings  #-} {- |    Module      : Text.Pandoc.Logging-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Lua.hs view
@@ -1,6 +1,6 @@ {- |    Module      : Text.Pandoc.Lua-   Copyright   : Copyright © 2017-2021 Albert Krewinkel+   Copyright   : Copyright © 2017-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>@@ -20,4 +20,4 @@ import Text.Pandoc.Lua.Filter (runFilterFile) import Text.Pandoc.Lua.Global (Global (..), setGlobals) import Text.Pandoc.Lua.Init (runLua)-import Text.Pandoc.Lua.Marshaling ()+import Text.Pandoc.Lua.Orphans ()
src/Text/Pandoc/Lua/ErrorConversion.hs view
@@ -2,7 +2,7 @@ {-# LANGUAGE LambdaCase #-} {- |    Module      : Text.Pandoc.Lua.ErrorConversion-   Copyright   : © 2020-2021 Albert Krewinkel+   Copyright   : © 2020-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>@@ -19,7 +19,7 @@ import HsLua.Marshalling (resultToEither, runPeek) import HsLua.Class.Peekable (PeekError (..)) import Text.Pandoc.Error (PandocError (PandocLuaError))-import Text.Pandoc.Lua.Marshaling.PandocError (pushPandocError, peekPandocError)+import Text.Pandoc.Lua.Marshal.PandocError (pushPandocError, peekPandocError)  import qualified Data.Text as T import qualified HsLua as Lua
src/Text/Pandoc/Lua/Filter.hs view
@@ -4,249 +4,44 @@ {-# LANGUAGE ScopedTypeVariables  #-} {- | Module      : Text.Pandoc.Lua.Filter-Copyright   : © 2012-2021 John MacFarlane,-              © 2017-2021 Albert Krewinkel+Copyright   : © 2012-2022 John MacFarlane,+              © 2017-2022 Albert Krewinkel License     : GNU GPL, version 2 or above Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de> Stability   : alpha  Types and functions for running Lua filters. -}-module Text.Pandoc.Lua.Filter ( LuaFilterFunction-                              , LuaFilter-                              , peekLuaFilter-                              , runFilterFile-                              , walkInlines-                              , walkInlineLists-                              , walkBlocks-                              , walkBlockLists-                              , module Text.Pandoc.Lua.Walk-                              ) where-import Control.Applicative ((<|>))-import Control.Monad (mplus, (>=>), (<$!>))-import Data.Data (Data, DataType, dataTypeConstrs, dataTypeName, dataTypeOf,-                  showConstr, toConstr, tyconUQname)-import Data.Foldable (foldrM)-import Data.List (foldl')-import Data.Map (Map)-import Data.String (IsString (fromString))+module Text.Pandoc.Lua.Filter+  ( runFilterFile+  ) where+import Control.Monad ((>=>), (<$!>)) import HsLua as Lua import Text.Pandoc.Definition import Text.Pandoc.Error (PandocError)-import Text.Pandoc.Lua.Marshaling ()-import Text.Pandoc.Lua.Marshaling.AST-import Text.Pandoc.Lua.Marshaling.List (List (..), peekList')-import Text.Pandoc.Lua.Walk (SingletonsList (..))-import Text.Pandoc.Walk (Walkable (walkM))+import Text.Pandoc.Lua.ErrorConversion ()+import Text.Pandoc.Lua.Marshal.AST+import Text.Pandoc.Lua.Marshal.Filter -import qualified Data.Map.Strict as Map import qualified Text.Pandoc.Lua.Util as LuaUtil  -- | Transform document using the filter defined in the given file. runFilterFile :: FilePath -> Pandoc -> LuaE PandocError Pandoc runFilterFile filterPath doc = do-  oldtop <- Lua.gettop+  oldtop <- gettop   stat <- LuaUtil.dofileWithTraceback filterPath   if stat /= Lua.OK-    then Lua.throwErrorAsException+    then throwErrorAsException     else do-      newtop <- Lua.gettop+      newtop <- gettop       -- Use the returned filters, or the implicitly defined global       -- filter if nothing was returned.-      luaFilters <- if newtop - oldtop >= 1-                    then Lua.peek Lua.top-                    else Lua.pushglobaltable *> fmap (:[]) Lua.popValue+      luaFilters <- forcePeek $+        if newtop - oldtop >= 1+        then peekList peekFilter top+        else (:[]) <$!> (liftLua pushglobaltable *> peekFilter top)+      settop oldtop       runAll luaFilters doc -runAll :: [LuaFilter] -> Pandoc -> LuaE PandocError Pandoc-runAll = foldr ((>=>) . walkMWithLuaFilter) return---- | Filter function stored in the registry-newtype LuaFilterFunction = LuaFilterFunction Lua.Reference---- | Collection of filter functions (at most one function per element--- constructor)-newtype LuaFilter = LuaFilter (Map Name LuaFilterFunction)--instance Peekable LuaFilter where-  peek = Lua.forcePeek . peekLuaFilter---- | Retrieves a LuaFilter object from the stack.-peekLuaFilter :: LuaError e => Peeker e LuaFilter-peekLuaFilter idx = do-  let constrs = listOfInlinesFilterName-              : listOfBlocksFilterName-              : metaFilterName-              : pandocFilterNames-              ++ blockElementNames-              ++ inlineElementNames-  let go constr acc = Lua.liftLua $ do-        Lua.getfield idx constr-        filterFn <- registerFilterFunction-        return $ case filterFn of-          Nothing -> acc-          Just fn -> Map.insert constr fn acc-  LuaFilter <$!> foldrM go Map.empty constrs---- | Register the function at the top of the stack as a filter function in the--- registry.-registerFilterFunction :: LuaError e => LuaE e (Maybe LuaFilterFunction)-registerFilterFunction = do-  isFn <- Lua.isfunction Lua.top-  if isFn-    then Just . LuaFilterFunction <$> Lua.ref Lua.registryindex-    else Nothing <$ Lua.pop 1---- | Retrieve filter function from registry and push it to the top of the stack.-pushFilterFunction :: LuaFilterFunction -> LuaE PandocError ()-pushFilterFunction (LuaFilterFunction fnRef) =-  Lua.getref Lua.registryindex fnRef---- | Fetch either a list of elements from the stack. If there is a single--- element instead of a list, fetch that element as a singleton list. If the top--- of the stack is nil, return the default element that was passed to this--- function. If none of these apply, raise an error.-elementOrList :: Peeker PandocError a -> a -> LuaE PandocError [a]-elementOrList p x = do-  elementUnchanged <- Lua.isnil top-  if elementUnchanged-    then [x] <$ pop 1-    else forcePeek . (`lastly` pop 1) $ (((:[]) <$!> p top) <|> peekList p top)---- | Fetches a single element; returns the fallback if the value is @nil@.-singleElement :: forall a e. (LuaError e) => Peeker e a -> a -> LuaE e a-singleElement p x = do-  elementUnchanged <- Lua.isnil top-  if elementUnchanged-    then x <$ Lua.pop 1-    else forcePeek $ p top `lastly` pop 1---- | Pop and return a value from the stack; if the value at the top of--- the stack is @nil@, return the fallback element.-popOption :: Peeker PandocError a -> a -> LuaE PandocError a-popOption peeker fallback = forcePeek . (`lastly` pop 1) $-  (fallback <$ peekNil top) <|> peeker top---- | Apply filter on a sequence of AST elements. Both lists and single--- value are accepted as filter function return values.-runOnSequence :: forall a. (Data a, Pushable a)-              => Peeker PandocError a -> LuaFilter -> SingletonsList a-              -> LuaE PandocError (SingletonsList a)-runOnSequence peeker (LuaFilter fnMap) (SingletonsList xs) =-  SingletonsList <$> mconcatMapM tryFilter xs- where-  tryFilter :: a -> LuaE PandocError [a]-  tryFilter x =-    let filterFnName = fromString $ showConstr (toConstr x)-        catchAllName = fromString . tyconUQname $ dataTypeName (dataTypeOf x)-    in case Map.lookup filterFnName fnMap <|> Map.lookup catchAllName fnMap of-         Just fn -> runFilterFunction fn x *> elementOrList peeker x-         Nothing -> return [x]---- | Try filtering the given value without type error corrections on--- the return value.-runOnValue :: (Data a, Pushable a)-           => Name -> Peeker PandocError a-           -> LuaFilter -> a-           -> LuaE PandocError a-runOnValue filterFnName peeker (LuaFilter fnMap) x =-  case Map.lookup filterFnName fnMap of-    Just fn -> runFilterFunction fn x *> popOption peeker x-    Nothing -> return x---- | Push a value to the stack via a Lua filter function. The filter--- function is called with the given element as argument and is expected--- to return an element. Alternatively, the function can return nothing--- or nil, in which case the element is left unchanged.-runFilterFunction :: Pushable a-                  => LuaFilterFunction -> a -> LuaE PandocError ()-runFilterFunction lf x = do-  pushFilterFunction lf-  Lua.push x-  LuaUtil.callWithTraceback 1 1--walkMWithLuaFilter :: LuaFilter -> Pandoc -> LuaE PandocError Pandoc-walkMWithLuaFilter f =-      walkInlines f-  >=> walkInlineLists f-  >=> walkBlocks f-  >=> walkBlockLists f-  >=> walkMeta f-  >=> walkPandoc f--mconcatMapM :: (Monad m) => (a -> m [a]) -> [a] -> m [a]-mconcatMapM f = fmap mconcat . mapM f--hasOneOf :: LuaFilter -> [Name] -> Bool-hasOneOf (LuaFilter fnMap) = any (`Map.member` fnMap)--contains :: LuaFilter -> Name -> Bool-contains (LuaFilter fnMap) = (`Map.member` fnMap)--walkInlines :: Walkable (SingletonsList Inline) a-            => LuaFilter -> a -> LuaE PandocError a-walkInlines lf =-  let f :: SingletonsList Inline -> LuaE PandocError (SingletonsList Inline)-      f = runOnSequence peekInline lf-  in if lf `hasOneOf` inlineElementNames-     then walkM f-     else return--walkInlineLists :: Walkable (List Inline) a-                => LuaFilter -> a -> LuaE PandocError a-walkInlineLists lf =-  let f :: List Inline -> LuaE PandocError (List Inline)-      f = runOnValue listOfInlinesFilterName (peekList' peekInline) lf-  in if lf `contains` listOfInlinesFilterName-     then walkM f-     else return--walkBlocks :: Walkable (SingletonsList Block) a-           => LuaFilter -> a -> LuaE PandocError a-walkBlocks lf =-  let f :: SingletonsList Block -> LuaE PandocError (SingletonsList Block)-      f = runOnSequence peekBlock lf-  in if lf `hasOneOf` blockElementNames-     then walkM f-     else return--walkBlockLists :: Walkable (List Block) a-               => LuaFilter -> a -> LuaE PandocError a-walkBlockLists lf =-  let f :: List Block -> LuaE PandocError (List Block)-      f = runOnValue listOfBlocksFilterName (peekList' peekBlock) lf-  in if lf `contains` listOfBlocksFilterName-     then walkM f-     else return--walkMeta :: LuaFilter -> Pandoc -> LuaE PandocError Pandoc-walkMeta lf (Pandoc m bs) = do-  m' <- runOnValue "Meta" peekMeta lf m-  return $ Pandoc m' bs--walkPandoc :: LuaFilter -> Pandoc -> LuaE PandocError Pandoc-walkPandoc (LuaFilter fnMap) =-  case foldl' mplus Nothing (map (`Map.lookup` fnMap) pandocFilterNames) of-    Just fn -> \x -> runFilterFunction fn x *> singleElement peekPandoc x-    Nothing -> return--constructorsFor :: DataType -> [Name]-constructorsFor x = map (fromString . show) (dataTypeConstrs x)--inlineElementNames :: [Name]-inlineElementNames = "Inline" : constructorsFor (dataTypeOf (Str mempty))--blockElementNames :: [Name]-blockElementNames = "Block" : constructorsFor (dataTypeOf (Para []))--listOfInlinesFilterName :: Name-listOfInlinesFilterName = "Inlines"--listOfBlocksFilterName :: Name-listOfBlocksFilterName = "Blocks"--metaFilterName :: Name-metaFilterName = "Meta"--pandocFilterNames :: [Name]-pandocFilterNames = ["Pandoc", "Doc"]+runAll :: [Filter] -> Pandoc -> LuaE PandocError Pandoc+runAll = foldr ((>=>) . applyFully) return
src/Text/Pandoc/Lua/Global.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings  #-} {- |    Module      : Text.Pandoc.Lua-   Copyright   : Copyright © 2017-2021 Albert Krewinkel+   Copyright   : Copyright © 2017-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>@@ -18,12 +18,14 @@ import HsLua.Module.Version (pushVersion) import Paths_pandoc (version) import Text.Pandoc.Class.CommonState (CommonState)-import Text.Pandoc.Definition (Pandoc (Pandoc), pandocTypesVersion)+import Text.Pandoc.Definition (Pandoc, pandocTypesVersion) import Text.Pandoc.Error (PandocError)-import Text.Pandoc.Lua.Marshaling ()-import Text.Pandoc.Lua.Marshaling.CommonState (pushCommonState)-import Text.Pandoc.Lua.Marshaling.ReaderOptions (pushReaderOptionsReadonly)-import Text.Pandoc.Options (ReaderOptions)+import Text.Pandoc.Lua.Marshal.CommonState (pushCommonState)+import Text.Pandoc.Lua.Marshal.Pandoc (pushPandoc)+import Text.Pandoc.Lua.Marshal.ReaderOptions (pushReaderOptionsReadonly)+import Text.Pandoc.Lua.Marshal.WriterOptions (pushWriterOptions)+import Text.Pandoc.Lua.Orphans ()+import Text.Pandoc.Options (ReaderOptions, WriterOptions)  import qualified Data.Text as Text @@ -33,6 +35,7 @@   | PANDOC_API_VERSION   | PANDOC_DOCUMENT Pandoc   | PANDOC_READER_OPTIONS ReaderOptions+  | PANDOC_WRITER_OPTIONS WriterOptions   | PANDOC_SCRIPT_FILE FilePath   | PANDOC_STATE CommonState   | PANDOC_VERSION@@ -46,19 +49,22 @@ setGlobal global = case global of   -- This could be simplified if Global was an instance of Data.   FORMAT format -> do-    Lua.push format+    Lua.pushText format     Lua.setglobal "FORMAT"   PANDOC_API_VERSION -> do     pushVersion pandocTypesVersion     Lua.setglobal "PANDOC_API_VERSION"   PANDOC_DOCUMENT doc -> do-    pushUD typePandocLazy  doc+    pushPandoc doc     Lua.setglobal "PANDOC_DOCUMENT"   PANDOC_READER_OPTIONS ropts -> do     pushReaderOptionsReadonly ropts     Lua.setglobal "PANDOC_READER_OPTIONS"+  PANDOC_WRITER_OPTIONS wopts -> do+    pushWriterOptions wopts+    Lua.setglobal "PANDOC_WRITER_OPTIONS"   PANDOC_SCRIPT_FILE filePath -> do-    Lua.push filePath+    Lua.pushString filePath     Lua.setglobal "PANDOC_SCRIPT_FILE"   PANDOC_STATE commonState -> do     pushCommonState commonState@@ -66,10 +72,3 @@   PANDOC_VERSION              -> do     pushVersion version     Lua.setglobal "PANDOC_VERSION"---- | Readonly and lazy pandoc objects.-typePandocLazy :: LuaError e => DocumentedType e Pandoc-typePandocLazy = deftype "Pandoc (lazy)" []-  [ readonly "meta" "document metadata" (push, \(Pandoc meta _) -> meta)-  , readonly "blocks" "content blocks" (push, \(Pandoc _ blocks) -> blocks)-  ]
src/Text/Pandoc/Lua/Init.hs view
@@ -2,7 +2,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Lua-   Copyright   : Copyright © 2017-2021 Albert Krewinkel+   Copyright   : Copyright © 2017-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>@@ -17,7 +17,6 @@ import Control.Monad (forM, forM_, when) import Control.Monad.Catch (throwM, try) import Control.Monad.Trans (MonadIO (..))-import Data.Data (Data, dataTypeConstrs, dataTypeOf, showConstr) import Data.Maybe (catMaybes) import HsLua as Lua hiding (status, try) import GHC.IO.Encoding (getForeignEncoding, setForeignEncoding, utf8)@@ -27,7 +26,6 @@ import Text.Pandoc.Lua.PandocLua (PandocLua, liftPandocLua, runPandocLua) import qualified Data.Text as T import qualified Lua.LPeg as LPeg-import qualified Text.Pandoc.Definition as Pandoc import qualified Text.Pandoc.Lua.Module.Pandoc as ModulePandoc  -- | Run the lua interpreter, using pandoc's default way of environment@@ -42,6 +40,20 @@   liftIO $ setForeignEncoding enc   return res +-- | Modules that are loaded at startup and assigned to fields in the+-- pandoc module.+loadedModules :: [(Name, Name)]+loadedModules =+  [ ("pandoc.List", "List")+  , ("pandoc.mediabag", "mediabag")+  , ("pandoc.path", "path")+  , ("pandoc.system", "system")+  , ("pandoc.template", "template")+  , ("pandoc.types", "types")+  , ("pandoc.utils", "utils")+  , ("text", "text")+  ]+ -- | Initialize the lua state with all required values initLuaState :: PandocLua () initLuaState = do@@ -61,9 +73,13 @@       Lua.getfield Lua.registryindex Lua.loaded       Lua.pushvalue (Lua.nth 2)       Lua.setfield (Lua.nth 2) "pandoc"-      Lua.pop 1-    -- copy constructors into registry-    putConstructorsInRegistry+      Lua.pop 1  -- remove LOADED table+    -- load modules and add them to the `pandoc` module table.+    liftPandocLua $ forM_ loadedModules $ \(pkgname, fieldname) -> do+      Lua.getglobal "require"+      Lua.pushName pkgname+      Lua.call 1 1+      Lua.setfield (nth 2) fieldname     -- assign module to global variable     liftPandocLua $ Lua.setglobal "pandoc" @@ -122,28 +138,3 @@     Lua.pushHaskellFunction $ Lua.state >>= liftIO . LPeg.lpeg_searcher     Lua.rawseti (Lua.nth 2) . (+1) . fromIntegral =<< Lua.rawlen (Lua.nth 2)     Lua.pop 1  -- remove 'package.searchers' from stack---- | AST elements are marshaled via normal constructor functions in the--- @pandoc@ module. However, accessing Lua globals from Haskell is--- expensive (due to error handling). Accessing the Lua registry is much--- cheaper, which is why the constructor functions are copied into the--- Lua registry and called from there.------ This function expects the @pandoc@ module to be at the top of the--- stack.-putConstructorsInRegistry :: PandocLua ()-putConstructorsInRegistry = liftPandocLua $ do-  constrsToReg $ Pandoc.Meta mempty-  constrsToReg $ Pandoc.MetaList mempty-  putInReg "List"  -- pandoc.List-  putInReg "SimpleTable"  -- helper for backward-compatible table handling- where-  constrsToReg :: Data a => a -> LuaE PandocError ()-  constrsToReg = mapM_ (putInReg . showConstr) . dataTypeConstrs . dataTypeOf--  putInReg :: String -> LuaE PandocError ()-  putInReg name = do-    Lua.push ("pandoc." ++ name) -- name in registry-    Lua.push name -- in pandoc module-    Lua.rawget (Lua.nth 3)-    Lua.rawset Lua.registryindex
+ src/Text/Pandoc/Lua/Marshal/CommonState.hs view
@@ -0,0 +1,70 @@+{-# LANGUAGE OverloadedStrings    #-}+{- |+   Module      : Text.Pandoc.Lua.Marshal.CommonState+   Copyright   : © 2012-2022 John MacFarlane+                 © 2017-2022 Albert Krewinkel+   License     : GNU GPL, version 2 or above+   Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>+   Stability   : alpha++Instances to marshal (push) and unmarshal (peek) the common state.+-}+module Text.Pandoc.Lua.Marshal.CommonState+  ( typeCommonState+  , peekCommonState+  , pushCommonState+  ) where++import HsLua.Core+import HsLua.Marshalling+import HsLua.Packaging+import Text.Pandoc.Class (CommonState (..))+import Text.Pandoc.Logging (LogMessage, showLogMessage)+import Text.Pandoc.Lua.Marshal.List (pushPandocList)++-- | Lua type used for the @CommonState@ object.+typeCommonState :: LuaError e => DocumentedType e CommonState+typeCommonState = deftype "pandoc CommonState" []+  [ readonly "input_files" "input files passed to pandoc"+      (pushPandocList pushString, stInputFiles)++  , readonly "output_file" "the file to which pandoc will write"+      (maybe pushnil pushString, stOutputFile)++  , readonly "log" "list of log messages"+      (pushPandocList (pushUD typeLogMessage), stLog)++  , readonly "request_headers" "headers to add for HTTP requests"+      (pushPandocList (pushPair pushText pushText), stRequestHeaders)++  , readonly "resource_path"+      "path to search for resources like included images"+      (pushPandocList pushString, stResourcePath)++  , readonly "source_url" "absolute URL + dir of 1st source file"+      (maybe pushnil pushText, stSourceURL)++  , readonly "user_data_dir" "directory to search for data files"+      (maybe pushnil pushString, stUserDataDir)++  , readonly "trace" "controls whether tracing messages are issued"+      (pushBool, stTrace)++  , readonly "verbosity" "verbosity level"+      (pushString . show, stVerbosity)+  ]++peekCommonState :: LuaError e => Peeker e CommonState+peekCommonState = peekUD typeCommonState++pushCommonState :: LuaError e => Pusher e CommonState+pushCommonState = pushUD typeCommonState++typeLogMessage :: LuaError e => DocumentedType e LogMessage+typeLogMessage = deftype "pandoc LogMessage"+  [ operation Index $ defun "__tostring"+      ### liftPure showLogMessage+      <#> udparam typeLogMessage "msg" "object"+      =#> functionResult pushText "string" "stringified log message"+  ]+  mempty -- no members
+ src/Text/Pandoc/Lua/Marshal/Context.hs view
@@ -0,0 +1,28 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{- |+   Module      : Text.Pandoc.Lua.Marshaling.Context+   Copyright   : © 2012-2022 John MacFarlane+                 © 2017-2022 Albert Krewinkel+   License     : GNU GPL, version 2 or above++   Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>+   Stability   : alpha++Marshaling instance for doctemplates Context and its components.+-}+module Text.Pandoc.Lua.Marshal.Context () where++import qualified HsLua as Lua+import HsLua (Pushable)+import Text.DocTemplates (Context(..), Val(..), TemplateTarget)+import Text.DocLayout (render)++instance (TemplateTarget a, Pushable a) => Pushable (Context a) where+  push (Context m) = Lua.push m++instance (TemplateTarget a, Pushable a) => Pushable (Val a) where+  push NullVal = Lua.push ()+  push (BoolVal b) = Lua.push b+  push (MapVal ctx) = Lua.push ctx+  push (ListVal xs) = Lua.push xs+  push (SimpleVal d) = Lua.push $ render Nothing d
+ src/Text/Pandoc/Lua/Marshal/PandocError.hs view
@@ -0,0 +1,51 @@+{-# LANGUAGE LambdaCase           #-}+{-# LANGUAGE OverloadedStrings    #-}+{-# LANGUAGE ScopedTypeVariables  #-}+{-# LANGUAGE TypeApplications     #-}+{- |+   Module      : Text.Pandoc.Lua.Marshal.PandocError+   Copyright   : © 2020-2022 Albert Krewinkel+   License     : GNU GPL, version 2 or above++   Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>+   Stability   : alpha++Marshal of @'PandocError'@ values.+-}+module Text.Pandoc.Lua.Marshal.PandocError+  ( peekPandocError+  , pushPandocError+  , typePandocError+  )+  where++import HsLua.Core (LuaError)+import HsLua.Marshalling (Peeker, Pusher, pushString, liftLua)+import HsLua.Packaging+import Text.Pandoc.Error (PandocError (PandocLuaError))++import qualified HsLua as Lua+import qualified Text.Pandoc.UTF8 as UTF8++-- | Lua userdata type definition for PandocError.+typePandocError :: LuaError e => DocumentedType e PandocError+typePandocError = deftype "PandocError"+  [ operation Tostring $ defun "__tostring"+    ### liftPure (show @PandocError)+    <#> udparam typePandocError "obj" "PandocError object"+    =#> functionResult pushString "string" "string representation of error."+  ]+  mempty -- no members++-- | Peek a @'PandocError'@ element to the Lua stack.+pushPandocError :: LuaError e => Pusher e PandocError+pushPandocError = pushUD typePandocError++-- | Retrieve a @'PandocError'@ from the Lua stack.+peekPandocError :: LuaError e => Peeker e PandocError+peekPandocError idx = Lua.retrieving "PandocError" $+  liftLua (Lua.ltype idx) >>= \case+    Lua.TypeUserdata -> peekUD typePandocError idx+    _ -> do+      msg <- liftLua $ Lua.state >>= \l -> Lua.liftIO (Lua.popErrorMessage l)+      return $ PandocLuaError (UTF8.toText msg)
+ src/Text/Pandoc/Lua/Marshal/ReaderOptions.hs view
@@ -0,0 +1,134 @@+{-# LANGUAGE LambdaCase           #-}+{-# LANGUAGE OverloadedStrings    #-}+{-# LANGUAGE ScopedTypeVariables  #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{- |+   Module      : Text.Pandoc.Lua.Marshaling.ReaderOptions+   Copyright   : © 2012-2022 John MacFarlane+                 © 2017-2022 Albert Krewinkel+   License     : GNU GPL, version 2 or above++   Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>+   Stability   : alpha++Marshaling instance for ReaderOptions and its components.+-}+module Text.Pandoc.Lua.Marshal.ReaderOptions+  ( peekReaderOptions+  , pushReaderOptions+  , pushReaderOptionsReadonly+  ) where++import Data.Default (def)+import HsLua as Lua+import Text.Pandoc.Lua.Marshal.List (pushPandocList)+import Text.Pandoc.Lua.Util (peekViaJSON, pushViaJSON)+import Text.Pandoc.Options (ReaderOptions (..))++--+-- Reader Options+--++-- | Retrieve a ReaderOptions value, either from a normal ReaderOptions+-- value, from a read-only object, or from a table with the same+-- keys as a ReaderOptions object.+peekReaderOptions :: LuaError e => Peeker e ReaderOptions+peekReaderOptions = retrieving "ReaderOptions" . \idx ->+  liftLua (ltype idx) >>= \case+    TypeUserdata -> choice [ peekUD typeReaderOptions+                           , peekUD typeReaderOptionsReadonly+                           ]+                           idx+    TypeTable    -> peekReaderOptionsTable idx+    _            -> failPeek =<<+                    typeMismatchMessage "ReaderOptions userdata or table" idx++-- | Pushes a ReaderOptions value as userdata object.+pushReaderOptions :: LuaError e => Pusher e ReaderOptions+pushReaderOptions = pushUD typeReaderOptions++-- | Pushes a ReaderOptions object, but makes it read-only.+pushReaderOptionsReadonly :: LuaError e => Pusher e ReaderOptions+pushReaderOptionsReadonly = pushUD typeReaderOptionsReadonly++-- | ReaderOptions object type for read-only values.+typeReaderOptionsReadonly :: LuaError e => DocumentedType e ReaderOptions+typeReaderOptionsReadonly = deftype "ReaderOptions (read-only)"+  [ operation Tostring $ lambda+    ### liftPure show+    <#> udparam typeReaderOptions "opts" "options to print in native format"+    =#> functionResult pushString "string" "Haskell representation"+  , operation Newindex $ lambda+    ### (failLua "This ReaderOptions value is read-only.")+    =?> "Throws an error when called, i.e., an assignment is made."+  ]+  readerOptionsMembers++-- | 'ReaderOptions' object type.+typeReaderOptions :: LuaError e => DocumentedType e ReaderOptions+typeReaderOptions = deftype "ReaderOptions"+  [ operation Tostring $ lambda+    ### liftPure show+    <#> udparam typeReaderOptions "opts" "options to print in native format"+    =#> functionResult pushString "string" "Haskell representation"+  ]+  readerOptionsMembers++-- | Member properties of 'ReaderOptions' Lua values.+readerOptionsMembers :: LuaError e+                     => [Member e (DocumentedFunction e) ReaderOptions]+readerOptionsMembers =+  [ property "abbreviations" ""+      (pushSet pushText, readerAbbreviations)+      (peekSet peekText, \opts x -> opts{ readerAbbreviations = x })+  , property "columns" ""+      (pushIntegral, readerColumns)+      (peekIntegral, \opts x -> opts{ readerColumns = x })+  , property "default_image_extension" ""+      (pushText, readerDefaultImageExtension)+      (peekText, \opts x -> opts{ readerDefaultImageExtension = x })+  , property "extensions" ""+      (pushViaJSON, readerExtensions)+      (peekViaJSON, \opts x -> opts{ readerExtensions = x })+  , property "indented_code_classes" ""+      (pushPandocList pushText, readerIndentedCodeClasses)+      (peekList peekText, \opts x -> opts{ readerIndentedCodeClasses = x })+  , property "standalone" ""+      (pushBool, readerStandalone)+      (peekBool, \opts x -> opts{ readerStandalone = x })+  , property "strip_comments" ""+      (pushBool, readerStripComments)+      (peekBool, \opts x -> opts{ readerStripComments = x })+  , property "tab_stop" ""+      (pushIntegral, readerTabStop)+      (peekIntegral, \opts x -> opts{ readerTabStop = x })+  , property "track_changes" ""+      (pushViaJSON, readerTrackChanges)+      (choice [peekRead, peekViaJSON], \opts x -> opts{ readerTrackChanges = x })+  ]++-- | Retrieves a 'ReaderOptions' object from a table on the stack, using+-- the default values for all missing fields.+--+-- Internally, this pushes the default reader options, sets each+-- key/value pair of the table in the userdata value, then retrieves the+-- object again. This will update all fields and complain about unknown+-- keys.+peekReaderOptionsTable :: LuaError e => Peeker e ReaderOptions+peekReaderOptionsTable idx = retrieving "ReaderOptions (table)" $ do+  liftLua $ do+    absidx <- absindex idx+    pushUD typeReaderOptions def+    let setFields = do+          next absidx >>= \case+            False -> return () -- all fields were copied+            True -> do+              pushvalue (nth 2) *> insert (nth 2)+              settable (nth 4) -- set in userdata object+              setFields+    pushnil -- first key+    setFields+  peekUD typeReaderOptions top `lastly` pop 1++instance Pushable ReaderOptions where+  push = pushReaderOptions
+ src/Text/Pandoc/Lua/Marshal/Reference.hs view
@@ -0,0 +1,107 @@+{-# LANGUAGE LambdaCase           #-}+{-# LANGUAGE OverloadedStrings    #-}+{-# LANGUAGE ScopedTypeVariables  #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{- |+   Module      : Text.Pandoc.Lua.Marshaling.ReaderOptions+   Copyright   : © 2012-2022 John MacFarlane+                 © 2017-2022 Albert Krewinkel+   License     : GNU GPL, version 2 or above++   Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>+   Stability   : alpha++Marshal citeproc 'Reference' values.+-}+module Text.Pandoc.Lua.Marshal.Reference+  ( pushReference+  ) where++import Citeproc.Types+  ( Date (..), DateParts (..), ItemId (..), Name (..), Reference (..)+  , Val (..), Variable, fromVariable+  )+import Control.Monad (forM_)+import HsLua hiding (Name, Reference, pushName, peekName)+import Text.Pandoc.Builder (Inlines, toList)+import Text.Pandoc.Lua.Marshal.Inline (pushInlines)+import Text.Pandoc.Lua.Marshal.List (pushPandocList)++import qualified Data.Map as Map+import qualified HsLua++-- | Pushes a ReaderOptions value as userdata object.+pushReference :: LuaError e => Pusher e (Reference Inlines)+pushReference reference = do+  pushAsTable [ ("id", pushItemId . referenceId)+              , ("type", pushText . referenceType)+              ]+              reference+  forM_ (Map.toList $ referenceVariables reference) $ \(var, val) -> do+    pushVariable var+    pushVal val+    rawset (nth 3)++-- | Pushes an 'ItemId' as a string.+pushItemId :: Pusher e ItemId+pushItemId = pushText . unItemId++-- | Pushes a person's 'Name' as a table.+pushName :: LuaError e => Pusher e Name+pushName = pushAsTable+  [ ("family"                , pushTextOrNil . nameFamily)+  , ("given"                 , pushTextOrNil . nameGiven)+  , ("dropping-particle"     , pushTextOrNil . nameDroppingParticle)+  , ("non-dropping-particle" , pushTextOrNil . nameNonDroppingParticle)+  , ("suffix"                , pushTextOrNil . nameSuffix)+  , ("literal"               , pushTextOrNil . nameLiteral)+  , ("comma-suffix"          , pushBoolOrNil . nameCommaSuffix)+  , ("static-ordering"       , pushBoolOrNil . nameStaticOrdering)+  ]+  where+    pushTextOrNil = \case+      Nothing -> pushnil+      Just xs -> pushText xs++-- | Pushes a boolean, but uses @nil@ instead of @false@; table fields+-- are not set unless the value is true.+pushBoolOrNil :: Pusher e Bool+pushBoolOrNil = \case+  False -> pushnil+  True  -> pushBool True++-- | Pushes a 'Variable' as string.+pushVariable :: Pusher e Variable+pushVariable = pushText . fromVariable++-- | Pushes a 'Val', i.e., a variable value.+pushVal :: LuaError e => Pusher e (Val Inlines)+pushVal = \case+  TextVal t -> pushText t+  FancyVal inlns -> pushInlines $ toList inlns+  NumVal i       -> pushIntegral i+  NamesVal names -> pushPandocList pushName names+  DateVal date   -> pushDate date++-- | Pushes a 'Date' as table.+pushDate :: LuaError e => Pusher e Date+pushDate = pushAsTable+  [ ("date-parts", pushPandocList pushDateParts . dateParts)+  , ("circa", pushBoolOrNil . dateCirca)+  , ("season", maybe pushnil pushIntegral . dateSeason)+  , ("literal", maybe pushnil pushText . dateLiteral)+  ]+ where+   -- date parts are lists of Int values+   pushDateParts (DateParts dp) = pushPandocList pushIntegral dp++-- | Helper funtion to push an object as a table.+pushAsTable :: LuaError e+            => [(HsLua.Name, a -> LuaE e ())]+            -> a -> LuaE e ()+pushAsTable props obj = do+  createtable 0 (length props)+  forM_ props $ \(name, pushValue) -> do+    HsLua.pushName name+    pushValue obj+    rawset (nth 3)
+ src/Text/Pandoc/Lua/Marshal/Sources.hs view
@@ -0,0 +1,46 @@+{-# LANGUAGE OverloadedStrings    #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{- |+Module      : Text.Pandoc.Lua.Marshaling.Sources+Copyright   : © 2021-2022 Albert Krewinkel+License     : GNU GPL, version 2 or above+Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>++Marshal 'Sources'.+-}+module Text.Pandoc.Lua.Marshal.Sources+  ( pushSources+  ) where++import Data.Text (Text)+import HsLua as Lua+import Text.Pandoc.Lua.Marshal.List (newListMetatable)+import Text.Pandoc.Sources (Sources (..))+import Text.Parsec (SourcePos, sourceName)++-- | Pushes the 'Sources' as a list of lazy Lua objects.+pushSources :: LuaError e => Pusher e Sources+pushSources (Sources srcs) = do+  pushList (pushUD typeSource) srcs+  newListMetatable "pandoc Sources" $ do+    pushName "__tostring"+    pushHaskellFunction $ do+      sources <- forcePeek $ peekList (peekUD typeSource) (nthBottom 1)+      pushText . mconcat $ map snd sources+      return 1+    rawset (nth 3)+  setmetatable (nth 2)++-- | Source object type.+typeSource :: LuaError e => DocumentedType e (SourcePos, Text)+typeSource = deftype "pandoc input source"+  [ operation Tostring $ lambda+    ### liftPure snd+    <#> udparam typeSource "srcs" "Source to print in native format"+    =#> functionResult pushText "string" "Haskell representation"+  ]+  [ readonly "name" "source name"+      (pushString, sourceName . fst)+  , readonly "text" "source text"+      (pushText, snd)+  ]
+ src/Text/Pandoc/Lua/Marshal/Template.hs view
@@ -0,0 +1,31 @@+{-# LANGUAGE OverloadedStrings    #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{- |+Module      : Text.Pandoc.Lua.Marshal.Template+Copyright   : © 2021-2022 Albert Krewinkel+License     : GNU GPL, version 2 or above+Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>++Marshal 'Template' 'Text'.+-}+module Text.Pandoc.Lua.Marshal.Template+  ( pushTemplate+  , peekTemplate+  , typeTemplate+  ) where++import Data.Text (Text)+import HsLua as Lua+import Text.DocTemplates (Template)++-- | Pushes a 'Template' as a an opaque userdata value.+pushTemplate :: LuaError e => Pusher e (Template Text)+pushTemplate = pushUD typeTemplate++-- | Retrieves a 'Template' 'Text' value from the stack.+peekTemplate :: LuaError e => Peeker e (Template Text)+peekTemplate = peekUD typeTemplate++-- | Template object type.+typeTemplate :: LuaError e => DocumentedType e (Template Text)+typeTemplate = deftype "pandoc Template" [] []
+ src/Text/Pandoc/Lua/Marshal/WriterOptions.hs view
@@ -0,0 +1,241 @@+{-# LANGUAGE LambdaCase           #-}+{-# LANGUAGE OverloadedStrings    #-}+{-# LANGUAGE ScopedTypeVariables  #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+{- |+   Module      : Text.Pandoc.Lua.Marshaling.WriterOptions+   Copyright   : © 2021-2022 Albert Krewinkel, John MacFarlane+   License     : GNU GPL, version 2 or above++   Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>+   Stability   : alpha++Marshaling instance for WriterOptions and its components.+-}+module Text.Pandoc.Lua.Marshal.WriterOptions+  ( peekWriterOptions+  , pushWriterOptions+  ) where++import Control.Applicative (optional)+import Data.Default (def)+import HsLua as Lua+import Text.Pandoc.Lua.Marshal.List (pushPandocList)+import Text.Pandoc.Lua.Marshal.Template (peekTemplate, pushTemplate)+import Text.Pandoc.Lua.Util (peekViaJSON, pushViaJSON)+import Text.Pandoc.Options (WriterOptions (..))++--+-- Writer Options+--++-- | Retrieve a WriterOptions value, either from a normal WriterOptions+-- value, from a read-only object, or from a table with the same+-- keys as a WriterOptions object.+peekWriterOptions :: LuaError e => Peeker e WriterOptions+peekWriterOptions = retrieving "WriterOptions" . \idx ->+  liftLua (ltype idx) >>= \case+    TypeUserdata -> peekUD typeWriterOptions idx+    TypeTable    -> peekWriterOptionsTable idx+    _            -> failPeek =<<+                    typeMismatchMessage "WriterOptions userdata or table" idx++-- | Pushes a WriterOptions value as userdata object.+pushWriterOptions :: LuaError e => Pusher e WriterOptions+pushWriterOptions = pushUD typeWriterOptions++-- | 'WriterOptions' object type.+typeWriterOptions :: LuaError e => DocumentedType e WriterOptions+typeWriterOptions = deftype "WriterOptions"+  [ operation Tostring $ lambda+    ### liftPure show+    <#> udparam typeWriterOptions "opts" "options to print in native format"+    =#> functionResult pushString "string" "Haskell representation"+  ]+  [ property "cite_method"+    "How to print cites"+    (pushViaJSON, writerCiteMethod)+    (peekViaJSON, \opts x -> opts{ writerCiteMethod = x })++  , property "columns"+    "Characters in a line (for text wrapping)"+    (pushIntegral, writerColumns)+    (peekIntegral, \opts x -> opts{ writerColumns = x })++  , property "dpi"+    "DPI for pixel to/from inch/cm conversions"+    (pushIntegral, writerDpi)+    (peekIntegral, \opts x -> opts{ writerDpi = x })++  , property "email_obfuscation"+    "How to obfuscate emails"+    (pushViaJSON, writerEmailObfuscation)+    (peekViaJSON, \opts x -> opts{ writerEmailObfuscation = x })++  , property "epub_chapter_level"+    "Header level for chapters (separate files)"+    (pushIntegral, writerEpubChapterLevel)+    (peekIntegral, \opts x -> opts{ writerEpubChapterLevel = x })++  , property "epub_fonts"+    "Paths to fonts to embed"+    (pushPandocList pushString, writerEpubFonts)+    (peekList peekString, \opts x -> opts{ writerEpubFonts = x })++  , property "epub_metadata"+    "Metadata to include in EPUB"+    (maybe pushnil pushText, writerEpubMetadata)+    (optional . peekText, \opts x -> opts{ writerEpubMetadata = x })++  , property "epub_subdirectory"+    "Subdir for epub in OCF"+    (pushText, writerEpubSubdirectory)+    (peekText, \opts x -> opts{ writerEpubSubdirectory = x })++  , property "extensions"+    "Markdown extensions that can be used"+    (pushViaJSON, writerExtensions)+    (peekViaJSON, \opts x -> opts{ writerExtensions = x })++  , property "highlight_style"+    "Style to use for highlighting (nil = no highlighting)"+    (maybe pushnil pushViaJSON, writerHighlightStyle)+    (optional . peekViaJSON, \opts x -> opts{ writerHighlightStyle = x })++  , property "html_math_method"+    "How to print math in HTML"+    (pushViaJSON, writerHTMLMathMethod)+    (peekViaJSON, \opts x -> opts{ writerHTMLMathMethod = x })++  , property "html_q_tags"+    "Use @<q>@ tags for quotes in HTML"+    (pushBool, writerHtmlQTags)+    (peekBool, \opts x -> opts{ writerHtmlQTags = x })++  , property "identifier_prefix"+    "Prefix for section & note ids in HTML and for footnote marks in markdown"+    (pushText, writerIdentifierPrefix)+    (peekText, \opts x -> opts{ writerIdentifierPrefix = x })++  , property "incremental"+    "True if lists should be incremental"+    (pushBool, writerIncremental)+    (peekBool, \opts x -> opts{ writerIncremental = x })++  , property "listings"+    "Use listings package for code"+    (pushBool, writerListings)+    (peekBool, \opts x -> opts{ writerListings = x })++  , property "number_offset"+    "Starting number for section, subsection, ..."+    (pushPandocList pushIntegral, writerNumberOffset)+    (peekList peekIntegral, \opts x -> opts{ writerNumberOffset = x })++  , property "number_sections"+    "Number sections in LaTeX"+    (pushBool, writerNumberSections)+    (peekBool, \opts x -> opts{ writerNumberSections = x })++  , property "prefer_ascii"+    "Prefer ASCII representations of characters when possible"+    (pushBool, writerPreferAscii)+    (peekBool, \opts x -> opts{ writerPreferAscii = x })++  , property "reference_doc"+    "Path to reference document if specified"+    (maybe pushnil pushString, writerReferenceDoc)+    (optional . peekString, \opts x -> opts{ writerReferenceDoc = 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)+    (peekBool, \opts x -> opts{ writerSectionDivs = x })++  , property "setext_headers"+    "Use setext headers for levels 1-2 in markdown"+    (pushBool, writerSetextHeaders)+    (peekBool, \opts x -> opts{ writerSetextHeaders = x })++  , property "slide_level"+    "Force header level of slides"+    (maybe pushnil pushIntegral, writerSlideLevel)+    (optional . peekIntegral, \opts x -> opts{ writerSlideLevel = x })++  -- , property "syntax_map" "Syntax highlighting definition"+  --   (pushViaJSON, writerSyntaxMap)+  --   (peekViaJSON, \opts x -> opts{ writerSyntaxMap = x })+    -- :: SyntaxMap++  , property "tab_stop"+    "Tabstop for conversion btw spaces and tabs"+    (pushIntegral, writerTabStop)+    (peekIntegral, \opts x -> opts{ writerTabStop = x })++  , property "table_of_contents"+    "Include table of contents"+    (pushBool, writerTableOfContents)+    (peekBool, \opts x -> opts{ writerTableOfContents = x })++  , property "template"+    "Template to use"+    (maybe pushnil pushTemplate, writerTemplate)+    (optional . peekTemplate, \opts x -> opts{ writerTemplate = x })+    -- :: Maybe (Template Text)++  , property "toc_depth"+    "Number of levels to include in TOC"+    (pushIntegral, writerTOCDepth)+    (peekIntegral, \opts x -> opts{ writerTOCDepth = x })++  , property "top_level_division"+    "Type of top-level divisions"+    (pushViaJSON, writerTopLevelDivision)+    (peekViaJSON, \opts x -> opts{ writerTopLevelDivision = x })++  , property "variables"+    "Variables to set in template"+    (pushViaJSON, writerVariables)+    (peekViaJSON, \opts x -> opts{ writerVariables = x })++  , property "wrap_text"+    "Option for wrapping text"+    (pushViaJSON, writerWrapText)+    (peekViaJSON, \opts x -> opts{ writerWrapText = x })+  ]++-- | Retrieves a 'WriterOptions' object from a table on the stack, using+-- the default values for all missing fields.+--+-- Internally, this pushes the default writer options, sets each+-- key/value pair of the table in the userdata value, then retrieves the+-- object again. This will update all fields and complain about unknown+-- keys.+peekWriterOptionsTable :: LuaError e => Peeker e WriterOptions+peekWriterOptionsTable idx = retrieving "WriterOptions (table)" $ do+  liftLua $ do+    absidx <- absindex idx+    pushUD typeWriterOptions def+    let setFields = do+          next absidx >>= \case+            False -> return () -- all fields were copied+            True -> do+              pushvalue (nth 2) *> insert (nth 2)+              settable (nth 4) -- set in userdata object+              setFields+    pushnil -- first key+    setFields+  peekUD typeWriterOptions top `lastly` pop 1++instance Pushable WriterOptions where+  push = pushWriterOptions
− src/Text/Pandoc/Lua/Marshaling.hs
@@ -1,19 +0,0 @@-{- |-   Module      : Text.Pandoc.Lua.Marshaling-   Copyright   : © 2012-2021 John MacFarlane-                 © 2017-2021 Albert Krewinkel-   License     : GNU GPL, version 2 or above--   Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>-   Stability   : alpha--Lua marshaling (pushing) and unmarshaling (peeking) instances.--}-module Text.Pandoc.Lua.Marshaling () where--import Text.Pandoc.Lua.Marshaling.AST ()-import Text.Pandoc.Lua.Marshaling.CommonState ()-import Text.Pandoc.Lua.Marshaling.Context ()-import Text.Pandoc.Lua.Marshaling.PandocError()-import Text.Pandoc.Lua.Marshaling.ReaderOptions ()-import Text.Pandoc.Lua.ErrorConversion ()
− src/Text/Pandoc/Lua/Marshaling/AST.hs
@@ -1,861 +0,0 @@-{-# OPTIONS_GHC -fno-warn-orphans #-}-{-# LANGUAGE FlexibleInstances    #-}-{-# LANGUAGE LambdaCase           #-}-{-# LANGUAGE OverloadedStrings    #-}-{-# LANGUAGE ScopedTypeVariables  #-}-{-# LANGUAGE TupleSections        #-}-{-# LANGUAGE TypeApplications     #-}-{- |-   Module      : Text.Pandoc.Lua.Marshaling.AST-   Copyright   : © 2012-2021 John MacFarlane-                 © 2017-2021 Albert Krewinkel-   License     : GNU GPL, version 2 or above--   Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>-   Stability   : alpha--Marshaling/unmarshaling instances for document AST elements.--}-module Text.Pandoc.Lua.Marshaling.AST-  ( peekAttr-  , peekBlock-  , peekBlockFuzzy-  , peekBlocks-  , peekBlocksFuzzy-  , peekCaption-  , peekCitation-  , peekColSpec-  , peekDefinitionItem-  , peekFormat-  , peekInline-  , peekInlineFuzzy-  , peekInlines-  , peekInlinesFuzzy-  , peekMeta-  , peekMetaValue-  , peekPandoc-  , peekMathType-  , peekQuoteType-  , peekTableBody-  , peekTableHead-  , peekTableFoot--  , pushAttr-  , pushBlock-  , pushCitation-  , pushInline-  , pushListAttributes-  , pushMeta-  , pushMetaValue-  , pushPandoc-  ) where--import Control.Applicative ((<|>), optional)-import Control.Monad.Catch (throwM)-import Control.Monad ((<$!>))-import Data.Data (showConstr, toConstr)-import Data.Text (Text)-import Data.Version (Version)-import HsLua hiding (Operation (Div))-import HsLua.Module.Version (peekVersionFuzzy)-import Text.Pandoc.Definition-import Text.Pandoc.Error (PandocError (PandocLuaError))-import Text.Pandoc.Lua.Util (pushViaConstr')-import Text.Pandoc.Lua.Marshaling.Attr (peekAttr, pushAttr)-import Text.Pandoc.Lua.Marshaling.List (pushPandocList)-import Text.Pandoc.Lua.Marshaling.ListAttributes-  (peekListAttributes, pushListAttributes)--import qualified HsLua as Lua-import qualified Text.Pandoc.Lua.Util as LuaUtil--instance Pushable Pandoc where-  push = pushPandoc--pushPandoc :: LuaError e => Pusher e Pandoc-pushPandoc = pushUD typePandoc--peekPandoc :: LuaError e => Peeker e Pandoc-peekPandoc = retrieving "Pandoc value" . peekUD typePandoc--typePandoc :: LuaError e => DocumentedType e Pandoc-typePandoc = deftype "Pandoc"-  [ operation Eq $ defun "__eq"-     ### liftPure2 (==)-     <#> parameter (optional . peekPandoc) "doc1" "pandoc" ""-     <#> parameter (optional . peekPandoc) "doc2" "pandoc" ""-     =#> functionResult pushBool "boolean" "true iff the two values are equal"-  , operation Tostring $ lambda-    ### liftPure show-    <#> parameter peekPandoc "Pandoc" "doc" ""-    =#> functionResult pushString "string" "native Haskell representation"-  ]-  [ property "blocks" "list of blocks"-      (pushPandocList pushBlock, \(Pandoc _ blks) -> blks)-      (peekList peekBlock, \(Pandoc m _) blks -> Pandoc m blks)-  , property "meta" "document metadata"-      (pushMeta, \(Pandoc meta _) -> meta)-      (peekMeta, \(Pandoc _ blks) meta -> Pandoc meta blks)-  ]--instance Pushable Meta where-  push = pushMeta--pushMeta :: LuaError e => Pusher e Meta-pushMeta (Meta mmap) = pushViaConstr' "Meta" [push mmap]--peekMeta :: LuaError e => Peeker e Meta-peekMeta idx = retrieving "Meta" $-  Meta <$!> peekMap peekText peekMetaValue idx--instance Pushable MetaValue where-  push = pushMetaValue--instance Pushable Block where-  push = pushBlock--typeCitation :: LuaError e => DocumentedType e Citation-typeCitation = deftype "Citation"-  [ operation Eq $ lambda-    ### liftPure2 (==)-    <#> parameter (optional . peekCitation) "Citation" "a" ""-    <#> parameter (optional . peekCitation) "Citation" "b" ""-    =#> functionResult pushBool "boolean" "true iff the citations are equal"--  , operation Tostring $ lambda-    ### liftPure show-    <#> parameter peekCitation "Citation" "citation" ""-    =#> functionResult pushString "string" "native Haskell representation"-  ]-  [ property "id" "citation ID / key"-      (pushText, citationId)-      (peekText, \citation cid -> citation{ citationId = cid })-  , property "mode" "citation mode"-      (pushString . show, citationMode)-      (peekRead, \citation mode -> citation{ citationMode = mode })-  , property "prefix" "citation prefix"-      (pushInlines, citationPrefix)-      (peekInlines, \citation prefix -> citation{ citationPrefix = prefix })-  , property "suffix" "citation suffix"-      (pushInlines, citationSuffix)-      (peekInlines, \citation suffix -> citation{ citationPrefix = suffix })-  , property "note_num" "note number"-      (pushIntegral, citationNoteNum)-      (peekIntegral, \citation noteNum -> citation{ citationNoteNum = noteNum })-  , property "hash" "hash number"-      (pushIntegral, citationHash)-      (peekIntegral, \citation hash -> citation{ citationHash = hash })-  , method $ defun "clone" ### return <#> udparam typeCitation "obj" ""-    =#> functionResult pushCitation "Citation" "copy of obj"-  ]--pushCitation :: LuaError e => Pusher e Citation-pushCitation = pushUD typeCitation--peekCitation :: LuaError e => Peeker e Citation-peekCitation = peekUD typeCitation--instance Pushable Alignment where-  push = Lua.pushString . show--instance Pushable CitationMode where-  push = Lua.push . show--instance Pushable Format where-  push = pushFormat--pushFormat :: LuaError e => Pusher e Format-pushFormat (Format f) = pushText f--peekFormat :: LuaError e => Peeker e Format-peekFormat idx = Format <$!> peekText idx--instance Pushable ListNumberDelim where-  push = Lua.push . show--instance Pushable ListNumberStyle where-  push = Lua.push . show--instance Pushable MathType where-  push = Lua.push . show--instance Pushable QuoteType where-  push = pushQuoteType--pushMathType :: LuaError e => Pusher e MathType-pushMathType = pushString . show--peekMathType :: LuaError e => Peeker e MathType-peekMathType = peekRead--pushQuoteType :: LuaError e => Pusher e QuoteType-pushQuoteType = pushString . show--peekQuoteType :: LuaError e => Peeker e QuoteType-peekQuoteType = peekRead---- | Push an meta value element to the top of the lua stack.-pushMetaValue :: LuaError e => MetaValue -> LuaE e ()-pushMetaValue = \case-  MetaBlocks blcks  -> pushViaConstr' "MetaBlocks" [pushList pushBlock blcks]-  MetaBool bool     -> Lua.push bool-  MetaInlines inlns -> pushViaConstr' "MetaInlines"-                       [pushList pushInline inlns]-  MetaList metalist -> pushViaConstr' "MetaList"-                       [pushList pushMetaValue metalist]-  MetaMap metamap   -> pushViaConstr' "MetaMap"-                       [pushMap pushText pushMetaValue metamap]-  MetaString str    -> Lua.push str---- | Interpret the value at the given stack index as meta value.-peekMetaValue :: forall e. LuaError e => Peeker e MetaValue-peekMetaValue = retrieving "MetaValue $ " . \idx -> do-  -- Get the contents of an AST element.-  let mkMV :: (a -> MetaValue) -> Peeker e a -> Peek e MetaValue-      mkMV f p = f <$!> p idx--      peekTagged = \case-        "MetaBlocks"  -> mkMV MetaBlocks $-          retrieving "MetaBlocks" . peekBlocks-        "MetaBool"    -> mkMV MetaBool $-          retrieving "MetaBool" . peekBool-        "MetaMap"     -> mkMV MetaMap $-          retrieving "MetaMap" . peekMap peekText peekMetaValue-        "MetaInlines" -> mkMV MetaInlines $-          retrieving "MetaInlines" . peekInlines-        "MetaList"    -> mkMV MetaList $-          retrieving "MetaList" . peekList peekMetaValue-        "MetaString"  -> mkMV MetaString $-          retrieving "MetaString" . peekText-        (Name t)      -> failPeek ("Unknown meta tag: " <> t)--      peekUntagged = do-        -- no meta value tag given, try to guess.-        len <- liftLua $ Lua.rawlen idx-        if len <= 0-          then MetaMap <$!> peekMap peekText peekMetaValue idx-          else  (MetaInlines <$!> peekInlines idx)-            <|> (MetaBlocks <$!> peekBlocks idx)-            <|> (MetaList <$!> peekList peekMetaValue idx)-  luatype <- liftLua $ Lua.ltype idx-  case luatype of-    Lua.TypeBoolean -> MetaBool <$!> peekBool idx-    Lua.TypeString  -> MetaString <$!> peekText idx-    Lua.TypeTable   -> do-      optional (LuaUtil.getTag idx) >>= \case-        Just tag -> peekTagged tag-        Nothing  -> peekUntagged-    _        -> failPeek "could not get meta value"--typeBlock :: LuaError e => DocumentedType e Block-typeBlock = deftype "Block"-  [ operation Eq $ lambda-    ### liftPure2 (==)-    <#> parameter peekBlockFuzzy "Block" "a" ""-    <#> parameter peekBlockFuzzy "Block" "b" ""-    =#> boolResult "whether the two values are equal"-  , operation Tostring $ lambda-    ### liftPure show-    <#> udparam typeBlock "self" ""-    =#> functionResult pushString "string" "Haskell representation"-  ]-  [ possibleProperty "attr" "element attributes"-      (pushAttr, \case-          CodeBlock attr _     -> Actual attr-          Div attr _           -> Actual attr-          Header _ attr _      -> Actual attr-          Table attr _ _ _ _ _ -> Actual attr-          _                    -> Absent)-      (peekAttr, \case-          CodeBlock _ code     -> Actual . flip CodeBlock code-          Div _ blks           -> Actual . flip Div blks-          Header lvl _ blks    -> Actual . (\attr -> Header lvl attr blks)-          Table _ c cs h bs f  -> Actual . (\attr -> Table attr c cs h bs f)-          _                    -> const Absent)-  , possibleProperty "bodies" "table bodies"-      (pushPandocList pushTableBody, \case-          Table _ _ _ _ bs _ -> Actual bs-          _                  -> Absent)-      (peekList peekTableBody, \case-          Table attr c cs h _ f -> Actual . (\bs -> Table attr c cs h bs f)-          _                     -> const Absent)-  , possibleProperty "caption" "element caption"-      (pushCaption, \case {Table _ capt _ _ _ _ -> Actual capt; _ -> Absent})-      (peekCaption, \case-          Table attr _ cs h bs f -> Actual . (\c -> Table attr c cs h bs f)-          _                      -> const Absent)-  , possibleProperty "colspecs" "column alignments and widths"-      (pushPandocList pushColSpec, \case-          Table _ _ cs _ _ _     -> Actual cs-          _                      -> Absent)-      (peekList peekColSpec, \case-          Table attr c _ h bs f  -> Actual . (\cs -> Table attr c cs h bs f)-          _                      -> const Absent)-  , possibleProperty "content" "element content"-      (pushContent, getBlockContent)-      (peekContent, setBlockContent)-  , possibleProperty "foot" "table foot"-      (pushTableFoot, \case {Table _ _ _ _ _ f -> Actual f; _ -> Absent})-      (peekTableFoot, \case-          Table attr c cs h bs _ -> Actual . (\f -> Table attr c cs h bs f)-          _                      -> const Absent)-  , possibleProperty "format" "format of raw content"-      (pushFormat, \case {RawBlock f _ -> Actual f; _ -> Absent})-      (peekFormat, \case-          RawBlock _ txt -> Actual . (`RawBlock` txt)-          _              -> const Absent)-  , possibleProperty "head" "table head"-      (pushTableHead, \case {Table _ _ _ h _ _ -> Actual h; _ -> Absent})-      (peekTableHead, \case-          Table attr c cs _ bs f  -> Actual . (\h -> Table attr c cs h bs f)-          _                       -> const Absent)-  , possibleProperty "level" "heading level"-      (pushIntegral, \case {Header lvl _ _ -> Actual lvl; _ -> Absent})-      (peekIntegral, \case-          Header _ attr inlns -> Actual . \lvl -> Header lvl attr inlns-          _                   -> const Absent)-  , possibleProperty "listAttributes" "ordered list attributes"-      (pushListAttributes, \case-          OrderedList listAttr _ -> Actual listAttr-          _                      -> Absent)-      (peekListAttributes, \case-          OrderedList _ content -> Actual . (`OrderedList` content)-          _                     -> const Absent)-  , possibleProperty "text" "text contents"-      (pushText, getBlockText)-      (peekText, setBlockText)--  , readonly "tag" "type of Block"-      (pushString, showConstr . toConstr )--  , alias "t" "tag" ["tag"]-  , alias "c" "content" ["content"]-  , alias "identifier" "element identifier"       ["attr", "identifier"]-  , alias "classes"    "element classes"          ["attr", "classes"]-  , alias "attributes" "other element attributes" ["attr", "attributes"]-  , alias "start"      "ordered list start number" ["listAttributes", "start"]-  , alias "style"      "ordered list style"       ["listAttributes", "style"]-  , alias "delimiter"  "numbering delimiter"      ["listAttributes", "delimiter"]--  , method $ defun "clone"-    ### return-    <#> parameter peekBlock "Block" "block" "self"-    =#> functionResult pushBlock "Block" "cloned Block"--  , method $ defun "show"-    ### liftPure show-    <#> parameter peekBlock "Block" "self" ""-    =#> functionResult pushString "string" "Haskell string representation"-  ]- where-  boolResult = functionResult pushBool "boolean"--getBlockContent :: Block -> Possible Content-getBlockContent = \case-  -- inline content-  Para inlns          -> Actual $ ContentInlines inlns-  Plain inlns         -> Actual $ ContentInlines inlns-  Header _ _ inlns    -> Actual $ ContentInlines inlns-  -- inline content-  BlockQuote blks     -> Actual $ ContentBlocks blks-  Div _ blks          -> Actual $ ContentBlocks blks-  -- lines content-  LineBlock lns       -> Actual $ ContentLines lns-  -- list items content-  BulletList itms     -> Actual $ ContentListItems itms-  OrderedList _ itms  -> Actual $ ContentListItems itms-  -- definition items content-  DefinitionList itms -> Actual $ ContentDefItems itms-  _                   -> Absent--setBlockContent :: Block -> Content -> Possible Block-setBlockContent = \case-  -- inline content-  Para _           -> Actual . Para . inlineContent-  Plain _          -> Actual . Plain . inlineContent-  Header attr lvl _ -> Actual . Header attr lvl . inlineContent-  -- block content-  BlockQuote _     -> Actual . BlockQuote . blockContent-  Div attr _       -> Actual . Div attr . blockContent-  -- lines content-  LineBlock _      -> Actual . LineBlock . lineContent-  -- list items content-  BulletList _     -> Actual . BulletList . listItemContent-  OrderedList la _ -> Actual . OrderedList la . listItemContent-  -- definition items content-  DefinitionList _ -> Actual . DefinitionList . defItemContent-  _                -> const Absent-  where-    inlineContent = \case-      ContentInlines inlns -> inlns-      c -> throwM . PandocLuaError $ "expected Inlines, got " <>-           contentTypeDescription c-    blockContent = \case-      ContentBlocks blks   -> blks-      ContentInlines inlns -> [Plain inlns]-      c -> throwM . PandocLuaError $ "expected Blocks, got " <>-           contentTypeDescription c-    lineContent = \case-      ContentLines lns     -> lns-      c -> throwM . PandocLuaError $ "expected list of lines, got " <>-           contentTypeDescription c-    defItemContent = \case-      ContentDefItems itms -> itms-      c -> throwM . PandocLuaError $ "expected definition items, got " <>-           contentTypeDescription c-    listItemContent = \case-      ContentBlocks blks    -> [blks]-      ContentLines lns      -> map ((:[]) . Plain) lns-      ContentListItems itms -> itms-      c -> throwM . PandocLuaError $ "expected list of items, got " <>-           contentTypeDescription c--getBlockText :: Block -> Possible Text-getBlockText = \case-  CodeBlock _ lst -> Actual lst-  RawBlock _ raw  -> Actual raw-  _               -> Absent--setBlockText :: Block -> Text -> Possible Block-setBlockText = \case-  CodeBlock attr _ -> Actual . CodeBlock attr-  RawBlock f _     -> Actual . RawBlock f-  _                -> const Absent---- | Push a block element to the top of the Lua stack.-pushBlock :: forall e. LuaError e => Block -> LuaE e ()-pushBlock = pushUD typeBlock---- | Return the value at the given index as block if possible.-peekBlock :: forall e. LuaError e => Peeker e Block-peekBlock = retrieving "Block" . peekUD typeBlock---- | Retrieves a list of Block elements.-peekBlocks :: LuaError e => Peeker e [Block]-peekBlocks = peekList peekBlock--peekInlines :: LuaError e => Peeker e [Inline]-peekInlines = peekList peekInline--pushInlines :: LuaError e => Pusher e [Inline]-pushInlines = pushPandocList pushInline---- | Retrieves a single definition item from a the stack; it is expected--- to be a pair of a list of inlines and a list of list of blocks. Uses--- fuzzy parsing, i.e., tries hard to convert mismatching types into the--- expected result.-peekDefinitionItem :: LuaError e => Peeker e ([Inline], [[Block]])-peekDefinitionItem = peekPair peekInlinesFuzzy $ choice-  [ peekList peekBlocksFuzzy-  , \idx -> (:[]) <$!> peekBlocksFuzzy idx-  ]---- | Push Caption element-pushCaption :: LuaError e => Caption -> LuaE e ()-pushCaption (Caption shortCaption longCaption) = do-  Lua.newtable-  LuaUtil.addField "short" (Lua.Optional shortCaption)-  LuaUtil.addField "long" longCaption---- | Peek Caption element-peekCaption :: LuaError e => Peeker e Caption-peekCaption = retrieving "Caption" . \idx -> do-  short <- optional $ peekFieldRaw peekInlines "short" idx-  long <- peekFieldRaw peekBlocks "long" idx-  return $! Caption short long---- | Push a ColSpec value as a pair of Alignment and ColWidth.-pushColSpec :: LuaError e => Pusher e ColSpec-pushColSpec = pushPair (pushString . show) pushColWidth---- | Peek a ColSpec value as a pair of Alignment and ColWidth.-peekColSpec :: LuaError e => Peeker e ColSpec-peekColSpec = peekPair peekRead peekColWidth--peekColWidth :: LuaError e => Peeker e ColWidth-peekColWidth = retrieving "ColWidth" . \idx -> do-  maybe ColWidthDefault ColWidth <$!> optional (peekRealFloat idx)---- | Push a ColWidth value by pushing the width as a plain number, or--- @nil@ for ColWidthDefault.-pushColWidth :: LuaError e => Pusher e ColWidth-pushColWidth = \case-  (ColWidth w)    -> Lua.push w-  ColWidthDefault -> Lua.pushnil---- | Push a table row as a pair of attr and the list of cells.-pushRow :: LuaError e => Pusher e Row-pushRow (Row attr cells) =-  pushPair pushAttr (pushPandocList pushCell) (attr, cells)---- | Push a table row from a pair of attr and the list of cells.-peekRow :: LuaError e => Peeker e Row-peekRow = ((uncurry Row) <$!>)-  . retrieving "Row"-  . peekPair peekAttr (peekList peekCell)---- | Pushes a 'TableBody' value as a Lua table with fields @attr@,--- @row_head_columns@, @head@, and @body@.-pushTableBody :: LuaError e => Pusher e TableBody-pushTableBody (TableBody attr (RowHeadColumns rowHeadColumns) head' body) = do-    Lua.newtable-    LuaUtil.addField "attr" attr-    LuaUtil.addField "row_head_columns" rowHeadColumns-    LuaUtil.addField "head" head'-    LuaUtil.addField "body" body---- | Retrieves a 'TableBody' value from a Lua table with fields @attr@,--- @row_head_columns@, @head@, and @body@.-peekTableBody :: LuaError e => Peeker e TableBody-peekTableBody = fmap (retrieving "TableBody")-  . typeChecked "table" Lua.istable-  $ \idx -> TableBody-  <$!> peekFieldRaw peekAttr "attr" idx-  <*>  peekFieldRaw ((fmap RowHeadColumns) . peekIntegral) "row_head_columns" idx-  <*>  peekFieldRaw (peekList peekRow) "head" idx-  <*>  peekFieldRaw (peekList peekRow) "body" idx---- | Push a table head value as the pair of its Attr and rows.-pushTableHead :: LuaError e => Pusher e TableHead-pushTableHead (TableHead attr rows) =-  pushPair pushAttr (pushPandocList pushRow) (attr, rows)---- | Peek a table head value from a pair of Attr and rows.-peekTableHead :: LuaError e => Peeker e TableHead-peekTableHead = ((uncurry TableHead) <$!>)-  . retrieving "TableHead"-  . peekPair peekAttr (peekList peekRow)---- | Pushes a 'TableFoot' value as a pair of the Attr value and the list--- of table rows.-pushTableFoot :: LuaError e => Pusher e TableFoot-pushTableFoot (TableFoot attr rows) =-  pushPair pushAttr (pushPandocList pushRow) (attr, rows)---- | Retrieves a 'TableFoot' value from a pair containing an Attr value--- and a list of table rows.-peekTableFoot :: LuaError e => Peeker e TableFoot-peekTableFoot = ((uncurry TableFoot) <$!>)-  . retrieving "TableFoot"-  . peekPair peekAttr (peekList peekRow)--instance Pushable Cell where-  push = pushCell--instance Peekable Cell where-  peek = forcePeek . peekCell---- | Push a table cell as a table with fields @attr@, @alignment@,--- @row_span@, @col_span@, and @contents@.-pushCell :: LuaError e => Cell -> LuaE e ()-pushCell (Cell attr align (RowSpan rowSpan) (ColSpan colSpan) contents) = do-  Lua.newtable-  LuaUtil.addField "attr" attr-  LuaUtil.addField "alignment" align-  LuaUtil.addField "row_span" rowSpan-  LuaUtil.addField "col_span" colSpan-  LuaUtil.addField "contents" contents--peekCell :: LuaError e => Peeker e Cell-peekCell = fmap (retrieving "Cell")-  . typeChecked "table" Lua.istable-  $ \idx -> do-  attr <- peekFieldRaw peekAttr "attr" idx-  algn <- peekFieldRaw peekRead "alignment" idx-  rs   <- RowSpan <$!> peekFieldRaw peekIntegral "row_span" idx-  cs   <- ColSpan <$!> peekFieldRaw peekIntegral "col_span" idx-  blks <- peekFieldRaw peekBlocks "contents" idx-  return $! Cell attr algn rs cs blks--getInlineText :: Inline -> Possible Text-getInlineText = \case-  Code _ lst      -> Actual lst-  Math _ str      -> Actual str-  RawInline _ raw -> Actual raw-  Str s           -> Actual s-  _               -> Absent--setInlineText :: Inline -> Text -> Possible Inline-setInlineText = \case-  Code attr _     -> Actual . Code attr-  Math mt _       -> Actual . Math mt-  RawInline f _   -> Actual . RawInline f-  Str _           -> Actual . Str-  _               -> const Absent---- | Helper type to represent all the different types a `content`--- attribute can have.-data Content-  = ContentBlocks [Block]-  | ContentInlines [Inline]-  | ContentLines [[Inline]]-  | ContentDefItems [([Inline], [[Block]])]-  | ContentListItems [[Block]]--contentTypeDescription :: Content -> Text-contentTypeDescription = \case-  ContentBlocks {}    -> "list of Block items"-  ContentInlines {}   -> "list of Inline items"-  ContentLines {}     -> "list of Inline lists (i.e., a list of lines)"-  ContentDefItems {}  -> "list of definition items items"-  ContentListItems {} -> "list items (i.e., list of list of Block elements)"--pushContent :: LuaError e => Pusher e Content-pushContent = \case-  ContentBlocks blks -> pushPandocList pushBlock blks-  ContentInlines inlns -> pushPandocList pushInline inlns-  ContentLines lns -> pushPandocList (pushPandocList pushInline) lns-  ContentDefItems itms ->-    let pushItem = pushPair (pushPandocList pushInline)-                            (pushPandocList (pushPandocList pushBlock))-    in pushPandocList pushItem itms-  ContentListItems itms ->-    pushPandocList (pushPandocList pushBlock) itms--peekContent :: LuaError e => Peeker e Content-peekContent idx =-  (ContentInlines <$!> peekInlinesFuzzy idx) <|>-  (ContentLines  <$!> peekList (peekList peekInlineFuzzy) idx) <|>-  (ContentBlocks  <$!> peekBlocksFuzzy idx ) <|>-  (ContentListItems <$!> peekList peekBlocksFuzzy idx) <|>-  (ContentDefItems  <$!> peekList (peekDefinitionItem) idx)--setInlineContent :: Inline -> Content -> Possible Inline-setInlineContent = \case-  -- inline content-  Cite cs _     -> Actual . Cite cs . inlineContent-  Emph _        -> Actual . Emph . inlineContent-  Link a _ tgt  -> Actual . (\inlns -> Link a inlns tgt) . inlineContent-  Quoted qt _   -> Actual . Quoted qt . inlineContent-  SmallCaps _   -> Actual . SmallCaps . inlineContent-  Span attr _   -> Actual . Span attr . inlineContent-  Strikeout _   -> Actual . Strikeout . inlineContent-  Strong _      -> Actual . Strong . inlineContent-  Subscript _   -> Actual . Subscript . inlineContent-  Superscript _ -> Actual . Superscript . inlineContent-  Underline _   -> Actual . Underline . inlineContent-  -- block content-  Note _        -> Actual . Note . blockContent-  _             -> const Absent-  where-    inlineContent = \case-      ContentInlines inlns -> inlns-      c -> throwM . PandocLuaError $ "expected Inlines, got " <>-           contentTypeDescription c-    blockContent = \case-      ContentBlocks blks -> blks-      ContentInlines []  -> []-      c -> throwM . PandocLuaError $ "expected Blocks, got " <>-           contentTypeDescription c--getInlineContent :: Inline -> Possible Content-getInlineContent = \case-  Cite _ inlns      -> Actual $ ContentInlines inlns-  Emph inlns        -> Actual $ ContentInlines inlns-  Link _ inlns _    -> Actual $ ContentInlines inlns-  Quoted _ inlns    -> Actual $ ContentInlines inlns-  SmallCaps inlns   -> Actual $ ContentInlines inlns-  Span _ inlns      -> Actual $ ContentInlines inlns-  Strikeout inlns   -> Actual $ ContentInlines inlns-  Strong inlns      -> Actual $ ContentInlines inlns-  Subscript inlns   -> Actual $ ContentInlines inlns-  Superscript inlns -> Actual $ ContentInlines inlns-  Underline inlns   -> Actual $ ContentInlines inlns-  Note blks         -> Actual $ ContentBlocks blks-  _                 -> Absent---- title-getInlineTitle :: Inline -> Possible Text-getInlineTitle = \case-  Image _ _ (_, tit) -> Actual tit-  Link _ _ (_, tit)  -> Actual tit-  _                  -> Absent--setInlineTitle :: Inline -> Text -> Possible Inline-setInlineTitle = \case-  Image attr capt (src, _) -> Actual . Image attr capt . (src,)-  Link attr capt (src, _)  -> Actual . Link attr capt . (src,)-  _                        -> const Absent---- attr-getInlineAttr :: Inline -> Possible Attr-getInlineAttr = \case-  Code attr _    -> Actual attr-  Image attr _ _ -> Actual attr-  Link attr _ _  -> Actual attr-  Span attr _    -> Actual attr-  _              -> Absent--setInlineAttr :: Inline -> Attr -> Possible Inline-setInlineAttr = \case-  Code _ cs       -> Actual . (`Code` cs)-  Image _ cpt tgt -> Actual . \attr -> Image attr cpt tgt-  Link _ cpt tgt  -> Actual . \attr -> Link attr cpt tgt-  Span _ inlns    -> Actual . (`Span` inlns)-  _               -> const Absent--showInline :: LuaError e => DocumentedFunction e-showInline = defun "show"-  ### liftPure (show @Inline)-  <#> parameter peekInline "inline" "Inline" "Object"-  =#> functionResult pushString "string" "stringified Inline"--typeInline :: LuaError e => DocumentedType e Inline-typeInline = deftype "Inline"-  [ operation Tostring showInline-  , operation Eq $ defun "__eq"-      ### liftPure2 (==)-      <#> parameter peekInline "a" "Inline" ""-      <#> parameter peekInline "b" "Inline" ""-      =#> functionResult pushBool "boolean" "whether the two are equal"-  ]-  [ possibleProperty "attr" "element attributes"-      (pushAttr, getInlineAttr)-      (peekAttr, setInlineAttr)-  , possibleProperty "caption" "image caption"-      (pushPandocList pushInline, \case-          Image _ capt _ -> Actual capt-          _              -> Absent)-      (peekInlinesFuzzy, \case-          Image attr _ target -> Actual . (\capt -> Image attr capt target)-          _                   -> const Absent)-  , possibleProperty "citations" "list of citations"-      (pushPandocList pushCitation, \case {Cite cs _ -> Actual cs; _ -> Absent})-      (peekList peekCitation, \case-          Cite _ inlns -> Actual . (`Cite` inlns)-          _            -> const Absent)-  , possibleProperty "content" "element contents"-      (pushContent, getInlineContent)-      (peekContent, setInlineContent)-  , possibleProperty "format" "format of raw text"-      (pushFormat, \case {RawInline fmt _ -> Actual fmt; _ -> Absent})-      (peekFormat, \case-          RawInline _ txt -> Actual . (`RawInline` txt)-          _ -> const Absent)-  , possibleProperty "mathtype" "math rendering method"-      (pushMathType, \case {Math mt _ -> Actual mt; _ -> Absent})-      (peekMathType, \case-          Math _ txt -> Actual . (`Math` txt)-          _          -> const Absent)-  , possibleProperty "quotetype" "type of quotes (single or double)"-      (pushQuoteType, \case {Quoted qt _ -> Actual qt; _ -> Absent})-      (peekQuoteType, \case-          Quoted _ inlns  -> Actual . (`Quoted` inlns)-          _               -> const Absent)-  , possibleProperty "src" "image source"-      (pushText, \case-          Image _ _ (src, _) -> Actual src-          _                  -> Absent)-      (peekText, \case-          Image attr capt (_, title) -> Actual . Image attr capt . (,title)-          _                          -> const Absent)-  , possibleProperty "target" "link target URL"-      (pushText, \case-          Link _ _ (tgt, _) -> Actual tgt-          _                 -> Absent)-      (peekText, \case-          Link attr capt (_, title) -> Actual . Link attr capt . (,title)-          _                         -> const Absent)-  , possibleProperty "title" "title text"-      (pushText, getInlineTitle)-      (peekText, setInlineTitle)-  , possibleProperty "text" "text contents"-      (pushText, getInlineText)-      (peekText, setInlineText)-  , readonly "tag" "type of Inline"-      (pushString, showConstr . toConstr )--  , alias "t" "tag" ["tag"]-  , alias "c" "content" ["content"]-  , alias "identifier" "element identifier"       ["attr", "identifier"]-  , alias "classes"    "element classes"          ["attr", "classes"]-  , alias "attributes" "other element attributes" ["attr", "attributes"]--  , method $ defun "clone"-      ### return-      <#> parameter peekInline "inline" "Inline" "self"-      =#> functionResult pushInline "Inline" "cloned Inline"-  ]---- | Push an inline element to the top of the lua stack.-pushInline :: forall e. LuaError e => Inline -> LuaE e ()-pushInline = pushUD typeInline---- | Return the value at the given index as inline if possible.-peekInline :: forall e. LuaError e => Peeker e Inline-peekInline = retrieving "Inline" . \idx -> peekUD typeInline idx---- | Try extra hard to retrieve an Inline value from the stack. Treats--- bare strings as @Str@ values.-peekInlineFuzzy :: LuaError e => Peeker e Inline-peekInlineFuzzy = retrieving "Inline" . choice-  [ peekUD typeInline-  , \idx -> Str <$!> peekText idx-  ]---- | Try extra-hard to return the value at the given index as a list of--- inlines.-peekInlinesFuzzy :: LuaError e => Peeker e [Inline]-peekInlinesFuzzy = choice-  [ peekList peekInlineFuzzy-  , fmap pure . peekInlineFuzzy-  ]---- | Try extra hard to retrieve a Block value from the stack. Treats bar--- Inline elements as if they were wrapped in 'Plain'.-peekBlockFuzzy :: LuaError e => Peeker e Block-peekBlockFuzzy = choice-  [ peekBlock-  , (\idx -> Plain <$!> peekInlinesFuzzy idx)-  ]---- | Try extra-hard to return the value at the given index as a list of--- blocks.-peekBlocksFuzzy :: LuaError e => Peeker e [Block]-peekBlocksFuzzy = choice-  [ peekList peekBlockFuzzy-  , (<$!>) pure . peekBlockFuzzy-  ]---- * Orphan Instances--instance Pushable Inline where-  push = pushInline--instance Pushable Citation where-  push = pushCitation--instance Pushable Row where-  push = pushRow--instance Pushable TableBody where-  push = pushTableBody--instance Pushable TableFoot where-  push = pushTableFoot--instance Pushable TableHead where-  push = pushTableHead---- These instances exist only for testing. It's a hack to avoid making--- the marshalling modules public.-instance Peekable Inline where-  peek = forcePeek . peekInline--instance Peekable Block where-  peek = forcePeek . peekBlock--instance Peekable Meta where-  peek = forcePeek . peekMeta--instance Peekable Pandoc where-  peek = forcePeek . peekPandoc--instance Peekable Row where-  peek = forcePeek . peekRow--instance Peekable Version where-  peek = forcePeek . peekVersionFuzzy--instance {-# OVERLAPPING #-} Peekable Attr where-  peek = forcePeek . peekAttr
− src/Text/Pandoc/Lua/Marshaling/Attr.hs
@@ -1,237 +0,0 @@-{-# LANGUAGE BangPatterns         #-}-{-# LANGUAGE LambdaCase           #-}-{-# LANGUAGE OverloadedStrings    #-}-{-# LANGUAGE ScopedTypeVariables  #-}-{-# LANGUAGE TupleSections        #-}-{-# LANGUAGE TypeApplications     #-}-{- |-Module      : Text.Pandoc.Lua.Marshaling.Attr-Copyright   : © 2012-2021 John MacFarlane-              © 2017-2021 Albert Krewinkel-License     : GNU GPL, version 2 or above--Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>-Stability   : alpha--Marshaling/unmarshaling instances for document AST elements.--}-module Text.Pandoc.Lua.Marshaling.Attr-  ( typeAttr-  , peekAttr-  , pushAttr-  , mkAttr-  , mkAttributeList-  ) where--import Control.Applicative ((<|>), optional)-import Control.Monad ((<$!>))-import Data.Maybe (fromMaybe)-import Data.Text (Text)-import HsLua-import HsLua.Marshalling.Peekers (peekIndexRaw)-import Safe (atMay)-import Text.Pandoc.Definition (Attr, nullAttr)-import Text.Pandoc.Lua.Marshaling.List (pushPandocList)--import qualified Data.Text as T--typeAttr :: LuaError e => DocumentedType e Attr-typeAttr = deftype "Attr"-  [ operation Eq $ lambda-    ### liftPure2 (==)-    <#> parameter peekAttr "a1" "Attr" ""-    <#> parameter peekAttr "a2" "Attr" ""-    =#> functionResult pushBool "boolean" "whether the two are equal"-  , operation Tostring $ lambda-    ### liftPure show-    <#> parameter peekAttr "Attr" "attr" ""-    =#> functionResult pushString "string" "native Haskell representation"-  ]-  [ property "identifier" "element identifier"-      (pushText, \(ident,_,_) -> ident)-      (peekText, \(_,cls,kv) -> (,cls,kv))-  , property "classes" "element classes"-      (pushPandocList pushText, \(_,classes,_) -> classes)-      (peekList peekText, \(ident,_,kv) -> (ident,,kv))-  , property "attributes" "various element attributes"-      (pushAttribs, \(_,_,attribs) -> attribs)-      (peekAttribs, \(ident,cls,_) -> (ident,cls,))-  , method $ defun "clone"-    ### return-    <#> parameter peekAttr "attr" "Attr" ""-    =#> functionResult pushAttr "Attr" "new Attr element"-  , readonly "tag" "element type tag (always 'Attr')"-      (pushText, const "Attr")--  , alias "t" "alias for `tag`" ["tag"]-  ]--pushAttr :: LuaError e => Pusher e Attr-pushAttr = pushUD typeAttr--peekAttribs :: LuaError e => Peeker e [(Text,Text)]-peekAttribs idx = liftLua (ltype idx) >>= \case-  TypeUserdata -> peekUD typeAttributeList idx-  TypeTable    -> liftLua (rawlen idx) >>= \case-    0 -> peekKeyValuePairs peekText peekText idx-    _ -> peekList (peekPair peekText peekText) idx-  _            -> failPeek "unsupported type"--pushAttribs :: LuaError e => Pusher e [(Text, Text)]-pushAttribs = pushUD typeAttributeList--typeAttributeList :: LuaError e => DocumentedType e [(Text, Text)]-typeAttributeList = deftype "AttributeList"-  [ operation Eq $ lambda-    ### liftPure2 (==)-    <#> parameter peekAttribs "a1" "AttributeList" ""-    <#> parameter peekAttribs "a2" "AttributeList" ""-    =#> functionResult pushBool "boolean" "whether the two are equal"--  , operation Index $ lambda-    ### liftPure2 lookupKey-    <#> udparam typeAttributeList "t" "attributes list"-    <#> parameter peekKey "string|integer" "key" "lookup key"-    =#> functionResult (maybe pushnil pushAttribute) "string|table"-          "attribute value"--  , operation Newindex $ lambda-    ### setKey-    <#> udparam typeAttributeList "t" "attributes list"-    <#> parameter peekKey "string|integer" "key" "lookup key"-    <#> optionalParameter peekAttribute "string|nil" "value" "new value"-    =#> []--  , operation Len $ lambda-    ### liftPure length-    <#> udparam typeAttributeList "t" "attributes list"-    =#> functionResult pushIntegral "integer" "number of attributes in list"--  , operation Pairs $ lambda-    ### pushIterator (\(k, v) -> 2 <$ pushText k <* pushText v)-    <#> udparam typeAttributeList "t" "attributes list"-    =?> "iterator triple"--  , operation Tostring $ lambda-    ### liftPure show-    <#> udparam typeAttributeList "t" "attributes list"-    =#> functionResult pushString "string" ""-  ]-  []--data Key = StringKey Text | IntKey Int--peekKey :: LuaError e => Peeker e (Maybe Key)-peekKey idx = liftLua (ltype idx) >>= \case-  TypeNumber -> Just . IntKey <$!> peekIntegral idx-  TypeString -> Just . StringKey <$!> peekText idx-  _          -> return Nothing--data Attribute-  = AttributePair (Text, Text)-  | AttributeValue Text--pushAttribute :: LuaError e => Pusher e Attribute-pushAttribute = \case-  (AttributePair kv) -> pushPair pushText pushText kv-  (AttributeValue v) -> pushText v---- | Retrieve an 'Attribute'.-peekAttribute :: LuaError e => Peeker e Attribute-peekAttribute idx = (AttributeValue <$!> peekText idx)-  <|> (AttributePair <$!> peekPair peekText peekText idx)--lookupKey :: [(Text,Text)] -> Maybe Key -> Maybe Attribute-lookupKey !kvs = \case-  Just (StringKey str) -> AttributeValue <$!> lookup str kvs-  Just (IntKey n)      -> AttributePair <$!> atMay kvs (n - 1)-  Nothing              -> Nothing--setKey :: forall e. LuaError e-       => [(Text, Text)] -> Maybe Key -> Maybe Attribute-       -> LuaE e ()-setKey kvs mbKey mbValue = case mbKey of-  Just (StringKey str) ->-    case break ((== str) . fst) kvs of-      (prefix, _:suffix) -> case mbValue of-        Nothing -> setNew $ prefix ++ suffix-        Just (AttributeValue value) -> setNew $ prefix ++ (str, value):suffix-        _ -> failLua "invalid attribute value"-      _  -> case mbValue of-        Nothing -> return ()-        Just (AttributeValue value) -> setNew (kvs ++ [(str, value)])-        _ -> failLua "invalid attribute value"-  Just (IntKey idx) ->-    case splitAt (idx - 1) kvs of-      (prefix, (k,_):suffix) -> setNew $ case mbValue of-        Nothing -> prefix ++ suffix-        Just (AttributePair kv) -> prefix ++ kv : suffix-        Just (AttributeValue v) -> prefix ++ (k, v) : suffix-      (prefix, []) -> case mbValue of-        Nothing -> setNew prefix-        Just (AttributePair kv) -> setNew $ prefix ++ [kv]-        _ -> failLua $ "trying to set an attribute key-value pair, "-             ++ "but got a single string instead."--  _  -> failLua "invalid attribute key"-  where-    setNew :: [(Text, Text)] -> LuaE e ()-    setNew new =-      putuserdata (nthBottom 1) (udName @e typeAttributeList) new >>= \case-        True -> return ()-        False -> failLua "failed to modify attributes list"--peekAttr :: LuaError e => Peeker e Attr-peekAttr idx = retrieving "Attr" $ liftLua (ltype idx) >>= \case-  TypeString -> (,[],[]) <$!> peekText idx -- treat string as ID-  TypeUserdata -> peekUD typeAttr idx-  TypeTable -> peekAttrTable idx-  x -> liftLua . failLua $ "Cannot get Attr from " ++ show x---- | Helper function which gets an Attr from a Lua table.-peekAttrTable :: LuaError e => Peeker e Attr-peekAttrTable idx = do-  len' <- liftLua $ rawlen idx-  let peekClasses = peekList peekText-  if len' > 0-    then do-      ident <- peekIndexRaw 1 peekText idx-      classes <- fromMaybe [] <$!> optional (peekIndexRaw 2 peekClasses idx)-      attribs <- fromMaybe [] <$!> optional (peekIndexRaw 3 peekAttribs idx)-      return $ ident `seq` classes `seq` attribs `seq`-        (ident, classes, attribs)-    else retrieving "HTML-like attributes" $ do-      kvs <- peekKeyValuePairs peekText peekText idx-      let ident = fromMaybe "" $ lookup "id" kvs-      let classes = maybe [] T.words $ lookup "class" kvs-      let attribs = filter ((`notElem` ["id", "class"]) . fst) kvs-      return $ ident `seq` classes `seq` attribs `seq`-        (ident, classes, attribs)---- | Constructor for 'Attr'.-mkAttr :: LuaError e => DocumentedFunction e-mkAttr = defun "Attr"-  ### (ltype (nthBottom 1) >>= \case-          TypeString -> forcePeek $ do-            mident <- optional (peekText (nthBottom 1))-            mclass <- optional (peekList peekText (nthBottom 2))-            mattribs <- optional (peekAttribs (nthBottom 3))-            return ( fromMaybe "" mident-                   , fromMaybe [] mclass-                   , fromMaybe [] mattribs)-          TypeTable  -> forcePeek $ peekAttrTable (nthBottom 1)-          TypeUserdata -> forcePeek $ peekUD typeAttr (nthBottom 1) <|> do-            attrList <- peekUD typeAttributeList (nthBottom 1)-            return ("", [], attrList)-          TypeNil    -> pure nullAttr-          TypeNone   -> pure nullAttr-          x          -> failLua $ "Cannot create Attr from " ++ show x)-  =#> functionResult pushAttr "Attr" "new Attr object"---- | Constructor for 'AttributeList'.-mkAttributeList :: LuaError e => DocumentedFunction e-mkAttributeList = defun "AttributeList"-  ### return-  <#> parameter peekAttribs "table|AttributeList" "attribs" "an attribute list"-  =#> functionResult (pushUD typeAttributeList) "AttributeList"-        "new AttributeList object"
− src/Text/Pandoc/Lua/Marshaling/CommonState.hs
@@ -1,70 +0,0 @@-{-# LANGUAGE OverloadedStrings    #-}-{- |-   Module      : Text.Pandoc.Lua.Marshaling.CommonState-   Copyright   : © 2012-2021 John MacFarlane-                 © 2017-2021 Albert Krewinkel-   License     : GNU GPL, version 2 or above-   Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>-   Stability   : alpha--Instances to marshal (push) and unmarshal (peek) the common state.--}-module Text.Pandoc.Lua.Marshaling.CommonState-  ( typeCommonState-  , peekCommonState-  , pushCommonState-  ) where--import HsLua.Core-import HsLua.Marshalling-import HsLua.Packaging-import Text.Pandoc.Class (CommonState (..))-import Text.Pandoc.Logging (LogMessage, showLogMessage)-import Text.Pandoc.Lua.Marshaling.List (pushPandocList)---- | Lua type used for the @CommonState@ object.-typeCommonState :: LuaError e => DocumentedType e CommonState-typeCommonState = deftype "pandoc CommonState" []-  [ readonly "input_files" "input files passed to pandoc"-      (pushPandocList pushString, stInputFiles)--  , readonly "output_file" "the file to which pandoc will write"-      (maybe pushnil pushString, stOutputFile)--  , readonly "log" "list of log messages"-      (pushPandocList (pushUD typeLogMessage), stLog)--  , readonly "request_headers" "headers to add for HTTP requests"-      (pushPandocList (pushPair pushText pushText), stRequestHeaders)--  , readonly "resource_path"-      "path to search for resources like included images"-      (pushPandocList pushString, stResourcePath)--  , readonly "source_url" "absolute URL + dir of 1st source file"-      (maybe pushnil pushText, stSourceURL)--  , readonly "user_data_dir" "directory to search for data files"-      (maybe pushnil pushString, stUserDataDir)--  , readonly "trace" "controls whether tracing messages are issued"-      (pushBool, stTrace)--  , readonly "verbosity" "verbosity level"-      (pushString . show, stVerbosity)-  ]--peekCommonState :: LuaError e => Peeker e CommonState-peekCommonState = peekUD typeCommonState--pushCommonState :: LuaError e => Pusher e CommonState-pushCommonState = pushUD typeCommonState--typeLogMessage :: LuaError e => DocumentedType e LogMessage-typeLogMessage = deftype "pandoc LogMessage"-  [ operation Index $ defun "__tostring"-      ### liftPure showLogMessage-      <#> udparam typeLogMessage "msg" "object"-      =#> functionResult pushText "string" "stringified log message"-  ]-  mempty -- no members
− src/Text/Pandoc/Lua/Marshaling/Context.hs
@@ -1,28 +0,0 @@-{-# OPTIONS_GHC -fno-warn-orphans #-}-{- |-   Module      : Text.Pandoc.Lua.Marshaling.Context-   Copyright   : © 2012-2021 John MacFarlane-                 © 2017-2021 Albert Krewinkel-   License     : GNU GPL, version 2 or above--   Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>-   Stability   : alpha--Marshaling instance for doctemplates Context and its components.--}-module Text.Pandoc.Lua.Marshaling.Context () where--import qualified HsLua as Lua-import HsLua (Pushable)-import Text.DocTemplates (Context(..), Val(..), TemplateTarget)-import Text.DocLayout (render)--instance (TemplateTarget a, Pushable a) => Pushable (Context a) where-  push (Context m) = Lua.push m--instance (TemplateTarget a, Pushable a) => Pushable (Val a) where-  push NullVal = Lua.push ()-  push (BoolVal b) = Lua.push b-  push (MapVal ctx) = Lua.push ctx-  push (ListVal xs) = Lua.push xs-  push (SimpleVal d) = Lua.push $ render Nothing d
− src/Text/Pandoc/Lua/Marshaling/List.hs
@@ -1,48 +0,0 @@-{-# LANGUAGE DeriveDataTypeable    #-}-{-# LANGUAGE FlexibleInstances     #-}-{-# LANGUAGE FlexibleContexts      #-}-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE OverloadedStrings     #-}-{-# LANGUAGE UndecidableInstances  #-}-{- |-Module      : Text.Pandoc.Lua.Marshaling.List-Copyright   : © 2012-2021 John MacFarlane-              © 2017-2021 Albert Krewinkel-License     : GNU GPL, version 2 or above-Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>-Stability   : alpha--Marshaling/unmarshaling instances for @pandoc.List@s.--}-module Text.Pandoc.Lua.Marshaling.List-  ( List (..)-  , peekList'-  , pushPandocList-  ) where--import Control.Monad ((<$!>))-import Data.Data (Data)-import HsLua (LuaError, Peeker, Pusher, Pushable (push), peekList, pushList)-import Text.Pandoc.Walk (Walkable (..))-import Text.Pandoc.Lua.Util (pushViaConstr')---- | List wrapper which is marshalled as @pandoc.List@.-newtype List a = List { fromList :: [a] }-  deriving (Data, Eq, Show)--instance Pushable a => Pushable (List a) where-  push (List xs) = pushPandocList push xs---- | Pushes a list as a numerical Lua table, setting a metatable that offers a--- number of convenience functions.-pushPandocList :: LuaError e => Pusher e a -> Pusher e [a]-pushPandocList pushItem xs = pushViaConstr' "List" [pushList pushItem xs]--peekList' :: LuaError e => Peeker e a -> Peeker e (List a)-peekList' p = (List <$!>) . peekList p---- List is just a wrapper, so we can reuse the walk instance for--- unwrapped Hasekll lists.-instance Walkable [a] b => Walkable (List a) b where-  walkM f = walkM (fmap fromList . f . List)-  query f = query (f . List)
− src/Text/Pandoc/Lua/Marshaling/ListAttributes.hs
@@ -1,72 +0,0 @@-{-# LANGUAGE OverloadedStrings    #-}-{-# LANGUAGE TupleSections        #-}-{- |-Module      : Text.Pandoc.Lua.Marshaling.ListAttributes-Copyright   : © 2021 Albert Krewinkel-License     : GNU GPL, version 2 or above-Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>--Marshaling/unmarshaling functions and constructor for 'ListAttributes'-values.--}-module Text.Pandoc.Lua.Marshaling.ListAttributes-  ( typeListAttributes-  , peekListAttributes-  , pushListAttributes-  , mkListAttributes-  ) where--import Data.Maybe (fromMaybe)-import HsLua-import Text.Pandoc.Definition ( ListAttributes, ListNumberStyle (DefaultStyle)-                              , ListNumberDelim (DefaultDelim))--typeListAttributes :: LuaError e => DocumentedType e ListAttributes-typeListAttributes = deftype "ListAttributes"-  [ operation Eq $ lambda-    ### liftPure2 (==)-    <#> parameter peekListAttributes "a" "ListAttributes" ""-    <#> parameter peekListAttributes "b" "ListAttributes" ""-    =#> functionResult pushBool "boolean" "whether the two are equal"-  ]-  [ property "start" "number of the first list item"-      (pushIntegral, \(start,_,_) -> start)-      (peekIntegral, \(_,style,delim) -> (,style,delim))-  , property "style" "style used for list numbering"-      (pushString . show, \(_,classes,_) -> classes)-      (peekRead, \(start,_,delim) -> (start,,delim))-  , property "delimiter" "delimiter of list numbers"-      (pushString . show, \(_,_,delim) -> delim)-      (peekRead, \(start,style,_) -> (start,style,))-  , method $ defun "clone"-    ### return-    <#> udparam typeListAttributes "a" ""-    =#> functionResult (pushUD typeListAttributes) "ListAttributes"-          "cloned ListAttributes value"-  ]---- | Pushes a 'ListAttributes' value as userdata object.-pushListAttributes :: LuaError e => Pusher e ListAttributes-pushListAttributes = pushUD typeListAttributes---- | Retrieve a 'ListAttributes' triple, either from userdata or from a--- Lua tuple.-peekListAttributes :: LuaError e => Peeker e ListAttributes-peekListAttributes = retrieving "ListAttributes" . choice-  [ peekUD typeListAttributes-  , peekTriple peekIntegral peekRead peekRead-  ]---- | Constructor for a new 'ListAttributes' value.-mkListAttributes :: LuaError e => DocumentedFunction e-mkListAttributes = defun "ListAttributes"-  ### liftPure3 (\mstart mstyle mdelim ->-                   ( fromMaybe 1 mstart-                   , fromMaybe DefaultStyle mstyle-                   , fromMaybe DefaultDelim mdelim-                   ))-  <#> optionalParameter peekIntegral "integer" "start" "number of first item"-  <#> optionalParameter peekRead "string" "style" "list numbering style"-  <#> optionalParameter peekRead "string" "delimiter" "list number delimiter"-  =#> functionResult pushListAttributes "ListAttributes" "new ListAttributes"-  #? "Creates a new ListAttributes object."
− src/Text/Pandoc/Lua/Marshaling/PandocError.hs
@@ -1,51 +0,0 @@-{-# LANGUAGE LambdaCase           #-}-{-# LANGUAGE OverloadedStrings    #-}-{-# LANGUAGE ScopedTypeVariables  #-}-{-# LANGUAGE TypeApplications     #-}-{- |-   Module      : Text.Pandoc.Lua.Marshaling.PandocError-   Copyright   : © 2020-2021 Albert Krewinkel-   License     : GNU GPL, version 2 or above--   Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>-   Stability   : alpha--Marshaling of @'PandocError'@ values.--}-module Text.Pandoc.Lua.Marshaling.PandocError-  ( peekPandocError-  , pushPandocError-  , typePandocError-  )-  where--import HsLua.Core (LuaError)-import HsLua.Marshalling (Peeker, Pusher, pushString, liftLua)-import HsLua.Packaging-import Text.Pandoc.Error (PandocError (PandocLuaError))--import qualified HsLua as Lua-import qualified Text.Pandoc.UTF8 as UTF8---- | Lua userdata type definition for PandocError.-typePandocError :: LuaError e => DocumentedType e PandocError-typePandocError = deftype "PandocError"-  [ operation Tostring $ defun "__tostring"-    ### liftPure (show @PandocError)-    <#> udparam typePandocError "obj" "PandocError object"-    =#> functionResult pushString "string" "string representation of error."-  ]-  mempty -- no members---- | Peek a @'PandocError'@ element to the Lua stack.-pushPandocError :: LuaError e => Pusher e PandocError-pushPandocError = pushUD typePandocError---- | Retrieve a @'PandocError'@ from the Lua stack.-peekPandocError :: LuaError e => Peeker e PandocError-peekPandocError idx = Lua.retrieving "PandocError" $-  liftLua (Lua.ltype idx) >>= \case-    Lua.TypeUserdata -> peekUD typePandocError idx-    _ -> do-      msg <- liftLua $ Lua.state >>= \l -> Lua.liftIO (Lua.popErrorMessage l)-      return $ PandocLuaError (UTF8.toText msg)
− src/Text/Pandoc/Lua/Marshaling/ReaderOptions.hs
@@ -1,133 +0,0 @@-{-# LANGUAGE LambdaCase           #-}-{-# LANGUAGE OverloadedStrings    #-}-{-# LANGUAGE ScopedTypeVariables  #-}-{-# OPTIONS_GHC -fno-warn-orphans #-}-{- |-   Module      : Text.Pandoc.Lua.Marshaling.ReaderOptions-   Copyright   : © 2012-2021 John MacFarlane-                 © 2017-2021 Albert Krewinkel-   License     : GNU GPL, version 2 or above--   Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>-   Stability   : alpha--Marshaling instance for ReaderOptions and its components.--}-module Text.Pandoc.Lua.Marshaling.ReaderOptions-  ( peekReaderOptions-  , pushReaderOptions-  , pushReaderOptionsReadonly-  ) where--import Data.Default (def)-import HsLua as Lua-import Text.Pandoc.Lua.Marshaling.List (pushPandocList)-import Text.Pandoc.Options (ReaderOptions (..))------- Reader Options------- | Retrieve a ReaderOptions value, either from a normal ReaderOptions--- value, from a read-only object, or from a table with the same--- keys as a ReaderOptions object.-peekReaderOptions :: LuaError e => Peeker e ReaderOptions-peekReaderOptions = retrieving "ReaderOptions" . \idx ->-  liftLua (ltype idx) >>= \case-    TypeUserdata -> choice [ peekUD typeReaderOptions-                           , peekUD typeReaderOptionsReadonly-                           ]-                           idx-    TypeTable    -> peekReaderOptionsTable idx-    _            -> failPeek =<<-                    typeMismatchMessage "ReaderOptions userdata or table" idx---- | Pushes a ReaderOptions value as userdata object.-pushReaderOptions :: LuaError e => Pusher e ReaderOptions-pushReaderOptions = pushUD typeReaderOptions---- | Pushes a ReaderOptions object, but makes it read-only.-pushReaderOptionsReadonly :: LuaError e => Pusher e ReaderOptions-pushReaderOptionsReadonly = pushUD typeReaderOptionsReadonly---- | ReaderOptions object type for read-only values.-typeReaderOptionsReadonly :: LuaError e => DocumentedType e ReaderOptions-typeReaderOptionsReadonly = deftype "ReaderOptions (read-only)"-  [ operation Tostring $ lambda-    ### liftPure show-    <#> udparam typeReaderOptions "opts" "options to print in native format"-    =#> functionResult pushString "string" "Haskell representation"-  , operation Newindex $ lambda-    ### (failLua "This ReaderOptions value is read-only.")-    =?> "Throws an error when called, i.e., an assignment is made."-  ]-  readerOptionsMembers---- | 'ReaderOptions' object type.-typeReaderOptions :: LuaError e => DocumentedType e ReaderOptions-typeReaderOptions = deftype "ReaderOptions"-  [ operation Tostring $ lambda-    ### liftPure show-    <#> udparam typeReaderOptions "opts" "options to print in native format"-    =#> functionResult pushString "string" "Haskell representation"-  ]-  readerOptionsMembers---- | Member properties of 'ReaderOptions' Lua values.-readerOptionsMembers :: LuaError e-                     => [Member e (DocumentedFunction e) ReaderOptions]-readerOptionsMembers =-  [ property "abbreviations" ""-      (pushSet pushText, readerAbbreviations)-      (peekSet peekText, \opts x -> opts{ readerAbbreviations = x })-  , property "columns" ""-      (pushIntegral, readerColumns)-      (peekIntegral, \opts x -> opts{ readerColumns = x })-  , property "default_image_extension" ""-      (pushText, readerDefaultImageExtension)-      (peekText, \opts x -> opts{ readerDefaultImageExtension = x })-  , property "extensions" ""-      (pushString . show, readerExtensions)-      (peekRead, \opts x -> opts{ readerExtensions = x })-  , property "indented_code_classes" ""-      (pushPandocList pushText, readerIndentedCodeClasses)-      (peekList peekText, \opts x -> opts{ readerIndentedCodeClasses = x })-  , property "strip_comments" ""-      (pushBool, readerStripComments)-      (peekBool, \opts x -> opts{ readerStripComments = x })-  , property "standalone" ""-      (pushBool, readerStandalone)-      (peekBool, \opts x -> opts{ readerStandalone = x })-  , property "tab_stop" ""-      (pushIntegral, readerTabStop)-      (peekIntegral, \opts x -> opts{ readerTabStop = x })-  , property "track_changes" ""-      (pushString . show, readerTrackChanges)-      (peekRead, \opts x -> opts{ readerTrackChanges = x })-  ]---- | Retrieves a 'ReaderOptions' object from a table on the stack, using--- the default values for all missing fields.------ Internally, this pushes the default reader options, sets each--- key/value pair of the table in the userdata value, then retrieves the--- object again. This will update all fields and complain about unknown--- keys.-peekReaderOptionsTable :: LuaError e => Peeker e ReaderOptions-peekReaderOptionsTable idx = retrieving "ReaderOptions (table)" $ do-  liftLua $ do-    absidx <- absindex idx-    pushUD typeReaderOptions def-    let setFields = do-          next absidx >>= \case-            False -> return () -- all fields were copied-            True -> do-              pushvalue (nth 2) *> insert (nth 2)-              settable (nth 4) -- set in userdata object-              setFields-    pushnil -- first key-    setFields-  peekUD typeReaderOptions top--instance Pushable ReaderOptions where-  push = pushReaderOptions
− src/Text/Pandoc/Lua/Marshaling/SimpleTable.hs
@@ -1,92 +0,0 @@-{-# LANGUAGE OverloadedStrings    #-}-{-# LANGUAGE ScopedTypeVariables  #-}-{- |-   Module      : Text.Pandoc.Lua.Marshaling.SimpleTable-   Copyright   : © 2020-2021 Albert Krewinkel-   License     : GNU GPL, version 2 or above-   Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>--Definition and marshaling of the 'SimpleTable' data type used as a-convenience type when dealing with tables.--}-module Text.Pandoc.Lua.Marshaling.SimpleTable-  ( SimpleTable (..)-  , peekSimpleTable-  , pushSimpleTable-  , mkSimpleTable-  )-  where--import HsLua as Lua-import Text.Pandoc.Definition-import Text.Pandoc.Lua.Marshaling.AST-import Text.Pandoc.Lua.Marshaling.List---- | A simple (legacy-style) table.-data SimpleTable = SimpleTable-  { simpleTableCaption :: [Inline]-  , simpleTableAlignments :: [Alignment]-  , simpleTableColumnWidths :: [Double]-  , simpleTableHeader :: [[Block]]-  , simpleTableBody :: [[[Block]]]-  } deriving (Eq, Show)--typeSimpleTable :: LuaError e => DocumentedType e SimpleTable-typeSimpleTable = deftype "SimpleTable"-  [ operation Eq $ lambda-    ### liftPure2 (==)-    <#> udparam typeSimpleTable "a" ""-    <#> udparam typeSimpleTable "b" ""-    =#> functionResult pushBool "boolean" "whether the two objects are equal"-  , operation Tostring $ lambda-    ### liftPure show-    <#> udparam typeSimpleTable "self" ""-    =#> functionResult pushString "string" "Haskell string representation"-  ]-  [ property "caption" "table caption"-      (pushPandocList pushInline, simpleTableCaption)-      (peekInlinesFuzzy, \t capt -> t {simpleTableCaption = capt})-  , property "aligns" "column alignments"-      (pushPandocList (pushString . show), simpleTableAlignments)-      (peekList peekRead, \t aligns -> t{simpleTableAlignments = aligns})-  , property "widths" "relative column widths"-      (pushPandocList pushRealFloat, simpleTableColumnWidths)-      (peekList peekRealFloat, \t ws -> t{simpleTableColumnWidths = ws})-  , property "headers" "table header"-      (pushRow, simpleTableHeader)-      (peekRow, \t h -> t{simpleTableHeader = h})-  , property "rows" "table body rows"-      (pushPandocList pushRow, simpleTableBody)-      (peekList peekRow, \t bs -> t{simpleTableBody = bs})--  , readonly "t" "type tag (always 'SimpleTable')"-      (pushText, const "SimpleTable")--  , alias "header" "alias for `headers`" ["headers"]-  ]- where-  pushRow = pushPandocList (pushPandocList pushBlock)--peekRow :: LuaError e => Peeker e [[Block]]-peekRow = peekList peekBlocksFuzzy---- | Push a simple table to the stack by calling the--- @pandoc.SimpleTable@ constructor.-pushSimpleTable :: forall e. LuaError e => SimpleTable -> LuaE e ()-pushSimpleTable = pushUD typeSimpleTable---- | Retrieve a simple table from the stack.-peekSimpleTable :: forall e. LuaError e => Peeker e SimpleTable-peekSimpleTable = retrieving "SimpleTable" . peekUD typeSimpleTable---- | Constructor for the 'SimpleTable' type.-mkSimpleTable :: LuaError e => DocumentedFunction e-mkSimpleTable = defun "SimpleTable"-  ### liftPure5 SimpleTable-  <#> parameter peekInlinesFuzzy "Inlines" "caption" "table caption"-  <#> parameter (peekList peekRead) "{Alignment,...}" "align" "column alignments"-  <#> parameter (peekList peekRealFloat) "{number,...}" "widths"-        "relative column widths"-  <#> parameter peekRow "{Blocks,...}" "header" "table header row"-  <#> parameter (peekList peekRow) "{{Blocks,...},...}" "body" "table body rows"-  =#> functionResult pushSimpleTable "SimpleTable" "new SimpleTable object"
src/Text/Pandoc/Lua/Module/MediaBag.hs view
@@ -2,7 +2,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Lua.Module.MediaBag-   Copyright   : Copyright © 2017-2021 Albert Krewinkel+   Copyright   : Copyright © 2017-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above    Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de> @@ -21,8 +21,8 @@ import Text.Pandoc.Class.PandocMonad (fetchItem, getMediaBag, modifyCommonState,                                       setMediaBag) import Text.Pandoc.Error (PandocError)-import Text.Pandoc.Lua.Marshaling ()-import Text.Pandoc.Lua.Marshaling.List (pushPandocList)+import Text.Pandoc.Lua.Marshal.List (pushPandocList)+import Text.Pandoc.Lua.Orphans () import Text.Pandoc.Lua.PandocLua (unPandocLua) import Text.Pandoc.MIME (MimeType) 
src/Text/Pandoc/Lua/Module/Pandoc.hs view
@@ -5,7 +5,7 @@ {-# LANGUAGE TypeApplications  #-} {- |    Module      : Text.Pandoc.Lua.Module.Pandoc-   Copyright   : Copyright © 2017-2021 Albert Krewinkel+   Copyright   : Copyright © 2017-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>@@ -19,67 +19,44 @@   ) where  import Prelude hiding (read)-import Control.Applicative ((<|>))-import Control.Monad ((<$!>), forM_, when)+import Control.Monad (forM_, when) import Control.Monad.Catch (catch, throwM)-import Control.Monad.Except (throwError) import Data.Data (Data, dataTypeConstrs, dataTypeOf, showConstr) import Data.Default (Default (..)) import Data.Maybe (fromMaybe) import Data.Proxy (Proxy (Proxy))-import Data.Text (Text)-import HsLua hiding (Div, pushModule)+import HsLua hiding (pushModule) import HsLua.Class.Peekable (PeekError) import System.Exit (ExitCode (..))-import Text.Pandoc.Class.PandocIO (runIO) import Text.Pandoc.Definition-import Text.Pandoc.Lua.Filter (SingletonsList (..), LuaFilter, peekLuaFilter,-                               walkInlines, walkInlineLists,-                               walkBlocks, walkBlockLists)-import Text.Pandoc.Lua.Marshaling ()-import Text.Pandoc.Lua.Marshaling.AST-import Text.Pandoc.Lua.Marshaling.Attr (mkAttr, mkAttributeList)-import Text.Pandoc.Lua.Marshaling.List (List (..))-import Text.Pandoc.Lua.Marshaling.ListAttributes ( mkListAttributes-                                                 , peekListAttributes)-import Text.Pandoc.Lua.Marshaling.ReaderOptions ( peekReaderOptions-                                                , pushReaderOptions)-import Text.Pandoc.Lua.Marshaling.SimpleTable (mkSimpleTable)+import Text.Pandoc.Error (PandocError (..))+import Text.Pandoc.Lua.Orphans ()+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, liftPandocLua,-                                  loadDefaultModule)-import Text.Pandoc.Options (ReaderOptions (readerExtensions))+import Text.Pandoc.Lua.PandocLua (PandocLua (unPandocLua), liftPandocLua)+import Text.Pandoc.Options ( ReaderOptions (readerExtensions)+                           , WriterOptions (writerExtensions) ) import Text.Pandoc.Process (pipeProcess) import Text.Pandoc.Readers (Reader (..), getReader)-import Text.Pandoc.Walk (Walkable)+import Text.Pandoc.Writers (Writer (..), getWriter)  import qualified HsLua as Lua import qualified Data.ByteString.Lazy as BL import qualified Data.ByteString.Lazy.Char8 as BSL import qualified Data.Text as T import qualified Text.Pandoc.Lua.Util as LuaUtil-import Text.Pandoc.Error+import qualified Text.Pandoc.UTF8 as UTF8  -- | Push the "pandoc" package to the Lua stack. Requires the `List` -- module to be loadable. pushModule :: PandocLua NumResults pushModule = do   liftPandocLua $ Lua.pushModule documentedModule-  loadDefaultModule "pandoc"-  let copyNext = do-        hasNext <- next (nth 2)-        if not hasNext-          then return ()-          else do-            pushvalue (nth 2)-            insert (nth 2)-            rawset (nth 5) -- pandoc module-            copyNext-  liftPandocLua $ do-    pushnil  -- initial key-    copyNext-    pop 1-   return 1  documentedModule :: Module PandocError@@ -97,6 +74,7 @@       , otherConstructors       , blockConstructors       , inlineConstructors+      , metaValueConstructors       ]   } @@ -132,229 +110,19 @@     rawset (nth 3)   pop 1 -- pop constructor table -inlineConstructors :: LuaError e =>  [DocumentedFunction e]-inlineConstructors =-  [ defun "Cite"-    ### liftPure2 (flip Cite)-    <#> parameter peekInlinesFuzzy "content" "Inline" "placeholder content"-    <#> parameter (peekList peekCitation) "citations" "list of Citations" ""-    =#> functionResult pushInline "Inline" "cite element"-  , defun "Code"-    ### liftPure2 (\text mattr -> Code (fromMaybe nullAttr mattr) text)-    <#> parameter peekText "code" "string" "code string"-    <#> optionalParameter peekAttr "attr" "Attr" "additional attributes"-    =#> functionResult pushInline "Inline" "code element"-  , mkInlinesConstr "Emph" Emph-  , defun "Image"-    ### liftPure4 (\caption src mtitle mattr ->-                     let attr = fromMaybe nullAttr mattr-                         title = fromMaybe mempty mtitle-                     in Image attr caption (src, title))-    <#> parameter peekInlinesFuzzy "Inlines" "caption" "image caption / alt"-    <#> parameter peekText "string" "src" "path/URL of the image file"-    <#> optionalParameter peekText "string" "title" "brief image description"-    <#> optionalParameter peekAttr "Attr" "attr" "image attributes"-    =#> functionResult pushInline "Inline" "image element"-  , defun "LineBreak"-    ### return LineBreak-    =#> functionResult pushInline "Inline" "line break"-  , defun "Link"-    ### liftPure4 (\content target mtitle mattr ->-                     let attr = fromMaybe nullAttr mattr-                         title = fromMaybe mempty mtitle-                     in Link attr content (target, title))-    <#> parameter peekInlinesFuzzy "Inlines" "content" "text for this link"-    <#> parameter peekText "string" "target" "the link target"-    <#> optionalParameter peekText "string" "title" "brief link description"-    <#> optionalParameter peekAttr "Attr" "attr" "link attributes"-    =#> functionResult pushInline "Inline" "link element"-  , defun "Math"-    ### liftPure2 Math-    <#> parameter peekMathType "quotetype" "Math" "rendering method"-    <#> parameter peekText "text" "string" "math content"-    =#> functionResult pushInline "Inline" "math element"-  , defun "Note"-    ### liftPure Note-    <#> parameter peekBlocksFuzzy "content" "Blocks" "note content"-    =#> functionResult pushInline "Inline" "note"-  , defun "Quoted"-    ### liftPure2 Quoted-    <#> parameter peekQuoteType "quotetype" "QuoteType" "type of quotes"-    <#> parameter peekInlinesFuzzy "content" "Inlines" "inlines in quotes"-    =#> functionResult pushInline "Inline" "quoted element"-  , defun "RawInline"-    ### liftPure2 RawInline-    <#> parameter peekFormat "format" "Format" "format of content"-    <#> parameter peekText "text" "string" "string content"-    =#> functionResult pushInline "Inline" "raw inline element"-  , mkInlinesConstr "SmallCaps" SmallCaps-  , defun "SoftBreak"-    ### return SoftBreak-    =#> functionResult pushInline "Inline" "soft break"-  , defun "Space"-    ### return Space-    =#> functionResult pushInline "Inline" "new space"-  , defun "Span"-    ### liftPure2 (\inlns mattr -> Span (fromMaybe nullAttr mattr) inlns)-    <#> parameter peekInlinesFuzzy "content" "Inlines" "inline content"-    <#> optionalParameter peekAttr "attr" "Attr" "additional attributes"-    =#> functionResult pushInline "Inline" "span element"-  , defun "Str"-    ### liftPure Str-    <#> parameter peekText "text" "string" ""-    =#> functionResult pushInline "Inline" "new Str object"-  , mkInlinesConstr "Strong" Strong-  , mkInlinesConstr "Strikeout" Strikeout-  , mkInlinesConstr "Subscript" Subscript-  , mkInlinesConstr "Superscript" Superscript-  , mkInlinesConstr "Underline" Underline-  ]--blockConstructors :: LuaError e => [DocumentedFunction e]-blockConstructors =-  [ defun "BlockQuote"-    ### liftPure BlockQuote-    <#> blocksParam-    =#> blockResult "BlockQuote element"--  , defun "BulletList"-    ### liftPure BulletList-    <#> blockItemsParam "list items"-    =#> blockResult "BulletList element"--  , defun "CodeBlock"-    ### liftPure2 (\code mattr -> CodeBlock (fromMaybe nullAttr mattr) code)-    <#> textParam "text" "code block content"-    <#> optAttrParam-    =#> blockResult "CodeBlock element"--  , defun "DefinitionList"-    ### liftPure DefinitionList-    <#> parameter (choice-                   [ peekList peekDefinitionItem-                   , \idx -> (:[]) <$!> peekDefinitionItem idx-                   ])-                  "{{Inlines, {Blocks,...}},...}"-                  "content" "definition items"-    =#> blockResult "DefinitionList element"--  , defun "Div"-    ### liftPure2 (\content mattr -> Div (fromMaybe nullAttr mattr) content)-    <#> blocksParam-    <#> optAttrParam-    =#> blockResult "Div element"--  , defun "Header"-    ### liftPure3 (\lvl content mattr ->-                     Header lvl (fromMaybe nullAttr mattr) content)-    <#> parameter peekIntegral "integer" "level" "heading level"-    <#> parameter peekInlinesFuzzy "Inlines" "content" "inline content"-    <#> optAttrParam-    =#> blockResult "Header element"--  , defun "HorizontalRule"-    ### return HorizontalRule-    =#> blockResult "HorizontalRule element"--  , defun "LineBlock"-    ### liftPure LineBlock-    <#> parameter (peekList peekInlinesFuzzy) "{Inlines,...}" "content" "lines"-    =#> blockResult "LineBlock element"--  , defun "Null"-    ### return Null-    =#> blockResult "Null element"--  , defun "OrderedList"-    ### liftPure2 (\items mListAttrib ->-                     let defListAttrib = (1, DefaultStyle, DefaultDelim)-                     in OrderedList (fromMaybe defListAttrib mListAttrib) items)-    <#> blockItemsParam "ordered list items"-    <#> optionalParameter peekListAttributes "ListAttributes" "listAttributes"-                          "specifier for the list's numbering"-    =#> blockResult "OrderedList element"--  , defun "Para"-    ### liftPure Para-    <#> parameter peekInlinesFuzzy "Inlines" "content" "paragraph content"-    =#> blockResult "Para element"--  , defun "Plain"-    ### liftPure Plain-    <#> parameter peekInlinesFuzzy "Inlines" "content" "paragraph content"-    =#> blockResult "Plain element"--  , defun "RawBlock"-    ### liftPure2 RawBlock-    <#> parameter peekFormat "Format" "format" "format of content"-    <#> parameter peekText "string" "text" "raw content"-    =#> blockResult "RawBlock element"--  , defun "Table"-    ### (\capt colspecs thead tbodies tfoot mattr ->-           let attr = fromMaybe nullAttr mattr-           in return $! attr `seq` capt `seq` colspecs `seq` thead `seq` tbodies-              `seq` tfoot `seq` Table attr capt colspecs thead tbodies tfoot)-    <#> parameter peekCaption "Caption" "caption" "table caption"-    <#> parameter (peekList peekColSpec) "{ColSpec,...}" "colspecs"-                  "column alignments and widths"-    <#> parameter peekTableHead "TableHead" "head" "table head"-    <#> parameter (peekList peekTableBody) "{TableBody,...}" "bodies"-                  "table bodies"-    <#> parameter peekTableFoot "TableFoot" "foot" "table foot"-    <#> optAttrParam-    =#> blockResult "Table element"-  ]- where-  blockResult = functionResult pushBlock "Block"-  blocksParam = parameter peekBlocksFuzzy "Blocks" "content" "block content"-  blockItemsParam = parameter peekItemsFuzzy "List of Blocks" "content"-  peekItemsFuzzy idx = peekList peekBlocksFuzzy idx-    <|> ((:[]) <$!> peekBlocksFuzzy idx)--textParam :: LuaError e => Text -> Text -> Parameter e Text-textParam = parameter peekText "string"--optAttrParam :: LuaError e => Parameter e (Maybe Attr)-optAttrParam = optionalParameter peekAttr "attr" "Attr" "additional attributes"--mkInlinesConstr :: LuaError e-                => Name -> ([Inline] -> Inline) -> DocumentedFunction e-mkInlinesConstr name constr = defun name-  ### liftPure (\x -> x `seq` constr x)-  <#> parameter peekInlinesFuzzy "content" "Inlines" ""-  =#> functionResult pushInline "Inline" "new object"- otherConstructors :: LuaError e => [DocumentedFunction e] otherConstructors =-  [ defun "Pandoc"-    ### liftPure2 (\blocks mMeta -> Pandoc (fromMaybe nullMeta mMeta) blocks)-    <#> parameter peekBlocksFuzzy "Blocks" "blocks" "document contents"-    <#> optionalParameter peekMeta "Meta" "meta" "document metadata"-    =#> functionResult pushPandoc "Pandoc" "new Pandoc document"--  , defun "Citation"-    ### (\cid mode mprefix msuffix mnote_num mhash ->-          cid `seq` mode `seq` mprefix `seq` msuffix `seq`-          mnote_num `seq` mhash `seq` return $! Citation-            { citationId = cid-            , citationMode = mode-            , citationPrefix = fromMaybe mempty mprefix-            , citationSuffix = fromMaybe mempty msuffix-            , citationNoteNum = fromMaybe 0 mnote_num-            , citationHash = fromMaybe 0 mhash-            })-    <#> parameter peekText "string" "cid" "citation ID (e.g. bibtex key)"-    <#> parameter peekRead "citation mode" "mode" "citation rendering mode"-    <#> optionalParameter peekInlinesFuzzy "prefix" "Inlines" ""-    <#> optionalParameter peekInlinesFuzzy "suffix" "Inlines" ""-    <#> optionalParameter peekIntegral "note_num" "integer" "note number"-    <#> optionalParameter peekIntegral "hash" "integer" "hash number"-    =#> functionResult pushCitation "Citation" "new citation object"-    #? "Creates a single citation."-+  [ mkPandoc+  , mkMeta   , mkAttr   , mkAttributeList+  , mkBlocks+  , mkCitation+  , mkCell+  , mkRow+  , mkTableHead+  , mkTableFoot+  , mkInlines   , mkListAttributes   , mkSimpleTable @@ -363,6 +131,13 @@     <#> 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]@@ -384,16 +159,6 @@         }   in map toField nullaryConstructors -walkElement :: (Walkable (SingletonsList Inline) a,-                Walkable (SingletonsList Block) a,-                Walkable (List Inline) a,-                Walkable (List Block) a)-            => a -> LuaFilter -> LuaE PandocError a-walkElement x f = walkInlines f x-              >>= walkInlineLists f-              >>= walkBlocks f-              >>= walkBlockLists f- functions :: [DocumentedFunction PandocError] functions =   [ defun "pipe"@@ -415,14 +180,16 @@   , defun "read"     ### (\content mformatspec mreaderOptions -> do             let formatSpec = fromMaybe "markdown" mformatspec-                readerOptions = fromMaybe def mreaderOptions-            res <- Lua.liftIO . runIO $ getReader formatSpec >>= \case-              (TextReader r, es) -> r readerOptions{ readerExtensions = es }-                                      content-              _ -> throwError $ PandocSomeError-                   "Only textual formats are supported"-            case res of-              Right pd -> return pd -- success, got a Pandoc document+                readerOpts = fromMaybe def mreaderOptions+                readAction = getReader formatSpec >>= \case+                  (TextReader r, es)      ->+                    r readerOpts{readerExtensions = es} (UTF8.toText content)+                  (ByteStringReader r, es) ->+                    r readerOpts{readerExtensions = es} (BSL.fromStrict content)+            try (unPandocLua readAction) >>= \case+              Right pd ->+                -- success, got a Pandoc document+                return pd               Left  (PandocUnknownReaderError f) ->                 Lua.failLua . T.unpack $ "Unknown reader: " <> f               Left  (PandocUnsupportedExtensionError e f) ->@@ -430,7 +197,7 @@                 "Extension " <> e <> " not supported for " <> f               Left e ->                 throwM e)-    <#> parameter peekText "string" "content" "text to parse"+    <#> parameter peekByteString "string" "content" "text to parse"     <#> optionalParameter peekText "string" "formatspec" "format and extensions"     <#> optionalParameter peekReaderOptions "ReaderOptions" "reader_options"           "reader options"@@ -441,15 +208,38 @@   , defun "walk_block"     ### walkElement     <#> parameter peekBlockFuzzy "Block" "block" "element to traverse"-    <#> parameter peekLuaFilter "LuaFilter" "filter" "filter functions"+    <#> parameter peekFilter "Filter" "lua_filter" "filter functions"     =#> functionResult pushBlock "Block" "modified Block"    , defun "walk_inline"     ### walkElement     <#> parameter peekInlineFuzzy "Inline" "inline" "element to traverse"-    <#> parameter peekLuaFilter "LuaFilter" "filter" "filter functions"+    <#> parameter peekFilter "Filter" "lua_filter" "filter functions"     =#> functionResult pushInline "Inline" "modified Inline"++  , defun "write"+    ### (\doc mformatspec mwriterOpts -> do+            let formatSpec = fromMaybe "html" mformatspec+                writerOpts = fromMaybe def mwriterOpts+            unPandocLua $ getWriter formatSpec >>= \case+              (TextWriter w, es)      -> Right <$>+                w writerOpts{ writerExtensions = es } doc+              (ByteStringWriter w, es) -> Left <$>+                w writerOpts{ writerExtensions = es } doc)+    <#> parameter peekPandoc "Pandoc" "doc" "document to convert"+    <#> optionalParameter peekText "string" "formatspec"+          "format and extensions"+    <#> optionalParameter peekWriterOptions "WriterOptions" "writer_options"+          "writer options"+    =#> functionResult (either pushLazyByteString pushText) "string"+          "result document"   ]+ where+  walkElement x f =+        walkInlineSplicing f x+    >>= walkInlinesStraight f+    >>= walkBlockSplicing f+    >>= walkBlocksStraight f  data PipeError = PipeError   { pipeErrorCommand :: T.Text
src/Text/Pandoc/Lua/Module/System.hs view
@@ -2,7 +2,7 @@ {-# LANGUAGE ScopedTypeVariables #-} {- |    Module      : Text.Pandoc.Lua.Module.System-   Copyright   : © 2019-2021 Albert Krewinkel+   Copyright   : © 2019-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>
+ src/Text/Pandoc/Lua/Module/Template.hs view
@@ -0,0 +1,61 @@+{-# LANGUAGE OverloadedStrings #-}+{- |+   Module      : Text.Pandoc.Lua.Module.Template+   Copyright   : Copyright © 2022 Albert Krewinkel, John MacFarlane+   License     : GNU GPL, version 2 or above+   Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>++Lua module to handle pandoc templates.+-}+module Text.Pandoc.Lua.Module.Template+  ( documentedModule+  ) where++import HsLua+import Text.Pandoc.Error (PandocError)+import Text.Pandoc.Lua.Marshal.Template (pushTemplate)+import Text.Pandoc.Lua.PandocLua (PandocLua (unPandocLua), liftPandocLua)+import Text.Pandoc.Templates+  (compileTemplate, getDefaultTemplate, runWithPartials, runWithDefaultPartials)++import qualified Data.Text as T++-- | The "pandoc.template" module.+documentedModule :: Module PandocError+documentedModule = Module+  { moduleName = "pandoc.template"+  , moduleDescription = T.unlines+    [ "Lua functions for pandoc templates."+    ]+  , moduleFields = []+  , moduleOperations = []+  , moduleFunctions = functions+  }++-- | Template module functions.+functions :: [DocumentedFunction PandocError]+functions =+  [ defun "compile"+     ### (\template mfilepath -> unPandocLua $+           case mfilepath of+             Just fp -> runWithPartials (compileTemplate fp template)+             Nothing -> runWithDefaultPartials+                        (compileTemplate "templates/default" template))+     <#> parameter peekText "string" "template" "template string"+     <#> optionalParameter peekString "string" "templ_path" "template path"+     =#> functionResult (either failLua pushTemplate) "pandoc Template"+           "compiled template"++  , defun "default"+     ### (\mformat -> unPandocLua $ do+           let getFORMAT = liftPandocLua $ do+                 getglobal "FORMAT"+                 forcePeek $ peekText top `lastly` pop 1+           format <- maybe getFORMAT pure mformat+           getDefaultTemplate format)+     <#> optionalParameter peekText "string" "writer"+           "writer for which the template should be returned."+     =#> functionResult pushText "string"+           "string representation of the writer's default template"++  ]
src/Text/Pandoc/Lua/Module/Types.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Lua.Module.Types-   Copyright   : © 2019-2021 Albert Krewinkel+   Copyright   : © 2019-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>@@ -13,31 +13,19 @@   ( documentedModule   ) where -import HsLua ( LuaE, NumResults, Peeker, Pusher, Module (..), Field (..)-             , defun, functionResult, parameter, (###), (<#>), (=#>))+import HsLua ( Module (..), (###), (<#>), (=#>)+             , defun, functionResult, parameter) import HsLua.Module.Version (peekVersionFuzzy, pushVersion) import Text.Pandoc.Error (PandocError) import Text.Pandoc.Lua.ErrorConversion ()-import Text.Pandoc.Lua.Marshaling.AST -import qualified HsLua as Lua- -- | Push the pandoc.types module on the Lua stack. documentedModule :: Module PandocError documentedModule = Module   { moduleName = "pandoc.types"   , moduleDescription =       "Constructors for types that are not part of the pandoc AST."-  , moduleFields =-    [ Field-      { fieldName = "clone"-      , fieldDescription = "DEPRECATED! Helper functions for element cloning."-      , fieldPushValue = do-          Lua.newtable-          addFunction "Meta" $ cloneWith peekMeta pushMeta-          addFunction "MetaValue" $ cloneWith peekMetaValue pushMetaValue-      }-    ]+  , moduleFields = []   , moduleFunctions =       [ defun "Version"         ### return@@ -52,15 +40,3 @@       ]   , moduleOperations = []   }- where addFunction name fn = do-         Lua.pushName name-         Lua.pushHaskellFunction fn-         Lua.rawset (Lua.nth 3)--cloneWith :: Peeker PandocError a-          -> Pusher PandocError a-          -> LuaE PandocError NumResults-cloneWith peeker pusher = do-  x <- Lua.forcePeek $ peeker (Lua.nthBottom 1)-  pusher x-  return (Lua.NumResults 1)
src/Text/Pandoc/Lua/Module/Utils.hs view
@@ -4,7 +4,7 @@ {-# LANGUAGE TypeApplications    #-} {- |    Module      : Text.Pandoc.Lua.Module.Utils-   Copyright   : Copyright © 2017-2021 Albert Krewinkel+   Copyright   : Copyright © 2017-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>@@ -21,24 +21,20 @@ import Control.Monad ((<$!>)) import Data.Data (showConstr, toConstr) import Data.Default (def)+import Data.Maybe (fromMaybe) import Data.Version (Version) import HsLua as Lua-import HsLua.Class.Peekable (PeekError) import HsLua.Module.Version (peekVersionFuzzy, pushVersion)+import Text.Pandoc.Citeproc (getReferences) import Text.Pandoc.Definition import Text.Pandoc.Error (PandocError)-import Text.Pandoc.Lua.Marshaling ()-import Text.Pandoc.Lua.Marshaling.AST-  ( peekBlock, peekInline, peekPandoc, pushBlock, pushInline, pushPandoc-  , peekAttr, peekMeta, peekMetaValue)-import Text.Pandoc.Lua.Marshaling.ListAttributes (peekListAttributes)-import Text.Pandoc.Lua.Marshaling.List (pushPandocList)-import Text.Pandoc.Lua.Marshaling.SimpleTable-  ( SimpleTable (..), peekSimpleTable, pushSimpleTable )+import Text.Pandoc.Lua.Marshal.AST+import Text.Pandoc.Lua.Marshal.Reference import Text.Pandoc.Lua.PandocLua (PandocLua (unPandocLua))  import qualified Data.Digest.Pure.SHA as SHA import qualified Data.ByteString.Lazy as BSL+import qualified Data.Map as Map import qualified Data.Text as T import qualified Text.Pandoc.Builder as B import qualified Text.Pandoc.Filter.JSON as JSONFilter@@ -62,12 +58,12 @@             "blocks" ""       <#> optionalParameter (peekList peekInline) "list of inlines"             "inline" ""-      =#> functionResult (pushPandocList pushInline) "list of inlines" ""+      =#> functionResult pushInlines "list of inlines" ""      , defun "equals"-      ### liftPure2 (==)-      <#> parameter peekAstElement "AST element" "elem1" ""-      <#> parameter peekAstElement "AST element" "elem2" ""+      ### equal+      <#> parameter pure "AST element" "elem1" ""+      <#> parameter pure "AST element" "elem2" ""       =#> functionResult pushBool "boolean" "true iff elem1 == elem2"      , defun "make_sections"@@ -77,7 +73,7 @@                     "integer or nil" "baselevel" ""       <#> parameter (peekList peekBlock) "list of blocks"             "blocks" "document blocks to process"-      =#> functionResult (pushPandocList pushBlock) "list of Blocks"+      =#> functionResult pushBlocks "list of Blocks"             "processes blocks"      , defun "normalize_date"@@ -102,6 +98,18 @@       =#> functionResult pushVersion "Version" "new Version object"       #? "Creates a Version object." +    , defun "references"+      ### (unPandocLua . getReferences Nothing)+      <#> parameter peekPandoc "Pandoc" "doc" "document"+      =#> functionResult (pushPandocList pushReference) "table"+            "lift of references"+      #? mconcat+         [ "Get references defined inline in the metadata and via an external "+         , "bibliography.  Only references that are actually cited in the "+         , "document (either with a genuine citation or with `nocite`) are "+         , "returned. URL variables are converted to links."+         ]+     , defun "run_json_filter"       ### (\doc filterPath margs -> do               args <- case margs of@@ -118,8 +126,8 @@       =#> functionResult pushPandoc "Pandoc" "filtered document"      , defun "stringify"-      ### unPandocLua . stringify-      <#> parameter peekAstElement "AST element" "elem" "some pandoc AST element"+      ### stringify+      <#> parameter pure "AST element" "elem" "some pandoc AST element"       =#> functionResult pushText "string" "stringified element"      , defun "from_simple_table"@@ -138,6 +146,17 @@       <#> parameter peekTable "Block" "tbl" "a table"       =#> functionResult pushSimpleTable "SimpleTable" "SimpleTable object"       #? "Converts a table into an old/simple table."++    , defun "type"+      ### (\idx -> getmetafield idx "__name" >>= \case+              TypeString -> fromMaybe mempty <$> tostring top+              _ -> ltype idx >>= typename)+      <#> parameter pure "any" "object" ""+      =#> functionResult pushByteString "string" "type of the given value"+    #? ("Pandoc-friendly version of Lua's default `type` function, " <>+        "returning the type of a value. If the argument has a " <>+        "string-valued metafield `__name`, then it gives that string. " <>+        "Otherwise it behaves just like the normal `type` function.")     ]   } @@ -153,53 +172,35 @@ -- | Convert pandoc structure to a string with formatting removed. -- Footnotes are skipped (since we don't want their contents in link -- labels).-stringify :: AstElement -> PandocLua T.Text-stringify el = return $ case el of-  PandocElement pd -> Shared.stringify pd-  InlineElement i  -> Shared.stringify i-  BlockElement b   -> Shared.stringify b-  MetaElement m    -> Shared.stringify m-  CitationElement c  -> Shared.stringify c-  MetaValueElement m -> stringifyMetaValue m-  _                  -> mempty--stringifyMetaValue :: MetaValue -> T.Text-stringifyMetaValue mv = case mv of-  MetaBool b   -> T.toLower $ T.pack (show b)-  MetaString s -> s-  _            -> Shared.stringify mv--data AstElement-  = PandocElement Pandoc-  | MetaElement Meta-  | BlockElement Block-  | InlineElement Inline-  | MetaValueElement MetaValue-  | AttrElement Attr-  | ListAttributesElement ListAttributes-  | CitationElement Citation-  deriving (Eq, Show)--peekAstElement :: PeekError e => Peeker e AstElement-peekAstElement = retrieving "pandoc AST element" . choice-  [ (fmap PandocElement . peekPandoc)-  , (fmap InlineElement . peekInline)-  , (fmap BlockElement . peekBlock)-  , (fmap MetaValueElement . peekMetaValue)-  , (fmap AttrElement . peekAttr)-  , (fmap ListAttributesElement . peekListAttributes)-  , (fmap MetaElement . peekMeta)-  ]+stringify :: LuaError e => StackIndex -> LuaE e T.Text+stringify idx = forcePeek . retrieving "stringifyable element" $+  choice+  [ (fmap Shared.stringify . peekPandoc)+  , (fmap Shared.stringify . peekInline)+  , (fmap Shared.stringify . peekBlock)+  , (fmap Shared.stringify . peekCitation)+  , (fmap stringifyMetaValue . peekMetaValue)+  , (fmap (const "") . peekAttr)+  , (fmap (const "") . peekListAttributes)+  ] idx+ where+  stringifyMetaValue :: MetaValue -> T.Text+  stringifyMetaValue mv = case mv of+    MetaBool b   -> T.toLower $ T.pack (show b)+    MetaString s -> s+    MetaList xs  -> mconcat $ map stringifyMetaValue xs+    MetaMap m    -> mconcat $ map (stringifyMetaValue . snd) (Map.toList m)+    _            -> Shared.stringify mv  -- | Converts an old/simple table into a normal table block element. from_simple_table :: SimpleTable -> LuaE PandocError NumResults from_simple_table (SimpleTable capt aligns widths head' body) = do   Lua.push $ Table     nullAttr-    (Caption Nothing [Plain capt])+    (Caption Nothing [Plain capt | not (null capt)])     (zipWith (\a w -> (a, toColWidth w)) aligns widths)     (TableHead nullAttr [blockListToRow head' | not (null head') ])-    [TableBody nullAttr 0 [] $ map blockListToRow body]+    [TableBody nullAttr 0 [] $ map blockListToRow body | not (null body)]     (TableFoot nullAttr [])   return (NumResults 1)   where
+ src/Text/Pandoc/Lua/Orphans.hs view
@@ -0,0 +1,116 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-# LANGUAGE FlexibleInstances    #-}+{- |+   Module      : Text.Pandoc.Lua.Orphans+   Copyright   : © 2012-2022 John MacFarlane+                 © 2017-2022 Albert Krewinkel+   License     : GNU GPL, version 2 or above++   Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>+   Stability   : alpha++Orphan instances for Lua's Pushable and Peekable type classes.+-}+module Text.Pandoc.Lua.Orphans () where++import Data.Version (Version)+import HsLua+import HsLua.Module.Version (peekVersionFuzzy)+import Text.Pandoc.Definition+import Text.Pandoc.Lua.Marshal.AST+import Text.Pandoc.Lua.Marshal.CommonState ()+import Text.Pandoc.Lua.Marshal.Context ()+import Text.Pandoc.Lua.Marshal.PandocError()+import Text.Pandoc.Lua.Marshal.ReaderOptions ()+import Text.Pandoc.Lua.Marshal.Sources (pushSources)+import Text.Pandoc.Lua.ErrorConversion ()+import Text.Pandoc.Sources (Sources)++instance Pushable Pandoc where+  push = pushPandoc++instance Pushable Meta where+  push = pushMeta++instance Pushable MetaValue where+  push = pushMetaValue++instance Pushable Block where+  push = pushBlock++instance {-# OVERLAPPING #-} Pushable [Block] where+  push = pushBlocks++instance Pushable Alignment where+  push = pushString . show++instance Pushable CitationMode where+  push = pushCitationMode++instance Pushable Format where+  push = pushFormat++instance Pushable ListNumberDelim where+  push = pushString . show++instance Pushable ListNumberStyle where+  push = pushString . show++instance Pushable MathType where+  push = pushMathType++instance Pushable QuoteType where+  push = pushQuoteType++instance Pushable Cell where+  push = pushCell++instance Peekable Cell where+  peek = forcePeek . peekCell++instance Pushable Inline where+  push = pushInline++instance {-# OVERLAPPING #-} Pushable [Inline] where+  push = pushInlines++instance Pushable Citation where+  push = pushCitation++instance Pushable Row where+  push = pushRow++instance Pushable TableBody where+  push = pushTableBody++instance Pushable TableFoot where+  push = pushTableFoot++instance Pushable TableHead where+  push = pushTableHead++-- These instances exist only for testing. It's a hack to avoid making+-- the marshalling modules public.+instance Peekable Inline where+  peek = forcePeek . peekInline++instance Peekable Block where+  peek = forcePeek . peekBlock++instance Peekable Meta where+  peek = forcePeek . peekMeta++instance Peekable Pandoc where+  peek = forcePeek . peekPandoc++instance Peekable Row where+  peek = forcePeek . peekRow++instance Peekable Version where+  peek = forcePeek . peekVersionFuzzy++instance {-# OVERLAPPING #-} Peekable Attr where+  peek = forcePeek . peekAttr++instance Pushable Sources where+  push = pushSources
src/Text/Pandoc/Lua/Packages.hs view
@@ -3,7 +3,7 @@ {-# LANGUAGE TypeApplications  #-} {- |    Module      : Text.Pandoc.Lua.Packages-   Copyright   : Copyright © 2017-2021 Albert Krewinkel+   Copyright   : Copyright © 2017-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>@@ -17,7 +17,8 @@  import Control.Monad (forM_) import Text.Pandoc.Error (PandocError)-import Text.Pandoc.Lua.PandocLua (PandocLua, liftPandocLua, loadDefaultModule)+import Text.Pandoc.Lua.Marshal.List (pushListModule)+import Text.Pandoc.Lua.PandocLua (PandocLua, liftPandocLua)  import qualified HsLua as Lua import qualified HsLua.Module.Path as Path@@ -25,6 +26,7 @@ import qualified Text.Pandoc.Lua.Module.Pandoc as Pandoc import qualified Text.Pandoc.Lua.Module.MediaBag as MediaBag import qualified Text.Pandoc.Lua.Module.System as System+import qualified Text.Pandoc.Lua.Module.Template as Template import qualified Text.Pandoc.Lua.Module.Types as Types import qualified Text.Pandoc.Lua.Module.Utils as Utils @@ -45,15 +47,16 @@ pandocPackageSearcher :: String -> PandocLua Lua.NumResults pandocPackageSearcher pkgName =   case pkgName of-    "pandoc"          -> pushWrappedHsFun $ Lua.toHaskellFunction @PandocError Pandoc.pushModule+    "pandoc"          -> pushModuleLoader Pandoc.documentedModule     "pandoc.mediabag" -> pushModuleLoader MediaBag.documentedModule     "pandoc.path"     -> pushModuleLoader Path.documentedModule     "pandoc.system"   -> pushModuleLoader System.documentedModule+    "pandoc.template" -> pushModuleLoader Template.documentedModule     "pandoc.types"    -> pushModuleLoader Types.documentedModule     "pandoc.utils"    -> pushModuleLoader Utils.documentedModule     "text"            -> pushModuleLoader Text.documentedModule     "pandoc.List"     -> pushWrappedHsFun . Lua.toHaskellFunction @PandocError $-                         loadDefaultModule pkgName+                         (Lua.NumResults 1 <$ pushListModule @PandocError)     _                 -> reportPandocSearcherFailure  where   pushModuleLoader mdl = liftPandocLua $ do
src/Text/Pandoc/Lua/PandocLua.hs view
@@ -9,7 +9,7 @@ {-# OPTIONS_GHC -fno-warn-orphans #-} {- |    Module      : Text.Pandoc.Lua.PandocLua-   Copyright   : Copyright © 2020-2021 Albert Krewinkel+   Copyright   : Copyright © 2020-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>@@ -22,20 +22,18 @@   ( PandocLua (..)   , runPandocLua   , liftPandocLua-  , loadDefaultModule   ) where  import Control.Monad.Catch (MonadCatch, MonadMask, MonadThrow) import Control.Monad.Except (MonadError (catchError, throwError)) import Control.Monad.IO.Class (MonadIO) import HsLua as Lua-import Text.Pandoc.Class.PandocMonad (PandocMonad (..), readDefaultDataFile)-import Text.Pandoc.Error (PandocError (PandocLuaError))+import Text.Pandoc.Class.PandocMonad (PandocMonad (..))+import Text.Pandoc.Error (PandocError) import Text.Pandoc.Lua.Global (Global (..), setGlobals)-import Text.Pandoc.Lua.Marshaling.CommonState (peekCommonState)+import Text.Pandoc.Lua.Marshal.CommonState (peekCommonState)  import qualified Control.Monad.Catch as Catch-import qualified Data.Text as T import qualified Text.Pandoc.Class.IO as IO  -- | Type providing access to both, pandoc and Lua operations.@@ -74,23 +72,6 @@  instance Pushable a => Exposable PandocError (PandocLua a) where   partialApply _narg x = 1 <$ (unPandocLua x >>= Lua.push)---- | Load a pure Lua module included with pandoc. Leaves the result on--- the stack and returns @NumResults 1@.------ The script is loaded from the default data directory. We do not load--- from data directories supplied via command line, as this could cause--- scripts to be executed even though they had not been passed explicitly.-loadDefaultModule :: String -> PandocLua NumResults-loadDefaultModule name = do-  script <- readDefaultDataFile (name <> ".lua")-  result <- liftPandocLua $ Lua.dostring script-  if result == Lua.OK-    then return (1 :: NumResults)-    else do-      msg <- liftPandocLua Lua.popValue-      let err = "Error while loading `" <> name <> "`.\n" <> msg-      throwError $ PandocLuaError (T.pack err)  -- | Global variables which should always be set. defaultGlobals :: PandocMonad m => m [Global]
src/Text/Pandoc/Lua/Util.hs view
@@ -1,13 +1,8 @@-{-# LANGUAGE AllowAmbiguousTypes   #-}-{-# LANGUAGE FlexibleInstances     #-}-{-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings     #-}-{-# LANGUAGE ScopedTypeVariables   #-}-{-# LANGUAGE TypeApplications      #-} {- |    Module      : Text.Pandoc.Lua.Util-   Copyright   : © 2012-2021 John MacFarlane,-                 © 2017-2021 Albert Krewinkel+   Copyright   : © 2012-2022 John MacFarlane,+                 © 2017-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>@@ -16,16 +11,20 @@ Lua utility functions. -} module Text.Pandoc.Lua.Util-  ( getTag-  , addField+  ( addField   , callWithTraceback+  , pcallWithTraceback   , dofileWithTraceback-  , pushViaConstr'+  , peekViaJSON+  , pushViaJSON   ) where -import Control.Monad (unless, when)+import Control.Monad (when) import HsLua+import HsLua.Aeson (peekValue, pushValue)+import qualified Data.Aeson as Aeson import qualified HsLua as Lua+import qualified Text.Pandoc.UTF8 as UTF8  -- | Add a value to the table at the top of the stack at a string-index. addField :: (LuaError e, Pushable a) => String -> a -> LuaE e ()@@ -34,26 +33,6 @@   Lua.push value   Lua.rawset (Lua.nth 3) --- | Get the tag of a value. This is an optimized and specialized version of--- @Lua.getfield idx "tag"@. It only checks for the field on the table at index--- @idx@ and on its metatable, also ignoring any @__index@ value on the--- metatable.-getTag :: LuaError e => Peeker e Name-getTag idx = do-  -- push metatable or just the table-  liftLua $ do-    Lua.getmetatable idx >>= \hasMT -> unless hasMT (Lua.pushvalue idx)-    Lua.pushName "tag"-    Lua.rawget (Lua.nth 2)-  Lua.peekName Lua.top `lastly` Lua.pop 2  -- table/metatable and `tag` field--pushViaConstr' :: forall e. LuaError e => Name -> [LuaE e ()] -> LuaE e ()-pushViaConstr' fnname pushArgs = do-  pushName @e ("pandoc." <> fnname)-  rawget @e registryindex-  sequence_ pushArgs-  call @e (fromIntegral (length pushArgs)) 1- -- | Like @'Lua.pcall'@, but uses a predefined error handler which adds a -- traceback on error. pcallWithTraceback :: LuaError e => NumArgs -> NumResults -> LuaE e Status@@ -86,3 +65,19 @@   case loadRes of     Lua.OK -> pcallWithTraceback 0 Lua.multret     _ -> return loadRes+++-- These will become part of hslua-aeson in future versions.++-- | Retrieves a value from the Lua stack via JSON.+peekViaJSON :: (Aeson.FromJSON a, LuaError e) => Peeker e a+peekViaJSON idx = do+  value <- peekValue idx+  case Aeson.fromJSON value of+    Aeson.Success x -> pure x+    Aeson.Error msg -> failPeek $ "failed to decode: " <>+                       UTF8.fromString msg++-- | Pushes a value to the Lua stack as a JSON-like value.+pushViaJSON :: (Aeson.ToJSON a, LuaError e) => Pusher e a+pushViaJSON = pushValue . Aeson.toJSON
− src/Text/Pandoc/Lua/Walk.hs
@@ -1,158 +0,0 @@-{-# LANGUAGE DeriveTraversable #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE MultiParamTypeClasses #-}-{- |-Module      : Text.Pandoc.Lua.Walk-Copyright   : © 2012-2021 John MacFarlane,-              © 2017-2021 Albert Krewinkel-License     : GNU GPL, version 2 or above-Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>-Stability   : alpha--Walking documents in a filter-suitable way.--}-module Text.Pandoc.Lua.Walk-  ( SingletonsList (..)-  )-where--import Control.Monad ((<=<))-import Text.Pandoc.Definition-import Text.Pandoc.Walk---- | Helper type which allows to traverse trees in order, while splicing in--- trees.------ The only interesting use of this type is via it's '@Walkable@' instance. That--- instance makes it possible to walk a Pandoc document (or a subset thereof),--- while applying a function on each element of an AST element /list/, and have--- the resulting list spliced back in place of the original element. This is the--- traversal/splicing method used for Lua filters.-newtype SingletonsList a = SingletonsList { singletonsList :: [a] }-  deriving (Functor, Foldable, Traversable)------- SingletonsList Inline----instance {-# OVERLAPPING #-} Walkable (SingletonsList Inline) [Inline] where-  walkM = walkSingletonsListM-  query = querySingletonsList--instance Walkable (SingletonsList Inline) Pandoc where-  walkM = walkPandocM-  query = queryPandoc--instance Walkable (SingletonsList Inline) Citation where-  walkM = walkCitationM-  query = queryCitation--instance Walkable (SingletonsList Inline) Inline where-  walkM = walkInlineM-  query = queryInline--instance Walkable (SingletonsList Inline) Block where-  walkM = walkBlockM-  query = queryBlock--instance Walkable (SingletonsList Inline) Row where-  walkM = walkRowM-  query = queryRow--instance Walkable (SingletonsList Inline) TableHead where-  walkM = walkTableHeadM-  query = queryTableHead--instance Walkable (SingletonsList Inline) TableBody where-  walkM = walkTableBodyM-  query = queryTableBody--instance Walkable (SingletonsList Inline) TableFoot where-  walkM = walkTableFootM-  query = queryTableFoot--instance Walkable (SingletonsList Inline) Caption where-  walkM = walkCaptionM-  query = queryCaption--instance Walkable (SingletonsList Inline) Cell where-  walkM = walkCellM-  query = queryCell--instance Walkable (SingletonsList Inline) MetaValue where-  walkM = walkMetaValueM-  query = queryMetaValue--instance Walkable (SingletonsList Inline) Meta where-  walkM f (Meta metamap) = Meta <$> walkM f metamap-  query f (Meta metamap) = query f metamap------- SingletonsList Block----instance {-# OVERLAPPING #-} Walkable (SingletonsList Block) [Block] where-  walkM = walkSingletonsListM-  query = querySingletonsList--instance Walkable (SingletonsList Block) Pandoc where-  walkM = walkPandocM-  query = queryPandoc--instance Walkable (SingletonsList Block) Citation where-  walkM = walkCitationM-  query = queryCitation--instance Walkable (SingletonsList Block) Inline where-  walkM = walkInlineM-  query = queryInline--instance Walkable (SingletonsList Block) Block where-  walkM = walkBlockM-  query = queryBlock--instance Walkable (SingletonsList Block) Row where-  walkM = walkRowM-  query = queryRow--instance Walkable (SingletonsList Block) TableHead where-  walkM = walkTableHeadM-  query = queryTableHead--instance Walkable (SingletonsList Block) TableBody where-  walkM = walkTableBodyM-  query = queryTableBody--instance Walkable (SingletonsList Block) TableFoot where-  walkM = walkTableFootM-  query = queryTableFoot--instance Walkable (SingletonsList Block) Caption where-  walkM = walkCaptionM-  query = queryCaption--instance Walkable (SingletonsList Block) Cell where-  walkM = walkCellM-  query = queryCell--instance Walkable (SingletonsList Block) MetaValue where-  walkM = walkMetaValueM-  query = queryMetaValue--instance Walkable (SingletonsList Block) Meta where-  walkM f (Meta metamap) = Meta <$> walkM f metamap-  query f (Meta metamap) = query f metamap---walkSingletonsListM :: (Monad m, Walkable (SingletonsList a) a)-                    => (SingletonsList a -> m (SingletonsList a))-                    -> [a] -> m [a]-walkSingletonsListM f =-  let f' = fmap singletonsList . f . SingletonsList . (:[]) <=< walkM f-  in fmap mconcat . mapM f'--querySingletonsList :: (Monoid c, Walkable (SingletonsList a) a)-                    => (SingletonsList a -> c)-                    -> [a] -> c-querySingletonsList f =-  let f' x = f (SingletonsList [x]) `mappend` query f x-  in mconcat . map f'
src/Text/Pandoc/MIME.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.MIME-   Copyright   : Copyright (C) 2011-2021 John MacFarlane+   Copyright   : Copyright (C) 2011-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/MediaBag.hs view
@@ -4,7 +4,7 @@ {-# LANGUAGE GeneralizedNewtypeDeriving #-} {- |    Module      : Text.Pandoc.MediaBag-   Copyright   : Copyright (C) 2014-2015, 2017-2021 John MacFarlane+   Copyright   : Copyright (C) 2014-2015, 2017-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>@@ -80,7 +80,7 @@         uri = parseURI fp         newpath = if isRelative fp                        && isNothing uri-                       && ".." `notElem` splitPath fp+                       && ".." `notElem` splitDirectories fp                      then T.unpack fp'                      else showDigest (sha1 contents) <> "." <> ext         fallback = case takeExtension fp of
src/Text/Pandoc/Network/HTTP.hs view
@@ -1,6 +1,6 @@ {- |    Module      : Text.Pandoc.Writers.Markdown.Inline-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Options.hs view
@@ -6,7 +6,7 @@ {-# LANGUAGE TemplateHaskell    #-} {- |    Module      : Text.Pandoc.Options-   Copyright   : Copyright (C) 2012-2021 John MacFarlane+   Copyright   : Copyright (C) 2012-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>@@ -369,7 +369,7 @@ defaultMathJaxURL = "https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml-full.js"  defaultKaTeXURL :: Text-defaultKaTeXURL = "https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.11.1/"+defaultKaTeXURL = "https://cdn.jsdelivr.net/npm/katex@0.15.1/dist/"  -- Update documentation in doc/filters.md if this is changed. $(deriveJSON defaultOptions{ fieldLabelModifier =
src/Text/Pandoc/PDF.hs view
@@ -5,7 +5,7 @@ {-# LANGUAGE FlexibleContexts    #-} {- |    Module      : Text.Pandoc.PDF-   Copyright   : Copyright (C) 2012-2021 John MacFarlane+   Copyright   : Copyright (C) 2012-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Parsing.hs view
@@ -8,7 +8,7 @@ {-# LANGUAGE OverloadedStrings          #-} {- |    Module      : Text.Pandoc.Parsing-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Process.hs view
@@ -1,6 +1,6 @@ {- |    Module      : Text.Pandoc.Process-   Copyright   : Copyright (C) 2013-2021 John MacFarlane+   Copyright   : Copyright (C) 2013-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Readers.hs view
@@ -4,7 +4,7 @@ {-# LANGUAGE OverloadedStrings   #-} {- |    Module      : Text.Pandoc.Readers-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Readers/BibTeX.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Readers.BibTeX-   Copyright   : Copyright (C) 2020-2021 John MacFarlane+   Copyright   : Copyright (C) 2020-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Readers/CSV.hs view
@@ -3,7 +3,7 @@ {-# LANGUAGE ScopedTypeVariables #-} {- |    Module      : Text.Pandoc.Readers.CSV-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Readers/CommonMark.hs view
@@ -3,7 +3,7 @@ {-# LANGUAGE ScopedTypeVariables #-} {- |    Module      : Text.Pandoc.Readers.CommonMark-   Copyright   : Copyright (C) 2015-2021 John MacFarlane+   Copyright   : Copyright (C) 2015-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Readers/CslJson.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Readers.CslJson-   Copyright   : Copyright (C) 2020-2021 John MacFarlane+   Copyright   : Copyright (C) 2020-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Readers/Custom.hs view
@@ -1,11 +1,8 @@-{-# LANGUAGE FlexibleContexts    #-}-{-# LANGUAGE FlexibleInstances   #-}+{-# LANGUAGE LambdaCase          #-} {-# LANGUAGE OverloadedStrings   #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TypeApplications    #-} {- |    Module      : Text.Pandoc.Readers.Custom-   Copyright   : Copyright (C) 2021 John MacFarlane+   Copyright   : Copyright (C) 2021-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>@@ -17,22 +14,24 @@ module Text.Pandoc.Readers.Custom ( readCustom ) where import Control.Exception import Control.Monad (when)-import Data.Text (Text) import HsLua as Lua hiding (Operation (Div), render)-import HsLua.Class.Peekable (PeekError) import Control.Monad.IO.Class (MonadIO) import Text.Pandoc.Definition+import Text.Pandoc.Class (PandocMonad, report)+import Text.Pandoc.Logging import Text.Pandoc.Lua (Global (..), runLua, setGlobals)-import Text.Pandoc.Lua.Util (dofileWithTraceback)+import Text.Pandoc.Lua.PandocLua+import Text.Pandoc.Lua.Marshal.Pandoc (peekPandoc)+import Text.Pandoc.Lua.Util (dofileWithTraceback, callWithTraceback,+                             pcallWithTraceback) import Text.Pandoc.Options-import Text.Pandoc.Class (PandocMonad) import Text.Pandoc.Sources (ToSources(..), sourcesToText)+import qualified Data.Text as T  -- | Convert custom markup to Pandoc. readCustom :: (PandocMonad m, MonadIO m, ToSources s)             => FilePath -> ReaderOptions -> s -> m Pandoc-readCustom luaFile opts sources = do-  let input = sourcesToText $ toSources sources+readCustom luaFile opts srcs = do   let globals = [ PANDOC_SCRIPT_FILE luaFile ]   res <- runLua $ do     setGlobals globals@@ -41,14 +40,44 @@     -- to handle this more gracefully):     when (stat /= Lua.OK)       Lua.throwErrorAsException-    parseCustom input opts+    parseCustom   case res of     Left msg -> throw msg     Right doc -> return doc--parseCustom :: forall e. PeekError e-            => Text-            -> ReaderOptions-            -> LuaE e Pandoc-parseCustom = invoke @e "Reader"-+ where+  parseCustom = do+    let input = toSources srcs+    getglobal "Reader"+    push input+    push opts+    pcallWithTraceback 2 1 >>= \case+      OK -> forcePeek $ peekPandoc top+      ErrRun -> do+        -- Caught a runtime error. Check if parsing might work if we+        -- pass a string instead of a Sources list, then retry.+        runPeek (peekText top) >>= \case+          Failure {} ->+            -- not a string error object. Bail!+            throwErrorAsException+          Success errmsg -> do+            if "string expected, got pandoc Sources" `T.isInfixOf` errmsg+              then do+                pop 1+                _ <- unPandocLua $ do+                  report $ Deprecated "old Reader function signature" $+                    T.unlines+                    [ "Reader functions should accept a sources list; "+                    , "functions expecting `string` input are deprecated. "+                    , "Use `tostring` to convert the first argument to a "+                    , "string."+                    ]+                getglobal "Reader"+                push $ sourcesToText input  -- push sources as string+                push opts+                callWithTraceback 2 1+                forcePeek $ peekPandoc top+              else+                -- nothing we can do here+                throwErrorAsException+      _ ->  -- not a runtime error, we won't be able to recover from that+        throwErrorAsException
src/Text/Pandoc/Readers/DocBook.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Readers.DocBook-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>@@ -843,7 +843,7 @@         "answer" -> addToStart (strong (str "A:") <> str " ") <$> getBlocks e         "abstract" -> blockQuote <$> getBlocks e         "calloutlist" -> bulletList <$> callouts-        "itemizedlist" -> bulletList <$> listitems+        "itemizedlist" -> bulletList . handleCompact <$> listitems         "orderedlist" -> do           let listStyle = case attrValue "numeration" e of                                "arabic"     -> Decimal@@ -855,7 +855,7 @@           let start = fromMaybe 1 $                       filterElement (named "listitem") e                        >>= safeRead . attrValue "override"-          orderedListWith (start,listStyle,DefaultDelim)+          orderedListWith (start,listStyle,DefaultDelim) . handleCompact             <$> listitems         "variablelist" -> definitionList <$> deflistitems         "procedure" -> bulletList <$> steps@@ -903,6 +903,14 @@            lift $ report $ IgnoredElement name            return mempty +         compactSpacing = case attrValue "spacing" e of+                            "compact" -> True+                            _         -> False++         handleCompact = if compactSpacing+                            then map (fmap paraToPlain)+                            else id+          codeBlockWithLang = do            let classes' = case attrValue "language" e of                                 "" -> []@@ -1007,13 +1015,12 @@            b <- getBlocks e            modify $ \st -> st{ dbSectionLevel = n - 1 }            return $ headerWith (elId, classes, maybeToList titleabbrevElAsAttr++attrs) n' headerText <> b-         titleabbrevElAsAttr = do-           txt <- case filterChild (named "titleabbrev") e `mplus`-                            (filterChild (named "info") e >>=-                                filterChild (named "titleabbrev")) of-                            Just t  -> Just ("titleabbrev", strContentRecursive t)-                            Nothing -> Nothing-           return txt+         titleabbrevElAsAttr =+           case filterChild (named "titleabbrev") e `mplus`+                (filterChild (named "info") e >>=+                 filterChild (named "titleabbrev")) of+             Just t  -> Just ("titleabbrev", strContentRecursive t)+             Nothing -> Nothing          lineItems = mapM getInlines $ filterChildren (named "line") e          -- | Admonitions are parsed into a div. Following other Docbook tools that output HTML,          -- we parse the optional title as a div with the @title@ class, and give the@@ -1234,7 +1241,9 @@            let classes' = case attrValue "language" e of                                "" -> []                                l  -> [l]-           return $ codeWith (attrValue "id" e,classes',[]) $ strContentRecursive e+           return $ codeWith (attrValue "id" e,classes',[]) $+             T.unwords $ T.words $ strContentRecursive e+             -- collapse internal spaces/newlines, see #7821          simpleList = mconcat . intersperse (str "," <> space) <$> mapM getInlines                          (filterChildren (named "member") e)          segmentedList = do@@ -1321,3 +1330,8 @@ -- | Set the prefix of a name to 'Nothing' removePrefix :: QName -> QName removePrefix elname = elname { qPrefix = Nothing }++paraToPlain :: Block -> Block+paraToPlain (Para ils) = Plain ils+paraToPlain x = x+
src/Text/Pandoc/Readers/Docx.hs view
@@ -450,7 +450,6 @@     HyperlinkField url -> parPartToInlines' $ ExternalHyperLink url children     PagerefField fieldAnchor True -> parPartToInlines' $ InternalHyperLink fieldAnchor children     _ -> smushInlines <$> mapM parPartToInlines' children-parPartToInlines' NullParPart = return mempty  isAnchorSpan :: Inline -> Bool isAnchorSpan (Span (_, ["anchor"], []) _) = True@@ -527,7 +526,7 @@  -- like trimInlines, but also take out linebreaks trimSps :: Inlines -> Inlines-trimSps (Many ils) = Many $ Seq.dropWhileL isSp $Seq.dropWhileR isSp ils+trimSps (Many ils) = Many $ Seq.dropWhileL isSp $ Seq.dropWhileR isSp ils   where isSp Space     = True         isSp SoftBreak = True         isSp LineBreak = True
src/Text/Pandoc/Readers/Docx/Combine.hs view
@@ -2,7 +2,7 @@ {- |    Module      : Text.Pandoc.Readers.Docx.Combine    Copyright   : © 2014-2020 Jesse Rosenthal <jrosenthal@jhu.edu>,-                   2014-2021 John MacFarlane <jgm@berkeley.edu>,+                   2014-2022 John MacFarlane <jgm@berkeley.edu>,                    2020 Nikolay Yakimov <root@livid.pp.ru>    License     : GNU GPL, version 2 or above 
src/Text/Pandoc/Readers/Docx/Lists.hs view
@@ -153,7 +153,7 @@ blocksToBullets :: [Block] -> [Block] blocksToBullets blks =   map singleItemHeaderToHeader $-  bottomUp removeListDivs $flatToBullets (handleListParagraphs blks)+  bottomUp removeListDivs $ flatToBullets (handleListParagraphs blks)  plainParaInlines :: Block -> [Inline] plainParaInlines (Plain ils) = ils
src/Text/Pandoc/Readers/Docx/Parse.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE ViewPatterns      #-}+{-# LANGUAGE LambdaCase        #-} {-# LANGUAGE OverloadedStrings #-} {- |  Module : Text.Pandoc.Readers.Docx.Parse@@ -78,6 +79,19 @@ import Text.TeXMath.Readers.OMML (readOMML) import Text.TeXMath.Unicode.Fonts (Font (..), getUnicode, textToFont) import Text.Pandoc.XML.Light+    ( filterChild,+      findElement,+      strContent,+      showElement,+      findAttr,+      filterChildrenName,+      filterElementName,+      parseXMLElement,+      elChildren,+      QName(QName, qName),+      Content(Elem),+      Element(elContent, elName),+      findElements )  data ReaderEnv = ReaderEnv { envNotes         :: Notes                            , envComments      :: Comments@@ -320,8 +334,6 @@              | Diagram                                            -- placeholder for now              | PlainOMath [Exp]              | Field FieldInfo [ParPart]-             | NullParPart      -- when we need to return nothing, but-                                -- not because of an error.              deriving Show  data Run = Run RunStyle [RunElem]@@ -505,7 +517,7 @@  filePathIsMedia :: FilePath -> Bool filePathIsMedia fp =-  "media" `elem` splitPath (takeDirectory fp)+  "media" `elem` splitDirectories (takeDirectory fp)  lookupLevel :: T.Text -> T.Text -> Numbering -> Maybe Level lookupLevel numId ilvl (Numbering _ numbs absNumbs) = do@@ -694,13 +706,13 @@   | isElem ns "w" "p" element   , Just (numId, lvl) <- getNumInfo ns element = do     parstyle <- elemToParagraphStyle ns element <$> asks envParStyles-    parparts <- mapD (elemToParPart ns) (elChildren element)+    parparts <- mconcat <$> mapD (elemToParPart ns) (elChildren element)     levelInfo <- lookupLevel numId lvl <$> asks envNumbering     return $ ListItem parstyle numId lvl levelInfo parparts elemToBodyPart ns element   | isElem ns "w" "p" element = do       parstyle <- elemToParagraphStyle ns element <$> asks envParStyles-      parparts' <- mapD (elemToParPart ns) (elChildren element)+      parparts' <- mconcat <$> mapD (elemToParPart ns) (elChildren element)       fldCharState <- gets stateFldCharState       modify $ \st -> st {stateFldCharState = emptyFldCharContents fldCharState}       -- Word uses list enumeration for numbered headings, so we only@@ -792,7 +804,7 @@       alt = fromMaybe "" (mbDocPr >>= findAttrByName ns "" "descr")   in (title, alt) -elemToParPart :: NameSpaces -> Element -> D ParPart+elemToParPart :: NameSpaces -> Element -> D [ParPart] {- The next one is a bit complicated. fldChar fields work by first having a <w:fldChar fldCharType="begin"> in a run, then a run with@@ -840,21 +852,21 @@       case fldCharState of         _ | fldCharType == "begin" -> do           modify $ \st -> st {stateFldCharState = FldCharOpen : fldCharState}-          return NullParPart+          return []         FldCharFieldInfo info : ancestors | fldCharType == "separate" -> do           modify $ \st -> st {stateFldCharState = FldCharContent info [] : ancestors}-          return NullParPart+          return []         -- Some fields have no content, since Pandoc doesn't understand any of those fields, we can just close it.         FldCharFieldInfo _ : ancestors | fldCharType == "end" -> do           modify $ \st -> st {stateFldCharState = ancestors}-          return NullParPart+          return []         [FldCharContent info children] | fldCharType == "end" -> do           modify $ \st -> st {stateFldCharState = []}-          return $ Field info $ reverse children+          return [Field info $ reverse children]         FldCharContent info children : FldCharContent parentInfo siblings : ancestors | fldCharType == "end" ->           let parent = FldCharContent parentInfo $ (Field info (reverse children)) : siblings in do             modify $ \st -> st {stateFldCharState = parent : ancestors}-            return NullParPart+            return []         _ -> throwError WrongElem elemToParPart ns element   | isElem ns "w" "r" element@@ -864,8 +876,8 @@         FldCharOpen : ancestors -> do           info <- eitherToD $ parseFieldInfo $ strContent instrText           modify $ \st -> st {stateFldCharState = FldCharFieldInfo info : ancestors}-          return NullParPart-        _ -> return NullParPart+          return []+        _ -> return [] {- There is an open fldchar, so we calculate the element and add it to the children. For this we need to first change the fldchar state to an empty@@ -878,25 +890,29 @@   case fldCharState of     FldCharContent info children : ancestors -> do       modify $ \st -> st {stateFldCharState = []}-      parPart <- elemToParPart' ns element `catchError` \_ -> return NullParPart-      modify $ \st -> st{stateFldCharState = FldCharContent info (parPart : children) : ancestors}-      return NullParPart+      parParts <- elemToParPart' ns element `catchError` \_ -> return []+      modify $ \st -> st{stateFldCharState = FldCharContent info (parParts ++ children) : ancestors}+      return []     _ -> elemToParPart' ns element -elemToParPart' :: NameSpaces -> Element -> D ParPart+elemToParPart' :: NameSpaces -> Element -> D [ParPart] elemToParPart' ns element   | isElem ns "w" "r" element   , Just drawingElem <- findChildByName ns "w" "drawing" element   , pic_ns <- "http://schemas.openxmlformats.org/drawingml/2006/picture"-  , Just picElem <- findElement (QName "pic" (Just pic_ns) (Just "pic")) drawingElem+  , picElems <- findElements (QName "pic" (Just pic_ns) (Just "pic")) drawingElem   = let (title, alt) = getTitleAndAlt ns drawingElem         a_ns = "http://schemas.openxmlformats.org/drawingml/2006/main"-        drawing = findElement (QName "blip" (Just a_ns) (Just "a")) picElem-                  >>= findAttrByName ns "r" "embed"-    in-     case drawing of-       Just s -> expandDrawingId s >>= (\(fp, bs) -> return $ Drawing fp title alt bs $ elemToExtent drawingElem)-       Nothing -> throwError WrongElem+        drawings = map (\el ->+                        ((findElement (QName "blip" (Just a_ns) (Just "a")) el+                          >>= findAttrByName ns "r" "embed"), el)) picElems+    in mapM (\case+                (Just s, el) -> do+                  (fp, bs) <- expandDrawingId s+                  let extent = elemToExtent el <|> elemToExtent element+                  return $ Drawing fp title alt bs extent+                (Nothing, _) -> throwError WrongElem)+            drawings -- The two cases below are an attempt to deal with images in deprecated vml format. -- Todo: check out title and attr for deprecated format. elemToParPart' ns element@@ -906,7 +922,7 @@                   >>= findAttrByName ns "r" "id"     in      case drawing of-       Just s -> expandDrawingId s >>= (\(fp, bs) -> return $ Drawing fp "" "" bs Nothing)+       Just s -> expandDrawingId s >>= (\(fp, bs) -> return [Drawing fp "" "" bs Nothing])        Nothing -> throwError WrongElem elemToParPart' ns element   | isElem ns "w" "r" element@@ -914,51 +930,52 @@   , Just shapeElem <- findChildByName ns "v" "shape" objectElem   , Just imagedataElem <- findChildByName ns "v" "imagedata" shapeElem   , Just drawingId <- findAttrByName ns "r" "id" imagedataElem-  = expandDrawingId drawingId >>= (\(fp, bs) -> return $ Drawing fp "" "" bs Nothing)+  = expandDrawingId drawingId >>= (\(fp, bs) -> return [Drawing fp "" "" bs Nothing]) -- Diagram elemToParPart' ns element   | isElem ns "w" "r" element   , Just drawingElem <- findChildByName ns "w" "drawing" element   , d_ns <- "http://schemas.openxmlformats.org/drawingml/2006/diagram"   , Just _ <- findElement (QName "relIds" (Just d_ns) (Just "dgm")) drawingElem-  = return Diagram+  = return [Diagram] -- Chart elemToParPart' ns element   | isElem ns "w" "r" element   , Just drawingElem <- findChildByName ns "w" "drawing" element   , c_ns <- "http://schemas.openxmlformats.org/drawingml/2006/chart"   , Just _ <- findElement (QName "chart" (Just c_ns) (Just "c")) drawingElem-  = return Chart+  = return [Chart] elemToParPart' ns element   | isElem ns "w" "r" element = do-    run <- elemToRun ns element-    return $ PlainRun run+    runs <- elemToRun ns element+    return $ map PlainRun runs elemToParPart' ns element   | Just change <- getTrackedChange ns element = do-      runs <- mapD (elemToRun ns) (elChildren element)-      return $ ChangedRuns change runs+      runs <- mconcat <$> mapD (elemToRun ns) (elChildren element)+      return [ChangedRuns change runs] elemToParPart' ns element   | isElem ns "w" "bookmarkStart" element   , Just bmId <- findAttrByName ns "w" "id" element   , Just bmName <- findAttrByName ns "w" "name" element =-    return $ BookMark bmId bmName+    return [BookMark bmId bmName] elemToParPart' ns element   | isElem ns "w" "hyperlink" element   , Just relId <- findAttrByName ns "r" "id" element = do     location <- asks envLocation-    children <- mapD (elemToParPart ns) (elChildren element)+    children <- mconcat <$> mapD (elemToParPart ns) (elChildren element)     rels <- asks envRelationships     case lookupRelationship location relId rels of       Just target ->          case findAttrByName ns "w" "anchor" element of-             Just anchor -> return $ ExternalHyperLink (target <> "#" <> anchor) children-             Nothing -> return $ ExternalHyperLink target children-      Nothing     -> return $ ExternalHyperLink "" children+             Just anchor -> return+               [ExternalHyperLink (target <> "#" <> anchor) children]+             Nothing -> return [ExternalHyperLink target children]+      Nothing     -> return [ExternalHyperLink "" children] elemToParPart' ns element   | isElem ns "w" "hyperlink" element   , Just anchor <- findAttrByName ns "w" "anchor" element = do-    children <- mapD (elemToParPart ns) (elChildren element)-    return $ InternalHyperLink anchor children+    children <- mconcat <$> mapD (elemToParPart ns) (elChildren element)+    return [InternalHyperLink anchor children] elemToParPart' ns element   | isElem ns "w" "commentRangeStart" element   , Just cmtId <- findAttrByName ns "w" "id" element = do@@ -969,20 +986,20 @@ elemToParPart' ns element   | isElem ns "w" "commentRangeEnd" element   , Just cmtId <- findAttrByName ns "w" "id" element =-    return $ CommentEnd cmtId+    return [CommentEnd cmtId] elemToParPart' ns element   | isElem ns "m" "oMath" element =-    fmap PlainOMath (eitherToD $ readOMML $ showElement element)+    fmap (return . PlainOMath) (eitherToD $ readOMML $ showElement element) elemToParPart' _ _ = throwError WrongElem -elemToCommentStart :: NameSpaces -> Element -> D ParPart+elemToCommentStart :: NameSpaces -> Element -> D [ParPart] elemToCommentStart ns element   | isElem ns "w" "comment" element   , Just cmtId <- findAttrByName ns "w" "id" element   , Just cmtAuthor <- findAttrByName ns "w" "author" element   , cmtDate <- findAttrByName ns "w" "date" element = do       bps <- mapD (elemToBodyPart ns) (elChildren element)-      return $ CommentStart cmtId cmtAuthor cmtDate bps+      return [CommentStart cmtId cmtAuthor cmtDate bps] elemToCommentStart _ _ = throwError WrongElem  lookupFootnote :: T.Text -> Notes -> Maybe Element@@ -992,59 +1009,61 @@ lookupEndnote s (Notes _ _ ens) = ens >>= M.lookup s  elemToExtent :: Element -> Extent-elemToExtent drawingElem =+elemToExtent el =   case (getDim "cx", getDim "cy") of     (Just w, Just h) -> Just (w, h)     _                -> Nothing-    where-      wp_ns  = "http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"-      getDim at = findElement (QName "extent" (Just wp_ns) (Just "wp")) drawingElem-                    >>= findAttr (QName at Nothing Nothing) >>= safeRead+ where+  getDim at = filterElementName (\n -> qName n `elem` ["extent", "ext"]) el+              >>= findAttr (QName at Nothing Nothing) >>= safeRead  -childElemToRun :: NameSpaces -> Element -> D Run+childElemToRun :: NameSpaces -> Element -> D [Run] childElemToRun ns element   | isElem ns "w" "drawing" element   , pic_ns <- "http://schemas.openxmlformats.org/drawingml/2006/picture"-  , Just picElem <- findElement (QName "pic" (Just pic_ns) (Just "pic")) element+  , picElems <- findElements (QName "pic" (Just pic_ns) (Just "pic")) element   = let (title, alt) = getTitleAndAlt ns element         a_ns = "http://schemas.openxmlformats.org/drawingml/2006/main"-        drawing = findElement (QName "blip" (Just a_ns) (Just "a")) picElem-                  >>= findAttr (QName "embed" (M.lookup "r" ns) (Just "r"))-    in-     case drawing of-       Just s -> expandDrawingId s >>=-                 (\(fp, bs) -> return $ InlineDrawing fp title alt bs $ elemToExtent element)-       Nothing -> throwError WrongElem+        drawings = map (\el ->+                         ((findElement (QName "blip" (Just a_ns) (Just "a")) el+                             >>= findAttrByName ns "r" "embed"), el)) picElems+    in mapM (\case+                (Just s, el) -> do+                  (fp, bs) <- expandDrawingId s+                  let extent = elemToExtent el <|> elemToExtent element+                  return $ InlineDrawing fp title alt bs extent+                (Nothing, _) -> throwError WrongElem)+       drawings childElemToRun ns element   | isElem ns "w" "drawing" element   , c_ns <- "http://schemas.openxmlformats.org/drawingml/2006/chart"   , Just _ <- findElement (QName "chart" (Just c_ns) (Just "c")) element-  = return InlineChart+  = return [InlineChart] childElemToRun ns element   | isElem ns "w" "drawing" element   , c_ns <- "http://schemas.openxmlformats.org/drawingml/2006/diagram"   , Just _ <- findElement (QName "relIds" (Just c_ns) (Just "dgm")) element-  = return InlineDiagram+  = return [InlineDiagram] childElemToRun ns element   | isElem ns "w" "footnoteReference" element   , Just fnId <- findAttrByName ns "w" "id" element = do     notes <- asks envNotes     case lookupFootnote fnId notes of       Just e -> do bps <- local (\r -> r {envLocation=InFootnote}) $ mapD (elemToBodyPart ns) (elChildren e)-                   return $ Footnote bps-      Nothing  -> return $ Footnote []+                   return [Footnote bps]+      Nothing  -> return [Footnote []] childElemToRun ns element   | isElem ns "w" "endnoteReference" element   , Just enId <- findAttrByName ns "w" "id" element = do     notes <- asks envNotes     case lookupEndnote enId notes of       Just e -> do bps <- local (\r -> r {envLocation=InEndnote}) $ mapD (elemToBodyPart ns) (elChildren e)-                   return $ Endnote bps-      Nothing  -> return $ Endnote []+                   return [Endnote bps]+      Nothing  -> return [Endnote []] childElemToRun _ _ = throwError WrongElem -elemToRun :: NameSpaces -> Element -> D Run+elemToRun :: NameSpaces -> Element -> D [Run] elemToRun ns element   | isElem ns "w" "r" element   , Just altCont <- findChildByName ns "mc" "AlternateContent" element =@@ -1070,7 +1089,7 @@   | isElem ns "w" "r" element = do     runElems <- elemToRunElems ns element     runStyle <- elemToRunStyleD ns element-    return $ Run runStyle runElems+    return [Run runStyle runElems] elemToRun _ _ = throwError WrongElem  getParentStyleValue :: (ParStyle -> Maybe a) -> ParStyle -> Maybe a
src/Text/Pandoc/Readers/Docx/Util.hs view
@@ -2,7 +2,7 @@ {- |    Module      : Text.Pandoc.Readers.Docx.StyleMaps    Copyright   : © 2014-2020 Jesse Rosenthal <jrosenthal@jhu.edu>,-                   2014-2021 John MacFarlane <jgm@berkeley.edu>,+                   2014-2022 John MacFarlane <jgm@berkeley.edu>,                    2015 Nikolay Yakimov <root@livid.pp.ru>    License     : GNU GPL, version 2 or above 
src/Text/Pandoc/Readers/HTML.hs view
@@ -5,7 +5,7 @@ {-# LANGUAGE ViewPatterns          #-} {- |    Module      : Text.Pandoc.Readers.HTML-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>@@ -643,7 +643,7 @@   case lookup "cite" attrs of     Just url -> do       let uid = fromMaybe mempty $-                   lookup "name" attrs <> lookup "id" attrs+                   lookup "name" attrs <|> lookup "id" attrs       let cls = maybe [] T.words $ lookup "class" attrs       url' <- canonicalizeUrl url       makeQuote $ B.spanWith (uid, cls, [("cite", escapeURI url')])@@ -705,20 +705,18 @@  pLink :: PandocMonad m => TagParser m Inlines pLink = try $ do-  tag <- pSatisfy $ tagOpenLit "a" (const True)+  tag@(TagOpen _ attr') <- pSatisfy $ tagOpenLit "a" (const True)   let title = fromAttrib "title" tag-  -- take id from id attribute if present, otherwise name-  let uid = fromMaybe (fromAttrib "name" tag) $-               maybeFromAttrib "id" tag-  let cls = T.words $ fromAttrib "class" tag+  let attr = toAttr $ filter (\(k,_) -> k /= "title" && k /= "href") attr'   lab <- mconcat <$> manyTill inline (pCloses "a")   -- check for href; if href, then a link, otherwise a span   case maybeFromAttrib "href" tag of        Nothing   ->-         return $ extractSpaces (B.spanWith (uid, cls, [])) lab+         return $ extractSpaces (B.spanWith attr) lab        Just url' -> do          url <- canonicalizeUrl url'-         return $ extractSpaces (B.linkWith (uid, cls, []) (escapeURI url) title) lab+         return $ extractSpaces+                   (B.linkWith attr (escapeURI url) title) lab  pImage :: PandocMonad m => TagParser m Inlines pImage = do
src/Text/Pandoc/Readers/HTML/Parsing.hs view
@@ -2,7 +2,7 @@ {-# LANGUAGE OverloadedStrings     #-} {- |    Module      : Text.Pandoc.Readers.HTML.Parsing-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>@@ -30,7 +30,7 @@   ) where -import Control.Monad (void, mzero)+import Control.Monad (void, mzero, mplus) import Data.Maybe (fromMaybe) import Data.Text (Text) import Text.HTML.TagSoup@@ -220,9 +220,10 @@  mkAttr :: [(Text, Text)] -> Attr mkAttr attr = (attribsId, attribsClasses, attribsKV)-  where attribsId = fromMaybe "" $ lookup "id" attr+  where attribsId = fromMaybe "" $ lookup "id" attr `mplus` lookup "name" attr         attribsClasses = T.words (fromMaybe "" $ lookup "class" attr) <> epubTypes-        attribsKV = filter (\(k,_) -> k /= "class" && k /= "id") attr+        attribsKV = filter (\(k,_) -> k /= "class" && k /= "id" && k /= "name")+                           attr         epubTypes = T.words $ fromMaybe "" $ lookup "epub:type" attr  toAttr :: [(Text, Text)] -> Attr
src/Text/Pandoc/Readers/HTML/Table.hs view
@@ -3,8 +3,8 @@ {-# LANGUAGE ViewPatterns      #-} {- |    Module      : Text.Pandoc.Readers.HTML.Table-   Copyright   : © 2006-2021 John MacFarlane,-                   2020-2021 Albert Krewinkel+   Copyright   : © 2006-2022 John MacFarlane,+                   2020-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <albert@zeitkraut.de>
src/Text/Pandoc/Readers/HTML/TagCategories.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings     #-} {- |    Module      : Text.Pandoc.Readers.HTML.TagCategories-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Readers/HTML/Types.hs view
@@ -2,7 +2,7 @@ {-# LANGUAGE MultiParamTypeClasses #-} {- |    Module      : Text.Pandoc.Readers.HTML.Types-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Readers/Ipynb.hs view
@@ -4,7 +4,7 @@ {-# LANGUAGE ScopedTypeVariables #-} {- |    Module      : Text.Pandoc.Readers.Ipynb-   Copyright   : Copyright (C) 2019-2021 John MacFarlane+   Copyright   : Copyright (C) 2019-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>@@ -77,7 +77,10 @@   let Source ts = cellSource c   let source = mconcat ts   let kvs = jsonMetaToPairs (cellMetadata c)-  let attachments = maybe mempty M.toList $ cellAttachments c+  let attachments = case cellAttachments c of+                      Nothing -> mempty+                      Just (MimeAttachments m) -> M.toList m+  let ident = fromMaybe mempty $ cellId c   mapM_ addAttachment attachments   case cellType c of     Ipynb.Markdown -> do@@ -86,12 +89,12 @@                else do                  Pandoc _ bs <- walk fixImage <$> readMarkdown opts source                  return bs-      return $ B.divWith ("",["cell","markdown"],kvs)+      return $ B.divWith (ident,["cell","markdown"],kvs)              $ B.fromList bs     Ipynb.Heading lev -> do       Pandoc _ bs <- readMarkdown opts         (T.replicate lev "#" <> " " <> source)-      return $ B.divWith ("",["cell","markdown"],kvs)+      return $ B.divWith (ident,["cell","markdown"],kvs)              $ B.fromList bs     Ipynb.Raw -> do       -- we use ipynb to indicate no format given (a wildcard in nbformat)@@ -108,11 +111,12 @@               "text/restructuredtext" -> "rst"               "text/asciidoc"         -> "asciidoc"               _                       -> format-      return $ B.divWith ("",["cell","raw"],kvs) $ B.rawBlock format' source+      return $ B.divWith (ident,["cell","raw"],kvs)+             $ B.rawBlock format' source     Ipynb.Code{ codeOutputs = outputs, codeExecutionCount = ec } -> do       outputBlocks <- mconcat <$> mapM outputToBlock outputs       let kvs' = maybe kvs (\x -> ("execution_count", tshow x):kvs) ec-      return $ B.divWith ("",["cell","code"],kvs') $+      return $ B.divWith (ident,["cell","code"],kvs') $         B.codeBlockWith ("",[lang],[]) source         <> outputBlocks @@ -161,7 +165,7 @@ -- the output format. handleData :: PandocMonad m            => JSONMeta -> MimeBundle -> m B.Blocks-handleData metadata (MimeBundle mb) =+handleData (JSONMeta metadata) (MimeBundle mb) =   mconcat <$> mapM dataBlock (M.toList mb)    where@@ -209,7 +213,7 @@     dataBlock _ = return mempty  jsonMetaToMeta :: JSONMeta -> M.Map Text MetaValue-jsonMetaToMeta = M.map valueToMetaValue+jsonMetaToMeta (JSONMeta m) = M.map valueToMetaValue m   where     valueToMetaValue :: Value -> MetaValue     valueToMetaValue x@Object{} =@@ -228,11 +232,11 @@     valueToMetaValue Aeson.Null = MetaString ""  jsonMetaToPairs :: JSONMeta -> [(Text, Text)]-jsonMetaToPairs = M.toList . M.map+jsonMetaToPairs (JSONMeta m) = M.toList . M.map   (\case       String t         | not (T.all isDigit t)         , t /= "true"         , t /= "false"                  -> t-      x          -> T.pack $ UTF8.toStringLazy $ Aeson.encode x)+      x          -> T.pack $ UTF8.toStringLazy $ Aeson.encode x) $ m
src/Text/Pandoc/Readers/Jira.hs view
@@ -2,7 +2,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Readers.Org-   Copyright   : © 2019-2021 Albert Krewinkel+   Copyright   : © 2019-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>
src/Text/Pandoc/Readers/LaTeX.hs view
@@ -4,7 +4,7 @@ {-# LANGUAGE ViewPatterns          #-} {- |    Module      : Text.Pandoc.Readers.LaTeX-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>@@ -1101,7 +1101,8 @@           case sCaption st of             Nothing -> return p             Just figureCaption -> do-              let attr' = case sLastLabel st of+              let mblabel = sLastLabel st+              let attr' = case mblabel of                             Just lab -> (lab, cls, kvs)                             Nothing  -> attr               case attr' of@@ -1113,7 +1114,9 @@                           , sLabels = M.insert ident                                      [Str (renderDottedNum num)] (sLabels st) } -              return $ SimpleFigure attr' (B.toList figureCaption) (src, tit)+              return $ SimpleFigure attr'+                       (maybe id removeLabel mblabel (B.toList figureCaption))+                       (src, tit)         go x = return x  coloredBlock :: PandocMonad m => Text -> LP m Blocks
src/Text/Pandoc/Readers/LaTeX/Inline.hs view
@@ -2,7 +2,7 @@ {-# LANGUAGE ViewPatterns          #-} {- |    Module      : Text.Pandoc.Readers.LaTeX.Inline-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>@@ -56,8 +56,7 @@   let refstr = untokenize v   updateState $ \st ->     st{ sLastLabel = Just refstr }-  return $ spanWith (refstr,[],[("label", refstr)])-    $ inBrackets $ str $ untokenize v+  return $ spanWith (refstr,[],[("label", refstr)]) mempty  doref :: PandocMonad m => Text -> LP m Inlines doref cls = do
src/Text/Pandoc/Readers/LaTeX/Lang.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Readers.LaTeX.Lang-   Copyright   : Copyright (C) 2018-2021 John MacFarlane+   Copyright   : Copyright (C) 2018-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>@@ -165,6 +165,7 @@   , ("croatian", \_ -> simpleLang "hr")   , ("magyar", \_ -> simpleLang "hu")   , ("armenian", \_ -> simpleLang "hy")+  , ("gujarati", \_ -> simpleLang "gu")   , ("interlingua", \_ -> simpleLang "ia")   , ("indonesian", \_ -> simpleLang "id")   , ("icelandic", \_ -> simpleLang "is")@@ -185,7 +186,8 @@   , ("norsk", \_ -> simpleLang "no")   , ("nko", \_ -> simpleLang "nqo")   , ("occitan", \_ -> simpleLang "oc")-  , ("panjabi", \_ -> simpleLang "pa")+  , ("oriya", \_ -> simpleLang "or")+  , ("punjabi", \_ -> simpleLang "pa")   , ("polish", \_ -> simpleLang "pl")   , ("piedmontese", \_ -> simpleLang "pms")   , ("portuguese", \_ -> simpleLang "pt")
src/Text/Pandoc/Readers/LaTeX/Math.hs view
@@ -142,14 +142,15 @@ theoremEnvironment :: PandocMonad m                    => LP m Blocks -> LP m Inlines -> Text -> LP m Blocks theoremEnvironment blocks opt name = do+  resetCaption   tmap <- sTheoremMap <$> getState   case M.lookup name tmap of     Nothing -> mzero     Just tspec -> do        optTitle <- option mempty $ (\x -> space <> "(" <> x <> ")") <$> opt-       mblabel <- option Nothing $ Just . untokenize <$>-                   try (spaces >> controlSeq "label" >> spaces >> braced)        bs <- env name blocks+       mblabel <- sLastLabel <$> getState+        number <-          if theoremNumber tspec             then do@@ -169,9 +170,7 @@                  Just ident ->                    updateState $ \s ->                      s{ sLabels = M.insert ident-                         (B.toList $-                           theoremName tspec <> "\160" <>-                           str (renderDottedNum num)) (sLabels s) }+                         (B.toList $ str (renderDottedNum num)) (sLabels s) }                  Nothing -> return ()                return $ space <> B.text (renderDottedNum num)             else return mempty@@ -181,11 +180,12 @@                          RemarkStyle     -> B.emph        let title = titleEmph (theoremName tspec <> number)                       <> optTitle <> "." <> space-       return $ divWith (fromMaybe "" mblabel, [name], []) $ addTitle title+       return $ divWith (fromMaybe "" mblabel, [name], [])+              $ addTitle title+              $ maybe id removeLabel mblabel               $ case theoremStyle tspec of                   PlainStyle -> walk italicize bs                   _          -> bs-   proof :: PandocMonad m => LP m Blocks -> LP m Inlines -> LP m Blocks
src/Text/Pandoc/Readers/LaTeX/Parsing.hs view
@@ -6,7 +6,7 @@ {-# LANGUAGE ScopedTypeVariables   #-} {- |    Module      : Text.Pandoc.Readers.LaTeX.Parsing-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>@@ -90,6 +90,7 @@   , resetCaption   , env   , addMeta+  , removeLabel   ) where  import Control.Applicative (many, (<|>))@@ -119,6 +120,7 @@                                         ArgSpec (..), Tok (..), TokType (..)) import Text.Pandoc.Shared import Text.Parsec.Pos+import Text.Pandoc.Walk  newtype DottedNum = DottedNum [Int]   deriving (Show, Eq)@@ -1067,3 +1069,16 @@ addMeta :: PandocMonad m => ToMetaValue a => Text -> a -> LP m () addMeta field val = updateState $ \st ->    st{ sMeta = addMetaField field val $ sMeta st }++-- remove label spans to avoid duplicated identifier+removeLabel :: Walkable [Inline] a => Text -> a -> a+removeLabel lbl = walk go+ where+  go (Span (_,_,kvs) _ : rest)+    | Just lbl' <- lookup "label" kvs+    , lbl' == lbl = go (dropWhile isSpaceOrSoftBreak rest)+  go (x:xs) = x : go xs+  go [] = []+  isSpaceOrSoftBreak Space = True+  isSpaceOrSoftBreak SoftBreak = True+  isSpaceOrSoftBreak _ = False
src/Text/Pandoc/Readers/LaTeX/SIunitx.hs view
@@ -4,11 +4,46 @@   ( siunitxCommands ) where import Text.Pandoc.Builder+    ( space,+      subscript,+      superscript,+      emph,+      str,+      fromList,+      text,+      Many(Many, unMany),+      Inline(Superscript, Str),+      Inlines ) import Text.Pandoc.Readers.LaTeX.Parsing+    ( anyControlSeq,+      braced,+      bracketed,+      controlSeq,+      grouped,+      isWordTok,+      keyvals,+      satisfyTok,+      skipopts,+      spaces1,+      symbol,+      untokenize,+      LP ) import Text.Pandoc.Readers.LaTeX.Types-import Text.Pandoc.Class-import Text.Pandoc.Parsing hiding (blankline, mathDisplay, mathInline,-                            optional, space, spaces, withRaw, (<|>))+    ( Tok(Tok), TokType(Word, CtrlSeq) )+import Text.Pandoc.Class.PandocMonad ( PandocMonad )+import Text.Pandoc.Parsing+    ( many1,+      eof,+      string,+      satisfy,+      skipMany,+      option,+      many,+      char,+      try,+      skipMany1,+      runParser,+      Parser ) import Control.Applicative ((<|>)) import Control.Monad (void) import qualified Data.Map as M
src/Text/Pandoc/Readers/LaTeX/Table.hs view
@@ -368,7 +368,9 @@                         ((_,classes,kvs), Just ident) ->                            (ident,classes,kvs)                         _ -> attr-          return $ addAttrDiv attr' $ Table nullAttr capt spec th tb tf+          return $ addAttrDiv attr'+                 $ maybe id removeLabel mblabel+                 $ Table nullAttr capt spec th tb tf         go x = return x  -- TODO: For now we add a Div to contain table attributes, since
src/Text/Pandoc/Readers/LaTeX/Types.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE FlexibleInstances #-} {- |    Module      : Text.Pandoc.Readers.LaTeX.Types-   Copyright   : Copyright (C) 2017-2021 John MacFarlane+   Copyright   : Copyright (C) 2017-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Readers/Markdown.hs view
@@ -1,10 +1,11 @@ {-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE FlexibleContexts    #-} {-# LANGUAGE TupleSections       #-} {-# LANGUAGE OverloadedStrings   #-} {-# LANGUAGE ViewPatterns        #-} {- |    Module      : Text.Pandoc.Readers.Markdown-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>@@ -21,8 +22,8 @@ import Control.Monad import Control.Monad.Except (throwError) import Data.Char (isAlphaNum, isPunctuation, isSpace)+import Text.DocLayout (realLength) import Data.List (transpose, elemIndex, sortOn, foldl')-import Data.List.NonEmpty (NonEmpty(..)) import qualified Data.Map as M import Data.Maybe import qualified Data.Set as Set@@ -39,6 +40,7 @@ import Text.Pandoc.Definition as Pandoc import Text.Pandoc.Emoji (emojiToInline) import Text.Pandoc.Error+import Safe.Foldable (maximumBounded) import Text.Pandoc.Logging import Text.Pandoc.Options import Text.Pandoc.Walk (walk)@@ -79,8 +81,12 @@         oldPos <- getPosition         setPosition $ initialPos (fromMaybe "" mbfp)         meta <- yamlBsToMeta (fmap B.toMetaValue <$> parseBlocks) bstr+        checkNotes         setPosition oldPos-        return $ runF meta defaultParserState+        st <- getState+        let result = runF meta st+        reportLogMessages+        return result   parsed <- readWithM parser def{ stateOptions = opts } ("" :: Text)   case parsed of     Right result -> return result@@ -101,7 +107,11 @@           Nothing -> return ()           Just fp -> setPosition $ initialPos fp         refs <- yamlBsToRefs (fmap B.toMetaValue <$> parseBlocks) idpred bstr-        return $ runF refs defaultParserState+        checkNotes+        st <- getState+        let result = runF refs st+        reportLogMessages+        return result   parsed <- readWithM parser def{ stateOptions = opts } ("" :: Text)   case parsed of     Right result -> return result@@ -186,18 +196,26 @@ -- including inlines between balanced pairs of square brackets. inlinesInBalancedBrackets :: PandocMonad m => MarkdownParser m (F Inlines) inlinesInBalancedBrackets =-  mconcat <$> try (char '[' >> go (1 :: Int))-  where-   go n =-     (:) <$> (note <|> cite <|> bracketedSpan <|> link) <*> go n-     <|>-     (char '[' *> ((:) <$> pure (pure (B.str "[")) <*> go (n + 1)))-     <|>-     (char ']' *> (if n > 1-                      then (:) <$> pure (pure (B.str "]")) <*> go (n - 1)-                      else pure []))-     <|>-     (:) <$> inline <*> go n+  try $ char '[' >> withRaw (go 1) >>=+          parseFromString inlines . stripBracket . snd+  where stripBracket t = case T.unsnoc t of+          Just (t', ']') -> t'+          _              -> t+        go :: PandocMonad m => Int -> MarkdownParser m ()+        go 0 = return ()+        go openBrackets =+          (() <$ (escapedChar <|>+                code <|>+                math <|>+                rawHtmlInline <|>+                rawLaTeXInline') >> go openBrackets)+          <|>+          (do char ']'+              Control.Monad.when (openBrackets > 1) $ go (openBrackets - 1))+          <|>+          (char '[' >> go (openBrackets + 1))+          <|>+          (anyChar >> go openBrackets)  -- -- document structure@@ -298,7 +316,17 @@   optional titleBlock   blocks <- parseBlocks   st <- getState-  -- check for notes with no corresponding note references+  checkNotes+  let doc = runF (do Pandoc _ bs <- B.doc <$> blocks+                     meta <- stateMeta' st+                     return $ Pandoc meta bs) st+  reportLogMessages+  return doc++-- check for notes with no corresponding note references+checkNotes :: PandocMonad m => MarkdownParser m ()+checkNotes = do+  st <- getState   let notesUsed = stateNoteRefs st   let notesDefined = M.keys (stateNotes' st)   mapM_ (\n -> unless (n `Set.member` notesUsed) $@@ -307,12 +335,8 @@                    Nothing -> throwError $                      PandocShouldNeverHappenError "note not found")          notesDefined-  let doc = runF (do Pandoc _ bs <- B.doc <$> blocks-                     meta <- stateMeta' st-                     return $ Pandoc meta bs) st-  reportLogMessages-  return doc + referenceKey :: PandocMonad m => MarkdownParser m (F Blocks) referenceKey = try $ do   pos <- getPosition@@ -1351,26 +1375,30 @@   nonindentSpaces   lookAhead nonspaceChar   (heads,(aligns, seplengths)) <- (,) <$> pipeTableRow <*> pipeBreak-  let heads' = take (length aligns) <$> heads+  let cellContents = parseFromString' pipeTableCell . trim+  let numcols = length aligns+  let heads' = take numcols heads   lines' <- many pipeTableRow-  let lines'' = map (take (length aligns) <$>) lines'-  let maxlength = maximum $-       fmap (\x -> T.length . stringify $ runF x def) (heads' :| lines'')-  numColumns <- getOption readerColumns-  let widths = if maxlength > numColumns+  let lines'' = map (take numcols) lines'+  let lineWidths = map (sum . map realLength) (heads' : lines'')+  columns <- getOption readerColumns+  -- add numcols + 1 for the pipes themselves+  let widths = if maximumBounded (sum seplengths : lineWidths) + (numcols + 1) > columns                   then map (\len ->                          fromIntegral len / fromIntegral (sum seplengths))                          seplengths                   else replicate (length aligns) 0.0-  return (aligns, widths, toHeaderRow <$> heads', map toRow <$> sequence lines'')+  (headCells :: F [Blocks]) <- sequence <$> mapM cellContents heads'+  (rows :: F [[Blocks]]) <- sequence <$> mapM (fmap sequence . mapM cellContents) lines''+  return (aligns, widths, toHeaderRow <$> headCells, map toRow <$> rows)  sepPipe :: PandocMonad m => MarkdownParser m () sepPipe = try $ do   char '|' <|> char '+'   notFollowedBy blankline --- parse a row, also returning probable alignments for org-table cells-pipeTableRow :: PandocMonad m => MarkdownParser m (F [Blocks])+-- parse a row, returning raw cell contents+pipeTableRow :: PandocMonad m => MarkdownParser m [Text] pipeTableRow = try $ do   scanForPipe   skipMany spaceChar@@ -1378,13 +1406,11 @@   -- split into cells   let chunk = void (code <|> math <|> rawHtmlInline <|> escapedChar <|> rawLaTeXInline')        <|> void (noneOf "|\n\r")-  let cellContents = withRaw (many chunk) >>=-        parseFromString' pipeTableCell . trim . snd-  cells <- cellContents `sepEndBy1` char '|'+  cells <- (snd <$> withRaw (many chunk)) `sepEndBy1` char '|'   -- surrounding pipes needed for a one-column table:   guard $ not (length cells == 1 && not openPipe)   blankline-  return $ sequence cells+  return cells  pipeTableCell :: PandocMonad m => MarkdownParser m (F Blocks) pipeTableCell =@@ -1771,8 +1797,7 @@ -- a reference label for a link reference :: PandocMonad m => MarkdownParser m (F Inlines, Text) reference = do-  -- guardDisabled Ext_footnotes <|> notFollowedBy' (string "[^")-  -- guardDisabled Ext_citations <|> notFollowedBy' (string "[@")+  guardDisabled Ext_footnotes <|> notFollowedBy' (string "[^")   withRaw $ trimInlinesF <$> inlinesInBalancedBrackets  parenthesizedChars :: PandocMonad m => MarkdownParser m Text@@ -2205,7 +2230,7 @@  prefix :: PandocMonad m => MarkdownParser m (F Inlines) prefix = trimInlinesF . mconcat <$>-  manyTill inline (char ']'+  manyTill (notFollowedBy (char ';') >> inline) (char ']'    <|> lookAhead          (try $ do optional (try (char ';' >> spnl))                    citeKey True
src/Text/Pandoc/Readers/MediaWiki.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Readers.MediaWiki-   Copyright   : Copyright (C) 2012-2021 John MacFarlane+   Copyright   : Copyright (C) 2012-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Readers/Metadata.hs view
@@ -2,7 +2,7 @@ {-# LANGUAGE ScopedTypeVariables #-} {- |    Module      : Text.Pandoc.Readers.Metadata-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Readers/Native.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Readers.Native-   Copyright   : Copyright (C) 2011-2021 John MacFarlane+   Copyright   : Copyright (C) 2011-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Readers/OPML.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Readers.OPML-   Copyright   : Copyright (C) 2013-2021 John MacFarlane+   Copyright   : Copyright (C) 2013-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Readers/Odt/ContentReader.hs view
@@ -661,16 +661,23 @@                     $ constructList --                  $ liftA bulletList                     $ matchChildContent' [ read_list_item+                                         , read_list_header                                          ] -- read_list_item   :: ElementMatcher [Blocks]-read_list_item    = matchingElement NsText "list-item"-                    $ liftA (compactify.(:[]))-                      ( matchChildContent' [ read_paragraph-                                           , read_header-                                           , read_list-                                           ]-                      )+read_list_item    = read_list_element "list-item"++read_list_header :: ElementMatcher [Blocks]+read_list_header  = read_list_element "list-header"++read_list_element               :: ElementName -> ElementMatcher [Blocks]+read_list_element listElement   = matchingElement NsText listElement+                                  $ liftA (compactify.(:[]))+                                    ( matchChildContent' [ read_paragraph+                                                         , read_header+                                                         , read_list+                                                         ]+                                    )   ----------------------
src/Text/Pandoc/Readers/Org.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Readers.Org-   Copyright   : Copyright (C) 2014-2021 Albert Krewinkel+   Copyright   : Copyright (C) 2014-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>
src/Text/Pandoc/Readers/Org/BlockStarts.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Readers.Org.BlockStarts-   Copyright   : Copyright (C) 2014-2021 Albert Krewinkel+   Copyright   : Copyright (C) 2014-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>@@ -25,8 +25,11 @@  import Control.Monad (void) import Data.Text (Text)-import qualified Data.Text as T import Text.Pandoc.Readers.Org.Parsing+import Text.Pandoc.Definition as Pandoc+import Text.Pandoc.Shared (safeRead)+import Text.Pandoc.Parsing (lowerAlpha, upperAlpha)+import Data.Functor (($>))  -- | Horizontal Line (five -- dashes or more) hline :: Monad m => OrgParser m ()@@ -60,30 +63,45 @@    latexEnvName :: Monad m => OrgParser m Text    latexEnvName = try $ mappend <$> many1Char alphaNum <*> option "" (textStr "*") +listCounterCookie :: Monad m => OrgParser m Int+listCounterCookie = try $+  string "[@"+  *> parseNum+  <* char ']'+  <* (skipSpaces <|> lookAhead eol)+  where parseNum = (safeRead =<< many1Char digit)+                   <|> snd <$> lowerAlpha+                   <|> snd <$> upperAlpha+ bulletListStart :: Monad m => OrgParser m Int bulletListStart = try $ do   ind <- length <$> many spaceChar    -- Unindented lists cannot use '*' bullets.   oneOf (if ind == 0 then "+-" else "*+-")   skipSpaces1 <|> lookAhead eol-  return (ind + 1)--genericListStart :: Monad m-                 => OrgParser m Text-                 -> OrgParser m Int-genericListStart listMarker = try $ do-  ind <- length <$> many spaceChar-  void listMarker-  skipSpaces1 <|> lookAhead eol+  optionMaybe listCounterCookie   return (ind + 1)  eol :: Monad m => OrgParser m () eol = void (char '\n') -orderedListStart :: Monad m => OrgParser m Int-orderedListStart = genericListStart orderedListMarker+orderedListStart :: Monad m => OrgParser m (Int, ListAttributes)+orderedListStart = try $ do+  ind <- length <$> many spaceChar+  style <- choice styles+  delim <- choice delims+  skipSpaces1 <|> lookAhead eol+  start <- option 1 listCounterCookie+  return (ind + 1, (start, style, delim))   -- Ordered list markers allowed in org-mode-  where orderedListMarker = T.snoc <$> many1Char digit <*> oneOf ".)"+  where+    styles = [ many1Char digit $> Decimal+             , fst <$> lowerAlpha+             , fst <$> upperAlpha+             ]+    delims = [ char '.' $> Period+             , char ')' $> OneParen+             ]  drawerStart :: Monad m => OrgParser m Text drawerStart = try $ skipSpaces *> drawerName <* skipSpaces <* newline
src/Text/Pandoc/Readers/Org/Blocks.hs view
@@ -4,7 +4,7 @@ {-# LANGUAGE RecordWildCards   #-} {- |    Module      : Text.Pandoc.Readers.Org.Blocks-   Copyright   : Copyright (C) 2014-2021 Albert Krewinkel+   Copyright   : Copyright (C) 2014-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>@@ -167,9 +167,8 @@    value = skipSpaces *> manyTillChar anyChar endOfValue     endOfValue :: Monad m => OrgParser m ()-   endOfValue =-     lookAhead $ (() <$ try (many1 spaceChar <* key))-              <|> () <$ newline+   endOfValue = lookAhead (void $ try (many1 spaceChar <* key))+            <|> try (skipSpaces <* lookAhead newline)   --@@ -803,7 +802,7 @@   -- is directly followed by a list item, in which case the block is read as   -- plain text.   try (guard nl-       *> notFollowedBy (inList *> (orderedListStart <|> bulletListStart))+       *> notFollowedBy (inList *> (void orderedListStart <|> void bulletListStart))        $> (B.para <$> ils))     <|>  return (B.plain <$> ils) @@ -835,9 +834,12 @@  orderedList :: PandocMonad m => OrgParser m (F Blocks) orderedList = try $ do-  indent <- lookAhead orderedListStart-  fmap (B.orderedList . compactify) . sequence-    <$> many1 (listItem (orderedListStart `indented` indent))+  (indent, attr) <- lookAhead orderedListStart+  attr' <- option (fst3 attr, DefaultStyle, DefaultDelim) $+           guardEnabled Ext_fancy_lists $> attr+  fmap (B.orderedListWith attr' . compactify) . sequence+    <$> many1 (listItem ((fst <$> orderedListStart) `indented` indent))+  where fst3 (x,_,_) = x  definitionListItem :: PandocMonad m                    => OrgParser m Int
src/Text/Pandoc/Readers/Org/DocumentTree.hs view
@@ -3,7 +3,7 @@ {-# LANGUAGE TupleSections     #-} {- |    Module      : Text.Pandoc.Readers.Org.DocumentTree-   Copyright   : Copyright (C) 2014-2021 Albert Krewinkel+   Copyright   : Copyright (C) 2014-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>
src/Text/Pandoc/Readers/Org/ExportSettings.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Readers.Org.ExportSettings-   Copyright   : © 2016-2021 Albert Krewinkel+   Copyright   : © 2016-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>
src/Text/Pandoc/Readers/Org/Inlines.hs view
@@ -2,7 +2,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Readers.Org.Inlines-   Copyright   : Copyright (C) 2014-2021 Albert Krewinkel+   Copyright   : Copyright (C) 2014-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>@@ -31,11 +31,10 @@ import Text.TeXMath (DisplayType (..), readTeX, writePandoc) import Text.Pandoc.Sources (ToSources(..)) import qualified Text.TeXMath.Readers.MathML.EntityMap as MathMLEntityMap--import Control.Monad (guard, mplus, mzero, unless, void, when)+import Safe (lastMay)+import Control.Monad (guard, mplus, mzero, unless, when, void) import Control.Monad.Trans (lift) import Data.Char (isAlphaNum, isSpace)-import Data.List (intersperse) import qualified Data.Map as M import Data.Text (Text) import qualified Data.Text as T@@ -148,31 +147,177 @@ -- Citations -- --- The state of citations is a bit confusing due to the lack of an official--- syntax and multiple syntaxes coexisting.  The pandocOrgCite syntax was the--- first to be implemented here and is almost identical to Markdown's citation--- syntax.  The org-ref package is in wide use to handle citations, but the--- syntax is a bit limiting and not quite as simple to write.  The--- semi-official Org-mode citation syntax is based on John MacFarlane's Pandoc--- sytax and Org-oriented enhancements contributed by Richard Lawrence and--- others.  It's dubbed Berkeley syntax due the place of activity of its main--- contributors.  All this should be consolidated once an official Org-mode--- citation syntax has emerged.+-- We first try to parse official org-cite citations, then fall+-- back to org-ref citations (which are still in wide use). +-- | A citation in org-cite style+orgCite :: PandocMonad m => OrgParser m (F [Citation])+orgCite = try $ do+  string "[cite"+  (sty, _variants) <- citeStyle+  char ':'+  spnl+  globalPref <- option mempty (try (citePrefix <* char ';'))+  items <- citeItems+  globalSuff <- option mempty (try (char ';' *> citeSuffix))+  spnl+  char ']'+  return $ adjustCiteStyle sty .+           addPrefixToFirstItem globalPref .+           addSuffixToLastItem globalSuff $ items++adjustCiteStyle :: CiteStyle -> (F [Citation]) -> (F [Citation])+adjustCiteStyle sty cs = do+  cs' <- cs+  case cs' of+    [] -> return []+    (d:ds)  -- TODO needs refinement+      -> case sty of+         TextStyle -> return $ d{ citationMode = AuthorInText+                                , citationSuffix = dropWhile (== Space)+                                    (citationSuffix d)} : ds+         NoAuthorStyle -> return $ d{ citationMode = SuppressAuthor } : ds+         _ -> return (d:ds)++addPrefixToFirstItem :: (F Inlines) -> (F [Citation]) -> (F [Citation])+addPrefixToFirstItem aff cs = do+  cs' <- cs+  aff' <- aff+  case cs' of+    [] -> return []+    (d:ds) -> return (d{ citationPrefix =+                          B.toList aff' <> citationPrefix d }:ds)++addSuffixToLastItem :: (F Inlines) -> (F [Citation]) -> (F [Citation])+addSuffixToLastItem aff cs = do+  cs' <- cs+  aff' <- aff+  case lastMay cs' of+    Nothing -> return cs'+    Just d  ->+      return (init cs' ++ [d{ citationSuffix =+                                citationSuffix d <> B.toList aff' }])++citeItems :: PandocMonad m => OrgParser m (F [Citation])+citeItems = sequence <$> citeItem `sepBy1` (char ';')++citeItem :: PandocMonad m => OrgParser m (F Citation)+citeItem = do+  pref <- citePrefix+  itemKey <- orgCiteKey+  suff <- citeSuffix+  return $ do+    pre' <- pref+    suf' <- suff+    return Citation+      { citationId      = itemKey+      , citationPrefix  = B.toList pre'+      , citationSuffix  = B.toList suf'+      , citationMode    = NormalCitation+      , citationNoteNum = 0+      , citationHash    = 0+      }++orgCiteKey :: PandocMonad m => OrgParser m Text+orgCiteKey = do+  char '@'+  T.pack <$> many1 (satisfy orgCiteKeyChar)++orgCiteKeyChar :: Char -> Bool+orgCiteKeyChar c =+  isAlphaNum c || c `elem` ['.',':','?','!','`','\'','/','*','@','+','|',+                            '(',')','{','}','<','>','&','_','^','$','#',+                            '%','~','-']++rawAffix :: PandocMonad m => Bool -> OrgParser m Text+rawAffix isPrefix = snd <$> withRaw+  (many+   (affixChar+     <|>+     try (void (char '[' >> rawAffix isPrefix >> char ']'))))+ where+   affixChar = void $ satisfy $ \c ->+     not (c == '^' || c == ';' || c == '[' || c == ']') &&+     (not isPrefix || c /= '@')++citePrefix :: PandocMonad m => OrgParser m (F Inlines)+citePrefix =+  rawAffix True >>= parseFromString (trimInlinesF . mconcat <$> many inline)++citeSuffix :: PandocMonad m => OrgParser m (F Inlines)+citeSuffix =+  rawAffix False >>= parseFromString parseSuffix+ where+   parseSuffix = do+     hasSpace <- option False+              (True <$ try (spaceChar >> skipSpaces >> lookAhead nonspaceChar))+     ils <- trimInlinesF . mconcat <$> many inline+     return $ if hasSpace+                 then (B.space <>) <$> ils+                 else ils++citeStyle :: PandocMonad m => OrgParser m (CiteStyle, [CiteVariant])+citeStyle = option (DefStyle, []) $ do+  sty <- option DefStyle $ try $ char '/' *> orgCiteStyle+  variants <- option [] $ try $ char '/' *> orgCiteVariants+  return (sty, variants)++orgCiteStyle :: PandocMonad m => OrgParser m CiteStyle+orgCiteStyle = choice $ map try+  [ NoAuthorStyle <$ string "noauthor"+  , NoAuthorStyle <$ string "na"+  , LocatorsStyle <$ string "locators"+  , LocatorsStyle <$ char 'l'+  , NociteStyle <$ string "nocite"+  , NociteStyle <$ char 'n'+  , TextStyle <$ string "text"+  , TextStyle <$ char 't'+  ]++orgCiteVariants :: PandocMonad m => OrgParser m [CiteVariant]+orgCiteVariants =+  (fullnameVariant `sepBy1` (char '-')) <|> (many1 onecharVariant)+ where+  fullnameVariant = choice $ map try+     [ Bare <$ string "bare"+     , Caps <$ string "caps"+     , Full <$ string "full"+     ]+  onecharVariant = choice+     [ Bare <$ char 'b'+     , Caps <$ char 'c'+     , Full <$ char 'f'+     ]++data CiteStyle =+    NoAuthorStyle+  | LocatorsStyle+  | NociteStyle+  | TextStyle+  | DefStyle+  deriving Show++data CiteVariant =+    Caps+  | Bare+  | Full+  deriving Show+++spnl :: PandocMonad m => OrgParser m ()+spnl =+  skipSpaces *> optional (newline *> notFollowedBy blankline *> skipSpaces)+ cite :: PandocMonad m => OrgParser m (F Inlines)-cite = try $ berkeleyCite <|> do+cite = do   guardEnabled Ext_citations-  (cs, raw) <- withRaw $ choice-               [ pandocOrgCite+  (cs, raw) <- withRaw $ try $ choice+               [ orgCite                , orgRefCite-               , berkeleyTextualCite                ]   return $ flip B.cite (B.text raw) <$> cs --- | A citation in Pandoc Org-mode style (@[prefix \@citekey suffix]@).-pandocOrgCite :: PandocMonad m => OrgParser m (F [Citation])-pandocOrgCite = try $-  char '[' *> skipSpaces *> citeList <* skipSpaces <* char ']'+-- org-ref  orgRefCite :: PandocMonad m => OrgParser m (F [Citation]) orgRefCite = try $ choice@@ -201,100 +346,6 @@      , citationHash    = 0      } --- | Read an Berkeley-style Org-mode citation.  Berkeley citation style was--- develop and adjusted to Org-mode style by John MacFarlane and Richard--- Lawrence, respectively, both philosophers at UC Berkeley.-berkeleyCite :: PandocMonad m => OrgParser m (F Inlines)-berkeleyCite = try $ do-  bcl <- berkeleyCitationList-  return $ do-    parens <- berkeleyCiteParens <$> bcl-    prefix <- berkeleyCiteCommonPrefix <$> bcl-    suffix <- berkeleyCiteCommonSuffix <$> bcl-    citationList <- berkeleyCiteCitations <$> bcl-    return $-      if parens-      then toCite-           . maybe id (alterFirst . prependPrefix) prefix-           . maybe id (alterLast . appendSuffix) suffix-           $ citationList-      else maybe mempty (<> " ") prefix-             <> toListOfCites (map toInTextMode citationList)-             <> maybe mempty (", " <>) suffix- where-   toCite :: [Citation] -> Inlines-   toCite cs = B.cite cs mempty--   toListOfCites :: [Citation] -> Inlines-   toListOfCites = mconcat . intersperse ", " . map (\c -> B.cite [c] mempty)--   toInTextMode :: Citation -> Citation-   toInTextMode c = c { citationMode = AuthorInText }--   alterFirst, alterLast :: (a -> a) -> [a] -> [a]-   alterFirst _ []     = []-   alterFirst f (c:cs) = f c : cs-   alterLast  f = reverse . alterFirst f . reverse--   prependPrefix, appendSuffix :: Inlines -> Citation -> Citation-   prependPrefix pre c = c { citationPrefix = B.toList pre <> citationPrefix c }-   appendSuffix  suf c = c { citationSuffix = citationSuffix c <> B.toList suf }--data BerkeleyCitationList = BerkeleyCitationList-  { berkeleyCiteParens       :: Bool-  , berkeleyCiteCommonPrefix :: Maybe Inlines-  , berkeleyCiteCommonSuffix :: Maybe Inlines-  , berkeleyCiteCitations    :: [Citation]-  }-berkeleyCitationList :: PandocMonad m => OrgParser m (F BerkeleyCitationList)-berkeleyCitationList = try $ do-  char '['-  parens <- choice [ False <$ berkeleyBareTag, True <$ berkeleyParensTag ]-  char ':'-  skipSpaces-  commonPrefix <- optionMaybe (try $ citationListPart <* char ';')-  citations    <- citeList-  commonSuffix <- optionMaybe (try citationListPart)-  char ']'-  return (BerkeleyCitationList parens-    <$> sequence commonPrefix-    <*> sequence commonSuffix-    <*> citations)- where-   citationListPart :: PandocMonad m => OrgParser m (F Inlines)-   citationListPart = fmap (trimInlinesF . mconcat) . try . many1 $ do-     notFollowedBy' $ citeKey False-     notFollowedBy (oneOf ";]")-     inline--berkeleyBareTag :: PandocMonad m => OrgParser m ()-berkeleyBareTag = try $ void berkeleyBareTag'--berkeleyParensTag :: PandocMonad m => OrgParser m ()-berkeleyParensTag = try . void $ enclosedByPair1 '(' ')' berkeleyBareTag'--berkeleyBareTag' :: PandocMonad m => OrgParser m ()-berkeleyBareTag' = try $ void (string "cite")--berkeleyTextualCite :: PandocMonad m => OrgParser m (F [Citation])-berkeleyTextualCite = try $ do-  (suppressAuthor, key) <- citeKey False-  returnF . return $ Citation-    { citationId      = key-    , citationPrefix  = mempty-    , citationSuffix  = mempty-    , citationMode    = if suppressAuthor then SuppressAuthor else AuthorInText-    , citationNoteNum = 0-    , citationHash    = 0-    }---- The following is what a Berkeley-style bracketed textual citation parser--- would look like.  However, as these citations are a subset of Pandoc's Org--- citation style, this isn't used.--- berkeleyBracketedTextualCite :: PandocMonad m => OrgParser m (F [Citation])--- berkeleyBracketedTextualCite = try . (fmap head) $---   enclosedByPair1 '[' ']' berkeleyTextualCite- -- | Read a link-like org-ref style citation.  The citation includes pre and -- post text.  However, multiple citations are not possible due to limitations -- in the syntax.@@ -344,39 +395,6 @@     , ("citet*", AuthorInText)     , ("citeyear", SuppressAuthor)     ]--citeList :: PandocMonad m => OrgParser m (F [Citation])-citeList = sequence <$> sepEndBy1 citation (try $ char ';' *> skipSpaces)--citation :: PandocMonad m => OrgParser m (F Citation)-citation = try $ do-  pref <- prefix-  (suppress_author, key) <- citeKey False-  suff <- suffix-  return $ do-    x <- pref-    y <- suff-    return Citation-      { citationId      = key-      , citationPrefix  = B.toList x-      , citationSuffix  = B.toList y-      , citationMode    = if suppress_author-                          then SuppressAuthor-                          else NormalCitation-      , citationNoteNum = 0-      , citationHash    = 0-      }- where-   prefix = trimInlinesF . mconcat <$>-            manyTill inline (char ']' <|> (']' <$ lookAhead (citeKey False)))-   suffix = try $ do-     hasSpace <- option False (notFollowedBy nonspaceChar >> return True)-     skipSpaces-     rest <- trimInlinesF . mconcat <$>-             many (notFollowedBy (oneOf ";]") *> inline)-     return $ if hasSpace-              then (B.space <>) <$> rest-              else rest  footnote :: PandocMonad m => OrgParser m (F Inlines) footnote = try $ do
src/Text/Pandoc/Readers/Org/Meta.hs view
@@ -3,7 +3,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Readers.Org.Meta-   Copyright   : Copyright (C) 2014-2021 Albert Krewinkel+   Copyright   : Copyright (C) 2014-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>
src/Text/Pandoc/Readers/Org/ParserState.hs view
@@ -3,7 +3,7 @@ {-# LANGUAGE OverloadedStrings     #-} {- |    Module      : Text.Pandoc.Readers.Org.ParserState-   Copyright   : Copyright (C) 2014-2021 Albert Krewinkel+   Copyright   : Copyright (C) 2014-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>
src/Text/Pandoc/Readers/Org/Parsing.hs view
@@ -1,6 +1,6 @@ {- |    Module      : Text.Pandoc.Readers.Org.Parsing-   Copyright   : Copyright (C) 2014-2021 Albert Krewinkel+   Copyright   : Copyright (C) 2014-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>
src/Text/Pandoc/Readers/Org/Shared.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Readers.Org.Shared-   Copyright   : Copyright (C) 2014-2021 Albert Krewinkel+   Copyright   : Copyright (C) 2014-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>
src/Text/Pandoc/Readers/RST.hs view
@@ -4,7 +4,7 @@ {-# LANGUAGE ViewPatterns        #-} {- |    Module      : Text.Pandoc.Readers.RST-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Readers/RTF.hs view
@@ -2,7 +2,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Readers.RTF-   Copyright   : Copyright (C) 2021 John MacFarlane+   Copyright   : Copyright (C) 2021-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane (<jgm@berkeley.edu>)
src/Text/Pandoc/Readers/Textile.hs view
@@ -3,7 +3,7 @@ {- |    Module      : Text.Pandoc.Readers.Textile    Copyright   : Copyright (C) 2010-2012 Paul Rivier-                               2010-2021 John MacFarlane+                               2010-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : Paul Rivier <paul*rivier#demotera*com>
src/Text/Pandoc/Readers/TikiWiki.hs view
@@ -125,7 +125,7 @@   skipSpaces   content <- B.trimInlines . mconcat <$> manyTill inline newline   attr <- registerHeader nullAttr content-  return $B.headerWith attr level content+  return $ B.headerWith attr level content  tableRow :: PandocMonad m => TikiWikiParser m [B.Blocks] tableRow = try $ do@@ -163,11 +163,11 @@   string "||"   newline   -- return $ B.simpleTable (headers rows) $ trace ("rows: " ++ (show rows)) rows-  return $B.simpleTable (headers rows) rows+  return $ B.simpleTable (headers rows) rows   where     -- The headers are as many empty strings as the number of columns     -- in the first row-    headers rows = map (B.plain . B.str) $replicate (length $ head rows) ""+    headers rows = replicate (length $ head rows) ((B.plain . B.str) "")  para :: PandocMonad m => TikiWikiParser m B.Blocks para =  fmap (result . mconcat) ( many1Till inline endOfParaElement)
src/Text/Pandoc/Readers/Vimwiki.hs view
@@ -216,7 +216,7 @@  definitionTerm2 :: PandocMonad m => VwParser m Inlines definitionTerm2 = try $ trimInlines . mconcat <$> manyTill inline'-  (try $lookAhead (defMarkerM >> notFollowedBy hasDefMarkerM))+  (try $ lookAhead (defMarkerM >> notFollowedBy hasDefMarkerM))  defMarkerM :: PandocMonad m => VwParser m Char defMarkerM = string "::" >> spaceChar@@ -382,7 +382,7 @@  orderedListMarkers :: PandocMonad m => VwParser m Text orderedListMarkers =-  ("ol" <$choice (orderedListMarker Decimal Period:(($OneParen) . orderedListMarker <$> [Decimal, LowerRoman, UpperRoman, LowerAlpha, UpperAlpha])))+  ("ol" <$ choice (orderedListMarker Decimal Period:(($ OneParen) . orderedListMarker <$> [Decimal, LowerRoman, UpperRoman, LowerAlpha, UpperAlpha])))     <|> ("ol" <$ char '#')  --many need trimInlines
src/Text/Pandoc/RoffChar.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.RoffChar-   Copyright   : Copyright (C) 2007-2021 John MacFarlane+   Copyright   : Copyright (C) 2007-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/SelfContained.hs view
@@ -2,7 +2,7 @@ {-# LANGUAGE TupleSections     #-} {- |    Module      : Text.Pandoc.SelfContained-   Copyright   : Copyright (C) 2011-2021 John MacFarlane+   Copyright   : Copyright (C) 2011-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Shared.hs view
@@ -8,7 +8,7 @@ {-# LANGUAGE OverloadedStrings     #-} {- |    Module      : Text.Pandoc.Shared-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>@@ -25,6 +25,7 @@                      ordNub,                      findM,                      -- * Text processing+                     inquotes,                      tshow,                      elemText,                      notElemText,@@ -186,6 +187,10 @@ -- Text processing -- +-- | Wrap double quotes around a Text+inquotes :: T.Text -> T.Text+inquotes txt = T.cons '\"' (T.snoc txt '\"')+ tshow :: Show a => a -> T.Text tshow = T.pack . show @@ -727,17 +732,17 @@                  where                   rank (RawBlock (Format "html") _)                     | fmt == Format "html" = 1 :: Int-                    | fmt == Format "markdown" = 2-                    | otherwise = 3+                    | fmt == Format "markdown" = 3+                    | otherwise = 4                   rank (RawBlock (Format "latex") _)                     | fmt == Format "latex" = 1-                    | fmt == Format "markdown" = 2-                    | otherwise = 3+                    | fmt == Format "markdown" = 3+                    | otherwise = 4                   rank (RawBlock f _)                     | fmt == f = 1-                    | otherwise = 3-                  rank (Para [Image{}]) = 1-                  rank _ = 2+                    | otherwise = 4+                  rank (Para [Image{}]) = 2+                  rank _ = 3                   removeANSI (CodeBlock attr code) =                     CodeBlock attr (removeANSIEscapes code)                   removeANSI x = x
src/Text/Pandoc/Slides.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Slides-   Copyright   : Copyright (C) 2012-2021 John MacFarlane+   Copyright   : Copyright (C) 2012-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Sources.hs view
@@ -5,7 +5,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Sources-   Copyright   : Copyright (C) 2021 John MacFarlane+   Copyright   : Copyright (C) 2021-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Templates.hs view
@@ -4,7 +4,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Templates-   Copyright   : Copyright (C) 2009-2021 John MacFarlane+   Copyright   : Copyright (C) 2009-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Translations.hs view
@@ -4,7 +4,7 @@ {-# LANGUAGE OverloadedStrings          #-} {- |    Module      : Text.Pandoc.Translations-   Copyright   : Copyright (C) 2017-2021 John MacFarlane+   Copyright   : Copyright (C) 2017-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/UTF8.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.UTF8-   Copyright   : Copyright (C) 2010-2021 John MacFarlane+   Copyright   : Copyright (C) 2010-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/UUID.hs view
@@ -1,6 +1,6 @@ {- |    Module      : Text.Pandoc.UUID-   Copyright   : Copyright (C) 2010-2021 John MacFarlane+   Copyright   : Copyright (C) 2010-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Writers.hs view
@@ -4,7 +4,7 @@ {-# LANGUAGE OverloadedStrings   #-} {- |    Module      : Text.Pandoc-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>@@ -25,7 +25,6 @@     , writeBibLaTeX     , writeCommonMark     , writeConTeXt-    , writeCustom     , writeCslJson     , writeDZSlides     , writeDocbook4@@ -51,6 +50,7 @@     , writeLaTeX     , writeMan     , writeMarkdown+    , writeMarkua     , writeMediaWiki     , writeMs     , writeMuse@@ -92,7 +92,6 @@ import Text.Pandoc.Writers.CommonMark import Text.Pandoc.Writers.ConTeXt import Text.Pandoc.Writers.CslJson-import Text.Pandoc.Writers.Custom import Text.Pandoc.Writers.Docbook import Text.Pandoc.Writers.Docx import Text.Pandoc.Writers.DokuWiki@@ -190,6 +189,7 @@   ,("csljson"      , TextWriter writeCslJson)   ,("bibtex"       , TextWriter writeBibTeX)   ,("biblatex"     , TextWriter writeBibLaTeX)+  ,("markua"       , TextWriter writeMarkua)   ]  -- | Retrieve writer, extensions based on formatSpec (format+extensions).
src/Text/Pandoc/Writers/AsciiDoc.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Writers.AsciiDoc-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>@@ -454,7 +454,7 @@                                    _           -> False        isSpacy Start (Str xs)          | Just (c, _) <- T.uncons xs = isPunctuation c || isSpace c-       isSpacy _ _ = False+       isSpacy _ _ = True  setIntraword :: PandocMonad m => Bool -> ADW m () setIntraword b = modify $ \st -> st{ intraword = b }
src/Text/Pandoc/Writers/BibTeX.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Writers.BibTeX-   Copyright   : Copyright (C) 2021 John MacFarlane+   Copyright   : Copyright (C) 2021-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
+ src/Text/Pandoc/Writers/Blaze.hs view
@@ -0,0 +1,137 @@+{-# LANGUAGE OverloadedStrings #-}+{- |+   Module      : Text.Pandoc.Writers.Blaze+   Copyright   : Copyright (C) 2021-2022 John MacFarlane+   License     : GNU GPL, version 2 or above++   Maintainer  : John MacFarlane <jgm@berkeley.edu>+   Stability   : alpha+   Portability : portable++Render blaze-html Html to DocLayout document (so it can be wrapped).+-}+module Text.Pandoc.Writers.Blaze ( layoutMarkup )+where+import Text.Blaze+import qualified Data.ByteString as S+import Data.List (isInfixOf)+import Data.Text.Encoding (decodeUtf8)+import qualified Data.Text as T+import Data.Text (Text)+import Text.DocLayout hiding (Text, Empty)+import Text.Blaze.Internal (ChoiceString(..), getText, MarkupM(..))++layoutMarkup :: Markup -> Doc T.Text+layoutMarkup = go True mempty+  where+    go :: Bool -> Doc T.Text -> MarkupM b -> Doc T.Text+    go wrap attrs (Parent _ open close content) =+      let open' = getText open+       in literal open'+            <> attrs+            <> char '>'+            <> (if allowsWrap open'+                   then go wrap mempty content+                   else flush $ go False mempty content)+            <> literal (getText close)+    go wrap attrs (CustomParent tag content) =+        char '<'+            <> fromChoiceString wrap tag+            <> attrs+            <> char '>'+            <> go wrap mempty content+            <> literal "</"+            <> fromChoiceString wrap tag+            <> char '>'+    go _wrap attrs (Leaf _ begin end _) =+        literal (getText begin)+            <> attrs+            <> literal (getText end)+    go wrap attrs (CustomLeaf tag close _) =+        char '<'+            <> fromChoiceString wrap tag+            <> attrs+            <> (if close then literal " />" else char '>')+    go wrap attrs (AddAttribute rawkey _ value h) =+        go wrap+          (space' wrap+            <> literal (getText rawkey)+            <> char '='+            <> doubleQuotes (fromChoiceString False value)+            <> attrs) h+    go wrap attrs (AddCustomAttribute key value h) =+        go wrap+          (space' wrap+            <> fromChoiceString wrap key+            <> char '='+            <> doubleQuotes (fromChoiceString False value)+            <> attrs) h+    go wrap _ (Content content _) = fromChoiceString wrap content+    go wrap _ (Comment comment _) =+        literal "<!--"+            <> space' wrap+            <> fromChoiceString False comment+            <> space' wrap+            <> "-->"+    go wrap attrs (Append h1 h2) = go wrap attrs h1 <> go wrap attrs h2+    go _ _ (Empty _) = mempty+    space' wrap = if wrap then space else char ' '++allowsWrap :: T.Text -> Bool+allowsWrap t =+  not (t == "<pre" || t == "<style" || t == "<script" || t == "<textarea")++fromChoiceString :: Bool                  -- ^ Allow wrapping+                 -> ChoiceString          -- ^ String to render+                 -> Doc Text              -- ^ Resulting builder+fromChoiceString wrap (Static s)     = withWrap wrap $ getText s+fromChoiceString wrap (String s)     = withWrap wrap $+                                         escapeMarkupEntities $ T.pack s+fromChoiceString wrap (Text s)       = withWrap wrap $ escapeMarkupEntities s+fromChoiceString wrap (ByteString s) = withWrap wrap $ decodeUtf8 s+fromChoiceString _wrap (PreEscaped x) = -- don't wrap!+  case x of+    String s -> literal $ T.pack s+    Text   s -> literal s+    s        -> fromChoiceString False s+fromChoiceString wrap (External x) = case x of+    -- Check that the sequence "</" is *not* in the external data.+    String s     -> if "</" `isInfixOf` s then mempty else withWrap wrap (T.pack s)+    Text   s     -> if "</" `T.isInfixOf` s then mempty else withWrap wrap s+    ByteString s -> if "</" `S.isInfixOf` s then mempty else withWrap wrap (decodeUtf8 s)+    s            -> fromChoiceString wrap s+fromChoiceString wrap (AppendChoiceString x y) =+    fromChoiceString wrap x <> fromChoiceString wrap y+fromChoiceString _ EmptyChoiceString = mempty++withWrap :: Bool -> Text -> Doc Text+withWrap wrap+  | wrap = mconcat . toChunks+  | otherwise = literal++toChunks :: Text -> [Doc Text]+toChunks = map toDoc . T.groupBy sameStatus+  where+   toDoc t+     | t == " " = space+     | t == "\n" = cr+     | otherwise         = literal t+   sameStatus c d =+     (c == ' ' && d == ' ') ||+     (c == '\n' && d == '\n') ||+     (c /= ' ' && d /= ' ' && c /= '\n' && d /= '\n')+++-- | Escape predefined XML entities in a text value+--+escapeMarkupEntities :: Text     -- ^ Text to escape+                     -> Text -- ^ Resulting Doc+escapeMarkupEntities = T.concatMap escape+  where+    escape :: Char -> Text+    escape '<'  = "&lt;"+    escape '>'  = "&gt;"+    escape '&'  = "&amp;"+    escape '"'  = "&quot;"+    escape '\'' = "&#39;"+    escape x    = T.singleton x
src/Text/Pandoc/Writers/CommonMark.hs view
@@ -1,6 +1,6 @@ {- |    Module      : Text.Pandoc.Writers.CommonMark-   Copyright   : Copyright (C) 2015-2021 John MacFarlane+   Copyright   : Copyright (C) 2015-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Writers/ConTeXt.hs view
@@ -3,7 +3,7 @@ {-# LANGUAGE ViewPatterns        #-} {- |    Module      : Text.Pandoc.Writers.ConTeXt-   Copyright   : Copyright (C) 2007-2021 John MacFarlane+   Copyright   : Copyright (C) 2007-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Writers/CslJson.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Writers.CslJson-   Copyright   : Copyright (C) 2020-2021 John MacFarlane+   Copyright   : Copyright (C) 2020-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Writers/Custom.hs view
@@ -5,7 +5,7 @@ {-# LANGUAGE TypeApplications    #-} {- |    Module      : Text.Pandoc.Writers.Custom-   Copyright   : Copyright (C) 2012-2021 John MacFarlane+   Copyright   : Copyright (C) 2012-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>@@ -16,20 +16,23 @@ a Lua writer. -} module Text.Pandoc.Writers.Custom ( writeCustom ) where+import Control.Applicative (optional) import Control.Arrow ((***)) import Control.Exception import Control.Monad (when) import Data.List (intersperse) import qualified Data.Map as M+import Data.Maybe (fromMaybe) import qualified Data.Text as T import Data.Text (Text, pack) import HsLua as Lua hiding (Operation (Div), render) import HsLua.Class.Peekable (PeekError) import Text.DocLayout (render, literal)+import Text.DocTemplates (Context) import Control.Monad.IO.Class (MonadIO) import Text.Pandoc.Definition import Text.Pandoc.Lua (Global (..), runLua, setGlobals)-import Text.Pandoc.Lua.Util (addField, dofileWithTraceback)+import Text.Pandoc.Lua.Util (addField, dofileWithTraceback, peekViaJSON) import Text.Pandoc.Options import Text.Pandoc.Class (PandocMonad) import Text.Pandoc.Templates (renderTemplate)@@ -89,6 +92,7 @@ writeCustom luaFile opts doc@(Pandoc meta _) = do   let globals = [ PANDOC_DOCUMENT doc                 , PANDOC_SCRIPT_FILE luaFile+                , PANDOC_WRITER_OPTIONS opts                 ]   res <- runLua $ do     setGlobals globals@@ -97,12 +101,12 @@     -- to handle this more gracefully):     when (stat /= Lua.OK)       Lua.throwErrorAsException-    rendered <- docToCustom opts doc-    context <- metaToContext opts-               (fmap (literal . pack) . blockListToCustom)-               (fmap (literal . pack) . inlineListToCustom)-               meta-    return (pack rendered, context)+    (rendered, context) <- docToCustom opts doc+    metaContext <- metaToContext opts+                   (fmap (literal . pack) . blockListToCustom)+                   (fmap (literal . pack) . inlineListToCustom)+                   meta+    return (pack rendered, context <> metaContext)   case res of     Left msg -> throw msg     Right (body, context) -> return $@@ -112,10 +116,19 @@                     renderTemplate tpl $ setField "body" body context  docToCustom :: forall e. PeekError e-            => WriterOptions -> Pandoc -> LuaE e String+            => WriterOptions -> Pandoc -> LuaE e (String, Context Text) docToCustom opts (Pandoc (Meta metamap) blocks) = do   body <- blockListToCustom blocks-  invoke @e "Doc" body (fmap (Stringify @e) metamap) (writerVariables opts)+  -- invoke doesn't work with multiple return values, so we have to call+  -- `Doc` manually.+  Lua.getglobal "Doc"                 -- function+  push body                           -- argument 1+  push (fmap (Stringify @e) metamap)  -- argument 2+  push (writerVariables opts)         -- argument 3+  call 3 2+  rendered  <- peek (nth 2)           -- first return value+  context <- forcePeek . optional $ peekViaJSON top  -- snd return value+  return (rendered, fromMaybe mempty context)  -- | Convert Pandoc block element to Custom. blockToCustom :: forall e. PeekError e
src/Text/Pandoc/Writers/Docbook.hs view
@@ -2,7 +2,7 @@ {-# LANGUAGE PatternGuards     #-} {- |    Module      : Text.Pandoc.Writers.Docbook-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Writers/Docx.hs view
@@ -7,7 +7,7 @@ {-# LANGUAGE OverloadedStrings   #-} {- |    Module      : Text.Pandoc.Writers.Docx-   Copyright   : Copyright (C) 2012-2021 John MacFarlane+   Copyright   : Copyright (C) 2012-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>@@ -965,8 +965,7 @@                   => WriterOptions                   -> Int -> [Block]                   -> WS m [Content]-listItemToOpenXML _ _ []                  = return []-listItemToOpenXML opts numid (first:rest) = do+listItemToOpenXML opts numid bs = do   oldInList <- gets stInList   modify $ \st -> st{ stInList = True }   let isListBlock = \case@@ -975,14 +974,15 @@         _             -> False   -- Prepend an empty string if the first entry is another   -- list. Otherwise the outer bullet will disappear.-  let (first', rest') = if isListBlock first-                           then (Plain [Str ""] , first:rest)-                           else (first, rest)-  first'' <- withNumId numid $ blockToOpenXML opts first'-  -- baseListId is the code for no list marker:-  rest''  <- withNumId baseListId $ blocksToOpenXML opts rest'+  let bs' = case bs of+                 [] -> []+                 first:rest -> if isListBlock first+                               then Plain [Str ""]:first:rest+                               else first:rest+  modify $ \st -> st{ stNumIdUsed = False }+  contents <- withNumId numid $ blocksToOpenXML opts bs'   modify $ \st -> st{ stInList = oldInList }-  return $ first'' ++ rest''+  return contents  -- | Convert a list of inline elements to OpenXML. inlinesToOpenXML :: PandocMonad m => WriterOptions -> [Inline] -> WS m [Content]@@ -1015,9 +1015,14 @@   props <- asks envParaProperties   listLevel <- asks envListLevel   numid <- asks envListNumId+  numIdUsed <- gets stNumIdUsed+  -- clear numId after first use to support multiple paragraphs in the same bullet+  -- baseListId is the code for no list marker+  let numid' = if numIdUsed then baseListId else numid+  modify $ \st -> st{ stNumIdUsed = True }   let listPr = [mknode "w:numPr" []                 [ mknode "w:ilvl" [("w:val",tshow listLevel)] ()-                , mknode "w:numId" [("w:val",tshow numid)] () ] | listLevel >= 0 && not displayMathPara]+                , mknode "w:numId" [("w:val",tshow numid')] () ] | listLevel >= 0 && not displayMathPara]   return $ case listPr ++ squashProps props of                 [] -> []                 ps -> [mknode "w:pPr" [] ps]
src/Text/Pandoc/Writers/Docx/StyleMap.hs view
@@ -2,7 +2,7 @@ {- |    Module : Text.Pandoc.Writers.Docx.StyleMap    Copyright   : © 2014-2020 Jesse Rosenthal <jrosenthal@jhu.edu>,-                   2014-2021 John MacFarlane <jgm@berkeley.edu>,+                   2014-2022 John MacFarlane <jgm@berkeley.edu>,                    2015-2019 Nikolay Yakimov <root@livid.pp.ru>    License     : GNU GPL, version 2 or above 
src/Text/Pandoc/Writers/Docx/Table.hs view
@@ -3,7 +3,7 @@ {-# LANGUAGE ScopedTypeVariables #-} {- | Module      : Text.Pandoc.Writers.Docx.Table-Copyright   : Copyright (C) 2012-2021 John MacFarlane+Copyright   : Copyright (C) 2012-2022 John MacFarlane License     : GNU GPL, version 2 or above Maintainer  : John MacFarlane <jgm@berkeley.edu> 
src/Text/Pandoc/Writers/Docx/Types.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings   #-} {- | Module      : Text.Pandoc.Writers.Docx-Copyright   : Copyright (C) 2012-2021 John MacFarlane+Copyright   : Copyright (C) 2012-2022 John MacFarlane License     : GNU GPL, version 2 or above Maintainer  : John MacFarlane <jgm@berkeley.edu> @@ -111,6 +111,8 @@        , stDelId          :: Int        , stStyleMaps      :: StyleMaps        , stFirstPara      :: Bool+       , stNumIdUsed      :: Bool  -- ^ True if the current numId (envListNumId) has been used.+                                   --   Should only be used once, for the first paragraph.        , stInTable        :: Bool        , stInList         :: Bool        , stTocTitle       :: [Inline]@@ -133,6 +135,7 @@       , stDelId          = 1       , stStyleMaps      = StyleMaps M.empty M.empty       , stFirstPara      = False+      , stNumIdUsed      = False       , stInTable        = False       , stInList         = False       , stTocTitle       = [Str "Table of Contents"]
src/Text/Pandoc/Writers/DokuWiki.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Writers.DokuWiki-   Copyright   : Copyright (C) 2008-2021 John MacFarlane+   Copyright   : Copyright (C) 2008-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : Clare Macrae <clare.macrae@googlemail.com>
src/Text/Pandoc/Writers/EPUB.hs view
@@ -5,7 +5,7 @@ {-# LANGUAGE ScopedTypeVariables #-} {- |    Module      : Text.Pandoc.Writers.EPUB-   Copyright   : Copyright (C) 2010-2021 John MacFarlane+   Copyright   : Copyright (C) 2010-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Writers/FB2.hs view
@@ -3,7 +3,7 @@ {- | Module      : Text.Pandoc.Writers.FB2 Copyright   : Copyright (C) 2011-2012 Sergey Astanin-                            2012-2021 John MacFarlane+                            2012-2022 John MacFarlane License     : GNU GPL, version 2 or above  Maintainer  : John MacFarlane
src/Text/Pandoc/Writers/GridTable.hs view
@@ -5,7 +5,7 @@  {- | Module      : Text.Pandoc.Writers.GridTable-Copyright   : © 2020-2021 Albert Krewinkel+Copyright   : © 2020-2022 Albert Krewinkel License     : GNU GPL, version 2 or above  Maintainer  : Albert Krewinkel <albert@zeitkraut.de>
src/Text/Pandoc/Writers/HTML.hs view
@@ -6,7 +6,7 @@ {-# LANGUAGE ViewPatterns        #-} {- |    Module      : Text.Pandoc.Writers.HTML-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>@@ -39,10 +39,11 @@ import qualified Data.Text.Lazy as TL import Network.URI (URI (..), parseURIReference) import Numeric (showHex)-import Text.DocLayout (render, literal)+import Text.DocLayout (render, literal, Doc) import Text.Blaze.Internal (MarkupM (Empty), customLeaf, customParent) import Text.DocTemplates (FromContext (lookupContext), Context (..)) import Text.Blaze.Html hiding (contents)+import Text.Pandoc.Translations (Term(Abstract)) import Text.Pandoc.Definition import Text.Pandoc.Highlighting (formatHtmlBlock, formatHtmlInline, highlight,                                  styleToCss)@@ -65,11 +66,13 @@ import Text.Blaze.Html.Renderer.Text (renderHtml) import qualified Text.Blaze.XHtml1.Transitional as H import qualified Text.Blaze.XHtml1.Transitional.Attributes as A-import Text.Pandoc.Class.PandocMonad (PandocMonad, report)+import Text.Pandoc.Class.PandocMonad (PandocMonad, report,+                                      translateTerm) import Text.Pandoc.Class.PandocPure (runPure) import Text.Pandoc.Error import Text.Pandoc.Logging import Text.Pandoc.MIME (mediaCategory)+import Text.Pandoc.Writers.Blaze (layoutMarkup) import Text.TeXMath import Text.XML.Light (elChildren, unode, unqual) import qualified Text.XML.Light as XML@@ -131,10 +134,8 @@ needsVariationSelector _   = False  -- | Hard linebreak.-nl :: WriterOptions -> Html-nl opts = if writerWrapText opts == WrapNone-             then mempty-             else preEscapedString "\n"+nl :: Html+nl = preEscapedString "\n"  -- | Convert Pandoc document to Html 5 string. writeHtml5String :: PandocMonad m => WriterOptions -> Pandoc -> m Text@@ -160,7 +161,8 @@                        -> m Text writeHtmlStringForEPUB version o = writeHtmlString'                       defaultWriterState{ stHtml5 = version == EPUB3,-                                          stEPUBVersion = Just version } o+                                          stEPUBVersion = Just version }+                      o{ writerWrapText = WrapNone }  -- | Convert Pandoc document to Reveal JS HTML slide show. writeRevealJs :: PandocMonad m@@ -207,17 +209,23 @@                  => WriterState -> WriterOptions -> Pandoc -> m Text writeHtmlString' st opts d = do   (body, context) <- evalStateT (pandocToHtml opts d) st+  let colwidth = case writerWrapText opts of+                    WrapAuto -> Just (writerColumns opts)+                    _ -> Nothing   (if writerPreferAscii opts       then toEntities       else id) <$>     case writerTemplate opts of-       Nothing -> return $ renderHtml' body+       Nothing -> return $+         case colwidth of+           Nothing -> renderHtml' body  -- optimization, skip layout+           Just cols -> render (Just cols) $ layoutMarkup body        Just tpl -> do          -- warn if empty lang          when (isNothing (getField "lang" context :: Maybe Text)) $            report NoLangSpecified          -- check for empty pagetitle-         context' <-+         (context' :: Context Text) <-             case getField "pagetitle" context of                  Just (s :: Text) | not (T.null s) -> return context                  _ -> do@@ -228,9 +236,9 @@                            Just []    -> "Untitled"                            Just (x:_) -> takeBaseName $ T.unpack x                    report $ NoTitleElement fallback-                   return $ resetField "pagetitle" fallback context-         return $ render Nothing $ renderTemplate tpl-             (defField "body" (renderHtml' body) context')+                   return $ resetField "pagetitle" (literal fallback) context+         return $ render colwidth $ renderTemplate tpl+             (defField "body" (layoutMarkup body) context')  writeHtml' :: PandocMonad m => WriterState -> WriterOptions -> Pandoc -> m Html writeHtml' st opts d =@@ -252,22 +260,23 @@   let slideLevel = fromMaybe (getSlideLevel blocks) $ writerSlideLevel opts   modify $ \st -> st{ stSlideLevel = slideLevel }   metadata <- metaToContext opts-              (fmap (literal . renderHtml') . blockListToHtml opts)-              (fmap (literal . renderHtml') . inlineListToHtml opts)+              (fmap layoutMarkup . blockListToHtml opts)+              (fmap layoutMarkup . inlineListToHtml opts)               meta   let stringifyHTML = escapeStringForXML . stringify-  let authsMeta = map stringifyHTML $ docAuthors meta+  let authsMeta = map (literal . stringifyHTML) $ docAuthors meta   let dateMeta  = stringifyHTML $ docDate meta-  let descriptionMeta = escapeStringForXML $+  let descriptionMeta = literal $ escapeStringForXML $                           lookupMetaString "description" meta   slideVariant <- gets stSlideVariant+  abstractTitle <- translateTerm Abstract   let sects = adjustNumbers opts $               makeSections (writerNumberSections opts) Nothing $               if slideVariant == NoSlides                  then blocks                  else prepSlides slideLevel blocks   toc <- if writerTableOfContents opts && slideVariant /= S5Slides-            then fmap renderHtml' <$> tableOfContents opts sects+            then fmap layoutMarkup <$> tableOfContents opts sects             else return Nothing   blocks' <- blockListToHtml opts sects   notes <- do@@ -276,12 +285,12 @@     if null (stNotes st)       then return mempty       else do-        notes <- footnoteSection opts EndOfDocument (stEmittedNotes st + 1) (reverse (stNotes st))+        notes <- footnoteSection EndOfDocument (stEmittedNotes st + 1) (reverse (stNotes st))         modify (\st' -> st'{ stNotes = mempty, stEmittedNotes = stEmittedNotes st' + length (stNotes st') })         return notes   st <- get   let thebody = blocks' >> notes-  let math = case writerHTMLMathMethod opts of+  let math = layoutMarkup $ case writerHTMLMathMethod opts of         MathJax url           | slideVariant /= RevealJsSlides ->           -- mathjax is handled via a special plugin in revealjs@@ -294,11 +303,12 @@                             _ -> mempty         KaTeX url -> do           H.script !+            A.defer mempty !             A.src (toValue $ url <> "katex.min.js") $ mempty-          nl opts+          nl           let katexFlushLeft =                 case lookupContext "classoption" metadata of-                  Just clsops | "fleqn" `elem` (clsops :: [Text]) -> "true"+                  Just clsops | "fleqn" `elem` (clsops :: [Doc Text]) -> "true"                   _ -> "false"           H.script $ text $ T.unlines [               "document.addEventListener(\"DOMContentLoaded\", function () {"@@ -315,7 +325,7 @@             , "   });"             , "}}});"             ]-          nl opts+          nl           H.link ! A.rel "stylesheet" !             A.href (toValue $ url <> "katex.min.css") @@ -324,15 +334,16 @@                     Just s | not (stHtml5 st) ->                       H.script ! A.type_ "text/javascript"                         $ preEscapedString-                          ("/*<![CDATA[*/\n" ++ T.unpack s +++                          ("/*<![CDATA[*/\n" <> T.unpack s <>                           "/*]]>*/\n")                           | otherwise -> mempty                     Nothing -> mempty   let mCss :: Maybe [Text] = lookupContext "css" metadata-  let context =   (if stHighlighting st+  let context :: Context Text+      context =   (if stHighlighting st                       then case writerHighlightStyle opts of                                 Just sty -> defField "highlighting-css"-                                              (T.pack $ styleToCss sty)+                                            (literal $ T.pack $ styleToCss sty)                                 Nothing  -> id                       else id) .                   (if stCsl st@@ -342,15 +353,16 @@                               Just 0  -> id                               Just n  ->                                 defField "csl-entry-spacing"-                                  (tshow n <> "em"))+                                  (literal $ tshow n <> "em"))                       else id) .                   (if stMath st-                      then defField "math" (renderHtml' math)+                      then defField "math" math                       else id) .+                  defField "abstract-title" abstractTitle .                   (case writerHTMLMathMethod opts of                         MathJax u -> defField "mathjax" True .                                      defField "mathjaxurl"-                                       (T.takeWhile (/='?') u)+                                       (literal $ T.takeWhile (/='?') u)                         _         -> defField "mathjax" False) .                   (case writerHTMLMathMethod opts of                         PlainMath -> defField "displaymath-css" True@@ -361,11 +373,12 @@                            -- template can't distinguish False/undefined                          defField "controls" True .                          defField "controlsTutorial" True .-                         defField "controlsLayout" ("bottom-right" :: Text) .-                         defField "controlsBackArrows" ("faded" :: Text) .+                         defField "controlsLayout"+                           ("bottom-right" :: Doc Text) .+                         defField "controlsBackArrows" ("faded" :: Doc Text) .                          defField "progress" True .                          defField "slideNumber" False .-                         defField "showSlideNumber" ("all" :: Text) .+                         defField "showSlideNumber" ("all" :: Doc Text) .                          defField "hashOneBasedIndex" False .                          defField "hash" True .                          defField "respondToHashChanges" True .@@ -377,7 +390,7 @@                          defField "touch" True .                          defField "loop" False .                          defField "rtl" False .-                         defField "navigationMode" ("default" :: Text) .+                         defField "navigationMode" ("default" :: Doc Text) .                          defField "shuffle" False .                          defField "fragments" True .                          defField "fragmentInURL" True .@@ -385,22 +398,22 @@                          defField "help" True .                          defField "pause" True .                          defField "showNotes" False .-                         defField "autoPlayMedia" ("null" :: Text) .-                         defField "preloadIframes" ("null" :: Text) .-                         defField "autoSlide" ("0" :: Text) .+                         defField "autoPlayMedia" ("null" :: Doc Text) .+                         defField "preloadIframes" ("null" :: Doc Text) .+                         defField "autoSlide" ("0" :: Doc Text) .                          defField "autoSlideStoppable" True .-                         defField "autoSlideMethod" ("null" :: Text) .-                         defField "defaultTiming" ("null" :: Text) .+                         defField "autoSlideMethod" ("null" :: Doc Text) .+                         defField "defaultTiming" ("null" :: Doc Text) .                          defField "mouseWheel" False .-                         defField "display" ("block" :: Text) .+                         defField "display" ("block" :: Doc Text) .                          defField "hideInactiveCursor" True .-                         defField "hideCursorTime" ("5000" :: Text) .+                         defField "hideCursorTime" ("5000" :: Doc Text) .                          defField "previewLinks" False .-                         defField "transition" ("slide" :: Text) .-                         defField "transitionSpeed" ("default" :: Text) .-                         defField "backgroundTransition" ("fade" :: Text) .-                         defField "viewDistance" ("3" :: Text) .-                         defField "mobileViewDistance" ("2" :: Text)+                         defField "transition" ("slide" :: Doc Text) .+                         defField "transitionSpeed" ("default" :: Doc Text) .+                         defField "backgroundTransition" ("fade" :: Doc Text) .+                         defField "viewDistance" ("3" :: Doc Text) .+                         defField "mobileViewDistance" ("2" :: Doc Text)                       else id) .                   defField "document-css" (isNothing mCss && slideVariant == NoSlides) .                   defField "quotes" (stQuotes st) .@@ -410,18 +423,18 @@                   maybe id (defField "toc") toc .                   maybe id (defField "table-of-contents") toc .                   defField "author-meta" authsMeta .-                  maybe id (defField "date-meta")+                  maybe id (defField "date-meta" . literal)                     (normalizeDate dateMeta) .                   defField "description-meta" descriptionMeta .                   defField "pagetitle"-                      (stringifyHTML . docTitle $ meta) .-                  defField "idprefix" (writerIdentifierPrefix opts) .+                      (literal . stringifyHTML . docTitle $ meta) .+                  defField "idprefix" (literal $ writerIdentifierPrefix opts) .                   -- these should maybe be set in pandoc.hs                   defField "slidy-url"-                    ("https://www.w3.org/Talks/Tools/Slidy2" :: Text) .-                  defField "slideous-url" ("slideous" :: Text) .-                  defField "revealjs-url" ("https://unpkg.com/reveal.js@^4/" :: Text) $-                  defField "s5-url" ("s5/default" :: Text) .+                    ("https://www.w3.org/Talks/Tools/Slidy2" :: Doc Text) .+                  defField "slideous-url" ("slideous" :: Doc Text) .+                  defField "revealjs-url" ("https://unpkg.com/reveal.js@^4/" :: Doc Text) $+                  defField "s5-url" ("s5/default" :: Doc Text) .                   defField "html5" (stHtml5 st) $                   metadata   return (thebody, context)@@ -449,15 +462,15 @@  unordList :: PandocMonad m           => WriterOptions -> [Html] -> StateT WriterState m Html-unordList opts = toList H.ul opts . toListItems opts+unordList opts = toList H.ul opts . toListItems  ordList :: PandocMonad m         => WriterOptions -> [Html] -> StateT WriterState m Html-ordList opts = toList H.ol opts . toListItems opts+ordList opts = toList H.ol opts . toListItems  defList :: PandocMonad m         => WriterOptions -> [Html] -> StateT WriterState m Html-defList opts items = toList H.dl opts (items ++ [nl opts])+defList opts items = toList H.dl opts (items ++ [nl])  isTaskListItem :: [Block] -> Bool isTaskListItem (Plain (Str "☐":Space:_):_) = True@@ -479,7 +492,7 @@       let checkbox  = if checked                       then checkbox' ! A.checked ""                       else checkbox'-          checkbox' = H.input ! A.type_ "checkbox" ! A.disabled "" >> nl opts+          checkbox' = H.input ! A.type_ "checkbox" ! A.disabled "" >> nl       isContents <- inlineListToHtml opts is       bsContents <- blockListToHtml opts bs       return $ constr (checkbox >> isContents) >> bsContents@@ -503,11 +516,13 @@ -- | Convert list of Note blocks to a footnote <div>. -- Assumes notes are sorted. footnoteSection ::-  PandocMonad m => WriterOptions -> ReferenceLocation -> Int -> [Html] -> StateT WriterState m Html-footnoteSection opts refLocation startCounter notes = do+  PandocMonad m => ReferenceLocation -> Int -> [Html] -> StateT WriterState m Html+footnoteSection refLocation startCounter notes = do   html5 <- gets stHtml5   slideVariant <- gets stSlideVariant-  let hrtag = if refLocation /= EndOfBlock then (if html5 then H5.hr else H.hr) else mempty+  let hrtag = if refLocation /= EndOfBlock+                 then (if html5 then H5.hr else H.hr) <> nl+                 else mempty   let additionalClassName = case refLocation of         EndOfBlock -> "footnotes-end-of-block"         EndOfDocument -> "footnotes-end-of-document"@@ -528,17 +543,17 @@     if null notes        then mempty        else do-         nl opts+         nl          container $ do-           nl opts+           nl            hrtag-           nl opts            -- Keep the previous output exactly the same if we don't            -- have multiple notes sections            if startCounter == 1-             then H.ol $ mconcat notes >> nl opts-             else H.ol ! A.start (fromString (show startCounter)) $ mconcat notes >> nl opts-           nl opts+             then H.ol $ mconcat notes >> nl+             else H.ol ! A.start (fromString (show startCounter)) $+                         mconcat notes >> nl+           nl  -- | Parse a mailto link; return Just (name, domain) or Nothing. parseMailto :: Text -> Maybe (Text, Text)@@ -705,12 +720,11 @@   img <- inlineToHtml opts (Image attr alt (s,tit))   capt <- if null txt              then return mempty-             else tocapt `fmap` inlineListToHtml opts txt+             else (nl <>) . tocapt <$> inlineListToHtml opts txt+  let inner = mconcat [nl, img, capt, nl]   return $ if html5-              then H5.figure $ mconcat-                    [nl opts, img, capt, nl opts]-              else H.div ! A.class_ "figure" $ mconcat-                    [nl opts, img, nl opts, capt, nl opts]+              then H5.figure inner+              else H.div ! A.class_ "figure" $ inner   adjustNumbers :: WriterOptions -> [Block] -> [Block]@@ -734,7 +748,7 @@ blockToHtmlInner _ Null = return mempty blockToHtmlInner opts (Plain lst) = inlineListToHtml opts lst blockToHtmlInner opts (Para [Image attr@(_,classes,_) txt (src,tit)])-  | "stretch" `elem` classes = do+  | "r-stretch" `elem` classes = do   slideVariant <- gets stSlideVariant   case slideVariant of        RevealJsSlides ->@@ -806,37 +820,39 @@                   ["section" | (slide || writerSectionDivs opts) &&                                not html5 ] ++                   ["level" <> tshow level | slide || writerSectionDivs opts ]-                  <> dclasses+                  <> [d | d <- dclasses,+                               slideVariant /= RevealJsSlides ||+                               d /= "r-fit-text"] -- see #5965   let attr = (ident, classes', dkvs)   if titleSlide      then do        t <- addAttrs opts attr $-             secttag $ nl opts <> header' <> nl opts <> titleContents <> nl opts+             secttag $ nl <> header' <> nl <> titleContents <> nl        -- ensure 2D nesting for revealjs, but only for one level;        -- revealjs doesn't like more than one level of nesting        return $          if slideVariant == RevealJsSlides && not inSection &&               not (null innerSecs)-            then H5.section (nl opts <> t <> nl opts <> innerContents)-            else t <> nl opts <> if null innerSecs+            then H5.section (nl <> t <> nl <> innerContents)+            else t <> nl <> if null innerSecs                                     then mempty-                                    else innerContents <> nl opts+                                    else innerContents <> nl      else if writerSectionDivs opts || slide ||               (hident /= ident && not (T.null hident || T.null ident)) ||               (hclasses /= dclasses) || (hkvs /= dkvs)           then addAttrs opts attr                $ secttag-               $ nl opts <> header' <> nl opts <>+               $ nl <> header' <> nl <>                  if null innerSecs                     then mempty-                    else innerContents <> nl opts+                    else innerContents <> nl           else do             let attr' = (ident, classes' \\ hclasses, dkvs \\ hkvs)             t <- addAttrs opts attr' header'             return $ t <>                      if null innerSecs                         then mempty-                        else nl opts <> innerContents+                        else nl <> innerContents blockToHtmlInner opts (Div attr@(ident, classes, kvs') bs) = do   html5 <- gets stHtml5   slideVariant <- gets stSlideVariant@@ -874,7 +890,7 @@                       -- off widths! see #4028                       mconcat <$> mapM (blockToHtml opts) bs'                  else blockListToHtml opts' bs'-  let contents' = nl opts >> contents >> nl opts+  let contents' = nl >> contents >> nl   let (divtag, classes'') = if html5 && "section" `elem` classes'                             then (H5.section, filter (/= "section") classes')                             else (H.div, classes')@@ -955,10 +971,10 @@                                   (DefinitionList lst)              _                 -> do contents <- blockListToHtml opts blocks                                      return $ H.blockquote-                                            $ nl opts >> contents >> nl opts+                                            $ nl >> contents >> nl      else do        contents <- blockListToHtml opts blocks-       return $ H.blockquote $ nl opts >> contents >> nl opts+       return $ H.blockquote $ nl >> contents >> nl blockToHtmlInner opts (Header level (ident,classes,kvs) lst) = do   contents <- inlineListToHtml opts lst   let secnum = fromMaybe mempty $ lookup "number" kvs@@ -1013,10 +1029,10 @@ blockToHtmlInner opts (DefinitionList lst) = do   contents <- mapM (\(term, defs) ->                   do term' <- liftM H.dt $ inlineListToHtml opts term-                     defs' <- mapM (liftM (\x -> H.dd (x >> nl opts)) .+                     defs' <- mapM (liftM (\x -> H.dd (nl >> x >> nl)) .                                     blockListToHtml opts) defs-                     return $ mconcat $ nl opts : term' : nl opts :-                                        intersperse (nl opts) defs') lst+                     return $ mconcat $ nl : term' : nl :+                                        intersperse (nl) defs') lst   defList opts contents blockToHtmlInner opts (Table attr caption colspecs thead tbody tfoot) =   tableToHtml opts (Ann.toTable attr caption colspecs thead tbody tfoot)@@ -1043,7 +1059,7 @@     then do       notes <- if null (stNotes st)         then return mempty-        else footnoteSection opts (writerReferenceLocation opts) (stEmittedNotes st + 1) (reverse (stNotes st))+        else footnoteSection (writerReferenceLocation opts) (stEmittedNotes st + 1) (reverse (stNotes st))       modify (\st' -> st'{ stNotes = mempty, stEmittedNotes = stEmittedNotes st' + length (stNotes st') })       return (doc <> notes)     else return doc@@ -1062,10 +1078,10 @@       cs <- blockListToHtml opts longCapt       return $ do         H.caption cs-        nl opts-  coltags <- colSpecListToHtml opts colspecs+        nl+  coltags <- colSpecListToHtml colspecs   head' <- tableHeadToHtml opts thead-  bodies <- intersperse (nl opts) <$> mapM (tableBodyToHtml opts) tbodies+  bodies <- intersperse (nl) <$> mapM (tableBodyToHtml opts) tbodies   foot' <- tableFootToHtml opts tfoot   let (ident,classes,kvs) = attr   -- When widths of columns are < 100%, we need to set width for the whole@@ -1082,13 +1098,13 @@                          <> "%;"):kvs)                 _ -> attr   addAttrs opts attr' $ H.table $ do-    nl opts+    nl     captionDoc     coltags     head'     mconcat bodies     foot'-    nl opts+    nl  tableBodyToHtml :: PandocMonad m                 => WriterOptions@@ -1135,7 +1151,7 @@     tablePartElement <- addAttrs opts attr $ tag' contents     return $ do       tablePartElement-      nl opts+      nl   where     isEmptyRow (Ann.HeaderRow _attr _rownum cells) = all isEmptyCell cells     isEmptyCell (Ann.Cell _colspecs _colnum cell) =@@ -1176,14 +1192,13 @@               -> [TableRow]               -> StateT WriterState m Html rowListToHtml opts rows =-  (\x -> nl opts *> mconcat x) <$>+  (\x -> nl *> mconcat x) <$>      mapM (tableRowToHtml opts) rows  colSpecListToHtml :: PandocMonad m-                  => WriterOptions-                  -> [ColSpec]+                  => [ColSpec]                   -> StateT WriterState m Html-colSpecListToHtml opts colspecs = do+colSpecListToHtml colspecs = do   html5 <- gets stHtml5   let hasDefaultWidth (_, ColWidthDefault) = True       hasDefaultWidth _                    = False@@ -1197,16 +1212,16 @@           ColWidth w -> if html5                         then A.style (toValue $ "width: " <> percent w)                         else A.width (toValue $ percent w)-        nl opts+        nl    return $     if all hasDefaultWidth colspecs     then mempty     else do       H.colgroup $ do-        nl opts+        nl         mapM_ (col . snd) colspecs-      nl opts+      nl  tableRowToHtml :: PandocMonad m                => WriterOptions@@ -1225,12 +1240,12 @@   headcells <- mapM (cellToHtml opts HeaderCell) rowhead   bodycells <- mapM (cellToHtml opts celltype) rowbody   rowHtml <- addAttrs opts attr' $ H.tr $ do-    nl opts+    nl     mconcat headcells     mconcat bodycells   return $ do     rowHtml-    nl opts+    nl  alignmentToString :: Alignment -> Maybe Text alignmentToString = \case@@ -1288,18 +1303,18 @@               : otherAttribs   return $ do     tag' ! attribs $ contents-    nl opts+    nl -toListItems :: WriterOptions -> [Html] -> [Html]-toListItems opts items = map (toListItem opts) items ++ [nl opts]+toListItems :: [Html] -> [Html]+toListItems items = map toListItem items ++ [nl] -toListItem :: WriterOptions -> Html -> Html-toListItem opts item = nl opts *> H.li item+toListItem :: Html -> Html+toListItem item = nl *> H.li item  blockListToHtml :: PandocMonad m                 => WriterOptions -> [Block] -> StateT WriterState m Html blockListToHtml opts lst =-  mconcat . intersperse (nl opts) . filter nonempty+  mconcat . intersperse (nl) . filter nonempty     <$> mapM (blockToHtml opts) lst   where nonempty (Empty _) = False         nonempty _         = True@@ -1331,9 +1346,9 @@     (Str str)      -> return $ strToHtml str     Space          -> return $ strToHtml " "     SoftBreak      -> return $ case writerWrapText opts of-                                     WrapNone     -> preEscapedText " "-                                     WrapAuto     -> preEscapedText " "-                                     WrapPreserve -> preEscapedText "\n"+                                     WrapNone     -> " "+                                     WrapAuto     -> " "+                                     WrapPreserve -> nl     LineBreak      -> return $ do                         if html5 then H5.br else H.br                         strToHtml "\n"@@ -1579,8 +1594,9 @@                     else let lastBlock   = last blocks                              otherBlocks = init blocks                          in  case lastBlock of-                                  Para [Image _ _ (_,tit)]+                                  Para [Image (_,cls,_) _ (_,tit)]                                       | "fig:" `T.isPrefixOf` tit+                                        || "r-stretch" `elem` cls                                             -> otherBlocks ++ [lastBlock,                                                   Plain backlink]                                   Para lst  -> otherBlocks ++@@ -1598,7 +1614,7 @@                        _ | html5  -> noteItem !                                        customAttribute "role" "doc-endnote"                        _          -> noteItem-  return $ nl opts >> noteItem'+  return $ nl >> noteItem'  inDiv :: PandocMonad m=> Text -> Html -> StateT WriterState m Html inDiv cls x = do
src/Text/Pandoc/Writers/Ipynb.hs view
@@ -2,7 +2,7 @@ {-# LANGUAGE ScopedTypeVariables #-} {- |    Module      : Text.Pandoc.Writers.Ipynb-   Copyright   : Copyright (C) 2019-2021 John MacFarlane+   Copyright   : Copyright (C) 2019-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>@@ -37,6 +37,8 @@ import Data.Aeson.Encode.Pretty (Config(..), defConfig,            encodePretty', keyOrder, Indent(Spaces)) import Text.DocLayout (literal)+import Text.Pandoc.UUID (getRandomUUID)+import Data.Char (isAscii, isAlphaNum)  writeIpynb :: PandocMonad m => WriterOptions -> Pandoc -> m Text writeIpynb opts d = do@@ -49,7 +51,7 @@                  "cell_type", "output_type",                  "execution_count", "metadata",                  "outputs", "source",-                 "data", "name", "text" ] }+                 "data", "name", "text" ] <> compare }          $ notebook  pandocToNotebook :: PandocMonad m@@ -79,7 +81,7 @@   let metadata = case fromJSON metadata' of                    Error _ -> mempty -- TODO warning here? shouldn't happen                    Success x -> x-  cells <- extractCells opts blocks+  cells <- extractCells nbformat opts blocks   return $ Notebook{        notebookMetadata = metadata      , notebookFormat = nbformat@@ -97,23 +99,26 @@   return $ Image attr lab ("attachment:" <> src, tit) addAttachment x = return x -extractCells :: PandocMonad m => WriterOptions -> [Block] -> m [Ipynb.Cell a]-extractCells _ [] = return []-extractCells opts (Div (_id,classes,kvs) xs : bs)+extractCells :: PandocMonad m+             => (Int, Int) -> WriterOptions -> [Block] -> m [Ipynb.Cell a]+extractCells _ _ [] = return []+extractCells nbformat opts (Div (ident,classes,kvs) xs : bs)   | "cell" `elem` classes   , "markdown" `elem` classes = do       let meta = pairsToJSONMeta kvs       (newdoc, attachments) <-         runStateT (walkM addAttachment (Pandoc nullMeta xs)) mempty       source <- writeMarkdown opts{ writerTemplate = Nothing } newdoc+      uuid <- uuidFrom nbformat ident       (Ipynb.Cell{           cellType = Markdown+        , cellId = uuid         , cellSource = Source $ breakLines $ T.stripEnd source         , cellMetadata = meta         , cellAttachments = if M.null attachments                                then Nothing-                               else Just attachments } :)-            <$> extractCells opts bs+                               else Just $ MimeAttachments attachments } :)+            <$> extractCells nbformat opts bs   | "cell" `elem` classes   , "code" `elem` classes = do       let (codeContent, rest) =@@ -123,14 +128,16 @@       let meta = pairsToJSONMeta kvs       outputs <- catMaybes <$> mapM blockToOutput rest       let exeCount = lookup "execution_count" kvs >>= safeRead+      uuid <- uuidFrom nbformat ident       (Ipynb.Cell{           cellType = Ipynb.Code {                 codeExecutionCount = exeCount               , codeOutputs = outputs               }+        , cellId = uuid         , cellSource = Source $ breakLines codeContent         , cellMetadata = meta-        , cellAttachments = Nothing } :) <$> extractCells opts bs+        , cellAttachments = Nothing } :) <$> extractCells nbformat opts bs   | "cell" `elem` classes   , "raw" `elem` classes =       case consolidateAdjacentRawBlocks xs of@@ -150,34 +157,55 @@                   "rst"      -> "text/restructuredtext"                   "asciidoc" -> "text/asciidoc"                   _          -> f+          uuid <- uuidFrom nbformat ident           (Ipynb.Cell{               cellType = Raw+            , cellId = uuid             , cellSource = Source $ breakLines raw             , cellMetadata = if format' == "ipynb" -- means no format given                                 then mempty-                                else M.insert "raw_mimetype"+                                else JSONMeta $ M.insert "raw_mimetype"                                        (Aeson.String format') mempty-            , cellAttachments = Nothing } :) <$> extractCells opts bs-        _ -> extractCells opts bs-extractCells opts (CodeBlock (_id,classes,kvs) raw : bs)+            , cellAttachments = Nothing } :) <$> extractCells nbformat opts bs+        _ -> extractCells nbformat opts bs+extractCells nbformat opts (CodeBlock (ident,classes,kvs) raw : bs)   | "code" `elem` classes = do       let meta = pairsToJSONMeta kvs       let exeCount = lookup "execution_count" kvs >>= safeRead+      uuid <- uuidFrom nbformat ident       (Ipynb.Cell{           cellType = Ipynb.Code {                 codeExecutionCount = exeCount               , codeOutputs = []               }+        , cellId = uuid         , cellSource = Source $ breakLines raw         , cellMetadata = meta-        , cellAttachments = Nothing } :) <$> extractCells opts bs-extractCells opts (b:bs) = do+        , cellAttachments = Nothing } :) <$> extractCells nbformat opts bs+extractCells nbformat opts (b:bs) = do       let isCodeOrDiv (CodeBlock (_,cl,_) _) = "code" `elem` cl           isCodeOrDiv (Div (_,cl,_) _)       = "cell" `elem` cl           isCodeOrDiv _                      = False       let (mds, rest) = break isCodeOrDiv bs-      extractCells opts (Div ("",["cell","markdown"],[]) (b:mds) : rest)+      extractCells nbformat opts+        (Div ("",["cell","markdown"],[]) (b:mds) : rest) +-- Return Nothing if nbformat < 4.5.+-- Otherwise construct a UUID, using the existing identifier+-- if it is a valid UUID, otherwise constructing a new one.+uuidFrom :: PandocMonad m => (Int, Int) -> Text -> m (Maybe Text)+uuidFrom nbformat ident =+  if nbformat >= (4,5)+     then+       if isValidUUID ident+          then return $ Just ident+          else Just . T.pack . drop 9 . show <$> getRandomUUID+     else return Nothing+ where+  isValidUUID t = not (T.null t) && T.length t <= 64 &&+                  T.all isValidUUIDChar t+  isValidUUIDChar c = isAscii c && (isAlphaNum c || c == '-' || c == '_')+ blockToOutput :: PandocMonad m => Block -> m (Maybe (Output a)) blockToOutput (Div (_,["output","stream",sname],_) (CodeBlock _ t:_)) =   return $ Just@@ -225,11 +253,13 @@        return (M.insert "text/html" (TextualData raw) mmap, meta)     go (mmap, meta) (RawBlock (Format "latex") raw) =        return (M.insert "text/latex" (TextualData raw) mmap, meta)+    go (mmap, meta) (RawBlock (Format "markdown") raw) =+       return (M.insert "text/markdown" (TextualData raw) mmap, meta)     go (mmap, meta) (Div _ bs') = foldM go (mmap, meta) bs'     go (mmap, meta) b = (mmap, meta) <$ report (BlockNotRendered b)  pairsToJSONMeta :: [(Text, Text)] -> JSONMeta-pairsToJSONMeta kvs =+pairsToJSONMeta kvs = JSONMeta $   M.fromList [(k, case Aeson.decode (UTF8.fromTextLazy $ TL.fromStrict v) of                            Just val -> val                            Nothing  -> String v)
src/Text/Pandoc/Writers/JATS.hs view
@@ -4,7 +4,7 @@ {-# LANGUAGE ViewPatterns        #-} {- |    Module      : Text.Pandoc.Writers.JATS-   Copyright   : 2017-2021 John MacFarlane+   Copyright   : 2017-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Writers/JATS/References.hs view
@@ -2,7 +2,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Writers.JATS.References-   Copyright   : © 2021 Albert Krewinkel+   Copyright   : © 2021-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <tarleb@zeitkraut.de>
src/Text/Pandoc/Writers/JATS/Table.hs view
@@ -3,7 +3,7 @@ {-# LANGUAGE TupleSections #-} {- |    Module      : Text.Pandoc.Writers.JATS.Table-   Copyright   : © 2020-2021 Albert Krewinkel+   Copyright   : © 2020-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <tarleb@zeitkraut.de>
src/Text/Pandoc/Writers/JATS/Types.hs view
@@ -1,6 +1,6 @@ {- |    Module      : Text.Pandoc.Writers.JATS.Types-   Copyright   : Copyright (C) 2017-2021 John MacFarlane+   Copyright   : Copyright (C) 2017-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Writers/Jira.hs view
@@ -3,7 +3,7 @@ {-# LANGUAGE PatternGuards #-} {- |    Module      : Text.Pandoc.Writers.Jira-   Copyright   : © 2010-2021 Albert Krewinkel, John MacFarlane+   Copyright   : © 2010-2022 Albert Krewinkel, John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>
src/Text/Pandoc/Writers/LaTeX.hs view
@@ -6,7 +6,7 @@ {-# LANGUAGE ViewPatterns        #-} {- |    Module      : Text.Pandoc.Writers.LaTeX-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Writers/LaTeX/Caption.hs view
@@ -1,6 +1,6 @@ {- |    Module      : Text.Pandoc.Writers.LaTeX.Caption-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Writers/LaTeX/Citation.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Writers.LaTeX.Citation-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Writers/LaTeX/Lang.hs view
@@ -2,7 +2,7 @@ {-# LANGUAGE ScopedTypeVariables #-} {- |    Module      : Text.Pandoc.Writers.LaTeX.Lang-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>@@ -89,6 +89,7 @@     fromIso "gd"  = "scottish"     fromIso "gez" = "ethiopic"     fromIso "gl"  = "galician"+    fromIso "gu"  = "gujarati"     fromIso "he"  = "hebrew"     fromIso "hi"  = "hindi"     fromIso "hr"  = "croatian"@@ -117,7 +118,8 @@     fromIso "no"  = "norsk"     fromIso "nqo" = "nko"     fromIso "oc"  = "occitan"-    fromIso "pa"  = "panjabi"+    fromIso "or"  = "oriya"+    fromIso "pa"  = "punjabi"     fromIso "pl"  = "polish"     fromIso "pms" = "piedmontese"     fromIso "pt"  = "portuguese"
src/Text/Pandoc/Writers/LaTeX/Notes.hs view
@@ -2,7 +2,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Writers.LaTeX.Notes-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Writers/LaTeX/Table.hs view
@@ -2,7 +2,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Writers.LaTeX.Table-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Writers/LaTeX/Util.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings   #-} {- |    Module      : Text.Pandoc.Writers.LaTeX.Util-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Writers/Man.hs view
@@ -3,7 +3,7 @@ {-# LANGUAGE ViewPatterns      #-} {- |    Module      : Text.Pandoc.Writers.Man-   Copyright   : Copyright (C) 2007-2021 John MacFarlane+   Copyright   : Copyright (C) 2007-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Writers/Markdown.hs view
@@ -4,7 +4,7 @@ {-# LANGUAGE TupleSections       #-} {- |    Module      : Text.Pandoc.Writers.Markdown-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>@@ -18,6 +18,7 @@ module Text.Pandoc.Writers.Markdown (   writeMarkdown,   writeCommonMark,+  writeMarkua,   writePlain) where import Control.Monad.Reader import Control.Monad.State.Strict@@ -42,7 +43,10 @@ import Text.DocTemplates (Val(..), Context(..), FromContext(..)) import Text.Pandoc.Walk import Text.Pandoc.Writers.HTML (writeHtml5String)-import Text.Pandoc.Writers.Markdown.Inline (inlineListToMarkdown, linkAttributes, attrsToMarkdown)+import Text.Pandoc.Writers.Markdown.Inline (inlineListToMarkdown, +                                            linkAttributes, +                                            attrsToMarkdown, +                                            attrsToMarkua) import Text.Pandoc.Writers.Markdown.Types (MarkdownVariant(..),                                            WriterState(..),                                            WriterEnv(..),@@ -77,6 +81,26 @@                    enableExtension Ext_intraword_underscores $                      writerExtensions opts } +-- | Convert Pandoc to Markua.+writeMarkua :: PandocMonad m => WriterOptions -> Pandoc -> m Text+writeMarkua opts document =+  evalMD (pandocToMarkdown opts' document) def{ envVariant = Markua } def+ where+  opts' = opts{   writerExtensions =+                  enableExtension Ext_hard_line_breaks $+                  enableExtension Ext_pipe_tables $+                  -- required for fancy list enumerators+                  enableExtension Ext_fancy_lists $+                  enableExtension Ext_startnum $+                  enableExtension Ext_strikeout $+                  enableExtension Ext_subscript $+                  enableExtension Ext_superscript $+                  enableExtension Ext_definition_lists $+                  enableExtension Ext_smart $+                  enableExtension Ext_footnotes+                    mempty }++ pandocTitleBlock :: Doc Text -> [Doc Text] -> Doc Text -> Doc Text pandocTitleBlock tit auths dat =   hang 2 (text "% ") tit <> cr <>@@ -258,9 +282,13 @@                   then literal "[^" <> num' <> literal "]:"                   else literal "[" <> num' <> literal "]"   let markerSize = 4 + offset num'-  let spacer = case writerTabStop opts - markerSize of-                     n | n > 0  -> literal $ T.replicate n " "-                     _ -> literal " "+  let hspacer = case writerTabStop opts - markerSize of+                      n | n > 0  -> literal $ T.replicate n " "+                      _ -> literal " "+  let spacer = case blocks of+                    Para{}:_ -> hspacer+                    Plain{}:_ -> hspacer+                    _ -> cr   return $ if isEnabled Ext_footnotes opts               then hang (writerTabStop opts) (marker <> spacer) contents               else marker <> spacer <> contents@@ -327,8 +355,15 @@   contents <- blockListToMarkdown opts ils   variant <- asks envVariant   return $-    case () of-         _ | isEnabled Ext_fenced_divs opts &&+     case () of+         _ | variant == Markua -> +                   case () of+                        () | "blurb" `elem` classes' -> prefixed "B> " contents <> blankline+                           | "aside" `elem` classes' -> prefixed "A> " contents <> blankline+                           -- | necessary to enable option to create a bibliography+                           | (take 3 (T.unpack id')) == "ref" -> contents <> blankline+                           | otherwise -> contents <> blankline+           | isEnabled Ext_fenced_divs opts &&              attrs /= nullAttr ->                 let attrsToMd = if variant == Commonmark                                 then attrsToMarkdown@@ -408,6 +443,7 @@       | f `elem` ["markdown", "markdown_github", "markdown_phpextra",                   "markdown_mmd", "markdown_strict"]          -> return $ literal str <> literal "\n"+    Markua -> renderEmpty     _ | isEnabled Ext_raw_attribute opts -> rawAttribBlock       | f `elem` ["html", "html5", "html4"]       , isEnabled Ext_markdown_attribute opts@@ -419,17 +455,19 @@       , isEnabled Ext_raw_tex opts          -> return $ literal str <> literal "\n"     _ -> renderEmpty-blockToMarkdown' opts HorizontalRule =-  return $ blankline <> literal (T.replicate (writerColumns opts) "-") <> blankline+blockToMarkdown' opts HorizontalRule = do+  variant <- asks envVariant+  let indicator = case variant of+                        Markua -> "* * *"+                        _ -> T.replicate (writerColumns opts) "-"+  return $ blankline <> literal indicator <> blankline blockToMarkdown' opts (Header level attr inlines) = do-   -- first, if we're putting references at the end of a section, we   -- put them here.   blkLevel <- asks envBlockLevel   refs <- if writerReferenceLocation opts == EndOfSection && blkLevel == 1           then notesAndRefs opts           else return empty-   variant <- asks envVariant   -- we calculate the id that would be used by auto_identifiers   -- so we know whether to print an explicit identifier@@ -442,7 +480,8 @@                                  && id' == autoId -> empty                    (id',_,_)   | isEnabled Ext_mmd_header_identifiers opts ->                                     space <> brackets (literal id')-                   _ | isEnabled Ext_header_attributes opts ||+                   _ | variant == Markua -> attrsToMarkua attr+                     | isEnabled Ext_header_attributes opts ||                        isEnabled Ext_attributes opts ->                                     space <> attrsToMarkdown attr                      | otherwise -> empty@@ -476,6 +515,8 @@             -- ghc interprets '#' characters in column 1 as linenum specifiers.             _ | variant == PlainText || isEnabled Ext_literate_haskell opts ->                 contents <> blankline+            _ | variant == Markua -> attr' <> cr <> literal (T.replicate level "#") +                                        <> space <> contents <> blankline             _ -> literal (T.replicate level "#") <> space <> contents <> attr' <> blankline    return $ refs <> hdr@@ -492,9 +533,11 @@           backticks <> attrs <> cr <> literal str <> cr <> backticks <> blankline            | isEnabled Ext_fenced_code_blocks opts ->           tildes <> attrs <> cr <> literal str <> cr <> tildes <> blankline-     _ -> nest (writerTabStop opts) (literal str) <> blankline+     _ | variant == Markua -> blankline <> attrsToMarkua attribs <> cr <> backticks <> cr <> +                                literal str <> cr <> backticks <> cr <> blankline+       | otherwise -> nest (writerTabStop opts) (literal str) <> blankline    where-     endlineLen c = maybe 3 ((+1) . maximum) $ nonEmpty $+     endlineLen c = maybe 3 ((+1) . maximum) $ nonEmpty                         [T.length ln                          | ln <- map trim (T.lines str)                          , T.pack [c,c,c] `T.isPrefixOf` ln@@ -581,19 +624,29 @@   return $ nst (tbl $$ caption'') $$ blankline blockToMarkdown' opts (BulletList items) = do   contents <- inList $ mapM (bulletListItemToMarkdown opts) items-  return $ (if isTightList items then vcat else vsep) contents <> blankline+  return $ (if isTightList items then vcat else vsep) +                  contents <> blankline blockToMarkdown' opts (OrderedList (start,sty,delim) items) = do   variant <- asks envVariant   let start' = if variant == Commonmark || isEnabled Ext_startnum opts                   then start                   else 1   let sty'   = if isEnabled Ext_fancy_lists opts then sty else DefaultStyle-  let delim' = if isEnabled Ext_fancy_lists opts then delim else DefaultDelim+  let delim' | isEnabled Ext_fancy_lists opts =+               case variant of +                   -- Markua supports 'fancy' enumerators, but no TwoParens+                   Markua -> if delim == TwoParens then OneParen else delim+                   _ -> delim+             | variant == Commonmark && --commonmark only supports one paren+                   (delim == OneParen || delim == TwoParens) = OneParen+             | otherwise = DefaultDelim   let attribs = (start', sty', delim')   let markers  = orderedListMarkers attribs-  let markers' = map (\m -> if T.length m < 3-                               then m <> T.replicate (3 - T.length m) " "-                               else m) markers+  let markers' = case variant of+                        Markua -> markers+                        _ -> map (\m -> if T.length m < 3+                                   then m <> T.replicate (3 - T.length m) " "+                                   else m) markers   contents <- inList $               zipWithM (orderedListItemToMarkdown opts) markers' items   return $ (if isTightList items then vcat else vsep) contents <> blankline@@ -707,10 +760,13 @@ -- | Convert bullet list item (list of blocks) to markdown. bulletListItemToMarkdown :: PandocMonad m => WriterOptions -> [Block] -> MD m (Doc Text) bulletListItemToMarkdown opts bs = do+  variant <- asks envVariant   let exts = writerExtensions opts   contents <- blockListToMarkdown opts $ taskListItemToAscii exts bs   let sps = T.replicate (writerTabStop opts - 2) " "-  let start = literal $ "- " <> sps+  let start = case variant of+              Markua -> literal "* "+              _      -> literal $ "- " <> sps   -- remove trailing blank line if item ends with a tight list   let contents' = if itemEndsWithTightList bs                      then chomp contents <> cr@@ -720,19 +776,22 @@ -- | Convert ordered list item (a list of blocks) to markdown. orderedListItemToMarkdown :: PandocMonad m                           => WriterOptions -- ^ options-                          -> Text        -- ^ list item marker+                          -> Text          -- ^ list item marker                           -> [Block]       -- ^ list item (list of blocks)                           -> MD m (Doc Text) orderedListItemToMarkdown opts marker bs = do   let exts = writerExtensions opts   contents <- blockListToMarkdown opts $ taskListItemToAscii exts bs+  variant <- asks envVariant   let sps = case writerTabStop opts - T.length marker of                    n | n > 0 -> literal $ T.replicate n " "                    _ -> literal " "   let ind = if isEnabled Ext_four_space_rule opts                then writerTabStop opts                else max (writerTabStop opts) (T.length marker + 1)-  let start = literal marker <> sps+  let start = case variant of+              Markua -> literal marker <> " "+              _      -> literal marker <> sps   -- remove trailing blank line if item ends with a tight list   let contents' = if itemEndsWithTightList bs                      then chomp contents <> cr@@ -751,7 +810,10 @@      then do        let tabStop = writerTabStop opts        variant <- asks envVariant-       let leader  = if variant == PlainText then "   " else ":  "+       let leader  = case variant of+                        PlainText -> "   "+                        Markua -> ":"+                        _ -> ":  "        let sps = case writerTabStop opts - 3 of                       n | n > 0   -> literal $ T.replicate n " "                       _ -> literal " "@@ -822,6 +884,7 @@       isListBlock _                  = False       commentSep         | variant == PlainText        = Null+        | variant == Markua           = Null         | isEnabled Ext_raw_html opts = RawBlock "html" "<!-- -->\n"         | otherwise                   = RawBlock "markdown" "&nbsp;\n"   mconcat <$> mapM (blockToMarkdown opts) (fixBlocks blocks)
src/Text/Pandoc/Writers/Markdown/Inline.hs view
@@ -3,7 +3,7 @@ {-# LANGUAGE ViewPatterns        #-} {- |    Module      : Text.Pandoc.Writers.Markdown.Inline-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>@@ -13,7 +13,8 @@ module Text.Pandoc.Writers.Markdown.Inline (   inlineListToMarkdown,   linkAttributes,-  attrsToMarkdown+  attrsToMarkdown,+  attrsToMarkua   ) where import Control.Monad.Reader import Control.Monad.State.Strict@@ -44,32 +45,35 @@  -- | Escape special characters for Markdown. escapeText :: WriterOptions -> Text -> Text-escapeText opts = T.pack . go . T.unpack+escapeText opts = T.pack . go' . T.unpack  where   startsWithSpace (' ':_) = True   startsWithSpace ('\t':_) = True   startsWithSpace [] = True   startsWithSpace _ = False+  go' ('#':cs)+    | isEnabled Ext_space_in_atx_header opts+    = if startsWithSpace (dropWhile (=='#') cs)+         then '\\':'#':go cs+         else '#':go cs+    | otherwise = '\\':'#':go cs+  go' ('@':cs)+    | isEnabled Ext_citations opts =+        case cs of+             (d:_)+               | isAlphaNum d || d == '_' || d == '{'+                  -> '\\':'@':go cs+             _ -> '@':go cs+  go' cs = go cs   go [] = []   go (c:cs) =     case c of-       '<' | isEnabled Ext_all_symbols_escapable opts ->-              '\\' : '<' : go cs-           | otherwise -> "&lt;" ++ go cs-       '>' | isEnabled Ext_all_symbols_escapable opts ->-              '\\' : '>' : go cs-           | otherwise -> "&gt;" ++ go cs-       '@' | isEnabled Ext_citations opts ->-               case cs of-                    (d:_)-                      | isAlphaNum d || d == '_' || d == '{'-                         -> '\\':'@':go cs-                    _ -> '@':go cs-       '#' | isEnabled Ext_space_in_atx_header opts-           , startsWithSpace cs-           -> '\\':'#':go cs        _ | c `elem` ['\\','`','*','_','[',']'] ->               '\\':c:go cs+       '>' | isEnabled Ext_all_symbols_escapable opts -> '\\':'>':go cs+           | otherwise -> "&gt;" ++ go cs+       '<' | isEnabled Ext_all_symbols_escapable opts -> '\\':'<':go cs+           | otherwise -> "&lt;" ++ go cs        '|' | isEnabled Ext_pipe_tables opts -> '\\':'|':go cs        '^' | isEnabled Ext_superscript opts -> '\\':'^':go cs        '~' | isEnabled Ext_subscript opts ||@@ -90,10 +94,13 @@                   | isEnabled Ext_intraword_underscores opts                   , isAlphaNum c                   , isAlphaNum x -> c : '_' : x : go xs-                '#':xs           -> c : '#' : go xs-                '>':xs           -> c : '>' : go xs                 _                -> c : go cs +-- Escape the escape character, as well as formatting pairs+escapeMarkuaString :: Text -> Text+escapeMarkuaString s = foldr (uncurry T.replace) s [("--","~-~-"),+                        ("**","~*~*"),("//","~/~/"),("^^","~^~^"),(",,","~,~,")]+  attrsToMarkdown :: Attr -> Doc Text attrsToMarkdown attribs = braces $ hsep [attribId, attribClasses, attribKeys]         where attribId = case attribs of@@ -115,9 +122,56 @@               escAttrChar '\\' = literal "\\\\"               escAttrChar c    = literal $ T.singleton c +attrsToMarkua:: Attr -> Doc Text+attrsToMarkua attributes+     | null list = empty+     | otherwise = braces $ intercalateDocText list+        where attrId = case attributes of+                        ("",_,_) -> []+                        (i,_,_)  -> [literal $ "id: " <> i]+              -- all non explicit (key,value) attributes besides id are getting+              -- a default class key to be Markua conform+              attrClasses = case attributes of+                             (_,[],_) -> []+                             (_,classes,_) -> map (escAttr . ("class: " <>))+                                classes+              attrKeyValues = case attributes of+                               (_,_,[]) -> []+                               (_,_,keyvalues) -> map ((\(k,v) -> escAttr k+                                              <> ": " <> escAttr v) . +                                              preprocessKeyValues) keyvalues+              escAttr          = mconcat . map escAttrChar . T.unpack+              escAttrChar '"'  = literal "\""+              escAttrChar c    = literal $ T.singleton c++              list = concat [attrId, attrClasses, attrKeyValues]++              -- if attribute key is alt, caption, title then content+              -- gets wrapped inside quotes+              -- attribute gets removed+              preprocessKeyValues :: (Text, Text) -> (Text, Text)+              preprocessKeyValues (key,value)+                 | key == "alt" ||+                   key == "caption" ||+                   key == "title" = (key, inquotes value)+                 | otherwise = (key,value)+              intercalateDocText :: [Doc Text] -> Doc Text+              intercalateDocText [] = empty+              intercalateDocText [x] = x+              intercalateDocText (x:xs) = x <> ", " <> (intercalateDocText xs)++-- | Add a (key, value) pair to Pandoc attr type+addKeyValueToAttr :: Attr -> (Text,Text) -> Attr+addKeyValueToAttr (ident,classes,kvs) (key,value) +    | not (T.null key) && not (T.null value) = (ident,+                                                classes,+                                                (key,value): kvs)+    | otherwise = (ident,classes,kvs)+ linkAttributes :: WriterOptions -> Attr -> Doc Text linkAttributes opts attr =-  if (isEnabled Ext_link_attributes opts || isEnabled Ext_attributes opts) && attr /= nullAttr+  if (isEnabled Ext_link_attributes opts || +        isEnabled Ext_attributes opts) && attr /= nullAttr      then attrsToMarkdown attr      else empty @@ -282,6 +336,7 @@              _ -> id          $ case variant of                 PlainText -> contents+                Markua -> "`" <> contents <> "`" <> attrsToMarkua attrs                 _     | attrs == nullAttr -> contents                       | isEnabled Ext_bracketed_spans opts ->                         let attrs' = if attrs /= nullAttr@@ -395,60 +450,75 @@                    then "&ldquo;" <> contents <> "&rdquo;"                    else "“" <> contents <> "”" inlineToMarkdown opts (Code attr str) = do+  variant <- asks envVariant   let tickGroups   = filter (T.any (== '`')) $ T.group str   let longest      = maybe 0 maximum $ nonEmpty $ map T.length tickGroups   let marker       = T.replicate (longest + 1) "`"   let spacer       = if longest == 0 then "" else " "   let attrsEnabled = isEnabled Ext_inline_code_attributes opts ||                      isEnabled Ext_attributes opts-  let attrs        = if attrsEnabled && attr /= nullAttr-                        then attrsToMarkdown attr-                        else empty-  variant <- asks envVariant+  let attrs = case variant of+                       Markua -> attrsToMarkua attr+                       _   -> if attrsEnabled && attr /= nullAttr+                                        then attrsToMarkdown attr+                                        else empty   case variant of      PlainText -> return $ literal str      _     ->  return $ literal                   (marker <> spacer <> str <> spacer <> marker) <> attrs inlineToMarkdown opts (Str str) = do   variant <- asks envVariant-  let str' = (if writerPreferAscii opts-                 then toHtml5Entities-                 else id) .-             (if isEnabled Ext_smart opts-                 then unsmartify opts-                 else id) .-             (if variant == PlainText-                 then id-                 else escapeText opts) $ str+  let str' = case variant of+                Markua -> escapeMarkuaString str+                _ -> (if writerPreferAscii opts+                        then toHtml5Entities+                        else id) .+                     (if isEnabled Ext_smart opts+                        then unsmartify opts+                        else id) .+                     (if variant == PlainText+                        then id+                        else escapeText opts) $ str   return $ literal str'-inlineToMarkdown opts (Math InlineMath str) =-  case writerHTMLMathMethod opts of-       WebTeX url -> inlineToMarkdown opts-                       (Image nullAttr [Str str] (url <> urlEncode str, str))-       _ | isEnabled Ext_tex_math_dollars opts ->-             return $ "$" <> literal str <> "$"-         | isEnabled Ext_tex_math_single_backslash opts ->-             return $ "\\(" <> literal str <> "\\)"-         | isEnabled Ext_tex_math_double_backslash opts ->-             return $ "\\\\(" <> literal str <> "\\\\)"-         | otherwise -> do-             variant <- asks envVariant-             texMathToInlines InlineMath str >>=-               inlineListToMarkdown opts .-                 (if variant == PlainText then makeMathPlainer else id)-inlineToMarkdown opts (Math DisplayMath str) =-  case writerHTMLMathMethod opts of-      WebTeX url -> (\x -> blankline <> x <> blankline) `fmap`-             inlineToMarkdown opts (Image nullAttr [Str str]-                    (url <> urlEncode str, str))-      _ | isEnabled Ext_tex_math_dollars opts ->-            return $ "$$" <> literal str <> "$$"-        | isEnabled Ext_tex_math_single_backslash opts ->-            return $ "\\[" <> literal str <> "\\]"-        | isEnabled Ext_tex_math_double_backslash opts ->-            return $ "\\\\[" <> literal str <> "\\\\]"-        | otherwise -> (\x -> cr <> x <> cr) `fmap`-            (texMathToInlines DisplayMath str >>= inlineListToMarkdown opts)+inlineToMarkdown opts (Math InlineMath str) = do+  variant <- asks envVariant+  case () of+    _ | variant == Markua -> return $ "`" <> literal str <> "`" <> "$"+      | otherwise -> case writerHTMLMathMethod opts of+          WebTeX url -> inlineToMarkdown opts+                          (Image nullAttr [Str str] (url <> urlEncode str, str))+          _ | isEnabled Ext_tex_math_dollars opts ->+                return $ "$" <> literal str <> "$"+            | isEnabled Ext_tex_math_single_backslash opts ->+                return $ "\\(" <> literal str <> "\\)"+            | isEnabled Ext_tex_math_double_backslash opts ->+                return $ "\\\\(" <> literal str <> "\\\\)"+            | otherwise -> +                texMathToInlines InlineMath str >>=+                  inlineListToMarkdown opts .+                    (if variant == PlainText then makeMathPlainer else id)+     +inlineToMarkdown opts (Math DisplayMath str) = do+  variant <- asks envVariant+  case () of+    _ | variant == Markua -> do+        let attributes = attrsToMarkua (addKeyValueToAttr ("",[],[]) +                                                        ("format", "latex"))+        return $ blankline <> attributes <> cr <> literal "```" <> cr +            <> literal str <> cr <> literal "```" <> blankline+      | otherwise -> case writerHTMLMathMethod opts of+          WebTeX url -> (\x -> blankline <> x <> blankline) `fmap`+                 inlineToMarkdown opts (Image nullAttr [Str str]+                        (url <> urlEncode str, str))+          _ | isEnabled Ext_tex_math_dollars opts ->+                return $ "$$" <> literal str <> "$$"+            | isEnabled Ext_tex_math_single_backslash opts ->+                return $ "\\[" <> literal str <> "\\]"+            | isEnabled Ext_tex_math_double_backslash opts ->+                return $ "\\\\[" <> literal str <> "\\\\]"+            | otherwise -> (\x -> cr <> x <> cr) `fmap`+                (texMathToInlines DisplayMath str >>= inlineListToMarkdown opts)+ inlineToMarkdown opts il@(RawInline f str) = do   let tickGroups = filter (T.any (== '`')) $ T.group str   let numticks   = 1 + maybe 0 maximum (nonEmpty (map T.length tickGroups))@@ -468,6 +538,7 @@       | f `elem` ["markdown", "markdown_github", "markdown_phpextra",                   "markdown_mmd", "markdown_strict"]          -> return $ literal str+    Markua -> renderEmpty     _ | isEnabled Ext_raw_attribute opts -> rawAttribInline       | f `elem` ["html", "html5", "html4"]       , isEnabled Ext_raw_html opts@@ -504,7 +575,11 @@          then do            suffs <- inlineListToMarkdown opts $ citationSuffix c            rest <- mapM convertOne cs-           let inbr = suffs <+> joincits rest+           let inbr = suffs <>+                      (if not (null (citationSuffix c)) && not (null rest)+                          then text ";"+                          else mempty)+                      <+> joincits rest                br   = if isEmpty inbr then empty else char '[' <> inbr <> char ']'            return $ literal ("@" <> maybeInBraces (citationId c)) <+> br          else do@@ -526,8 +601,10 @@            sdoc <- inlineListToMarkdown opts sinlines            let k' = literal (modekey m <> "@" <> maybeInBraces k)                r = case sinlines of-                        Str (T.uncons -> Just (y,_)):_ | y `elem` (",;]@" :: String) -> k' <> sdoc-                        _                                         -> k' <+> sdoc+                        Str (T.uncons -> Just (y,_)):_+                          | y `elem` (",;]@" :: String) -> k' <> sdoc+                        Space:_                         -> k' <> sdoc+                        _                               -> k' <+> sdoc            return $ pdoc <+> r         modekey SuppressAuthor = "-"         modekey _              = ""@@ -556,6 +633,11 @@     PlainText       | useAuto -> return $ literal srcSuffix       | otherwise -> return linktext+    Markua+      | T.null tit -> return $ result <> attrsToMarkua attr+      | otherwise ->  return $ result <> attrsToMarkua attributes+        where result = "[" <> linktext <> "](" <> (literal src) <> ")"+              attributes = addKeyValueToAttr attr ("title", tit)     _ | useAuto -> return $ "<" <> literal srcSuffix <> ">"       | useRefLinks ->            let first  = "[" <> linktext <> "]"@@ -587,9 +669,16 @@                then [Str ""]                else alternate   linkPart <- inlineToMarkdown opts (Link attr txt (source, tit))+  alt <- inlineListToMarkdown opts alternate+  let attributes | variant == Markua = attrsToMarkua $ +            addKeyValueToAttr (addKeyValueToAttr attr ("title", tit)) +            ("alt", render (Just (writerColumns opts)) alt) +                 | otherwise = empty   return $ case variant of-             PlainText -> "[" <> linkPart <> "]"-             _     -> "!" <> linkPart+                PlainText -> "[" <> linkPart <> "]"+                Markua -> cr <> attributes <> cr <> literal "![](" <> +                            literal source <> ")" <> cr+                _ -> "!" <> linkPart inlineToMarkdown opts (Note contents) = do   modify (\st -> st{ stNotes = contents : stNotes st })   st <- get
src/Text/Pandoc/Writers/Markdown/Types.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings   #-} {- |    Module      : Text.Pandoc.Writers.Markdown.Types-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>@@ -45,7 +45,8 @@                            }  data MarkdownVariant =-      PlainText+      Markua+    | PlainText     | Commonmark     | Markdown     deriving (Show, Eq)
src/Text/Pandoc/Writers/MediaWiki.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Writers.MediaWiki-   Copyright   : Copyright (C) 2008-2021 John MacFarlane+   Copyright   : Copyright (C) 2008-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>@@ -449,10 +449,13 @@   case txt of      [Str s] | isURI src && escapeURI s == src -> return src      _  -> return $ if isURI src-              then "[" <> src <> " " <> label <> "]"-              else "[[" <> src' <> "|" <> label <> "]]"-                     -- with leading / it's a link to a help page-                     where src' = fromMaybe src $ T.stripPrefix "/" src+       then "[" <> src <> " " <> label <> "]"+       else+         if src == label+           then "[[" <> src' <> "]]"+           else "[[" <> src' <> "|" <> label <> "]]"+       -- with leading / it's a link to a help page+       where src' = fromMaybe src $ T.stripPrefix "/" src  inlineToMediaWiki (Image attr alt (source, tit)) = do   img  <- imageToMediaWiki attr
src/Text/Pandoc/Writers/Ms.hs view
@@ -2,7 +2,7 @@ {-# LANGUAGE ViewPatterns      #-} {- |    Module      : Text.Pandoc.Writers.Ms-   Copyright   : Copyright (C) 2007-2021 John MacFarlane+   Copyright   : Copyright (C) 2007-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>@@ -21,7 +21,7 @@  module Text.Pandoc.Writers.Ms ( writeMs ) where import Control.Monad.State.Strict-import Data.Char (isLower, isUpper, ord)+import Data.Char (isAscii, isLower, isUpper, ord) import Data.List (intercalate, intersperse) import Data.List.NonEmpty (nonEmpty) import qualified Data.Map as Map@@ -46,6 +46,8 @@ import Text.Pandoc.Writers.Roff import Text.Printf (printf) import Text.TeXMath (writeEqn)+import qualified Data.Text.Encoding as TE+import qualified Data.ByteString as B  -- | Convert Pandoc to Ms. writeMs :: PandocMonad m => WriterOptions -> Pandoc -> m Text@@ -88,6 +90,21 @@ escapeStr opts =   escapeString (if writerPreferAscii opts then AsciiOnly else AllowUTF8) +-- In PDFs we need to escape parentheses and backslash.+-- In PDF we need to encode as UTF-16 BE.+escapePDFString :: Text -> Text+escapePDFString t+  | T.all isAscii t =+    T.replace "(" "\\(" .  T.replace ")" "\\)" . T.replace "\\" "\\\\" $ t+  | otherwise = ("\\376\\377" <>) .  -- add bom+    mconcat . map encodeChar .  T.unpack $ t+ where+  encodeChar c =+    if isAscii c && c /= '\\' && c /= '(' && c /= ')'+       then "\\000" <> T.singleton c+       else mconcat . map toOctal . B.unpack . TE.encodeUtf16BE $ T.singleton c+  toOctal n = "\\" <> T.pack (printf "%03o" n)+ escapeUri :: Text -> Text escapeUri = T.pack . escapeURIString (\c -> c /= '@' && isAllowedInURI c) . T.unpack @@ -196,7 +213,7 @@                                       (if T.null secnum                                           then ""                                           else "  ") <>-                                      escapeStr opts (stringify inlines))+                                      escapePDFString (stringify inlines))   let backlink = nowrap (literal ".pdfhref L -D " <>        doubleQuotes (literal (toAscii ident)) <> space <> literal "\\") <> cr <>        literal " -- "
src/Text/Pandoc/Writers/Native.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Writers.Native-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Writers/ODT.hs view
@@ -2,7 +2,7 @@ {-# LANGUAGE OverloadedStrings   #-} {- |    Module      : Text.Pandoc.Writers.ODT-   Copyright   : Copyright (C) 2008-2021 John MacFarlane+   Copyright   : Copyright (C) 2008-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Writers/OOXML.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Writers.OOXML-   Copyright   : Copyright (C) 2012-2021 John MacFarlane+   Copyright   : Copyright (C) 2012-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Writers/OPML.hs view
@@ -2,7 +2,7 @@ {-# LANGUAGE CPP               #-} {- |    Module      : Text.Pandoc.Writers.OPML-   Copyright   : Copyright (C) 2013-2021 John MacFarlane+   Copyright   : Copyright (C) 2013-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Writers/OpenDocument.hs view
@@ -192,7 +192,7 @@                                                   ,("style:vertical-rel", "text")]                                                 else                                                   [("style:vertical-pos",   "middle")-                                                  ,("style:vertical-rel",   "paragraph-content")+                                                  ,("style:vertical-rel",   "text")                                                   ,("style:horizontal-pos", "center")                                                   ,("style:horizontal-rel", "paragraph-content")                                                   ,("style:wrap",           "none")]
src/Text/Pandoc/Writers/Org.hs view
@@ -3,8 +3,8 @@ {- |    Module      : Text.Pandoc.Writers.Org    Copyright   : © 2010-2015 Puneeth Chaganti <punchagan@gmail.com>-                   2010-2021 John MacFarlane <jgm@berkeley.edu>-                   2016-2021 Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>+                   2010-2022 John MacFarlane <jgm@berkeley.edu>+                   2016-2022 Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>@@ -22,6 +22,7 @@ import Data.List.NonEmpty (nonEmpty) import Data.Text (Text) import qualified Data.Text as T+import qualified Data.Map as M import Text.Pandoc.Class.PandocMonad (PandocMonad, report) import Text.Pandoc.Definition import Text.Pandoc.Logging@@ -29,6 +30,7 @@ import Text.DocLayout import Text.Pandoc.Shared import Text.Pandoc.Templates (renderTemplate)+import Text.Pandoc.Citeproc.Locator (parseLocator, LocatorMap(..), LocatorInfo(..)) import Text.Pandoc.Writers.Shared  data WriterState =@@ -103,7 +105,12 @@            => Block         -- ^ Block element            -> Org m (Doc Text) blockToOrg Null = return empty-blockToOrg (Div attr bs) = divToOrg attr bs+blockToOrg (Div attr@(ident,_,_) bs) = do+  opts <- gets stOptions+  -- Strip off bibliography if citations enabled+  if ident == "refs" && isEnabled Ext_citations opts+     then return mempty+     else divToOrg attr bs blockToOrg (Plain inlines) = inlineListToOrg inlines blockToOrg (SimpleFigure attr txt (src, tit)) = do       capt <- if null txt@@ -190,9 +197,7 @@   return $ head'' $$ body $$ caption $$ blankline blockToOrg (BulletList items) = do   contents <- mapM bulletListItemToOrg items-  -- ensure that sublists have preceding blank line-  return $ blankline $$-           (if isTightList items then vcat else vsep) contents $$+  return $ (if isTightList items then vcat else vsep) contents $$            blankline blockToOrg (OrderedList (start, _, delim) items) = do   let delim' = case delim of@@ -200,13 +205,10 @@                     x         -> x   let markers = take (length items) $ orderedListMarkers                                       (start, Decimal, delim')-  let maxMarkerLength = maybe 0 maximum . nonEmpty $ map T.length markers-  let markers' = map (\m -> let s = maxMarkerLength - T.length m-                            in  m <> T.replicate s " ") markers-  contents <- zipWithM orderedListItemToOrg markers' items-  -- ensure that sublists have preceding blank line-  return $ blankline $$-           (if isTightList items then vcat else vsep) contents $$+      counters = (case start of 1 -> Nothing; n -> Just n) : repeat Nothing+  contents <- zipWithM (\x f -> f x) items $+              zipWith orderedListItemToOrg markers counters+  return $ (if isTightList items then vcat else vsep) contents $$            blankline blockToOrg (DefinitionList items) = do   contents <- mapM definitionListItemToOrg items@@ -217,21 +219,38 @@ bulletListItemToOrg items = do   exts <- gets $ writerExtensions . stOptions   contents <- blockListToOrg (taskListItemToOrg exts items)-  return $ hang 2 "- " contents $$-          if endsWithPlain items+  -- if list item starts with non-paragraph, it must go on+  -- the next line:+  let contents' = (case items of+                    Plain{}:_ -> mempty+                    Para{}:_ -> mempty+                    _ -> cr) <> chomp contents+  return $ hang 2 "- " contents' $$+          if null items || endsWithPlain items              then cr              else blankline  -- | Convert ordered list item (a list of blocks) to Org. orderedListItemToOrg :: PandocMonad m                      => Text   -- ^ marker for list item+                     -> Maybe Int -- ^ maybe number for a counter cookie                      -> [Block]  -- ^ list item (list of blocks)                      -> Org m (Doc Text)-orderedListItemToOrg marker items = do+orderedListItemToOrg marker counter items = do   exts <- gets $ writerExtensions . stOptions   contents <- blockListToOrg (taskListItemToOrg exts items)-  return $ hang (T.length marker + 1) (literal marker <> space) contents $$-          if endsWithPlain items+  -- if list item starts with non-paragraph, it must go on+  -- the next line:+  let contents' = (case items of+                    Plain{}:_ -> mempty+                    Para{}:_ -> mempty+                    _ -> cr) <> chomp contents+  let cookie = maybe empty+               (\n -> space <> literal "[@" <> literal (tshow n) <> literal "]")+               counter+  return $ hang (T.length marker + 1)+                (literal marker <> cookie <> space) contents' $$+          if null items || endsWithPlain items              then cr              else blankline @@ -396,7 +415,35 @@ inlineToOrg (Quoted DoubleQuote lst) = do   contents <- inlineListToOrg lst   return $ "\"" <> contents <> "\""-inlineToOrg (Cite _  lst) = inlineListToOrg lst+inlineToOrg (Cite cs lst) = do+  opts <- gets stOptions+  if isEnabled Ext_citations opts+     then do+       let renderCiteItem c = do+             citePref <- inlineListToOrg (citationPrefix c)+             let (locinfo, suffix) = parseLocator locmap (citationSuffix c)+             citeSuff <- inlineListToOrg suffix+             let locator = case locinfo of+                            Just info -> literal $+                              T.replace "\160" " " $+                              T.replace "{" "" $+                              T.replace "}" "" $ locatorRaw info+                            Nothing -> mempty+             return $ hsep [ citePref+                           , ("@" <> literal (citationId c))+                           , locator+                           , citeSuff ]+       citeItems <- mconcat . intersperse "; " <$> mapM renderCiteItem cs+       let sty = case cs of+                   (d:_)+                     | citationMode d == AuthorInText+                     -> literal "/t"+                   [d]+                     | citationMode d == SuppressAuthor+                     -> literal "/na"+                   _ -> mempty+       return $ "[cite" <> sty <> ":" <> citeItems <> "]"+     else inlineListToOrg lst inlineToOrg (Code _ str) = return $ "=" <> literal str <> "=" inlineToOrg (Str str) = return . literal $ escapeString str inlineToOrg (Math t str) = do@@ -508,3 +555,60 @@   , "sqlite"   , "lilypond"   , "vala" ]++-- taken from oc-csl.el in the org source tree:+locmap :: LocatorMap+locmap = LocatorMap $ M.fromList+  [ ("bk."       , "book")+  , ("bks."      , "book")+  , ("book"      , "book")+  , ("chap."     , "chapter")+  , ("chaps."    , "chapter")+  , ("chapter"   , "chapter")+  , ("col."      , "column")+  , ("cols."     , "column")+  , ("column"    , "column")+  , ("figure"    , "figure")+  , ("fig."      , "figure")+  , ("figs."     , "figure")+  , ("folio"     , "folio")+  , ("fol."      , "folio")+  , ("fols."     , "folio")+  , ("number"    , "number")+  , ("no."       , "number")+  , ("nos."      , "number")+  , ("line"      , "line")+  , ("l."        , "line")+  , ("ll."       , "line")+  , ("note"      , "note")+  , ("n."        , "note")+  , ("nn."       , "note")+  , ("opus"      , "opus")+  , ("op."       , "opus")+  , ("opp."      , "opus")+  , ("page"      , "page")+  , ("p"         , "page")+  , ("p."        , "page")+  , ("pp."       , "page")+  , ("paragraph" , "paragraph")+  , ("para."     , "paragraph")+  , ("paras."    , "paragraph")+  , ("¶"         , "paragraph")+  , ("¶¶"        , "paragraph")+  , ("part"      , "part")+  , ("pt."       , "part")+  , ("pts."      , "part")+  , ("§"         , "section")+  , ("§§"        , "section")+  , ("section"   , "section")+  , ("sec."      , "section")+  , ("secs."     , "section")+  , ("sub verbo" , "sub verbo")+  , ("s.v."      , "sub verbo")+  , ("s.vv."     , "sub verbo")+  , ("verse"     , "verse")+  , ("v."        , "verse")+  , ("vv."       , "verse")+  , ("volume"    , "volume")+  , ("vol."      , "volume")+  , ("vols."     , "volume") ]
src/Text/Pandoc/Writers/RST.hs view
@@ -2,7 +2,7 @@ {-# LANGUAGE ViewPatterns      #-} {- |    Module      : Text.Pandoc.Writers.RST-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>@@ -32,6 +32,7 @@ import Text.Pandoc.Templates (renderTemplate) import Text.Pandoc.Writers.Shared import Text.Pandoc.Walk+import Safe (lastMay)  type Refs = [([Inline], Target)] @@ -365,7 +366,7 @@ bulletListItemToRST items = do   contents <- blockListToRST items   return $ hang 3 "-  " contents $$-      if endsWithPlain items+      if null items || (endsWithPlain items && not (endsWithList items))          then cr          else blankline @@ -378,9 +379,15 @@   contents <- blockListToRST items   let marker' = marker <> " "   return $ hang (T.length marker') (literal marker') contents $$-      if endsWithPlain items+      if null items || (endsWithPlain items && not (endsWithList items))          then cr          else blankline++endsWithList :: [Block] -> Bool+endsWithList bs = case lastMay bs of+                    Just (BulletList{}) -> True+                    Just (OrderedList{}) -> True+                    _ -> False  -- | Convert definition list item (label, list of blocks) to RST. definitionListItemToRST :: PandocMonad m => ([Inline], [[Block]]) -> RST m (Doc Text)
src/Text/Pandoc/Writers/RTF.hs view
@@ -2,7 +2,7 @@ {-# LANGUAGE OverloadedStrings   #-} {- |    Module      : Text.Pandoc.Writers.RTF-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>@@ -43,10 +43,11 @@   (do result <- P.fetchItem src       case result of            (imgdata, Just mime)-             | mime == "image/jpeg" || mime == "image/png" -> do+             | mime' <- T.takeWhile (/=';') mime+             , mime' == "image/jpeg" || mime' == "image/png" -> do              let bytes = map (T.pack . printf "%02x") $ B.unpack imgdata              filetype <--                case mime of+                case mime' of                      "image/jpeg" -> return "\\jpegblip"                      "image/png"  -> return "\\pngblip"                      _            -> throwError $@@ -104,13 +105,13 @@   toc <- blocksToRTF 0 AlignDefault [toTableOfContents options blocks]   let context = defField "body" body               $ defField "spacer" spacer-              $(if writerTableOfContents options-                   then defField "table-of-contents" toc-                        -- for backwards compatibility,-                        -- we populate toc with the contents-                        -- of the toc rather than a boolean:-                        . defField "toc" toc-                   else id) metadata+              $ (if writerTableOfContents options+                    then defField "table-of-contents" toc+                         -- for backwards compatibility,+                         -- we populate toc with the contents+                         -- of the toc rather than a boolean:+                         . defField "toc" toc+                    else id) metadata   return $     case writerTemplate options of        Just tpl -> render Nothing $ renderTemplate tpl context
src/Text/Pandoc/Writers/Roff.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Writers.Roff-   Copyright   : Copyright (C) 2007-2021 John MacFarlane+   Copyright   : Copyright (C) 2007-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Writers/Shared.hs view
@@ -3,7 +3,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Writers.Shared-   Copyright   : Copyright (C) 2013-2021 John MacFarlane+   Copyright   : Copyright (C) 2013-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>@@ -456,7 +456,9 @@ endsWithPlain xs =   case lastMay xs of     Just Plain{} -> True-    _            -> False+    Just (BulletList is) -> maybe False endsWithPlain (lastMay is)+    Just (OrderedList _ is) -> maybe False endsWithPlain (lastMay is)+    _ -> False  -- | Convert the relevant components of a new-style table (with block -- caption, row headers, row and column spans, and so on) to those of
src/Text/Pandoc/Writers/TEI.hs view
@@ -2,7 +2,7 @@ {-# LANGUAGE PatternGuards     #-} {- |    Module      : Text.Pandoc.Writers.Docbook-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Writers/Texinfo.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Writers.Texinfo-   Copyright   : Copyright (C) 2008-2021 John MacFarlane+   Copyright   : Copyright (C) 2008-2022 John MacFarlane                                2012 Peter Wang    License     : GNU GPL, version 2 or above 
src/Text/Pandoc/Writers/Textile.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Writers.Textile-   Copyright   : Copyright (C) 2010-2021 John MacFarlane+   Copyright   : Copyright (C) 2010-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/Writers/ZimWiki.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.Writers.ZimWiki-   Copyright   : © 2008-2021 John MacFarlane,+   Copyright   : © 2008-2022 John MacFarlane,                    2017-2019 Alex Ivkin    License     : GNU GPL, version 2 or above 
src/Text/Pandoc/XML.hs view
@@ -2,7 +2,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.XML-   Copyright   : Copyright (C) 2006-2021 John MacFarlane+   Copyright   : Copyright (C) 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/XML/Light.hs view
@@ -2,7 +2,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.XML.Light-   Copyright   : Copyright (C) 2021 John MacFarlane+   Copyright   : Copyright (C) 2021-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/XML/Light/Output.hs view
@@ -2,7 +2,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Text.Pandoc.XML.Light.Output-   Copyright   : Copyright (C) 2007 Galois, Inc., 2021 John MacFarlane+   Copyright   : Copyright (C) 2007 Galois, Inc., 2021-2022 John MacFarlane    License     : GNU GPL, version 2 or above  
src/Text/Pandoc/XML/Light/Proc.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE FlexibleInstances #-} {- |    Module      : Text.Pandoc.XML.Light.Proc-   Copyright   : Copyright (C) 2007 Galois, Inc., 2021 John MacFarlane+   Copyright   : Copyright (C) 2007 Galois, Inc., 2021-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
src/Text/Pandoc/XML/Light/Types.hs view
@@ -2,7 +2,7 @@ {-# LANGUAGE DeriveDataTypeable #-} {- |    Module      : Text.Pandoc.XML.Light.Types-   Copyright   : Copyright (C) 2007 Galois, Inc., 2021 John MacFarlane+   Copyright   : Copyright (C) 2007 Galois, Inc., 2021-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
stack.yaml view
@@ -9,11 +9,12 @@ extra-deps: - skylighting-core-0.12.1 - skylighting-0.12.1-- doctemplates-0.10+- doctemplates-0.10.0.1 - emojis-0.1.2 - doclayout-0.3.1.1 - lpeg-1.0.1 - hslua-2.0.1+- hslua-aeson-2.0.1 - hslua-classes-2.0.0 - hslua-core-2.0.0.2 - hslua-marshalling-2.0.1@@ -23,18 +24,24 @@ - hslua-module-version-1.0.0 - hslua-objectorientation-2.0.1 - hslua-packaging-2.0.0-- lua-2.0.1+- lua-2.0.2 - tasty-hslua-1.0.0 - tasty-lua-1.0.0+- pandoc-lua-marshal-0.1.3 - pandoc-types-1.22.1-- commonmark-0.2.1.1-- commonmark-extensions-0.2.2-- citeproc-0.6 - aeson-pretty-0.8.9-- ipynb-0.1.0.2-- texmath-0.12.3.3+- unicode-transforms-0.4.0+- unicode-data-0.2.0+- texmath-0.12.4+- commonmark-0.2.1.1+- commonmark-extensions-0.2.3+- commonmark-pandoc-0.2.1.1+- citeproc-0.6.0.1+- ipynb-0.2 ghc-options:    "$locals": -fhide-source-paths -Wno-missing-home-modules resolver: lts-18.10 nix:   packages: [zlib]++
test/Tests/Command.hs view
@@ -1,6 +1,6 @@ {- |    Module      : Tests.Command-   Copyright   : © 2006-2021 John MacFarlane+   Copyright   : © 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley@edu>
test/Tests/Helpers.hs view
@@ -3,7 +3,7 @@ {-# LANGUAGE FlexibleInstances    #-} {- |    Module      : Tests.Helpers-   Copyright   : © 2006-2021 John MacFarlane+   Copyright   : © 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley@edu>
test/Tests/Lua.hs view
@@ -3,7 +3,7 @@ {-# LANGUAGE TypeApplications    #-} {- |    Module      : Tests.Lua-   Copyright   : © 2017-2021 Albert Krewinkel+   Copyright   : © 2017-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <albert@zeitkraut.de>@@ -14,12 +14,10 @@ -} module Tests.Lua ( runLuaTest, tests ) where -import Control.Monad (when) import HsLua as Lua hiding (Operation (Div), error) import System.FilePath ((</>))-import Test.Tasty (TestTree, testGroup, localOption)+import Test.Tasty (TestTree, testGroup) import Test.Tasty.HUnit ((@=?), Assertion, HasCallStack, assertEqual, testCase)-import Test.Tasty.QuickCheck (QuickCheckTests (..), ioProperty, testProperty) import Text.Pandoc.Arbitrary () import Text.Pandoc.Builder (bulletList, definitionList, displayMath, divWith,                             doc, doubleQuoted, emph, header, lineBlock,@@ -28,10 +26,10 @@                             HasMeta (setMeta)) import Text.Pandoc.Class (runIOorExplode, setUserDataDir) import Text.Pandoc.Definition (Attr, Block (BlockQuote, Div, Para), Pandoc,-                               Inline (Emph, Str), Meta, pandocTypesVersion)+                               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) @@ -40,20 +38,8 @@ import qualified Data.Text.Encoding as TE  tests :: [TestTree]-tests = map (localOption (QuickCheckTests 20))-  [ testProperty "inline elements can be round-tripped through the lua stack" $-    ioProperty . roundtripEqual @Inline--  , testProperty "block elements can be round-tripped through the lua stack" $-    ioProperty . roundtripEqual @Block--  , testProperty "meta blocks can be round-tripped through the lua stack" $-    ioProperty . roundtripEqual @Meta--  , testProperty "documents can be round-tripped through the lua stack" $-    ioProperty . roundtripEqual @Pandoc--  , testCase "macro expansion via filter" $+tests =+  [ testCase "macro expansion via filter" $     assertFilterConversion "a '{{helloworld}}' string is expanded"       "strmacro.lua"       (doc . para $ str "{{helloworld}}")@@ -238,7 +224,7 @@       case eitherPandoc of         Left (PandocLuaError msg) -> do           let expectedMsg = "Pandoc expected, got boolean\n"-                <> "\twhile retrieving Pandoc value"+                <> "\twhile retrieving Pandoc"           Lua.liftIO $ assertEqual "unexpected error message" expectedMsg msg         Left e -> error ("Expected a Lua error, but got " <> show e)         Right _ -> error "Getting a Pandoc element from a bool should fail."@@ -251,23 +237,11 @@     applyFilters def [LuaFilter ("lua" </> filterPath)] ["HTML"] docIn   assertEqual msg expectedDoc actualDoc -roundtripEqual :: forall a. (Eq a, Lua.Pushable a, Lua.Peekable a)-               => a -> IO Bool-roundtripEqual x = (x ==) <$> roundtripped- where-  roundtripped :: IO a-  roundtripped = runLuaTest $ do-    oldSize <- Lua.gettop-    Lua.push x-    size <- Lua.gettop-    when (size - oldSize /= 1) $-      error ("not exactly one additional element on the stack: " ++ show size)-    Lua.peek Lua.top- runLuaTest :: HasCallStack => Lua.LuaE PandocError a -> IO a runLuaTest op = runIOorExplode $ do-  setUserDataDir (Just "../data")-  res <- runLua op+  res <- runLua $ do+    setGlobals [ PANDOC_WRITER_OPTIONS def ]+    op   case res of     Left e -> error (show e)     Right x -> return x
test/Tests/Lua/Module.hs view
@@ -1,6 +1,6 @@ {- | Module      : Tests.Lua.Module-Copyright   : © 2019-2021 Albert Krewinkel+Copyright   : © 2019-2022 Albert Krewinkel License     : GNU GPL, version 2 or above  Maintainer  : Albert Krewinkel <albert@zeitkraut.de>@@ -27,10 +27,14 @@                   ("lua" </> "module" </> "pandoc-mediabag.lua")   , testPandocLua "pandoc.path"                   ("lua" </> "module" </> "pandoc-path.lua")+  , testPandocLua "pandoc.template"+                  ("lua" </> "module" </> "pandoc-template.lua")   , testPandocLua "pandoc.types"                   ("lua" </> "module" </> "pandoc-types.lua")-  , testPandocLua "pandoc.util"+  , testPandocLua "pandoc.utils"                   ("lua" </> "module" </> "pandoc-utils.lua")+  , testPandocLua "globals"+                  ("lua" </> "module" </> "globals.lua")   ]  testPandocLua :: TestName -> FilePath -> TestTree
test/Tests/Old.hs view
@@ -1,6 +1,6 @@ {- |    Module      : Tests.Old-   Copyright   : © 2006-2021 John MacFarlane+   Copyright   : © 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley@edu>@@ -219,7 +219,16 @@                       "--markdown-headings=setext", "-t",                       "ipynb-raw_html-raw_tex+raw_attribute", "-s"]       "ipynb/simple.in.native" "ipynb/simple.ipynb"+    , test' "reader" ["-t", "native", "-f", "ipynb",+                      "--ipynb-output=all"]+      "ipynb/mime.ipynb" "ipynb/mime.native"+    , test' "writer" ["-f", "native", "-t", "ipynb",+                      "--wrap=preserve"]+      "ipynb/mime.native" "ipynb/mime.out.ipynb"+    , test' "reader" ["-f", "ipynb", "-t", "html"]+      "ipynb/rank.ipynb" "ipynb/rank.out.html"     ]+  , testGroup "markua" [ testGroup "writer" $ writerTests' "markua"]   ]  where     test'           = test pandocPath
test/Tests/Readers/Creole.hs view
@@ -2,7 +2,7 @@ {- |    Module      : Tests.Readers.Creole    Copyright   : © 2017 Sascha Wilde-                   2017-2021 John MacFarlane+                   2017-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : Sascha Wilde <wilde@sha-bang.de>
test/Tests/Readers/EPUB.hs view
@@ -1,6 +1,6 @@ {- |    Module      : Tests.Readers.EPUB-   Copyright   : © 2006-2021 John MacFarlane+   Copyright   : © 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.eu>
test/Tests/Readers/HTML.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Tests.Readers.HTML-   Copyright   : © 2006-2021 John MacFarlane+   Copyright   : © 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
test/Tests/Readers/Jira.hs view
@@ -2,7 +2,7 @@ {-# LANGUAGE ScopedTypeVariables #-} {- |    Module      : Tests.Readers.Jira-   Copyright   : © 2019-2021 Albert Krewinel+   Copyright   : © 2019-2022 Albert Krewinel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <tarleb@zeitkraut.de>
test/Tests/Readers/LaTeX.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Tests.Readers.LaTeX-   Copyright   : © 2006-2021 John MacFarlane+   Copyright   : © 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
test/Tests/Readers/Man.hs view
@@ -2,7 +2,7 @@ {- |    Module      : Tests.Readers.Man    Copyright   : © 2018-2019 Yan Pas <yanp.bugz@gmail.com>,-                   2018-2021 John MacFarlane+                   2018-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
test/Tests/Readers/Markdown.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Tests.Readers.Markdown-   Copyright   : © 2006-2021 John MacFarlane+   Copyright   : © 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
test/Tests/Readers/Odt.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Tests.Readers.Odt-   Copyright   : © 2015-2021 John MacFarlane+   Copyright   : © 2015-2022 John MacFarlane                    2015 Martin Linnemann    License     : GNU GPL, version 2 or above @@ -171,6 +171,7 @@                                   , "orderedListMixed"                                   , "orderedListRoman"                                   , "orderedListSimple"+                                  , "orderedListHeader"                                   , "referenceToChapter"                                   , "referenceToListItem"                                   , "referenceToText"@@ -182,4 +183,5 @@                                   , "tableWithContents"                                   , "unicode"                                   , "unorderedList"+                                  , "unorderedListHeader"                                   ]
test/Tests/Readers/Org.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Tests.Shared-   Copyright   : © 2014-2021 Albert Krewinkel+   Copyright   : © 2014-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <albert@zeitkraut.de>
test/Tests/Readers/Org/Block.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Tests.Readers.Org.Block-   Copyright   : © 2014-2021 Albert Krewinkel+   Copyright   : © 2014-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <albert@zeitkraut.de>
test/Tests/Readers/Org/Block/CodeBlock.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Tests.Readers.Org.Block.CodeBlock-   Copyright   : © 2014-2021 Albert Krewinkel+   Copyright   : © 2014-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <albert@zeitkraut.de>
test/Tests/Readers/Org/Block/Figure.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Tests.Readers.Org.Block.Figure-   Copyright   : © 2014-2021 Albert Krewinkel+   Copyright   : © 2014-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <albert@zeitkraut.de>
test/Tests/Readers/Org/Block/Header.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Tests.Readers.Org.Block.Header-   Copyright   : © 2014-2021 Albert Krewinkel+   Copyright   : © 2014-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <albert@zeitkraut.de>
test/Tests/Readers/Org/Block/List.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Tests.Readers.Org.Block.Header-   Copyright   : © 2014-2021 Albert Krewinkel+   Copyright   : © 2014-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <albert@zeitkraut.de>@@ -12,12 +12,21 @@ -} module Tests.Readers.Org.Block.List (tests) where +import Data.Text (Text) import Test.Tasty (TestTree)-import Tests.Helpers ((=?>))+import Tests.Helpers ((=?>), purely, test) import Tests.Readers.Org.Shared ((=:), spcSep)+import Text.Pandoc (ReaderOptions (readerExtensions),+                    Extension (Ext_fancy_lists), def, enableExtension,+                    getDefaultExtensions, readOrg) import Text.Pandoc.Builder import qualified Data.Text as T +orgFancyLists :: Text -> Pandoc+orgFancyLists = purely $+  let extensionsFancy = enableExtension Ext_fancy_lists (getDefaultExtensions "org")+  in readOrg def{ readerExtensions = extensionsFancy }+ tests :: [TestTree] tests =   [ "Simple Bullet Lists" =:@@ -27,6 +36,13 @@                  , plain "Item2"                  ] +  , "Simple Bullet List with Ignored Counter Cookie" =:+      ("- [@4] Item1\n" <>+       "- Item2\n") =?>+      bulletList [ plain "Item1"+                 , plain "Item2"+                 ]+   , "Indented Bullet Lists" =:       ("   - Item1\n" <>        "   - Item2\n") =?>@@ -131,6 +147,36 @@                          ]                ] +  , "Task List with Counter Cookies" =:+    T.unlines [ "- [ ] nope"+              , "- [@9] [X] yup"+              , "- [@a][-] started"+              , "  1. [@3][X] sure"+              , "  2. [@b] [ ] nuh-uh"+              ] =?>+    bulletList [ plain "☐ nope", plain "☒ yup"+               , mconcat [ plain "☐ started"+                         , orderedListWith+                           (3, DefaultStyle, DefaultDelim)+                           [plain "☒ sure", plain "☐ nuh-uh"]+                         ]+               ]++  , test orgFancyLists "Task with alphabetical markers and counter cookie" $+    T.unlines [ "- [ ] nope"+              , "- [@9] [X] yup"+              , "- [@a][-] started"+              , "  a) [@D][X] sure"+              , "  b) [@8] [ ] nuh-uh"+              ] =?>+    bulletList [ plain "☐ nope", plain "☒ yup"+               , mconcat [ plain "☐ started"+                         , orderedListWith+                           (4, LowerAlpha, OneParen)+                           [plain "☒ sure", plain "☐ nuh-uh"]+                         ]+               ]+   , "Simple Ordered List" =:       ("1. Item1\n" <>        "2. Item2\n") =?>@@ -140,6 +186,60 @@                           ]       in orderedListWith listStyle listStructure +  , test orgFancyLists "Simple Ordered List with fancy lists extension" $+      ("1. Item1\n" <>+       "2. Item2\n") =?>+      let listStyle = (1, Decimal, Period)+          listStructure = [ plain "Item1"+                          , plain "Item2"+                          ]+      in orderedListWith listStyle listStructure++  , test orgFancyLists "Simple Ordered List with lower alpha marker" $+      ("a) Item1\n" <>+       "b) Item2\n") =?>+      let listStyle = (1, LowerAlpha, OneParen)+          listStructure = [ plain "Item1"+                          , plain "Item2"+                          ]+      in orderedListWith listStyle listStructure++  , test orgFancyLists "Simple Ordered List with upper and lower alpha markers" $+      ("A. Item1\n" <>+       "b) Item2\n") =?>+      let listStyle = (1, UpperAlpha, Period)+          listStructure = [ plain "Item1"+                          , plain "Item2"+                          ]+      in orderedListWith listStyle listStructure++  , "Simple Ordered List with Counter Cookie" =:+      ("1. [@1234] Item1\n" <>+       "2. Item2\n") =?>+      let listStyle = (1234, DefaultStyle, DefaultDelim)+          listStructure = [ plain "Item1"+                          , plain "Item2"+                          ]+      in orderedListWith listStyle listStructure++  , "Simple Ordered List with Alphabetical Counter Cookie" =:+      ("1. [@c] Item1\n" <>+       "2. Item2\n") =?>+      let listStyle = (3, DefaultStyle, DefaultDelim)+          listStructure = [ plain "Item1"+                          , plain "Item2"+                          ]+      in orderedListWith listStyle listStructure++  , "Simple Ordered List with Ignored Counter Cookie" =:+      ("1. Item1\n" <>+       "2. [@4] Item2\n") =?>+      let listStyle = (1, DefaultStyle, DefaultDelim)+          listStructure = [ plain "Item1"+                          , plain "Item2"+                          ]+      in orderedListWith listStyle listStructure+   , "Simple Ordered List with Parens" =:       ("1) Item1\n" <>        "2) Item2\n") =?>@@ -163,6 +263,19 @@                 , "3. "                 ] =?>       orderedList [ plain "", plain "" ]++  , test orgFancyLists "Empty ordered list item with fancy lists extension" $+      T.unlines [ "a."+                , "2. "+                ] =?>+      orderedListWith (1, LowerAlpha, Period) [ plain "", plain "" ]++  , "Empty ordered list item with counter cookie" =:+      T.unlines [ "1. [@5]"+                , "3. [@e] "+                ] =?>+      let listStyle = (5, DefaultStyle, DefaultDelim)+      in orderedListWith listStyle [ plain "", plain "" ]    , "Nested Ordered Lists" =:       ("1. One\n" <>
test/Tests/Readers/Org/Block/Table.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Tests.Readers.Org.Block.Table-   Copyright   : © 2014-2021 Albert Krewinkel+   Copyright   : © 2014-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <albert@zeitkraut.de>
test/Tests/Readers/Org/Directive.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Tests.Readers.Org.Directive-   Copyright   : © 2014-2021 Albert Krewinkel+   Copyright   : © 2014-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <albert@zeitkraut.de>
test/Tests/Readers/Org/Inline.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Tests.Readers.Org.Inline-   Copyright   : © 2014-2021 Albert Krewinkel+   Copyright   : © 2014-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <albert@zeitkraut.de>@@ -212,6 +212,14 @@                 , "[[file:guinea-pig.gif]]"                 ] =?>       para (imageWith ("", [], [("width", "50%")]) "guinea-pig.gif" "" "")++    , "HTML attributes can have trailing spaces" =:+      T.unlines [ "#+attr_html: :width 100% :height 360px  "+                , "[[file:fireworks.jpg]]"+                ] =?>+      let kv = [("width", "100%"), ("height", "360px")]+      in para (imageWith (mempty, mempty, kv) "fireworks.jpg" mempty mempty)+      , "Uppercase extension" =:       "[[file:test.PNG]]" =?>
test/Tests/Readers/Org/Inline/Citation.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Tests.Readers.Org.Inline.Citation-   Copyright   : © 2014-2021 Albert Krewinkel+   Copyright   : © 2014-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <albert@zeitkraut.de>@@ -19,9 +19,9 @@  tests :: [TestTree] tests =-  [ testGroup "Markdown-style citations"+  [ testGroup "Org-cite citations"     [ "Citation" =:-      "[@nonexistent]" =?>+      "[cite:@nonexistent]" =?>       let citation = Citation                      { citationId = "nonexistent"                      , citationPrefix = []@@ -29,10 +29,10 @@                      , citationMode = NormalCitation                      , citationNoteNum = 0                      , citationHash = 0}-      in (para $ cite [citation] "[@nonexistent]")+      in (para $ cite [citation] "[cite:@nonexistent]")      , "Citation containing text" =:-      "[see @item1 p. 34-35]" =?>+      "[cite:see @item1 p. 34-35]" =?>       let citation = Citation                      { citationId = "item1"                      , citationPrefix = [Str "see"]@@ -40,7 +40,37 @@                      , citationMode = NormalCitation                      , citationNoteNum = 0                      , citationHash = 0}-      in (para $ cite [citation] "[see @item1 p. 34-35]")+      in (para $ cite [citation] "[cite:see @item1 p. 34-35]")++    , "Author-in-text citation with locator and suffix" =:+      "[cite/t:see @item1 p. 34-35 and *passim*; @item2]" =?>+      let citations =+            [ Citation+                { citationId = "item1"+                , citationPrefix = [ Str "see" ]+                , citationSuffix =+                    [ Str "p."+                    , Space+                    , Str "34-35"+                    , Space+                    , Str "and"+                    , Space+                    , Strong [ Str "passim" ]+                    ]+                , citationMode = AuthorInText+                , citationNoteNum = 0+                , citationHash = 0+                }+            , Citation+                { citationId = "item2"+                , citationPrefix = []+                , citationSuffix = []+                , citationMode = NormalCitation+                , citationNoteNum = 0+                , citationHash = 0+                }+            ]+      in (para $ cite citations "[cite/t:see @item1 p. 34-35 and *passim*; @item2]")     ]    , testGroup "org-ref citations"@@ -167,53 +197,6 @@                      , citationHash = 0                      }       in (para $ cite [citation] "[[citep:Dominik201408][See page 20::, for example]]")-    ]--  , testGroup "Berkeley-style citations" $-    let pandocCite = Citation-          { citationId = "Pandoc"-          , citationPrefix = mempty-          , citationSuffix = mempty-          , citationMode = NormalCitation-          , citationNoteNum = 0-          , citationHash = 0-          }-        pandocInText = pandocCite { citationMode = AuthorInText }-        dominikCite = Citation-          { citationId = "Dominik201408"-          , citationPrefix = mempty-          , citationSuffix = mempty-          , citationMode = NormalCitation-          , citationNoteNum = 0-          , citationHash = 0-          }-        dominikInText = dominikCite { citationMode = AuthorInText }-    in-      [ "Berkeley-style in-text citation" =:-        "See @Dominik201408." =?>-        para ("See "-               <> cite [dominikInText] "@Dominik201408"-               <> ".")--      , "Berkeley-style parenthetical citation list" =:-        "[(cite): see; @Dominik201408;also @Pandoc; and others]" =?>-        let pandocCite'  = pandocCite {-                             citationPrefix = toList "also"-                           , citationSuffix = toList "and others"-                           }-            dominikCite' = dominikCite {-                             citationPrefix = toList "see"-                           }-        in (para $ cite [dominikCite', pandocCite'] "")--      , "Berkeley-style plain citation list" =:-        "[cite: See; @Dominik201408; and @Pandoc; and others]" =?>-        let pandocCite' = pandocInText { citationPrefix = toList "and" }-        in (para $ "See "-             <> cite [dominikInText] ""-             <> "," <> space-             <> cite [pandocCite'] ""-             <> "," <> space <> "and others")     ]    , "LaTeX citation" =:
test/Tests/Readers/Org/Inline/Note.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Tests.Readers.Org.Inline.Note-   Copyright   : © 2014-2021 Albert Krewinkel+   Copyright   : © 2014-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <albert@zeitkraut.de>
test/Tests/Readers/Org/Inline/Smart.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Tests.Readers.Org.Inline.Smart-   Copyright   : © 2014-2021 Albert Krewinkel+   Copyright   : © 2014-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <albert@zeitkraut.de>
test/Tests/Readers/Org/Meta.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Tests.Readers.Org.Meta-   Copyright   : © 2014-2021 Albert Krewinkel+   Copyright   : © 2014-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <albert@zeitkraut.de>
test/Tests/Readers/Org/Shared.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Tests.Readers.Org.Shared-   Copyright   : © 2014-2021 Albert Krewinkel+   Copyright   : © 2014-2022 Albert Krewinkel    License     : GNU GPL, version 2 or above     Maintainer  : Albert Krewinkel <albert@zeitkraut.de>
test/Tests/Readers/RST.hs view
@@ -2,7 +2,7 @@ {-# LANGUAGE ScopedTypeVariables #-} {- |    Module      : Tests.Readers.RST-   Copyright   : © 2006-2021 John MacFarlane+   Copyright   : © 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>
test/Tests/Readers/RTF.hs view
@@ -1,6 +1,6 @@ {- |    Module      : Tests.Readers.RTF-   Copyright   : © 2021 John MacFarlane+   Copyright   : © 2021-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : jgm@berkeley.edu
test/Tests/Readers/Txt2Tags.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Tests.Readers.Txt2Tags-   Copyright   : © 2014-2021 John MacFarlane,+   Copyright   : © 2014-2022 John MacFarlane,                  © 2014 Matthew Pickering    License     : GNU GPL, version 2 or above 
test/Tests/Shared.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Tests.Shared-   Copyright   : © 2006-2021 John MacFarlane+   Copyright   : © 2006-2022 John MacFarlane    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley@edu>
test/Tests/Writers/Docx.hs view
@@ -88,6 +88,11 @@             "docx/lists_multiple_initial.native"             "docx/golden/lists_multiple_initial.docx"           , docxTest+            "lists with div bullets"+            def+            "docx/lists_div_bullets.native"+            "docx/golden/lists_div_bullets.docx"+          , docxTest             "definition lists"             def             "docx/definition_list.native"
test/Tests/Writers/HTML.hs view
@@ -2,6 +2,7 @@ module Tests.Writers.HTML (tests) where  import Data.Text (unpack)+import qualified Data.Text as T import Test.Tasty import Tests.Helpers import Text.Pandoc@@ -68,7 +69,7 @@   , testGroup "blocks"     [ "definition list with empty <dt>" =:       definitionList [(mempty, [para $ text "foo bar"])]-      =?> "<dl><dt></dt><dd><p>foo bar</p></dd></dl>"+      =?> "<dl>\n<dt></dt>\n<dd>\n<p>foo bar</p>\n</dd>\n</dl>"     , "heading with disallowed attributes" =:       headerWith ("", [], [("invalid","1"), ("lang", "en")]) 1 "test"       =?>@@ -108,37 +109,66 @@       [ test (htmlWithOpts def{writerReferenceLocation=EndOfDocument})         "at the end of a document" $         noteTestDoc =?>-        concat+        T.unlines           [ "<h1>Page title</h1>"           , "<h2>First section</h2>"           , "<p>This is a footnote.<a href=\"#fn1\" class=\"footnote-ref\" id=\"fnref1\"><sup>1</sup></a> And this is a <a href=\"https://www.google.com\">link</a>.</p>"-          , "<blockquote><p>A note inside a block quote.<a href=\"#fn2\" class=\"footnote-ref\" id=\"fnref2\"><sup>2</sup></a></p><p>A second paragraph.</p></blockquote>"+          , "<blockquote>"+          , "<p>A note inside a block quote.<a href=\"#fn2\" class=\"footnote-ref\" id=\"fnref2\"><sup>2</sup></a></p>"+          , "<p>A second paragraph.</p>"+          , "</blockquote>"           , "<h2>Second section</h2>"           , "<p>Some more text.</p>"-          , "<div class=\"footnotes footnotes-end-of-document\"><hr /><ol><li id=\"fn1\"><p>Down here.<a href=\"#fnref1\" class=\"footnote-back\">↩︎</a></p></li><li id=\"fn2\"><p>The second note.<a href=\"#fnref2\" class=\"footnote-back\">↩︎</a></p></li></ol></div>"+          , "<div class=\"footnotes footnotes-end-of-document\">"+          , "<hr />"+          , "<ol>"+          , "<li id=\"fn1\"><p>Down here.<a href=\"#fnref1\" class=\"footnote-back\">↩︎</a></p></li>"+          , "<li id=\"fn2\"><p>The second note.<a href=\"#fnref2\" class=\"footnote-back\">↩︎</a></p></li>"+          , "</ol>"+          , "</div>"           ]       , test (htmlWithOpts def{writerReferenceLocation=EndOfBlock})         "at the end of a block" $         noteTestDoc =?>-        concat+        T.unlines           [ "<h1>Page title</h1>"           , "<h2>First section</h2>"           , "<p>This is a footnote.<a href=\"#fn1\" class=\"footnote-ref\" id=\"fnref1\"><sup>1</sup></a> And this is a <a href=\"https://www.google.com\">link</a>.</p>"-          , "<div class=\"footnotes footnotes-end-of-block\"><ol><li id=\"fn1\"><p>Down here.<a href=\"#fnref1\" class=\"footnote-back\">↩︎</a></p></li></ol></div>"-          , "<blockquote><p>A note inside a block quote.<a href=\"#fn2\" class=\"footnote-ref\" id=\"fnref2\"><sup>2</sup></a></p><p>A second paragraph.</p></blockquote>"-          , "<div class=\"footnotes footnotes-end-of-block\"><ol start=\"2\"><li id=\"fn2\"><p>The second note.<a href=\"#fnref2\" class=\"footnote-back\">↩︎</a></p></li></ol></div>"+          , "<div class=\"footnotes footnotes-end-of-block\">"+          , "<ol>"+          , "<li id=\"fn1\"><p>Down here.<a href=\"#fnref1\" class=\"footnote-back\">↩︎</a></p></li>"+          , "</ol>"+          , "</div>"+          , "<blockquote>"+          , "<p>A note inside a block quote.<a href=\"#fn2\" class=\"footnote-ref\" id=\"fnref2\"><sup>2</sup></a></p>"+          , "<p>A second paragraph.</p>"+          , "</blockquote>"+          , "<div class=\"footnotes footnotes-end-of-block\">"+          , "<ol start=\"2\">"+          , "<li id=\"fn2\"><p>The second note.<a href=\"#fnref2\" class=\"footnote-back\">↩︎</a></p></li>"+          , "</ol>"+          , "</div>"           , "<h2>Second section</h2>"           , "<p>Some more text.</p>"           ]       , test (htmlWithOpts def{writerReferenceLocation=EndOfSection})         "at the end of a section" $         noteTestDoc =?>-        concat+        T.unlines           [ "<h1>Page title</h1>"           , "<h2>First section</h2>"           , "<p>This is a footnote.<a href=\"#fn1\" class=\"footnote-ref\" id=\"fnref1\"><sup>1</sup></a> And this is a <a href=\"https://www.google.com\">link</a>.</p>"-          , "<blockquote><p>A note inside a block quote.<a href=\"#fn2\" class=\"footnote-ref\" id=\"fnref2\"><sup>2</sup></a></p><p>A second paragraph.</p></blockquote>"-          , "<div class=\"footnotes footnotes-end-of-section\"><hr /><ol><li id=\"fn1\"><p>Down here.<a href=\"#fnref1\" class=\"footnote-back\">↩︎</a></p></li><li id=\"fn2\"><p>The second note.<a href=\"#fnref2\" class=\"footnote-back\">↩︎</a></p></li></ol></div>"+          , "<blockquote>"+          , "<p>A note inside a block quote.<a href=\"#fn2\" class=\"footnote-ref\" id=\"fnref2\"><sup>2</sup></a></p>"+          , "<p>A second paragraph.</p>"+          , "</blockquote>"+          , "<div class=\"footnotes footnotes-end-of-section\">"+          , "<hr />"+          , "<ol>"+          , "<li id=\"fn1\"><p>Down here.<a href=\"#fnref1\" class=\"footnote-back\">↩︎</a></p></li>"+          , "<li id=\"fn2\"><p>The second note.<a href=\"#fnref2\" class=\"footnote-back\">↩︎</a></p></li>"+          , "</ol>"+          , "</div>"           , "<h2>Second section</h2>"           , "<p>Some more text.</p>"           ]@@ -147,15 +177,28 @@         noteTestDoc =?>         -- Footnotes are rendered _after_ their section (in this case after the level2 section         -- that contains it).-        concat+        T.unlines           [ "<div class=\"section level1\">"           , "<h1>Page title</h1>"           , "<div class=\"section level2\">"           , "<h2>First section</h2>"-          , "<p>This is a footnote.<a href=\"#fn1\" class=\"footnote-ref\" id=\"fnref1\"><sup>1</sup></a> And this is a <a href=\"https://www.google.com\">link</a>.</p><blockquote><p>A note inside a block quote.<a href=\"#fn2\" class=\"footnote-ref\" id=\"fnref2\"><sup>2</sup></a></p><p>A second paragraph.</p></blockquote>"+          , "<p>This is a footnote.<a href=\"#fn1\" class=\"footnote-ref\" id=\"fnref1\"><sup>1</sup></a> And this is a <a href=\"https://www.google.com\">link</a>.</p>"+          , "<blockquote>"+          , "<p>A note inside a block quote.<a href=\"#fn2\" class=\"footnote-ref\" id=\"fnref2\"><sup>2</sup></a></p>"+          , "<p>A second paragraph.</p>"+          , "</blockquote>"           , "</div>"-          , "<div class=\"footnotes footnotes-end-of-section\"><hr /><ol><li id=\"fn1\"><p>Down here.<a href=\"#fnref1\" class=\"footnote-back\">↩︎</a></p></li><li id=\"fn2\"><p>The second note.<a href=\"#fnref2\" class=\"footnote-back\">↩︎</a></p></li></ol></div>"-          , "<div class=\"section level2\"><h2>Second section</h2><p>Some more text.</p></div>"+          , "<div class=\"footnotes footnotes-end-of-section\">"+          , "<hr />"+          , "<ol>"+          , "<li id=\"fn1\"><p>Down here.<a href=\"#fnref1\" class=\"footnote-back\">↩︎</a></p></li>"+          , "<li id=\"fn2\"><p>The second note.<a href=\"#fnref2\" class=\"footnote-back\">↩︎</a></p></li>"+          , "</ol>"+          , "</div>"+          , "<div class=\"section level2\">"+          , "<h2>Second section</h2>"+          , "<p>Some more text.</p>"+          , "</div>"           , "</div>"           ]       ]
+ test/Tests/Writers/Markua.hs view
@@ -0,0 +1,40 @@+{-# LANGUAGE OverloadedStrings #-}+module Tests.Writers.Markua (tests) where++import Test.Tasty+import Tests.Helpers+import Text.Pandoc+import Text.Pandoc.Arbitrary ()+import Text.Pandoc.Builder++{-+  "my test" =: X =?> Y++is shorthand for++  test html "my test" $ X =?> Y++which is in turn shorthand for++  test html "my test" (X,Y)+-}++infix 4 =:+(=:) :: (ToString a, ToPandoc a)+     => String -> (a, String) -> TestTree+(=:) = test (purely (writeMarkua def) . toPandoc)++tests :: [TestTree]+tests = [ testGroup "simple blurb/aside"+          ["blurb"          =: divWith ("",["blurb"],[]) (bulletList [para "blurb content"])+                           =?> "B> * blurb content"+          ,"aside"          =: divWith ("",["aside"],[]) (bulletList [para "aside list"])+                           =?> "A> * aside list"+          ]+         ,testGroup "multiclass blurb/aside"+          ["blurb"          =: divWith ("",["blurb", "otherclass"],[]) (bulletList [para "blurb content"])+                           =?> "B> * blurb content"+          ,"aside"          =: divWith ("",["otherclass", "aside"],[]) (bulletList [para "aside list"])+                           =?> "A> * aside list"+          ]+         ]
test/Tests/Writers/Org.hs view
@@ -50,6 +50,14 @@           [ "1. [ ] a"           , "2. [X] b"           ]+    , "ordered task list with starting number"+      =: orderedListWith+         (9, DefaultStyle, DefaultDelim)+         [plain ("☐" <> space <> "a"), plain "☒ b"]+      =?> T.unlines+          [ "9. [@9] [ ] a"+          , "10. [X] b"+          ]     , test (orgWithOpts def) "bullet without task_lists" $       bulletList [plain "☐ a", plain "☒ b"]       =?> T.unlines
test/Tests/Writers/Powerpoint.hs view
@@ -1,5 +1,6 @@ module Tests.Writers.Powerpoint (tests) where +import Control.Arrow ((***)) import Tests.Writers.OOXML (ooxmlTest) import Text.Pandoc import Test.Tasty@@ -42,198 +43,194 @@     , testGroup "With `--reference-doc` pptx file" refs     ] +testGroup' :: String -> [(TestTree, TestTree)] -> (TestTree, TestTree)+testGroup' descr = (testGroup descr *** testGroup descr) . unzip + tests :: [TestTree] tests = let-  regularTests =-    groupPptxTests [ pptxTests "Inline formatting"-                     def-                     "pptx/inline-formatting/input.native"-                     "pptx/inline-formatting/output.pptx"-                   , pptxTests "Slide breaks (default slide-level)"-                     def-                     "pptx/slide-breaks/input.native"-                     "pptx/slide-breaks/output.pptx"-                   , pptxTests "slide breaks (slide-level set to 1)"-                     def{ writerSlideLevel = Just 1 }-                     "pptx/slide-breaks/input.native"-                     "pptx/slide-breaks-slide-level-1/output.pptx"-                   , pptxTests "lists"-                     def-                     "pptx/lists/input.native"-                     "pptx/lists/output.pptx"-                   , pptxTests "start ordered list at specified num"-                     def-                     "pptx/start-numbering-at/input.native"-                     "pptx/start-numbering-at/output.pptx"-                   , pptxTests "List continuation paragraph indentation"-                     def-                     "pptx/list-level/input.native"-                     "pptx/list-level/output.pptx"-                   , pptxTests "tables"-                     def-                     "pptx/tables/input.native"-                     "pptx/tables/output.pptx"-                   , pptxTests "table of contents"-                     def{ writerTableOfContents = True }-                     "pptx/slide-breaks/input.native"-                     "pptx/slide-breaks-toc/output.pptx"-                   , pptxTests "end notes"-                     def-                     "pptx/endnotes/input.native"-                     "pptx/endnotes/output.pptx"-                   , pptxTests "end notes, with table of contents"-                     def { writerTableOfContents = True }-                     "pptx/endnotes/input.native"-                     "pptx/endnotes-toc/output.pptx"-                   , pptxTests "images"-                     def-                     "pptx/images/input.native"-                     "pptx/images/output.pptx"-                   , pptxTests "two-column layout"-                     def-                     "pptx/two-column/all-text/input.native"-                     "pptx/two-column/all-text/output.pptx"-                   , pptxTests "two-column (not comparison)"-                     def-                     "pptx/two-column/text-and-image/input.native"-                     "pptx/two-column/text-and-image/output.pptx"-                   , pptxTests "speaker notes"-                     def-                     "pptx/speaker-notes/input.native"-                     "pptx/speaker-notes/output.pptx"-                   , pptxTests "speaker notes after a separating block"-                     def-                     "pptx/speaker-notes-afterseps/input.native"-                     "pptx/speaker-notes-afterseps/output.pptx"-                   , pptxTests "speaker notes after a separating header"-                     def-                     "pptx/speaker-notes-afterheader/input.native"-                     "pptx/speaker-notes-afterheader/output.pptx"-                   , pptxTests "speaker notes after metadata"-                     def-                     "pptx/speaker-notes-after-metadata/input.native"-                     "pptx/speaker-notes-after-metadata/output.pptx"-                   , pptxTests "remove empty slides"-                     def-                     "pptx/remove-empty-slides/input.native"-                     "pptx/remove-empty-slides/output.pptx"-                   , pptxTests "raw ooxml"-                     def-                     "pptx/raw-ooxml/input.native"-                     "pptx/raw-ooxml/output.pptx"-                   , pptxTests "metadata, custom properties"-                     def-                     "pptx/document-properties/input.native"-                     "pptx/document-properties/output.pptx"-                   , pptxTests "metadata, short description"-                     def-                     "pptx/document-properties-short-desc/input.native"-                     "pptx/document-properties-short-desc/output.pptx"-                   , pptxTests "inline code and code blocks"-                     def-                     "pptx/code/input.native"-                     "pptx/code/output.pptx"-                   , pptxTests "inline code and code blocks, custom formatting"-                     def { writerVariables = Context $ M.fromList-                             [(pack "monofont", toVal $ pack "Consolas")] }-                     "pptx/code/input.native"-                     "pptx/code-custom/output.pptx"-                   , pptxTests ("Using slide level 0, if the first thing on "-                                <> "a slide is a h1 it's used as the "-                                <> "slide title")-                     def { writerSlideLevel = Just 0 }-                     "pptx/slide-level-0/h1-with-image/input.native"-                     "pptx/slide-level-0/h1-with-image/output.pptx"-                   , pptxTests ("Using slide level 0, if the first thing on "-                                <> "a slide is a h2 it's used as the "-                                <> "slide title")-                     def { writerSlideLevel = Just 0 }-                     "pptx/slide-level-0/h2-with-image/input.native"-                     "pptx/slide-level-0/h2-with-image/output.pptx"-                   , pptxTests ("Using slide level 0, if the first thing on "-                                <> "a slide is a heading it's used as the "-                                <> "slide title (works with a table)")-                     def { writerSlideLevel = Just 0 }-                     "pptx/slide-level-0/h1-with-table/input.native"-                     "pptx/slide-level-0/h1-with-table/output.pptx"-                   , pptxTests ("Using slide level 0, if the first thing on "-                                <> "a slide is a heading it's used as the "-                                <> "slide title (content with caption layout)")-                     def { writerSlideLevel = Just 0 }-                     "pptx/slide-level-0/h1-h2-with-table/input.native"-                     "pptx/slide-level-0/h1-h2-with-table/output.pptx"-                   , pptxTests ("comparison layout used when two columns "-                                <> "contain text plus non-text")-                     def-                     "pptx/comparison/both-columns/input.native"-                     "pptx/comparison/both-columns/output.pptx"-                   , pptxTests ("comparison layout used even when only one "-                                <> "column contains text plus non-text")-                     def-                     "pptx/comparison/one-column/input.native"-                     "pptx/comparison/one-column/output.pptx"-                   , pptxTests ("extra text in one column in comparison "-                                <> "layout gets overlaid")-                     def-                     "pptx/comparison/extra-text/input.native"-                     "pptx/comparison/extra-text/output.pptx"-                   , pptxTests ("extra image in one column in comparison "-                               <> "layout gets overlaid")-                     def-                     "pptx/comparison/extra-image/input.native"-                     "pptx/comparison/extra-image/output.pptx"-                   , pptxTests "comparison not used if the non-text comes first"-                     def-                     "pptx/comparison/non-text-first/input.native"-                     "pptx/comparison/non-text-first/output.pptx"-                   , pptxTests ("Heading, text and an image on the same "-                                <> "slide uses the Content with Caption "-                                <> "layout")-                     def-                     "pptx/content-with-caption/heading-text-image/input.native"-                     "pptx/content-with-caption/heading-text-image/output.pptx"-                   , pptxTests ("Text and an image on the same "-                                <> "slide uses the Content with Caption "-                                <> "layout")-                     def-                     "pptx/content-with-caption/text-image/input.native"-                     "pptx/content-with-caption/text-image/output.pptx"-                   , pptxTests ("If the image comes first, Content with "-                                <> "Caption is not used")-                     def-                     "pptx/content-with-caption/image-text/input.native"-                     "pptx/content-with-caption/image-text/output.pptx"-                   , pptxTests ("If a slide contains only speaker notes, the "-                                <> "Blank layout is used")-                     def-                     "pptx/blanks/just-speaker-notes/input.native"-                     "pptx/blanks/just-speaker-notes/output.pptx"-                   , pptxTests ("If a slide contains only an empty heading "-                                <> "with a body of only non-breaking spaces"-                                <> ", the Blank layout is used")-                     def-                     "pptx/blanks/nbsp-in-body/input.native"-                     "pptx/blanks/nbsp-in-body/output.pptx"-                   , pptxTests ("If a slide contains only a heading "-                                <> "containing only non-breaking spaces, "-                                <> "the Blank layout is used")-                     def-                     "pptx/blanks/nbsp-in-heading/input.native"-                     "pptx/blanks/nbsp-in-heading/output.pptx"-                   , pptxTests ("Incremental lists are supported")-                     def { writerIncremental = True }-                     "pptx/incremental-lists/with-flag/input.native"-                     "pptx/incremental-lists/with-flag/output.pptx"-                   , pptxTests ("One-off incremental lists are supported")-                     def-                     "pptx/incremental-lists/without-flag/input.native"-                     "pptx/incremental-lists/without-flag/output.pptx"-                   , pptxTests "Background images"-                     def-                     "pptx/background-image/input.native"-                     "pptx/background-image/output.pptx"-                   ]+  regularTests = groupPptxTests+    [ pptxTests "Inline formatting"+      def+      "pptx/inline-formatting/input.native"+      "pptx/inline-formatting/output.pptx"+    , pptxTests "Slide breaks (default slide-level)"+      def+      "pptx/slide-breaks/input.native"+      "pptx/slide-breaks/output.pptx"+    , pptxTests "slide breaks (slide-level set to 1)"+      def{ writerSlideLevel = Just 1 }+      "pptx/slide-breaks/input.native"+      "pptx/slide-breaks-slide-level-1/output.pptx"+    , pptxTests "lists"+      def+      "pptx/lists/input.native"+      "pptx/lists/output.pptx"+    , pptxTests "start ordered list at specified num"+      def+      "pptx/start-numbering-at/input.native"+      "pptx/start-numbering-at/output.pptx"+    , pptxTests "List continuation paragraph indentation"+      def+      "pptx/list-level/input.native"+      "pptx/list-level/output.pptx"+    , pptxTests "tables"+      def+      "pptx/tables/input.native"+      "pptx/tables/output.pptx"+    , pptxTests "table of contents"+      def{ writerTableOfContents = True }+      "pptx/slide-breaks/input.native"+      "pptx/slide-breaks-toc/output.pptx"+    , pptxTests "end notes"+      def+      "pptx/endnotes/input.native"+      "pptx/endnotes/output.pptx"+    , pptxTests "end notes, with table of contents"+      def { writerTableOfContents = True }+      "pptx/endnotes/input.native"+      "pptx/endnotes-toc/output.pptx"+    , pptxTests "images"+      def+      "pptx/images/input.native"+      "pptx/images/output.pptx"+    , pptxTests "two-column layout"+      def+      "pptx/two-column/all-text/input.native"+      "pptx/two-column/all-text/output.pptx"+    , pptxTests "two-column (not comparison)"+      def+      "pptx/two-column/text-and-image/input.native"+      "pptx/two-column/text-and-image/output.pptx"+    , pptxTests "speaker notes"+      def+      "pptx/speaker-notes/input.native"+      "pptx/speaker-notes/output.pptx"+    , pptxTests "speaker notes after a separating block"+      def+      "pptx/speaker-notes-afterseps/input.native"+      "pptx/speaker-notes-afterseps/output.pptx"+    , pptxTests "speaker notes after a separating header"+      def+      "pptx/speaker-notes-afterheader/input.native"+      "pptx/speaker-notes-afterheader/output.pptx"+    , pptxTests "speaker notes after metadata"+      def+      "pptx/speaker-notes-after-metadata/input.native"+      "pptx/speaker-notes-after-metadata/output.pptx"+    , pptxTests "remove empty slides"+      def+      "pptx/remove-empty-slides/input.native"+      "pptx/remove-empty-slides/output.pptx"+    , pptxTests "raw ooxml"+      def+      "pptx/raw-ooxml/input.native"+      "pptx/raw-ooxml/output.pptx"+    , pptxTests "metadata, custom properties"+      def+      "pptx/document-properties/input.native"+      "pptx/document-properties/output.pptx"+    , pptxTests "metadata, short description"+      def+      "pptx/document-properties-short-desc/input.native"+      "pptx/document-properties-short-desc/output.pptx"+    , pptxTests "inline code and code blocks"+      def+      "pptx/code/input.native"+      "pptx/code/output.pptx"+    , pptxTests "inline code and code blocks, custom formatting"+      def { writerVariables = Context $ M.fromList+              [(pack "monofont", toVal $ pack "Consolas")] }+      "pptx/code/input.native"+      "pptx/code-custom/output.pptx"+    , testGroup' "Using slide level 0, if the first thing on a slide is"+      [ pptxTests ("a h1 it's used as the slide title")+        def { writerSlideLevel = Just 0 }+        "pptx/slide-level-0/h1-with-image/input.native"+        "pptx/slide-level-0/h1-with-image/output.pptx"+      , pptxTests ("a h2 it's used as the "+                   <> "slide title")+        def { writerSlideLevel = Just 0 }+        "pptx/slide-level-0/h2-with-image/input.native"+        "pptx/slide-level-0/h2-with-image/output.pptx"+      , testGroup' "a heading it's used as the slide title"+        [ pptxTests "(works with a table)"+          def { writerSlideLevel = Just 0 }+          "pptx/slide-level-0/h1-with-table/input.native"+          "pptx/slide-level-0/h1-with-table/output.pptx"+        , pptxTests ("(content with caption layout)")+          def { writerSlideLevel = Just 0 }+          "pptx/slide-level-0/h1-h2-with-table/input.native"+          "pptx/slide-level-0/h1-h2-with-table/output.pptx"+        ]+      ]+    , testGroup' "comparison layout"+      [ testGroup' "comparison layout is used..."+        [ pptxTests "when two columns contain text + non-text"+          def+          "pptx/comparison/both-columns/input.native"+          "pptx/comparison/both-columns/output.pptx"+        , pptxTests "even when only one col contains text + non-text"+          def+          "pptx/comparison/one-column/input.native"+          "pptx/comparison/one-column/output.pptx"+        ]+      , testGroup' "extra ... in one column gets overlaid"+        [ pptxTests "text"+          def+          "pptx/comparison/extra-text/input.native"+          "pptx/comparison/extra-text/output.pptx"+        , pptxTests "image"+          def+          "pptx/comparison/extra-image/input.native"+          "pptx/comparison/extra-image/output.pptx"+        ]+      , pptxTests "is not used if the non-text comes first"+        def+        "pptx/comparison/non-text-first/input.native"+        "pptx/comparison/non-text-first/output.pptx"+      ]+    , testGroup' "Content with Caption layout is ..."+      [ pptxTests "used for heading, text, image on the same slide"+        def+        "pptx/content-with-caption/heading-text-image/input.native"+        "pptx/content-with-caption/heading-text-image/output.pptx"+      , pptxTests "used for text and an image on the same slide"+        def+        "pptx/content-with-caption/text-image/input.native"+        "pptx/content-with-caption/text-image/output.pptx"+      , pptxTests "not used if the image comes first"+        def+        "pptx/content-with-caption/image-text/input.native"+        "pptx/content-with-caption/image-text/output.pptx"+      ]+    , testGroup' "The Blank layout is used if a slide contains only..."+      [ pptxTests "speaker notes"+        def+        "pptx/blanks/just-speaker-notes/input.native"+        "pptx/blanks/just-speaker-notes/output.pptx"+      , pptxTests "an empty heading with a body of only NBSPs"+        def+        "pptx/blanks/nbsp-in-body/input.native"+        "pptx/blanks/nbsp-in-body/output.pptx"+      , pptxTests "a heading containing only non-breaking spaces"+        def+        "pptx/blanks/nbsp-in-heading/input.native"+        "pptx/blanks/nbsp-in-heading/output.pptx"+      ]+    , pptxTests ("Incremental lists are supported")+      def { writerIncremental = True }+      "pptx/incremental-lists/with-flag/input.native"+      "pptx/incremental-lists/with-flag/output.pptx"+    , pptxTests ("One-off incremental lists are supported")+      def+      "pptx/incremental-lists/without-flag/input.native"+      "pptx/incremental-lists/without-flag/output.pptx"+    , pptxTests "Background images"+      def+      "pptx/background-image/input.native"+      "pptx/background-image/output.pptx"+    ]   referenceSpecificTests =     [ ooxmlTest       writePowerpoint
test/command/1608.md view
@@ -133,7 +133,7 @@               , ( "reference" , "def:tri" )               ]             )-            [ Str "Definition\160\&1" ]+            [ Str "1" ]             ( "#def:tri" , "" )         , Space         , Str "since"
test/command/262.md view
@@ -5,7 +5,8 @@ .. _hello: .. _goodbye: example.com ^D-<p><a href="example.com">hello</a> and <a href="example.com">goodbye</a></p>+<p><a href="example.com">hello</a> and <a+href="example.com">goodbye</a></p> ```  ```
test/command/2649.md view
@@ -90,17 +90,20 @@ <tbody> <tr class="odd"> <td><p>1</p></td>-<td><p><a href="Sébastien_Loeb" title="wikilink">Sébastien Loeb</a></p></td>+<td><p><a href="Sébastien_Loeb" title="wikilink">Sébastien+Loeb</a></p></td> <td><p>78</p></td> </tr> <tr class="even"> <td><p>2</p></td>-<td><p><strong><a href="Sébastien_Ogier" title="wikilink">Sébastien Ogier</a></strong></p></td>+<td><p><strong><a href="Sébastien_Ogier" title="wikilink">Sébastien+Ogier</a></strong></p></td> <td><p>38</p></td> </tr> <tr class="odd"> <td><p>10</p></td>-<td><p><a href="Hannu_Mikkola" title="wikilink">Hannu Mikkola</a></p></td>+<td><p><a href="Hannu_Mikkola" title="wikilink">Hannu+Mikkola</a></p></td> <td><p>18</p></td> </tr> </tbody>
test/command/3523.md view
@@ -19,8 +19,12 @@ \end{document} ^D <div class="epigraph">-<p>Das Recht hat kein Dasein f<span>ü</span>r sich, sein Wesen vielmehr ist das Leben des Menschen selbst, von einer besonderen Seite angesehen.</p>-<p>Das Recht hat kein Dasein f<span>ü</span>r sich, sein Wesen vielmehr ist das Leben des Menschen selbst, von einer besonderen Seite angesehen.</p>+<p>Das Recht hat kein Dasein f<span>ü</span>r sich, sein Wesen vielmehr+ist das Leben des Menschen selbst, von einer besonderen Seite+angesehen.</p>+<p>Das Recht hat kein Dasein f<span>ü</span>r sich, sein Wesen vielmehr+ist das Leben des Menschen selbst, von einer besonderen Seite+angesehen.</p> <ul> <li><p>hey</p></li> <li><p>hey</p></li>
test/command/3534.md view
@@ -2,7 +2,9 @@ % pandoc -f latex -t html I want to explain the interface of \lstinline[language=Java]{public class MyClass}. ^D-<p>I want to explain the interface of <code class="sourceCode java"><span class="kw">public</span> <span class="kw">class</span> MyClass</code>.</p>+<p>I want to explain the interface of <code+class="sourceCode java"><span class="kw">public</span> <span+class="kw">class</span> MyClass</code>.</p>  ``` @@ -10,7 +12,8 @@ % pandoc -f latex -t html I want to explain the interface of \lstinline{public class MyClass}. ^D-<p>I want to explain the interface of <code>public class MyClass</code>.</p>+<p>I want to explain the interface of <code>public class+MyClass</code>.</p>  ``` @@ -43,7 +46,9 @@ % pandoc -f latex -t html I want to explain the interface of \mintinline{java}{public class MyClass}. ^D-<p>I want to explain the interface of <code class="sourceCode java"><span class="kw">public</span> <span class="kw">class</span> MyClass</code>.</p>+<p>I want to explain the interface of <code+class="sourceCode java"><span class="kw">public</span> <span+class="kw">class</span> MyClass</code>.</p>  ``` @@ -51,7 +56,9 @@ % pandoc -f latex -t html I want to explain the interface of \mintinline{java}|public class MyClass|. ^D-<p>I want to explain the interface of <code class="sourceCode java"><span class="kw">public</span> <span class="kw">class</span> MyClass</code>.</p>+<p>I want to explain the interface of <code+class="sourceCode java"><span class="kw">public</span> <span+class="kw">class</span> MyClass</code>.</p>  ``` 
test/command/3577.md view
@@ -16,10 +16,12 @@ \end{figure} ^D <figure>-<img src="img1.jpg" alt="Caption 1" /><figcaption aria-hidden="true">Caption 1</figcaption>+<img src="img1.jpg" alt="Caption 1" />+<figcaption aria-hidden="true">Caption 1</figcaption> </figure> <figure>-<img src="img2.jpg" alt="Caption 2" /><figcaption aria-hidden="true">Caption 2</figcaption>+<img src="img2.jpg" alt="Caption 2" />+<figcaption aria-hidden="true">Caption 2</figcaption> </figure> ``` ```@@ -30,6 +32,7 @@ \end{figure} ^D <figure>-<img src="img1.jpg" alt="Caption 3" /><figcaption aria-hidden="true">Caption 3</figcaption>+<img src="img1.jpg" alt="Caption 3" />+<figcaption aria-hidden="true">Caption 3</figcaption> </figure> ```
test/command/3701.md view
@@ -55,6 +55,7 @@ ^D <p><a href="u">a</a></p> <p><a href="u">a</a></p>-<p><a href="u2">a</a> <a href="u">A</a> <a href="u" class="foo">a</a></p>+<p><a href="u2">a</a> <a href="u">A</a> <a href="u"+class="foo">a</a></p> <p><a href="u3">a</a></p> ```
test/command/3752.md view
@@ -32,11 +32,14 @@ ^D <h1 id="chapter-one">Chapter one</h1> <p>A spider: <img src="command/chap1/spider.png" alt="spider" /></p>-<p>Another spider: <img src="command/chap2/spider.png" alt="another spider" /></p>+<p>Another spider: <img src="command/chap2/spider.png"+alt="another spider" /></p> <p>The moon: <img src="command/chap1/../../lalune.jpg" alt="moon" /></p> <p>Link to <a href="command/chap1/spider.png">spider picture</a>.</p>-<p>URL left alone: <a href="https://pandoc.org/MANUAL.html">manual</a>.</p>-<p>Absolute path left alone: <a href="/foo/bar/baz.png">absolute</a>.</p>+<p>URL left alone: <a+href="https://pandoc.org/MANUAL.html">manual</a>.</p>+<p>Absolute path left alone: <a+href="/foo/bar/baz.png">absolute</a>.</p> <p>Link to fragment: <a href="#chapter-two">chapter two</a>.</p> <p>Empty path: <a href="">empty</a>.</p> <h1 id="chapter-two">Chapter two</h1>@@ -48,11 +51,14 @@ ^D <h1>Chapter one</h1> <p>A spider: <img src="command/chap1/spider.png" alt="spider" /></p>-<p>Another spider: <img src="command/chap2/spider.png" alt="another spider" /></p>+<p>Another spider: <img src="command/chap2/spider.png"+alt="another spider" /></p> <p>The moon: <img src="command/chap1/../../lalune.jpg" alt="moon" /></p> <p>Link to <a href="command/chap1/spider.png">spider picture</a>.</p>-<p>URL left alone: <a href="https://pandoc.org/MANUAL.html">manual</a>.</p>-<p>Absolute path left alone: <a href="/foo/bar/baz.png">absolute</a>.</p>+<p>URL left alone: <a+href="https://pandoc.org/MANUAL.html">manual</a>.</p>+<p>Absolute path left alone: <a+href="/foo/bar/baz.png">absolute</a>.</p> <p>Link to fragment: <a href="#chapter-two">chapter two</a>.</p> <p>Empty path: <a href="">empty</a>.</p> <h1>Chapter two</h1>
test/command/3792.md view
@@ -6,7 +6,7 @@ ok ^D ----title: \<this> \*that\*+title: \<this\> \*that\* ---  ok
test/command/3840.md view
@@ -2,7 +2,8 @@ % pandoc [@Alhazen1572-qk, V.9]: "competentius est" ^D-<p><span class="citation" data-cites="Alhazen1572-qk">[@Alhazen1572-qk, V.9]</span>: “competentius est”</p>+<p><span class="citation" data-cites="Alhazen1572-qk">[@Alhazen1572-qk,+V.9]</span>: “competentius est”</p> ```  ```
test/command/4012.md view
@@ -4,5 +4,6 @@  [image]: http://example.com/image.jpg {height=35mm} ^D-<p><img src="http://example.com/image.jpg" style="height:35mm" alt="image" /></p>+<p><img src="http://example.com/image.jpg" style="height:35mm"+alt="image" /></p> ```
test/command/4164.md view
@@ -26,6 +26,6 @@  Here is inline html: -\<div> \<balise> bla bla \</div>+\<div\> \<balise\> bla bla \</div\>  ```
test/command/4186.md view
@@ -57,7 +57,8 @@ </ul> <pre id="carrie" class="example"><code>This belongs to the outer list element, and is aligned accordingly, since the NAME attribute is not indented deeply enough. It is not enough for the BEGIN alone to be aligned deeply if the block is meant to have a NAME. </code></pre>-<p>Still in the shallower list element since the preceding example block forced the deeper list element to terminate.</p></li>+<p>Still in the shallower list element since the preceding example block+forced the deeper list element to terminate.</p></li> </ul> <p>Outside all lists.</p> ```
test/command/4235.md view
@@ -2,11 +2,15 @@ % pandoc --id-prefix=foo This.^[Has a footnote.] ^D-<p>This.<a href="#foofn1" class="footnote-ref" id="foofnref1" role="doc-noteref"><sup>1</sup></a></p>-<section class="footnotes footnotes-end-of-document" role="doc-endnotes">+<p>This.<a href="#foofn1" class="footnote-ref" id="foofnref1"+role="doc-noteref"><sup>1</sup></a></p>+<section class="footnotes footnotes-end-of-document"+role="doc-endnotes"> <hr /> <ol>-<li id="foofn1" role="doc-endnote"><p>Has a footnote.<a href="#foofnref1" class="footnote-back" role="doc-backlink">↩︎</a></p></li>+<li id="foofn1" role="doc-endnote"><p>Has a footnote.<a+href="#foofnref1" class="footnote-back"+role="doc-backlink">↩︎</a></p></li> </ol> </section> ```
test/command/4677.md view
@@ -3,6 +3,7 @@ ![Caption](img.png){#img:1} ^D <figure>-<img src="img.png" id="img:1" alt="Caption" /><figcaption aria-hidden="true">Caption</figcaption>+<img src="img.png" id="img:1" alt="Caption" />+<figcaption aria-hidden="true">Caption</figcaption> </figure> ```
test/command/4743.md view
@@ -41,5 +41,7 @@ My:thumbsup:emoji:heart:x :hearts: xyz ^D <h1><span class="emoji" data-emoji="zero">0️⃣</span> header</h1>-<p>My<span class="emoji" data-emoji="thumbsup">👍</span>emoji<span class="emoji" data-emoji="heart">❤️</span>x <span class="emoji" data-emoji="hearts">♥️</span> xyz</p>+<p>My<span class="emoji" data-emoji="thumbsup">👍</span>emoji<span+class="emoji" data-emoji="heart">❤️</span>x <span class="emoji"+data-emoji="hearts">♥️</span> xyz</p> ```
test/command/512.md view
@@ -8,7 +8,8 @@ __ link1_ __ link2_ ^D-<p><a href="http://www.example.com/">click here</a> or <a href="http://johnmacfarlane.net/pandoc/">click here</a></p>+<p><a href="http://www.example.com/">click here</a> or <a+href="http://johnmacfarlane.net/pandoc/">click here</a></p> ```  Multiple indirection:
test/command/5121.md view
@@ -5,7 +5,8 @@ ## Header 2 ^D <figure>-<img src="./my-figure.jpg" width="500" alt="My caption" /><figcaption aria-hidden="true">My caption</figcaption>+<img src="./my-figure.jpg" width="500" alt="My caption" />+<figcaption aria-hidden="true">My caption</figcaption> </figure>  ## Header 2
test/command/5627.md view
@@ -20,8 +20,10 @@ <li>Two <code>--&gt;something&lt;!--</code></li> <li>Three</li> </ol>-<div class="sourceCode" id="cb1"><pre class="sourceCode html"><code class="sourceCode html"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a>--&gt;<span class="co">&lt;!--&lt;script&gt;alert(&#39;Escaped!&#39;)&lt;/script&gt;</span></span></code></pre></div>-<div class="sourceCode" id="cb2"><pre class="sourceCode html"><code class="sourceCode html"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a>Something</span></code></pre></div>+<div class="sourceCode" id="cb1"><pre+class="sourceCode html"><code class="sourceCode html"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a>--&gt;<span class="co">&lt;!--&lt;script&gt;alert(&#39;Escaped!&#39;)&lt;/script&gt;</span></span></code></pre></div>+<div class="sourceCode" id="cb2"><pre+class="sourceCode html"><code class="sourceCode html"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a>Something</span></code></pre></div> ```  ```@@ -46,8 +48,10 @@ <li><code>--&gt;something&lt;!--</code></li> <li>bye <code>--&gt;something else&lt;!--</code></li> </ul>-<div class="sourceCode" id="cb1"><pre class="sourceCode html"><code class="sourceCode html"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a>--&gt;<span class="co">&lt;!--&lt;script&gt;alert(&#39;Escaped!&#39;)&lt;/script&gt;</span></span></code></pre></div>-<div class="sourceCode" id="cb2"><pre class="sourceCode html"><code class="sourceCode html"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a>Something</span></code></pre></div>+<div class="sourceCode" id="cb1"><pre+class="sourceCode html"><code class="sourceCode html"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a>--&gt;<span class="co">&lt;!--&lt;script&gt;alert(&#39;Escaped!&#39;)&lt;/script&gt;</span></span></code></pre></div>+<div class="sourceCode" id="cb2"><pre+class="sourceCode html"><code class="sourceCode html"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a>Something</span></code></pre></div> ```  ```
test/command/5642.md view
@@ -3,6 +3,7 @@ ![test](foo){aria-describedby="barbaz"} ^D <figure>-<img src="foo" aria-describedby="barbaz" alt="test" /><figcaption aria-hidden="true">test</figcaption>+<img src="foo" aria-describedby="barbaz" alt="test" />+<figcaption aria-hidden="true">test</figcaption> </figure> ```
test/command/5650.md view
@@ -5,7 +5,8 @@ b ``` ^D-<div class="sourceCode" id="foocb1"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="foocb1-1"><a href="#foocb1-1" aria-hidden="true" tabindex="-1"></a>a</span>+<div class="sourceCode" id="foocb1"><pre+class="sourceCode haskell"><code class="sourceCode haskell"><span id="foocb1-1"><a href="#foocb1-1" aria-hidden="true" tabindex="-1"></a>a</span> <span id="foocb1-2"><a href="#foocb1-2" aria-hidden="true" tabindex="-1"></a>b</span></code></pre></div> ```` @@ -16,7 +17,8 @@ b ``` ^D-<div class="sourceCode" id="foobar"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="foobar-1"><a href="#foobar-1" aria-hidden="true" tabindex="-1"></a>a</span>+<div class="sourceCode" id="foobar"><pre+class="sourceCode haskell"><code class="sourceCode haskell"><span id="foobar-1"><a href="#foobar-1" aria-hidden="true" tabindex="-1"></a>a</span> <span id="foobar-2"><a href="#foobar-2" aria-hidden="true" tabindex="-1"></a>b</span></code></pre></div> ```` 
test/command/5655.md view
@@ -2,13 +2,19 @@ % pandoc --webtex $T_n={n+1 \choose 2}$ ^D-<p><img style="vertical-align:middle" src="https://latex.codecogs.com/png.latex?%5Ctextstyle%20T_n%3D%7Bn%2B1%20%5Cchoose%202%7D" alt="T_n={n+1 \choose 2}" title="T_n={n+1 \choose 2}" class="math inline" /></p>+<p><img style="vertical-align:middle"+src="https://latex.codecogs.com/png.latex?%5Ctextstyle%20T_n%3D%7Bn%2B1%20%5Cchoose%202%7D"+alt="T_n={n+1 \choose 2}" title="T_n={n+1 \choose 2}"+class="math inline" /></p> ````  ```` % pandoc --webtex $$T_n={n+1 \choose 2}$$ ^D-<p><img style="vertical-align:middle" src="https://latex.codecogs.com/png.latex?%5Cdisplaystyle%20T_n%3D%7Bn%2B1%20%5Cchoose%202%7D" alt="T_n={n+1 \choose 2}" title="T_n={n+1 \choose 2}" class="math display" /></p>+<p><img style="vertical-align:middle"+src="https://latex.codecogs.com/png.latex?%5Cdisplaystyle%20T_n%3D%7Bn%2B1%20%5Cchoose%202%7D"+alt="T_n={n+1 \choose 2}" title="T_n={n+1 \choose 2}"+class="math display" /></p> ```` 
test/command/5813.md view
@@ -2,5 +2,6 @@ % pandoc -f gfm ### Jekyll Plugins & Gems :gem: ^D-<h3 id="jekyll-plugins--gems-gem">Jekyll Plugins &amp; Gems <span class="emoji" data-emoji="gem">💎</span></h3>+<h3 id="jekyll-plugins--gems-gem">Jekyll Plugins &amp; Gems <span+class="emoji" data-emoji="gem">💎</span></h3> ```
test/command/5986.md view
@@ -6,8 +6,9 @@ <p><span id="nav.xhtml"></span></p> <nav epub:type="landmarks" id="landmarks" hidden="hidden"> <ol>-<li><a href="text/title_page.xhtml">Title Page</a></li>-<li><a href="#nav.xhtml#toc">Table of Contents</a></li>+<li><a href="text/title_page.xhtml" class="titlepage">Title+Page</a></li>+<li><a href="#nav.xhtml#toc" class="toc">Table of Contents</a></li> </ol> </nav> <p><span id="ch001.xhtml"></span></p>
test/command/6739.md view
@@ -4,7 +4,8 @@ * `--argA | --argB` This item has a pipe character ^D <ul>-<li><code>--argument</code> This item does not have a pipe character</li>+<li><code>--argument</code> This item does not have a pipe+character</li> <li><code>--argA | --argB</code> This item has a pipe character</li> </ul> ```
test/command/6792.md view
@@ -22,7 +22,7 @@     <style:font-face style:name="Courier New" style:font-family-generic="modern" style:font-pitch="fixed" svg:font-family="'Courier New'" />   </office:font-face-decls>   <office:automatic-styles>-    <style:style style:name="fr2" style:family="graphic" style:parent-style-name="Formula"><style:graphic-properties style:vertical-pos="middle" style:vertical-rel="paragraph-content" style:horizontal-pos="center" style:horizontal-rel="paragraph-content" style:wrap="none" /></style:style>+    <style:style style:name="fr2" style:family="graphic" style:parent-style-name="Formula"><style:graphic-properties style:vertical-pos="middle" style:vertical-rel="text" style:horizontal-pos="center" style:horizontal-rel="paragraph-content" style:wrap="none" /></style:style>     <style:style style:name="fr1" style:family="graphic" style:parent-style-name="Formula"><style:graphic-properties style:vertical-pos="middle" style:vertical-rel="text" /></style:style>     <style:style style:name="P1" style:family="paragraph" style:parent-style-name="Table_20_Contents">       <style:paragraph-properties fo:text-align="center" style:justify-single-word="false" />
+ test/command/6970.md view
@@ -0,0 +1,12 @@+```+% pandoc -f html -t native+<a name="foo" class="bar baz" href='https://example.com' target='_blank'>https://example.com<a>+^D+[ Plain+    [ Link+        ( "foo" , [ "bar" , "baz" ] , [ ( "target" , "_blank" ) ] )+        [ Str "https://example.com" ]+        ( "https://example.com" , "" )+    ]+]+```
test/command/7006.md view
@@ -6,13 +6,16 @@      ![Caption.](/image.jpg) ^D-<p>Test.<a href="#fn1" class="footnote-ref" id="fnref1" role="doc-noteref"><sup>1</sup></a></p>-<section class="footnotes footnotes-end-of-document" role="doc-endnotes">+<p>Test.<a href="#fn1" class="footnote-ref" id="fnref1"+role="doc-noteref"><sup>1</sup></a></p>+<section class="footnotes footnotes-end-of-document"+role="doc-endnotes"> <hr /> <ol> <li id="fn1" role="doc-endnote"><p>Foo:</p> <figure>-<img src="/image.jpg" alt="Caption." /><figcaption aria-hidden="true">Caption.</figcaption>+<img src="/image.jpg" alt="Caption." />+<figcaption aria-hidden="true">Caption.</figcaption> </figure> <a href="#fnref1" class="footnote-back" role="doc-backlink">↩︎</a></li> </ol>
test/command/7208.md view
@@ -2,5 +2,5 @@ % pandoc -t gfm \<hi\> ^D-\<hi>+\<hi\> ```
+ test/command/7329.md view
@@ -0,0 +1,67 @@+```+% pandoc -f markdown -t org+- @item1+- @item1 [p. 12]+- @item1 [p.12; see also @item2]+- [@item1]+- [-@item1]+- [see @item1 p. 12]+- [see @item1, p. 12]+- [see @item1, p. 12 and *passim*]+- [@item1;@item2]+- [see @item1; @item2]+^D+- [cite/t:@item1]+- [cite/t:@item1 p. 12]+- [cite/t:@item1 p.12; see also @item2]+- [cite:@item1]+- [cite/na:@item1]+- [cite:see @item1 p. 12]+- [cite:see @item1 p. 12]+- [cite:see @item1 p. 12 and /passim/]+- [cite:@item1; @item2]+- [cite:see @item1; @item2]+```++```+% pandoc -f markdown -t org -C --bibliography command/biblio.bib+- [@item1]+^D+- [cite:@item1]+```+++```+% pandoc -f markdown -t org-citations -C --bibliography command/biblio.bib+[@item1]+^D+(Doe 2005)++<<refs>>++<<ref-item1>>+Doe, John. 2005. /First Book/. Cambridge: Cambridge University Press.+```++```+% pandoc -f org -t markdown+- [cite/t:@item1]+- [cite/t:@item1 p. 12]+- [cite/t:@item1 p.12; see also @item2]+- [cite:@item1]+- [cite/na:@item1]+- [cite:see @item1 p. 12]+- [cite:see @item1 p. 12 and /passim/]+- [cite:@item1; @item2]+- [cite:see @item1; @item2]+^D+-   @item1+-   @item1 [p. 12]+-   @item1 [p.12; see also @item2]+-   [@item1]+-   [-@item1]+-   [see @item1 p. 12]+-   [see @item1 p. 12 and *passim*]+-   [@item1; @item2]+-   [see @item1; @item2]+```
test/command/7416.md view
@@ -4,7 +4,8 @@  ^D <figure>-<img src="../media/rId25.jpg" title="title" alt="alt" /><figcaption>caption</figcaption>+<img src="../media/rId25.jpg" title="title" alt="alt" />+<figcaption>caption</figcaption> </figure> ``` @@ -14,6 +15,7 @@  ^D <figure>-<img src="../media/rId25.jpg" title="title" alt="caption" /><figcaption aria-hidden="true">caption</figcaption>+<img src="../media/rId25.jpg" title="title" alt="caption" />+<figcaption aria-hidden="true">caption</figcaption> </figure> ```
test/command/7568.md view
@@ -7,5 +7,10 @@  .. _Labyrinth Lord\: Revised Edition: https://www.drivethrurpg.com/product/64332/Labyrinth-Lord-Revised-Edition ^D-<p>While <a href="https://www.drivethrurpg.com/product/64332/Labyrinth-Lord-Revised-Edition">Labyrinth Lord: Revised Edition</a> (LLRE; PDF and POD) has been criticized for not being a completely faithful retro-clone of the Moldvay/Cook/Marsh Basic/Expert D&amp;D rules (B/X), I think it still holds a useful spot.</p>+<p>While <a+href="https://www.drivethrurpg.com/product/64332/Labyrinth-Lord-Revised-Edition">Labyrinth+Lord: Revised Edition</a> (LLRE; PDF and POD) has been criticized for+not being a completely faithful retro-clone of the Moldvay/Cook/Marsh+Basic/Expert D&amp;D rules (B/X), I think it still holds a useful+spot.</p> ```
+ test/command/7713.md view
@@ -0,0 +1,29 @@+```+% pandoc+| aaaaaaaaaaaa | bbbbb | ccccccccccc                                                       |+| ---          | ---   | ---                                                               |+|              |       | cccccccccc cccccccccc cccccccccc cccccccccc cccccccccc cccccccccc |+^D+<table>+<colgroup>+<col style="width: 33%" />+<col style="width: 33%" />+<col style="width: 33%" />+</colgroup>+<thead>+<tr class="header">+<th>aaaaaaaaaaaa</th>+<th>bbbbb</th>+<th>ccccccccccc</th>+</tr>+</thead>+<tbody>+<tr class="odd">+<td></td>+<td></td>+<td>cccccccccc cccccccccc cccccccccc cccccccccc cccccccccc+cccccccccc</td>+</tr>+</tbody>+</table>+```
+ test/command/7723.md view
@@ -0,0 +1,8 @@+```+% pandoc -t native+Bug![^1]++[^1]: Note.+^D+[ Para [ Str "Bug!" , Note [ Para [ Str "Note." ] ] ] ]+```
+ test/command/7726.md view
@@ -0,0 +1,22 @@+```+% pandoc -t markdown+\# Hi++\## Hi++\### Hi++\#### hi++and #hi+^D+\# Hi++\## Hi++\### Hi++\#### hi++and #hi+```
+ test/command/7738.md view
@@ -0,0 +1,6 @@+```+% pandoc+![_](url.png) image+^D+<p><img src="url.png" alt="_" /> image</p>+```
+ test/command/7761.md view
@@ -0,0 +1,35 @@+```+% pandoc --citeproc --csl command/chicago-fullnote-bibliography.csl -t plain+---+references:+- id: noauthor+  issued: 2020+  publisher: Oxford University Press+  publisher-place: Oxford+  title: Title+  type: book+- id: author+  author:+  - family: Jones+    given: Jim+  issued: 2021+  title: Title+  type: book+  url: "https://duckduckgo.com/cite2021"+---++Text.[^n]++[^n]: See @author. Another example of a sea level mapping tool with+similar limitations is @noauthor.+^D+Text.[1]++Jones, Jim. Title, 2021. https://duckduckgo.com/cite2021.++Title. Oxford: Oxford University Press, 2020.++[1] See Jim Jones, Title, 2021, https://duckduckgo.com/cite2021. Another+example of a sea level mapping tool with similar limitations is Title+(Oxford: Oxford University Press, 2020).+```
+ test/command/7803.md view
@@ -0,0 +1,26 @@+```+% pandoc -f html -t asciidoc+<ul>+<li><a href=x.htm><i>Xx</i></a><i>,</i>+<li><a href=x.htm><i>Xx</i></a><i>,,</i>+<li><a href=x.htm><i>Xx</i></a><i>1</i>+<li><a href=x.htm><i>Xx</i></a>1<i>1</i>+<li><a href=x.htm><i>Xx</i></a><i>bcd</i>+<li><a href=x.htm><i>Xx</i></a>a<i>bcd</i>+<li><a href=x.htm><i>Xx</i></a>a<i>bcd</i>e+<li><a href=x.htm><i>Xx</i></a> <i>,</i>+<li><a href=x.htm><i>Xx</i></a>,<i>,</i>+<li><a href=x.htm>Xx</a><i>,</i>+</ul>+^D+* link:x.htm[_Xx_]_,_+* link:x.htm[_Xx_]_,,_+* link:x.htm[_Xx_]_1_+* link:x.htm[_Xx_]1__1__+* link:x.htm[_Xx_]_bcd_+* link:x.htm[_Xx_]a__bcd__+* link:x.htm[_Xx_]a__bcd__e+* link:x.htm[_Xx_] _,_+* link:x.htm[_Xx_],_,_+* link:x.htm[Xx]_,_+```
+ test/command/7808.md view
@@ -0,0 +1,8 @@+Wiki links should have no display text, if their display text matches+their target.+```+% pandoc -f mediawiki -t mediawiki+[[Help]] [[Butter|Butter]] [[Bubbles|Everyone loves bubbles]]+^D+[[Help]] [[Butter]] [[Bubbles|Everyone loves bubbles]]+```
+ test/command/7810.md view
@@ -0,0 +1,43 @@+```+% pandoc -f org -t org+- +  #+begin_example+  aa+  #+end_example+- test+^D+- +  #+begin_example+  aa+  #+end_example++- test+```++```+% pandoc -f org -t org+- a+- +- a+- a+^D+- a+- +- a+- a+```++```+% pandoc -f org -t org+- a+  - b+  - b+- a+- a+^D+- a+  - b+  - b+- a+- a+```
+ test/command/7813-meta.yaml view
@@ -0,0 +1,6 @@+---+abstract: |+    a footnote[^1] in abstract.++    [^1]: content+...
+ test/command/7813.md view
@@ -0,0 +1,26 @@+```+% pandoc --metadata-file command/7813-meta.yaml -t native -s+Hi+^D+Pandoc+  Meta+    { unMeta =+        fromList+          [ ( "abstract"+            , MetaBlocks+                [ Para+                    [ Str "a"+                    , Space+                    , Str "footnote"+                    , Note [ Para [ Str "content" ] ]+                    , Space+                    , Str "in"+                    , Space+                    , Str "abstract."+                    ]+                ]+            )+          ]+    }+  [ Para [ Str "Hi" ] ]+```
test/command/853.md view
@@ -7,11 +7,14 @@ .. [CIT2002] This is the citation.  It's just like a footnote,    except the label is textual. ^D-<p>Here is a citation reference: <a href="#CIT2002" class="citation">[CIT2002]</a>.</p>+<p>Here is a citation reference: <a href="#CIT2002"+class="citation">[CIT2002]</a>.</p> <div id="citations"> <dl> <dt><span id="CIT2002" class="citation-label">CIT2002</span></dt>-<dd><p>This is the citation. It's just like a footnote, except the label is textual.</p>+<dd>+<p>This is the citation. It's just like a footnote, except the label is+textual.</p> </dd> </dl> </div>
test/command/biblatex-sigfridsson.md view
@@ -90,7 +90,7 @@   - family: Ryde     given: Ulf   container-title: Journal of Computational Chemistry-  doi: "10.1002/(SICI)1096-987X(199803)19:4\\<377::AID-JCC1>3.0.CO;2-P"+  doi: "10.1002/(SICI)1096-987X(199803)19:4\\<377::AID-JCC1\\>3.0.CO;2-P"   id: sigfridsson   issue: 4   issued: 1998
test/command/refs.md view
@@ -287,9 +287,7 @@ \label{section} Section \ref{section} ^D [ Para-    [ Span-        ( "section" , [] , [ ( "label" , "section" ) ] )-        [ Str "[section]" ]+    [ Span ( "section" , [] , [ ( "label" , "section" ) ] ) []     , Space     , Str "Section"     , Space
test/command/video-audio.md view
@@ -10,9 +10,13 @@  ![](./test.jpg) ^D-<p><video src="./test.mp4" controls=""><a href="./test.mp4">Video</a></video></p>-<p><video src="foo/test.webm" width="300" controls=""><a href="foo/test.webm">Your browser does not support video.</a></video></p>-<p><audio src="test.mp3" controls=""><a href="test.mp3">Audio</a></audio></p>+<p><video src="./test.mp4" controls=""><a+href="./test.mp4">Video</a></video></p>+<p><video src="foo/test.webm" width="300" controls=""><a+href="foo/test.webm">Your browser does not support+video.</a></video></p>+<p><audio src="test.mp3" controls=""><a+href="test.mp3">Audio</a></audio></p> <p><embed src="./test.pdf" /></p> <p><img src="./test.jpg" /></p> ```
test/docbook-reader.docbook view
@@ -194,9 +194,9 @@       </listitem>     </itemizedlist>     <para>-      Pluses loose:+      Asterisks tight:     </para>-    <itemizedlist>+    <itemizedlist spacing="compact">       <listitem>         <para>           Plus 1@@ -213,26 +213,6 @@         </para>       </listitem>     </itemizedlist>-    <para>-      Minuses loose:-    </para>-    <itemizedlist>-      <listitem>-        <para>-          Minus 1-        </para>-      </listitem>-      <listitem>-        <para>-          Minus 2-        </para>-      </listitem>-      <listitem>-        <para>-          Minus 3-        </para>-      </listitem>-    </itemizedlist>   </sect2>   <sect2 id="ordered">     <title>Ordered</title>@@ -254,9 +234,9 @@       </listitem>     </orderedlist>     <para>-      and using spaces:+      and tight:     </para>-    <orderedlist numeration="arabic">+    <orderedlist spacing="compact" numeration="arabic">       <listitem>         <para>           One
test/docbook-reader.native view
@@ -336,17 +336,11 @@       , [ Para [ Str "asterisk" , Space , Str "2" ] ]       , [ Para [ Str "asterisk" , Space , Str "3" ] ]       ]-  , Para [ Str "Pluses" , Space , Str "loose:" ]-  , BulletList-      [ [ Para [ Str "Plus" , Space , Str "1" ] ]-      , [ Para [ Str "Plus" , Space , Str "2" ] ]-      , [ Para [ Str "Plus" , Space , Str "3" ] ]-      ]-  , Para [ Str "Minuses" , Space , Str "loose:" ]+  , Para [ Str "Asterisks" , Space , Str "tight:" ]   , BulletList-      [ [ Para [ Str "Minus" , Space , Str "1" ] ]-      , [ Para [ Str "Minus" , Space , Str "2" ] ]-      , [ Para [ Str "Minus" , Space , Str "3" ] ]+      [ [ Plain [ Str "Plus" , Space , Str "1" ] ]+      , [ Plain [ Str "Plus" , Space , Str "2" ] ]+      , [ Plain [ Str "Plus" , Space , Str "3" ] ]       ]   , Header 2 ( "ordered" , [] , [] ) [ Str "Ordered" ]   , OrderedList@@ -355,13 +349,12 @@       , [ Para [ Str "Second" ] ]       , [ Para [ Str "Third" ] ]       ]-  , Para-      [ Str "and" , Space , Str "using" , Space , Str "spaces:" ]+  , Para [ Str "and" , Space , Str "tight:" ]   , OrderedList       ( 1 , Decimal , DefaultDelim )-      [ [ Para [ Str "One" ] ]-      , [ Para [ Str "Two" ] ]-      , [ Para [ Str "Three" ] ]+      [ [ Plain [ Str "One" ] ]+      , [ Plain [ Str "Two" ] ]+      , [ Plain [ Str "Three" ] ]       ]   , Para [ Str "Multiple" , Space , Str "paragraphs:" ]   , OrderedList
+ test/docx/golden/lists_div_bullets.docx view

binary file changed (absent → 9878 bytes)

+ test/docx/lists_div_bullets.native view
@@ -0,0 +1,5 @@+[ BulletList+  [ [ Div ( "", [], []) [ Para [ Str "one" ], Para [ Str "two" ] ] ]+  , [ Div ( "refs", [], []) [ Header 1 ( "" , [] , [] ) [ Str "three" ], Para [ Str "four" ] ] ]+  ]+]
+ test/ipynb/mime.ipynb view
@@ -0,0 +1,187 @@+{+ "cells": [+  {+   "cell_type": "code",+   "execution_count": 1,+   "id": "0ad1fbe7-107b-4668-ae4d-8ce4ae9a4400",+   "metadata": {},+   "outputs": [],+   "source": [+    "from __future__ import annotations\n",+    "\n",+    "from dataclasses import dataclass"+   ]+  },+  {+   "cell_type": "code",+   "execution_count": 2,+   "id": "c2d3a9f4-dfdb-4ced-bbcd-3dfd1780af80",+   "metadata": {},+   "outputs": [+    {+     "name": "stdout",+     "output_type": "stream",+     "text": [+      "7.29.0\n"+     ]+    }+   ],+   "source": [+    "import IPython\n",+    "\n",+    "print(IPython.__version__)"+   ]+  },+  {+   "cell_type": "markdown",+   "id": "21e7a4a1-0cf8-48cc-823c-dca698ae6853",+   "metadata": {},+   "source": [+    "Supported IPython display formatters:"+   ]+  },+  {+   "cell_type": "code",+   "execution_count": 3,+   "id": "053cdbc4-b157-4e3e-9c86-8f374770d006",+   "metadata": {},+   "outputs": [+    {+     "name": "stdout",+     "output_type": "stream",+     "text": [+      "text/plain\n",+      "text/html\n",+      "text/markdown\n",+      "image/svg+xml\n",+      "image/png\n",+      "application/pdf\n",+      "image/jpeg\n",+      "text/latex\n",+      "application/json\n",+      "application/javascript\n"+     ]+    }+   ],+   "source": [+    "ip = get_ipython()\n",+    "for mime in ip.display_formatter.formatters:\n",+    "    print(mime)"+   ]+  },+  {+   "cell_type": "markdown",+   "id": "d79b063d-ce81-497b-a0ea-5b2e2972e845",+   "metadata": {},+   "source": [+    "Let's write a simple class that will output different mime:"+   ]+  },+  {+   "cell_type": "code",+   "execution_count": 4,+   "id": "c847636c-1c45-432e-9d8d-7310dd7f5637",+   "metadata": {},+   "outputs": [],+   "source": [+    "@dataclass\n",+    "class Mime:\n",+    "    math: str\n",+    "\n",+    "    def _repr_mimebundle_(\n",+    "        self,\n",+    "        include: Container[str] | None = None,\n",+    "        exclude: Container[str] | None = None,\n",+    "        **kwargs,\n",+    "    ) -> dict[str, str]:\n",+    "        string = self.math\n",+    "        data = {\n",+    "            \"text/plain\": string,\n",+    "            \"text/html\": (latex := f\"\\\\[{string}\\\\]\"),\n",+    "            \"text/markdown\": f\"$${string}$$\",\n",+    "            # \"image/svg+xml\":,\n",+    "            # \"image/png\":,\n",+    "            # \"application/pdf\":,\n",+    "            # \"image/jpeg\":,\n",+    "            \"text/latex\": latex,\n",+    "            # \"application/json\":,\n",+    "            # \"application/javascript\":,\n",+    "        }\n",+    "        if include:\n",+    "            data = {k: v for k, v in data.items() if k in include}\n",+    "        if exclude:\n",+    "            data = {k: v for k, v in data.items() if k not in exclude}\n",+    "        return data"+   ]+  },+  {+   "cell_type": "code",+   "execution_count": 5,+   "id": "4fa54f22-0c3a-4809-91f7-ea7101ff1907",+   "metadata": {},+   "outputs": [],+   "source": [+    "mime = Mime(\"E = mc^2\")"+   ]+  },+  {+   "cell_type": "code",+   "execution_count": 6,+   "id": "c419e6a6-240c-4af0-a244-5f1526705c30",+   "metadata": {},+   "outputs": [+    {+     "data": {+      "text/html": [+       "\\[E = mc^2\\]"+      ],+      "text/latex": [+       "\\[E = mc^2\\]"+      ],+      "text/markdown": [+       "$$E = mc^2$$"+      ],+      "text/plain": [+       "E = mc^2"+      ]+     },+     "execution_count": 6,+     "metadata": {},+     "output_type": "execute_result"+    }+   ],+   "source": [+    "mime"+   ]+  },+  {+   "cell_type": "markdown",+   "id": "bf140b8e-16ac-4670-9778-f1c1d9486f9d",+   "metadata": {},+   "source": [+    "Note that #7561 made ipynb reader aware of this, and #7563 made ipynb writer aware of this."+   ]+  }+ ],+ "metadata": {+  "kernelspec": {+   "display_name": "Python 3 (ipykernel)",+   "language": "python",+   "name": "python3"+  },+  "language_info": {+   "codemirror_mode": {+    "name": "ipython",+    "version": 3+   },+   "file_extension": ".py",+   "mimetype": "text/x-python",+   "name": "python",+   "nbconvert_exporter": "python",+   "pygments_lexer": "ipython3",+   "version": "3.9.6"+  }+ },+ "nbformat": 4,+ "nbformat_minor": 5+}
+ test/ipynb/mime.native view
@@ -0,0 +1,154 @@+[ Div+    ( "0ad1fbe7-107b-4668-ae4d-8ce4ae9a4400"+    , [ "cell" , "code" ]+    , [ ( "execution_count" , "1" ) ]+    )+    [ CodeBlock+        ( "" , [ "python" ] , [] )+        "from __future__ import annotations\n\nfrom dataclasses import dataclass"+    ]+, Div+    ( "c2d3a9f4-dfdb-4ced-bbcd-3dfd1780af80"+    , [ "cell" , "code" ]+    , [ ( "execution_count" , "2" ) ]+    )+    [ CodeBlock+        ( "" , [ "python" ] , [] )+        "import IPython\n\nprint(IPython.__version__)"+    , Div+        ( "" , [ "output" , "stream" , "stdout" ] , [] )+        [ CodeBlock ( "" , [] , [] ) "7.29.0\n" ]+    ]+, Div+    ( "21e7a4a1-0cf8-48cc-823c-dca698ae6853"+    , [ "cell" , "markdown" ]+    , []+    )+    [ Para+        [ Str "Supported"+        , Space+        , Str "IPython"+        , Space+        , Str "display"+        , Space+        , Str "formatters:"+        ]+    ]+, Div+    ( "053cdbc4-b157-4e3e-9c86-8f374770d006"+    , [ "cell" , "code" ]+    , [ ( "execution_count" , "3" ) ]+    )+    [ CodeBlock+        ( "" , [ "python" ] , [] )+        "ip = get_ipython()\nfor mime in ip.display_formatter.formatters:\n    print(mime)"+    , Div+        ( "" , [ "output" , "stream" , "stdout" ] , [] )+        [ CodeBlock+            ( "" , [] , [] )+            "text/plain\ntext/html\ntext/markdown\nimage/svg+xml\nimage/png\napplication/pdf\nimage/jpeg\ntext/latex\napplication/json\napplication/javascript\n"+        ]+    ]+, Div+    ( "d79b063d-ce81-497b-a0ea-5b2e2972e845"+    , [ "cell" , "markdown" ]+    , []+    )+    [ Para+        [ Str "Let's"+        , Space+        , Str "write"+        , Space+        , Str "a"+        , Space+        , Str "simple"+        , Space+        , Str "class"+        , Space+        , Str "that"+        , Space+        , Str "will"+        , Space+        , Str "output"+        , Space+        , Str "different"+        , Space+        , Str "mime:"+        ]+    ]+, Div+    ( "c847636c-1c45-432e-9d8d-7310dd7f5637"+    , [ "cell" , "code" ]+    , [ ( "execution_count" , "4" ) ]+    )+    [ CodeBlock+        ( "" , [ "python" ] , [] )+        "@dataclass\nclass Mime:\n    math: str\n\n    def _repr_mimebundle_(\n        self,\n        include: Container[str] | None = None,\n        exclude: Container[str] | None = None,\n        **kwargs,\n    ) -> dict[str, str]:\n        string = self.math\n        data = {\n            \"text/plain\": string,\n            \"text/html\": (latex := f\"\\\\[{string}\\\\]\"),\n            \"text/markdown\": f\"$${string}$$\",\n            # \"image/svg+xml\":,\n            # \"image/png\":,\n            # \"application/pdf\":,\n            # \"image/jpeg\":,\n            \"text/latex\": latex,\n            # \"application/json\":,\n            # \"application/javascript\":,\n        }\n        if include:\n            data = {k: v for k, v in data.items() if k in include}\n        if exclude:\n            data = {k: v for k, v in data.items() if k not in exclude}\n        return data"+    ]+, Div+    ( "4fa54f22-0c3a-4809-91f7-ea7101ff1907"+    , [ "cell" , "code" ]+    , [ ( "execution_count" , "5" ) ]+    )+    [ CodeBlock+        ( "" , [ "python" ] , [] ) "mime = Mime(\"E = mc^2\")"+    ]+, Div+    ( "c419e6a6-240c-4af0-a244-5f1526705c30"+    , [ "cell" , "code" ]+    , [ ( "execution_count" , "6" ) ]+    )+    [ CodeBlock ( "" , [ "python" ] , [] ) "mime"+    , Div+        ( ""+        , [ "output" , "execute_result" ]+        , [ ( "execution_count" , "6" ) ]+        )+        [ RawBlock (Format "html") "\\[E = mc^2\\]"+        , RawBlock (Format "latex") "\\[E = mc^2\\]"+        , RawBlock (Format "markdown") "$$E = mc^2$$"+        , CodeBlock ( "" , [] , [] ) "E = mc^2"+        ]+    ]+, Div+    ( "bf140b8e-16ac-4670-9778-f1c1d9486f9d"+    , [ "cell" , "markdown" ]+    , []+    )+    [ Para+        [ Str "Note"+        , Space+        , Str "that"+        , Space+        , Str "#7561"+        , Space+        , Str "made"+        , Space+        , Str "ipynb"+        , Space+        , Str "reader"+        , Space+        , Str "aware"+        , Space+        , Str "of"+        , Space+        , Str "this,"+        , Space+        , Str "and"+        , Space+        , Str "#7563"+        , Space+        , Str "made"+        , Space+        , Str "ipynb"+        , Space+        , Str "writer"+        , Space+        , Str "aware"+        , Space+        , Str "of"+        , Space+        , Str "this."+        ]+    ]+]
+ test/ipynb/mime.out.ipynb view
@@ -0,0 +1,169 @@+{+ "cells": [+  {+   "cell_type": "code",+   "execution_count": 1,+   "metadata": {},+   "outputs": [],+   "source": [+    "from __future__ import annotations\n",+    "\n",+    "from dataclasses import dataclass"+   ],+   "id": "0ad1fbe7-107b-4668-ae4d-8ce4ae9a4400"+  },+  {+   "cell_type": "code",+   "execution_count": 2,+   "metadata": {},+   "outputs": [+    {+     "output_type": "stream",+     "name": "stdout",+     "text": [+      "7.29.0\n"+     ]+    }+   ],+   "source": [+    "import IPython\n",+    "\n",+    "print(IPython.__version__)"+   ],+   "id": "c2d3a9f4-dfdb-4ced-bbcd-3dfd1780af80"+  },+  {+   "cell_type": "markdown",+   "metadata": {},+   "source": [+    "Supported IPython display formatters:"+   ],+   "id": "21e7a4a1-0cf8-48cc-823c-dca698ae6853"+  },+  {+   "cell_type": "code",+   "execution_count": 3,+   "metadata": {},+   "outputs": [+    {+     "output_type": "stream",+     "name": "stdout",+     "text": [+      "text/plain\n",+      "text/html\n",+      "text/markdown\n",+      "image/svg+xml\n",+      "image/png\n",+      "application/pdf\n",+      "image/jpeg\n",+      "text/latex\n",+      "application/json\n",+      "application/javascript\n"+     ]+    }+   ],+   "source": [+    "ip = get_ipython()\n",+    "for mime in ip.display_formatter.formatters:\n",+    "    print(mime)"+   ],+   "id": "053cdbc4-b157-4e3e-9c86-8f374770d006"+  },+  {+   "cell_type": "markdown",+   "metadata": {},+   "source": [+    "Let's write a simple class that will output different mime:"+   ],+   "id": "d79b063d-ce81-497b-a0ea-5b2e2972e845"+  },+  {+   "cell_type": "code",+   "execution_count": 4,+   "metadata": {},+   "outputs": [],+   "source": [+    "@dataclass\n",+    "class Mime:\n",+    "    math: str\n",+    "\n",+    "    def _repr_mimebundle_(\n",+    "        self,\n",+    "        include: Container[str] | None = None,\n",+    "        exclude: Container[str] | None = None,\n",+    "        **kwargs,\n",+    "    ) -> dict[str, str]:\n",+    "        string = self.math\n",+    "        data = {\n",+    "            \"text/plain\": string,\n",+    "            \"text/html\": (latex := f\"\\\\[{string}\\\\]\"),\n",+    "            \"text/markdown\": f\"$${string}$$\",\n",+    "            # \"image/svg+xml\":,\n",+    "            # \"image/png\":,\n",+    "            # \"application/pdf\":,\n",+    "            # \"image/jpeg\":,\n",+    "            \"text/latex\": latex,\n",+    "            # \"application/json\":,\n",+    "            # \"application/javascript\":,\n",+    "        }\n",+    "        if include:\n",+    "            data = {k: v for k, v in data.items() if k in include}\n",+    "        if exclude:\n",+    "            data = {k: v for k, v in data.items() if k not in exclude}\n",+    "        return data"+   ],+   "id": "c847636c-1c45-432e-9d8d-7310dd7f5637"+  },+  {+   "cell_type": "code",+   "execution_count": 5,+   "metadata": {},+   "outputs": [],+   "source": [+    "mime = Mime(\"E = mc^2\")"+   ],+   "id": "4fa54f22-0c3a-4809-91f7-ea7101ff1907"+  },+  {+   "cell_type": "code",+   "execution_count": 6,+   "metadata": {},+   "outputs": [+    {+     "output_type": "execute_result",+     "execution_count": 6,+     "metadata": {},+     "data": {+      "text/html": [+       "\\[E = mc^2\\]"+      ],+      "text/latex": [+       "\\[E = mc^2\\]"+      ],+      "text/markdown": [+       "$$E = mc^2$$"+      ],+      "text/plain": [+       "E = mc^2"+      ]+     }+    }+   ],+   "source": [+    "mime"+   ],+   "id": "c419e6a6-240c-4af0-a244-5f1526705c30"+  },+  {+   "cell_type": "markdown",+   "metadata": {},+   "source": [+    "Note that #7561 made ipynb reader aware of this, and #7563 made ipynb writer aware of this."+   ],+   "id": "bf140b8e-16ac-4670-9778-f1c1d9486f9d"+  }+ ],+ "nbformat": 4,+ "nbformat_minor": 5,+ "metadata": {}+}
+ test/ipynb/rank.ipynb view
@@ -0,0 +1,60 @@+{+ "cells": [+  {+   "cell_type": "code",+   "execution_count": 1,+   "id": "5cf8f54d-bf3c-4db2-996d-22662a86ad43",+   "metadata": {},+   "outputs": [],+   "source": [+    "import matplotlib.pyplot as plt"+   ]+  },+  {+   "cell_type": "code",+   "execution_count": 2,+   "id": "a0228622-9ff8-4392-9ddd-f70a90f0e106",+   "metadata": {},+   "outputs": [+    {+     "data": {+      "text/html": "<p><em>you should see this when converting from ipynb to html instead of the image below.</em></p>",+      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8/fFQqAAAACXBIWXMAAACdAAAAnQGPcuduAAAASUlEQVR4nGNkYGBgc1HM+/lfkI/hqQ0XAwsDAwPDzSphBi6h/wwlahsgAiJCHxkkBL4zWLA8YGBkYGBgZGBg4GRgYPjDwMDABADgfgxL+wQIRAAAAABJRU5ErkJggg==\n",+      "text/plain": [+       "<Figure size 4x4 with 1 Axes>"+      ]+     },+     "metadata": {+      "needs_background": "light"+     },+     "output_type": "display_data"+    }+   ],+   "source": [+    "fig, ax = plt.subplots(figsize=(1, 1), dpi=4)\n",+    "ax.imshow([[0, 1], [2, 3]]);"+   ]+  }+ ],+ "metadata": {+  "kernelspec": {+   "display_name": "Python 3 (ipykernel)",+   "language": "python",+   "name": "python3"+  },+  "language_info": {+   "codemirror_mode": {+    "name": "ipython",+    "version": 3+   },+   "file_extension": ".py",+   "mimetype": "text/x-python",+   "name": "python",+   "nbconvert_exporter": "python",+   "pygments_lexer": "ipython3",+   "version": "3.10.0"+  }+ },+ "nbformat": 4,+ "nbformat_minor": 5+}
+ test/ipynb/rank.out.html view
@@ -0,0 +1,14 @@+<div id="5cf8f54d-bf3c-4db2-996d-22662a86ad43" class="cell code"+data-execution_count="1">+<div class="sourceCode" id="cb1"><pre+class="sourceCode python"><code class="sourceCode python"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="im">import</span> matplotlib.pyplot <span class="im">as</span> plt</span></code></pre></div>+</div>+<div id="a0228622-9ff8-4392-9ddd-f70a90f0e106" class="cell code"+data-execution_count="2">+<div class="sourceCode" id="cb2"><pre+class="sourceCode python"><code class="sourceCode python"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a>fig, ax <span class="op">=</span> plt.subplots(figsize<span class="op">=</span>(<span class="dv">1</span>, <span class="dv">1</span>), dpi<span class="op">=</span><span class="dv">4</span>)</span>+<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a>ax.imshow([[<span class="dv">0</span>, <span class="dv">1</span>], [<span class="dv">2</span>, <span class="dv">3</span>]])<span class="op">;</span></span></code></pre></div>+<div class="output display_data">+<p><em>you should see this when converting from ipynb to html instead of the image below.</em></p>+</div>+</div>
test/ipynb/simple.in.native view
@@ -1,15 +1,15 @@ Pandoc (Meta {unMeta = fromList [("jupyter",MetaMap (fromList [("nbformat",MetaInlines [Str "4"]),("nbformat_minor",MetaInlines [Str "5"])]))]})-[Div ("",["cell","markdown"],[])+[Div ("uid1",["cell","markdown"],[])  [Header 1 ("lorem-ipsum",[],[]) [Str "Lorem",Space,Str "ipsum"]  ,Para [Strong [Str "Lorem",Space,Str "ipsum"],Space,Str "dolor",Space,Str "sit",Space,Str "amet,",Space,Str "consectetur",Space,Str "adipiscing",Space,Str "elit.",Space,Str "Nunc",Space,Str "luctus",SoftBreak,Str "bibendum",Space,Str "felis",Space,Str "dictum",Space,Str "sodales."]]-,Div ("",["cell","code"],[])+,Div ("uid2",["cell","code"],[])  [CodeBlock ("",["python"],[]) "print(\"hello\")"]-,Div ("",["cell","markdown"],[])+,Div ("uid3",["cell","markdown"],[])  [Header 2 ("pyout",[],[]) [Str "Pyout"]]-,Div ("",["cell","code"],[("execution_count","2")])+,Div ("uid4",["cell","code"],[("execution_count","2")])  [CodeBlock ("",["python"],[]) "from IPython.display import HTML\nHTML(\"\"\"\n<script>\nconsole.log(\"hello\");\n</script>\n<b>HTML</b>\n\"\"\")"- ,Div ("",["output","execute_result"],[("execution_count","2")])+ ,Div ("uid5",["output","execute_result"],[("execution_count","2")])   [RawBlock (Format "html") "<script>\nconsole.log(\"hello\");\n</script>\n<b>HTML</b>\nhello"]]-,Div ("",["cell","markdown"],[("tags","[\"foo\",\"bar\"]")])+,Div ("uid6",["cell","markdown"],[("tags","[\"foo\",\"bar\"]")])  [Header 2 ("image",[],[]) [Str "Image"]  ,Para [Str "This",Space,Str "image",Space,Image ("",[],[]) [Str "the",Space,Str "moon"] ("lalune.jpg",""),Space,Str "will",Space,Str "be",Space,Str "included",Space,Str "as",Space,Str "a",Space,Str "cell",SoftBreak,Str "attachment."]]]
test/ipynb/simple.ipynb view
@@ -9,7 +9,8 @@     "\n",     "**Lorem ipsum** dolor sit amet, consectetur adipiscing elit. Nunc luctus\n",     "bibendum felis dictum sodales."-   ]+   ],+   "id": "uid1"   },   {    "cell_type": "code",@@ -18,7 +19,8 @@    "outputs": [],    "source": [     "print(\"hello\")"-   ]+   ],+   "id": "uid2"   },   {    "cell_type": "markdown",@@ -26,7 +28,8 @@    "source": [     "Pyout\n",     "-----"-   ]+   ],+   "id": "uid3"   },   {    "cell_type": "code",@@ -56,7 +59,8 @@     "</script>\n",     "<b>HTML</b>\n",     "\"\"\")"-   ]+   ],+   "id": "uid4"   },   {    "cell_type": "markdown",@@ -77,7 +81,8 @@     "lalune.jpg": {      "image/jpeg": "/9j/4AAQSkZJRgABAQEAeAB4AAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcU\nFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgo\nKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAD6APoDAREA\nAhEBAxEB/8QAHAAAAAcBAQAAAAAAAAAAAAAAAQIDBAUGBwAI/8QAPhAAAgEDAwIEBAQFAgUFAAMA\nAQIDAAQRBRIhBjETIkFRB2FxgRQykaEjQlKxwRXwFjNictEIJEPh8SZTgv/EABcBAQEBAQAAAAAA\nAAAAAAAAAAABAgT/xAAbEQEBAQEAAwEAAAAAAAAAAAAAARECEiExQf/aAAwDAQACEQMRAD8A2t0Y\noQpwT2qVzMV+N3UHgrDY2eoM0y58VEbgfp9K1yMRmnuJ5h40jyYHGSeKrWE8u2QAApOMdqGCsmT8\nh70TAJwMAZx249aKBy4c9vTNUC0zDCgmmmG7Ockjkj1PrUTAjcy5XP0ouCgHae4IomOJHhgIc55P\nHY0Uk5IXLMcUBQ27n96JYO2MYLebHtRBA7BcMx29sdxQJqwZRtIP+BQKpjHHc+xzigNGoAO/k+nP\nAoAYlee5oBiGeWySO9AJCgY5PHagFCADzj2GaA2N2TkjA/U0HMwbPPeiyBLDfkkj04FCl1cBMgn6\nURwYFGySR6D2oAeQDAxnHGKAhU4IbGc+tFwnwDj9aK7f8v2oNu+IHxNvJdXmt9EmKWSqArA/mPvx\nUxMZNe3Ml1dvNcMzSSEsxPOferJhht/OWyAPc0UfdgDcuM8n50AMCykZFARsngcY/egTcbjnJz9O\n9AB2kZGSQOcUCX8x83bntQCMruJ4B7D1oCyOGzxtJ9M80CAdg5UjFE0aFJrghLeNpHY4IRdx/QUN\nWCw6D6q1EZttEvirHAZ4ig/U4qw1b9H+CHVN3Mq6hJaWMJ5ZjJ4hA/7R3P3q3ET+pf8Ap/lWNm03\nXkkkA8qTW+3PHupP9qxopV78G+s7VSV0+OcAn/kzqSfscVvIKzqPTWu6XKE1LSL+Bhz5oDg/cd6l\nEZzGwLrtPqrA8frUCJfcw9gfegUjZsEAffNADyHt78UAjCjzDJxRcO5Pw3gwCGOVJQp8ZncMGOeN\noxwMY96GCbQffFFcUXKjDDt2NEo+N3yyM5z3okKuqJgIzONoJyuMGi4QfGcqSfXBoYHJx659qKIR\nnnsfUGgJn/poJYoTIGLY+eDzQFlQK2G/KCTmgbspfO0qce/agPGcR7nHf9vnQFfBPlOc88Gg7uuc\nc/M0Bd208YJJweKAYrea4kKQICRGW5IUYUZJ570DYqcknt3FE0VuVyDzj1oamOlulda6puvC0a0e\nZVIWSbtGn1Y1NNbX0x8ENH0qL8X1NdtqDoNxiQbIh8u+WpqL70Tc6fcxypouiRadbW8hhLFFXcB7\nEdz+tNFvEZxkmmgShbA9PlUA+Hgg/wBqDgmBkd6ArJuJBGR7VdEdqWgaVqMfh6hp9pcLj/5Ig2Ka\nKJrvwW6S1EFoLaWwmPIe2fAz81ORTRm3UfwI1mzBbRL+K/ReyS/w3x/b+1Wexmev9O6xoE2zWdOu\nbUDszr5T9G7H9auCJj2n3PPrUXTlGBB2kYx96GlQMjJJHuRRXBgDgk8DtRKH8w4OfYA0SUlIMsFX\nJ4oujHH8ufnRRGOSNoJNAeFC77F2jPucfvQFEqgY3nj/AKaCUY58wwq54AoCzOmVMke9QeRnGR7Z\noEIF7pnaTk49KDpSSwQntQJsGKjgggZ9uDQc4OOe1Am2UCkHOR7dqA8t/cSW8MEkrGGEsUTPCk4z\nj9KJT3pzQtS6m1aPT9Jh8SVxlmJwqL/UfYURuuhfArR7f8NLrF1cXciKDJCrbI2b7c4+9NGtaRpt\nrpdqltYW0VtAn5Y41wBUodvGjqUdQyn0YZqAIreOBFSFFRF7BQAKA1xcRwKplcJuOBn1NAR7y2ik\nWMzoZnGVQHJNAuQcD3oBKkD2FBy8jnvQFxnjjmg4rxwKBMqCBtPNA3vbCC+tngvYo54HGGSRQQR9\nDV0Y91n8DNOvFkuOmZmsrk5PgSNuiY98D1X+1XRhWu6DqWgX72er2j2069t/ZvmD2IoGG7jbnj1F\nFlB224PB+VClN4DYJHyAojmPGCck8cetCAxgjPp6UaAGKtx6+9ATAXO7nFBw8HHLN+goJhBuj2Fe\nAcnmgNazW8U0vjweODGyqpYrsYjytx3x3oGa5LEEjH9XvQGlgmjjMmQq4HBPfPYgevagG5nhe3tk\nFuInQHxJQTmQntn0wKBKTlAeDx60DSY+U9zn+mgsnQvROr9Y3W2xi8KxV8SXUnCrjvj1Y/IUR6c6\nA6H03o6wMVgrSXMoBmuX/NIf8Djt/eiLfjJwO9ZBiOfmKDhktzQAzYBLZ8oyaDF+rOptVv8AUjNZ\nL4tjA/lT+kr3wvqTQX/pi3Y+DqFxKXurmFWAaPaVzg4I/b0oHlxqV7penRTXFu93dPLsESYB2k8n\n7CgnradLq1WaIOFI/K42sPkRQCg3Kcd6Dgp3d6AdrGg5VxnjmgKWB8uQGxnFAUgKuSefSghuqNC0\njXbAWGtxQyJKdsYc4YMf6T6GtDzR8S/hnqfSUz3NvuvNILYSZR5o+ezj/Pb6UGfLzyD/AJoFFySQ\nVBHpQDJ5kGByPahAbWxn5+po0OF3D+XPtQJsNwOe+aAuygmMkebgHnHFALHYpJwSeGz2oGpOJWAI\n49BQEZlYAHkg4oARVOMvtBIJJ7AUAX6xxSOsUgmjViFcKRuHviiVfvhT8NZuqpk1LVFeHRkPlHZp\nznsP+n50qPS+mWVppdnFa2cEcFtGu1I41ChR8qyHVxK8cLPDD4kgGVQHBNAa0maaBJGTYzDJXOcU\nCy5JOaA2OMfoaArkheM7vlQNYNOtoWLJCgLHJwo5NApPKLaNpGRQB6j2oGmnRvcyNd3O/DkeErLh\nkWgklIdCyZOCRzxzQEeRxhdpUnncBkD5UCxXjJ7+tAlctMsIMLohz5mcZAH09aBQYdQwyAeaAuA7\nMAQxHH0oG1481nbGVInuWU5Kr+bHrgepoKB1u+o6jqlvBH05NevEBPBK0pQR4I4BHZj+1Bb9IS7l\nsFtNWtYwDGFYB/EXHqpJ7/WtQYx8VfhGbdZtV6Uh8gy81mpyR6koPb5UGKY4YkeYd88fbFAI5AC9\n8c5oQBb+U9+9GnN5RgDgjOPWgAN3yMfWgAqc91/UUD2RSSRg9+49KCR6e0WfX9WS0icRwgb55WOF\nijH5nP0FBYNRi6dSR7HRNPmu0hOW1GaXaZMdwBwAP3oynE0XRYrFtV02wS4ECj8dp1wcsE7eJEf3\n9qlFZ616ZttPu7Kbp9Zbi0vYzNCcgjHqoHuKsEp8LPh7P1PqjXerxywaXaviRSu1pWH8g+XuflQe\nmIIY7S3SK3hVIo12pGoAAA7AClEL1N1RH0/oTalcwx+IACLaSQKx59Ppmshv0D1jH1ZbTubU27xk\nkAnKsuSMg/UUFluLlLaJXETyecKAg554zigXiubeRnSKeJ5FOGVXBIPsaBLULoWkIfw3kYsAqIOS\nTQJMbpm3oqlmwACeF9yfn+1A+Bx34oE5IY5P+YFbnPIzQKAckHuRQCAQOO1AL8r9KDhkZOT9M8UC\ncrxgAyYJzwD70CT3Itxm8kgi3fly+P7/AOKA9pskhEkZysnOfeg6RH8w3tgjAHtQRZ1uystSg0m5\neRJ2UbHceV8fP3oJkBSAVII9xQFdSRwKDDvjN8L/AMSJte6chxcgFrm1QcSf9aj39x61YMH8Q+Ck\nfhqpQncxBDH5H6VRwXJ/Ke1Am2QchuMYOaNFSAVznB9qAm8f10D2RmX8jDHP3oLbebtA6ej0m2Lr\nfX6LcX7IMskf8kf6HcffIoG8yTadZxSTxCK3kRZUwSFfkruIJ78GhiS6Y1OS3160uZJFWO5bwZtx\nzuQ8bcfPNMZXvo2wsLnQ9R0q/maJNNv5Yo3bjCuMAHPzqA2jdUan0lF0/ZXcElxp9zE+5WVd/DE7\n1IPPB7H2po1bSNXsdYthLp1ykyEcj+ZT817ioITrnoux6vs1gv5JYnjz4ckZ/Ln5etA+6N0BemdB\nttMina4WEFfFdQpIJJ7D60E5I4Vo9qnnsQO1A3k0yzeTxhCizZJ3qNpz9RQO449igMSxHGW5NAIw\nBtUAUAMORkfegMhG3jtQD8+fvQGXJz7UAHuRQA5YDI5FB0qCQA5yaCs2/SFit/Jd3AmvJ2bO64ct\nt5zwD2oLMilVAUDgcAelAJLbhgZz3oGN9HPIYmhtrWRw2czjt7Y+dA+h3mJS67W9gc0AvuLYANAD\npkZABHY85oPOnxy+Hx06Z+odGjC2jt/7qBRwjH+cY9D6/OrKMebcceHwfaqCYIyDgZ96GhHOFJI4\n/WjQpXnsaCz9J6fDqGvRC8OLO3Vri5PB/hqMkfc4H3oDT3UupapcXrKS9zISgDdhnAGPbsKC5aLL\nBHq9p01c6bbagPE23kpJYhmz5IySAAMj6nNGdRnT2lu3V9vaQQrJDHfCMFj5kAfufsMUFogu5H0j\nrLUYXK+Lq0aRse/lf/8AOKlFfudagvbnQpNQRmtILydCwPdCQcgMOMZFQanPoeiawBd9M6s9jeKP\nK1vKQp+RFA4septa6fuFtuqbRrmzx5b+BAdo927A+vsflQXfTr2z1O3W5025juIW/mjOR9KAZI91\n4khaRNo4XdwT9KAl3b2+oWpjMoZWbOVfnI9sUCrXUNssUU8w3sQoJH5jQLvwQQC3NAKvuUPtK54w\naDg23v6UA7weBnNAIOBigMr+hoOjdZQdhBx3waAVG0Z7UBWfAOQSflQChyNxBAxQRutarb6bHALi\n9trSW4kEcJnGd7ewFA/j8QEK/IA/MBjmgWDDBB7igj9dupLTTbiaHZ4oQ7A7bQW9ATVgwXSNV6on\nl8azW6t45pWdxHIxWA/zNtz7A8Glg2S1u7fX+nt0J/H2c4MMhmQoW9GBUjj60g8sfEHpebpDqi4s\nHLG2Y77eQ486E8fcdvtVFekGW4UfegKVAAKgnFGhuDzxQXbpDTZF6a13UnUqrCOzQ5wGZmXIJ+lE\n0ppkEK6nJcRWcTW9hA08iKcjcowpye/mxQ0+6VRbC/jvLm48L8LG9y8pIOXxkDnuSTipqHXQMng3\nes9S3fhn8DbvcZI5Mr/lH700dc3Dad8NtPs4nU6jeXD6nMCwBRF5XOfU8YHrTNJFF1X8RawW1jc4\nGxTKNrZB385yPkBTFw1stSu7Ni9tPLGSQfK5Aphi8J8UNUm6fn0u72yvJ5fGbuF/39aYYtGgadp9\n/axXnRetzaXqnhqZI3bEcj4547Ak/X6UxFisPiXe6NMdO65057eQAr+LhUlHHbOPX07UwWXpQ6Bq\nMo1LpgW0sioVI8Qgxk+684qC028M5890Y3kHKbUwF+lA4LDOzu2M4FAOG3DaoI9cntQdJxzQEyR2\n59f/AKoGl5fSQRFo7ZpB/MhYIR9zxQdayyXKb7gqox5Yo2yB9WHc0DPUIWnhWKxkuYFRs5gcKWbP\nY59KBkx6isVeSGW31JNwHhyOUkA+o8v9qCfjkMo/LJFKqBmRvSgc2swnRyFcYODuXGfpQMtRsLK8\nvYJL+wjuGiUtHK6hghz6Z7H6UEmCsig84I9RigiruC9t0DaaVmIIHhTOQMeuGwT9qCJ1ywv9T0U2\n9xFFiaVBJGHz5M5ODgYPY/arKJPTtLW1t44i7SKq48w8x+ZPrTRJoipGFQAAdgKgzX47dMJrXSrX\nkUe6807MykDkp/MP8/aro80FQyZ+tUJ7hvH0x270XQ7KGtXvIk0T4c9P2bIhkvpnvJVfjIxhf7qf\ntRDXpu0/1DpzXltUlkvmWMBI+2zdnn64oYa6yX0XTm0i4jQ3t6wmuV53xov5UPpyeeKyLbpFtZ6X\npmn6TqNq7/ic6pqQRR/DVf8Alq2fTOP0FXBnXU+ox32o3lzeW+JrxlMXHKR9wfbJ/tVWK5f3AnaA\njafCTwwcY4BOM/qKKSjA4Dg8j37UHZKkE5P0olSFlcLDdJPbTNBOigjxOVZu3+80Rbbnrq9l0t9I\n6isRd2rgKpPlZMdyre9An07oupoh1zo2+lea2fMlr+WZFx7ZwwqWDVug/ihDq7R6b1EPwmpMNokP\nlVj8xng1BqEUe1EAJOMDOc5oDSxq6YYeuaAJF4oCBUQ7mJ45zQHYB14wR86AVjBXyjge1AEcRTHl\nA9hQE8kbgEohJ5yQM0ETHNqMOr3IZQ9tIMQyEjKt7D3FBLqywRPJKTuxlj3zQI3Ut14e+yhWRj28\nQ7RjH60EfpF3rU/jLqFrHbS4/hqpJXH19aCRa8jgiVr1xGwXzYyf99qA9tc29/aRXFnKs1vINyOO\n2KByoxwe9AYocHGKBvdwLcWzxSLuR1KuD6gjBoPHXWujt071Nf6YSSkUnkJ4yp5H7f2rQgWAA3Y+\n1An4j/1t+tBrHxKuYS+gx24LRx6ZFtI/lz60FY0+/v8ASphNpd68EpXY5AGNvzFF1YOirZbzVrvX\n9dkNxZWH8eeaY5Lyj8qj7kcVlETqOqXd/HrPUNzcNE16Tbwxf1JkEgD2AA/etBte9R2Oq2cv+p6X\nHJfBFjgmjkMaRgAAEqO5o1FWfbgjsR8+9AlI5CgEggeoNAq0iug8uD7g80KKmCcZ7fPmjJzJfT/h\nWtjJvhOPK/OOe49u9A96X1W90/VrRtNkkSfxQF8I5yScdvX6UGidSLpfVFzcvbRiy6kgZBGysFW7\nB9T7HHNSjU+o9S1iz0e2uNLmX8RYxJ+KgYeVwVGTn5d6gjug/iU3UOt/6TewQpP59skL5B29x/8A\nYoNHPB78Ggb2l3bXO78PKsoyVyvIBHBFAoSkbfyhn4GfWgTnmWFN7ybAvc4Jz9hQRdx1dp0S3Dw+\nJJHbDdPIUZUjX3yRz9Bmrgzbqb4x9Oxho4bB751O5HPkXPsc80wQHT/xrJ1IHUbGKO0kdRiBiAgz\n+YjnsPpTKN/tLy3vLOK5t5klt5F3LKhyCPemAYLuK5XMDEj1OCP71ArGWLMPT0oIbU7h11u2t49O\nllWWNm/FIRsjI4AI/egfQ2ktpbww2XgxoDl9wJ49cUCHUGv2GixM13Mkcm0squwUH5/SrgxDW/jF\ncXOteHb3otrKEEiRISRM3zGc49v1qDT+gfiBpvV7y2unxTxywRhz4ozuHbOR2+9Bmf8A6kNIEWpa\nZqiooEqtBIR6kHI/atfRjDEt3AKjgVQjug9j+lQWh72e/htTOzyeCnhHPomeMYoJvQum7vVD47K9\njpsQBkvZ5NoAHcgUAa7rKamE0Lp9Xh0G1OZZTwZSO8jn9cCsivdS38F9cJDZIY7G2URxKe5x/MT7\nnNaEKrENwAFPPlosFwS2cd/cc0UlIm3JOeKDo2LH+UA0SjgDk98URzPiJ2449e/NAbS7v8PdpKkp\nikQ5WQLkqccGgmYNQmXWLeQLG9wVRQVPlcj+Yn3xQa98OviAjz3WjdXSpFdliEuJCNjDtsJ7enep\nRdel+kdL0rqOTVdIsoYklV1dixO3nunpg9jUCnU3WMeka5b2EUcl3JInmigQs6ZPlJAHY8+vpQP9\nO1m3nthNo0cTwM2JDwoVj6H5gd6CbhtUiVn8TcXO4ktkZ+We1BAf8Z6fZ2uqXWpyxQrbStGseQzM\nB2IA961B59+IHXmodXal+HsPFh04HbHCo25+bY/zQWv4f/CCxvII73qC8iuXYb1tYZeF9txHf6U3\nBatX+DvSl86x6cr2dwjbnEUmcj6Enj6U8hLdJdEX/SmowJp2tTT6Oc+La3HO0442+3NBf1LmRUjj\nQAfmc+nyHvWQockYyQcY3CgaabaPZxGNnaUFi3mPb6f+KA2q3RstNurnBxDE0mPfCk1YPMemaP1L\n8RtYN9fJPc2aMUaVmCKg54H0z6VRYendf6Z6T1W56a6j6fgfwJyguhGJmPzbIzjHtSjTn0zSunbi\n01fSkt9Os5GAmWNCDOGxtXb6HnNZEZ8etOF90DPKFy1rKk3zAzg/3rXI8u7zvOTg4zVoTLDJ81QW\nDTb2SwuvFgcrkbXwM5H0PFGqsjpd6+kcT61Nc2ieb8OikFc/9PA+WfSjKA1nWBzpFlZ/hLWM4KH8\nzsPVj6mghN4IyQRk5NGo5BkFmyAfSgVjChdpGO/FAXYpOHLBe/FAQqoBJbA9sUBGxgtgEj/eaCf6\nDGjt1TZf8RNGumKS7mQZQkDIB+WaMrf8Ub/ovV7V20JIYL62K4khhCLOCcEcAdu9BmCuEQvxvyFU\ng42+v+/rQaj0zax/EXRY9Nns0t9TtM+BqCKAjEclXA98jn+1Si7Cz6u6O0tLjTrxLu2tQJJrDwcK\nE/m2M2SfeoLrpupDV9Mh1OytUS2vIN8m4BZQf6T7+vPpj50GfdK9L6rJqk1y1y0elRDKRqdjHHoy\nDhjx39e9BZr7fagW0j3kul3iETRqHkeF8ZBUjkZIxjtk5rQ86dW6r+O1OcW0UtvaRsY4oWfLKBxz\n7k/5NA46P6X1rqS6WPS7V9v88rAqi/f3oN46X6C1DSotkus+BIwKl8hn2+3PapROXPT2t20bPY6k\nJ5UGYmbIfIHGW5z68VBI6DrzzWSrrAjtrwFUbDja5OBlfuaCbluJLeNwIpLiVF3bVXAP0Pv8qBxL\nO8cYcW7vnuqkAigNFKs8CyxlwG/lcYI+1A31ayF/pt1auSFmiaM/LIxVgwfoO413o3qqfSLyUSwo\ndogAyZVGcbPTPr71aNDvendJ6wtbu7Fi1lezK0bS4VZMjtnFZE0bC5u9Jh0qRAr2yw4uWx59vBI4\n4PegN1tpbap0lqOk2sipLPB4aFsnHbBNOR5A1exFhqFxbeKkngyMhdOxIPcVuhiZFz/zBUEwcKvY\nnP6fWi0+6chjn6h062uATFLcRrIMnzAsO9EehNR+GvTV3GUh0+O2YsGaWHIf9amjIfib0no3S0Vt\nFY3M000zMzLJtLKvvkenyx96oz0rwNjA8cj2osFLbVAbOc9jRQiXOAwxnj3oBlAxwDj37UDY+vHO\nQeTQBIdqjcPMfnQwJclWyBgCjJBFeefw4VaVycBUGST2wAKD0L8H9C1rSIILjWLSCytY1lZASVnl\nL4PI/wD8+vvUo1uwbxI5GkjdVc7isvOBjtj2qBWKFZiQ8CJCB5FHYj5jHFArDbQ20ey3RY1HOAOP\nsKCH1u61CPSLt9MtlXUHUrbCbJBbPdtvYetXR5T1y2udD6lni1ErJdJLvlK4wWOCePvVgsV/8Sr6\n7UW1vA0NiowIonMe4+7FeT9ARQRmodWa9EYpPBhs1Tygw26rk9xknkn70EjonxZ17TXjAeKTkZ3L\n+YZ7N8vpSjX+lOpNM6umgkMG3EgBV1DYbG4kewz2NZGkC43CP8MPFBONysMAD50DaHVH8S6N1a+B\naxMUjd280pA5wPb296DrXWLK9WNoJdtwybxDKPDcAnHIoJBifTBzzmgaz2UFzPFNNbwvLCcxuygl\nT7igdRRKg8qAZ5JAAzQEnuYoHiSWQIZW2ID/ADH2H6UERr12BY6hueIQJaO7SK/nHfnHtx3pyPGW\noN4jynuCfU963RF+DL/UtQWTkjaWY/8ATnHFGql+j1VerdJY8r+KiJz/ANwoy9C/EjqSbpbRY723\nRJC8ojIcZ4IJ/wAVkecer9en1+9FzeLCCq4URjgDP7mtLhteadBY2kMczyHUpcO0YxtiUjgH/q9c\nelAiLy1kjCX1ruyMLNGdrj0+h+lE0+t+kNQltJ7yKS3jgiTxUFw/hySp7qp70NV6YEBgWUNjBoaK\neAODnHrRoVgDnBP0ozpxZ2f4y5trVeGuJFiBPpk4zQep9C0LTembS30fQbWP8ZsDyTugZgf6ix9f\nYZpbgmbXSmXULaa6kMzpltzcjJ//AGpaLCY1CDsF74PrUCgHY0HbSx7Z96BGUfxB2xjtQZ11t0Tb\n6jNfyw2wM18gV5AcBdpzyPnV0Yp1F0o/TEczXjXaTOQYpIk3QlT3B9Rj0zVl0VKbVppImheUSwbs\ngFfXHc0De0tri/ujFYQSSyfmKopPHqaDV/g9p+padr/gkSRTzKu0kZRlPLYPbOPf2pg9GWzRCMJA\nFxH5do4wayKX1z/G0CdzqLWRkiaTxQBLudclQvovbv3oMU/4Z67uwnUAt3u1Zw42yhmx3/Ln8v0o\nN86L1d00i3i1UiGQIocNnEbnkqT2xgiguEbI4DIysp7EHNAZnxQQ/Usksej3EsCl5EUthR5sY52/\nMjigr6Qrp3R15LqEcIlmgdpFGAsY2navPJApyPJtwd8rnGBuJz6Gt0MzGSTyf0qCwSKA5ZsAjnn2\notTXQYj/AOMNIDqCrXUZwf8AuGDRG6fF6Gyfo6+ub0CR4EPgIScLIeAcfc1keatN0661a+S3sYTP\nKzAbV9B7/StLrQ/iXp9pYLp8elWsUM11AzXMqt53I7g7j244oiB6W6Tn6j2TeAy2FspTeB+Z+/8A\nmgtnWlvpdl1Dp1pq07Ja20GFQpuDHHAwPf39KDHriVTKSPOCeBnHHtQGsrG5v5pfwcTOIlMjgEeV\nfck0XRIreS7uUigRpJXOEVe5PtRE/wBJ9HaxqvUcdhNFJp0lviaSWVcMgzxgdySeBipo9T6O8Npp\nUJ1K4iW5KgSvIyqxb5jPH0paJm1NvKivE6Mp7MpyP1FQLRTwy58F0cjuAckfagOTtO3+Y8igMWCI\nWbOPlzQNhNBOWEbq5Q+YKc4+tAD7JEZgQfXj0oI/VtIttXsZLW5hRopByCP/ADVlGRa78Erae63a\nXK1tG3LAncM/Kmh10l8IZdBv4rxtTE0yggJsyoz6/P0po0zSNKEMdo9xGnjxuzkqMAEgjj7Gmial\njWQMgyCRyQcGoITqHT7q/a30+G2jFmwLSzl8GPBGFA9c5NBPRwJDbpHCipEi4CjtigqfWltqCaG8\nWhNbxyzOBIs8W8FcY4+dWQQ/wtuZdIGqadrknhy2u2QyOSEZOeRngY+XvTBZZevOmhC8janbqiZ5\n3Zzj2FMFcs+sh1ZqsFrp8UkGkrlpbh+DNzhVX5Z5NQTfXyWUXSV2t+wW3EZ5I4HHt61eYPI0mA5C\n9snFaoLsPv8AvUEk5JcA8cZG480WnOlXX4PVLO4yQ0cyP244Yf8AiiPUfUump1B0/c2O8xfi4v8A\nmL3UcGpgw/SujNX0Trj8PpckimOMvHO/kEg9Rjs3PpV0aFq/Qqa1ZJ/qcrverEqNOwGM+uMfemiV\ntrKbQdMNjp9rvtkhPht6mU5yT8u1BkvXg1qXUtOvddgRY1R3j2YHiMvZSD27CgzSCyuNQ1KK0giL\n3Mz4VAOc/wDignoNNOnaHeiW8hgkku/Al2+Ziqgn09M0ETp0qpqSmGKOdFcEeLwMfPHag3JLuCRt\nPmQWsDhNphtVAcn1w3BPFSwDdWGpX1/OYdOtbbSrlQ80szHdn0GR24/c1AbWemdatLbTJdGvJIJy\npDQwMV3exwOPatSz9Ei/R+txy2mr3evyHV4miWIDhGwwyGA7nGRS2YNZAUBWYDdjGayEvxMYB3nY\nu4KCfU+woG93c2enWs1xcPFDCp8zEgDPzq4GGgz22saS1zZSZhkdsFePXt86YHWmySeLNDMYikZ4\nYNlvvUD+VARxQJqgwRQHUAAe2O1AWOFRM8mDlgB37fagb6reXFt4ItLZJnZsuWfaI0Hdjwcn2FAz\n0nWX1i4u4xY3VpFbv4eZ1x4vGdy/KgkriN2aMRlQoOW3DOR/5qwYr1P1tp2pdS3WnanKkGh24kRl\n2eaYgcb/AFxnnAqiv9Jno0dRLJPbtdQtkNPIALaMnODsPPpSjbdK0DTbWQXui+Gsco3BU5hPP5gP\nT7VkU74t6PZHpq/1N5ZZbwrtRnmOwDPOFJwPsK1xR5ybudw788VaC5X2WoJRULSBpAe5PA/aiinA\nZnHck4A70THq/Qr23/4Y0u4lmCpLBGA7epxjH60Du+WGOBvFlFuWOFcYyCfbPrUojri6k06xX8PF\nNfBUJ3ltzM3scVBjfVvVXVNit5dapNDZGQGK3shjeAe7YHIwAOT3zVggNTiu+orrR4p7m+upJFR7\nh3TPhggDaoBwRjnPH5hV0af0xotnoD3l5dWdrY2YjGLhwPEHoef996CC6m0HpuPpk3Wny2s9sJPH\nJ3AeI2D39T37UGU9QTDULuGPSLPwIyoVIYk2lj6/X70G2/DPp0hVudRuBLcwxhRGkeEjB9M+p96D\nSLprVHiieaAE+YxHkke4H1qUOIBawL4uAuc8nvj71AwjRtQ1eO78QNp9odyLju/qT8uf70Gb6r8S\npLzryy0vp+4NxYSSCEswI2u2Rn3OOD9qC4dVamen9NlaC7tUaIFvCmnHiy4HJXJxnOeDVwed+rOv\nLnqSyWO4jZSru/kc7ck+30GKosXw2+KmqaDJDY3jR3OmqNoRhtZAP6SP7Ggtmt63qbTJ1XLazJps\nlwBFblypEOAA7L2OWANS+xrnR2vW3UmjJeWp8wJSRf6WHeoJdSPMCRmgMq8DmgBpNsgUIxBGSccD\n70DczmS8MDWoe28MN4+f588rj980CktuJZYpFdlKZ4B4OfegQ1hpIrVjbsRMBhBj8x9qsHnX/hm3\n6y1O/u9V1ddPmS6aD8OkQdyxOSe4OMmqLUvwQsYY4Xjv7m4YEEhwFyMY7fXB5pRbvhp0jqfSMV7b\n6jqZvLGQAwxAEBDk54PuD6VkVb49a5DBpiaNaeF/FIaQDumOwpzMGDEZQZ5+VboR8In1I+9QWDY6\ngFn7jjHpQhtJEFbAGBnijT0P8H7qPVOh47a42yNaymPBOcDupoykep+m73V7g/8Av2itQowvJIx6\nj5/OpRjfUWrax051RPY6LqFy8YACkebO4Z7HjNWCY0ToW2utJbqPreW5na4O4R78cehY9+fQVKLX\n05p1ro97awC4kX8VFmJLeEKdoyfOxJPbHbHYVAz0rqKPWNauri9t1ktJgILYgEiNFJ/Op9STmrBB\ndeaFCo0y3jt444DI3jLE204Y5DD+9UPPhv0NaRtPq99mSLOy22nOfdh75oNC0vT7m1uJGvGiii3A\nW8UDbQAeDu9zUohLlhouqap1VciF4I1FtbxSthtobBIPuTn7VBJ2vUth1TYk2ULi9iALwyKQYz6Z\n9CM0Ft060/DWEcDHe2Mucdye9BFW3SekWt3LPb2cUTsd2UGCG9x7VYMzufhzdX/WmoXj+BPpx3I7\nXZMmXYckc8EVRKaP8I+nXikLQuxOQSTnBzj6UEjonw90XSrq3S3s7dplJcl1EhGDx396lFx1TQ4N\nVjaC7UNCU2lAO/8AvNWDCLp9X+E/WgWImXSp2LRq7eSRT3B9iP8AFSjd9P1+21TRodVsMS2rLmTb\nyUGOePXFQSltcLcW0c1vh4mXcjDswoDLdRm4FvISsgXeTghDzjAPbPyzmgVFxCzuiOC0WN3sM+5o\nDqySJmNg3rx7UFb60tNUubGJdFdEvhIdryflUFSM49TVgyTQenJemOorf/U4H1Fpp1edAh/hOQTu\nQ9375JA4q0bnbPBcxxT20wkjKkqYzlT9ayGWu38um2MbLEJ7iRtoUds+/wAgBzQeW/iHqi6j1Pdz\neL44HkL9txHtWhVUOVyvHNB2F9zQT8hUAhAdp5FCG0mSAzE4HGDRppvwL1bwOpJbEsFiuYyVX3de\nR98Zoy2ZtRgmjkSRZocEp51K7se3vUow/rfpFE124mVpfD4mk2MWdCc4A+VWCH1281/UmFnpklzP\nYRFBEG8uGC4yQfcn9alGgaJo95rRsbi53WaxwrHOm7BjYcHnvz/moJaw07pXSI5IW1K0CQnDhpAW\nB9R796CudY62msTRW+gadI8KnDXMkLLv9MA8HGOKC3dAXF1dRfh75f41moi4G0AdwcfTj7UFhv7R\njqMBV5AJFZHkR8FRjIx6CgpXVNjJ1JqNn07p26CztSJLlpIydyj2J+fGaC+afplrazqLa3SKNIgg\nx3IHYUEsBk4wQc4oK11L1z070/M9rql6wuVA3QopLcjNBDwfFboqeSO2W7kQNxuaEhQfnQLt8Tui\nreVoV1UeXnckTFT9DigHRuv+mbu9ZV1W3Nyc4IRlVl9O47/KgtU+s6baw+JcX1umRkAuM/p3oK/1\nt0rYdX6cqXKESqN8Ug/Mp9P1qwZ702mo9GdUTWJsmOn3EY8CAORGXJAwScjJ5q0bJDNLb6YklxbK\nsgA3wwndg9sDtWQN3aw3ZKTwLLEQOGORn6ehoG1vYAw3FikRt7JSuH3Hc/GSc5P0oHn4aO2uGuYy\niose044wBQIm6F1dwfh5ARs8R8L2BHGfnQHv9PS4PjxrGLtFKxysm4qD3oCxboIIo7e1jhQHzAYU\nJ8wP8VYM56j1ktaal1BMrS2sAaK1OQDD6eUepY9yfQVR5zv7hrmaSaRtzyHJY0DcE4BPIPb5UBwO\nO4oJYzFvzEYHAH9XvQhNZN7AEgDOSDRo/wBA1SXRdVtNQgb/AJUgfBHcZ/8AGaGPVlhPbarZ2t5C\nEeORBKje2RUrI1zYxTBhMinIwcjvUEcugWkO4AMisMEA8N69u3yoERrOhWNxNYy6hapcxAeJHM+D\n8u9ASLStLlm/EWdpZyxy+Z3RQ3I5B44oJKTT4blFWSNBEOeBg5+goFYbOK1TKhIxnIbGMH50Cpcy\no6AMrIcM2OD68Ggb6Lbbllu5Cd88hYBu6rztWglSNkfm4P70Gaat8Rba96w0vp3R2mhufxyi4kO3\nYyDOV9+f8VYMw+P0cP8Ax4JVuEKzW8bEr5tuMj0+lUZ7Y2X4288GK+towRlZXYqv9uKCQi6YmbT2\nu11GzaJWKnYxbBB49KCFnhubdiwL+U8OhP60ElpXUFxY6nDdXQF0qYbZKxwT9vWg3npb42aHcmC1\n1C3uLSQjEkpIdQfr3xUondP6x6e6tv7e101hczRzrNtaFiFC/wAxPYHtUF+lj8bYCTgMG59cUC4O\nBQQOo2eoXepFTeL/AKYQN1sEwWx6Fu+DQLX2kw3Ok3Vjas9qJ48Exd1PHb9KCE6R0G86Ut7mK71K\nK4gklM7TyKRIBjtjtjj96AOreudJsrMJbXksk8jBCbVdzRjONxBHP/3QQ9x1jcWGkERWWqXdpMPC\nt7x4wfFOOWPbA+fAqwZr8TJ9Qbp2ymvEjsrSTEVvawyHz45Lv6E4wPqaoyl8g91OKDlYEc8mgKW5\nPH7UE80f8PPHl7gDFAZkUjawUIQG8w5ouknAUbl9Dg59KK1X4Z9XXFvo8mlRXax3KHfBG8Rk3qe6\njHOc54+dMZO7jr/qK8vWtba4tYu38TwvDOMc8N60wPLbrW10PS7pnvrnUtbAKobgBUUk9jg8f/lM\nC2rydMdRSaRqWoLEbx4UefwxkL2BVvvn9Klgv3Tp0lPxFno6wJ4IVmEOMEHsf2xUD2e4ks7n+NGD\naCMu8q8lCMcEfPNA6tW/EwrMybEYZUHnI9Cf/FAzu7G4LXTWs38SRNqhs4Bz3z9KCO6x07UNT6al\ntNMvEs7xkC7nPlI9R2/egwbrDT+r+kupLCeK9nu3KBYGRy+QvdWFWCU6avtA6h1iKDqLRhpmpvkx\nz2p8JGb3z7k557VRX77TdHteuPBut401CAouyXGcdvmASaC069030brYaay/CwPFwWspRErfUN7U\nGZX2hWSiY6ZrMc0CvhUlBUk/UcGgiLq2mtG8F54yDwfDfIoGkrRsSZXwOB2zmgsvw06XHVfUcFvI\n22xQ753Ze4H8v3OBUo9a6XodjpltHbabDHZIhVsQqBuA9DxznFQTQUe5oDYGMnn7UEbpV3JqDyz+\nBJFbBtsXiDBf/qx6CgDXL42cSRwGM3UzBQrHGFzy32oG2i2kKTSI80lzMow0rqQoyew+3tQO59Kt\nJJRI9rEzgg7igz3z/egZ6paJdGGwW4eBXy7pGeXUdwT6A5qwebPjJrcOr9TvbWZQ2Onr+Gi2nIJH\ncj7+vyqigOuRk+vtxQAqEk4BU0ABj7j96CzzKxYD0GeM0CQG3OMAjkfOgbSZwzE4PJyfWi6caTdz\naffW95akrPFIrLg/tRHpGzs9C6t0W31FrO3Y43MrcbH9c/eloZ6v0JpWoKlrHHBbScSFEHYc5Pz7\n1NDXUoJrK1g0dvw9qsspW3nXaN6KMrHnH5ieSfan0U3Rr1uidaRbiwk8BUSS6naQkjc3ZcHaRnn7\n0wbja6lZX+nw3NvMksM+FXnPJ9DUCeoXj2hSG2t2km7op4U/f/FAvHaNePb3N0jRzRA7VD8Akc9u\n/FAvcxnawZQ3HYtjJoKfDFAdeub6Vo1dSULIBtTbgYOfU8jNWUVvrm5ih0m1urixhlsI5HJliOwR\n5/LkkHHJPamjHdQ0HWdemlutN0+YWBYtC0rHDhjwVz3zWgx1n4e9U6QE8XT5Zd//APR5se9XBXbj\nS9S0zAvbO5tyWKAOhG4/KpQ3ZHXO5JFK98qRUGhfCbph77Uvx91pv463wVjR0LR7s483796WjW7r\nTrXpHWrSW2YK7lmXTbaIFpCRjjHOOSeeBipaNLtXuIre3R43lnkGXYADZnnmoH6Dkbzn6UDGWe9a\n/hKG3jsW8riQMJS3svp86B6zgMQmDtGT8qDNb6XUpOoPx72tzOkjFYowOduDwDjj70Gg6Wsq2KNe\nAJKRuKk52fIn5DvVkENrvW+iaSAsl0txI2Asdud5Yk4A4pgzv4l9ST6JZSXbyyprWpw+FFa5G21g\nz5icfzH3pgwCSQlh688+tUEwjjngZ7UHAHuWAHpn+1AXj5frQWXOGBZcKSe3c/rQIyAtnI27eBj/\nADQIMAuH8vHBB9DQwVpPLjOckEZ/ahi9/Czqj/S9VhtLm6aG1uZFUsT5VOfX5Gpg9GiNJArxsrxs\nv1BHypYGF7pljeG3kvLZSlqzNGGxhSRjP6GoG1yLUWiWc2nSPA4KJGItyYHYHHarop3wu0jWYNUv\nzriNBp8ErraRMANxJ/N7nA7ZqDUHgSQLvAbacjI7H3oOuIFuYzGS68jJRyp4+lA0m0yDwGjiTw3b\nzBwTuDe+TQVbV+mLmW1NtbSok9weZiC2zPLEZ+/FBM6Xo40/TYdL8Jr21G4vJcuCck55HbFWUKQ/\nh4tR/DTz2o8TK21qmMgKOf8AfpmrokljG1i5BHI57D5VNorut9Lab1LA638W6H8sboNrqQckq3pn\ntV0RWsfD6K7SGC3vTFahQJY2iVmkI9d+Mimie0Hp2DQ7AQacio3JZgqjcT3zxk1KHGldPWtnqMup\nS5uNTmGGnk5KjGNqf0r8qgmkhVGcquGblm96BDUZZYLGVrdN8+MIvux7UGKTdXdbaRrFvbaxbWN4\nd58BmwCjHPORycLx2q4LNe9S9TdN6I13qkWmzSXdwBCGlO4hiMKAB2A9ag0WySQwpLLtMjDcQBhV\nz6CgoHxF17XbnUYunulgsUsu4TTvjIUAEhR+x4qwZwtkOi7651PXJobm4tohHbQhdgecjnaPZeOf\neqMy1vWLvWNQlvb+ZpJpWyT2A9gB6Cgjy5AO4A5oAGRgBR39aA7Z8MkFtxPY0AbV9UGfpQWhj5Tk\nBQGxuBoEGG1iQCyHvj1oELgSkK6oRnIBIxzRdJ28Q3+fHiAds96LoH3AF1wCfyijNbF8JviI1rbQ\n6Pq/iSopxFOx5Uf0n3qUbWQk8II2SRyDPuCDUHMpSIiJQSBwDwKAgTxApnEbyIQ+APyn0+9A5B3A\ngfmoEWgcb3VlMpGFYjt+negSs7zxH/C3RWO9UElM8SAHG5fl/agNdXcEbJAZ1WadvDQDJO7Gf7c0\nED1dqWv2enzw6Rb24nZfJd3EwREHqxyMZHzOKBbT7H8PZWTK5uZ9o3Xm1SzEry5PsT7UFF+JnUez\nSZ9LttRs2km2m5KSFWXDZI491AyBzVwK6J8T7CRtPjee0tbaGAtdNISdoXgLEo5JJxyfSmC6aF1f\no2vELZXDJOxwkMybHYe4HtUFiJWJd8rKqjuTQcZV8SNI0dy43BlGVA+ZoBniE0RU7tp77Tg5zQUv\n4hNrU2tdNWOhylPEnaS5UHGYlAzn5cn74oHGt6l0z07k6nJC123HhKPFlbPptGTj9q0Kx0XMvU+t\ny6vqQtpWlZo4LOdGDWsak8Aflycgk+v2qC8a1q8OnaXLPOz2kCIWkZ+CqjgYx6n0xTBkmp9Sabp0\nKdRyI5vJkaGw08MVKIDw8jA557896QY1q2o3eqXr3N7O8skjnlnzgn5e1UMCGV/MOM0BJFOVwfX0\noFtgZTjkg8UBtpOeO1B3hg85FBZXVMM+VJAA2+h96BO4IMJ/p7qvuKBKacmOKB5CYYx5UzgDPfHz\noGwD5OApJHAHrQEAk8NWdNpx+XdkA0AIGhkGWOQcgg8UGw/DP4kmwhi07WCTZqAiSbstGc4+pFKN\nvs5o7q2Sa3kWaJxkOp4NZDOHUh/qL2k8LW78eG7kbZv+0+/yoEZp7fUpX/BXpgvYZTCSRtO7vtwe\n/vQdY6jeyatPp91FEPw8aSNMoYbi2cADt6Z70DS60KW7luJdV1JniJzBtURG2b0KN7+/vQKSWUWn\nLLqN3cSLP4ex5Y8jxiPykr23+nzzigpXUPVOu6Vqmmf8UWttb9OXDqkjRnfI3H849uRkDOKC0axL\nFr+nLB0rrUMM0bqCIGGGX1AH09qsGc9UfBiTV9Vhu9Pu5oPGLNeG6bczN7jHvVEr058Gre3sLeDV\nrmOdo3LmSFNjEH+XdntQXO51XQOl5YrCKGWa8SMYS3tzMyLjjJHb9alDqz1S5ktJ7nVdLmSVDiOO\nNfEMiE4Xy+h9xUDm11CaTxEOn3VmpHFxKFCr9s5GPmKAus6jb9M6RJf3c88yxpjcxL7uM5OO3HrQ\nVTSupoOuYdZMTSpptriNFtXKXDA/Pjhs9h2xQOJ7Xpnpa2S91WK2swqjbGw3ysfcnuxrQsGmapYv\npwvra1FtDL52Mi+Gx49sZoMb+LXV0t+jWl3OYLGTO2zjx4h2nyszHsG4/Sgxt5ZJmEsjl3PB3GgS\nlyXBxkDnNADseB2PsaA8SoXQyFgmQCV70B5R/EIjYmPJxnvigEKcYDfrQF2/X9aCwqC7l2zwfT/F\nAJJ5747E5oGTqZArKOfccftQHZWwmOD23Z4NAEkTEBmwR7g5AoG7KSSE5HyFAMTyQsMHa/cEcEc5\noL58P+v7rppdryPNAXx+GfsQe7Z9D2/Wg3zSdX0fqzT08F433eYwscOpHt9PcVkQPW632mX9vfWd\nrbXiRgrIdu2eHIwGD57+nIoKdc/ELVdC0u5afp27SUtta5vJMMzk+UDjzYHtQWDpj4gxXmif/wAi\ntXZkGZzFGW8MehZO+PmM0Fibr/poWQmF6xXA2xmFg59sKRk0C2nQP1KFvdb0vwIUJNtDKcsVP8zD\n0Jx2oJDTNA0vR5p7qzs44pJOXkUc/SgNfa/pNvbF5L2JgTsCo2WJzjGKA1jcNcxOF/m/I0zbt4+g\nxgenNA5s7CCxWWYQxpNLgyMiY3nt2oHajcuexAoEL1C1uyFkVHO1ixHb17/KgwT4rdXWep6oul2O\npywaTYqVLxDyySDjaM9x6Z+tWDPdB1TW7Wa9sumpGlursqMQRlpXwd3BA4571RcdN0i41G7h/wBS\nmNxqdkwn1O6u5/4cAXlYgcnngE/pQNvih8S211obHRyYbWInfJG/Ex9MD2+tBmNzcTXTtJcSSSSH\nH5jngDAH0oEdxbg5A9wKAzPwO+fegSLfLJoFoR5fUfegXOcHGAT8qAM+XaBzQCCwGDuyPlQWJpV3\n7Q5TIweM7u/f9qA9vNYpFML2KaR8YiaJgAh55PvQRvnYoqA+MThcDnPai4PKWQlH3K6tggjnPaiE\nmz4ZznBPfFAVWG0AZDH1z2HzoE7lhv8AJIHI/mGRQI8AEeuOMGgndN6pu7V4RJLKY4WDLhypXj0o\nNL6d+MMS4ttetDdQgDNwAPEwPRh2NZGkabrvTXVZiexvba5aI+ILWZQG3Y4IDdvtQScvTdjK8cht\nFjkQ+VlYgqPXGKA17daV07apJrV9CsZbELTgbu3YY78UEHf9evJ4K9P6JqGoiR1XxjCUjAJ5OT3N\nBM9YdSWPTenwy3t7bWbSuBunUthfUhRyT+1BA2vXnS/jGdeo9LnIHljeLwSCe5zgmgejrOz1S3kG\nhazoaXYGAJ5Sw3e38uaCsJfX02rPD1XfXtvcCXdBJGjLbOO+EK88Y7nIoLB1H1Bb6WkN1ddSQ29i\no/5MZEjzt7DGTjj2FXNGUfEH4wRaxCtnp2kwGGM7llvBvIOO4XOAe/fNMwZbqusalfLBHfzSvFH+\nSIgKo+igYqiwWfWV30rpp03p6exJnUPJexQnxuR+Ulu2PkKCrT6jcSiTxZnbxCWcFidxPJJ96BBD\nlQ35fbFAbahBHJIGO+KAIwg5YnB455oDkKcbW7UAOowSMjOORQcCVXPp+9AqDkHcDmgMNpHPcUBT\nuzQWCJXcFvKR2Y0CMiqjnz4UcH/6oG8gKluwxyAfSjQ6ylEJBJfv37/OiYQMjbjkZXOSP/FEELAE\nkNn1waBCXdjORnPoc80CZeTb5wQe2BQAm4y7jlhjvQcWO3cW4GB7ZpgGC5a3uUeNyGQ5GCR+45pg\nt+l/EzqLTgxj1O5Zc4CSOXCj70wOE+Jd/Pq0V7qVvb3bISAWUBhnuc+/2pgvkHx0soLaNIdKkEiq\nR5yDg47cYpgresfELSNc1n8VrFtAw2ZBiiywwcgeb14x2xTBYNA13ozUo/GOqWVizDc1nf6crIh/\n7wOf1rOURvVupdE6ncpFeakiSWsZdbjSLfw1Zs+VVyMHA75xWsFDHU0idTJdf65rT28YKpPvHjKp\n9Bk49qYK/rGpXF/qU9zPdyzyyMSJJAAx9ifnVlwNZ7vxYEh8GAEHO8DDH5H5U0IPK8jHxSzFQAMn\nOKgJkFwPT6UBlAII5z3zQCjnA5OKBXeuAT9KABMA208DtxQHRhzgUC3KjJx9z2oAP6/L3NAHC8Hg\n/XNAcNtGe4oEy5yeaCdLk7yx2qQCAO1AmXZSSexHbPNAhJuLJkgjvzRonuAJy2cd8UCbyOi453Dj\n7GiYTZyVPPl74oYLJIyq68EH3Gf3oYTDEjLbiP1FEDHOUOdgOfXIBFAm77j5Mnng/WgLI5UE8Eg9\niO9AnuJbuQx5wOBQFRxuIbOc54PrQK28ws76F722EyI4d4HJUOPb35yKBm8oeQsi4BPbPb71RyYI\nHmPGRg00GRsbsHIPY0Bg52AEEseBUCQJyOPXtQDtcdvvjtQCQ/GBwKAuXU4PrQBvZE5IGeO1Affj\nBJ57UBvEO045HagFWAAzktQKIzBeMg0C5kz5mOG/WgMrDJJ7jmgEnIyOccYoA3cEMRj05oC7/wDe\nBQTduzEoNxwcZGaAJOWfPNAlISVOT60aIQfkj+amgJ3bnnigKeFGPQUCf/x0Smw4V8exogX/AOY3\n+/SgKxKxeU459KAgJOckntQJkkcgkGgAAFFz/XQEmJaY7jnk96BM9yPQelAf/wCX7UBv/jagGP8A\nKB6ZoDf00HMfO/0oAH5TQA/5moECSMDPFAvGASMjPP8AigVX+b60BW7/AHoHEJJD55oDd4snv70C\nsSjCcDmgVAAbgYoGYJ3nk9qBUAYHAoP/2Q==\n"     }-   }+   },+   "id": "uid6"   }  ],  "nbformat": 4,
test/ipynb/simple.out.native view
@@ -12,7 +12,7 @@           ]     }   [ Div-      ( "" , [ "cell" , "markdown" ] , [] )+      ( "uid1" , [ "cell" , "markdown" ] , [] )       [ Header           1           ( "lorem-ipsum" , [] , [] )@@ -46,13 +46,13 @@           ]       ]   , Div-      ( "" , [ "cell" , "code" ] , [] )+      ( "uid2" , [ "cell" , "code" ] , [] )       [ CodeBlock ( "" , [ "python" ] , [] ) "print(\"hello\")" ]   , Div-      ( "" , [ "cell" , "markdown" ] , [] )+      ( "uid3" , [ "cell" , "markdown" ] , [] )       [ Header 2 ( "pyout" , [] , [] ) [ Str "Pyout" ] ]   , Div-      ( ""+      ( "uid4"       , [ "cell" , "code" ]       , [ ( "execution_count" , "2" ) ]       )@@ -70,7 +70,7 @@           ]       ]   , Div-      ( ""+      ( "uid6"       , [ "cell" , "markdown" ]       , [ ( "tags" , "[\"foo\",\"bar\"]" ) ]       )
test/lua/implicit-doc-filter.lua view
@@ -1,4 +1,4 @@-function Doc (doc)+function Pandoc (doc)   local meta = {}   local hello = { pandoc.Str "Hello,", pandoc.Space(), pandoc.Str "World!" }   local blocks = { pandoc.Para(hello) }
+ test/lua/module/globals.lua view
@@ -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),+  }+}
+ test/lua/module/pandoc-template.lua view
@@ -0,0 +1,65 @@+local tasty = require 'tasty'+local template = require 'pandoc.template'++local assert = tasty.assert+local test = tasty.test_case+local group = tasty.test_group++return {+  test('is table', function ()+    assert.are_equal(type(template), 'table')+  end),+  group 'default' {+    test('is function', function ()+      assert.are_equal(type(template.default), 'function')+    end),+    test('returns a string for known format', function ()+      assert.are_equal(+        pandoc.utils.type(template.default 'json'),+        'string'+      )+      assert.are_equal(+        pandoc.utils.type(template.default 'markdown'),+        'string'+      )+    end),+    test('fails on unknown format', function ()+      local success, msg = pcall(function ()+          return pandoc.utils.type(template.default 'nosuchformat')+      end)+      assert.is_falsy(success)+    end),+  },+  group 'compile' {+    test('is function', function ()+      assert.are_equal(type(template.compile), 'function')+    end),+    test('returns a Template', function ()+      assert.are_equal(+        pandoc.utils.type(template.compile('$title$')),+        'pandoc Template'+      )+    end),+    test('returns a Template', function ()+      local templ_path = pandoc.path.join{'lua', 'module', 'default.test'}+      assert.are_equal(+        pandoc.utils.type(template.compile('${ partial() }', templ_path)),+        'pandoc Template'+      )+    end),+    test('fails if template has non-existing partial', function ()+      assert.error_matches(+        function () return template.compile('${ nosuchpartial() }') end,+        'PandocCouldNotFindDataFileError'+      )+    end),+    test('works with default template that uses partials', function ()+      local jats_template = template.default 'jats'+      assert.are_equal(type(jats_template), 'string')+      assert.are_equal(+        pandoc.utils.type(template.compile(jats_template)),+        'pandoc Template'+      )+    end),+  },+}
test/lua/module/pandoc-utils.lua view
@@ -39,6 +39,46 @@     end)   }, +  group 'equals' {+    test('compares Pandoc elements', function ()+      assert.is_truthy(+        utils.equals(pandoc.Pandoc{'foo'}, pandoc.Pandoc{'foo'})+      )+    end),+    test('compares Block elements', function ()+      assert.is_truthy(+        utils.equals(pandoc.Plain{'foo'}, pandoc.Plain{'foo'})+      )+      assert.is_falsy(+        utils.equals(pandoc.Para{'foo'}, pandoc.Plain{'foo'})+      )+    end),+    test('compares Inline elements', function ()+      assert.is_truthy(+        utils.equals(pandoc.Emph{'foo'}, pandoc.Emph{'foo'})+      )+      assert.is_falsy(+        utils.equals(pandoc.Emph{'foo'}, pandoc.Strong{'foo'})+      )+    end),+    test('compares Inline with Block elements', function ()+      assert.is_falsy(+        utils.equals(pandoc.Emph{'foo'}, pandoc.Plain{'foo'})+      )+      assert.is_falsy(+        utils.equals(pandoc.Para{'foo'}, pandoc.Strong{'foo'})+      )+    end),+    test('compares Pandoc with Block elements', function ()+      assert.is_falsy(+        utils.equals(pandoc.Pandoc{'foo'}, pandoc.Plain{'foo'})+      )+      assert.is_falsy(+        utils.equals(pandoc.Para{'foo'}, pandoc.Pandoc{'foo'})+      )+    end),+  },+   group 'make_sections' {     test('sanity check', function ()       local blks = {@@ -62,6 +102,31 @@     end),   }, +  group 'references' {+    test('gets references from doc', function ()+      local ref = {+        ['author'] = {+          {given = 'Max', family = 'Mustermann'}+        },+        ['container-title'] = pandoc.Inlines('JOSS'),+        ['id']     = 'test',+        ['issued'] = {['date-parts'] = {{2021}}},+        ['title']  = pandoc.Inlines{+          pandoc.Quoted('DoubleQuote', 'Interesting'),+          pandoc.Space(),+          'work'+        },+        ['type']   = 'article-journal',+      }+      local nocite = pandoc.Cite(+        '@test',+        {pandoc.Citation('test', 'NormalCitation')}+      )+      local doc = pandoc.Pandoc({}, {nocite = nocite, references = {ref}})+      assert.are_same({ref}, pandoc.utils.references(doc))+    end)+  },+   group 'sha1' {     test('hashing', function ()       local ref_hash = '0a0a9f2a6772942557ab5355d76af442f8f65e01'@@ -70,7 +135,7 @@   },    group 'stringify' {-    test('inlines', function ()+    test('Inline', function ()       local inline = pandoc.Emph{         pandoc.Str 'Cogito',         pandoc.Space(),@@ -79,7 +144,49 @@         pandoc.Str 'sum.',       }       assert.are_equal('Cogito ergo sum.', utils.stringify(inline))-    end)+    end),+    test('Block', function ()+      local block = pandoc.Para{+        pandoc.Str 'Make',+        pandoc.Space(),+        pandoc.Str 'it',+        pandoc.Space(),+        pandoc.Str 'so.',+      }+      assert.are_equal('Make it so.', utils.stringify(block))+    end),+    test('boolean', function ()+      assert.are_equal('true', utils.stringify(true))+      assert.are_equal('false', utils.stringify(false))+    end),+    test('number', function ()+      assert.are_equal('5', utils.stringify(5))+      assert.are_equal('23.23', utils.stringify(23.23))+    end),+    test('Attr', function ()+      local attr = pandoc.Attr('foo', {'bar'}, {a = 'b'})+      assert.are_equal('', utils.stringify(attr))+    end),+    test('List', function ()+      local list = pandoc.List{pandoc.Str 'a', pandoc.Blocks('b')}+      assert.are_equal('ab', utils.stringify(list))+    end),+    test('Blocks', function ()+      local blocks = pandoc.Blocks{pandoc.Para 'a', pandoc.Header(1, 'b')}+      assert.are_equal('ab', utils.stringify(blocks))+    end),+    test('Inlines', function ()+      local inlines = pandoc.Inlines{pandoc.Str 'a', pandoc.Subscript('b')}+      assert.are_equal('ab', utils.stringify(inlines))+    end),+    test('Meta', function ()+      local meta = pandoc.Meta{+        a = pandoc.Inlines 'funny and ',+        b = 'good movie',+        c = pandoc.List{pandoc.Inlines{pandoc.Str '!'}}+      }+      assert.are_equal('funny and good movie!', utils.stringify(meta))+    end),   },    group 'to_roman_numeral' {@@ -91,6 +198,46 @@     end)   }, +  group 'type' {+    test('nil', function ()+      assert.are_equal(utils.type(nil), 'nil')+    end),+    test('boolean', function ()+      assert.are_equal(utils.type(true), 'boolean')+      assert.are_equal(utils.type(false), 'boolean')+    end),+    test('number', function ()+      assert.are_equal(utils.type(5), 'number')+      assert.are_equal(utils.type(-3.02), 'number')+    end),+    test('string', function ()+      assert.are_equal(utils.type(''), 'string')+      assert.are_equal(utils.type('asdf'), 'string')+    end),+    test('plain table', function ()+      assert.are_equal(utils.type({}), 'table')+    end),+    test('List', function ()+      assert.are_equal(utils.type(pandoc.List{}), 'List')+    end),+    test('Inline', function ()+      assert.are_equal(utils.type(pandoc.Str 'a'), 'Inline')+      assert.are_equal(utils.type(pandoc.Emph 'emphasized'), 'Inline')+    end),+    test('Inlines', function ()+      assert.are_equal(utils.type(pandoc.Inlines{pandoc.Str 'a'}), 'Inlines')+      assert.are_equal(utils.type(pandoc.Inlines{pandoc.Emph 'b'}), 'Inlines')+    end),+    test('Blocks', function ()+      assert.are_equal(utils.type(pandoc.Para 'a'), 'Block')+      assert.are_equal(utils.type(pandoc.CodeBlock 'true'), 'Block')+    end),+    test('Inlines', function ()+      assert.are_equal(utils.type(pandoc.Blocks{'a'}), 'Blocks')+      assert.are_equal(utils.type(pandoc.Blocks{pandoc.CodeBlock 'b'}), 'Blocks')+    end),+  },+   group 'to_simple_table' {     test('convertes Table', function ()       function simple_cell (blocks)@@ -106,14 +253,14 @@         {long = {pandoc.Plain {                    pandoc.Str "the", pandoc.Space(), pandoc.Str "caption"}}},         {{pandoc.AlignDefault, nil}},-        {pandoc.Attr(), {{pandoc.Attr(), {simple_cell{pandoc.Plain "head1"}}}}},+        pandoc.TableHead{pandoc.Row{simple_cell{pandoc.Plain "head1"}}},         {{             attr = pandoc.Attr(),-            body = {{pandoc.Attr(), {simple_cell{pandoc.Plain "cell1"}}}},+            body = {pandoc.Row{simple_cell{pandoc.Plain "cell1"}}},             head = {},             row_head_columns = 0         }},-        {pandoc.Attr(), {}},+        pandoc.TableFoot(),         pandoc.Attr()       )       local stbl = utils.to_simple_table(tbl)@@ -154,6 +301,33 @@       )       -- reversible       assert.are_same(simple_table, utils.to_simple_table(tbl))+    end),+    test('empty caption', function ()+      local simple_table = pandoc.SimpleTable(+        {},+        {pandoc.AlignDefault},+        {0},+        {{pandoc.Plain 'a'}},+        {{{pandoc.Plain 'b'}}}+      )+      local tbl = utils.from_simple_table(simple_table)+      assert.are_equal(+        pandoc.Blocks{},+        tbl.caption.long+      )+      assert.is_nil(tbl.caption.short)+    end),+    test('empty body', function ()+      local simple_table = pandoc.SimpleTable(+        pandoc.Inlines('a nice caption'),+        {pandoc.AlignDefault},+        {0},+        {{pandoc.Plain 'a'}},+        {}+      )+      local tbl = utils.from_simple_table(simple_table)+      tbl.bodies:map(print)+      assert.are_same(pandoc.List(), tbl.bodies)     end),   } }
test/lua/module/pandoc.lua view
@@ -8,712 +8,130 @@   return package.config:sub(1,1) == '\\' end +-- Constructor behavior is tested in the hslua-pandoc-types module, so+-- we just make sure the functions are present. return {-  group 'Attr' {-    group 'Constructor' {+  group 'Constructors' {+    group 'Misc' {       test('pandoc.Attr is a function', function ()         assert.are_equal(type(pandoc.Attr), 'function')       end),-      test('returns null-Attr if no arguments are given', function ()-        local attr = pandoc.Attr()-        assert.are_equal(attr.identifier, '')-        assert.are_same(attr.classes, {})-        assert.are_same(#attr.attributes, 0)-      end),-      test(-        'accepts string-indexed table or list of pairs as attributes',-        function ()-          local attributes_list = {{'one', '1'}, {'two', '2'}}-          local attr_from_list = pandoc.Attr('', {}, attributes_list)--          assert.are_equal(attr_from_list.attributes.one, '1')-          assert.are_equal(attr_from_list.attributes.two, '2')--          local attributes_table = {one = '1', two = '2'}-          local attr_from_table = pandoc.Attr('', {}, attributes_table)-          assert.are_equal(-            attr_from_table.attributes,-            pandoc.AttributeList(attributes_table)-          )-          assert.are_equal(attr_from_table.attributes.one, '1')-          assert.are_equal(attr_from_table.attributes.two, '2')-        end-      )-    },-    group 'Properties' {-      test('has t and tag property', function ()-        local attr = pandoc.Attr('')-        assert.are_equal(attr.t, 'Attr')-        assert.are_equal(attr.tag, 'Attr')-      end)-    },-    group 'AttributeList' {-      test('allows access via fields', function ()-        local attributes = pandoc.Attr('', {}, {{'a', '1'}, {'b', '2'}}).attributes-        assert.are_equal(attributes.a, '1')-        assert.are_equal(attributes.b, '2')-      end),-      test('allows access to pairs via numerical indexing', function ()-        local attributes = pandoc.Attr('', {}, {{'a', '1'}, {'b', '2'}}).attributes-        assert.are_same(attributes[1], {'a', '1'})-        assert.are_same(attributes[2], {'b', '2'})-      end),-      test('allows replacing a pair', function ()-        local attributes = pandoc.AttributeList{{'a', '1'}, {'b', '2'}}-        attributes[1] = {'t','five'}-        assert.are_same(attributes[1], {'t', 'five'})-        assert.are_same(attributes[2], {'b', '2'})-      end),-      test('allows to remove a pair', function ()-         local attributes = pandoc.AttributeList{{'a', '1'}, {'b', '2'}}-         attributes[1] = nil-         assert.are_equal(#attributes, 1)-      end),-      test('adds entries by field name', function ()-        local attributes = pandoc.Attr('',{}, {{'c', '1'}, {'d', '2'}}).attributes-        attributes.e = '3'-        assert.are_same(-          attributes,-          -- checking the full AttributeList would "duplicate" entries-          pandoc.AttributeList{{'c', '1'}, {'d', '2'}, {'e', '3'}}-        )+      test('pandoc.AttributeList is a function', function ()+        assert.are_equal(type(pandoc.AttributeList), 'function')       end),-      test('deletes entries by field name', function ()-        local attributes = pandoc.Attr('',{}, {a = '1', b = '2'}).attributes-        attributes.a = nil-        assert.is_nil(attributes.a)-        assert.are_same(attributes, pandoc.AttributeList{{'b', '2'}})+      test('pandoc.Blocks is a function', function ()+        assert.are_equal(type(pandoc.Blocks), 'function')       end),-      test('remains unchanged if deleted key did not exist', function ()-        local assoc_list = pandoc.List:new {{'alpha', 'x'}, {'beta', 'y'}}-        local attributes = pandoc.Attr('', {}, assoc_list).attributes-        attributes.a = nil-        local new_assoc_list = pandoc.List()-        for k, v in pairs(attributes) do-          new_assoc_list:insert({k, v})-        end-        assert.are_same(new_assoc_list, assoc_list)+      test('pandoc.Citation is a function', function ()+        assert.are_equal(type(pandoc.Citation), 'function')       end),-      test('gives key-value pairs when iterated-over', function ()-        local attributes = {width = '11', height = '22', name = 'test'}-        local attr = pandoc.Attr('', {}, attributes)-        local count = 0-        for k, v in pairs(attr.attributes) do-          assert.are_equal(attributes[k], v)-          count = count + 1-        end-        assert.are_equal(count, 3)-      end)-    },-    group 'HTML-like attribute tables' {-      test('in element constructor', function ()-        local html_attributes = {-          id = 'the-id',-          class = 'class1 class2',-          width = '11',-          height = '12'-        }-        local attr = pandoc.Span('test', html_attributes).attr-        assert.are_equal(attr.identifier, 'the-id')-        assert.are_equal(attr.classes[1], 'class1')-        assert.are_equal(attr.classes[2], 'class2')-        assert.are_equal(attr.attributes.width, '11')-        assert.are_equal(attr.attributes.height, '12')+      test('pandoc.Inlines is a function', function ()+        assert.are_equal(type(pandoc.Inlines), 'function')       end),-      test('element attr setter', function ()-        local html_attributes = {-          id = 'the-id',-          class = 'class1 class2',-          width = "11",-          height = "12"-        }-        local span = pandoc.Span 'test'-        span.attr = html_attributes-        span = span:clone() -- normalize-        assert.are_equal(span.attr.identifier, 'the-id')-        assert.are_equal(span.attr.classes[1], 'class1')-        assert.are_equal(span.attr.classes[2], 'class2')-        assert.are_equal(span.attr.attributes.width, '11')-        assert.are_equal(span.attr.attributes.height, '12')+      test('pandoc.SimpleTable is a function', function ()+        assert.are_equal(type(pandoc.SimpleTable), 'function')       end),-      test('element attrbutes setter', function ()-        local attributes = {-          width = "11",-          height = "12"-        }-        local span = pandoc.Span 'test'-        span.attributes = attributes-        assert.are_equal(span.attr.attributes.width, '11')-        assert.are_equal(span.attr.attributes.height, '12')-      end)-    }-  },-  group "Inline elements" {-    group 'Cite' {-      test('has property `content`', function ()-        local cite = pandoc.Cite({pandoc.Emph 'important'}, {})-        assert.are_same(cite.content, {pandoc.Emph {pandoc.Str 'important'}})--        cite.content = 'boring'-        assert.are_equal(cite, pandoc.Cite({pandoc.Str 'boring'}, {}))+      test('pandoc.Meta is a function', function ()+        assert.are_equal(type(pandoc.Meta), 'function')       end),-      test('has list of citations in property `cite`', function ()-        local citations = {-          pandoc.Citation('einstein1905', 'NormalCitation')-        }-        local cite = pandoc.Cite('relativity', citations)-        assert.are_same(cite.citations, citations)--        local new_citations = {-          citations[1],-          pandoc.Citation('Poincaré1905', 'NormalCitation')-        }-        cite.citations = new_citations-        assert.are_equal(cite, pandoc.Cite({'relativity'}, new_citations))+      test('pandoc.Pandoc is a function', function ()+        assert.are_equal(type(pandoc.Pandoc), 'function')       end),     },-    group 'Code' {-      test('has property `attr`', function ()-        local code = pandoc.Code('true', {id='true', foo='bar'})-        assert.are_equal(code.attr, pandoc.Attr('true', {}, {{'foo', 'bar'}}))--        code.attr = {id='t', fubar='quux'}-        assert.are_equal(-          pandoc.Code('true', pandoc.Attr('t', {}, {{'fubar', 'quux'}})),-          code-        )-      end),-      test('has property `text`', function ()-        local code = pandoc.Code('true')-        assert.are_equal(code.text, 'true')--        code.text = '1 + 1'-        assert.are_equal(pandoc.Code('1 + 1'), code)+    group "Inline elements" {+      test('pandoc.AttributeList is a function', function ()+        assert.are_equal(type(pandoc.Cite), 'function')       end),-    },-    group 'Emph' {-      test('has property `content`', function ()-        local elem = pandoc.Emph{'two', pandoc.Space(), 'words'}-        assert.are_same(-          elem.content,-          {pandoc.Str 'two', pandoc.Space(), pandoc.Str 'words'}-        )-        elem.content = {'word'}-        assert.are_equal(elem, pandoc.Emph{'word'})-      end)-    },-    group 'Image' {-      test('has property `caption`', function ()-        local img = pandoc.Image('example', 'a.png')-        assert.are_same(img.caption, {pandoc.Str 'example'})--        img.caption = 'A'-        assert.are_equal(img, pandoc.Image({'A'}, 'a.png'))+      test('pandoc.AttributeList is a function', function ()+        assert.are_equal(type(pandoc.Code), 'function')       end),-      test('has property `src`', function ()-        local img = pandoc.Image('example', 'sample.png')-        assert.are_same(img.src, 'sample.png')--        img.src = 'example.svg'-        assert.are_equal(img, pandoc.Image('example', 'example.svg'))+      test('pandoc.Emph is a function', function ()+        assert.are_equal(type(pandoc.Emph), 'function')       end),-      test('has property `title`', function ()-        local img = pandoc.Image('here', 'img.gif', 'example')-        assert.are_same(img.title, 'example')--        img.title = 'a'-        assert.are_equal(img, pandoc.Image('here', 'img.gif', 'a'))+      test('pandoc.Image is a function', function ()+        assert.are_equal(type(pandoc.Image), 'function')       end),-      test('has property `attr`', function ()-        local img = pandoc.Image('up', 'upwards.png', '', {'up', {'point'}})-        assert.are_same(img.attr, pandoc.Attr {'up', {'point'}})--        img.attr = pandoc.Attr {'up', {'point', 'button'}}-        assert.are_equal(-          pandoc.Image('up', 'upwards.png', nil, {'up', {'point', 'button'}}),-          img-        )-      end)-    },-    group 'Link' {-      test('has property `content`', function ()-        local link = pandoc.Link('example', 'https://example.org')-        assert.are_same(link.content, {pandoc.Str 'example'})--        link.content = 'commercial'-        link.target = 'https://example.com'-        assert.are_equal(link, pandoc.Link('commercial', 'https://example.com'))+      test('pandoc.Link is a function', function ()+        assert.are_equal(type(pandoc.Link), 'function')       end),-      test('has property `target`', function ()-        local link = pandoc.Link('example', 'https://example.org')-        assert.are_same(link.content, {pandoc.Str 'example'})--        link.target = 'https://example.com'-        assert.are_equal(link, pandoc.Link('example', 'https://example.com'))+      test('pandoc.Math is a function', function ()+        assert.are_equal(type(pandoc.Math), 'function')       end),-      test('has property `title`', function ()-        local link = pandoc.Link('here', 'https://example.org', 'example')-        assert.are_same(link.title, 'example')--        link.title = 'a'-        assert.are_equal(link, pandoc.Link('here', 'https://example.org', 'a'))+      test('pandoc.Note is a function', function ()+        assert.are_equal(type(pandoc.Note), 'function')       end),-      test('has property `attr`', function ()-        local link = pandoc.Link('up', '../index.html', '', {'up', {'nav'}})-        assert.are_same(link.attr, pandoc.Attr {'up', {'nav'}})--        link.attr = pandoc.Attr {'up', {'nav', 'button'}}-        assert.are_equal(-          pandoc.Link('up', '../index.html', nil, {'up', {'nav', 'button'}}),-          link-        )-      end)-    },-    group 'Math' {-      test('has property `text`', function ()-        local elem = pandoc.Math(pandoc.InlineMath, 'x^2')-        assert.are_same(elem.text, 'x^2')-        elem.text = 'a + b'-        assert.are_equal(elem, pandoc.Math(pandoc.InlineMath, 'a + b'))+      test('pandoc.Quoted is a function', function ()+        assert.are_equal(type(pandoc.Quoted), 'function')       end),-      test('has property `mathtype`', function ()-        local elem = pandoc.Math(pandoc.InlineMath, 'x^2')-        assert.are_same(elem.mathtype, 'InlineMath')-        elem.mathtype = pandoc.DisplayMath-        assert.are_equal(elem, pandoc.Math(pandoc.DisplayMath, 'x^2'))+      test('pandoc.SmallCaps is a function', function ()+        assert.are_equal(type(pandoc.SmallCaps), 'function')       end),-    },-    group 'Note' {-      test('has property `content`', function ()-        local elem = pandoc.Note{pandoc.Para {'two', pandoc.Space(), 'words'}}-        assert.are_same(-          elem.content,-          {pandoc.Para {pandoc.Str 'two', pandoc.Space(), pandoc.Str 'words'}}-        )-        elem.content = pandoc.Plain 'word'-        assert.are_equal(elem, pandoc.Note{'word'})-      end)-    },-    group 'Quoted' {-      test('has property `content`', function ()-        local elem = pandoc.Quoted('SingleQuote', pandoc.Emph{'emph'})-        assert.are_same(-          elem.content,-          {pandoc.Emph{pandoc.Str 'emph'}}-        )-        elem.content = {'word'}-        assert.are_equal(elem, pandoc.Quoted(pandoc.SingleQuote, {'word'}))+      test('pandoc.SoftBreak is a function', function ()+        assert.are_equal(type(pandoc.SoftBreak), 'function')       end),-      test('has property `quotetype`', function ()-        local elem = pandoc.Quoted('SingleQuote', 'a')-        assert.are_same(elem.quotetype, pandoc.SingleQuote)-        elem.quotetype = 'DoubleQuote'-        assert.are_equal(elem, pandoc.Quoted(pandoc.DoubleQuote, {'a'}))-      end)-    },-    group 'SmallCaps' {-      test('has property `content`', function ()-        local elem = pandoc.SmallCaps{'two', pandoc.Space(), 'words'}-        assert.are_same(-          elem.content,-          {pandoc.Str 'two', pandoc.Space(), pandoc.Str 'words'}-        )-        elem.content = {'word'}-        assert.are_equal(elem, pandoc.SmallCaps{'word'})-      end)-    },-    group 'SoftBreak' {-      test('can be constructed', function ()-        local sb = pandoc.SoftBreak()-        assert.are_equal(sb.t, 'SoftBreak')-      end)-    },-    group 'Span' {-      test('has property `attr`', function ()-        local elem = pandoc.Span('one', {'', {'number'}})-        assert.are_same(-          elem.attr,-          pandoc.Attr('', {'number'})-        )-        elem.attr = {'', {}, {{'a', 'b'}}}-        assert.are_equal(elem, pandoc.Span({'one'}, {a='b'}))+      test('pandoc.Span is a function', function ()+        assert.are_equal(type(pandoc.Span), 'function')       end),-      test('has property `content`', function ()-        local elem = pandoc.Span{'two', pandoc.Space(), 'words'}-        assert.are_same(-          elem.content,-          {pandoc.Str 'two', pandoc.Space(), pandoc.Str 'words'}-        )-        elem.content = {'word'}-        assert.are_equal(elem, pandoc.Span{'word'})-      end)-    },-    group 'Str' {-      test('has property `text`', function ()-        local elem = pandoc.Str 'nein'-        assert.are_same(elem.text, 'nein')-        elem.text = 'doch'-        assert.are_equal(elem, pandoc.Str 'doch')-      end)-    },-    group 'Strikeout' {-      test('has property `content`', function ()-        local elem = pandoc.Strikeout{'two', pandoc.Space(), 'words'}-        assert.are_same(-          elem.content,-          {pandoc.Str 'two', pandoc.Space(), pandoc.Str 'words'}-        )-        elem.content = {'word'}-        assert.are_equal(elem, pandoc.Strikeout{'word'})-      end)-    },-    group 'Strong' {-      test('has property `content`', function ()-        local elem = pandoc.Strong{'two', pandoc.Space(), 'words'}-        assert.are_same(-          elem.content,-          {pandoc.Str 'two', pandoc.Space(), pandoc.Str 'words'}-        )-        elem.content = {'word'}-        assert.are_equal(elem, pandoc.Strong{'word'})-      end)-    },-    group 'Subscript' {-      test('has property `content`', function ()-        local elem = pandoc.Subscript{'two', pandoc.Space(), 'words'}-        assert.are_same(-          elem.content,-          {pandoc.Str 'two', pandoc.Space(), pandoc.Str 'words'}-        )-        elem.content = {'word'}-        assert.are_equal(elem, pandoc.Subscript{'word'})-      end)-    },-    group 'Superscript' {-      test('has property `content`', function ()-        local elem = pandoc.Superscript{'two', pandoc.Space(), 'words'}-        assert.are_same(-          elem.content,-          {pandoc.Str 'two', pandoc.Space(), pandoc.Str 'words'}-        )-        elem.content = {'word'}-        assert.are_equal(elem, pandoc.Superscript{'word'})-      end)-    },-    group 'Underline' {-      test('has property `content`', function ()-        local elem = pandoc.Underline{'two', pandoc.Space(), 'words'}-        assert.are_same(-          elem.content,-          {pandoc.Str 'two', pandoc.Space(), pandoc.Str 'words'}-        )-        elem.content = {'word'}-        assert.are_equal(elem, pandoc.Underline{'word'})-      end)-    },-  },-  group "Block elements" {-    group 'BlockQuote' {-      test('access content via property `content`', function ()-        local elem = pandoc.BlockQuote{'word'}-        assert.are_same(elem.content, {pandoc.Plain 'word'})-        assert.are_equal(type(elem.content), 'table')--        elem.content = {-          pandoc.Para{pandoc.Str 'one'},-          pandoc.Para{pandoc.Str 'two'}-        }-        assert.are_equal(-          pandoc.BlockQuote{-            pandoc.Para 'one',-            pandoc.Para 'two'-          },-          elem-        )+      test('pandoc.Str is a function', function ()+        assert.are_equal(type(pandoc.Str), 'function')       end),-    },-    group 'BulletList' {-      test('access items via property `content`', function ()-        local para = pandoc.Para 'one'-        local blist = pandoc.BulletList{{para}}-        assert.are_same({{para}}, blist.content)+      test('pandoc.Strikeout is a function', function ()+      assert.are_equal(type(pandoc.Strikeout), 'function')       end),-      test('property `content` uses fuzzy marshalling', function ()-        local old = pandoc.Plain 'old'-        local new = pandoc.Plain 'new'-        local blist = pandoc.BulletList{{old}}-        blist.content = {{new}}-        assert.are_same({{new}}, blist:clone().content)-        blist.content = new-        assert.are_same({{new}}, blist:clone().content)+      test('pandoc.Strong is a function', function ()+        assert.are_equal(type(pandoc.Strong), 'function')       end),-    },-    group 'CodeBlock' {-      test('access code via property `text`', function ()-        local cb = pandoc.CodeBlock('return true')-        assert.are_equal(cb.text, 'return true')-        assert.are_equal(type(cb.text), 'string')--        cb.text = 'return nil'-        assert.are_equal(cb, pandoc.CodeBlock('return nil'))+      test('pandoc.Subscript is a function', function ()+        assert.are_equal(type(pandoc.Subscript), 'function')       end),-      test('access Attr via property `attr`', function ()-        local cb = pandoc.CodeBlock('true', {'my-code', {'lua'}})-        assert.are_equal(cb.attr, pandoc.Attr{'my-code', {'lua'}})-        assert.are_equal(type(cb.attr), 'userdata')--        cb.attr = pandoc.Attr{'my-other-code', {'java'}}-        assert.are_equal(-          pandoc.CodeBlock('true', {'my-other-code', {'java'}}),-          cb-        )-      end)-    },-    group 'DefinitionList' {-      test('access items via property `content`', function ()-        local deflist = pandoc.DefinitionList{-          {'apple', {{pandoc.Plain 'fruit'}, {pandoc.Plain 'company'}}},-          {pandoc.Str 'coffee', 'Best when hot.'}-        }-        assert.are_equal(#deflist.content, 2)-        assert.are_same(deflist.content[1][1], {pandoc.Str 'apple'})-        assert.are_same(deflist.content[1][2][2],-                         {pandoc.Plain{pandoc.Str 'company'}})-        assert.are_same(deflist.content[2][2],-                         {{pandoc.Plain{pandoc.Str 'Best when hot.'}}})+      test('pandoc.Superscript is a function', function ()+        assert.are_equal(type(pandoc.Superscript), 'function')       end),-      test('modify items via property `content`', function ()-        local deflist = pandoc.DefinitionList{-          {'apple', {{{'fruit'}}, {{'company'}}}}-        }-        deflist.content[1][1] = pandoc.Str 'orange'-        deflist.content[1][2][1] = {pandoc.Plain 'tasty fruit'}-        local newlist = pandoc.DefinitionList{-          { {pandoc.Str 'orange'},-            {{pandoc.Plain 'tasty fruit'}, {pandoc.Plain 'company'}}-          }-        }-        assert.are_equal(deflist, newlist)+      test('pandoc.Underline is a function', function ()+        assert.are_equal(type(pandoc.Underline), 'function')       end),     },-    group 'Div' {-      test('access content via property `content`', function ()-        local elem = pandoc.Div{pandoc.BlockQuote{pandoc.Plain 'word'}}-        assert.are_same(elem.content, {pandoc.BlockQuote{'word'}})-        assert.are_equal(type(elem.content), 'table')--        elem.content = {-          pandoc.Para{pandoc.Str 'one'},-          pandoc.Para{pandoc.Str 'two'}-        }-        assert.are_equal(-          pandoc.Div{-            pandoc.Para 'one',-            pandoc.Para 'two'-          },-          elem-        )-      end),-      test('access Attr via property `attr`', function ()-        local div = pandoc.Div('word', {'my-div', {'sample'}})-        assert.are_equal(div.attr, pandoc.Attr{'my-div', {'sample'}})-        assert.are_equal(type(div.attr), 'userdata')--        div.attr = pandoc.Attr{'my-other-div', {'example'}}-        assert.are_equal(-          pandoc.Div('word', {'my-other-div', {'example'}}),-          div-        )-      end)-    },-    group 'Header' {-      test('access inlines via property `content`', function ()-        local header = pandoc.Header(1, 'test')-        assert.are_same(header.content, {pandoc.Str 'test'})--        header.content = {'new text'}-        assert.are_equal(header, pandoc.Header(1, 'new text'))+    group "Block elements" {+      test('pandoc.BlockQuote is a function', function ()+        assert.are_equal(type(pandoc.BlockQuote), 'function')       end),-      test('access Attr via property `attr`', function ()-        local header = pandoc.Header(1, 'test', {'my-test'})-        assert.are_same(header.attr, pandoc.Attr{'my-test'})--        header.attr = 'second-test'-        assert.are_equal(header, pandoc.Header(1, 'test', 'second-test'))+      test('pandoc.BulletList is a function', function ()+        assert.are_equal(type(pandoc.BulletList), 'function')       end),-      test('access level via property `level`', function ()-        local header = pandoc.Header(3, 'test')-        assert.are_same(header.level, 3)--        header.level = 2-        assert.are_equal(header, pandoc.Header(2, 'test'))+      test('pandoc.CodeBlock is a function', function ()+        assert.are_equal(type(pandoc.CodeBlock), 'function')       end),-    },-    group 'LineBlock' {-      test('access lines via property `content`', function ()-        local spc = pandoc.Space()-        local lineblock = pandoc.LineBlock{-          {'200', spc, 'Main', spc, 'St.'},-          {'Berkeley', spc, 'CA', spc, '94718'}-        }-        assert.are_equal(#lineblock.content, 2) -- has two lines-        assert.are_same(lineblock.content[2][1], pandoc.Str 'Berkeley')+      test('pandoc.DefinitionList is a function', function ()+        assert.are_equal(type(pandoc.DefinitionList), 'function')       end),-      test('modifying `content` alter the element', function ()-        local spc = pandoc.Space()-        local lineblock = pandoc.LineBlock{-          {'200', spc, 'Main', spc, 'St.'},-          {'Berkeley', spc, 'CA', spc, '94718'}-        }-        lineblock.content[1][1] = '404'-        assert.are_same(-          lineblock:clone().content[1],-          {pandoc.Str '404', spc, pandoc.Str 'Main', spc, pandoc.Str 'St.'}-        )--        lineblock.content = {{'line1'}, {'line2'}}-        assert.are_same(-          lineblock:clone(),-          pandoc.LineBlock{-            {pandoc.Str 'line1'},-            {pandoc.Str 'line2'}-          }-        )-      end)-    },-    group 'OrderedList' {-      test('access items via property `content`', function ()-        local para = pandoc.Plain 'one'-        local olist = pandoc.OrderedList{{para}}-        assert.are_same({{para}}, olist.content)+      test('pandoc.Div is a function', function ()+        assert.are_equal(type(pandoc.Div), 'function')       end),-      test('forgiving constructor', function ()-        local plain = pandoc.Plain 'old'-        local olist = pandoc.OrderedList({plain}, {3, 'Example', 'Period'})-        local listAttribs = pandoc.ListAttributes(3, 'Example', 'Period')-        assert.are_same(olist.listAttributes, listAttribs)+      test('pandoc.Header is a function', function ()+        assert.are_equal(type(pandoc.Header), 'function')       end),-      test('has list attribute aliases', function ()-        local olist = pandoc.OrderedList({}, {4, 'Decimal', 'OneParen'})-        assert.are_equal(olist.start, 4)-        assert.are_equal(olist.style, 'Decimal')-        assert.are_equal(olist.delimiter, 'OneParen')-      end)-                        },-    group 'Para' {-      test('access inline via property `content`', function ()-        local para = pandoc.Para{'Moin, ', pandoc.Space(), 'Sylt!'}-        assert.are_same(-          para.content,-          {pandoc.Str 'Moin, ', pandoc.Space(), pandoc.Str 'Sylt!'}-        )+      test('pandoc.LineBlock is a function', function ()+        assert.are_equal(type(pandoc.LineBlock), 'function')       end),-      test('modifying `content` changes the element', function ()-        local para = pandoc.Para{'Moin, ', pandoc.Space(), pandoc.Str 'Sylt!'}--        para.content[3] = 'Hamburg!'-        assert.are_same(-          para:clone().content,-          {pandoc.Str 'Moin, ', pandoc.Space(), pandoc.Str 'Hamburg!'}-        )--        para.content = 'Huh'-        assert.are_same(-          para:clone().content,-          {pandoc.Str 'Huh'}-        )+      test('pandoc.Null is a function', function ()+        assert.are_equal(type(pandoc.Null), 'function')       end),-    },-    group 'RawBlock' {-      test('access raw content via property `text`', function ()-        local raw = pandoc.RawBlock('markdown', '- one')-        assert.are_equal(type(raw.text), 'string')-        assert.are_equal(raw.text, '- one')--        raw.text = '+ one'-        assert.are_equal(raw, pandoc.RawBlock('markdown', '+ one'))+      test('pandoc.OrderedList is a function', function ()+        assert.are_equal(type(pandoc.OrderedList), 'function')       end),-      test('access Format via property `format`', function ()-        local raw = pandoc.RawBlock('markdown', '* hi')-        assert.are_equal(type(raw.format), 'string')-        assert.are_equal(raw.format, 'markdown')--        raw.format = 'org'-        assert.are_equal(pandoc.RawBlock('org', '* hi'), raw)-      end)-    },-    group 'Table' {-      test('access Attr via property `attr`', function ()-        local caption = {long = {pandoc.Plain 'cap'}}-        local tbl = pandoc.Table(caption, {}, {{}, {}}, {}, {{}, {}},-                                 {'my-tbl', {'a'}})-        assert.are_equal(tbl.attr, pandoc.Attr{'my-tbl', {'a'}})--        tbl.attr = pandoc.Attr{'my-other-tbl', {'b'}}-        assert.are_equal(-          pandoc.Table(caption, {}, {{}, {}}, {}, {{}, {}},-                       {'my-other-tbl', {'b'}}),-          tbl-        )+      test('pandoc.Para is a function', function ()+        assert.are_equal(type(pandoc.Para), 'function')       end),-      test('access caption via property `caption`', function ()-        local caption = {long = {pandoc.Plain 'cap'}}-        local tbl = pandoc.Table(caption, {}, {{}, {}}, {}, {{}, {}})-        assert.are_same(tbl.caption, {long = {pandoc.Plain 'cap'}})--        tbl.caption.short = 'brief'-        tbl.caption.long  = {pandoc.Plain 'extended'}--        local new_caption = {-          short = 'brief',-          long = {pandoc.Plain 'extended'}-        }-        assert.are_equal(-          pandoc.Table(new_caption, {}, {{}, {}}, {}, {{}, {}}),-          tbl-        )+      test('pandoc.Plain is a function', function ()+        assert.are_equal(type(pandoc.Plain), 'function')       end),-      test('access column specifiers via property `colspecs`', function ()-        local colspecs = {{pandoc.AlignCenter, 1}}-        local tbl = pandoc.Table({long = {}}, colspecs, {{}, {}}, {}, {{}, {}})-        assert.are_same(tbl.colspecs, colspecs)--        tbl.colspecs[1][1] = pandoc.AlignRight-        tbl.colspecs[1][2] = nil--        local new_colspecs = {{pandoc.AlignRight}}-        assert.are_equal(-          pandoc.Table({long = {}}, new_colspecs, {{}, {}}, {}, {{}, {}}),-          tbl-        )+      test('pandoc.RawBlock is a function', function ()+        assert.are_equal(type(pandoc.Plain), 'function')       end),-      test('access table head via property `head`', function ()-        local head = {pandoc.Attr{'tbl-head'}, {}}-        local tbl = pandoc.Table({long = {}}, {}, head, {}, {{}, {}})-        assert.are_same(tbl.head, head)--        tbl.head[1] = pandoc.Attr{'table-head'}--        local new_head = {'table-head', {}}-        assert.are_equal(-          pandoc.Table({long = {}}, {}, new_head, {}, {{}, {}}),-          tbl-        )+      test('pandoc.Table is a function', function ()+        assert.are_equal(type(pandoc.Table), 'function')       end),-      test('access table head via property `head`', function ()-        local foot = {{id = 'tbl-foot'}, {}}-        local tbl = pandoc.Table({long = {}}, {}, {{}, {}}, {}, foot)-        assert.are_same(tbl.foot, {pandoc.Attr('tbl-foot'), {}})--        tbl.foot[1] = pandoc.Attr{'table-foot'}--        local new_foot = {'table-foot', {}}-        assert.are_equal(-          pandoc.Table({long = {}}, {}, {{}, {}}, {}, new_foot),-          tbl-        )-      end)-    },+    }   },   group 'MetaValue elements' {     test('MetaList elements behave like lists', function ()@@ -721,95 +139,32 @@       assert.are_equal(type(metalist.insert), 'function')       assert.are_equal(type(metalist.remove), 'function')     end),-    test('MetaList, MetaMap, MetaInlines, MetaBlocks have `t` tag', function ()-      assert.are_equal((pandoc.MetaList{}).t, 'MetaList')-      assert.are_equal((pandoc.MetaMap{}).t, 'MetaMap')-      assert.are_equal((pandoc.MetaInlines{}).t, 'MetaInlines')-      assert.are_equal((pandoc.MetaBlocks{}).t, 'MetaBlocks')-    end),     test('`tag` is an alias for `t``', function ()       assert.are_equal((pandoc.MetaList{}).tag, (pandoc.MetaList{}).t)       assert.are_equal((pandoc.MetaMap{}).tag, (pandoc.MetaMap{}).t)       assert.are_equal((pandoc.MetaInlines{}).tag, (pandoc.MetaInlines{}).t)       assert.are_equal((pandoc.MetaBlocks{}).tag, (pandoc.MetaBlocks{}).t)-    end)+    end),   },+  group 'Meta' {+    test('inline list is treated as MetaInlines', function ()+      local meta = pandoc.Pandoc({}, {test = {pandoc.Emph 'check'}}).meta+      assert.are_same(meta.test, {pandoc.Emph{pandoc.Str 'check'}})+    end),+    test('inline element is treated as MetaInlines singleton', function ()+      local meta = pandoc.Pandoc({}, {test = pandoc.Emph 'check'}).meta+      assert.are_same(meta.test, {pandoc.Emph{pandoc.Str 'check'}})+    end),+    test('block list is treated as MetaBlocks', function ()+      local meta = pandoc.Pandoc({}, {test = {pandoc.Plain 'check'}}).meta+      assert.are_same(meta.test, {pandoc.Plain{pandoc.Str 'check'}})+    end),+    test('block element is treated as MetaBlocks singleton', function ()+      local meta = pandoc.Pandoc({}, {test = pandoc.Plain 'check'}).meta+      assert.are_same(meta.test, {pandoc.Plain{pandoc.Str 'check'}})+    end),+  },   group 'Other types' {-    group 'Citation' {-      test('checks equality by comparing Haskell values', function()-        assert.are_equal(-          pandoc.Citation('a', pandoc.NormalCitation),-          pandoc.Citation('a', pandoc.NormalCitation)-        )-        assert.is_falsy(-          pandoc.Citation('a', pandoc.NormalCitation) ==-          pandoc.Citation('a', pandoc.AuthorInText)-        )-        assert.is_falsy(-          pandoc.Citation('a', pandoc.NormalCitation) ==-          pandoc.Citation('b', pandoc.NormalCitation)-        )-      end),-    },-    group 'SimpleTable' {-      test('can access properties', function ()-        local spc = pandoc.Space()-        local caption = {pandoc.Str 'Languages', spc, pandoc.Str 'overview.'}-        local aligns = {pandoc.AlignDefault, pandoc.AlignDefault}-        local widths = {0, 0} -- let pandoc determine col widths-        local headers = {{pandoc.Plain({pandoc.Str "Language"})},-          {pandoc.Plain({pandoc.Str "Typing"})}}-        local rows = {-          {{pandoc.Plain "Haskell"}, {pandoc.Plain "static"}},-          {{pandoc.Plain "Lua"}, {pandoc.Plain "Dynamic"}},-        }-        local simple_table = pandoc.SimpleTable(-          caption,-          aligns,-          widths,-          headers,-          rows-        )-        assert.are_same(simple_table.caption, caption)-        assert.are_same(simple_table.aligns, aligns)-        assert.are_same(simple_table.widths, widths)-        assert.are_same(simple_table.headers, headers)-        assert.are_same(simple_table.rows, rows)-      end),-      test('can modify properties', function ()-        local new_table = pandoc.SimpleTable(-          {'Languages'},-          {pandoc.AlignDefault, pandoc.AlignDefault},-          {0.5, 0.5},-          {{pandoc.Plain({pandoc.Str "Language"})},-           {pandoc.Plain({pandoc.Str "Typing"})}},-          {-            {{pandoc.Plain "Haskell"}, {pandoc.Plain "static"}},-            {{pandoc.Plain "Lua"}, {pandoc.Plain "Dynamic"}},-          }-        )--        new_table.caption = {pandoc.Str 'Good', pandoc.Space(),-                             pandoc.Str 'languages'}-        new_table.aligns[1] = pandoc.AlignLeft-        new_table.widths = {0, 0}-        new_table.headers[2] = {pandoc.Plain{pandoc.Str 'compiled/interpreted'}}-        new_table.rows[1][2] = {pandoc.Plain{pandoc.Str 'both'}}-        new_table.rows[2][2] = {pandoc.Plain{pandoc.Str 'interpreted'}}--        local expected_table = pandoc.SimpleTable(-          {pandoc.Str 'Good', pandoc.Space(), pandoc.Str 'languages'},-          {pandoc.AlignLeft, pandoc.AlignDefault},-          {0, 0},-          {{pandoc.Plain 'Language'}, {pandoc.Plain 'compiled/interpreted'}},-          {-            {{pandoc.Plain 'Haskell'}, {pandoc.Plain 'both'}},-            {{pandoc.Plain 'Lua'}, {pandoc.Plain 'interpreted'}}-          }-        )-        assert.are_same(expected_table, new_table)-      end)-    },     group 'ReaderOptions' {       test('returns a userdata value', function ()         local opts = pandoc.ReaderOptions {}@@ -924,6 +279,14 @@         pandoc.read(indented_code, 'markdown', {indented_code_classes={'foo'}})       )     end),+    test('can read epub', function ()+      local epub = io.open('lua/module/tiny.epub', 'rb')+      local blocks = pandoc.read(epub:read'a', 'epub').blocks+      assert.are_equal(+        blocks[#blocks],+        pandoc.Para { pandoc.Emph 'EPUB' }+      )+    end),     test('failing read', function ()       assert.error_matches(         function () pandoc.read('foo', 'nosuchreader') end,@@ -968,5 +331,26 @@       )       assert.are_equal('1234', table.concat(acc))     end)+  },++  group 'Marshal' {+    group 'Inlines' {+      test('Strings are broken into words', function ()+        assert.are_equal(+          pandoc.Emph 'Nice, init?',+          pandoc.Emph{pandoc.Str 'Nice,', pandoc.Space(), pandoc.Str 'init?'}+        )+      end)+    },+    group 'Blocks' {+      test('Strings are broken into words and wrapped in Plain', function ()+        assert.are_equal(+          pandoc.Div{+            pandoc.Plain{pandoc.Str 'Nice,', pandoc.Space(), pandoc.Str 'init?'}+          },+          pandoc.Div{'Nice, init?'}+        )+      end)+    }   } }
+ test/lua/module/partial.test view
+ test/lua/module/tiny.epub view

binary file changed (absent → 3097 bytes)

+ test/odt/native/orderedListHeader.native view
@@ -0,0 +1,80 @@+[ OrderedList+    ( 1 , Decimal , Period )+    [ [ Plain+          [ Str "A"+          , Space+          , Str "list"+          , Space+          , Str "item"+          , Space+          , Str "(list-header)"+          ]+      ]+    , [ Plain [ Str "A" , Space , Str "second" ] ]+    , [ Para [ Str "A" , Space , Str "third" ]+      , OrderedList+          ( 1 , Decimal , Period )+          [ [ Para+                [ Str "New"+                , Space+                , Str "level!"+                , Space+                , Str "(list-header)"+                ]+            , OrderedList+                ( 1 , Decimal , Period )+                [ [ Plain+                      [ Str "And"+                      , Space+                      , Str "another!"+                      , Space+                      , Str "(list-header)"+                      ]+                  ]+                , [ Plain+                      [ Str "It's"+                      , Space+                      , Str "great"+                      , Space+                      , Str "up"+                      , Space+                      , Str "here!"+                      ]+                  ]+                ]+            ]+          , [ Plain [ Str "Oh" , Space , Str "noes" ] ]+          , [ Plain [ Str "We" , Space , Str "fell!" ] ]+          ]+      ]+    , [ Plain [ Str "Maybe" , Space , Str "someone" ] ]+    , [ Plain [ Str "Pushed" , Space , Str "us?" ] ]+    ]+, Para []+, OrderedList+    ( 4 , Decimal , Period )+    [ [ Plain+          [ Str "Start"+          , Space+          , Str "new"+          , Space+          , Str "list,"+          , Space+          , Str "but"+          , Space+          , Str "a"+          , Space+          , Str "different"+          , Space+          , Str "starting"+          , Space+          , Str "point."+          , Space+          , Str "(list-header)"+          ]+      ]+    , [ Plain+          [ Str "Because" , Space , Str "we" , Space , Str "can." ]+      ]+    ]+]
+ test/odt/native/unorderedListHeader.native view
@@ -0,0 +1,50 @@+[ BulletList+    [ [ Plain+          [ Str "A"+          , Space+          , Str "list"+          , Space+          , Str "item"+          , Space+          , Str "(list-header)"+          ]+      ]+    , [ Plain [ Str "A" , Space , Str "second" ] ]+    , [ Para [ Str "A" , Space , Str "third" ]+      , BulletList+          [ [ Para+                [ Str "New"+                , Space+                , Str "level!"+                , Space+                , Str "(list-header)"+                ]+            , BulletList+                [ [ Plain+                      [ Str "And"+                      , Space+                      , Str "another!"+                      , Space+                      , Str "(list-header)"+                      ]+                  ]+                , [ Plain+                      [ Str "It's"+                      , Space+                      , Str "great"+                      , Space+                      , Str "up"+                      , Space+                      , Str "here!"+                      ]+                  ]+                ]+            ]+          , [ Plain [ Str "Oh" , Space , Str "noes" ] ]+          , [ Plain [ Str "We" , Space , Str "fell!" ] ]+          ]+      ]+    , [ Plain [ Str "Maybe" , Space , Str "someone" ] ]+    , [ Plain [ Str "Pushed" , Space , Str "us?" ] ]+    ]+]
+ test/odt/odt/orderedListHeader.odt view

binary file changed (absent → 11565 bytes)

+ test/odt/odt/unorderedListHeader.odt view

binary file changed (absent → 9920 bytes)

test/pptx/background-image/output.pptx view

binary file changed (53318 → 53335 bytes)

test/pptx/background-image/templated.pptx view

binary file changed (66433 → 66426 bytes)

test/pptx/blanks/just-speaker-notes/output.pptx view

binary file changed (32227 → 32231 bytes)

test/pptx/blanks/just-speaker-notes/templated.pptx view

binary file changed (45333 → 45326 bytes)

test/pptx/blanks/nbsp-in-body/output.pptx view

binary file changed (29165 → 29175 bytes)

test/pptx/blanks/nbsp-in-heading/output.pptx view

binary file changed (29165 → 29175 bytes)

test/pptx/code-custom/output.pptx view

binary file changed (29776 → 29786 bytes)

test/pptx/code/output.pptx view

binary file changed (29773 → 29783 bytes)

test/pptx/comparison/both-columns/output.pptx view

binary file changed (44530 → 44543 bytes)

test/pptx/comparison/extra-image/output.pptx view

binary file changed (44559 → 44571 bytes)

test/pptx/comparison/extra-text/output.pptx view

binary file changed (44530 → 44543 bytes)

test/pptx/comparison/non-text-first/output.pptx view

binary file changed (44444 → 44458 bytes)

test/pptx/comparison/one-column/output.pptx view

binary file changed (27862 → 27872 bytes)

test/pptx/content-with-caption/heading-text-image/output.pptx view

binary file changed (44278 → 44300 bytes)

test/pptx/content-with-caption/image-text/output.pptx view

binary file changed (44979 → 44989 bytes)

test/pptx/content-with-caption/text-image/output.pptx view

binary file changed (44218 → 44241 bytes)

test/pptx/document-properties-short-desc/output.pptx view

binary file changed (28573 → 28585 bytes)

test/pptx/document-properties/output.pptx view

binary file changed (28976 → 28988 bytes)

test/pptx/endnotes-toc/output.pptx view

binary file changed (29363 → 29373 bytes)

test/pptx/endnotes/output.pptx view

binary file changed (28544 → 28554 bytes)

test/pptx/images/output.pptx view

binary file changed (46195 → 46208 bytes)

test/pptx/incremental-lists/with-flag/output.pptx view

binary file changed (77125 → 77152 bytes)

test/pptx/incremental-lists/without-flag/output.pptx view

binary file changed (75374 → 75402 bytes)

test/pptx/inline-formatting/output.pptx view

binary file changed (27736 → 27746 bytes)

test/pptx/layouts/deleted.pptx view

binary file changed (55694 → 55691 bytes)

test/pptx/layouts/moved.pptx view

binary file changed (66430 → 66426 bytes)

test/pptx/list-level/output.pptx view

binary file changed (28632 → 28643 bytes)

test/pptx/lists/output.pptx view

binary file changed (28639 → 28649 bytes)

test/pptx/raw-ooxml/output.pptx view

binary file changed (28524 → 28534 bytes)

test/pptx/remove-empty-slides/output.pptx view

binary file changed (44958 → 44968 bytes)

test/pptx/slide-breaks-slide-level-1/output.pptx view

binary file changed (29314 → 29324 bytes)

test/pptx/slide-breaks-toc/output.pptx view

binary file changed (31087 → 31097 bytes)

test/pptx/slide-breaks/output.pptx view

binary file changed (30139 → 30149 bytes)

test/pptx/slide-level-0/h1-h2-with-table/output.pptx view

binary file changed (27871 → 27885 bytes)

test/pptx/slide-level-0/h1-with-image/output.pptx view

binary file changed (44202 → 44212 bytes)

test/pptx/slide-level-0/h1-with-table/output.pptx view

binary file changed (27778 → 27790 bytes)

test/pptx/slide-level-0/h2-with-image/output.pptx view

binary file changed (44202 → 44212 bytes)

test/pptx/speaker-notes-after-metadata/output.pptx view

binary file changed (31577 → 31580 bytes)

test/pptx/speaker-notes-after-metadata/templated.pptx view

binary file changed (44673 → 44666 bytes)

test/pptx/speaker-notes-afterheader/output.pptx view

binary file changed (30589 → 30593 bytes)

test/pptx/speaker-notes-afterheader/templated.pptx view

binary file changed (43693 → 43687 bytes)

test/pptx/speaker-notes-afterseps/output.pptx view

binary file changed (51450 → 51455 bytes)

test/pptx/speaker-notes-afterseps/templated.pptx view

binary file changed (64552 → 64548 bytes)

test/pptx/speaker-notes/output.pptx view

binary file changed (35289 → 35293 bytes)

test/pptx/speaker-notes/templated.pptx view

binary file changed (48392 → 48386 bytes)

test/pptx/start-numbering-at/output.pptx view

binary file changed (28605 → 28616 bytes)

test/pptx/tables/output.pptx view

binary file changed (29122 → 29134 bytes)

test/pptx/two-column/all-text/output.pptx view

binary file changed (27649 → 27659 bytes)

test/pptx/two-column/text-and-image/output.pptx view

binary file changed (45470 → 45489 bytes)

test/s5-basic.html view
@@ -56,7 +56,8 @@ <div id="math" class="slide section level1"> <h1>Math</h1> <ul>-<li><span class="math inline">$\frac{d}{dx}f(x)=\lim_{h\to 0}\frac{f(x+h)-f(x)}{h}$</span></li>+<li><span class="math inline">$\frac{d}{dx}f(x)=\lim_{h\to+0}\frac{f(x+h)-f(x)}{h}$</span></li> </ul> </div> </div>
test/s5-fancy.html view
@@ -28,7 +28,9 @@   <link rel="stylesheet" href="s5/default/opera.css" type="text/css" media="projection" id="operaFix" />   <!-- S5 JS -->   <script src="s5/default/slides.js" type="text/javascript"></script>-  <script src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml-full.js" type="text/javascript"></script>+  <script+  src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml-full.js"+  type="text/javascript"></script> </head> <body> <div class="layout">@@ -56,7 +58,8 @@ <div id="math" class="slide section level1"> <h1>Math</h1> <ul class="incremental">-<li><span class="math inline">\(\frac{d}{dx}f(x)=\lim_{h\to 0}\frac{f(x+h)-f(x)}{h}\)</span></li>+<li><span class="math inline">\(\frac{d}{dx}f(x)=\lim_{h\to+0}\frac{f(x+h)-f(x)}{h}\)</span></li> </ul> </div> </div>
test/s5-fragment.html view
@@ -5,5 +5,6 @@ </ul> <h1 id="math">Math</h1> <ul>-<li><span class="math inline">$\frac{d}{dx}f(x)=\lim_{h\to 0}\frac{f(x+h)-f(x)}{h}$</span></li>+<li><span class="math inline">$\frac{d}{dx}f(x)=\lim_{h\to+0}\frac{f(x+h)-f(x)}{h}$</span></li> </ul>
test/s5-inserts.html view
@@ -35,7 +35,8 @@ </ul> <h1 id="math">Math</h1> <ul>-<li><span class="math inline">$\frac{d}{dx}f(x)=\lim_{h\to 0}\frac{f(x+h)-f(x)}{h}$</span></li>+<li><span class="math inline">$\frac{d}{dx}f(x)=\lim_{h\to+0}\frac{f(x+h)-f(x)}{h}$</span></li> </ul> STUFF INSERTED </body>
test/tables.html5 view
@@ -121,7 +121,8 @@ <td style="text-align: center;">Second</td> <td style="text-align: left;">row</td> <td style="text-align: right;">5.0</td>-<td style="text-align: left;">Here’s another one. Note the blank line between rows.</td>+<td style="text-align: left;">Here’s another one. Note the blank line between+rows.</td> </tr> </tbody> </table>@@ -152,7 +153,8 @@ <td style="text-align: center;">Second</td> <td style="text-align: left;">row</td> <td style="text-align: right;">5.0</td>-<td style="text-align: left;">Here’s another one. Note the blank line between rows.</td>+<td style="text-align: left;">Here’s another one. Note the blank line between+rows.</td> </tr> </tbody> </table>
+ test/tables.markua view
@@ -0,0 +1,58 @@+Simple table with caption:++| Right | Left | Center | Default |+|------:|:-----|:------:|---------|+|    12 | 12   |   12   | 12      |+|   123 | 123  |  123   | 123     |+|     1 | 1    |   1    | 1       |++Demonstration of simple table syntax.++Simple table without caption:++| Right | Left | Center | Default |+|------:|:-----|:------:|---------|+|    12 | 12   |   12   | 12      |+|   123 | 123  |  123   | 123     |+|     1 | 1    |   1    | 1       |++Simple table indented two spaces:++| Right | Left | Center | Default |+|------:|:-----|:------:|---------|+|    12 | 12   |   12   | 12      |+|   123 | 123  |  123   | 123     |+|     1 | 1    |   1    | 1       |++Demonstration of simple table syntax.++Multiline table with caption:++| Centered Header | Left Aligned | Right Aligned | Default aligned                                       |+|:---------------:|:-------------|--------------:|:------------------------------------------------------|+|      First      | row          |          12.0 | Example of a row that spans multiple lines.           |+|     Second      | row          |           5.0 | Here’s another one. Note the blank line between rows. |++Here’s the caption. It may span multiple lines.++Multiline table without caption:++| Centered Header | Left Aligned | Right Aligned | Default aligned                                       |+|:---------------:|:-------------|--------------:|:------------------------------------------------------|+|      First      | row          |          12.0 | Example of a row that spans multiple lines.           |+|     Second      | row          |           5.0 | Here’s another one. Note the blank line between rows. |++Table without column headers:++|     |     |     |     |+|----:|:----|:---:|----:|+|  12 | 12  | 12  |  12 |+| 123 | 123 | 123 | 123 |+|   1 | 1   |  1  |   1 |++Multiline table without column headers:++|        |     |      |                                                       |+|:------:|:----|-----:|-------------------------------------------------------|+| First  | row | 12.0 | Example of a row that spans multiple lines.           |+| Second | row |  5.0 | Here’s another one. Note the blank line between rows. |
test/test-pandoc.hs view
@@ -50,6 +50,7 @@ import qualified Tests.Writers.RST import qualified Tests.Writers.AnnotatedTable import qualified Tests.Writers.TEI+import qualified Tests.Writers.Markua import Text.Pandoc.Shared (inDirectory)  tests :: FilePath -> TestTree@@ -72,6 +73,7 @@           , testGroup "Docx" Tests.Writers.Docx.tests           , testGroup "RST" Tests.Writers.RST.tests           , testGroup "TEI" Tests.Writers.TEI.tests+          , testGroup "markua" Tests.Writers.Markua.tests           , testGroup "Muse" Tests.Writers.Muse.tests           , testGroup "FB2" Tests.Writers.FB2.tests           , testGroup "PowerPoint" Tests.Writers.Powerpoint.tests
test/writer.context view
@@ -9,7 +9,7 @@  % make chapter, section bookmarks visible when opening document \placebookmarks[chapter, section, subsection, subsubsection, subsubsubsection, subsubsubsubsection][chapter, section]-\setupinteractionscreen[option=bookmark]+\setupinteractionscreen[option={bookmark,title}]  \setuppagenumbering[location={footer,middle}] \setupbackend[export=yes]
test/writer.haddock view
@@ -206,7 +206,6 @@     -   Fee     -   Fie     -   Foe- 3.  Third  Same thing but with paragraphs:
test/writer.html4 view
@@ -156,10 +156,12 @@ <h2 class="author">Anonymous</h2> <h3 class="date">July 17, 2006</h3> </div>-<p>This is a set of tests for pandoc. Most of them are adapted from John Gruber’s markdown test suite.</p>+<p>This is a set of tests for pandoc. Most of them are adapted from John+Gruber’s markdown test suite.</p> <hr /> <h1 id="headers">Headers</h1>-<h2 id="level-2-with-an-embedded-link">Level 2 with an <a href="/url">embedded link</a></h2>+<h2 id="level-2-with-an-embedded-link">Level 2 with an <a href="/url">embedded+link</a></h2> <h3 id="level-3-with-emphasis">Level 3 with <em>emphasis</em></h3> <h4 id="level-4">Level 4</h4> <h5 id="level-5">Level 5</h5>@@ -172,7 +174,9 @@ <hr /> <h1 id="paragraphs">Paragraphs</h1> <p>Here’s a regular paragraph.</p>-<p>In Markdown 1.0.0 and earlier. Version 8. This line turns into a list item. Because a hard-wrapped line in the middle of a paragraph looked like a list item.</p>+<p>In Markdown 1.0.0 and earlier. Version 8. This line turns into a list item.+Because a hard-wrapped line in the middle of a paragraph looked like a list+item.</p> <p>Here’s one with a bullet. * criminey.</p> <p>There should be a hard line break<br /> here.</p>@@ -283,7 +287,8 @@ <p>Multiple paragraphs:</p> <ol style="list-style-type: decimal"> <li><p>Item 1, graf one.</p>-<p>Item 1. graf two. The quick brown fox jumped over the lazy dog’s back.</p></li>+<p>Item 1. graf two. The quick brown fox jumped over the lazy dog’s+back.</p></li> <li><p>Item 2.</p></li> <li><p>Item 3.</p></li> </ol>@@ -371,47 +376,58 @@ <p>Tight using spaces:</p> <dl> <dt>apple</dt>-<dd>red fruit+<dd>+red fruit </dd> <dt>orange</dt>-<dd>orange fruit+<dd>+orange fruit </dd> <dt>banana</dt>-<dd>yellow fruit+<dd>+yellow fruit </dd> </dl> <p>Tight using tabs:</p> <dl> <dt>apple</dt>-<dd>red fruit+<dd>+red fruit </dd> <dt>orange</dt>-<dd>orange fruit+<dd>+orange fruit </dd> <dt>banana</dt>-<dd>yellow fruit+<dd>+yellow fruit </dd> </dl> <p>Loose:</p> <dl> <dt>apple</dt>-<dd><p>red fruit</p>+<dd>+<p>red fruit</p> </dd> <dt>orange</dt>-<dd><p>orange fruit</p>+<dd>+<p>orange fruit</p> </dd> <dt>banana</dt>-<dd><p>yellow fruit</p>+<dd>+<p>yellow fruit</p> </dd> </dl> <p>Multiple blocks with italics:</p> <dl> <dt><em>apple</em></dt>-<dd><p>red fruit</p>+<dd>+<p>red fruit</p> <p>contains seeds, crisp, pleasant to taste</p> </dd> <dt><em>orange</em></dt>-<dd><p>orange fruit</p>+<dd>+<p>orange fruit</p> <pre><code>{ orange code block }</code></pre> <blockquote> <p>orange block quote</p>@@ -421,38 +437,49 @@ <p>Multiple definitions, tight:</p> <dl> <dt>apple</dt>-<dd>red fruit+<dd>+red fruit </dd>-<dd>computer+<dd>+computer </dd> <dt>orange</dt>-<dd>orange fruit+<dd>+orange fruit </dd>-<dd>bank+<dd>+bank </dd> </dl> <p>Multiple definitions, loose:</p> <dl> <dt>apple</dt>-<dd><p>red fruit</p>+<dd>+<p>red fruit</p> </dd>-<dd><p>computer</p>+<dd>+<p>computer</p> </dd> <dt>orange</dt>-<dd><p>orange fruit</p>+<dd>+<p>orange fruit</p> </dd>-<dd><p>bank</p>+<dd>+<p>bank</p> </dd> </dl> <p>Blank line after term, indented marker, alternate markers:</p> <dl> <dt>apple</dt>-<dd><p>red fruit</p>+<dd>+<p>red fruit</p> </dd>-<dd><p>computer</p>+<dd>+<p>computer</p> </dd> <dt>orange</dt>-<dd><p>orange fruit</p>+<dd>+<p>orange fruit</p> <ol style="list-style-type: decimal"> <li>sublist</li> <li>sublist</li>@@ -540,18 +567,22 @@ <p>So is <strong><em>this</em></strong> word.</p> <p><strong><em>This is strong and em.</em></strong></p> <p>So is <strong><em>this</em></strong> word.</p>-<p>This is code: <code>&gt;</code>, <code>$</code>, <code>\</code>, <code>\$</code>, <code>&lt;html&gt;</code>.</p>+<p>This is code: <code>&gt;</code>, <code>$</code>, <code>\</code>,+<code>\$</code>, <code>&lt;html&gt;</code>.</p> <p><del>This is <em>strikeout</em>.</del></p>-<p>Superscripts: a<sup>bc</sup>d a<sup><em>hello</em></sup> a<sup>hello there</sup>.</p>+<p>Superscripts: a<sup>bc</sup>d a<sup><em>hello</em></sup>+a<sup>hello there</sup>.</p> <p>Subscripts: H<sub>2</sub>O, H<sub>23</sub>O, H<sub>many of them</sub>O.</p>-<p>These should not be superscripts or subscripts, because of the unescaped spaces: a^b c^d, a~b c~d.</p>+<p>These should not be superscripts or subscripts, because of the unescaped+spaces: a^b c^d, a~b c~d.</p> <hr /> <h1 id="smart-quotes-ellipses-dashes">Smart quotes, ellipses, dashes</h1> <p>“Hello,” said the spider. “‘Shelob’ is my name.”</p> <p>‘A’, ‘B’, and ‘C’ are letters.</p> <p>‘Oak,’ ‘elm,’ and ‘beech’ are names of trees. So is ‘pine.’</p> <p>‘He said, “I want to go.”’ Were you alive in the 70’s?</p>-<p>Here is some quoted ‘<code>code</code>’ and a “<a href="http://example.com/?foo=1&amp;bar=2">quoted link</a>”.</p>+<p>Here is some quoted ‘<code>code</code>’ and a “<a+href="http://example.com/?foo=1&amp;bar=2">quoted link</a>”.</p> <p>Some dashes: one—two — three—four — five.</p> <p>Dashes between numbers: 5–7, 255–66, 1987–1999.</p> <p>Ellipses…and…and….</p>@@ -564,13 +595,17 @@ <li><span class="math inline"><em>α</em> ∧ <em>ω</em></span></li> <li><span class="math inline">223</span></li> <li><span class="math inline"><em>p</em></span>-Tree</li>-<li>Here’s some display math: <span class="math display">$$\frac{d}{dx}f(x)=\lim_{h\to 0}\frac{f(x+h)-f(x)}{h}$$</span></li>-<li>Here’s one that has a line break in it: <span class="math inline"><em>α</em> + <em>ω</em> × <em>x</em><sup>2</sup></span>.</li>+<li>Here’s some display math: <span+class="math display">$$\frac{d}{dx}f(x)=\lim_{h\to+0}\frac{f(x+h)-f(x)}{h}$$</span></li>+<li>Here’s one that has a line break in it: <span+class="math inline"><em>α</em> + <em>ω</em> × <em>x</em><sup>2</sup></span>.</li> </ul> <p>These shouldn’t be math:</p> <ul> <li>To get the famous equation, write <code>$e = mc^2$</code>.</li>-<li>$22,000 is a <em>lot</em> of money. So is $34,000. (It worked if “lot” is emphasized.)</li>+<li>$22,000 is a <em>lot</em> of money. So is $34,000. (It worked if “lot” is+emphasized.)</li> <li>Shoes ($20) and socks ($5).</li> <li>Escaped <code>$</code>: $73 <em>this should be emphasized</em> 23$.</li> </ul>@@ -613,7 +648,8 @@ <p><a href="/url/" title="title">URL and title</a>.</p> <p><a href="/url/" title="title preceded by two spaces">URL and title</a>.</p> <p><a href="/url/" title="title preceded by a tab">URL and title</a>.</p>-<p><a href="/url/" title="title with &quot;quotes&quot; in it">URL and title</a></p>+<p><a href="/url/" title="title with &quot;quotes&quot; in it">URL and+title</a></p> <p><a href="/url/" title="title with single quotes">URL and title</a></p> <p><a href="/url/with_underscore">with_underscore</a></p> <p><a href="mailto:nobody@nowhere.net">Email link</a></p>@@ -630,22 +666,29 @@ <p>Foo <a href="/url/" title="Title with &quot;quotes&quot; inside">bar</a>.</p> <p>Foo <a href="/url/" title="Title with &quot;quote&quot; inside">biz</a>.</p> <h2 id="with-ampersands">With ampersands</h2>-<p>Here’s a <a href="http://example.com/?foo=1&amp;bar=2">link with an ampersand in the URL</a>.</p>-<p>Here’s a link with an amersand in the link text: <a href="http://att.com/" title="AT&amp;T">AT&amp;T</a>.</p>+<p>Here’s a <a href="http://example.com/?foo=1&amp;bar=2">link with an ampersand+in the URL</a>.</p>+<p>Here’s a link with an amersand in the link text: <a href="http://att.com/"+title="AT&amp;T">AT&amp;T</a>.</p> <p>Here’s an <a href="/script?foo=1&amp;bar=2">inline link</a>.</p>-<p>Here’s an <a href="/script?foo=1&amp;bar=2">inline link in pointy braces</a>.</p>+<p>Here’s an <a href="/script?foo=1&amp;bar=2">inline link in pointy+braces</a>.</p> <h2 id="autolinks">Autolinks</h2>-<p>With an ampersand: <a href="http://example.com/?foo=1&amp;bar=2" class="uri">http://example.com/?foo=1&amp;bar=2</a></p>+<p>With an ampersand: <a href="http://example.com/?foo=1&amp;bar=2"+class="uri">http://example.com/?foo=1&amp;bar=2</a></p> <ul> <li>In a list?</li> <li><a href="http://example.com/" class="uri">http://example.com/</a></li> <li>It should.</li> </ul>-<p>An e-mail address: <a href="mailto:nobody@nowhere.net" class="email">nobody@nowhere.net</a></p>+<p>An e-mail address: <a href="mailto:nobody@nowhere.net"+class="email">nobody@nowhere.net</a></p> <blockquote>-<p>Blockquoted: <a href="http://example.com/" class="uri">http://example.com/</a></p>+<p>Blockquoted: <a href="http://example.com/"+class="uri">http://example.com/</a></p> </blockquote>-<p>Auto-links should not occur here: <code>&lt;http://example.com/&gt;</code></p>+<p>Auto-links should not occur here:+<code>&lt;http://example.com/&gt;</code></p> <pre><code>or here: &lt;http://example.com/&gt;</code></pre> <hr /> <h1 id="images">Images</h1>@@ -657,23 +700,36 @@ <p>Here is a movie <img src="movie.jpg" alt="movie" /> icon.</p> <hr /> <h1 id="footnotes">Footnotes</h1>-<p>Here is a footnote reference,<a href="#fn1" class="footnote-ref" id="fnref1"><sup>1</sup></a> and another.<a href="#fn2" class="footnote-ref" id="fnref2"><sup>2</sup></a> This should <em>not</em> be a footnote reference, because it contains a space.[^my note] Here is an inline note.<a href="#fn3" class="footnote-ref" id="fnref3"><sup>3</sup></a></p>+<p>Here is a footnote reference,<a href="#fn1" class="footnote-ref"+id="fnref1"><sup>1</sup></a> and another.<a href="#fn2" class="footnote-ref"+id="fnref2"><sup>2</sup></a> This should <em>not</em> be a footnote reference,+because it contains a space.[^my note] Here is an inline note.<a href="#fn3"+class="footnote-ref" id="fnref3"><sup>3</sup></a></p> <blockquote>-<p>Notes can go in quotes.<a href="#fn4" class="footnote-ref" id="fnref4"><sup>4</sup></a></p>+<p>Notes can go in quotes.<a href="#fn4" class="footnote-ref"+id="fnref4"><sup>4</sup></a></p> </blockquote> <ol style="list-style-type: decimal">-<li>And in list items.<a href="#fn5" class="footnote-ref" id="fnref5"><sup>5</sup></a></li>+<li>And in list items.<a href="#fn5" class="footnote-ref"+id="fnref5"><sup>5</sup></a></li> </ol> <p>This paragraph should not be part of the note, as it is not indented.</p> <div class="footnotes footnotes-end-of-document"> <hr /> <ol>-<li id="fn1"><p>Here is the footnote. It can go anywhere after the footnote reference. It need not be placed at the end of the document.<a href="#fnref1" class="footnote-back">↩︎</a></p></li>+<li id="fn1"><p>Here is the footnote. It can go anywhere after the footnote+reference. It need not be placed at the end of the document.<a href="#fnref1"+class="footnote-back">↩︎</a></p></li> <li id="fn2"><p>Here’s the long note. This one contains multiple blocks.</p>-<p>Subsequent blocks are indented to show that they belong to the footnote (as with list items).</p>+<p>Subsequent blocks are indented to show that they belong to the footnote (as+with list items).</p> <pre><code>  { &lt;code&gt; }</code></pre>-<p>If you want, you can indent every line, but you can also be lazy and just indent the first line of each block.<a href="#fnref2" class="footnote-back">↩︎</a></p></li>-<li id="fn3"><p>This is <em>easier</em> to type. Inline notes may contain <a href="http://google.com">links</a> and <code>]</code> verbatim characters, as well as [bracketed text].<a href="#fnref3" class="footnote-back">↩︎</a></p></li>+<p>If you want, you can indent every line, but you can also be lazy and just+indent the first line of each block.<a href="#fnref2"+class="footnote-back">↩︎</a></p></li>+<li id="fn3"><p>This is <em>easier</em> to type. Inline notes may contain <a+href="http://google.com">links</a> and <code>]</code> verbatim characters, as+well as [bracketed text].<a href="#fnref3" class="footnote-back">↩︎</a></p></li> <li id="fn4"><p>In quote.<a href="#fnref4" class="footnote-back">↩︎</a></p></li> <li id="fn5"><p>In list.<a href="#fnref5" class="footnote-back">↩︎</a></p></li> </ol>
test/writer.html5 view
@@ -159,10 +159,12 @@ <p class="author">Anonymous</p> <p class="date">July 17, 2006</p> </header>-<p>This is a set of tests for pandoc. Most of them are adapted from John Gruber’s markdown test suite.</p>+<p>This is a set of tests for pandoc. Most of them are adapted from John+Gruber’s markdown test suite.</p> <hr /> <h1 id="headers">Headers</h1>-<h2 id="level-2-with-an-embedded-link">Level 2 with an <a href="/url">embedded link</a></h2>+<h2 id="level-2-with-an-embedded-link">Level 2 with an <a href="/url">embedded+link</a></h2> <h3 id="level-3-with-emphasis">Level 3 with <em>emphasis</em></h3> <h4 id="level-4">Level 4</h4> <h5 id="level-5">Level 5</h5>@@ -175,7 +177,9 @@ <hr /> <h1 id="paragraphs">Paragraphs</h1> <p>Here’s a regular paragraph.</p>-<p>In Markdown 1.0.0 and earlier. Version 8. This line turns into a list item. Because a hard-wrapped line in the middle of a paragraph looked like a list item.</p>+<p>In Markdown 1.0.0 and earlier. Version 8. This line turns into a list item.+Because a hard-wrapped line in the middle of a paragraph looked like a list+item.</p> <p>Here’s one with a bullet. * criminey.</p> <p>There should be a hard line break<br /> here.</p>@@ -286,7 +290,8 @@ <p>Multiple paragraphs:</p> <ol type="1"> <li><p>Item 1, graf one.</p>-<p>Item 1. graf two. The quick brown fox jumped over the lazy dog’s back.</p></li>+<p>Item 1. graf two. The quick brown fox jumped over the lazy dog’s+back.</p></li> <li><p>Item 2.</p></li> <li><p>Item 3.</p></li> </ol>@@ -374,47 +379,58 @@ <p>Tight using spaces:</p> <dl> <dt>apple</dt>-<dd>red fruit+<dd>+red fruit </dd> <dt>orange</dt>-<dd>orange fruit+<dd>+orange fruit </dd> <dt>banana</dt>-<dd>yellow fruit+<dd>+yellow fruit </dd> </dl> <p>Tight using tabs:</p> <dl> <dt>apple</dt>-<dd>red fruit+<dd>+red fruit </dd> <dt>orange</dt>-<dd>orange fruit+<dd>+orange fruit </dd> <dt>banana</dt>-<dd>yellow fruit+<dd>+yellow fruit </dd> </dl> <p>Loose:</p> <dl> <dt>apple</dt>-<dd><p>red fruit</p>+<dd>+<p>red fruit</p> </dd> <dt>orange</dt>-<dd><p>orange fruit</p>+<dd>+<p>orange fruit</p> </dd> <dt>banana</dt>-<dd><p>yellow fruit</p>+<dd>+<p>yellow fruit</p> </dd> </dl> <p>Multiple blocks with italics:</p> <dl> <dt><em>apple</em></dt>-<dd><p>red fruit</p>+<dd>+<p>red fruit</p> <p>contains seeds, crisp, pleasant to taste</p> </dd> <dt><em>orange</em></dt>-<dd><p>orange fruit</p>+<dd>+<p>orange fruit</p> <pre><code>{ orange code block }</code></pre> <blockquote> <p>orange block quote</p>@@ -424,38 +440,49 @@ <p>Multiple definitions, tight:</p> <dl> <dt>apple</dt>-<dd>red fruit+<dd>+red fruit </dd>-<dd>computer+<dd>+computer </dd> <dt>orange</dt>-<dd>orange fruit+<dd>+orange fruit </dd>-<dd>bank+<dd>+bank </dd> </dl> <p>Multiple definitions, loose:</p> <dl> <dt>apple</dt>-<dd><p>red fruit</p>+<dd>+<p>red fruit</p> </dd>-<dd><p>computer</p>+<dd>+<p>computer</p> </dd> <dt>orange</dt>-<dd><p>orange fruit</p>+<dd>+<p>orange fruit</p> </dd>-<dd><p>bank</p>+<dd>+<p>bank</p> </dd> </dl> <p>Blank line after term, indented marker, alternate markers:</p> <dl> <dt>apple</dt>-<dd><p>red fruit</p>+<dd>+<p>red fruit</p> </dd>-<dd><p>computer</p>+<dd>+<p>computer</p> </dd> <dt>orange</dt>-<dd><p>orange fruit</p>+<dd>+<p>orange fruit</p> <ol type="1"> <li>sublist</li> <li>sublist</li>@@ -543,18 +570,22 @@ <p>So is <strong><em>this</em></strong> word.</p> <p><strong><em>This is strong and em.</em></strong></p> <p>So is <strong><em>this</em></strong> word.</p>-<p>This is code: <code>&gt;</code>, <code>$</code>, <code>\</code>, <code>\$</code>, <code>&lt;html&gt;</code>.</p>+<p>This is code: <code>&gt;</code>, <code>$</code>, <code>\</code>,+<code>\$</code>, <code>&lt;html&gt;</code>.</p> <p><del>This is <em>strikeout</em>.</del></p>-<p>Superscripts: a<sup>bc</sup>d a<sup><em>hello</em></sup> a<sup>hello there</sup>.</p>+<p>Superscripts: a<sup>bc</sup>d a<sup><em>hello</em></sup>+a<sup>hello there</sup>.</p> <p>Subscripts: H<sub>2</sub>O, H<sub>23</sub>O, H<sub>many of them</sub>O.</p>-<p>These should not be superscripts or subscripts, because of the unescaped spaces: a^b c^d, a~b c~d.</p>+<p>These should not be superscripts or subscripts, because of the unescaped+spaces: a^b c^d, a~b c~d.</p> <hr /> <h1 id="smart-quotes-ellipses-dashes">Smart quotes, ellipses, dashes</h1> <p>“Hello,” said the spider. “‘Shelob’ is my name.”</p> <p>‘A’, ‘B’, and ‘C’ are letters.</p> <p>‘Oak,’ ‘elm,’ and ‘beech’ are names of trees. So is ‘pine.’</p> <p>‘He said, “I want to go.”’ Were you alive in the 70’s?</p>-<p>Here is some quoted ‘<code>code</code>’ and a “<a href="http://example.com/?foo=1&amp;bar=2">quoted link</a>”.</p>+<p>Here is some quoted ‘<code>code</code>’ and a “<a+href="http://example.com/?foo=1&amp;bar=2">quoted link</a>”.</p> <p>Some dashes: one—two — three—four — five.</p> <p>Dashes between numbers: 5–7, 255–66, 1987–1999.</p> <p>Ellipses…and…and….</p>@@ -567,13 +598,17 @@ <li><span class="math inline"><em>α</em> ∧ <em>ω</em></span></li> <li><span class="math inline">223</span></li> <li><span class="math inline"><em>p</em></span>-Tree</li>-<li>Here’s some display math: <span class="math display">$$\frac{d}{dx}f(x)=\lim_{h\to 0}\frac{f(x+h)-f(x)}{h}$$</span></li>-<li>Here’s one that has a line break in it: <span class="math inline"><em>α</em> + <em>ω</em> × <em>x</em><sup>2</sup></span>.</li>+<li>Here’s some display math: <span+class="math display">$$\frac{d}{dx}f(x)=\lim_{h\to+0}\frac{f(x+h)-f(x)}{h}$$</span></li>+<li>Here’s one that has a line break in it: <span+class="math inline"><em>α</em> + <em>ω</em> × <em>x</em><sup>2</sup></span>.</li> </ul> <p>These shouldn’t be math:</p> <ul> <li>To get the famous equation, write <code>$e = mc^2$</code>.</li>-<li>$22,000 is a <em>lot</em> of money. So is $34,000. (It worked if “lot” is emphasized.)</li>+<li>$22,000 is a <em>lot</em> of money. So is $34,000. (It worked if “lot” is+emphasized.)</li> <li>Shoes ($20) and socks ($5).</li> <li>Escaped <code>$</code>: $73 <em>this should be emphasized</em> 23$.</li> </ul>@@ -616,7 +651,8 @@ <p><a href="/url/" title="title">URL and title</a>.</p> <p><a href="/url/" title="title preceded by two spaces">URL and title</a>.</p> <p><a href="/url/" title="title preceded by a tab">URL and title</a>.</p>-<p><a href="/url/" title="title with &quot;quotes&quot; in it">URL and title</a></p>+<p><a href="/url/" title="title with &quot;quotes&quot; in it">URL and+title</a></p> <p><a href="/url/" title="title with single quotes">URL and title</a></p> <p><a href="/url/with_underscore">with_underscore</a></p> <p><a href="mailto:nobody@nowhere.net">Email link</a></p>@@ -633,51 +669,78 @@ <p>Foo <a href="/url/" title="Title with &quot;quotes&quot; inside">bar</a>.</p> <p>Foo <a href="/url/" title="Title with &quot;quote&quot; inside">biz</a>.</p> <h2 id="with-ampersands">With ampersands</h2>-<p>Here’s a <a href="http://example.com/?foo=1&amp;bar=2">link with an ampersand in the URL</a>.</p>-<p>Here’s a link with an amersand in the link text: <a href="http://att.com/" title="AT&amp;T">AT&amp;T</a>.</p>+<p>Here’s a <a href="http://example.com/?foo=1&amp;bar=2">link with an ampersand+in the URL</a>.</p>+<p>Here’s a link with an amersand in the link text: <a href="http://att.com/"+title="AT&amp;T">AT&amp;T</a>.</p> <p>Here’s an <a href="/script?foo=1&amp;bar=2">inline link</a>.</p>-<p>Here’s an <a href="/script?foo=1&amp;bar=2">inline link in pointy braces</a>.</p>+<p>Here’s an <a href="/script?foo=1&amp;bar=2">inline link in pointy+braces</a>.</p> <h2 id="autolinks">Autolinks</h2>-<p>With an ampersand: <a href="http://example.com/?foo=1&amp;bar=2" class="uri">http://example.com/?foo=1&amp;bar=2</a></p>+<p>With an ampersand: <a href="http://example.com/?foo=1&amp;bar=2"+class="uri">http://example.com/?foo=1&amp;bar=2</a></p> <ul> <li>In a list?</li> <li><a href="http://example.com/" class="uri">http://example.com/</a></li> <li>It should.</li> </ul>-<p>An e-mail address: <a href="mailto:nobody@nowhere.net" class="email">nobody@nowhere.net</a></p>+<p>An e-mail address: <a href="mailto:nobody@nowhere.net"+class="email">nobody@nowhere.net</a></p> <blockquote>-<p>Blockquoted: <a href="http://example.com/" class="uri">http://example.com/</a></p>+<p>Blockquoted: <a href="http://example.com/"+class="uri">http://example.com/</a></p> </blockquote>-<p>Auto-links should not occur here: <code>&lt;http://example.com/&gt;</code></p>+<p>Auto-links should not occur here:+<code>&lt;http://example.com/&gt;</code></p> <pre><code>or here: &lt;http://example.com/&gt;</code></pre> <hr /> <h1 id="images">Images</h1> <p>From “Voyage dans la Lune” by Georges Melies (1902):</p> <figure>-<img src="lalune.jpg" title="Voyage dans la Lune" alt="lalune" /><figcaption aria-hidden="true">lalune</figcaption>+<img src="lalune.jpg" title="Voyage dans la Lune" alt="lalune" />+<figcaption aria-hidden="true">lalune</figcaption> </figure> <p>Here is a movie <img src="movie.jpg" alt="movie" /> icon.</p> <hr /> <h1 id="footnotes">Footnotes</h1>-<p>Here is a footnote reference,<a href="#fn1" class="footnote-ref" id="fnref1" role="doc-noteref"><sup>1</sup></a> and another.<a href="#fn2" class="footnote-ref" id="fnref2" role="doc-noteref"><sup>2</sup></a> This should <em>not</em> be a footnote reference, because it contains a space.[^my note] Here is an inline note.<a href="#fn3" class="footnote-ref" id="fnref3" role="doc-noteref"><sup>3</sup></a></p>+<p>Here is a footnote reference,<a href="#fn1" class="footnote-ref" id="fnref1"+role="doc-noteref"><sup>1</sup></a> and another.<a href="#fn2"+class="footnote-ref" id="fnref2" role="doc-noteref"><sup>2</sup></a> This should+<em>not</em> be a footnote reference, because it contains a space.[^my note]+Here is an inline note.<a href="#fn3" class="footnote-ref" id="fnref3"+role="doc-noteref"><sup>3</sup></a></p> <blockquote>-<p>Notes can go in quotes.<a href="#fn4" class="footnote-ref" id="fnref4" role="doc-noteref"><sup>4</sup></a></p>+<p>Notes can go in quotes.<a href="#fn4" class="footnote-ref" id="fnref4"+role="doc-noteref"><sup>4</sup></a></p> </blockquote> <ol type="1">-<li>And in list items.<a href="#fn5" class="footnote-ref" id="fnref5" role="doc-noteref"><sup>5</sup></a></li>+<li>And in list items.<a href="#fn5" class="footnote-ref" id="fnref5"+role="doc-noteref"><sup>5</sup></a></li> </ol> <p>This paragraph should not be part of the note, as it is not indented.</p> <section class="footnotes footnotes-end-of-document" role="doc-endnotes"> <hr /> <ol>-<li id="fn1" role="doc-endnote"><p>Here is the footnote. It can go anywhere after the footnote reference. It need not be placed at the end of the document.<a href="#fnref1" class="footnote-back" role="doc-backlink">↩︎</a></p></li>-<li id="fn2" role="doc-endnote"><p>Here’s the long note. This one contains multiple blocks.</p>-<p>Subsequent blocks are indented to show that they belong to the footnote (as with list items).</p>+<li id="fn1" role="doc-endnote"><p>Here is the footnote. It can go anywhere+after the footnote reference. It need not be placed at the end of the+document.<a href="#fnref1" class="footnote-back"+role="doc-backlink">↩︎</a></p></li>+<li id="fn2" role="doc-endnote"><p>Here’s the long note. This one contains+multiple blocks.</p>+<p>Subsequent blocks are indented to show that they belong to the footnote (as+with list items).</p> <pre><code>  { &lt;code&gt; }</code></pre>-<p>If you want, you can indent every line, but you can also be lazy and just indent the first line of each block.<a href="#fnref2" class="footnote-back" role="doc-backlink">↩︎</a></p></li>-<li id="fn3" role="doc-endnote"><p>This is <em>easier</em> to type. Inline notes may contain <a href="http://google.com">links</a> and <code>]</code> verbatim characters, as well as [bracketed text].<a href="#fnref3" class="footnote-back" role="doc-backlink">↩︎</a></p></li>-<li id="fn4" role="doc-endnote"><p>In quote.<a href="#fnref4" class="footnote-back" role="doc-backlink">↩︎</a></p></li>-<li id="fn5" role="doc-endnote"><p>In list.<a href="#fnref5" class="footnote-back" role="doc-backlink">↩︎</a></p></li>+<p>If you want, you can indent every line, but you can also be lazy and just+indent the first line of each block.<a href="#fnref2" class="footnote-back"+role="doc-backlink">↩︎</a></p></li>+<li id="fn3" role="doc-endnote"><p>This is <em>easier</em> to type. Inline notes+may contain <a href="http://google.com">links</a> and <code>]</code> verbatim+characters, as well as [bracketed text].<a href="#fnref3" class="footnote-back"+role="doc-backlink">↩︎</a></p></li>+<li id="fn4" role="doc-endnote"><p>In quote.<a href="#fnref4"+class="footnote-back" role="doc-backlink">↩︎</a></p></li>+<li id="fn5" role="doc-endnote"><p>In list.<a href="#fnref5"+class="footnote-back" role="doc-backlink">↩︎</a></p></li> </ol> </section> </body>
+ test/writer.markua view
@@ -0,0 +1,700 @@+This is a set of tests for pandoc. Most of them are adapted from John Gruber’s+markdown test suite.++* * *++{id: headers}+# Headers++{id: level-2-with-an-embedded-link}+## Level 2 with an [embedded link](/url)++{id: level-3-with-emphasis}+### Level 3 with *emphasis*++{id: level-4}+#### Level 4++{id: level-5}+##### Level 5++{id: level-1}+# Level 1++{id: level-2-with-emphasis}+## Level 2 with *emphasis*++{id: level-3}+### Level 3++with no blank line++{id: level-2}+## Level 2++with no blank line++* * *++{id: paragraphs}+# Paragraphs++Here’s a regular paragraph.++In Markdown 1.0.0 and earlier. Version 8. This line turns into a list item.+Because a hard-wrapped line in the middle of a paragraph looked like a list+item.++Here’s one with a bullet. * criminey.++There should be a hard line break+here.++* * *++{id: block-quotes}+# Block Quotes++E-mail style:++> This is a block quote. It is pretty short.++> Code in a block quote:+>+> ```+> sub status {+>     print "working";+> }+> ```+>+> A list:+>+> 1. item one+> 2. item two+>+> Nested block quotes:+>+> > nested+>+> > nested++This should not be a block quote: 2 > 1.++And a following paragraph.++* * *++{id: code-blocks}+# Code Blocks++Code:++```+---- (should be four hyphens)++sub status {+    print "working";+}++this code block is indented by one tab+```++And:++```+    this code block is indented by two tabs++These should not be escaped:  \$ \\ \> \[ \{+```++* * *++{id: lists}+# Lists++{id: unordered}+## Unordered++Asterisks tight:++* asterisk 1+* asterisk 2+* asterisk 3++Asterisks loose:++* asterisk 1++* asterisk 2++* asterisk 3++Pluses tight:++* Plus 1+* Plus 2+* Plus 3++Pluses loose:++* Plus 1++* Plus 2++* Plus 3++Minuses tight:++* Minus 1+* Minus 2+* Minus 3++Minuses loose:++* Minus 1++* Minus 2++* Minus 3++{id: ordered}+## Ordered++Tight:++1. First+2. Second+3. Third++and:++1. One+2. Two+3. Three++Loose using tabs:++1. First++2. Second++3. Third++and using spaces:++1. One++2. Two++3. Three++Multiple paragraphs:++1. Item 1, graf one.++    Item 1. graf two. The quick brown fox jumped over the lazy dog’s back.++2. Item 2.++3. Item 3.++{id: nested}+## Nested++* Tab+    * Tab+        * Tab++Here’s another:++1. First+2. Second:+    * Fee+    * Fie+    * Foe+3. Third++Same thing but with paragraphs:++1. First++2. Second:++    * Fee+    * Fie+    * Foe++3. Third++{id: tabs-and-spaces}+## Tabs and spaces++* this is a list item indented with tabs++* this is a list item indented with spaces++    * this is an example list item indented with tabs++    * this is an example list item indented with spaces++{id: fancy-list-markers}+## Fancy list markers++2) begins with 2++3) and now 3++    with a continuation++    iv. sublist with roman numerals, starting with 4+    v. more items+        A) a subsublist+        B) a subsublist++Nesting:++A. Upper Alpha+    I. Upper Roman.+        6) Decimal start with 6+            c) Lower alpha with paren++Autonumbering:++1. Autonumber.+2. More.+    1. Nested.++Should not be a list item:++M.A. 2007++B. Williams++* * *++{id: definition-lists}+# Definition Lists++Tight using spaces:++apple+: red fruit++orange+: orange fruit++banana+: yellow fruit++Tight using tabs:++apple+: red fruit++orange+: orange fruit++banana+: yellow fruit++Loose:++apple++: red fruit++orange++: orange fruit++banana++: yellow fruit++Multiple blocks with italics:++*apple*++: red fruit++    contains seeds, crisp, pleasant to taste++*orange*++: orange fruit++    ```+    { orange code block }+    ```++    > orange block quote++Multiple definitions, tight:++apple+: red fruit+: computer++orange+: orange fruit+: bank++Multiple definitions, loose:++apple++: red fruit++: computer++orange++: orange fruit++: bank++Blank line after term, indented marker, alternate markers:++apple++: red fruit++: computer++orange++: orange fruit++    1. sublist+    2. sublist++{id: html-blocks}+# HTML Blocks++Simple block on one line:++foo++And nested without indentation:++foo++bar++Interpreted markdown in a table:++This is *emphasized*+And this is **strong**+Here’s a simple block:++foo++This should be a code block, though:++```+<div>+    foo+</div>+```++As should this:++```+<div>foo</div>+```++Now, nested:++foo++This should just be an HTML comment:++Multiline:++Code block:++```+<!-- Comment -->+```++Just plain comment, with trailing spaces on the line:++Code:++```+<hr />+```++Hr’s:++* * *++{id: inline-markup}+# Inline Markup++This is *emphasized*, and so *is this*.++This is **strong**, and so **is this**.++An *[emphasized link](/url)*.++***This is strong and em.***++So is ***this*** word.++***This is strong and em.***++So is ***this*** word.++This is code: `>`, `$`, `\`, `\$`, `<html>`.++~~This is *strikeout*.~~++Superscripts: a^bc^d a^*hello*^ a^hello there^.++Subscripts: H~2~O, H~23~O, H~many of them~O.++These should not be superscripts or subscripts, because of the unescaped spaces:+a^b c^d, a~b c~d.++* * *++{id: smart-quotes-ellipses-dashes}+# Smart quotes, ellipses, dashes++"Hello," said the spider. "'Shelob' is my name."++'A', 'B', and 'C' are letters.++'Oak,' 'elm,' and 'beech' are names of trees. So is 'pine.'++'He said, "I want to go."' Were you alive in the 70’s?++Here is some quoted '`code`' and a "[quoted+link](http://example.com/?foo=1&bar=2)".++Some dashes: one—two — three—four — five.++Dashes between numbers: 5–7, 255–66, 1987–1999.++Ellipses…and…and….++* * *++{id: latex}+# LaTeX++* +* `2+2=4`$+* `x \in y`$+* `\alpha \wedge \omega`$+* `223`$+* `p`$-Tree+* Here’s some display math:++    {format: latex}+    ```+    \frac{d}{dx}f(x)=\lim_{h\to 0}\frac{f(x+h)-f(x)}{h}+    ```+* Here’s one that has a line break in it: `\alpha + \omega \times x^2`$.++These shouldn’t be math:++* To get the famous equation, write `$e = mc^2$`.+* $22,000 is a *lot* of money. So is $34,000. (It worked if "lot" is+    emphasized.)+* Shoes ($20) and socks ($5).+* Escaped `$`: $73 *this should be emphasized* 23$.++Here’s a LaTeX table:++* * *++{id: special-characters}+# Special Characters++Here is some unicode:++* I hat: Î+* o umlaut: ö+* section: §+* set membership: ∈+* copyright: ©++AT&T has an ampersand in their name.++AT&T is another way to write it.++This & that.++4 < 5.++6 > 5.++Backslash: \++Backtick: `++Asterisk: *++Underscore: _++Left brace: {++Right brace: }++Left bracket: [++Right bracket: ]++Left paren: (++Right paren: )++Greater-than: >++Hash: #++Period: .++Bang: !++Plus: +++Minus: -++* * *++{id: links}+# Links++{id: explicit}+## Explicit++Just a [URL](/url/).++[URL and title](/url/){title: "title"}.++[URL and title](/url/){title: "title preceded by two spaces"}.++[URL and title](/url/){title: "title preceded by a tab"}.++[URL and title](/url/){title: "title with "quotes" in it"}++[URL and title](/url/){title: "title with single quotes"}++[with_underscore](/url/with_underscore)++[Email link](mailto:nobody@nowhere.net)++[Empty]().++{id: reference}+## Reference++Foo [bar](/url/).++With [embedded [brackets]](/url/).++[b](/url/) by itself should be a link.++Indented [once](/url).++Indented [twice](/url).++Indented [thrice](/url).++This should [not][] be a link.++```+[not]: /url+```++Foo [bar](/url/){title: "Title with "quotes" inside"}.++Foo [biz](/url/){title: "Title with "quote" inside"}.++{id: with-ampersands}+## With ampersands++Here’s a [link with an ampersand in the URL](http://example.com/?foo=1&bar=2).++Here’s a link with an amersand in the link text:+[AT&T](http://att.com/){title: "AT&T"}.++Here’s an [inline link](/script?foo=1&bar=2).++Here’s an [inline link in pointy braces](/script?foo=1&bar=2).++{id: autolinks}+## Autolinks++With an ampersand:+[http:~/~/example.com/?foo=1&bar=2](http://example.com/?foo=1&bar=2){class: uri}++* In a list?+* [http:~/~/example.com/](http://example.com/){class: uri}+* It should.++An e-mail address: [nobody@nowhere.net](mailto:nobody@nowhere.net){class: email}++> Blockquoted: [http:~/~/example.com/](http://example.com/){class: uri}++Auto-links should not occur here: `<http://example.com/>`++```+or here: <http://example.com/>+```++* * *++{id: images}+# Images++From "Voyage dans la Lune" by Georges Melies (1902):++{alt: "lalune", title: "Voyage dans la Lune"}+![](lalune.jpg)++Here is a movie+{alt: "movie"}+![](movie.jpg)+icon.++* * *++{id: footnotes}+# Footnotes++Here is a footnote reference,[^1] and another.[^2] This should *not* be a+footnote reference, because it contains a space.[^my note] Here is an inline+note.[^3]++> Notes can go in quotes.[^4]++1. And in list items.[^5]++This paragraph should not be part of the note, as it is not indented.++[^1]: Here is the footnote. It can go anywhere after the footnote reference. It+    need not be placed at the end of the document.++[^2]: Here’s the long note. This one contains multiple blocks.++    Subsequent blocks are indented to show that they belong to the footnote (as+    with list items).++    ```+      { <code> }+    ```++    If you want, you can indent every line, but you can also be lazy and just+    indent the first line of each block.++[^3]: This is *easier* to type. Inline notes may contain+    [links](http://google.com) and `]` verbatim characters, as well as+    [bracketed text].++[^4]: In quote.++[^5]: In list.
test/writer.opendocument view
@@ -1017,7 +1017,7 @@     <style:style style:name="T6" style:family="text"><style:text-properties style:text-position="super 58%" /></style:style>     <style:style style:name="T7" style:family="text"><style:text-properties fo:font-style="italic" style:font-style-asian="italic" style:font-style-complex="italic" style:text-position="super 58%" /></style:style>     <style:style style:name="T8" style:family="text"><style:text-properties style:text-position="sub 58%" /></style:style>-    <style:style style:name="fr2" style:family="graphic" style:parent-style-name="Formula"><style:graphic-properties style:vertical-pos="middle" style:vertical-rel="paragraph-content" style:horizontal-pos="center" style:horizontal-rel="paragraph-content" style:wrap="none" /></style:style>+    <style:style style:name="fr2" style:family="graphic" style:parent-style-name="Formula"><style:graphic-properties style:vertical-pos="middle" style:vertical-rel="text" style:horizontal-pos="center" style:horizontal-rel="paragraph-content" style:wrap="none" /></style:style>     <style:style style:name="fr1" style:family="graphic" style:parent-style-name="Formula"><style:graphic-properties style:vertical-pos="middle" style:vertical-rel="text" /></style:style>     <style:style style:name="P1" style:family="paragraph" style:parent-style-name="Quotations">       <style:paragraph-properties fo:margin-left="0.5in" fo:margin-right="0in" fo:text-indent="0in" style:auto-text-indent="false" />
test/writer.opml view
@@ -52,7 +52,7 @@ </outline> <outline text="LaTeX" _note="-   &#10;-   2 + 2 = 4&#10;-   *x* ∈ *y*&#10;-   *α* ∧ *ω*&#10;-   223&#10;-   *p*-Tree&#10;-   Here’s some display math:&#10;    $$\\frac{d}{dx}f(x)=\\lim\_{h\\to 0}\\frac{f(x+h)-f(x)}{h}$$&#10;-   Here’s one that has a line break in it: *α* + *ω* × *x*².&#10;&#10;These shouldn’t be math:&#10;&#10;-   To get the famous equation, write `$e = mc^2$`.&#10;-   $22,000 is a *lot* of money. So is $34,000. (It worked if “lot” is&#10;    emphasized.)&#10;-   Shoes ($20) and socks ($5).&#10;-   Escaped `$`: $73 *this should be emphasized* 23$.&#10;&#10;Here’s a LaTeX table:&#10;&#10;------------------------------------------------------------------------"> </outline>-<outline text="Special Characters" _note="Here is some unicode:&#10;&#10;-   I hat: Î&#10;-   o umlaut: ö&#10;-   section: §&#10;-   set membership: ∈&#10;-   copyright: ©&#10;&#10;AT&amp;T has an ampersand in their name.&#10;&#10;AT&amp;T is another way to write it.&#10;&#10;This &amp; that.&#10;&#10;4 &amp;lt; 5.&#10;&#10;6 &amp;gt; 5.&#10;&#10;Backslash: \\&#10;&#10;Backtick: \`&#10;&#10;Asterisk: \*&#10;&#10;Underscore: \_&#10;&#10;Left brace: {&#10;&#10;Right brace: }&#10;&#10;Left bracket: \[&#10;&#10;Right bracket: \]&#10;&#10;Left paren: (&#10;&#10;Right paren: )&#10;&#10;Greater-than: &amp;gt;&#10;&#10;Hash: #&#10;&#10;Period: .&#10;&#10;Bang: !&#10;&#10;Plus: +&#10;&#10;Minus: -&#10;&#10;------------------------------------------------------------------------">+<outline text="Special Characters" _note="Here is some unicode:&#10;&#10;-   I hat: Î&#10;-   o umlaut: ö&#10;-   section: §&#10;-   set membership: ∈&#10;-   copyright: ©&#10;&#10;AT&amp;T has an ampersand in their name.&#10;&#10;AT&amp;T is another way to write it.&#10;&#10;This &amp; that.&#10;&#10;4 &amp;lt; 5.&#10;&#10;6 &amp;gt; 5.&#10;&#10;Backslash: \\&#10;&#10;Backtick: \`&#10;&#10;Asterisk: \*&#10;&#10;Underscore: \_&#10;&#10;Left brace: {&#10;&#10;Right brace: }&#10;&#10;Left bracket: \[&#10;&#10;Right bracket: \]&#10;&#10;Left paren: (&#10;&#10;Right paren: )&#10;&#10;Greater-than: &amp;gt;&#10;&#10;Hash: \#&#10;&#10;Period: .&#10;&#10;Bang: !&#10;&#10;Plus: +&#10;&#10;Minus: -&#10;&#10;------------------------------------------------------------------------"> </outline> <outline text="Links">   <outline text="Explicit" _note="Just a [URL](/url/).&#10;&#10;[URL and title](/url/ &quot;title&quot;).&#10;&#10;[URL and title](/url/ &quot;title preceded by two spaces&quot;).&#10;&#10;[URL and title](/url/ &quot;title preceded by a tab&quot;).&#10;&#10;[URL and title](/url/ &quot;title with &quot;quotes&quot; in it&quot;)&#10;&#10;[URL and title](/url/ &quot;title with single quotes&quot;)&#10;&#10;[with\_underscore](/url/with_underscore)&#10;&#10;[Email link](mailto:nobody@nowhere.net)&#10;&#10;[Empty]().">
test/writer.org view
@@ -230,22 +230,17 @@    :PROPERTIES:    :CUSTOM_ID: nested    :END:- - Tab-   - Tab-     - Tab  Here's another:  1. First 2. Second:-    - Fee    - Fie    - Foe- 3. Third  Same thing but with paragraphs:@@ -264,7 +259,6 @@    :PROPERTIES:    :CUSTOM_ID: tabs-and-spaces    :END:- - this is a list item indented with tabs  - this is a list item indented with spaces@@ -277,34 +271,28 @@    :PROPERTIES:    :CUSTOM_ID: fancy-list-markers    :END:--2) begins with 2+2) [@2] begins with 2  3) and now 3     with a continuation -   4. sublist with roman numerals, starting with 4+   4. [@4] sublist with roman numerals, starting with 4    5. more items-       1) a subsublist       2) a subsublist  Nesting:  1. Upper Alpha-    1. Upper Roman.--      6) Decimal start with 6--         3) Lower alpha with paren+      6) [@6] Decimal start with 6+         3) [@3] Lower alpha with paren  Autonumbering:  1. Autonumber. 2. More.-    1. Nested.  Should not be a list item:@@ -598,7 +586,6 @@   :PROPERTIES:   :CUSTOM_ID: latex   :END:- - \cite[22-23]{smith.1899} - \(2+2=4\) - \(x \in y\)
test/writers-lang-and-dir.context view
@@ -7,7 +7,7 @@  % make chapter, section bookmarks visible when opening document \placebookmarks[chapter, section, subsection, subsubsection, subsubsubsection, subsubsubsubsection][chapter, section]-\setupinteractionscreen[option=bookmark]+\setupinteractionscreen[option={bookmark,title}]  \setuppagenumbering[location={footer,middle}] \setupbackend[export=yes]
trypandoc/trypandoc.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {- |    Module      : Main-   Copyright   : © 2014-2021 John MacFarlane <jgm@berkeley.edu>+   Copyright   : © 2014-2022 John MacFarlane <jgm@berkeley.edu>    License     : GNU GPL, version 2 or above     Maintainer  : John MacFarlane <jgm@berkeley.edu>