packages feed

pandoc 3.12 → 3.12.1

raw patch · 148 files changed

+6163/−583 lines, 148 filesdep ~citeprocdep ~temporarydep ~texmathbinary-addedPVP ok

version bump matches the API change (PVP)

Dependency ranges changed: citeproc, temporary, texmath

API changes (from Hackage documentation)

+ Text.Pandoc.Readers: readFODT :: (PandocMonad m, ToSources a) => ReaderOptions -> a -> m Pandoc
+ Text.Pandoc.Readers.ODT: readFODT :: (PandocMonad m, ToSources a) => ReaderOptions -> a -> m Pandoc
+ Text.Pandoc.Writers: writeFODT :: PandocMonad m => WriterOptions -> Pandoc -> m Text
+ Text.Pandoc.Writers.ODT: instance GHC.Classes.Eq Text.Pandoc.Writers.ODT.ODTVariant
+ Text.Pandoc.Writers.ODT: instance GHC.Show.Show Text.Pandoc.Writers.ODT.ODTVariant
+ Text.Pandoc.Writers.ODT: writeFODT :: PandocMonad m => WriterOptions -> Pandoc -> m Text

Files

AUTHORS.md view
@@ -44,6 +44,7 @@ - Arlo O'Keeffe - Artem Pelenitsyn - Artyom Kazak+- Aslak Hellesøy - Asliddinbek Azizovich - B. Scott Michel - Bastien Dumont@@ -127,6 +128,7 @@ - Eric Kow - Eric Schrijver - Eric Seidel+- Erik Demaine - Erik Post - Erik Rask - Ethan Riley@@ -253,6 +255,7 @@ - Konstantin Zudov - Kristof Bastiaensen - Krystof Beuermann+- Kyohei Takahashi - Lars-Dominik Braun - Laurent P. René de Cotret - Lawrence Chonavel@@ -362,6 +365,7 @@ - Puneeth Chaganti - Quinn - R. N. West+- Raffaele Mancuso - Ralf Stephan - Raniere Silva - Raymond Berger@@ -530,6 +534,7 @@ - priiduonu - qerub - quasicomputational+- rca-umb - reptee - ricnorr - robabla
MANUAL.txt view
@@ -1,7 +1,7 @@ --- title: Pandoc User's Guide author: John MacFarlane-date: 2026-09-26+date: 2026-10-07 ---  # Synopsis@@ -251,6 +251,7 @@     - `endnotexml` ([EndNote XML bibliography])     - `epub` ([EPUB])     - `fb2` ([FictionBook2] e-book)+    - `fodt` (flat [OpenDocument text document][ODT])     - `gfm` ([GitHub-Flavored Markdown]),       or the deprecated and less accurate `markdown_github`;       use [`markdown_github`](#markdown-variants) only@@ -327,6 +328,7 @@     - `epub` or `epub3` ([EPUB] v3 book)     - `epub2` (EPUB v2)     - `fb2` ([FictionBook2] e-book)+    - `fodt` (flat [OpenDocument text document][ODT])     - `gfm` ([GitHub-Flavored Markdown]),       or the deprecated and less accurate `markdown_github`;       use [`markdown_github`](#markdown-variants) only@@ -1146,7 +1148,10 @@ `--link-images[=true|false]`  :   Include links to images instead of embedding the images in ODT.-    (This option currently only affects ODT output.)+    (This option currently only affects `odt` and `fodt` output.)+    This is worth considering for `fodt`, where images have to be+    base64-encoded and so take about a third more space than in the+    compressed `odt` package.  `--html-q-tags[=true|false]` @@ -1408,6 +1413,12 @@         Then open `custom-reference.odt` in LibreOffice, modify         the styles as you wish, and save the file. +        `fodt` output uses the same reference documents as `odt`;+        the reference is still a zipped `.odt`, which is flattened+        along with the generated content.  Note that an automatic+        style of the reference document is dropped, with a warning,+        if the generated content defines a style of the same name.+     PowerPoint      :   Templates included with Microsoft PowerPoint 2013 (either with@@ -3592,6 +3603,16 @@ :   color for external links, internal links, and citation links,     respectively: expects a hexadecimal color code +`csl-entry-spacing`+:   entry spacing between citeproc-generated bibliography entries+    (with a unit, e.g. `1em`). This will be set automatically+    based on the CSL style but can be overridden.++`csl-hanging-indent`+:   amount of hanging indent in citeproc-generated bibliography entries+    (with a unit, e.g. `1.5em`). This will be set automatically+    based on the CSL style but can be overridden.+ ### Variables for ms  `fontfamily`@@ -6630,7 +6651,7 @@          Spin wave dispersion on the <span class="nocase">nm</span> scale -### Conference Papers, Published vs. Unpublished+### Conference papers, published vs. unpublished  For a formally published conference paper, use the biblatex entry type `inproceedings` (which will be mapped to CSL `paper-conference`).@@ -6649,7 +6670,6 @@ which describes the publisher's location; do not use the latter for an unpublished conference paper. - ## Specifying a citation style  Citations and references can be formatted using any style supported by the@@ -7829,11 +7849,11 @@  # Custom Styles -Custom styles can be used in the docx, odt and ICML formats.+Custom styles can be used in the docx, odt, fodt and ICML formats.  ## Output -By default, pandoc's odt, docx and ICML output applies a predefined set of+By default, pandoc's odt, fodt, docx and ICML output applies a predefined set of styles for blocks such as paragraphs and block quotes, and uses largely default formatting (italics, bold) for inlines. This will work for most purposes, especially alongside a [reference doc](#option--reference-doc) file.
README.md view
@@ -54,6 +54,8 @@ - `fb2`   ([FictionBook2](http://www.fictionbook.org/index.php/Eng:XML_Schema_Fictionbook_2.1)   e-book)+- `fodt` (flat [OpenDocument text+  document](https://en.wikipedia.org/wiki/OpenDocument)) - `gfm` ([GitHub-Flavored   Markdown](https://help.github.com/articles/github-flavored-markdown/)),   or the deprecated and less accurate `markdown_github`; use@@ -161,6 +163,8 @@ - `fb2`   ([FictionBook2](http://www.fictionbook.org/index.php/Eng:XML_Schema_Fictionbook_2.1)   e-book)+- `fodt` (flat [OpenDocument text+  document](https://en.wikipedia.org/wiki/OpenDocument)) - `gfm` ([GitHub-Flavored   Markdown](https://help.github.com/articles/github-flavored-markdown/)),   or the deprecated and less accurate `markdown_github`; use
benchmark/benchmark-pandoc.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE TupleSections #-} {- Copyright (C) 2012-2024 John MacFarlane <jgm@berkeley.edu> @@ -19,6 +20,7 @@ import Text.Pandoc import Text.Pandoc.MIME import Text.Pandoc.Shared (stringify, stringifyInlines)+import Text.Pandoc.MediaBag (mediaItems) import Control.DeepSeq (force) import Control.Monad.Except (throwError) import qualified Text.Pandoc.UTF8 as UTF8@@ -27,43 +29,62 @@ import Test.Tasty.Bench -- import Gauge import qualified Data.ByteString.Lazy as BL-import Data.Maybe (mapMaybe) import Data.List (sortOn) import Text.Pandoc.Format (FlavoredFormat(..))+import System.IO.Temp+import Data.Maybe -readerBench :: Pandoc+readerBench :: [(FilePath, MimeType, BL.ByteString)]+            -> Pandoc             -> T.Text             -> Maybe Benchmark-readerBench _ name+readerBench _ _ name   | name `elem` ["bibtex", "biblatex", "csljson"] = Nothing-readerBench doc name = either (const Nothing) Just $+readerBench imgs doc name = either (const Nothing) Just $   runPure $ do     (rdr, rexts) <- getReader $ FlavoredFormat name mempty     (wtr, wexts) <- getWriter $ FlavoredFormat name mempty-    tmpl <- Just <$> compileDefaultTemplate name+    tpl <- compileDefaultTemplate name      case (rdr, wtr) of       (TextReader r, TextWriter w) -> do         inp <- w def{ writerWrapText = WrapAuto                     , writerExtensions = wexts-                    , writerTemplate = tmpl } doc-        return $ bench (T.unpack name) $-          nf (either (error . show) id . runPure . r def) inp+                    , writerTemplate = Just tpl } doc+        return $ bench (T.unpack name)+               $ nf (\x -> either (error . show) id $+                       runPure $ do+                         mapM_ (\(fp,mt,bs) -> insertMedia fp (Just mt) bs) imgs+                         r def x)+                    inp       (ByteStringReader r, ByteStringWriter w) -> do         inp <- w def{ writerWrapText = WrapAuto                     , writerExtensions = wexts-                    , writerTemplate = tmpl } doc-        return $ bench (T.unpack name) $-          nf (either (error . show) id .-                runPure . r def{readerExtensions = rexts}) inp+                    , writerTemplate = Just tpl } doc+        return $ bench (T.unpack name)+               $ nf (\x -> either (error . show) id $+                       runPure $ do+                         mapM_ (\(fp,mt,bs) -> insertMedia fp (Just mt) bs) imgs+                         r def{readerExtensions = rexts} x)+                    inp       _ -> throwError $ PandocSomeError $ "text/bytestring format mismatch: "                            <> name -getImages :: IO [(FilePath, MimeType, BL.ByteString)]-getImages = do-  ll <- B.readFile "test/lalune.jpg"-  mv <- B.readFile "test/movie.jpg"-  return [("lalune.jpg", "image/jpg", BL.fromStrict ll)-         ,("movie.jpg", "image/jpg", BL.fromStrict mv)]+getSample :: FilePath -> IO (Pandoc, [(FilePath, MimeType, BL.ByteString)])+getSample fp = do+  inp <- UTF8.toText <$> B.readFile fp+  let opts = def+  doc' <- runIOorExplode $ do+            (_, rexts) <- getReader $ FlavoredFormat "markdown" mempty+            readMarkdown+              opts{ readerExtensions = enableExtension Ext_rebase_relative_paths+                                              rexts }+              [(fp, inp)]+  withSystemTempDirectory "pandoc-bench-resources" $ \tmpdir ->+    runIOorExplode $ do+      doc <- extractMedia tmpdir doc'+      fillMediaBag doc+      items <- mediaItems <$> getMediaBag+      pure $! (doc, items)  writerBench :: [(FilePath, MimeType, BL.ByteString)]             -> Pandoc@@ -74,20 +95,22 @@ writerBench imgs doc name = either (const Nothing) Just $   runPure $ do     (wtr, wexts) <- getWriter $ FlavoredFormat name mempty+    tpl <- compileDefaultTemplate name+    let opts = def{ writerExtensions = wexts, writerTemplate = Just tpl }     case wtr of       TextWriter writerFun ->         return $ bench (T.unpack name)                $ nf (\d -> either (error . show) id $                        runPure $ do                          mapM_ (\(fp,mt,bs) -> insertMedia fp (Just mt) bs) imgs-                         writerFun def{ writerExtensions = wexts} d)+                         writerFun opts d)                     doc       ByteStringWriter writerFun ->         return $ bench (T.unpack name)                $ nf (\d -> either (error . show) id $                        runPure $ do                          mapM_ (\(fp,mt,bs) -> insertMedia fp (Just mt) bs) imgs-                         writerFun def{ writerExtensions = wexts} d)+                         writerFun opts d)                     doc  -- | A large inline sequence exercising both the common constructors@@ -105,17 +128,14 @@  main :: IO () main = do-  inp <- UTF8.toText <$> B.readFile "test/testsuite.txt"-  let opts = def-  let doc = either (error . show) force $ runPure $ readMarkdown opts inp-  defaultMain-    [ env getImages $ \imgs ->-      bgroup "writers" $ mapMaybe (writerBench imgs doc . fst)-                         (sortOn fst-                           writers :: [(T.Text, Writer PandocPure)])-    , bgroup "readers" $ mapMaybe (readerBench doc . fst)-                         (sortOn fst-                           readers :: [(T.Text, Reader PandocPure)])+  (doc, imgs) <- getSample "benchmark/sample.md"+  defaultMain $+    [ bgroup "writers" $ mapMaybe (writerBench imgs doc . fst)+                            (sortOn fst+                              writers :: [(T.Text, Writer PandocPure)])+    , bgroup "readers" $ mapMaybe (readerBench imgs doc . fst)+                            (sortOn fst+                               readers :: [(T.Text, Reader PandocPure)])     , env (pure $ force bigInlines) $ \ils ->       bgroup "stringify"         [ bench "stringify" $ nf stringify ils
+ benchmark/lalune.jpg view

binary file changed (absent → 16270 bytes)

+ benchmark/movie.jpg view

binary file changed (absent → 1046 bytes)

+ benchmark/sample.md view
@@ -0,0 +1,1597 @@+% Pandoc Test Suite+% John MacFarlane; Anonymous+% July 17, 2006++This is a set of tests for pandoc.  Most of them are adapted from+John Gruber's markdown test suite.++-----++# Headers++## Level 2 with an [embedded link](/url)++### Level 3 with *emphasis*++#### Level 4++##### Level 5++Level 1+=======++Level 2 with *emphasis*+-----------------------++### Level 3+with no blank line++Level 2+-------+with no blank line++----------++# 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.++---++# 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.++* * * *++# 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:  \$ \\ \> \[ \{++___________++# Lists++## 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++## 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.++## 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++## 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++## Fancy list markers++(2) begins with 2+(3) and now 3++    with a continuation++    i.  sublist with roman numerals+        starting with i.+    ii. more items+        (A)  a subsublist+        (B)  a subsublist++Nesting:++D.  Upper Alpha+    I.  Upper Roman.+        (1) Decimal start with 1+            a)  Lower alpha with paren++Autonumbering:++ #.  Autonumber.+ #.  More.+     #.  Nested.++Should not be a list item:++M.A. 2007++B. Williams++  *   *   *   *   *++# 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++# HTML Blocks++Simple block on one line:++<div>foo</div>++And nested without indentation:++<div>+<div>+<div>+foo+</div>+</div>+<div>bar</div>+</div>++Interpreted markdown in a table:++<table>+<tr>+<td>This is *emphasized*</td>+<td>And this is **strong**</td>+</tr>+</table>++<script type="text/javascript">document.write('This *should not* be interpreted as markdown');</script>++Here's a simple block:++<div>+foo+</div>++This should be a code block, though:++	<div>+		foo+	</div>++As should this:++	<div>foo</div>++Now, nested:++<div>+ <div>+  <div>+  foo+  </div>+ </div>+</div>++This should just be an HTML comment:++<!-- Comment -->++Multiline:++<!--+Blah+Blah+-->++<!--+	This is another comment.+-->++Code block:++	<!-- Comment -->++Just plain comment, with trailing spaces on the line:++<!-- foo -->++Code:++	<hr />++Hr's:++<hr>++<hr />++<hr />++<hr>++<hr />++<hr />++<hr class="foo" id="bar" />++<hr class="foo" id="bar" />++<hr class="foo" id="bar">++-----++# 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.++-----++# 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][1]".++Some dashes:  one---two --- three---four --- five.++Dashes between numbers: 5--7, 255--66, 1987--1999.++Ellipses...and...and....++-----++# LaTeX++- \cite[22-23]{smith.1899}+- $2+2=4$+- $x \in y$+- $\alpha \wedge \omega$+- $223$+- $p$-Tree+- Here's some display math:+  $$\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:++\begin{tabular}{|l|l|}\hline+Animal & Number \\ \hline+Dog    & 2      \\+Cat    & 1      \\ \hline+\end{tabular}++* * * * *++# Special Characters++Here is some unicode:++- I hat: Î+- o umlaut: ö+- section: §+- set membership: ∈+- copyright: ©++AT&T has an ampersand in their name.++AT&amp;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: \-++- - - - - - - - - - - - -++# Links++## Explicit++Just a [URL](/url/).++[URL and title](/url/ "title").++[URL and title](/url/  "title preceded by two spaces").++[URL and title](/url/	"title preceded by a tab").++[URL and title](/url/ "title with "quotes" in it")++[URL and title](/url/ 'title with single quotes')++[with\_underscore](/url/with_underscore)++[Email link](mailto:nobody@nowhere.net)++[Empty]().++## Reference++Foo [bar][a].++[a]: /url/++With [embedded [brackets]][b].++[b] by itself should be a link.++Indented [once][].++Indented [twice][].++Indented [thrice][].++This should [not][] be a link.++ [once]: /url+  [twice]: /url++   [thrice]: /url++    [not]: /url++[b]: /url/++Foo [bar][].++Foo [biz](/url/ "Title with "quote" inside").++  [bar]: /url/ "Title with "quotes" inside"++## With ampersands++Here's a [link with an ampersand in the URL][1].++Here's a link with an amersand in the link text: [AT&T][2].++Here's an [inline link](/script?foo=1&bar=2).++Here's an [inline link in pointy braces](</script?foo=1&bar=2>).++[1]: http://example.com/?foo=1&bar=2+[2]: http://att.com/  "AT&T"++## Autolinks++With an ampersand: <http://example.com/?foo=1&bar=2>++* In a list?+* <http://example.com/>+* It should.++An e-mail address:  <nobody@nowhere.net>++> Blockquoted: <http://example.com/>++Auto-links should not occur here: `<http://example.com/>`++	or here: <http://example.com/>++----++# Images++From "Voyage dans la Lune" by Georges Melies (1902):++![lalune][]++   [lalune]: lalune.jpg "Voyage dans la Lune"++Here is a movie ![movie](movie.jpg) icon.++----++# Footnotes++Here is a footnote reference,[^1] and another.[^longnote]+This should *not* be a footnote reference, because it+contains a space.[^my note]  Here is an inline note.^[This+is *easier* to type.  Inline notes may contain+[links](http://google.com) and `]` verbatim characters,+as well as [bracketed text].]++> Notes can go in quotes.^[In quote.]++1.  And in list items.^[In list.]++[^longnote]: 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.++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.++# Tables++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   Left              Right Default aligned+    Header    Aligned         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   Left              Right Default aligned+    Header    Aligned         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.+  ----------- ---------- ------------ ---------------------------+## Porro'm modi {#nemine-amet}++Aut ex quas v enim ut proin dui intaminata equestrem wisi arcui+Earum praesidia est scientiam fusce rerum abominationem:++> Per duis ut eum aversionem scandalum te testimonium afflictio+> li paucis commune et consiliarorum nisl hac apparct facunde est+> nemo nicolae, ad desiderabilem est pede antiguo, iste qui eros+> conferre. Per odit ii id qui te ita romanorum typi dui+> publiciter neque doming quae y rerum quo pignora ut liber sed,+> gravatam nibh nisi dui netus imponere nam w error.++Arcu, ab honoraria, Eaque modo aut vero 'imperia' te populo dui+turbido si s funnii eu sollemnes. Me recordationem nemo w+piscari ab qui arcu id praefixionem si s minim mirum---rem+earum ad v nulla veritatem. Ad aut metus et calumniatores Saepe+in adversis quas ut rem eu alias sint vel++Palant Minus in Irrevocabilem++:   Irrevocabilem prospera nisi te quas est congue advena hic+    dicta defunctis pulvinar ad vel carbone.++Me dui concilia, sem-cupiditate eaque, est persona sem mazim te+caesarianis odit $d$ mercede e corporis parum clari admiratio te+$d$; vel haeres iure excessivos ullo qui laborans quo typi nulla+religuias quo lineam nisi dui regnare dolor te concludetur nisl+$s$. Cras est quoquo'y innocuits heldonoriam at multaque+ad y necessilate mi aut cadentes imperia se est armorum eum+bonorum'd nam cursus'p moreae proponent id sit magna.+[Gennere @liber:culpa, a. 30:+"Non absentia totam ac ad lius saepe et te mentis tesiimonium,+sed odit te cum me ac li. Decursu (0) nisi nec ex est eros+maiores $O$ ad $V$ ad...; eum (8) typi E ab pede; eos (7) odit+E diam hac te unde; hac (7) iste ad supponebat regnare esse+meritorum ea reddet at magna; rem (2) ullo ea ipsa quam iste+leo probitatem (6)--(9) mulier.  Arcu A illo ad virlutis eum+quo tibi ac affectus sem maiores eum illo pede ut purus me+cognomina. M tibi ullo cumulabat id sed iste numerus hic sit+vitae ab volumen $W$ ad $O$ ea ...  sed iste A fuga te ex+fuga. V ille sed il rem nec tibi vero li.  Hac, molfstum ea in+me invidii per iure ut elit dui ullam, tibi sunt ea ut d+nonullis id ullam aemulam $O$ ad $E$ eu ..."]++Nam arcu qui semper praeclusa dis assum te aut possimus?+Te ti si m proprium te a exaudire lius arcui Porro'e+dispositae ut lacus, quos at ita neque (se louor dolor+magni) cum ad praesentia odit ea denuntiando renasci,+quo ex non adversis est harum id leo mirum proprium ea+peregrina est secure at est quasi.  Ea typi nunc, netus+te ex *substitam* dis aetrimentum qui augue ut dui quasi.+Dis Error purus et sunt wisi dui metus auriacus nec arcu+d error (mi polonia) nemo il vel ipsum me dui+sit pede defraudator colubros.  Ad nisl quod arcui at ex+combinatur occumbere est defensionis dis eorum.+Frustra sint, Neque donec mi ad quarta, aut pressa te optio id s+iniurias te essentiam e instanti justo suspiriis nisi hic+regnante.++Saepe vero hic diam ea tempore---ex equestri in est cum at+stilum.  Aut ex mus quas nec id erat typi eget et cras.+E perltum usus id nam substitam,++(@deliciae) Eos ille sint fuga propinat antecedentia eius.++Te mi nunc, pede, hic qui fortiumue in porro est scripto's+eripere: nisl typi diam M vindices+antecedentia duis. Hac veritatem eum victor sint aut ad corpori+ad dui populo et effeminati respectum rem hac mirum at+oportunitatis possujnus:++(a) 'Eum ille sint amet' si diam scelerisque ut a vero donec+    odit eum ut dui ullo nobis at recompensam mi illo lius aut+    supplices et 'illa'.+(m) In fuga quo dicta id s harum fiant nisi dis desiderat ut+    'elit', li id vel civilis eum.+(p) Nam titulum lius modi te nisi eius W.++Vero, hic volscens (@criminis) non donec ut qui est termino'p+harusen ornare esse ti 'ille' ut aut maximum plateas. Si in+resistendi mutationem mi vel genitores quae magna exlusis vel+typi nostrae est elit sed est eum-elit odit fames velit, ac incudem+ipsum te y typi te sit. Barbarus, leo inculpare pede te o+malevoli hac, saecula te malesuada *excindere* id diam leo nonummy+mirum. Ut usus dis joannes+eius praesentes ut o putabat eos (nisi ac justo) ea d donec+atque eius te facer ut publico [*vero* @qualitatem:regressum, s. 44].++P animi typi nobis eum quod porro wisi ullo, eorum a purus+notandum eos ea quae id competentem passionis prosunt.+Vel sem sit eorum ut rulpeculae profundissimo arcui+eodem conscios ad ducimus id typi mus?  Erat eaque utraque.+Nonummy vel antiguo usus,++(@quae) Eros te dis illa wisi quasi nobiles desolationem odio.++At neque nisi est formidine nec aversionem iste habitasse, aut.+Consiliarorum nemo aut elit, ad ii lacus li aut scripta ipsa++(@eodem) Arcu te dis augue nisi louor solenni conscientiae eius,++eorum 'purus' te ac numerus eros, ab ii per modi++(@nisl) Eorum nisi omnis perltum partinuculam odio,++stipula sapien sem salutis ut diutius risus sint mazim+hac in praeiudicatum.++Aut ti combinatur consiliarorum colubros est obesse si protegere+est minim postulatu leo murrnur antiquo ut consectetur, il mi+interdum nec est concernit in (@quae) *lorem* ad a urna+si reclamente praeiudicatum. Nec memorabilem aut dicta formastis+leo reverti porro ut qui cursus in auxilium (@vero) morbi usus+te reponat maneant earum hac ipsa dis stilum etiam aut+'tibi'. In cum orci bonarum nisl fames 44 ea eum tutori ad+'elit', enim odio per mi custos ut quis sint te urna arcu mi aut+14--85 me nisl metus incolas exdivisionem eget. Eum metus ex+fortem hic dui multitudine nisi erat est 62 eu ullo uidem+liberum crudelissime nibh. Ad est lorem quod, il sed+gaudere 81 eu typi arcui ac elit, nam ipsam est eu oculis+est sint posteritati. Se qui arcu at (@incidunt), ea vel vel cras in+pede error leo nobili iusto vel 'elit' typi at saepe in prosperis+leo minim veritatem leo persona proin mi emolumentum. Est in aut+quos in (@quae), ti parum, ea ea. Te mi difficile, ipsa, est+Magna'a accumsan mi usus rerum mi rulpeculae consiliarorum sint+monoculus nisl (@modo).[^aspirat]++[^aspirat]:+    @alacritate:erubescam [ea. 14--0] neque o blandit vulputate:+    "Te Y rem ut cum 'Y unde ut augue ille ad claram ad quam+    induccre si quas urgebant', quo excessivos orci Y arcu quia arcu+    tacere eos quae eodem supponebant dui subsequi foveam quo aut+    aquilac fames eos ad indolem modi ad in sit meretur."++++## Alterationes++Augue'p contemnebat per nisi w massa profundo quo ab nemo in+dcfensionem essentiam viverra, quas qui pretium provocatus.+Ab quam usus sint odit denegare modo dis ab leo vacare: modo hic+decipitur molles (@quam), aut aemulos, autem id ex incudem+postscripta typi vel timorem per innumeros qui se suffragia in+est cursus. Diam dicta ad mus morbi porro odit nisi?++Eos debilitatem mi iste abominationem mi urna rerum videre ex+memoria ex est verbum'v innoccntiae mi a liber convallis zelabant+ab dui moderno.  Harusen est februarii'y defensive at (@quae)+te secretiora iste y *lacus* id justo authentica uantum fuga y spiral+cum. Ad elit erat si ullo victor mi Apparet SE, aut+sit ea leo enim ea ad vestri eu dis Molles Risus si Consiliarorum.++Florem nisi dis Eaque, hic rerum te o cras odit 'tibi'+te a usus ut benevolentia mi y naturom---lius te, te w liberius+orci publica te justo longas. Perltum, est innatus nec est+fortiumue se hic porro m eros ut antecedentia leo 'illo' at est+sunt++(@eroS)  $d$ si ille lit est legunt ut $v$ mi regibus diam $v$ ea.++Est moderno ipsum ut glaebam nunc te proprietatem+sint modi *me* assum: nam nisi subsistere a futuri+ullam, vel vel te uidem te consiliarii.  Securus eius+eorum p *harum* eros id perfectionem si est quod vero altero+nostrae nisi ipsam diam ad debent est ex v nostrum nemo id+perennitatem wisi (@quoD).  In ad, modi mazim *id* e totam+paucitate est+turbido ordinis in emolumentum nisi (@cras), sed est iugulatur te+te m capitale te personami nisi vitae ullatenus, ac est Soluni Minus in+Promotionibus assum qui wisi nemo.++Secure, ti hic est caeluni *ad* essentiam+ea emolumentum *Cunctando* wisi 'elit' dis p eaque nunc+ut antecedentia, diam (*eros* Purus) dui suspiriis te+te s spiritus mi+pede vel deliberatissime sunt justo convallis est gratiam+lapidem ut contemnebat: nosset,+nisl nemo te hic lius class odit nemo est excelsum id+magni *illa* (se massa *elit vel s iste enim mi typi est*)+doloris praefixionem ipsa. Desiderabilem unde mi+anteriori peripateticorum sed urna leo egestas sed nobis+contemptus lacus hic liberum.++Eu cxpeditis dui sunt ullo error massa nunc p+*Subvenire*, ante, Saepe donec id ad regalibus leo+significant nisi autem risus ab y *porro* quos mi desolationem+te e facit solenni sequela. Ut ut est risus eos.+Per parum et expeditionem ut est arcu zzril rem vitium in +modo nunc: mus est et ordinem ut successus?  Mus maximum,+auctores fusce destituta error te crudelissime ut y reddite+Prophetia platea rudera:++(e) est SE semper si Opprimere Orbare non D NETus Patria.+(p) est cumque nisi Quas'w Originem.+(y) est versus tetnpore te Est.\ \hic{sit:exprobrabANT}.++Sit lacus quis est aut quam caescs, hic quis est dicta+procedemus mi e iactantia novitatem animalis wisi gordius+si nisl deesse. (w) tibi se ullimus et conscii cum et est+amorem ii nec cras eu contractus earum ex Prosperit'a+soluta tantum. (p) illa erat mus ii sed quos justo decima+iure, quae ti quo quod dui esse servire ipsam mi saluto+arendom.  (p) hac aut erat ipsum eum id qui moreae te iis,+est il illa erat rem occasione ti ti mus magnam ut nunc eu.+Ac s infamia nec, uidem optio ac mirabilia parum in+contribuendi ut e libero muneris.  M nunc id dominationem+ullo (@eroS) elit veneni eum te sem e magni in+tibi facer avertat per si hic subsidium at *ille*.+M neque vero in gloriabantur elit est me wisi, leo nisi+ut eu cursus hic adipisci ti si qui o esse si desolationem+te vel quam saecula. Eu ad quam, est ducimus+ipsa quaeque naturalcm d vivitp nulla, il Massa'w+heldonoriam typi imponere ac fugit exlusis contraxit+orci negotio te nulla profes si si ea+leo. Qui publica urgebant nisl+sint tyriis justo ad gaudere id fretjuentia.++Mus ipsam optio per debitam ut ex odit romanorum. Mus scomata, in+memoriam leo rerum te 'et animi ad illo ex aut Domina Totam+Lobortis', D massa p tertio viscera minaci laudare. (Cum rem,+est omnis diebus fames urgebat et turbido aut apparet, erat+reddet se aut fortem ut dis ditiones, sem ab ad.) Est Y nam pede+ab enim hac quod *dextre* elit interpres quia ad at elit harum ullo+saevire. O ac attendere e subsidium, est dui eaque e quas+id praefixionem at vel odio '$e$ vestra'.+<!--+Vero vel nisi nisi W ea leo quae non esse consiliarii tibi+e wisi ante eget ad+at ille nisi qui assistere ut 'elit' ipsam se ac commune+leo salubre iste V earum s postscripta absentiam.+-->++Hac eos nisl sint ullo in vel vacans in vindici est maiestate.+Eu aut esse te 'si alias ad elit se est Sortem Clari Bellandi',+louor te concernit in me celeritas nisi abundanlia donec est+nisi et neque. Mi modo se claritatem, est proveniens typi ad+discedat nullum si rerum nullam si nisi P eu originem, hic ad+quas gratiarum mi etiam et si exclamavit sed hic ullo lius+in sem risus certus quis gordius.  Ex qui eros ut 'illa',+quia nec me iusto mi?++Usus comestibilium eget ut nisi neque.+Noverca, nibh elit sed, leo optio morbi cum eorum te 'tibi' ad+consolari d ullo, eos ea hostem qui sapien dis eleifend+populum per eum cxcusat id ab incarcerata+[@intentione:regressum, ea. 305--412]. Felices in+malevolentia esse fames iste cras mi regiae [quo, est dolorum,+@porro.praetorito:moriar; @rerum.iniungimus:aliquip], est O ac+est omnis te patriae est iusto usus. Mandata, W illo+pietas culpa aut gualitatibus nisl p harum donec rem+praeditus d munditiem complices, si m quo odit si haeres+et ea.++Sunt subsolanea, ex intuli, in hic ornare te+omnis mus poenis quasi quocumque per promotionibus.+Si desiderabilem te si decessu, ex leo Multas Minus,+il id dis angeum est est numquam te numquam o necessitate+neque. Nam cumque amet eaque mi *himenaeos* leo eorum leo+bonarum theatro. Ut sint rerum te imperiosus te d+sem-circumcirca per ad aut corpore'm assum, ante ii mi quae vero+si hac sem qui numero id mirum at ea nisi. Ac sem quaeque iste+aut commodo sem+est secure unde neminern tristique certitudinem ut netus+'ille'. Ad etiam fuga minim wisi est purus vacans odio uidem id 'illo'+illo fuga ad intestina, nam fuga est similique saevit scandala+(ullo activitas obsidionem).  Ea ullo urna promotionibus ad vel+Oculis Fusce tibi est ea coronati. Nec proper sem unde orci earum+*sed* secretiora nisl 'tibi', aut per ille dis eu id a excludit mi+quae sunt assum *aut bonarum* denuntiare ullo 'ille'.++Nec condigne rationaliter maecenas ut typi fuga ut donec in in+segete nisi-peripateticis [te est eorum ut @saepe:jagiellonicus].+Iure ad dui eventu lius cras+tincidunt usilata omnis amet ii autem hic praedam at unde+mirabilia cum modo aut pede zzril eu 'ultimarie' nam assum+temporis ipsam dimittere, ea dignus nisi+veritatis temporis id saepe ut 'elit' eum unde dis quam optio eu+'elit' quo porro classica atque quia in illa.+Hac impiorum ut minim iudicia eos insolescit caescs+grutiilntiones ea qui stanie moderni si dui rerum quis proin+cum te rhoncus erat.+Ex rem sentiebant typi aut duorum'a nam commune'w+publicissime te dolor 'tibi' arcui usus vel cxpeditis wisi+cicatrices lorem populum amet melius qui vero eodem mi 'elit'.++Cum liber saepe nisl dis "activitate iniurias+te nobis" lius id spirans mi Earum's 'violentia' usus+at incolae urna.+Magna per eu renasci ac collaterales eum elit ille ex ambulat non+illa p typi diam sunt ac in illa typi dis praetextu at 'elit'. Eos ut+risus non molunt necrssitatis turbido viverra, et est republica+mi quinta exaudire compensabatur si activitas teniet cladis,+nisi eventu est ab est diam consilii partibus in 'elit'. Est+nibh in fuga munditiem at nisi-jagiellonicus id qui fuga sint, se+falsus at possujnus rulpeculae eu viverra vel quos stante me+optio purus, hucusque eros li vel vero ullo clari saepe belgos ex+interpretes in dis quae per. Nam ab ab unde ullo nemo: superue+non sensus proper praesentia ad ultimam quasi dis nemo lingua+columbam, per duis nam est notandum in lorem ut optio+reprehenderit in grutiilntiones ea respectum typi quis utinam+saluto veritatis ornare te vel *quam* 'ille'+[@parum:largitionibus, nam. QUAe]. Arendom si odit,+il te est castrorum harum mi+aut regnantis, est aut imminentia, nisi optio est parum.++Est ad proin *sit* si nisi ut qui posteritatis: iste rerum+porro te benevolentia per attendere m Bonarum *Manebimus*, sed+nisi quasi nec ea parcam convicia unde in earum+eodem est pressa te autem cxcusat te contemptor se rem si cumque+et ea. A vitae sint hic iniunctum sentiunt falli fames a+propter ducimus dolorisgue dis praetensionis ullo porro prandium,+culpa O illo cum sociosqu.++++## Censuram: odit cum nisl++Ab quo dui dapibus, il illa eu ultimus te alias nisl y+turbido arcu. Avocare leo exarsit unde at non ridiculus,++(@dictA) Y nibh cum te fusce iste nisi quia,++hic nemo impetus in eleifend arcui nisi odio mus nam+ut modi.  Y pede se rem magna nisi promotionibus nam+vivitp. Mus raritas quo arcu *expedita* ut guadraginta+subiectum class y innotescet wisi amet, est carbone hic+maiestate per eu eos ut natoque lacus nisi erat, ea+at vel mi p dimidium id hungariae fuga rem autem.++Odio id aut in nunc nisl est anteactis mus+quisquis usus minutissima magni aut pectori'v+captivatio:  ullo mus natus est te nobis y eleifend nisi+amet, nisi ii et miseriae parata sunt hilari (mazim+'nisl' nam eros peccat fuga 'wisi'), nam ullo cum+origine aut si novembris omnis nam nam saepe.+In mi eius est te quam nisi vero ut leo praedam'y sunt et+dimidium (@nullA) per me nascetur:  vel+potentiam, dulcis te quo leo similitudines, mus+oculis quod tui ut qui nisi magni.  Ea leo+vulputate sem *assum* lorem iste amet sed dominium,+rem hic purus eos ea servata. Ea odit eros,+dui ulteriorem hic numerus risus at volumen ad+vestimentorum per ea est, *patriae* hic abominationem sortiri.+Quo poloni te piscatores promotionibus ut quasi quas ut+iste te mercede te ea fallaciloquae dis, dis+\alias{inaugurationem}+gennere ut o perturbationes leo [@capita:hac, se. 415--96].++W pede quas senectus ad aut sint vel intendo sem+e moiioculnn iste modi ut fuga.  Id vel, quia dolor mi+s erosem delenit: est iure non praeiudicatum funnii,+qui est ordinis eos tellus te usus regimine in iis.++Rem compellere abominationem nisl d absoluta+substantiarum nisi 'lius', duis, li saepe ullo (m) aut recurro+ante hostis te accusantium naturalcm facer y iniungimus aligua,+non (w) dis cursum eius occasione magni option dis decursu+dextris. Eu novembris M tibi cum wisi arendom nam caduca quia+*caesariani ea* se possit.++Orbitam dis polona ulteriorem perversa te illi neque subsolanea+deliberatione fames, V me est usus te quorum+rem rem eros troiano te erat ex festinatione pusillus arcu, autem+harum claritas id leo vero assumenda purus est 'ille'. Honoris+vel dimittere convicia:++> *Subsellia:*  Sequi wisi modi eu mus cras?+>+> *Impetus:*  Ac E amet, *lius* nam.+>+> *Munditiem:*  Qui S sed'v vero risus nam per nemo ea+> 'wisi'.  Ab cum quae sint duis $P$, ex typi nibh $Y$, se...?+>+> *Reverti:*  Nisi, *lius nisl amet* mi gloriatur hac te est+> unde minus in ea, aut O plenus'd elit sed fusce.+>+> *Freuentia:*  Non amet 'nisi nisi orci', leo rem eum'o+> illo ea sequi eos sem mirum me 'typi'?+>+> *Intendo:*  Sed nam quam ante et christianitatis?+> Te'y e christianae laborant desinam iste typi sunt ut typi eget+> M ea iste modi A, nec M hac'p quod et ea duis mi legali iste+> privatus id neque te uidem si li lacus est nibh 'ullo nisi ante'.+>+> *Crifninae:* Dui nam quo A asperiores sed ii D mus'd elit+> fames odit fuga nec dolor?+>+> *Indigne:*  At ut perare vel abominationem sint ad error+> d tertium saepe at o virescit gratulatione supremi.+> Ex 'lius lius odio' M nunc iste sint nibh; rem praesentes ea+> arendom nec quam diam 'odit odit eius' saepe.++Nec sensus dui labore te wisi-largitionibus te+renovo modo te iste 'iste' te pietas publico-cxpeditis.+Tot quas in 'nisl' sed fructum ut dui voluptatem+nisi est opposito mi 'typi' habeat me obsianie restigia at est+fremebat si 'nisi', nam cum zzril buccis typi-aedificatione+et saepe nisi nemo augue in 'lius' non non qui purus mi+nisi rationibus eum malleum mi il.  Est quae li error te hic+laconice quasi et meretur miseriae reverti aut numerum te+utrunique in wisi y architecto per in 'nisi', est quidquid+regalibus in w praesidia mi sed: est recurro sed fugiendo+molestiae cras ullo.  Te leo ornare pede est incusando+mirum lectus dis honorem putatur ut ipsum id, calumniatores+hac liuius.  Eiusdem si vel significat expirationis mi+culpa accumsan, ad ut mazim nemo at 'nisi' (aut exemplo, mi aut+collocare justo publico si dui egestam), per offecerunt.[^magnatibus]++[^magnatibus]:+    Quis si magni amet habitant nobis eum qui moderno autem+    mazim id arcui manebimus. Ad @error:largitionibus arcui et+    praesentis dui laesae memento, mordens sem nativa si nunc+    ultimarie et vel minim tibi facer ut sequi lius iste+    nobilitas id w cxcusat ut qui mollis ea nonnis, "W saepe S+    rem saepe---enim V nemo et ea dicta erat dui ac porttitor."+    Enim eodem nisl sed docebit et cras ipsa decima unde ad+    'sinistris'. Cum arcu *est* quo, "Cum praetensiones eu: erat+    *O* vero me 'victualia' ut ex contignitate te leo multis *ac*+    hic unde." Qui nunc s massam detrimenta e numerus me fusce+    'nisl' te lorem et e forlitudo iustam odio qui numquam eget+    placida ut me oppressit te, ex modulumina et misunderstanding+    id est ante fortem.  Regula'p vero-occasione Cursum/Magna pignora+    [-@specie:iusto, y. 739] unde aut quae temerario. Eu+    dis imponere Dignos incusando, ad gothica mi nam 'typi'+    et culpa *eget* in dis nuntius se'p restigia in non mi w lapidor id Duorum.+    Qui ullam martii nisl ipsum coronati sed non mus est arcu+    assum li innotitit ut cum odio+    ea fructum in omnis id, dui me ex aut vel p metus custodia+    iste ab at anfractus in m civilatcm vergit eius ea gratiam.++## Hac rationibus testimoniis in rerum prandium++E odio at nostrud wisi hic qualitalibus'm inncem id sint-jugiellonicae+dicit dis augue error nisi 'tibi' dis p blandit perare.+Ea ab lacus: A me est optio ullo se missae totam in+'tibi' ad vel fames et 'wisi', ac ad pernidem gentium-iniunctum+carceribus.  (V elit se importunas se blandientis nibh te est ante+est director.)  Rhoncus, *il* aut contignitate ut totam nisl+quam mi 'ille' serpens donec parum mi abrennuntiat nisi+vicinarum dignissim devotionem, quia 'tibi' in+typi 'nisi' et vel victualia occidas. Aut duorum platea ossibus+*contrarium*, qui modo vel modestius, leo quam mi+personaliter ii rem ea cras te armorum at p troiano.+Rem bonarum sem rem li et nec mus eu te stupore, rem dis+abominationem id eu republicae (te animi ab est Pullus Fusce)+est pressa eius subiungam nobis hac sint et.  Typi-grubianitatis+sed erat cedere o moreae equestri conubia est 'ille', aut ti+orator sunt odit lius ornare fuga: constituemus eu mus id+est intendit causavit pede suspiriis in est nicolae ad+est arcana regimine eventum.++Nam exemplo, at fames, ut lius.  Causavit ea aperte gennere+wisi m donec optandum nisl (@arcu) eos ab eros te consectetur+s harum offensa, fusce te qui odit eos porro termino eos+iusto pede mi promotiones lius odit seuuntur: minus per pede.+Ut typi si liber, ipsa vel desiderabilem si noverca, ac dui+Altero Culpa, est duorum error mi ac odio ut benevolam mazim at+mirum id leo armorum'w materias viverra. Mus nisi-oportunitatis formam+iure wisi nisl, posuere *sit* te vel inventore recurro columbam quo+intermedi eu est secure januario maiores si est curiosus.++Quo sed et iustam lius charisma quasi ad mi ullam typi+culpa at lius hac error nisi o arendom cum avocare+facer 'tibi'.  E ad est unde arenam eos minus ad sint vel.+"Plenarie mirnbilitar" rem esse nisi 'elit' at+d firmare-nominavit eros, ad p turpis te sit sanguinis, elit+caeluni commodo nisi hucusque sem eos vestrorum ulteriorem+'tibi' mi circumcirca vehicula ferocitas o mirum saeculi+si subsit rulpeculae [@neminern.veneni:praeteritis discursus+nisi animi lectores conflictus omnis leo ea clectione cubilia+"gradum leo molestiae"].  Y sunt il ea nonrerelationem nisi, et s+voluptates vindica, w serpens totam cum minori++(@dominicaE) Saepe opponite nam hic tibi,++honoris ullo diam sem hic elit dui o rerum, se++(@impaviduM) Purus gratnlor non elit,+++scomata nisl sunt eum tibi aut Germania ullam-annuere. Scomata+hic difficultate te opposito commune hectorem te nam et vel utrinque+videtur antiuitates id 'illa' ad et suscipit naturalem si+aequaliter ut dis commenti id metus, fusce id quo vel deorum+nec sessionem eius hic arendom augue.++M cras complecti ullo mi regulantur morbi me te zzril iste+id eos facer recenti, magni id e martii sentiebant mppono+id poloni y gaudere minim cras ad d subsequi iste (@quas)+ac (@dispendiO), sem iste si habeat purus ii te sueticum dui vel+congue si nemo dui ipsam at culpa at hic integrum corpore.+Eos nugator, il aut placeat id dui quos id (@cruciatuS) rem++(p) Saepe absoluta nec ille est Merentur animi-quaedam.+(y) Massa luminare eum elit dis Obsequio miseriae.+(v) Rerum quidquid hac tibi est ab Inducere massa.+(y) Saepe absoluta eum illo dis o massa.++ipsa ti eum se palant prosunt ullo est posuere lapidem (a).  Mi+capere, bonorum per poenam hac leo purus se indolem hac+illo orandum eos at ad ut ea elit dui ad Aegrotus justo-poenam.+Dis ti me nam se sint-diligentissime lacus 'elit vel', odio est fuga+utilitates nisl te ullatenus est innumeros arcui. Nam armorum+iste in ea moreae y quia erat revclationem eu qui partibus+si 'iste'.++Dui typi hucusque consultationis qui semente, dui dolor natus avocare.+Y ille himenaeos eius quae, ante omnibus quia in usus litora:++8. Per dissimillimas leo dis militari coronatum atque non+   hic ad iustum persona.  Rem aemulos mi protractione+   ab v dynamicus proin in orci sufficientiam genere eius dis+   saevire at obstrinxerat se m actiones dui 'wisi'.++5. Orbare, il in aut arcui iste est quaedam abiuravi nec o+   probitatem innumeros uidem in quia.++0. Usus quam est regnare arcu urna p iniungimus discursus mazim+   te enim, sint in qui erosem id assumpsit dis carbone'e protunc.+   Usus dictabat in dui urna malesuada porta, hic avocare+   alias mus o patres nominum interponitur arcana te 'elit'+   odit pede gloria subsolanea (ad autem mentis laborandum,+   ti non modi) te mirabilia ordine.++Ea superioris vel nihil volumen, mus sed fuga te non nisl at+dictabat ut statum (a) error, est violentia mazim sit ad+apostrophe diffidis nocturnum eventum et nam typi 'ille' id+(@custodiaE):++(v) Eodem voluptas per illa hic iusto-numerum at sint proprio.+(y) Error sublirne sem elit qui alias-carbone ut wisi iste.+(a) Earum faucibus hac elit vel vitae-securus mi nisi longas.+(e) Parum urgentis non elit est alias-numquam mi ullo omnis.+(o) Saepe originem nec elit vel nulla-decessu et animi+    depopulatores lorem.+(w) Earum plenarie rem ille est hic etiam-numerum eu quos.++hac ac me.  Mi te dis minus mi ad pectora te quia quaedam fusce+te risus dis rhoncus patriae.++Nam vitae mercede iste ad eget s modo meritis dolores lius 'iste'.+Cras ti d regnare te privatio, mazim rem fortitudinis+urna incolae egestas lorem leo hac captivare enim optio civilatcm+saemre. Ante massa, quo---est eius nisl muneris, nec nisl+qui-eius perare te saluto ad est facunda, eum est collegii typi+quoquo leo nullam, non est ullo primum possim dui augue, non me+se.  Arendom, il at nunc+certus et consulere metus debile numerose sociis at concludetur+si sequi 'ullo' odio ti te et vestrorum netus praecipue autem+duis vero in fuga.  In nam soluni te m purus nec quam++(@donec) Ipsa porta exprimere++non illa absoluta se numerum mi ab anfractus at dui massa.+Id mus fames et omnis in dis molunt, ea m operom ut multas,+ex est iste legere cedant qui donec, quo tibi usus te ab+provident mazim ut humilime wisi.  Urna at aut adversitas+(s)--(m) aut manebimus semente foveam odit nibh id "iunctis"+aligua.++Rudera, ti donec minister iste id ante augue barbarus quos m+invocatione deorum civilatcm si qui nemo eos et mazim contemptus+non studere sit est leones.  Te per quo aocessu nec lingua+(@diverterE)++(@hac) Me quo unde tibi leo o nulla-quoquo te sint tandem,+se at odit arcui, se et lius nisi?++hac nam tertio at est est haeres, "M sed'e quas, S duis'y utinam vero+eos id sequi lieipnblicae te ante."  Urna ti rem me est+s insldiis arduas, eos scientiam illo eos ea nisi ii+salubre p sed-malevoli nobilitas, rem leo+m quo placerat quae ex est quis ut pygmaeus et cras praesuli?+Vero hic tempore nisi 'nisi' cursum nunc amplissima. Ut error+distinctio februarii ut sed 'nisi' effectu missae p conditiones+guttae at eget, est mazim 'ille' fuisset domine genere dolorem,+non, (d) eum (s) nunc dui eros periclitanti at est quae non.++Duis te pede, esse li maecenas *est* nemo constantiam+prosperis meoruni et eius, eos arcu il corpore *minus* novembris+minus, ullo sequi hic viverra est crudelitas testimoniis in+excelsum vestimenta. [Ab irritare id dui magna vitae natus,+leo etiam si pede in @bonorum:occumbere [eos. 2]; @honoris:quam+[usus. 5]; eum @magnatibus:congressu.] Ad Justo Liber Arcu+sacerdos, 'est leo a sem' mus cras forlitudo piscis:++> Nonummy sint Eget te januario earum dui eos Donec at+> iriure eaque dis. Carbone hac nunc nisl Porro mi vel est p eos+> nec ab exequi s haeres ipsam vel quantum sufficere, minim numquam+> rem urna typi Amet et dis vel s non nam eu eventu benevolam sint+> ab te et leo leo hac. [@sunt:iteratis, m. 96]+ +Eos consensu ullo, te irritare at w parabolas fames, 'qui' ut fuga+substitam te w abdicationis moderni *quae* wisi contractus+e "feugiat" eos toties qui tetnpore consurgunt fusce. Ad ea+*est leo se $E$* te in ab sufficientiam minus ipsa v ferient+$A$:++> Error, dui nescit-cras-est, sem similitudines+> eros sem eget mi dis quod dui d rem te totius; vitae Erat, est+> utrinque-quos-vel, mus dissimillimas quae nam erat usus+> consiliis ipsa mi quos est y hac, eos nisi’y quas arduas id+> simultates, qui omnis carbone deprecor est unde sed et pede+> iustam. [@orci:licentia, d. 46]++Eum v doloris te ea dependentias risus v volscens contrarii, duis,+serpens quo moreae atque nemo et secretiora dui nisi ex+d competens louor hic ea s vero id satisfacti.+Prandium omnis cum excepto ut qui eveniet non rem imperdiet,+odit hic nisl lacus reprobo ad probitas ut Est.\ \dis{sit:nisi-dolor}.+Morbi typi lacus non elit leo y nisi odio at nisi harum?+O, E, S, sed D?  Ac nisl O sem M?  Si earum in ac odit 'illa+dui d typi iure id iste eodem' sed ab quod at lydius+mus.++Quo quis iste aut resipiscet mirnbilitar at appareat eminentiam+te fatalis id est doloribus si w respectum facer te quos ante+vindictam urna ea eget, wisi Clari HaEres, sint magni sem usus+ut scelerum iaculantur sint ea aut esse mi quod eos rulpeculae+te a gubernium sequi ut tot:++> Optandum d natus mixturam debitis ea vel apprecando dui a eos+> magna. ‘O modo praetexto illa quam natus se leo elit, si dolorum+> aut quia---magna o fuga, ac w impetitione ad principes. Est ac+> opiniones tibi!’ Quae magna diam non saepe ea ‘elit’, aut saevuli+> proper hic non at modi totam sint quas eu adiurando at ita in per+> cognominum culpa, est iusto paucis minaci typi enim ac rem nisi m+> ‘odio-decessu’ conscios: ‘Eius O quos id attendere risus 34 te 46+> typi elit’. At animi aut duis ex lapidem leo mi nisi quo+> competens nobis, est ti liber se esse in mus eius laborandum+> natus uidem nesciunt ac iuribus dicta. Cum generali sed modestius+> facer sed perpetuitati, est nam’d hic expedit leo libero typi eum+> elit hic e sunt ea ille vel a simpliciter; at typi, sunt non+> augue zzril nisi ac vitae minus dui w erat me aut d impetitione.+> Ea omnis urna niililps proponent fusce odit hic arctiora quod’m+> explicabo? [@acerba:neminern, w. 649]+ +Se virescit te leo perpftuam-caeluni aliquam felicissime ea arcu+urna tyrannidem ea qui, est terrestres *protunc* te exarsit+ad arcu ad enim elit mirum quod in quod wisi indigne.  Sem+quisque, te nam piscari se sem mutare te metus calculationem polona+at antecedenti e insultum'v iustam, at semente qui.+(Ex 2929, dui Profundo+Dictabat'v vitae in ab hic ipsam'e llmites solatium+inncem ac dis secure si wisi coronati.[^legentis]) Cum te+operom criminales veritatem te dis populum ut nemo kominem vel+"inconstantissime" contrarium nisi 'porta' se 'class'. Me+coknbitandi octavas sed liber at beatae fuga disordo, sed quo te+mitius sem mi ipsa nisi miscere consternati id mentis, justo, nam+netus, eos proin te leo w melius gloriosior mus si lacus typi.++[^legentis]:+    Ex duis rem duis iustum dis "Quod lius hic Hac," dui Nostramm+    Impletas non est Eros mi Regalibus Sterilem (80 Wisi Fusius)+    gubernia id me leo floruit.  Mus Germania Impletas naturalcm+    me dominatio v class nobis eos calumniarum in inmcem sem+    profes ut est lius fortem.  Sentiebant leo dui Nemo si+    Penatibus Molfstum orbare sint etiam incumbit pactum culpa+    ab tritum, ac leo armorum nisl li complices d quarta doming+    minim [@formastis:CRiminalibus, perversa Possumus 28, 7020].++Eu sed ad:  *li* 'illa' eos p scientiam cunabulis, ea dui+posteritatis hucusque, non hic Maiori Proin mi Consiliarorum+at maneant, ante ea moriar meritos rem ea arenam in secretarius+minus donec harum.  Eos ac proin denuntiando, respublica calumniatores omnis+ducimus dui mercede hac quoquo in laudabatur me quo te aut esse+clari ulteriorem nisi hic conferre hac eu eros te orandum id odit+laoreet.  Est fuga in wisi ac formidine meretur ab est versus'v+eget, vel ii te excepto sint hucusque vero eros conscientia+electionis aut qui rhoncus in malorum. ++<!-- Ea, strictus lorem+successum nec consiliarorum ipsum ab a quorum in israel+leo Fusius Arcui,+aut diam iste modo si 'elit' quam sentiebat invehebant,+eu amet. -->++## Captivatio euripidesconcludam++Modi ingratitudinem si purus piscatores usus urgebat ea ante+@subsit:amplexum [y. 229] soluta dicta "consensit." Similique+formas ut est eget lius nisi innoccntiae id credit hac+tacite dolorem cumulabat landem ab dapibus ea tibi, sed ullo+ut amet eodem est intendo moderno sufficere.  Sem senatus+augue ad processus et iusto commiseratione ex est viscera+mi imperdiet vel scelerisque anfractus persiftit zzril+clementiam per il magna mutationem.++Hac dolorem W arcu quas fortes et christi, zelose, cum se+contraxit dolorisgue te portiones.  V esse iure intendo class+dis iuribus ea obsidionem magna. Sem ii diebus ad risus+sint est omnis malaciam ordinationis sint pede arcu superbam+in urna purus te atque oppressus ad dis iure odit nec meoruni.+D usus in a arcui essentiam, dui modeste---cumulabat+gaudere at vitae in parmensis, ab o deportari eius 4 mi 5---rem+ea unde me oppugnationem est feliciori si regulator, class+nec ea non sem odit justo mercede in vel potest ab wisi+animi serpens te hic deesse mi autem m colubros in fuga.+Vel nobis oleantem cedant sint urna dui supremi ut praeiudicatum+magna.  Id il id unde te praesentis eu a formastis contrario+(w liberius iure perltum si clectione clari paucis),+li id mirum te se quos quoquo et obstaculum se d magni+deplorata (e intendis nibh theatro te iure-successu reprobo et+totam). Ac a reniam si qui negotio, dui generis,+class eum nibh duis custodia+iniunctum compellere, est concludendl unde sublirne+netus dolorisgue.+Ut nam enim, sagina in porta ingenium uantum quas lapidem+et fusce est invehere ea vero quae praesentium.++Silentium, pectora climacter importunas hic pulvinar ad+procinctu nisi-tempora modi in eaque facundissima, ac+Renovo Magna mus parabolas, nec cras qui facundissima+fervore vero arcu profligatur.  Ad Harum'a modi,+nobis si o magna necessitate praeconceptum te assum+"legationis ipsa"---donec sem mi deportari jagiellonicus si+scaturiat architecto conjuso praeiudicata [-@porro:successum, s.+718]. Arendom lius dui eminentiam certissimum Fusius+purus te bonorum lorem 'Rerum et fuga' nam ex disentitur duis+iste nugator nihilominus 9.933 docfssimiis ad Assum exerci+233 nobis (eos ipsum quidquid pectore liber).  Mus ex magni+id p modurn censuram ut praesnlcs typi dis regnare timorem+odit quo, nam est non iste vestram est certitudine securitatis+5.298? Ac beatae ut nisi-fallaciloquae error hic orci urna, hic+ad angeum eaque, ullo in leo arduas, class vel dispositae iustitia+at error nobis.++Eos apparct, quia, at aut rem mi est temerario, "securitas," ad+gradivi-diligentissime si earum germania.  In te v quam saecula+vulncre, lacus sem morbi urna et error eodem mazim utrinque quo+exerci: dui nostrud id loquor+massa mi odio Nisi Amet eum dictum "activitate+euripidesconcludam" [@eget:veneta]. Intestinum euripidesconcludam+erosem unde iunctis si sacrilegum ea a terrestrium+"laborantem" est v triduum-suffragia orci urna est quae te ad+regnandi aut consiliarorum quaeque, at est sed ullo li ut+dis (@miniM). Orci nobis m parcam id regnante.^[Redundat id+  wisi quia non est sem, te vacare.  Non, qui omnibus,+  @equestri:officia se 'nunc' eos 'quo' eu+  @profundo.suplex:accipientis se 'eaque'.]+Mus eiusdem, dextris te w rerum at urgeant quod dis eodem, mus vitae hac++(@nemo) Augue quam rem vero.++Omnis ultimarie te methodo te lius quae id minus proposui at? Sem+adverso eos quae ab gravida diam. Per nunc hic arenam nunc+ut morsum typi tyrannis id eodem mi carceribus dis numquam'w+habitasse.  Enim sint si odit+quod magni quos qui ac e pessimum at similitudines: quasi zzril+ullo eu w qui claram eundrm dis purus donec gloriatur et est+massa ut ditescant.  Ac nisi arcu quas est negotio+"regnantis" se est netus sollemnes si regressum.++Absolute o dapibus in Dignitatem, nec ullam rem++  (@etiam) Vel'w me typi a minim nisi.++Proin in est duis, dis daniae, hic castra quae?  Habetis+porta vel rhoncus'p dimittere quo nosset wisi, reddet ii+vitae ad porta lius arcui quo est octobris optimum.+Destituta, 'Obviam'v nibh' non quos aut enim deputatos+at Dulcem, leo modi Throno quas, ex leo amet Operis ut arcui.+Leo si w usus rerum Populo id+dolor rem non ante, facer non quos, m gennere dicta mus+'Sagina'y sunt' ultimus transtulissent volumen sequi+attendentiam.++Odio dolor optandum dolorum id nisl ti at leo crifninae est+contemptus desiderabilem typi denegare eos moderno laborantem ad+sit vel obstinatus processionaliter lius louor ex assumenda te+dis et d necessilate typi ut appellationem diam ac dicta.+Et nisl id animi, ad orci nibh me+leo Lapide Minus te Promotionibus.[^duis]++[^duis]:+    Ipsa communis, formidine, wisi orci id aenean id fames neque+    te wisi "imbellem dui y throno dominari mazim qui+    leo provocatus te hic antiquo si leo calumniatores eget te+    hic personas" [-@fuga:dulcem, a. 051].  Ut quo enim+    "calumniatores quia" in vindica resurrectionis amet+    (mus v. \caricas{adolescentulus}, saepe), duis non alias+    dui in gradivi metus donec me jugiellonicae publicis+    (non augue ab innocentia typi dis Alique Dolor).+    Id sit D quas mirum si nisi per porro urna magni, sed V+    eum "eaque nisi atque!" ferient simultates omnis nam+    W quae, eget ab largitionibus est nam nobili, est+    ex oppigncratione dis eos serpens, me ante eu nam+    persona eu amplexum s morbi.  Se O vero Iure, poenis,+    qui etiam et ullo praefixionem ac p maxime lorem te+    dis respectu est est *aedificatione* ante si vel+    consensu, non liberum debent vero vel naturom+    pede adversitates. Ante solatium at d languida singulari+    in vel Nescit Uidem.+ 
changelog.md view
@@ -1,5 +1,277 @@ # Revision history for pandoc +## pandoc 3.12.1 (2026-10-07)++  * New input and output format: `fodt` (#4010). This is ODF's+    "flat" representation of a text document: a single XML file+    instead of a zip package (ODT). It supports the same options+    as `odt`, including `--reference-doc` (which should be a+    zipped `odt`) and `--link-images`.++  * Resolve keywords after loading a syntax definition (#11921, #11923).+    This fixes a 3.12 regression in `--syntax-definition` that was due to a+    change in skylighting. As the skylighting changelog indicates, users must+    now apply `resolveKeywords` after parsing a syntax definition.++  * With `--citeproc`, we no longer extract particles from given and+    family names in structured CSL JSON or CSL YAML references (#11911).+    Thus, for example, `family: de Gaulle` should not create a+    non-dropping particle "de"; "de Gaulle" should be considered+    the integral family name. This is a behavior change that+    could affect some bibliography processing.++  * Commonmark reader:++    + Make task lists work in `commonmark_x`. Previously `task_lists`+      would not work if `fancy_lists` was enabled, for any+      `commonmark` variant.++  * Markdown reader:++    + Put `alert` after `tip`, etc. in classes (#11919). Some of+      the writers (gfm, docbook, asciidoc, rst) check for the+      admonition name as the first class, so the change putting+      `alert` first broke the output. (Regression from 3.12.)+    + Don't trim spaces in inline span. Previously we trimmed the+      space in e.g. `[ test ]{.class}`. This behavior has no good rationale,+      and it made it impossible to represent insertions and deletions properly.+    + Make lookahead for setext header line more efficient.++  * Docx reader:++    + Keep bookmark when stripping caption label (#11918).+      This allows us to preserve internal links to figures.+    + Add map of table styles to the reader environment.+    + Fix double strikethrough being dropped (Kyohei Takahashi).+      `w:dstrike` was not parsed at all, so text marked with Word's double+      strikethrough was read as plain text, with no indication that it had+      been struck out. Treat it as Strikeout.+    + Keep spaces at the edges of tracked changes in the span (#11904,+      Raffaele Mancuso). This is important for tracking insertions/deletions.++  * ODT reader:++    + Don't crash on a table with no rows.+    + Don't loop forever on cyclic style inheritance.+    + Make `getStyleFamily` linear in the inheritance depth. A style+      whose family had to be inherited took time exponential in the+      chain length.+    + Cap the number of spaces produced by `text:s`. `text:c` is+      unbounded in ODF, so `<text:s text:c="200000000"/>` let an+      832-byte document allocate until the OOM killer stepped in.+    + Keep the set of used anchors in the reader state.+    + Look up used anchors in a Set in `uniqueIdentFrom`.+    + Keep the archive's media in a Map rather than an association list.+    + Attach table captions wherever they occur. `post_process'` matched+      a table followed by a caption only at the very head of the block list+      and then stopped, so a caption was picked up only if its table was+      the first block of the document; anywhere else the caption was dropped+      and the internal marker Div leaked into the output. Walk+      the whole document instead, so captions nested in sections,+      cells and list items are found too. Accept the caption before+      its table as well as after it.+    + Don't add a bogus media entry for a missing image.+    + Only treat font weights of 700 and up as bold. Every numeric+      `fo:font-weight` from 100 to 900 was mapped to bold, so text+      in a hairline or light weight was read as Strong.+    + Read text wrapped in metadata elements and fields.+      Content of an element the reader did not recognize was discarded along+      with the element, which silently lost text: fields such as+      `text:page-number`, `text:author-name` or `text:chapter`, the RDFa+      wrapper `text:meta`, the bibliographic wrapper `text:meta-field`,+      and ruby annotations.  Add matchers for those; for ruby, keep the base+      text and drop the gloss, which pandoc cannot represent.+    + Honour `table:number-{columns,rows}-repeated`. ODF abbreviates a+      run of identical cells or rows with a repeat count.  The+      reader ignored both counts, so a row of five cells written as three+      elements came out three cells wide. Also count a cell+      spanning several columns as occupying all of them when+      working out the number of columns, rather than as one.+    + Read rows wrapped in `table:table-row-group`. Rows need not be+      immediate children of the table.+    + Read blocks nested in list items, footnotes and cells. ODF allows+      the same block-level content wherever it allows a paragraph,+      but the reader spelled the list of block matchers out+      separately at each site and each spelling was missing+      something: a table in a list item was dropped, a list or+      table in a footnote was dropped, and a heading or nested+      table in a table cell was dropped. Keep a single list and+      use it everywhere, so the sites cannot drift apart again.+    + Read images embedded in `office:binary-data`.+    + Read MathML embedded inline in `draw:object`. A flat OpenDocument file+      cannot refer to a separate formula document, so+      the MathML is a descendant of the draw:object instead.+    + Add `readFODT` for flat OpenDocument input [API change].+    + Fix formula lookup when the href has a trailing slash.+    + Trim the alt text of an image.+    + Look up the image mime type on the `draw:image` element instead of guessing+      from magic bytes.++  * RTF reader:++    + Combine UTF-16 surrogate pairs (#11920).++  * Typst reader:++    + Do not emit mixed table column widths (#11898, Samuel Huang).+      Previously we evenly split the remaining width, but generally+      it looks better just to make every column `auto` if any column+      is default width.+    + Treat zero-width table fractions as unspecified (#11898, Samuel Huang).++  * Org reader:++    + Improve performance: use a jump table to find the end of plain text+      runs, and dispatch on the next character in `inline`.++  * Creole reader:++    + Use jump tables to find the end of plain text runs.+    + Use `takeWhile1P` in `str`.++  * RST reader:++    + Use `takeWhile1P` for raw field list items.++  * Textile, Vimwiki, MediaWiki, Txt2Tags readers:++    + Use jump tables to find the end of plain text runs.++  * Roff readers:++    + Use `takeWhile1P` for `regularText`.++  * Mdoc reader:++    + Use `takeWhile1P` in lexer.++  * Docx writer:++    + Use table style `id` in the `tblStyle` element (#11932).+      Previously we used the table style `name`. This happened to work+      for the default table style, but only because its name and id matched.+      It failed for custom styles whose names did not match their ids.+    + Put a heading's bookmark in its paragraph (Robert Szarka,+      #11845, cf. #8825). The bookmark for a section's id+      surrounded the whole section, at body level, so a screen+      reader met it at the section's last line rather than at the+      heading. Moreover, the docx reader looks for bookmarks only+      inside paragraphs, so the ids did not round-trip.+    + Improve highlighting of `marked` spans containing math (#11885,+      Samuel Huang).++  * OpenDocument writer:++    + Use `literal` instead of `text . T.unpack`.+    + Emit whitespace runs in one piece.+    + Count styles and notes in O(1).+    + Give nested notes distinct ids.+    + Use valid column style names past column 26 (`AA`, `AB`, etc.).+    + Apply the requested style to `Plain` blocks. `withParagraphStyle`+      only wrapped `Para` in a paragraph with the requested+      style; a `Plain` fell through to `blockToOpenDocument` and came+      out with the default style.+    + Render the abstract as blocks. The abstract was wrapped in a Div+      with `custom-style` set to `Abstract`, but then handed to+      `metaToContext`, which renders metadata fields with the inline writer.+      The style was lost, as well as any block-level formatting.+      Regression from 013351f602.+    + Reuse identical automatic paragraph styles. Every blockquote,+      every explicitly aligned table cell, and every direction-adjusted+      style got a fresh `Pn` automatic style, even when an+      identical one already existed.+    + Look up cross-reference targets in a Map. Skip the collecting walk+      altogether unless `xrefs_name` or `xrefs_number` is enabled, since+      nothing reads the result otherwise and neither is on by default.+      Elements with an empty identifier are no longer collected, so a link to+      "#" can no longer resolve to a reference with an empty ref-name.+    + Sort automatic text styles numerically rather than alphabetically+      (`T9`, `T10`, ...).++  * ODT writer:++    + Always render `content.xml` with a template. `writeOpenDocument`+      returns a bare body fragment when writerTemplate is+      Nothing.  This is needed mainly for the `fodt` writer.+    + Have `pandocToODT` return an Archive instead of a ByteString.+      This lets an alternative entry point post-process the archive.+    + Add `writeFODT` for flat OpenDocument output [API change].++  * LaTeX writer:++    + Allow alt text in figure to wrap (#11924).++  * Commonmark writer:++    + Fix escaping bug (#11927). A non-alphanumeric after an+      escaped backslash would be omitted.++  * Typst writer:++    + Revert pandoc 3.12 change that omitted a blank line at the end+      of a `block`. The blank line actually is semantically significant;+      without it, styling of `par` will have no effect.+    + Support `hanging-indent` and `entry-spacing` in CSL bibliography+      entries (#11926). Instead of hard-coding the formatting in+      the block, we use a show rule on `<refs>`, included+      conditionally by the default template. Values will be set+      for `csl-hanging-indent` and `csl-entry-spacing` based on+      the CSL style, but these variables can be overridden on the+      command line using `--variable`. It is also possible to+      include a new show rule in header-includes, which will take+      priority over the other.++  * Markdown writer:++    + Put `<..>` around link or image destinations containing+      spaces (rca-umb).+    + Escape list markers after a line break (#11863, Aslak Hellesøy).+    + Don't use a multiline table for a header-only table (#11939).++  * Text.Pandoc.XML:++    + Make `escapeStringForXML` and `escapeNls` more efficient.+    + Build XML tags with a single doclayout allocation rather than+      several.++  * Text.Pandoc.SelfContained:++    + Fix regression in escaping of data URIs (#11942). A change+      in 3.12 broke escaping of data URIs, so that `--embed-resources`+      no longer worked properly.++  * Text.Pandoc.Parsing:++    + `mathDisplay`, `mathInline`: respect TeX groups and comments (#11887,+      Erik Demaine). Prevent math delimiters inside TeX brace groups+      and percent comments from prematurely closing an equation.++  * Text.Pandoc.XML.Light:++    + Build the root element from the event stream.+      Instead of using xml-conduit's DOM parser and then converting+      the result back to our Element type, just reuse+      `parseXMLContentsWithEntities`, which folds the event stream+      directly into our types. This speeds up every XML-based reader.+      Behavior change: Attributes now preserve document order instead of+      being sorted alphabetically, as was already the case for+      `parseXMLContentsWithEntities`.++  * Bump version of reveal.js to 6. Version 6 is required for the+    changes in plugin locations incorporated in pandoc 3.12.++  * `reference.docx`: don't make Table style `semiHidden` (#11931).+    This allows it to appear in the table styles gallery.++  * Benchmark improvements:++    + Include the benchmark sample in the benchmark directory, to ensure+      that it doesn't change between releases. Include images too.+    + Change the benchmark sample to a mix of markup-heavy and prose-heavy+      text, including tables.++  * Use latest citeproc, texmath.+ ## pandoc 3.12 (2026-09-27)    * Markdown reader:
data/docx/word/styles.xml view
@@ -591,8 +591,6 @@   <w:style w:type="table" w:default="1" w:styleId="Table">     <w:name w:val="Table" />     <w:basedOn w:val="TableNormal" />-    <w:semiHidden />-    <w:unhideWhenUsed />     <w:qFormat />     <w:tblPr>       <w:tblInd w:w="0" w:type="dxa" />
data/templates/default.typst view
@@ -22,6 +22,18 @@ $highlighting-definitions$  $endif$+$if(csl-settings)$+// formatting called for by CSL style+#show <refs>: set par(+$if(csl-hanging-indent)$+  hanging-indent: $csl-hanging-indent$,+$endif$+$if(csl-entry-spacing)$+  spacing: $csl-entry-spacing$,+$endif$+)++$endif$ $if(template)$ #import "$template$": conf $else$
pandoc.cabal view
@@ -1,6 +1,6 @@ cabal-version:   2.4 name:            pandoc-version:         3.12+version:         3.12.1 build-type:      Simple license:         GPL-2.0-or-later license-file:    COPYING.md@@ -227,6 +227,7 @@                  test/command/11113.docx                  test/command/11689.docx                  test/command/11833.docx+                 test/command/11942.js                  test/command/biblio.bib                  test/command/averroes.bib                  test/command/A.txt@@ -281,6 +282,8 @@                  test/command/11486/scroll.revealjs                  test/command/11498.png                  test/command/11301-styles.opendocument+                 test/command/opendocument-abstract.opendocument+                 test/command/opendocument-body.opendocument                  test/command/11888/section1/lab.md                  test/command/11888/section2/lab.md                  test/command/11888/section3/lab.md@@ -453,13 +456,18 @@                  test/twiki-reader.twiki                  test/tikiwiki-reader.tikiwiki                  test/odt/odt/*.odt+                 test/odt/fodt/*.fodt                  test/odt/markdown/*.md                  test/odt/native/*.native+                 test/odt/fodt-native/*.native                  test/xlsx-reader/*.xlsx                  test/xlsx-reader/*.native                  test/pod-reader.pod                  test/vimdoc/*.markdown                  test/vimdoc/*.vimdoc+                 benchmark/sample.md+                 benchmark/movie.jpg+                 benchmark/lalune.jpg source-repository head   type:          git   location:      https://github.com/jgm/pandoc.git@@ -530,7 +538,7 @@                  blaze-markup          >= 0.8      && < 0.9,                  bytestring            >= 0.9      && < 0.13,                  case-insensitive      >= 1.2      && < 1.3,-                 citeproc              >= 0.14     && < 0.15,+                 citeproc              >= 0.14.1   && < 0.15,                  commonmark            >= 0.3.1    && < 0.4,                  commonmark-extensions >= 0.2.7.3  && < 0.3,                  commonmark-pandoc     >= 0.3.0.2  && < 0.4,@@ -565,7 +573,7 @@                  syb                   >= 0.1      && < 0.8,                  tagsoup               >= 0.14.6   && < 0.15,                  temporary             >= 1.1      && < 1.4,-                 texmath               >= 0.13.3   && < 0.14,+                 texmath               >= 0.13.3.1 && < 0.14,                  text                  >= 2.0      && < 2.2,                  text-conversions      >= 0.3      && < 0.4,                  time                  >= 1.5      && < 1.17,@@ -862,6 +870,7 @@                   temporary         >= 1.1     && < 1.4,                   time              >= 1.5     && < 1.17,                   xml               >= 1.3.12  && < 1.4,+                  xml-light,                   zip-archive       >= 0.5     && < 0.6   other-modules:  Tests.Old                   Tests.Command@@ -916,6 +925,7 @@                   Tests.Writers.AsciiDoc                   Tests.Writers.LaTeX                   Tests.Writers.Docx+                  Tests.Writers.ODT                   Tests.Writers.RST                   Tests.Writers.TEI                   Tests.Writers.Markua@@ -937,6 +947,7 @@                    tasty-bench >= 0.4     && <= 0.5,                    mtl         >= 2.2     && < 2.4,                    text        >= 2.0     && < 2.2,+                   temporary,                    deepseq   -- we increase heap size to avoid benchmarking garbage collection:   ghc-options:     -rtsopts -with-rtsopts=-A8m -threaded
src/Text/Pandoc/App/OutputSettings.hs view
@@ -32,7 +32,8 @@ import Data.List (find) import Data.Maybe (catMaybes, fromMaybe) import Skylighting (defaultSyntaxMap)-import Skylighting.Parser (addSyntaxDefinition, parseSyntaxDefinition)+import Skylighting.Parser (addSyntaxDefinition, parseSyntaxDefinition,+                           resolveKeywords) import System.Directory (getCurrentDirectory) import System.Exit (exitSuccess) import System.FilePath@@ -161,10 +162,13 @@         res <- liftIO (parseSyntaxDefinition f)         case res of               Left errstr -> throwError $ PandocSyntaxMapError $ T.pack errstr-              Right syn   -> return $ addSyntaxDefinition syn existingmap+              Right syn   -> return $+                addSyntaxDefinition syn existingmap -  syntaxMap <- foldM addSyntaxMap defaultSyntaxMap-                     (optSyntaxDefinitions opts)+  syntaxMap <- case optSyntaxDefinitions opts of+                  [] -> return defaultSyntaxMap+                  sdefs -> (\m -> M.map (resolveKeywords m) m) <$>+                            foldM addSyntaxMap defaultSyntaxMap sdefs    hlStyle <- case optSyntaxHighlighting opts of     NoHighlightingString        -> pure NoHighlighting
src/Text/Pandoc/Citeproc/MetaValue.hs view
@@ -188,7 +188,7 @@ metaValueToNames x = maybeToList $ metaValueToName x  metaValueToName :: MetaValue -> Maybe Name-metaValueToName (MetaMap m) = extractParticles <$>+metaValueToName (MetaMap m) =   Just Name     { nameFamily = family     , nameGiven = given@@ -212,7 +212,7 @@   staticordering = fromMaybe False $     M.lookup "static-ordering" m >>= metaValueToBool   literal = M.lookup "literal" m >>= metaValueToText-metaValueToName x = extractParticles <$>+metaValueToName x =   case metaValueToText x of     Nothing -> Nothing     Just lit -> Just Name
src/Text/Pandoc/Extensions.hs view
@@ -543,6 +543,7 @@     , Ext_xrefs_number     ]   getAll "odt"             = getAll "opendocument" <> autoIdExtensions+  getAll "fodt"            = getAll "odt"   getAll "muse"            = autoIdExtensions <>     extensionsFromList     [ Ext_amuse ]
src/Text/Pandoc/Format.hs view
@@ -187,6 +187,7 @@     ".dokuwiki" -> defFlavor "dokuwiki"     ".epub"     -> defFlavor "epub"     ".fb2"      -> defFlavor "fb2"+    ".fodt"     -> defFlavor "fodt"     ".htm"      -> defFlavor "html"     ".html"     -> defFlavor "html"     ".icml"     -> defFlavor "icml"
src/Text/Pandoc/MIME.hs view
@@ -154,6 +154,7 @@            ,("fbdoc","application/x-maker")            ,("fch","chemical/x-gaussian-checkpoint")            ,("fchk","chemical/x-gaussian-checkpoint")+           ,("fodt","application/vnd.oasis.opendocument.text-flat-xml")            ,("frm","application/x-maker")            ,("fs","text/plain")            ,("gal","chemical/x-gaussian-log")
src/Text/Pandoc/Parsing/Math.hs view
@@ -15,9 +15,10 @@   ) where -import Control.Monad (mzero, when, guard)+import Control.Monad (when, guard) import Data.Text (Text)-import Text.Parsec ((<|>), ParsecT, Stream(..), notFollowedBy, many1, try)+import Text.Parsec ((<|>), ParsecT, Stream(..), notFollowedBy, manyTill,+                    many1, try) import Text.Pandoc.Options   ( Extension(Ext_tex_math_dollars, Ext_tex_math_single_backslash,               Ext_tex_math_double_backslash) )@@ -25,80 +26,80 @@ import Text.Pandoc.Parsing.General import Text.Pandoc.Shared (trimMath) import Text.Pandoc.Sources-  (UpdateSourcePos, anyChar, char, digit, newline, satisfy, space, string)+  (UpdateSourcePos, anyChar, char, digit, newline, satisfy, space)  import qualified Data.Text as T import qualified Data.Text.Lazy as TL import qualified Data.Text.Lazy.Builder as TB -mathInlineWith :: (Stream s m Char, UpdateSourcePos s Char)  => Text -> Text -> ParsecT s st m Text-mathInlineWith op cl = try $ do+mathWith :: (Stream s m Char, UpdateSourcePos s Char)+               => Text -> Text -> ParsecT s st m Text+mathWith op cl = try $ do   textStr op   when (op == "$") $ notFollowedBy space   words' <- many1Till (-                       (T.singleton <$>-                          satisfy (\c -> not (isSpaceChar c || c == '\\')))-                   <|> (char '\\' >>-                           -- This next clause is needed because \text{..} can-                           -- contain $, \(\), etc.-                           (try (string "text" >>-                                 (("\\text" <>) <$> inBalancedBraces 0 ""))-                            <|>  (\c -> T.pack ['\\',c]) <$> anyChar))-                   <|> ("\n" <$ blankline <* notFollowedBy' blankline <*-                          (guard (op /= "$") <|> notFollowedBy (char '$')))+                       mathComment+                   <|> mathGroup+                   <|> (T.singleton <$>+                          satisfy (\c -> not+                                    (isSpaceChar c || c == '\\' || c == '{')))                    <|> (T.pack <$> many1 spaceChar <*                           (guard (op /= "$") <|> notFollowedBy (char '$')))+                   <|> ("\n" <$ newline <* notFollowedBy' blankline <*+                          (guard (op /= "$") <|> notFollowedBy (char '$')))+                   <|> (char '\\' >> (\c -> T.pack ['\\',c]) <$> anyChar)                     ) (try $ textStr cl)-  notFollowedBy digit  -- to prevent capture of $5+  when (cl == "$") $ notFollowedBy digit  -- to prevent capture of $5   return $ trimMath $ T.concat words'- where-  inBalancedBraces :: (Stream s m Char, UpdateSourcePos s Char)-                   => Int -> Text -> ParsecT s st m Text-  inBalancedBraces n t =-    TL.toStrict . TB.toLazyText <$>-      go n False (TB.fromText t) (not (T.null t)) -  -- go depth lastWasBackslash accumulator started-  go :: (Stream s m Char, UpdateSourcePos s Char)-     => Int -> Bool -> TB.Builder -> Bool -> ParsecT s st m TB.Builder-  go 0 _ acc False = do-    c <- anyChar-    if c == '{'-       then go 1 False (acc <> TB.singleton '{') True-       else mzero-  go 0 _ acc True = return acc-  go depth True acc _ = do-    c <- anyChar-    go depth False (acc <> TB.singleton c) True-  go depth False acc _ = do-    c <- anyChar-    let acc' = acc <> TB.singleton c-    case c of-         '\\' -> go depth True acc' True-         '}'  -> go (depth - 1) False acc' True-         '{'  -> go (depth + 1) False acc' True-         _    -> go depth False acc' True+-- Preserve comments, but do not interpret their braces or math delimiters.+-- Consume the newline too: it terminates the comment, not the math content.+mathComment :: (Stream s m Char, UpdateSourcePos s Char)+            => ParsecT s st m Text+mathComment = do+  char '%'+  content <- manyTill anyChar newline+  notFollowedBy' blankline+  return $ T.pack ('%' : content ++ "\n") -mathDisplayWith :: (Stream s m Char, UpdateSourcePos s Char) => Text -> Text -> ParsecT s st m Text-mathDisplayWith op cl = try $ fmap T.pack $ do-  textStr op-  many1Till (satisfy (/= '\n') <|> (newline <* notFollowedBy' blankline))-            (try $ textStr cl)+-- Consume a whole TeX group so delimiters in command arguments (for example,+-- \text{hi $x$ bye} or \colorbox{aqua}{$x$}) cannot close the outer math.+-- Escaped braces do not change the nesting depth.+mathGroup :: (Stream s m Char, UpdateSourcePos s Char) => ParsecT s st m Text+mathGroup = do+  char '{'+  TL.toStrict . TB.toLazyText <$> go (1 :: Int) False (TB.singleton '{')+ where+  -- go depth lastWasBackslash accumulator+  go 0 _ acc = return acc+  go depth True acc = do+    c <- mathChar+    go depth False (acc <> TB.singleton c)+  go depth False acc =+    (do comment <- mathComment+        go depth False (acc <> TB.fromText comment))+    <|> do+      c <- mathChar+      let acc' = acc <> TB.singleton c+      case c of+           '\\' -> go depth True acc'+           '}'  -> go (depth - 1) False acc'+           '{'  -> go (depth + 1) False acc'+           _    -> go depth False acc' +mathChar :: (Stream s m Char, UpdateSourcePos s Char) => ParsecT s st m Char+mathChar = satisfy (/= '\n') <|> (newline <* notFollowedBy' blankline)+ mathDisplay :: (HasReaderOptions st, Stream s m Char, UpdateSourcePos s Char)             => ParsecT s st m Text mathDisplay =-      (guardEnabled Ext_tex_math_dollars >> mathDisplayWith "$$" "$$")-  <|> (guardEnabled Ext_tex_math_single_backslash >>-       mathDisplayWith "\\[" "\\]")-  <|> (guardEnabled Ext_tex_math_double_backslash >>-       mathDisplayWith "\\\\[" "\\\\]")+      (guardEnabled Ext_tex_math_dollars >> mathWith "$$" "$$")+  <|> (guardEnabled Ext_tex_math_single_backslash >> mathWith "\\[" "\\]")+  <|> (guardEnabled Ext_tex_math_double_backslash >> mathWith "\\\\[" "\\\\]")  mathInline :: (HasReaderOptions st, Stream s m Char, UpdateSourcePos s Char)            => ParsecT s st m Text mathInline =-      (guardEnabled Ext_tex_math_dollars >> mathInlineWith "$" "$")-  <|> (guardEnabled Ext_tex_math_single_backslash >>-       mathInlineWith "\\(" "\\)")-  <|> (guardEnabled Ext_tex_math_double_backslash >>-       mathInlineWith "\\\\(" "\\\\)")+      (guardEnabled Ext_tex_math_dollars >> mathWith "$" "$")+  <|> (guardEnabled Ext_tex_math_single_backslash >> mathWith "\\(" "\\)")+  <|> (guardEnabled Ext_tex_math_double_backslash >> mathWith "\\\\(" "\\\\)")
src/Text/Pandoc/Readers.hs view
@@ -30,6 +30,7 @@   , readPptx   , readXlsx   , readODT+  , readFODT   , readMarkdown   , readCommonMark   , readCreole@@ -167,6 +168,7 @@           ,("pptx"         , ByteStringReader readPptx)           ,("xlsx"         , ByteStringReader readXlsx)           ,("odt"          , ByteStringReader readODT)+          ,("fodt"         , TextReader readFODT)           ,("t2t"          , TextReader readTxt2Tags)           ,("epub"         , ByteStringReader readEPUB)           ,("muse"         , TextReader readMuse)
src/Text/Pandoc/Readers/CommonMark.hs view
@@ -167,6 +167,8 @@          [ (superscriptSpec <>) | isEnabled Ext_superscript opts ] ++          [ (subscriptSpec <>) | isEnabled Ext_subscript opts ] ++          [ (mathSpec <>) | isEnabled Ext_tex_math_dollars opts ] +++         [ (taskListSpec <>) | isEnabled Ext_task_lists opts ] +++         -- note: task_list before fancy_list, work around jgm/commonmark#180          [ (fancyListSpec <>) | isEnabled Ext_fancy_lists opts ] ++          [ (fencedDivSpec <>) | isEnabled Ext_fenced_divs opts ] ++          [ (bracketedSpanSpec <>) | isEnabled Ext_bracketed_spans opts ] ++@@ -187,7 +189,6 @@            | isEnabled Ext_implicit_header_references opts ] ++          [ (footnoteSpec <>) | isEnabled Ext_footnotes opts ] ++          [ (definitionListSpec <>) | isEnabled Ext_definition_lists opts ] ++-         [ (taskListSpec <>) | isEnabled Ext_task_lists opts ] ++          [ (wikilinksSpec TitleAfterPipe <>)            | isEnabled Ext_wikilinks_title_after_pipe opts ] ++          [ (wikilinksSpec TitleBeforePipe <>)
src/Text/Pandoc/Readers/Creole.hs view
@@ -62,6 +62,33 @@ specialChars :: [Char] specialChars = "*/~{}\\|[]()<>\"'" +-- | True for characters that terminate a run of plain text, i.e. the+-- 'specialChars' plus tabs, newlines and spaces.  Written as a @case@ so+-- that GHC compiles it to a jump table; this is applied to every single+-- character of the input, so a linear scan over the list here is a+-- significant cost.  Must be kept in sync with 'specialChars'.+isStrEnd :: Char -> Bool+isStrEnd c = case c of+  '\t' -> True+  '\n' -> True+  ' '  -> True+  '"'  -> True+  '\'' -> True+  '('  -> True+  ')'  -> True+  '*'  -> True+  '/'  -> True+  '<'  -> True+  '>'  -> True+  '['  -> True+  '\\' -> True+  ']'  -> True+  '{'  -> True+  '|'  -> True+  '}'  -> True+  '~'  -> True+  _    -> False+ parseCreole :: PandocMonad m => CRLParser m Pandoc parseCreole = do   bs <- mconcat <$> many block@@ -272,8 +299,7 @@ symbol = fmap (B.str . T.singleton) (oneOf specialChars)  str :: PandocMonad m => CRLParser m B.Inlines-str = let strChar = noneOf ("\t\n " ++ specialChars) in-        fmap B.str (many1Char strChar)+str = fmap B.str (takeWhile1P (not . isStrEnd))  bold :: PandocMonad m => CRLParser m B.Inlines bold = B.strong . mconcat <$>
src/Text/Pandoc/Readers/Docx.hs view
@@ -312,7 +312,9 @@         | Just True <- isSmallCaps rPr =             smallcaps . go rPr{isSmallCaps = Nothing}         | Just True <- isStrike rPr =-            strikeout . go rPr{isStrike = Nothing}+            strikeout . go rPr{isStrike = Nothing, isDoubleStrike = Nothing}+        | Just True <- isDoubleStrike rPr =+            strikeout . go rPr{isDoubleStrike = Nothing}         | Just True <- isRTL rPr =             spanWith ("",[],[("dir","rtl")]) . go rPr{isRTL = Nothing}         | inBidi, Just False <- isRTL rPr =
src/Text/Pandoc/Readers/Docx/Combine.hs view
@@ -80,7 +80,28 @@   let (fs, ils') = unstackInlines ils       (left, (right, contents')) = second (spanr isSpace) $ spanl isSpace $ unMany ils'       -- NOTE: spanr counterintuitively returns suffix as the FIRST tuple element-  in (Many left, (fs, Many contents'), Many right)+  in case breakAtTrackedChange fs of+       -- A space at the edge of an inserted or deleted run belongs to the+       -- change: moving it out of the span would lose it when the change is+       -- accepted or rejected later (#4427). It is still moved out of the+       -- formatting inside the change.+       Just (outer, inner) ->+         (mempty, (outer, Many left <> stackInlines inner (Many contents')+                           <> Many right), mempty)+       Nothing -> (Many left, (fs, Many contents'), Many right)++-- | Split a modifier stack (outermost first) after its innermost+-- tracked-change span, if it has one.+breakAtTrackedChange :: [Modifier a] -> Maybe ([Modifier a], [Modifier a])+breakAtTrackedChange fs =+  case L.findIndex isTrackedChange (reverse fs) of+    Nothing -> Nothing+    Just i  -> Just (splitAt (length fs - i) fs)++isTrackedChange :: Modifier a -> Bool+isTrackedChange (AttrModifier _ (_, classes, _)) =+  any (`elem` classes) ["insertion", "deletion"]+isTrackedChange _ = False  isSpace :: Inline -> Bool isSpace Space = True
src/Text/Pandoc/Readers/Docx/Parse.hs view
@@ -109,6 +109,7 @@                            , envFont          :: Maybe Font                            , envCharStyles    :: CharStyleMap                            , envParStyles     :: ParStyleMap+                           , envTableStyles   :: TableStyleMap                            , envLocation      :: DocumentLocation                            , envDocXmlPath    :: FilePath                            , envTextWidth     :: Int@@ -233,6 +234,8 @@  type ParStyleMap = M.Map ParaStyleId ParStyle +type TableStyleMap = M.Map TableStyleId TableStyle+ data Numbering = Numbering NameSpaces [Numb] [AbstractNumb]                  deriving Show @@ -382,6 +385,7 @@     , isItalicCTL = isItalicCTL a <|> isItalicCTL b     , isSmallCaps = isSmallCaps a <|> isSmallCaps b     , isStrike = isStrike a <|> isStrike b+    , isDoubleStrike = isDoubleStrike a <|> isDoubleStrike b     , isRTL = isRTL a <|> isRTL b     , isForceCTL = isForceCTL a <|> isForceCTL b     , rHighlight = rHighlight a <|> rHighlight b@@ -443,7 +447,7 @@       numbering = archiveToNumbering archive       rels      = archiveToRelationships archive docXmlPath       media     = filteredFilesFromArchive archive filePathIsMedia-      (styles, parstyles) = archiveToStyles archive+      (styles, parstyles, tabstyles) = archiveToStyles archive       textWidth = archiveToTextWidth archive       rEnv = ReaderEnv { envNotes = notes                        , envComments = comments@@ -453,6 +457,7 @@                        , envFont = Nothing                        , envCharStyles = styles                        , envParStyles = parstyles+                       , envTableStyles = tabstyles                        , envLocation = InDocument                        , envDocXmlPath = docXmlPath                        , envTextWidth = fromMaybe 9360 textWidth@@ -512,8 +517,8 @@       | otherwise       = ((:[]) <$> elemToBodyPart ns' el) `catchError` (\_ -> return []) -archiveToStyles :: Archive -> (CharStyleMap, ParStyleMap)-archiveToStyles = archiveToStyles' getStyleId getStyleId+archiveToStyles :: Archive -> (CharStyleMap, ParStyleMap, TableStyleMap)+archiveToStyles = archiveToStyles' getStyleId getStyleId getStyleId  class HasParentStyle a where   getParentStyle :: a -> Maybe a@@ -1506,10 +1511,13 @@  stripCaptionLabel :: [Element] -> [Element] stripCaptionLabel els =-  if any isNumberElt els-     then dropWhile (not . isNumberElt) els-     else els+    if null afters+       then els+       else filter isBookmark befores <> afters   where+    (befores, afters) = break isNumberElt els+    isBookmark (Element name _ _ _) =+      qName name == "bookmarkStart" || qName name == "bookmarkEnd"     isNumberElt el@(Element name attribs _ _) =        (qName name == "fldSimple" &&              case lookupAttrBy ((== "instr") . qName) attribs of
src/Text/Pandoc/Readers/Docx/Parse/Styles.hs view
@@ -21,12 +21,15 @@   , CharStyle   , ParaStyleId(..)   , ParStyle(..)+  , TableStyleId(..)+  , TableStyle   , ParIndentation(..)   , RunStyle(..)   , HasStyleName   , StyleName   , ParaStyleName   , CharStyleName+  , TableStyleName   , FromStyleName   , VertAlign(..)   , StyleId@@ -62,11 +65,15 @@   deriving (Show, Eq, Ord, IsString, FromStyleId) newtype ParaStyleId   = ParaStyleId T.Text   deriving (Show, Eq, Ord, IsString, FromStyleId)+newtype TableStyleId   = TableStyleId T.Text+  deriving (Show, Eq, Ord, IsString, FromStyleId)  newtype CharStyleName = CharStyleName CIString   deriving (Show, Eq, Ord, IsString, FromStyleName) newtype ParaStyleName = ParaStyleName CIString   deriving (Show, Eq, Ord, IsString, FromStyleName)+newtype TableStyleName = TableStyleName CIString+  deriving (Show, Eq, Ord, IsString, FromStyleName)  -- Case-insensitive comparisons newtype CIString = CIString T.Text deriving (Show, IsString, FromStyleName)@@ -103,18 +110,19 @@                            , cStyleData :: RunStyle                            } deriving (Show) -data RunStyle = RunStyle { isBold       :: Maybe Bool-                         , isBoldCTL    :: Maybe Bool-                         , isItalic     :: Maybe Bool-                         , isItalicCTL  :: Maybe Bool-                         , isSmallCaps  :: Maybe Bool-                         , isStrike     :: Maybe Bool-                         , isRTL        :: Maybe Bool-                         , isForceCTL   :: Maybe Bool-                         , rHighlight   :: Maybe Text-                         , rVertAlign   :: Maybe VertAlign-                         , rUnderline   :: Maybe Text-                         , rParentStyle :: Maybe CharStyle+data RunStyle = RunStyle { isBold         :: Maybe Bool+                         , isBoldCTL      :: Maybe Bool+                         , isItalic       :: Maybe Bool+                         , isItalicCTL    :: Maybe Bool+                         , isSmallCaps    :: Maybe Bool+                         , isStrike       :: Maybe Bool+                         , isDoubleStrike :: Maybe Bool+                         , isRTL          :: Maybe Bool+                         , isForceCTL     :: Maybe Bool+                         , rHighlight     :: Maybe Text+                         , rVertAlign     :: Maybe VertAlign+                         , rUnderline     :: Maybe Text+                         , rParentStyle   :: Maybe CharStyle                          }                 deriving Show @@ -132,6 +140,10 @@                          }                     deriving Show +data TableStyle = TableStyle { tStyleName  :: TableStyleName+                             , tStyleId  :: TableStyleId }+                    deriving Show+ defaultRunStyle :: RunStyle defaultRunStyle = RunStyle { isBold = Nothing                            , isBoldCTL = Nothing@@ -139,6 +151,7 @@                            , isItalicCTL = Nothing                            , isSmallCaps = Nothing                            , isStrike = Nothing+                           , isDoubleStrike = Nothing                            , isRTL = Nothing                            , isForceCTL = Nothing                            , rHighlight = Nothing@@ -148,21 +161,24 @@                            }  archiveToStyles'-  :: (Ord k1, Ord k2, ElemToStyle a1, ElemToStyle a2)-  => (a1 -> k1) -> (a2 -> k2) -> Archive -> (M.Map k1 a1, M.Map k2 a2)-archiveToStyles' conv1 conv2 zf =+  :: (Ord k1, Ord k2, Ord k3, ElemToStyle a1, ElemToStyle a2, ElemToStyle a3)+  => (a1 -> k1) -> (a2 -> k2) -> (a3 -> k3)+  -> Archive -> (M.Map k1 a1, M.Map k2 a2, M.Map k3 a3)+archiveToStyles' conv1 conv2 conv3 zf =   case findEntryByPath "word/styles.xml" zf of-    Nothing -> (M.empty, M.empty)+    Nothing -> (M.empty, M.empty, M.empty)     Just entry ->       case parseXMLElement . UTF8.toTextLazy . fromEntry $ entry of-        Left _ -> (M.empty, M.empty)+        Left _ -> (M.empty, M.empty, M.empty)         Right styElem ->           let namespaces = elemToNameSpaces styElem           in            ( M.fromList $ map (\r -> (conv1 r, r)) $                buildBasedOnList namespaces styElem Nothing,              M.fromList $ map (\p -> (conv2 p, p)) $-               buildBasedOnList namespaces styElem Nothing)+               buildBasedOnList namespaces styElem Nothing,+             M.fromList $ map (\p -> (conv3 p, p)) $+               buildBasedOnList namespaces styElem Nothing )  isBasedOnStyle :: (ElemToStyle a, FromStyleId (StyleId a)) => NameSpaces -> Element -> Maybe a -> Bool isBasedOnStyle ns element parentStyle@@ -223,6 +239,22 @@   type StyleName ParStyle = ParaStyleName   getStyleName = pStyleName +instance ElemToStyle TableStyle where+  cStyleType _ = "table"+  elemToStyle ns element parentStyle+    | isElem ns "w" "style" element+    , Just "table" <- findAttrByName ns "w" "type" element+    = elemToTableStyleData ns element parentStyle+    | otherwise = Nothing++instance HasStyleId TableStyle where+  type StyleId TableStyle = TableStyleId+  getStyleId = tStyleId++instance HasStyleName TableStyle where+  type StyleName TableStyle = TableStyleName+  getStyleName = tStyleName+ getStyleChildren :: (ElemToStyle a) => NameSpaces -> Element -> Maybe a -> [a] getStyleChildren ns element parentStyle   | isElem ns "w" "styles" element =@@ -275,6 +307,7 @@       , isItalicCTL = checkOnOff ns rPr (elemName ns "w" "iCs")       , isSmallCaps = checkOnOff ns rPr (elemName ns "w" "smallCaps")       , isStrike = checkOnOff ns rPr (elemName ns "w" "strike")+      , isDoubleStrike = checkOnOff ns rPr (elemName ns "w" "dstrike")       , isRTL = checkOnOff ns rPr (elemName ns "w" "rtl")       , isForceCTL = checkOnOff ns rPr (elemName ns "w" "cs")       , rHighlight =@@ -350,3 +383,14 @@       , pStyleId = ParaStyleId styleId       } elemToParStyleData _ _ _ = Nothing++elemToTableStyleData :: NameSpaces+                     -> Element -> Maybe TableStyle -> Maybe TableStyle+elemToTableStyleData ns element _parentStyle+  | Just styleId <- findAttrByName ns "w" "styleId" element+  , Just styleName <- getElementStyleName ns element+  = Just $ TableStyle+      { tStyleName = styleName+      , tStyleId = TableStyleId styleId+      }+elemToTableStyleData _ _ _ = Nothing
src/Text/Pandoc/Readers/Markdown.hs view
@@ -329,7 +329,8 @@  kvPair :: PandocMonad m => Bool -> MarkdownParser m (Text, MetaValue) kvPair allowEmpty = try $ do-  key <- many1TillChar (alphaNum <|> oneOf "_- ") (char ':')+  key <- takeWhile1P (\c -> isAlphaNum c || c == '_' || c == '-' || c == ' ')+  _ <- char ':'   val <- trim <$> manyTillChar anyChar           (try $ newline >> lookAhead (blankline <|> nonspaceChar))   guard $ allowEmpty || not (T.null val)@@ -576,11 +577,18 @@   skipSpaces   return attr +setextUnderline :: PandocMonad m => MarkdownParser m Char+setextUnderline = do+  underlineChar <- oneOf setextHChars+  skipMany (char underlineChar)+  blanklines+  pure underlineChar+ setextHeader :: PandocMonad m => MarkdownParser m (F Blocks) setextHeader = try $ do   -- This lookahead prevents us from wasting time parsing Inlines   -- unless necessary -- it gives a significant performance boost.-  lookAhead $ anyLine >> many1 (oneOf setextHChars) >> blankline+  lookAhead $ anyLine >> setextUnderline   skipSpaces   (text, raw) <- withRaw $ do     oldAllowLineBreaks <- stateAllowLineBreaks <$> getState@@ -590,9 +598,7 @@     updateState $ \st -> st{ stateAllowLineBreaks = oldAllowLineBreaks }     return res   attr <- setextHeaderEnd-  underlineChar <- oneOf setextHChars-  many (char underlineChar)-  blanklines+  underlineChar <- setextUnderline   let level = fromMaybe 0 (elemIndex underlineChar setextHChars) + 1   attr' <- registerHeader attr (runF text defaultParserState)   guardDisabled Ext_implicit_header_references@@ -695,7 +701,7 @@   char '{'   skipMany spaceChar   char '='-  format <- many1Char $ satisfy (\c -> isAlphaNum c || c `elem` ['-', '_'])+  format <- takeWhile1P (\c -> isAlphaNum c || c `elem` ['-', '_'])   skipMany spaceChar   char '}'   return format@@ -712,8 +718,8 @@      (Left <$> (guardEnabled Ext_raw_attribute >> try rawAttribute))     <|>      (Right <$> do-         let pLangId = many1Char . satisfy $ \x ->-               x `notElem` ['`', '{', '}'] && not (isSpace x)+         let pLangId = takeWhile1P (\x ->+               x `notElem` ['`', '{', '}'] && not (isSpace x))          mbLanguageId <- optionMaybe (toLanguageId <$> pLangId)          skipMany spaceChar          mbAttr <- optionMaybe@@ -837,7 +843,7 @@     case mbAlert of       Nothing -> B.blockQuote <$> contents       Just alert ->-        (B.divWith ("", ["alert", alert], [])+        (B.divWith ("", [alert, "alert"], [])           . (B.divWith ("", ["title"], []) (B.para (B.str (T.toTitle alert))) <>))            <$> contents @@ -1933,7 +1939,8 @@ bracketedSpan = do   guardEnabled Ext_bracketed_spans   try $ do-    (lab,_) <- reference+    guardDisabled Ext_footnotes <|> notFollowedBy' noteMarker+    lab <- inBalancedBrackets inlines     attr <- attributes     return $ wrapSpan attr <$> lab 
src/Text/Pandoc/Readers/Mdoc/Lex.hs view
@@ -133,7 +133,9 @@ anyText = escape <|> regularText <|> quoteChar <|> spaceTabChar  regularText :: PandocMonad m => Lexer m T.Text-regularText = many1Char $ noneOf "\n\r\t \\\""+regularText = takeWhile1P (\c -> not (c == '\n' || c == '\r' ||+                                      c == '\t' || c == ' ' ||+                                      c == '\\' || c == '"'))  quoteChar :: PandocMonad m => Lexer m T.Text quoteChar = T.singleton <$> char '"'
src/Text/Pandoc/Readers/MediaWiki.hs view
@@ -94,8 +94,31 @@ specialChars :: [Char] specialChars = "'[]<=&*{}|\":\\_" -spaceChars :: [Char]-spaceChars = " \n\t"+-- | True for characters that terminate a run of plain text, i.e. the+-- 'specialChars' plus space, newline and tab.  Written as a @case@ so that+-- GHC compiles it to a jump table; this is applied to every single+-- character of the input, so a linear scan over the list here is a+-- significant cost.  Must be kept in sync with 'specialChars'.+isStrEnd :: Char -> Bool+isStrEnd c = case c of+  '\t' -> True+  '\n' -> True+  ' '  -> True+  '"'  -> True+  '&'  -> True+  '\'' -> True+  '*'  -> True+  ':'  -> True+  '<'  -> True+  '='  -> True+  '['  -> True+  '\\' -> True+  ']'  -> True+  '_'  -> True+  '{'  -> True+  '|'  -> True+  '}'  -> True+  _    -> False  sym :: PandocMonad m => Text -> MWParser m () sym s = () <$ try (string $ T.unpack s)@@ -616,7 +639,7 @@       <|> special  str :: PandocMonad m => MWParser m Inlines-str = B.str <$> takeWhile1P (`notElem` (specialChars ++ spaceChars))+str = B.str <$> takeWhile1P (not . isStrEnd)  math :: PandocMonad m => MWParser m Inlines math = (B.displayMath . trim <$> try (many1 (char ':') >> textInTags "math"))
src/Text/Pandoc/Readers/ODT.hs view
@@ -11,10 +11,11 @@ Entry point to the odt reader. -} -module Text.Pandoc.Readers.ODT ( readODT ) where+module Text.Pandoc.Readers.ODT ( readODT, readFODT ) where  import Codec.Archive.Zip import Text.Pandoc.XML.Light+import qualified Text.Pandoc.XML.Light as XML import Text.Pandoc.Walk  import Data.Char (isDigit)@@ -22,9 +23,11 @@  import System.FilePath +import Control.Monad (unless) import Control.Monad.Except (throwError)  import qualified Data.Text as T+import qualified Data.Text.Lazy as TL  import Text.Pandoc.Class.PandocMonad (PandocMonad) import qualified Text.Pandoc.Class.PandocMonad as P@@ -40,6 +43,7 @@ import Text.Pandoc.Readers.ODT.Generic.Fallible import Text.Pandoc.Readers.ODT.Generic.XMLConverter import Text.Pandoc.Shared (filteredFilesFromArchive)+import Text.Pandoc.Sources (ToSources(..), sourcesToText)  readODT :: PandocMonad m         => ReaderOptions@@ -50,6 +54,40 @@     P.setMediaBag mb     return $ walk makeFigure doc   Left e -> throwError e++-- | Read a flat OpenDocument text file, i.e. ODF's representation as a+-- single XML file rather than a zip archive.+readFODT :: (PandocMonad m, ToSources a)+         => ReaderOptions+         -> a+         -> m Pandoc+readFODT _ inp = do+  root <- either (throwError . PandocXMLError "") pure+            (parseXMLElement (TL.fromStrict (sourcesToText (toSources inp))))+  case elementToODT root of+    Right (doc, mb) -> do+      P.setMediaBag mb+      return $ walk makeFigure doc+    Left e -> throwError e++-- | A flat file has exactly one of each of the top-level elements that a+-- package distributes over @content.xml@ and @styles.xml@, and they are+-- all children of the root.  The converter addresses everything relative+-- to the element it is given, so it can simply be handed that root.+elementToODT :: Element -> Either PandocError (Pandoc, MediaBag)+elementToODT root = do+  -- the local name only, consistently with the URI-based namespace+  -- matching downstream; office:document-content is correctly rejected+  unless (XML.qName (XML.elName root) == "document") $+    Left $ PandocParseError+      "Expected office:document at the root of the flat OpenDocument file"+  styles <- either+               (\_ -> Left $ PandocParseError "Could not read styles")+               Right+               (readStylesAt root)+  -- the media list is empty: all media arrives in office:binary-data+  either (\_ -> Left $ PandocParseError "Could not convert opendocument") Right+    (runConverter read_body (readerState styles []) root)  -- the ODT parser uses old-style figures: an image with title beginning -- "fig:" in a paragraph by itself.  Convert these to new Figure elements.
src/Text/Pandoc/Readers/ODT/ContentReader.hs view
@@ -24,9 +24,12 @@ import Control.Applicative ((<|>)) import Control.Monad ((<=<)) +import Data.ByteString.Base64 (decodeLenient) import qualified Data.ByteString.Lazy as B+import Data.Char (isSpace) import Data.Foldable (fold) import Data.List (find)+import Data.List.NonEmpty (nonEmpty) import qualified Data.Map as M import qualified Data.Text as T import Data.Maybe@@ -36,8 +39,11 @@ import qualified Text.Pandoc.XML.Light as XML  import Text.Pandoc.Builder hiding (underline)-import Text.Pandoc.MediaBag (MediaBag, insertMedia)+import Text.Pandoc.ImageSize (ImageType(..), imageType)+import Text.Pandoc.MediaBag (MediaBag, insertMedia, mediaItems)+import Text.Pandoc.MIME (extensionFromMimeType) import Text.Pandoc.Shared+import Text.Pandoc.Walk (walk) import Text.Pandoc.Extensions (extensionsFromList, Extension(..)) import qualified Text.Pandoc.UTF8 as UTF8 @@ -57,7 +63,7 @@ --------------------------------------------------------------------------------  type Anchor = T.Text-type Media = [(FilePath, B.ByteString)]+type Media = M.Map FilePath B.ByteString  data ReaderState    = ReaderState { -- | A collection of styles read somewhere else.@@ -83,6 +89,11 @@                    -- | A map from internal anchor names to "pretty" ones.                    -- The mapping is a purely cosmetic one.                  , bookmarkAnchors  :: M.Map Anchor Anchor+                   -- | The "pretty" anchors handed out so far, i.e. the+                   -- values of 'bookmarkAnchors'. Kept separately so that+                   -- checking an anchor for uniqueness does not cost a+                   -- traversal of the whole map.+                 , usedAnchors      :: Set.Set Anchor                    -- | A map of files / binary data from the archive                  , envMedia         :: Media                    -- | Hold binary resources used in the document@@ -90,8 +101,10 @@                  }   deriving ( Show ) -readerState :: Styles -> Media -> ReaderState-readerState styles media = ReaderState styles [] 0 M.empty Nothing M.empty media mempty+readerState :: Styles -> [(FilePath, B.ByteString)] -> ReaderState+readerState styles media =+  ReaderState styles [] 0 M.empty Nothing M.empty Set.empty+              (M.fromList media) mempty  -- pushStyle'  :: Style -> ReaderState -> ReaderState@@ -122,11 +135,9 @@ -- putPrettyAnchor :: Anchor -> Anchor -> ReaderState -> ReaderState putPrettyAnchor ugly pretty state@ReaderState{..}-  = state { bookmarkAnchors = M.insert ugly pretty bookmarkAnchors }-----usedAnchors :: ReaderState -> [Anchor]-usedAnchors ReaderState{..} = M.elems bookmarkAnchors+  = state { bookmarkAnchors = M.insert ugly pretty bookmarkAnchors+          , usedAnchors     = Set.insert pretty usedAnchors+          }  getMediaBag :: ReaderState -> MediaBag getMediaBag ReaderState{..} = odtMediaBag@@ -187,24 +198,21 @@ updateMediaWithResource resource = modifyExtraState (insertMedia' resource)  ---lookupResource :: FilePath -> ODTReader (FilePath, B.ByteString)-lookupResource target = do-  state <- getExtraState-  case lookup target (getMediaEnv state) of-    Just bs -> return (target, bs)-    Nothing -> return ("", B.empty)+lookupResource :: FilePath -> ODTReader (Maybe B.ByteString)+lookupResource target = M.lookup target . getMediaEnv <$> getExtraState  type AnchorPrefix = T.Text  -- | An adaptation of 'uniqueIdent' from "Text.Pandoc.Shared" that generates a -- unique identifier but without assuming that the id should be for a header. -- Second argument is a list of already used identifiers.-uniqueIdentFrom :: AnchorPrefix -> [Anchor] -> Anchor+uniqueIdentFrom :: AnchorPrefix -> Set.Set Anchor -> Anchor uniqueIdentFrom baseIdent usedIdents =   let  numIdent n = baseIdent <> "-" <> T.pack (show n)-  in  if baseIdent `elem` usedIdents+  in  if baseIdent `Set.member` usedIdents         then maybe baseIdent numIdent-             $ find (\x -> numIdent x `notElem` usedIdents) ([1..60000] :: [Int])+             $ find (\x -> numIdent x `Set.notMember` usedIdents)+                 ([1..60000] :: [Int])                -- if we have more than 60,000, allow repeats         else baseIdent @@ -227,8 +235,7 @@ getHeaderAnchor title = do   state <- getExtraState   let exts = extensionsFromList [Ext_auto_identifiers]-  let anchor = uniqueIdent exts (toList title)-                (Set.fromList $ usedAnchors state)+  let anchor = uniqueIdent exts (toList title) (usedAnchors state)   modifyExtraState (putPrettyAnchor anchor anchor)   return anchor @@ -514,10 +521,16 @@ -- specifically. I honor that, although the current implementation of 'mappend' -- for 'Inlines' in "Text.Pandoc.Builder" will collapse them again. -- The rational is to be prepared for future modifications.+-- The repeat count is attacker-controlled and unbounded in ODF, so cap+-- it: a 832-byte document with @text:c="200000000"@ would otherwise+-- exhaust memory.+_MAX_SPACES_     :: Int+_MAX_SPACES_      = 1000+ read_spaces      :: InlineMatcher read_spaces       = matchingElement NsText "s" $ do                       count <- readAttrWithDefault NsText "c" 1 -- how many spaces?-                      return $ fromList (replicate count Space)+                      return $ fromList (replicate (min count _MAX_SPACES_) Space) -- read_line_break  :: InlineMatcher read_line_break   = matchingElement NsText "line-break"@@ -529,31 +542,65 @@ -- read_span        :: InlineMatcher read_span         = matchingElement NsText "span"-                    $ withNewStyle-                    $ matchContent [ read_span-                                   , read_spaces-                                   , read_line_break-                                   , read_tab-                                   , read_link-                                   , read_frame-                                   , read_note-                                   , read_citation-                                   , read_bookmark-                                   , read_bookmark_start-                                   , read_reference_start-                                   , read_bookmark_ref-                                   , read_reference_ref-                                   ] read_plain_text+                    $ withNewStyle matchInlineContent +-- | ODF wraps inline content in a few elements that carry nothing but+-- metadata: @text:meta@ holds RDFa annotations, @text:meta-field@ marks+-- up bibliographic data. They are transparent as far as we are concerned.+read_meta        :: InlineMatcher+read_meta         = matchingElement NsText "meta" matchInlineContent++read_meta_field  :: InlineMatcher+read_meta_field   = matchingElement NsText "meta-field" matchInlineContent++-- | A ruby annotation glosses a base text. Pandoc cannot represent the+-- gloss, so keep the base text rather than dropping both.+read_ruby        :: InlineMatcher+read_ruby         = matchingElement NsText "ruby"+                    $ matchContent' [ matchingElement NsText "ruby-base"+                                        matchInlineContent ]++-- | Fields hold a value that the producing application computes, such as+-- a page number, a document property or a user variable. The element+-- content is the text that application last displayed for the field,+-- which is the best rendering available to us.+read_fields      :: [InlineMatcher]+read_fields       = [ matchingElement NsText name (matchContent [] read_plain_text)+                    | name <- fieldElements ]++fieldElements    :: [ElementName]+fieldElements     =+  [ "page-number", "page-count", "page-continuation", "page-variable-get"+  , "date", "time", "creation-date", "creation-time"+  , "modification-date", "modification-time"+  , "print-date", "print-time", "printed-by"+  , "editing-cycles", "editing-duration"+  , "author-name", "author-initials", "initial-creator", "creator"+  , "title", "subject", "description", "keywords"+  , "chapter", "file-name", "template-name", "sheet-name"+  , "variable-get", "variable-set", "variable-input"+  , "user-defined", "user-field-get", "user-field-input"+  , "expression", "text-input", "placeholder"+  , "word-count", "character-count", "paragraph-count"+  , "table-count", "image-count", "object-count"+  , "database-display", "database-name", "database-row-number"+  , "sequence-ref", "note-ref"+  , "sender-firstname", "sender-lastname", "sender-initials"+  , "sender-title", "sender-position", "sender-email"+  , "sender-company", "sender-street", "sender-city"+  , "sender-postal-code", "sender-country", "sender-state-or-province"+  , "sender-phone-private", "sender-phone-work", "sender-fax"+  ]+ -- read_paragraph   :: Matcher CombiningBlocks read_paragraph    = matchingElement NsText "p" $ fmap CombiningBlocks $ do                       fStyle <- tryC readStyleByName                       case fStyle of                         Right style | isPreformattedStyle style ->-                          codeBlock . stringifyInlines <$> matchParagraphContent+                          codeBlock . stringifyInlines <$> matchInlineContent                         _ ->-                          constructPara (para <$> withNewStyle matchParagraphContent)+                          constructPara (para <$> withNewStyle matchInlineContent)                     where                       isPreformattedStyle :: (StyleName, Style) -> Bool                       isPreformattedStyle ("Preformatted_20_Text", _) = True@@ -561,24 +608,45 @@                       isPreformattedStyle _ = False  -matchParagraphContent :: ODTReader Inlines-matchParagraphContent = matchContent [ read_span-                                     , read_spaces-                                     , read_line_break-                                     , read_tab-                                     , read_link-                                     , read_note-                                     , read_citation-                                     , read_bookmark-                                     , read_bookmark_start-                                     , read_reference_start-                                     , read_bookmark_ref-                                     , read_reference_ref-                                     , read_frame-                                     , read_text_seq-                                     ] read_plain_text+-- | Reads the inline content of a paragraph, heading or span.+matchInlineContent :: ODTReader Inlines+matchInlineContent = matchContent inlineMatchers read_plain_text +inlineMatchers :: [InlineMatcher]+inlineMatchers = [ read_span+                 , read_spaces+                 , read_line_break+                 , read_tab+                 , read_link+                 , read_note+                 , read_citation+                 , read_bookmark+                 , read_bookmark_start+                 , read_reference_start+                 , read_bookmark_ref+                 , read_reference_ref+                 , read_frame+                 , read_text_seq+                 , read_meta+                 , read_meta_field+                 , read_ruby+                 ] ++ read_fields +-- | Reads the block-level content that ODF permits wherever it permits a+-- paragraph: in the body of the document, and in a section, a list item, a+-- footnote or a table cell.+matchBlockContent :: ODTReader Blocks+matchBlockContent = matchSmushedChildBlocks' blockMatchers++blockMatchers :: [Matcher CombiningBlocks]+blockMatchers = [ read_paragraph+                , read_header+                , read_list+                , read_table+                , read_section+                ]++ ---------------------- -- Headers ----------------------@@ -587,20 +655,7 @@ read_header      :: Matcher CombiningBlocks read_header       = matchingElement NsText "h" $ do   level    <- readAttrWithDefault NsText "outline-level" 1-  children <- matchContent [ read_span-                           , read_spaces-                           , read_line_break-                           , read_tab-                           , read_link-                           , read_note-                           , read_citation-                           , read_bookmark-                           , read_bookmark_start-                           , read_reference_start-                           , read_bookmark_ref-                           , read_reference_ref-                           , read_frame-                           ] read_plain_text+  children <- matchInlineContent   anchor   <- getHeaderAnchor children   let idAttr = (anchor, [], []) -- no classes, no key-value pairs   return $ CombiningBlocks $ headerWith idAttr level children@@ -627,12 +682,7 @@ read_list_element               :: ElementName -> Matcher [Blocks] read_list_element listElement   = matchingElement NsText listElement                                   $ compactify . (:[])-                                  <$> matchSmushedChildBlocks'-                                        [ read_paragraph-                                        , read_header-                                        , read_list-                                        , read_section-                                        ]+                                  <$> matchBlockContent  ---------------------- -- Sections@@ -641,12 +691,7 @@ read_section :: Matcher CombiningBlocks read_section = matchingElement NsText "section"                  $ CombiningBlocks . divWith nullAttr-                 <$> matchSmushedChildBlocks' [ read_paragraph-                                              , read_header-                                              , read_list-                                              , read_table-                                              , read_section-                                              ]+                 <$> matchBlockContent   ----------------------@@ -687,8 +732,7 @@                     $ note <$> matchContent' [ read_note_body ]  read_note_body   :: BlockMatcher-read_note_body    = matchingElement NsText "note-body"-                    $ matchSmushedChildBlocks' [ read_paragraph ]+read_note_body    = matchingElement NsText "note-body" matchBlockContent  ------------------------- -- Citations@@ -714,8 +758,8 @@ read_table        :: Matcher CombiningBlocks read_table         = matchingElement NsTable "table"                      $ fmap (CombiningBlocks . table')-                     $ (,) <$> matchContent' [read_table_header]-                           <*> matchContent' [read_table_row]+                     $ (,) <$> matchContent' read_header_rows+                           <*> matchContent' read_body_rows  -- | A table without a caption. table' :: ([[Cell]], [[Cell]]) -> Blocks@@ -723,24 +767,60 @@     table emptyCaption (replicate numcols defaults) th [tb] tf   where     defaults = (AlignDefault, ColWidthDefault)-    numcols = maximum $ map length $ headers ++ rows+    -- A table element need not contain any rows, so guard against+    -- taking the maximum of an empty list.+    numcols = maybe 0 maximum $ nonEmpty $ map rowWidth $ headers ++ rows+    -- A cell spanning several columns occupies all of them.+    rowWidth = sum . map (\(Cell _ _ _ (ColSpan cs) _) -> cs)     toRow = Row nullAttr     th = TableHead nullAttr $ map toRow headers     tb = TableBody nullAttr 0 [] $ map toRow rows     tf = TableFoot nullAttr [] ----read_table_header :: Matcher [[Cell]]-read_table_header = matchingElement NsTable "table-header-rows"-                      $ matchContent' [ read_table_row-                                      ]+-- | Rows need not be immediate children of the table: ODF lets them be+-- wrapped in any number of @table:table-row-group@ and @table:table-rows@+-- elements, which only group them for the benefit of outlining and+-- formatting. The children are walked twice, once picking up the rows that a+-- @table:table-header-rows@ marks as headers and once the remaining ones.+read_header_rows  :: [Matcher [[Cell]]]+read_header_rows   = [ matchingElement NsTable "table-header-rows"+                         $ matchContent' [ read_table_row ]+                     , matchingElement NsTable "table-row-group"+                         $ matchContent' read_header_rows+                     ] +read_body_rows    :: [Matcher [[Cell]]]+read_body_rows     = [ read_table_row+                     , matchingElement NsTable "table-rows"+                         $ matchContent' [ read_table_row ]+                     , matchingElement NsTable "table-row-group"+                         $ matchContent' read_body_rows+                     ]++-- | ODF abbreviates a run of identical rows or cells with a repeat count.+-- The counts are unbounded in the format -- spreadsheets pad out to the end+-- of the sheet with them -- so a handful of bytes could otherwise ask for an+-- arbitrarily large table. Bound both the width a single cell element stands+-- for and the number of cells a single row element expands to; capping the+-- two counts separately would not do, as they multiply.+_MAX_COLUMNS_, _MAX_ROW_CELLS_ :: Int+_MAX_COLUMNS_      = 1000+_MAX_ROW_CELLS_    = 10000++repeated          :: ElementName -> ODTReader Int+repeated attrName  = max 1 <$> readAttrWithDefault NsTable attrName 1+ -- read_table_row    :: Matcher [[Cell]] read_table_row     = matchingElement NsTable "table-row"-                     $ (:[])+                     $ row'                      <$> matchContent' [ read_table_cell                                        ]+                     <*> repeated "number-rows-repeated"+  where+    row' cells repeat' =+      replicate (max 1 $ min repeat'+                       $ _MAX_ROW_CELLS_ `div` max 1 (length cells)) cells  -- read_table_cell   :: Matcher [Cell]@@ -748,11 +828,12 @@                      $ cell'                        <$> (RowSpan <$> readAttrWithDefault NsTable "number-rows-spanned" 1)                        <*> (ColSpan <$> readAttrWithDefault NsTable "number-columns-spanned" 1)-                       <*> matchSmushedChildBlocks' [ read_paragraph-                                                    , read_list-                                                    ]+                       <*> (min _MAX_COLUMNS_ <$> repeated "number-columns-repeated")+                       <*> matchBlockContent   where-    cell' rowSpan colSpan blocks = map (cell AlignDefault rowSpan colSpan) $ compactify [blocks]+    cell' rowSpan colSpan repeat' blocks =+      concat $ replicate repeat'+             $ map (cell AlignDefault rowSpan colSpan) (compactify [blocks])  ---------------------- -- Frames@@ -774,23 +855,77 @@  read_frame_img :: XML.Element -> ODTReader (FirstMatch Inlines) read_frame_img img = do-  src <- executeIn img (findAttr' NsXLink "href")-  case fold src of-    ""   -> return mempty-    src' -> do+  mbSrc <- executeIn img resolveImageSrc+  case mbSrc of+    Nothing  -> return mempty+    Just src -> do+      -- note: the remaining attributes are read in the context of the+      -- enclosing draw:frame, not of the draw:image       let exts = extensionsFromList [Ext_auto_identifiers]-          src'' = fixRelativeLink src'-      resource   <- lookupResource (T.unpack src'')-      updateMediaWithResource resource       w          <- findAttr' NsSVG "width"       h          <- findAttr' NsSVG "height"       titleNodes <- matchContent' [ read_frame_title ]-      alt        <- matchContent [] read_plain_text+      -- trimmed because a pretty-printed file indents the children of+      -- the frame, and that whitespace is not alt text+      alt        <- trimInlines <$> matchContent [] read_plain_text       return $ firstMatch-             $ imageWith (image_attributes w h) src''+             $ imageWith (image_attributes w h) src                          (inlineListToIdentifier exts (toList titleNodes))                          alt +-- | Determine the media bag path of the image of the current+-- @draw:image@ element.  The image data is either in another file of the+-- archive, referenced by @xlink:href@, or embedded in the element as+-- base64 in an @office:binary-data@ child (which is how a flat+-- OpenDocument file must carry it).+resolveImageSrc :: ODTReader (Maybe T.Text)+resolveImageSrc = do+  href <- fold <$> findAttr' NsXLink "href"+  if not (T.null href)+     then do+       let src = fixRelativeLink href+       -- The archive need not actually contain the referenced file; if it+       -- does not, leave the media bag alone and just emit the link.+       mapM_ (updateMediaWithResource . (,) (T.unpack src))+         =<< lookupResource (T.unpack src)+       return (Just src)+     else do+       drawImage <- getCurrentElement+       findChild' NsOffice "binary-data"+         >>= traverse (embedBase64Image drawImage)++-- | Add the base64-encoded image data of an @office:binary-data@ element+-- to the media bag and return the path under which it was filed.  The+-- mime type is declared on the enclosing @draw:image@.+embedBase64Image :: XML.Element -> XML.Element -> ODTReader T.Text+embedBase64Image drawImage binaryData = do+  let bytes = decodeLenient . UTF8.fromText+            . T.filter (not . isSpace) . XML.strContent $ binaryData+  -- the attribute is draw:mime-type in ODF 1.3 but loext:mime-type in+  -- older LibreOffice output, so match on the local name only+  let mbExtension =+        ((("." <>) <$>) . extensionFromMimeType+          =<< XML.findAttrBy ((== "mime-type") . XML.qName) drawImage)+        <|> (extensionForImageType <$> imageType bytes)+  n <- length . mediaItems . getMediaBag <$> getExtraState+  let path = "Pictures/image" <> show (n + 1) <> T.unpack (fromMaybe ".bin" mbExtension)+  updateMediaWithResource (path, B.fromStrict bytes)+  return (T.pack path)++extensionForImageType :: ImageType -> T.Text+extensionForImageType imgType =+  case imgType of+    Png  -> ".png"+    Jpeg -> ".jpeg"+    Gif  -> ".gif"+    Pdf  -> ".pdf"+    Eps  -> ".eps"+    Svg  -> ".svg"+    Emf  -> ".emf"+    Tiff -> ".tiff"+    Webp -> ".webp"+    Avif -> ".avif"+ read_frame_title :: InlineMatcher read_frame_title = matchingElement NsSVG "title" (matchContent [] read_plain_text) @@ -804,17 +939,41 @@  read_frame_mathml :: XML.Element -> ODTReader (FirstMatch Inlines) read_frame_mathml obj = do-  src <- executeIn obj (findAttr' NsXLink "href")-  case fold src of-    ""   -> return mempty-    src' -> do-      let path = T.unpack $-                  fromMaybe src' (T.stripPrefix "./" src') <> "/content.xml"-      (_, mathml) <- lookupResource path-      case readMathML (UTF8.toText $ B.toStrict mathml) of-        Left _     -> return mempty-        Right exps -> return $ firstMatch $ displayMath $ writeTeX exps+  href <- fold <$> executeIn obj (findAttr' NsXLink "href")+  mbMathML <-+    if T.null href+       then -- a flat OpenDocument file has to embed the formula in the+            -- draw:object itself+            return $ XML.showElement . addMathMLNamespace <$> findMathML obj+       else do+         -- note that pandoc's own odt writer uses a trailing slash+         let dir = T.dropWhileEnd (== '/') $+                     fromMaybe href (T.stripPrefix "./" href)+         fmap (UTF8.toText . B.toStrict) <$>+           lookupResource (T.unpack (dir <> "/content.xml"))+  case readMathML <$> mbMathML of+    Just (Right exps) -> return $ firstMatch $ displayMath $ writeTeX exps+    _                 -> return mempty +-- | Find the MathML of a formula embedded in a @draw:object@.  It is+-- searched for as a descendant, not as a direct child, because the+-- @math@ element may be wrapped in an @office:document@ element+-- describing an embedded formula document.+findMathML :: XML.Element -> Maybe XML.Element+findMathML = XML.filterElementName ((== "math") . XML.qName)++-- | XML.Light carries namespace prefixes literally and does not+-- synthesise declarations, so the declaration of the MathML namespace+-- may have been left behind on the root of the flat file.+addMathMLNamespace :: XML.Element -> XML.Element+addMathMLNamespace el =+  el{ XML.elAttribs =+        XML.Attr (XML.QName "xmlns" Nothing Nothing)+                 "http://www.w3.org/1998/Math/MathML"+        : filter (not . isDefaultNS . XML.attrKey) (XML.elAttribs el) }+ where+  isDefaultNS qn = XML.qName qn == "xmlns" && isNothing (XML.qPrefix qn)+ read_frame_text_box :: XML.Element -> ODTReader (FirstMatch Inlines) read_frame_text_box box = do   paragraphs <- executeIn box (matchSmushedChildBlocks' [ read_paragraph ])@@ -905,21 +1064,33 @@ ----------------------  read_text :: ODTReader Pandoc-read_text = doc <$> matchSmushedChildBlocks' [ read_header-                                             , read_paragraph-                                             , read_list-                                             , read_section-                                             , read_table-                                             ]+read_text = doc <$> matchBlockContent  post_process :: Pandoc -> Pandoc-post_process (Pandoc m blocks) =-  Pandoc m (post_process' blocks)+post_process = walk (unwrapCaptions . attachCaptions) -post_process' :: [Block] -> [Block]-post_process' (Table attr _ specs th tb tf : Div ("", ["caption"], _) blks : xs)-  = Table attr (Caption Nothing blks) specs th tb tf : post_process' xs-post_process' bs = bs+-- | Paragraphs styled as table captions are read as a Div with class+-- @caption@ (see 'constructPara'). Attach each of them to the adjacent+-- table; ODF puts the caption either before or after its table.+attachCaptions :: [Block] -> [Block]+attachCaptions (Table attr _ specs th tb tf : b : xs)+  | Just blks <- captionBlocks b+  = Table attr (Caption Nothing blks) specs th tb tf : attachCaptions xs+attachCaptions (b : Table attr _ specs th tb tf : xs)+  | Just blks <- captionBlocks b+  = Table attr (Caption Nothing blks) specs th tb tf : attachCaptions xs+attachCaptions (b : bs) = b : attachCaptions bs+attachCaptions []       = []++-- | The Div is only an internal marker, so a caption paragraph that+-- turned out not to belong to a table is emitted as an ordinary+-- paragraph rather than leaking the marker into the output.+unwrapCaptions :: [Block] -> [Block]+unwrapCaptions = concatMap (\b -> fromMaybe [b] (captionBlocks b))++captionBlocks :: Block -> Maybe [Block]+captionBlocks (Div ("", ["caption"], _) blks) = Just blks+captionBlocks _                               = Nothing  read_body :: ODTReader (Pandoc, MediaBag) read_body = executeInSub NsOffice "body"
src/Text/Pandoc/Readers/ODT/Generic/XMLConverter.hs view
@@ -25,6 +25,7 @@ , modifyExtraState , getCurrentElement , elName+, findChild' , filterChildrenName' , isSet' , isSetWithDefault
src/Text/Pandoc/Readers/ODT/StyleReader.hs view
@@ -41,7 +41,6 @@  import Data.Default import qualified Data.Foldable as F-import qualified Data.List as L import qualified Data.Map as M import Data.Maybe import Data.Text (Text)@@ -447,8 +446,9 @@           <*> readUnderlineMode           <*> readStrikeThroughMode   where isFontEmphasised = [("normal",False),("italic",True),("oblique",True)]+        -- As in CSS, `bold` is weight 700; lighter weights are not bold.         isFontBold = ("normal",False):("bold",True)-                    :map ((,True) . tshow) ([100,200..900]::[Int])+                    :map (\w -> (tshow w, w >= 700)) ([100,200..900]::[Int])  readUnderlineMode     :: StyleReader (Maybe UnderlineMode) readUnderlineMode     = readLineMode "text-underline-mode"@@ -567,17 +567,27 @@ -- | Returns a chain of parent of the current style. The direct parent will -- be the first element of the list, followed by its parent and so on. -- The current style is not in the list.+-- Note that @style:parent-style-name@ references can be cyclic, so we+-- keep track of the names already seen to avoid looping forever. parents               :: Style       -> Styles ->      [Style]-parents style styles = L.unfoldr findNextParent style -- Ha!-  where findNextParent Style{..}-          = fmap (\p -> (p, p)) $ (`lookupStyle` styles) =<< styleParentName+parents style styles = go S.empty style+  where+    go seen Style{..}+      | Just name <- styleParentName+      , not (name `S.member` seen)+      , Just parent <- lookupStyle name styles+      = parent : go (S.insert name seen) parent+      | otherwise+      = []  -- | Looks up the style family of the current style. Normally, every style -- should have one. But if not, all parents are searched.+-- Searching the parents recursively would repeatedly walk the same+-- chains, taking time exponential in its length; the chain is linear,+-- so we can just walk it once. getStyleFamily        :: Style       -> Styles -> Maybe StyleFamily-getStyleFamily style@Style{..} styles-  =     styleFamily-    <|> F.asum (map (`getStyleFamily` styles) $ parents style styles)+getStyleFamily style styles+  = F.asum $ map styleFamily $ style : parents style styles  -- | Each 'Style' has certain 'StyleProperties'. But sometimes not all property -- values are specified. Instead, a value might be inherited from a
src/Text/Pandoc/Readers/Org/Inlines.hs view
@@ -34,7 +34,7 @@ import Safe (lastMay) import Control.Monad (guard, mplus, mzero, unless, when, void) import Control.Monad.Trans (lift)-import Data.Char (isAlphaNum, isSpace)+import Data.Char (isAlpha, isAlphaNum, isSpace) import qualified Data.Map as M import qualified Data.Set as Set import Data.Text (Text)@@ -79,8 +79,27 @@  -- | Parse a single Org-mode inline element inline :: PandocMonad m => OrgParser m (F Inlines)-inline =-  choice [ whitespace+inline = do+  c <- lookAhead anyChar+  (if isStrEnd c then inlineMarkup else inlineWord c)+    <* (guard =<< newlinesCountWithinLimits)+    <?> "inline"+ where+  -- Fast path for a character that starts a plain word.  Every+  -- alternative in 'inlineMarkup' other than those below begins with a+  -- character for which 'isStrEnd' holds, so none of them can match+  -- here; and 'str' always succeeds, so nothing after it is reachable.+  -- The remaining candidates are 'plainLink' (whose URI schemes all+  -- start with a letter), the org-ref form of 'cite' (which must start+  -- with "cite") and 'inlineCodeBlock' (which must start with "src_").+  inlineWord c = case c of+    'c' -> cite <|> plainLink <|> str+    's' -> plainLink <|> inlineCodeBlock <|> str+    _ | isAlpha c -> plainLink <|> str+      | otherwise -> str++  inlineMarkup = choice+         [ whitespace          , linebreak          , cite          , footnote@@ -102,8 +121,7 @@          , smartQuotes          , specialStrings          , symbol-         ] <* (guard =<< newlinesCountWithinLimits)-  <?> "inline"+         ]  -- | Read the rest of the input as inlines. inlines :: PandocMonad m => OrgParser m (F Inlines)@@ -113,7 +131,44 @@ specialChars :: [Char] specialChars = "\"$'()*+-,./:;<=>@[\\]^_{|}~" +-- | True for characters that terminate a plain 'str' run, i.e. the+-- 'specialChars' plus whitespace and newlines.  Written as a @case@ so+-- that GHC compiles it to a jump table instead of a linear scan over+-- 'specialChars'; this predicate is applied to every input character.+isStrEnd :: Char -> Bool+isStrEnd c = case c of+  ' '  -> True+  '\n' -> True+  '\r' -> True+  '"'  -> True+  '$'  -> True+  '\'' -> True+  '('  -> True+  ')'  -> True+  '*'  -> True+  '+'  -> True+  '-'  -> True+  ','  -> True+  '.'  -> True+  '/'  -> True+  ':'  -> True+  ';'  -> True+  '<'  -> True+  '='  -> True+  '>'  -> True+  '@'  -> True+  '['  -> True+  '\\' -> True+  ']'  -> True+  '^'  -> True+  '_'  -> True+  '{'  -> True+  '|'  -> True+  '}'  -> True+  '~'  -> True+  _    -> False + whitespace :: PandocMonad m => OrgParser m (F Inlines) whitespace = pure B.space <$ skipMany1 spaceChar                           <* updateLastPreCharPos@@ -125,7 +180,7 @@  str :: PandocMonad m => OrgParser m (F Inlines) str = return . B.str <$>-      ( takeWhile1P (`notElem` (specialChars ++ "\n\r ")) >>= updatePositions' )+      ( takeWhile1P (not . isStrEnd) >>= updatePositions' )       <* updateLastStrPos   where     updatePositions' str' = str' <$
src/Text/Pandoc/Readers/RST.hs view
@@ -349,7 +349,8 @@   indent <- length <$> many (char ' ')   guard $ indent >= minIndent   char ':'-  name <- many1TillChar (noneOf "\n") (char ':')+  name <- takeWhile1P (\c -> c /= '\n' && c /= ':')+  char ':'   (void (lookAhead newline)) <|> skipMany1 spaceChar   first <- anyLine   rest <- option "" $ try $ do lookAhead (count indent (char ' ') >> spaceChar)
src/Text/Pandoc/Readers/RTF.hs view
@@ -82,6 +82,12 @@                                                  -- paragraph numbering is in                                                  -- effect; every paragraph in                                                  -- scope is its own list item+                          , sPendingSurrogate :: Maybe Word16+                                                 -- A high surrogate from a \u+                                                 -- control word, held back+                                                 -- until we know whether the+                                                 -- low surrogate completing it+                                                 -- follows                           } deriving (Show)  instance Default RTFState where@@ -99,6 +105,7 @@                 , sEatChars = 0                 , sListText = False                 , sPnActive = False+                , sPendingSurrogate = Nothing                 }  type FontTable = IntMap.IntMap FontFamily@@ -385,12 +392,46 @@  addText :: PandocMonad m => Text -> RTFParser m () addText t = do+  -- A high surrogate held back by 'addUnicodeCodeUnit' can only be completed+  -- by the next \u control word, so any text in between means it was+  -- unpaired.  Empty text does not count: consuming a \u's fallback+  -- characters ends in adding the empty remainder of them, and that happens+  -- between the two halves of a surrogate pair.+  unless (T.null t) $+    updateState $ \s -> s{ sPendingSurrogate = Nothing }   gs <- sGroupStack <$> getState   let !props = case gs of                 (x:_) -> x                 _ -> def   updateState (\s -> s{ sTextContent = (props, t) : sTextContent s }) +-- | Add the character denoted by the argument of a @\\u@ control word, which+-- is a single UTF-16 code unit.  A character outside the Basic Multilingual+-- Plane is written as a surrogate pair, that is, as two consecutive @\\u@+-- words, each followed by its own fallback characters, so a high surrogate is+-- held back until we know whether the low surrogate completing it follows.+-- An unpaired surrogate denotes no character and cannot be represented in+-- 'Text', so it is dropped.+addUnicodeCodeUnit :: PandocMonad m => Word16 -> RTFParser m ()+addUnicodeCodeUnit unit = do+  mbHigh <- sPendingSurrogate <$> getState+  updateState $ \s -> s{ sPendingSurrogate = Nothing }+  case mbHigh of+    Just high | isLowSurrogate unit ->      -- a complete pair+      addText $ T.singleton $ chr $+        0x10000 + (fromIntegral high - 0xD800) * 0x400+                + (fromIntegral unit - 0xDC00)+    _ | isHighSurrogate unit ->             -- wait for the low surrogate+          updateState $ \s -> s{ sPendingSurrogate = Just unit }+      | isLowSurrogate unit -> pure ()      -- unpaired, so dropped+      | otherwise -> addText $ T.singleton $ chr $ fromIntegral unit++isHighSurrogate :: Word16 -> Bool+isHighSurrogate unit = unit >= 0xD800 && unit <= 0xDBFF++isLowSurrogate :: Word16 -> Bool+isLowSurrogate unit = unit >= 0xDC00 && unit <= 0xDFFF+ inGroup :: PandocMonad m => RTFParser m a -> RTFParser m a inGroup p = do   updateState $ \st ->@@ -660,9 +701,7 @@       -- "RTF control words generally accept signed 16-bit numbers as       -- arguments. For this reason, Unicode values greater than 32767       -- must be expressed as negative numbers."-      let codepoint :: Word16-          codepoint = fromIntegral i-      addText (T.singleton (chr $ fromIntegral codepoint))+      addUnicodeCodeUnit (fromIntegral i)     ControlWord "caps" mbp -> bs <$       modifyGroup (\g -> g{ gCaps = boolParam mbp })     ControlWord "deleted" mbp -> bs <$
src/Text/Pandoc/Readers/Roff.hs view
@@ -530,7 +530,8 @@  regularText :: PandocMonad m => RoffLexer m [LinePart] regularText = do-  s <- many1Char $ noneOf "\n\r\t \\\""+  s <- takeWhile1P (\c -> not (c == '\n' || c == '\r' || c == '\t' ||+                               c == ' ' || c == '\\' || c == '"'))   return [RoffStr s]  quoteChar :: PandocMonad m => RoffLexer m [LinePart]
src/Text/Pandoc/Readers/Roff/Escape.hs view
@@ -123,7 +123,7 @@   case c of     ' ' -> return $ emit " " -- mandoc_char(7) says this should be a nonbreaking space     '"' -> mempty <$ skipMany (satisfy (/='\n')) -- line comment-    '#' -> mempty <$ manyTill anyChar newline+    '#' -> mempty <$ (skipMany (satisfy (/='\n')) <* newline)     '%' -> return mempty  -- optional hyphenation     '&' -> return mempty  -- nonprintable zero-width     ')' -> return mempty  -- nonprintable zero-width@@ -212,11 +212,11 @@ escapeArg :: (PandocMonad m, RoffLikeLexer x) => Lexer m x T.Text escapeArg = choice     [ char '[' *> optional expandString *>-                  manyTillChar (noneOf ['\n',']']) (char ']')+                  takeWhileP (\c -> c /= '\n' && c /= ']') <* char ']'     , char '(' *> optional expandString *>                   countChar 2 (satisfy (/='\n'))     ]  -- Parses: '..' quoteArg :: (PandocMonad m, RoffLikeLexer x) => Lexer m x T.Text-quoteArg = char '\'' *> manyTillChar (noneOf ['\n','\'']) (char '\'')+quoteArg = char '\'' *> takeWhile1P (\c -> c /= '\n' && c /= '\'') <* char '\''
src/Text/Pandoc/Readers/Textile.hs view
@@ -593,6 +593,76 @@ wordBoundaries :: [Char] wordBoundaries = markupChars <> stringBreakers +-- | True for the characters in 'wordBoundaries'.  Written as a @case@ so+-- that GHC compiles it to a jump table; 'wordChunk' applies this to every+-- single character of the input (at three separate sites), so a linear+-- scan over the 39-element list here is a significant cost.  Must be kept+-- in sync with 'markupChars' and 'stringBreakers'.+isWordBoundary :: Char -> Bool+isWordBoundary c = case c of+  '\t'    -> True+  '\n'    -> True+  '\r'    -> True+  ' '     -> True+  '!'     -> True+  '"'     -> True+  '#'     -> True+  '%'     -> True+  '&'     -> True+  '\''    -> True+  '('     -> True+  ')'     -> True+  '*'     -> True+  '+'     -> True+  ','     -> True+  '-'     -> True+  '.'     -> True+  ':'     -> True+  ';'     -> True+  '<'     -> True+  '='     -> True+  '>'     -> True+  '?'     -> True+  '@'     -> True+  '['     -> True+  '\\'    -> True+  ']'     -> True+  '^'     -> True+  '_'     -> True+  '|'     -> True+  '~'     -> True+  '\171'  -> True+  '\187'  -> True+  '\8216' -> True+  '\8217' -> True+  '\8218' -> True+  '\8220' -> True+  '\8221' -> True+  '\8222' -> True+  _       -> False++-- | True for the characters in 'markupChars'.  As with 'isWordBoundary',+-- written as a @case@ to get a jump table.  Must be kept in sync with+-- 'markupChars'.+isMarkupChar :: Char -> Bool+isMarkupChar c = case c of+  '#'  -> True+  '%'  -> True+  '&'  -> True+  '*'  -> True+  '+'  -> True+  '-'  -> True+  '='  -> True+  '@'  -> True+  '['  -> True+  '\\' -> True+  ']'  -> True+  '^'  -> True+  '_'  -> True+  '|'  -> True+  '~'  -> True+  _    -> False+ -- | Parse a hyphened sequence of words hyphenedWords :: PandocMonad m => TextileParser m Text hyphenedWords = do@@ -602,10 +672,10 @@  wordChunk :: PandocMonad m => TextileParser m Text wordChunk = try $ do-  hd <- noneOf wordBoundaries-  tl <- many ( noneOf wordBoundaries <|>-               try (notFollowedBy' note *> oneOf markupChars-                     <* lookAhead (noneOf wordBoundaries) ) )+  hd <- satisfy (not . isWordBoundary)+  tl <- many ( satisfy (not . isWordBoundary) <|>+               try (notFollowedBy' note *> satisfy isMarkupChar+                     <* lookAhead (satisfy (not . isWordBoundary)) ) )   return $ T.pack $ hd:tl  -- | Any string
src/Text/Pandoc/Readers/Txt2Tags.hs view
@@ -550,6 +550,27 @@ specialChars :: [Char] specialChars = "%*-_/|:+;" +-- | True for characters that terminate a run of plain text, i.e. the+-- 'specialChars' plus newlines and spaces.  Written as a @case@ so that+-- GHC compiles it to a jump table; this is applied to every single+-- character of the input, so a linear scan over the list here is a+-- significant cost.  Must be kept in sync with 'specialChars'.+isStrEnd :: Char -> Bool+isStrEnd c = case c of+  '\n' -> True+  '\r' -> True+  ' '  -> True+  '%'  -> True+  '*'  -> True+  '+'  -> True+  '-'  -> True+  '/'  -> True+  ':'  -> True+  ';'  -> True+  '_'  -> True+  '|'  -> True+  _    -> False+ tab :: T2T Char tab = char '\t' @@ -574,7 +595,7 @@   return B.softbreak  str :: T2T Inlines-str = try $ B.str <$> takeWhile1P (`notElem` (specialChars ++ "\n\r "))+str = try $ B.str <$> takeWhile1P (not . isStrEnd)  whitespace :: T2T Inlines whitespace = try $ B.space <$ spaceChar
src/Text/Pandoc/Readers/Typst.hs view
@@ -737,22 +737,17 @@   let toWidth (VFraction f) = Just (floor $ 1000 * f)       toWidth _ = Nothing   let normalizeWidths xs =+        -- keep column widths all-or-nothing for the writers: a+        -- column the source leaves to the layout engine makes the+        -- whole table content-sized         let givenwidths = catMaybes xs-            (totgivenwidth :: Int) = sum givenwidths-            avgwidth = totgivenwidth `div` length givenwidths-            totwidth = avgwidth * length xs-         in if null givenwidths-              then replicate (length xs) B.ColWidthDefault-              else+            totwidth = sum givenwidths :: Int+         in if all isJust xs && totwidth > 0+              then                 map-                  ( \case-                      Just x ->-                        B.ColWidth (fromIntegral x / fromIntegral totwidth)-                      Nothing ->-                        B.ColWidth-                        (fromIntegral avgwidth / fromIntegral totwidth)-                  )-                  xs+                  (\x -> B.ColWidth (fromIntegral x / fromIntegral totwidth))+                  givenwidths+              else replicate (length xs) B.ColWidthDefault   widths <- case columns of     VInteger x -> pure $ replicate (fromIntegral x) B.ColWidthDefault     VArray x -> pure $ normalizeWidths $ map toWidth (V.toList x)
src/Text/Pandoc/Readers/Vimwiki.hs view
@@ -101,6 +101,35 @@ spaceChars :: [Char] spaceChars = " \t\n" +-- | True for characters that terminate a run of plain text, i.e. the+-- 'spaceChars' plus the 'specialChars'.  Written as a @case@ so that GHC+-- compiles it to a jump table; this is applied to every single character+-- of the input, so a linear scan over the list here is a significant+-- cost.  Must be kept in sync with 'spaceChars' and 'specialChars'.+isStrEnd :: Char -> Bool+isStrEnd c = case c of+  '\t' -> True+  '\n' -> True+  ' '  -> True+  '#'  -> True+  '$'  -> True+  '%'  -> True+  '*'  -> True+  ','  -> True+  '-'  -> True+  ':'  -> True+  '='  -> True+  '['  -> True+  ']'  -> True+  '^'  -> True+  '_'  -> True+  '`'  -> True+  '{'  -> True+  '|'  -> True+  '}'  -> True+  '~'  -> True+  _    -> False+ -- main parser  parseVimwiki :: PandocMonad m => VwParser m Pandoc@@ -484,7 +513,7 @@ inlineML = choice $ whitespace endlineML:inlineList  str :: PandocMonad m => VwParser m Inlines-str = B.str <$> takeWhile1P (`notElem` (spaceChars ++ specialChars))+str = B.str <$> takeWhile1P (not . isStrEnd)  whitespace :: PandocMonad m => VwParser m () -> VwParser m Inlines whitespace endline = B.space <$ (skipMany1 spaceChar <|>
src/Text/Pandoc/SelfContained.hs view
@@ -25,7 +25,7 @@ import qualified Data.Text as T import Data.Char (toLower) import Crypto.Hash (hashWith, SHA1(SHA1))-import Network.URI (escapeURIString, isUnescapedInURI)+import Network.URI (escapeURIString, isUnreserved) import System.FilePath (takeDirectory, takeExtension, (</>)) import Text.HTML.TagSoup import Text.Pandoc.Class.PandocMonad (PandocMonad (..), fetchItem,@@ -47,7 +47,7 @@ makeDataURI :: (MimeType, ByteString) -> T.Text makeDataURI (mime, raw) =   if textual-     then "data:" <> mime' <> "," <> T.pack (escapeURIString isUnescapedInURI (toString raw))+     then "data:" <> mime' <> "," <> T.pack (escapeURIString isUnreserved (toString raw))      else "data:" <> mime' <> ";base64," <> toText (encode raw')   where textual = "text/" `T.isPrefixOf` mime         raw' = if "+xml" `T.isSuffixOf` mime
src/Text/Pandoc/Templates.hs view
@@ -108,6 +108,7 @@        "asciidoc_legacy" -> getDefaultTemplate "asciidoc"        "docx"    -> getDefaultTemplate "openxml"        "odt"     -> getDefaultTemplate "opendocument"+       "fodt"    -> getDefaultTemplate "opendocument"        "html"    -> getDefaultTemplate "html5"        "docbook" -> getDefaultTemplate "docbook5"        "epub"    -> getDefaultTemplate "epub3"
src/Text/Pandoc/Writers.hs view
@@ -61,6 +61,7 @@     , writeMuse     , writeNative     , writeODT+    , writeFODT     , writeOPML     , writeOpenDocument     , writeOrg@@ -161,6 +162,7 @@   ,("json"         , TextWriter writeJSON)   ,("docx"         , ByteStringWriter writeDocx)   ,("odt"          , ByteStringWriter writeODT)+  ,("fodt"         , TextWriter writeFODT)   ,("pptx"         , ByteStringWriter writePowerpoint)   ,("epub"         , ByteStringWriter writeEPUB3)   ,("epub2"        , ByteStringWriter writeEPUB2)
src/Text/Pandoc/Writers/Docx/OpenXML.hs view
@@ -30,7 +30,7 @@ import Data.Ord (comparing) import Data.String (fromString) import qualified Data.Map as M-import Data.Maybe (fromMaybe, maybeToList, isJust)+import Data.Maybe (fromMaybe, maybeToList, isJust, listToMaybe) import Control.Monad.State ( gets, modify, MonadTrans(lift) ) import Control.Monad.Reader ( asks, MonadReader(local) ) import qualified Data.Set as Set@@ -436,6 +436,16 @@ blockToOpenXML opts blk = withDirection $ blockToOpenXML' opts blk  blockToOpenXML' :: (PandocMonad m) => WriterOptions -> Block -> WS m [Content]+-- A section's bookmark goes in its heading's paragraph, around the+-- heading's text, as Word writes one: it then marks the heading rather+-- than the whole section (#11845, #8825), and the docx reader, which+-- reads bookmarks only inside paragraphs, finds it, so a link to the+-- heading survives a round trip.+blockToOpenXML' opts (Div (ident,classes,kvs) (Header lev ("",hcls,hkvs) ils : bs))+  | "section" `elem` classes+  , not (T.null ident)+  = blockToOpenXML' opts+      (Div ("",classes,kvs) (Header lev (ident,hcls,hkvs) ils : bs)) blockToOpenXML' opts (Div (ident,classes,kvs) bs) = do   when ("math" `elem` classes) $ setFirstPara   stylemod <- case lookup dynamicStyleKey kvs of@@ -830,6 +840,69 @@   props <- getTextProps   return $ mknode "w:r" [] $ props ++ els +-- | Inject a highlight into every run of a converted math element:+-- glyph runs in a @w:rPr@ child, and a structure's non-glyph parts+-- (bars, operator spacing) in the @m:ctrlPr@ of its property element+-- (@m:sSupPr@ and the like), which Word pens when an equation is+-- highlighted by hand and which the converters omit when empty.+highlightMathRuns :: XML.Element -> XML.Element -> XML.Element+highlightMathRuns hl = go+ where+  isTag pfx n e = XML.qName (XML.elName e) == n+              && XML.qPrefix (XML.elName e) == Just pfx+  go e+    | isTag "m" "r" e || isTag "m" "ctrlPr" e =+        e{ XML.elContent = insertHl (map walkContent (XML.elContent e)) }+    | Just "m" <- XML.qPrefix (XML.elName e)+    , XML.qName (XML.elName e) `elem` structures =+        e{ XML.elContent =+             ensureCtrlPr (XML.qName (XML.elName e) <> "Pr")+                          (map walkContent (XML.elContent e)) }+    | otherwise = e{ XML.elContent = map walkContent (XML.elContent e) }+  walkContent (XML.Elem e) = XML.Elem (go e)+  walkContent c            = c+  -- OMML structures (ECMA-376 22.1.2); each takes an m:<name>Pr+  -- property element as its first child+  structures =+    [ "sSup", "sSub", "sSubSup", "sPre"+    , "f", "nary", "d", "rad", "func", "groupChr"+    , "limLow", "limUpp", "m", "eqArr", "bar"+    , "phant", "box", "borderBox", "acc" ]+  pennedCtrlPr = XML.Elem (mknode "m:ctrlPr" [] (mknode "w:rPr" [] hl))+  ensureCtrlPr prName cs = case cs of+    (XML.Elem e : rest) | isTag "m" prName e ->+      if any isCtrlPr (XML.elContent e)+        then cs+        else XML.Elem e{ XML.elContent = XML.elContent e ++ [pennedCtrlPr] } : rest+    _ -> XML.Elem (mknode ("m:" <> prName) [] pennedCtrlPr) : cs+  isCtrlPr (XML.Elem e) = isTag "m" "ctrlPr" e+  isCtrlPr _            = False+  -- merge into an existing w:rPr child if there is one, else insert a+  -- fresh w:rPr after an optional m:rPr+  insertHl cs =+    case break isWrPr cs of+      (before, XML.Elem e : rest) ->+        before ++ XML.Elem e{ XML.elContent = insertInRPr (XML.elContent e) } : rest+      _ ->+        case cs of+          (XML.Elem e : rest) | isTag "m" "rPr" e ->+            XML.Elem e : wrPr : rest+          _ -> wrPr : cs+  -- w:rPr children come in a fixed order (rPrTagOrder): the+  -- highlight goes before the first child that must follow it, and+  -- after children not in the order+  insertInRPr [] = [XML.Elem hl]+  insertInRPr (c:rest)+    | followsHl c = XML.Elem hl : c : rest+    | otherwise = c : insertInRPr rest+  followsHl (XML.Elem e) =+    maybe False (> rPrTagOrder M.! "highlight") $+      M.lookup (XML.qName (XML.elName e)) rPrTagOrder+  followsHl _ = False+  isWrPr (XML.Elem e) = isTag "w" "rPr" e+  isWrPr _            = False+  wrPr = XML.Elem (mknode "w:rPr" [] hl)+ -- | Convert an inline element to OpenXML. inlineToOpenXML :: PandocMonad m => WriterOptions -> Inline -> WS m [Content] inlineToOpenXML opts il = withDirection $ inlineToOpenXML' opts il@@ -963,7 +1036,14 @@   when (mathType == DisplayMath) setFirstPara   res <- (lift . lift) (convertMath writeOMML mathType str)   case res of-       Right r -> return [Elem $ fromXLElement r]+       Right r -> do+         tprops <- asks envTextProperties+         let r' = fromXLElement r+             mbhl = listToMaybe+               [ e | e <- otherElements tprops+                    , XML.qName (XML.elName e) == "highlight"+                    , XML.qPrefix (XML.elName e) == Just "w" ]+         return [Elem (maybe r' (`highlightMathRuns` r') mbhl)]        Left il -> inlineToOpenXML' opts il inlineToOpenXML' opts (Cite _ lst) = inlinesToOpenXML opts lst inlineToOpenXML' opts (Code attrs str) = do
src/Text/Pandoc/Writers/Docx/StyleMap.hs view
@@ -16,6 +16,7 @@ module Text.Pandoc.Writers.Docx.StyleMap ( StyleMaps(..)                                          , ParaStyleName                                          , CharStyleName+                                         , TableStyleName                                          , getStyleMaps                                          , getStyleIdFromName                                          , hasStyleName@@ -30,7 +31,10 @@ import Data.String import Data.Char (isSpace) -data StyleMaps = StyleMaps { smCharStyle :: CharStyleNameMap, smParaStyle :: ParaStyleNameMap }+data StyleMaps = StyleMaps { smCharStyle  :: CharStyleNameMap+                           , smParaStyle  :: ParaStyleNameMap+                           , smTableStyle :: TableStyleNameMap }+type TableStyleNameMap = M.Map TableStyleName TableStyle type ParaStyleNameMap = M.Map ParaStyleName ParStyle type CharStyleNameMap = M.Map CharStyleName CharStyle @@ -44,4 +48,6 @@ hasStyleName styleName = M.member styleName  getStyleMaps :: Archive -> StyleMaps-getStyleMaps = uncurry StyleMaps . archiveToStyles' getStyleName getStyleName+getStyleMaps arch =+  let (s1, s2, s3) = archiveToStyles' getStyleName getStyleName getStyleName arch+  in  StyleMaps s1 s2 s3
src/Text/Pandoc/Writers/Docx/Table.hs view
@@ -23,6 +23,7 @@ import Data.Array ( elems, (!), assocs, indices ) import Data.Text (Text) import Data.Maybe (catMaybes, fromMaybe)+import Data.String import Text.Pandoc.Definition     ( ColSpec,       Caption(Caption),@@ -42,6 +43,7 @@       WriterEnv(..),       setFirstPara,       pStyleM,+      tblStyleM,       withParaProp,       withParaPropM ) import Control.Monad.Reader (asks)@@ -110,11 +112,12 @@   let (gridCols, tblWattr) = tableLayout (elems colspecs)   listLevel <- asks envListLevel   let tblStyle =  fromMaybe "Table" (lookup "custom-style" tableAttr)+  sty' <- tblStyleM (fromString $ T.unpack tblStyle)   let indent = (listLevel + 1) * 720   let hasWidths = not $ all ((== ColWidthDefault) . snd) colspecs   let tbl = mknode "w:tbl" []         ( mknode "w:tblPr" []-          ( [ mknode "w:tblStyle" [("w:val",tblStyle)] (),+          ( [ sty',               mknode "w:tblW" tblWattr () ] ++             [ mknode "w:jc" [("w:val","left")] () | indent > 0 ] ++             [ mknode "w:tblInd" [("w:w", tshow indent),("w:type","dxa")] ()
src/Text/Pandoc/Writers/Docx/Types.hs view
@@ -17,6 +17,7 @@   , ListMarker (..)   , listMarkerToId   , pStyleM+  , tblStyleM   , isStyle   , setFirstPara   , withParaProp@@ -149,7 +150,7 @@       , stExampleId      = Nothing       , stInsId          = 1       , stDelId          = 1-      , stStyleMaps      = StyleMaps M.empty M.empty+      , stStyleMaps      = StyleMaps M.empty M.empty M.empty       , stTokTypesMap    = M.empty       , stFirstPara      = False       , stFirstSectionHeader = True@@ -200,6 +201,12 @@ withParaPropM md p = do   d <- md   withParaProp d p++tblStyleM :: (PandocMonad m) => TableStyleName -> WS m XML.Element+tblStyleM styleName = do+  tStyleMap <- gets (smTableStyle . stStyleMaps)+  let sty' = getStyleIdFromName styleName tStyleMap+  return $ mknode "w:tblStyle" [("w:val", fromStyleId sty')] ()  isStyle :: Element -> Bool isStyle e = isElem [] "w" "rStyle" e ||
src/Text/Pandoc/Writers/HTML.hs view
@@ -479,7 +479,7 @@                   defField "slidy-url"                     ("https://www.w3.org/Talks/Tools/Slidy2" :: Doc Text) .                   defField "slideous-url" ("slideous" :: Doc Text) .-                  defField "revealjs-url" ("https://unpkg.com/reveal.js@^5" :: Doc Text) $+                  defField "revealjs-url" ("https://unpkg.com/reveal.js@^6" :: Doc Text) $                   defField "s5-url" ("s5/default" :: Doc Text) .                   defField "table-caption-below"                      (writerTableCaptionPosition opts == CaptionBelow) .
src/Text/Pandoc/Writers/LaTeX.hs view
@@ -1205,7 +1205,8 @@                   _ -> ["keepaspectratio"]) <>                 maybe [] (\x -> ["page=" <> literal x]) (lookup "page" kvs) <>                 maybe [] (\x -> ["trim=" <> literal x]) (lookup "trim" kvs) <>-                maybe [] (\x -> ["alt=" <> braces (literal x)]) mbalt <>+                maybe [] (\x -> ["alt=" <>+                              braces (hsep $ map literal $ T.words x)]) mbalt <>                 maybe [] (const ["clip"]) (lookup "clip" kvs)       options = if null optList                    then empty
src/Text/Pandoc/Writers/Markdown.hs view
@@ -50,7 +50,8 @@ import Text.Pandoc.Writers.Markdown.Inline (inlineListToMarkdown,                                             linkAttributes,                                             attrsToMarkdown,-                                            attrsToMarkua)+                                            attrsToMarkua,+                                            linkDestination) import Text.Pandoc.Writers.Markdown.Table (pipeTable, pandocTable) import Text.Pandoc.Writers.Markdown.Types (MarkdownVariant(..),                                            WriterState(..),@@ -290,7 +291,8 @@                 then empty                 else space <> "\"" <> literal tit <> "\""   return $ nest 2 $ hang 2-            ("[" <> literal label' <> "]:" <> space) (literal src <> tit')+            ("[" <> literal label' <> "]:" <> space)+            (literal (linkDestination src) <> tit')             <+> linkAttributes opts attr  -- | Return markdown representation of notes.@@ -429,28 +431,39 @@          where (id',classes',kvs') = attrs                attrs' = (id',classes',("markdown","1"):kvs') blockToMarkdown' opts (Plain inlines) = do-  -- escape if para starts with ordered list marker+  -- escape if a line starts with a list marker.  This must be done at the+  -- start of every line, not just the start of the block: a sublist can+  -- interrupt a list item's text after a LineBreak, so an unescaped marker+  -- there would be read back as a nested list, destroying the LineBreak.   variant <- asks envVariant   let escapeMarker = T.concatMap $ \x -> if T.any (== x) ".()"                                          then T.pack ['\\', x]                                          else T.singleton x   let startsWithSpace (Space:_)     = True       startsWithSpace (SoftBreak:_) = True+      startsWithSpace (LineBreak:_) = True       startsWithSpace _             = False+  let escapeLineStart ils =+        case ils of+          (Str t:ys)+            | null ys || startsWithSpace ys+            , beginsWithOrderedListMarker t+            -> RawInline (Format "markdown") (escapeMarker t):ys+          (Str t:_)+            | t == "+" || t == "-" ||+              (t == "%" && isEnabled Ext_pandoc_title_block opts &&+                           isEnabled Ext_all_symbols_escapable opts)+            -> RawInline (Format "markdown") "\\" : ils+          _ -> ils+  -- apply escapeLineStart to the head of the list, then after each LineBreak+  let go ils = case ils of+                 []             -> []+                 (LineBreak:ys) -> LineBreak : go (escapeLineStart ys)+                 (y:ys)         -> y : go ys   let inlines' =         if variant == PlainText            then inlines-           else case inlines of-                  (Str t:ys)-                    | null ys || startsWithSpace ys-                    , beginsWithOrderedListMarker t-                    -> RawInline (Format "markdown") (escapeMarker t):ys-                  (Str t:_)-                    | t == "+" || t == "-" ||-                      (t == "%" && isEnabled Ext_pandoc_title_block opts &&-                                   isEnabled Ext_all_symbols_escapable opts)-                    -> RawInline (Format "markdown") "\\" : inlines-                  _ -> inlines+           else go (escapeLineStart inlines)   contents <- inlineListToMarkdown opts inlines'   return $ contents <> cr blockToMarkdown' opts (Para inlines) =@@ -672,7 +685,7 @@          isEnabled Ext_pipe_tables opts -> do            tbl <- mkTable (pipeTable opts)            return $ (tbl $$ caption''') $$ blankline-       | not (hasBlocks || hasColRowSpans || hasFooter) &&+       | not (hasBlocks || hasColRowSpans || hasFooter || null rows) &&          isEnabled Ext_multiline_tables opts -> do            tbl <- mkTable (pandocTable opts True)            return $ nest 2 (tbl $$ caption''') $$ blankline
src/Text/Pandoc/Writers/Markdown/Inline.hs view
@@ -14,14 +14,15 @@   inlineListToMarkdown,   linkAttributes,   attrsToMarkdown,-  attrsToMarkua+  attrsToMarkua,+  linkDestination   ) where import Control.Monad (when, liftM2) import Control.Monad.Reader     ( asks, MonadReader(local) ) import Control.Monad.State.Strict     ( MonadState(get), gets, modify )-import Data.Char (isAlphaNum, isDigit)+import Data.Char (isAlphaNum, isDigit, isSpace) import Data.List (find, intersperse) import Data.List.NonEmpty (nonEmpty) import qualified Data.Map as M@@ -86,7 +87,7 @@   go ('\\':c:cs)     | isEnabled Ext_raw_tex opts = '\\':'\\':go (c:cs)     | isAlphaNum c = '\\' : go (c:cs)-    | otherwise = '\\':'\\': go cs+    | otherwise = '\\':'\\': go (c:cs)   go ('!':'[':cs) = '\\':'!':'[': go cs   go ('=':'=':cs)     | isEnabled Ext_mark opts = '\\':'=':go ('=':cs)@@ -338,6 +339,17 @@   toList (Concat a b) = a : toList b   toList x = [x] +-- | Render a link destination, enclosing it in angle brackets if+-- it contains whitespace, which is not allowed in a bare destination.+linkDestination :: Text -> Text+linkDestination src+  | T.any isSpace src = "<" <> T.concatMap escapeChar src <> ">"+  | otherwise = src+  where+    escapeChar c+      | c `elem` ['<', '>', '\\'] = T.pack ['\\', c]+      | otherwise = T.singleton c+ -- | Convert Pandoc inline element to markdown. inlineToMarkdown :: PandocMonad m => WriterOptions -> Inline -> MD m (Doc Text) inlineToMarkdown opts (Span ("",["emoji"],kvs) [Str s]) =@@ -700,8 +712,8 @@             writeHtml5String opts{ writerTemplate = Nothing }             (Pandoc nullMeta [Plain [lnk]])       | otherwise -> return $-         "[" <> linktext <> "](" <> literal src <> linktitle <> ")" <>-         linkAttributes opts attr+         "[" <> linktext <> "](" <> literal (linkDestination src) <> linktitle+         <> ")" <> linkAttributes opts attr inlineToMarkdown opts img@(Image attr alternate (source, tit))   | isEnabled Ext_raw_html opts &&     not (isEnabled Ext_link_attributes opts || isEnabled Ext_attributes opts) &&
src/Text/Pandoc/Writers/ODT.hs view
@@ -11,15 +11,16 @@  Conversion of 'Pandoc' documents to ODT. -}-module Text.Pandoc.Writers.ODT ( writeODT ) where+module Text.Pandoc.Writers.ODT ( writeODT, writeFODT ) where import Codec.Archive.Zip import Control.Monad.Except (catchError, throwError) import Control.Monad.State.Strict (StateT, evalStateT, gets, modify, lift) import Control.Monad (MonadPlus(mplus))+import Data.ByteString.Base64 (encode) import qualified Data.ByteString.Lazy as B-import Data.Maybe (fromMaybe, listToMaybe)+import Data.Maybe (catMaybes, fromMaybe, listToMaybe, mapMaybe, maybeToList) import Data.Generics (everywhere', mkT)-import Data.List (isPrefixOf)+import Data.List (isPrefixOf, partition) import qualified Data.Map as Map import qualified Data.Text as T import qualified Data.Text.Lazy as TL@@ -39,21 +40,28 @@ import Text.Pandoc.Highlighting (defaultStyle) import Text.DocLayout import Text.Pandoc.Shared (stringify, stringifyInlines, tshow)+import Text.Pandoc.Templates (compileDefaultTemplate) import Text.Pandoc.Version (pandocVersionText) import Text.Pandoc.Writers.Shared (lookupMetaString, lookupMetaBlocks,                                    fixDisplayMath, getLang,                                    ensureValidXmlIdentifiers)-import Text.Pandoc.UTF8 (fromStringLazy, fromTextLazy, toTextLazy)+import Text.Pandoc.UTF8 (fromStringLazy, fromTextLazy, toText, toTextLazy) import Text.Pandoc.Walk import Text.Pandoc.Writers.OpenDocument (writeOpenDocument) import Text.Pandoc.XML import Text.Pandoc.XML.Light+import qualified Text.Pandoc.XML.Light as XML import Text.TeXMath import qualified Text.XML.Light as XL import Network.URI (parseRelativeReference, URI(uriPath), isURI) import Skylighting -newtype ODTState = ODTState { stEntries :: [Entry]+-- | ODF can be written either as a zip archive of several XML files or+-- as a single flat XML file.+data ODTVariant = Zipped | Flat deriving (Eq, Show)++data ODTState = ODTState { stEntries :: [Entry]+                         , stVariant :: ODTVariant                          }  type O m = StateT ODTState m@@ -65,14 +73,16 @@          -> m B.ByteString writeODT  opts doc =   let initState = ODTState{ stEntries = []+                          , stVariant = Zipped                           }       doc' = fixInternalLinks . ensureValidXmlIdentifiers $ doc   in-    evalStateT (pandocToODT opts doc') initState+    fromArchive <$> evalStateT (pandocToODT opts doc') initState  -- | ODT internal links are evaluated relative to an imaginary folder -- structure that mirrors the zip structure.  The result is that relative -- links in the document need to start with `..`.  See #3524.+-- This does not apply to flat ODF, which is a single file. fixInternalLinks :: Pandoc -> Pandoc fixInternalLinks = walk go  where@@ -85,11 +95,209 @@         | not (null (uriPath u)) -> tshow $ u{ uriPath = "../" <> uriPath u }       _ -> uri --- | Produce an ODT file from a Pandoc document.+-- | Produce a flat OpenDocument text file (@.fodt@) from a Pandoc+-- document.  This is the same content as an ODT, but as a single XML+-- file instead of a zip archive.+writeFODT :: PandocMonad m+          => WriterOptions  -- ^ Writer options+          -> Pandoc         -- ^ Document to convert+          -> m T.Text+writeFODT opts doc = do+  let initState = ODTState{ stEntries = []+                          , stVariant = Flat+                          }+      -- note: no fixInternalLinks, since a flat file has no zip+      -- structure for relative references to be resolved against+      doc' = ensureValidXmlIdentifiers doc+  evalStateT (pandocToODT opts doc') initState >>= flattenODT++officeNS :: T.Text+officeNS = "urn:oasis:names:tc:opendocument:xmlns:office:1.0"++officeQName :: T.Text -> QName+officeQName n = QName n (Just officeNS) (Just "office")++-- | The top-level child of an ODF part, e.g. @office:body@ of+-- @content.xml@.  Only the local name is matched if the document gives+-- no namespace URI.+officeChild :: T.Text -> Element -> Maybe Element+officeChild name el = listToMaybe+  [ e | Elem e <- elContent el+      , qName (elName e) == name+      , maybe True (== officeNS) (qURI (elName e)) ]++-- | Convert an ODT archive into the equivalent flat OpenDocument file.+--+-- A flat ODF file is a single @office:document@ element whose children+-- are exactly the top-level elements that are otherwise distributed over+-- @content.xml@, @styles.xml@, @meta.xml@ and @settings.xml@, in this+-- order:+--+-- > office:meta? office:settings? office:scripts? office:font-face-decls?+-- > office:styles? office:automatic-styles? office:master-styles? office:body+--+-- Anything that would be a separate archive entry -- images and+-- formulas -- is embedded inline instead.+flattenODT :: forall m . PandocMonad m => Archive -> m T.Text+flattenODT archive = do+  contentRoot <- getRoot "content.xml"+  stylesRoot  <- getRoot "styles.xml"+  metaRoot    <- getRoot "meta.xml"+  -- the bundled reference.odt has no settings.xml, but a reference doc+  -- written by LibreOffice does+  settingsRoot <- traverse parseEntry (findEntryByPath "settings.xml" archive)+  let roots = [contentRoot, stylesRoot, metaRoot] ++ maybeToList settingsRoot+  -- only one of each of these is allowed in a document, so the ones+  -- from content.xml and styles.xml must be combined+  let (fontFaceDecls, _) = mergeParts (officeChild "font-face-decls" contentRoot)+                                      (officeChild "font-face-decls" stylesRoot)+  let (automaticStyles, dropped) =+        mergeParts (officeChild "automatic-styles" contentRoot)+                   (officeChild "automatic-styles" stylesRoot)+  mapM_ (\e -> report $ UnusualConversion $+                 "flat OpenDocument output: dropping the automatic style "+                 <> snd (partKey e) <> " from styles.xml, because content.xml "+                 <> "defines a style of the same name")+        dropped+  let children = catMaybes+        [ officeChild "meta" metaRoot+        , settingsRoot >>= officeChild "settings"+        , listToMaybe $ mapMaybe (officeChild "scripts") roots+        , fontFaceDecls+        , officeChild "styles" stylesRoot+        , automaticStyles+        , officeChild "master-styles" stylesRoot+        , officeChild "body" contentRoot+        ]+  let root = Element (officeQName "document")+               ( Attr (officeQName "mimetype")+                      "application/vnd.oasis.opendocument.text"+               : Attr (officeQName "version") "1.3"+               : nsDecls roots )+               (map (Elem . embedArchiveRefs archive) children)+               Nothing+  -- note: not prettyConfigPP, which would inject whitespace into text+  -- content and thereby change the document+  return $ showTopElement root+ where+  parseEntry :: Entry -> m Element+  parseEntry e =+    case parseXMLElement (toTextLazy (fromEntry e)) of+      Left msg -> throwError $ PandocXMLError (T.pack (eRelativePath e)) msg+      Right el -> return el+  getRoot :: FilePath -> m Element+  getRoot path =+    case findEntryByPath path archive of+      Nothing -> throwError $ PandocSomeError $+                   "Could not find " <> T.pack path <> " in the ODT archive"+      Just e  -> parseEntry e++-- | The union of the namespace declarations on the given elements.+-- Declarations survive parsing as ordinary attributes with the prefix+-- @xmlns@, and are not synthesised on output, so they must be carried+-- over to the flat file's root by hand.  Declarations on nested elements+-- are copied along with those elements.+nsDecls :: [Element] -> [XML.Attr]+nsDecls els = Map.elems $ Map.fromListWith (\_new old -> old)+  [ ((qPrefix (attrKey a), qName (attrKey a)), a)+  | el <- els+  , a <- elAttribs el+  , isNSDecl (attrKey a) ]+ where+  isNSDecl qn = qPrefix qn == Just "xmlns"+                || (qPrefix qn == Nothing && qName qn == "xmlns")++-- | Combine two @office:font-face-decls@ or @office:automatic-styles@+-- elements, preferring the first.  Returns the merged element and the+-- declarations of the second that were dropped as duplicates.+mergeParts :: Maybe Element -> Maybe Element -> (Maybe Element, [Element])+mergeParts Nothing  mbSecond = (mbSecond, [])+mergeParts mbFirst  Nothing  = (mbFirst, [])+mergeParts (Just first) (Just second) =+  (Just first{ elContent = elContent first ++ map Elem kept }, dropped)+ where+  keys = map partKey [ e | Elem e <- elContent first ]+  (dropped, kept) = partition ((`elem` keys) . partKey)+                              [ e | Elem e <- elContent second ]++-- | Identify a font face or automatic style by its element name and+-- @style:name@.+partKey :: Element -> (T.Text, T.Text)+partKey e = (qName (elName e), partStyleName e)++partStyleName :: Element -> T.Text+partStyleName e = T.concat [ attrVal a+                           | a <- elAttribs e+                           , qName (attrKey a) == "name"+                           , qPrefix (attrKey a) == Just "style" ]++-- | Replace references to other entries of the ODT archive by the+-- entries' contents, which is the only way a flat file can carry them:+-- images become base64 in an @office:binary-data@ child, formulas+-- become MathML inside the @draw:object@.+--+-- Note that this is applied to every copied part, not just the body, so+-- that images used by a reference document's headers, footers and master+-- styles are embedded too.  References that do not resolve to an archive+-- entry are left alone; in particular, this is what makes+-- @--link-images@ work, since it writes no @Pictures/@ entry.+embedArchiveRefs :: Archive -> Element -> Element+embedArchiveRefs archive = go+ where+  go el =+    case qName (elName el) of+      "image"+        | Just entry <- flip findEntryByPath archive . T.unpack =<< xlinkHref el+        -> embedImage entry el+      "object"+        | Just path <- formulaPath =<< xlinkHref el+        , Just entry <- findEntryByPath path archive+        , Right mathml <- parseXMLElement (toTextLazy (fromEntry entry))+        -> (dropXlinkAttrs el){ elContent = [Elem mathml] }+      _ -> el{ elContent = map goContent (elContent el) }+  goContent (Elem e) = Elem (go e)+  goContent c = c++  embedImage entry el =+    case dropXlinkAttrs el of+      el' -> el'{ elAttribs = mimeAttrs ++ elAttribs el'+                , elContent = elContent el' ++ [Elem binaryData] }+   where+    mimeAttrs = [ Attr (QName "mime-type" Nothing (Just "draw")) m+                | Just m <- [getMimeType (eRelativePath entry)] ]+    binaryData = Element (officeQName "binary-data") []+                   [XML.Text (CData CDataText (base64 (fromEntry entry)) Nothing)]+                   Nothing++  base64 = T.intercalate "\n" . T.chunksOf 76 . toText . encode . B.toStrict++  -- the formula's MathML lives in content.xml of the directory the+  -- reference names+  formulaPath href =+    case fromMaybe href (T.stripPrefix "./" href) of+      "" -> Nothing+      h  -> Just $ T.unpack $+              (if "/" `T.isSuffixOf` h then h else h <> "/") <> "content.xml"++xlinkHref :: Element -> Maybe T.Text+xlinkHref el = listToMaybe [ attrVal a+                           | a <- elAttribs el+                           , qName (attrKey a) == "href"+                           , qPrefix (attrKey a) == Just "xlink" ]++-- | Drop the attributes with which the ODT writer refers to an archive+-- entry; the content is about to be embedded instead.+dropXlinkAttrs :: Element -> Element+dropXlinkAttrs el = el{ elAttribs = filter (not . isRef . attrKey) (elAttribs el) }+ where+  isRef qn = qPrefix qn == Just "xlink"+             && qName qn `elem` ["href", "type", "show", "actuate"]++-- | Produce an ODT archive from a Pandoc document. pandocToODT :: PandocMonad m             => WriterOptions  -- ^ Writer options             -> Pandoc         -- ^ Document to convert-            -> O m B.ByteString+            -> O m Archive pandocToODT opts doc@(Pandoc meta _) = do   let title = docTitle meta   let authors = docAuthors meta@@ -105,7 +313,10 @@   -- picEntriesRef <- P.newIORef ([] :: [Entry])   let refTextWidth = referenceTextWidthPt opts refArchive   doc' <- walkM (transformPicMath opts refTextWidth) $ walk fixDisplayMath doc-  newContents <- lift $ writeOpenDocument opts{writerWrapText = WrapNone} doc'+  tpl <- maybe (lift $ compileDefaultTemplate "opendocument") pure+           (writerTemplate opts)+  newContents <- lift $ writeOpenDocument+                   opts{ writerWrapText = WrapNone, writerTemplate = Just tpl } doc'   epochtime <- floor `fmap` lift P.getPOSIXTime   let contentEntry = toEntry "content.xml" epochtime                      $ fromTextLazy $ TL.fromStrict newContents@@ -195,7 +406,7 @@   archive'' <- updateStyle opts lang                   $ addEntryToArchive mimetypeEntry                   $ addEntryToArchive metaEntry archive'-  return $ fromArchive archive''+  return archive''  updateStyle :: forall m . PandocMonad m             => WriterOptions -> Maybe Lang -> Archive -> O m Archive@@ -367,7 +578,13 @@                     case T.unpack src of                       s | isURI s -> return src                         | isAbsolute s -> return src-                        | otherwise -> return $ T.pack $ ".." </> s+                        | otherwise -> do+                            -- see fixInternalLinks: relative references+                            -- are resolved against the zip structure+                            variant <- gets stVariant+                            case variant of+                              Zipped -> return $ T.pack $ ".." </> s+                              Flat   -> return $ T.pack s                   else do                     entries <- gets stEntries                     let extension = maybe (takeExtension $ takeWhile (/='?') $ T.unpack src) T.unpack
src/Text/Pandoc/Writers/OpenDocument.hs view
@@ -14,11 +14,9 @@ Conversion of 'Pandoc' documents to OpenDocument XML. -} module Text.Pandoc.Writers.OpenDocument ( writeOpenDocument ) where-import Control.Arrow ((***), (>>>))-import Control.Monad (unless, liftM)+import Control.Monad (unless, liftM, when) import Control.Monad.State.Strict ( StateT(..), modify, gets, lift ) import Data.Char (chr, isDigit)-import Data.Foldable (find) import Data.List (sortOn, sortBy) import qualified Data.List as L import qualified Data.Map as Map@@ -89,63 +87,65 @@   deriving (Show, Eq, Ord)  data WriterState =-    WriterState { stNotes          :: [Doc Text]+    WriterState { stNoteCount      :: Int                 , stTableStyles    :: [Doc Text]+                , stTableStyleCount :: Int                 , stParaStyles     :: [Doc Text]+                , stParaStyleCount :: Int+                , stParaStyleCache :: Map.Map ([(Text,Text)],[(Text,Text)]) Text+                  -- ^ cache of automatic paragraph styles, keyed on+                  -- (style attributes, paragraph properties)                 , stListOverrides  :: Map.Map (ListNumberStyle,ListNumberDelim)                                         (Text, Doc Text)                 , stTextStyles     :: Map.Map (Set.Set TextStyle)-                                        (Text, Doc Text)+                                        (Int, Doc Text)+                  -- ^ automatic text styles, with the number that+                  -- makes up the style's @Tn@ name                 , stTextStyleAttr  :: Set.Set TextStyle                 , stIndentPara     :: Int                 , stInDefinition   :: Bool-                , stTight          :: Bool                 , stFirstPara      :: Bool                 , stImageId        :: Int                 , stTableCaptionId :: Int                 , stImageCaptionId :: Int-                , stIdentTypes     :: [(Text,ReferenceType)]+                , stIdentTypes     :: Map.Map Text ReferenceType                 , stDirection      :: Maybe Direction                   -- ^ active writing mode-                , stDirStyles      :: Map.Map (Text, Direction) Text-                  -- ^ cache of direction-adjusted paragraph styles,-                  -- keyed on (parent style, writing mode)                 }  defaultWriterState :: WriterState defaultWriterState =-    WriterState { stNotes          = []+    WriterState { stNoteCount      = 0                 , stTableStyles    = []+                , stTableStyleCount = 0                 , stParaStyles     = []+                , stParaStyleCount = 0+                , stParaStyleCache = Map.empty                 , stListOverrides  = Map.empty                 , stTextStyles     = Map.empty                 , stTextStyleAttr  = Set.empty                 , stIndentPara     = 0                 , stInDefinition   = False-                , stTight          = False                 , stFirstPara      = False                 , stImageId        = 1                 , stTableCaptionId = 1                 , stImageCaptionId = 1-                , stIdentTypes     = []+                , stIdentTypes     = Map.empty                 , stDirection      = Nothing-                , stDirStyles      = Map.empty                 } -when :: Bool -> Doc Text -> Doc Text-when p a = if p then a else empty- addTableStyle :: PandocMonad m => Doc Text -> OD m ()-addTableStyle i = modify $ \s -> s { stTableStyles = i : stTableStyles s }--addNote :: PandocMonad m => Doc Text -> OD m ()-addNote i = modify $ \s -> s { stNotes = i : stNotes s }+addTableStyle i = modify $ \s ->+  s { stTableStyles = i : stTableStyles s+    , stTableStyleCount = stTableStyleCount s + 1 }  addParaStyle :: PandocMonad m => Doc Text -> OD m ()-addParaStyle i = modify $ \s -> s { stParaStyles = i : stParaStyles s }+addParaStyle i = modify $ \s ->+  s { stParaStyles = i : stParaStyles s+    , stParaStyleCount = stParaStyleCount s + 1 }  addTextStyle :: PandocMonad m-             => Set.Set TextStyle -> (Text, Doc Text) -> OD m ()+             => Set.Set TextStyle -> (Int, Doc Text) -> OD m () addTextStyle attrs i = modify $ \s ->   s { stTextStyles = Map.insert attrs i (stTextStyles s) } @@ -216,11 +216,13 @@        Nothing -> do          styles <- gets stTextStyles          case Map.lookup at styles of-              Just (styleName, _) -> return $-                inTags False "text:span" [("text:style-name",styleName)] d+              Just (num, _) -> return $+                inTags False "text:span"+                  [("text:style-name", textStyleName num)] d               Nothing -> do-                let styleName = "T" <> tshow (Map.size styles + 1)-                addTextStyle at (styleName,+                let num = Map.size styles + 1+                    styleName = textStyleName num+                addTextStyle at (num,                        inTags False "style:style"                          [("style:name", styleName)                          ,("style:family", "text")]@@ -230,6 +232,10 @@                 return $ inTags False                     "text:span" [("text:style-name",styleName)] d +-- | Name of the @n@th automatic text style.+textStyleName :: Int -> Text+textStyleName num = "T" <> tshow num+ formulaStyles :: [Doc Text] formulaStyles = [formulaStyle InlineMath, formulaStyle DisplayMath] @@ -274,16 +280,23 @@ handleSpaces :: Text -> Doc Text handleSpaces s = case T.uncons s of   Just (' ', _) -> genTag s-  Just ('\t',x) -> selfClosingTag "text:tab" [] <> rm x+  Just ('\t',x) -> tabTag <> rm x   _             -> rm s   where-    genTag = T.span (==' ') >>> tag . T.length *** rm >>> uncurry (<>)-    tag n  = when (n /= 0) $ selfClosingTag "text:s" [("text:c", tshow n)]-    rm t   = case T.uncons t of-      Just ( ' ',xs) -> char ' ' <> genTag xs-      Just ('\t',xs) -> selfClosingTag "text:tab" [] <> genTag xs-      Just (   x,xs) -> char x <> rm xs-      Nothing        -> empty+    tabTag = selfClosingTag "text:tab" []+    -- collapse a run of spaces into a single <text:s>+    genTag t = let (spaces, t') = T.span (== ' ') t+               in  tag (T.length spaces) <> rm t'+    tag 0  = empty+    tag n  = selfClosingTag "text:s" [("text:c", tshow n)]+    -- emit text verbatim up to the next space or tab; a lone space is+    -- kept literal and any further ones become a <text:s>+    rm t = let (chunk, t') = T.break (\c -> c == ' ' || c == '\t') t+               pre = if T.null chunk then empty else literal chunk+           in  case T.uncons t' of+                 Just (' ', xs) -> pre <> char ' ' <> genTag xs+                 Just (_  , xs) -> pre <> tabTag <> genTag xs+                 Nothing        -> pre  -- | Convert Pandoc document to string in OpenDocument format. writeOpenDocument :: PandocMonad m => WriterOptions -> Pandoc -> m Text@@ -292,12 +305,13 @@   let colwidth = if writerWrapText opts == WrapAuto                     then Just $ writerColumns opts                     else Nothing-  let meta' = case lookupMetaBlocks "abstract" meta of-                [] -> meta-                xs -> B.setMeta "abstract"-                        (B.divWith ("",[],[("custom-style","Abstract")])-                          (B.fromList xs))-                        meta+  -- The abstract is the one template field that takes block-level+  -- content, so it is rendered separately; everything else in the+  -- metadata goes in a context where only inlines are allowed.+  let abstractBlocks = case lookupMetaBlocks "abstract" meta of+                         [] -> []+                         xs -> [Div ("",[],[("custom-style","Abstract")]) xs]+  let meta' = B.deleteMeta "abstract" meta   -- Set the default writing direction from the "dir" metadata field;   -- in its absence, a right-to-left main language implies RTL.   let mbDir = case lookupMetaString "dir" meta of@@ -307,19 +321,30 @@                            Just l | Right lang <- parseLang l                                   , isRTLLang lang -> Just RTL                            _ -> Nothing-  ((body, metadata),s) <- flip runStateT+  ((body, abstract, metadata),s) <- flip runStateT         defaultWriterState{ stDirection = mbDir } $ do-           let collectBlockIdent (Header _ (ident,_,_) _)      = [(ident,HeaderRef)]-               collectBlockIdent (Figure (ident,_,_) _ _ )     = [(ident,FigureRef)]-               collectBlockIdent (Table (ident,_,_) _ _ _ _ _) = [(ident,TableRef)]-               collectBlockIdent _                             = []-           modify $ \s -> s{ stIdentTypes = query collectBlockIdent blocks }+           let collectBlockIdent (Header _ attr _)      = identRef HeaderRef attr+               collectBlockIdent (Figure attr _ _ )     = identRef FigureRef attr+               collectBlockIdent (Table attr _ _ _ _ _) = identRef TableRef attr+               collectBlockIdent _                      = []+               identRef ty (ident,_,_)+                 | T.null ident = []+                 | otherwise    = [(ident, ty)]+           -- only needed to resolve cross references+           when (isEnabled Ext_xrefs_name opts ||+                 isEnabled Ext_xrefs_number opts) $+             modify $ \s -> s{ stIdentTypes =+                                 Map.fromListWith (\_ old -> old)+                                   (query collectBlockIdent blocks) }            m <- metaToContext opts                   (inlinesToOpenDocument opts . blocksToInlines)                   (fmap chomp . inlinesToOpenDocument opts)                   meta'+           a <- blocksToOpenDocument opts abstractBlocks            b <- blocksToOpenDocument opts blocks-           return (b, m)+           return (b, a, m)+  -- 'styles' is reversed below, so the text styles are put in+  -- descending order here to come out as T1, T2, ..., T10   let styles   = stTableStyles s ++ stParaStyles s ++ formulaStyles ++                      map snd (sortBy (comparing (Down . fst)) (                         Map.elems (stTextStyles s)))@@ -329,6 +354,9 @@               . defField "toc" (writerTableOfContents opts)               . defField "toc-depth" (tshow $ writerTOCDepth opts)               . defField "automatic-styles" automaticStyles+              . (if null abstractBlocks+                    then id+                    else defField "abstract" abstract)               $ metadata   return $ render colwidth $     case writerTemplate opts of@@ -339,12 +367,15 @@                    => WriterOptions -> Text -> [Block] -> OD m (Doc Text) withParagraphStyle o s bs = do   s' <- dirStyleFor s+  -- 'Plain' is treated like 'Para' so that the requested style is not+  -- lost (e.g. for metadata fields, figure bodies, or tight list items)   let go (b:bs')-        | Para l <- b = cont bs' =<<-            inParagraphTagsWithStyle s' <$> inlinesToOpenDocument o l-        | otherwise   = cont bs' =<< blockToOpenDocument o b+        | Para  l <- b = cont bs' =<< styled l+        | Plain l <- b = cont bs' =<< styled l+        | otherwise    = cont bs' =<< blockToOpenDocument o b       go [] = return empty       cont bs' i = (<>) i <$> go bs'+      styled l = inParagraphTagsWithStyle s' <$> inlinesToOpenDocument o l   go bs  inPreformattedTags :: [Doc Text] -> Doc Text@@ -517,7 +548,7 @@     HorizontalRule   -> setFirstPara >> return (selfClosingTag "text:p"                          [ ("text:style-name", "Horizontal_20_Line") ])     b@(RawBlock f s) -> if f == Format "opendocument"-                        then return $ text $ T.unpack s+                        then return $ literal s                         else empty <$ report (BlockNotRendered b)     Figure a capt b  -> figure o a capt b     where@@ -550,9 +581,9 @@       table :: PandocMonad m => WriterOptions -> Ann.Table -> OD m (Doc Text)       table opts           (Ann.Table (ident, _, _) (Caption _ c) colspecs thead tbodies tfoot) = do-        tn <- length <$> gets stTableStyles-        pn <- length <$> gets stParaStyles-        let  genIds      = map chr [65..]+        tn <- gets stTableStyleCount+        pn <- gets stParaStyleCount+        let  genIds      = map colLetters [0..]              name        = "Table" <> tshow (tn + 1)              (aligns, mwidths) = unzip colspecs              fromWidth (ColWidth w) | w > 0 = w@@ -560,7 +591,7 @@              widths = map fromWidth mwidths              textWidth   = sum widths              columnIds   = zip genIds widths-             mkColumn  n = selfClosingTag "table:table-column" [("table:style-name", name <> "." <> T.singleton (fst n))]+             mkColumn  n = selfClosingTag "table:table-column" [("table:style-name", name <> "." <> fst n)]              columns     = map mkColumn columnIds              paraHStyles = paraTableStyles "Heading"  pn aligns              paraStyles  = paraTableStyles "Contents" (pn + length (newPara paraHStyles)) aligns@@ -589,8 +620,7 @@           [] ->             withParagraphStyle o "Figure" body           caption -> do-            imageDoc <- withParagraphStyle o "FigureWithCaption" $-                        map (\case {Plain i -> Para i; b -> b}) body+            imageDoc <- withParagraphStyle o "FigureWithCaption" body             captionDoc <- inlinesToOpenDocument o caption >>=                           if isEnabled Ext_native_numbering o                           then numberedFigureCaption ident@@ -619,7 +649,7 @@  numberedCaption :: Text -> Text -> Text -> Int -> Text -> Doc Text -> Doc Text numberedCaption style term name num ident caption =-    let t = text $ T.unpack term+    let t = literal term         r = num - 1         ident' = case ident of           "" -> "ref" <> name <> tshow r@@ -776,7 +806,7 @@                          inlinesToOpenDocument o     Cite      _ l -> inlinesToOpenDocument o l     RawInline f s -> if f == Format "opendocument"-                       then return $ text $ T.unpack s+                       then return $ literal s                        else do                          report $ InlineNotRendered ils                          return empty@@ -825,16 +855,17 @@           then i           else fmap mkBookmarkedSpan i       mkNote     l = do-        n <- length <$> gets stNotes+        n <- gets stNoteCount+        -- bump the counter before rendering the body, so that a note+        -- nested inside this one does not reuse the same text:id+        modify $ \st -> st{ stNoteCount = n + 1 }         let footNote t = inTags False "text:note"                          [ ("text:id"        , "ftn" <> tshow n)                          , ("text:note-class", "footnote"     )] $                          inTagsSimple "text:note-citation" (text . show $ n + 1) <>                          inTagsSimple "text:note-body" t-        nn <- footNote <$> withAlteredTextStyles (const mempty)-                            (withParagraphStyle o "Footnote" l)-        addNote nn-        return nn+        footNote <$> withAlteredTextStyles (const mempty)+                       (withParagraphStyle o "Footnote" l)  formatOpenDocument :: FormatOptions -> [SourceLine] -> [[Doc Text]] formatOpenDocument _fmtOpts = map (map toHlTok)@@ -845,12 +876,10 @@ preformatted :: Text -> Doc Text preformatted s = handleSpaces $ escapeStringForXML s -mkLink :: WriterOptions -> [(Text,ReferenceType)] -> Text -> Text -> Doc Text -> Doc Text+mkLink :: WriterOptions -> Map.Map Text ReferenceType -> Text -> Text+       -> Doc Text -> Doc Text mkLink o identTypes s t d =-  let maybeIdentAndType = case T.uncons s of-                            Just ('#', ident) -> find ((ident ==) . fst) identTypes-                            _                 -> Nothing-      d' = inSpanTags "Definition" d+  let d' = inSpanTags "Definition" d       ref refType format ident       = inTags False refType                                        [ ("text:reference-format", format ),                                          ("text:ref-name", ident) ]@@ -875,16 +904,27 @@                                           , ("xlink:href" , s       )                                           , ("office:name", t       )                                           ] d'-      linkOrReference = case maybeIdentAndType of-                          Just (ident, HeaderRef) -> bookmarkRef' ident-                          Just (ident, TableRef)  -> sequenceRef' ident-                          Just (ident, FigureRef) -> sequenceRef' ident-                          _                       -> link+      linkOrReference = case T.uncons s of+                          Just ('#', ident) ->+                            case Map.lookup ident identTypes of+                              Just HeaderRef -> bookmarkRef' ident+                              Just TableRef  -> sequenceRef' ident+                              Just FigureRef -> sequenceRef' ident+                              Nothing        -> link+                          _ -> link       in if isEnabled Ext_xrefs_name o || isEnabled Ext_xrefs_number o             then linkOrReference             else link -tableStyle :: Int -> Double -> [(Char,Double)] -> Doc Text+-- | Spreadsheet-style column names (@A@, @B@, ..., @Z@, @AA@, @AB@, ...).+-- Plain @chr@ arithmetic would run past @Z@ into characters like @[@+-- and @\\@, which are not legal in a @style:name@.+colLetters :: Int -> Text+colLetters n+  | n < 26    = T.singleton (chr (65 + n))+  | otherwise = colLetters (n `div` 26 - 1) <> T.singleton (chr (65 + n `mod` 26))++tableStyle :: Int -> Double -> [(Text,Double)] -> Doc Text tableStyle num textWidth wcs =     let tableId        = "Table" <> tshow (num + 1)         tableWidthAttr :: [(Text,Text)]@@ -898,10 +938,10 @@                          selfClosingTag "style:table-properties"                          (("table:align", "center") : tableWidthAttr)         colStyle (c,0) = selfClosingTag "style:style"-                         [ ("style:name"  , tableId <> "." <> T.singleton c)+                         [ ("style:name"  , tableId <> "." <> c)                          , ("style:family", "table-column"       )]         colStyle (c,w) = inTags True "style:style"-                         [ ("style:name"  , tableId <> "." <> T.singleton c)+                         [ ("style:name"  , tableId <> "." <> c)                          , ("style:family", "table-column"       )] $                          selfClosingTag "style:table-column-properties"                          [("style:rel-column-width", T.pack $ printf "%d*" (floor $ w * 65535 :: Integer))]@@ -930,32 +970,18 @@ paraStyle attrs = do   i  <- (*) (0.5 :: Double) . fromIntegral <$> gets stIndentPara   b  <- gets stInDefinition-  t  <- gets stTight   dirAttrs <- getDirAttrs   let indentVal = flip (<>) "in" . tshow $ if b then max 0.5 i else i-      tight     = if t then [ ("fo:margin-top"          , "0in"    )-                            , ("fo:margin-bottom"       , "0in"    )]-                       else []       indent    = if i /= 0 || b                       then [ ("fo:margin-left"         , indentVal)                            , ("fo:margin-right"        , "0in"    )                            , ("fo:text-indent"         , "0in"    )                            , ("style:auto-text-indent" , "false"  )]                       else []-      attributes = indent <> tight <> dirAttrs+      attributes = indent <> dirAttrs   case (attributes, attrs) of     ([], [("style:parent-style-name", parent)]) -> return parent-    _ -> do-      pn <- (+) 1 . length <$> gets stParaStyles-      let name      = "P" <> tshow pn-          styleAttr = [ ("style:name"  , name)-                      , ("style:family", "paragraph") ]-          paraProps = if null attributes-                         then mempty-                         else selfClosingTag-                                 "style:paragraph-properties" attributes-      addParaStyle $ inTags True "style:style" (styleAttr <> attrs) paraProps-      return name+    _ -> mkParaStyle attrs attributes  paraStyleFromParent :: PandocMonad m => Text -> [(Text,Text)] -> OD m Text paraStyleFromParent parent attrs = do@@ -963,14 +989,29 @@   let attrs' = attrs <> dirAttrs   if null attrs'      then return parent-     else do-      pn <- (+) 1 . length <$> gets stParaStyles-      let name      = "P" <> tshow pn-          styleAttr = [ ("style:name"             , name)-                      , ("style:family"           , "paragraph")-                      , ("style:parent-style-name", parent)]-          paraProps = selfClosingTag "style:paragraph-properties" attrs'+     else mkParaStyle [("style:parent-style-name", parent)] attrs'++-- | Create an automatic paragraph style with the given @style:style@+-- attributes and @style:paragraph-properties@, reusing an identical+-- style if one has already been created.+mkParaStyle :: PandocMonad m => [(Text,Text)] -> [(Text,Text)] -> OD m Text+mkParaStyle attrs props = do+  cache <- gets stParaStyleCache+  case Map.lookup (attrs, props) cache of+    Just name -> return name+    Nothing -> do+      name <- ("P" <>) . tshow . (+ 1) <$> gets stParaStyleCount+      let styleAttr = ("style:name"  , name)+                    : ("style:family", "paragraph")+                    : attrs+          paraProps = if null props+                         then mempty+                         else selfClosingTag+                                 "style:paragraph-properties" props       addParaStyle $ inTags True "style:style" styleAttr paraProps+      modify $ \st -> st{ stParaStyleCache =+                            Map.insert (attrs, props) name+                                       (stParaStyleCache st) }       return name  getDirAttrs :: PandocMonad m => OD m [(Text, Text)]@@ -986,26 +1027,14 @@  -- | Adjust a named paragraph style for the current writing direction. -- When a direction is active, an automatic style derived from the--- given style with the appropriate @style:writing-mode@ is created--- (and cached).  Automatic style names (@P1@, @P2@, ...) pass through--- unchanged, since automatic styles are always created with the--- current direction included.+-- given style with the appropriate @style:writing-mode@ is created.+-- With no direction active the name passes through unchanged, as do+-- automatic style names (@P1@, @P2@, ...), since automatic styles are+-- always created with the current direction included. dirStyleFor :: PandocMonad m => Text -> OD m Text-dirStyleFor parent = do-  mbDir <- gets stDirection-  case mbDir of-    Nothing -> return parent-    Just d-      | isAutoStyleName parent -> return parent-      | otherwise -> do-          cache <- gets stDirStyles-          case Map.lookup (parent, d) cache of-            Just name -> return name-            Nothing -> do-              name <- paraStyleFromParent parent []-              modify $ \st -> st{ stDirStyles =-                     Map.insert (parent, d) name (stDirStyles st) }-              return name+dirStyleFor parent+  | isAutoStyleName parent = return parent+  | otherwise              = paraStyleFromParent parent []   where     isAutoStyleName t = case T.uncons t of       Just ('P', ds) -> not (T.null ds) && T.all isDigit ds
src/Text/Pandoc/Writers/Typst.hs view
@@ -28,7 +28,7 @@ import Data.Bifunctor (first, second) import Network.URI (unEscapeString) import qualified Data.Text as T-import Control.Monad (unless)+import Control.Monad (unless, when) import Control.Monad.State ( StateT, evalStateT, gets, modify ) import Text.Pandoc.Writers.Shared ( lookupMetaInlines, lookupMetaString,                                     metaToContext, defField, resetField,@@ -49,6 +49,7 @@ import qualified Text.Pandoc.UTF8 as UTF8 import Text.Collate.Lang (Lang(..), parseLang) import Text.Printf (printf)+import Text.Read (readMaybe) import Data.Char (isDigit) import Data.Maybe (fromMaybe) import Unicode.Char (isXIDContinue)@@ -60,7 +61,11 @@   evalStateT (pandocToTypst options document)     WriterState{ stOptions = options,                  stEscapeContext = NormalContext,-                 stHighlighting = False }+                 stHighlighting = False,+                 stCsl = False,+                 stCslHangingIndent = Nothing,+                 stCslEntrySpacing = Nothing+               }  data EscapeContext = NormalContext | TermContext   deriving (Show, Eq)@@ -69,7 +74,10 @@   WriterState {     stOptions :: WriterOptions,     stEscapeContext :: EscapeContext,-    stHighlighting :: Bool+    stHighlighting :: Bool,+    stCsl :: Bool,+    stCslHangingIndent :: Maybe Text,+    stCslEntrySpacing :: Maybe Text     }  type TW m = StateT WriterState m@@ -95,7 +103,9 @@                            _         -> [])                   $ lookupMetaInlines "nocite" meta   hasHighlighting <- gets stHighlighting-+  hasCslSettings <- gets stCsl+  cslHangingIndent <- gets stCslHangingIndent+  cslEntrySpacing <- gets stCslEntrySpacing   let context = defField "body" main               $ defField "toc" (writerTableOfContents options)               $ (if isEnabled Ext_citations options@@ -112,6 +122,9 @@                           resetField "lang" (langLanguage l) .                           maybe id (resetField "region") (langRegion l))               $ defField "csl" (lookupMetaString "citation-style" meta) -- #10661+              $ defField "csl-settings" hasCslSettings+              $ maybe id (defField "csl-hanging-indent") cslHangingIndent+              $ maybe id (defField "csl-entry-spacing") cslEntrySpacing               $ defField "smart" (isEnabled Ext_smart options)               $ defField "abstract-title" abstractTitle               $ defField "toc-depth" (tshow $ writerTOCDepth options)@@ -396,15 +409,26 @@                           $$ ")" $$ lab $$ blankline     Div (ident,_,_) (Header lev ("",cls,kvs) ils:rest) ->       blocksToTypst (Header lev (ident,cls,kvs) ils:rest)-    Div (ident,_,kvs) blocks -> do+    Div (ident,cls,kvs) blocks -> do       let lab = case lookup "typst-label" kvs of                   Just l -> toLabel FreestandingLabel l                   Nothing -> toLabel FreestandingLabel ident       let (typstAttrs,typstTextAttrs) = pickTypstAttrs kvs+      when ("csl-bib-body" `elem` cls) $+        modify $ \st -> st{ stCsl = True+                          , stCslEntrySpacing =+                              case lookup "entry-spacing" kvs >>=+                                     readMaybe . T.unpack of+                                Just (n :: Int) -> Just $ tshow n <> "em"+                                Nothing -> Nothing+                          , stCslHangingIndent =+                              if "hanging-indent" `elem` cls+                                 then Just "1.5em"+                                 else Nothing }       contents <- blocksToTypst blocks       return $ "#block" <> toTypstPropsListParens typstAttrs <> "["         $$ toTypstPoundSetText typstTextAttrs-        $$ chomp contents+        $$ contents         $$ ("]" <+> lab)  defListItemToTypst :: PandocMonad m => ([Inline], [[Block]]) -> TW m (Doc Text)@@ -412,7 +436,7 @@   modify $ \st -> st{ stEscapeContext = TermContext }   term' <- inlinesToTypst term   modify $ \st -> st{ stEscapeContext = NormalContext }-  defns' <- mapM (fmap chomp . blocksToTypst) defns+  defns' <- mapM blocksToTypst defns   return $     case defns of       [[Plain _]] -> hang 4 (nowrap ("/ " <> term' <> ": ")) (vcat defns')
src/Text/Pandoc/XML.hs view
@@ -32,7 +32,7 @@ import Commonmark.Entity (lookupEntity) import Text.HTML.TagSoup.Entity (htmlEntities) import Text.DocLayout-    ( ($$), char, hcat, nest, text, Doc, HasChars )+    ( ($$), nest, text, Doc, HasChars ) import Text.Printf (printf) import qualified Data.Map as M import Data.String ( IsString )@@ -47,35 +47,63 @@                        '"' -> "&quot;"                        c   -> T.singleton c +-- | Is this character legal in XML at all?+-- See <https://www.w3.org/TR/xml/#charsets>.+isLegalXMLChar :: Char -> Bool+isLegalXMLChar c = c == '\t' || c == '\n' || c == '\r' ||+                   (c >= '\x20' && c <= '\xD7FF') ||+                   (c >= '\xE000' && c <= '\xFFFD') ||+                   (c >= '\x10000' && c <= '\x10FFFF')++-- | Does this character need to be replaced or dropped by+-- 'escapeStringForXML'?+isSpecialXMLChar :: Char -> Bool+isSpecialXMLChar = \case+  '&' -> True+  '<' -> True+  '>' -> True+  '"' -> True+  c   -> not (isLegalXMLChar c)+ -- | Escape string as needed for XML.  Entity references are not preserved. escapeStringForXML :: Text -> Text-escapeStringForXML = T.concatMap escapeCharForXML . T.filter isLegalXMLChar-  where isLegalXMLChar c = c == '\t' || c == '\n' || c == '\r' ||-                           (c >= '\x20' && c <= '\xD7FF') ||-                           (c >= '\xE000' && c <= '\xFFFD') ||-                           (c >= '\x10000' && c <= '\x10FFFF')-  -- see https://www.w3.org/TR/xml/#charsets+escapeStringForXML t+  | T.null rest = t  -- nothing to do, so return the input without copying+  | otherwise   = T.concat (chunk : go rest)+ where+  (chunk, rest) = T.break isSpecialXMLChar t+  -- 'go' is always given text starting with a special character.  Text+  -- between special characters is copied in runs rather than character+  -- by character.+  go t' = let (specials, t'') = T.span isSpecialXMLChar t'+              (chunk', rest') = T.break isSpecialXMLChar t''+           in T.concatMap escape specials :+                if T.null rest' then [chunk'] else chunk' : go rest'+  -- a special character is either one of & < > " or else not+  -- representable in XML, in which case it is dropped+  escape c | isLegalXMLChar c = escapeCharForXML c+           | otherwise        = T.empty  -- | Escape newline characters as &#10; escapeNls :: Text -> Text-escapeNls = T.concatMap $ \case-  '\n' -> "&#10;"-  c    -> T.singleton c+escapeNls t+  | T.elem '\n' t = T.replace "\n" "&#10;" t+  | otherwise     = t --- | Return a text object with a string of formatted XML attributes.-attributeList :: (HasChars a, IsString a) => [(Text, Text)] -> Doc a-attributeList = hcat . map-  (\(a, b) -> text (T.unpack $ " " <> escapeStringForXML a <> "=\"" <>-  escapeNls (escapeStringForXML b) <> "\""))+-- | The pieces of a string of formatted XML attributes, each attribute+-- preceded by a space.+attributeList :: [(Text, Text)] -> [Text]+attributeList = concatMap+  (\(a, b) -> [" ", escapeStringForXML a, "=\"",+               escapeNls (escapeStringForXML b), "\""])  -- | Put the supplied contents between start and end tags of tagType, --   with specified attributes and (if specified) indentation. inTags :: (HasChars a, IsString a)       => Bool -> Text -> [(Text, Text)] -> Doc a -> Doc a inTags isIndented tagType attribs contents =-  let openTag = char '<' <> text (T.unpack tagType) <> attributeList attribs <>-                char '>'-      closeTag  = text "</" <> text (T.unpack tagType) <> char '>'+  let openTag  = tagDoc ("<" : tagType : attributeList attribs ++ [">"])+      closeTag = tagDoc ["</", tagType, ">"]   in  if isIndented          then openTag $$ nest 2 contents $$ closeTag          else openTag <> contents <> closeTag@@ -84,7 +112,13 @@ selfClosingTag :: (HasChars a, IsString a)                => Text -> [(Text, Text)] -> Doc a selfClosingTag tagType attribs =-  char '<' <> text (T.unpack tagType) <> attributeList attribs <> text " />"+  tagDoc ("<" : tagType : attributeList attribs ++ [" />"])++-- | Assemble the pieces of a tag into a single 'Doc', so that a tag+-- costs one 'Text' allocation and one 'Doc' node rather than one of+-- each per tag name and per attribute.+tagDoc :: (HasChars a, IsString a) => [Text] -> Doc a+tagDoc = text . T.unpack . T.concat  -- | Put the supplied contents between start and end tags of tagType. inTagsSimple :: (HasChars a, IsString a)
test/Tests/Readers/Docx.hs view
@@ -112,6 +112,10 @@             "docx/char_styles.docx"             "docx/char_styles.native"           , testCompare+            "double strikethrough"+            "docx/double_strikeout.docx"+            "docx/double_strikeout.native"+          , testCompare             "hyperlinks"             "docx/links.docx"             "docx/links.native"@@ -425,8 +429,8 @@             "docx/track_changes_deletion_reject.native"           , testCompareWithOpts def{readerTrackChanges=AllChanges}             "keep insertion (all)"-            "docx/track_changes_deletion.docx"-            "docx/track_changes_deletion_all.native"+            "docx/track_changes_insertion.docx"+            "docx/track_changes_insertion_all.native"           , testCompareWithOpts def{readerTrackChanges=AllChanges}             "keep deletion (all)"             "docx/track_changes_deletion.docx"@@ -443,6 +447,18 @@             "move text (all)"             "docx/track_changes_move.docx"             "docx/track_changes_move_all.native"+          , testCompareWithOpts def{readerTrackChanges=AllChanges}+            "spaces at the edges of changes stay in the span (all)"+            "docx/track_changes_edge_spaces.docx"+            "docx/track_changes_edge_spaces_all.native"+          , testCompareWithOpts def{readerTrackChanges=AcceptChanges}+            "spaces at the edges of changes (accept)"+            "docx/track_changes_edge_spaces.docx"+            "docx/track_changes_edge_spaces_accept.native"+          , testCompareWithOpts def{readerTrackChanges=RejectChanges}+            "spaces at the edges of changes (reject)"+            "docx/track_changes_edge_spaces.docx"+            "docx/track_changes_edge_spaces_reject.native"           , testCompareWithOpts def{readerTrackChanges=AcceptChanges}             "comments (accept -- no comments)"             "docx/comments.docx"
test/Tests/Readers/DokuWiki.hs view
@@ -32,7 +32,48 @@ (=:) = test dokuwiki  tests :: [TestTree]-tests = [ testGroup "inlines"+tests = [ testGroup "math groups and comments"+          [ testGroup name+            [ test reader "nested math in a color box" $+                wrap "\\colorbox{aqua}{$F=ma$}" =?>+                  para (makeMath "\\colorbox{aqua}{$F=ma$}")+            , test reader "unpaired escaped opening brace" $+                wrap "{\\{x}" =?> para (makeMath "{\\{x}")+            , test reader "unpaired escaped closing brace" $+                wrap escapedClosing =?> para (makeMath escapedClosing)+            , test reader "commented delimiters and braces" $+                wrap commented =?> para (makeMath commented)+            , test reader "commented closing brace inside a group" $+                wrap ("{x% } " <> close <> "\ny}") =?>+                  para (makeMath $ "{x% } " <> close <> "\ny}")+            , test reader "commented opening brace inside a group" $+                wrap "{x% {\ny}" =?> para (makeMath "{x% {\ny}")+            , test reader "escaped percent is literal" $+                wrap "x\\%" =?> para (makeMath "x\\%")+            , test reader "percent after an escaped backslash is a comment" $+                wrap ("x\\\\% " <> close <> "\ny") =?>+                  para (makeMath $ "x\\\\% " <> close <> "\ny")+            ]+          | (name, ext, open, close, makeMath) <-+              [ ("dollars", Ext_tex_math_dollars, "$", "$", math)+              , ("double dollars", Ext_tex_math_dollars,+                 "$$", "$$", displayMath)+              , ("parentheses", Ext_tex_math_single_backslash,+                 "\\(", "\\)", math)+              , ("brackets", Ext_tex_math_single_backslash,+                 "\\[", "\\]", displayMath)+              , ("double-backslash parentheses", Ext_tex_math_double_backslash,+                 "\\\\(", "\\\\)", math)+              , ("double-backslash brackets", Ext_tex_math_double_backslash,+                 "\\\\[", "\\\\]", displayMath)+              ]+          , let reader = purely $ readDokuWiki def+                  { readerExtensions = extensionsFromList [ext] }+                wrap s = open <> s <> close+                escapedClosing = "{\\} hi " <> open <> "x" <> close <> " bye}"+                commented = "x% " <> close <> " { } \\%\ny"+          ]+        , testGroup "inlines"           [ "Bold" =:             "**bold**" =?>             para (strong "bold")
test/Tests/Readers/HTML.hs view
@@ -57,7 +57,48 @@                             { writerWrapText = WrapPreserve })  tests :: [TestTree]-tests = [ testGroup "base tag"+tests = [ testGroup "math groups and comments"+          [ testGroup name+            [ test reader "nested math in a color box" $+                wrap "\\colorbox{aqua}{$F=ma$}" =?>+                  para (makeMath "\\colorbox{aqua}{$F=ma$}")+            , test reader "unpaired escaped opening brace" $+                wrap "{\\{x}" =?> para (makeMath "{\\{x}")+            , test reader "unpaired escaped closing brace" $+                wrap escapedClosing =?> para (makeMath escapedClosing)+            , test reader "commented delimiters and braces" $+                wrap commented =?> para (makeMath commented)+            , test reader "commented closing brace inside a group" $+                wrap ("{x% } " <> close <> "\ny}") =?>+                  para (makeMath $ "{x% } " <> close <> "\ny}")+            , test reader "commented opening brace inside a group" $+                wrap "{x% {\ny}" =?> para (makeMath "{x% {\ny}")+            , test reader "escaped percent is literal" $+                wrap "x\\%" =?> para (makeMath "x\\%")+            , test reader "percent after an escaped backslash is a comment" $+                wrap ("x\\\\% " <> close <> "\ny") =?>+                  para (makeMath $ "x\\\\% " <> close <> "\ny")+            ]+          | (name, ext, open, close, makeMath) <-+              [ ("dollars", Ext_tex_math_dollars, "$", "$", math)+              , ("double dollars", Ext_tex_math_dollars,+                 "$$", "$$", displayMath)+              , ("parentheses", Ext_tex_math_single_backslash,+                 "\\(", "\\)", math)+              , ("brackets", Ext_tex_math_single_backslash,+                 "\\[", "\\]", displayMath)+              , ("double-backslash parentheses", Ext_tex_math_double_backslash,+                 "\\\\(", "\\\\)", math)+              , ("double-backslash brackets", Ext_tex_math_double_backslash,+                 "\\\\[", "\\\\]", displayMath)+              ]+          , let reader = purely $ readHtml def+                  { readerExtensions = extensionsFromList [ext] }+                wrap s = "<p>" <> open <> s <> close <> "</p>"+                escapedClosing = "{\\} hi " <> open <> "x" <> close <> " bye}"+                commented = "x% " <> close <> " { } \\%\ny"+          ]+        , testGroup "base tag"           [ test html "simple" $             "<head><base href=\"http://www.w3schools.com/images/foo\" ></head><body><img src=\"stickman.gif\" alt=\"Stickman\"></head>" =?>             plain (image "http://www.w3schools.com/images/stickman.gif" "" (text "Stickman"))
test/Tests/Readers/Markdown.hs view
@@ -162,7 +162,91 @@ -}  tests :: [TestTree]-tests = [ testGroup "inline code"+tests = [ testGroup "math groups"+          [ testGroup name+            [ test reader "nested math in text" $+                wrap "\\text{hi $x$ bye}" =?>+                  para (makeMath "\\text{hi $x$ bye}")+            , test reader "nested math in a color box" $+                wrap "\\colorbox{aqua}{$F=ma$}" =?>+                  para (makeMath "\\colorbox{aqua}{$F=ma$}")+            , test reader "nested groups" $+                wrap "\\fcolorbox{red}{aqua}{\\text{hi $x$ bye}}" =?>+                  para (makeMath+                    "\\fcolorbox{red}{aqua}{\\text{hi $x$ bye}}")+            , test reader "matching delimiters inside a group" $+                wrap grouped =?> para (makeMath grouped)+            , test reader "unpaired escaped opening brace inside a group" $+                wrap "{\\{x}" =?> para (makeMath "{\\{x}")+            , test reader "unpaired escaped closing brace inside a group" $+                wrap escapedClosing =?> para (makeMath escapedClosing)+            , test reader "unpaired escaped opening brace outside a group" $+                wrap "\\{x" =?> para (makeMath "\\{x")+            , test reader "unpaired escaped closing brace outside a group" $+                wrap "x\\}" =?> para (makeMath "x\\}")+            , test reader "escaped backslash before closing brace" $+                wrap "{x\\\\}" =?> para (makeMath "{x\\\\}")+            , test reader "multiline group" $+                wrap "{a\nb}" =?> para (makeMath "{a\nb}")+            , test reader "commented delimiters and braces" $+                wrap commented =?> para (makeMath commented)+            , test reader "commented closing brace inside a group" $+                wrap ("{x% } " <> close <> "\ny}") =?>+                  para (makeMath $ "{x% } " <> close <> "\ny}")+            , test reader "commented opening brace inside a group" $+                wrap "{x% {\ny}" =?> para (makeMath "{x% {\ny}")+            , test reader "escaped percent is literal" $+                wrap "x\\%" =?> para (makeMath "x\\%")+            , test reader "escaped percent does not hide a closing brace" $+                wrap "{x\\%}" =?> para (makeMath "{x\\%}")+            , test reader "escaped percent does not hide an opening brace" $+                wrap ("x\\%" <> grouped) =?>+                  para (makeMath $ "x\\%" <> grouped)+            , test reader "percent after an escaped backslash starts a comment" $+                wrap ("x\\\\% " <> close <> "\ny") =?>+                  para (makeMath $ "x\\\\% " <> close <> "\ny")+            , test reader "escaped backslash before a comment inside a group" $+                wrap "{x\\\\% }\ny}" =?>+                  para (makeMath "{x\\\\% }\ny}")+            , test reader "comment cannot supply the closing delimiter" $+                wrap "x%" =?>+                  para (text $ literalOpen <> "x%" <> literalClose)+            , test reader "consecutive comments" $+                wrap ("x%\n% } $ \\" <> "\ny") =?>+                  para (makeMath $ "x%\n% } $ \\" <> "\ny")+            , test reader "following math remains separate" $+                (wrap grouped <> " and " <> wrap "y") =?>+                  para (makeMath grouped <> " and " <> makeMath "y")+            , test reader "unclosed group falls back to text" $+                wrap "{x" =?> para (text $ literalOpen <> "{x" <>+                                          literalClose)+            , test reader "unclosed group does not hide later math" $+                (wrap "{x" <> "\n\n" <> wrap "y") =?>+                  (para (text $ literalOpen <> "{x" <> literalClose) <>+                   para (makeMath "y"))+            ]+          | (name, ext, open, close, literalOpen, literalClose, makeMath) <-+              [ ("dollars", Ext_tex_math_dollars,+                 "$", "$", "$", "$", math)+              , ("double dollars", Ext_tex_math_dollars,+                 "$$", "$$", "$$", "$$", displayMath)+              , ("parentheses", Ext_tex_math_single_backslash,+                 "\\(", "\\)", "(", ")", math)+              , ("brackets", Ext_tex_math_single_backslash,+                 "\\[", "\\]", "[", "]", displayMath)+              , ("double-backslash parentheses", Ext_tex_math_double_backslash,+                 "\\\\(", "\\\\)", "\\(", "\\)", math)+              , ("double-backslash brackets", Ext_tex_math_double_backslash,+                 "\\\\[", "\\\\]", "\\[", "\\]", displayMath)+              ]+          , let reader = purely $ readMarkdown def+                  { readerExtensions = extensionsFromList [ext] }+                wrap s = open <> s <> close+                grouped = "\\text{hi " <> open <> "x" <> close <> " bye}"+                escapedClosing = "{\\} hi " <> open <> "x" <> close <> " bye}"+                commented = "x% " <> close <> " { } \\%\ny"+          ]+        , testGroup "inline code"           [ "with attribute" =:             "`document.write(\"Hello\");`{.javascript}"             =?> para
test/Tests/Readers/ODT.hs view
@@ -28,7 +28,10 @@ defopts = def{ readerExtensions = getDefaultExtensions "odt" }  tests :: [TestTree]-tests = testsComparingToMarkdown ++ testsComparingToNative+tests = testsComparingToMarkdown ++ testsComparingToNative +++        [ testGroup "fodt" (fodtTestsComparingToMarkdown +++                            fodtTestsComparingToNative +++                            fodtTestsComparingToOwnNative) ]  testsComparingToMarkdown :: [TestTree] testsComparingToMarkdown    = map nameToTest namesOfTestsComparingToMarkdown@@ -50,7 +53,73 @@         toODTPath      name = "odt/odt/"      ++ name ++ ".odt"         toNativePath   name = "odt/native/"   ++ name ++ ".native" +-- The flat files are LibreOffice's conversions of the zipped files, and are+-- compared against the very same expectations, so that flat and zipped input+-- are asserted to converge on identical documents.  office:settings,+-- office:scripts and office:master-styles have been removed from them: they+-- are view state that the reader never looks at, and they were a quarter of+-- the bytes.+--+-- Four fixtures are enough, because a flat file shares nearly all of the+-- reader with a zipped one: once readFODT has handed the root element over,+-- the converter is the very same code.  Only two paths are reached by a flat+-- file alone, and each has a fixture that reaches it:+--+--   * "image"   -- an image with no xlink:href, so the data must be decoded+--                  from office:binary-data and the type taken from+--                  draw:mime-type rather than found in the archive+--   * "formula" -- a draw:object with no xlink:href, so the MathML is read+--                  from the element itself rather than from a sub-document+--+-- The other two guard against whitespace, which is the one hazard that is+-- peculiar to this format without being a separate branch of the reader:+-- LibreOffice pretty-prints a flat file, and that indentation is in the XML+-- the reader sees.  It has already been read as content once, as the alt text+-- of an image.  "preformattedText" is a CodeBlock, whose whitespace is+-- significant and therefore compared exactly, and "textMixedStyles" is a run+-- of nested emphasis, where stray indentation would show up between inlines.+--+-- Three of the zipped fixtures *cannot* be used, rather than merely being+-- surplus: LibreOffice's flat export renames the automatic style that marks+-- inlined code (inlinedCode), drops the cached text of a chapter reference+-- field (referenceToChapter), and resolves a relative reference to a+-- non-embedded image against the local filesystem (imageRelative). +fodtTestsComparingToMarkdown :: [TestTree]+fodtTestsComparingToMarkdown = map nameToTest namesOfFODTTestsComparingToMarkdown+  where nameToTest     name = createTest+                                compareFODTToMarkdown+                                name+                                (toFODTPath     name)+                                (toMarkdownPath name)+        toFODTPath     name = "odt/fodt/"     ++ name ++ ".fodt"+        toMarkdownPath name = "odt/markdown/" ++ name ++ ".md"++fodtTestsComparingToNative :: [TestTree]+fodtTestsComparingToNative = map nameToTest namesOfFODTTestsComparingToNative+  where nameToTest     name = createTest+                                compareFODTToNative+                                name+                                (toFODTPath     name)+                                (toNativePath   name)+        toFODTPath     name = "odt/fodt/"     ++ name ++ ".fodt"+        toNativePath   name = "odt/native/"   ++ name ++ ".native"++-- Images need their own expectations, because the media bag paths are+-- pandoc's own when the image data is embedded, and because LibreOffice+-- converts the frame dimensions to inches on export.++fodtTestsComparingToOwnNative :: [TestTree]+fodtTestsComparingToOwnNative = map nameToTest namesOfFODTTestsComparingToOwnNative+  where nameToTest     name = createTest+                                compareFODTToNative+                                name+                                (toFODTPath     name)+                                (toNativePath   name)+        toFODTPath     name = "odt/fodt/"        ++ name ++ ".fodt"+        toNativePath   name = "odt/fodt-native/" ++ name ++ ".native"++ newtype NoNormPandoc = NoNormPandoc {unNoNorm :: Pandoc}   deriving ( Show ) @@ -91,7 +160,25 @@    odt          <- getNoNormVia id "odt"      <$> runIO (readODT      opts odtFile)    return (odt,markdown) +compareFODTToNative :: TestCreator+compareFODTToNative opts fodtPath nativePath = do+   nativeFile   <- UTF8.toText <$> BS.readFile nativePath+   fodtFile     <- UTF8.toText <$> BS.readFile fodtPath+   native       <- getNoNormVia id "native" <$> runIO (readNative def nativeFile)+   fodt         <- getNoNormVia id "fodt"   <$> runIO (readFODT opts fodtFile)+   return (fodt,native) +compareFODTToMarkdown :: TestCreator+compareFODTToMarkdown opts fodtPath markdownPath = do+   markdownFile <- UTF8.toText <$> BS.readFile markdownPath+   fodtFile     <- UTF8.toText <$> BS.readFile fodtPath+   markdown     <- getNoNormVia id "markdown" <$>+                      runIO (readMarkdown def{ readerExtensions = pandocExtensions }+                              markdownFile)+   fodt         <- getNoNormVia id "fodt"     <$> runIO (readFODT opts fodtFile)+   return (fodt,markdown)++ createTest :: TestCreator            -> TestName            -> FilePath -> FilePath@@ -194,3 +281,14 @@                                   , "unorderedList"                                   , "unorderedListHeader"                                   ]++namesOfFODTTestsComparingToMarkdown :: [ String ]+namesOfFODTTestsComparingToMarkdown = [ "formula" ]++namesOfFODTTestsComparingToNative :: [ String ]+namesOfFODTTestsComparingToNative = [ "preformattedText"+                                    , "textMixedStyles"+                                    ]++namesOfFODTTestsComparingToOwnNative :: [ String ]+namesOfFODTTestsComparingToOwnNative = [ "image" ]
test/Tests/Writers/Docx.hs view
@@ -218,6 +218,11 @@             def             "docx/raw-bookmarks.native"             "docx/golden/raw-bookmarks.docx"+          , docxTest+            "mark math"+            def+            "docx/mark_math.native"+            "docx/golden/mark_math.docx"           ]         , testGroup "track changes"           [ docxTest
test/Tests/Writers/LaTeX.hs view
@@ -70,7 +70,7 @@             "\\begin{description}\n\\item[foo] ~ \n\\subsection{bar}\n\nbaz\n\\end{description}"           , "containing image" =:             header 1 (image "imgs/foo.jpg" "" (text "Alt text")) =?>-            "\\section{\\texorpdfstring{\\protect\\pandocbounded{\\includegraphics[keepaspectratio,alt={Alt text}]{imgs/foo.jpg}}}{Alt text}}"+            "\\section{\\texorpdfstring{\\protect\\pandocbounded{\\includegraphics[keepaspectratio,alt={Alt\ntext}]{imgs/foo.jpg}}}{Alt text}}"           ]         , testGroup "inline code"           [ "struck out and highlighted" =:@@ -249,7 +249,7 @@             (plain $ image (pack "img.jpg") (pack "") (text "alt text"))             =?>               "\\begin{figure}[htbp]\n\\centering\n"-              <> "\\pandocbounded{\\includegraphics[keepaspectratio,alt={alt text}]{img.jpg}}\n"+              <> "\\pandocbounded{\\includegraphics[keepaspectratio,alt={alt\ntext}]{img.jpg}}\n"               <> "\\caption{caption}\n\\end{figure}"           ]         ]
test/Tests/Writers/Markdown.hs view
@@ -49,6 +49,26 @@         , "emph/strong with spaces (#10696)"              =: emph (str "f" <> strong (space <> str "d" <> space)) <> str "l" =?>              "*f **d*** l"+        , "image destination with space"+             =: image "home/image folder/image.png" "title" "pic"+             =?> "![pic](<home/image folder/image.png> \"title\")"+        , "link destination with space and pointy brackets"+             =: link "a b<c>.pdf" "" "link"+             =?> "[link](<a b\\<c\\>.pdf>)"+        , "bullet marker after linebreak in list item"+             =: orderedList [ plain (str "Lead:" <> linebreak <>+                                     str "-" <> space <> str "alpha") ]+             =?> "1.  Lead:\\\n    \\- alpha\n"+        , "ordered marker after linebreak in list item"+             =: orderedList [ plain (str "Lead:" <> linebreak <>+                                     str "3." <> space <> str "alpha") ]+             =?> "1.  Lead:\\\n    3\\. alpha\n"+        , "lone bullet marker after linebreak"+             =: plain (str "Lead:" <> linebreak <> str "-")+             =?> "Lead:\\\n\\-"+        , "lone ordered marker after linebreak in list item"+             =: orderedList [ plain (str "Lead:" <> linebreak <> str "3.") ]+             =?> "1.  Lead:\\\n    3\\."         ] ++ [noteTests] ++ [shortcutLinkRefsTests]  {-@@ -227,6 +247,12 @@                        , "  [foo]: /url1"                        , "  [1]: /url2"                        , "  [2]: /url3"+                       ]+     , "Reference link destination with space"+           =: para (link "my file.pdf" "" "link")+           =?> unlines [ "[link]"+                       , ""+                       , "  [link]: <my file.pdf>"                        ]      , "Reference link is followed by text in brackets"           =:  para (link "/url" "" "link" <> "[text in brackets]")
+ test/Tests/Writers/ODT.hs view
@@ -0,0 +1,54 @@+{-# LANGUAGE OverloadedStrings #-}+{- |+   Module      : Tests.Writers.ODT+   Copyright   : © 2026 John MacFarlane+   License     : GNU GPL, version 2 or above++   Maintainer  : John MacFarlane <jgm@berkeley.edu>+   Stability   : alpha+   Portability : portable++Tests for the ODT writers.+-}+module Tests.Writers.ODT (tests) where++import Data.Text (Text)+import qualified Data.Text as T+import qualified Data.Text.Lazy as TL+import Test.Tasty+import Test.Tasty.HUnit+import Text.Pandoc+import Text.Pandoc.Builder+import qualified Text.Pandoc.XML.Light as XML++-- | The @xlink:href@ of every image in a flat OpenDocument file.  The+-- local name is enough to match on, since the prefix is an artifact of+-- the namespace declarations we happen to write.+imageHrefs :: Text -> IO [Text]+imageHrefs txt =+  case XML.parseXMLElement (TL.fromStrict txt) of+    Left msg    -> assertFailure $+                     "flat OpenDocument output is not valid XML: "+                     ++ T.unpack msg+    Right root  -> return+      [ href+      | el        <- XML.filterElementsName ((== "image") . XML.qName) root+      , Just href <- [XML.findAttrBy ((== "href") . XML.qName) el]+      ]++tests :: [TestTree]+tests =+  -- This cannot be a command test, because extracting the reference+  -- from the output needs a pipe into grep, and the command tests run+  -- under cmd.exe on Windows.+  [ testCase "fodt --link-images leaves a relative reference alone" $ do+      -- An ODT resolves relative references against its zip structure,+      -- so the writer prefixes them with "../" (see fixInternalLinks).+      -- A flat file is a single file, and must not have one.+      fodt  <- runIOorExplode $ setVerbosity ERROR >>+                 writeFODT def{ writerLinkImages = True } doc'+      hrefs <- imageHrefs fodt+      ["lalune.jpg"] @=? hrefs+  ]+ where+  doc' = doc $ para $ image "lalune.jpg" "" mempty
test/command/10965.md view
@@ -7,6 +7,7 @@ #block[ #set text(lang: "en"); This text should be in English.+ ] ``` @@ -19,6 +20,7 @@ #block[ #set text(lang: "fr"); Ce texte devrait être en français.+ ] ``` @@ -31,6 +33,7 @@ #block[ #set text(lang: "de"); Dieser Text sollte auf Deutsch sein.+ ] ``` @@ -42,5 +45,6 @@ ^D #block[ This should not have lang set.+ ] ```
test/command/11266.md view
@@ -9,7 +9,6 @@ \end{eqnarray} $$ ^D- \begin{eqnarray} S &\rightarrow& a A                      \nonumber \\ A &\rightarrow& d B \ | \ b A \ | \ c A  \nonumber \\
test/command/11583.md view
@@ -11,5 +11,6 @@ + item + item + item+ ] ```
test/command/11794.md view
@@ -6,6 +6,7 @@ ^D #block[ Hello+ ] <foo>  ```
+ test/command/11845.md view
@@ -0,0 +1,39 @@+A heading's bookmark is written inside the heading's paragraph, around its+text, rather than around its whole section, so a link to the heading+survives a docx round trip, and a screen reader meets the bookmark at the+heading (#11845).++```+% pandoc -f markdown -t docx -o - | pandoc -f docx -t native+# Costs {#price}++Back to [costs](#price), on to [later](#later-part).++# Later Part++End.+^D+[ Header 1 ( "costs" , [] , [] ) [ Str "Costs" ]+, Para+    [ Str "Back"+    , Space+    , Str "to"+    , Space+    , Link ( "" , [] , [] ) [ Str "costs" ] ( "#costs" , "" )+    , Str ","+    , Space+    , Str "on"+    , Space+    , Str "to"+    , Space+    , Link+        ( "" , [] , [] ) [ Str "later" ] ( "#later-part" , "" )+    , Str "."+    ]+, Header+    1+    ( "later-part" , [] , [] )+    [ Str "Later" , Space , Str "Part" ]+, Para [ Str "End." ]+]+```
+ test/command/11927.md view
@@ -0,0 +1,6 @@+```+% pandoc -f native -t commonmark+[ Para [ Str "a\\(b\\)c" , Space , Str "\\*x" ] ]+^D+a\\(b\\)c \\\*x+```
+ test/command/11939.md view
@@ -0,0 +1,19 @@+```+% pandoc -f native -t markdown+[ Table ("", [], [])+    (Caption Nothing [Plain [Str "Caption"]])+    [(AlignDefault, ColWidth 1)]+    (TableHead ("", [], [])+      [Row ("", [], [])+        [Cell ("", [], []) AlignDefault (RowSpan 1) (ColSpan 1)+          [Plain [Str "x"]]]])+    [TableBody ("", [], []) (RowHeadColumns 0) [] []]+    (TableFoot ("", [], []) [])+]+^D++-----------------------------------------------------------------------++| x                                                                     |++=======================================================================+++: Caption+```
+ test/command/11942.js view
@@ -0,0 +1,1 @@+var sel = '#main' & 1; // </script>
+ test/command/11942.md view
@@ -0,0 +1,14 @@+Characters with special meaning in a URI must be percent-encoded in a+textual `data:` URI.  In particular a bare `#` would truncate the+payload at the fragment delimiter, and bare `&` or `'` would be+HTML-escaped into entities by the serializer.++(The `</script>` in the resource is what forces the `data:` URI path+rather than inlining the script contents.)++```+% pandoc --embed-resources+<script src="command/11942.js"></script>+^D+<script src="data:text/javascript;charset=utf-8,var%20sel%20%3D%20%27%23main%27%20%26%201%3B%20%2F%2F%20%3C%2Fscript%3E%0A"></script>+```
test/command/4880.md view
@@ -1,6 +1,6 @@ ```-% pandoc -t latex-$x=y%comment$+% pandoc -t latex -f native+[Math InlineMath "x=y%comment"] ^D \(x=y%comment \)
test/command/5116.md view
@@ -12,7 +12,8 @@ ^D \begin{figure} \centering-\pandocbounded{\includegraphics[keepaspectratio,alt={This is a figure.}]{img.jpg}}+\pandocbounded{\includegraphics[keepaspectratio,alt={This is a+figure.}]{img.jpg}} \caption{This is a figure.} \end{figure} @@ -50,7 +51,8 @@ \begin{figure} \centering \caption{This is a figure.}-\pandocbounded{\includegraphics[keepaspectratio,alt={This is a figure.}]{img.jpg}}+\pandocbounded{\includegraphics[keepaspectratio,alt={This is a+figure.}]{img.jpg}} \end{figure}  \begin{longtable}[]{@{}rlcl@{}}@@ -86,7 +88,8 @@ ^D \begin{figure} \centering-\pandocbounded{\includegraphics[keepaspectratio,alt={This is a figure.}]{img.jpg}}+\pandocbounded{\includegraphics[keepaspectratio,alt={This is a+figure.}]{img.jpg}} \caption{This is a figure.} \end{figure} 
test/command/6792.md view
@@ -27,9 +27,6 @@     <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" />     </style:style>-    <style:style style:name="P2" style:family="paragraph" style:parent-style-name="Table_20_Contents">-      <style:paragraph-properties fo:text-align="center" style:justify-single-word="false" />-    </style:style>     <style:style style:name="TableHeaderRowCell" style:family="table-cell">       <style:table-cell-properties fo:border="none" />     </style:style>@@ -56,7 +53,7 @@       <text:p text:style-name="P1">2</text:p>     </table:table-cell>     <table:table-cell table:style-name="TableRowCell" office:value-type="string">-      <text:p text:style-name="P2">1</text:p>+      <text:p text:style-name="P1">1</text:p>     </table:table-cell>   </table:table-row> </table:table>
test/command/6821.md view
@@ -60,7 +60,8 @@  \begin{figure} \centering-\pandocbounded{\includegraphics[keepaspectratio,alt={This is a test x = 5}]{test.png}}+\pandocbounded{\includegraphics[keepaspectratio,alt={This is a test x =+5}]{test.png}} \caption{This is a test \protect\VERB|\NormalTok{x }\OperatorTok{=} \DecValTok{5}|} \end{figure}
test/command/7181.md view
@@ -4,7 +4,8 @@ ^D \begin{figure} \centering-\pandocbounded{\includegraphics[keepaspectratio,page=13,trim=1cm,clip,width=4cm,alt={Global frog population.}]{slides.pdf}}+\pandocbounded{\includegraphics[keepaspectratio,page=13,trim=1cm,clip,width=4cm,alt={Global+frog population.}]{slides.pdf}} \caption{Global frog population.} \end{figure} 
test/command/9002.md view
@@ -2,7 +2,8 @@ % pandoc command/9002.docx -t html ^D <table style="width:40%;">-<caption><p>This is my table!</p></caption>+<caption><p><span id="_Ref143272803" class="anchor"></span> This is my+table!</p></caption> <colgroup> <col style="width: 20%" /> <col style="width: 20%" />
test/command/9387.md view
@@ -7,6 +7,7 @@ ^D #block[ test+ ] #label("my label") See #link(label("my label"))[my label]. 
test/command/9716.md view
@@ -4,7 +4,7 @@ > A suggestion. ^D [ Div-    ( "" , [ "alert" , "tip" ] , [] )+    ( "" , [ "tip" , "alert" ] , [] )     [ Div ( "" , [ "title" ] , [] ) [ Para [ Str "Tip" ] ]     , Para [ Str "A" , Space , Str "suggestion." ]     ]
test/command/completion.md view
@@ -14,8 +14,8 @@      # These should be filled in by pandoc:     opts="-f -r --from --read -t -w --to --write -o --output --data-dir -M --metadata --metadata-file -d --defaults --file-scope --sandbox -s --standalone --template -V --variable --variable-json --wrap --ascii --toc --table-of-contents --toc-depth --lof --list-of-figures --lot --list-of-tables -N --number-sections --number-offset --top-level-division --extract-media --resource-path -H --include-in-header -B --include-before-body -A --include-after-body --no-highlight --highlight-style --syntax-definition --syntax-highlighting --dpi --eol --columns -p --preserve-tabs --tab-stop --pdf-engine --pdf-engine-opt --reference-doc --self-contained --embed-resources --link-images --request-header --no-check-certificate --abbreviations --typst-input --indented-code-classes --default-image-extension -F --filter -L --lua-filter --shift-heading-level-by --base-header-level --track-changes --strip-comments --reference-links --reference-location --figure-caption-position --table-caption-position --markdown-headings --list-tables --listings -i --incremental --slide-level --section-divs --html-q-tags --email-obfuscation --id-prefix -T --title-prefix -c --css --epub-subdirectory --epub-cover-image --epub-title-page --epub-metadata --epub-embed-font --split-level --chunk-template --epub-chapter-level --ipynb-output -C --citeproc --bibliography --csl --citation-abbreviations --natbib --biblatex --math-method --mathml --webtex --mathjax --katex --gladtex --trace --dump-args --ignore-args --verbose --quiet --fail-if-warnings --log --completion --bash-completion --list-input-formats --list-output-formats --list-extensions --list-highlight-languages --list-highlight-styles -D --print-default-template --print-default-data-file --print-highlight-style -v --version -h --help"-    informats="asciidoc biblatex bibtex bits commonmark commonmark_x creole csljson csv djot docbook docx dokuwiki endnotexml epub fb2 gfm haddock html ipynb jats jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict mdoc mediawiki muse native odt opml org pod pptx ris rst rtf t2t textile tikiwiki tsv twiki typst vimwiki xlsx xml"-    outformats="ansi asciidoc asciidoc_legacy asciidoctor bbcode bbcode_fluxbb bbcode_hubzilla bbcode_phpbb bbcode_steam bbcode_xenforo beamer biblatex bibtex chunkedhtml commonmark commonmark_x context csljson djot docbook docbook4 docbook5 docx dokuwiki dzslides epub epub2 epub3 fb2 gfm haddock html html4 html5 icml ipynb jats jats_archiving jats_articleauthoring jats_publishing jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict markua mediawiki ms muse native odt opendocument opml org pdf plain pptx revealjs rst rtf s5 slideous slidy t2t tei texinfo textile typst vimdoc xml xwiki zimwiki"+    informats="asciidoc biblatex bibtex bits commonmark commonmark_x creole csljson csv djot docbook docx dokuwiki endnotexml epub fb2 fodt gfm haddock html ipynb jats jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict mdoc mediawiki muse native odt opml org pod pptx ris rst rtf t2t textile tikiwiki tsv twiki typst vimwiki xlsx xml"+    outformats="ansi asciidoc asciidoc_legacy asciidoctor bbcode bbcode_fluxbb bbcode_hubzilla bbcode_phpbb bbcode_steam bbcode_xenforo beamer biblatex bibtex chunkedhtml commonmark commonmark_x context csljson djot docbook docbook4 docbook5 docx dokuwiki dzslides epub epub2 epub3 fb2 fodt gfm haddock html html4 html5 icml ipynb jats jats_archiving jats_articleauthoring jats_publishing jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict markua mediawiki ms muse native odt opendocument opml org pdf plain pptx revealjs rst rtf s5 slideous slidy t2t tei texinfo textile typst vimdoc xml xwiki zimwiki"     highlight_styles="pygments tango espresso zenburn kate monochrome breezedark haddock"     math_methods="plain mathml webtex mathjax katex gladtex"     datafiles="MANUAL.txt abbreviations creole.lua default.csl docbook-entities.txt docx/[Content_Types].xml docx/_rels/.rels docx/docProps/app.xml docx/docProps/core.xml docx/docProps/custom.xml docx/word/_rels/document.xml.rels docx/word/_rels/footnotes.xml.rels docx/word/comments.xml docx/word/document.xml docx/word/fontTable.xml docx/word/footnotes.xml docx/word/numbering.xml docx/word/settings.xml docx/word/styles.xml docx/word/theme/theme1.xml docx/word/webSettings.xml dzslides/template.html epub.css init.lua odt/META-INF/manifest.xml odt/content.xml odt/manifest.rdf odt/meta.xml odt/mimetype odt/styles.xml pptx/[Content_Types].xml pptx/_rels/.rels pptx/docProps/app.xml pptx/docProps/core.xml pptx/ppt/_rels/presentation.xml.rels pptx/ppt/notesMasters/_rels/notesMaster1.xml.rels pptx/ppt/notesMasters/notesMaster1.xml pptx/ppt/notesSlides/_rels/notesSlide1.xml.rels pptx/ppt/notesSlides/_rels/notesSlide2.xml.rels pptx/ppt/notesSlides/notesSlide1.xml pptx/ppt/notesSlides/notesSlide2.xml pptx/ppt/presProps.xml pptx/ppt/presentation.xml pptx/ppt/slideLayouts/_rels/slideLayout1.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout10.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout11.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout2.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout3.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout4.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout5.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout6.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout7.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout8.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout9.xml.rels pptx/ppt/slideLayouts/slideLayout1.xml pptx/ppt/slideLayouts/slideLayout10.xml pptx/ppt/slideLayouts/slideLayout11.xml pptx/ppt/slideLayouts/slideLayout2.xml pptx/ppt/slideLayouts/slideLayout3.xml pptx/ppt/slideLayouts/slideLayout4.xml pptx/ppt/slideLayouts/slideLayout5.xml pptx/ppt/slideLayouts/slideLayout6.xml pptx/ppt/slideLayouts/slideLayout7.xml pptx/ppt/slideLayouts/slideLayout8.xml pptx/ppt/slideLayouts/slideLayout9.xml pptx/ppt/slideMasters/_rels/slideMaster1.xml.rels pptx/ppt/slideMasters/slideMaster1.xml pptx/ppt/slides/_rels/slide1.xml.rels pptx/ppt/slides/_rels/slide2.xml.rels pptx/ppt/slides/_rels/slide3.xml.rels pptx/ppt/slides/_rels/slide4.xml.rels pptx/ppt/slides/slide1.xml pptx/ppt/slides/slide2.xml pptx/ppt/slides/slide3.xml pptx/ppt/slides/slide4.xml pptx/ppt/tableStyles.xml pptx/ppt/theme/theme1.xml pptx/ppt/theme/theme2.xml pptx/ppt/viewProps.xml reference.docx reference.odt reference.pptx templates/affiliations.jats templates/after-header-includes.latex templates/article.jats_publishing templates/common.latex templates/default.ansi templates/default.asciidoc templates/default.bbcode templates/default.beamer templates/default.biblatex templates/default.bibtex templates/default.chunkedhtml templates/default.commonmark templates/default.context templates/default.djot templates/default.docbook4 templates/default.docbook5 templates/default.dokuwiki templates/default.dzslides templates/default.epub2 templates/default.epub3 templates/default.haddock templates/default.html4 templates/default.html5 templates/default.icml templates/default.jats_archiving templates/default.jats_articleauthoring templates/default.jats_publishing templates/default.jira templates/default.latex templates/default.man templates/default.markdown templates/default.markua templates/default.mediawiki templates/default.ms templates/default.muse templates/default.opendocument templates/default.openxml templates/default.opml templates/default.org templates/default.plain templates/default.revealjs templates/default.rst templates/default.rtf templates/default.s5 templates/default.slideous templates/default.slidy templates/default.t2t templates/default.tei templates/default.texinfo templates/default.textile templates/default.typst templates/default.vimdoc templates/default.xwiki templates/default.zimwiki templates/document-metadata.latex templates/font-settings.latex templates/fonts.latex templates/hypersetup.latex templates/passoptions.latex templates/styles.citations.html templates/styles.html templates/template.typst translations/af.yaml translations/alt.yaml translations/am.yaml translations/ar.yaml translations/as.yaml translations/ast.yaml translations/az.yaml translations/be.yaml translations/bg.yaml translations/bn.yaml translations/bo.yaml translations/br.yaml translations/bs.yaml translations/bua.yaml translations/ca.yaml translations/ckb-Arab.yaml translations/ckb-Latn.yaml translations/cs.yaml translations/cu.yaml translations/cy.yaml translations/cz.yaml translations/da.yaml translations/de.yaml translations/dsb.yaml translations/el.yaml translations/en.yaml translations/eo.yaml translations/es-ES.yaml translations/es-MX.yaml translations/es.yaml translations/et.yaml translations/eu.yaml translations/fa.yaml translations/fi.yaml translations/fil.yaml translations/fr.yaml translations/fur.yaml translations/ga.yaml translations/gd.yaml translations/gl.yaml translations/grc.yaml translations/gu.yaml translations/ha.yaml translations/he.yaml translations/hi.yaml translations/hr.yaml translations/hsb.yaml translations/hu.yaml translations/hy.yaml translations/ia.yaml translations/id.yaml translations/is.yaml translations/it.yaml translations/ja.yaml translations/ka.yaml translations/km.yaml translations/kmr-Arab.yaml translations/kmr-Latn.yaml translations/kn.yaml translations/ko.yaml translations/la.yaml translations/lb.yaml translations/lo.yaml translations/lt.yaml translations/lv.yaml translations/mk.yaml translations/ml.yaml translations/mn.yaml translations/mr.yaml translations/ms.yaml translations/nb.yaml translations/nko.yaml translations/nl.yaml translations/nn.yaml translations/no.yaml translations/oc.yaml translations/or.yaml translations/pa.yaml translations/pl.yaml translations/pms.yaml translations/pt-BR.yaml translations/pt-PT.yaml translations/pt.yaml translations/rm.yaml translations/ro.yaml translations/ru.yaml translations/se.yaml translations/si.yaml translations/sk.yaml translations/sl.yaml translations/sq.yaml translations/sr-Cyrl.yaml translations/sr-Latn.yaml translations/sr.yaml translations/sv.yaml translations/ta.yaml translations/te.yaml translations/th.yaml translations/tk.yaml translations/tr.yaml translations/ua.yaml translations/ug.yaml translations/uk.yaml translations/ur.yaml translations/vi.yaml translations/zh-Hans.yaml translations/zh-Hant.yaml"@@ -116,14 +116,14 @@ _pandoc() {   local -a args   args=(-    '-f[Reader format]:FORMAT:(asciidoc biblatex bibtex bits commonmark commonmark_x creole csljson csv djot docbook docx dokuwiki endnotexml epub fb2 gfm haddock html ipynb jats jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict mdoc mediawiki muse native odt opml org pod pptx ris rst rtf t2t textile tikiwiki tsv twiki typst vimwiki xlsx xml)'-    '-r[Reader format]:FORMAT:(asciidoc biblatex bibtex bits commonmark commonmark_x creole csljson csv djot docbook docx dokuwiki endnotexml epub fb2 gfm haddock html ipynb jats jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict mdoc mediawiki muse native odt opml org pod pptx ris rst rtf t2t textile tikiwiki tsv twiki typst vimwiki xlsx xml)'-    '--from[Reader format]:FORMAT:(asciidoc biblatex bibtex bits commonmark commonmark_x creole csljson csv djot docbook docx dokuwiki endnotexml epub fb2 gfm haddock html ipynb jats jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict mdoc mediawiki muse native odt opml org pod pptx ris rst rtf t2t textile tikiwiki tsv twiki typst vimwiki xlsx xml)'-    '--read[Reader format]:FORMAT:(asciidoc biblatex bibtex bits commonmark commonmark_x creole csljson csv djot docbook docx dokuwiki endnotexml epub fb2 gfm haddock html ipynb jats jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict mdoc mediawiki muse native odt opml org pod pptx ris rst rtf t2t textile tikiwiki tsv twiki typst vimwiki xlsx xml)'-    '-t[Writer format]:FORMAT:(ansi asciidoc asciidoc_legacy asciidoctor bbcode bbcode_fluxbb bbcode_hubzilla bbcode_phpbb bbcode_steam bbcode_xenforo beamer biblatex bibtex chunkedhtml commonmark commonmark_x context csljson djot docbook docbook4 docbook5 docx dokuwiki dzslides epub epub2 epub3 fb2 gfm haddock html html4 html5 icml ipynb jats jats_archiving jats_articleauthoring jats_publishing jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict markua mediawiki ms muse native odt opendocument opml org pdf plain pptx revealjs rst rtf s5 slideous slidy t2t tei texinfo textile typst vimdoc xml xwiki zimwiki)'-    '-w[Writer format]:FORMAT:(ansi asciidoc asciidoc_legacy asciidoctor bbcode bbcode_fluxbb bbcode_hubzilla bbcode_phpbb bbcode_steam bbcode_xenforo beamer biblatex bibtex chunkedhtml commonmark commonmark_x context csljson djot docbook docbook4 docbook5 docx dokuwiki dzslides epub epub2 epub3 fb2 gfm haddock html html4 html5 icml ipynb jats jats_archiving jats_articleauthoring jats_publishing jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict markua mediawiki ms muse native odt opendocument opml org pdf plain pptx revealjs rst rtf s5 slideous slidy t2t tei texinfo textile typst vimdoc xml xwiki zimwiki)'-    '--to[Writer format]:FORMAT:(ansi asciidoc asciidoc_legacy asciidoctor bbcode bbcode_fluxbb bbcode_hubzilla bbcode_phpbb bbcode_steam bbcode_xenforo beamer biblatex bibtex chunkedhtml commonmark commonmark_x context csljson djot docbook docbook4 docbook5 docx dokuwiki dzslides epub epub2 epub3 fb2 gfm haddock html html4 html5 icml ipynb jats jats_archiving jats_articleauthoring jats_publishing jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict markua mediawiki ms muse native odt opendocument opml org pdf plain pptx revealjs rst rtf s5 slideous slidy t2t tei texinfo textile typst vimdoc xml xwiki zimwiki)'-    '--write[Writer format]:FORMAT:(ansi asciidoc asciidoc_legacy asciidoctor bbcode bbcode_fluxbb bbcode_hubzilla bbcode_phpbb bbcode_steam bbcode_xenforo beamer biblatex bibtex chunkedhtml commonmark commonmark_x context csljson djot docbook docbook4 docbook5 docx dokuwiki dzslides epub epub2 epub3 fb2 gfm haddock html html4 html5 icml ipynb jats jats_archiving jats_articleauthoring jats_publishing jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict markua mediawiki ms muse native odt opendocument opml org pdf plain pptx revealjs rst rtf s5 slideous slidy t2t tei texinfo textile typst vimdoc xml xwiki zimwiki)'+    '-f[Reader format]:FORMAT:(asciidoc biblatex bibtex bits commonmark commonmark_x creole csljson csv djot docbook docx dokuwiki endnotexml epub fb2 fodt gfm haddock html ipynb jats jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict mdoc mediawiki muse native odt opml org pod pptx ris rst rtf t2t textile tikiwiki tsv twiki typst vimwiki xlsx xml)'+    '-r[Reader format]:FORMAT:(asciidoc biblatex bibtex bits commonmark commonmark_x creole csljson csv djot docbook docx dokuwiki endnotexml epub fb2 fodt gfm haddock html ipynb jats jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict mdoc mediawiki muse native odt opml org pod pptx ris rst rtf t2t textile tikiwiki tsv twiki typst vimwiki xlsx xml)'+    '--from[Reader format]:FORMAT:(asciidoc biblatex bibtex bits commonmark commonmark_x creole csljson csv djot docbook docx dokuwiki endnotexml epub fb2 fodt gfm haddock html ipynb jats jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict mdoc mediawiki muse native odt opml org pod pptx ris rst rtf t2t textile tikiwiki tsv twiki typst vimwiki xlsx xml)'+    '--read[Reader format]:FORMAT:(asciidoc biblatex bibtex bits commonmark commonmark_x creole csljson csv djot docbook docx dokuwiki endnotexml epub fb2 fodt gfm haddock html ipynb jats jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict mdoc mediawiki muse native odt opml org pod pptx ris rst rtf t2t textile tikiwiki tsv twiki typst vimwiki xlsx xml)'+    '-t[Writer format]:FORMAT:(ansi asciidoc asciidoc_legacy asciidoctor bbcode bbcode_fluxbb bbcode_hubzilla bbcode_phpbb bbcode_steam bbcode_xenforo beamer biblatex bibtex chunkedhtml commonmark commonmark_x context csljson djot docbook docbook4 docbook5 docx dokuwiki dzslides epub epub2 epub3 fb2 fodt gfm haddock html html4 html5 icml ipynb jats jats_archiving jats_articleauthoring jats_publishing jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict markua mediawiki ms muse native odt opendocument opml org pdf plain pptx revealjs rst rtf s5 slideous slidy t2t tei texinfo textile typst vimdoc xml xwiki zimwiki)'+    '-w[Writer format]:FORMAT:(ansi asciidoc asciidoc_legacy asciidoctor bbcode bbcode_fluxbb bbcode_hubzilla bbcode_phpbb bbcode_steam bbcode_xenforo beamer biblatex bibtex chunkedhtml commonmark commonmark_x context csljson djot docbook docbook4 docbook5 docx dokuwiki dzslides epub epub2 epub3 fb2 fodt gfm haddock html html4 html5 icml ipynb jats jats_archiving jats_articleauthoring jats_publishing jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict markua mediawiki ms muse native odt opendocument opml org pdf plain pptx revealjs rst rtf s5 slideous slidy t2t tei texinfo textile typst vimdoc xml xwiki zimwiki)'+    '--to[Writer format]:FORMAT:(ansi asciidoc asciidoc_legacy asciidoctor bbcode bbcode_fluxbb bbcode_hubzilla bbcode_phpbb bbcode_steam bbcode_xenforo beamer biblatex bibtex chunkedhtml commonmark commonmark_x context csljson djot docbook docbook4 docbook5 docx dokuwiki dzslides epub epub2 epub3 fb2 fodt gfm haddock html html4 html5 icml ipynb jats jats_archiving jats_articleauthoring jats_publishing jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict markua mediawiki ms muse native odt opendocument opml org pdf plain pptx revealjs rst rtf s5 slideous slidy t2t tei texinfo textile typst vimdoc xml xwiki zimwiki)'+    '--write[Writer format]:FORMAT:(ansi asciidoc asciidoc_legacy asciidoctor bbcode bbcode_fluxbb bbcode_hubzilla bbcode_phpbb bbcode_steam bbcode_xenforo beamer biblatex bibtex chunkedhtml commonmark commonmark_x context csljson djot docbook docbook4 docbook5 docx dokuwiki dzslides epub epub2 epub3 fb2 fodt gfm haddock html html4 html5 icml ipynb jats jats_archiving jats_articleauthoring jats_publishing jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict markua mediawiki ms muse native odt opendocument opml org pdf plain pptx revealjs rst rtf s5 slideous slidy t2t tei texinfo textile typst vimdoc xml xwiki zimwiki)'     '-o[Output file]:FILE:_files'     '--output[Output file]:FILE:_files'     '--data-dir[Directory for data files]:DIRECTORY:_files'@@ -245,8 +245,8 @@     '--list-extensions[List supported extensions]'     '--list-highlight-languages[List highlighting languages]'     '--list-highlight-styles[List highlighting styles]'-    '-D[Format to print template for]:FORMAT:(ansi asciidoc asciidoc_legacy asciidoctor bbcode bbcode_fluxbb bbcode_hubzilla bbcode_phpbb bbcode_steam bbcode_xenforo beamer biblatex bibtex chunkedhtml commonmark commonmark_x context csljson djot docbook docbook4 docbook5 docx dokuwiki dzslides epub epub2 epub3 fb2 gfm haddock html html4 html5 icml ipynb jats jats_archiving jats_articleauthoring jats_publishing jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict markua mediawiki ms muse native odt opendocument opml org pdf plain pptx revealjs rst rtf s5 slideous slidy t2t tei texinfo textile typst vimdoc xml xwiki zimwiki)'-    '--print-default-template[Format to print template for]:FORMAT:(ansi asciidoc asciidoc_legacy asciidoctor bbcode bbcode_fluxbb bbcode_hubzilla bbcode_phpbb bbcode_steam bbcode_xenforo beamer biblatex bibtex chunkedhtml commonmark commonmark_x context csljson djot docbook docbook4 docbook5 docx dokuwiki dzslides epub epub2 epub3 fb2 gfm haddock html html4 html5 icml ipynb jats jats_archiving jats_articleauthoring jats_publishing jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict markua mediawiki ms muse native odt opendocument opml org pdf plain pptx revealjs rst rtf s5 slideous slidy t2t tei texinfo textile typst vimdoc xml xwiki zimwiki)'+    '-D[Format to print template for]:FORMAT:(ansi asciidoc asciidoc_legacy asciidoctor bbcode bbcode_fluxbb bbcode_hubzilla bbcode_phpbb bbcode_steam bbcode_xenforo beamer biblatex bibtex chunkedhtml commonmark commonmark_x context csljson djot docbook docbook4 docbook5 docx dokuwiki dzslides epub epub2 epub3 fb2 fodt gfm haddock html html4 html5 icml ipynb jats jats_archiving jats_articleauthoring jats_publishing jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict markua mediawiki ms muse native odt opendocument opml org pdf plain pptx revealjs rst rtf s5 slideous slidy t2t tei texinfo textile typst vimdoc xml xwiki zimwiki)'+    '--print-default-template[Format to print template for]:FORMAT:(ansi asciidoc asciidoc_legacy asciidoctor bbcode bbcode_fluxbb bbcode_hubzilla bbcode_phpbb bbcode_steam bbcode_xenforo beamer biblatex bibtex chunkedhtml commonmark commonmark_x context csljson djot docbook docbook4 docbook5 docx dokuwiki dzslides epub epub2 epub3 fb2 fodt gfm haddock html html4 html5 icml ipynb jats jats_archiving jats_articleauthoring jats_publishing jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict markua mediawiki ms muse native odt opendocument opml org pdf plain pptx revealjs rst rtf s5 slideous slidy t2t tei texinfo textile typst vimdoc xml xwiki zimwiki)'     '--print-default-data-file[Data file to print]:FILE:(MANUAL.txt abbreviations creole.lua default.csl docbook-entities.txt docx/[Content_Types].xml docx/_rels/.rels docx/docProps/app.xml docx/docProps/core.xml docx/docProps/custom.xml docx/word/_rels/document.xml.rels docx/word/_rels/footnotes.xml.rels docx/word/comments.xml docx/word/document.xml docx/word/fontTable.xml docx/word/footnotes.xml docx/word/numbering.xml docx/word/settings.xml docx/word/styles.xml docx/word/theme/theme1.xml docx/word/webSettings.xml dzslides/template.html epub.css init.lua odt/META-INF/manifest.xml odt/content.xml odt/manifest.rdf odt/meta.xml odt/mimetype odt/styles.xml pptx/[Content_Types].xml pptx/_rels/.rels pptx/docProps/app.xml pptx/docProps/core.xml pptx/ppt/_rels/presentation.xml.rels pptx/ppt/notesMasters/_rels/notesMaster1.xml.rels pptx/ppt/notesMasters/notesMaster1.xml pptx/ppt/notesSlides/_rels/notesSlide1.xml.rels pptx/ppt/notesSlides/_rels/notesSlide2.xml.rels pptx/ppt/notesSlides/notesSlide1.xml pptx/ppt/notesSlides/notesSlide2.xml pptx/ppt/presProps.xml pptx/ppt/presentation.xml pptx/ppt/slideLayouts/_rels/slideLayout1.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout10.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout11.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout2.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout3.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout4.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout5.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout6.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout7.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout8.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout9.xml.rels pptx/ppt/slideLayouts/slideLayout1.xml pptx/ppt/slideLayouts/slideLayout10.xml pptx/ppt/slideLayouts/slideLayout11.xml pptx/ppt/slideLayouts/slideLayout2.xml pptx/ppt/slideLayouts/slideLayout3.xml pptx/ppt/slideLayouts/slideLayout4.xml pptx/ppt/slideLayouts/slideLayout5.xml pptx/ppt/slideLayouts/slideLayout6.xml pptx/ppt/slideLayouts/slideLayout7.xml pptx/ppt/slideLayouts/slideLayout8.xml pptx/ppt/slideLayouts/slideLayout9.xml pptx/ppt/slideMasters/_rels/slideMaster1.xml.rels pptx/ppt/slideMasters/slideMaster1.xml pptx/ppt/slides/_rels/slide1.xml.rels pptx/ppt/slides/_rels/slide2.xml.rels pptx/ppt/slides/_rels/slide3.xml.rels pptx/ppt/slides/_rels/slide4.xml.rels pptx/ppt/slides/slide1.xml pptx/ppt/slides/slide2.xml pptx/ppt/slides/slide3.xml pptx/ppt/slides/slide4.xml pptx/ppt/tableStyles.xml pptx/ppt/theme/theme1.xml pptx/ppt/theme/theme2.xml pptx/ppt/viewProps.xml reference.docx reference.odt reference.pptx templates/affiliations.jats templates/after-header-includes.latex templates/article.jats_publishing templates/common.latex templates/default.ansi templates/default.asciidoc templates/default.bbcode templates/default.beamer templates/default.biblatex templates/default.bibtex templates/default.chunkedhtml templates/default.commonmark templates/default.context templates/default.djot templates/default.docbook4 templates/default.docbook5 templates/default.dokuwiki templates/default.dzslides templates/default.epub2 templates/default.epub3 templates/default.haddock templates/default.html4 templates/default.html5 templates/default.icml templates/default.jats_archiving templates/default.jats_articleauthoring templates/default.jats_publishing templates/default.jira templates/default.latex templates/default.man templates/default.markdown templates/default.markua templates/default.mediawiki templates/default.ms templates/default.muse templates/default.opendocument templates/default.openxml templates/default.opml templates/default.org templates/default.plain templates/default.revealjs templates/default.rst templates/default.rtf templates/default.s5 templates/default.slideous templates/default.slidy templates/default.t2t templates/default.tei templates/default.texinfo templates/default.textile templates/default.typst templates/default.vimdoc templates/default.xwiki templates/default.zimwiki templates/document-metadata.latex templates/font-settings.latex templates/fonts.latex templates/hypersetup.latex templates/passoptions.latex templates/styles.citations.html templates/styles.html templates/template.typst translations/af.yaml translations/alt.yaml translations/am.yaml translations/ar.yaml translations/as.yaml translations/ast.yaml translations/az.yaml translations/be.yaml translations/bg.yaml translations/bn.yaml translations/bo.yaml translations/br.yaml translations/bs.yaml translations/bua.yaml translations/ca.yaml translations/ckb-Arab.yaml translations/ckb-Latn.yaml translations/cs.yaml translations/cu.yaml translations/cy.yaml translations/cz.yaml translations/da.yaml translations/de.yaml translations/dsb.yaml translations/el.yaml translations/en.yaml translations/eo.yaml translations/es-ES.yaml translations/es-MX.yaml translations/es.yaml translations/et.yaml translations/eu.yaml translations/fa.yaml translations/fi.yaml translations/fil.yaml translations/fr.yaml translations/fur.yaml translations/ga.yaml translations/gd.yaml translations/gl.yaml translations/grc.yaml translations/gu.yaml translations/ha.yaml translations/he.yaml translations/hi.yaml translations/hr.yaml translations/hsb.yaml translations/hu.yaml translations/hy.yaml translations/ia.yaml translations/id.yaml translations/is.yaml translations/it.yaml translations/ja.yaml translations/ka.yaml translations/km.yaml translations/kmr-Arab.yaml translations/kmr-Latn.yaml translations/kn.yaml translations/ko.yaml translations/la.yaml translations/lb.yaml translations/lo.yaml translations/lt.yaml translations/lv.yaml translations/mk.yaml translations/ml.yaml translations/mn.yaml translations/mr.yaml translations/ms.yaml translations/nb.yaml translations/nko.yaml translations/nl.yaml translations/nn.yaml translations/no.yaml translations/oc.yaml translations/or.yaml translations/pa.yaml translations/pl.yaml translations/pms.yaml translations/pt-BR.yaml translations/pt-PT.yaml translations/pt.yaml translations/rm.yaml translations/ro.yaml translations/ru.yaml translations/se.yaml translations/si.yaml translations/sk.yaml translations/sl.yaml translations/sq.yaml translations/sr-Cyrl.yaml translations/sr-Latn.yaml translations/sr.yaml translations/sv.yaml translations/ta.yaml translations/te.yaml translations/th.yaml translations/tk.yaml translations/tr.yaml translations/ua.yaml translations/ug.yaml translations/uk.yaml translations/ur.yaml translations/vi.yaml translations/zh-Hans.yaml translations/zh-Hant.yaml)'     '--print-highlight-style[Highlighting style]:STYLE:(pygments tango espresso zenburn kate monochrome breezedark haddock)'     '-v[Print version]'@@ -266,8 +266,8 @@ ``` % pandoc --completion=fish ^D-complete -c pandoc -l from -d "Reader format" -r -a "asciidoc biblatex bibtex bits commonmark commonmark_x creole csljson csv djot docbook docx dokuwiki endnotexml epub fb2 gfm haddock html ipynb jats jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict mdoc mediawiki muse native odt opml org pod pptx ris rst rtf t2t textile tikiwiki tsv twiki typst vimwiki xlsx xml"-complete -c pandoc -l to -d "Writer format" -r -a "ansi asciidoc asciidoc_legacy asciidoctor bbcode bbcode_fluxbb bbcode_hubzilla bbcode_phpbb bbcode_steam bbcode_xenforo beamer biblatex bibtex chunkedhtml commonmark commonmark_x context csljson djot docbook docbook4 docbook5 docx dokuwiki dzslides epub epub2 epub3 fb2 gfm haddock html html4 html5 icml ipynb jats jats_archiving jats_articleauthoring jats_publishing jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict markua mediawiki ms muse native odt opendocument opml org pdf plain pptx revealjs rst rtf s5 slideous slidy t2t tei texinfo textile typst vimdoc xml xwiki zimwiki"+complete -c pandoc -l from -d "Reader format" -r -a "asciidoc biblatex bibtex bits commonmark commonmark_x creole csljson csv djot docbook docx dokuwiki endnotexml epub fb2 fodt gfm haddock html ipynb jats jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict mdoc mediawiki muse native odt opml org pod pptx ris rst rtf t2t textile tikiwiki tsv twiki typst vimwiki xlsx xml"+complete -c pandoc -l to -d "Writer format" -r -a "ansi asciidoc asciidoc_legacy asciidoctor bbcode bbcode_fluxbb bbcode_hubzilla bbcode_phpbb bbcode_steam bbcode_xenforo beamer biblatex bibtex chunkedhtml commonmark commonmark_x context csljson djot docbook docbook4 docbook5 docx dokuwiki dzslides epub epub2 epub3 fb2 fodt gfm haddock html html4 html5 icml ipynb jats jats_archiving jats_articleauthoring jats_publishing jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict markua mediawiki ms muse native odt opendocument opml org pdf plain pptx revealjs rst rtf s5 slideous slidy t2t tei texinfo textile typst vimdoc xml xwiki zimwiki" complete -c pandoc -s o -l output -d "Output file" -r complete -c pandoc -l data-dir -d "Directory for data files" -r complete -c pandoc -s M -l metadata -d "Metadata field KEY=VALUE" -r@@ -370,7 +370,7 @@ complete -c pandoc -l list-extensions -d "List supported extensions" complete -c pandoc -l list-highlight-languages -d "List highlighting languages" complete -c pandoc -l list-highlight-styles -d "List highlighting styles"-complete -c pandoc -s D -l print-default-template -d "Format to print template for" -r -a "ansi asciidoc asciidoc_legacy asciidoctor bbcode bbcode_fluxbb bbcode_hubzilla bbcode_phpbb bbcode_steam bbcode_xenforo beamer biblatex bibtex chunkedhtml commonmark commonmark_x context csljson djot docbook docbook4 docbook5 docx dokuwiki dzslides epub epub2 epub3 fb2 gfm haddock html html4 html5 icml ipynb jats jats_archiving jats_articleauthoring jats_publishing jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict markua mediawiki ms muse native odt opendocument opml org pdf plain pptx revealjs rst rtf s5 slideous slidy t2t tei texinfo textile typst vimdoc xml xwiki zimwiki"+complete -c pandoc -s D -l print-default-template -d "Format to print template for" -r -a "ansi asciidoc asciidoc_legacy asciidoctor bbcode bbcode_fluxbb bbcode_hubzilla bbcode_phpbb bbcode_steam bbcode_xenforo beamer biblatex bibtex chunkedhtml commonmark commonmark_x context csljson djot docbook docbook4 docbook5 docx dokuwiki dzslides epub epub2 epub3 fb2 fodt gfm haddock html html4 html5 icml ipynb jats jats_archiving jats_articleauthoring jats_publishing jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict markua mediawiki ms muse native odt opendocument opml org pdf plain pptx revealjs rst rtf s5 slideous slidy t2t tei texinfo textile typst vimdoc xml xwiki zimwiki" complete -c pandoc -l print-default-data-file -d "Data file to print" -r -a "MANUAL.txt abbreviations creole.lua default.csl docbook-entities.txt docx/[Content_Types].xml docx/_rels/.rels docx/docProps/app.xml docx/docProps/core.xml docx/docProps/custom.xml docx/word/_rels/document.xml.rels docx/word/_rels/footnotes.xml.rels docx/word/comments.xml docx/word/document.xml docx/word/fontTable.xml docx/word/footnotes.xml docx/word/numbering.xml docx/word/settings.xml docx/word/styles.xml docx/word/theme/theme1.xml docx/word/webSettings.xml dzslides/template.html epub.css init.lua odt/META-INF/manifest.xml odt/content.xml odt/manifest.rdf odt/meta.xml odt/mimetype odt/styles.xml pptx/[Content_Types].xml pptx/_rels/.rels pptx/docProps/app.xml pptx/docProps/core.xml pptx/ppt/_rels/presentation.xml.rels pptx/ppt/notesMasters/_rels/notesMaster1.xml.rels pptx/ppt/notesMasters/notesMaster1.xml pptx/ppt/notesSlides/_rels/notesSlide1.xml.rels pptx/ppt/notesSlides/_rels/notesSlide2.xml.rels pptx/ppt/notesSlides/notesSlide1.xml pptx/ppt/notesSlides/notesSlide2.xml pptx/ppt/presProps.xml pptx/ppt/presentation.xml pptx/ppt/slideLayouts/_rels/slideLayout1.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout10.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout11.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout2.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout3.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout4.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout5.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout6.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout7.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout8.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout9.xml.rels pptx/ppt/slideLayouts/slideLayout1.xml pptx/ppt/slideLayouts/slideLayout10.xml pptx/ppt/slideLayouts/slideLayout11.xml pptx/ppt/slideLayouts/slideLayout2.xml pptx/ppt/slideLayouts/slideLayout3.xml pptx/ppt/slideLayouts/slideLayout4.xml pptx/ppt/slideLayouts/slideLayout5.xml pptx/ppt/slideLayouts/slideLayout6.xml pptx/ppt/slideLayouts/slideLayout7.xml pptx/ppt/slideLayouts/slideLayout8.xml pptx/ppt/slideLayouts/slideLayout9.xml pptx/ppt/slideMasters/_rels/slideMaster1.xml.rels pptx/ppt/slideMasters/slideMaster1.xml pptx/ppt/slides/_rels/slide1.xml.rels pptx/ppt/slides/_rels/slide2.xml.rels pptx/ppt/slides/_rels/slide3.xml.rels pptx/ppt/slides/_rels/slide4.xml.rels pptx/ppt/slides/slide1.xml pptx/ppt/slides/slide2.xml pptx/ppt/slides/slide3.xml pptx/ppt/slides/slide4.xml pptx/ppt/tableStyles.xml pptx/ppt/theme/theme1.xml pptx/ppt/theme/theme2.xml pptx/ppt/viewProps.xml reference.docx reference.odt reference.pptx templates/affiliations.jats templates/after-header-includes.latex templates/article.jats_publishing templates/common.latex templates/default.ansi templates/default.asciidoc templates/default.bbcode templates/default.beamer templates/default.biblatex templates/default.bibtex templates/default.chunkedhtml templates/default.commonmark templates/default.context templates/default.djot templates/default.docbook4 templates/default.docbook5 templates/default.dokuwiki templates/default.dzslides templates/default.epub2 templates/default.epub3 templates/default.haddock templates/default.html4 templates/default.html5 templates/default.icml templates/default.jats_archiving templates/default.jats_articleauthoring templates/default.jats_publishing templates/default.jira templates/default.latex templates/default.man templates/default.markdown templates/default.markua templates/default.mediawiki templates/default.ms templates/default.muse templates/default.opendocument templates/default.openxml templates/default.opml templates/default.org templates/default.plain templates/default.revealjs templates/default.rst templates/default.rtf templates/default.s5 templates/default.slideous templates/default.slidy templates/default.t2t templates/default.tei templates/default.texinfo templates/default.textile templates/default.typst templates/default.vimdoc templates/default.xwiki templates/default.zimwiki templates/document-metadata.latex templates/font-settings.latex templates/fonts.latex templates/hypersetup.latex templates/passoptions.latex templates/styles.citations.html templates/styles.html templates/template.typst translations/af.yaml translations/alt.yaml translations/am.yaml translations/ar.yaml translations/as.yaml translations/ast.yaml translations/az.yaml translations/be.yaml translations/bg.yaml translations/bn.yaml translations/bo.yaml translations/br.yaml translations/bs.yaml translations/bua.yaml translations/ca.yaml translations/ckb-Arab.yaml translations/ckb-Latn.yaml translations/cs.yaml translations/cu.yaml translations/cy.yaml translations/cz.yaml translations/da.yaml translations/de.yaml translations/dsb.yaml translations/el.yaml translations/en.yaml translations/eo.yaml translations/es-ES.yaml translations/es-MX.yaml translations/es.yaml translations/et.yaml translations/eu.yaml translations/fa.yaml translations/fi.yaml translations/fil.yaml translations/fr.yaml translations/fur.yaml translations/ga.yaml translations/gd.yaml translations/gl.yaml translations/grc.yaml translations/gu.yaml translations/ha.yaml translations/he.yaml translations/hi.yaml translations/hr.yaml translations/hsb.yaml translations/hu.yaml translations/hy.yaml translations/ia.yaml translations/id.yaml translations/is.yaml translations/it.yaml translations/ja.yaml translations/ka.yaml translations/km.yaml translations/kmr-Arab.yaml translations/kmr-Latn.yaml translations/kn.yaml translations/ko.yaml translations/la.yaml translations/lb.yaml translations/lo.yaml translations/lt.yaml translations/lv.yaml translations/mk.yaml translations/ml.yaml translations/mn.yaml translations/mr.yaml translations/ms.yaml translations/nb.yaml translations/nko.yaml translations/nl.yaml translations/nn.yaml translations/no.yaml translations/oc.yaml translations/or.yaml translations/pa.yaml translations/pl.yaml translations/pms.yaml translations/pt-BR.yaml translations/pt-PT.yaml translations/pt.yaml translations/rm.yaml translations/ro.yaml translations/ru.yaml translations/se.yaml translations/si.yaml translations/sk.yaml translations/sl.yaml translations/sq.yaml translations/sr-Cyrl.yaml translations/sr-Latn.yaml translations/sr.yaml translations/sv.yaml translations/ta.yaml translations/te.yaml translations/th.yaml translations/tk.yaml translations/tr.yaml translations/ua.yaml translations/ug.yaml translations/uk.yaml translations/ur.yaml translations/vi.yaml translations/zh-Hans.yaml translations/zh-Hant.yaml" complete -c pandoc -l print-highlight-style -d "Highlighting style" -r -a "pygments tango espresso zenburn kate monochrome breezedark haddock" complete -c pandoc -s v -l version -d "Print version"
+ test/command/fodt-roundtrip.md view
@@ -0,0 +1,126 @@+Round trips through the flat OpenDocument format.  The flat format has no+zip structure, so a relative link is not rewritten, and an image is+embedded as base64 in an `office:binary-data` element rather than being+put in a `Pictures/` entry.++```+% pandoc -f markdown -t fodt | pandoc -f fodt -t native+# A *heading*++Inline $x^2$, display:++$$y = 1$$++| a | b |+|---|---|+| 1 | 2 |++1. one+2. two++A footnote[^1] and a [relative link](foo/bar.html).++[^1]: Note text.+^D+[ Header+    1+    ( "a-heading" , [] , [] )+    [ Span ( "anchor" , [] , [] ) []+    , Str "A"+    , Space+    , Emph [ Str "heading" ]+    ]+, Para+    [ Str "Inline"+    , Space+    , Math DisplayMath "x^{2}"+    , Str ","+    , Space+    , Str "display:"+    ]+, Para [ Math DisplayMath "y = 1" ]+, Table+    ( "" , [] , [] )+    (Caption Nothing [])+    [ ( AlignDefault , ColWidthDefault )+    , ( AlignDefault , ColWidthDefault )+    ]+    (TableHead+       ( "" , [] , [] )+       [ Row+           ( "" , [] , [] )+           [ Cell+               ( "" , [] , [] )+               AlignDefault+               (RowSpan 1)+               (ColSpan 1)+               [ Plain [ Strong [ Str "a" ] ] ]+           , Cell+               ( "" , [] , [] )+               AlignDefault+               (RowSpan 1)+               (ColSpan 1)+               [ Plain [ Strong [ Str "b" ] ] ]+           ]+       ])+    [ TableBody+        ( "" , [] , [] )+        (RowHeadColumns 0)+        []+        [ Row+            ( "" , [] , [] )+            [ Cell+                ( "" , [] , [] )+                AlignDefault+                (RowSpan 1)+                (ColSpan 1)+                [ Plain [ Str "1" ] ]+            , Cell+                ( "" , [] , [] )+                AlignDefault+                (RowSpan 1)+                (ColSpan 1)+                [ Plain [ Str "2" ] ]+            ]+        ]+    ]+    (TableFoot ( "" , [] , [] ) [])+, OrderedList+    ( 1 , Decimal , Period )+    [ [ Plain [ Str "one" ] ] , [ Plain [ Str "two" ] ] ]+, Para+    [ Str "A"+    , Space+    , Str "footnote"+    , Note [ Para [ Str "Note" , Space , Str "text." ] ]+    , Space+    , Str "and"+    , Space+    , Str "a"+    , Space+    , Link+        ( "" , [] , [] )+        [ Str "relative" , Space , Str "link" ]+        ( "foo/bar.html" , "" )+    , Str "."+    ]+]+```++The image data survives the base64 round trip.++```+% pandoc -f markdown -t fodt | pandoc -f fodt -t native+![](lalune.jpg)+^D+[ Para+    [ Image+        ( ""+        , []+        , [ ( "width" , "150.0pt" ) , ( "height" , "150.0pt" ) ]+        )+        []+        ( "Pictures/image1.jpg" , "" )+    ]+]+```
+ test/command/opendocument-abstract.opendocument view
@@ -0,0 +1,1 @@+$abstract$
+ test/command/opendocument-body.opendocument view
@@ -0,0 +1,1 @@+$body$
+ test/command/opendocument-styles.md view
@@ -0,0 +1,131 @@+The `abstract` metadata field holds blocks, so it must be rendered+with the block writer: previously it was flattened to inlines, which+produced bare character data (not valid as a child of `office:text`)+and dropped the `Abstract` style.++```+% pandoc -f markdown -t opendocument --template command/opendocument-abstract.opendocument+---+abstract: A one-line abstract.+---++Body.+^D+<text:p text:style-name="Abstract">A one-line abstract.</text:p>+```++A multi-paragraph abstract stays multi-paragraph:++```+% pandoc -f markdown -t opendocument --wrap=none --template command/opendocument-abstract.opendocument+---+abstract: |+  First para.++  Second para.+---++Body.+^D+<text:p text:style-name="Abstract">First para.</text:p><text:p text:style-name="Abstract">Second para.</text:p>+```++A requested paragraph style must also be applied to `Plain` blocks, not+just to `Para`. The body of a caption-less figure is a `Plain`, so it+should still get the `Figure` style:++```+% pandoc -f native -t opendocument --template command/opendocument-body.opendocument+[Figure ("fig1",[],[]) (Caption Nothing []) [Plain [Str "placeholder"]]]+^D+<text:p text:style-name="Figure">placeholder</text:p>+```++Column style names must remain valid NCNames past the 26th column;+incrementing a character code would run into `[`, `\`, etc.++```+% pandoc -f native -t opendocument --template command/opendocument-body.opendocument+[Table ("",[],[]) (Caption Nothing [])+ [(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault)+ ,(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault)+ ,(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault)+ ,(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault)+ ,(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault)+ ,(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault)+ ,(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault)]+ (TableHead ("",[],[]) [])+ [(TableBody ("",[],[]) (RowHeadColumns 0) [] [])]+ (TableFoot ("",[],[]) [])]+^D+<table:table table:name="Table1" table:style-name="Table1">+  <table:table-column table:style-name="Table1.A" />+  <table:table-column table:style-name="Table1.B" />+  <table:table-column table:style-name="Table1.C" />+  <table:table-column table:style-name="Table1.D" />+  <table:table-column table:style-name="Table1.E" />+  <table:table-column table:style-name="Table1.F" />+  <table:table-column table:style-name="Table1.G" />+  <table:table-column table:style-name="Table1.H" />+  <table:table-column table:style-name="Table1.I" />+  <table:table-column table:style-name="Table1.J" />+  <table:table-column table:style-name="Table1.K" />+  <table:table-column table:style-name="Table1.L" />+  <table:table-column table:style-name="Table1.M" />+  <table:table-column table:style-name="Table1.N" />+  <table:table-column table:style-name="Table1.O" />+  <table:table-column table:style-name="Table1.P" />+  <table:table-column table:style-name="Table1.Q" />+  <table:table-column table:style-name="Table1.R" />+  <table:table-column table:style-name="Table1.S" />+  <table:table-column table:style-name="Table1.T" />+  <table:table-column table:style-name="Table1.U" />+  <table:table-column table:style-name="Table1.V" />+  <table:table-column table:style-name="Table1.W" />+  <table:table-column table:style-name="Table1.X" />+  <table:table-column table:style-name="Table1.Y" />+  <table:table-column table:style-name="Table1.Z" />+  <table:table-column table:style-name="Table1.AA" />+</table:table>+```++A note nested inside another note must not reuse the outer note's+`text:id`:++```+% pandoc -f markdown -t opendocument --wrap=none --template command/opendocument-body.opendocument+Text^[outer^[inner]]^[second]+^D+<text:p text:style-name="Text_20_body">Text<text:note text:id="ftn0" text:note-class="footnote"><text:note-citation>1</text:note-citation><text:note-body><text:p text:style-name="Footnote">outer<text:note text:id="ftn1" text:note-class="footnote"><text:note-citation>2</text:note-citation><text:note-body><text:p text:style-name="Footnote">inner</text:p></text:note-body></text:note></text:p></text:note-body></text:note><text:note text:id="ftn2" text:note-class="footnote"><text:note-citation>3</text:note-citation><text:note-body><text:p text:style-name="Footnote">second</text:p></text:note-body></text:note></text:p>+```++Automatic text styles are declared in numerical order: sorting them by+name would put `T10` between `T1` and `T2`.++```+% pandoc -f native -t opendocument --wrap=none --template command/11301-styles.opendocument+[Para [SmallCaps [Str "a"]+      ,SmallCaps [Strikeout [Str "b"]]+      ,SmallCaps [Superscript [Str "c"]]+      ,SmallCaps [Subscript [Str "d"]]+      ,SmallCaps [Underline [Str "e"]]+      ,Strikeout [Superscript [Str "f"]]+      ,Strikeout [Subscript [Str "g"]]+      ,Strikeout [Underline [Str "h"]]+      ,Underline [Superscript [Str "i"]]+      ,Underline [Subscript [Str "j"]]]]+^D+<style:style style:name="T1" style:family="text"><style:text-properties fo:font-variant="small-caps" /></style:style>+<style:style style:name="T2" style:family="text"><style:text-properties fo:font-variant="small-caps" style:text-line-through-style="solid" /></style:style>+<style:style style:name="T3" style:family="text"><style:text-properties fo:font-variant="small-caps" style:text-position="super 58%" /></style:style>+<style:style style:name="T4" style:family="text"><style:text-properties fo:font-variant="small-caps" style:text-position="sub 58%" /></style:style>+<style:style style:name="T5" style:family="text"><style:text-properties fo:font-variant="small-caps" style:text-underline-color="font-color" style:text-underline-style="solid" style:text-underline-width="auto" /></style:style>+<style:style style:name="T6" style:family="text"><style:text-properties style:text-line-through-style="solid" style:text-position="super 58%" /></style:style>+<style:style style:name="T7" style:family="text"><style:text-properties style:text-line-through-style="solid" style:text-position="sub 58%" /></style:style>+<style:style style:name="T8" style:family="text"><style:text-properties style:text-line-through-style="solid" style:text-underline-color="font-color" style:text-underline-style="solid" style:text-underline-width="auto" /></style:style>+<style:style style:name="T9" style:family="text"><style:text-properties style:text-position="super 58%" style:text-underline-color="font-color" style:text-underline-style="solid" style:text-underline-width="auto" /></style:style>+<style:style style:name="T10" style:family="text"><style:text-properties style:text-position="sub 58%" style:text-underline-color="font-color" style:text-underline-style="solid" style:text-underline-width="auto" /></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>+<text:p text:style-name="Text_20_body"><text:span text:style-name="T1">a</text:span><text:span text:style-name="T2">b</text:span><text:span text:style-name="T3">c</text:span><text:span text:style-name="T4">d</text:span><text:span text:style-name="T5">e</text:span><text:span text:style-name="T6">f</text:span><text:span text:style-name="T7">g</text:span><text:span text:style-name="T8">h</text:span><text:span text:style-name="T9">i</text:span><text:span text:style-name="T10">j</text:span></text:p>+```
test/command/pandoc-citeproc-77.md view
@@ -1,3 +1,6 @@+Note: pandoc no longer parses particles out of names (see #11911).+This test is left to confirm the new behavior.+ ``` % pandoc --citeproc -t markdown-citations ---@@ -41,7 +44,7 @@  :::::::: {#refs .references .csl-bib-body .hanging-indent entry-spacing="0"} ::: {#ref-item4 .csl-entry}-Bennett, Frank G., Jr., n.d.+Bennett, Frank G.,! Jr., n.d. :::  ::: {#ref-item1 .csl-entry}@@ -52,16 +55,16 @@ Dumboldt, Ezekiel, III, n.d. ::: -::: {#ref-item2 .csl-entry}-Gogh, Vincent van, n.d.-:::- ::: {#ref-item3 .csl-entry} Humboldt, Alexander von, n.d. :::++::: {#ref-item2 .csl-entry}+[van Gogh, Vincent]{.nocase}, n.d.+::: :::::::: -[^1]: John Doe III, n.d.; Vincent van Gogh, n.d.; Alexander von-    Humboldt, n.d.; Frank G. Bennett, Jr., n.d.; Ezekiel Dumboldt III,-    n.d.+[^1]: John, III Doe, n.d.; [Vincent van Gogh]{.nocase}, n.d.; Alexander+    von Humboldt, n.d.; Frank G.,! Jr. Bennett, n.d.; Ezekiel, III+    Dumboldt, n.d. ```
+ test/docx/double_strikeout.docx view

binary file changed (absent → 13825 bytes)

+ test/docx/double_strikeout.native view
@@ -0,0 +1,68 @@+Pandoc+  Meta { unMeta = fromList [] }+  [ Para+      [ Str "This"+      , Space+      , Str "is"+      , Space+      , Strikeout [ Str "single" , Space , Str "strikethrough" ]+      , Str ","+      , Space+      , Str "and"+      , Space+      , Str "this"+      , Space+      , Str "is"+      , Space+      , Strikeout [ Str "double" , Space , Str "strikethrough" ]+      , Str "."+      ]+  , Para+      [ Str "A"+      , Space+      , Str "character"+      , Space+      , Str "style"+      , Space+      , Str "can"+      , Space+      , Strikeout+          [ Str "strike" , Space , Str "this" , Space , Str "out," ]+      , Space+      , Str "cancel"+      , Space+      , Str "this,"+      , Space+      , Strikeout+          [ Str "or"+          , Space+          , Str "strike"+          , Space+          , Str "this"+          , Space+          , Str "out"+          , Space+          , Str "twice"+          ]+      , Str "."+      ]+  , Para+      [ Str "This"+      , Space+      , Str "is"+      , Space+      , Strikeout+          [ Str "double-strikethrough,"+          , Space+          , Str "overridden"+          , Space+          , Str "to"+          , Space+          , Str "single,"+          , Space+          , Str "and"+          ]+      , Space+      , Str "cancelled."+      ]+  ]
test/docx/golden/block_quotes.docx view

binary file changed (10689 → 10684 bytes)

test/docx/golden/codeblock.docx view

binary file changed (10510 → 10474 bytes)

test/docx/golden/comments.docx view

binary file changed (10824 → 10814 bytes)

test/docx/golden/csl_bibliography.docx view

binary file changed (10675 → 10670 bytes)

test/docx/golden/custom_style_no_reference.docx view

binary file changed (10609 → 10574 bytes)

test/docx/golden/custom_style_preserve.docx view

binary file changed (11233 → 11229 bytes)

test/docx/golden/definition_list.docx view

binary file changed (10501 → 10465 bytes)

test/docx/golden/document-properties-short-desc.docx view

binary file changed (10515 → 10478 bytes)

test/docx/golden/document-properties.docx view

binary file changed (10993 → 10983 bytes)

test/docx/golden/headers.docx view

binary file changed (10776 → 10764 bytes)

test/docx/golden/image.docx view

binary file changed (27434 → 27420 bytes)

test/docx/golden/inline_code.docx view

binary file changed (10451 → 10415 bytes)

test/docx/golden/inline_formatting.docx view

binary file changed (10627 → 10591 bytes)

test/docx/golden/inline_images.docx view

binary file changed (27383 → 27347 bytes)

binary file changed (10664 → 10628 bytes)

test/docx/golden/links.docx view

binary file changed (10853 → 10847 bytes)

test/docx/golden/lists.docx view

binary file changed (11048 → 11039 bytes)

test/docx/golden/lists_9994.docx view

binary file changed (10788 → 10752 bytes)

test/docx/golden/lists_continuing.docx view

binary file changed (10677 → 10667 bytes)

test/docx/golden/lists_div_bullets.docx view

binary file changed (10670 → 10660 bytes)

test/docx/golden/lists_multiple_initial.docx view

binary file changed (10903 → 10893 bytes)

test/docx/golden/lists_restarting.docx view

binary file changed (10686 → 10676 bytes)

+ test/docx/golden/mark_math.docx view

binary file changed (absent → 10738 bytes)

test/docx/golden/nested_anchors_in_header.docx view

binary file changed (10874 → 10864 bytes)

test/docx/golden/notes.docx view

binary file changed (10625 → 10614 bytes)

test/docx/golden/raw-blocks.docx view

binary file changed (10544 → 10508 bytes)

test/docx/golden/raw-bookmarks.docx view

binary file changed (10683 → 10647 bytes)

test/docx/golden/table_one_row.docx view

binary file changed (10496 → 10486 bytes)

test/docx/golden/table_with_list_cell.docx view

binary file changed (10951 → 10941 bytes)

test/docx/golden/tables-default-widths.docx view

binary file changed (10876 → 10865 bytes)

test/docx/golden/tables.docx view

binary file changed (10887 → 10879 bytes)

test/docx/golden/tables_separated_with_rawblock.docx view

binary file changed (10519 → 10483 bytes)

test/docx/golden/task_list.docx view

binary file changed (10773 → 10763 bytes)

test/docx/golden/track_changes_deletion.docx view

binary file changed (10492 → 10456 bytes)

test/docx/golden/track_changes_insertion.docx view

binary file changed (10476 → 10437 bytes)

test/docx/golden/track_changes_move.docx view

binary file changed (10506 → 10470 bytes)

test/docx/golden/track_changes_scrubbed_metadata.docx view

binary file changed (10591 → 10581 bytes)

test/docx/golden/unicode.docx view

binary file changed (10468 → 10432 bytes)

test/docx/golden/verbatim_subsuper.docx view

binary file changed (10479 → 10443 bytes)

+ test/docx/mark_math.native view
@@ -0,0 +1,12 @@+[ Para+    [ Span+        ( "" , [ "mark" ] , [] )+        [ Str "a " , Math InlineMath "x^2" , Str " b" ]+    ]+, Para+    [ Span ( "" , [ "mark" ] , [] ) [ Math DisplayMath "z = 1" ] ]+, Para [ Span ( "" , [ "mark" ] , [] ) [ Math InlineMath "\\hat{x}" ] ]+, Para [ Span ( "" , [ "mark" ] , [] )+  [ Math InlineMath "\\sin x + \\sum_{i=1}^n i + \\frac{a}{b} + \\sqrt[3]{x}" ] ]+, Para [ Str "unmarked " , Math InlineMath "x^2" , Str " math" ]+]
+ test/docx/track_changes_edge_spaces.docx view

binary file changed (absent → 1093 bytes)

+ test/docx/track_changes_edge_spaces_accept.native view
@@ -0,0 +1,4 @@+[Para [Str "start-ups",Space,Str "grow."]+,Para [Str "adog"]+,Para [Str "the",Space,Str "new."]+,Para [Str "an",Space,Emph [Str "italic"],Space,Str "word."]]
+ test/docx/track_changes_edge_spaces_all.native view
@@ -0,0 +1,4 @@+[Para [Str "start-up",Span ("",["deletion"],[("author","eng-dept"),("date","2026-09-25T10:00:00Z")]) [Space,Str "entry"],Span ("",["insertion"],[("author","eng-dept"),("date","2026-09-25T10:00:00Z")]) [Str "s"],Space,Str "grow."]+,Para [Str "a",Span ("",["deletion"],[("author","eng-dept"),("date","2026-09-25T10:00:00Z")]) [Str "big",Space],Str "dog"]+,Para [Str "the",Span ("",["insertion"],[("author","eng-dept"),("date","2026-09-25T10:00:00Z")]) [Space,Str "new"],Str "."]+,Para [Str "an",Span ("",["insertion"],[("author","eng-dept"),("date","2026-09-25T10:00:00Z")]) [Space,Emph [Str "italic"]],Space,Str "word."]]
+ test/docx/track_changes_edge_spaces_reject.native view
@@ -0,0 +1,4 @@+[Para [Str "start-up",Space,Str "entry",Space,Str "grow."]+,Para [Str "abig",Space,Str "dog"]+,Para [Str "the."]+,Para [Str "an",Space,Str "word."]]
test/docx/track_changes_insertion_all.native view
@@ -1,1 +1,1 @@-[Para [Str "This",Space,Str "is",Space,Str "a",Space,Str "text",Space,Str "with",Space,Span ("",["insertion"],[("author","eng-dept"),("date","2014-06-25T10:40:00Z")]) [Str "two",Space,Str "exciting"],Space,Str "insertions."]]+[Para [Str "This",Space,Str "is",Space,Str "a",Space,Str "text",Space,Str "with",Space,Span ("",["insertion"],[("author","eng-dept"),("date","2014-06-25T10:40:00Z")]) [Str "two",Space,Str "exciting",Space],Str "insertions."]]
+ test/odt/fodt-native/image.native view
@@ -0,0 +1,1 @@+[Para [Image ("",[],[("width","2.0835in"),("height","2.0835in")]) [] ("Pictures/image1.jpg","")]]
+ test/odt/fodt/formula.fodt view
@@ -0,0 +1,523 @@+<?xml version="1.0" encoding="UTF-8"?>++<office:document xmlns:css3t="http://www.w3.org/TR/css3-text/" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:rpt="http://openoffice.org/2005/report" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" office:version="1.3" office:mimetype="application/vnd.oasis.opendocument.text">+ <office:meta><meta:initial-creator>Martin Linnemann</meta:initial-creator><meta:creation-date>2015-03-01T17:26:12.31</meta:creation-date><dc:date>2015-03-01T18:07:27.67</dc:date><dc:creator>Martin Linnemann</dc:creator><meta:editing-duration>PT10M3S</meta:editing-duration><meta:editing-cycles>2</meta:editing-cycles><meta:generator>LibreOffice/24.8.7.2$Linux_AARCH64 LibreOffice_project/480$Build-2</meta:generator><meta:document-statistic meta:table-count="0" meta:image-count="0" meta:object-count="1" meta:page-count="1" meta:paragraph-count="1" meta:word-count="0" meta:character-count="1"/></office:meta>+ <office:font-face-decls>+  <style:font-face style:name="Arial" svg:font-family="Arial" style:font-family-generic="swiss" style:font-pitch="variable"/>+  <style:font-face style:name="Calibri" svg:font-family="Calibri" style:font-family-generic="swiss"/>+  <style:font-face style:name="Lucida Sans Unicode" svg:font-family="&apos;Lucida Sans Unicode&apos;" style:font-family-generic="system" style:font-pitch="variable"/>+  <style:font-face style:name="Mangal" svg:font-family="Mangal"/>+  <style:font-face style:name="Mangal1" svg:font-family="Mangal" style:font-family-generic="system" style:font-pitch="variable"/>+  <style:font-face style:name="OpenSymbol" svg:font-family="OpenSymbol"/>+ </office:font-face-decls>+ <office:styles>+  <style:default-style style:family="graphic">+   <style:graphic-properties svg:stroke-color="#808080" draw:fill-color="#cfe7f5" fo:wrap-option="no-wrap" draw:shadow-offset-x="0.1181in" draw:shadow-offset-y="0.1181in" draw:start-line-spacing-horizontal="0.1114in" draw:start-line-spacing-vertical="0.1114in" draw:end-line-spacing-horizontal="0.1114in" draw:end-line-spacing-vertical="0.1114in" style:writing-mode="lr-tb" style:flow-with-text="false"/>+   <style:paragraph-properties style:text-autospace="ideograph-alpha" style:line-break="strict" loext:tab-stop-distance="0in" style:font-independent-line-spacing="false">+    <style:tab-stops/>+   </style:paragraph-properties>+   <style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Calibri" fo:font-size="12pt" fo:language="de" fo:country="DE" style:letter-kerning="true" style:font-name-asian="Lucida Sans Unicode" style:font-size-asian="12pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Mangal1" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN"/>+  </style:default-style>+  <style:default-style style:family="paragraph">+   <style:paragraph-properties fo:hyphenation-ladder-count="no-limit" fo:hyphenation-keep="auto" loext:hyphenation-keep-type="column" style:text-autospace="ideograph-alpha" style:punctuation-wrap="hanging" style:line-break="strict" style:tab-stop-distance="0.4925in" style:writing-mode="page"/>+   <style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Calibri" fo:font-size="12pt" fo:language="de" fo:country="DE" style:letter-kerning="true" style:font-name-asian="Lucida Sans Unicode" style:font-size-asian="12pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Mangal1" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN" fo:hyphenate="false" fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2" loext:hyphenation-no-caps="false" loext:hyphenation-no-last-word="false" loext:hyphenation-word-char-count="no-limit" loext:hyphenation-zone="no-limit"/>+  </style:default-style>+  <style:default-style style:family="table">+   <style:table-properties table:border-model="collapsing"/>+  </style:default-style>+  <style:default-style style:family="table-row">+   <style:table-row-properties fo:keep-together="auto"/>+  </style:default-style>+  <style:style style:name="Standard" style:family="paragraph" style:class="text"/>+  <style:style style:name="Heading" style:family="paragraph" style:parent-style-name="Standard" style:next-style-name="Text_20_body" style:class="text">+   <style:paragraph-properties fo:margin-top="0.1665in" fo:margin-bottom="0.0835in" style:contextual-spacing="false" fo:keep-with-next="always"/>+   <style:text-properties style:font-name="Arial" fo:font-family="Arial" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="14pt" style:font-name-asian="Lucida Sans Unicode" style:font-family-asian="&apos;Lucida Sans Unicode&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="14pt" style:font-name-complex="Mangal1" style:font-family-complex="Mangal" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="14pt"/>+  </style:style>+  <style:style style:name="Text_20_body" style:display-name="Text body" style:family="paragraph" style:parent-style-name="Standard" style:class="text">+   <style:paragraph-properties fo:margin-top="0in" fo:margin-bottom="0.0835in" style:contextual-spacing="false"/>+  </style:style>+  <style:style style:name="List" style:family="paragraph" style:parent-style-name="Text_20_body" style:class="list">+   <style:text-properties style:font-name="Calibri" fo:font-family="Calibri" style:font-family-generic="swiss" style:font-name-complex="Mangal" style:font-family-complex="Mangal"/>+  </style:style>+  <style:style style:name="Caption" style:family="paragraph" style:parent-style-name="Standard" style:class="extra">+   <style:paragraph-properties fo:margin-top="0.0835in" fo:margin-bottom="0.0835in" style:contextual-spacing="false" text:number-lines="false" text:line-number="0"/>+   <style:text-properties style:font-name="Calibri" fo:font-family="Calibri" style:font-family-generic="swiss" fo:font-size="12pt" fo:font-style="italic" style:font-size-asian="12pt" style:font-style-asian="italic" style:font-name-complex="Mangal" style:font-family-complex="Mangal" style:font-size-complex="12pt" style:font-style-complex="italic"/>+  </style:style>+  <style:style style:name="Index" style:family="paragraph" style:parent-style-name="Standard" style:class="index">+   <style:paragraph-properties text:number-lines="false" text:line-number="0"/>+   <style:text-properties style:font-name="Calibri" fo:font-family="Calibri" style:font-family-generic="swiss" style:font-name-complex="Mangal" style:font-family-complex="Mangal"/>+  </style:style>+  <style:style style:name="Heading_20_1" style:display-name="Heading 1" style:family="paragraph" style:parent-style-name="Heading" style:next-style-name="Text_20_body" style:default-outline-level="1" style:class="text">+   <style:text-properties fo:font-size="115%" fo:font-weight="bold" style:font-size-asian="115%" style:font-weight-asian="bold" style:font-size-complex="115%" style:font-weight-complex="bold"/>+  </style:style>+  <style:style style:name="Heading_20_2" style:display-name="Heading 2" style:family="paragraph" style:parent-style-name="Heading" style:next-style-name="Text_20_body" style:default-outline-level="2" style:class="text">+   <style:text-properties fo:font-size="14pt" fo:font-style="italic" fo:font-weight="bold" style:font-size-asian="14pt" style:font-style-asian="italic" style:font-weight-asian="bold" style:font-size-complex="14pt" style:font-style-complex="italic" style:font-weight-complex="bold"/>+  </style:style>+  <style:style style:name="Table_20_Contents" style:display-name="Table Contents" style:family="paragraph" style:parent-style-name="Standard" style:class="extra">+   <style:paragraph-properties text:number-lines="false" text:line-number="0"/>+  </style:style>+  <style:style style:name="Table_20_Heading" style:display-name="Table Heading" style:family="paragraph" style:parent-style-name="Table_20_Contents" style:class="extra">+   <style:paragraph-properties fo:text-align="center" style:justify-single-word="false" text:number-lines="false" text:line-number="0"/>+   <style:text-properties fo:font-weight="bold" style:font-weight-asian="bold" style:font-weight-complex="bold"/>+  </style:style>+  <style:style style:name="Footnote" style:family="paragraph" style:parent-style-name="Standard" style:class="extra">+   <style:paragraph-properties fo:margin-left="0.1965in" fo:margin-right="0in" fo:text-indent="-0.1965in" style:auto-text-indent="false" text:number-lines="false" text:line-number="0"/>+   <style:text-properties fo:font-size="10pt" style:font-size-asian="10pt" style:font-size-complex="10pt"/>+  </style:style>+  <style:style style:name="Index_20_Heading" style:display-name="Index Heading" style:family="paragraph" style:parent-style-name="Heading" style:class="index">+   <style:paragraph-properties fo:margin-left="0in" fo:text-indent="0in" style:auto-text-indent="false" text:number-lines="false" text:line-number="0"/>+   <style:text-properties fo:font-size="16pt" fo:font-weight="bold" style:font-size-asian="16pt" style:font-weight-asian="bold" style:font-size-complex="16pt" style:font-weight-complex="bold"/>+  </style:style>+  <style:style style:name="Bibliography_20_Heading" style:display-name="Bibliography Heading" style:family="paragraph" style:parent-style-name="Heading" style:class="index">+   <style:paragraph-properties fo:margin-left="0in" fo:margin-right="0in" fo:text-indent="0in" style:auto-text-indent="false" text:number-lines="false" text:line-number="0"/>+   <style:text-properties fo:font-size="16pt" fo:font-weight="bold" style:font-size-asian="16pt" style:font-weight-asian="bold" style:font-size-complex="16pt" style:font-weight-complex="bold"/>+  </style:style>+  <style:style style:name="Bibliography_20_1" style:display-name="Bibliography 1" style:family="paragraph" style:parent-style-name="Index" style:class="index">+   <style:paragraph-properties fo:margin-left="0in" fo:margin-right="0in" fo:text-indent="0in" style:auto-text-indent="false">+    <style:tab-stops>+     <style:tab-stop style:position="6.6929in" style:type="right" style:leader-style="dotted" style:leader-text="."/>+    </style:tab-stops>+   </style:paragraph-properties>+  </style:style>+  <style:style style:name="Endnote" style:family="paragraph" style:parent-style-name="Standard" style:class="extra">+   <style:paragraph-properties fo:margin-left="0.1965in" fo:margin-right="0in" fo:text-indent="-0.1965in" style:auto-text-indent="false" text:number-lines="false" text:line-number="0"/>+   <style:text-properties fo:font-size="10pt" style:font-size-asian="10pt" style:font-size-complex="10pt"/>+  </style:style>+  <style:style style:name="Bullet_20_Symbols" style:display-name="Bullet Symbols" style:family="text">+   <style:text-properties style:font-name="OpenSymbol" fo:font-family="OpenSymbol" style:font-name-asian="OpenSymbol" style:font-family-asian="OpenSymbol" style:font-name-complex="OpenSymbol" style:font-family-complex="OpenSymbol"/>+  </style:style>+  <style:style style:name="Numbering_20_Symbols" style:display-name="Numbering Symbols" style:family="text"/>+  <style:style style:name="Internet_20_link" style:display-name="Internet link" style:family="text">+   <style:text-properties fo:color="#000080" loext:opacity="100%" fo:language="zxx" fo:country="none" style:text-underline-style="solid" style:text-underline-width="auto" style:text-underline-color="font-color" style:language-asian="zxx" style:country-asian="none" style:language-complex="zxx" style:country-complex="none"/>+  </style:style>+  <style:style style:name="Footnote_20_Symbol" style:display-name="Footnote Symbol" style:family="text"/>+  <style:style style:name="Footnote_20_anchor" style:display-name="Footnote anchor" style:family="text">+   <style:text-properties style:text-position="super 58%"/>+  </style:style>+  <style:style style:name="Endnote_20_Symbol" style:display-name="Endnote Symbol" style:family="text"/>+  <style:style style:name="Endnote_20_anchor" style:display-name="Endnote anchor" style:family="text">+   <style:text-properties style:text-position="super 58%"/>+  </style:style>+  <style:style style:name="OLE" style:family="graphic">+   <style:graphic-properties text:anchor-type="paragraph" svg:x="0in" svg:y="0in" style:wrap="none" style:vertical-pos="top" style:vertical-rel="paragraph" style:horizontal-pos="center" style:horizontal-rel="paragraph" draw:fill="none"/>+  </style:style>+  <style:style style:name="Formula" style:family="graphic">+   <style:graphic-properties text:anchor-type="as-char" svg:y="0in" fo:margin-left="0.0791in" fo:margin-right="0.0791in" style:vertical-pos="middle" style:vertical-rel="text" draw:fill="none"/>+  </style:style>+  <text:outline-style style:name="Outline">+   <text:outline-level-style text:level="1" loext:num-list-format="%1%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.3in" fo:text-indent="-0.3in" fo:margin-left="0.3in"/>+    </style:list-level-properties>+   </text:outline-level-style>+   <text:outline-level-style text:level="2" loext:num-list-format="%2%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.4in" fo:text-indent="-0.4in" fo:margin-left="0.4in"/>+    </style:list-level-properties>+   </text:outline-level-style>+   <text:outline-level-style text:level="3" loext:num-list-format="%3%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.5in" fo:text-indent="-0.5in" fo:margin-left="0.5in"/>+    </style:list-level-properties>+   </text:outline-level-style>+   <text:outline-level-style text:level="4" loext:num-list-format="%4%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.6in" fo:text-indent="-0.6in" fo:margin-left="0.6in"/>+    </style:list-level-properties>+   </text:outline-level-style>+   <text:outline-level-style text:level="5" loext:num-list-format="%5%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.7in" fo:text-indent="-0.7in" fo:margin-left="0.7in"/>+    </style:list-level-properties>+   </text:outline-level-style>+   <text:outline-level-style text:level="6" loext:num-list-format="%6%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.8in" fo:text-indent="-0.8in" fo:margin-left="0.8in"/>+    </style:list-level-properties>+   </text:outline-level-style>+   <text:outline-level-style text:level="7" loext:num-list-format="%7%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.9in" fo:text-indent="-0.9in" fo:margin-left="0.9in"/>+    </style:list-level-properties>+   </text:outline-level-style>+   <text:outline-level-style text:level="8" loext:num-list-format="%8%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1in" fo:text-indent="-1in" fo:margin-left="1in"/>+    </style:list-level-properties>+   </text:outline-level-style>+   <text:outline-level-style text:level="9" loext:num-list-format="%9%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.1in" fo:text-indent="-1.1in" fo:margin-left="1.1in"/>+    </style:list-level-properties>+   </text:outline-level-style>+   <text:outline-level-style text:level="10" loext:num-list-format="%10%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.2in" fo:text-indent="-1.2in" fo:margin-left="1.2in"/>+    </style:list-level-properties>+   </text:outline-level-style>+  </text:outline-style>+  <text:list-style style:name="Numbering_20_1" style:display-name="Numbering 1">+   <text:list-level-style-number text:level="1" text:style-name="Numbering_20_Symbols" loext:num-list-format="%1%." style:num-suffix="." style:num-format="1">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.1965in" fo:text-indent="-0.1965in" fo:margin-left="0.1965in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="2" text:style-name="Numbering_20_Symbols" loext:num-list-format="%2%." style:num-suffix="." style:num-format="1">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.3937in" fo:text-indent="-0.1965in" fo:margin-left="0.3937in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="3" text:style-name="Numbering_20_Symbols" loext:num-list-format="%3%." style:num-suffix="." style:num-format="1">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.5902in" fo:text-indent="-0.1965in" fo:margin-left="0.5902in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="4" text:style-name="Numbering_20_Symbols" loext:num-list-format="%4%." style:num-suffix="." style:num-format="1">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.7874in" fo:text-indent="-0.1965in" fo:margin-left="0.7874in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="5" text:style-name="Numbering_20_Symbols" loext:num-list-format="%5%." style:num-suffix="." style:num-format="1">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.9839in" fo:text-indent="-0.1965in" fo:margin-left="0.9839in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="6" text:style-name="Numbering_20_Symbols" loext:num-list-format="%6%." style:num-suffix="." style:num-format="1">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.1811in" fo:text-indent="-0.1965in" fo:margin-left="1.1811in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="7" text:style-name="Numbering_20_Symbols" loext:num-list-format="%7%." style:num-suffix="." style:num-format="1">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.378in" fo:text-indent="-0.1965in" fo:margin-left="1.378in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="8" text:style-name="Numbering_20_Symbols" loext:num-list-format="%8%." style:num-suffix="." style:num-format="1">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.5752in" fo:text-indent="-0.1965in" fo:margin-left="1.5752in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="9" text:style-name="Numbering_20_Symbols" loext:num-list-format="%9%." style:num-suffix="." style:num-format="1">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.7717in" fo:text-indent="-0.1965in" fo:margin-left="1.7717in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="10" text:style-name="Numbering_20_Symbols" loext:num-list-format="%10%." style:num-suffix="." style:num-format="1">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.9689in" fo:text-indent="-0.1965in" fo:margin-left="1.9689in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+  </text:list-style>+  <text:list-style style:name="Numbering_20_2" style:display-name="Numbering 2">+   <text:list-level-style-number text:level="1" text:style-name="Numbering_20_Symbols" loext:num-list-format="%1%" style:num-format="1">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.1965in" fo:text-indent="-0.1965in" fo:margin-left="0.1965in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="2" text:style-name="Numbering_20_Symbols" loext:num-list-format="%2%" style:num-format="1" text:start-value="2">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.3929in" fo:text-indent="-0.1965in" fo:margin-left="0.3929in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="3" text:style-name="Numbering_20_Symbols" loext:num-list-format="%3%" style:num-format="1" text:start-value="3">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.7866in" fo:text-indent="-0.3937in" fo:margin-left="0.7866in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="4" text:style-name="Numbering_20_Symbols" loext:num-list-format="%4%" style:num-format="1" text:start-value="4">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.2791in" fo:text-indent="-0.4925in" fo:margin-left="1.2791in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="5" text:style-name="Numbering_20_Symbols" loext:num-list-format="%5%" style:num-format="1" text:start-value="5">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.8693in" fo:text-indent="-0.5902in" fo:margin-left="1.8693in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="6" text:style-name="Numbering_20_Symbols" loext:num-list-format="%6%" style:num-format="1" text:start-value="6">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="2.5783in" fo:text-indent="-0.7091in" fo:margin-left="2.5783in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="7" text:style-name="Numbering_20_Symbols" loext:num-list-format="%7%" style:num-format="1" text:start-value="7">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="3.4839in" fo:text-indent="-0.9055in" fo:margin-left="3.4839in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="8" text:style-name="Numbering_20_Symbols" loext:num-list-format="%8%" style:num-format="1" text:start-value="8">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="4.5075in" fo:text-indent="-1.0236in" fo:margin-left="4.5075in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="9" text:style-name="Numbering_20_Symbols" loext:num-list-format="%9%" style:num-format="1" text:start-value="9">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="5.6102in" fo:text-indent="-1.1028in" fo:margin-left="5.6102in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="10" text:style-name="Numbering_20_Symbols" loext:num-list-format="%10%" style:num-format="1" text:start-value="10">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="6.8311in" fo:text-indent="-1.2209in" fo:margin-left="6.8311in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+  </text:list-style>+  <text:list-style style:name="Numbering_20_3" style:display-name="Numbering 3">+   <text:list-level-style-number text:level="1" text:style-name="Numbering_20_Symbols" loext:num-list-format="%1%" style:num-format="1">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.1811in" fo:text-indent="-1.1811in" fo:margin-left="1.1811in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="2" text:style-name="Numbering_20_Symbols" loext:num-list-format="%2%" style:num-format="1" text:start-value="2">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="2.3626in" fo:text-indent="-1.1811in" fo:margin-left="2.3626in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="3" text:style-name="Numbering_20_Symbols" loext:num-list-format="%3%" style:num-format="1" text:start-value="3">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="3.5437in" fo:text-indent="-1.1811in" fo:margin-left="3.5437in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="4" text:style-name="Numbering_20_Symbols" loext:num-list-format="%4%" style:num-format="1" text:start-value="4">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="4.7252in" fo:text-indent="-1.1811in" fo:margin-left="4.7252in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="5" text:style-name="Numbering_20_Symbols" loext:num-list-format="%5%" style:num-format="1" text:start-value="5">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="5.9063in" fo:text-indent="-1.1811in" fo:margin-left="5.9063in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="6" text:style-name="Numbering_20_Symbols" loext:num-list-format="%6%" style:num-format="1" text:start-value="6">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="7.0874in" fo:text-indent="-1.1811in" fo:margin-left="7.0874in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="7" text:style-name="Numbering_20_Symbols" loext:num-list-format="%7%" style:num-format="1" text:start-value="7">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="8.2689in" fo:text-indent="-1.1811in" fo:margin-left="8.2689in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="8" text:style-name="Numbering_20_Symbols" loext:num-list-format="%8%" style:num-format="1" text:start-value="8">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="9.45in" fo:text-indent="-1.1811in" fo:margin-left="9.45in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="9" text:style-name="Numbering_20_Symbols" loext:num-list-format="%9%" style:num-format="1" text:start-value="9">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="10.6311in" fo:text-indent="-1.1811in" fo:margin-left="10.6311in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="10" text:style-name="Numbering_20_Symbols" loext:num-list-format="%10%" style:num-format="1" text:start-value="10">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="11.8126in" fo:text-indent="-1.1811in" fo:margin-left="11.8126in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+  </text:list-style>+  <text:list-style style:name="Numbering_20_4" style:display-name="Numbering 4">+   <text:list-level-style-number text:level="1" text:style-name="Numbering_20_Symbols" loext:num-list-format="%1%." style:num-suffix="." style:num-format="I">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="0.1965in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="2" text:style-name="Numbering_20_Symbols" loext:num-list-format="%2%." style:num-suffix="." style:num-format="I">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="0.3937in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="3" text:style-name="Numbering_20_Symbols" loext:num-list-format="%3%." style:num-suffix="." style:num-format="I">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="0.5902in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="4" text:style-name="Numbering_20_Symbols" loext:num-list-format="%4%." style:num-suffix="." style:num-format="I">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="0.7874in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="5" text:style-name="Numbering_20_Symbols" loext:num-list-format="%5%." style:num-suffix="." style:num-format="I">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="0.9839in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="6" text:style-name="Numbering_20_Symbols" loext:num-list-format="%6%." style:num-suffix="." style:num-format="I">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="1.1811in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="7" text:style-name="Numbering_20_Symbols" loext:num-list-format="%7%." style:num-suffix="." style:num-format="I">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="1.378in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="8" text:style-name="Numbering_20_Symbols" loext:num-list-format="%8%." style:num-suffix="." style:num-format="I">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="1.5752in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="9" text:style-name="Numbering_20_Symbols" loext:num-list-format="%9%." style:num-suffix="." style:num-format="I">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="1.7717in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="10" text:style-name="Numbering_20_Symbols" loext:num-list-format="%10%." style:num-suffix="." style:num-format="I">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="1.9689in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+  </text:list-style>+  <text:list-style style:name="Numbering_20_5" style:display-name="Numbering 5">+   <text:list-level-style-number text:level="1" text:style-name="Numbering_20_Symbols" loext:num-list-format="%1%." style:num-suffix="." style:num-format="1">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.1575in" fo:text-indent="-0.1575in" fo:margin-left="0.1575in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="2" text:style-name="Numbering_20_Symbols" loext:num-list-format="%1%.%2%." style:num-suffix="." style:num-format="1" text:display-levels="2">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.4335in" fo:text-indent="-0.2563in" fo:margin-left="0.4335in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="3" text:style-name="Numbering_20_Symbols" loext:num-list-format="%3%)" style:num-suffix=")" style:num-format="a">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.6102in" fo:text-indent="-0.1772in" fo:margin-left="0.6102in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-bullet text:level="4" text:style-name="Numbering_20_Symbols" loext:num-list-format="%4%" text:bullet-char="•">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.7874in" fo:text-indent="-0.1555in" fo:margin-left="0.7874in"/>+    </style:list-level-properties>+    <style:text-properties style:font-name="OpenSymbol"/>+   </text:list-level-style-bullet>+   <text:list-level-style-bullet text:level="5" text:style-name="Numbering_20_Symbols" loext:num-list-format="%5%" text:bullet-char="•">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.9429in" fo:text-indent="-0.1555in" fo:margin-left="0.9429in"/>+    </style:list-level-properties>+    <style:text-properties style:font-name="OpenSymbol"/>+   </text:list-level-style-bullet>+   <text:list-level-style-bullet text:level="6" text:style-name="Numbering_20_Symbols" loext:num-list-format="%6%" text:bullet-char="•">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.0984in" fo:text-indent="-0.1555in" fo:margin-left="1.0984in"/>+    </style:list-level-properties>+    <style:text-properties style:font-name="OpenSymbol"/>+   </text:list-level-style-bullet>+   <text:list-level-style-bullet text:level="7" text:style-name="Numbering_20_Symbols" loext:num-list-format="%7%" text:bullet-char="•">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.2543in" fo:text-indent="-0.1555in" fo:margin-left="1.2543in"/>+    </style:list-level-properties>+    <style:text-properties style:font-name="OpenSymbol"/>+   </text:list-level-style-bullet>+   <text:list-level-style-bullet text:level="8" text:style-name="Numbering_20_Symbols" loext:num-list-format="%8%" text:bullet-char="•">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.4098in" fo:text-indent="-0.1555in" fo:margin-left="1.4098in"/>+    </style:list-level-properties>+    <style:text-properties style:font-name="OpenSymbol"/>+   </text:list-level-style-bullet>+   <text:list-level-style-bullet text:level="9" text:style-name="Numbering_20_Symbols" loext:num-list-format="%9%" text:bullet-char="•">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.5654in" fo:text-indent="-0.1555in" fo:margin-left="1.5654in"/>+    </style:list-level-properties>+    <style:text-properties style:font-name="OpenSymbol"/>+   </text:list-level-style-bullet>+   <text:list-level-style-bullet text:level="10" text:style-name="Numbering_20_Symbols" loext:num-list-format="%10%" text:bullet-char="•">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.7209in" fo:text-indent="-0.1555in" fo:margin-left="1.7209in"/>+    </style:list-level-properties>+    <style:text-properties style:font-name="OpenSymbol"/>+   </text:list-level-style-bullet>+  </text:list-style>+  <text:notes-configuration text:note-class="footnote" text:citation-style-name="Footnote_20_Symbol" text:citation-body-style-name="Footnote_20_anchor" style:num-format="1" text:start-value="0" text:footnotes-position="page" text:start-numbering-at="document"/>+  <text:notes-configuration text:note-class="endnote" text:citation-style-name="Endnote_20_Symbol" text:citation-body-style-name="Endnote_20_anchor" text:master-page-name="Endnote" style:num-format="i" text:start-value="0"/>+  <text:bibliography-configuration text:prefix="[" text:suffix="]" text:sort-algorithm="alphanumeric" fo:language="en" fo:country="US"/>+  <text:linenumbering-configuration text:number-lines="false" text:offset="0.1965in" style:num-format="1" text:number-position="left" text:increment="5"/>+  <loext:theme loext:name="Office">+   <loext:theme-colors loext:name="LibreOffice">+    <loext:color loext:name="dark1" loext:color="#000000"/>+    <loext:color loext:name="light1" loext:color="#ffffff"/>+    <loext:color loext:name="dark2" loext:color="#000000"/>+    <loext:color loext:name="light2" loext:color="#ffffff"/>+    <loext:color loext:name="accent1" loext:color="#18a303"/>+    <loext:color loext:name="accent2" loext:color="#0369a3"/>+    <loext:color loext:name="accent3" loext:color="#a33e03"/>+    <loext:color loext:name="accent4" loext:color="#8e03a3"/>+    <loext:color loext:name="accent5" loext:color="#c99c00"/>+    <loext:color loext:name="accent6" loext:color="#c9211e"/>+    <loext:color loext:name="hyperlink" loext:color="#0000ee"/>+    <loext:color loext:name="followed-hyperlink" loext:color="#551a8b"/>+   </loext:theme-colors>+  </loext:theme>+ </office:styles>+ <office:automatic-styles>+  <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:horizontal-pos="from-left" style:horizontal-rel="paragraph-content" draw:ole-draw-aspect="1"/>+  </style:style>+  <style:page-layout style:name="pm1">+   <style:page-layout-properties fo:page-width="8.2681in" fo:page-height="11.6929in" style:num-format="1" style:print-orientation="portrait" fo:margin-top="0.7874in" fo:margin-bottom="0.7874in" fo:margin-left="0.7874in" fo:margin-right="0.7874in" style:writing-mode="lr-tb" style:layout-grid-color="#c0c0c0" style:layout-grid-lines="20" style:layout-grid-base-height="0.278in" style:layout-grid-ruby-height="0.139in" style:layout-grid-mode="none" style:layout-grid-ruby-below="false" style:layout-grid-print="false" style:layout-grid-display="false" style:footnote-max-height="0in" loext:margin-gutter="0in">+    <style:footnote-sep style:width="0.0071in" style:distance-before-sep="0.0398in" style:distance-after-sep="0.0398in" style:line-style="solid" style:adjustment="left" style:rel-width="25%" style:color="#000000"/>+   </style:page-layout-properties>+   <style:header-style/>+   <style:footer-style/>+  </style:page-layout>+  <style:page-layout style:name="pm2">+   <style:page-layout-properties fo:page-width="8.2681in" fo:page-height="11.6929in" style:num-format="1" style:print-orientation="portrait" fo:margin-top="0.7874in" fo:margin-bottom="0.7874in" fo:margin-left="0.7874in" fo:margin-right="0.7874in" style:writing-mode="lr-tb" style:layout-grid-color="#c0c0c0" style:layout-grid-lines="20" style:layout-grid-base-height="0.278in" style:layout-grid-ruby-height="0.139in" style:layout-grid-mode="none" style:layout-grid-ruby-below="false" style:layout-grid-print="false" style:layout-grid-display="false" style:footnote-max-height="0in" loext:margin-gutter="0in">+    <style:footnote-sep style:line-style="solid" style:adjustment="left" style:rel-width="25%" style:color="#000000"/>+   </style:page-layout-properties>+   <style:header-style/>+   <style:footer-style/>+  </style:page-layout>+  <style:style style:name="dp1" style:family="drawing-page">+   <style:drawing-page-properties draw:background-size="full"/>+  </style:style>+ </office:automatic-styles>+ <office:body>+  <office:text>+   <text:sequence-decls>+    <text:sequence-decl text:display-outline-level="0" text:name="Illustration"/>+    <text:sequence-decl text:display-outline-level="0" text:name="Table"/>+    <text:sequence-decl text:display-outline-level="0" text:name="Text"/>+    <text:sequence-decl text:display-outline-level="0" text:name="Drawing"/>+    <text:sequence-decl text:display-outline-level="0" text:name="Figure"/>+   </text:sequence-decls>+   <text:p text:style-name="Standard"><draw:frame draw:style-name="fr1" draw:name="Objekt1" text:anchor-type="as-char" svg:width="0.6602in" svg:height="0.2075in" draw:z-index="0"><draw:object>+      <math xmlns="http://www.w3.org/1998/Math/MathML" display="block">+       <semantics>+        <mrow>+         <mi>E</mi>+         <mo stretchy="false">=</mo>+         <mrow>+          <mi>m</mi>+          <mo stretchy="false">⋅</mo>+          <msup>+           <mi>c</mi>+           <mn>2</mn>+          </msup>+         </mrow>+        </mrow>+        <annotation encoding="StarMath 5.0">E = m cdot c^2</annotation>+       </semantics>+      </math>+     </draw:object><draw:image>+      <office:binary-data>VkNMTVRGAQAxAAAAAAAAAAEAGwAAAAAAAAAAAAAAAAABAAAAAQAAAAEAAAABAAAAAY0GAAAQ+       AgAAMgAAAJYAAQACAAAACQCLAAEAAgAAAP//gQABABAAAAAAAAAAAAAAAIwGAAAPAgAAlQAB+       AAQAAAAAAAAAlgABAAIAAAAJAIsAAQACAAAAHwCKAAEARwAAAAUAQQAAAA8AVGltZXMgTmV3+       IFJvbWFuAAAAAAAApgEAAAAAAwAAAAUAAAAAAAIA/wMAAAAAAAAAAAD/AwAAAAAAAAAAAAAA+       iAABAAIAAAABAIcAAQAFAAAA/////wCGAAEABAAAAAAAAAByAAIAFwAAAIQAAADCAQAAAQBF+       AgEAAAAAAQABAEUAjAABAAAAAACLAAEAAgAAAB8AigABAEIAAAAFADwAAAAKAE9wZW5TeW1i+       b2wAAAAAAACmAQAA//8AAAAABQAAAAAAAAD/AwAAAAAAAAAAAP8DAAAAAAAAAAAAAACIAAEA+       AgAAAAEAhwABAAUAAAD/////AIYAAQAEAAAAAAAAAHIAAgAaAAAApwEAAMIBAAABAAAAPQBP+       AQAAAAABAAEAPQCMAAEAAAAAAIsAAQACAAAAHwCKAAEARwAAAAUAQQAAAA8AVGltZXMgTmV3+       IFJvbWFuAAAAAAAApgEAAAAAAwAAAAUAAAAAAAIA/wMAAAAAAAAAAAD/AwAAAAAAAAAAAAAA+       iAABAAIAAAABAIcAAQAFAAAA/////wCGAAEABAAAAAAAAAByAAIAFwAAABoDAADCAQAAAQBt+       MQEAAAAAAQABAG0AjAABAAAAAACLAAEAAgAAAB8AigABAEIAAAAFADwAAAAKAE9wZW5TeW1i+       b2wAAAAAAACmAQAA//8AAAAABQAAAAAAAAD/AwAAAAAAAAAAAP8DAAAAAAAAAAAAAACIAAEA+       AgAAAAEAhwABAAUAAAD/////AIYAAQAEAAAAAAAAAHIAAgAaAAAACAQAAMIBAAABAAAAxSL0+       AAAAAAABAAEAxSKMAAEAAAAAAIsAAQACAAAAHwCKAAEARwAAAAUAQQAAAA8AVGltZXMgTmV3+       IFJvbWFuAAAAAAAApgEAAAAAAwAAAAUAAAAAAAIA/wMAAAAAAAAAAAD/AwAAAAAAAAAAAAAA+       iAABAAIAAAABAIcAAQAFAAAA/////wCGAAEABAAAAAAAAAByAAIAFwAAANwEAADCAQAAAQBj+       uwAAAAAAAQABAGMAjAABAAAAAACLAAEAAgAAAB8AigABAEcAAAAFAEEAAAAPAFRpbWVzIE5l+       dyBSb21hbgAAAAAAAP0AAAAAAAMAAAAFAAAAAAAAAP8DAAAAAAAAAAAA/wMAAAAAAAAAAAAA+       AIgAAQACAAAAAQCHAAEABQAAAP////8AhgABAAQAAAAAAAAAcgACABcAAACvBQAA7gAAAAEA+       Mn8AAAAAAAEAAQAyAIwAAQAAAAAAlQABAAQAAAAAAAAAlgABAAIAAAAJAIwAAQAAAAAA+      </office:binary-data>+     </draw:image>+    </draw:frame></text:p>+  </office:text>+ </office:body>+</office:document>
+ test/odt/fodt/image.fodt view
@@ -0,0 +1,793 @@+<?xml version="1.0" encoding="UTF-8"?>++<office:document xmlns:css3t="http://www.w3.org/TR/css3-text/" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:rpt="http://openoffice.org/2005/report" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" office:version="1.3" office:mimetype="application/vnd.oasis.opendocument.text">+ <office:meta><meta:initial-creator>Martin Linnemann</meta:initial-creator><meta:creation-date>2015-03-01T17:26:12.31</meta:creation-date><dc:date>2015-03-01T18:20:30.92</dc:date><dc:creator>Martin Linnemann</dc:creator><meta:editing-duration>PT10M3S</meta:editing-duration><meta:editing-cycles>2</meta:editing-cycles><meta:generator>LibreOffice/24.8.7.2$Linux_AARCH64 LibreOffice_project/480$Build-2</meta:generator><meta:document-statistic meta:table-count="0" meta:image-count="1" meta:object-count="0" meta:page-count="1" meta:paragraph-count="0" meta:word-count="0" meta:character-count="0"/></office:meta>+ <office:font-face-decls>+  <style:font-face style:name="Arial" svg:font-family="Arial" style:font-family-generic="swiss" style:font-pitch="variable"/>+  <style:font-face style:name="Calibri" svg:font-family="Calibri" style:font-family-generic="swiss"/>+  <style:font-face style:name="Lucida Sans Unicode" svg:font-family="&apos;Lucida Sans Unicode&apos;" style:font-family-generic="system" style:font-pitch="variable"/>+  <style:font-face style:name="Mangal" svg:font-family="Mangal"/>+  <style:font-face style:name="Mangal1" svg:font-family="Mangal" style:font-family-generic="system" style:font-pitch="variable"/>+  <style:font-face style:name="OpenSymbol" svg:font-family="OpenSymbol"/>+ </office:font-face-decls>+ <office:styles>+  <style:default-style style:family="graphic">+   <style:graphic-properties svg:stroke-color="#808080" draw:fill-color="#cfe7f5" fo:wrap-option="no-wrap" draw:shadow-offset-x="0.1181in" draw:shadow-offset-y="0.1181in" draw:start-line-spacing-horizontal="0.1114in" draw:start-line-spacing-vertical="0.1114in" draw:end-line-spacing-horizontal="0.1114in" draw:end-line-spacing-vertical="0.1114in" style:writing-mode="lr-tb" style:flow-with-text="false"/>+   <style:paragraph-properties style:text-autospace="ideograph-alpha" style:line-break="strict" loext:tab-stop-distance="0in" style:font-independent-line-spacing="false">+    <style:tab-stops/>+   </style:paragraph-properties>+   <style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Calibri" fo:font-size="12pt" fo:language="de" fo:country="DE" style:letter-kerning="true" style:font-name-asian="Lucida Sans Unicode" style:font-size-asian="12pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Mangal1" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN"/>+  </style:default-style>+  <style:default-style style:family="paragraph">+   <style:paragraph-properties fo:hyphenation-ladder-count="no-limit" fo:hyphenation-keep="auto" loext:hyphenation-keep-type="column" style:text-autospace="ideograph-alpha" style:punctuation-wrap="hanging" style:line-break="strict" style:tab-stop-distance="0.4925in" style:writing-mode="page"/>+   <style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Calibri" fo:font-size="12pt" fo:language="de" fo:country="DE" style:letter-kerning="true" style:font-name-asian="Lucida Sans Unicode" style:font-size-asian="12pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Mangal1" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN" fo:hyphenate="false" fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2" loext:hyphenation-no-caps="false" loext:hyphenation-no-last-word="false" loext:hyphenation-word-char-count="no-limit" loext:hyphenation-zone="no-limit"/>+  </style:default-style>+  <style:default-style style:family="table">+   <style:table-properties table:border-model="collapsing"/>+  </style:default-style>+  <style:default-style style:family="table-row">+   <style:table-row-properties fo:keep-together="auto"/>+  </style:default-style>+  <style:style style:name="Standard" style:family="paragraph" style:class="text"/>+  <style:style style:name="Heading" style:family="paragraph" style:parent-style-name="Standard" style:next-style-name="Text_20_body" style:class="text">+   <style:paragraph-properties fo:margin-top="0.1665in" fo:margin-bottom="0.0835in" style:contextual-spacing="false" fo:keep-with-next="always"/>+   <style:text-properties style:font-name="Arial" fo:font-family="Arial" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="14pt" style:font-name-asian="Lucida Sans Unicode" style:font-family-asian="&apos;Lucida Sans Unicode&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="14pt" style:font-name-complex="Mangal1" style:font-family-complex="Mangal" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="14pt"/>+  </style:style>+  <style:style style:name="Text_20_body" style:display-name="Text body" style:family="paragraph" style:parent-style-name="Standard" style:class="text">+   <style:paragraph-properties fo:margin-top="0in" fo:margin-bottom="0.0835in" style:contextual-spacing="false"/>+  </style:style>+  <style:style style:name="List" style:family="paragraph" style:parent-style-name="Text_20_body" style:class="list">+   <style:text-properties style:font-name="Calibri" fo:font-family="Calibri" style:font-family-generic="swiss" style:font-name-complex="Mangal" style:font-family-complex="Mangal"/>+  </style:style>+  <style:style style:name="Caption" style:family="paragraph" style:parent-style-name="Standard" style:class="extra">+   <style:paragraph-properties fo:margin-top="0.0835in" fo:margin-bottom="0.0835in" style:contextual-spacing="false" text:number-lines="false" text:line-number="0"/>+   <style:text-properties style:font-name="Calibri" fo:font-family="Calibri" style:font-family-generic="swiss" fo:font-size="12pt" fo:font-style="italic" style:font-size-asian="12pt" style:font-style-asian="italic" style:font-name-complex="Mangal" style:font-family-complex="Mangal" style:font-size-complex="12pt" style:font-style-complex="italic"/>+  </style:style>+  <style:style style:name="Index" style:family="paragraph" style:parent-style-name="Standard" style:class="index">+   <style:paragraph-properties text:number-lines="false" text:line-number="0"/>+   <style:text-properties style:font-name="Calibri" fo:font-family="Calibri" style:font-family-generic="swiss" style:font-name-complex="Mangal" style:font-family-complex="Mangal"/>+  </style:style>+  <style:style style:name="Heading_20_1" style:display-name="Heading 1" style:family="paragraph" style:parent-style-name="Heading" style:next-style-name="Text_20_body" style:default-outline-level="1" style:class="text">+   <style:text-properties fo:font-size="115%" fo:font-weight="bold" style:font-size-asian="115%" style:font-weight-asian="bold" style:font-size-complex="115%" style:font-weight-complex="bold"/>+  </style:style>+  <style:style style:name="Heading_20_2" style:display-name="Heading 2" style:family="paragraph" style:parent-style-name="Heading" style:next-style-name="Text_20_body" style:default-outline-level="2" style:class="text">+   <style:text-properties fo:font-size="14pt" fo:font-style="italic" fo:font-weight="bold" style:font-size-asian="14pt" style:font-style-asian="italic" style:font-weight-asian="bold" style:font-size-complex="14pt" style:font-style-complex="italic" style:font-weight-complex="bold"/>+  </style:style>+  <style:style style:name="Table_20_Contents" style:display-name="Table Contents" style:family="paragraph" style:parent-style-name="Standard" style:class="extra">+   <style:paragraph-properties text:number-lines="false" text:line-number="0"/>+  </style:style>+  <style:style style:name="Table_20_Heading" style:display-name="Table Heading" style:family="paragraph" style:parent-style-name="Table_20_Contents" style:class="extra">+   <style:paragraph-properties fo:text-align="center" style:justify-single-word="false" text:number-lines="false" text:line-number="0"/>+   <style:text-properties fo:font-weight="bold" style:font-weight-asian="bold" style:font-weight-complex="bold"/>+  </style:style>+  <style:style style:name="Footnote" style:family="paragraph" style:parent-style-name="Standard" style:class="extra">+   <style:paragraph-properties fo:margin-left="0.1965in" fo:margin-right="0in" fo:text-indent="-0.1965in" style:auto-text-indent="false" text:number-lines="false" text:line-number="0"/>+   <style:text-properties fo:font-size="10pt" style:font-size-asian="10pt" style:font-size-complex="10pt"/>+  </style:style>+  <style:style style:name="Index_20_Heading" style:display-name="Index Heading" style:family="paragraph" style:parent-style-name="Heading" style:class="index">+   <style:paragraph-properties fo:margin-left="0in" fo:text-indent="0in" style:auto-text-indent="false" text:number-lines="false" text:line-number="0"/>+   <style:text-properties fo:font-size="16pt" fo:font-weight="bold" style:font-size-asian="16pt" style:font-weight-asian="bold" style:font-size-complex="16pt" style:font-weight-complex="bold"/>+  </style:style>+  <style:style style:name="Bibliography_20_Heading" style:display-name="Bibliography Heading" style:family="paragraph" style:parent-style-name="Heading" style:class="index">+   <style:paragraph-properties fo:margin-left="0in" fo:margin-right="0in" fo:text-indent="0in" style:auto-text-indent="false" text:number-lines="false" text:line-number="0"/>+   <style:text-properties fo:font-size="16pt" fo:font-weight="bold" style:font-size-asian="16pt" style:font-weight-asian="bold" style:font-size-complex="16pt" style:font-weight-complex="bold"/>+  </style:style>+  <style:style style:name="Bibliography_20_1" style:display-name="Bibliography 1" style:family="paragraph" style:parent-style-name="Index" style:class="index">+   <style:paragraph-properties fo:margin-left="0in" fo:margin-right="0in" fo:text-indent="0in" style:auto-text-indent="false">+    <style:tab-stops>+     <style:tab-stop style:position="6.6929in" style:type="right" style:leader-style="dotted" style:leader-text="."/>+    </style:tab-stops>+   </style:paragraph-properties>+  </style:style>+  <style:style style:name="Endnote" style:family="paragraph" style:parent-style-name="Standard" style:class="extra">+   <style:paragraph-properties fo:margin-left="0.1965in" fo:margin-right="0in" fo:text-indent="-0.1965in" style:auto-text-indent="false" text:number-lines="false" text:line-number="0"/>+   <style:text-properties fo:font-size="10pt" style:font-size-asian="10pt" style:font-size-complex="10pt"/>+  </style:style>+  <style:style style:name="Bullet_20_Symbols" style:display-name="Bullet Symbols" style:family="text">+   <style:text-properties style:font-name="OpenSymbol" fo:font-family="OpenSymbol" style:font-name-asian="OpenSymbol" style:font-family-asian="OpenSymbol" style:font-name-complex="OpenSymbol" style:font-family-complex="OpenSymbol"/>+  </style:style>+  <style:style style:name="Numbering_20_Symbols" style:display-name="Numbering Symbols" style:family="text"/>+  <style:style style:name="Internet_20_link" style:display-name="Internet link" style:family="text">+   <style:text-properties fo:color="#000080" loext:opacity="100%" fo:language="zxx" fo:country="none" style:text-underline-style="solid" style:text-underline-width="auto" style:text-underline-color="font-color" style:language-asian="zxx" style:country-asian="none" style:language-complex="zxx" style:country-complex="none"/>+  </style:style>+  <style:style style:name="Footnote_20_Symbol" style:display-name="Footnote Symbol" style:family="text"/>+  <style:style style:name="Footnote_20_anchor" style:display-name="Footnote anchor" style:family="text">+   <style:text-properties style:text-position="super 58%"/>+  </style:style>+  <style:style style:name="Endnote_20_Symbol" style:display-name="Endnote Symbol" style:family="text"/>+  <style:style style:name="Endnote_20_anchor" style:display-name="Endnote anchor" style:family="text">+   <style:text-properties style:text-position="super 58%"/>+  </style:style>+  <style:style style:name="OLE" style:family="graphic">+   <style:graphic-properties text:anchor-type="paragraph" svg:x="0in" svg:y="0in" style:wrap="none" style:vertical-pos="top" style:vertical-rel="paragraph" style:horizontal-pos="center" style:horizontal-rel="paragraph" draw:fill="none"/>+  </style:style>+  <style:style style:name="Formula" style:family="graphic">+   <style:graphic-properties text:anchor-type="as-char" svg:y="0in" fo:margin-left="0.0791in" fo:margin-right="0.0791in" style:vertical-pos="middle" style:vertical-rel="text" draw:fill="none"/>+  </style:style>+  <style:style style:name="Graphics" style:family="graphic">+   <style:graphic-properties text:anchor-type="paragraph" svg:x="0in" svg:y="0in" style:wrap="none" style:vertical-pos="top" style:vertical-rel="paragraph" style:horizontal-pos="center" style:horizontal-rel="paragraph" draw:fill="none"/>+  </style:style>+  <text:outline-style style:name="Outline">+   <text:outline-level-style text:level="1" loext:num-list-format="%1%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.3in" fo:text-indent="-0.3in" fo:margin-left="0.3in"/>+    </style:list-level-properties>+   </text:outline-level-style>+   <text:outline-level-style text:level="2" loext:num-list-format="%2%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.4in" fo:text-indent="-0.4in" fo:margin-left="0.4in"/>+    </style:list-level-properties>+   </text:outline-level-style>+   <text:outline-level-style text:level="3" loext:num-list-format="%3%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.5in" fo:text-indent="-0.5in" fo:margin-left="0.5in"/>+    </style:list-level-properties>+   </text:outline-level-style>+   <text:outline-level-style text:level="4" loext:num-list-format="%4%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.6in" fo:text-indent="-0.6in" fo:margin-left="0.6in"/>+    </style:list-level-properties>+   </text:outline-level-style>+   <text:outline-level-style text:level="5" loext:num-list-format="%5%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.7in" fo:text-indent="-0.7in" fo:margin-left="0.7in"/>+    </style:list-level-properties>+   </text:outline-level-style>+   <text:outline-level-style text:level="6" loext:num-list-format="%6%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.8in" fo:text-indent="-0.8in" fo:margin-left="0.8in"/>+    </style:list-level-properties>+   </text:outline-level-style>+   <text:outline-level-style text:level="7" loext:num-list-format="%7%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.9in" fo:text-indent="-0.9in" fo:margin-left="0.9in"/>+    </style:list-level-properties>+   </text:outline-level-style>+   <text:outline-level-style text:level="8" loext:num-list-format="%8%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1in" fo:text-indent="-1in" fo:margin-left="1in"/>+    </style:list-level-properties>+   </text:outline-level-style>+   <text:outline-level-style text:level="9" loext:num-list-format="%9%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.1in" fo:text-indent="-1.1in" fo:margin-left="1.1in"/>+    </style:list-level-properties>+   </text:outline-level-style>+   <text:outline-level-style text:level="10" loext:num-list-format="%10%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.2in" fo:text-indent="-1.2in" fo:margin-left="1.2in"/>+    </style:list-level-properties>+   </text:outline-level-style>+  </text:outline-style>+  <text:list-style style:name="Numbering_20_1" style:display-name="Numbering 1">+   <text:list-level-style-number text:level="1" text:style-name="Numbering_20_Symbols" loext:num-list-format="%1%." style:num-suffix="." style:num-format="1">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.1965in" fo:text-indent="-0.1965in" fo:margin-left="0.1965in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="2" text:style-name="Numbering_20_Symbols" loext:num-list-format="%2%." style:num-suffix="." style:num-format="1">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.3937in" fo:text-indent="-0.1965in" fo:margin-left="0.3937in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="3" text:style-name="Numbering_20_Symbols" loext:num-list-format="%3%." style:num-suffix="." style:num-format="1">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.5902in" fo:text-indent="-0.1965in" fo:margin-left="0.5902in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="4" text:style-name="Numbering_20_Symbols" loext:num-list-format="%4%." style:num-suffix="." style:num-format="1">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.7874in" fo:text-indent="-0.1965in" fo:margin-left="0.7874in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="5" text:style-name="Numbering_20_Symbols" loext:num-list-format="%5%." style:num-suffix="." style:num-format="1">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.9839in" fo:text-indent="-0.1965in" fo:margin-left="0.9839in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="6" text:style-name="Numbering_20_Symbols" loext:num-list-format="%6%." style:num-suffix="." style:num-format="1">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.1811in" fo:text-indent="-0.1965in" fo:margin-left="1.1811in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="7" text:style-name="Numbering_20_Symbols" loext:num-list-format="%7%." style:num-suffix="." style:num-format="1">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.378in" fo:text-indent="-0.1965in" fo:margin-left="1.378in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="8" text:style-name="Numbering_20_Symbols" loext:num-list-format="%8%." style:num-suffix="." style:num-format="1">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.5752in" fo:text-indent="-0.1965in" fo:margin-left="1.5752in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="9" text:style-name="Numbering_20_Symbols" loext:num-list-format="%9%." style:num-suffix="." style:num-format="1">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.7717in" fo:text-indent="-0.1965in" fo:margin-left="1.7717in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="10" text:style-name="Numbering_20_Symbols" loext:num-list-format="%10%." style:num-suffix="." style:num-format="1">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.9689in" fo:text-indent="-0.1965in" fo:margin-left="1.9689in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+  </text:list-style>+  <text:list-style style:name="Numbering_20_2" style:display-name="Numbering 2">+   <text:list-level-style-number text:level="1" text:style-name="Numbering_20_Symbols" loext:num-list-format="%1%" style:num-format="1">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.1965in" fo:text-indent="-0.1965in" fo:margin-left="0.1965in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="2" text:style-name="Numbering_20_Symbols" loext:num-list-format="%2%" style:num-format="1" text:start-value="2">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.3929in" fo:text-indent="-0.1965in" fo:margin-left="0.3929in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="3" text:style-name="Numbering_20_Symbols" loext:num-list-format="%3%" style:num-format="1" text:start-value="3">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.7866in" fo:text-indent="-0.3937in" fo:margin-left="0.7866in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="4" text:style-name="Numbering_20_Symbols" loext:num-list-format="%4%" style:num-format="1" text:start-value="4">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.2791in" fo:text-indent="-0.4925in" fo:margin-left="1.2791in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="5" text:style-name="Numbering_20_Symbols" loext:num-list-format="%5%" style:num-format="1" text:start-value="5">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.8693in" fo:text-indent="-0.5902in" fo:margin-left="1.8693in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="6" text:style-name="Numbering_20_Symbols" loext:num-list-format="%6%" style:num-format="1" text:start-value="6">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="2.5783in" fo:text-indent="-0.7091in" fo:margin-left="2.5783in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="7" text:style-name="Numbering_20_Symbols" loext:num-list-format="%7%" style:num-format="1" text:start-value="7">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="3.4839in" fo:text-indent="-0.9055in" fo:margin-left="3.4839in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="8" text:style-name="Numbering_20_Symbols" loext:num-list-format="%8%" style:num-format="1" text:start-value="8">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="4.5075in" fo:text-indent="-1.0236in" fo:margin-left="4.5075in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="9" text:style-name="Numbering_20_Symbols" loext:num-list-format="%9%" style:num-format="1" text:start-value="9">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="5.6102in" fo:text-indent="-1.1028in" fo:margin-left="5.6102in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="10" text:style-name="Numbering_20_Symbols" loext:num-list-format="%10%" style:num-format="1" text:start-value="10">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="6.8311in" fo:text-indent="-1.2209in" fo:margin-left="6.8311in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+  </text:list-style>+  <text:list-style style:name="Numbering_20_3" style:display-name="Numbering 3">+   <text:list-level-style-number text:level="1" text:style-name="Numbering_20_Symbols" loext:num-list-format="%1%" style:num-format="1">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.1811in" fo:text-indent="-1.1811in" fo:margin-left="1.1811in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="2" text:style-name="Numbering_20_Symbols" loext:num-list-format="%2%" style:num-format="1" text:start-value="2">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="2.3626in" fo:text-indent="-1.1811in" fo:margin-left="2.3626in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="3" text:style-name="Numbering_20_Symbols" loext:num-list-format="%3%" style:num-format="1" text:start-value="3">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="3.5437in" fo:text-indent="-1.1811in" fo:margin-left="3.5437in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="4" text:style-name="Numbering_20_Symbols" loext:num-list-format="%4%" style:num-format="1" text:start-value="4">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="4.7252in" fo:text-indent="-1.1811in" fo:margin-left="4.7252in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="5" text:style-name="Numbering_20_Symbols" loext:num-list-format="%5%" style:num-format="1" text:start-value="5">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="5.9063in" fo:text-indent="-1.1811in" fo:margin-left="5.9063in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="6" text:style-name="Numbering_20_Symbols" loext:num-list-format="%6%" style:num-format="1" text:start-value="6">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="7.0874in" fo:text-indent="-1.1811in" fo:margin-left="7.0874in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="7" text:style-name="Numbering_20_Symbols" loext:num-list-format="%7%" style:num-format="1" text:start-value="7">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="8.2689in" fo:text-indent="-1.1811in" fo:margin-left="8.2689in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="8" text:style-name="Numbering_20_Symbols" loext:num-list-format="%8%" style:num-format="1" text:start-value="8">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="9.45in" fo:text-indent="-1.1811in" fo:margin-left="9.45in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="9" text:style-name="Numbering_20_Symbols" loext:num-list-format="%9%" style:num-format="1" text:start-value="9">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="10.6311in" fo:text-indent="-1.1811in" fo:margin-left="10.6311in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="10" text:style-name="Numbering_20_Symbols" loext:num-list-format="%10%" style:num-format="1" text:start-value="10">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="11.8126in" fo:text-indent="-1.1811in" fo:margin-left="11.8126in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+  </text:list-style>+  <text:list-style style:name="Numbering_20_4" style:display-name="Numbering 4">+   <text:list-level-style-number text:level="1" text:style-name="Numbering_20_Symbols" loext:num-list-format="%1%." style:num-suffix="." style:num-format="I">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="0.1965in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="2" text:style-name="Numbering_20_Symbols" loext:num-list-format="%2%." style:num-suffix="." style:num-format="I">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="0.3937in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="3" text:style-name="Numbering_20_Symbols" loext:num-list-format="%3%." style:num-suffix="." style:num-format="I">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="0.5902in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="4" text:style-name="Numbering_20_Symbols" loext:num-list-format="%4%." style:num-suffix="." style:num-format="I">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="0.7874in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="5" text:style-name="Numbering_20_Symbols" loext:num-list-format="%5%." style:num-suffix="." style:num-format="I">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="0.9839in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="6" text:style-name="Numbering_20_Symbols" loext:num-list-format="%6%." style:num-suffix="." style:num-format="I">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="1.1811in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="7" text:style-name="Numbering_20_Symbols" loext:num-list-format="%7%." style:num-suffix="." style:num-format="I">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="1.378in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="8" text:style-name="Numbering_20_Symbols" loext:num-list-format="%8%." style:num-suffix="." style:num-format="I">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="1.5752in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="9" text:style-name="Numbering_20_Symbols" loext:num-list-format="%9%." style:num-suffix="." style:num-format="I">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="1.7717in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="10" text:style-name="Numbering_20_Symbols" loext:num-list-format="%10%." style:num-suffix="." style:num-format="I">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="1.9689in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+  </text:list-style>+  <text:list-style style:name="Numbering_20_5" style:display-name="Numbering 5">+   <text:list-level-style-number text:level="1" text:style-name="Numbering_20_Symbols" loext:num-list-format="%1%." style:num-suffix="." style:num-format="1">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.1575in" fo:text-indent="-0.1575in" fo:margin-left="0.1575in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="2" text:style-name="Numbering_20_Symbols" loext:num-list-format="%1%.%2%." style:num-suffix="." style:num-format="1" text:display-levels="2">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.4335in" fo:text-indent="-0.2563in" fo:margin-left="0.4335in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-number text:level="3" text:style-name="Numbering_20_Symbols" loext:num-list-format="%3%)" style:num-suffix=")" style:num-format="a">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.6102in" fo:text-indent="-0.1772in" fo:margin-left="0.6102in"/>+    </style:list-level-properties>+   </text:list-level-style-number>+   <text:list-level-style-bullet text:level="4" text:style-name="Numbering_20_Symbols" loext:num-list-format="%4%" text:bullet-char="•">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.7874in" fo:text-indent="-0.1555in" fo:margin-left="0.7874in"/>+    </style:list-level-properties>+    <style:text-properties style:font-name="OpenSymbol"/>+   </text:list-level-style-bullet>+   <text:list-level-style-bullet text:level="5" text:style-name="Numbering_20_Symbols" loext:num-list-format="%5%" text:bullet-char="•">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.9429in" fo:text-indent="-0.1555in" fo:margin-left="0.9429in"/>+    </style:list-level-properties>+    <style:text-properties style:font-name="OpenSymbol"/>+   </text:list-level-style-bullet>+   <text:list-level-style-bullet text:level="6" text:style-name="Numbering_20_Symbols" loext:num-list-format="%6%" text:bullet-char="•">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.0984in" fo:text-indent="-0.1555in" fo:margin-left="1.0984in"/>+    </style:list-level-properties>+    <style:text-properties style:font-name="OpenSymbol"/>+   </text:list-level-style-bullet>+   <text:list-level-style-bullet text:level="7" text:style-name="Numbering_20_Symbols" loext:num-list-format="%7%" text:bullet-char="•">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.2543in" fo:text-indent="-0.1555in" fo:margin-left="1.2543in"/>+    </style:list-level-properties>+    <style:text-properties style:font-name="OpenSymbol"/>+   </text:list-level-style-bullet>+   <text:list-level-style-bullet text:level="8" text:style-name="Numbering_20_Symbols" loext:num-list-format="%8%" text:bullet-char="•">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.4098in" fo:text-indent="-0.1555in" fo:margin-left="1.4098in"/>+    </style:list-level-properties>+    <style:text-properties style:font-name="OpenSymbol"/>+   </text:list-level-style-bullet>+   <text:list-level-style-bullet text:level="9" text:style-name="Numbering_20_Symbols" loext:num-list-format="%9%" text:bullet-char="•">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.5654in" fo:text-indent="-0.1555in" fo:margin-left="1.5654in"/>+    </style:list-level-properties>+    <style:text-properties style:font-name="OpenSymbol"/>+   </text:list-level-style-bullet>+   <text:list-level-style-bullet text:level="10" text:style-name="Numbering_20_Symbols" loext:num-list-format="%10%" text:bullet-char="•">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.7209in" fo:text-indent="-0.1555in" fo:margin-left="1.7209in"/>+    </style:list-level-properties>+    <style:text-properties style:font-name="OpenSymbol"/>+   </text:list-level-style-bullet>+  </text:list-style>+  <text:notes-configuration text:note-class="footnote" text:citation-style-name="Footnote_20_Symbol" text:citation-body-style-name="Footnote_20_anchor" style:num-format="1" text:start-value="0" text:footnotes-position="page" text:start-numbering-at="document"/>+  <text:notes-configuration text:note-class="endnote" text:citation-style-name="Endnote_20_Symbol" text:citation-body-style-name="Endnote_20_anchor" text:master-page-name="Endnote" style:num-format="i" text:start-value="0"/>+  <text:bibliography-configuration text:prefix="[" text:suffix="]" text:sort-algorithm="alphanumeric" fo:language="en" fo:country="US"/>+  <text:linenumbering-configuration text:number-lines="false" text:offset="0.1965in" style:num-format="1" text:number-position="left" text:increment="5"/>+  <loext:theme loext:name="Office">+   <loext:theme-colors loext:name="LibreOffice">+    <loext:color loext:name="dark1" loext:color="#000000"/>+    <loext:color loext:name="light1" loext:color="#ffffff"/>+    <loext:color loext:name="dark2" loext:color="#000000"/>+    <loext:color loext:name="light2" loext:color="#ffffff"/>+    <loext:color loext:name="accent1" loext:color="#18a303"/>+    <loext:color loext:name="accent2" loext:color="#0369a3"/>+    <loext:color loext:name="accent3" loext:color="#a33e03"/>+    <loext:color loext:name="accent4" loext:color="#8e03a3"/>+    <loext:color loext:name="accent5" loext:color="#c99c00"/>+    <loext:color loext:name="accent6" loext:color="#c9211e"/>+    <loext:color loext:name="hyperlink" loext:color="#0000ee"/>+    <loext:color loext:name="followed-hyperlink" loext:color="#551a8b"/>+   </loext:theme-colors>+  </loext:theme>+ </office:styles>+ <office:automatic-styles>+  <style:style style:name="fr1" style:family="graphic" style:parent-style-name="Graphics">+   <style:graphic-properties style:horizontal-pos="center" style:horizontal-rel="paragraph" style:mirror="none" fo:clip="rect(0in, 0in, 0in, 0in)" draw:luminance="0%" draw:contrast="0%" draw:red="0%" draw:green="0%" draw:blue="0%" draw:gamma="100%" draw:color-inversion="false" draw:image-opacity="100%" draw:color-mode="standard"/>+  </style:style>+  <style:page-layout style:name="pm1">+   <style:page-layout-properties fo:page-width="8.2681in" fo:page-height="11.6929in" style:num-format="1" style:print-orientation="portrait" fo:margin-top="0.7874in" fo:margin-bottom="0.7874in" fo:margin-left="0.7874in" fo:margin-right="0.7874in" style:writing-mode="lr-tb" style:layout-grid-color="#c0c0c0" style:layout-grid-lines="20" style:layout-grid-base-height="0.278in" style:layout-grid-ruby-height="0.139in" style:layout-grid-mode="none" style:layout-grid-ruby-below="false" style:layout-grid-print="false" style:layout-grid-display="false" style:footnote-max-height="0in" loext:margin-gutter="0in">+    <style:footnote-sep style:width="0.0071in" style:distance-before-sep="0.0398in" style:distance-after-sep="0.0398in" style:line-style="solid" style:adjustment="left" style:rel-width="25%" style:color="#000000"/>+   </style:page-layout-properties>+   <style:header-style/>+   <style:footer-style/>+  </style:page-layout>+  <style:page-layout style:name="pm2">+   <style:page-layout-properties fo:page-width="8.2681in" fo:page-height="11.6929in" style:num-format="1" style:print-orientation="portrait" fo:margin-top="0.7874in" fo:margin-bottom="0.7874in" fo:margin-left="0.7874in" fo:margin-right="0.7874in" style:writing-mode="lr-tb" style:layout-grid-color="#c0c0c0" style:layout-grid-lines="20" style:layout-grid-base-height="0.278in" style:layout-grid-ruby-height="0.139in" style:layout-grid-mode="none" style:layout-grid-ruby-below="false" style:layout-grid-print="false" style:layout-grid-display="false" style:footnote-max-height="0in" loext:margin-gutter="0in">+    <style:footnote-sep style:line-style="solid" style:adjustment="left" style:rel-width="25%" style:color="#000000"/>+   </style:page-layout-properties>+   <style:header-style/>+   <style:footer-style/>+  </style:page-layout>+  <style:style style:name="dp1" style:family="drawing-page">+   <style:drawing-page-properties draw:background-size="full"/>+  </style:style>+ </office:automatic-styles>+ <office:body>+  <office:text>+   <text:variable-decls>+    <text:variable-decl office:value-type="float" text:name="a"/>+    <text:variable-decl office:value-type="float" text:name="b"/>+   </text:variable-decls>+   <text:sequence-decls>+    <text:sequence-decl text:display-outline-level="0" text:name="Illustration"/>+    <text:sequence-decl text:display-outline-level="0" text:name="Table"/>+    <text:sequence-decl text:display-outline-level="0" text:name="Text"/>+    <text:sequence-decl text:display-outline-level="0" text:name="Drawing"/>+    <text:sequence-decl text:display-outline-level="0" text:name="Figure"/>+   </text:sequence-decls>+   <text:p text:style-name="Standard"><draw:frame draw:style-name="fr1" draw:name="Grafik1" text:anchor-type="paragraph" svg:width="2.0835in" svg:height="2.0835in" draw:z-index="0"><draw:image draw:mime-type="image/jpeg">+      <office:binary-data>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       gYoGYJ3nk9qBUAYHAoP/2Q==+      </office:binary-data>+     </draw:image>+    </draw:frame></text:p>+  </office:text>+ </office:body>+</office:document>
+ test/odt/fodt/preformattedText.fodt view
@@ -0,0 +1,152 @@+<?xml version="1.0" encoding="UTF-8"?>++<office:document xmlns:css3t="http://www.w3.org/TR/css3-text/" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:rpt="http://openoffice.org/2005/report" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" office:version="1.3" office:mimetype="application/vnd.oasis.opendocument.text">+ <office:meta><meta:creation-date>2026-02-15T01:39:34.300934683</meta:creation-date><dc:date>2026-02-15T01:40:03.737721904</dc:date><meta:editing-duration>PT29S</meta:editing-duration><meta:editing-cycles>1</meta:editing-cycles><meta:generator>LibreOffice/24.8.7.2$Linux_AARCH64 LibreOffice_project/480$Build-2</meta:generator><meta:document-statistic meta:table-count="0" meta:image-count="0" meta:object-count="0" meta:page-count="1" meta:paragraph-count="3" meta:word-count="6" meta:character-count="40" meta:non-whitespace-character-count="33"/></office:meta>+ <office:font-face-decls>+  <style:font-face style:name="Liberation Mono" svg:font-family="&apos;Liberation Mono&apos;" style:font-family-generic="modern" style:font-pitch="fixed"/>+  <style:font-face style:name="Liberation Sans" svg:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="swiss" style:font-pitch="variable"/>+  <style:font-face style:name="Liberation Serif" svg:font-family="&apos;Liberation Serif&apos;" style:font-family-generic="roman" style:font-pitch="variable"/>+  <style:font-face style:name="Noto Sans" svg:font-family="&apos;Noto Sans&apos;" style:font-family-generic="swiss"/>+  <style:font-face style:name="Noto Sans SC Thin" svg:font-family="&apos;Noto Sans SC Thin&apos;" style:font-family-generic="system" style:font-pitch="variable"/>+  <style:font-face style:name="Noto Sans1" svg:font-family="&apos;Noto Sans&apos;" style:font-family-generic="system" style:font-pitch="variable"/>+ </office:font-face-decls>+ <office:styles>+  <style:default-style style:family="graphic">+   <style:graphic-properties svg:stroke-color="#3465a4" draw:fill-color="#729fcf" fo:wrap-option="no-wrap" draw:shadow-offset-x="0.1181in" draw:shadow-offset-y="0.1181in" draw:start-line-spacing-horizontal="0.1114in" draw:start-line-spacing-vertical="0.1114in" draw:end-line-spacing-horizontal="0.1114in" draw:end-line-spacing-vertical="0.1114in" style:writing-mode="lr-tb" style:flow-with-text="false"/>+   <style:paragraph-properties style:text-autospace="ideograph-alpha" style:line-break="strict" loext:tab-stop-distance="0in" style:font-independent-line-spacing="false">+    <style:tab-stops/>+   </style:paragraph-properties>+   <style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Liberation Serif" fo:font-size="12pt" fo:language="en" fo:country="GB" style:letter-kerning="true" style:font-name-asian="Noto Sans SC Thin" style:font-size-asian="10.5pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Noto Sans1" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN"/>+  </style:default-style>+  <style:default-style style:family="paragraph">+   <style:paragraph-properties fo:orphans="2" fo:widows="2" fo:hyphenation-ladder-count="no-limit" fo:hyphenation-keep="auto" loext:hyphenation-keep-type="column" style:text-autospace="ideograph-alpha" style:punctuation-wrap="hanging" style:line-break="strict" style:tab-stop-distance="0.4925in" style:writing-mode="page"/>+   <style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Liberation Serif" fo:font-size="12pt" fo:language="en" fo:country="GB" style:letter-kerning="true" style:font-name-asian="Noto Sans SC Thin" style:font-size-asian="10.5pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Noto Sans1" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN" fo:hyphenate="false" fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2" loext:hyphenation-no-caps="false" loext:hyphenation-no-last-word="false" loext:hyphenation-word-char-count="5" loext:hyphenation-zone="no-limit"/>+  </style:default-style>+  <style:default-style style:family="table">+   <style:table-properties table:border-model="collapsing"/>+  </style:default-style>+  <style:default-style style:family="table-row">+   <style:table-row-properties fo:keep-together="auto"/>+  </style:default-style>+  <style:style style:name="Standard" style:family="paragraph" style:class="text"/>+  <style:style style:name="Heading" style:family="paragraph" style:parent-style-name="Standard" style:next-style-name="Text_20_body" style:class="text">+   <style:paragraph-properties fo:margin-top="0.1665in" fo:margin-bottom="0.0835in" style:contextual-spacing="false" fo:keep-with-next="always"/>+   <style:text-properties style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="14pt" style:font-name-asian="Noto Sans SC Thin" style:font-family-asian="&apos;Noto Sans SC Thin&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="14pt" style:font-name-complex="Noto Sans1" style:font-family-complex="&apos;Noto Sans&apos;" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="14pt"/>+  </style:style>+  <style:style style:name="Text_20_body" style:display-name="Text body" style:family="paragraph" style:parent-style-name="Standard" style:class="text">+   <style:paragraph-properties fo:margin-top="0in" fo:margin-bottom="0.0972in" style:contextual-spacing="false" fo:line-height="115%"/>+  </style:style>+  <style:style style:name="List" style:family="paragraph" style:parent-style-name="Text_20_body" style:class="list">+   <style:text-properties style:font-size-asian="12pt" style:font-name-complex="Noto Sans" style:font-family-complex="&apos;Noto Sans&apos;" style:font-family-generic-complex="swiss"/>+  </style:style>+  <style:style style:name="Caption" style:family="paragraph" style:parent-style-name="Standard" style:class="extra">+   <style:paragraph-properties fo:margin-top="0.0835in" fo:margin-bottom="0.0835in" style:contextual-spacing="false" text:number-lines="false" text:line-number="0"/>+   <style:text-properties fo:font-size="12pt" fo:font-style="italic" style:font-size-asian="12pt" style:font-style-asian="italic" style:font-name-complex="Noto Sans" style:font-family-complex="&apos;Noto Sans&apos;" style:font-family-generic-complex="swiss" style:font-size-complex="12pt" style:font-style-complex="italic"/>+  </style:style>+  <style:style style:name="Index" style:family="paragraph" style:parent-style-name="Standard" style:class="index">+   <style:paragraph-properties text:number-lines="false" text:line-number="0"/>+   <style:text-properties style:font-size-asian="12pt" style:font-name-complex="Noto Sans" style:font-family-complex="&apos;Noto Sans&apos;" style:font-family-generic-complex="swiss"/>+  </style:style>+  <style:style style:name="Preformatted_20_Text" style:display-name="Preformatted Text" style:family="paragraph" style:parent-style-name="Standard" style:class="html">+   <style:paragraph-properties fo:margin-top="0in" fo:margin-bottom="0in" style:contextual-spacing="false"/>+   <style:text-properties style:font-name="Liberation Mono" fo:font-family="&apos;Liberation Mono&apos;" style:font-family-generic="modern" style:font-pitch="fixed" fo:font-size="10pt" style:font-name-asian="Liberation Mono" style:font-family-asian="&apos;Liberation Mono&apos;" style:font-family-generic-asian="modern" style:font-pitch-asian="fixed" style:font-size-asian="10pt" style:font-name-complex="Liberation Mono" style:font-family-complex="&apos;Liberation Mono&apos;" style:font-family-generic-complex="modern" style:font-pitch-complex="fixed" style:font-size-complex="10pt"/>+  </style:style>+  <text:outline-style style:name="Outline">+   <text:outline-level-style text:level="1" loext:num-list-format="%1%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab"/>+    </style:list-level-properties>+   </text:outline-level-style>+   <text:outline-level-style text:level="2" loext:num-list-format="%2%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab"/>+    </style:list-level-properties>+   </text:outline-level-style>+   <text:outline-level-style text:level="3" loext:num-list-format="%3%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab"/>+    </style:list-level-properties>+   </text:outline-level-style>+   <text:outline-level-style text:level="4" loext:num-list-format="%4%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab"/>+    </style:list-level-properties>+   </text:outline-level-style>+   <text:outline-level-style text:level="5" loext:num-list-format="%5%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab"/>+    </style:list-level-properties>+   </text:outline-level-style>+   <text:outline-level-style text:level="6" loext:num-list-format="%6%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab"/>+    </style:list-level-properties>+   </text:outline-level-style>+   <text:outline-level-style text:level="7" loext:num-list-format="%7%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab"/>+    </style:list-level-properties>+   </text:outline-level-style>+   <text:outline-level-style text:level="8" loext:num-list-format="%8%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab"/>+    </style:list-level-properties>+   </text:outline-level-style>+   <text:outline-level-style text:level="9" loext:num-list-format="%9%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab"/>+    </style:list-level-properties>+   </text:outline-level-style>+   <text:outline-level-style text:level="10" loext:num-list-format="%10%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab"/>+    </style:list-level-properties>+   </text:outline-level-style>+  </text:outline-style>+  <text:notes-configuration text:note-class="footnote" style:num-format="1" text:start-value="0" text:footnotes-position="page" text:start-numbering-at="document"/>+  <text:notes-configuration text:note-class="endnote" style:num-format="i" text:start-value="0"/>+  <text:linenumbering-configuration text:number-lines="false" text:offset="0.1965in" style:num-format="1" text:number-position="left" text:increment="5"/>+  <loext:theme loext:name="Office">+   <loext:theme-colors loext:name="LibreOffice">+    <loext:color loext:name="dark1" loext:color="#000000"/>+    <loext:color loext:name="light1" loext:color="#ffffff"/>+    <loext:color loext:name="dark2" loext:color="#000000"/>+    <loext:color loext:name="light2" loext:color="#ffffff"/>+    <loext:color loext:name="accent1" loext:color="#18a303"/>+    <loext:color loext:name="accent2" loext:color="#0369a3"/>+    <loext:color loext:name="accent3" loext:color="#a33e03"/>+    <loext:color loext:name="accent4" loext:color="#8e03a3"/>+    <loext:color loext:name="accent5" loext:color="#c99c00"/>+    <loext:color loext:name="accent6" loext:color="#c9211e"/>+    <loext:color loext:name="hyperlink" loext:color="#0000ee"/>+    <loext:color loext:name="followed-hyperlink" loext:color="#551a8b"/>+   </loext:theme-colors>+  </loext:theme>+ </office:styles>+ <office:automatic-styles>+  <style:page-layout style:name="pm1">+   <style:page-layout-properties fo:page-width="8.2681in" fo:page-height="11.6929in" style:num-format="1" style:print-orientation="portrait" fo:margin-top="0.7874in" fo:margin-bottom="0.7874in" fo:margin-left="0.7874in" fo:margin-right="0.7874in" style:writing-mode="lr-tb" style:layout-grid-color="#c0c0c0" style:layout-grid-lines="20" style:layout-grid-base-height="0.278in" style:layout-grid-ruby-height="0.139in" style:layout-grid-mode="none" style:layout-grid-ruby-below="false" style:layout-grid-print="false" style:layout-grid-display="false" style:footnote-max-height="0in" loext:margin-gutter="0in">+    <style:footnote-sep style:width="0.0071in" style:distance-before-sep="0.0398in" style:distance-after-sep="0.0398in" style:line-style="solid" style:adjustment="left" style:rel-width="25%" style:color="#000000"/>+   </style:page-layout-properties>+   <style:header-style/>+   <style:footer-style/>+  </style:page-layout>+  <style:style style:name="dp1" style:family="drawing-page">+   <style:drawing-page-properties draw:background-size="full"/>+  </style:style>+ </office:automatic-styles>+ <office:body>+  <office:text>+   <text:sequence-decls>+    <text:sequence-decl text:display-outline-level="0" text:name="Illustration"/>+    <text:sequence-decl text:display-outline-level="0" text:name="Table"/>+    <text:sequence-decl text:display-outline-level="0" text:name="Text"/>+    <text:sequence-decl text:display-outline-level="0" text:name="Drawing"/>+    <text:sequence-decl text:display-outline-level="0" text:name="Figure"/>+   </text:sequence-decls>+   <text:p text:style-name="Preformatted_20_Text">void main() {</text:p>+   <text:p text:style-name="Preformatted_20_Text"><text:s text:c="4"/>printf(&quot;Hello world&quot;);</text:p>+   <text:p text:style-name="Preformatted_20_Text">}</text:p>+  </office:text>+ </office:body>+</office:document>
+ test/odt/fodt/textMixedStyles.fodt view
@@ -0,0 +1,224 @@+<?xml version="1.0" encoding="UTF-8"?>++<office:document xmlns:css3t="http://www.w3.org/TR/css3-text/" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:rpt="http://openoffice.org/2005/report" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" office:version="1.3" office:mimetype="application/vnd.oasis.opendocument.text">+ <office:meta><meta:creation-date>2016-10-20T14:33:00.091715893</meta:creation-date><dc:date>2016-12-13T11:16:41.168160323</dc:date><meta:editing-duration>PT1H59M24S</meta:editing-duration><meta:editing-cycles>10</meta:editing-cycles><meta:generator>LibreOffice/24.8.7.2$Linux_AARCH64 LibreOffice_project/480$Build-2</meta:generator><meta:document-statistic meta:table-count="0" meta:image-count="0" meta:object-count="0" meta:page-count="1" meta:paragraph-count="3" meta:word-count="27" meta:character-count="139" meta:non-whitespace-character-count="114"/></office:meta>+ <office:font-face-decls>+  <style:font-face style:name="Droid Sans Fallback" svg:font-family="&apos;Droid Sans Fallback&apos;" style:font-family-generic="system" style:font-pitch="variable"/>+  <style:font-face style:name="FreeSans" svg:font-family="FreeSans" style:font-family-generic="swiss"/>+  <style:font-face style:name="FreeSans1" svg:font-family="FreeSans" style:font-family-generic="system" style:font-pitch="variable"/>+  <style:font-face style:name="Liberation Sans" svg:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="swiss" style:font-pitch="variable"/>+  <style:font-face style:name="Liberation Serif" svg:font-family="&apos;Liberation Serif&apos;" style:font-family-generic="roman" style:font-pitch="variable"/>+ </office:font-face-decls>+ <office:styles>+  <style:default-style style:family="graphic">+   <style:graphic-properties svg:stroke-color="#3465a4" draw:fill-color="#729fcf" fo:wrap-option="no-wrap" draw:shadow-offset-x="0.1181in" draw:shadow-offset-y="0.1181in" draw:start-line-spacing-horizontal="0.1114in" draw:start-line-spacing-vertical="0.1114in" draw:end-line-spacing-horizontal="0.1114in" draw:end-line-spacing-vertical="0.1114in" style:writing-mode="lr-tb" style:flow-with-text="false"/>+   <style:paragraph-properties style:text-autospace="ideograph-alpha" style:line-break="strict" loext:tab-stop-distance="0in" style:font-independent-line-spacing="false">+    <style:tab-stops/>+   </style:paragraph-properties>+   <style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Liberation Serif" fo:font-size="12pt" fo:language="en" fo:country="US" style:letter-kerning="true" style:font-name-asian="Droid Sans Fallback" style:font-size-asian="10.5pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="FreeSans1" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN"/>+  </style:default-style>+  <style:default-style style:family="paragraph">+   <style:paragraph-properties fo:hyphenation-ladder-count="no-limit" fo:hyphenation-keep="auto" loext:hyphenation-keep-type="column" style:text-autospace="ideograph-alpha" style:punctuation-wrap="hanging" style:line-break="strict" style:tab-stop-distance="0.4925in" style:writing-mode="page"/>+   <style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Liberation Serif" fo:font-size="12pt" fo:language="en" fo:country="US" style:letter-kerning="true" style:font-name-asian="Droid Sans Fallback" style:font-size-asian="10.5pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="FreeSans1" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN" fo:hyphenate="false" fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2" loext:hyphenation-no-caps="false" loext:hyphenation-no-last-word="false" loext:hyphenation-word-char-count="no-limit" loext:hyphenation-zone="no-limit"/>+  </style:default-style>+  <style:default-style style:family="table">+   <style:table-properties table:border-model="collapsing"/>+  </style:default-style>+  <style:default-style style:family="table-row">+   <style:table-row-properties fo:keep-together="auto"/>+  </style:default-style>+  <style:style style:name="Standard" style:family="paragraph" style:class="text"/>+  <style:style style:name="Heading" style:family="paragraph" style:parent-style-name="Standard" style:next-style-name="Text_20_body" style:class="text">+   <style:paragraph-properties fo:margin-top="0.1665in" fo:margin-bottom="0.0835in" style:contextual-spacing="false" fo:keep-with-next="always"/>+   <style:text-properties style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="14pt" style:font-name-asian="Droid Sans Fallback" style:font-family-asian="&apos;Droid Sans Fallback&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="14pt" style:font-name-complex="FreeSans1" style:font-family-complex="FreeSans" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="14pt"/>+  </style:style>+  <style:style style:name="Text_20_body" style:display-name="Text body" style:family="paragraph" style:parent-style-name="Standard" style:class="text">+   <style:paragraph-properties fo:margin-top="0in" fo:margin-bottom="0.0972in" style:contextual-spacing="false" fo:line-height="120%"/>+  </style:style>+  <style:style style:name="List" style:family="paragraph" style:parent-style-name="Text_20_body" style:class="list">+   <style:text-properties style:font-size-asian="12pt" style:font-name-complex="FreeSans" style:font-family-complex="FreeSans" style:font-family-generic-complex="swiss"/>+  </style:style>+  <style:style style:name="Caption" style:family="paragraph" style:parent-style-name="Standard" style:class="extra">+   <style:paragraph-properties fo:margin-top="0.0835in" fo:margin-bottom="0.0835in" style:contextual-spacing="false" text:number-lines="false" text:line-number="0"/>+   <style:text-properties fo:font-size="12pt" fo:font-style="italic" style:font-size-asian="12pt" style:font-style-asian="italic" style:font-name-complex="FreeSans" style:font-family-complex="FreeSans" style:font-family-generic-complex="swiss" style:font-size-complex="12pt" style:font-style-complex="italic"/>+  </style:style>+  <style:style style:name="Index" style:family="paragraph" style:parent-style-name="Standard" style:class="index">+   <style:paragraph-properties text:number-lines="false" text:line-number="0"/>+   <style:text-properties style:font-size-asian="12pt" style:font-name-complex="FreeSans" style:font-family-complex="FreeSans" style:font-family-generic-complex="swiss"/>+  </style:style>+  <style:style style:name="Quotations" style:family="paragraph" style:parent-style-name="Standard" style:class="html">+   <style:paragraph-properties fo:margin-left="0.3937in" fo:margin-right="0.3937in" fo:margin-top="0in" fo:margin-bottom="0.1965in" style:contextual-spacing="false" fo:text-indent="0in" style:auto-text-indent="false"/>+  </style:style>+  <style:style style:name="Title" style:family="paragraph" style:parent-style-name="Heading" style:next-style-name="Text_20_body" style:class="chapter">+   <style:paragraph-properties fo:text-align="center" style:justify-single-word="false"/>+   <style:text-properties fo:font-size="28pt" fo:font-weight="bold" style:font-size-asian="28pt" style:font-weight-asian="bold" style:font-size-complex="28pt" style:font-weight-complex="bold"/>+  </style:style>+  <style:style style:name="Subtitle" style:family="paragraph" style:parent-style-name="Heading" style:next-style-name="Text_20_body" style:class="chapter">+   <style:paragraph-properties fo:margin-top="0.0417in" fo:margin-bottom="0.0835in" style:contextual-spacing="false" fo:text-align="center" style:justify-single-word="false"/>+   <style:text-properties fo:font-size="18pt" style:font-size-asian="18pt" style:font-size-complex="18pt"/>+  </style:style>+  <style:style style:name="Heading_20_1" style:display-name="Heading 1" style:family="paragraph" style:parent-style-name="Heading" style:next-style-name="Text_20_body" style:default-outline-level="1" style:class="text">+   <style:paragraph-properties fo:margin-top="0.1665in" fo:margin-bottom="0.0835in" style:contextual-spacing="false"/>+   <style:text-properties fo:font-size="130%" fo:font-weight="bold" style:font-size-asian="130%" style:font-weight-asian="bold" style:font-size-complex="130%" style:font-weight-complex="bold"/>+  </style:style>+  <style:style style:name="Heading_20_2" style:display-name="Heading 2" style:family="paragraph" style:parent-style-name="Heading" style:next-style-name="Text_20_body" style:default-outline-level="2" style:class="text">+   <style:paragraph-properties fo:margin-top="0.139in" fo:margin-bottom="0.0835in" style:contextual-spacing="false"/>+   <style:text-properties fo:font-size="115%" fo:font-weight="bold" style:font-size-asian="115%" style:font-weight-asian="bold" style:font-size-complex="115%" style:font-weight-complex="bold"/>+  </style:style>+  <style:style style:name="Heading_20_3" style:display-name="Heading 3" style:family="paragraph" style:parent-style-name="Heading" style:next-style-name="Text_20_body" style:default-outline-level="3" style:class="text">+   <style:paragraph-properties fo:margin-top="0.0972in" fo:margin-bottom="0.0835in" style:contextual-spacing="false"/>+   <style:text-properties fo:font-size="101%" fo:font-weight="bold" style:font-size-asian="101%" style:font-weight-asian="bold" style:font-size-complex="101%" style:font-weight-complex="bold"/>+  </style:style>+  <style:style style:name="Internet_20_link" style:display-name="Internet link" style:family="text">+   <style:text-properties fo:color="#000080" loext:opacity="100%" fo:language="zxx" fo:country="none" style:text-underline-style="solid" style:text-underline-width="auto" style:text-underline-color="font-color" style:language-asian="zxx" style:country-asian="none" style:language-complex="zxx" style:country-complex="none"/>+  </style:style>+  <style:style style:name="Visited_20_Internet_20_Link" style:display-name="Visited Internet Link" style:family="text">+   <style:text-properties fo:color="#800000" loext:opacity="100%" fo:language="zxx" fo:country="none" style:text-underline-style="solid" style:text-underline-width="auto" style:text-underline-color="font-color" style:language-asian="zxx" style:country-asian="none" style:language-complex="zxx" style:country-complex="none"/>+  </style:style>+  <style:style style:name="Graphics" style:family="graphic">+   <style:graphic-properties text:anchor-type="paragraph" svg:x="0in" svg:y="0in" style:wrap="dynamic" style:number-wrapped-paragraphs="no-limit" style:wrap-contour="false" style:vertical-pos="top" style:vertical-rel="paragraph" style:horizontal-pos="center" style:horizontal-rel="paragraph" draw:fill="none"/>+  </style:style>+  <text:outline-style style:name="Outline">+   <text:outline-level-style text:level="1" loext:num-list-format="%1%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.3in" fo:text-indent="-0.3in" fo:margin-left="0.3in"/>+    </style:list-level-properties>+   </text:outline-level-style>+   <text:outline-level-style text:level="2" loext:num-list-format="%2%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.4in" fo:text-indent="-0.4in" fo:margin-left="0.4in"/>+    </style:list-level-properties>+   </text:outline-level-style>+   <text:outline-level-style text:level="3" loext:num-list-format="%3%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.5in" fo:text-indent="-0.5in" fo:margin-left="0.5in"/>+    </style:list-level-properties>+   </text:outline-level-style>+   <text:outline-level-style text:level="4" loext:num-list-format="%4%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.6in" fo:text-indent="-0.6in" fo:margin-left="0.6in"/>+    </style:list-level-properties>+   </text:outline-level-style>+   <text:outline-level-style text:level="5" loext:num-list-format="%5%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.7in" fo:text-indent="-0.7in" fo:margin-left="0.7in"/>+    </style:list-level-properties>+   </text:outline-level-style>+   <text:outline-level-style text:level="6" loext:num-list-format="%6%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.8in" fo:text-indent="-0.8in" fo:margin-left="0.8in"/>+    </style:list-level-properties>+   </text:outline-level-style>+   <text:outline-level-style text:level="7" loext:num-list-format="%7%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.9in" fo:text-indent="-0.9in" fo:margin-left="0.9in"/>+    </style:list-level-properties>+   </text:outline-level-style>+   <text:outline-level-style text:level="8" loext:num-list-format="%8%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1in" fo:text-indent="-1in" fo:margin-left="1in"/>+    </style:list-level-properties>+   </text:outline-level-style>+   <text:outline-level-style text:level="9" loext:num-list-format="%9%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.1in" fo:text-indent="-1.1in" fo:margin-left="1.1in"/>+    </style:list-level-properties>+   </text:outline-level-style>+   <text:outline-level-style text:level="10" loext:num-list-format="%10%" style:num-format="">+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.2in" fo:text-indent="-1.2in" fo:margin-left="1.2in"/>+    </style:list-level-properties>+   </text:outline-level-style>+  </text:outline-style>+  <text:notes-configuration text:note-class="footnote" style:num-format="1" text:start-value="0" text:footnotes-position="page" text:start-numbering-at="document"/>+  <text:notes-configuration text:note-class="endnote" style:num-format="i" text:start-value="0"/>+  <text:linenumbering-configuration text:number-lines="false" text:offset="0.1965in" style:num-format="1" text:number-position="left" text:increment="5"/>+  <loext:theme loext:name="Office">+   <loext:theme-colors loext:name="LibreOffice">+    <loext:color loext:name="dark1" loext:color="#000000"/>+    <loext:color loext:name="light1" loext:color="#ffffff"/>+    <loext:color loext:name="dark2" loext:color="#000000"/>+    <loext:color loext:name="light2" loext:color="#ffffff"/>+    <loext:color loext:name="accent1" loext:color="#18a303"/>+    <loext:color loext:name="accent2" loext:color="#0369a3"/>+    <loext:color loext:name="accent3" loext:color="#a33e03"/>+    <loext:color loext:name="accent4" loext:color="#8e03a3"/>+    <loext:color loext:name="accent5" loext:color="#c99c00"/>+    <loext:color loext:name="accent6" loext:color="#c9211e"/>+    <loext:color loext:name="hyperlink" loext:color="#0000ee"/>+    <loext:color loext:name="followed-hyperlink" loext:color="#551a8b"/>+   </loext:theme-colors>+  </loext:theme>+ </office:styles>+ <office:automatic-styles>+  <style:style style:name="P1" style:family="paragraph" style:parent-style-name="Standard">+   <style:paragraph-properties fo:line-height="115%" fo:break-before="auto" fo:break-after="auto" style:writing-mode="lr-tb"/>+   <style:text-properties officeooo:rsid="0014be9a" officeooo:paragraph-rsid="0016b660"/>+  </style:style>+  <style:style style:name="P2" style:family="paragraph" style:parent-style-name="Standard">+   <style:paragraph-properties fo:line-height="115%" style:writing-mode="lr-tb"/>+   <style:text-properties officeooo:rsid="0014be9a" officeooo:paragraph-rsid="0016b660"/>+  </style:style>+  <style:style style:name="P3" style:family="paragraph" style:parent-style-name="Standard">+   <style:paragraph-properties fo:line-height="115%" fo:break-before="auto" fo:break-after="auto" style:writing-mode="lr-tb"/>+   <style:text-properties officeooo:paragraph-rsid="0016b660"/>+  </style:style>+  <style:style style:name="P4" style:family="paragraph" style:parent-style-name="Standard">+   <style:paragraph-properties fo:line-height="115%" style:writing-mode="lr-tb"/>+   <style:text-properties style:text-underline-style="none" officeooo:rsid="0017c72f" officeooo:paragraph-rsid="0017c72f"/>+  </style:style>+  <style:style style:name="T1" style:family="text">+   <style:text-properties fo:font-style="italic" style:font-style-asian="italic" style:font-style-complex="italic"/>+  </style:style>+  <style:style style:name="T2" style:family="text">+   <style:text-properties fo:font-style="normal" fo:font-weight="bold" style:font-style-asian="normal" style:font-weight-asian="bold" style:font-style-complex="normal" style:font-weight-complex="bold"/>+  </style:style>+  <style:style style:name="T3" style:family="text">+   <style:text-properties fo:font-style="normal" style:text-underline-style="solid" style:text-underline-width="auto" style:text-underline-color="font-color" fo:font-weight="normal" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-style-complex="normal" style:font-weight-complex="normal"/>+  </style:style>+  <style:style style:name="T4" style:family="text">+   <style:text-properties fo:font-style="normal" style:text-underline-style="none" fo:font-weight="normal" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-style-complex="normal" style:font-weight-complex="normal"/>+  </style:style>+  <style:style style:name="T5" style:family="text">+   <style:text-properties fo:font-style="italic" style:text-underline-style="none" fo:font-weight="bold" style:font-style-asian="italic" style:font-weight-asian="bold" style:font-style-complex="italic" style:font-weight-complex="bold"/>+  </style:style>+  <style:style style:name="T6" style:family="text">+   <style:text-properties fo:font-style="normal" style:text-underline-style="solid" style:text-underline-width="auto" style:text-underline-color="font-color" fo:font-weight="bold" style:font-style-asian="normal" style:font-weight-asian="bold" style:font-style-complex="normal" style:font-weight-complex="bold"/>+  </style:style>+  <style:style style:name="T7" style:family="text">+   <style:text-properties style:text-line-through-style="solid" style:text-line-through-type="single" fo:font-style="normal" style:text-underline-style="none" fo:font-weight="bold" style:font-style-asian="normal" style:font-weight-asian="bold" style:font-style-complex="normal" style:font-weight-complex="bold"/>+  </style:style>+  <style:style style:name="T8" style:family="text">+   <style:text-properties style:text-position="0% 100%"/>+  </style:style>+  <style:style style:name="T9" style:family="text">+   <style:text-properties style:text-position="super 58%" style:text-underline-style="solid" style:text-underline-width="auto" style:text-underline-color="font-color" fo:font-weight="normal" style:font-weight-asian="normal" style:font-weight-complex="normal"/>+  </style:style>+  <style:page-layout style:name="pm1">+   <style:page-layout-properties fo:page-width="8.5in" fo:page-height="11in" style:num-format="1" style:print-orientation="portrait" fo:margin-top="0.7874in" fo:margin-bottom="0.7874in" fo:margin-left="0.7874in" fo:margin-right="0.7874in" style:writing-mode="lr-tb" style:layout-grid-color="#c0c0c0" style:layout-grid-lines="20" style:layout-grid-base-height="0.278in" style:layout-grid-ruby-height="0.139in" style:layout-grid-mode="none" style:layout-grid-ruby-below="false" style:layout-grid-print="false" style:layout-grid-display="false" style:footnote-max-height="0in" loext:margin-gutter="0in">+    <style:footnote-sep style:width="0.0071in" style:distance-before-sep="0.0398in" style:distance-after-sep="0.0398in" style:line-style="solid" style:adjustment="left" style:rel-width="25%" style:color="#000000"/>+   </style:page-layout-properties>+   <style:header-style/>+   <style:footer-style/>+  </style:page-layout>+  <style:style style:name="dp1" style:family="drawing-page">+   <style:drawing-page-properties draw:background-size="full"/>+  </style:style>+ </office:automatic-styles>+ <office:body>+  <office:text>+   <text:sequence-decls>+    <text:sequence-decl text:display-outline-level="0" text:name="Illustration"/>+    <text:sequence-decl text:display-outline-level="0" text:name="Table"/>+    <text:sequence-decl text:display-outline-level="0" text:name="Text"/>+    <text:sequence-decl text:display-outline-level="0" text:name="Drawing"/>+    <text:sequence-decl text:display-outline-level="0" text:name="Figure"/>+   </text:sequence-decls>+   <text:p text:style-name="P1">This is a simple text</text:p>+   <text:p text:style-name="P2"/>+   <text:p text:style-name="P2">that is both <text:span text:style-name="T1">italic </text:span><text:span text:style-name="T2">bold </text:span><text:span text:style-name="T3">underlined </text:span><text:span text:style-name="T4">and the </text:span><text:span text:style-name="T5">first two</text:span><text:span text:style-name="T4"> and the </text:span><text:span text:style-name="T6">last two </text:span><text:span text:style-name="T4"><text:s/>and </text:span><text:span text:style-name="T7">bold and line through</text:span></text:p>+   <text:p text:style-name="P3"/>+   <text:p text:style-name="P4">And wit<text:span text:style-name="T8">h </text:span><text:span text:style-name="T9">superscripts</text:span></text:p>+  </office:text>+ </office:body>+</office:document>
test/odt/native/referenceToChapter.native view
@@ -1,1 +1,1 @@-[Header 1 ("a-chapter",[],[]) [Span ("anchor",[],[]) [],Str "A",Space,Str "chapter"],Para [Str "Some",Space,Str "text."],Header 1 ("another-chapter",[],[]) [Str "Another",Space,Str "chapter"],Para [Str "A",Space,Str "reference",Space,Str "to",Space,Str "."],Para [Str "A",Space,Str "reference",Space,Str "to",Space,Link ("",[],[]) [Str "A",Space,Str "chapter"] ("#anchor",""),Str "."]]+[Header 1 ("a-chapter",[],[]) [Span ("anchor",[],[]) [],Str "A",Space,Str "chapter"],Para [Str "Some",Space,Str "text."],Header 1 ("another-chapter",[],[]) [Str "Another",Space,Str "chapter"],Para [Str "A",Space,Str "reference",Space,Str "to",Space,Str "Another",Space,Str "chapter."],Para [Str "A",Space,Str "reference",Space,Str "to",Space,Link ("",[],[]) [Str "A",Space,Str "chapter"] ("#anchor",""),Str "."]]
test/rtf/unicode.native view
@@ -1,3 +1,7 @@ Pandoc   Meta { unMeta = fromList [] }-  [ Para [ Str "\8220hi\8221\8216hi\8217\61623\945\228" ] ]+  [ Para+      [ Str+          "\8220hi\8221\8216hi\8217\61623\945\228\119867unpaired"+      ]+  ]
test/rtf/unicode.rtf view
@@ -5,5 +5,7 @@ \u-3913? \u945a {\uc2\u228\'E8a}+\uc1\u-10187 ?\u-9157 ?+\u-10187 ?unpaired \par }
test/test-pandoc.hs view
@@ -46,6 +46,7 @@ import qualified Tests.Writers.Ms import qualified Tests.Writers.Muse import qualified Tests.Writers.Native+import qualified Tests.Writers.ODT import qualified Tests.Writers.Org import qualified Tests.Writers.Plain import qualified Tests.Writers.Powerpoint@@ -80,6 +81,7 @@           , testGroup "Plain" Tests.Writers.Plain.tests           , testGroup "AsciiDoc" Tests.Writers.AsciiDoc.tests           , testGroup "Docx" Tests.Writers.Docx.tests+          , testGroup "ODT" Tests.Writers.ODT.tests           , testGroup "RST" Tests.Writers.RST.tests           , testGroup "TEI" Tests.Writers.TEI.tests           , testGroup "markua" Tests.Writers.Markua.tests
test/typst-reader.native view
@@ -187,6 +187,134 @@           ]           (TableFoot ( "" , [] , [] ) [])       ]+  , Table+      ( "" , [] , [] )+      (Caption Nothing [])+      [ ( AlignDefault , ColWidthDefault )+      , ( AlignDefault , ColWidthDefault )+      , ( AlignDefault , ColWidthDefault )+      , ( AlignDefault , ColWidthDefault )+      ]+      (TableHead ( "" , [] , [] ) [])+      [ TableBody+          ( "" , [] , [] )+          (RowHeadColumns 0)+          []+          [ Row+              ( "" , [] , [] )+              [ Cell+                  ( "" , [] , [] )+                  AlignDefault+                  (RowSpan 1)+                  (ColSpan 1)+                  [ Plain [ Str "1" ] ]+              , Cell+                  ( "" , [] , [] )+                  AlignDefault+                  (RowSpan 1)+                  (ColSpan 1)+                  [ Plain+                      [ Str "A"+                      , Space+                      , Str "longer"+                      , Space+                      , Str "descriptive"+                      , Space+                      , Str "label"+                      , Space+                      , Str "that"+                      , Space+                      , Str "wraps"+                      ]+                  ]+              , Cell+                  ( "" , [] , [] )+                  AlignDefault+                  (RowSpan 1)+                  (ColSpan 1)+                  [ Plain [ Str "2" ] ]+              , Cell+                  ( "" , [] , [] )+                  AlignDefault+                  (RowSpan 1)+                  (ColSpan 1)+                  [ Plain+                      [ Str "Another"+                      , Space+                      , Str "longer"+                      , Space+                      , Str "label"+                      ]+                  ]+              ]+          ]+      ]+      (TableFoot ( "" , [] , [] ) [])+  , Table+      ( "" , [] , [] )+      (Caption Nothing [])+      [ ( AlignDefault , ColWidth 0.25 )+      , ( AlignDefault , ColWidth 0.25 )+      , ( AlignDefault , ColWidth 0.5 )+      ]+      (TableHead ( "" , [] , [] ) [])+      [ TableBody+          ( "" , [] , [] )+          (RowHeadColumns 0)+          []+          [ Row+              ( "" , [] , [] )+              [ Cell+                  ( "" , [] , [] )+                  AlignDefault+                  (RowSpan 1)+                  (ColSpan 1)+                  [ Plain [ Str "a" ] ]+              , Cell+                  ( "" , [] , [] )+                  AlignDefault+                  (RowSpan 1)+                  (ColSpan 1)+                  [ Plain [ Str "b" ] ]+              , Cell+                  ( "" , [] , [] )+                  AlignDefault+                  (RowSpan 1)+                  (ColSpan 1)+                  [ Plain [ Str "c" ] ]+              ]+          ]+      ]+      (TableFoot ( "" , [] , [] ) [])+  , Table+      ( "" , [] , [] )+      (Caption Nothing [])+      [ ( AlignDefault , ColWidthDefault )+      , ( AlignDefault , ColWidthDefault )+      ]+      (TableHead ( "" , [] , [] ) [])+      [ TableBody+          ( "" , [] , [] )+          (RowHeadColumns 0)+          []+          [ Row+              ( "" , [] , [] )+              [ Cell+                  ( "" , [] , [] )+                  AlignDefault+                  (RowSpan 1)+                  (ColSpan 1)+                  [ Plain [ Str "d" ] ]+              , Cell+                  ( "" , [] , [] )+                  AlignDefault+                  (RowSpan 1)+                  (ColSpan 1)+                  [ Plain [ Str "e" ] ]+              ]+          ]+      ]+      (TableFoot ( "" , [] , [] ) [])   , Div       ( "" , [ "columns-flow" ] , [ ( "count" , "2" ) ] )       [ Para
test/typst-reader.typ view
@@ -24,6 +24,21 @@   ..nums.map(n => str(fib(n))), )) +#table(+  columns: (auto, 1fr, auto, 1fr),+  [1], [A longer descriptive label that wraps], [2], [Another longer label],+)++#table(+  columns: (1fr, 1fr, 2fr),+  [a], [b], [c],+)++#table(+  columns: (auto, auto),+  [d], [e],+)+ #include "undergradmath.typ"  
test/writer.opendocument view
@@ -12,12 +12,6 @@     <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" />     </style:style>-    <style:style style:name="P2" 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" />-    </style:style>-    <style:style style:name="P3" 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" />-    </style:style>     <text:list-style style:name="Pandoc_5f_Numbering_5f_1">       <text:list-level-style-number text:level="1" text:style-name="Numbering_20_Symbols" style:num-format="1" style:num-prefix="(" style:num-suffix=")">         <style:list-level-properties text:space-before="0.0000in" text:min-label-width="0.1965in" text:min-label-distance="0.1in" />@@ -275,7 +269,7 @@ </text:list> <text:p text:style-name="Quotations">Nested block quotes:</text:p> <text:p text:style-name="P1">nested</text:p>-<text:p text:style-name="P2">nested</text:p>+<text:p text:style-name="P1">nested</text:p> <text:p text:style-name="First_20_paragraph">This should not be a block quote: 2 &gt; 1.</text:p> <text:p text:style-name="Text_20_body">And a following paragraph.</text:p>@@ -620,7 +614,7 @@ crisp, pleasant to taste</text:p> <text:p text:style-name="Definition_20_Term"><text:span text:style-name="Emphasis">orange</text:span></text:p> <text:p text:style-name="Definition_20_Definition">orange-fruit</text:p><text:p text:style-name="Preformatted_20_Text">{ orange code block }</text:p><text:p text:style-name="P3">orange+fruit</text:p><text:p text:style-name="Preformatted_20_Text">{ orange code block }</text:p><text:p text:style-name="P1">orange block quote</text:p> <text:p text:style-name="First_20_paragraph">Multiple definitions, tight:</text:p>
test/writer.typst view
@@ -542,6 +542,7 @@ #block[ #block[ foo+ ] ] #block[@@ -556,6 +557,7 @@  #block[ foo+ ] This should be a code block, though: 
xml-light/Text/Pandoc/XML/Light.hs view
@@ -42,7 +42,6 @@   ) where  import qualified Control.Exception as E-import qualified Text.XML as Conduit import qualified Text.XML.Stream.Parse as P import Data.Conduit (runConduit, (.|)) import qualified Data.Conduit.List as CL@@ -50,7 +49,6 @@ import qualified Data.Text as T import qualified Data.Text.Lazy as TL import qualified Data.Map as M-import Data.Maybe (mapMaybe) import Text.Pandoc.XML.Light.Types import Text.Pandoc.XML.Light.Proc import Text.Pandoc.XML.Light.Output@@ -61,14 +59,20 @@ parseXMLElement = parseXMLElementWithEntities mempty  -- Drop in replacement for parseXMLDoc in xml-light.+-- Like 'parseXMLContentsWithEntities', but requires the document to+-- consist of a single root element. parseXMLElementWithEntities :: M.Map T.Text T.Text                             -> TL.Text -> Either T.Text Element parseXMLElementWithEntities entityMap t =-  elementToElement .  Conduit.documentRoot <$>-    either (Left . T.pack . E.displayException) Right-    (Conduit.parseText Conduit.def{ Conduit.psRetainNamespaces = True-                                  , Conduit.psDecodeEntities =-                                      entityResolver entityMap } t)+  parseXMLContentsWithEntities entityMap t >>= documentElement+ where+  -- 'parseXMLContentsWithEntities' has already dropped whitespace+  -- around a lone root element, so anything else left here is either+  -- a missing root or content outside of it.+  documentElement [Elem e] = Right e+  documentElement cs+    | null [e | Elem e <- cs] = Left "XML document has no root element"+    | otherwise = Left "unexpected content after the root XML element"  parseXMLContents :: TL.Text -> Either T.Text [Content] parseXMLContents = parseXMLContentsWithEntities mempty@@ -183,25 +187,11 @@   isWhitespaceText (Text cd) = T.all isSpace (cdData cd)   isWhitespaceText _         = False -nameToQName :: Conduit.Name -> QName-nameToQName (Conduit.Name localName mbns mbpref) =+nameToQName :: XML.Name -> QName+nameToQName (XML.Name localName mbns mbpref) =   case mbpref of     Nothing ->       case T.stripPrefix "xmlns:" localName of         Just rest -> QName rest mbns (Just "xmlns")         Nothing   -> QName localName mbns mbpref     _ -> QName localName mbns mbpref--elementToElement :: Conduit.Element -> Element-elementToElement (Conduit.Element name attribMap nodes) =-  Element (nameToQName name) attrs (mapMaybe nodeToContent nodes) Nothing- where-  attrs = map (\(n,v) -> Attr (nameToQName n) v) $-              M.toList attribMap--nodeToContent :: Conduit.Node -> Maybe Content-nodeToContent (Conduit.NodeElement el) =-  Just (Elem (elementToElement el))-nodeToContent (Conduit.NodeContent t) =-  Just (Text (CData CDataText t Nothing))-nodeToContent _ = Nothing