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)
Files
- AUTHORS.md +5/−0
- MANUAL.txt +26/−6
- README.md +4/−0
- benchmark/benchmark-pandoc.hs +51/−31
- benchmark/lalune.jpg binary
- benchmark/movie.jpg binary
- benchmark/sample.md +1597/−0
- changelog.md +272/−0
- data/docx/word/styles.xml +0/−2
- data/templates/default.typst +12/−0
- pandoc.cabal +14/−3
- src/Text/Pandoc/App/OutputSettings.hs +8/−4
- src/Text/Pandoc/Citeproc/MetaValue.hs +2/−2
- src/Text/Pandoc/Extensions.hs +1/−0
- src/Text/Pandoc/Format.hs +1/−0
- src/Text/Pandoc/MIME.hs +1/−0
- src/Text/Pandoc/Parsing/Math.hs +58/−57
- src/Text/Pandoc/Readers.hs +2/−0
- src/Text/Pandoc/Readers/CommonMark.hs +2/−1
- src/Text/Pandoc/Readers/Creole.hs +28/−2
- src/Text/Pandoc/Readers/Docx.hs +3/−1
- src/Text/Pandoc/Readers/Docx/Combine.hs +22/−1
- src/Text/Pandoc/Readers/Docx/Parse.hs +14/−6
- src/Text/Pandoc/Readers/Docx/Parse/Styles.hs +62/−18
- src/Text/Pandoc/Readers/Markdown.hs +17/−10
- src/Text/Pandoc/Readers/Mdoc/Lex.hs +3/−1
- src/Text/Pandoc/Readers/MediaWiki.hs +26/−3
- src/Text/Pandoc/Readers/ODT.hs +39/−1
- src/Text/Pandoc/Readers/ODT/ContentReader.hs +297/−126
- src/Text/Pandoc/Readers/ODT/Generic/XMLConverter.hs +1/−0
- src/Text/Pandoc/Readers/ODT/StyleReader.hs +18/−8
- src/Text/Pandoc/Readers/Org/Inlines.hs +61/−6
- src/Text/Pandoc/Readers/RST.hs +2/−1
- src/Text/Pandoc/Readers/RTF.hs +42/−3
- src/Text/Pandoc/Readers/Roff.hs +2/−1
- src/Text/Pandoc/Readers/Roff/Escape.hs +3/−3
- src/Text/Pandoc/Readers/Textile.hs +74/−4
- src/Text/Pandoc/Readers/Txt2Tags.hs +22/−1
- src/Text/Pandoc/Readers/Typst.hs +9/−14
- src/Text/Pandoc/Readers/Vimwiki.hs +30/−1
- src/Text/Pandoc/SelfContained.hs +2/−2
- src/Text/Pandoc/Templates.hs +1/−0
- src/Text/Pandoc/Writers.hs +2/−0
- src/Text/Pandoc/Writers/Docx/OpenXML.hs +82/−2
- src/Text/Pandoc/Writers/Docx/StyleMap.hs +8/−2
- src/Text/Pandoc/Writers/Docx/Table.hs +4/−1
- src/Text/Pandoc/Writers/Docx/Types.hs +8/−1
- src/Text/Pandoc/Writers/HTML.hs +1/−1
- src/Text/Pandoc/Writers/LaTeX.hs +2/−1
- src/Text/Pandoc/Writers/Markdown.hs +28/−15
- src/Text/Pandoc/Writers/Markdown/Inline.hs +17/−5
- src/Text/Pandoc/Writers/ODT.hs +228/−11
- src/Text/Pandoc/Writers/OpenDocument.hs +149/−120
- src/Text/Pandoc/Writers/Typst.hs +31/−7
- src/Text/Pandoc/XML.hs +53/−19
- test/Tests/Readers/Docx.hs +18/−2
- test/Tests/Readers/DokuWiki.hs +42/−1
- test/Tests/Readers/HTML.hs +42/−1
- test/Tests/Readers/Markdown.hs +85/−1
- test/Tests/Readers/ODT.hs +99/−1
- test/Tests/Writers/Docx.hs +5/−0
- test/Tests/Writers/LaTeX.hs +2/−2
- test/Tests/Writers/Markdown.hs +26/−0
- test/Tests/Writers/ODT.hs +54/−0
- test/command/10965.md +4/−0
- test/command/11266.md +0/−1
- test/command/11583.md +1/−0
- test/command/11794.md +1/−0
- test/command/11845.md +39/−0
- test/command/11927.md +6/−0
- test/command/11939.md +19/−0
- test/command/11942.js +1/−0
- test/command/11942.md +14/−0
- test/command/4880.md +2/−2
- test/command/5116.md +6/−3
- test/command/6792.md +1/−4
- test/command/6821.md +2/−1
- test/command/7181.md +2/−1
- test/command/9002.md +2/−1
- test/command/9387.md +1/−0
- test/command/9716.md +1/−1
- test/command/completion.md +15/−15
- test/command/fodt-roundtrip.md +126/−0
- test/command/opendocument-abstract.opendocument +1/−0
- test/command/opendocument-body.opendocument +1/−0
- test/command/opendocument-styles.md +131/−0
- test/command/pandoc-citeproc-77.md +11/−8
- test/docx/double_strikeout.docx binary
- test/docx/double_strikeout.native +68/−0
- test/docx/golden/block_quotes.docx binary
- test/docx/golden/codeblock.docx binary
- test/docx/golden/comments.docx binary
- test/docx/golden/csl_bibliography.docx binary
- test/docx/golden/custom_style_no_reference.docx binary
- test/docx/golden/custom_style_preserve.docx binary
- test/docx/golden/definition_list.docx binary
- test/docx/golden/document-properties-short-desc.docx binary
- test/docx/golden/document-properties.docx binary
- test/docx/golden/headers.docx binary
- test/docx/golden/image.docx binary
- test/docx/golden/inline_code.docx binary
- test/docx/golden/inline_formatting.docx binary
- test/docx/golden/inline_images.docx binary
- test/docx/golden/link_in_notes.docx binary
- test/docx/golden/links.docx binary
- test/docx/golden/lists.docx binary
- test/docx/golden/lists_9994.docx binary
- test/docx/golden/lists_continuing.docx binary
- test/docx/golden/lists_div_bullets.docx binary
- test/docx/golden/lists_multiple_initial.docx binary
- test/docx/golden/lists_restarting.docx binary
- test/docx/golden/mark_math.docx binary
- test/docx/golden/nested_anchors_in_header.docx binary
- test/docx/golden/notes.docx binary
- test/docx/golden/raw-blocks.docx binary
- test/docx/golden/raw-bookmarks.docx binary
- test/docx/golden/table_one_row.docx binary
- test/docx/golden/table_with_list_cell.docx binary
- test/docx/golden/tables-default-widths.docx binary
- test/docx/golden/tables.docx binary
- test/docx/golden/tables_separated_with_rawblock.docx binary
- test/docx/golden/task_list.docx binary
- test/docx/golden/track_changes_deletion.docx binary
- test/docx/golden/track_changes_insertion.docx binary
- test/docx/golden/track_changes_move.docx binary
- test/docx/golden/track_changes_scrubbed_metadata.docx binary
- test/docx/golden/unicode.docx binary
- test/docx/golden/verbatim_subsuper.docx binary
- test/docx/mark_math.native +12/−0
- test/docx/track_changes_edge_spaces.docx binary
- test/docx/track_changes_edge_spaces_accept.native +4/−0
- test/docx/track_changes_edge_spaces_all.native +4/−0
- test/docx/track_changes_edge_spaces_reject.native +4/−0
- test/docx/track_changes_insertion_all.native +1/−1
- test/odt/fodt-native/image.native +1/−0
- test/odt/fodt/formula.fodt +523/−0
- test/odt/fodt/image.fodt +793/−0
- test/odt/fodt/preformattedText.fodt +152/−0
- test/odt/fodt/textMixedStyles.fodt +224/−0
- test/odt/native/referenceToChapter.native +1/−1
- test/rtf/unicode.native +5/−1
- test/rtf/unicode.rtf +2/−0
- test/test-pandoc.hs +2/−0
- test/typst-reader.native +128/−0
- test/typst-reader.typ +15/−0
- test/writer.opendocument +2/−8
- test/writer.typst +2/−0
- xml-light/Text/Pandoc/XML/Light.hs +13/−23
@@ -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
@@ -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.
@@ -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
@@ -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
binary file changed (absent → 16270 bytes)
binary file changed (absent → 1046 bytes)
@@ -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&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  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.+
@@ -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:
@@ -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" />
@@ -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$
@@ -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
@@ -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
@@ -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
@@ -543,6 +543,7 @@ , Ext_xrefs_number ] getAll "odt" = getAll "opendocument" <> autoIdExtensions+ getAll "fodt" = getAll "odt" getAll "muse" = autoIdExtensions <> extensionsFromList [ Ext_amuse ]
@@ -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"
@@ -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")
@@ -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 "\\\\(" "\\\\)")
@@ -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)
@@ -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 <>)
@@ -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 <$>
@@ -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 =
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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 '"'
@@ -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"))
@@ -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.
@@ -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"
@@ -25,6 +25,7 @@ , modifyExtraState , getCurrentElement , elName+, findChild' , filterChildrenName' , isSet' , isSetWithDefault
@@ -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
@@ -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' <$
@@ -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)
@@ -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 <$
@@ -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]
@@ -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 '\''
@@ -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
@@ -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
@@ -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)
@@ -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 <|>
@@ -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
@@ -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"
@@ -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)
@@ -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
@@ -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
@@ -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")] ()
@@ -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 ||
@@ -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) .
@@ -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
@@ -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
@@ -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) &&
@@ -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
@@ -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
@@ -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')
@@ -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 @@ '"' -> """ 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 escapeNls :: Text -> Text-escapeNls = T.concatMap $ \case- '\n' -> " "- c -> T.singleton c+escapeNls t+ | T.elem '\n' t = T.replace "\n" " " 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)
@@ -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"
@@ -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")
@@ -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"))
@@ -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
@@ -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" ]
@@ -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
@@ -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}" ] ]
@@ -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"+ =?> ""+ , "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]")
@@ -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
@@ -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.+ ] ```
@@ -9,7 +9,6 @@ \end{eqnarray} $$ ^D- \begin{eqnarray} S &\rightarrow& a A \nonumber \\ A &\rightarrow& d B \ | \ b A \ | \ c A \nonumber \\
@@ -11,5 +11,6 @@ + item + item + item+ ] ```
@@ -6,6 +6,7 @@ ^D #block[ Hello+ ] <foo> ```
@@ -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." ]+]+```
@@ -0,0 +1,6 @@+```+% pandoc -f native -t commonmark+[ Para [ Str "a\\(b\\)c" , Space , Str "\\*x" ] ]+^D+a\\(b\\)c \\\*x+```
@@ -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+```
@@ -0,0 +1,1 @@+var sel = '#main' & 1; // </script>
@@ -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>+```
@@ -1,6 +1,6 @@ ```-% pandoc -t latex-$x=y%comment$+% pandoc -t latex -f native+[Math InlineMath "x=y%comment"] ^D \(x=y%comment \)
@@ -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}
@@ -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>
@@ -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}
@@ -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}
@@ -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%" />
@@ -7,6 +7,7 @@ ^D #block[ test+ ] #label("my label") See #link(label("my label"))[my label].
@@ -4,7 +4,7 @@ > A suggestion. ^D [ Div- ( "" , [ "alert" , "tip" ] , [] )+ ( "" , [ "tip" , "alert" ] , [] ) [ Div ( "" , [ "title" ] , [] ) [ Para [ Str "Tip" ] ] , Para [ Str "A" , Space , Str "suggestion." ] ]
@@ -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"
@@ -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++^D+[ Para+ [ Image+ ( ""+ , []+ , [ ( "width" , "150.0pt" ) , ( "height" , "150.0pt" ) ]+ )+ []+ ( "Pictures/image1.jpg" , "" )+ ]+]+```
@@ -0,0 +1,1 @@+$abstract$
@@ -0,0 +1,1 @@+$body$
@@ -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>+```
@@ -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. ```
binary file changed (absent → 13825 bytes)
@@ -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."+ ]+ ]
binary file changed (10689 → 10684 bytes)
binary file changed (10510 → 10474 bytes)
binary file changed (10824 → 10814 bytes)
binary file changed (10675 → 10670 bytes)
binary file changed (10609 → 10574 bytes)
binary file changed (11233 → 11229 bytes)
binary file changed (10501 → 10465 bytes)
binary file changed (10515 → 10478 bytes)
binary file changed (10993 → 10983 bytes)
binary file changed (10776 → 10764 bytes)
binary file changed (27434 → 27420 bytes)
binary file changed (10451 → 10415 bytes)
binary file changed (10627 → 10591 bytes)
binary file changed (27383 → 27347 bytes)
binary file changed (10664 → 10628 bytes)
binary file changed (10853 → 10847 bytes)
binary file changed (11048 → 11039 bytes)
binary file changed (10788 → 10752 bytes)
binary file changed (10677 → 10667 bytes)
binary file changed (10670 → 10660 bytes)
binary file changed (10903 → 10893 bytes)
binary file changed (10686 → 10676 bytes)
binary file changed (absent → 10738 bytes)
binary file changed (10874 → 10864 bytes)
binary file changed (10625 → 10614 bytes)
binary file changed (10544 → 10508 bytes)
binary file changed (10683 → 10647 bytes)
binary file changed (10496 → 10486 bytes)
binary file changed (10951 → 10941 bytes)
binary file changed (10876 → 10865 bytes)
binary file changed (10887 → 10879 bytes)
binary file changed (10519 → 10483 bytes)
binary file changed (10773 → 10763 bytes)
binary file changed (10492 → 10456 bytes)
binary file changed (10476 → 10437 bytes)
binary file changed (10506 → 10470 bytes)
binary file changed (10591 → 10581 bytes)
binary file changed (10468 → 10432 bytes)
binary file changed (10479 → 10443 bytes)
@@ -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" ]+]
binary file changed (absent → 1093 bytes)
@@ -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."]]
@@ -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."]]
@@ -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."]]
@@ -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."]]
@@ -0,0 +1,1 @@+[Para [Image ("",[],[("width","2.0835in"),("height","2.0835in")]) [] ("Pictures/image1.jpg","")]]
@@ -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="'Lucida Sans Unicode'" 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="'Lucida Sans Unicode'" 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>
@@ -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="'Lucida Sans Unicode'" 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="'Lucida Sans Unicode'" 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>
@@ -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="'Liberation Mono'" style:font-family-generic="modern" style:font-pitch="fixed"/>+ <style:font-face style:name="Liberation Sans" svg:font-family="'Liberation Sans'" style:font-family-generic="swiss" style:font-pitch="variable"/>+ <style:font-face style:name="Liberation Serif" svg:font-family="'Liberation Serif'" style:font-family-generic="roman" style:font-pitch="variable"/>+ <style:font-face style:name="Noto Sans" svg:font-family="'Noto Sans'" style:font-family-generic="swiss"/>+ <style:font-face style:name="Noto Sans SC Thin" svg:font-family="'Noto Sans SC Thin'" style:font-family-generic="system" style:font-pitch="variable"/>+ <style:font-face style:name="Noto Sans1" svg:font-family="'Noto Sans'" 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="'Liberation Sans'" 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="'Noto Sans SC Thin'" 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="'Noto Sans'" 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="'Noto Sans'" 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="'Noto Sans'" 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="'Noto Sans'" 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="'Liberation Mono'" style:font-family-generic="modern" style:font-pitch="fixed" fo:font-size="10pt" style:font-name-asian="Liberation Mono" style:font-family-asian="'Liberation Mono'" 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="'Liberation Mono'" 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("Hello world");</text:p>+ <text:p text:style-name="Preformatted_20_Text">}</text:p>+ </office:text>+ </office:body>+</office:document>
@@ -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="'Droid Sans Fallback'" 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="'Liberation Sans'" style:font-family-generic="swiss" style:font-pitch="variable"/>+ <style:font-face style:name="Liberation Serif" svg:font-family="'Liberation Serif'" 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="'Liberation Sans'" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="14pt" style:font-name-asian="Droid Sans Fallback" style:font-family-asian="'Droid Sans Fallback'" 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>
@@ -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 "."]]
@@ -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"+ ]+ ]
@@ -5,5 +5,7 @@ \u-3913? \u945a {\uc2\u228\'E8a}+\uc1\u-10187 ?\u-9157 ?+\u-10187 ?unpaired \par }
@@ -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
@@ -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
@@ -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"
@@ -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 > 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>
@@ -542,6 +542,7 @@ #block[ #block[ foo+ ] ] #block[@@ -556,6 +557,7 @@ #block[ foo+ ] This should be a code block, though:
@@ -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