git.iko.soy/typeable/pandoc
on master help sign in
.circleci/config.yml+1−1
since splitsnapshots
unifiedsplit
@@ -2,7 +2,7 @@ version: "2.1"
2jobs:
2jobs:
3 build:
3 build:
4 macos:
4 macos:
5− xcode: 9.4.1
5+ xcode: 11.1.0
6 environment:
6 environment:
7 HOMEBREW_NO_AUTO_UPDATE: 1
7 HOMEBREW_NO_AUTO_UPDATE: 1
8 steps:
8 steps:
.editorconfig+8
@@ -8,6 +8,14 @@ indent_size = 2
8insert_final_newline = true
8insert_final_newline = true
9trim_trailing_whitespace = true
9trim_trailing_whitespace = true
10
10
11+[*.{zip,docx}]
12+charset =
13+end_of_line =
14+indent_style =
15+indent_size =
16+insert_final_newline =
17+trim_trailing_whitespace =
18+
11[*.{markdown,md}]
19[*.{markdown,md}]
12trim_trailing_whitespace = false
20trim_trailing_whitespace = false
13
21
.github/ISSUE_TEMPLATEdeleted−11
@@ -1,11 +0,0 @@
1−Asking a question?
2−Please use the pandoc-discuss mailing list instead:
3−https://groups.google.com/forum/#!forum/pandoc-discuss
4−This tracker is for bug reports and enhancement requests.
5−
6−Reporting a bug?
7−Please include your pandoc version and an example that allows us
8−to reproduce the problem (complete input, exact command line
9−used, expected and actual output). The smaller the example, the
10−better.
11−
.github/ISSUE_TEMPLATE/bug_report.mdnew file+25
@@ -0,0 +1,25 @@
1+---
2+name: Bug report
3+about: Create a report to help us improve
4+title: ''
5+labels: 'bug'
6+assignees: ''
7+
8+---
9+
10+<!--
11+Thank you for reporting an issue! Before you continue, please make sure that you have
12+
13+- searched the issue tracker for similar issues (including closed issues): https://github.com/jgm/pandoc/issues
14+- searched the pandoc-discuss mailing list for solutions: https://groups.google.com/forum/#!forum/pandoc-discuss
15+- reproduced your issue on the latest release of pandoc, or on https://pandoc.org/try
16+
17+Note that this bug tracker is for reporting bugs, not asking questions. For questions, use the pandoc-discuss mailing list.
18+-->
19+
20+**Explain the problem.**
21+Include the exact command line you used and all inputs necessary to reproduce the issue. Please create as minimal an example as possible, to help the maintainers isolate the problem. Explain the output you received and how it differs from what you expected.
22+
23+**Pandoc version?**
24+What version of pandoc are you using, on what OS?
25+
.github/ISSUE_TEMPLATE/config.ymlnew file+9
@@ -0,0 +1,9 @@
1+blank_issues_enabled: false
2+contact_links:
3+ - name: Ask a question
4+ url: https://groups.google.com/forum/#!forum/pandoc-discuss
5+ about: "Discussion forum for pandoc (may be used as an email list)"
6+ - name: Contributing Guidelines
7+ url: https://pandoc.org/CONTRIBUTING.html
8+ about: "Guidelines for submitting bug reports and code improvements"
9+
.github/ISSUE_TEMPLATE/feature_request.mdnew file+21
@@ -0,0 +1,21 @@
1+---
2+name: Feature request
3+about: Suggest an idea for this project
4+title: ''
5+labels: 'enhancement'
6+assignees: ''
7+
8+---
9+
10+<!--
11+Thank you for suggesting a feature! Before you continue, please make sure that you have
12+
13+- read the contributing guidelines: https://pandoc.org/CONTRIBUTING.html
14+- searched the issue tracker for similar issues (including closed issues): https://github.com/jgm/pandoc/issues
15+- searched the pandoc-discuss mailing list for relevant discussions: https://groups.google.com/forum/#!forum/pandoc-discuss
16+-->
17+
18+**Describe your proposed improvement and the problem it solves.**
19+
20+**Describe alternatives you've considered.**
21+
.github/workflows/ci.yml+6−1
@@ -68,11 +68,16 @@ jobs:
68 prefix: ''
68 prefix: ''
69 cabalopts: ''
69 cabalopts: ''
70 testopts: '--test-option=--hide-successes'
70 testopts: '--test-option=--hide-successes'
71− - ghc: '8.10.2'
71+ - ghc: '8.10.4'
72 cabal: '3.2'
72 cabal: '3.2'
73 prefix: ''
73 prefix: ''
74 cabalopts: '-ftrypandoc'
74 cabalopts: '-ftrypandoc'
75 testopts: '--test-option=--hide-successes'
75 testopts: '--test-option=--hide-successes'
76+ - ghc: '9.0.1'
77+ cabal: '3.4'
78+ prefix: ''
79+ cabalopts: ''
80+ testopts: '--test-option=--hide-successes'
76 steps:
81 steps:
77 - uses: actions/checkout@v2
82 - uses: actions/checkout@v2
78
83
AUTHORS.md+11
@@ -20,6 +20,7 @@
20- Andreas Lööw
20- Andreas Lööw
21- Andrew Dunning
21- Andrew Dunning
22- Andy Morris
22- Andy Morris
23+- Anti-Distinctlyminty
23- Antoine Latter
24- Antoine Latter
24- Antonio Terceiro
25- Antonio Terceiro
25- Arata Mizuki
26- Arata Mizuki
@@ -46,6 +47,7 @@
46- Carlos Sosa
47- Carlos Sosa
47- Cécile Chemin
48- Cécile Chemin
48- Cédric Couralet
49- Cédric Couralet
50+- Charanjit Singh
49- Chris Black
51- Chris Black
50- Christian Conkle
52- Christian Conkle
51- Christian Despres
53- Christian Despres
@@ -76,6 +78,7 @@
76- Eigil Rischel
78- Eigil Rischel
77- Emanuel Evans
79- Emanuel Evans
78- Emerson Harkin
80- Emerson Harkin
81+- Emily Bourke
79- Emily Eisenberg
82- Emily Eisenberg
80- Eric Kow
83- Eric Kow
81- Erik Rask
84- Erik Rask
@@ -149,6 +152,7 @@
149- Josef Svenningsson
152- Josef Svenningsson
150- Joseph C. Sible
153- Joseph C. Sible
151- Julien Cretel
154- Julien Cretel
155+- Julien Dutant
152- Juliette Fourcot
156- Juliette Fourcot
153- Juliusz Gonera
157- Juliusz Gonera
154- Justin Bogner
158- Justin Bogner
@@ -231,6 +235,7 @@
231- Raymond Ehlers
235- Raymond Ehlers
232- Recai Oktaş
236- Recai Oktaş
233- Roland Hieber
237- Roland Hieber
238+- Roman Beránek
234- RyanGlScott
239- RyanGlScott
235- Salim B
240- Salim B
236- Sascha Wilde
241- Sascha Wilde
@@ -248,6 +253,7 @@
248- Stefan Dresselhaus
253- Stefan Dresselhaus
249- Sumit Sahrawat
254- Sumit Sahrawat
250- Tarik Graba
255- Tarik Graba
256+- Tatiana Porras
251- Thenaesh Elango
257- Thenaesh Elango
252- Thomas Hodgson
258- Thomas Hodgson
253- Thomas Weißschuh
259- Thomas Weißschuh
@@ -281,6 +287,7 @@
281- a-vrma
287- a-vrma
282- andrebauer
288- andrebauer
283- argent0
289- argent0
290+- badumont
284- blmage
291- blmage
285- bucklereed
292- bucklereed
286- bumper314
293- bumper314
@@ -296,8 +303,11 @@
296- kaizshang91
303- kaizshang91
297- lux-lth
304- lux-lth
298- lwolfsonkin
305- lwolfsonkin
306+- mbrackeantidot
299- nkalvi
307- nkalvi
300- niszet
308- niszet
309+- nuew
310+- obcat
301- oltolm
311- oltolm
302- oquechy
312- oquechy
303- quasicomputational
313- quasicomputational
@@ -309,6 +319,7 @@
309- shreevatsa.public
319- shreevatsa.public
310- takahashim
320- takahashim
311- taotieren
321- taotieren
322+- tecosaur
312- TEC
323- TEC
313- tgkokk
324- tgkokk
314- the-solipsist
325- the-solipsist
CONTRIBUTING.md+6−5
@@ -406,11 +406,11 @@ The library is structured as follows:
406 tree automatically.
406 tree automatically.
407 - `Text.Pandoc.Readers.*` are the readers, and `Text.Pandoc.Writers.*`
407 - `Text.Pandoc.Readers.*` are the readers, and `Text.Pandoc.Writers.*`
408 are the writers.
408 are the writers.
409− - `Text.Pandoc.Biblio` is a utility module for formatting citations
409+ - `Text.Pandoc.Citeproc.*` contain the code for citation handling,
410− using citeproc-hs.
410+ including an interface to the [citeproc] library.
411 - `Text.Pandoc.Data` is used to embed data files when the `embed_data_files`
411 - `Text.Pandoc.Data` is used to embed data files when the `embed_data_files`
412− cabal flag is used. It is generated from `src/Text/Pandoc/Data.hsb` using
412+ cabal flag is used.
413− the preprocessor [hsb2hs].
413+ - `Text.Pandoc.Emoji` is a thin wrapper around [emojis].
414 - `Text.Pandoc.Highlighting` contains the interface to the
414 - `Text.Pandoc.Highlighting` contains the interface to the
415 skylighting library, which is used for code syntax highlighting.
415 skylighting library, which is used for code syntax highlighting.
416 - `Text.Pandoc.ImageSize` is a utility module containing functions for
416 - `Text.Pandoc.ImageSize` is a utility module containing functions for
@@ -421,7 +421,6 @@ The library is structured as follows:
421 - `Text.Pandoc.PDF` contains functions for producing a PDF from a
421 - `Text.Pandoc.PDF` contains functions for producing a PDF from a
422 LaTeX source.
422 LaTeX source.
423 - `Text.Pandoc.Parsing` contains parsing functions used in multiple readers.
423 - `Text.Pandoc.Parsing` contains parsing functions used in multiple readers.
424− - `Text.Pandoc.Pretty` is a pretty-printing library specialized to
425 the needs of pandoc.
424 the needs of pandoc.
426 - `Text.Pandoc.SelfContained` contains functions for making an HTML
425 - `Text.Pandoc.SelfContained` contains functions for making an HTML
427 file "self-contained," by importing remotely linked images, CSS,
426 file "self-contained," by importing remotely linked images, CSS,
@@ -456,6 +455,8 @@ you may want to consider submitting a pull request to the
456[EditorConfig]: https://editorconfig.org/
455[EditorConfig]: https://editorconfig.org/
457[Haskell platform]: https://www.haskell.org/platform/
456[Haskell platform]: https://www.haskell.org/platform/
458[hlint]: https://hackage.haskell.org/package/hlint
457[hlint]: https://hackage.haskell.org/package/hlint
458+[citeproc]: https://hackage.haskell.org/package/citeproc
459+[emojis]: https://hackage.haskell.org/package/emojis
459[hsb2hs]: https://hackage.haskell.org/package/hsb2hs
460[hsb2hs]: https://hackage.haskell.org/package/hsb2hs
460[pre-commit hook]: https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks
461[pre-commit hook]: https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks
461[GitHub labels]: https://github.com/jgm/pandoc/labels
462[GitHub labels]: https://github.com/jgm/pandoc/labels
MANUAL.txt+143−52
@@ -1,7 +1,7 @@
1---
1---
2title: Pandoc User's Guide
2title: Pandoc User's Guide
3author: John MacFarlane
3author: John MacFarlane
4−date: March 20, 2021
4+date: June 20, 2021
5---
5---
6
6
7# Synopsis
7# Synopsis
@@ -675,12 +675,12 @@ header when requesting a document from a URL:
675: Extract images and other media contained in or linked from
675: Extract images and other media contained in or linked from
676 the source document to the path *DIR*, creating it if
676 the source document to the path *DIR*, creating it if
677 necessary, and adjust the images references in the document
677 necessary, and adjust the images references in the document
678− so they point to the extracted files. If the source format is
678+ so they point to the extracted files. Media are downloaded,
679− a binary container (docx, epub, or odt), the media is
679+ read from the file system, or extracted from a binary
680− extracted from the container and the original
680+ container (e.g. docx), as needed. The original file paths
681− filenames are used. Otherwise the media is read from the
681+ are used if they are relative paths not containing `..`.
682− file system or downloaded, and new filenames are constructed
682+ Otherwise filenames are constructed from the SHA1 hash of
683− based on SHA1 hashes of the contents.
683+ the contents.
684
684
685`--abbreviations=`*FILE*
685`--abbreviations=`*FILE*
686
686
@@ -1415,13 +1415,12 @@ results only for basic math, usually you will want to use
1415`--gladtex`
1415`--gladtex`
1416
1416
1417: Enclose TeX math in `<eq>` tags in HTML output. The resulting HTML
1417: Enclose TeX math in `<eq>` tags in HTML output. The resulting HTML
1418− can then be processed by [GladTeX] to produce images of the typeset
1418+ can then be processed by [GladTeX] to produce SVG images of the typeset
1419− formulas and an HTML file with links to these images.
1419+ formulas and an HTML file with these images embedded.
1420− So, the procedure is:
1421
1420
1422 pandoc -s --gladtex input.md -o myfile.htex
1421 pandoc -s --gladtex input.md -o myfile.htex
1423− gladtex -d myfile-images myfile.htex
1422+ gladtex -d image_dir myfile.htex
1424− # produces myfile.html and images in myfile-images
1423+ # produces myfile.html and images in image_dir
1425
1424
1426[MathML]: https://www.w3.org/Math/
1425[MathML]: https://www.w3.org/Math/
1427[MathJax]: https://www.mathjax.org
1426[MathJax]: https://www.mathjax.org
@@ -2315,8 +2314,8 @@ math equations flush left using [YAML metadata](#layout) or with
2315
2314
2316These affect HTML output when [producing slide shows with pandoc].
2315These affect HTML output when [producing slide shows with pandoc].
2317
2316
2318−All [reveal.js configuration options] are available as variables.
2317+`institute`
2319−To turn off boolean flags that default to true in reveal.js, use `0`.
2318+: author affiliations: can be a list when there are multiple authors
2320
2319
2321`revealjs-url`
2320`revealjs-url`
2322: base URL for reveal.js documents (defaults to
2321: base URL for reveal.js documents (defaults to
@@ -2336,6 +2335,9 @@ To turn off boolean flags that default to true in reveal.js, use `0`.
2336: additional attributes for the title slide of reveal.js slide shows.
2335: additional attributes for the title slide of reveal.js slide shows.
2337 See [background in reveal.js and beamer] for an example.
2336 See [background in reveal.js and beamer] for an example.
2338
2337
2338+All [reveal.js configuration options] are available as variables.
2339+To turn off boolean flags that default to true in reveal.js, use `0`.
2340+
2339[reveal.js configuration options]: https://revealjs.com/config/
2341[reveal.js configuration options]: https://revealjs.com/config/
2340
2342
2341### Variables for Beamer slides
2343### Variables for Beamer slides
@@ -3752,7 +3754,7 @@ definition:
3752Note that space between items in a definition list is required.
3754Note that space between items in a definition list is required.
3753(A variant that loosens this requirement, but disallows "lazy"
3755(A variant that loosens this requirement, but disallows "lazy"
3754hard wrapping, can be activated with `compact_definition_lists`: see
3756hard wrapping, can be activated with `compact_definition_lists`: see
3755−[Non-pandoc extensions], below.)
3757+[Non-default extensions], below.)
3756
3758
3757[^3]: I have been influenced by the suggestions of [David
3759[^3]: I have been influenced by the suggestions of [David
3758 Wheeler](https://justatheory.com/2009/02/modest-markdown-proposal/).
3760 Wheeler](https://justatheory.com/2009/02/modest-markdown-proposal/).
@@ -4177,10 +4179,12 @@ option is used. All of the metadata will appear in a single block
4177at the beginning of the document.
4179at the beginning of the document.
4178
4180
4179Note that [YAML] escaping rules must be followed. Thus, for example,
4181Note that [YAML] escaping rules must be followed. Thus, for example,
4180−if a title contains a colon, it must be quoted. The pipe character
4182+if a title contains a colon, it must be quoted, and if it contains a
4183+backslash escape, then it must be ensured that it is not treated as a
4184+[YAML escape sequence]. The pipe character (`|`) can be used to begin
4181−(`|`) can be used to begin an indented block that will be interpreted
4185+an indented block that will be interpreted literally, without need for
4182−literally, without need for escaping. This form is necessary
4186+escaping. This form is necessary when the field contains blank lines
4183−when the field contains blank lines or block-level formatting:
4187+or block-level formatting:
4184
4188
4185 ---
4189 ---
4186 title: 'This is the title: it contains a colon'
4190 title: 'This is the title: it contains a colon'
@@ -4194,6 +4198,12 @@ when the field contains blank lines or block-level formatting:
4194 It consists of two paragraphs.
4198 It consists of two paragraphs.
4195 ...
4199 ...
4196
4200
4201+The literal block after the `|` must be indented relative to the
4202+line containing the `|`. If it is not, the YAML will be invalid
4203+and pandoc will not interpret it as metadata. For an overview
4204+of the complex rules governing YAML, see the [Wikipedia entry on
4205+YAML syntax].
4206+
4197Template variables will be set automatically from the metadata. Thus, for
4207Template variables will be set automatically from the metadata. Thus, for
4198example, in writing HTML, the variable `abstract` will be set to the HTML
4208example, in writing HTML, the variable `abstract` will be set to the HTML
4199equivalent of the Markdown in the `abstract` field:
4209equivalent of the Markdown in the `abstract` field:
@@ -4255,6 +4265,8 @@ following restrictions apply:
4255 example, you can't use a reference link in these contexts
4265 example, you can't use a reference link in these contexts
4256 if the link definition is somewhere else in the document.
4266 if the link definition is somewhere else in the document.
4257
4267
4268+[YAML escape sequence]: https://yaml.org/spec/1.2/spec.html#id2776092
4269+[Wikipedia entry on YAML syntax]: https://en.m.wikipedia.org/wiki/YAML#Syntax
4258
4270
4259## Backslash escapes
4271## Backslash escapes
4260
4272
@@ -4948,37 +4960,68 @@ Inline and regular footnotes may be mixed freely.
4948
4960
4949#### Extension: `citations` ####
4961#### Extension: `citations` ####
4950
4962
4951−Markdown citations go inside square brackets and are separated
4963+To cite a bibliographic item with an identifier foo, use the
4952−by semicolons. Each citation must have a key, composed of '@' +
4964+syntax `@foo`. Normal citations should be included in square
4953−the citation identifier from the database, and may optionally
4965+brackets, with semicolons separating distinct items:
4954−have a prefix, a locator, and a suffix. The citation key must
4966+
4967+ Blah blah [@doe99; @smith2000; @smith2004].
4968+
4969+How this is rendered depends on the citation style. In an
4970+author-date style, it might render as
4971+
4972+ Blah blah (Doe 1999, Smith 2000, 2004).
4973+
4974+In a footnote style, it might render as
4975+
4976+ Blah blah.[^1]
4977+
4978+ [^1]: John Doe, "Frogs," *Journal of Amphibians* 44 (1999);
4979+ Susan Smith, "Flies," *Journal of Insects* (2000);
4980+ Susan Smith, "Bees," *Journal of Insects* (2004).
4981+
4982+See the [CSL user documentation] for more information about CSL
4983+styles and how they affect rendering.
4984+
4955−begin with a letter, digit, or `_`, and may contain
4985+Unless a citation key start with a letter, digit, or `_`,
4956−alphanumerics, `_`, and internal punctuation characters
4986+and contains only alphanumerics and internal punctuation
4957−(`:.#$%&-+?<>~/`). Here are some examples:
4987+characters (`:.#$%&-+?<>~/`), it must be surrounded
4958−
4988+by curly braces, which are not considered part of the key.
4959− Blah blah [see @doe99, pp. 33-35; also @smith04, chap. 1].
4989+In `@Foo_bar.baz.`, the key is `Foo_bar.baz`. The final
4960−
4990+period is not *internal* punctuation, so it is not included in
4961− Blah blah [@doe99, pp. 33-35, 38-39 and *passim*].
4991+the key. In `@{Foo_bar.baz.}`, the key is `Foo_bar.baz.`, including
4962−
4992+the final period. The curly braces are recommended if you use URLs as
4963− Blah blah [@smith04; @doe99].
4993+keys: `[@{https://example.com/bib?name=foobar&date=2000}, p. 33]`.
4964−
4994+
4995+Citation items may optionally include a prefix, a locator, and
4996+a suffix. In
4997+
4998+ Blah blah [see @doe99, pp. 33-35 and *passim*; @smith04, chap. 1].
4999+
5000+The first item (`doe99`) has prefix `see `, locator `pp. 33-35`,
5001+and suffix `and *passim*`. The second item (`smith04`) has
5002+locator `chap. 1` and no prefix or suffix.
5003+
5004+Pandoc uses some heuristics to separate the locator from the
5005+rest of the subject. It is sensitive to the locator terms
4965−`pandoc` detects locator terms in the [CSL locale files].
5006+defined in the [CSL locale files]. Either abbreviated or
4966−Either abbreviated or unabbreviated forms are accepted. In the `en-US`
5007+unabbreviated forms are accepted. In the `en-US` locale, locator
4967−locale, locator terms can be written in either singular or plural forms,
5008+terms can be written in either singular or plural forms, as
4968−as `book`, `bk.`/`bks.`; `chapter`, `chap.`/`chaps.`; `column`,
5009+`book`, `bk.`/`bks.`; `chapter`, `chap.`/`chaps.`; `column`,
4969−`col.`/`cols.`; `figure`, `fig.`/`figs.`; `folio`, `fol.`/`fols.`;
5010+`col.`/`cols.`; `figure`, `fig.`/`figs.`; `folio`,
4970−`number`, `no.`/`nos.`; `line`, `l.`/`ll.`; `note`, `n.`/`nn.`; `opus`,
5011+`fol.`/`fols.`; `number`, `no.`/`nos.`; `line`, `l.`/`ll.`;
5012+`note`, `n.`/`nn.`; `opus`, `op.`/`opp.`; `page`, `p.`/`pp.`;
4971−`op.`/`opp.`; `page`, `p.`/`pp.`; `paragraph`, `para.`/`paras.`; `part`,
5013+`paragraph`, `para.`/`paras.`; `part`, `pt.`/`pts.`; `section`,
4972−`pt.`/`pts.`; `section`, `sec.`/`secs.`; `sub verbo`, `s.v.`/`s.vv.`;
5014+`sec.`/`secs.`; `sub verbo`, `s.v.`/`s.vv.`; `verse`,
4973−`verse`, `v.`/`vv.`; `volume`, `vol.`/`vols.`; `¶`/`¶¶`; `§`/`§§`. If no
5015+`v.`/`vv.`; `volume`, `vol.`/`vols.`; `¶`/`¶¶`; `§`/`§§`. If no
4974locator term is used, "page" is assumed.
5016locator term is used, "page" is assumed.
4975
5017
4976−`pandoc` will use heuristics to distinguish the locator
5018+In complex cases, you can force something to be treated as
4977−from the suffix. In complex cases, the locator can be enclosed
4978−in curly braces:
5019+a locator by enclosing it in curly braces or prevent parsing
5020+the suffix as locator by prepending curly braces:
4979
5021
4980 [@smith{ii, A, D-Z}, with a suffix]
5022 [@smith{ii, A, D-Z}, with a suffix]
4981 [@smith, {pp. iv, vi-xi, (xv)-(xvii)} with suffix here]
5023 [@smith, {pp. iv, vi-xi, (xv)-(xvii)} with suffix here]
5024+ [@smith{}, 99 years later]
4982
5025
4983A minus sign (`-`) before the `@` will suppress mention of
5026A minus sign (`-`) before the `@` will suppress mention of
4984the author in the citation. This can be useful when the
5027the author in the citation. This can be useful when the
@@ -4986,13 +5029,26 @@ author is already mentioned in the text:
4986
5029
4987 Smith says blah [-@smith04].
5030 Smith says blah [-@smith04].
4988
5031
4989−You can also write an in-text citation, as follows:
5032+You can also write an author-in-text citation, by omitting the
5033+square brackets:
4990
5034
4991 @smith04 says blah.
5035 @smith04 says blah.
4992
5036
4993 @smith04 [p. 33] says blah.
5037 @smith04 [p. 33] says blah.
4994
5038
5039+This will cause the author's name to be rendered, followed by
5040+the bibliographical details. Use this form when you want to
5041+make the citation the subject of a sentence.
5042+
5043+When you are using a note style, it is usually better to let
5044+citeproc create the footnotes from citations rather than writing
5045+an explicit note. If you do write an explicit note that
5046+contains a citation, note that normal citations will be put in
5047+parentheses, while author-in-text citations will not. For
5048+this reason, it is sometimes preferable to use the
5049+author-in-text style inside notes when using a note style.
4995
5050
5051+[CSL user documentation]: https://citationstyles.org/authors/
4996[CSL]: https://docs.citationstyles.org/en/stable/specification.html
5052[CSL]: https://docs.citationstyles.org/en/stable/specification.html
4997[CSL markup specs]: https://docs.citationstyles.org/en/1.0/release-notes.html#rich-text-markup-within-fields
5053[CSL markup specs]: https://docs.citationstyles.org/en/1.0/release-notes.html#rich-text-markup-within-fields
4998[Chicago Manual of Style]: https://chicagomanualofstyle.org
5054[Chicago Manual of Style]: https://chicagomanualofstyle.org
@@ -5001,13 +5057,44 @@ You can also write an in-text citation, as follows:
5001[finding and editing styles]: https://citationstyles.org/authors/
5057[finding and editing styles]: https://citationstyles.org/authors/
5002[CSL locale files]: https://github.com/citation-style-language/locales
5058[CSL locale files]: https://github.com/citation-style-language/locales
5003
5059
5004−## Non-pandoc extensions
5060+## Non-default extensions
5005
5061
5006The following Markdown syntax extensions are not enabled by default
5062The following Markdown syntax extensions are not enabled by default
5007in pandoc, but may be enabled by adding `+EXTENSION` to the format
5063in pandoc, but may be enabled by adding `+EXTENSION` to the format
5008name, where `EXTENSION` is the name of the extension. Thus, for
5064name, where `EXTENSION` is the name of the extension. Thus, for
5009example, `markdown+hard_line_breaks` is Markdown with hard line breaks.
5065example, `markdown+hard_line_breaks` is Markdown with hard line breaks.
5010
5066
5067+#### Extension: `rebase_relative_paths` ####
5068+
5069+Rewrite relative paths for Markdown links and images, depending
5070+on the path of the file containing the link or image link. For
5071+each link or image, pandoc will compute the directory of the
5072+containing file, relative to the working directory, and prepend
5073+the resulting path to the link or image path.
5074+
5075+The use of this extension is best understood by example.
5076+Suppose you have a a subdirectory for each chapter of a book,
5077+`chap1`, `chap2`, `chap3`. Each contains a file `text.md` and a
5078+number of images used in the chapter. You would like to have
5079+`![image](spider.jpg)` in `chap1/text.md` refer to
5080+`chap1/spider.jpg` and `![image](spider.jpg)` in `chap2/text.md`
5081+refer to `chap2/spider.jpg`. To do this, use
5082+
5083+ pandoc chap*/*.md -f markdown+rebase_relative_paths
5084+
5085+Without this extension, you would have to use
5086+`![image](chap1/spider.jpg)` in `chap1/text.md` and
5087+`![image](chap2/spider.jpg)` in `chap2/text.md`. Links with
5088+relative paths will be rewritten in the same way as images.
5089+
5090+Absolute paths and URLs are not changed. Neither are empty
5091+paths or paths consisting entirely of a fragment, e.g., `#foo`.
5092+
5093+Note that relative paths in reference links and images will
5094+be rewritten relative to the file containing the link
5095+reference definition, not the file containing the reference link
5096+or image itself, if these differ.
5097+
5011#### Extension: `attributes` ####
5098#### Extension: `attributes` ####
5012
5099
5013Allows attributes to be attached to any inline or block-level
5100Allows attributes to be attached to any inline or block-level
@@ -5661,7 +5748,11 @@ rules:
5661 * A heading at the slide level always starts a new slide.
5748 * A heading at the slide level always starts a new slide.
5662
5749
5663 * Headings *below* the slide level in the hierarchy create
5750 * Headings *below* the slide level in the hierarchy create
5664− headings *within* a slide.
5751+ headings *within* a slide. (In beamer, a "block" will be
5752+ created. If the heading has the class `example`, an
5753+ `exampleblock` environment will be used; if it has the class
5754+ `alert`, an `alertblock` will be used; otherwise a regular
5755+ `block` will be used.)
5665
5756
5666 * Headings *above* the slide level in the hierarchy create
5757 * Headings *above* the slide level in the hierarchy create
5667 "title slides," which just contain the section title
5758 "title slides," which just contain the section title
@@ -6239,7 +6330,7 @@ Then edit `my.theme` and use it like this:
6239If you are not satisfied with the built-in highlighting, or you
6330If you are not satisfied with the built-in highlighting, or you
6240want highlight a language that isn't supported, you can use the
6331want highlight a language that isn't supported, you can use the
6241`--syntax-definition` option to load a [KDE-style XML syntax definition
6332`--syntax-definition` option to load a [KDE-style XML syntax definition
6242−file](https://docs.kde.org/stable5/en/applications/katepart/highlight.html).
6333+file](https://docs.kde.org/stable5/en/kate/katepart/highlight.html).
6243Before writing your own, have a look at KDE's [repository of syntax
6334Before writing your own, have a look at KDE's [repository of syntax
6244definitions](https://github.com/KDE/syntax-highlighting/tree/master/data/syntax).
6335definitions](https://github.com/KDE/syntax-highlighting/tree/master/data/syntax).
6245
6336
@@ -6413,9 +6504,9 @@ application, here are some things to keep in mind:
64134. The HTML generated by pandoc is not guaranteed to be safe.
65044. The HTML generated by pandoc is not guaranteed to be safe.
6414 If `raw_html` is enabled for the Markdown input, users can
6505 If `raw_html` is enabled for the Markdown input, users can
6415 inject arbitrary HTML. Even if `raw_html` is disabled,
6506 inject arbitrary HTML. Even if `raw_html` is disabled,
6416− users can include dangerous content in attributes for
6507+ users can include dangerous content in URLs and attributes.
6417− headings, spans, and code blocks. To be safe, you should
6418− run all the generated HTML through an HTML sanitizer.
6508+ To be safe, you should run all the generated HTML through
6509+ an HTML sanitizer.
6419
6510
6420# Authors
6511# Authors
6421
6512
SECURITY.mdnew file+12
@@ -0,0 +1,12 @@
1+# Security Policy
2+
3+## Supported Versions
4+
5+Only the most recent version of pandoc is supported with security updates.
6+
7+## Reporting a Vulnerability
8+
9+To report a vulnerability, email the maintainer, jgm@berkeley.edu.
10+But first please read the section of the manual entitled
11+[A note on security](https://pandoc.org/MANUAL.html#a-note-on-security),
12+which describes some security guarantees pandoc does NOT make.
cabal.project+4−4
@@ -4,10 +4,10 @@ flags: +embed_data_files
4
4
5source-repository-package
5source-repository-package
6 type: git
6 type: git
7− location: https://github.com/jgm/citeproc
7+ location: https://github.com/jgm/doctemplates
8− tag: f33b370bd1ab5ad5140720369c0586041e433a47
8+ tag: 428c26d5303cf7a2b1051fe1ffd9aafe9ba71c81
9
9
10source-repository-package
10source-repository-package
11 type: git
11 type: git
12− location: https://github.com/jgm/texmath
12+ location: https://github.com/jgm/citeproc
13− tag: 0c34bb7d229389adc62bcbfe20cfbfdc0c8ccc8d
13+ tag: 4ce0501cd6f9c86eee087afcf878c256e49b9615
changelog.md+590
@@ -1,5 +1,595 @@
1# Revision history for pandoc
1# Revision history for pandoc
2
2
3+## pandoc 2.14.0.3 (2021-06-22)
4+
5+ * Text.Pandoc.MediaBag `insertMediaBag`: ensure we get a sane mediaPath
6+ for URLs (#7391). In earlier 2.14.x versions, we'd get
7+ incorrect paths for resources downloaded from URLs when the
8+ media are extracted (including in PDF production).
9+ * Text.Pandoc.Parsing: improve `emailAddress` (#7398).
10+ Previously the parser would accept characters in domains
11+ that are illegal in domains, and this sometimes caused it
12+ to gobble bits of the following text.
13+ * txt2tags reader: modify the email address parser so
14+ it still includes form parameters, even after the change to
15+ `emailAddress` in Text.Pandoc.Parsing.
16+ * Text.Pandoc.Readers.Metadata: Fix regression with comment-only YAML
17+ metadata blocks (#7400).
18+ * reveal.js writer and template: better handling of options. Previously
19+ it was impossible to specify false values for options that default to
20+ true (e.g. `center`); setting the option to false just caused the portion
21+ of the template setting the option to be omitted. Now we prepopulate
22+ all the variables with their default values, including them all
23+ unconditionally and allowing them to be overridden.
24+ * Markdown writer: Fix regression in code blocks with attributes (#7397).
25+ Code blocks with a single class but nonempty attributes
26+ were having attributes drop as a result of #7242.
27+ * LaTeX writer:
28+ + Add strut at end of minipage if it contains line breaks.
29+ Without them, the last line is not as tall as it should be in
30+ some cases.
31+ + Always use a minipage for cells with line breaks, when
32+ width information is available (#7393). Otherwise the way we treat them
33+ can lead to content that overflows a cell.
34+ + Use `\strut` instead of `~` before `\\` in empty line.
35+ * Use lts-18.0 stack resolver.
36+ * Require skylighting 0.10.5.2 (adding support for Swift).
37+ * Require commonmark 0.2.1.
38+ * Rephrase section on unsafe HTML in manual.
39+ * Create SECURITY.md
40+
41+## pandoc 2.14.0.2 (2021-06-13)
42+
43+ * Fix MediaBag regressions (#7345). iIn the 2.14 release `--extract-media`
44+ stopped working as before; there could be mismatches between the
45+ paths in the rendered document and the extracted media.
46+ This patch makes several changes that restore the earlier behavior
47+ (while keeping the same API). The `mediaPath` in 2.14 was always
48+ constructed from the SHA1 hash of the media contents. Now, we
49+ preserve the original path unless it's an absolute path or contains
50+ `..` segments (in that case we use a path based on the SHA1 hash of
51+ the contents).
52+
53+ In Text.Pandoc.MediaBag, `mediaDirectory` and `mediaItems` now use the
54+ `mediaPath`, rather than the mediabag key, for the first component of the
55+ tuple. This makes more sense, I think, and fits with the documentation of
56+ these functions; eventually, though, we should rework the API so that
57+ `mediaItems` returns both the keys and the MediaItems.
58+
59+ In Text.Pandoc.Class.IO, rewriting of source paths in `extractMedia` has
60+ been fixed.
61+
62+ In Text.Pandoc.Class.PandocMonad, `fillMediaBag` has been modified so that
63+ it doesn't modify image paths (that was part of the problem in #7345).
64+
65+ We now do path normalization (e.g. `\` separators on Windows) in
66+ writing the media.
67+
68+ * Text.Pandoc.PDF:
69+
70+ + Text.Pandoc.PDF: Fix regression in 2.14 for generation of PDFs with
71+ SVGs (#7344).
72+ + Only print relevant part of environment on `--verbose`. Since
73+ `--verbose` output might be put in an issue, we want to avoid
74+ spilling out secrets in environment variables.
75+
76+ * Markdown reader: fix pipe table regression in 2.11.4 (#7343).
77+ Previously pipe tables with empty headers (that is, a header
78+ line with all empty cells) would be rendered as headerless
79+ tables. This broke in 2.11.4. The fix here is to produce an
80+ AST with an empty table head when a pipe table has all empty
81+ header cells.
82+
83+ * LaTeX reader: don't allow optional `*` on symbol control sequences
84+ (#7340). Generally we allow optional starred variants of LaTeX commands
85+ (since many allow them, and if we don't accept these explicitly,
86+ ignoring the star usually gives acceptable results). But we
87+ don't want to do this for `\(*\)` and similar cases.
88+
89+ * Docx reader: handle absolute URIs in Relationship Target (#7374).
90+
91+ * Docx writer: fix handling of empty table headers (Albert Krewinkel,
92+ #7369). A table header which does not contain any cells is now treated as
93+ an empty header.
94+
95+ * LaTeX writer: Fix regression in table header position (#7347).
96+ In recent versions the table headers were no longer bottom-aligned
97+ (if more than one line). This patch fixes that by using minipages
98+ for table headers in non-simple tables.
99+
100+ * CommonMark writer:
101+
102+ + Do not use simple class for fenced-divs (Jan Tojnar, amends #7242.)
103+ + Do not throw away attributes when `Ext_attributes` is enabled.
104+ `Ext_attributes` covers at least the following:
105+ `Ext_fenced_code_attributes`, `Ext_header_attributes`,
106+ `Ext_inline_code_attributes`, `Ext_link_attributes`.
107+
108+ * Markdown writer:
109+
110+ + Allow `pipe_tables` to be disabled for commonmark formats
111+ (`commonmark_x`, `gfm`) (#7375).
112+ + Re-use functions from Text.Pandoc.Markdown.Inline (Jan Tojnar).
113+
114+ * DocBook writer: Remove non-existent admonitions (Jan Tojnar).
115+ `attention`, `error` and `hint` are reStructuredText specific.
116+
117+ * HTML writer: Don't omit width attribute on div (#7342).
118+
119+ * Text.Pandoc.MIME, `extensionFromMimeType`: add a few special cases.
120+ When we do a reverse lookup in the MIME table, we just get the
121+ last match, so when the same mime type is associated with several
122+ different extensions, we sometimes got weird results, e.g. `.vs`
123+ for `text/plain`. These special cases help us get the most standard
124+ extensions for mime types like `text/plain`.
125+
126+ * Lua utils: fix handling of table headers in `from_simple_table` (Albert
127+ Krewinkel, #7369). Passing an empty list of header cells now results
128+ in an empty table header.
129+
130+ * Text.Pandoc.Citeproc:
131+
132+ + Avoid duplicate classes and attributes on references div.
133+ + Fix regression in citeproc processing (#7376). If inline
134+ references are used (in the metadata `references` field), we
135+ should still only include in the bibliography items that are
136+ actually cited (unless `nocite` is used).
137+
138+ * Require citeproc 0.4.0.1. This fixes a bug which led to doubled
139+ "et al." in some (rare) circumstances.
140+
141+ * MANUAL.txt:
142+
143+ + Mention GladTeX for EPUB export (Sebastian Humenda).
144+ This updates the manual and the web site about the GladTeX usage.
145+ + More details and a useful link for YAML syntax.
146+
147+ * CONTRIBUTING.md: update modules overview (Albert Krewinkel).
148+
149+ * using-the-pandoc-api.md: switch from String to Text (Albert Krewinkel).
150+
151+
152+## pandoc 2.14.0.1 (2021-06-01)
153+
154+ * Commonmark reader: Fix regression in 2.14 with YAML metdata block parsing,
155+ which could cause the document body to be omitted after metadata (#7339).
156+
157+ * HTML reader: fix column width regression in 2.14 (#7334).
158+ Column widths specified with a style attribute were off by a factor of 100.
159+
160+ * Markdown reader: in `rebasePaths`, check for both Windows and Posix
161+ absolute paths. Previously Windows pandoc was treating
162+ `/foo/bar.jpg` as non-absolute.
163+
164+ * Text.Pandoc.Logging: In rendering `LoadedResource`, use relative paths.
165+
166+ * Docx writer: fix regression on captions (#7328). The "Table Caption"
167+ style was no longer getting applied. (It was overwritten by "Compact.")
168+
169+ * Use commonmark-extensions 0.2.1.2
170+
171+## pandoc 2.14 (2021-05-28)
172+
173+ * Change reader types, allowing better tracking of source positions
174+ [API change]. Previously, when multiple file arguments were provided,
175+ pandoc simply concatenated them and passed the contents to the readers,
176+ which took a Text argument. As a result, the readers had no way of knowing
177+ which file was the source of any particular bit of text. This meant that
178+ we couldn't report accurate source positions on errors or include accurate
179+ source positions as attributes in the AST. More seriously, it meant that
180+ we couldn't resolve resource paths relative to the files containing them
181+ (see e.g. #5501, #6632, #6384, #3752).
182+
183+ * Add `rebase_relative_paths` extension (#3752). When enabled, this
184+ extension rewrites relative image and link paths by prepending
185+ the (relative) directory of the containing file. This
186+ behavior is useful when your input sources are split
187+ into multiple files, across several directories, with files
188+ referring to images stored in the same directory. The
189+ extension can be enabled for all markdown and commonmark-based formats.
190+
191+ * Add Text.Pandoc.Sources (exported module), with a `Sources` type and a
192+ `ToSources` class. A `Sources` wraps a list of `(SourcePos, Text)` pairs
193+ [API change]. A parsec `Stream` instance is provided for `Sources`. The
194+ module also exports versions of parsec's `satisfy` and other Char parsers
195+ that track source positions accurately from a `Sources` stream (or any
196+ instance of the new `UpdateSourcePos` class).
197+
198+ * Text.Pandoc.Parsing
199+
200+ + Export the modified Char parsers defined in Text.Pandoc.Sources
201+ instead of the ones parsec provides. Modified parsers to use a
202+ `Sources` as stream [API change].
203+ + Improve include file functions [API change]. Remove old
204+ `insertIncludedFileF`. Give `insertIncludedFile` a more general type,
205+ allowing it to be used where `insertIncludedFileF` was.
206+ + Add parameter to the `citeKey` parser from
207+ Text.Pandoc.Parsing, which controls whether the `@{..}`
208+ syntax is allowed [API change].
209+
210+ * Text.Pandoc.Error: Modified the constructor `PandocParsecError` to take a
211+ `Sources` rather than a `Text` as first argument, so parse error locations
212+ can be accurately reported.
213+
214+ * Fix source position reporting for YAML bibliographies (#7273).
215+
216+ * Issue error message when reader or writer format is malformed
217+ (#7231). Previously we exited with an error status but (due to a bug)
218+ no message.
219+
220+ * Smarter smart quotes (#7216, #2103). Treat a leading `"` with no
221+ closing `"` as a left curly quote. This supports the practice, in
222+ fiction, of continuing paragraphs quoting the same speaker without an
223+ end quote. It also helps with quotes that break over lines in line blocks.
224+
225+ * Markdown reader:
226+
227+ + Use MetaInlines not MetaBlocks for multimarkdown metadata fields.
228+ This gives better results in converting to e.g. pandoc markdown.
229+ + Implement curly-brace syntax for Markdown citation keys (#6026).
230+ The change provides a way to use citation keys that contain
231+ special characters not usable with the standard citation key syntax.
232+ Example: `@{foo_bar{x}'}` for the key `foo_bar{x}`. It also allows
233+ separating citation keys from immediately following text, e.g. `@{foo}A`.
234+
235+ * RST reader:
236+
237+ + Seek include files in the directory of the file
238+ containing the include directive, as RST requires (#6632).
239+ + Use `insertIncludedFile` from Text.Pandoc.Parsing
240+ instead of reproducing much of its code.
241+
242+ * Org reader: Resolve org includes relative to the directory containing the
243+ file containing the INCLUDE directive (#5501).
244+
245+ * ODT reader: Treat tabs as spaces (#7185, niszet).
246+
247+ * Docx reader:
248+
249+ + Add handling of vml image objects (#7257, mbrackeantidot).
250+ + Support new table features (Emily Bourke, #6316): column
251+ spans, row spans, multiple header rows, table description
252+ (parsed as a simple caption), captions, column widths.
253+
254+ * LaTeX reader:
255+
256+ + Improved siunitx support (#6658, #6620).
257+ + Better support for `\xspace` (#7299).
258+ + Improve parsing of `\def` macros. We previously set "verbatim mode"
259+ even for parsing the initial `\def`; this caused problems
260+ for `\def` nested inside another `\def`.
261+ + Implement `\newif`.
262+
263+ * ConTeXt writer: improve ordered lists (#5016, Denis Maier).
264+ Change ordered list from itemize to enumerate. Add new
265+ itemgroup for ordered lists. Remove manual insertion of
266+ width attributes. Use tabular figures in ordered list
267+ enumerators.
268+
269+ * HTML reader:
270+
271+ + Don't fail on unmatched closing "script" tag (Albert Krenkel, #7282).
272+ + Keep h1 tags as normal headers (#2293, Albert Krewinkel).
273+ The tags `<title>` and `<h1 class="title">` often contain the same
274+ information, so the latter was dropped from the document. However, as
275+ this can lead to loss of information, the heading is now always
276+ retained. Use `--shift-heading-level-by=-1` to turn the `<h1>`
277+ into the document title, or a filter to restore the previous behavior.
278+ + Handle relative lengths (e.g. `2*`) in HTML column widths (#4063).
279+ See <https://www.w3.org/TR/html4/types.html#h-6.6>.
280+
281+ * DocBook/JATS readers:
282+
283+ + Fix mathml regression caused by the switch in XML libraries (#7173).
284+ + Fix "phrase" in DocBook: take classes from "role" not "class" (#7195).
285+
286+ * DocBook reader: ensure that first and last names are separated (#6541).
287+
288+ * Jira reader (Albert Krewinkel, #7218):
289+
290+ + Support "smart" links: `[alias|https://example.com|smart-card]` syntax.
291+ + Allow spaces and most unicode characters in attachment links.
292+ + No longer require a newline character after `{noformat}`.
293+ + Only allow URI path segment characters in bare links.
294+ + The `file:` schema is no longer allowed in bare links; these
295+ rarely make sense.
296+
297+ * Plain writer: handle superscript unicode minus (#7276).
298+
299+ * LaTeX writer:
300+
301+ + Better handling of line breaks in simple tables (#7272).
302+ Now we also handle the case where they're embedded in other elements,
303+ e.g. spans.
304+ + For beamer output, support `exampleblock` and `alertblock` (#7278).
305+ A block will be rendered as an `exampleblock` if the heading
306+ has class `example` and an `alertblock` if it has class `alert`.
307+ + Separate successive quote chars with thin space (#6958,
308+ Albert Krewinkel). Successive quote characters are separated with
309+ a thin space to improve readability and to prevent unwanted ligatures.
310+ Detection of these quotes sometimes had failed if the second quote
311+ was nested in a span element.
312+ + Separate successive quote chars with thin space (#6958, Albert
313+ Krewinkel).
314+
315+ * EPUB Writer: Fix belongs-to-collection XML id choice (#7267, nuew).
316+ The epub writer previously used the same XML id for both the book
317+ identifier and the epub collection. This causes an error on epubcheck.
318+
319+ * BibTeX/BibLaTeX writer: Handle `annote` field (#7266).
320+
321+ * ZimWiki writer: allow links and emphasis in headers (#6605,
322+ Albert Krewinkel).
323+
324+ * ConTeXt writer:
325+
326+ + Support blank lines in line blocks (#6564, Albert Krewinkel,
327+ thanks to @denismaier).
328+ + Use span identifiers as reference anchors (#7246, Albert Krewinkel).
329+
330+ * HTML writer:
331+
332+ + Keep attributes from code nested below `pre` tag (#7221,
333+ Albert Krewinkel). If a code block is defined with `<pre><code
334+ class="language-x">…</code></pre>`, where the `<pre>` element has no
335+ attributes, then the attributes from the `<code>` element are used
336+ instead. Any leading `language-` prefix is dropped in the code's
337+ `class` attribute are dropped to improve syntax highlighting.
338+ + Ensure headings only have valid attribs in HTML4 (#5944, Albert
339+ Krewinkel).
340+ + Parse `<header>` as a Div (Albert Krewinkel).
341+
342+ * Org writer:
343+
344+ + Inline latex envs need newlines (#7252, tecosaur).
345+ As specified in https://orgmode.org/manual/LaTeX-fragments.html, an
346+ inline \begin{}...\end{} LaTeX block must start on a new line.
347+ + Use LaTeX style maths deliminators (#7196, tecosaur).
348+
349+ * JATS writer (Albert Krewinkel):
350+
351+ + Use either styled-content or named-content for spans (#7211).
352+ If the element has a content-type attribute, or at least one class,
353+ then that value is used as `content-type` and the span is put inside
354+ a `<named-content>` element. Otherwise a `<styled-content>` element
355+ is used instead.
356+ + Reduce unnecessary use of `<p>` elements for wrapping (#7227).
357+ The `<p>` element is used for wrapping in cases were the contents
358+ would otherwise not be allowed in a certain context. Unnecessary
359+ wrapping is avoided, especially around quotes (`<disp-quote>` elements).
360+ + Convert spans to `<named-content>` elements (#7211). Spans with
361+ attributes are converted to `<named-content>` elements instead of
362+ being wrapped with `<milestone-start/>` and `<milestone-end>`
363+ elements. Milestone elements are not allowed in documents using the
364+ articleauthoring tag set, so this change ensures the creation of valid
365+ documents.
366+ + Add footnote number as label in backmatter (#7210). Footnotes in the
367+ backmatter are given the footnote's number as a label. The
368+ articleauthoring output is unaffected from this change, as footnotes
369+ are placed inline there.
370+ + Escape disallows chars in identifiers. XML identifiers must start
371+ with an underscore or letter, and can contain only a limited set
372+ of punctuation characters. Any IDs not adhering to these rules are
373+ rewritten by writing the offending characters as `Uxxxx`,
374+ where `xxxx` is the character's hex code.
375+
376+ * Jira writer: use `{color}` when span has a color attribute
377+ (Albert Krewinkel, tarleb/jira-wiki-markup#10).
378+
379+ * Docx writer:
380+
381+ + Autoset table width if no column has an explicit width (Albert
382+ Krewinkel).
383+ + Extract Table handling into separate module (Albert Krewinkel).
384+ + Support colspans and rowspans in tables (Albert Krewinkel, #6315).
385+ + Support multirow table headers (Albert Krewinkel).
386+ + Improve integration of settings from reference.docx (#1209).
387+ This change allows users to create a reference.docx that
388+ sets `w:proofState` for spelling or grammar to `dirty`,
389+ so that spell/grammar checking will be triggered on the
390+ generated docx.
391+ + Copy over more settings from reference.docx (#7240). From settings.xml
392+ in the reference-doc, we now include: `zoom`, `embedSystemFonts`,
393+ `doNotTrackMoves`, `defaultTabStop`, `drawingGridHorizontalSpacing`,
394+ `drawingGridVerticalSpacing`, `displayHorizontalDrawingGridEvery`,
395+ `displayVerticalDrawingGridEvery`, `characterSpacingControl`,
396+ `savePreviewPicture`, `mathPr`, `themeFontLang`, `decimalSymbol`,
397+ `listSeparator`, `autoHyphenation`, `compat`.
398+ + Set zoom to 100% by default in settings.xml.
399+ + Align math options more with current Word defaults (e.g. Cambria Math
400+ font).
401+ + Remove `rsid`s from default settings.xml. Word will add these
402+ when revisions are made.
403+
404+ * Ms writer: Handle tables with multiple paragraphs (#7288).
405+ Previously they overflowed the table cell width. We now set line lengths
406+ per-cell and restore them after the table has been written.
407+
408+ * Markdown writer:
409+
410+ + Use cleaner braceless syntax for code blocks with a
411+ single class (#7242, Jan Tojnar).
412+ + Add quotes properly in markdown YAML metadata fields (#7245).
413+ This fixes a bug, which caused the writer to look at the *last*
414+ rather than the *first* character in determining whether quotes
415+ were needed. So we got spurious quotes in some cases and
416+ didn't get necessary quotes in others.
417+ + Use `@{..}` syntax for citations when needed.
418+ + Use fewer unneeded escapes for `#` (see #6259).
419+ + Improve escaping of `@`. We need to escape literal `@` before
420+ `{` because of the new citation syntax.
421+
422+ * Commonmark writer: Use backslash escapes for `<` and `|`...
423+ instead of entities (#7208).
424+
425+ * Powerpoint writer: allow `monofont` to be specified in metadata
426+ (#7187).
427+
428+ * LaTeX template:
429+
430+ + Use non-starred names for xcolor color names (#6109).
431+ This should make svgnames and x11names work properly.
432+ + Fix bad vertical spacing after bibliography (#7234, badumont).
433+ + List of figures before list of tables (#7235, Julien Dutant).
434+ + Move CSL macro definitions before header-includes so they can be
435+ overridden (#7286).
436+ + Improve treatment of CSL `entry-spacing` (#7296).
437+ Previously with the default template settings (`indent` variable
438+ not set), we would get interparagraph spaces separating bib
439+ entries even with `entry-spacing="0"`. On the other hand,
440+ setting `entry-spacing="2"` gave ridiculously large spacing.
441+ This change makes the spacing caused by `entry-spacing` a multiple
442+ of `\parskip` by default, which gives aesthetically reasonable
443+ output. Those who want a larger or smaller unit (e.g. because
444+ they use `indent` which sets `\parskip` to 0) may
445+ `\setlength{\cslentryspacingunit}{10pt}` in header-includes
446+ to override the defaults.
447+ + Move title, author, date up to top of preamble (#7295).
448+ This allows header-includes to use them, and puts them
449+ in a position where you can see them immediately.
450+ + Define commands for zero width non-joiner character
451+ (#6639, Albert Krewinkel). The zero-width non-joiner character
452+ is used to avoid ligatures (e.g. in German).
453+
454+ * ConTeXt template:
455+
456+ + Define `enumerate` itemgroup (#5016, Denis Maier).
457+ + List of figures before list of tables (#7235, Julien Dutant).
458+
459+ * reveal.js template:
460+
461+ + Support `toc-title` (#7171, Florian Kohrt).
462+ + Use `hash: true` by default rather than `history: true` (#6968).
463+
464+ * HTML-based slide shows: add support for `institute` (#7289, Thomas
465+ Hodgson).
466+
467+ * Text.Pandoc.Extensions: Add constructor `Ext_rebase_relative_paths` to
468+ `Extensions` [API change].
469+
470+ * Text.Pandoc.XML.Light: add Eq, Ord instances for Content,
471+ Element, Attr, CDataKind [API change].
472+
473+ * Text.Pandoc.MediaBag:
474+
475+ + Change type to use a `Text` key instead of `[FilePath]`.
476+ We normalize the path and use `/` separators for consistency.
477+ + Export `MediaItem` type [API change].
478+ + Change `MediaBag` type to a map from Text to MediaItem [API change].
479+ + `lookupMedia` now returns a `MediaItem` [API change].
480+ + Change `insertMedia` so it sets the `mediaPath` to a filename based on
481+ the SHA1 hash of the contents. This will be used when contents
482+ are extracted.
483+
484+ * Text.Pandoc.Class.PandocMonad:
485+
486+ + Remove `fetchMediaResource` [API change]. Use `fetchItem` to get
487+ resources in `fillMediaBag`.
488+ + Add informational message in `downloadOrRead` indicating what path
489+ local resources have been loaded from.
490+
491+ * Text.Pandoc.Logging:
492+
493+ + Remove single quotes around paths in messages.
494+ + Add LoadedResource constructor to LogMessage [API change].
495+ This is for INFO-level messages telling where image data has been
496+ loaded from. (This can vary because of the resource path.)
497+
498+ * Text.Pandoc.Asciify: simplify code and export `toAsciiText` [API change].
499+ Instead of encoding a giant (and incomplete) map, we now
500+ just use unicode-transforms to normalize the text to
501+ a canonical decomposition, and manipulate the result.
502+
503+ * App: allow tabs expansion even if file-scope is used (Albert Krewinkel,
504+ #6709). Tabs in plain-text inputs are now handled correctly, even if
505+ the `--file-scope` flag is used.
506+
507+ * Add new internal module Text.Pandoc.Writers.GridTable (Albert Krewinkel).
508+
509+ * Text.Pandoc.Highlighting: Change type of `languagesByExtension`, adding
510+ a parameter for a `SyntaxMap` [API change] (Jan Tojnar, #7241).
511+ Languages defined using `--syntax-definition` were not recognized by
512+ `languagesByExtension`. This patch corrects that, allowing the writers
513+ to see all custom definitions. The LaTeX writer still uses the default
514+ syntax map, but that's okay in that context, since
515+ `--syntax-definition` won't create new listings styles.
516+
517+ * Text.Pandoc.Citeproc:
518+
519+ + Ensure that CSL-related attributes are passed on to a Div with id
520+ 'refs'. Otherwise things like `entry-spacing` won't work when
521+ such Divs are used.
522+ + Use metadata's `lang` for the lang parameter of citeproc, overriding
523+ `localeLanguage`.
524+ + Recognize locators spelled with a capital letter (#7323).
525+ + Add a comma and a space in front of the suffix if it doesn't start
526+ with space or punctuation (#7324).
527+ + Don't detect math elements as locators (#7321).
528+
529+ * Remove Text.Pandoc.BCP47 module [API change]. Use types and functions
530+ from UnicodeCollation.Lang instead. This is a richer implementation
531+ of BCP 47.
532+
533+ * Text.Pandoc.Shared:
534+
535+ + Fix regression in grid tables for wide characters (#7214).
536+ In the translation from String to Text, a char-width-sensitive
537+ `splitAt'` was dropped. This commit reinstates it and uses it to make
538+ `splitTextByInstances` char-width sensitive.
539+ + Add `getLang` (formerly in the now-removed BCP47) [API change].
540+
541+ * Text.Pandoc.SelfContained: use `application/octet-stream`
542+ for unknown mime types instead of halting with an error (#7202).
543+
544+ * Lua filters: respect Inlines/Blocks filter functions in `pandoc.walk_*`
545+ (Albert Krewinkel).
546+
547+ * Add text as build-depend for trypandoc (#7193, Roman Beránek).
548+
549+ * Bump upper-bounds for network-uri, time, attoparsec.
550+
551+ * Use citeproc 0.4.
552+
553+ * Use texmath 0.12.3.
554+
555+ * Use jira-wiki-markup 1.3.5 (Albert Krewinkel).
556+
557+ * Require latest skylighting (fixes a bug in XML syntax highlighting).
558+
559+ * Use latest xml-conduit.
560+
561+ * Use latest commonmark, commonmark-extensions, commonmark-pandoc.
562+
563+ * Use haddock-library-1.10.0 (Albert Krewinkel).
564+
565+ * Allow compilation with base 4.15 (Albert Krewinkel).
566+
567+ * MANUAL:
568+
569+ + Add information about `lang` and bibliography sorting.
570+ + Add info about YAML escape sequences, link to spec (#7152,
571+ Albert Krewinkel).
572+ + Note that `institute` variable works for HTML-based slides.
573+ + Update documentation on citation syntax.
574+ + Add citation example for locators and suffixes (Tristan Stenner)
575+
576+ * Updated and fixed typos in documentation (Charanjit Singh,
577+ Anti-Distinctlyminty, Tatiana Porras, obcat).
578+
579+ * Add instructions for installing pandoc-types before compiling filter.
580+
581+ * INSTALL: add note that parallel installations should be avoided
582+ (#6865).
583+
584+ * Remove `biblatex-nussbaum.md` test. It is basically the same
585+ as `biblaetx-quotes.md`.
586+
587+ * Command tests: fail if a file contains no tests---and fix a
588+ test that failed in that way!
589+
590+ * Use smaller images in tests, reducing the size of the source tarball by 8 MB.
591+
592+
3## pandoc 2.13 (2021-03-21)
593## pandoc 2.13 (2021-03-21)
4
594
5 * Support `yaml_metadata_block` extension for `commonmark`, `gfm` (#6537).
595 * Support `yaml_metadata_block` extension for `commonmark`, `gfm` (#6537).
data/docx/word/settings.xml+6−16
@@ -1,6 +1,6 @@
1<?xml version="1.0" encoding="UTF-8"?>
1<?xml version="1.0" encoding="UTF-8"?>
2<w:settings xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:sl="http://schemas.openxmlformats.org/schemaLibrary/2006/main">
2<w:settings xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:sl="http://schemas.openxmlformats.org/schemaLibrary/2006/main">
3− <w:zoom w:percent="90" />
3+ <w:zoom w:percent="100" />
4 <w:embedSystemFonts />
4 <w:embedSystemFonts />
5 <w:proofState w:spelling="clean" w:grammar="clean" />
5 <w:proofState w:spelling="clean" w:grammar="clean" />
6 <w:stylePaneFormatFilter w:val="0004" />
6 <w:stylePaneFormatFilter w:val="0004" />
@@ -17,31 +17,21 @@
17 <w:characterSpacingControl w:val="doNotCompress" />
17 <w:characterSpacingControl w:val="doNotCompress" />
18 <w:savePreviewPicture />
18 <w:savePreviewPicture />
19 <w:rsids>
19 <w:rsids>
20− <w:rsidRoot w:val="00590D07" />
21− <w:rsid w:val="00011C8B" />
22− <w:rsid w:val="004E29B3" />
23− <w:rsid w:val="00590D07" />
24− <w:rsid w:val="00784D58" />
25− <w:rsid w:val="008D6863" />
26− <w:rsid w:val="00B86B75" />
27− <w:rsid w:val="00BC48D5" />
28− <w:rsid w:val="00C36279" />
29− <w:rsid w:val="00E315A3" />
30 </w:rsids>
20 </w:rsids>
31 <m:mathPr>
21 <m:mathPr>
32− <m:mathFont m:val="Lucida Grande" />
22+ <m:mathFont m:val="Cambria Math" />
33 <m:brkBin m:val="before" />
23 <m:brkBin m:val="before" />
34 <m:brkBinSub m:val="--" />
24 <m:brkBinSub m:val="--" />
35− <m:smallFrac m:val="false" />
25+ <m:smallFrac m:val="0" />
36− <m:dispDef m:val="false" />
26+ <m:dispDef />
37 <m:lMargin m:val="0" />
27 <m:lMargin m:val="0" />
38 <m:rMargin m:val="0" />
28 <m:rMargin m:val="0" />
39 <m:wrapRight />
29 <m:wrapRight />
40 <m:intLim m:val="subSup" />
30 <m:intLim m:val="subSup" />
41− <m:naryLim m:val="subSup" />
31+ <m:naryLim m:val="undOvr" />
42 </m:mathPr>
32 </m:mathPr>
43 <w:themeFontLang w:val="en-US" />
33 <w:themeFontLang w:val="en-US" />
44 <w:clrSchemeMapping w:bg1="light1" w:t1="dark1" w:bg2="light2" w:t2="dark2" w:accent1="accent1" w:accent2="accent2" w:accent3="accent3" w:accent4="accent4" w:accent5="accent5" w:accent6="accent6" w:hyperlink="hyperlink" w:followedHyperlink="followedHyperlink" />
34 <w:clrSchemeMapping w:bg1="light1" w:t1="dark1" w:bg2="light2" w:t2="dark2" w:accent1="accent1" w:accent2="accent2" w:accent3="accent3" w:accent4="accent4" w:accent5="accent5" w:accent6="accent6" w:hyperlink="hyperlink" w:followedHyperlink="followedHyperlink" />
45 <w:decimalSymbol w:val="." />
35 <w:decimalSymbol w:val="." />
46 <w:listSeparator w:val="," />
36 <w:listSeparator w:val="," />
47−</w:settings>
37+</w:settings>
data/templates/default.context+4
@@ -51,6 +51,7 @@ $endif$
51
51
52% use microtypography
52% use microtypography
53\definefontfeature[default][default][script=latn, protrusion=quality, expansion=quality, itlc=yes, textitalics=yes, onum=yes, pnum=yes]
53\definefontfeature[default][default][script=latn, protrusion=quality, expansion=quality, itlc=yes, textitalics=yes, onum=yes, pnum=yes]
54+\definefontfeature[default:tnum][default][tnum=yes, pnum=no]
54\definefontfeature[smallcaps][script=latn, protrusion=quality, expansion=quality, smcp=yes, onum=yes, pnum=yes]
55\definefontfeature[smallcaps][script=latn, protrusion=quality, expansion=quality, smcp=yes, onum=yes, pnum=yes]
55\setupalign[hz,hanging]
56\setupalign[hz,hanging]
56\setupitaliccorrection[global, always]
57\setupitaliccorrection[global, always]
@@ -97,6 +98,9 @@ $endif$
97\setupitemize[autointro] % prevent orphan list intro
98\setupitemize[autointro] % prevent orphan list intro
98\setupitemize[indentnext=no]
99\setupitemize[indentnext=no]
99
100
101+\defineitemgroup[enumerate]
102+\setupenumerate[each][fit][itemalign=left,distance=.5em,style={\feature[+][default:tnum]}]
103+
100\setupfloat[figure][default={here,nonumber}]
104\setupfloat[figure][default={here,nonumber}]
101\setupfloat[table][default={here,nonumber}]
105\setupfloat[table][default={here,nonumber}]
102
106
data/templates/default.dzslides+1−1
@@ -171,7 +171,7 @@ $if(subtitle)$
171 <h1 class="subtitle">$subtitle$</h1>
171 <h1 class="subtitle">$subtitle$</h1>
172$endif$
172$endif$
173 <footer>
173 <footer>
174− $if(author)$<span class="author">$for(author)$$author$$sep$, $endfor$</span>$endif$ · $if(date)$<span class="date">$date$</span>$endif$
174+ $if(author)$<span class="author">$for(author)$$author$$sep$, $endfor$</span> · $endif$$if(institute)$<span class="institute">$for(institute)$$institute$$sep$, $endfor$</span> · $endif$$if(date)$<span class="date">$date$</span>$endif$
175 </footer>
175 </footer>
176</section>
176</section>
177$endif$
177$endif$
data/templates/default.latex+44−25
@@ -156,6 +156,25 @@ $if(CJKmainfont)$
156 \fi
156 \fi
157$endif$
157$endif$
158\fi
158\fi
159+$if(zero-width-non-joiner)$
160+%% Support for zero-width non-joiner characters.
161+\makeatletter
162+\def\zerowidthnonjoiner{%
163+ % Prevent ligatures and adjust kerning, but still support hyphenating.
164+ \texorpdfstring{%
165+ \textormath{\nobreak\discretionary{-}{}{\kern.03em}%
166+ \ifvmode\else\nobreak\hskip\z@skip\fi}{}%
167+ }{}%
168+}
169+\makeatother
170+\ifPDFTeX
171+ \DeclareUnicodeCharacter{200C}{\zerowidthnonjoiner}
172+\else
173+ \catcode`^^^^200c=\active
174+ \protected\def ^^^^200c{\zerowidthnonjoiner}
175+\fi
176+%% End of ZWNJ support
177+$endif$
159$if(beamer)$
178$if(beamer)$
160$if(theme)$
179$if(theme)$
161\usetheme[$for(themeoptions)$$themeoptions$$sep$,$endfor$]{$theme$}
180\usetheme[$for(themeoptions)$$themeoptions$$sep$,$endfor$]{$theme$}
@@ -325,6 +344,31 @@ $endif$
325$if(pagestyle)$
344$if(pagestyle)$
326\pagestyle{$pagestyle$}
345\pagestyle{$pagestyle$}
327$endif$
346$endif$
347+$if(csl-refs)$
348+\newlength{\cslhangindent}
349+\setlength{\cslhangindent}{1.5em}
350+\newlength{\csllabelwidth}
351+\setlength{\csllabelwidth}{3em}
352+\newlength{\cslentryspacingunit} % times entry-spacing
353+\setlength{\cslentryspacingunit}{\parskip}
354+\newenvironment{CSLReferences}[2] % #1 hanging-ident, #2 entry spacing
355+ {% don't indent paragraphs
356+ \setlength{\parindent}{0pt}
357+ % turn on hanging indent if param 1 is 1
358+ \ifodd #1
359+ \let\oldpar\par
360+ \def\par{\hangindent=\cslhangindent\oldpar}
361+ \fi
362+ % set entry spacing
363+ \setlength{\parskip}{#2\cslentryspacingunit}
364+ }%
365+ {}
366+\usepackage{calc}
367+\newcommand{\CSLBlock}[1]{#1\hfill\break}
368+\newcommand{\CSLLeftMargin}[1]{\parbox[t]{\csllabelwidth}{#1}}
369+\newcommand{\CSLRightInline}[1]{\parbox[t]{\linewidth - \csllabelwidth}{#1}\break}
370+\newcommand{\CSLIndent}[1]{\hspace{\cslhangindent}#1}
371+$endif$
328$for(header-includes)$
372$for(header-includes)$
329$header-includes$
373$header-includes$
330$endfor$
374$endfor$
@@ -375,31 +419,6 @@ $endif$
375$if(nocite-ids)$
419$if(nocite-ids)$
376\nocite{$for(nocite-ids)$$it$$sep$, $endfor$}
420\nocite{$for(nocite-ids)$$it$$sep$, $endfor$}
377$endif$
421$endif$
378−$if(csl-refs)$
379−\newlength{\cslhangindent}
380−\setlength{\cslhangindent}{1.5em}
381−\newlength{\csllabelwidth}
382−\setlength{\csllabelwidth}{3em}
383−\newenvironment{CSLReferences}[2] % #1 hanging-ident, #2 entry spacing
384− {% don't indent paragraphs
385− \setlength{\parindent}{0pt}
386− % turn on hanging indent if param 1 is 1
387− \ifodd #1
388− \let\oldpar\par
389− \def\par{\hangindent=\cslhangindent\oldpar}
390− \fi
391− % set entry spacing
392− \ifnum #2 > 0
393− \setlength{\parskip}{#2\baselineskip}
394− \fi
395− }%
396− {}
397−\usepackage{calc}
398−\newcommand{\CSLBlock}[1]{#1\hfill\break}
399−\newcommand{\CSLLeftMargin}[1]{\parbox[t]{\csllabelwidth}{#1}}
400−\newcommand{\CSLRightInline}[1]{\parbox[t]{\linewidth - \csllabelwidth}{#1}\break}
401−\newcommand{\CSLIndent}[1]{\hspace{\cslhangindent}#1}
402−$endif$
403$if(csquotes)$
422$if(csquotes)$
404\usepackage{csquotes}
423\usepackage{csquotes}
405$endif$
424$endif$
data/templates/default.revealjs+73−128
@@ -52,6 +52,9 @@ $endif$
52$for(author)$
52$for(author)$
53 <p class="author">$author$</p>
53 <p class="author">$author$</p>
54$endfor$
54$endfor$
55+$for(institute)$
56+ <p class="institute">$institute$</p>
57+$endfor$
55$if(date)$
58$if(date)$
56 <p class="date">$date$</p>
59 <p class="date">$date$</p>
57$endif$
60$endif$
@@ -87,256 +90,198 @@ $endif$
87 // Full list of configuration options available at:
90 // Full list of configuration options available at:
88 // https://revealjs.com/config/
91 // https://revealjs.com/config/
89 Reveal.initialize({
92 Reveal.initialize({
90−$if(center)$
91− // Determines whether slide content should be vertically centered
92− center: $center$,
93−$endif$
94−$if(controls)$
95 // Display controls in the bottom right corner
93 // Display controls in the bottom right corner
96 controls: $controls$,
94 controls: $controls$,
97−$endif$
95+
98−$if(controlsTutorial)$
99 // Help the user learn the controls by providing hints, for example by
96 // Help the user learn the controls by providing hints, for example by
100 // bouncing the down arrow when they first encounter a vertical slide
97 // bouncing the down arrow when they first encounter a vertical slide
101 controlsTutorial: $controlsTutorial$,
98 controlsTutorial: $controlsTutorial$,
102−$endif$
99+
103−$if(controlsLayout)$
104 // Determines where controls appear, "edges" or "bottom-right"
100 // Determines where controls appear, "edges" or "bottom-right"
105 controlsLayout: '$controlsLayout$',
101 controlsLayout: '$controlsLayout$',
106−$endif$
102+
107−$if(controlsBackArrows)$
108 // Visibility rule for backwards navigation arrows; "faded", "hidden"
103 // Visibility rule for backwards navigation arrows; "faded", "hidden"
109 // or "visible"
104 // or "visible"
110 controlsBackArrows: '$controlsBackArrows$',
105 controlsBackArrows: '$controlsBackArrows$',
111−$endif$
106+
112−$if(progress)$
113 // Display a presentation progress bar
107 // Display a presentation progress bar
114 progress: $progress$,
108 progress: $progress$,
115−$endif$
109+
116−$if(slideNumber)$
117 // Display the page number of the current slide
110 // Display the page number of the current slide
118 slideNumber: $slideNumber$,
111 slideNumber: $slideNumber$,
119−$endif$
112+
120−$if(showSlideNumber)$
121 // 'all', 'print', or 'speaker'
113 // 'all', 'print', or 'speaker'
122 showSlideNumber: '$showSlideNumber$',
114 showSlideNumber: '$showSlideNumber$',
123−$endif$
115+
124−$if(hash)$
125 // Add the current slide number to the URL hash so that reloading the
116 // Add the current slide number to the URL hash so that reloading the
126 // page/copying the URL will return you to the same slide
117 // page/copying the URL will return you to the same slide
127 hash: $hash$,
118 hash: $hash$,
128−$endif$
119+
129−$if(hashOneBasedIndex)$
130 // Start with 1 for the hash rather than 0
120 // Start with 1 for the hash rather than 0
131 hashOneBasedIndex: $hashOneBasedIndex$,
121 hashOneBasedIndex: $hashOneBasedIndex$,
132−$endif$
122+
123+ // Flags if we should monitor the hash and change slides accordingly
124+ respondToHashChanges: $respondToHashChanges$,
125+
133 // Push each slide change to the browser history
126 // Push each slide change to the browser history
134− history: $if(history)$$history$$else$true$endif$,
127+ history: $history$,
135−$if(keyboard)$
128+
136 // Enable keyboard shortcuts for navigation
129 // Enable keyboard shortcuts for navigation
137 keyboard: $keyboard$,
130 keyboard: $keyboard$,
138−$endif$
131+
139−$if(overview)$
140 // Enable the slide overview mode
132 // Enable the slide overview mode
141 overview: $overview$,
133 overview: $overview$,
142−$endif$
134+
143−$if(center)$
135+ // Disables the default reveal.js slide layout (scaling and centering)
136+ // so that you can use custom CSS layout
137+ disableLayout: false,
138+
144 // Vertical centering of slides
139 // Vertical centering of slides
145 center: $center$,
140 center: $center$,
146−$endif$
141+
147−$if(touch)$
148 // Enables touch navigation on devices with touch input
142 // Enables touch navigation on devices with touch input
149 touch: $touch$,
143 touch: $touch$,
150−$endif$
144+
151−$if(loop)$
152 // Loop the presentation
145 // Loop the presentation
153 loop: $loop$,
146 loop: $loop$,
154−$endif$
147+
155−$if(rtl)$
156 // Change the presentation direction to be RTL
148 // Change the presentation direction to be RTL
157 rtl: $rtl$,
149 rtl: $rtl$,
158−$endif$
150+
159−$if(navigationMode)$
160 // see https://revealjs.com/vertical-slides/#navigation-mode
151 // see https://revealjs.com/vertical-slides/#navigation-mode
161 navigationMode: '$navigationMode$',
152 navigationMode: '$navigationMode$',
162−$endif$
153+
163−$if(shuffle)$
164 // Randomizes the order of slides each time the presentation loads
154 // Randomizes the order of slides each time the presentation loads
165 shuffle: $shuffle$,
155 shuffle: $shuffle$,
166−$endif$
156+
167−$if(fragments)$
168 // Turns fragments on and off globally
157 // Turns fragments on and off globally
169 fragments: $fragments$,
158 fragments: $fragments$,
170−$endif$
159+
171−$if(fragmentInURL)$
172 // Flags whether to include the current fragment in the URL,
160 // Flags whether to include the current fragment in the URL,
173 // so that reloading brings you to the same fragment position
161 // so that reloading brings you to the same fragment position
174 fragmentInURL: $fragmentInURL$,
162 fragmentInURL: $fragmentInURL$,
175−$endif$
163+
176−$if(embedded)$
177 // Flags if the presentation is running in an embedded mode,
164 // Flags if the presentation is running in an embedded mode,
178 // i.e. contained within a limited portion of the screen
165 // i.e. contained within a limited portion of the screen
179 embedded: $embedded$,
166 embedded: $embedded$,
180−$endif$
167+
181−$if(help)$
182 // Flags if we should show a help overlay when the questionmark
168 // Flags if we should show a help overlay when the questionmark
183 // key is pressed
169 // key is pressed
184 help: $help$,
170 help: $help$,
185−$endif$
171+
186−$if(pause)$
187− // Flags if it should be possible to pause the presentation (blackout)
172+ // Flags if it should be possible to pause the presentation (blackout)
188− pause: $pause$,
173+ pause: $pause$,
189−$endif$
174+
190−$if(showNotes)$
191 // Flags if speaker notes should be visible to all viewers
175 // Flags if speaker notes should be visible to all viewers
192 showNotes: $showNotes$,
176 showNotes: $showNotes$,
193−$endif$
177+
194−$if(autoPlayMedia)$
195− // Global override for autoplaying embedded media (video/audio/iframe)
178+ // Global override for autoplaying embedded media (null/true/false)
196− // - null: Media will only autoplay if data-autoplay is present
197− // - true: All media will autoplay, regardless of individual setting
198− // - false: No media will autoplay, regardless of individual setting
199 autoPlayMedia: $autoPlayMedia$,
179 autoPlayMedia: $autoPlayMedia$,
200−$endif$
180+
201−$if(preloadIframes)$
202− // Global override for preloading lazy-loaded iframes
181+ // Global override for preloading lazy-loaded iframes (null/true/false)
203− // - null: Iframes with data-src AND data-preload will be loaded when within
204− // the viewDistance, iframes with only data-src will be loaded when visible
205− // - true: All iframes with data-src will be loaded when within the viewDistance
206− // - false: All iframes with data-src will be loaded only when visible
207 preloadIframes: $preloadIframes$,
182 preloadIframes: $preloadIframes$,
208−$endif$
183+
209−$if(autoSlide)$
210 // Number of milliseconds between automatically proceeding to the
184 // Number of milliseconds between automatically proceeding to the
211 // next slide, disabled when set to 0, this value can be overwritten
185 // next slide, disabled when set to 0, this value can be overwritten
212 // by using a data-autoslide attribute on your slides
186 // by using a data-autoslide attribute on your slides
213 autoSlide: $autoSlide$,
187 autoSlide: $autoSlide$,
214−$endif$
188+
215−$if(autoSlideStoppable)$
216 // Stop auto-sliding after user input
189 // Stop auto-sliding after user input
217 autoSlideStoppable: $autoSlideStoppable$,
190 autoSlideStoppable: $autoSlideStoppable$,
218−$endif$
191+
219−$if(autoSlideMethod)$
220 // Use this method for navigation when auto-sliding
192 // Use this method for navigation when auto-sliding
221 autoSlideMethod: $autoSlideMethod$,
193 autoSlideMethod: $autoSlideMethod$,
222−$endif$
194+
223−$if(defaultTiming)$
224 // Specify the average time in seconds that you think you will spend
195 // Specify the average time in seconds that you think you will spend
225 // presenting each slide. This is used to show a pacing timer in the
196 // presenting each slide. This is used to show a pacing timer in the
226 // speaker view
197 // speaker view
227 defaultTiming: $defaultTiming$,
198 defaultTiming: $defaultTiming$,
228−$endif$
199+
229−$if(totalTime)$
230− // Specify the total time in seconds that is available to
231− // present. If this is set to a nonzero value, the pacing
232− // timer will work out the time available for each slide,
233− // instead of using the defaultTiming value
234− totalTime: $totalTime$,
235−$endif$
236−$if(minimumTimePerSlide)$
237− // Specify the minimum amount of time you want to allot to
238− // each slide, if using the totalTime calculation method. If
239− // the automated time allocation causes slide pacing to fall
240− // below this threshold, then you will see an alert in the
241− // speaker notes window
242− minimumTimePerSlide: $minimumTimePerSlide$,
243−$endif$
244−$if(mouseWheel)$
245 // Enable slide navigation via mouse wheel
200 // Enable slide navigation via mouse wheel
246 mouseWheel: $mouseWheel$,
201 mouseWheel: $mouseWheel$,
247−$endif$
202+
248−$if(rollingLinks)$
203+ // The display mode that will be used to show slides
249− // Apply a 3D roll to links on hover
204+ display: '$display$',
250− rollingLinks: $rollingLinks$,
205+
251−$endif$
252−$if(hideInactiveCursor)$
253 // Hide cursor if inactive
206 // Hide cursor if inactive
254 hideInactiveCursor: $hideInactiveCursor$,
207 hideInactiveCursor: $hideInactiveCursor$,
255−$endif$
208+
256−$if(hideCursorTime)$
257 // Time before the cursor is hidden (in ms)
209 // Time before the cursor is hidden (in ms)
258 hideCursorTime: $hideCursorTime$,
210 hideCursorTime: $hideCursorTime$,
259−$endif$
211+
260−$if(hideAddressBar)$
261− // Hides the address bar on mobile devices
262− hideAddressBar: $hideAddressBar$,
263−$endif$
264−$if(previewLinks)$
265 // Opens links in an iframe preview overlay
212 // Opens links in an iframe preview overlay
266 previewLinks: $previewLinks$,
213 previewLinks: $previewLinks$,
267−$endif$
214+
268−$if(transition)$
269− // Transition style
270− transition: '$transition$', // none/fade/slide/convex/concave/zoom
215+ // Transition style (none/fade/slide/convex/concave/zoom)
271−$endif$
216+ transition: '$transition$',
272−$if(transitionSpeed)$
217+
273− // Transition speed
218+ // Transition speed (default/fast/slow)
274− transitionSpeed: '$transitionSpeed$', // default/fast/slow
219+ transitionSpeed: '$transitionSpeed$',
275−$endif$
220+
276−$if(backgroundTransition)$
277 // Transition style for full page slide backgrounds
221 // Transition style for full page slide backgrounds
278− backgroundTransition: '$backgroundTransition$', // none/fade/slide/convex/concave/zoom
222+ // (none/fade/slide/convex/concave/zoom)
279−$endif$
223+ backgroundTransition: '$backgroundTransition$',
280−$if(viewDistance)$
224+
281 // Number of slides away from the current that are visible
225 // Number of slides away from the current that are visible
282 viewDistance: $viewDistance$,
226 viewDistance: $viewDistance$,
283−$endif$
227+
284−$if(mobileViewDistance)$
285 // Number of slides away from the current that are visible on mobile
228 // Number of slides away from the current that are visible on mobile
286 // devices. It is advisable to set this to a lower number than
229 // devices. It is advisable to set this to a lower number than
287 // viewDistance in order to save resources.
230 // viewDistance in order to save resources.
288 mobileViewDistance: $mobileViewDistance$,
231 mobileViewDistance: $mobileViewDistance$,
289−$endif$
290$if(parallaxBackgroundImage)$
232$if(parallaxBackgroundImage)$
233+
291 // Parallax background image
234 // Parallax background image
292 parallaxBackgroundImage: '$parallaxBackgroundImage$', // e.g. "'https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg'"
235 parallaxBackgroundImage: '$parallaxBackgroundImage$', // e.g. "'https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg'"
293$else$
236$else$
294$if(background-image)$
237$if(background-image)$
238+
295 // Parallax background image
239 // Parallax background image
296 parallaxBackgroundImage: '$background-image$', // e.g. "'https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg'"
240 parallaxBackgroundImage: '$background-image$', // e.g. "'https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg'"
297$endif$
241$endif$
298$endif$
242$endif$
299$if(parallaxBackgroundSize)$
243$if(parallaxBackgroundSize)$
244+
300 // Parallax background size
245 // Parallax background size
301 parallaxBackgroundSize: '$parallaxBackgroundSize$', // CSS syntax, e.g. "2100px 900px"
246 parallaxBackgroundSize: '$parallaxBackgroundSize$', // CSS syntax, e.g. "2100px 900px"
302$endif$
247$endif$
303$if(parallaxBackgroundHorizontal)$
248$if(parallaxBackgroundHorizontal)$
249+
304 // Amount to move parallax background (horizontal and vertical) on slide change
250 // Amount to move parallax background (horizontal and vertical) on slide change
305 // Number, e.g. 100
251 // Number, e.g. 100
306 parallaxBackgroundHorizontal: $parallaxBackgroundHorizontal$,
252 parallaxBackgroundHorizontal: $parallaxBackgroundHorizontal$,
307$endif$
253$endif$
308$if(parallaxBackgroundVertical)$
254$if(parallaxBackgroundVertical)$
255+
309 parallaxBackgroundVertical: $parallaxBackgroundVertical$,
256 parallaxBackgroundVertical: $parallaxBackgroundVertical$,
310$endif$
257$endif$
311$if(width)$
258$if(width)$
259+
312 // The "normal" size of the presentation, aspect ratio will be preserved
260 // The "normal" size of the presentation, aspect ratio will be preserved
313 // when the presentation is scaled to fit different resolutions. Can be
261 // when the presentation is scaled to fit different resolutions. Can be
314 // specified using percentage units.
262 // specified using percentage units.
315 width: $width$,
263 width: $width$,
316$endif$
264$endif$
317$if(height)$
265$if(height)$
266+
318 height: $height$,
267 height: $height$,
319$endif$
268$endif$
320$if(margin)$
269$if(margin)$
270+
321 // Factor of the display size that should remain empty around the content
271 // Factor of the display size that should remain empty around the content
322 margin: $margin$,
272 margin: $margin$,
323$endif$
273$endif$
324$if(minScale)$
274$if(minScale)$
275+
325 // Bounds for smallest/largest possible scale to apply to content
276 // Bounds for smallest/largest possible scale to apply to content
326 minScale: $minScale$,
277 minScale: $minScale$,
327$endif$
278$endif$
328$if(maxScale)$
279$if(maxScale)$
280+
329 maxScale: $maxScale$,
281 maxScale: $maxScale$,
330$endif$
282$endif$
331−$if(zoomKey)$
332− // Modifier key used to click-zoom to part of the slide
333− zoomKey: '$zoomKey$',
334−$endif$
335−$if(display)$
336− // The display mode that will be used to show slides
337− display: '$display$',
338−$endif$
339$if(mathjax)$
283$if(mathjax)$
284+
340 math: {
285 math: {
341 mathjax: '$mathjaxurl$',
286 mathjax: '$mathjaxurl$',
342 config: 'TeX-AMS_HTML-full',
287 config: 'TeX-AMS_HTML-full',
data/templates/default.s5+3
@@ -61,6 +61,9 @@ $endif$
61$if(author)$
61$if(author)$
62 <h3 class="author">$for(author)$$author$$sep$<br/>$endfor$</h3>
62 <h3 class="author">$for(author)$$author$$sep$<br/>$endfor$</h3>
63$endif$
63$endif$
64+$if(institute)$
65+ <h3 class="institute">$for(institute)$$institute$$sep$<br/>$endfor$</h3>
66+$endif$
64$if(date)$
67$if(date)$
65 <h4 class="date">$date$</h4>
68 <h4 class="date">$date$</h4>
66$endif$
69$endif$
data/templates/default.slideous+7
@@ -63,9 +63,16 @@ $if(title)$
63$if(subtitle)$
63$if(subtitle)$
64 <h1 class="subtitle">$subtitle$</h1>
64 <h1 class="subtitle">$subtitle$</h1>
65$endif$
65$endif$
66+$if(author)$
66 <p class="author">
67 <p class="author">
67$for(author)$$author$$sep$<br/>$endfor$
68$for(author)$$author$$sep$<br/>$endfor$
68 </p>
69 </p>
70+$endif$
71+$if(institute)$
72+ <p class="institute">
73+$for(institute)$$institute$$sep$<br/>$endfor$
74+ </p>
75+$endif$
69$if(date)$
76$if(date)$
70 <p class="date">$date$</p>
77 <p class="date">$date$</p>
71$endif$
78$endif$
data/templates/default.slidy+5
@@ -52,6 +52,11 @@ $if(author)$
52$for(author)$$author$$sep$<br/>$endfor$
52$for(author)$$author$$sep$<br/>$endfor$
53 </p>
53 </p>
54$endif$
54$endif$
55+$if(institute)$
56+ <p class="institute">
57+$for(institute)$$institute$$sep$<br/>$endfor$
58+ </p>
59+$endif$
55$if(date)$
60$if(date)$
56 <p class="date">$date$</p>
61 <p class="date">$date$</p>
57$endif$
62$endif$
data/templates/styles.html+2−1
@@ -14,7 +14,7 @@ body {
14 padding-top: $if(margin-top)$$margin-top$$else$50px$endif$;
14 padding-top: $if(margin-top)$$margin-top$$else$50px$endif$;
15 padding-bottom: $if(margin-bottom)$$margin-bottom$$else$50px$endif$;
15 padding-bottom: $if(margin-bottom)$$margin-bottom$$else$50px$endif$;
16 hyphens: auto;
16 hyphens: auto;
17− word-wrap: break-word;
17+ overflow-wrap: break-word;
18 text-rendering: optimizeLegibility;
18 text-rendering: optimizeLegibility;
19 font-kerning: normal;
19 font-kerning: normal;
20}
20}
@@ -93,6 +93,7 @@ $endif$
93pre code {
93pre code {
94 padding: 0;
94 padding: 0;
95 overflow: visible;
95 overflow: visible;
96+ overflow-wrap: normal;
96}
97}
97.sourceCode {
98.sourceCode {
98 background-color: transparent;
99 background-color: transparent;
doc/epub.md+9−2
@@ -141,8 +141,15 @@ Pandoc has an EPUB3 writer. It renders LaTeX math into MathML, which
141EPUB3 readers are supposed to support (but unfortunately few do).
141EPUB3 readers are supposed to support (but unfortunately few do).
142
142
143Of course, this isn't much help if you want EPUB2 output (`pandoc -t epub2`)
143Of course, this isn't much help if you want EPUB2 output (`pandoc -t epub2`)
144−or target readers that don't support MathML. Then you should try using the
144+or target readers that don't support MathML. Then you have two options:
145+
146+1. Use the [`--webtex`](https://pandoc.org/MANUAL.html#option--webtex) option,
145−`--webtex` option, which will use a web service to convert the TeX to an image.
147+ which will use a web service to convert the TeX to an image.
148+2. Use the [`--gladtex`](https://pandoc.org/MANUAL.html#option--gladtex) option
149+ to convert maths into SVG images on your local machine.
150+
151+Both GladTeX and WebTeX add the LaTeX source of the formula as alternative text
152+of the image, increasing accessibility for blind users.
146
153
147[KindleGen]: https://www.amazon.com/gp/feature.html?ie=UTF8&docId=1000765211
154[KindleGen]: https://www.amazon.com/gp/feature.html?ie=UTF8&docId=1000765211
148[EPUB]: https://en.wikipedia.org/wiki/EPUB
155[EPUB]: https://en.wikipedia.org/wiki/EPUB
doc/faqs.mdnew file+128
@@ -0,0 +1,128 @@
1+% FAQs
2+
3+::: faqs
4+
5+## How can I convert a whole directory of files from Markdown to RTF?
6+
7+On linux or OSX:
8+
9+ for f in *.txt; do pandoc "$f" -s -o "${f%.txt}.rtf"; done
10+
11+
12+In Windows Powershell:
13+
14+ gci -r -i *.txt |foreach{$rtf=$_.directoryname+"\"+$_.basename+".rtf";pandoc -f markdown -s $_.name -o $rtf}
15+
16+## I used pandoc to convert a document to ICML (or OPML or RTF), and when I try to open it I'm told it's invalid. What have I done wrong?
17+
18+Be sure to use the `-s` or `--standalone` flag, or you just get a
19+fragment, not a full document with the required header:
20+
21+ pandoc -s -f markdown -t icml -o my.icml my.md
22+
23+## I get a blank document when I try to convert a markdown document in Chinese to PDF.
24+
25+By default, pandoc uses pdflatex to generate the PDF, and pdflatex
26+doesn't handle Chinese characters. But you can change the default to
27+use xelatex instead. You should also make sure you're using a font
28+with Chinese glyphs. For example:
29+
30+ pandoc -o c.pdf --pdf-engine=xelatex -V mainfont='Adobe Ming Std'
31+
32+## The Windows installer does a single user install, rather than installing pandoc for all users. How can I install pandoc for all users?
33+
34+Run the following command as admin:
35+
36+ msiexec /i pandoc-VERSION.msi ALLUSERS=1
37+
38+This will put pandoc in `C:\Program Files\Pandoc`.
39+You can install Pandoc to a different directory by setting APPLICATIONFOLDER parameter,
40+for example:
41+
42+ msiexec /i pandoc-1.11.1.msi ALLUSERS=1 APPLICATIONFOLDER="C:\Pandoc"
43+
44+## How do I change the margins in PDF output?
45+
46+The option
47+
48+ -V geometry:margin=1in
49+
50+will set the margins to one inch on each side. If you don't want uniform
51+margins, you can do something like
52+
53+ -V geometry:"top=2cm, bottom=1.5cm, left=1cm, right=1cm"
54+
55+Or
56+
57+ -V geometry:"left=3cm, width=10cm"
58+
59+For more options, see the documentation for the LaTeX [geometry
60+package](https://www.ctan.org/pkg/geometry).
61+
62+## How does pandoc compare to multimarkdown?
63+
64+Here is a [wiki
65+page](https://github.com/jgm/pandoc/wiki/Pandoc-vs-Multimarkdown)
66+comparing the two.
67+
68+## When I specify an image width of 50% and convert to LaTeX, pandoc sets the height to textheight and the aspect ratio isn't preserved. How can I prevent this?
69+
70+For example, if you convert an image with `{width="50%"}`, the LaTeX produced
71+will be `\includegraphics[width=0.5\textwidth,height=\textheight]`.
72+
73+This output presupposes the following code in pandoc's default latex
74+template:
75+
76+```
77+% Scale images if necessary, so that they will not overflow the page
78+% margins by default, and it is still possible to overwrite the defaults
79+% using explicit options in \includegraphics[width, height, ...]{}
80+\setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio}
81+```
82+
83+If you don't have this in your custom template, you should
84+add it. If we didn't set the `height` explicitly in this way,
85+the image would not be resized correctly unless it was
86+being resized to smaller than its original size.
87+
88+## Pandoc sometimes uses too much memory. How can I limit the memory used by pandoc?
89+
90+`pandoc +RTS -M30m -RTS` will limit heap memory to 30MB.
91+When converting a document requires more than this, an out of
92+memory error will be issued.
93+
94+## When using `--include-in-header` with PDF or LaTeX output, how do I reference tex declarations coming after `$header-includes$` in the default template?
95+
96+For various reasons, the `$header-includes$` are not at the very
97+end of the LaTeX preamble. This poses a problem when the code
98+you are inserting depends on declarations in the preamble coming
99+after the `$header-includes$` location. For example, you might
100+want to reference the `\author` and `\title` metadata values
101+(set at the very bottom of the preamble) and present them in
102+margins. In that case you can wrap your code in `etoolbox`'s
103+`\AtEndPreamble`. The technique is demonstrated in [this
104+gist](https://gist.github.com/JohnLukeBentley/9dda6166b9ee5c4127afd2b8cd16b70a).
105+When using `\AtEndPreamble`, keep any `makeatletter` or
106+`makeatother` outside of the `\AtEndPreamble`, as shown in the
107+example.
108+
109+## How can I convert PDFs to other formats using pandoc?
110+
111+You can't. You can try opening the PDF in Word or Google Docs
112+and saving in a format from which pandoc can convert directly.
113+
114+## Do I really need to install a 1 GB TeX installation to produce a PDF using pandoc?
115+
116+No. You can get by with a relatively small TeX installation,
117+for example, by starting with MacTeX's Basic TeX distribution
118+and using the `tlmgr` tool to install a few packages required by pandoc
119+(see https://pandoc.org/MANUAL.html#creating-a-pdf).
120+
121+Or, you can produce PDFs via HTML and `wkhtmltopdf`,
122+or via groff ms and `pdfroff`. (These don't produce as nice
123+topography as TeX, particularly when it comes to math, but they
124+may be fine for many purposes.)
125+
126+
127+:::
128+
doc/using-the-pandoc-api.md+9−9
@@ -139,7 +139,7 @@ report :: PandocMonad m => LogMessage -> m ()
139-- | Fetch an image or other item from the local filesystem or the net.
139-- | Fetch an image or other item from the local filesystem or the net.
140-- Returns raw content and maybe mime type.
140-- Returns raw content and maybe mime type.
141fetchItem :: PandocMonad m
141fetchItem :: PandocMonad m
142− => String
142+ => Text
143 -> m (B.ByteString, Maybe MimeType)
143 -> m (B.ByteString, Maybe MimeType)
144
144
145-- Set the resource path searched by 'fetchItem'.
145-- Set the resource path searched by 'fetchItem'.
@@ -213,8 +213,8 @@ of the Monoid typeclass and can easily be concatenated:
213import Text.Pandoc.Builder
213import Text.Pandoc.Builder
214
214
215mydoc :: Pandoc
215mydoc :: Pandoc
216−mydoc = doc $ header 1 (text "Hello!")
216+mydoc = doc $ header 1 (text (T.pack "Hello!"))
217− <> para (emph (text "hello world") <> text ".")
217+ <> para (emph (text (T.pack "hello world")) <> text (T.pack "."))
218
218
219main :: IO ()
219main :: IO ()
220main = print mydoc
220main = print mydoc
@@ -261,16 +261,16 @@ import qualified Data.Text as T
261import Data.List (intersperse)
261import Data.List (intersperse)
262
262
263data Station = Station{
263data Station = Station{
264− address :: String
264+ address :: T.Text
265− , name :: String
265+ , name :: T.Text
266− , cardsAccepted :: [String]
266+ , cardsAccepted :: [T.Text]
267 } deriving Show
267 } deriving Show
268
268
269instance FromJSON Station where
269instance FromJSON Station where
270 parseJSON (Object v) = Station <$>
270 parseJSON (Object v) = Station <$>
271 v .: "street_address" <*>
271 v .: "street_address" <*>
272 v .: "station_name" <*>
272 v .: "station_name" <*>
273− (words <$> (v .:? "cards_accepted" .!= ""))
273+ (T.words <$> (v .:? "cards_accepted" .!= ""))
274 parseJSON _ = mzero
274 parseJSON _ = mzero
275
275
276createLetter :: [Station] -> Pandoc
276createLetter :: [Station] -> Pandoc
@@ -328,7 +328,7 @@ users to override the system defaults. If you want to disable
328this behavior, use `setUserDataDir Nothing`.
328this behavior, use `setUserDataDir Nothing`.
329
329
330To render a template, use `renderTemplate'`, which takes two
330To render a template, use `renderTemplate'`, which takes two
331−arguments, a template (String) and a context (any instance
331+arguments, a template (Text) and a context (any instance
332of ToJSON). If you want to create a context from the metadata
332of ToJSON). If you want to create a context from the metadata
333part of a Pandoc document, use `metaToJSON'` from
333part of a Pandoc document, use `metaToJSON'` from
334[Text.Pandoc.Writers.Shared]. If you also want to incorporate
334[Text.Pandoc.Writers.Shared]. If you also want to incorporate
@@ -426,7 +426,7 @@ concatenated together. Here's an example that returns a
426list of the URLs linked to in a document:
426list of the URLs linked to in a document:
427
427
428```haskell
428```haskell
429−listURLs :: Pandoc -> [String]
429+listURLs :: Pandoc -> [Text]
430listURLs = query urls
430listURLs = query urls
431 where urls (Link _ _ (src, _)) = [src]
431 where urls (Link _ _ (src, _)) = [src]
432 urls _ = []
432 urls _ = []
man/pandoc.1+187−39
@@ -1,7 +1,7 @@
1'\" t
1'\" t
2−.\" Automatically generated by Pandoc 2.12.1
2+.\" Automatically generated by Pandoc 2.14.0.1
3.\"
3.\"
4−.TH "Pandoc User\[cq]s Guide" "" "March 20, 2021" "pandoc 2.13" ""
4+.TH "Pandoc User\[cq]s Guide" "" "June 20, 2021" "pandoc 2.14.0.3" ""
5.hy
5.hy
6.SH NAME
6.SH NAME
7pandoc - general markup converter
7pandoc - general markup converter
@@ -716,11 +716,11 @@ Extract images and other media contained in or linked from the source
716document to the path \f[I]DIR\f[R], creating it if necessary, and adjust
716document to the path \f[I]DIR\f[R], creating it if necessary, and adjust
717the images references in the document so they point to the extracted
717the images references in the document so they point to the extracted
718files.
718files.
719+Media are downloaded, read from the file system, or extracted from a
719−If the source format is a binary container (docx, epub, or odt), the
720+binary container (e.g.\ docx), as needed.
720−media is extracted from the container and the original filenames are
721+The original file paths are used if they are relative paths not
721−used.
722+containing \f[C]..\f[R].
722−Otherwise the media is read from the file system or downloaded, and new
723−filenames are constructed based on SHA1 hashes of the contents.
723+Otherwise filenames are constructed from the SHA1 hash of the contents.
724.TP
724.TP
725\f[B]\f[CB]--abbreviations=\f[B]\f[R]\f[I]FILE\f[R]
725\f[B]\f[CB]--abbreviations=\f[B]\f[R]\f[I]FILE\f[R]
726Specifies a custom abbreviations file, with abbreviations one to a line.
726Specifies a custom abbreviations file, with abbreviations one to a line.
@@ -1504,16 +1504,16 @@ inserted.
1504.TP
1504.TP
1505\f[B]\f[CB]--gladtex\f[B]\f[R]
1505\f[B]\f[CB]--gladtex\f[B]\f[R]
1506Enclose TeX math in \f[C]<eq>\f[R] tags in HTML output.
1506Enclose TeX math in \f[C]<eq>\f[R] tags in HTML output.
1507−The resulting HTML can then be processed by GladTeX to produce images of
1507+The resulting HTML can then be processed by GladTeX to produce SVG
1508−the typeset formulas and an HTML file with links to these images.
1508+images of the typeset formulas and an HTML file with these images
1509−So, the procedure is:
1509+embedded.
1510.RS
1510.RS
1511.IP
1511.IP
1512.nf
1512.nf
1513\f[C]
1513\f[C]
1514pandoc -s --gladtex input.md -o myfile.htex
1514pandoc -s --gladtex input.md -o myfile.htex
1515−gladtex -d myfile-images myfile.htex
1515+gladtex -d image_dir myfile.htex
1516−# produces myfile.html and images in myfile-images
1516+# produces myfile.html and images in image_dir
1517\f[R]
1517\f[R]
1518.fi
1518.fi
1519.RE
1519.RE
@@ -2591,10 +2591,9 @@ YAML metadata or with \f[C]-M classoption=fleqn\f[R].
2591.SS Variables for HTML slides
2591.SS Variables for HTML slides
2592.PP
2592.PP
2593These affect HTML output when [producing slide shows with pandoc].
2593These affect HTML output when [producing slide shows with pandoc].
2594−.PP
2594+.TP
2595−All reveal.js configuration options are available as variables.
2595+\f[B]\f[CB]institute\f[B]\f[R]
2596−To turn off boolean flags that default to true in reveal.js, use
2596+author affiliations: can be a list when there are multiple authors
2597−\f[C]0\f[R].
2598.TP
2597.TP
2599\f[B]\f[CB]revealjs-url\f[B]\f[R]
2598\f[B]\f[CB]revealjs-url\f[B]\f[R]
2600base URL for reveal.js documents (defaults to
2599base URL for reveal.js documents (defaults to
@@ -2613,6 +2612,10 @@ base URL for Slideous documents (defaults to \f[C]slideous\f[R])
2613\f[B]\f[CB]title-slide-attributes\f[B]\f[R]
2612\f[B]\f[CB]title-slide-attributes\f[B]\f[R]
2614additional attributes for the title slide of reveal.js slide shows.
2613additional attributes for the title slide of reveal.js slide shows.
2615See background in reveal.js and beamer for an example.
2614See background in reveal.js and beamer for an example.
2615+.PP
2616+All reveal.js configuration options are available as variables.
2617+To turn off boolean flags that default to true in reveal.js, use
2618+\f[C]0\f[R].
2616.SS Variables for Beamer slides
2619.SS Variables for Beamer slides
2617.PP
2620.PP
2618These variables change the appearance of PDF slides using
2621These variables change the appearance of PDF slides using
@@ -4272,7 +4275,7 @@ Term 2
4272Note that space between items in a definition list is required.
4275Note that space between items in a definition list is required.
4273(A variant that loosens this requirement, but disallows \[lq]lazy\[rq]
4276(A variant that loosens this requirement, but disallows \[lq]lazy\[rq]
4274hard wrapping, can be activated with \f[C]compact_definition_lists\f[R]:
4277hard wrapping, can be activated with \f[C]compact_definition_lists\f[R]:
4275−see Non-pandoc extensions, below.)
4278+see Non-default extensions, below.)
4276.SS Numbered example lists
4279.SS Numbered example lists
4277.SS Extension: \f[C]example_lists\f[R]
4280.SS Extension: \f[C]example_lists\f[R]
4278.PP
4281.PP
@@ -4793,7 +4796,9 @@ All of the metadata will appear in a single block at the beginning of
4793the document.
4796the document.
4794.PP
4797.PP
4795Note that YAML escaping rules must be followed.
4798Note that YAML escaping rules must be followed.
4796−Thus, for example, if a title contains a colon, it must be quoted.
4799+Thus, for example, if a title contains a colon, it must be quoted, and
4800+if it contains a backslash escape, then it must be ensured that it is
4801+not treated as a YAML escape sequence.
4797The pipe character (\f[C]|\f[R]) can be used to begin an indented block
4802The pipe character (\f[C]|\f[R]) can be used to begin an indented block
4798that will be interpreted literally, without need for escaping.
4803that will be interpreted literally, without need for escaping.
4799This form is necessary when the field contains blank lines or
4804This form is necessary when the field contains blank lines or
@@ -4815,6 +4820,13 @@ abstract: |
4815\f[R]
4820\f[R]
4816.fi
4821.fi
4817.PP
4822.PP
4823+The literal block after the \f[C]|\f[R] must be indented relative to the
4824+line containing the \f[C]|\f[R].
4825+If it is not, the YAML will be invalid and pandoc will not interpret it
4826+as metadata.
4827+For an overview of the complex rules governing YAML, see the Wikipedia
4828+entry on YAML syntax.
4829+.PP
4818Template variables will be set automatically from the metadata.
4830Template variables will be set automatically from the metadata.
4819Thus, for example, in writing HTML, the variable \f[C]abstract\f[R] will
4831Thus, for example, in writing HTML, the variable \f[C]abstract\f[R] will
4820be set to the HTML equivalent of the Markdown in the \f[C]abstract\f[R]
4832be set to the HTML equivalent of the Markdown in the \f[C]abstract\f[R]
@@ -4880,6 +4892,21 @@ header-includes:
4880 \[ga]\[ga]\[ga]
4892 \[ga]\[ga]\[ga]
4881\f[R]
4893\f[R]
4882.fi
4894.fi
4895+.PP
4896+Note: the \f[C]yaml_metadata_block\f[R] extension works with
4897+\f[C]commonmark\f[R] as well as \f[C]markdown\f[R] (and it is enabled by
4898+default in \f[C]gfm\f[R] and \f[C]commonmark_x\f[R]).
4899+However, in these formats the following restrictions apply:
4900+.IP \[bu] 2
4901+The YAML metadata block must occur at the beginning of the document (and
4902+there can be only one).
4903+If multiple files are given as arguments to pandoc, only the first can
4904+be a YAML metadata block.
4905+.IP \[bu] 2
4906+The leaf nodes of the YAML structure are parsed in isolation from each
4907+other and from the rest of the document.
4908+So, for example, you can\[cq]t use a reference link in these contexts if
4909+the link definition is somewhere else in the document.
4883.SS Backslash escapes
4910.SS Backslash escapes
4884.SS Extension: \f[C]all_symbols_escapable\f[R]
4911.SS Extension: \f[C]all_symbols_escapable\f[R]
4885.PP
4912.PP
@@ -5760,27 +5787,70 @@ Inline and regular footnotes may be mixed freely.
5760.SS Citation syntax
5787.SS Citation syntax
5761.SS Extension: \f[C]citations\f[R]
5788.SS Extension: \f[C]citations\f[R]
5762.PP
5789.PP
5763−Markdown citations go inside square brackets and are separated by
5790+To cite a bibliographic item with an identifier foo, use the syntax
5764−semicolons.
5791+\f[C]\[at]foo\f[R].
5765−Each citation must have a key, composed of `\[at]' + the citation
5792+Normal citations should be included in square brackets, with semicolons
5766−identifier from the database, and may optionally have a prefix, a
5793+separating distinct items:
5767−locator, and a suffix.
5768−The citation key must begin with a letter, digit, or \f[C]_\f[R], and
5769−may contain alphanumerics, \f[C]_\f[R], and internal punctuation
5770−characters (\f[C]:.#$%&-+?<>\[ti]/\f[R]).
5771−Here are some examples:
5772.IP
5794.IP
5773.nf
5795.nf
5774\f[C]
5796\f[C]
5775−Blah blah [see \[at]doe99, pp. 33-35; also \[at]smith04, chap. 1].
5797+Blah blah [\[at]doe99; \[at]smith2000; \[at]smith2004].
5776−
5798+\f[R]
5777−Blah blah [\[at]doe99, pp. 33-35, 38-39 and *passim*].
5799+.fi
5800+.PP
5801+How this is rendered depends on the citation style.
5802+In an author-date style, it might render as
5803+.IP
5804+.nf
5805+\f[C]
5806+Blah blah (Doe 1999, Smith 2000, 2004).
5807+\f[R]
5808+.fi
5809+.PP
5810+In a footnote style, it might render as
5811+.IP
5812+.nf
5813+\f[C]
5814+Blah blah.[\[ha]1]
5778
5815
5779−Blah blah [\[at]smith04; \[at]doe99].
5816+[\[ha]1]: John Doe, \[dq]Frogs,\[dq] *Journal of Amphibians* 44 (1999);
5817+Susan Smith, \[dq]Flies,\[dq] *Journal of Insects* (2000);
5818+Susan Smith, \[dq]Bees,\[dq] *Journal of Insects* (2004).
5780\f[R]
5819\f[R]
5781.fi
5820.fi
5782.PP
5821.PP
5822+See the CSL user documentation for more information about CSL styles and
5823+how they affect rendering.
5824+.PP
5825+Unless a citation key start with a letter, digit, or \f[C]_\f[R], and
5826+contains only alphanumerics and internal punctuation characters
5827+(\f[C]:.#$%&-+?<>\[ti]/\f[R]), it must be surrounded by curly braces,
5828+which are not considered part of the key.
5829+In \f[C]\[at]Foo_bar.baz.\f[R], the key is \f[C]Foo_bar.baz\f[R].
5830+The final period is not \f[I]internal\f[R] punctuation, so it is not
5831+included in the key.
5832+In \f[C]\[at]{Foo_bar.baz.}\f[R], the key is \f[C]Foo_bar.baz.\f[R],
5833+including the final period.
5834+The curly braces are recommended if you use URLs as keys:
5835+\f[C][\[at]{https://example.com/bib?name=foobar&date=2000}, p. 33]\f[R].
5836+.PP
5837+Citation items may optionally include a prefix, a locator, and a suffix.
5838+In
5839+.IP
5840+.nf
5841+\f[C]
5842+Blah blah [see \[at]doe99, pp. 33-35 and *passim*; \[at]smith04, chap. 1].
5843+\f[R]
5844+.fi
5845+.PP
5846+The first item (\f[C]doe99\f[R]) has prefix \f[C]see\f[R], locator
5847+\f[C]pp. 33-35\f[R], and suffix \f[C]and *passim*\f[R].
5848+The second item (\f[C]smith04\f[R]) has locator \f[C]chap. 1\f[R] and no
5849+prefix or suffix.
5850+.PP
5851+Pandoc uses some heuristics to separate the locator from the rest of the
5852+subject.
5783−\f[C]pandoc\f[R] detects locator terms in the CSL locale files.
5853+It is sensitive to the locator terms defined in the CSL locale files.
5784Either abbreviated or unabbreviated forms are accepted.
5854Either abbreviated or unabbreviated forms are accepted.
5785In the \f[C]en-US\f[R] locale, locator terms can be written in either
5855In the \f[C]en-US\f[R] locale, locator terms can be written in either
5786singular or plural forms, as \f[C]book\f[R],
5856singular or plural forms, as \f[C]book\f[R],
@@ -5802,14 +5872,15 @@ singular or plural forms, as \f[C]book\f[R],
5802\f[C]\[sc]\f[R]/\f[C]\[sc]\[sc]\f[R].
5872\f[C]\[sc]\f[R]/\f[C]\[sc]\[sc]\f[R].
5803If no locator term is used, \[lq]page\[rq] is assumed.
5873If no locator term is used, \[lq]page\[rq] is assumed.
5804.PP
5874.PP
5805−\f[C]pandoc\f[R] will use heuristics to distinguish the locator from the
5875+In complex cases, you can force something to be treated as a locator by
5806−suffix.
5876+enclosing it in curly braces or prevent parsing the suffix as locator by
5807−In complex cases, the locator can be enclosed in curly braces:
5877+prepending curly braces:
5808.IP
5878.IP
5809.nf
5879.nf
5810\f[C]
5880\f[C]
5811[\[at]smith{ii, A, D-Z}, with a suffix]
5881[\[at]smith{ii, A, D-Z}, with a suffix]
5812[\[at]smith, {pp. iv, vi-xi, (xv)-(xvii)} with suffix here]
5882[\[at]smith, {pp. iv, vi-xi, (xv)-(xvii)} with suffix here]
5883+[\[at]smith{}, 99 years later]
5813\f[R]
5884\f[R]
5814.fi
5885.fi
5815.PP
5886.PP
@@ -5823,7 +5894,8 @@ Smith says blah [-\[at]smith04].
5823\f[R]
5894\f[R]
5824.fi
5895.fi
5825.PP
5896.PP
5826−You can also write an in-text citation, as follows:
5897+You can also write an author-in-text citation, by omitting the square
5898+brackets:
5827.IP
5899.IP
5828.nf
5900.nf
5829\f[C]
5901\f[C]
@@ -5832,13 +5904,64 @@ You can also write an in-text citation, as follows:
5832\[at]smith04 [p. 33] says blah.
5904\[at]smith04 [p. 33] says blah.
5833\f[R]
5905\f[R]
5834.fi
5906.fi
5907+.PP
5908+This will cause the author\[cq]s name to be rendered, followed by the
5909+bibliographical details.
5910+Use this form when you want to make the citation the subject of a
5911+sentence.
5912+.PP
5913+When you are using a note style, it is usually better to let citeproc
5914+create the footnotes from citations rather than writing an explicit
5915+note.
5916+If you do write an explicit note that contains a citation, note that
5917+normal citations will be put in parentheses, while author-in-text
5918+citations will not.
5919+For this reason, it is sometimes preferable to use the author-in-text
5920+style inside notes when using a note style.
5835−.SS Non-pandoc extensions
5921+.SS Non-default extensions
5836.PP
5922.PP
5837The following Markdown syntax extensions are not enabled by default in
5923The following Markdown syntax extensions are not enabled by default in
5838pandoc, but may be enabled by adding \f[C]+EXTENSION\f[R] to the format
5924pandoc, but may be enabled by adding \f[C]+EXTENSION\f[R] to the format
5839name, where \f[C]EXTENSION\f[R] is the name of the extension.
5925name, where \f[C]EXTENSION\f[R] is the name of the extension.
5840Thus, for example, \f[C]markdown+hard_line_breaks\f[R] is Markdown with
5926Thus, for example, \f[C]markdown+hard_line_breaks\f[R] is Markdown with
5841hard line breaks.
5927hard line breaks.
5928+.SS Extension: \f[C]rebase_relative_paths\f[R]
5929+.PP
5930+Rewrite relative paths for Markdown links and images, depending on the
5931+path of the file containing the link or image link.
5932+For each link or image, pandoc will compute the directory of the
5933+containing file, relative to the working directory, and prepend the
5934+resulting path to the link or image path.
5935+.PP
5936+The use of this extension is best understood by example.
5937+Suppose you have a a subdirectory for each chapter of a book,
5938+\f[C]chap1\f[R], \f[C]chap2\f[R], \f[C]chap3\f[R].
5939+Each contains a file \f[C]text.md\f[R] and a number of images used in
5940+the chapter.
5941+You would like to have \f[C]![image](spider.jpg)\f[R] in
5942+\f[C]chap1/text.md\f[R] refer to \f[C]chap1/spider.jpg\f[R] and
5943+\f[C]![image](spider.jpg)\f[R] in \f[C]chap2/text.md\f[R] refer to
5944+\f[C]chap2/spider.jpg\f[R].
5945+To do this, use
5946+.IP
5947+.nf
5948+\f[C]
5949+pandoc chap*/*.md -f markdown+rebase_relative_paths
5950+\f[R]
5951+.fi
5952+.PP
5953+Without this extension, you would have to use
5954+\f[C]![image](chap1/spider.jpg)\f[R] in \f[C]chap1/text.md\f[R] and
5955+\f[C]![image](chap2/spider.jpg)\f[R] in \f[C]chap2/text.md\f[R].
5956+Links with relative paths will be rewritten in the same way as images.
5957+.PP
5958+Absolute paths and URLs are not changed.
5959+Neither are empty paths or paths consisting entirely of a fragment,
5960+e.g., \f[C]#foo\f[R].
5961+.PP
5962+Note that relative paths in reference links and images will be rewritten
5963+relative to the file containing the link reference definition, not the
5964+file containing the reference link or image itself, if these differ.
5842.SS Extension: \f[C]attributes\f[R]
5965.SS Extension: \f[C]attributes\f[R]
5843.PP
5966.PP
5844Allows attributes to be attached to any inline or block-level element.
5967Allows attributes to be attached to any inline or block-level element.
@@ -6468,9 +6591,29 @@ entries (for author-date and numerical styles only).
6468.TP
6591.TP
6469\f[B]\f[CB]lang\f[B]\f[R]
6592\f[B]\f[CB]lang\f[B]\f[R]
6470The \f[C]lang\f[R] field will affect how the style is localized, for
6593The \f[C]lang\f[R] field will affect how the style is localized, for
6471−example in the translation of labels and the use of quotation marks.
6594+example in the translation of labels, the use of quotation marks, and
6595+the way items are sorted.
6472(For backwards compatibility, \f[C]locale\f[R] may be used instead of
6596(For backwards compatibility, \f[C]locale\f[R] may be used instead of
6473\f[C]lang\f[R], but this use is deprecated.)
6597\f[C]lang\f[R], but this use is deprecated.)
6598+.RS
6599+.PP
6600+A BCP 47 language tag is expected: for example, \f[C]en\f[R],
6601+\f[C]de\f[R], \f[C]en-US\f[R], \f[C]fr-CA\f[R], \f[C]ug-Cyrl\f[R].
6602+The unicode extension syntax (after \f[C]-u-\f[R]) may be used to
6603+specify options for collation (sorting) more precisely.
6604+Here are some examples:
6605+.IP \[bu] 2
6606+\f[C]zh-u-co-pinyin\f[R] \[en] Chinese with the Pinyin collation.
6607+.IP \[bu] 2
6608+\f[C]es-u-co-trad\f[R] \[en] Spanish with the traditional collation
6609+(with \f[C]Ch\f[R] sorting after \f[C]C\f[R]).
6610+.IP \[bu] 2
6611+\f[C]fr-u-kb\f[R] \[en] French with \[lq]backwards\[rq] accent sorting
6612+(with \f[C]cot\['e]\f[R] sorting after \f[C]c\[^o]te\f[R]).
6613+.IP \[bu] 2
6614+\f[C]en-US-u-kf-upper\f[R] \[en] English with uppercase letters sorting
6615+before lower (default is lower before upper).
6616+.RE
6474.TP
6617.TP
6475\f[B]\f[CB]notes-after-punctuation\f[B]\f[R]
6618\f[B]\f[CB]notes-after-punctuation\f[B]\f[R]
6476If true (the default), pandoc will put footnote citations after
6619If true (the default), pandoc will put footnote citations after
@@ -6591,6 +6734,11 @@ A heading at the slide level always starts a new slide.
6591.IP \[bu] 2
6734.IP \[bu] 2
6592Headings \f[I]below\f[R] the slide level in the hierarchy create
6735Headings \f[I]below\f[R] the slide level in the hierarchy create
6593headings \f[I]within\f[R] a slide.
6736headings \f[I]within\f[R] a slide.
6737+(In beamer, a \[lq]block\[rq] will be created.
6738+If the heading has the class \f[C]example\f[R], an
6739+\f[C]exampleblock\f[R] environment will be used; if it has the class
6740+\f[C]alert\f[R], an \f[C]alertblock\f[R] will be used; otherwise a
6741+regular \f[C]block\f[R] will be used.)
6594.IP \[bu] 2
6742.IP \[bu] 2
6595Headings \f[I]above\f[R] the slide level in the hierarchy create
6743Headings \f[I]above\f[R] the slide level in the hierarchy create
6596\[lq]title slides,\[rq] which just contain the section title and help to
6744\[lq]title slides,\[rq] which just contain the section title and help to
@@ -7560,7 +7708,7 @@ The HTML generated by pandoc is not guaranteed to be safe.
7560If \f[C]raw_html\f[R] is enabled for the Markdown input, users can
7708If \f[C]raw_html\f[R] is enabled for the Markdown input, users can
7561inject arbitrary HTML.
7709inject arbitrary HTML.
7562Even if \f[C]raw_html\f[R] is disabled, users can include dangerous
7710Even if \f[C]raw_html\f[R] is disabled, users can include dangerous
7563−content in attributes for headings, spans, and code blocks.
7711+content in URLs and attributes.
7564To be safe, you should run all the generated HTML through an HTML
7712To be safe, you should run all the generated HTML through an HTML
7565sanitizer.
7713sanitizer.
7566.SH AUTHORS
7714.SH AUTHORS
pandoc.cabal+19−15
@@ -1,6 +1,6 @@
1cabal-version: 2.2
1cabal-version: 2.2
2name: pandoc
2name: pandoc
3−version: 2.13
3+version: 2.14.0.3
4build-type: Simple
4build-type: Simple
5license: GPL-2.0-or-later
5license: GPL-2.0-or-later
6license-file: COPYING.md
6license-file: COPYING.md
@@ -12,7 +12,7 @@ stability: alpha
12homepage: https://pandoc.org
12homepage: https://pandoc.org
13category: Text
13category: Text
14tested-with: GHC == 8.2.2, GHC == 8.4.4, GHC == 8.6.5,
14tested-with: GHC == 8.2.2, GHC == 8.4.4, GHC == 8.6.5,
15− GHC == 8.8.4, GHC == 8.10.2
15+ GHC == 8.8.4, GHC == 8.10.2, GHC == 9.0.1
16synopsis: Conversion between markup formats
16synopsis: Conversion between markup formats
17description: Pandoc is a Haskell library for converting from one markup
17description: Pandoc is a Haskell library for converting from one markup
18 format to another, and a command-line tool that uses
18 format to another, and a command-line tool that uses
@@ -208,12 +208,16 @@ extra-source-files:
208 test/command/*.md
208 test/command/*.md
209 test/command/*.csl
209 test/command/*.csl
210 test/command/biblio.bib
210 test/command/biblio.bib
211− test/command/biblatex-examples.bib
211+ test/command/averroes.bib
212 test/command/A.txt
212 test/command/A.txt
213 test/command/B.txt
213 test/command/B.txt
214 test/command/C.txt
214 test/command/C.txt
215 test/command/D.txt
215 test/command/D.txt
216 test/command/01.csv
216 test/command/01.csv
217+ test/command/chap1/spider.png
218+ test/command/chap2/spider.png
219+ test/command/chap1/text.md
220+ test/command/chap2/text.md
217 test/command/defaults1.yaml
221 test/command/defaults1.yaml
218 test/command/defaults2.yaml
222 test/command/defaults2.yaml
219 test/command/defaults3.yaml
223 test/command/defaults3.yaml
@@ -446,10 +450,10 @@ library
446 blaze-markup >= 0.8 && < 0.9,
450 blaze-markup >= 0.8 && < 0.9,
447 bytestring >= 0.9 && < 0.12,
451 bytestring >= 0.9 && < 0.12,
448 case-insensitive >= 1.2 && < 1.3,
452 case-insensitive >= 1.2 && < 1.3,
449− citeproc >= 0.4 && < 0.4.1,
453+ citeproc >= 0.4.0.1 && < 0.4.1,
450− commonmark >= 0.1.1.3 && < 0.2,
454+ commonmark >= 0.2.1 && < 0.3,
451− commonmark-extensions >= 0.2.0.4 && < 0.3,
455+ commonmark-extensions >= 0.2.1.2 && < 0.3,
452− commonmark-pandoc >= 0.2 && < 0.3,
456+ commonmark-pandoc >= 0.2.1.1 && < 0.3,
453 connection >= 0.3.1,
457 connection >= 0.3.1,
454 containers >= 0.4.2.1 && < 0.7,
458 containers >= 0.4.2.1 && < 0.7,
455 data-default >= 0.4 && < 0.8,
459 data-default >= 0.4 && < 0.8,
@@ -461,7 +465,7 @@ library
461 exceptions >= 0.8 && < 0.11,
465 exceptions >= 0.8 && < 0.11,
462 file-embed >= 0.0 && < 0.1,
466 file-embed >= 0.0 && < 0.1,
463 filepath >= 1.1 && < 1.5,
467 filepath >= 1.1 && < 1.5,
464− haddock-library >= 1.8 && < 1.10,
468+ haddock-library >= 1.10 && < 1.11,
465 hslua >= 1.1 && < 1.4,
469 hslua >= 1.1 && < 1.4,
466 hslua-module-path >= 0.1.0 && < 0.2.0,
470 hslua-module-path >= 0.1.0 && < 0.2.0,
467 hslua-module-system >= 0.2 && < 0.3,
471 hslua-module-system >= 0.2 && < 0.3,
@@ -470,26 +474,26 @@ library
470 http-client-tls >= 0.2.4 && < 0.4,
474 http-client-tls >= 0.2.4 && < 0.4,
471 http-types >= 0.8 && < 0.13,
475 http-types >= 0.8 && < 0.13,
472 ipynb >= 0.1 && < 0.2,
476 ipynb >= 0.1 && < 0.2,
473− jira-wiki-markup >= 1.3.4 && < 1.4,
477+ jira-wiki-markup >= 1.4 && < 1.5,
474 mtl >= 2.2 && < 2.3,
478 mtl >= 2.2 && < 2.3,
475 network >= 2.6,
479 network >= 2.6,
476− network-uri >= 2.6 && < 2.7,
480+ network-uri >= 2.6 && < 2.8,
477 pandoc-types >= 1.22 && < 1.23,
481 pandoc-types >= 1.22 && < 1.23,
478 parsec >= 3.1 && < 3.2,
482 parsec >= 3.1 && < 3.2,
479 process >= 1.2.3 && < 1.7,
483 process >= 1.2.3 && < 1.7,
480 random >= 1 && < 1.3,
484 random >= 1 && < 1.3,
481 safe >= 0.3.18 && < 0.4,
485 safe >= 0.3.18 && < 0.4,
482 scientific >= 0.3 && < 0.4,
486 scientific >= 0.3 && < 0.4,
483− skylighting >= 0.10.5.1 && < 0.10.6,
487+ skylighting >= 0.10.5.2 && < 0.10.6,
484− skylighting-core >= 0.10.5.1 && < 0.10.6,
488+ skylighting-core >= 0.10.5.2 && < 0.10.6,
485 split >= 0.2 && < 0.3,
489 split >= 0.2 && < 0.3,
486 syb >= 0.1 && < 0.8,
490 syb >= 0.1 && < 0.8,
487 tagsoup >= 0.14.6 && < 0.15,
491 tagsoup >= 0.14.6 && < 0.15,
488 temporary >= 1.1 && < 1.4,
492 temporary >= 1.1 && < 1.4,
489− texmath >= 0.12.2 && < 0.12.3,
493+ texmath >= 0.12.3 && < 0.12.4,
490 text >= 1.1.1.0 && < 1.3,
494 text >= 1.1.1.0 && < 1.3,
491 text-conversions >= 0.3 && < 0.4,
495 text-conversions >= 0.3 && < 0.4,
492− time >= 1.5 && < 1.10,
496+ time >= 1.5 && < 1.12,
493 unicode-transforms >= 0.3 && < 0.4,
497 unicode-transforms >= 0.3 && < 0.4,
494 unordered-containers >= 0.2 && < 0.3,
498 unordered-containers >= 0.2 && < 0.3,
495 xml >= 1.3.12 && < 1.4,
499 xml >= 1.3.12 && < 1.4,
@@ -764,7 +768,7 @@ test-suite test-pandoc
764 tasty-lua >= 0.2 && < 0.3,
768 tasty-lua >= 0.2 && < 0.3,
765 tasty-quickcheck >= 0.8 && < 0.11,
769 tasty-quickcheck >= 0.8 && < 0.11,
766 text >= 1.1.1.0 && < 1.3,
770 text >= 1.1.1.0 && < 1.3,
767− time >= 1.5 && < 1.10,
771+ time >= 1.5 && < 1.12,
768 xml >= 1.3.12 && < 1.4,
772 xml >= 1.3.12 && < 1.4,
769 zip-archive >= 0.2.3.4 && < 0.5
773 zip-archive >= 0.2.3.4 && < 0.5
770 other-modules: Tests.Old
774 other-modules: Tests.Old
src/Text/Pandoc/Citeproc.hs+67−41
@@ -27,7 +27,7 @@ import Text.Pandoc.Error (PandocError(..))
27import Text.Pandoc.Extensions (pandocExtensions)
27import Text.Pandoc.Extensions (pandocExtensions)
28import Text.Pandoc.Logging (LogMessage(..))
28import Text.Pandoc.Logging (LogMessage(..))
29import Text.Pandoc.Options (ReaderOptions(..))
29import Text.Pandoc.Options (ReaderOptions(..))
30−import Text.Pandoc.Shared (stringify, ordNub, blocksToInlines, tshow)
30+import Text.Pandoc.Shared (stringify, ordNub, tshow)
31import qualified Text.Pandoc.UTF8 as UTF8
31import qualified Text.Pandoc.UTF8 as UTF8
32import Text.Pandoc.Walk (query, walk, walkM)
32import Text.Pandoc.Walk (query, walk, walkM)
33import Control.Applicative ((<|>))
33import Control.Applicative ((<|>))
@@ -91,22 +91,18 @@ processCitations (Pandoc meta bs) = do
91 walk (convertQuotes locale) .
91 walk (convertQuotes locale) .
92 insertSpace $ out)
92 insertSpace $ out)
93 (resultBibliography result)
93 (resultBibliography result)
94− let moveNotes = maybe True truish $
94+ let moveNotes = styleIsNoteStyle sopts &&
95− lookupMeta "notes-after-punctuation" meta
95+ maybe True truish (lookupMeta "notes-after-punctuation" meta)
96 let cits = map (walk (convertQuotes locale)) $
96 let cits = map (walk (convertQuotes locale)) $
97 resultCitations result
97 resultCitations result
98
98
99− let fixQuotes = case localePunctuationInQuote locale of
100− Just True ->
101− B.toList . movePunctuationInsideQuotes . B.fromList
102− _ -> id
103−
104 let metanocites = lookupMeta "nocite" meta
99 let metanocites = lookupMeta "nocite" meta
105 let Pandoc meta'' bs' =
100 let Pandoc meta'' bs' =
106 maybe id (setMeta "nocite") metanocites .
101 maybe id (setMeta "nocite") metanocites .
107− walk (map capitalizeNoteCitation .
108− fixQuotes . mvPunct moveNotes locale) .
102+ walk (mvPunct moveNotes locale) .
103+ (if styleIsNoteStyle sopts
109− walk deNote .
104+ then walk addNote . walk deNote
105+ else id) .
110 evalState (walkM insertResolvedCitations $ Pandoc meta' bs)
106 evalState (walkM insertResolvedCitations $ Pandoc meta' bs)
111 $ cits
107 $ cits
112 return $ Pandoc meta''
108 return $ Pandoc meta''
@@ -195,7 +191,9 @@ getReferences mblocale (Pandoc meta bs) = do
195 then const True
191 then const True
196 else (`Set.member` citeIds)
192 else (`Set.member` citeIds)
197 let inlineRefs = case lookupMeta "references" meta of
193 let inlineRefs = case lookupMeta "references" meta of
194+ Just (MetaList rs) ->
195+ filter (idpred . unItemId . referenceId)
198− Just (MetaList rs) -> mapMaybe metaValueToReference rs
196+ $ mapMaybe metaValueToReference rs
199 _ -> []
197 _ -> []
200 externalRefs <- case lookupMeta "bibliography" meta of
198 externalRefs <- case lookupMeta "bibliography" meta of
201 Just (MetaList xs) ->
199 Just (MetaList xs) ->
@@ -374,7 +372,6 @@ formatFromExtension fp = case dropWhile (== '.') $ takeExtension fp of
374
372
375
373
376isNote :: Inline -> Bool
374isNote :: Inline -> Bool
377−isNote (Note _) = True
378isNote (Cite _ [Note _]) = True
375isNote (Cite _ [Note _]) = True
379 -- the following allows citation styles that are "in-text" but use superscript
376 -- the following allows citation styles that are "in-text" but use superscript
380 -- references to be treated as if they are "notes" for the purposes of moving
377 -- references to be treated as if they are "notes" for the purposes of moving
@@ -387,6 +384,12 @@ isSpacy Space = True
387isSpacy SoftBreak = True
384isSpacy SoftBreak = True
388isSpacy _ = False
385isSpacy _ = False
389
386
387+movePunctInsideQuotes :: Locale -> [Inline] -> [Inline]
388+movePunctInsideQuotes locale
389+ | localePunctuationInQuote locale == Just True
390+ = B.toList . movePunctuationInsideQuotes . B.fromList
391+ | otherwise
392+ = id
390
393
391mvPunct :: Bool -> Locale -> [Inline] -> [Inline]
394mvPunct :: Bool -> Locale -> [Inline] -> [Inline]
392mvPunct moveNotes locale (x : xs)
395mvPunct moveNotes locale (x : xs)
@@ -399,7 +402,8 @@ mvPunct moveNotes locale (q : s : x : ys)
399 in if moveNotes
402 in if moveNotes
400 then if T.null spunct
403 then if T.null spunct
401 then q : x : mvPunct moveNotes locale ys
404 then q : x : mvPunct moveNotes locale ys
405+ else movePunctInsideQuotes locale
402− else q : Str spunct : x : mvPunct moveNotes locale
406+ [q , Str spunct , x] ++ mvPunct moveNotes locale
403 (B.toList
407 (B.toList
404 (dropTextWhile isPunctuation (B.fromList ys)))
408 (dropTextWhile isPunctuation (B.fromList ys)))
405 else q : x : mvPunct moveNotes locale ys
409 else q : x : mvPunct moveNotes locale ys
@@ -411,9 +415,10 @@ mvPunct moveNotes locale (Cite cs ils : ys)
411 , moveNotes
415 , moveNotes
412 = let s = stringify ys
416 = let s = stringify ys
413 spunct = T.takeWhile isPunctuation s
417 spunct = T.takeWhile isPunctuation s
418+ in Cite cs (movePunctInsideQuotes locale $
414− in Cite cs (init ils
419+ init ils
415− ++ [Str spunct | not (endWithPunct False (init ils))]
420+ ++ [Str spunct | not (endWithPunct False (init ils))]
416− ++ [last ils]) :
421+ ++ [last ils]) :
417 mvPunct moveNotes locale
422 mvPunct moveNotes locale
418 (B.toList (dropTextWhile isPunctuation (B.fromList ys)))
423 (B.toList (dropTextWhile isPunctuation (B.fromList ys)))
419mvPunct moveNotes locale (s : x : ys) | isSpacy s, isNote x =
424mvPunct moveNotes locale (s : x : ys) | isSpacy s, isNote x =
@@ -499,7 +504,8 @@ insertRefs refkvs refclasses meta refs bs =
499 put True
504 put True
500 -- refHeader isn't used if you have an explicit references div
505 -- refHeader isn't used if you have an explicit references div
501 let cs' = ordNub $ cs ++ refclasses
506 let cs' = ordNub $ cs ++ refclasses
507+ let kvs' = ordNub $ kvs ++ refkvs
502− return $ Div ("refs",cs',kvs) (xs ++ refs)
508+ return $ Div ("refs",cs',kvs') (xs ++ refs)
503 go x = return x
509 go x = return x
504
510
505refTitle :: Meta -> Maybe [Inline]
511refTitle :: Meta -> Maybe [Inline]
@@ -558,42 +564,62 @@ extractText (FancyVal x) = toText x
558extractText (NumVal n) = T.pack (show n)
564extractText (NumVal n) = T.pack (show n)
559extractText _ = mempty
565extractText _ = mempty
560
566
567+-- Here we take the Spans with class csl-note that are left
568+-- after deNote has removed nested ones, and convert them
569+-- into real notes.
561−capitalizeNoteCitation :: Inline -> Inline
570+addNote :: Inline -> Inline
562−capitalizeNoteCitation (Cite cs [Note [Para ils]]) =
571+addNote (Span ("",["csl-note"],[]) ils) =
563− Cite cs
572+ Note [Para $
564− [Note [Para $ B.toList $ addTextCase Nothing CapitalizeFirst
573+ B.toList . addTextCase Nothing CapitalizeFirst . B.fromList $ ils]
565− $ B.fromList ils]]
574+addNote x = x
566−capitalizeNoteCitation x = x
575+
567−
576+-- Here we handle citation notes that occur inside footnotes
577+-- or other citation notes, in a note style. We don't want
578+-- notes inside notes, so we convert these to parenthesized
579+-- or comma-separated citations.
568−deNote :: [Inline] -> [Inline]
580+deNote :: Inline -> Inline
569−deNote [] = []
581+deNote (Note bs) =
570−deNote (Note bs:rest) =
582+ case bs of
571− Note (walk go bs) : deNote rest
583+ [Para (cit@(Cite (c:_) _) : ils)]
584+ | citationMode c /= AuthorInText ->
585+ -- if citation is first in note, no need to parenthesize.
586+ Note [Para (walk removeNotes $ cit : walk addParens ils)]
587+ _ -> Note (walk removeNotes . walk addParens $ bs)
588+
572 where
589 where
573− go [] = []
590+ addParens [] = []
574− go (Cite (c:cs) ils : zs)
591+ addParens (Cite (c:cs) ils : zs)
575 | citationMode c == AuthorInText
592 | citationMode c == AuthorInText
576− = Cite (c:cs) (concatMap (noteAfterComma (needsPeriod zs)) ils) : go zs
593+ = Cite (c:cs) (concatMap (noteAfterComma (needsPeriod zs)) ils) :
594+ addParens zs
577 | otherwise
595 | otherwise
578− = Cite (c:cs) (concatMap noteInParens ils) : go zs
596+ = Cite (c:cs) (concatMap noteInParens ils) : addParens zs
579− go (x:xs) = x : go xs
597+ addParens (x:xs) = x : addParens xs
598+
599+ removeNotes (Span ("",["csl-note"],[]) ils) = Span ("",[],[]) ils
600+ removeNotes x = x
601+
580 needsPeriod [] = True
602 needsPeriod [] = True
581 needsPeriod (Str t:_) = case T.uncons t of
603 needsPeriod (Str t:_) = case T.uncons t of
582 Nothing -> False
604 Nothing -> False
583 Just (c,_) -> isUpper c
605 Just (c,_) -> isUpper c
584 needsPeriod (Space:zs) = needsPeriod zs
606 needsPeriod (Space:zs) = needsPeriod zs
585 needsPeriod _ = False
607 needsPeriod _ = False
608+
586− noteInParens (Note bs')
609+ noteInParens (Span ("",["csl-note"],[]) ils)
587 = Space : Str "(" :
610 = Space : Str "(" :
588− removeFinalPeriod (blocksToInlines bs') ++ [Str ")"]
611+ removeFinalPeriod ils ++ [Str ")"]
589 noteInParens x = [x]
612 noteInParens x = [x]
613+
590− noteAfterComma needsPer (Note bs')
614+ noteAfterComma needsPer (Span ("",["csl-note"],[]) ils)
615+ | not (null ils)
591 = Str "," : Space :
616 = Str "," : Space :
592− (if needsPer
617+ if needsPer
593− then id
618+ then ils
594− else removeFinalPeriod) (blocksToInlines bs')
619+ else removeFinalPeriod ils
595 noteAfterComma _ x = [x]
620 noteAfterComma _ x = [x]
621+
596−deNote (x:xs) = x : deNote xs
622+deNote x = x
597
623
598-- Note: we can't use dropTextWhileEnd indiscriminately,
624-- Note: we can't use dropTextWhileEnd indiscriminately,
599-- because this would remove the final period on abbreviations like Ibid.
625-- because this would remove the final period on abbreviations like Ibid.
src/Text/Pandoc/Citeproc/BibTeX.hs+4−2
@@ -71,9 +71,11 @@ readBibtexString variant locale idpred contents = do
71 filter (\item -> idpred (identifier item) &&
71 filter (\item -> idpred (identifier item) &&
72 entryType item /= "xdata"))
72 entryType item /= "xdata"))
73 (fromMaybe defaultLang $ localeLanguage locale, Map.empty)
73 (fromMaybe defaultLang $ localeLanguage locale, Map.empty)
74− "" (toSources contents) of
74+ (initialSourceName sources) sources of
75 Left err -> Left err
75 Left err -> Left err
76 Right xs -> return xs
76 Right xs -> return xs
77+ where
78+ sources = toSources contents
77
79
78-- | Write BibTeX or BibLaTeX given given a 'Reference'.
80-- | Write BibTeX or BibLaTeX given given a 'Reference'.
79writeBibtexString :: WriterOptions -- ^ options (for writing LaTex)
81writeBibtexString :: WriterOptions -- ^ options (for writing LaTex)
@@ -866,7 +868,7 @@ fieldName = resolveAlias . T.toLower
866
868
867isBibtexKeyChar :: Char -> Bool
869isBibtexKeyChar :: Char -> Bool
868isBibtexKeyChar c =
870isBibtexKeyChar c =
869− isAlphaNum c || c `elem` (".:;?!`'()/*@_+=-[]*&" :: [Char])
871+ isAlphaNum c || c `elem` (".:;?!`'()$/*@_+=-[]*&" :: [Char])
870
872
871bibItem :: BibParser Item
873bibItem :: BibParser Item
872bibItem = do
874bibItem = do
src/Text/Pandoc/Citeproc/Locator.hs+18−3
@@ -20,7 +20,7 @@ parseLocator :: Locale -> [Inline] -> (Maybe (Text, Text), [Inline])
20parseLocator locale inp =
20parseLocator locale inp =
21 case parse (pLocatorWords (toLocatorMap locale)) "suffix" $ splitInp inp of
21 case parse (pLocatorWords (toLocatorMap locale)) "suffix" $ splitInp inp of
22 Right r -> r
22 Right r -> r
23− Left _ -> (Nothing, inp)
23+ Left _ -> (Nothing, maybeAddComma inp)
24
24
25splitInp :: [Inline] -> [Inline]
25splitInp :: [Inline] -> [Inline]
26splitInp = splitStrWhen (\c -> isSpace c || (isPunctuation c && c /= ':'))
26splitInp = splitStrWhen (\c -> isSpace c || (isPunctuation c && c /= ':'))
@@ -42,9 +42,17 @@ pLocatorWords locMap = do
42 -- i.e. the first one will be " 9"
42 -- i.e. the first one will be " 9"
43 return $
43 return $
44 if T.null la && T.null lo
44 if T.null la && T.null lo
45− then (Nothing, s)
45+ then (Nothing, maybeAddComma s)
46 else (Just (la, T.strip lo), s)
46 else (Just (la, T.strip lo), s)
47
47
48+maybeAddComma :: [Inline] -> [Inline]
49+maybeAddComma [] = []
50+maybeAddComma ils@(Space : _) = ils
51+maybeAddComma ils@(Str t : _)
52+ | Just (c, _) <- T.uncons t
53+ , isPunctuation c = ils
54+maybeAddComma ils = Str "," : Space : ils
55+
48pLocatorDelimited :: LocatorMap -> LocatorParser (Text, Text)
56pLocatorDelimited :: LocatorMap -> LocatorParser (Text, Text)
49pLocatorDelimited locMap = try $ do
57pLocatorDelimited locMap = try $ do
50 _ <- pMatchChar "{" (== '{')
58 _ <- pMatchChar "{" (== '{')
@@ -97,7 +105,7 @@ pLocatorLabel' locMap lim = go ""
97 t <- anyToken
105 t <- anyToken
98 ts <- manyTill anyToken (try $ lookAhead lim)
106 ts <- manyTill anyToken (try $ lookAhead lim)
99 let s = acc <> stringify (t:ts)
107 let s = acc <> stringify (t:ts)
100− case M.lookup (T.strip s) locMap of
108+ case M.lookup (T.toCaseFold $ T.strip s) locMap of
101 -- try to find a longer one, or return this one
109 -- try to find a longer one, or return this one
102 Just l -> go s <|> return (l, False)
110 Just l -> go s <|> return (l, False)
103 Nothing -> go s
111 Nothing -> go s
@@ -181,6 +189,7 @@ pPageUnit = roman <|> plainUnit
181 plainUnit = do
189 plainUnit = do
182 ts <- many1 (notFollowedBy pSpace >>
190 ts <- many1 (notFollowedBy pSpace >>
183 notFollowedBy pLocatorPunct >>
191 notFollowedBy pLocatorPunct >>
192+ notFollowedBy pMath >>
184 anyToken)
193 anyToken)
185 let s = stringify ts
194 let s = stringify ts
186 -- otherwise look for actual digits or -s
195 -- otherwise look for actual digits or -s
@@ -211,6 +220,12 @@ pMatchChar msg f = satisfyTok f' <?> msg
211pSpace :: LocatorParser Inline
220pSpace :: LocatorParser Inline
212pSpace = satisfyTok (\t -> isSpacey t || t == Str "\160") <?> "space"
221pSpace = satisfyTok (\t -> isSpacey t || t == Str "\160") <?> "space"
213
222
223+pMath :: LocatorParser Inline
224+pMath = satisfyTok isMath
225+ where
226+ isMath (Math{}) = True
227+ isMath _ = False
228+
214satisfyTok :: (Inline -> Bool) -> LocatorParser Inline
229satisfyTok :: (Inline -> Bool) -> LocatorParser Inline
215satisfyTok f = tokenPrim show (\sp _ _ -> sp) (\tok -> if f tok
230satisfyTok f = tokenPrim show (\sp _ _ -> sp) (\tok -> if f tok
216 then Just tok
231 then Just tok
src/Text/Pandoc/Class/IO.hs+21−22
@@ -62,7 +62,7 @@ import Text.Pandoc.Definition (Pandoc, Inline (Image))
62import Text.Pandoc.Error (PandocError (..))
62import Text.Pandoc.Error (PandocError (..))
63import Text.Pandoc.Logging (LogMessage (..), messageVerbosity, showLogMessage)
63import Text.Pandoc.Logging (LogMessage (..), messageVerbosity, showLogMessage)
64import Text.Pandoc.MIME (MimeType)
64import Text.Pandoc.MIME (MimeType)
65−import Text.Pandoc.MediaBag (MediaBag, lookupMedia, mediaDirectory)
65+import Text.Pandoc.MediaBag (MediaBag, MediaItem(..), lookupMedia, mediaItems)
66import Text.Pandoc.Walk (walk)
66import Text.Pandoc.Walk (walk)
67import qualified Control.Exception as E
67import qualified Control.Exception as E
68import qualified Data.ByteString as B
68import qualified Data.ByteString as B
@@ -200,33 +200,32 @@ alertIndent (l:ls) = do
200extractMedia :: (PandocMonad m, MonadIO m) => FilePath -> Pandoc -> m Pandoc
200extractMedia :: (PandocMonad m, MonadIO m) => FilePath -> Pandoc -> m Pandoc
201extractMedia dir d = do
201extractMedia dir d = do
202 media <- getMediaBag
202 media <- getMediaBag
203− case [fp | (fp, _, _) <- mediaDirectory media] of
203+ let items = mediaItems media
204+ if null items
204− [] -> return d
205+ then return d
205− fps -> do
206+ else do
206− mapM_ (writeMedia dir media) fps
207+ mapM_ (writeMedia dir) items
207− return $ walk (adjustImagePath dir fps) d
208+ return $ walk (adjustImagePath dir media) d
208
209
209-- | Write the contents of a media bag to a path.
210-- | Write the contents of a media bag to a path.
210writeMedia :: (PandocMonad m, MonadIO m)
211writeMedia :: (PandocMonad m, MonadIO m)
211− => FilePath -> MediaBag -> FilePath
212+ => FilePath
213+ -> (FilePath, MimeType, BL.ByteString)
212 -> m ()
214 -> m ()
213−writeMedia dir mediabag subpath = do
215+writeMedia dir (fp, _mt, bs) = do
214− -- we join and split to convert a/b/c to a\b\c on Windows;
216+ -- we normalize to get proper path separators for the platform
215− -- in zip containers all paths use /
216− let fullpath = dir </> unEscapeString (normalise subpath)
217+ let fullpath = normalise $ dir </> fp
217− let mbcontents = lookupMedia subpath mediabag
218− case mbcontents of
219− Nothing -> throwError $ PandocResourceNotFound $ pack subpath
220− Just (_, bs) -> do
221− report $ Extracting $ pack fullpath
222− liftIOError (createDirectoryIfMissing True) (takeDirectory fullpath)
218+ liftIOError (createDirectoryIfMissing True) (takeDirectory fullpath)
223− logIOError $ BL.writeFile fullpath bs
219+ logIOError $ BL.writeFile fullpath bs
224
220
225-- | If the given Inline element is an image with a @src@ path equal to
221-- | If the given Inline element is an image with a @src@ path equal to
226-- one in the list of @paths@, then prepends @dir@ to the image source;
222-- one in the list of @paths@, then prepends @dir@ to the image source;
227-- returns the element unchanged otherwise.
223-- returns the element unchanged otherwise.
228−adjustImagePath :: FilePath -> [FilePath] -> Inline -> Inline
224+adjustImagePath :: FilePath -> MediaBag -> Inline -> Inline
229−adjustImagePath dir paths (Image attr lab (src, tit))
225+adjustImagePath dir mediabag (Image attr lab (src, tit)) =
230− | unpack src `elem` paths
226+ case lookupMedia (T.unpack src) mediabag of
227+ Nothing -> Image attr lab (src, tit)
228+ Just item ->
229+ let fullpath = dir </> mediaPath item
231− = Image attr lab (pack (normalise $ dir </> unpack src), tit)
230+ in Image attr lab (T.pack fullpath, tit)
232adjustImagePath _ _ x = x
231adjustImagePath _ _ x = x
src/Text/Pandoc/Class/PandocMonad.hs+20−31
@@ -1,4 +1,5 @@
1{-# LANGUAGE CPP #-}
1{-# LANGUAGE CPP #-}
2+{-# LANGUAGE TupleSections #-}
2{-# LANGUAGE FlexibleContexts #-}
3{-# LANGUAGE FlexibleContexts #-}
3{-# LANGUAGE FlexibleInstances #-}
4{-# LANGUAGE FlexibleInstances #-}
4{-# LANGUAGE MultiParamTypeClasses #-}
5{-# LANGUAGE MultiParamTypeClasses #-}
@@ -37,7 +38,6 @@ module Text.Pandoc.Class.PandocMonad
37 , setUserDataDir
38 , setUserDataDir
38 , getUserDataDir
39 , getUserDataDir
39 , fetchItem
40 , fetchItem
40− , fetchMediaResource
41 , getInputFiles
41 , getInputFiles
42 , setInputFiles
42 , setInputFiles
43 , getOutputFile
43 , getOutputFile
@@ -57,8 +57,6 @@ module Text.Pandoc.Class.PandocMonad
57import Codec.Archive.Zip
57import Codec.Archive.Zip
58import Control.Monad.Except (MonadError (catchError, throwError),
58import Control.Monad.Except (MonadError (catchError, throwError),
59 MonadTrans, lift, when)
59 MonadTrans, lift, when)
60−import Data.Digest.Pure.SHA (sha1, showDigest)
61−import Data.Maybe (fromMaybe)
62import Data.List (foldl')
60import Data.List (foldl')
63import Data.Time (UTCTime)
61import Data.Time (UTCTime)
64import Data.Time.Clock.POSIX (POSIXTime, utcTimeToPOSIXSeconds,
62import Data.Time.Clock.POSIX (POSIXTime, utcTimeToPOSIXSeconds,
@@ -67,16 +65,16 @@ import Data.Time.LocalTime (TimeZone, ZonedTime, utcToZonedTime)
67import Network.URI ( escapeURIString, nonStrictRelativeTo,
65import Network.URI ( escapeURIString, nonStrictRelativeTo,
68 unEscapeString, parseURIReference, isAllowedInURI,
66 unEscapeString, parseURIReference, isAllowedInURI,
69 parseURI, URI(..) )
67 parseURI, URI(..) )
70−import System.FilePath ((</>), (<.>), takeExtension, dropExtension,
68+import System.FilePath ((</>), takeExtension, dropExtension,
71− isRelative, splitDirectories)
69+ isRelative, splitDirectories, makeRelative)
72import System.Random (StdGen)
70import System.Random (StdGen)
73import Text.Collate.Lang (Lang(..), parseLang, renderLang)
71import Text.Collate.Lang (Lang(..), parseLang, renderLang)
74import Text.Pandoc.Class.CommonState (CommonState (..))
72import Text.Pandoc.Class.CommonState (CommonState (..))
75import Text.Pandoc.Definition
73import Text.Pandoc.Definition
76import Text.Pandoc.Error
74import Text.Pandoc.Error
77import Text.Pandoc.Logging
75import Text.Pandoc.Logging
78−import Text.Pandoc.MIME (MimeType, getMimeType, extensionFromMimeType)
76+import Text.Pandoc.MIME (MimeType, getMimeType)
79−import Text.Pandoc.MediaBag (MediaBag, lookupMedia)
77+import Text.Pandoc.MediaBag (MediaBag, lookupMedia, MediaItem(..))
80import Text.Pandoc.Shared (uriPathToPath, safeRead)
78import Text.Pandoc.Shared (uriPathToPath, safeRead)
81import Text.Pandoc.Translations (Term(..), Translations, lookupTerm,
79import Text.Pandoc.Translations (Term(..), Translations, lookupTerm,
82 readTranslations)
80 readTranslations)
@@ -376,7 +374,8 @@ fetchItem :: PandocMonad m
376fetchItem s = do
374fetchItem s = do
377 mediabag <- getMediaBag
375 mediabag <- getMediaBag
378 case lookupMedia (T.unpack s) mediabag of
376 case lookupMedia (T.unpack s) mediabag of
379− Just (mime, bs) -> return (BL.toStrict bs, Just mime)
377+ Just item -> return (BL.toStrict (mediaContents item),
378+ Just (mediaMimeType item))
380 Nothing -> downloadOrRead s
379 Nothing -> downloadOrRead s
381
380
382-- | Returns the content and, if available, the MIME type of a resource.
381-- | Returns the content and, if available, the MIME type of a resource.
@@ -411,9 +410,10 @@ downloadOrRead s = do
411 _ -> readLocalFile fp -- get from local file system
410 _ -> readLocalFile fp -- get from local file system
412 where readLocalFile f = do
411 where readLocalFile f = do
413 resourcePath <- getResourcePath
412 resourcePath <- getResourcePath
414− cont <- if isRelative f
413+ (fp', cont) <- if isRelative f
415− then withPaths resourcePath readFileStrict f
414+ then withPaths resourcePath readFileStrict f
416− else readFileStrict f
415+ else (f,) <$> readFileStrict f
416+ report $ LoadedResource f (makeRelative "." fp')
417 return (cont, mime)
417 return (cont, mime)
418 httpcolon = URI{ uriScheme = "http:",
418 httpcolon = URI{ uriScheme = "http:",
419 uriAuthority = Nothing,
419 uriAuthority = Nothing,
@@ -623,25 +623,13 @@ makeCanonical = Posix.joinPath . transformPathParts . splitDirectories
623-- that filepath. Returns the result of the first successful execution
623-- that filepath. Returns the result of the first successful execution
624-- of the action, or throws a @PandocResourceNotFound@ exception if the
624-- of the action, or throws a @PandocResourceNotFound@ exception if the
625-- action errors for all filepaths.
625-- action errors for all filepaths.
626+withPaths :: PandocMonad m
626−withPaths :: PandocMonad m => [FilePath] -> (FilePath -> m a) -> FilePath -> m a
627+ => [FilePath] -> (FilePath -> m a) -> FilePath -> m (FilePath, a)
627withPaths [] _ fp = throwError $ PandocResourceNotFound $ T.pack fp
628withPaths [] _ fp = throwError $ PandocResourceNotFound $ T.pack fp
628withPaths (p:ps) action fp =
629withPaths (p:ps) action fp =
629− catchError (action (p </> fp))
630+ catchError ((p </> fp,) <$> action (p </> fp))
630 (\_ -> withPaths ps action fp)
631 (\_ -> withPaths ps action fp)
631
632
632−-- | Fetch local or remote resource (like an image) and provide data suitable
633−-- for adding it to the MediaBag.
634−fetchMediaResource :: PandocMonad m
635− => T.Text -> m (FilePath, Maybe MimeType, BL.ByteString)
636−fetchMediaResource src = do
637− (bs, mt) <- downloadOrRead src
638− let ext = fromMaybe (T.pack $ takeExtension $ T.unpack src)
639− (mt >>= extensionFromMimeType)
640− let bs' = BL.fromChunks [bs]
641− let basename = showDigest $ sha1 bs'
642− let fname = basename <.> T.unpack ext
643− return (fname, mt, bs')
644−
645-- | Traverse tree, filling media bag for any images that
633-- | Traverse tree, filling media bag for any images that
646-- aren't already in the media bag.
634-- aren't already in the media bag.
647fillMediaBag :: PandocMonad m => Pandoc -> m Pandoc
635fillMediaBag :: PandocMonad m => Pandoc -> m Pandoc
@@ -649,12 +637,13 @@ fillMediaBag d = walkM handleImage d
649 where handleImage :: PandocMonad m => Inline -> m Inline
637 where handleImage :: PandocMonad m => Inline -> m Inline
650 handleImage (Image attr lab (src, tit)) = catchError
638 handleImage (Image attr lab (src, tit)) = catchError
651 (do mediabag <- getMediaBag
639 (do mediabag <- getMediaBag
652− case lookupMedia (T.unpack src) mediabag of
640+ let fp = T.unpack src
641+ case lookupMedia fp mediabag of
653− Just (_, _) -> return $ Image attr lab (src, tit)
642+ Just _ -> return ()
654 Nothing -> do
643 Nothing -> do
655− (fname, mt, bs) <- fetchMediaResource src
644+ (bs, mt) <- fetchItem src
656− insertMedia fname mt bs
645+ insertMedia fp mt (BL.fromStrict bs)
657− return $ Image attr lab (T.pack fname, tit))
646+ return $ Image attr lab (src, tit))
658 (\e ->
647 (\e ->
659 case e of
648 case e of
660 PandocResourceNotFound _ -> do
649 PandocResourceNotFound _ -> do
src/Text/Pandoc/Error.hs+3−3
@@ -97,13 +97,13 @@ renderError e =
97 [] -> ""
97 [] -> ""
98 ((pos,txt):_) ->
98 ((pos,txt):_) ->
99 let ls = T.lines txt <> [""]
99 let ls = T.lines txt <> [""]
100− ln = errLine - sourceLine pos
100+ ln = (errLine - sourceLine pos) + 1
101− in if length ls > ln - 1
101+ in if length ls > ln && ln >= 1
102 then T.concat ["\n", ls !! (ln - 1)
102 then T.concat ["\n", ls !! (ln - 1)
103 ,"\n", T.replicate (errColumn - 1) " "
103 ,"\n", T.replicate (errColumn - 1) " "
104 ,"^"]
104 ,"^"]
105 else ""
105 else ""
106− in "\nError at " <> tshow err' <> errorInFile
106+ in "Error at " <> tshow err' <> errorInFile
107 PandocMakePDFError s -> s
107 PandocMakePDFError s -> s
108 PandocOptionError s -> s
108 PandocOptionError s -> s
109 PandocSyntaxMapError s -> s
109 PandocSyntaxMapError s -> s
src/Text/Pandoc/Extensions.hs+4
@@ -136,6 +136,8 @@ data Extension =
136 | Ext_raw_html -- ^ Allow raw HTML
136 | Ext_raw_html -- ^ Allow raw HTML
137 | Ext_raw_tex -- ^ Allow raw TeX (other than math)
137 | Ext_raw_tex -- ^ Allow raw TeX (other than math)
138 | Ext_raw_markdown -- ^ Parse markdown in ipynb as raw markdown
138 | Ext_raw_markdown -- ^ Parse markdown in ipynb as raw markdown
139+ | Ext_rebase_relative_paths -- ^ Rebase relative image and link paths,
140+ -- relative to directory of containing file
139 | Ext_shortcut_reference_links -- ^ Shortcut reference links
141 | Ext_shortcut_reference_links -- ^ Shortcut reference links
140 | Ext_simple_tables -- ^ Pandoc-style simple tables
142 | Ext_simple_tables -- ^ Pandoc-style simple tables
141 | Ext_smart -- ^ "Smart" quotes, apostrophes, ellipses, dashes
143 | Ext_smart -- ^ "Smart" quotes, apostrophes, ellipses, dashes
@@ -462,6 +464,7 @@ getAllExtensions f = universalExtensions <> getAll f
462 , Ext_gutenberg
464 , Ext_gutenberg
463 , Ext_smart
465 , Ext_smart
464 , Ext_literate_haskell
466 , Ext_literate_haskell
467+ , Ext_rebase_relative_paths
465 ]
468 ]
466 getAll "markdown_strict" = allMarkdownExtensions
469 getAll "markdown_strict" = allMarkdownExtensions
467 getAll "markdown_phpextra" = allMarkdownExtensions
470 getAll "markdown_phpextra" = allMarkdownExtensions
@@ -514,6 +517,7 @@ getAllExtensions f = universalExtensions <> getAll f
514 , Ext_attributes
517 , Ext_attributes
515 , Ext_sourcepos
518 , Ext_sourcepos
516 , Ext_yaml_metadata_block
519 , Ext_yaml_metadata_block
520+ , Ext_rebase_relative_paths
517 ]
521 ]
518 getAll "commonmark_x" = getAll "commonmark"
522 getAll "commonmark_x" = getAll "commonmark"
519 getAll "org" = autoIdExtensions <>
523 getAll "org" = autoIdExtensions <>
src/Text/Pandoc/ImageSize.hs+5−1
@@ -57,7 +57,8 @@ import Codec.Picture (decodeImageWithMetadata)
57-- quick and dirty functions to get image sizes
57-- quick and dirty functions to get image sizes
58-- algorithms borrowed from wwwis.pl
58-- algorithms borrowed from wwwis.pl
59
59
60−data ImageType = Png | Gif | Jpeg | Svg | Pdf | Eps | Emf deriving Show
60+data ImageType = Png | Gif | Jpeg | Svg | Pdf | Eps | Emf | Tiff
61+ deriving Show
61data Direction = Width | Height
62data Direction = Width | Height
62instance Show Direction where
63instance Show Direction where
63 show Width = "width"
64 show Width = "width"
@@ -100,6 +101,8 @@ imageType :: ByteString -> Maybe ImageType
100imageType img = case B.take 4 img of
101imageType img = case B.take 4 img of
101 "\x89\x50\x4e\x47" -> return Png
102 "\x89\x50\x4e\x47" -> return Png
102 "\x47\x49\x46\x38" -> return Gif
103 "\x47\x49\x46\x38" -> return Gif
104+ "\x49\x49\x2a\x00" -> return Tiff
105+ "\x4D\x4D\x00\x2a" -> return Tiff
103 "\xff\xd8\xff\xe0" -> return Jpeg -- JFIF
106 "\xff\xd8\xff\xe0" -> return Jpeg -- JFIF
104 "\xff\xd8\xff\xe1" -> return Jpeg -- Exif
107 "\xff\xd8\xff\xe1" -> return Jpeg -- Exif
105 "%PDF" -> return Pdf
108 "%PDF" -> return Pdf
@@ -124,6 +127,7 @@ imageSize opts img = checkDpi <$>
124 Just Png -> getSize img
127 Just Png -> getSize img
125 Just Gif -> getSize img
128 Just Gif -> getSize img
126 Just Jpeg -> getSize img
129 Just Jpeg -> getSize img
130+ Just Tiff -> getSize img
127 Just Svg -> mbToEither "could not determine SVG size" $ svgSize opts img
131 Just Svg -> mbToEither "could not determine SVG size" $ svgSize opts img
128 Just Eps -> mbToEither "could not determine EPS size" $ epsSize img
132 Just Eps -> mbToEither "could not determine EPS size" $ epsSize img
129 Just Pdf -> mbToEither "could not determine PDF size" $ pdfSize img
133 Just Pdf -> mbToEither "could not determine PDF size" $ pdfSize img
src/Text/Pandoc/Logging.hs+13−6
@@ -85,6 +85,7 @@ data LogMessage =
85 | CouldNotParseCSS Text
85 | CouldNotParseCSS Text
86 | Fetching Text
86 | Fetching Text
87 | Extracting Text
87 | Extracting Text
88+ | LoadedResource FilePath FilePath
88 | NoTitleElement Text
89 | NoTitleElement Text
89 | NoLangSpecified
90 | NoLangSpecified
90 | InvalidLang Text
91 | InvalidLang Text
@@ -195,6 +196,9 @@ instance ToJSON LogMessage where
195 ["path" .= fp]
196 ["path" .= fp]
196 Extracting fp ->
197 Extracting fp ->
197 ["path" .= fp]
198 ["path" .= fp]
199+ LoadedResource orig found ->
200+ ["for" .= orig
201+ ,"from" .= found]
198 NoTitleElement fallback ->
202 NoTitleElement fallback ->
199 ["fallback" .= fallback]
203 ["fallback" .= fallback]
200 NoLangSpecified -> []
204 NoLangSpecified -> []
@@ -278,7 +282,7 @@ showLogMessage msg =
278 ParsingUnescaped s pos ->
282 ParsingUnescaped s pos ->
279 "Parsing unescaped '" <> s <> "' at " <> showPos pos
283 "Parsing unescaped '" <> s <> "' at " <> showPos pos
280 CouldNotLoadIncludeFile fp pos ->
284 CouldNotLoadIncludeFile fp pos ->
281− "Could not load include file '" <> fp <> "' at " <> showPos pos
285+ "Could not load include file " <> fp <> " at " <> showPos pos
282 MacroAlreadyDefined name pos ->
286 MacroAlreadyDefined name pos ->
283 "Macro '" <> name <> "' already defined, ignoring at " <> showPos pos
287 "Macro '" <> name <> "' already defined, ignoring at " <> showPos pos
284 InlineNotRendered il ->
288 InlineNotRendered il ->
@@ -290,18 +294,18 @@ showLogMessage msg =
290 IgnoredIOError s ->
294 IgnoredIOError s ->
291 "IO Error (ignored): " <> s
295 "IO Error (ignored): " <> s
292 CouldNotFetchResource fp s ->
296 CouldNotFetchResource fp s ->
293− "Could not fetch resource '" <> fp <> "'" <>
297+ "Could not fetch resource " <> fp <>
294 if Text.null s then "" else ": " <> s
298 if Text.null s then "" else ": " <> s
295 CouldNotDetermineImageSize fp s ->
299 CouldNotDetermineImageSize fp s ->
296− "Could not determine image size for '" <> fp <> "'" <>
300+ "Could not determine image size for " <> fp <>
297 if Text.null s then "" else ": " <> s
301 if Text.null s then "" else ": " <> s
298 CouldNotConvertImage fp s ->
302 CouldNotConvertImage fp s ->
299− "Could not convert image '" <> fp <> "'" <>
303+ "Could not convert image " <> fp <>
300 if Text.null s then "" else ": " <> s
304 if Text.null s then "" else ": " <> s
301 CouldNotDetermineMimeType fp ->
305 CouldNotDetermineMimeType fp ->
302− "Could not determine mime type for '" <> fp <> "'"
306+ "Could not determine mime type for " <> fp
303 CouldNotConvertTeXMath s m ->
307 CouldNotConvertTeXMath s m ->
304− "Could not convert TeX math '" <> s <> "', rendering as TeX" <>
308+ "Could not convert TeX math " <> s <> ", rendering as TeX" <>
305 if Text.null m then "" else ":\n" <> m
309 if Text.null m then "" else ":\n" <> m
306 CouldNotParseCSS m ->
310 CouldNotParseCSS m ->
307 "Could not parse CSS" <> if Text.null m then "" else ":\n" <> m
311 "Could not parse CSS" <> if Text.null m then "" else ":\n" <> m
@@ -309,6 +313,8 @@ showLogMessage msg =
309 "Fetching " <> fp <> "..."
313 "Fetching " <> fp <> "..."
310 Extracting fp ->
314 Extracting fp ->
311 "Extracting " <> fp <> "..."
315 "Extracting " <> fp <> "..."
316+ LoadedResource orig found ->
317+ "Loaded " <> Text.pack orig <> " from " <> Text.pack found
312 NoTitleElement fallback ->
318 NoTitleElement fallback ->
313 "This document format requires a nonempty <title> element.\n" <>
319 "This document format requires a nonempty <title> element.\n" <>
314 "Defaulting to '" <> fallback <> "' as the title.\n" <>
320 "Defaulting to '" <> fallback <> "' as the title.\n" <>
@@ -389,6 +395,7 @@ messageVerbosity msg =
389 CouldNotParseCSS{} -> WARNING
395 CouldNotParseCSS{} -> WARNING
390 Fetching{} -> INFO
396 Fetching{} -> INFO
391 Extracting{} -> INFO
397 Extracting{} -> INFO
398+ LoadedResource{} -> INFO
392 NoTitleElement{} -> WARNING
399 NoTitleElement{} -> WARNING
393 NoLangSpecified -> INFO
400 NoLangSpecified -> INFO
394 InvalidLang{} -> WARNING
401 InvalidLang{} -> WARNING
src/Text/Pandoc/Lua/Module/MediaBag.hs+3−3
@@ -73,9 +73,9 @@ lookup fp = do
73 res <- MB.lookupMedia fp <$> getMediaBag
73 res <- MB.lookupMedia fp <$> getMediaBag
74 liftPandocLua $ case res of
74 liftPandocLua $ case res of
75 Nothing -> 1 <$ Lua.pushnil
75 Nothing -> 1 <$ Lua.pushnil
76− Just (mimeType, contents) -> do
76+ Just item -> do
77− Lua.push mimeType
77+ Lua.push $ MB.mediaMimeType item
78− Lua.push contents
78+ Lua.push $ MB.mediaContents item
79 return 2
79 return 2
80
80
81list :: PandocLua NumResults
81list :: PandocLua NumResults
src/Text/Pandoc/Lua/Module/Utils.hs+1−1
@@ -146,7 +146,7 @@ from_simple_table (SimpleTable capt aligns widths head' body) = do
146 nullAttr
146 nullAttr
147 (Caption Nothing [Plain capt])
147 (Caption Nothing [Plain capt])
148 (zipWith (\a w -> (a, toColWidth w)) aligns widths)
148 (zipWith (\a w -> (a, toColWidth w)) aligns widths)
149− (TableHead nullAttr [blockListToRow head'])
149+ (TableHead nullAttr [blockListToRow head' | not (null head') ])
150 [TableBody nullAttr 0 [] $ map blockListToRow body]
150 [TableBody nullAttr 0 [] $ map blockListToRow body]
151 (TableFoot nullAttr [])
151 (TableFoot nullAttr [])
152 return (NumResults 1)
152 return (NumResults 1)
src/Text/Pandoc/MIME.hs+10
@@ -43,6 +43,16 @@ getMimeTypeDef :: FilePath -> MimeType
43getMimeTypeDef = fromMaybe "application/octet-stream" . getMimeType
43getMimeTypeDef = fromMaybe "application/octet-stream" . getMimeType
44
44
45extensionFromMimeType :: MimeType -> Maybe T.Text
45extensionFromMimeType :: MimeType -> Maybe T.Text
46+-- few special cases, where there are multiple options:
47+extensionFromMimeType "text/plain" = Just "txt"
48+extensionFromMimeType "video/quicktime" = Just "mov"
49+extensionFromMimeType "video/mpeg" = Just "mpeg"
50+extensionFromMimeType "video/dv" = Just "dv"
51+extensionFromMimeType "image/vnd.djvu" = Just "djvu"
52+extensionFromMimeType "image/tiff" = Just "tiff"
53+extensionFromMimeType "image/jpeg" = Just "jpg"
54+extensionFromMimeType "application/xml" = Just "xml"
55+extensionFromMimeType "application/ogg" = Just "ogg"
46extensionFromMimeType mimetype =
56extensionFromMimeType mimetype =
47 M.lookup (T.takeWhile (/=';') mimetype) reverseMimeTypes
57 M.lookup (T.takeWhile (/=';') mimetype) reverseMimeTypes
48 -- note: we just look up the basic mime type, dropping the content-encoding etc.
58 -- note: we just look up the basic mime type, dropping the content-encoding etc.
src/Text/Pandoc/MediaBag.hs+45−14
@@ -1,4 +1,5 @@
1{-# LANGUAGE CPP #-}
1{-# LANGUAGE CPP #-}
2+{-# LANGUAGE OverloadedStrings #-}
2{-# LANGUAGE DeriveDataTypeable #-}
3{-# LANGUAGE DeriveDataTypeable #-}
3{-# LANGUAGE GeneralizedNewtypeDeriving #-}
4{-# LANGUAGE GeneralizedNewtypeDeriving #-}
4{- |
5{- |
@@ -14,6 +15,7 @@ Definition of a MediaBag object to hold binary resources, and an
14interface for interacting with it.
15interface for interacting with it.
15-}
16-}
16module Text.Pandoc.MediaBag (
17module Text.Pandoc.MediaBag (
18+ MediaItem(..),
17 MediaBag,
19 MediaBag,
18 deleteMedia,
20 deleteMedia,
19 lookupMedia,
21 lookupMedia,
@@ -24,29 +26,43 @@ module Text.Pandoc.MediaBag (
24import qualified Data.ByteString.Lazy as BL
26import qualified Data.ByteString.Lazy as BL
25import Data.Data (Data)
27import Data.Data (Data)
26import qualified Data.Map as M
28import qualified Data.Map as M
27−import Data.Maybe (fromMaybe)
29+import Data.Maybe (fromMaybe, isNothing)
28import Data.Typeable (Typeable)
30import Data.Typeable (Typeable)
29import System.FilePath
31import System.FilePath
30−import qualified System.FilePath.Posix as Posix
31−import Text.Pandoc.MIME (MimeType, getMimeTypeDef)
32+import Text.Pandoc.MIME (MimeType, getMimeTypeDef, extensionFromMimeType)
33+import Data.Text (Text)
34+import qualified Data.Text as T
35+import Data.Digest.Pure.SHA (sha1, showDigest)
36+import Network.URI (URI (..), parseURI)
37+
38+data MediaItem =
39+ MediaItem
40+ { mediaMimeType :: MimeType
41+ , mediaPath :: FilePath
42+ , mediaContents :: BL.ByteString
43+ } deriving (Eq, Ord, Show, Data, Typeable)
32
44
33-- | A container for a collection of binary resources, with names and
45-- | A container for a collection of binary resources, with names and
34-- mime types. Note that a 'MediaBag' is a Monoid, so 'mempty'
46-- mime types. Note that a 'MediaBag' is a Monoid, so 'mempty'
35-- can be used for an empty 'MediaBag', and '<>' can be used to append
47-- can be used for an empty 'MediaBag', and '<>' can be used to append
36-- two 'MediaBag's.
48-- two 'MediaBag's.
37−newtype MediaBag = MediaBag (M.Map [FilePath] (MimeType, BL.ByteString))
49+newtype MediaBag = MediaBag (M.Map Text MediaItem)
38 deriving (Semigroup, Monoid, Data, Typeable)
50 deriving (Semigroup, Monoid, Data, Typeable)
39
51
40instance Show MediaBag where
52instance Show MediaBag where
41 show bag = "MediaBag " ++ show (mediaDirectory bag)
53 show bag = "MediaBag " ++ show (mediaDirectory bag)
42
54
55+-- | We represent paths with /, in normalized form.
56+canonicalize :: FilePath -> Text
57+canonicalize = T.replace "\\" "/" . T.pack . normalise
58+
43-- | Delete a media item from a 'MediaBag', or do nothing if no item corresponds
59-- | Delete a media item from a 'MediaBag', or do nothing if no item corresponds
44-- to the given path.
60-- to the given path.
45deleteMedia :: FilePath -- ^ relative path and canonical name of resource
61deleteMedia :: FilePath -- ^ relative path and canonical name of resource
46 -> MediaBag
62 -> MediaBag
47 -> MediaBag
63 -> MediaBag
48deleteMedia fp (MediaBag mediamap) =
64deleteMedia fp (MediaBag mediamap) =
49− MediaBag $ M.delete (splitDirectories fp) mediamap
65+ MediaBag $ M.delete (canonicalize fp) mediamap
50
66
51-- | Insert a media item into a 'MediaBag', replacing any existing
67-- | Insert a media item into a 'MediaBag', replacing any existing
52-- value with the same name.
68-- value with the same name.
@@ -56,26 +72,41 @@ insertMedia :: FilePath -- ^ relative path and canonical name of resource
56 -> MediaBag
72 -> MediaBag
57 -> MediaBag
73 -> MediaBag
58insertMedia fp mbMime contents (MediaBag mediamap) =
74insertMedia fp mbMime contents (MediaBag mediamap) =
59− MediaBag (M.insert (splitDirectories fp) (mime, contents) mediamap)
75+ MediaBag (M.insert fp' mediaItem mediamap)
60− where mime = fromMaybe fallback mbMime
76+ where mediaItem = MediaItem{ mediaPath = newpath
77+ , mediaContents = contents
78+ , mediaMimeType = mt }
79+ fp' = canonicalize fp
80+ uri = parseURI fp
81+ newpath = if isRelative fp
82+ && isNothing uri
83+ && ".." `notElem` splitPath fp
84+ then T.unpack fp'
85+ else showDigest (sha1 contents) <> "." <> ext
61 fallback = case takeExtension fp of
86 fallback = case takeExtension fp of
62 ".gz" -> getMimeTypeDef $ dropExtension fp
87 ".gz" -> getMimeTypeDef $ dropExtension fp
63 _ -> getMimeTypeDef fp
88 _ -> getMimeTypeDef fp
89+ mt = fromMaybe fallback mbMime
90+ path = maybe fp uriPath uri
91+ ext = case takeExtension path of
92+ '.':e -> e
93+ _ -> maybe "" T.unpack $ extensionFromMimeType mt
94+
64
95
65-- | Lookup a media item in a 'MediaBag', returning mime type and contents.
96-- | Lookup a media item in a 'MediaBag', returning mime type and contents.
66lookupMedia :: FilePath
97lookupMedia :: FilePath
67 -> MediaBag
98 -> MediaBag
68− -> Maybe (MimeType, BL.ByteString)
99+ -> Maybe MediaItem
69−lookupMedia fp (MediaBag mediamap) = M.lookup (splitDirectories fp) mediamap
100+lookupMedia fp (MediaBag mediamap) = M.lookup (canonicalize fp) mediamap
70
101
71-- | Get a list of the file paths stored in a 'MediaBag', with
102-- | Get a list of the file paths stored in a 'MediaBag', with
72-- their corresponding mime types and the lengths in bytes of the contents.
103-- their corresponding mime types and the lengths in bytes of the contents.
73mediaDirectory :: MediaBag -> [(FilePath, MimeType, Int)]
104mediaDirectory :: MediaBag -> [(FilePath, MimeType, Int)]
74−mediaDirectory (MediaBag mediamap) =
105+mediaDirectory mediabag =
75− M.foldrWithKey (\fp (mime,contents) ->
76− ((Posix.joinPath fp, mime, fromIntegral $ BL.length contents):)) [] mediamap
106+ map (\(fp, mt, bs) -> (fp, mt, fromIntegral (BL.length bs)))
107+ (mediaItems mediabag)
77
108
78mediaItems :: MediaBag -> [(FilePath, MimeType, BL.ByteString)]
109mediaItems :: MediaBag -> [(FilePath, MimeType, BL.ByteString)]
79mediaItems (MediaBag mediamap) =
110mediaItems (MediaBag mediamap) =
80− M.foldrWithKey (\fp (mime,contents) ->
111+ map (\item -> (mediaPath item, mediaMimeType item, mediaContents item))
81− ((Posix.joinPath fp, mime, contents):)) [] mediamap
112+ (M.elems mediamap)
src/Text/Pandoc/Options.hs+17−17
@@ -315,6 +315,23 @@ defaultMathJaxURL = "https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml-full.j
315defaultKaTeXURL :: Text
315defaultKaTeXURL :: Text
316defaultKaTeXURL = "https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.11.1/"
316defaultKaTeXURL = "https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.11.1/"
317
317
318+-- Update documentation in doc/filters.md if this is changed.
319+$(deriveJSON defaultOptions{ constructorTagModifier =
320+ camelCaseStrToHyphenated
321+ } ''TrackChanges)
322+
323+$(deriveJSON defaultOptions{ constructorTagModifier =
324+ camelCaseStrToHyphenated
325+ } ''WrapOption)
326+
327+$(deriveJSON defaultOptions{ constructorTagModifier =
328+ camelCaseStrToHyphenated . drop 8
329+ } ''TopLevelDivision)
330+
331+$(deriveJSON defaultOptions{ constructorTagModifier =
332+ camelCaseStrToHyphenated
333+ } ''ReferenceLocation)
334+
318-- Update documentation in doc/filters.md if this is changed.
335-- Update documentation in doc/filters.md if this is changed.
319$(deriveJSON defaultOptions ''ReaderOptions)
336$(deriveJSON defaultOptions ''ReaderOptions)
320
337
@@ -338,20 +355,3 @@ $(deriveJSON defaultOptions{ constructorTagModifier =
338 } ''ObfuscationMethod)
355 } ''ObfuscationMethod)
339
356
340$(deriveJSON defaultOptions ''HTMLSlideVariant)
357$(deriveJSON defaultOptions ''HTMLSlideVariant)
341−
342−-- Update documentation in doc/filters.md if this is changed.
343−$(deriveJSON defaultOptions{ constructorTagModifier =
344− camelCaseStrToHyphenated
345− } ''TrackChanges)
346−
347−$(deriveJSON defaultOptions{ constructorTagModifier =
348− camelCaseStrToHyphenated
349− } ''WrapOption)
350−
351−$(deriveJSON defaultOptions{ constructorTagModifier =
352− camelCaseStrToHyphenated . drop 8
353− } ''TopLevelDivision)
354−
355−$(deriveJSON defaultOptions{ constructorTagModifier =
356− camelCaseStrToHyphenated
357− } ''ReferenceLocation)
src/Text/Pandoc/PDF.hs+16−3
@@ -202,7 +202,7 @@ convertImage opts tmpdir fname = do
202 Just "image/svg+xml" -> E.catch (do
202 Just "image/svg+xml" -> E.catch (do
203 (exit, _) <- pipeProcess Nothing "rsvg-convert"
203 (exit, _) <- pipeProcess Nothing "rsvg-convert"
204 ["-f","pdf","-a","--dpi-x",dpi,"--dpi-y",dpi,
204 ["-f","pdf","-a","--dpi-x",dpi,"--dpi-y",dpi,
205− "-o",pdfOut,fname] BL.empty
205+ "-o",pdfOut,svgIn] BL.empty
206 if exit == ExitSuccess
206 if exit == ExitSuccess
207 then return $ Right pdfOut
207 then return $ Right pdfOut
208 else return $ Left "conversion from SVG failed")
208 else return $ Left "conversion from SVG failed")
@@ -217,6 +217,7 @@ convertImage opts tmpdir fname = do
217 where
217 where
218 pngOut = replaceDirectory (replaceExtension fname ".png") tmpdir
218 pngOut = replaceDirectory (replaceExtension fname ".png") tmpdir
219 pdfOut = replaceDirectory (replaceExtension fname ".pdf") tmpdir
219 pdfOut = replaceDirectory (replaceExtension fname ".pdf") tmpdir
220+ svgIn = tmpdir </> fname
220 mime = getMimeType fname
221 mime = getMimeType fname
221 doNothing = return (Right fname)
222 doNothing = return (Right fname)
222
223
@@ -506,8 +507,20 @@ showVerboseInfo mbTmpDir program programArgs env source = do
506 UTF8.hPutStrLn stderr $
507 UTF8.hPutStrLn stderr $
507 T.pack program <> " " <> T.pack (unwords (map show programArgs))
508 T.pack program <> " " <> T.pack (unwords (map show programArgs))
508 UTF8.hPutStr stderr "\n"
509 UTF8.hPutStr stderr "\n"
509− UTF8.hPutStrLn stderr "[makePDF] Environment:"
510+ UTF8.hPutStrLn stderr "[makePDF] Relevant environment variables:"
511+ -- we filter out irrelevant stuff to avoid leaking passwords and keys!
512+ let isRelevant ("PATH",_) = True
513+ isRelevant ("TMPDIR",_) = True
514+ isRelevant ("PWD",_) = True
515+ isRelevant ("LANG",_) = True
516+ isRelevant ("HOME",_) = True
517+ isRelevant ("LUA_PATH",_) = True
518+ isRelevant ("LUA_CPATH",_) = True
519+ isRelevant ("SHELL",_) = True
520+ isRelevant ("TEXINPUTS",_) = True
521+ isRelevant ("TEXMFOUTPUT",_) = True
522+ isRelevant _ = False
510− mapM_ (UTF8.hPutStrLn stderr . tshow) env
523+ mapM_ (UTF8.hPutStrLn stderr . tshow) (filter isRelevant env)
511 UTF8.hPutStr stderr "\n"
524 UTF8.hPutStr stderr "\n"
512 UTF8.hPutStrLn stderr "[makePDF] Source:"
525 UTF8.hPutStrLn stderr "[makePDF] Source:"
513 UTF8.hPutStrLn stderr source
526 UTF8.hPutStrLn stderr source
src/Text/Pandoc/Parsing.hs+17−10
@@ -188,7 +188,7 @@ import Control.Monad.Identity
188import Control.Monad.Reader
188import Control.Monad.Reader
189 ( asks, runReader, MonadReader(ask), Reader, ReaderT(ReaderT) )
189 ( asks, runReader, MonadReader(ask), Reader, ReaderT(ReaderT) )
190import Data.Char (chr, isAlphaNum, isAscii, isAsciiUpper, isAsciiLower,
190import Data.Char (chr, isAlphaNum, isAscii, isAsciiUpper, isAsciiLower,
191− isPunctuation, isSpace, ord, toLower, toUpper)
191+ isSpace, ord, toLower, toUpper)
192import Data.Default ( Default(..) )
192import Data.Default ( Default(..) )
193import Data.Functor (($>))
193import Data.Functor (($>))
194import Data.List (intercalate, transpose)
194import Data.List (intercalate, transpose)
@@ -693,13 +693,12 @@ emailAddress = try $ toResult <$> mailbox <*> (char '@' *> domain)
693 mailbox = intercalate "." <$> (emailWord `sepBy1'` dot)
693 mailbox = intercalate "." <$> (emailWord `sepBy1'` dot)
694 domain = intercalate "." <$> (subdomain `sepBy1'` dot)
694 domain = intercalate "." <$> (subdomain `sepBy1'` dot)
695 dot = char '.'
695 dot = char '.'
696− subdomain = many1 $ alphaNum <|> innerPunct
696+ subdomain = many1 $ alphaNum <|> innerPunct (=='-')
697 -- this excludes some valid email addresses, since an
697 -- this excludes some valid email addresses, since an
698 -- email could contain e.g. '__', but gives better results
698 -- email could contain e.g. '__', but gives better results
699 -- for our purposes, when combined with markdown parsing:
699 -- for our purposes, when combined with markdown parsing:
700− innerPunct = try (satisfy (\c -> isEmailPunct c || c == '@')
700+ innerPunct f = try (satisfy f
701− <* notFollowedBy space
701+ <* notFollowedBy (satisfy (not . isAlphaNum)))
702− <* notFollowedBy (satisfy isPunctuation))
703 -- technically an email address could begin with a symbol,
702 -- technically an email address could begin with a symbol,
704 -- but allowing this creates too many problems.
703 -- but allowing this creates too many problems.
705 -- See e.g. https://github.com/jgm/pandoc/issues/2940
704 -- See e.g. https://github.com/jgm/pandoc/issues/2940
@@ -1605,19 +1604,27 @@ nested p = do
1605 return res
1604 return res
1606
1605
1607citeKey :: (Stream s m Char, UpdateSourcePos s Char, HasLastStrPosition st)
1606citeKey :: (Stream s m Char, UpdateSourcePos s Char, HasLastStrPosition st)
1607+ => Bool -- ^ If True, allow expanded @{..} syntax.
1608− => ParserT s st m (Bool, Text)
1608+ -> ParserT s st m (Bool, Text)
1609−citeKey = try $ do
1609+citeKey allowBraced = try $ do
1610 guard =<< notAfterString
1610 guard =<< notAfterString
1611 suppress_author <- option False (True <$ char '-')
1611 suppress_author <- option False (True <$ char '-')
1612 char '@'
1612 char '@'
1613+ key <- simpleCiteIdentifier
1614+ <|> if allowBraced
1615+ then charsInBalanced '{' '}' (satisfy (not . isSpace))
1616+ else mzero
1617+ return (suppress_author, key)
1618+
1619+simpleCiteIdentifier :: (Stream s m Char, UpdateSourcePos s Char)
1620+ => ParserT s st m Text
1621+simpleCiteIdentifier = do
1613 firstChar <- alphaNum <|> char '_' <|> char '*' -- @* for wildcard in nocite
1622 firstChar <- alphaNum <|> char '_' <|> char '*' -- @* for wildcard in nocite
1614 let regchar = satisfy (\c -> isAlphaNum c || c == '_')
1623 let regchar = satisfy (\c -> isAlphaNum c || c == '_')
1615 let internal p = try $ p <* lookAhead regchar
1624 let internal p = try $ p <* lookAhead regchar
1616 rest <- many $ regchar <|> internal (oneOf ":.#$%&-+?<>~/") <|>
1625 rest <- many $ regchar <|> internal (oneOf ":.#$%&-+?<>~/") <|>
1617 try (oneOf ":/" <* lookAhead (char '/'))
1626 try (oneOf ":/" <* lookAhead (char '/'))
1618− let key = firstChar:rest
1619− return (suppress_author, T.pack key)
1627+ return $ T.pack $ firstChar:rest
1620−
1621
1628
1622token :: (Stream s m t)
1629token :: (Stream s m t)
1623 => (t -> Text)
1630 => (t -> Text)
src/Text/Pandoc/Readers/CommonMark.hs+8−6
@@ -30,7 +30,7 @@ import Text.Pandoc.Readers.Metadata (yamlMetaBlock)
30import Control.Monad.Except
30import Control.Monad.Except
31import Data.Functor.Identity (runIdentity)
31import Data.Functor.Identity (runIdentity)
32import Data.Typeable
32import Data.Typeable
33−import Text.Pandoc.Parsing (runParserT, getPosition,
33+import Text.Pandoc.Parsing (runParserT, getInput,
34 runF, defaultParserState, option, many1, anyChar,
34 runF, defaultParserState, option, many1, anyChar,
35 Sources(..), ToSources(..), ParserT, Future,
35 Sources(..), ToSources(..), ParserT, Future,
36 sourceName)
36 sourceName)
@@ -44,14 +44,14 @@ readCommonMark opts s
44 let sources = toSources s
44 let sources = toSources s
45 let toks = concatMap sourceToToks (unSources sources)
45 let toks = concatMap sourceToToks (unSources sources)
46 res <- runParserT (do meta <- yamlMetaBlock (metaValueParser opts)
46 res <- runParserT (do meta <- yamlMetaBlock (metaValueParser opts)
47− pos <- getPosition
47+ rest <- getInput
48− return (meta, pos))
48+ return (meta, rest))
49 defaultParserState "YAML metadata" (toSources s)
49 defaultParserState "YAML metadata" (toSources s)
50 case res of
50 case res of
51 Left _ -> readCommonMarkBody opts sources toks
51 Left _ -> readCommonMarkBody opts sources toks
52− Right (meta, pos) -> do
52+ Right (meta, rest) -> do
53 -- strip off metadata section and parse body
53 -- strip off metadata section and parse body
54− let body = dropWhile (\t -> tokPos t < pos) toks
54+ let body = concatMap sourceToToks (unSources rest)
55 Pandoc _ bs <- readCommonMarkBody opts sources body
55 Pandoc _ bs <- readCommonMarkBody opts sources body
56 return $ Pandoc (runF meta defaultParserState) bs
56 return $ Pandoc (runF meta defaultParserState) bs
57 | otherwise = do
57 | otherwise = do
@@ -112,5 +112,7 @@ specFor opts = foldr ($) defaultSyntaxSpec exts
112 | isEnabled Ext_implicit_header_references opts ] ++
112 | isEnabled Ext_implicit_header_references opts ] ++
113 [ (footnoteSpec <>) | isEnabled Ext_footnotes opts ] ++
113 [ (footnoteSpec <>) | isEnabled Ext_footnotes opts ] ++
114 [ (definitionListSpec <>) | isEnabled Ext_definition_lists opts ] ++
114 [ (definitionListSpec <>) | isEnabled Ext_definition_lists opts ] ++
115− [ (taskListSpec <>) | isEnabled Ext_task_lists opts ]
115+ [ (taskListSpec <>) | isEnabled Ext_task_lists opts ] ++
116+ [ (rebaseRelativePathsSpec <>)
117+ | isEnabled Ext_rebase_relative_paths opts ]
116
118
src/Text/Pandoc/Readers/DocBook.hs+16−7
@@ -134,6 +134,7 @@ List of all DocBook tags, with [x] indicating implemented,
134[ ] corpcredit - A corporation or organization credited in a document
134[ ] corpcredit - A corporation or organization credited in a document
135[ ] corpname - The name of a corporation
135[ ] corpname - The name of a corporation
136[ ] country - The name of a country
136[ ] country - The name of a country
137+[x] danger - An admonition set off from the text indicating hazardous situation
137[ ] database - The name of a database, or part of a database
138[ ] database - The name of a database, or part of a database
138[x] date - The date of publication or revision of a document
139[x] date - The date of publication or revision of a document
139[ ] dedication - A wrapper for the dedication section of a book
140[ ] dedication - A wrapper for the dedication section of a book
@@ -600,16 +601,24 @@ addMetadataFromElement e = do
600 Nothing -> return ()
601 Nothing -> return ()
601 Just z -> addMetaField "author" z
602 Just z -> addMetaField "author" z
602 addMetaField "subtitle" e
603 addMetaField "subtitle" e
603− addMetaField "author" e
604+ addAuthor e
604 addMetaField "date" e
605 addMetaField "date" e
605 addMetaField "release" e
606 addMetaField "release" e
606 addMetaField "releaseinfo" e
607 addMetaField "releaseinfo" e
607 return mempty
608 return mempty
609+ where
610+ addAuthor elt =
611+ case filterChildren (named "author") elt of
612+ [] -> return ()
613+ [z] -> fromAuthor z >>= addMeta "author"
614+ zs -> mapM fromAuthor zs >>= addMeta "author"
615+ fromAuthor elt =
616+ mconcat . intersperse space <$> mapM getInlines (elChildren elt)
608− where addMetaField fieldname elt =
617+ addMetaField fieldname elt =
609− case filterChildren (named fieldname) elt of
618+ case filterChildren (named fieldname) elt of
610− [] -> return ()
619+ [] -> return ()
611− [z] -> getInlines z >>= addMeta fieldname
620+ [z] -> getInlines z >>= addMeta fieldname
612− zs -> mapM getInlines zs >>= addMeta fieldname
621+ zs -> mapM getInlines zs >>= addMeta fieldname
613
622
614addMeta :: PandocMonad m => ToMetaValue a => Text -> a -> DB m ()
623addMeta :: PandocMonad m => ToMetaValue a => Text -> a -> DB m ()
615addMeta field val = modify (setMeta field val)
624addMeta field val = modify (setMeta field val)
@@ -710,7 +719,7 @@ blockTags =
710 ] ++ admonitionTags
719 ] ++ admonitionTags
711
720
712admonitionTags :: [Text]
721admonitionTags :: [Text]
713−admonitionTags = ["important","caution","note","tip","warning"]
722+admonitionTags = ["caution","danger","important","note","tip","warning"]
714
723
715-- Trim leading and trailing newline characters
724-- Trim leading and trailing newline characters
716trimNl :: Text -> Text
725trimNl :: Text -> Text
src/Text/Pandoc/Readers/Docx.hs+58−37
@@ -61,13 +61,14 @@ module Text.Pandoc.Readers.Docx
61import Codec.Archive.Zip
61import Codec.Archive.Zip
62import Control.Monad.Reader
62import Control.Monad.Reader
63import Control.Monad.State.Strict
63import Control.Monad.State.Strict
64+import Data.Bifunctor (bimap, first)
64import qualified Data.ByteString.Lazy as B
65import qualified Data.ByteString.Lazy as B
65import Data.Default (Default)
66import Data.Default (Default)
66−import Data.List (delete, intersect)
67+import Data.List (delete, intersect, foldl')
67import Data.Char (isSpace)
68import Data.Char (isSpace)
68import qualified Data.Map as M
69import qualified Data.Map as M
69import qualified Data.Text as T
70import qualified Data.Text as T
70−import Data.Maybe (isJust, fromMaybe)
71+import Data.Maybe (catMaybes, isJust, fromMaybe)
71import Data.Sequence (ViewL (..), viewl)
72import Data.Sequence (ViewL (..), viewl)
72import qualified Data.Sequence as Seq
73import qualified Data.Sequence as Seq
73import qualified Data.Set as Set
74import qualified Data.Set as Set
@@ -113,6 +114,7 @@ data DState = DState { docxAnchorMap :: M.Map T.Text T.Text
113 -- restarting
114 -- restarting
114 , docxListState :: M.Map (T.Text, T.Text) Integer
115 , docxListState :: M.Map (T.Text, T.Text) Integer
115 , docxPrevPara :: Inlines
116 , docxPrevPara :: Inlines
117+ , docxTableCaptions :: [Blocks]
116 }
118 }
117
119
118instance Default DState where
120instance Default DState where
@@ -123,6 +125,7 @@ instance Default DState where
123 , docxDropCap = mempty
125 , docxDropCap = mempty
124 , docxListState = M.empty
126 , docxListState = M.empty
125 , docxPrevPara = mempty
127 , docxPrevPara = mempty
128+ , docxTableCaptions = []
126 }
129 }
127
130
128data DEnv = DEnv { docxOptions :: ReaderOptions
131data DEnv = DEnv { docxOptions :: ReaderOptions
@@ -491,15 +494,32 @@ singleParaToPlain blks
491 singleton $ Plain ils
494 singleton $ Plain ils
492singleParaToPlain blks = blks
495singleParaToPlain blks = blks
493
496
494−cellToBlocks :: PandocMonad m => Docx.Cell -> DocxContext m Blocks
497+cellToCell :: PandocMonad m => RowSpan -> Docx.Cell -> DocxContext m Pandoc.Cell
495−cellToBlocks (Docx.Cell bps) = do
498+cellToCell rowSpan (Docx.Cell gridSpan _ bps) = do
496 blks <- smushBlocks <$> mapM bodyPartToBlocks bps
499 blks <- smushBlocks <$> mapM bodyPartToBlocks bps
497− return $ fromList $ blocksToDefinitions $ blocksToBullets $ toList blks
500+ let blks' = singleParaToPlain $ fromList $ blocksToDefinitions $ blocksToBullets $ toList blks
501+ return (cell AlignDefault rowSpan (ColSpan (fromIntegral gridSpan)) blks')
502+
503+rowsToRows :: PandocMonad m => [Docx.Row] -> DocxContext m [Pandoc.Row]
504+rowsToRows rows = do
505+ let rowspans = (fmap . fmap) (first RowSpan) (Docx.rowsToRowspans rows)
506+ cells <- traverse (traverse (uncurry cellToCell)) rowspans
507+ return (fmap (Pandoc.Row nullAttr) cells)
508+
509+splitHeaderRows :: Bool -> [Docx.Row] -> ([Docx.Row], [Docx.Row])
510+splitHeaderRows hasFirstRowFormatting rs = bimap reverse reverse $ fst
511+ $ if hasFirstRowFormatting
512+ then foldl' f ((take 1 rs, []), True) (drop 1 rs)
513+ else foldl' f (([], []), False) rs
514+ where
515+ f ((headerRows, bodyRows), previousRowWasHeader) r@(Docx.Row h cs)
516+ | h == HasTblHeader || (previousRowWasHeader && any isContinuationCell cs)
517+ = ((r : headerRows, bodyRows), True)
518+ | otherwise
519+ = ((headerRows, r : bodyRows), False)
520+
521+ isContinuationCell (Docx.Cell _ vm _) = vm == Docx.Continue
498
522
499−rowToBlocksList :: PandocMonad m => Docx.Row -> DocxContext m [Blocks]
500−rowToBlocksList (Docx.Row cells) = do
501− blksList <- mapM cellToBlocks cells
502− return $ map singleParaToPlain blksList
503
523
504-- like trimInlines, but also take out linebreaks
524-- like trimInlines, but also take out linebreaks
505trimSps :: Inlines -> Inlines
525trimSps :: Inlines -> Inlines
@@ -546,6 +566,11 @@ normalizeToClassName = T.map go . fromStyleName
546 where go c | isSpace c = '-'
566 where go c | isSpace c = '-'
547 | otherwise = c
567 | otherwise = c
548
568
569+bodyPartToTableCaption :: PandocMonad m => BodyPart -> DocxContext m (Maybe Blocks)
570+bodyPartToTableCaption (TblCaption pPr parparts) =
571+ Just <$> bodyPartToBlocks (Paragraph pPr parparts)
572+bodyPartToTableCaption _ = pure Nothing
573+
549bodyPartToBlocks :: PandocMonad m => BodyPart -> DocxContext m Blocks
574bodyPartToBlocks :: PandocMonad m => BodyPart -> DocxContext m Blocks
550bodyPartToBlocks (Paragraph pPr parparts)
575bodyPartToBlocks (Paragraph pPr parparts)
551 | Just True <- pBidi pPr = do
576 | Just True <- pBidi pPr = do
@@ -637,49 +662,43 @@ bodyPartToBlocks (ListItem pPr _ _ _ parparts) =
637 let pPr' = pPr {pStyle = constructBogusParStyleData "list-paragraph": pStyle pPr}
662 let pPr' = pPr {pStyle = constructBogusParStyleData "list-paragraph": pStyle pPr}
638 in
663 in
639 bodyPartToBlocks $ Paragraph pPr' parparts
664 bodyPartToBlocks $ Paragraph pPr' parparts
665+bodyPartToBlocks (TblCaption _ _) =
666+ return $ para mempty -- collected separately
640bodyPartToBlocks (Tbl _ _ _ []) =
667bodyPartToBlocks (Tbl _ _ _ []) =
641 return $ para mempty
668 return $ para mempty
642−bodyPartToBlocks (Tbl cap _ look parts@(r:rs)) = do
669+bodyPartToBlocks (Tbl cap grid look parts) = do
643− let cap' = simpleCaption $ plain $ text cap
670+ captions <- gets docxTableCaptions
644− (hdr, rows) = case firstRowFormatting look of
671+ fullCaption <- case captions of
645− True | null rs -> (Nothing, [r])
672+ c : cs -> do
646− | otherwise -> (Just r, rs)
673+ modify (\s -> s { docxTableCaptions = cs })
647− False -> (Nothing, r:rs)
674+ return c
648−
675+ [] -> return $ if T.null cap then mempty else plain (text cap)
649− cells <- mapM rowToBlocksList rows
676+ let shortCaption = if T.null cap then Nothing else Just (toList (text cap))
677+ cap' = caption shortCaption fullCaption
678+ (hdr, rows) = splitHeaderRows (firstRowFormatting look) parts
650
679
651 let width = maybe 0 maximum $ nonEmpty $ map rowLength parts
680 let width = maybe 0 maximum $ nonEmpty $ map rowLength parts
652 rowLength :: Docx.Row -> Int
681 rowLength :: Docx.Row -> Int
653− rowLength (Docx.Row c) = length c
682+ rowLength (Docx.Row _ c) = sum (fmap (\(Docx.Cell gridSpan _ _) -> fromIntegral gridSpan) c)
654
683
655− let toRow = Pandoc.Row nullAttr . map simpleCell
684+ headerCells <- rowsToRows hdr
656− toHeaderRow l = [toRow l | not (null l)]
685+ bodyCells <- rowsToRows rows
657
686
658− -- pad cells. New Text.Pandoc.Builder will do that for us,
687+ -- Horizontal column alignment goes to the default at the moment. Getting
659− -- so this is for compatibility while we switch over.
660− let cells' = map (\row -> toRow $ take width (row ++ repeat mempty)) cells
661−
662− hdrCells <- case hdr of
663− Just r' -> toHeaderRow <$> rowToBlocksList r'
664− Nothing -> return []
665−
666− -- The two following variables (horizontal column alignment and
667− -- relative column widths) go to the default at the
668− -- moment. Width information is in the TblGrid field of the Tbl,
669− -- so should be possible. Alignment might be more difficult,
670− -- since there doesn't seem to be a column entity in docx.
688+ -- it might be difficult, since there doesn't seem to be a column entity
689+ -- in docx.
671 let alignments = replicate width AlignDefault
690 let alignments = replicate width AlignDefault
672− widths = replicate width ColWidthDefault
691+ totalWidth = sum grid
692+ widths = (\w -> ColWidth (fromInteger w / fromInteger totalWidth)) <$> grid
673
693
674 return $ table cap'
694 return $ table cap'
675 (zip alignments widths)
695 (zip alignments widths)
676− (TableHead nullAttr hdrCells)
696+ (TableHead nullAttr headerCells)
677− [TableBody nullAttr 0 [] cells']
697+ [TableBody nullAttr 0 [] bodyCells]
678 (TableFoot nullAttr [])
698 (TableFoot nullAttr [])
679bodyPartToBlocks (OMathPara e) =
699bodyPartToBlocks (OMathPara e) =
680 return $ para $ displayMath (writeTeX e)
700 return $ para $ displayMath (writeTeX e)
681
701
682−
683-- replace targets with generated anchors.
702-- replace targets with generated anchors.
684rewriteLink' :: PandocMonad m => Inline -> DocxContext m Inline
703rewriteLink' :: PandocMonad m => Inline -> DocxContext m Inline
685rewriteLink' l@(Link attr ils (T.uncons -> Just ('#',target), title)) = do
704rewriteLink' l@(Link attr ils (T.uncons -> Just ('#',target), title)) = do
@@ -715,6 +734,8 @@ bodyToOutput :: PandocMonad m => Body -> DocxContext m (Meta, [Block])
715bodyToOutput (Body bps) = do
734bodyToOutput (Body bps) = do
716 let (metabps, blkbps) = sepBodyParts bps
735 let (metabps, blkbps) = sepBodyParts bps
717 meta <- bodyPartsToMeta metabps
736 meta <- bodyPartsToMeta metabps
737+ captions <- catMaybes <$> mapM bodyPartToTableCaption blkbps
738+ modify (\s -> s { docxTableCaptions = captions })
718 blks <- smushBlocks <$> mapM bodyPartToBlocks blkbps
739 blks <- smushBlocks <$> mapM bodyPartToBlocks blkbps
719 blks' <- rewriteLinks $ blocksToDefinitions $ blocksToBullets $ toList blks
740 blks' <- rewriteLinks $ blocksToDefinitions $ blocksToBullets $ toList blks
720 blks'' <- removeOrphanAnchors blks'
741 blks'' <- removeOrphanAnchors blks'
src/Text/Pandoc/Readers/Docx/Combine.hs+3−3
@@ -61,7 +61,7 @@ import Data.List
61import Data.Bifunctor
61import Data.Bifunctor
62import Data.Sequence ( ViewL (..), ViewR (..), viewl, viewr, spanr, spanl
62import Data.Sequence ( ViewL (..), ViewR (..), viewl, viewr, spanr, spanl
63 , (><), (|>) )
63 , (><), (|>) )
64−import Text.Pandoc.Builder
64+import Text.Pandoc.Builder as B
65
65
66data Modifier a = Modifier (a -> a)
66data Modifier a = Modifier (a -> a)
67 | AttrModifier (Attr -> a -> a) Attr
67 | AttrModifier (Attr -> a -> a) Attr
@@ -116,12 +116,12 @@ ilModifierAndInnards ils = case viewl $ unMany ils of
116
116
117inlinesL :: Inlines -> (Inlines, Inlines)
117inlinesL :: Inlines -> (Inlines, Inlines)
118inlinesL ils = case viewl $ unMany ils of
118inlinesL ils = case viewl $ unMany ils of
119− (s :< sq) -> (singleton s, Many sq)
119+ (s :< sq) -> (B.singleton s, Many sq)
120 _ -> (mempty, ils)
120 _ -> (mempty, ils)
121
121
122inlinesR :: Inlines -> (Inlines, Inlines)
122inlinesR :: Inlines -> (Inlines, Inlines)
123inlinesR ils = case viewr $ unMany ils of
123inlinesR ils = case viewr $ unMany ils of
124− (sq :> s) -> (Many sq, singleton s)
124+ (sq :> s) -> (Many sq, B.singleton s)
125 _ -> (ils, mempty)
125 _ -> (ils, mempty)
126
126
127combineInlines :: Inlines -> Inlines -> Inlines
127combineInlines :: Inlines -> Inlines -> Inlines
src/Text/Pandoc/Readers/Docx/Parse.hs+112−19
@@ -33,7 +33,9 @@ module Text.Pandoc.Readers.Docx.Parse ( Docx(..)
33 , ParStyle
33 , ParStyle
34 , CharStyle(cStyleData)
34 , CharStyle(cStyleData)
35 , Row(..)
35 , Row(..)
36+ , TblHeader(..)
36 , Cell(..)
37 , Cell(..)
38+ , VMerge(..)
37 , TrackedChange(..)
39 , TrackedChange(..)
38 , ChangeType(..)
40 , ChangeType(..)
39 , ChangeInfo(..)
41 , ChangeInfo(..)
@@ -50,6 +52,7 @@ module Text.Pandoc.Readers.Docx.Parse ( Docx(..)
50 , pHeading
52 , pHeading
51 , constructBogusParStyleData
53 , constructBogusParStyleData
52 , leftBiasedMergeRunStyle
54 , leftBiasedMergeRunStyle
55+ , rowsToRowspans
53 ) where
56 ) where
54import Text.Pandoc.Readers.Docx.Parse.Styles
57import Text.Pandoc.Readers.Docx.Parse.Styles
55import Codec.Archive.Zip
58import Codec.Archive.Zip
@@ -225,6 +228,7 @@ defaultParagraphStyle = ParagraphStyle { pStyle = []
225data BodyPart = Paragraph ParagraphStyle [ParPart]
228data BodyPart = Paragraph ParagraphStyle [ParPart]
226 | ListItem ParagraphStyle T.Text T.Text (Maybe Level) [ParPart]
229 | ListItem ParagraphStyle T.Text T.Text (Maybe Level) [ParPart]
227 | Tbl T.Text TblGrid TblLook [Row]
230 | Tbl T.Text TblGrid TblLook [Row]
231+ | TblCaption ParagraphStyle [ParPart]
228 | OMathPara [Exp]
232 | OMathPara [Exp]
229 deriving Show
233 deriving Show
230
234
@@ -236,12 +240,61 @@ newtype TblLook = TblLook {firstRowFormatting::Bool}
236defaultTblLook :: TblLook
240defaultTblLook :: TblLook
237defaultTblLook = TblLook{firstRowFormatting = False}
241defaultTblLook = TblLook{firstRowFormatting = False}
238
242
239−newtype Row = Row [Cell]
243+data Row = Row TblHeader [Cell] deriving Show
240− deriving Show
244+
245+data TblHeader = HasTblHeader | NoTblHeader deriving (Show, Eq)
241
246
242−newtype Cell = Cell [BodyPart]
247+data Cell = Cell GridSpan VMerge [BodyPart]
243 deriving Show
248 deriving Show
244
249
250+type GridSpan = Integer
251+
252+data VMerge = Continue
253+ -- ^ This cell should be merged with the one above it
254+ | Restart
255+ -- ^ This cell should not be merged with the one above it
256+ deriving (Show, Eq)
257+
258+rowsToRowspans :: [Row] -> [[(Int, Cell)]]
259+rowsToRowspans rows = let
260+ removeMergedCells = fmap (filter (\(_, Cell _ vmerge _) -> vmerge == Restart))
261+ in removeMergedCells (foldr f [] rows)
262+ where
263+ f :: Row -> [[(Int, Cell)]] -> [[(Int, Cell)]]
264+ f (Row _ cells) acc = let
265+ spans = g cells Nothing (listToMaybe acc)
266+ in spans : acc
267+
268+ g ::
269+ -- | The current row
270+ [Cell] ->
271+ -- | Number of columns left below
272+ Maybe Integer ->
273+ -- | (rowspan so far, cell) for the row below this one
274+ Maybe [(Int, Cell)] ->
275+ -- | (rowspan so far, cell) for this row
276+ [(Int, Cell)]
277+ g cells _ Nothing = zip (repeat 1) cells
278+ g cells columnsLeftBelow (Just rowBelow) =
279+ case cells of
280+ [] -> []
281+ thisCell@(Cell thisGridSpan _ _) : restOfRow -> case rowBelow of
282+ [] -> zip (repeat 1) cells
283+ (spanSoFarBelow, Cell gridSpanBelow vmerge _) : _ ->
284+ let spanSoFar = case vmerge of
285+ Restart -> 1
286+ Continue -> 1 + spanSoFarBelow
287+ columnsToDrop = thisGridSpan + (gridSpanBelow - fromMaybe gridSpanBelow columnsLeftBelow)
288+ (newColumnsLeftBelow, restOfRowBelow) = dropColumns columnsToDrop rowBelow
289+ in (spanSoFar, thisCell) : g restOfRow (Just newColumnsLeftBelow) (Just restOfRowBelow)
290+
291+ dropColumns :: Integer -> [(a, Cell)] -> (Integer, [(a, Cell)])
292+ dropColumns n [] = (n, [])
293+ dropColumns n cells@((_, Cell gridSpan _ _) : otherCells) =
294+ if n < gridSpan
295+ then (gridSpan - n, cells)
296+ else dropColumns (n - gridSpan) otherCells
297+
245leftBiasedMergeRunStyle :: RunStyle -> RunStyle -> RunStyle
298leftBiasedMergeRunStyle :: RunStyle -> RunStyle -> RunStyle
246leftBiasedMergeRunStyle a b = RunStyle
299leftBiasedMergeRunStyle a b = RunStyle
247 { isBold = isBold a <|> isBold b
300 { isBold = isBold a <|> isBold b
@@ -426,20 +479,26 @@ filePathToRelType path docXmlPath =
426 then Just InDocument
479 then Just InDocument
427 else Nothing
480 else Nothing
428
481
429−relElemToRelationship :: DocumentLocation -> Element -> Maybe Relationship
482+relElemToRelationship :: FilePath -> DocumentLocation -> Element
483+ -> Maybe Relationship
430−relElemToRelationship relType element | qName (elName element) == "Relationship" =
484+relElemToRelationship fp relType element | qName (elName element) == "Relationship" =
431 do
485 do
432 relId <- findAttr (QName "Id" Nothing Nothing) element
486 relId <- findAttr (QName "Id" Nothing Nothing) element
433 target <- findAttr (QName "Target" Nothing Nothing) element
487 target <- findAttr (QName "Target" Nothing Nothing) element
488+ -- target may be relative (media/image1.jpeg) or absolute
489+ -- (/word/media/image1.jpeg); we need to relativize it (see #7374)
490+ let frontOfFp = T.pack $ takeWhile (/= '_') fp
491+ let target' = fromMaybe target $
492+ T.stripPrefix frontOfFp $ T.dropWhile (== '/') target
434− return $ Relationship relType relId target
493+ return $ Relationship relType relId target'
435−relElemToRelationship _ _ = Nothing
494+relElemToRelationship _ _ _ = Nothing
436
495
437filePathToRelationships :: Archive -> FilePath -> FilePath -> [Relationship]
496filePathToRelationships :: Archive -> FilePath -> FilePath -> [Relationship]
438filePathToRelationships ar docXmlPath fp
497filePathToRelationships ar docXmlPath fp
439 | Just relType <- filePathToRelType fp docXmlPath
498 | Just relType <- filePathToRelType fp docXmlPath
440 , Just entry <- findEntryByPath fp ar
499 , Just entry <- findEntryByPath fp ar
441 , Just relElems <- parseXMLFromEntry entry =
500 , Just relElems <- parseXMLFromEntry entry =
442− mapMaybe (relElemToRelationship relType) $ elChildren relElems
501+ mapMaybe (relElemToRelationship fp relType) $ elChildren relElems
443filePathToRelationships _ _ _ = []
502filePathToRelationships _ _ _ = []
444
503
445archiveToRelationships :: Archive -> FilePath -> [Relationship]
504archiveToRelationships :: Archive -> FilePath -> [Relationship]
@@ -563,7 +622,7 @@ elemToTblGrid :: NameSpaces -> Element -> D TblGrid
563elemToTblGrid ns element | isElem ns "w" "tblGrid" element =
622elemToTblGrid ns element | isElem ns "w" "tblGrid" element =
564 let cols = findChildrenByName ns "w" "gridCol" element
623 let cols = findChildrenByName ns "w" "gridCol" element
565 in
624 in
566− mapD (\e -> maybeToD (findAttrByName ns "w" "val" e >>= stringToInteger))
625+ mapD (\e -> maybeToD (findAttrByName ns "w" "w" e >>= stringToInteger))
567 cols
626 cols
568elemToTblGrid _ _ = throwError WrongElem
627elemToTblGrid _ _ = throwError WrongElem
569
628
@@ -587,14 +646,31 @@ elemToRow ns element | isElem ns "w" "tr" element =
587 do
646 do
588 let cellElems = findChildrenByName ns "w" "tc" element
647 let cellElems = findChildrenByName ns "w" "tc" element
589 cells <- mapD (elemToCell ns) cellElems
648 cells <- mapD (elemToCell ns) cellElems
649+ let hasTblHeader = maybe NoTblHeader (const HasTblHeader)
650+ (findChildByName ns "w" "trPr" element
651+ >>= findChildByName ns "w" "tblHeader")
590− return $ Row cells
652+ return $ Row hasTblHeader cells
591elemToRow _ _ = throwError WrongElem
653elemToRow _ _ = throwError WrongElem
592
654
593elemToCell :: NameSpaces -> Element -> D Cell
655elemToCell :: NameSpaces -> Element -> D Cell
594elemToCell ns element | isElem ns "w" "tc" element =
656elemToCell ns element | isElem ns "w" "tc" element =
595 do
657 do
658+ let properties = findChildByName ns "w" "tcPr" element
659+ let gridSpan = properties
660+ >>= findChildByName ns "w" "gridSpan"
661+ >>= findAttrByName ns "w" "val"
662+ >>= stringToInteger
663+ let vMerge = case properties >>= findChildByName ns "w" "vMerge" of
664+ Nothing -> Restart
665+ Just e ->
666+ fromMaybe Continue $ do
667+ s <- findAttrByName ns "w" "val" e
668+ case s of
669+ "continue" -> Just Continue
670+ "restart" -> Just Restart
671+ _ -> Nothing
596 cellContents <- mapD (elemToBodyPart ns) (elChildren element)
672 cellContents <- mapD (elemToBodyPart ns) (elChildren element)
597− return $ Cell cellContents
673+ return $ Cell (fromMaybe 1 gridSpan) vMerge cellContents
598elemToCell _ _ = throwError WrongElem
674elemToCell _ _ = throwError WrongElem
599
675
600elemToParIndentation :: NameSpaces -> Element -> Maybe ParIndentation
676elemToParIndentation :: NameSpaces -> Element -> Maybe ParIndentation
@@ -626,10 +702,9 @@ pNumInfo = getParStyleField numInfo . pStyle
626elemToBodyPart :: NameSpaces -> Element -> D BodyPart
702elemToBodyPart :: NameSpaces -> Element -> D BodyPart
627elemToBodyPart ns element
703elemToBodyPart ns element
628 | isElem ns "w" "p" element
704 | isElem ns "w" "p" element
629− , (c:_) <- findChildrenByName ns "m" "oMathPara" element =
705+ , (c:_) <- findChildrenByName ns "m" "oMathPara" element = do
630− do
631− expsLst <- eitherToD $ readOMML $ showElement c
706+ expsLst <- eitherToD $ readOMML $ showElement c
632− return $ OMathPara expsLst
707+ return $ OMathPara expsLst
633elemToBodyPart ns element
708elemToBodyPart ns element
634 | isElem ns "w" "p" element
709 | isElem ns "w" "p" element
635 , Just (numId, lvl) <- getNumInfo ns element = do
710 , Just (numId, lvl) <- getNumInfo ns element = do
@@ -647,13 +722,31 @@ elemToBodyPart ns element
647 Nothing | Just (numId, lvl) <- pNumInfo parstyle -> do
722 Nothing | Just (numId, lvl) <- pNumInfo parstyle -> do
648 levelInfo <- lookupLevel numId lvl <$> asks envNumbering
723 levelInfo <- lookupLevel numId lvl <$> asks envNumbering
649 return $ ListItem parstyle numId lvl levelInfo parparts
724 return $ ListItem parstyle numId lvl levelInfo parparts
725+ _ -> let
726+ hasCaptionStyle = elem "Caption" (pStyleId <$> pStyle parstyle)
727+
728+ hasSimpleTableField = fromMaybe False $ do
729+ fldSimple <- findChildByName ns "w" "fldSimple" element
730+ instr <- findAttrByName ns "w" "instr" fldSimple
731+ pure ("Table" `elem` T.words instr)
732+
733+ hasComplexTableField = fromMaybe False $ do
734+ instrText <- findElementByName ns "w" "instrText" element
735+ pure ("Table" `elem` T.words (strContent instrText))
736+
737+ in if hasCaptionStyle && (hasSimpleTableField || hasComplexTableField)
738+ then return $ TblCaption parstyle parparts
650− _ -> return $ Paragraph parstyle parparts
739+ else return $ Paragraph parstyle parparts
740+
651elemToBodyPart ns element
741elemToBodyPart ns element
652 | isElem ns "w" "tbl" element = do
742 | isElem ns "w" "tbl" element = do
653− let caption' = findChildByName ns "w" "tblPr" element
743+ let tblProperties = findChildByName ns "w" "tblPr" element
744+ caption = fromMaybe "" $ tblProperties
654 >>= findChildByName ns "w" "tblCaption"
745 >>= findChildByName ns "w" "tblCaption"
655 >>= findAttrByName ns "w" "val"
746 >>= findAttrByName ns "w" "val"
656− caption = fromMaybe "" caption'
747+ description = fromMaybe "" $ tblProperties
748+ >>= findChildByName ns "w" "tblDescription"
749+ >>= findAttrByName ns "w" "val"
657 grid' = case findChildByName ns "w" "tblGrid" element of
750 grid' = case findChildByName ns "w" "tblGrid" element of
658 Just g -> elemToTblGrid ns g
751 Just g -> elemToTblGrid ns g
659 Nothing -> return []
752 Nothing -> return []
@@ -666,7 +759,7 @@ elemToBodyPart ns element
666 grid <- grid'
759 grid <- grid'
667 tblLook <- tblLook'
760 tblLook <- tblLook'
668 rows <- mapD (elemToRow ns) (elChildren element)
761 rows <- mapD (elemToRow ns) (elChildren element)
669− return $ Tbl caption grid tblLook rows
762+ return $ Tbl (caption <> description) grid tblLook rows
670elemToBodyPart _ _ = throwError WrongElem
763elemToBodyPart _ _ = throwError WrongElem
671
764
672lookupRelationship :: DocumentLocation -> RelId -> [Relationship] -> Maybe Target
765lookupRelationship :: DocumentLocation -> RelId -> [Relationship] -> Maybe Target
src/Text/Pandoc/Readers/Docx/Util.hs+7
@@ -19,6 +19,7 @@ module Text.Pandoc.Readers.Docx.Util (
19 , elemToNameSpaces
19 , elemToNameSpaces
20 , findChildByName
20 , findChildByName
21 , findChildrenByName
21 , findChildrenByName
22+ , findElementByName
22 , findAttrByName
23 , findAttrByName
23 ) where
24 ) where
24
25
@@ -56,6 +57,12 @@ findChildrenByName ns pref name el =
56 let ns' = ns <> elemToNameSpaces el
57 let ns' = ns <> elemToNameSpaces el
57 in findChildren (elemName ns' pref name) el
58 in findChildren (elemName ns' pref name) el
58
59
60+-- | Like 'findChildrenByName', but searches descendants.
61+findElementByName :: NameSpaces -> Text -> Text -> Element -> Maybe Element
62+findElementByName ns pref name el =
63+ let ns' = ns <> elemToNameSpaces el
64+ in findElement (elemName ns' pref name) el
65+
59findAttrByName :: NameSpaces -> Text -> Text -> Element -> Maybe Text
66findAttrByName :: NameSpaces -> Text -> Text -> Element -> Maybe Text
60findAttrByName ns pref name el =
67findAttrByName ns pref name el =
61 let ns' = ns <> elemToNameSpaces el
68 let ns' = ns <> elemToNameSpaces el
src/Text/Pandoc/Readers/HTML.hs+24−13
@@ -205,6 +205,7 @@ block = ((do
205 | otherwise
205 | otherwise
206 -> pDiv
206 -> pDiv
207 "section" -> pDiv
207 "section" -> pDiv
208+ "header" -> pDiv
208 "main" -> pDiv
209 "main" -> pDiv
209 "figure" -> pFigure
210 "figure" -> pFigure
210 "iframe" -> pIframe
211 "iframe" -> pIframe
@@ -404,6 +405,7 @@ pLineBlock = try $ do
404isDivLike :: Text -> Bool
405isDivLike :: Text -> Bool
405isDivLike "div" = True
406isDivLike "div" = True
406isDivLike "section" = True
407isDivLike "section" = True
408+isDivLike "header" = True
407isDivLike "main" = True
409isDivLike "main" = True
408isDivLike _ = False
410isDivLike _ = False
409
411
@@ -499,17 +501,13 @@ pHeader = try $ do
499 tagOpen (`elem` ["h1","h2","h3","h4","h5","h6"])
501 tagOpen (`elem` ["h1","h2","h3","h4","h5","h6"])
500 (const True)
502 (const True)
501 let attr = toStringAttr attr'
503 let attr = toStringAttr attr'
502− let bodyTitle = TagOpen tagtype attr' ~== TagOpen ("h1" :: Text)
503− [("class","title")]
504 level <- headerLevel tagtype
504 level <- headerLevel tagtype
505 contents <- trimInlines . mconcat <$> manyTill inline (pCloses tagtype <|> eof)
505 contents <- trimInlines . mconcat <$> manyTill inline (pCloses tagtype <|> eof)
506 let ident = fromMaybe "" $ lookup "id" attr
506 let ident = fromMaybe "" $ lookup "id" attr
507 let classes = maybe [] T.words $ lookup "class" attr
507 let classes = maybe [] T.words $ lookup "class" attr
508 let keyvals = [(k,v) | (k,v) <- attr, k /= "class", k /= "id"]
508 let keyvals = [(k,v) | (k,v) <- attr, k /= "class", k /= "id"]
509 attr'' <- registerHeader (ident, classes, keyvals) contents
509 attr'' <- registerHeader (ident, classes, keyvals) contents
510− return $ if bodyTitle
511− then mempty -- skip a representation of the title in the body
512− else B.headerWith attr'' level contents
510+ return $ B.headerWith attr'' level contents
513
511
514pHrule :: PandocMonad m => TagParser m Blocks
512pHrule :: PandocMonad m => TagParser m Blocks
515pHrule = do
513pHrule = do
@@ -559,7 +557,18 @@ pFigure = try $ do
559pCodeBlock :: PandocMonad m => TagParser m Blocks
557pCodeBlock :: PandocMonad m => TagParser m Blocks
560pCodeBlock = try $ do
558pCodeBlock = try $ do
561 TagOpen _ attr' <- pSatisfy (matchTagOpen "pre" [])
559 TagOpen _ attr' <- pSatisfy (matchTagOpen "pre" [])
562− let attr = toAttr attr'
560+ -- if the `pre` has no attributes, try if it is followed by a `code`
561+ -- element and use those attributes if possible.
562+ attr <- case attr' of
563+ _:_ -> pure (toAttr attr')
564+ [] -> option nullAttr $ do
565+ TagOpen _ codeAttr <- pSatisfy (matchTagOpen "code" [])
566+ pure $ toAttr
567+ [ (k, v') | (k, v) <- codeAttr
568+ -- strip language from class
569+ , let v' = if k == "class"
570+ then fromMaybe v (T.stripPrefix "language-" v)
571+ else v ]
563 contents <- manyTill pAny (pCloses "pre" <|> eof)
572 contents <- manyTill pAny (pCloses "pre" <|> eof)
564 let rawText = T.concat $ map tagToText contents
573 let rawText = T.concat $ map tagToText contents
565 -- drop leading newline if any
574 -- drop leading newline if any
@@ -942,13 +951,15 @@ getTagName (TagClose t) = Just t
942getTagName _ = Nothing
951getTagName _ = Nothing
943
952
944isInlineTag :: Tag Text -> Bool
953isInlineTag :: Tag Text -> Bool
945−isInlineTag t =
946− isCommentTag t ||
954+isInlineTag t = isCommentTag t || case t of
947− case getTagName t of
948− Nothing -> False
949− Just "script" -> "math/tex" `T.isPrefixOf` fromAttrib "type" t
955+ TagOpen "script" _ -> "math/tex" `T.isPrefixOf` fromAttrib "type" t
956+ TagClose "script" -> True
957+ TagOpen name _ -> isInlineTagName name
958+ TagClose name -> isInlineTagName name
959+ _ -> False
960+ where isInlineTagName x =
950− Just x -> x `Set.notMember` blockTags ||
961+ x `Set.notMember` blockTags ||
951− T.take 1 x == "?" -- processing instr.
962+ T.take 1 x == "?" -- processing instr.
952
963
953isBlockTag :: Tag Text -> Bool
964isBlockTag :: Tag Text -> Bool
954isBlockTag t = isBlockTagName || isTagComment t
965isBlockTag t = isBlockTagName || isTagComment t
src/Text/Pandoc/Readers/HTML/Table.hs+33−14
@@ -17,6 +17,7 @@ module Text.Pandoc.Readers.HTML.Table (pTable) where
17
17
18import Control.Applicative ((<|>))
18import Control.Applicative ((<|>))
19import Data.Maybe (fromMaybe)
19import Data.Maybe (fromMaybe)
20+import Data.Either (lefts, rights)
20import Data.List.NonEmpty (nonEmpty)
21import Data.List.NonEmpty (nonEmpty)
21import Data.Text (Text)
22import Data.Text (Text)
22import Text.HTML.TagSoup
23import Text.HTML.TagSoup
@@ -33,34 +34,51 @@ import Text.Pandoc.Shared (onlySimpleTableCells, safeRead)
33import qualified Data.Text as T
34import qualified Data.Text as T
34import qualified Text.Pandoc.Builder as B
35import qualified Text.Pandoc.Builder as B
35
36
36−-- | Parses a @<col>@ element, returning the column's width. Defaults to
37+-- | Parses a @<col>@ element, returning the column's width.
38+-- An Either value is used: Left i means a "relative length" with
39+-- integral value i (see https://www.w3.org/TR/html4/types.html#h-6.6);
40+-- Right w means a regular width. Defaults to @'Right ColWidthDefault'@
37−-- @'ColWidthDefault'@ if the width is not set or cannot be determined.
41+-- if the width is not set or cannot be determined.
38−pCol :: PandocMonad m => TagParser m ColWidth
42+pCol :: PandocMonad m => TagParser m (Either Int ColWidth)
39pCol = try $ do
43pCol = try $ do
40 TagOpen _ attribs' <- pSatisfy (matchTagOpen "col" [])
44 TagOpen _ attribs' <- pSatisfy (matchTagOpen "col" [])
41 let attribs = toStringAttr attribs'
45 let attribs = toStringAttr attribs'
42 skipMany pBlank
46 skipMany pBlank
43 optional $ pSatisfy (matchTagClose "col")
47 optional $ pSatisfy (matchTagClose "col")
44 skipMany pBlank
48 skipMany pBlank
45− let width = case lookup "width" attribs of
49+ return $ case lookup "width" attribs of
46 Nothing -> case lookup "style" attribs of
50 Nothing -> case lookup "style" attribs of
47 Just (T.stripPrefix "width:" -> Just xs) | T.any (== '%') xs ->
51 Just (T.stripPrefix "width:" -> Just xs) | T.any (== '%') xs ->
52+ maybe (Right ColWidthDefault) (Right . ColWidth . (/ 100.0))
48− fromMaybe 0.0 $ safeRead (T.filter
53+ $ safeRead (T.filter
49− (`notElem` (" \t\r\n%'\";" :: [Char])) xs)
54+ (`notElem` (" \t\r\n%'\";" :: [Char])) xs)
50− _ -> 0.0
55+ _ -> Right ColWidthDefault
56+ Just (T.unsnoc -> Just (xs, '*')) ->
57+ maybe (Left 1) Left $ safeRead xs
51 Just (T.unsnoc -> Just (xs, '%')) ->
58 Just (T.unsnoc -> Just (xs, '%')) ->
59+ maybe (Right ColWidthDefault)
52− fromMaybe 0.0 $ safeRead xs
60+ (Right . ColWidth . (/ 100.0)) $ safeRead xs
53− _ -> 0.0
54− if width > 0.0
55− then return $ ColWidth $ width / 100.0
56− else return ColWidthDefault
61+ _ -> Right ColWidthDefault
57
62
58−pColgroup :: PandocMonad m => TagParser m [ColWidth]
63+pColgroup :: PandocMonad m => TagParser m [Either Int ColWidth]
59pColgroup = try $ do
64pColgroup = try $ do
60 pSatisfy (matchTagOpen "colgroup" [])
65 pSatisfy (matchTagOpen "colgroup" [])
61 skipMany pBlank
66 skipMany pBlank
62 manyTill pCol (pCloses "colgroup" <|> eof) <* skipMany pBlank
67 manyTill pCol (pCloses "colgroup" <|> eof) <* skipMany pBlank
63
68
69+resolveRelativeLengths :: [Either Int ColWidth] -> [ColWidth]
70+resolveRelativeLengths ws =
71+ let remaining = 1 - sum (map getColWidth $ rights ws)
72+ relatives = sum $ lefts ws
73+ relUnit = remaining / fromIntegral relatives
74+ toColWidth (Right x) = x
75+ toColWidth (Left i) = ColWidth (fromIntegral i * relUnit)
76+ in map toColWidth ws
77+
78+getColWidth :: ColWidth -> Double
79+getColWidth ColWidthDefault = 0
80+getColWidth (ColWidth w) = w
81+
64data CellType
82data CellType
65 = HeaderCell
83 = HeaderCell
66 | BodyCell
84 | BodyCell
@@ -182,7 +200,8 @@ pTable :: PandocMonad m
182pTable block = try $ do
200pTable block = try $ do
183 TagOpen _ attribs <- pSatisfy (matchTagOpen "table" []) <* skipMany pBlank
201 TagOpen _ attribs <- pSatisfy (matchTagOpen "table" []) <* skipMany pBlank
184 caption <- option mempty $ pInTags "caption" block <* skipMany pBlank
202 caption <- option mempty $ pInTags "caption" block <* skipMany pBlank
203+ widths <- resolveRelativeLengths <$>
185− widths <- ((mconcat <$> many1 pColgroup) <|> many pCol) <* skipMany pBlank
204+ ((mconcat <$> many1 pColgroup) <|> many pCol) <* skipMany pBlank
186 thead <- pTableHead block <* skipMany pBlank
205 thead <- pTableHead block <* skipMany pBlank
187 topfoot <- optionMaybe (pTableFoot block) <* skipMany pBlank
206 topfoot <- optionMaybe (pTableFoot block) <* skipMany pBlank
188 tbodies <- many (pTableBody block) <* skipMany pBlank
207 tbodies <- many (pTableBody block) <* skipMany pBlank
src/Text/Pandoc/Readers/Haddock.hs+2−1
@@ -131,7 +131,8 @@ docHToInlines isCode d' =
131 DocIdentifier s -> B.codeWith ("",["haskell","identifier"],[]) $ T.pack s
131 DocIdentifier s -> B.codeWith ("",["haskell","identifier"],[]) $ T.pack s
132 _ -> mempty
132 _ -> mempty
133 DocIdentifierUnchecked s -> B.codeWith ("",["haskell","identifier"],[]) $ T.pack s
133 DocIdentifierUnchecked s -> B.codeWith ("",["haskell","identifier"],[]) $ T.pack s
134− DocModule s -> B.codeWith ("",["haskell","module"],[]) $ T.pack s
134+ DocModule s -> B.codeWith ("",["haskell","module"],[]) $
135+ T.pack (modLinkName s)
135 DocWarning _ -> mempty -- TODO
136 DocWarning _ -> mempty -- TODO
136 DocEmphasis d -> B.emph (docHToInlines isCode d)
137 DocEmphasis d -> B.emph (docHToInlines isCode d)
137 DocMonospaced (DocString s) -> B.code $ T.pack s
138 DocMonospaced (DocString s) -> B.code $ T.pack s
src/Text/Pandoc/Readers/Jira.hs+2
@@ -172,6 +172,8 @@ jiraLinkToPandoc linkType alias url =
172 Jira.Email -> link ("mailto:" <> url') "" alias'
172 Jira.Email -> link ("mailto:" <> url') "" alias'
173 Jira.Attachment -> linkWith ("", ["attachment"], []) url' "" alias'
173 Jira.Attachment -> linkWith ("", ["attachment"], []) url' "" alias'
174 Jira.User -> linkWith ("", ["user-account"], []) url' "" alias'
174 Jira.User -> linkWith ("", ["user-account"], []) url' "" alias'
175+ Jira.SmartCard -> linkWith ("", ["smart-card"], []) url' "" alias'
176+ Jira.SmartLink -> linkWith ("", ["smart-link"], []) url' "" alias'
175
177
176-- | Get unicode representation of a Jira icon.
178-- | Get unicode representation of a Jira icon.
177iconUnicode :: Jira.Icon -> Text
179iconUnicode :: Jira.Icon -> Text
src/Text/Pandoc/Readers/LaTeX.hs+4−14
@@ -24,7 +24,7 @@ module Text.Pandoc.Readers.LaTeX ( readLaTeX,
24import Control.Applicative (many, optional, (<|>))
24import Control.Applicative (many, optional, (<|>))
25import Control.Monad
25import Control.Monad
26import Control.Monad.Except (throwError)
26import Control.Monad.Except (throwError)
27−import Data.Char (isDigit, isLetter, toUpper, chr)
27+import Data.Char (isDigit, isLetter, isAlphaNum, toUpper, chr)
28import Data.Default
28import Data.Default
29import Data.List (intercalate)
29import Data.List (intercalate)
30import qualified Data.Map as M
30import qualified Data.Map as M
@@ -232,16 +232,6 @@ mkImage options (T.unpack -> src) = do
232 _ -> return src
232 _ -> return src
233 return $ imageWith attr (T.pack src') "" alt
233 return $ imageWith attr (T.pack src') "" alt
234
234
235−doxspace :: PandocMonad m => LP m Inlines
236−doxspace =
237− (space <$ lookAhead (satisfyTok startsWithLetter)) <|> return mempty
238− where startsWithLetter (Tok _ Word t) =
239− case T.uncons t of
240− Just (c, _) | isLetter c -> True
241− _ -> False
242− startsWithLetter _ = False
243−
244−
245removeDoubleQuotes :: Text -> Text
235removeDoubleQuotes :: Text -> Text
246removeDoubleQuotes t =
236removeDoubleQuotes t =
247 Data.Maybe.fromMaybe t $ T.stripPrefix "\"" t >>= T.stripSuffix "\""
237 Data.Maybe.fromMaybe t $ T.stripPrefix "\"" t >>= T.stripSuffix "\""
@@ -310,7 +300,9 @@ inlineCommand' :: PandocMonad m => LP m Inlines
310inlineCommand' = try $ do
300inlineCommand' = try $ do
311 Tok _ (CtrlSeq name) cmd <- anyControlSeq
301 Tok _ (CtrlSeq name) cmd <- anyControlSeq
312 guard $ name /= "begin" && name /= "end" && name /= "and"
302 guard $ name /= "begin" && name /= "end" && name /= "and"
303+ star <- if T.all isAlphaNum name
313− star <- option "" ("*" <$ symbol '*' <* sp)
304+ then option "" ("*" <$ symbol '*' <* sp)
305+ else pure ""
314 overlay <- option "" overlaySpecification
306 overlay <- option "" overlaySpecification
315 let name' = name <> star <> overlay
307 let name' = name <> star <> overlay
316 let names = ordNub [name', name] -- check non-starred as fallback
308 let names = ordNub [name', name] -- check non-starred as fallback
@@ -417,8 +409,6 @@ inlineCommands = M.unions
417 -- LaTeX colors
409 -- LaTeX colors
418 , ("textcolor", coloredInline "color")
410 , ("textcolor", coloredInline "color")
419 , ("colorbox", coloredInline "background-color")
411 , ("colorbox", coloredInline "background-color")
420− -- xspace
421− , ("xspace", doxspace)
422 -- etoolbox
412 -- etoolbox
423 , ("ifstrequal", ifstrequal)
413 , ("ifstrequal", ifstrequal)
424 , ("newtoggle", braced >>= newToggle)
414 , ("newtoggle", braced >>= newToggle)
src/Text/Pandoc/Readers/LaTeX/Macro.hs+45−14
@@ -14,6 +14,7 @@ import Text.Pandoc.Parsing hiding (blankline, mathDisplay, mathInline,
14import Control.Applicative ((<|>), optional)
14import Control.Applicative ((<|>), optional)
15import qualified Data.Map as M
15import qualified Data.Map as M
16import Data.Text (Text)
16import Data.Text (Text)
17+import qualified Data.Text as T
17
18
18macroDef :: (PandocMonad m, Monoid a) => (Text -> a) -> LP m a
19macroDef :: (PandocMonad m, Monoid a) => (Text -> a) -> LP m a
19macroDef constructor = do
20macroDef constructor = do
@@ -22,9 +23,11 @@ macroDef constructor = do
22 guardDisabled Ext_latex_macros)
23 guardDisabled Ext_latex_macros)
23 <|> return mempty
24 <|> return mempty
24 where commandDef = do
25 where commandDef = do
25− (name, macro') <- newcommand <|> letmacro <|> defmacro
26+ nameMacroPairs <- newcommand <|> letmacro <|> defmacro <|> newif
26 guardDisabled Ext_latex_macros <|>
27 guardDisabled Ext_latex_macros <|>
28+ mapM_ (\(name, macro') ->
27− updateState (\s -> s{ sMacros = M.insert name macro' (sMacros s) })
29+ updateState (\s -> s{ sMacros = M.insert name macro'
30+ (sMacros s) })) nameMacroPairs
28 environmentDef = do
31 environmentDef = do
29 mbenv <- newenvironment
32 mbenv <- newenvironment
30 case mbenv of
33 case mbenv of
@@ -40,7 +43,7 @@ macroDef constructor = do
40 -- @\newcommand{\envname}[n-args][default]{begin}@
43 -- @\newcommand{\envname}[n-args][default]{begin}@
41 -- @\newcommand{\endenvname}@
44 -- @\newcommand{\endenvname}@
42
45
43−letmacro :: PandocMonad m => LP m (Text, Macro)
46+letmacro :: PandocMonad m => LP m [(Text, Macro)]
44letmacro = do
47letmacro = do
45 controlSeq "let"
48 controlSeq "let"
46 (name, contents) <- withVerbatimMode $ do
49 (name, contents) <- withVerbatimMode $ do
@@ -53,18 +56,47 @@ letmacro = do
53 contents <- bracedOrToken
56 contents <- bracedOrToken
54 return (name, contents)
57 return (name, contents)
55 contents' <- doMacros' 0 contents
58 contents' <- doMacros' 0 contents
56− return (name, Macro ExpandWhenDefined [] Nothing contents')
59+ return [(name, Macro ExpandWhenDefined [] Nothing contents')]
57
60
58−defmacro :: PandocMonad m => LP m (Text, Macro)
61+defmacro :: PandocMonad m => LP m [(Text, Macro)]
59−defmacro = try $
62+defmacro = do
60 -- we use withVerbatimMode, because macros are to be expanded
63 -- we use withVerbatimMode, because macros are to be expanded
61 -- at point of use, not point of definition
64 -- at point of use, not point of definition
65+ controlSeq "def"
62 withVerbatimMode $ do
66 withVerbatimMode $ do
63− controlSeq "def"
64 Tok _ (CtrlSeq name) _ <- anyControlSeq
67 Tok _ (CtrlSeq name) _ <- anyControlSeq
65 argspecs <- many (argspecArg <|> argspecPattern)
68 argspecs <- many (argspecArg <|> argspecPattern)
66 contents <- bracedOrToken
69 contents <- bracedOrToken
67− return (name, Macro ExpandWhenUsed argspecs Nothing contents)
70+ return [(name, Macro ExpandWhenUsed argspecs Nothing contents)]
71+
72+-- \newif\iffoo' defines:
73+-- \iffoo to be \iffalse
74+-- \footrue to be a command that defines \iffoo to be \iftrue
75+-- \foofalse to be a command that defines \iffoo to be \iffalse
76+newif :: PandocMonad m => LP m [(Text, Macro)]
77+newif = do
78+ controlSeq "newif"
79+ withVerbatimMode $ do
80+ Tok pos (CtrlSeq name) _ <- anyControlSeq
81+ -- \def\iffoo\iffalse
82+ -- \def\footrue{\def\iffoo\iftrue}
83+ -- \def\foofalse{\def\iffoo\iffalse}
84+ let base = T.drop 2 name
85+ return [ (name, Macro ExpandWhenUsed [] Nothing
86+ [Tok pos (CtrlSeq "iffalse") "\\iffalse"])
87+ , (base <> "true",
88+ Macro ExpandWhenUsed [] Nothing
89+ [ Tok pos (CtrlSeq "def") "\\def"
90+ , Tok pos (CtrlSeq name) ("\\" <> name)
91+ , Tok pos (CtrlSeq "iftrue") "\\iftrue"
92+ ])
93+ , (base <> "false",
94+ Macro ExpandWhenUsed [] Nothing
95+ [ Tok pos (CtrlSeq "def") "\\def"
96+ , Tok pos (CtrlSeq name) ("\\" <> name)
97+ , Tok pos (CtrlSeq "iffalse") "\\iffalse"
98+ ])
99+ ]
68
100
69argspecArg :: PandocMonad m => LP m ArgSpec
101argspecArg :: PandocMonad m => LP m ArgSpec
70argspecArg = do
102argspecArg = do
@@ -77,10 +109,9 @@ argspecPattern =
77 (toktype' == Symbol || toktype' == Word) &&
109 (toktype' == Symbol || toktype' == Word) &&
78 (txt /= "{" && txt /= "\\" && txt /= "}")))
110 (txt /= "{" && txt /= "\\" && txt /= "}")))
79
111
80−newcommand :: PandocMonad m => LP m (Text, Macro)
112+newcommand :: PandocMonad m => LP m [(Text, Macro)]
81newcommand = do
113newcommand = do
82− pos <- getPosition
83− Tok _ (CtrlSeq mtype) _ <- controlSeq "newcommand" <|>
114+ Tok pos (CtrlSeq mtype) _ <- controlSeq "newcommand" <|>
84 controlSeq "renewcommand" <|>
115 controlSeq "renewcommand" <|>
85 controlSeq "providecommand" <|>
116 controlSeq "providecommand" <|>
86 controlSeq "DeclareMathOperator" <|>
117 controlSeq "DeclareMathOperator" <|>
@@ -112,9 +143,9 @@ newcommand = do
112 Just macro
143 Just macro
113 | mtype == "newcommand" -> do
144 | mtype == "newcommand" -> do
114 report $ MacroAlreadyDefined txt pos
145 report $ MacroAlreadyDefined txt pos
115− return (name, macro)
146+ return [(name, macro)]
116− | mtype == "providecommand" -> return (name, macro)
147+ | mtype == "providecommand" -> return [(name, macro)]
117− _ -> return (name, Macro ExpandWhenUsed argspecs optarg contents)
148+ _ -> return [(name, Macro ExpandWhenUsed argspecs optarg contents)]
118
149
119newenvironment :: PandocMonad m => LP m (Maybe (Text, Macro, Macro))
150newenvironment :: PandocMonad m => LP m (Maybe (Text, Macro, Macro))
120newenvironment = do
151newenvironment = do
src/Text/Pandoc/Readers/LaTeX/Parsing.hs+39−4
@@ -113,7 +113,6 @@ import Text.Pandoc.Readers.LaTeX.Types (ExpansionPoint (..), Macro (..),
113 ArgSpec (..), Tok (..), TokType (..))
113 ArgSpec (..), Tok (..), TokType (..))
114import Text.Pandoc.Shared
114import Text.Pandoc.Shared
115import Text.Parsec.Pos
115import Text.Parsec.Pos
116−-- import Debug.Trace
117
116
118newtype DottedNum = DottedNum [Int]
117newtype DottedNum = DottedNum [Int]
119 deriving (Show, Eq)
118 deriving (Show, Eq)
@@ -464,7 +463,7 @@ satisfyTok f = do
464doMacros :: PandocMonad m => LP m ()
463doMacros :: PandocMonad m => LP m ()
465doMacros = do
464doMacros = do
466 st <- getState
465 st <- getState
467− unless (sVerbatimMode st || M.null (sMacros st)) $ do
466+ unless (sVerbatimMode st) $
468 getInput >>= doMacros' 1 >>= setInput
467 getInput >>= doMacros' 1 >>= setInput
469
468
470doMacros' :: PandocMonad m => Int -> [Tok] -> LP m [Tok]
469doMacros' :: PandocMonad m => Int -> [Tok] -> LP m [Tok]
@@ -526,7 +525,7 @@ doMacros' n inp =
526 $ throwError $ PandocMacroLoop name
525 $ throwError $ PandocMacroLoop name
527 macros <- sMacros <$> getState
526 macros <- sMacros <$> getState
528 case M.lookup name macros of
527 case M.lookup name macros of
529− Nothing -> mzero
528+ Nothing -> trySpecialMacro name ts
530 Just (Macro expansionPoint argspecs optarg newtoks) -> do
529 Just (Macro expansionPoint argspecs optarg newtoks) -> do
531 let getargs' = do
530 let getargs' = do
532 args <-
531 args <-
@@ -554,6 +553,41 @@ doMacros' n inp =
554 ExpandWhenUsed -> doMacros' (n' + 1) result
553 ExpandWhenUsed -> doMacros' (n' + 1) result
555 ExpandWhenDefined -> return result
554 ExpandWhenDefined -> return result
556
555
556+-- | Certain macros do low-level tex manipulations that can't
557+-- be represented in our Macro type, so we handle them here.
558+trySpecialMacro :: PandocMonad m => Text -> [Tok] -> LP m [Tok]
559+trySpecialMacro "xspace" ts = do
560+ ts' <- doMacros' 1 ts
561+ case ts' of
562+ Tok pos Word t : _
563+ | startsWithAlphaNum t -> return $ Tok pos Spaces " " : ts'
564+ _ -> return ts'
565+trySpecialMacro "iftrue" ts = handleIf True ts
566+trySpecialMacro "iffalse" ts = handleIf False ts
567+trySpecialMacro _ _ = mzero
568+
569+handleIf :: PandocMonad m => Bool -> [Tok] -> LP m [Tok]
570+handleIf b ts = do
571+ res' <- lift $ runParserT (ifParser b) defaultLaTeXState "tokens" ts
572+ case res' of
573+ Left _ -> Prelude.fail "Could not parse conditional"
574+ Right ts' -> return ts'
575+
576+ifParser :: PandocMonad m => Bool -> LP m [Tok]
577+ifParser b = do
578+ ifToks <- many (notFollowedBy (controlSeq "else" <|> controlSeq "fi")
579+ *> anyTok)
580+ elseToks <- (controlSeq "else" >> manyTill anyTok (controlSeq "fi"))
581+ <|> ([] <$ controlSeq "fi")
582+ rest <- getInput
583+ return $ (if b then ifToks else elseToks) ++ rest
584+
585+startsWithAlphaNum :: Text -> Bool
586+startsWithAlphaNum t =
587+ case T.uncons t of
588+ Just (c, _) | isAlphaNum c -> True
589+ _ -> False
590+
557setpos :: SourcePos -> Tok -> Tok
591setpos :: SourcePos -> Tok -> Tok
558setpos spos (Tok _ tt txt) = Tok spos tt txt
592setpos spos (Tok _ tt txt) = Tok spos tt txt
559
593
@@ -789,7 +823,8 @@ withRaw parser = do
789
823
790keyval :: PandocMonad m => LP m (Text, Text)
824keyval :: PandocMonad m => LP m (Text, Text)
791keyval = try $ do
825keyval = try $ do
826+ key <- untokenize <$> many1 (notFollowedBy (symbol '=') >>
792− Tok _ Word key <- satisfyTok isWordTok
827+ (symbol '-' <|> symbol '_' <|> satisfyTok isWordTok))
793 sp
828 sp
794 val <- option mempty $ do
829 val <- option mempty $ do
795 symbol '='
830 symbol '='
src/Text/Pandoc/Readers/LaTeX/SIunitx.hs+140−66
@@ -1,3 +1,4 @@
1+{-# LANGUAGE ScopedTypeVariables #-}
1{-# LANGUAGE OverloadedStrings #-}
2{-# LANGUAGE OverloadedStrings #-}
2module Text.Pandoc.Readers.LaTeX.SIunitx
3module Text.Pandoc.Readers.LaTeX.SIunitx
3 ( siunitxCommands )
4 ( siunitxCommands )
@@ -9,27 +10,32 @@ import Text.Pandoc.Class
9import Text.Pandoc.Parsing hiding (blankline, mathDisplay, mathInline,
10import Text.Pandoc.Parsing hiding (blankline, mathDisplay, mathInline,
10 optional, space, spaces, withRaw, (<|>))
11 optional, space, spaces, withRaw, (<|>))
11import Control.Applicative ((<|>))
12import Control.Applicative ((<|>))
13+import Control.Monad (void)
12import qualified Data.Map as M
14import qualified Data.Map as M
13import Data.Char (isDigit)
15import Data.Char (isDigit)
14import Data.Text (Text)
16import Data.Text (Text)
15import qualified Data.Text as T
17import qualified Data.Text as T
16import Data.List (intersperse)
18import Data.List (intersperse)
17−
19+import qualified Data.Sequence as Seq
20+import Text.Pandoc.Walk (walk)
18
21
19siunitxCommands :: PandocMonad m
22siunitxCommands :: PandocMonad m
20 => LP m Inlines -> M.Map Text (LP m Inlines)
23 => LP m Inlines -> M.Map Text (LP m Inlines)
21siunitxCommands tok = M.fromList
24siunitxCommands tok = M.fromList
22− [ ("si", skipopts *> dosi tok)
25+ [ ("si", dosi tok)
23 , ("SI", doSI tok)
26 , ("SI", doSI tok)
24 , ("SIrange", doSIrange True tok)
27 , ("SIrange", doSIrange True tok)
25 , ("numrange", doSIrange False tok)
28 , ("numrange", doSIrange False tok)
26 , ("numlist", doSInumlist)
29 , ("numlist", doSInumlist)
30+ , ("SIlist", doSIlist tok)
27 , ("num", doSInum)
31 , ("num", doSInum)
28 , ("ang", doSIang)
32 , ("ang", doSIang)
29 ]
33 ]
30
34
31dosi :: PandocMonad m => LP m Inlines -> LP m Inlines
35dosi :: PandocMonad m => LP m Inlines -> LP m Inlines
36+dosi tok = do
37+ options <- option [] keyvals
32−dosi tok = grouped (siUnit tok) <|> siUnit tok
38+ grouped (siUnit options tok) <|> siUnit options tok
33
39
34-- converts e.g. \SI{1}[\$]{} to "$ 1" or \SI{1}{\euro} to "1 €"
40-- converts e.g. \SI{1}[\$]{} to "$ 1" or \SI{1}{\euro} to "1 €"
35doSI :: PandocMonad m => LP m Inlines -> LP m Inlines
41doSI :: PandocMonad m => LP m Inlines -> LP m Inlines
@@ -64,23 +70,50 @@ doSInumlist = do
64 mconcat (intersperse (str "," <> space) (init xs)) <>
70 mconcat (intersperse (str "," <> space) (init xs)) <>
65 text ", & " <> last xs
71 text ", & " <> last xs
66
72
73+doSIlist :: PandocMonad m => LP m Inlines -> LP m Inlines
74+doSIlist tok = do
75+ options <- option [] keyvals
76+ nums <- map tonum . T.splitOn ";" . untokenize <$> braced
77+ unit <- grouped (siUnit options tok) <|> siUnit options tok
78+ let xs = map (<> (str "\xa0" <> unit)) nums
79+ case xs of
80+ [] -> return mempty
81+ [x] -> return x
82+ _ -> return $
83+ mconcat (intersperse (str "," <> space) (init xs)) <>
84+ text ", & " <> last xs
85+
67parseNum :: Parser Text () Inlines
86parseNum :: Parser Text () Inlines
68parseNum = (mconcat <$> many parseNumPart) <* eof
87parseNum = (mconcat <$> many parseNumPart) <* eof
69
88
89+minus :: Text
90+minus = "\x2212"
91+
92+hyphenToMinus :: Inline -> Inline
93+hyphenToMinus (Str t) = Str (T.replace "-" minus t)
94+hyphenToMinus x = x
95+
70parseNumPart :: Parser Text () Inlines
96parseNumPart :: Parser Text () Inlines
71parseNumPart =
97parseNumPart =
72 parseDecimalNum <|>
98 parseDecimalNum <|>
73 parseComma <|>
99 parseComma <|>
74 parsePlusMinus <|>
100 parsePlusMinus <|>
101+ parsePM <|>
75 parseI <|>
102 parseI <|>
76 parseExp <|>
103 parseExp <|>
77 parseX <|>
104 parseX <|>
78 parseSpace
105 parseSpace
79 where
106 where
80− parseDecimalNum = do
107+ parseDecimalNum, parsePlusMinus, parsePM,
108+ parseComma, parseI, parseX,
109+ parseExp, parseSpace :: Parser Text () Inlines
110+ parseDecimalNum = try $ do
81− pref <- option mempty $ (mempty <$ char '+') <|> ("\x2212" <$ char '-')
111+ pref <- option mempty $ (mempty <$ char '+') <|> (minus <$ char '-')
82− basenum <- (pref <>) . T.pack
83− <$> many1 (satisfy (\c -> isDigit c || c == '.'))
112+ basenum' <- many1 (satisfy (\c -> isDigit c || c == '.'))
113+ let basenum = pref <> T.pack
114+ (case basenum' of
115+ '.':_ -> '0':basenum'
116+ _ -> basenum')
84 uncertainty <- option mempty $ T.pack <$> parseParens
117 uncertainty <- option mempty $ T.pack <$> parseParens
85 if T.null uncertainty
118 if T.null uncertainty
86 then return $ str basenum
119 then return $ str basenum
@@ -98,6 +131,7 @@ parseNumPart =
98 | otherwise -> "." <> t
131 | otherwise -> "." <> t
99 parseComma = str "." <$ char ','
132 parseComma = str "." <$ char ','
100 parsePlusMinus = str "\xa0\xb1\xa0" <$ try (string "+-")
133 parsePlusMinus = str "\xa0\xb1\xa0" <$ try (string "+-")
134+ parsePM = str "\xa0\xb1\xa0" <$ try (string "\\pm")
101 parseParens =
135 parseParens =
102 char '(' *> many1 (satisfy (\c -> isDigit c || c == '.')) <* char ')'
136 char '(' *> many1 (satisfy (\c -> isDigit c || c == '.')) <* char ')'
103 parseI = str "i" <$ char 'i'
137 parseI = str "i" <$ char 'i'
@@ -110,11 +144,14 @@ doSIang :: PandocMonad m => LP m Inlines
110doSIang = do
144doSIang = do
111 skipopts
145 skipopts
112 ps <- T.splitOn ";" . untokenize <$> braced
146 ps <- T.splitOn ";" . untokenize <$> braced
147+ let dropPlus t = case T.uncons t of
148+ Just ('+',t') -> t'
149+ _ -> t
113 case ps ++ repeat "" of
150 case ps ++ repeat "" of
114 (d:m:s:_) -> return $
151 (d:m:s:_) -> return $
115− (if T.null d then mempty else str d <> str "\xb0") <>
152+ (if T.null d then mempty else str (dropPlus d) <> str "\xb0") <>
116− (if T.null m then mempty else str m <> str "\x2032") <>
153+ (if T.null m then mempty else str (dropPlus m) <> str "\x2032") <>
117− (if T.null s then mempty else str s <> str "\x2033")
154+ (if T.null s then mempty else str (dropPlus s) <> str "\x2033")
118 _ -> return mempty
155 _ -> return mempty
119
156
120-- converts e.g. \SIrange{100}{200}{\ms} to "100 ms--200 ms"
157-- converts e.g. \SIrange{100}{200}{\ms} to "100 ms--200 ms"
@@ -143,40 +180,99 @@ doSIrange includeUnits tok = do
143emptyOr160 :: Inlines -> Inlines
180emptyOr160 :: Inlines -> Inlines
144emptyOr160 x = if x == mempty then x else str "\160"
181emptyOr160 x = if x == mempty then x else str "\160"
145
182
146−siUnit :: PandocMonad m => LP m Inlines -> LP m Inlines
183+siUnit :: forall m. PandocMonad m => [(Text,Text)] -> LP m Inlines -> LP m Inlines
147−siUnit tok = try (do
184+siUnit options tok = mconcat . intersperse (str "\xa0") <$> many1 siUnitPart
148− Tok _ (CtrlSeq name) _ <- anyControlSeq
185+ where
149− case name of
186+ siUnitPart :: LP m Inlines
187+ siUnitPart = try $ do
188+ skipMany (void (symbol '.') <|> void (symbol '~') <|> spaces1)
189+ x <- ((siPrefix <*> siBase)
190+ <|> (do u <- siBase <|> tok
191+ option u $ siSuffix <*> pure u))
192+ option x (siInfix x)
193+ siInfix :: Inlines -> LP m Inlines
194+ siInfix u1 = try $
195+ (do _ <- controlSeq "per"
196+ u2 <- siUnitPart
197+ let useSlash = lookup "per-mode" options == Just "symbol"
198+ if useSlash
199+ then return (u1 <> str "/" <> u2)
200+ else return (u1 <> str "\xa0" <> negateExponent u2))
201+ <|> (do _ <- symbol '/'
202+ u2 <- siUnitPart
203+ return (u1 <> str "/" <> u2))
204+ siPrefix :: LP m (Inlines -> Inlines)
205+ siPrefix =
150− "square" -> do
206+ (do _ <- controlSeq "square"
151− unit <- siUnit tok
207+ skipopts
152− return $ unit <> superscript "2"
208+ return (<> superscript "2"))
153− "cubic" -> do
209+ <|> (do _ <- controlSeq "cubic"
154− unit <- siUnit tok
210+ skipopts
155− return $ unit <> superscript "3"
211+ return (<> superscript "3"))
156− "raisetothe" -> do
212+ <|> (do _ <- controlSeq "raisetothe"
157− n <- tok
213+ skipopts
158− unit <- siUnit tok
214+ n <- walk hyphenToMinus <$> tok
159− return $ unit <> superscript n
215+ return (<> superscript n))
160− _ ->
216+ siSuffix :: LP m (Inlines -> Inlines)
161− case M.lookup name siUnitMap of
217+ siSuffix =
162− Just il ->
163− option il $
164− choice
165− [ (il <> superscript "2") <$ controlSeq "squared"
218+ (do _ <- controlSeq "squared"
219+ skipopts
220+ return (<> superscript "2"))
166− , (il <> superscript "3") <$ controlSeq "cubed"
221+ <|> (do _ <- controlSeq "cubed"
222+ skipopts
223+ return (<> superscript "3"))
167− , (\n -> il <> superscript n) <$> (controlSeq "tothe" *> tok)
224+ <|> (do _ <- controlSeq "tothe"
168− ]
225+ skipopts
226+ n <- walk hyphenToMinus <$> tok
227+ return (<> superscript n))
228+ <|> (symbol '^' *> (do n <- walk hyphenToMinus <$> tok
229+ return (<> superscript n)))
230+ <|> (symbol '_' *> (do n <- walk hyphenToMinus <$> tok
231+ return (<> subscript n)))
232+ negateExponent :: Inlines -> Inlines
233+ negateExponent ils =
234+ case Seq.viewr (unMany ils) of
235+ xs Seq.:> Superscript ss -> (Many xs) <>
236+ superscript (str minus <> fromList ss)
237+ _ -> ils <> superscript (str (minus <> "1"))
238+ siBase :: LP m Inlines
239+ siBase =
240+ ((try
241+ (do Tok _ (CtrlSeq name) _ <- anyControlSeq
242+ case M.lookup name siUnitModifierMap of
243+ Just il -> (il <>) <$> siBase
244+ Nothing ->
245+ case M.lookup name siUnitMap of
246+ Just il -> pure il
169− Nothing -> fail "not an siunit unit command")
247+ Nothing -> fail "not a unit command"))
170− <|> (lookAhead anyControlSeq >> tok)
171− <|> (do Tok _ Word t <- satisfyTok isWordTok
248+ <|> (do Tok _ Word t <- satisfyTok isWordTok
172− return $ str t)
249+ return $ str t)
173− <|> (symbol '^' *> (superscript <$> tok))
250+ )
174− <|> (symbol '_' *> (subscript <$> tok))
251+
175− <|> ("\xa0" <$ symbol '.')
252+siUnitModifierMap :: M.Map Text Inlines
176− <|> ("\xa0" <$ symbol '~')
253+siUnitModifierMap = M.fromList
177− <|> tok
254+ [ ("atto", str "a")
178− <|> (do Tok _ _ t <- anyTok
255+ , ("centi", str "c")
179− return (str t))
256+ , ("deca", str "d")
257+ , ("deci", str "d")
258+ , ("deka", str "d")
259+ , ("exa", str "E")
260+ , ("femto", str "f")
261+ , ("giga", str "G")
262+ , ("hecto", str "h")
263+ , ("kilo", str "k")
264+ , ("mega", str "M")
265+ , ("micro", str "μ")
266+ , ("milli", str "m")
267+ , ("nano", str "n")
268+ , ("peta", str "P")
269+ , ("pico", str "p")
270+ , ("tera", str "T")
271+ , ("yocto", str "y")
272+ , ("yotta", str "Y")
273+ , ("zepto", str "z")
274+ , ("zetta", str "Z")
275+ ]
180
276
181siUnitMap :: M.Map Text Inlines
277siUnitMap :: M.Map Text Inlines
182siUnitMap = M.fromList
278siUnitMap = M.fromList
@@ -276,7 +372,6 @@ siUnitMap = M.fromList
276 , ("arcsecond", str "″")
372 , ("arcsecond", str "″")
277 , ("astronomicalunit", str "ua")
373 , ("astronomicalunit", str "ua")
278 , ("atomicmassunit", str "u")
374 , ("atomicmassunit", str "u")
279− , ("atto", str "a")
280 , ("bar", str "bar")
375 , ("bar", str "bar")
281 , ("barn", str "b")
376 , ("barn", str "b")
282 , ("becquerel", str "Bq")
377 , ("becquerel", str "Bq")
@@ -284,51 +379,38 @@ siUnitMap = M.fromList
284 , ("bohr", emph (str "a") <> subscript (str "0"))
379 , ("bohr", emph (str "a") <> subscript (str "0"))
285 , ("candela", str "cd")
380 , ("candela", str "cd")
286 , ("celsius", str "°C")
381 , ("celsius", str "°C")
287− , ("centi", str "c")
288 , ("clight", emph (str "c") <> subscript (str "0"))
382 , ("clight", emph (str "c") <> subscript (str "0"))
289 , ("coulomb", str "C")
383 , ("coulomb", str "C")
290 , ("dalton", str "Da")
384 , ("dalton", str "Da")
291 , ("day", str "d")
385 , ("day", str "d")
292− , ("deca", str "d")
293− , ("deci", str "d")
294 , ("decibel", str "db")
386 , ("decibel", str "db")
295 , ("degreeCelsius",str "°C")
387 , ("degreeCelsius",str "°C")
296 , ("degree", str "°")
388 , ("degree", str "°")
297− , ("deka", str "d")
298 , ("electronmass", emph (str "m") <> subscript (str "e"))
389 , ("electronmass", emph (str "m") <> subscript (str "e"))
299 , ("electronvolt", str "eV")
390 , ("electronvolt", str "eV")
300 , ("elementarycharge", emph (str "e"))
391 , ("elementarycharge", emph (str "e"))
301− , ("exa", str "E")
302 , ("farad", str "F")
392 , ("farad", str "F")
303− , ("femto", str "f")
304− , ("giga", str "G")
305 , ("gram", str "g")
393 , ("gram", str "g")
306 , ("gray", str "Gy")
394 , ("gray", str "Gy")
307 , ("hartree", emph (str "E") <> subscript (str "h"))
395 , ("hartree", emph (str "E") <> subscript (str "h"))
308 , ("hectare", str "ha")
396 , ("hectare", str "ha")
309− , ("hecto", str "h")
310 , ("henry", str "H")
397 , ("henry", str "H")
311 , ("hertz", str "Hz")
398 , ("hertz", str "Hz")
312 , ("hour", str "h")
399 , ("hour", str "h")
313 , ("joule", str "J")
400 , ("joule", str "J")
314 , ("katal", str "kat")
401 , ("katal", str "kat")
315 , ("kelvin", str "K")
402 , ("kelvin", str "K")
316− , ("kilo", str "k")
317 , ("kilogram", str "kg")
403 , ("kilogram", str "kg")
318 , ("knot", str "kn")
404 , ("knot", str "kn")
319 , ("liter", str "L")
405 , ("liter", str "L")
320 , ("litre", str "l")
406 , ("litre", str "l")
321 , ("lumen", str "lm")
407 , ("lumen", str "lm")
322 , ("lux", str "lx")
408 , ("lux", str "lx")
323− , ("mega", str "M")
324 , ("meter", str "m")
409 , ("meter", str "m")
325 , ("metre", str "m")
410 , ("metre", str "m")
326− , ("micro", str "μ")
327− , ("milli", str "m")
328 , ("minute", str "min")
411 , ("minute", str "min")
329 , ("mmHg", str "mmHg")
412 , ("mmHg", str "mmHg")
330 , ("mole", str "mol")
413 , ("mole", str "mol")
331− , ("nano", str "n")
332 , ("nauticalmile", str "M")
414 , ("nauticalmile", str "M")
333 , ("neper", str "Np")
415 , ("neper", str "Np")
334 , ("newton", str "N")
416 , ("newton", str "N")
@@ -336,25 +418,17 @@ siUnitMap = M.fromList
336 , ("Pa", str "Pa")
418 , ("Pa", str "Pa")
337 , ("pascal", str "Pa")
419 , ("pascal", str "Pa")
338 , ("percent", str "%")
420 , ("percent", str "%")
339− , ("per", str "/")
340− , ("peta", str "P")
341− , ("pico", str "p")
342 , ("planckbar", emph (str "\x210f"))
421 , ("planckbar", emph (str "\x210f"))
343 , ("radian", str "rad")
422 , ("radian", str "rad")
344 , ("second", str "s")
423 , ("second", str "s")
345 , ("siemens", str "S")
424 , ("siemens", str "S")
346 , ("sievert", str "Sv")
425 , ("sievert", str "Sv")
347 , ("steradian", str "sr")
426 , ("steradian", str "sr")
348− , ("tera", str "T")
349 , ("tesla", str "T")
427 , ("tesla", str "T")
350 , ("tonne", str "t")
428 , ("tonne", str "t")
351 , ("volt", str "V")
429 , ("volt", str "V")
352 , ("watt", str "W")
430 , ("watt", str "W")
353 , ("weber", str "Wb")
431 , ("weber", str "Wb")
354− , ("yocto", str "y")
355− , ("yotta", str "Y")
356− , ("zepto", str "z")
357− , ("zetta", str "Z")
358 ]
432 ]
359
433
360
434
src/Text/Pandoc/Readers/Markdown.hs+38−12
@@ -29,7 +29,9 @@ import qualified Data.Set as Set
29import Data.Text (Text)
29import Data.Text (Text)
30import qualified Data.Text as T
30import qualified Data.Text as T
31import qualified Data.ByteString.Lazy as BL
31import qualified Data.ByteString.Lazy as BL
32−import System.FilePath (addExtension, takeExtension)
32+import System.FilePath (addExtension, takeExtension, takeDirectory)
33+import qualified System.FilePath.Windows as Windows
34+import qualified System.FilePath.Posix as Posix
33import Text.HTML.TagSoup hiding (Row)
35import Text.HTML.TagSoup hiding (Row)
34import Text.Pandoc.Builder (Blocks, Inlines)
36import Text.Pandoc.Builder (Blocks, Inlines)
35import qualified Text.Pandoc.Builder as B
37import qualified Text.Pandoc.Builder as B
@@ -336,7 +338,9 @@ referenceKey = try $ do
336 notFollowedBy' (() <$ reference)
338 notFollowedBy' (() <$ reference)
337 many1Char $ notFollowedBy space >> litChar
339 many1Char $ notFollowedBy space >> litChar
338 let betweenAngles = try $ char '<' >> manyTillChar litChar (char '>')
340 let betweenAngles = try $ char '<' >> manyTillChar litChar (char '>')
341+ rebase <- option False (True <$ guardEnabled Ext_rebase_relative_paths)
342+ src <- (if rebase then rebasePath pos else id) <$>
339− src <- try betweenAngles <|> sourceURL
343+ (try betweenAngles <|> sourceURL)
340 tit <- option "" referenceTitle
344 tit <- option "" referenceTitle
341 attr <- option nullAttr $ try $
345 attr <- option nullAttr $ try $
342 do guardEnabled Ext_link_attributes
346 do guardEnabled Ext_link_attributes
@@ -1836,9 +1840,12 @@ regLink :: PandocMonad m
1836 -> MarkdownParser m (F Inlines)
1840 -> MarkdownParser m (F Inlines)
1837regLink constructor lab = try $ do
1841regLink constructor lab = try $ do
1838 (src, tit) <- source
1842 (src, tit) <- source
1843+ rebase <- option False (True <$ guardEnabled Ext_rebase_relative_paths)
1844+ pos <- getPosition
1845+ let src' = if rebase then rebasePath pos src else src
1839 attr <- option nullAttr $
1846 attr <- option nullAttr $
1840 guardEnabled Ext_link_attributes >> attributes
1847 guardEnabled Ext_link_attributes >> attributes
1841− return $ constructor attr src tit <$> lab
1848+ return $ constructor attr src' tit <$> lab
1842
1849
1843-- a link like [this][ref] or [this][] or [this]
1850-- a link like [this][ref] or [this][] or [this]
1844referenceLink :: PandocMonad m
1851referenceLink :: PandocMonad m
@@ -1878,7 +1885,8 @@ referenceLink constructor (lab, raw) = do
1878 Just ((src, tit), _) -> constructor nullAttr src tit <$> lab
1885 Just ((src, tit), _) -> constructor nullAttr src tit <$> lab
1879 Nothing -> makeFallback
1886 Nothing -> makeFallback
1880 else makeFallback
1887 else makeFallback
1888+ Just ((src,tit), attr) ->
1881− Just ((src,tit), attr) -> constructor attr src tit <$> lab
1889+ constructor attr src tit <$> lab
1882
1890
1883dropBrackets :: Text -> Text
1891dropBrackets :: Text -> Text
1884dropBrackets = dropRB . dropLB
1892dropBrackets = dropRB . dropLB
@@ -1911,15 +1919,33 @@ autoLink = try $ do
1911 return $ return $ B.linkWith attr (src <> escapeURI extra) ""
1919 return $ return $ B.linkWith attr (src <> escapeURI extra) ""
1912 (B.str $ orig <> extra)
1920 (B.str $ orig <> extra)
1913
1921
1922+-- | Rebase a relative path, by adding the (relative) directory
1923+-- of the containing source position. Absolute links and URLs
1924+-- are untouched.
1925+rebasePath :: SourcePos -> Text -> Text
1926+rebasePath pos path = do
1927+ let fp = sourceName pos
1928+ isFragment = T.take 1 path == "#"
1929+ path' = T.unpack path
1930+ isAbsolutePath = Posix.isAbsolute path' || Windows.isAbsolute path'
1931+ in if T.null path || isFragment || isAbsolutePath || isURI path
1932+ then path
1933+ else
1934+ case takeDirectory fp of
1935+ "" -> path
1936+ "." -> path
1937+ d -> T.pack d <> "/" <> path
1938+
1914image :: PandocMonad m => MarkdownParser m (F Inlines)
1939image :: PandocMonad m => MarkdownParser m (F Inlines)
1915image = try $ do
1940image = try $ do
1916 char '!'
1941 char '!'
1917 (lab,raw) <- reference
1942 (lab,raw) <- reference
1918 defaultExt <- getOption readerDefaultImageExtension
1943 defaultExt <- getOption readerDefaultImageExtension
1944+ let constructor attr' src =
1919− let constructor attr' src = case takeExtension (T.unpack src) of
1945+ case takeExtension (T.unpack src) of
1920− "" -> B.imageWith attr' (T.pack $ addExtension (T.unpack src)
1946+ "" -> B.imageWith attr' (T.pack $ addExtension (T.unpack src)
1921− $ T.unpack defaultExt)
1947+ $ T.unpack defaultExt)
1922− _ -> B.imageWith attr' src
1948+ _ -> B.imageWith attr' src
1923 regLink constructor lab <|> referenceLink constructor (lab,raw)
1949 regLink constructor lab <|> referenceLink constructor (lab,raw)
1924
1950
1925note :: PandocMonad m => MarkdownParser m (F Inlines)
1951note :: PandocMonad m => MarkdownParser m (F Inlines)
@@ -2094,7 +2120,7 @@ cite = do
2094
2120
2095textualCite :: PandocMonad m => MarkdownParser m (F Inlines)
2121textualCite :: PandocMonad m => MarkdownParser m (F Inlines)
2096textualCite = try $ do
2122textualCite = try $ do
2097− (suppressAuthor, key) <- citeKey
2123+ (suppressAuthor, key) <- citeKey True
2098 -- If this is a reference to an earlier example list item,
2124 -- If this is a reference to an earlier example list item,
2099 -- then don't parse it as a citation. If the example list
2125 -- then don't parse it as a citation. If the example list
2100 -- item comes later, we'll parse it here and figure out in
2126 -- item comes later, we'll parse it here and figure out in
@@ -2174,7 +2200,7 @@ prefix = trimInlinesF . mconcat <$>
2174 manyTill inline (char ']'
2200 manyTill inline (char ']'
2175 <|> lookAhead
2201 <|> lookAhead
2176 (try $ do optional (try (char ';' >> spnl))
2202 (try $ do optional (try (char ';' >> spnl))
2177− citeKey
2203+ citeKey True
2178 return ']'))
2204 return ']'))
2179
2205
2180citeList :: PandocMonad m => MarkdownParser m (F [Citation])
2206citeList :: PandocMonad m => MarkdownParser m (F [Citation])
@@ -2183,7 +2209,7 @@ citeList = fmap sequence $ sepBy1 citation (try $ char ';' >> spnl)
2183citation :: PandocMonad m => MarkdownParser m (F Citation)
2209citation :: PandocMonad m => MarkdownParser m (F Citation)
2184citation = try $ do
2210citation = try $ do
2185 pref <- prefix
2211 pref <- prefix
2186− (suppress_author, key) <- citeKey
2212+ (suppress_author, key) <- citeKey True
2187 suff <- suffix
2213 suff <- suffix
2188 noteNum <- stateNoteNumber <$> getState
2214 noteNum <- stateNoteNumber <$> getState
2189 return $ do
2215 return $ do
@@ -2228,4 +2254,4 @@ toRow :: [Blocks] -> Row
2228toRow = Row nullAttr . map B.simpleCell
2254toRow = Row nullAttr . map B.simpleCell
2229
2255
2230toHeaderRow :: [Blocks] -> [Row]
2256toHeaderRow :: [Blocks] -> [Row]
2231−toHeaderRow l = [toRow l | not (null l)]
2257+toHeaderRow l = [toRow l | not (null l) && not (all null l)]
src/Text/Pandoc/Readers/Metadata.hs+3
@@ -45,6 +45,9 @@ yamlBsToMeta pMetaValue bstr = do
45 Right [] -> return . return $ mempty
45 Right [] -> return . return $ mempty
46 Right [YAML.Doc (YAML.Scalar _ YAML.SNull)]
46 Right [YAML.Doc (YAML.Scalar _ YAML.SNull)]
47 -> return . return $ mempty
47 -> return . return $ mempty
48+ -- the following is what we get from a comment:
49+ Right [YAML.Doc (YAML.Scalar _ (YAML.SUnknown _ ""))]
50+ -> return . return $ mempty
48 Right _ -> Prelude.fail "expected YAML object"
51 Right _ -> Prelude.fail "expected YAML object"
49 Left (yamlpos, err')
52 Left (yamlpos, err')
50 -> do pos <- getPosition
53 -> do pos <- getPosition
src/Text/Pandoc/Readers/Odt/ContentReader.hs+5−6
@@ -1,4 +1,5 @@
1{-# LANGUAGE Arrows #-}
1{-# LANGUAGE Arrows #-}
2+{-# LANGUAGE CPP #-}
2{-# LANGUAGE DeriveFoldable #-}
3{-# LANGUAGE DeriveFoldable #-}
3{-# LANGUAGE GeneralizedNewtypeDeriving #-}
4{-# LANGUAGE GeneralizedNewtypeDeriving #-}
4{-# LANGUAGE PatternGuards #-}
5{-# LANGUAGE PatternGuards #-}
@@ -33,7 +34,7 @@ import Data.List (find)
33import qualified Data.Map as M
34import qualified Data.Map as M
34import qualified Data.Text as T
35import qualified Data.Text as T
35import Data.Maybe
36import Data.Maybe
36−import Data.Semigroup (First(..), Option(..))
37+import Data.Monoid (Alt (..))
37
38
38import Text.TeXMath (readMathML, writeTeX)
39import Text.TeXMath (readMathML, writeTeX)
39import qualified Text.Pandoc.XML.Light as XML
40import qualified Text.Pandoc.XML.Light as XML
@@ -505,13 +506,11 @@ type InlineMatcher = ElementMatcher Inlines
505
506
506type BlockMatcher = ElementMatcher Blocks
507type BlockMatcher = ElementMatcher Blocks
507
508
508−
509−newtype FirstMatch a = FirstMatch (Option (First a))
509+newtype FirstMatch a = FirstMatch (Alt Maybe a)
510− deriving (Foldable, Monoid, Semigroup)
510+ deriving (Foldable, Monoid, Semigroup)
511
511
512firstMatch :: a -> FirstMatch a
512firstMatch :: a -> FirstMatch a
513−firstMatch = FirstMatch . Option . Just . First
513+firstMatch = FirstMatch . Alt . Just
514−
515
514
516--
515--
517matchingElement :: (Monoid e)
516matchingElement :: (Monoid e)
src/Text/Pandoc/Readers/Org/Inlines.hs+4−4
@@ -263,7 +263,7 @@ berkeleyCitationList = try $ do
263 where
263 where
264 citationListPart :: PandocMonad m => OrgParser m (F Inlines)
264 citationListPart :: PandocMonad m => OrgParser m (F Inlines)
265 citationListPart = fmap (trimInlinesF . mconcat) . try . many1 $ do
265 citationListPart = fmap (trimInlinesF . mconcat) . try . many1 $ do
266− notFollowedBy' citeKey
266+ notFollowedBy' $ citeKey False
267 notFollowedBy (oneOf ";]")
267 notFollowedBy (oneOf ";]")
268 inline
268 inline
269
269
@@ -278,7 +278,7 @@ berkeleyBareTag' = try $ void (string "cite")
278
278
279berkeleyTextualCite :: PandocMonad m => OrgParser m (F [Citation])
279berkeleyTextualCite :: PandocMonad m => OrgParser m (F [Citation])
280berkeleyTextualCite = try $ do
280berkeleyTextualCite = try $ do
281− (suppressAuthor, key) <- citeKey
281+ (suppressAuthor, key) <- citeKey False
282 returnF . return $ Citation
282 returnF . return $ Citation
283 { citationId = key
283 { citationId = key
284 , citationPrefix = mempty
284 , citationPrefix = mempty
@@ -351,7 +351,7 @@ citeList = sequence <$> sepEndBy1 citation (try $ char ';' *> skipSpaces)
351citation :: PandocMonad m => OrgParser m (F Citation)
351citation :: PandocMonad m => OrgParser m (F Citation)
352citation = try $ do
352citation = try $ do
353 pref <- prefix
353 pref <- prefix
354− (suppress_author, key) <- citeKey
354+ (suppress_author, key) <- citeKey False
355 suff <- suffix
355 suff <- suffix
356 return $ do
356 return $ do
357 x <- pref
357 x <- pref
@@ -368,7 +368,7 @@ citation = try $ do
368 }
368 }
369 where
369 where
370 prefix = trimInlinesF . mconcat <$>
370 prefix = trimInlinesF . mconcat <$>
371− manyTill inline (char ']' <|> (']' <$ lookAhead citeKey))
371+ manyTill inline (char ']' <|> (']' <$ lookAhead (citeKey False)))
372 suffix = try $ do
372 suffix = try $ do
373 hasSpace <- option False (notFollowedBy nonspaceChar >> return True)
373 hasSpace <- option False (notFollowedBy nonspaceChar >> return True)
374 skipSpaces
374 skipSpaces
src/Text/Pandoc/Readers/Txt2Tags.hs+21−1
@@ -478,9 +478,29 @@ macro = try $ do
478-- raw URLs in text are automatically linked
478-- raw URLs in text are automatically linked
479url :: T2T Inlines
479url :: T2T Inlines
480url = try $ do
480url = try $ do
481− (rawUrl, escapedUrl) <- try uri <|> emailAddress
481+ (rawUrl, escapedUrl) <- try uri <|> emailAddress'
482 return $ B.link rawUrl "" (B.str escapedUrl)
482 return $ B.link rawUrl "" (B.str escapedUrl)
483
483
484+emailAddress' :: T2T (Text, Text)
485+emailAddress' = do
486+ (base, mailURI) <- emailAddress
487+ query <- option "" emailQuery
488+ return (base <> query, mailURI <> query)
489+
490+emailQuery :: T2T Text
491+emailQuery = do
492+ char '?'
493+ parts <- kv `sepBy1` (char '&')
494+ return $ "?" <> T.intercalate "&" parts
495+
496+kv :: T2T Text
497+kv = do
498+ k <- T.pack <$> many1 alphaNum
499+ char '='
500+ let vchar = alphaNum <|> try (oneOf "%._/~:,=$@&+-;*" <* lookAhead alphaNum)
501+ v <- T.pack <$> many1 vchar
502+ return (k <> "=" <> v)
503+
484uri :: T2T (Text, Text)
504uri :: T2T (Text, Text)
485uri = try $ do
505uri = try $ do
486 address <- t2tURI
506 address <- t2tURI
src/Text/Pandoc/Writers/ConTeXt.hs+9−13
@@ -16,7 +16,6 @@ module Text.Pandoc.Writers.ConTeXt ( writeConTeXt ) where
16import Control.Monad.State.Strict
16import Control.Monad.State.Strict
17import Data.Char (ord, isDigit)
17import Data.Char (ord, isDigit)
18import Data.List (intersperse)
18import Data.List (intersperse)
19−import Data.List.NonEmpty (nonEmpty)
20import Data.Maybe (mapMaybe)
19import Data.Maybe (mapMaybe)
21import Data.Text (Text)
20import Data.Text (Text)
22import qualified Data.Text as T
21import qualified Data.Text as T
@@ -233,14 +232,7 @@ blockToConTeXt (OrderedList (start, style', delim) lst) = do
233 Period -> "stopper=."
232 Period -> "stopper=."
234 OneParen -> "stopper=)"
233 OneParen -> "stopper=)"
235 TwoParens -> "left=(,stopper=)"
234 TwoParens -> "left=(,stopper=)"
236− let width = maybe 0 maximum $ nonEmpty $ map T.length $
237− take (length contents)
238− (orderedListMarkers (start, style', delim))
239− let width' = (toEnum width + 1) / 2
240− let width'' = if width' > (1.5 :: Double)
241− then "width=" <> tshow width' <> "em"
242− else ""
243− let specs2Items = filter (not . T.null) [start', delim', width'']
235+ let specs2Items = filter (not . T.null) [start', delim']
244 let specs2 = if null specs2Items
236 let specs2 = if null specs2Items
245 then ""
237 then ""
246 else "[" <> T.intercalate "," specs2Items <> "]"
238 else "[" <> T.intercalate "," specs2Items <> "]"
@@ -254,8 +246,8 @@ blockToConTeXt (OrderedList (start, style', delim) lst) = do
254 UpperAlpha -> 'A') :
246 UpperAlpha -> 'A') :
255 if isTightList lst then ",packed]" else "]"
247 if isTightList lst then ",packed]" else "]"
256 let specs = T.pack style'' <> specs2
248 let specs = T.pack style'' <> specs2
257− return $ "\\startitemize" <> literal specs $$ vcat contents $$
249+ return $ "\\startenumerate" <> literal specs $$ vcat contents $$
258− "\\stopitemize" <> blankline
250+ "\\stopenumerate" <> blankline
259blockToConTeXt (DefinitionList lst) =
251blockToConTeXt (DefinitionList lst) =
260 liftM vcat $ mapM defListItemToConTeXt lst
252 liftM vcat $ mapM defListItemToConTeXt lst
261blockToConTeXt HorizontalRule = return $ "\\thinrule" <> blankline
253blockToConTeXt HorizontalRule = return $ "\\thinrule" <> blankline
@@ -487,7 +479,7 @@ inlineToConTeXt (Note contents) = do
487 then literal "\\footnote{" <> nest 2 (chomp contents') <> char '}'
479 then literal "\\footnote{" <> nest 2 (chomp contents') <> char '}'
488 else literal "\\startbuffer " <> nest 2 (chomp contents') <>
480 else literal "\\startbuffer " <> nest 2 (chomp contents') <>
489 literal "\\stopbuffer\\footnote{\\getbuffer}"
481 literal "\\stopbuffer\\footnote{\\getbuffer}"
490−inlineToConTeXt (Span (_,_,kvs) ils) = do
482+inlineToConTeXt (Span (ident,_,kvs) ils) = do
491 mblang <- fromBCP47 (lookup "lang" kvs)
483 mblang <- fromBCP47 (lookup "lang" kvs)
492 let wrapDir txt = case lookup "dir" kvs of
484 let wrapDir txt = case lookup "dir" kvs of
493 Just "rtl" -> braces $ "\\righttoleft " <> txt
485 Just "rtl" -> braces $ "\\righttoleft " <> txt
@@ -497,7 +489,11 @@ inlineToConTeXt (Span (_,_,kvs) ils) = do
497 Just lng -> braces ("\\language" <>
489 Just lng -> braces ("\\language" <>
498 brackets (literal lng) <> txt)
490 brackets (literal lng) <> txt)
499 Nothing -> txt
491 Nothing -> txt
492+ addReference =
493+ if T.null ident
494+ then id
495+ else (("\\reference" <> brackets (literal ident) <> "{}") <>)
500− wrapLang . wrapDir <$> inlineListToConTeXt ils
496+ addReference . wrapLang . wrapDir <$> inlineListToConTeXt ils
501
497
502-- | Craft the section header, inserting the section reference, if supplied.
498-- | Craft the section header, inserting the section reference, if supplied.
503sectionHeader :: PandocMonad m
499sectionHeader :: PandocMonad m
src/Text/Pandoc/Writers/Docbook.hs+1−2
@@ -198,8 +198,7 @@ blockToDocbook opts (Div (id',"section":_,_) (Header lvl (_,_,attrs) ils : xs))
198blockToDocbook opts (Div (ident,classes,_) bs) = do
198blockToDocbook opts (Div (ident,classes,_) bs) = do
199 version <- ask
199 version <- ask
200 let identAttribs = [(idName version, ident) | not (T.null ident)]
200 let identAttribs = [(idName version, ident) | not (T.null ident)]
201− admonitions = ["attention","caution","danger","error","hint",
202− "important","note","tip","warning"]
201+ admonitions = ["caution","danger","important","note","tip","warning"]
203 case classes of
202 case classes of
204 (l:_) | l `elem` admonitions -> do
203 (l:_) | l `elem` admonitions -> do
205 let (mTitleBs, bodyBs) =
204 let (mTitleBs, bodyBs) =
src/Text/Pandoc/Writers/Docx.hs+35−4
@@ -36,7 +36,8 @@ import Data.Time.Clock.POSIX
36import Data.Digest.Pure.SHA (sha1, showDigest)
36import Data.Digest.Pure.SHA (sha1, showDigest)
37import Skylighting
37import Skylighting
38import Text.Collate.Lang (renderLang)
38import Text.Collate.Lang (renderLang)
39−import Text.Pandoc.Class.PandocMonad (PandocMonad, report, toLang)
39+import Text.Pandoc.Class.PandocMonad (PandocMonad, report, toLang, translateTerm)
40+import qualified Text.Pandoc.Translations as Term
40import qualified Text.Pandoc.Class.PandocMonad as P
41import qualified Text.Pandoc.Class.PandocMonad as P
41import Data.Time
42import Data.Time
42import Text.Pandoc.UTF8 (fromTextLazy)
43import Text.Pandoc.UTF8 (fromTextLazy)
@@ -469,12 +470,27 @@ writeDocx opts doc = do
469 -- adds references to footnotes or endnotes we don't have...
470 -- adds references to footnotes or endnotes we don't have...
470 -- we do, however, copy some settings over from reference
471 -- we do, however, copy some settings over from reference
471 let settingsPath = "word/settings.xml"
472 let settingsPath = "word/settings.xml"
473+ settingsList = [ "zoom"
474+ , "embedSystemFonts"
475+ , "doNotTrackMoves"
476+ , "defaultTabStop"
477+ , "drawingGridHorizontalSpacing"
478+ , "drawingGridVerticalSpacing"
479+ , "displayHorizontalDrawingGridEvery"
480+ , "displayVerticalDrawingGridEvery"
481+ , "characterSpacingControl"
482+ , "savePreviewPicture"
483+ , "mathPr"
484+ , "themeFontLang"
485+ , "decimalSymbol"
486+ , "listSeparator"
472− settingsList = [ "autoHyphenation"
487+ , "autoHyphenation"
473 , "consecutiveHyphenLimit"
488 , "consecutiveHyphenLimit"
474 , "hyphenationZone"
489 , "hyphenationZone"
475 , "doNotHyphenateCap"
490 , "doNotHyphenateCap"
476 , "evenAndOddHeaders"
491 , "evenAndOddHeaders"
477 , "proofState"
492 , "proofState"
493+ , "compat"
478 ]
494 ]
479 settingsEntry <- copyChildren refArchive distArchive settingsPath epochtime settingsList
495 settingsEntry <- copyChildren refArchive distArchive settingsPath epochtime settingsList
480
496
@@ -839,14 +855,28 @@ blockToOpenXML' opts (Plain lst) = do
839-- title beginning with fig: indicates that the image is a figure
855-- title beginning with fig: indicates that the image is a figure
840blockToOpenXML' opts (Para [Image attr alt (src,T.stripPrefix "fig:" -> Just tit)]) = do
856blockToOpenXML' opts (Para [Image attr alt (src,T.stripPrefix "fig:" -> Just tit)]) = do
841 setFirstPara
857 setFirstPara
858+ fignum <- gets stNextFigureNum
859+ unless (null alt) $ modify $ \st -> st{ stNextFigureNum = fignum + 1 }
860+ let figid = "fig" <> tshow fignum
861+ figname <- translateTerm Term.Figure
842 prop <- pStyleM $
862 prop <- pStyleM $
843 if null alt
863 if null alt
844 then "Figure"
864 then "Figure"
845 else "Captioned Figure"
865 else "Captioned Figure"
846 paraProps <- local (\env -> env { envParaProperties = EnvProps (Just prop) [] <> envParaProperties env }) (getParaProps False)
866 paraProps <- local (\env -> env { envParaProperties = EnvProps (Just prop) [] <> envParaProperties env }) (getParaProps False)
847 contents <- inlinesToOpenXML opts [Image attr alt (src,tit)]
867 contents <- inlinesToOpenXML opts [Image attr alt (src,tit)]
868+ captionNode <- if null alt
869+ then return []
848− captionNode <- withParaPropM (pStyleM "Image Caption")
870+ else withParaPropM (pStyleM "Image Caption")
849− $ blockToOpenXML opts (Para alt)
871+ $ blockToOpenXML opts
872+ (Para $ Span (figid,[],[])
873+ [Str (figname <> "\160"),
874+ RawInline (Format "openxml")
875+ ("<w:fldSimple w:instr=\"SEQ Figure"
876+ <> " \\* ARABIC \"><w:r><w:t>"
877+ <> tshow fignum
878+ <> "</w:t></w:r></w:fldSimple>"),
879+ Str ":", Space] : alt)
850 return $
880 return $
851 Elem (mknode "w:p" [] (map Elem paraProps ++ contents))
881 Elem (mknode "w:p" [] (map Elem paraProps ++ contents))
852 : captionNode
882 : captionNode
@@ -1274,6 +1304,7 @@ inlineToOpenXML' opts (Image attr@(imgident, _, _) alt (src, title)) = do
1274 Just Eps -> ".eps"
1304 Just Eps -> ".eps"
1275 Just Svg -> ".svg"
1305 Just Svg -> ".svg"
1276 Just Emf -> ".emf"
1306 Just Emf -> ".emf"
1307+ Just Tiff -> ".tiff"
1277 Nothing -> ""
1308 Nothing -> ""
1278 imgpath = "media/" <> ident <> imgext
1309 imgpath = "media/" <> ident <> imgext
1279 mbMimeType = mt <|> getMimeType (T.unpack imgpath)
1310 mbMimeType = mt <|> getMimeType (T.unpack imgpath)
src/Text/Pandoc/Writers/Docx/Table.hs+70−29
@@ -17,7 +17,7 @@ import Control.Monad.State.Strict
17import Data.Array
17import Data.Array
18import Data.Text (Text)
18import Data.Text (Text)
19import Text.Pandoc.Definition
19import Text.Pandoc.Definition
20−import Text.Pandoc.Class.PandocMonad (PandocMonad)
20+import Text.Pandoc.Class.PandocMonad (PandocMonad, translateTerm)
21import Text.Pandoc.Writers.Docx.Types
21import Text.Pandoc.Writers.Docx.Types
22import Text.Pandoc.Shared
22import Text.Pandoc.Shared
23import Text.Printf (printf)
23import Text.Printf (printf)
@@ -25,6 +25,7 @@ import Text.Pandoc.Writers.GridTable hiding (Table)
25import Text.Pandoc.Writers.OOXML
25import Text.Pandoc.Writers.OOXML
26import Text.Pandoc.XML.Light as XML hiding (Attr)
26import Text.Pandoc.XML.Light as XML hiding (Attr)
27import qualified Data.Text as T
27import qualified Data.Text as T
28+import qualified Text.Pandoc.Translations as Term
28import qualified Text.Pandoc.Writers.GridTable as Grid
29import qualified Text.Pandoc.Writers.GridTable as Grid
29
30
30tableToOpenXML :: PandocMonad m
31tableToOpenXML :: PandocMonad m
@@ -33,20 +34,32 @@ tableToOpenXML :: PandocMonad m
33 -> WS m [Content]
34 -> WS m [Content]
34tableToOpenXML blocksToOpenXML gridTable = do
35tableToOpenXML blocksToOpenXML gridTable = do
35 setFirstPara
36 setFirstPara
36− modify $ \s -> s { stInTable = True }
37− let (Grid.Table _attr caption colspecs _rowheads thead tbodies tfoot) =
37+ let (Grid.Table (ident,_,_) caption colspecs _rowheads thead tbodies tfoot) =
38 gridTable
38 gridTable
39 let (Caption _maybeShortCaption captionBlocks) = caption
39 let (Caption _maybeShortCaption captionBlocks) = caption
40+ tablenum <- gets stNextTableNum
41+ unless (null captionBlocks) $
42+ modify $ \st -> st{ stNextTableNum = tablenum + 1 }
43+ let tableid = if T.null ident
44+ then "table" <> tshow tablenum
45+ else ident
46+ tablename <- translateTerm Term.Table
40 let captionStr = stringify captionBlocks
47 let captionStr = stringify captionBlocks
48+ let aligns = map fst $ elems colspecs
41 captionXml <- if null captionBlocks
49 captionXml <- if null captionBlocks
42 then return []
50 then return []
43 else withParaPropM (pStyleM "Table Caption")
51 else withParaPropM (pStyleM "Table Caption")
44− $ blocksToOpenXML captionBlocks
52+ $ blocksToOpenXML
53+ $ addLabel tableid tablename tablenum captionBlocks
54+ -- We set "in table" after processing the caption, because we don't
55+ -- want the "Table Caption" style to be overwritten with "Compact".
56+ modify $ \s -> s { stInTable = True }
45− head' <- cellGridToOpenXML blocksToOpenXML thead
57+ head' <- cellGridToOpenXML blocksToOpenXML HeadRow aligns thead
46− bodies <- mapM (cellGridToOpenXML blocksToOpenXML) tbodies
58+ bodies <- mapM (cellGridToOpenXML blocksToOpenXML BodyRow aligns) tbodies
47− foot' <- cellGridToOpenXML blocksToOpenXML tfoot
59+ foot' <- cellGridToOpenXML blocksToOpenXML FootRow aligns tfoot
48
60
49 let hasHeader = not . null . indices . partRowAttrs $ thead
61 let hasHeader = not . null . indices . partRowAttrs $ thead
62+ let hasFooter = not . null . indices . partRowAttrs $ tfoot
50 -- for compatibility with Word <= 2007, we include a val with a bitmask
63 -- for compatibility with Word <= 2007, we include a val with a bitmask
51 -- 0×0020 Apply first row conditional formatting
64 -- 0×0020 Apply first row conditional formatting
52 -- 0×0040 Apply last row conditional formatting
65 -- 0×0040 Apply last row conditional formatting
@@ -61,7 +74,7 @@ tableToOpenXML blocksToOpenXML gridTable = do
61 ( mknode "w:tblStyle" [("w:val","Table")] () :
74 ( mknode "w:tblStyle" [("w:val","Table")] () :
62 mknode "w:tblW" tblWattr () :
75 mknode "w:tblW" tblWattr () :
63 mknode "w:tblLook" [("w:firstRow",if hasHeader then "1" else "0")
76 mknode "w:tblLook" [("w:firstRow",if hasHeader then "1" else "0")
64− ,("w:lastRow","0")
77+ ,("w:lastRow",if hasFooter then "1" else "0")
65 ,("w:firstColumn","0")
78 ,("w:firstColumn","0")
66 ,("w:lastColumn","0")
79 ,("w:lastColumn","0")
67 ,("w:noHBand","0")
80 ,("w:noHBand","0")
@@ -77,6 +90,25 @@ tableToOpenXML blocksToOpenXML gridTable = do
77 modify $ \s -> s { stInTable = False }
90 modify $ \s -> s { stInTable = False }
78 return $ captionXml ++ [Elem tbl]
91 return $ captionXml ++ [Elem tbl]
79
92
93+addLabel :: Text -> Text -> Int -> [Block] -> [Block]
94+addLabel tableid tablename tablenum bs =
95+ case bs of
96+ (Para ils : rest) -> Para (label : Space : ils) : rest
97+ (Plain ils : rest) -> Plain (label : Space : ils) : rest
98+ _ -> Para [label] : bs
99+ where
100+ label = Span (tableid,[],[])
101+ [Str (tablename <> "\160"),
102+ RawInline (Format "openxml")
103+ ("<w:fldSimple w:instr=\"SEQ Table"
104+ <> " \\* ARABIC \"><w:r><w:t>"
105+ <> tshow tablenum
106+ <> "</w:t></w:r></w:fldSimple>"),
107+ Str ":"]
108+
109+-- | Parts of a table
110+data RowType = HeadRow | BodyRow | FootRow
111+
80alignmentToString :: Alignment -> Text
112alignmentToString :: Alignment -> Text
81alignmentToString = \case
113alignmentToString = \case
82 AlignLeft -> "left"
114 AlignLeft -> "left"
@@ -104,27 +136,34 @@ tableLayout specs =
104 , [ ("w:type", "pct"), ("w:w", tshow rowwidth) ])
136 , [ ("w:type", "pct"), ("w:w", tshow rowwidth) ])
105
137
106cellGridToOpenXML :: PandocMonad m
138cellGridToOpenXML :: PandocMonad m
107− => ([Block] -> WS m [Content])
139+ => ([Block] -> WS m [Content])
140+ -> RowType
141+ -> [Alignment]
108− -> Part
142+ -> Part
109− -> WS m [Element]
143+ -> WS m [Element]
110−cellGridToOpenXML blocksToOpenXML part@(Part _ _ rowAttrs) =
144+cellGridToOpenXML blocksToOpenXML rowType aligns part@(Part _ cellArray _) =
111− if null (indices rowAttrs)
145+ if null (elems cellArray)
112 then return mempty
146 then return mempty
113− else mapM (rowToOpenXML blocksToOpenXML) $ partToRows part
147+ else mapM (rowToOpenXML blocksToOpenXML) $
148+ partToRows rowType aligns part
114
149
115data OOXMLCell
150data OOXMLCell
116 = OOXMLCell Attr Alignment RowSpan ColSpan [Block]
151 = OOXMLCell Attr Alignment RowSpan ColSpan [Block]
117 | OOXMLCellMerge ColSpan
152 | OOXMLCellMerge ColSpan
118
153
119−data OOXMLRow = OOXMLRow Attr [OOXMLCell]
154+data OOXMLRow = OOXMLRow RowType Attr [OOXMLCell]
120
155
121−partToRows :: Part -> [OOXMLRow]
156+partToRows :: RowType -> [Alignment] -> Part -> [OOXMLRow]
122−partToRows part =
157+partToRows rowType aligns part =
123 let
158 let
124− toOOXMLCell :: RowIndex -> ColIndex -> GridCell -> [OOXMLCell]
159+ toOOXMLCell :: Alignment -> RowIndex -> ColIndex -> GridCell -> [OOXMLCell]
125− toOOXMLCell ridx cidx = \case
160+ toOOXMLCell columnAlign ridx cidx = \case
126 ContentCell attr align rowspan colspan blocks ->
161 ContentCell attr align rowspan colspan blocks ->
162+ -- Respect non-default, cell specific alignment.
163+ let align' = case align of
164+ AlignDefault -> columnAlign
165+ _ -> align
127− [OOXMLCell attr align rowspan colspan blocks]
166+ in [OOXMLCell attr align' rowspan colspan blocks]
128 ContinuationCell idx'@(ridx',cidx') | ridx /= ridx', cidx == cidx' ->
167 ContinuationCell idx'@(ridx',cidx') | ridx /= ridx', cidx == cidx' ->
129 case (partCellArray part)!idx' of
168 case (partCellArray part)!idx' of
130 (ContentCell _ _ _ colspan _) -> [OOXMLCellMerge colspan]
169 (ContentCell _ _ _ colspan _) -> [OOXMLCellMerge colspan]
@@ -132,8 +171,10 @@ partToRows part =
132 " at index " ++ show idx'
171 " at index " ++ show idx'
133 _ -> mempty
172 _ -> mempty
134 mkRow :: (RowIndex, Attr) -> OOXMLRow
173 mkRow :: (RowIndex, Attr) -> OOXMLRow
135− mkRow (ridx, attr) = OOXMLRow attr
174+ mkRow (ridx, attr) = OOXMLRow rowType attr
175+ . mconcat
136− . concatMap (uncurry $ toOOXMLCell ridx)
176+ . zipWith (\align -> uncurry $ toOOXMLCell align ridx)
177+ aligns
137 . assocs
178 . assocs
138 . rowArray ridx
179 . rowArray ridx
139 $ partCellArray part
180 $ partCellArray part
@@ -143,12 +184,14 @@ rowToOpenXML :: PandocMonad m
143 => ([Block] -> WS m [Content])
184 => ([Block] -> WS m [Content])
144 -> OOXMLRow
185 -> OOXMLRow
145 -> WS m Element
186 -> WS m Element
146−rowToOpenXML blocksToOpenXML (OOXMLRow _attr cells) = do
187+rowToOpenXML blocksToOpenXML (OOXMLRow rowType _attr cells) = do
147 xmlcells <- mapM (ooxmlCellToOpenXML blocksToOpenXML) cells
188 xmlcells <- mapM (ooxmlCellToOpenXML blocksToOpenXML) cells
148− -- let align' = case align of
189+ let addTrPr = case rowType of
149− -- AlignDefault -> colAlign
190+ HeadRow -> (mknode "w:trPr" []
150− -- _ -> align
191+ [mknode "w:tblHeader" [("w:val", "true")] ()] :)
192+ BodyRow -> id
193+ FootRow -> id
151− return $ mknode "w:tr" [] xmlcells
194+ return $ mknode "w:tr" [] (addTrPr xmlcells)
152
195
153ooxmlCellToOpenXML :: PandocMonad m
196ooxmlCellToOpenXML :: PandocMonad m
154 => ([Block] -> WS m [Content])
197 => ([Block] -> WS m [Content])
@@ -161,8 +204,6 @@ ooxmlCellToOpenXML blocksToOpenXML = \case
161 , mknode "w:vMerge" [("w:val", "continue")] () ]
204 , mknode "w:vMerge" [("w:val", "continue")] () ]
162 , mknode "w:p" [] [mknode "w:pPr" [] ()]]
205 , mknode "w:p" [] [mknode "w:pPr" [] ()]]
163 OOXMLCell _attr align rowspan (ColSpan colspan) contents -> do
206 OOXMLCell _attr align rowspan (ColSpan colspan) contents -> do
164− -- we handle rowspans via 'leftpad', so we can ignore those here
165−
166 compactStyle <- pStyleM "Compact"
207 compactStyle <- pStyleM "Compact"
167 es <- withParaProp (alignmentFor align) $ blocksToOpenXML contents
208 es <- withParaProp (alignmentFor align) $ blocksToOpenXML contents
168 -- Table cells require a <w:p> element, even an empty one!
209 -- Table cells require a <w:p> element, even an empty one!
src/Text/Pandoc/Writers/Docx/Types.hs+4
@@ -117,6 +117,8 @@ data WriterState = WriterState{
117 , stDynamicParaProps :: Set.Set ParaStyleName
117 , stDynamicParaProps :: Set.Set ParaStyleName
118 , stDynamicTextProps :: Set.Set CharStyleName
118 , stDynamicTextProps :: Set.Set CharStyleName
119 , stCurId :: Int
119 , stCurId :: Int
120+ , stNextFigureNum :: Int
121+ , stNextTableNum :: Int
120 }
122 }
121
123
122defaultWriterState :: WriterState
124defaultWriterState :: WriterState
@@ -137,6 +139,8 @@ defaultWriterState = WriterState{
137 , stDynamicParaProps = Set.empty
139 , stDynamicParaProps = Set.empty
138 , stDynamicTextProps = Set.empty
140 , stDynamicTextProps = Set.empty
139 , stCurId = 20
141 , stCurId = 20
142+ , stNextFigureNum = 1
143+ , stNextTableNum = 1
140 }
144 }
141
145
142setFirstPara :: PandocMonad m => WS m ()
146setFirstPara :: PandocMonad m => WS m ()
src/Text/Pandoc/Writers/HTML.hs+80−12
@@ -26,8 +26,13 @@ module Text.Pandoc.Writers.HTML (
26 writeSlideous,
26 writeSlideous,
27 writeDZSlides,
27 writeDZSlides,
28 writeRevealJs,
28 writeRevealJs,
29− tagWithAttributes
29+ tagWithAttributes,
30+ inlineToHtml,
31+ blockToHtml,
32+ WriterState(..),
33+ defaultWriterState
30 ) where
34 ) where
35+
31import Control.Monad.State.Strict
36import Control.Monad.State.Strict
32import Data.Char (ord)
37import Data.Char (ord)
33import Data.List (intercalate, intersperse, partition, delete, (\\), foldl')
38import Data.List (intercalate, intersperse, partition, delete, (\\), foldl')
@@ -344,6 +349,52 @@ pandocToHtml opts (Pandoc meta blocks) = do
344 PlainMath -> defField "displaymath-css" True
349 PlainMath -> defField "displaymath-css" True
345 WebTeX _ -> defField "displaymath-css" True
350 WebTeX _ -> defField "displaymath-css" True
346 _ -> id) .
351 _ -> id) .
352+ (if slideVariant == RevealJsSlides
353+ then -- set boolean options explicitly, since
354+ -- template can't distinguish False/undefined
355+ defField "controls" True .
356+ defField "controlsTutorial" True .
357+ defField "controlsLayout" ("bottom-right" :: Text) .
358+ defField "controlsBackArrows" ("faded" :: Text) .
359+ defField "progress" True .
360+ defField "slideNumber" False .
361+ defField "showSlideNumber" ("all" :: Text) .
362+ defField "hashOneBasedIndex" False .
363+ defField "hash" False .
364+ defField "respondToHashChanges" True .
365+ defField "history" False .
366+ defField "keyboard" True .
367+ defField "overview" True .
368+ defField "disableLayout" False .
369+ defField "center" True .
370+ defField "touch" True .
371+ defField "loop" False .
372+ defField "rtl" False .
373+ defField "navigationMode" ("default" :: Text) .
374+ defField "shuffle" False .
375+ defField "fragments" True .
376+ defField "fragmentInURL" True .
377+ defField "embedded" False .
378+ defField "help" True .
379+ defField "pause" True .
380+ defField "showNotes" False .
381+ defField "autoPlayMedia" ("null" :: Text) .
382+ defField "preloadIframes" ("null" :: Text) .
383+ defField "autoSlide" ("0" :: Text) .
384+ defField "autoSlideStoppable" True .
385+ defField "autoSlideMethod" ("null" :: Text) .
386+ defField "defaultTiming" ("null" :: Text) .
387+ defField "mouseWheel" False .
388+ defField "display" ("block" :: Text) .
389+ defField "hideInactiveCursor" True .
390+ defField "hideCursorTime" ("5000" :: Text) .
391+ defField "previewLinks" False .
392+ defField "transition" ("slide" :: Text) .
393+ defField "transitionSpeed" ("default" :: Text) .
394+ defField "backgroundTransition" ("fade" :: Text) .
395+ defField "viewDistance" ("3" :: Text) .
396+ defField "mobileViewDistance" ("2" :: Text)
397+ else id) .
347 defField "document-css" (isNothing mCss && slideVariant == NoSlides) .
398 defField "document-css" (isNothing mCss && slideVariant == NoSlides) .
348 defField "quotes" (stQuotes st) .
399 defField "quotes" (stQuotes st) .
349 -- for backwards compatibility we populate toc
400 -- for backwards compatibility we populate toc
@@ -613,17 +664,20 @@ dimensionsToAttrList attr = consolidateStyles $ go Width ++ go Height
613figure :: PandocMonad m
664figure :: PandocMonad m
614 => WriterOptions -> Attr -> [Inline] -> (Text, Text)
665 => WriterOptions -> Attr -> [Inline] -> (Text, Text)
615 -> StateT WriterState m Html
666 -> StateT WriterState m Html
616−figure opts attr txt (s,tit) = do
667+figure opts attr@(_, _, attrList) txt (s,tit) = do
617 html5 <- gets stHtml5
668 html5 <- gets stHtml5
618 -- Screen-readers will normally read the @alt@ text and the figure; we
669 -- Screen-readers will normally read the @alt@ text and the figure; we
619 -- want to avoid them reading the same text twice. With HTML5 we can
670 -- want to avoid them reading the same text twice. With HTML5 we can
620 -- use aria-hidden for the caption; with HTML4, we use an empty
671 -- use aria-hidden for the caption; with HTML4, we use an empty
621 -- alt-text instead.
672 -- alt-text instead.
673+ -- When the alt text differs from the caption both should be read.
622 let alt = if html5 then txt else [Str ""]
674 let alt = if html5 then txt else [Str ""]
623 let tocapt = if html5
675 let tocapt = if html5
624− then H5.figcaption !
676+ then (H5.figcaption !) $
677+ if isJust (lookup "alt" attrList)
678+ then mempty
625− H5.customAttribute (textTag "aria-hidden")
679+ else H5.customAttribute (textTag "aria-hidden")
626− (toValue @Text "true")
680+ (toValue @Text "true")
627 else H.p ! A.class_ "caption"
681 else H.p ! A.class_ "caption"
628 img <- inlineToHtml opts (Image attr alt (s,tit))
682 img <- inlineToHtml opts (Image attr alt (s,tit))
629 capt <- if null txt
683 capt <- if null txt
@@ -770,9 +824,10 @@ blockToHtml opts (Div attr@(ident, classes, kvs') bs) = do
770 lookup "entry-spacing" kvs' >>=
824 lookup "entry-spacing" kvs' >>=
771 safeRead }
825 safeRead }
772 let isCslBibEntry = "csl-entry" `elem` classes
826 let isCslBibEntry = "csl-entry" `elem` classes
773− let kvs = [(k,v) | (k,v) <- kvs', k /= "width"] ++
827+ let kvs = [(k,v) | (k,v) <- kvs'
828+ , k /= "width" || "column" `notElem` classes] ++
774− [("style", "width:" <> w <> ";") | "column" `elem` classes,
829+ [("style", "width:" <> w <> ";") | "column" `elem` classes
775− ("width", w) <- kvs'] ++
830+ , ("width", w) <- kvs'] ++
776 [("role", "doc-bibliography") | isCslBibBody && html5] ++
831 [("role", "doc-bibliography") | isCslBibBody && html5] ++
777 [("role", "doc-biblioentry") | isCslBibEntry && html5]
832 [("role", "doc-biblioentry") | isCslBibEntry && html5]
778 let speakerNotes = "notes" `elem` classes
833 let speakerNotes = "notes" `elem` classes
@@ -882,7 +937,7 @@ blockToHtml opts (BlockQuote blocks) = do
882 else do
937 else do
883 contents <- blockListToHtml opts blocks
938 contents <- blockListToHtml opts blocks
884 return $ H.blockquote $ nl opts >> contents >> nl opts
939 return $ H.blockquote $ nl opts >> contents >> nl opts
885−blockToHtml opts (Header level attr@(_,classes,kvs) lst) = do
940+blockToHtml opts (Header level (ident,classes,kvs) lst) = do
886 contents <- inlineListToHtml opts lst
941 contents <- inlineListToHtml opts lst
887 let secnum = fromMaybe mempty $ lookup "number" kvs
942 let secnum = fromMaybe mempty $ lookup "number" kvs
888 let contents' = if writerNumberSections opts && not (T.null secnum)
943 let contents' = if writerNumberSections opts && not (T.null secnum)
@@ -890,7 +945,13 @@ blockToHtml opts (Header level attr@(_,classes,kvs) lst) = do
890 then (H.span ! A.class_ "header-section-number"
945 then (H.span ! A.class_ "header-section-number"
891 $ toHtml secnum) >> strToHtml " " >> contents
946 $ toHtml secnum) >> strToHtml " " >> contents
892 else contents
947 else contents
948+ html5 <- gets stHtml5
949+ let kvs' = if html5
950+ then kvs
951+ else [ (k, v) | (k, v) <- kvs
952+ , k `elem` (["lang", "dir", "title", "style"
953+ , "align"] ++ intrinsicEventsHTML4)]
893− addAttrs opts attr
954+ addAttrs opts (ident,classes,kvs')
894 $ case level of
955 $ case level of
895 1 -> H.h1 contents'
956 1 -> H.h1 contents'
896 2 -> H.h2 contents'
957 2 -> H.h2 contents'
@@ -1380,7 +1441,7 @@ inlineToHtml opts inline = do
1380 return $ if T.null tit
1441 return $ if T.null tit
1381 then link'
1442 then link'
1382 else link' ! A.title (toValue tit)
1443 else link' ! A.title (toValue tit)
1383− (Image attr txt (s,tit)) -> do
1444+ (Image attr@(_, _, attrList) txt (s, tit)) -> do
1384 let alternate = stringify txt
1445 let alternate = stringify txt
1385 slideVariant <- gets stSlideVariant
1446 slideVariant <- gets stSlideVariant
1386 let isReveal = slideVariant == RevealJsSlides
1447 let isReveal = slideVariant == RevealJsSlides
@@ -1393,7 +1454,8 @@ inlineToHtml opts inline = do
1393 [A.title $ toValue tit | not (T.null tit)] ++
1454 [A.title $ toValue tit | not (T.null tit)] ++
1394 attrs
1455 attrs
1395 imageTag = (if html5 then H5.img else H.img
1456 imageTag = (if html5 then H5.img else H.img
1396− , [A.alt $ toValue alternate | not (null txt)] )
1457+ , [A.alt $ toValue alternate | not (null txt) &&
1458+ isNothing (lookup "alt" attrList)] )
1397 mediaTag tg fallbackTxt =
1459 mediaTag tg fallbackTxt =
1398 let linkTxt = if null txt
1460 let linkTxt = if null txt
1399 then fallbackTxt
1461 then fallbackTxt
@@ -1526,6 +1588,12 @@ allowsMathEnvironments MathML = True
1526allowsMathEnvironments (WebTeX _) = True
1588allowsMathEnvironments (WebTeX _) = True
1527allowsMathEnvironments _ = False
1589allowsMathEnvironments _ = False
1528
1590
1591+-- | List of intrinsic event attributes allowed on all elements in HTML4.
1592+intrinsicEventsHTML4 :: [Text]
1593+intrinsicEventsHTML4 =
1594+ [ "onclick", "ondblclick", "onmousedown", "onmouseup", "onmouseover"
1595+ , "onmouseout", "onmouseout", "onkeypress", "onkeydown", "onkeyup"]
1596+
1529isRawHtml :: PandocMonad m => Format -> StateT WriterState m Bool
1597isRawHtml :: PandocMonad m => Format -> StateT WriterState m Bool
1530isRawHtml f = do
1598isRawHtml f = do
1531 html5 <- gets stHtml5
1599 html5 <- gets stHtml5
src/Text/Pandoc/Writers/Jira.hs+9−3
@@ -280,6 +280,8 @@ toJiraLink (_, classes, _) (url, _) alias = do
280 | Just email <- T.stripPrefix "mailto:" url' = (Jira.Email, email)
280 | Just email <- T.stripPrefix "mailto:" url' = (Jira.Email, email)
281 | "user-account" `elem` classes = (Jira.User, dropTilde url)
281 | "user-account" `elem` classes = (Jira.User, dropTilde url)
282 | "attachment" `elem` classes = (Jira.Attachment, url)
282 | "attachment" `elem` classes = (Jira.Attachment, url)
283+ | "smart-card" `elem` classes = (Jira.SmartCard, url)
284+ | "smart-link" `elem` classes = (Jira.SmartLink, url)
283 | otherwise = (Jira.External, url)
285 | otherwise = (Jira.External, url)
284 dropTilde txt = case T.uncons txt of
286 dropTilde txt = case T.uncons txt of
285 Just ('~', username) -> username
287 Just ('~', username) -> username
@@ -309,9 +311,13 @@ quotedToJira qtype xs = do
309spanToJira :: PandocMonad m
311spanToJira :: PandocMonad m
310 => Attr -> [Inline]
312 => Attr -> [Inline]
311 -> JiraConverter m [Jira.Inline]
313 -> JiraConverter m [Jira.Inline]
312−spanToJira (ident, _classes, _attribs) inls = case ident of
314+spanToJira (ident, _classes, attribs) inls =
315+ let wrap = case lookup "color" attribs of
316+ Nothing -> id
317+ Just color -> singleton . Jira.ColorInline (Jira.ColorName color)
318+ in wrap <$> case ident of
313− "" -> toJiraInlines inls
319+ "" -> toJiraInlines inls
314− _ -> (Jira.Anchor ident :) <$> toJiraInlines inls
320+ _ -> (Jira.Anchor ident :) <$> toJiraInlines inls
315
321
316registerNotes :: PandocMonad m => [Block] -> JiraConverter m [Jira.Inline]
322registerNotes :: PandocMonad m => [Block] -> JiraConverter m [Jira.Inline]
317registerNotes contents = do
323registerNotes contents = do
src/Text/Pandoc/Writers/LaTeX.hs+13−8
@@ -173,6 +173,7 @@ pandocToLaTeX options (Pandoc meta blocks) = do
173 defField "has-chapters" (stHasChapters st) $
173 defField "has-chapters" (stHasChapters st) $
174 defField "has-frontmatter" (documentClass `elem` frontmatterClasses) $
174 defField "has-frontmatter" (documentClass `elem` frontmatterClasses) $
175 defField "listings" (writerListings options || stLHS st) $
175 defField "listings" (writerListings options || stLHS st) $
176+ defField "zero-width-non-joiner" (stZwnj st) $
176 defField "beamer" beamer $
177 defField "beamer" beamer $
177 (if stHighlighting st
178 (if stHighlighting st
178 then case writerHighlightStyle options of
179 then case writerHighlightStyle options of
@@ -290,7 +291,12 @@ blockToLaTeX :: PandocMonad m
290 => Block -- ^ Block to convert
291 => Block -- ^ Block to convert
291 -> LW m (Doc Text)
292 -> LW m (Doc Text)
292blockToLaTeX Null = return empty
293blockToLaTeX Null = return empty
293−blockToLaTeX (Div attr@(identifier,"block":_,_) (Header _ _ ils : bs)) = do
294+blockToLaTeX (Div attr@(identifier,"block":dclasses,_)
295+ (Header _ _ ils : bs)) = do
296+ let blockname
297+ | "example" `elem` dclasses = "exampleblock"
298+ | "alert" `elem` dclasses = "alertblock"
299+ | otherwise = "block"
294 ref <- toLabel identifier
300 ref <- toLabel identifier
295 let anchor = if T.null identifier
301 let anchor = if T.null identifier
296 then empty
302 then empty
@@ -298,8 +304,8 @@ blockToLaTeX (Div attr@(identifier,"block":_,_) (Header _ _ ils : bs)) = do
298 braces (literal ref) <> braces empty
304 braces (literal ref) <> braces empty
299 title' <- inlineListToLaTeX ils
305 title' <- inlineListToLaTeX ils
300 contents <- blockListToLaTeX bs
306 contents <- blockListToLaTeX bs
301− wrapDiv attr $ ("\\begin{block}" <> braces title' <> anchor) $$
307+ wrapDiv attr $ ("\\begin" <> braces blockname <> braces title' <> anchor) $$
302− contents $$ "\\end{block}"
308+ contents $$ "\\end" <> braces blockname
303blockToLaTeX (Div (identifier,"slide":dclasses,dkvs)
309blockToLaTeX (Div (identifier,"slide":dclasses,dkvs)
304 (Header _ (_,hclasses,hkvs) ils : bs)) = do
310 (Header _ (_,hclasses,hkvs) ils : bs)) = do
305 -- note: [fragile] is required or verbatim breaks
311 -- note: [fragile] is required or verbatim breaks
@@ -888,8 +894,9 @@ inlineToLaTeX (Quoted qt lst) = do
888 then char '`' <> inner <> char '\''
894 then char '`' <> inner <> char '\''
889 else char '\x2018' <> inner <> char '\x2019'
895 else char '\x2018' <> inner <> char '\x2019'
890 where
896 where
897+ isQuoted (Span _ (x:_)) = isQuoted x
891− isQuoted (Quoted _ _) = True
898+ isQuoted (Quoted _ _) = True
892− isQuoted _ = False
899+ isQuoted _ = False
893inlineToLaTeX (Str str) = do
900inlineToLaTeX (Str str) = do
894 setEmptyLine False
901 setEmptyLine False
895 liftM literal $ stringToLaTeX TextString str
902 liftM literal $ stringToLaTeX TextString str
@@ -912,7 +919,7 @@ inlineToLaTeX il@(RawInline f str) = do
912inlineToLaTeX LineBreak = do
919inlineToLaTeX LineBreak = do
913 emptyLine <- gets stEmptyLine
920 emptyLine <- gets stEmptyLine
914 setEmptyLine True
921 setEmptyLine True
915− return $ (if emptyLine then "~" else "") <> "\\\\" <> cr
922+ return $ (if emptyLine then "\\strut " else "") <> "\\\\" <> cr
916inlineToLaTeX SoftBreak = do
923inlineToLaTeX SoftBreak = do
917 wrapText <- gets (writerWrapText . stOptions)
924 wrapText <- gets (writerWrapText . stOptions)
918 case wrapText of
925 case wrapText of
@@ -1043,5 +1050,3 @@ extractInline _ _ = []
1043-- Look up a key in an attribute and give a list of its values
1050-- Look up a key in an attribute and give a list of its values
1044lookKey :: Text -> Attr -> [Text]
1051lookKey :: Text -> Attr -> [Text]
1045lookKey key (_,_,kvs) = maybe [] T.words $ lookup key kvs
1052lookKey key (_,_,kvs) = maybe [] T.words $ lookup key kvs
1046−
1047−
src/Text/Pandoc/Writers/LaTeX/Table.hs+20−5
@@ -16,6 +16,7 @@ module Text.Pandoc.Writers.LaTeX.Table
16 ) where
16 ) where
17import Control.Monad.State.Strict
17import Control.Monad.State.Strict
18import Data.List (intersperse)
18import Data.List (intersperse)
19+import qualified Data.List.NonEmpty as NonEmpty
19import Data.List.NonEmpty (NonEmpty ((:|)))
20import Data.List.NonEmpty (NonEmpty ((:|)))
20import Data.Text (Text)
21import Data.Text (Text)
21import qualified Data.Text as T
22import qualified Data.Text as T
@@ -25,7 +26,8 @@ import Text.DocLayout
25 ( Doc, braces, cr, empty, hcat, hsep, isEmpty, literal, nest
26 ( Doc, braces, cr, empty, hcat, hsep, isEmpty, literal, nest
26 , text, vcat, ($$) )
27 , text, vcat, ($$) )
27import Text.Pandoc.Shared (blocksToInlines, splitBy, tshow)
28import Text.Pandoc.Shared (blocksToInlines, splitBy, tshow)
28−import Text.Pandoc.Walk (walk)
29+import Text.Pandoc.Walk (walk, query)
30+import Data.Monoid (Any(..))
29import Text.Pandoc.Writers.LaTeX.Caption (getCaption)
31import Text.Pandoc.Writers.LaTeX.Caption (getCaption)
30import Text.Pandoc.Writers.LaTeX.Notes (notesToLaTeX)
32import Text.Pandoc.Writers.LaTeX.Notes (notesToLaTeX)
31import Text.Pandoc.Writers.LaTeX.Types
33import Text.Pandoc.Writers.LaTeX.Types
@@ -243,8 +245,13 @@ cellToLaTeX :: PandocMonad m
243 -> Ann.Cell
245 -> Ann.Cell
244 -> LW m (Doc Text)
246 -> LW m (Doc Text)
245cellToLaTeX blockListToLaTeX celltype annotatedCell = do
247cellToLaTeX blockListToLaTeX celltype annotatedCell = do
246− let (Ann.Cell _specs _colnum cell) = annotatedCell
248+ let (Ann.Cell specs _colnum cell) = annotatedCell
249+ let hasWidths = snd (NonEmpty.head specs) /= ColWidthDefault
250+ let specAlign = fst (NonEmpty.head specs)
247− let (Cell _attr align rowspan colspan blocks) = cell
251+ let (Cell _attr align' rowspan colspan blocks) = cell
252+ let align = case align' of
253+ AlignDefault -> specAlign
254+ _ -> align'
248 beamer <- gets stBeamer
255 beamer <- gets stBeamer
249 externalNotes <- gets stExternalNotes
256 externalNotes <- gets stExternalNotes
250 inMinipage <- gets stInMinipage
257 inMinipage <- gets stInMinipage
@@ -255,8 +262,13 @@ cellToLaTeX blockListToLaTeX celltype annotatedCell = do
255 Para{} -> True
262 Para{} -> True
256 Plain{} -> True
263 Plain{} -> True
257 _ -> False
264 _ -> False
265+ let hasLineBreak LineBreak = Any True
266+ hasLineBreak _ = Any False
267+ let hasLineBreaks = getAny $ query hasLineBreak blocks
258 result <-
268 result <-
269+ if not hasWidths || (celltype /= HeaderCell
259− if all isPlainOrPara blocks
270+ && all isPlainOrPara blocks
271+ && not hasLineBreaks)
260 then
272 then
261 blockListToLaTeX $ walk fixLineBreaks $ walk displayMathToInline blocks
273 blockListToLaTeX $ walk fixLineBreaks $ walk displayMathToInline blocks
262 else do
274 else do
@@ -269,7 +281,9 @@ cellToLaTeX blockListToLaTeX celltype annotatedCell = do
269 let halign = literal $ alignCommand align
281 let halign = literal $ alignCommand align
270 return $ "\\begin{minipage}" <> valign <>
282 return $ "\\begin{minipage}" <> valign <>
271 braces "\\linewidth" <> halign <> cr <>
283 braces "\\linewidth" <> halign <> cr <>
272− cellContents <> cr <>
284+ cellContents <>
285+ (if hasLineBreaks then "\\strut" else mempty)
286+ <> cr <>
273 "\\end{minipage}"
287 "\\end{minipage}"
274 modify $ \st -> st{ stExternalNotes = externalNotes }
288 modify $ \st -> st{ stExternalNotes = externalNotes }
275 when (rowspan /= RowSpan 1) $
289 when (rowspan /= RowSpan 1) $
@@ -290,3 +304,4 @@ cellToLaTeX blockListToLaTeX celltype annotatedCell = do
290data CellType
304data CellType
291 = HeaderCell
305 = HeaderCell
292 | BodyCell
306 | BodyCell
307+ deriving Eq
src/Text/Pandoc/Writers/LaTeX/Types.hs+2−1
@@ -40,7 +40,7 @@ data WriterState =
40 , stCsquotes :: Bool -- ^ true if document uses csquotes
40 , stCsquotes :: Bool -- ^ true if document uses csquotes
41 , stHighlighting :: Bool -- ^ true if document has highlighted code
41 , stHighlighting :: Bool -- ^ true if document has highlighted code
42 , stIncremental :: Bool -- ^ true if beamer lists should be
42 , stIncremental :: Bool -- ^ true if beamer lists should be
43− -- displayed bit by bit
43+ , stZwnj :: Bool -- ^ true if document has a ZWNJ character
44 , stInternalLinks :: [Text] -- ^ list of internal link targets
44 , stInternalLinks :: [Text] -- ^ list of internal link targets
45 , stBeamer :: Bool -- ^ produce beamer
45 , stBeamer :: Bool -- ^ produce beamer
46 , stEmptyLine :: Bool -- ^ true if no content on line
46 , stEmptyLine :: Bool -- ^ true if no content on line
@@ -74,6 +74,7 @@ startingState options =
74 , stCsquotes = False
74 , stCsquotes = False
75 , stHighlighting = False
75 , stHighlighting = False
76 , stIncremental = writerIncremental options
76 , stIncremental = writerIncremental options
77+ , stZwnj = False
77 , stInternalLinks = []
78 , stInternalLinks = []
78 , stBeamer = False
79 , stBeamer = False
79 , stEmptyLine = True
80 , stEmptyLine = True
src/Text/Pandoc/Writers/LaTeX/Util.hs+4−3
@@ -22,6 +22,7 @@ module Text.Pandoc.Writers.LaTeX.Util (
22where
22where
23
23
24import Control.Applicative ((<|>))
24import Control.Applicative ((<|>))
25+import Control.Monad (when)
25import Text.Pandoc.Class (PandocMonad, toLang)
26import Text.Pandoc.Class (PandocMonad, toLang)
26import Text.Pandoc.Options (WriterOptions(..), isEnabled)
27import Text.Pandoc.Options (WriterOptions(..), isEnabled)
27import Text.Pandoc.Writers.LaTeX.Types (LW, WriterState(..))
28import Text.Pandoc.Writers.LaTeX.Types (LW, WriterState(..))
@@ -30,7 +31,7 @@ import Text.Pandoc.Highlighting (toListingsLanguage)
30import Text.DocLayout
31import Text.DocLayout
31import Text.Pandoc.Definition
32import Text.Pandoc.Definition
32import Text.Pandoc.ImageSize (showFl)
33import Text.Pandoc.ImageSize (showFl)
33−import Control.Monad.State.Strict (gets)
34+import Control.Monad.State.Strict (gets, modify)
34import Data.Text (Text)
35import Data.Text (Text)
35import qualified Data.Text as T
36import qualified Data.Text as T
36import Text.Pandoc.Extensions (Extension(Ext_smart))
37import Text.Pandoc.Extensions (Extension(Ext_smart))
@@ -49,6 +50,8 @@ data StringContext = TextString
49stringToLaTeX :: PandocMonad m => StringContext -> Text -> LW m Text
50stringToLaTeX :: PandocMonad m => StringContext -> Text -> LW m Text
50stringToLaTeX context zs = do
51stringToLaTeX context zs = do
51 opts <- gets stOptions
52 opts <- gets stOptions
53+ when ('\x200c' `elemText` zs) $
54+ modify (\s -> s { stZwnj = True })
52 return $ T.pack $
55 return $ T.pack $
53 foldr (go opts context) mempty $ T.unpack $
56 foldr (go opts context) mempty $ T.unpack $
54 if writerPreferAscii opts
57 if writerPreferAscii opts
@@ -270,5 +273,3 @@ mbBraced :: Text -> Text
270mbBraced x = if not (T.all isAlphaNum x)
273mbBraced x = if not (T.all isAlphaNum x)
271 then "{" <> x <> "}"
274 then "{" <> x <> "}"
272 else x
275 else x
273−
274−
src/Text/Pandoc/Writers/Markdown.hs+18−38
@@ -43,7 +43,7 @@ import Text.Pandoc.Templates (renderTemplate)
43import Text.DocTemplates (Val(..), Context(..), FromContext(..))
43import Text.DocTemplates (Val(..), Context(..), FromContext(..))
44import Text.Pandoc.Walk
44import Text.Pandoc.Walk
45import Text.Pandoc.Writers.HTML (writeHtml5String)
45import Text.Pandoc.Writers.HTML (writeHtml5String)
46−import Text.Pandoc.Writers.Markdown.Inline (inlineListToMarkdown)
46+import Text.Pandoc.Writers.Markdown.Inline (inlineListToMarkdown, linkAttributes, attrsToMarkdown)
47import Text.Pandoc.Writers.Markdown.Types (MarkdownVariant(..),
47import Text.Pandoc.Writers.Markdown.Types (MarkdownVariant(..),
48 WriterState(..),
48 WriterState(..),
49 WriterEnv(..),
49 WriterEnv(..),
@@ -75,7 +75,6 @@ writeCommonMark opts document =
75 -- we set them here so that escapeText will behave
75 -- we set them here so that escapeText will behave
76 -- properly.
76 -- properly.
77 enableExtension Ext_all_symbols_escapable $
77 enableExtension Ext_all_symbols_escapable $
78− enableExtension Ext_pipe_tables $
79 enableExtension Ext_intraword_underscores $
78 enableExtension Ext_intraword_underscores $
80 writerExtensions opts }
79 writerExtensions opts }
81
80
@@ -257,39 +256,12 @@ noteToMarkdown opts num blocks = do
257 then hang (writerTabStop opts) (marker <> spacer) contents
256 then hang (writerTabStop opts) (marker <> spacer) contents
258 else marker <> spacer <> contents
257 else marker <> spacer <> contents
259
258
260−attrsToMarkdown :: Attr -> Doc Text
261−attrsToMarkdown attribs = braces $ hsep [attribId, attribClasses, attribKeys]
262− where attribId = case attribs of
263− ("",_,_) -> empty
264− (i,_,_) -> "#" <> escAttr i
265− attribClasses = case attribs of
266− (_,[],_) -> empty
267− (_,cs,_) -> hsep $
268− map (escAttr . ("."<>))
269− cs
270− attribKeys = case attribs of
271− (_,_,[]) -> empty
272− (_,_,ks) -> hsep $
273− map (\(k,v) -> escAttr k
274− <> "=\"" <>
275− escAttr v <> "\"") ks
276− escAttr = mconcat . map escAttrChar . T.unpack
277− escAttrChar '"' = literal "\\\""
278− escAttrChar '\\' = literal "\\\\"
279− escAttrChar c = literal $ T.singleton c
280−
281−-- | (Code) blocks with a single class can just use it standalone,
259+-- | (Code) blocks with a single class and no attributes can just use it
282−-- no need to bother with curly braces.
260+-- standalone, no need to bother with curly braces.
283classOrAttrsToMarkdown :: Attr -> Doc Text
261classOrAttrsToMarkdown :: Attr -> Doc Text
284−classOrAttrsToMarkdown ("",[cls],_) = literal cls
262+classOrAttrsToMarkdown ("",[cls],[]) = literal cls
285classOrAttrsToMarkdown attrs = attrsToMarkdown attrs
263classOrAttrsToMarkdown attrs = attrsToMarkdown attrs
286
264
287−linkAttributes :: WriterOptions -> Attr -> Doc Text
288−linkAttributes opts attr =
289− if isEnabled Ext_link_attributes opts && attr /= nullAttr
290− then attrsToMarkdown attr
291− else empty
292−
293-- | Ordered list start parser for use in Para below.
265-- | Ordered list start parser for use in Para below.
294olMarker :: Parser Text ParserState ()
266olMarker :: Parser Text ParserState ()
295olMarker = do (start, style', delim) <- anyOrderedListMarker
267olMarker = do (start, style', delim) <- anyOrderedListMarker
@@ -349,9 +321,12 @@ blockToMarkdown' opts (Div attrs ils) = do
349 case () of
321 case () of
350 _ | isEnabled Ext_fenced_divs opts &&
322 _ | isEnabled Ext_fenced_divs opts &&
351 attrs /= nullAttr ->
323 attrs /= nullAttr ->
324+ let attrsToMd = if variant == Commonmark
325+ then attrsToMarkdown
326+ else classOrAttrsToMarkdown
352− nowrap (literal ":::" <+> classOrAttrsToMarkdown attrs) $$
327+ in nowrap (literal ":::" <+> attrsToMd attrs) $$
353− chomp contents $$
328+ chomp contents $$
354− literal ":::" <> blankline
329+ literal ":::" <> blankline
355 | isEnabled Ext_native_divs opts ||
330 | isEnabled Ext_native_divs opts ||
356 (isEnabled Ext_raw_html opts &&
331 (isEnabled Ext_raw_html opts &&
357 (variant == Commonmark ||
332 (variant == Commonmark ||
@@ -393,7 +368,7 @@ blockToMarkdown' opts (Plain inlines) = do
393-- title beginning with fig: indicates figure
368-- title beginning with fig: indicates figure
394blockToMarkdown' opts (Para [Image attr alt (src,tgt@(T.stripPrefix "fig:" -> Just tit))])
369blockToMarkdown' opts (Para [Image attr alt (src,tgt@(T.stripPrefix "fig:" -> Just tit))])
395 | isEnabled Ext_raw_html opts &&
370 | isEnabled Ext_raw_html opts &&
396− not (isEnabled Ext_link_attributes opts) &&
371+ not (isEnabled Ext_link_attributes opts || isEnabled Ext_attributes opts) &&
397 attr /= nullAttr = -- use raw HTML
372 attr /= nullAttr = -- use raw HTML
398 (<> blankline) . literal . T.strip <$>
373 (<> blankline) . literal . T.strip <$>
399 writeHtml5String opts{ writerTemplate = Nothing }
374 writeHtml5String opts{ writerTemplate = Nothing }
@@ -458,7 +433,8 @@ blockToMarkdown' opts (Header level attr inlines) = do
458 && id' == autoId -> empty
433 && id' == autoId -> empty
459 (id',_,_) | isEnabled Ext_mmd_header_identifiers opts ->
434 (id',_,_) | isEnabled Ext_mmd_header_identifiers opts ->
460 space <> brackets (literal id')
435 space <> brackets (literal id')
461− _ | isEnabled Ext_header_attributes opts ->
436+ _ | isEnabled Ext_header_attributes opts ||
437+ isEnabled Ext_attributes opts ->
462 space <> attrsToMarkdown attr
438 space <> attrsToMarkdown attr
463 | otherwise -> empty
439 | otherwise -> empty
464 contents <- inlineListToMarkdown opts $
440 contents <- inlineListToMarkdown opts $
@@ -517,7 +493,8 @@ blockToMarkdown' opts (CodeBlock attribs str) = do
517 endline c = literal $ T.replicate (endlineLen c) $ T.singleton c
493 endline c = literal $ T.replicate (endlineLen c) $ T.singleton c
518 backticks = endline '`'
494 backticks = endline '`'
519 tildes = endline '~'
495 tildes = endline '~'
520− attrs = if isEnabled Ext_fenced_code_attributes opts
496+ attrs = if isEnabled Ext_fenced_code_attributes opts ||
497+ isEnabled Ext_attributes opts
521 then nowrap $ " " <> classOrAttrsToMarkdown attribs
498 then nowrap $ " " <> classOrAttrsToMarkdown attribs
522 else case attribs of
499 else case attribs of
523 (_,cls:_,_) -> " " <> literal cls
500 (_,cls:_,_) -> " " <> literal cls
@@ -814,6 +791,9 @@ blockListToMarkdown opts blocks = do
814 b1 : commentSep : fixBlocks (b2:bs)
791 b1 : commentSep : fixBlocks (b2:bs)
815 fixBlocks (Plain ils : bs@(RawBlock{}:_)) =
792 fixBlocks (Plain ils : bs@(RawBlock{}:_)) =
816 Plain ils : fixBlocks bs
793 Plain ils : fixBlocks bs
794+ fixBlocks (Plain ils : bs@(Div{}:_))
795+ | isEnabled Ext_fenced_divs opts =
796+ Para ils : fixBlocks bs
817 fixBlocks (Plain ils : bs) | inlist =
797 fixBlocks (Plain ils : bs) | inlist =
818 Plain ils : fixBlocks bs
798 Plain ils : fixBlocks bs
819 fixBlocks (Plain ils : bs) =
799 fixBlocks (Plain ils : bs) =
src/Text/Pandoc/Writers/Markdown/Inline.hs+34−16
@@ -11,7 +11,9 @@
11 Portability : portable
11 Portability : portable
12-}
12-}
13module Text.Pandoc.Writers.Markdown.Inline (
13module Text.Pandoc.Writers.Markdown.Inline (
14− inlineListToMarkdown
14+ inlineListToMarkdown,
15+ linkAttributes,
16+ attrsToMarkdown
15 ) where
17 ) where
16import Control.Monad.Reader
18import Control.Monad.Reader
17import Control.Monad.State.Strict
19import Control.Monad.State.Strict
@@ -43,7 +45,11 @@ import Text.Pandoc.Writers.Markdown.Types (MarkdownVariant(..),
43-- | Escape special characters for Markdown.
45-- | Escape special characters for Markdown.
44escapeText :: WriterOptions -> Text -> Text
46escapeText :: WriterOptions -> Text -> Text
45escapeText opts = T.pack . go . T.unpack
47escapeText opts = T.pack . go . T.unpack
46− where
48+ where
49+ startsWithSpace (' ':_) = True
50+ startsWithSpace ('\t':_) = True
51+ startsWithSpace [] = True
52+ startsWithSpace _ = False
47 go [] = []
53 go [] = []
48 go (c:cs) =
54 go (c:cs) =
49 case c of
55 case c of
@@ -56,10 +62,13 @@ escapeText opts = T.pack . go . T.unpack
56 '@' | isEnabled Ext_citations opts ->
62 '@' | isEnabled Ext_citations opts ->
57 case cs of
63 case cs of
58 (d:_)
64 (d:_)
59− | isAlphaNum d || d == '_'
65+ | isAlphaNum d || d == '_' || d == '{'
60 -> '\\':'@':go cs
66 -> '\\':'@':go cs
61 _ -> '@':go cs
67 _ -> '@':go cs
68+ '#' | isEnabled Ext_space_in_atx_header opts
69+ , startsWithSpace cs
70+ -> '\\':'#':go cs
62− _ | c `elem` ['\\','`','*','_','[',']','#'] ->
71+ _ | c `elem` ['\\','`','*','_','[',']'] ->
63 '\\':c:go cs
72 '\\':c:go cs
64 '|' | isEnabled Ext_pipe_tables opts -> '\\':'|':go cs
73 '|' | isEnabled Ext_pipe_tables opts -> '\\':'|':go cs
65 '^' | isEnabled Ext_superscript opts -> '\\':'^':go cs
74 '^' | isEnabled Ext_superscript opts -> '\\':'^':go cs
@@ -81,6 +90,8 @@ escapeText opts = T.pack . go . T.unpack
81 | isEnabled Ext_intraword_underscores opts
90 | isEnabled Ext_intraword_underscores opts
82 , isAlphaNum c
91 , isAlphaNum c
83 , isAlphaNum x -> c : '_' : x : go xs
92 , isAlphaNum x -> c : '_' : x : go xs
93+ '#':xs -> c : '#' : go xs
94+ '>':xs -> c : '>' : go xs
84 _ -> c : go cs
95 _ -> c : go cs
85
96
86attrsToMarkdown :: Attr -> Doc Text
97attrsToMarkdown :: Attr -> Doc Text
@@ -106,7 +117,7 @@ attrsToMarkdown attribs = braces $ hsep [attribId, attribClasses, attribKeys]
106
117
107linkAttributes :: WriterOptions -> Attr -> Doc Text
118linkAttributes :: WriterOptions -> Attr -> Doc Text
108linkAttributes opts attr =
119linkAttributes opts attr =
109− if isEnabled Ext_link_attributes opts && attr /= nullAttr
120+ if (isEnabled Ext_link_attributes opts || isEnabled Ext_attributes opts) && attr /= nullAttr
110 then attrsToMarkdown attr
121 then attrsToMarkdown attr
111 else empty
122 else empty
112
123
@@ -383,13 +394,15 @@ inlineToMarkdown opts (Quoted DoubleQuote lst) = do
383 then "&ldquo;" <> contents <> "&rdquo;"
394 then "&ldquo;" <> contents <> "&rdquo;"
384 else "“" <> contents <> "”"
395 else "“" <> contents <> "”"
385inlineToMarkdown opts (Code attr str) = do
396inlineToMarkdown opts (Code attr str) = do
386− let tickGroups = filter (T.any (== '`')) $ T.group str
397+ let tickGroups = filter (T.any (== '`')) $ T.group str
387− let longest = maybe 0 maximum $ nonEmpty $ map T.length tickGroups
398+ let longest = maybe 0 maximum $ nonEmpty $ map T.length tickGroups
388− let marker = T.replicate (longest + 1) "`"
399+ let marker = T.replicate (longest + 1) "`"
389− let spacer = if longest == 0 then "" else " "
400+ let spacer = if longest == 0 then "" else " "
401+ let attrsEnabled = isEnabled Ext_inline_code_attributes opts ||
402+ isEnabled Ext_attributes opts
390− let attrs = if isEnabled Ext_inline_code_attributes opts && attr /= nullAttr
403+ let attrs = if attrsEnabled && attr /= nullAttr
391− then attrsToMarkdown attr
404+ then attrsToMarkdown attr
392− else empty
405+ else empty
393 variant <- asks envVariant
406 variant <- asks envVariant
394 case variant of
407 case variant of
395 PlainText -> return $ literal str
408 PlainText -> return $ literal str
@@ -491,11 +504,16 @@ inlineToMarkdown opts (Cite (c:cs) lst)
491 rest <- mapM convertOne cs
504 rest <- mapM convertOne cs
492 let inbr = suffs <+> joincits rest
505 let inbr = suffs <+> joincits rest
493 br = if isEmpty inbr then empty else char '[' <> inbr <> char ']'
506 br = if isEmpty inbr then empty else char '[' <> inbr <> char ']'
494− return $ literal ("@" <> citationId c) <+> br
507+ return $ literal ("@" <> maybeInBraces (citationId c)) <+> br
495 else do
508 else do
496 cits <- mapM convertOne (c:cs)
509 cits <- mapM convertOne (c:cs)
497 return $ literal "[" <> joincits cits <> literal "]"
510 return $ literal "[" <> joincits cits <> literal "]"
498 where
511 where
512+ maybeInBraces key =
513+ case readWith (citeKey False >> spaces >> eof)
514+ defaultParserState ("@" <> key) of
515+ Left _ -> "{" <> key <> "}"
516+ Right _ -> key
499 joincits = hcat . intersperse (literal "; ") . filter (not . isEmpty)
517 joincits = hcat . intersperse (literal "; ") . filter (not . isEmpty)
500 convertOne Citation { citationId = k
518 convertOne Citation { citationId = k
501 , citationPrefix = pinlines
519 , citationPrefix = pinlines
@@ -504,7 +522,7 @@ inlineToMarkdown opts (Cite (c:cs) lst)
504 = do
522 = do
505 pdoc <- inlineListToMarkdown opts pinlines
523 pdoc <- inlineListToMarkdown opts pinlines
506 sdoc <- inlineListToMarkdown opts sinlines
524 sdoc <- inlineListToMarkdown opts sinlines
507− let k' = literal (modekey m <> "@" <> k)
525+ let k' = literal (modekey m <> "@" <> maybeInBraces k)
508 r = case sinlines of
526 r = case sinlines of
509 Str (T.uncons -> Just (y,_)):_ | y `elem` (",;]@" :: String) -> k' <> sdoc
527 Str (T.uncons -> Just (y,_)):_ | y `elem` (",;]@" :: String) -> k' <> sdoc
510 _ -> k' <+> sdoc
528 _ -> k' <+> sdoc
@@ -543,7 +561,7 @@ inlineToMarkdown opts lnk@(Link attr txt (src, tit)) = do
543 else "[" <> reftext <> "]"
561 else "[" <> reftext <> "]"
544 in return $ first <> second
562 in return $ first <> second
545 | isEnabled Ext_raw_html opts
563 | isEnabled Ext_raw_html opts
546− , not (isEnabled Ext_link_attributes opts)
564+ , not (isEnabled Ext_link_attributes opts || isEnabled Ext_attributes opts)
547 , attr /= nullAttr -> -- use raw HTML to render attributes
565 , attr /= nullAttr -> -- use raw HTML to render attributes
548 literal . T.strip <$>
566 literal . T.strip <$>
549 writeHtml5String opts{ writerTemplate = Nothing }
567 writeHtml5String opts{ writerTemplate = Nothing }
@@ -553,7 +571,7 @@ inlineToMarkdown opts lnk@(Link attr txt (src, tit)) = do
553 linkAttributes opts attr
571 linkAttributes opts attr
554inlineToMarkdown opts img@(Image attr alternate (source, tit))
572inlineToMarkdown opts img@(Image attr alternate (source, tit))
555 | isEnabled Ext_raw_html opts &&
573 | isEnabled Ext_raw_html opts &&
556− not (isEnabled Ext_link_attributes opts) &&
574+ not (isEnabled Ext_link_attributes opts || isEnabled Ext_attributes opts) &&
557 attr /= nullAttr = -- use raw HTML
575 attr /= nullAttr = -- use raw HTML
558 literal . T.strip <$>
576 literal . T.strip <$>
559 writeHtml5String opts{ writerTemplate = Nothing } (Pandoc nullMeta [Plain [img]])
577 writeHtml5String opts{ writerTemplate = Nothing } (Pandoc nullMeta [Plain [img]])
src/Text/Pandoc/Writers/Ms.hs+22−6
@@ -245,13 +245,17 @@ blockToMs opts (Table _ blkCapt specs thead tbody tfoot) =
245 aligncode AlignDefault = "l"
245 aligncode AlignDefault = "l"
246 in do
246 in do
247 caption' <- inlineListToMs' opts caption
247 caption' <- inlineListToMs' opts caption
248− let iwidths = if all (== 0) widths
248+ let isSimple = all (== 0) widths
249− then repeat ""
249+ let totalWidth = 70
250− else map (T.pack . printf "w(%0.1fn)" . (70 *)) widths
251 -- 78n default width - 8n indent = 70n
250 -- 78n default width - 8n indent = 70n
252 let coldescriptions = literal $ T.unwords
251 let coldescriptions = literal $ T.unwords
253− (zipWith (\align width -> aligncode align <> width)
252+ (zipWith (\align width -> aligncode align <>
253+ if width == 0
254+ then ""
255+ else T.pack $
256+ printf "w(%0.1fn)"
257+ (totalWidth * width))
254− alignments iwidths) <> "."
258+ alignments widths) <> "."
255 colheadings <- mapM (blockListToMs opts) headers
259 colheadings <- mapM (blockListToMs opts) headers
256 let makeRow cols = literal "T{" $$
260 let makeRow cols = literal "T{" $$
257 vcat (intersperse (literal "T}\tT{") cols) $$
261 vcat (intersperse (literal "T}\tT{") cols) $$
@@ -260,13 +264,25 @@ blockToMs opts (Table _ blkCapt specs thead tbody tfoot) =
260 then empty
264 then empty
261 else makeRow colheadings $$ char '_'
265 else makeRow colheadings $$ char '_'
262 body <- mapM (\row -> do
266 body <- mapM (\row -> do
267+ cols <- mapM (\(cell, w) ->
268+ (if isSimple
269+ then id
270+ else (literal (".nr LL " <>
271+ T.pack (printf "%0.1fn"
272+ (w * totalWidth))) $$)) <$>
263− cols <- mapM (blockListToMs opts) row
273+ blockListToMs opts cell) (zip row widths)
264 return $ makeRow cols) rows
274 return $ makeRow cols) rows
265 setFirstPara
275 setFirstPara
266 return $ literal ".PP" $$ caption' $$
276 return $ literal ".PP" $$ caption' $$
267 literal ".na" $$ -- we don't want justification in table cells
277 literal ".na" $$ -- we don't want justification in table cells
278+ (if isSimple
279+ then ""
280+ else ".nr LLold \\n[LL]") $$
268 literal ".TS" $$ literal "delim(@@) tab(\t);" $$ coldescriptions $$
281 literal ".TS" $$ literal "delim(@@) tab(\t);" $$ coldescriptions $$
269 colheadings' $$ vcat body $$ literal ".TE" $$
282 colheadings' $$ vcat body $$ literal ".TE" $$
283+ (if isSimple
284+ then ""
285+ else ".nr LL \\n[LLold]") $$
270 literal ".ad"
286 literal ".ad"
271
287
272blockToMs opts (BulletList items) = do
288blockToMs opts (BulletList items) = do
src/Text/Pandoc/Writers/OpenDocument.hs+47−51
@@ -1,4 +1,5 @@
1{-# LANGUAGE FlexibleContexts #-}
1{-# LANGUAGE FlexibleContexts #-}
2+{-# LANGUAGE LambdaCase #-}
2{-# LANGUAGE OverloadedStrings #-}
3{-# LANGUAGE OverloadedStrings #-}
3{-# LANGUAGE PatternGuards #-}
4{-# LANGUAGE PatternGuards #-}
4{-# LANGUAGE ViewPatterns #-}
5{-# LANGUAGE ViewPatterns #-}
@@ -372,36 +373,32 @@ blocksToOpenDocument o b = vcat <$> mapM (blockToOpenDocument o) b
372
373
373-- | Convert a Pandoc block element to OpenDocument.
374-- | Convert a Pandoc block element to OpenDocument.
374blockToOpenDocument :: PandocMonad m => WriterOptions -> Block -> OD m (Doc Text)
375blockToOpenDocument :: PandocMonad m => WriterOptions -> Block -> OD m (Doc Text)
375−blockToOpenDocument o bs
376+blockToOpenDocument o = \case
376− | Plain b <- bs = if null b
377+ Plain b -> if null b
377− then return empty
378+ then return empty
378− else inParagraphTags =<< inlinesToOpenDocument o b
379+ else inParagraphTags =<< inlinesToOpenDocument o b
379− | Para [Image attr c (s,T.stripPrefix "fig:" -> Just t)] <- bs
380+ Para [Image attr c (s,T.stripPrefix "fig:" -> Just t)] -> figure attr c s t
380− = figure attr c s t
381− | Para b <- bs = if null b &&
381+ Para b -> if null b &&
382− not (isEnabled Ext_empty_paragraphs o)
382+ not (isEnabled Ext_empty_paragraphs o)
383− then return empty
383+ then return empty
384− else inParagraphTags =<< inlinesToOpenDocument o b
384+ else inParagraphTags =<< inlinesToOpenDocument o b
385− | LineBlock b <- bs = blockToOpenDocument o $ linesToPara b
385+ LineBlock b -> blockToOpenDocument o $ linesToPara b
386− | Div attr xs <- bs = mkDiv attr xs
386+ Div attr xs -> mkDiv attr xs
387− | Header i (ident,_,_) b
387+ Header i (ident,_,_) b -> do
388− <- bs = setFirstPara >> (inHeaderTags i ident
388+ setFirstPara
389− =<< inlinesToOpenDocument o b)
389+ inHeaderTags i ident =<< inlinesToOpenDocument o b
390− | BlockQuote b <- bs = setFirstPara >> mkBlockQuote b
390+ BlockQuote b -> setFirstPara >> mkBlockQuote b
391− | DefinitionList b <- bs = setFirstPara >> defList b
391+ DefinitionList b -> setFirstPara >> defList b
392− | BulletList b <- bs = setFirstPara >> bulletListToOpenDocument o b
392+ BulletList b -> setFirstPara >> bulletListToOpenDocument o b
393− | OrderedList a b <- bs = setFirstPara >> orderedList a b
393+ OrderedList a b -> setFirstPara >> orderedList a b
394− | CodeBlock _ s <- bs = setFirstPara >> preformatted s
394+ CodeBlock _ s -> setFirstPara >> preformatted s
395− | Table a bc s th tb tf <- bs = setFirstPara >> table (Ann.toTable a bc s th tb tf)
395+ Table a bc s th tb tf -> setFirstPara >> table (Ann.toTable a bc s th tb tf)
396− | HorizontalRule <- bs = setFirstPara >> return (selfClosingTag "text:p"
396+ HorizontalRule -> setFirstPara >> return (selfClosingTag "text:p"
397− [ ("text:style-name", "Horizontal_20_Line") ])
397+ [ ("text:style-name", "Horizontal_20_Line") ])
398− | RawBlock f s <- bs = if f == Format "opendocument"
398+ b@(RawBlock f s) -> if f == Format "opendocument"
399− then return $ text $ T.unpack s
399+ then return $ text $ T.unpack s
400− else do
401− report $ BlockNotRendered bs
400+ else empty <$ report (BlockNotRendered b)
402− return empty
403− | Null <- bs = return empty
404− | otherwise = return empty
401+ Null -> return empty
405 where
402 where
406 defList b = do setInDefinitionList True
403 defList b = do setInDefinitionList True
407 r <- vcat <$> mapM (deflistItemToOpenDocument o) b
404 r <- vcat <$> mapM (deflistItemToOpenDocument o) b
@@ -874,27 +871,26 @@ data TextStyle = Italic
874textStyleAttr :: Map.Map Text Text
871textStyleAttr :: Map.Map Text Text
875 -> TextStyle
872 -> TextStyle
876 -> Map.Map Text Text
873 -> Map.Map Text Text
877−textStyleAttr m s
874+textStyleAttr m = \case
878− | Italic <- s = Map.insert "fo:font-style" "italic" .
875+ Italic -> Map.insert "fo:font-style" "italic" .
879− Map.insert "style:font-style-asian" "italic" .
876+ Map.insert "style:font-style-asian" "italic" .
880− Map.insert "style:font-style-complex" "italic" $ m
877+ Map.insert "style:font-style-complex" "italic" $ m
881− | Bold <- s = Map.insert "fo:font-weight" "bold" .
878+ Bold -> Map.insert "fo:font-weight" "bold" .
882− Map.insert "style:font-weight-asian" "bold" .
879+ Map.insert "style:font-weight-asian" "bold" .
883− Map.insert "style:font-weight-complex" "bold" $ m
880+ Map.insert "style:font-weight-complex" "bold" $ m
884− | Under <- s = Map.insert "style:text-underline-style" "solid" .
881+ Under -> Map.insert "style:text-underline-style" "solid" .
885− Map.insert "style:text-underline-width" "auto" .
882+ Map.insert "style:text-underline-width" "auto" .
886− Map.insert "style:text-underline-color" "font-color" $ m
883+ Map.insert "style:text-underline-color" "font-color" $ m
887− | Strike <- s = Map.insert "style:text-line-through-style" "solid" m
884+ Strike -> Map.insert "style:text-line-through-style" "solid" m
888− | Sub <- s = Map.insert "style:text-position" "sub 58%" m
885+ Sub -> Map.insert "style:text-position" "sub 58%" m
889− | Sup <- s = Map.insert "style:text-position" "super 58%" m
886+ Sup -> Map.insert "style:text-position" "super 58%" m
890− | SmallC <- s = Map.insert "fo:font-variant" "small-caps" m
887+ SmallC -> Map.insert "fo:font-variant" "small-caps" m
891− | Pre <- s = Map.insert "style:font-name" "Courier New" .
888+ Pre -> Map.insert "style:font-name" "Courier New" .
892− Map.insert "style:font-name-asian" "Courier New" .
889+ Map.insert "style:font-name-asian" "Courier New" .
893− Map.insert "style:font-name-complex" "Courier New" $ m
890+ Map.insert "style:font-name-complex" "Courier New" $ m
894− | Language lang <- s
891+ Language lang ->
895− = Map.insert "fo:language" (langLanguage lang) .
892+ Map.insert "fo:language" (langLanguage lang) .
896− maybe id (Map.insert "fo:country") (langRegion lang) $ m
893+ maybe id (Map.insert "fo:country") (langRegion lang) $ m
897− | otherwise = m
898
894
899withLangFromAttr :: PandocMonad m => Attr -> OD m a -> OD m a
895withLangFromAttr :: PandocMonad m => Attr -> OD m a -> OD m a
900withLangFromAttr (_,_,kvs) action =
896withLangFromAttr (_,_,kvs) action =
src/Text/Pandoc/Writers/Powerpoint/Output.hs+1
@@ -537,6 +537,7 @@ registerMedia fp caption = do
537 Just Eps -> Just ".eps"
537 Just Eps -> Just ".eps"
538 Just Svg -> Just ".svg"
538 Just Svg -> Just ".svg"
539 Just Emf -> Just ".emf"
539 Just Emf -> Just ".emf"
540+ Just Tiff -> Just ".tiff"
540 Nothing -> Nothing
541 Nothing -> Nothing
541
542
542 let newGlobalId = fromMaybe (maxGlobalId + 1) (M.lookup fp globalIds)
543 let newGlobalId = fromMaybe (maxGlobalId + 1) (M.lookup fp globalIds)
src/Text/Pandoc/Writers/Shared.hs+1
@@ -394,6 +394,7 @@ toSuperscript '2' = Just '\x00B2'
394toSuperscript '3' = Just '\x00B3'
394toSuperscript '3' = Just '\x00B3'
395toSuperscript '+' = Just '\x207A'
395toSuperscript '+' = Just '\x207A'
396toSuperscript '-' = Just '\x207B'
396toSuperscript '-' = Just '\x207B'
397+toSuperscript '\x2212' = Just '\x207B' -- unicode minus
397toSuperscript '=' = Just '\x207C'
398toSuperscript '=' = Just '\x207C'
398toSuperscript '(' = Just '\x207D'
399toSuperscript '(' = Just '\x207D'
399toSuperscript ')' = Just '\x207E'
400toSuperscript ')' = Just '\x207E'
src/Text/Pandoc/Writers/ZimWiki.hs+1−1
@@ -116,7 +116,7 @@ blockToZimWiki opts b@(RawBlock f str)
116blockToZimWiki _ HorizontalRule = return "\n----\n"
116blockToZimWiki _ HorizontalRule = return "\n----\n"
117
117
118blockToZimWiki opts (Header level _ inlines) = do
118blockToZimWiki opts (Header level _ inlines) = do
119− contents <- inlineListToZimWiki opts $ removeFormatting inlines -- emphasis, links etc. not allowed in headers
119+ contents <- inlineListToZimWiki opts inlines
120 let eqs = T.replicate ( 7 - level ) "="
120 let eqs = T.replicate ( 7 - level ) "="
121 return $ eqs <> " " <> contents <> " " <> eqs <> "\n"
121 return $ eqs <> " " <> contents <> " " <> eqs <> "\n"
122
122
stack.yaml+8−15
@@ -7,23 +7,16 @@ flags:
7packages:
7packages:
8- '.'
8- '.'
9extra-deps:
9extra-deps:
10−- hslua-1.3.0
10+- commonmark-0.2.1
11−- hslua-module-path-0.1.0
11+- commonmark-pandoc-0.2.1.1
12−- jira-wiki-markup-1.3.4
13−- skylighting-core-0.10.5.1
12+- skylighting-core-0.10.5.2
14−- skylighting-0.10.5.1
13+- skylighting-0.10.5.2
15−- doclayout-0.3.0.2
16−- random-1.2.0
17−- xml-conduit-1.9.1.1
18−- unicode-collation-0.1.3
19−# - texmath-0.12.2
20−- git: https://github.com/jgm/texmath
14+- git: https://github.com/jgm/doctemplates
21− commit: 0c34bb7d229389adc62bcbfe20cfbfdc0c8ccc8d
15+ commit: 428c26d5303cf7a2b1051fe1ffd9aafe9ba71c81
22−# - citeproc-0.3.0.9
23- git: https://github.com/jgm/citeproc
16- git: https://github.com/jgm/citeproc
24− commit: f33b370bd1ab5ad5140720369c0586041e433a47
17+ commit: 4ce0501cd6f9c86eee087afcf878c256e49b9615
25ghc-options:
18ghc-options:
26 "$locals": -fhide-source-paths -Wno-missing-home-modules
19 "$locals": -fhide-source-paths -Wno-missing-home-modules
27−resolver: lts-17.5
20+resolver: lts-18.0
28nix:
21nix:
29 packages: [zlib]
22 packages: [zlib]
test/Tests/Command.hs+4−1
@@ -130,4 +130,7 @@ extractCommandTest testExePath fp = unsafePerformIO $ do
130 def{ readerExtensions = pandocExtensions } contents)
130 def{ readerExtensions = pandocExtensions } contents)
131 let codeblocks = map extractCode $ filter isCodeBlock blocks
131 let codeblocks = map extractCode $ filter isCodeBlock blocks
132 let cases = zipWith (runCommandTest testExePath fp) [1..] codeblocks
132 let cases = zipWith (runCommandTest testExePath fp) [1..] codeblocks
133− return $ testGroup fp cases
133+ return $ testGroup fp
134+ $ if null cases
135+ then [testCase "!!" $ assertFailure "No command tests defined"]
136+ else cases
test/Tests/Readers/Docx.hs+21−5
@@ -24,7 +24,7 @@ import Test.Tasty.HUnit
24import Tests.Helpers
24import Tests.Helpers
25import Text.Pandoc
25import Text.Pandoc
26import qualified Text.Pandoc.Class as P
26import qualified Text.Pandoc.Class as P
27−import Text.Pandoc.MediaBag (MediaBag, lookupMedia, mediaDirectory)
27+import qualified Text.Pandoc.MediaBag as MB
28import Text.Pandoc.UTF8 as UTF8
28import Text.Pandoc.UTF8 as UTF8
29
29
30-- We define a wrapper around pandoc that doesn't normalize in the
30-- We define a wrapper around pandoc that doesn't normalize in the
@@ -91,11 +91,11 @@ getMedia :: FilePath -> FilePath -> IO (Maybe B.ByteString)
91getMedia archivePath mediaPath = fmap fromEntry . findEntryByPath
91getMedia archivePath mediaPath = fmap fromEntry . findEntryByPath
92 ("word/" ++ mediaPath) . toArchive <$> B.readFile archivePath
92 ("word/" ++ mediaPath) . toArchive <$> B.readFile archivePath
93
93
94−compareMediaPathIO :: FilePath -> MediaBag -> FilePath -> IO Bool
94+compareMediaPathIO :: FilePath -> MB.MediaBag -> FilePath -> IO Bool
95compareMediaPathIO mediaPath mediaBag docxPath = do
95compareMediaPathIO mediaPath mediaBag docxPath = do
96 docxMedia <- getMedia docxPath mediaPath
96 docxMedia <- getMedia docxPath mediaPath
97− let mbBS = case lookupMedia mediaPath mediaBag of
97+ let mbBS = case MB.lookupMedia mediaPath mediaBag of
98− Just (_, bs) -> bs
98+ Just item -> MB.mediaContents item
99 Nothing -> error ("couldn't find " ++
99 Nothing -> error ("couldn't find " ++
100 mediaPath ++
100 mediaPath ++
101 " in media bag")
101 " in media bag")
@@ -110,7 +110,7 @@ compareMediaBagIO docxFile = do
110 mb <- runIOorExplode $ readDocx defopts df >> P.getMediaBag
110 mb <- runIOorExplode $ readDocx defopts df >> P.getMediaBag
111 bools <- mapM
111 bools <- mapM
112 (\(fp, _, _) -> compareMediaPathIO fp mb docxFile)
112 (\(fp, _, _) -> compareMediaPathIO fp mb docxFile)
113− (mediaDirectory mb)
113+ (MB.mediaDirectory mb)
114 return $ and bools
114 return $ and bools
115
115
116testMediaBagIO :: String -> FilePath -> IO TestTree
116testMediaBagIO :: String -> FilePath -> IO TestTree
@@ -317,14 +317,30 @@ tests = [ testGroup "document"
317 "tables with lists in cells"
317 "tables with lists in cells"
318 "docx/table_with_list_cell.docx"
318 "docx/table_with_list_cell.docx"
319 "docx/table_with_list_cell.native"
319 "docx/table_with_list_cell.native"
320+ , testCompare
321+ "a table with a header which contains rowspans greater than 1"
322+ "docx/table_header_rowspan.docx"
323+ "docx/table_header_rowspan.native"
320 , testCompare
324 , testCompare
321 "tables with one row"
325 "tables with one row"
322 "docx/table_one_row.docx"
326 "docx/table_one_row.docx"
323 "docx/table_one_row.native"
327 "docx/table_one_row.native"
328+ , testCompare
329+ "tables with just one row, which is a header"
330+ "docx/table_one_header_row.docx"
331+ "docx/table_one_header_row.native"
324 , testCompare
332 , testCompare
325 "tables with variable width"
333 "tables with variable width"
326 "docx/table_variable_width.docx"
334 "docx/table_variable_width.docx"
327 "docx/table_variable_width.native"
335 "docx/table_variable_width.native"
336+ , testCompare
337+ "tables with captions which contain a Table field"
338+ "docx/table_captions_with_field.docx"
339+ "docx/table_captions_with_field.native"
340+ , testCompare
341+ "tables with captions which don't contain a Table field"
342+ "docx/table_captions_no_field.docx"
343+ "docx/table_captions_no_field.native"
328 , testCompare
344 , testCompare
329 "code block"
345 "code block"
330 "docx/codeblock.docx"
346 "docx/codeblock.docx"
test/Tests/Readers/EPUB.hs+1−1
@@ -47,7 +47,7 @@ featuresBag = [("img/check.gif","image/gif",1340)
47
47
48-- with additional meta tag for cover in EPUB2 format
48-- with additional meta tag for cover in EPUB2 format
49epub3CoverBag :: [(String, String, Int)]
49epub3CoverBag :: [(String, String, Int)]
50−epub3CoverBag = [("wasteland-cover.jpg","image/jpeg",103477)]
50+epub3CoverBag = [("wasteland-cover.jpg","image/jpeg", 16586)]
51
51
52epub3NoCoverBag :: [(String, String, Int)]
52epub3NoCoverBag :: [(String, String, Int)]
53epub3NoCoverBag = [("img/check.gif","image/gif",1340)
53epub3NoCoverBag = [("img/check.gif","image/gif",1340)
test/Tests/Readers/HTML.hs+20−5
@@ -99,11 +99,26 @@ tests = [ testGroup "base tag"
99 plain (codeWith ("",["sample"],[]) "Answer is 42")
99 plain (codeWith ("",["sample"],[]) "Answer is 42")
100 ]
100 ]
101 , testGroup "var"
101 , testGroup "var"
102− [
103− test html "inline var block" $
102+ [ test html "inline var block" $
104− "<var>result</var>" =?>
103+ "<var>result</var>" =?>
105− plain (codeWith ("",["variable"],[]) "result")
104+ plain (codeWith ("",["variable"],[]) "result")
105+ ]
106+ , testGroup "header"
107+ [ test htmlNativeDivs "<header> is parsed as a div" $
108+ "<header id=\"title\">Title</header>" =?>
109+ divWith ("title", mempty, mempty) (plain "Title")
110+ ]
111+ , testGroup "code block"
112+ [ test html "attributes in pre > code element" $
113+ "<pre><code id=\"a\" class=\"python\">\nprint('hi')\n</code></pre>"
114+ =?>
115+ codeBlockWith ("a", ["python"], []) "print('hi')"
116+
117+ , test html "attributes in pre take precendence" $
118+ "<pre id=\"c\"><code id=\"d\">\nprint('hi mom!')\n</code></pre>"
119+ =?>
120+ codeBlockWith ("c", [], []) "print('hi mom!')"
106− ]
121+ ]
107 , askOption $ \(QuickCheckTests numtests) ->
122 , askOption $ \(QuickCheckTests numtests) ->
108 testProperty "Round trip" $
123 testProperty "Round trip" $
109 withMaxSuccess (if QuickCheckTests numtests == defaultValue
124 withMaxSuccess (if QuickCheckTests numtests == defaultValue
test/Tests/Readers/Jira.hs+8
@@ -167,6 +167,14 @@ tests =
167 , "user with description" =:
167 , "user with description" =:
168 "[John Doe|~johndoe]" =?>
168 "[John Doe|~johndoe]" =?>
169 para (linkWith ("", ["user-account"], []) "~johndoe" "" "John Doe")
169 para (linkWith ("", ["user-account"], []) "~johndoe" "" "John Doe")
170+
171+ , "'smart' link" =:
172+ "[x|http://example.com|smart-link]" =?>
173+ para (linkWith ("", ["smart-link"], []) "http://example.com" "" "x")
174+
175+ , "'smart' card" =:
176+ "[x|http://example.com|smart-card]" =?>
177+ para (linkWith ("", ["smart-card"], []) "http://example.com" "" "x")
170 ]
178 ]
171
179
172 , "image" =:
180 , "image" =:
test/Tests/Writers/ConTeXt.hs+122−113
@@ -39,116 +39,125 @@ infix 4 =:
39(=:) = test context
39(=:) = test context
40
40
41tests :: [TestTree]
41tests :: [TestTree]
42+tests =
42−tests = [ testGroup "inline code"
43+ [ testGroup "inline code"
43− [ "with '}'" =: code "}" =?> "\\mono{\\}}"
44+ [ "with '}'" =: code "}" =?> "\\mono{\\}}"
44− , "without '}'" =: code "]" =?> "\\type{]}"
45+ , "without '}'" =: code "]" =?> "\\type{]}"
46+ , "span with ID" =:
47+ spanWith ("city", [], []) "Berlin" =?>
48+ "\\reference[city]{}Berlin"
45− , testProperty "code property" $ \s -> null s || '\n' `elem` s ||
49+ , testProperty "code property" $ \s -> null s || '\n' `elem` s ||
46− if '{' `elem` s || '}' `elem` s
50+ if '{' `elem` s || '}' `elem` s
47− then context' (code $ pack s) == "\\mono{" ++
51+ then context' (code $ pack s) == "\\mono{" ++
48− context' (str $ pack s) ++ "}"
52+ context' (str $ pack s) ++ "}"
49− else context' (code $ pack s) == "\\type{" ++ s ++ "}"
53+ else context' (code $ pack s) == "\\type{" ++ s ++ "}"
50− ]
54+ ]
51− , testGroup "headers"
55+ , testGroup "headers"
52− [ "level 1" =:
56+ [ "level 1" =:
57+ headerWith ("my-header",[],[]) 1 "My header" =?>
53− headerWith ("my-header",[],[]) 1 "My header" =?> "\\section[title={My header},reference={my-header}]"
58+ "\\section[title={My header},reference={my-header}]"
54− , test contextDiv "section-divs" $
59+ , test contextDiv "section-divs" $
55− ( headerWith ("header1", [], []) 1 (text "Header1")
60+ ( headerWith ("header1", [], []) 1 (text "Header1")
56− <> headerWith ("header2", [], []) 2 (text "Header2")
61+ <> headerWith ("header2", [], []) 2 (text "Header2")
57− <> headerWith ("header3", [], []) 3 (text "Header3")
62+ <> headerWith ("header3", [], []) 3 (text "Header3")
58− <> headerWith ("header4", [], []) 4 (text "Header4")
63+ <> headerWith ("header4", [], []) 4 (text "Header4")
59− <> headerWith ("header5", [], []) 5 (text "Header5")
64+ <> headerWith ("header5", [], []) 5 (text "Header5")
60− <> headerWith ("header6", [], []) 6 (text "Header6"))
65+ <> headerWith ("header6", [], []) 6 (text "Header6"))
61− =?>
66+ =?>
67+ unlines
62− unlines [ "\\startsection[title={Header1},reference={header1}]\n"
68+ [ "\\startsection[title={Header1},reference={header1}]\n"
63− , "\\startsubsection[title={Header2},reference={header2}]\n"
69+ , "\\startsubsection[title={Header2},reference={header2}]\n"
64− , "\\startsubsubsection[title={Header3},reference={header3}]\n"
70+ , "\\startsubsubsection[title={Header3},reference={header3}]\n"
65− , "\\startsubsubsubsection[title={Header4},reference={header4}]\n"
71+ , "\\startsubsubsubsection[title={Header4},reference={header4}]\n"
66− , "\\startsubsubsubsubsection[title={Header5},reference={header5}]\n"
72+ , "\\startsubsubsubsubsection[title={Header5},reference={header5}]\n"
67− , "\\startsubsubsubsubsubsection[title={Header6},reference={header6}]\n"
73+ , "\\startsubsubsubsubsubsection[title={Header6},reference={header6}]\n"
68− , "\\stopsubsubsubsubsubsection\n"
74+ , "\\stopsubsubsubsubsubsection\n"
69− , "\\stopsubsubsubsubsection\n"
75+ , "\\stopsubsubsubsubsection\n"
70− , "\\stopsubsubsubsection\n"
76+ , "\\stopsubsubsubsection\n"
71− , "\\stopsubsubsection\n"
77+ , "\\stopsubsubsection\n"
72− , "\\stopsubsection\n"
78+ , "\\stopsubsection\n"
73− , "\\stopsection" ]
79+ , "\\stopsection" ]
74− ]
80+ ]
75− , testGroup "bullet lists"
81+ , testGroup "bullet lists"
76− [ "nested" =:
82+ [ "nested" =:
77− bulletList [
83+ bulletList [
78− plain (text "top")
84+ plain (text "top")
79− <> bulletList [
85+ <> bulletList [
80− plain (text "next")
86+ plain (text "next")
81− <> bulletList [plain (text "bot")]
87+ <> bulletList [plain (text "bot")]
82− ]
88+ ]
83− ] =?> unlines
89+ ] =?> unlines
84− [ "\\startitemize[packed]"
90+ [ "\\startitemize[packed]"
85− , "\\item"
91+ , "\\item"
86− , " top"
92+ , " top"
87− , " \\startitemize[packed]"
93+ , " \\startitemize[packed]"
88− , " \\item"
94+ , " \\item"
89− , " next"
95+ , " next"
90− , " \\startitemize[packed]"
96+ , " \\startitemize[packed]"
91− , " \\item"
97+ , " \\item"
92− , " bot"
98+ , " bot"
93− , " \\stopitemize"
99+ , " \\stopitemize"
94− , " \\stopitemize"
100+ , " \\stopitemize"
95− , "\\stopitemize" ]
101+ , "\\stopitemize" ]
96− ]
102+ ]
97− , testGroup "natural tables"
103+ , testGroup "natural tables"
98− [ test contextNtb "table with header and caption" $
104+ [ test contextNtb "table with header and caption" $
99− let capt = text "Table 1"
105+ let capt = text "Table 1"
100− aligns = [(AlignRight, ColWidthDefault), (AlignLeft, ColWidthDefault), (AlignCenter, ColWidthDefault), (AlignDefault, ColWidthDefault)]
106+ aligns = [ (AlignRight, ColWidthDefault)
107+ , (AlignLeft, ColWidthDefault)
108+ , (AlignCenter, ColWidthDefault)
109+ , (AlignDefault, ColWidthDefault) ]
101− headers = [plain $ text "Right",
110+ headers = [plain $ text "Right",
102− plain $ text "Left",
111+ plain $ text "Left",
103− plain $ text "Center",
112+ plain $ text "Center",
104− plain $ text "Default"]
113+ plain $ text "Default"]
105− rows = [[plain $ text "1.1",
114+ rows = [[plain $ text "1.1",
106− plain $ text "1.2",
115+ plain $ text "1.2",
107− plain $ text "1.3",
116+ plain $ text "1.3",
108− plain $ text "1.4"]
117+ plain $ text "1.4"]
109− ,[plain $ text "2.1",
118+ ,[plain $ text "2.1",
110− plain $ text "2.2",
119+ plain $ text "2.2",
111− plain $ text "2.3",
120+ plain $ text "2.3",
112− plain $ text "2.4"]
121+ plain $ text "2.4"]
113− ,[plain $ text "3.1",
122+ ,[plain $ text "3.1",
114− plain $ text "3.2",
123+ plain $ text "3.2",
115− plain $ text "3.3",
124+ plain $ text "3.3",
116− plain $ text "3.4"]]
125+ plain $ text "3.4"]]
117− toRow = Row nullAttr . map simpleCell
126+ toRow = Row nullAttr . map simpleCell
118− in table (simpleCaption $ plain capt)
127+ in table (simpleCaption $ plain capt)
119− aligns
128+ aligns
120− (TableHead nullAttr [toRow headers])
129+ (TableHead nullAttr [toRow headers])
121− [TableBody nullAttr 0 [] $ map toRow rows]
130+ [TableBody nullAttr 0 [] $ map toRow rows]
122− (TableFoot nullAttr [])
131+ (TableFoot nullAttr [])
123− =?> unlines [ "\\startplacetable[title={Table 1}]"
132+ =?> unlines [ "\\startplacetable[title={Table 1}]"
124− , "\\startTABLE"
133+ , "\\startTABLE"
125− , "\\startTABLEhead"
134+ , "\\startTABLEhead"
126− , "\\NC[align=left] Right"
135+ , "\\NC[align=left] Right"
127− , "\\NC[align=right] Left"
136+ , "\\NC[align=right] Left"
128− , "\\NC[align=middle] Center"
137+ , "\\NC[align=middle] Center"
129− , "\\NC Default"
138+ , "\\NC Default"
130− , "\\NC\\NR"
139+ , "\\NC\\NR"
131− , "\\stopTABLEhead"
140+ , "\\stopTABLEhead"
132− , "\\startTABLEbody"
141+ , "\\startTABLEbody"
133− , "\\NC[align=left] 1.1"
142+ , "\\NC[align=left] 1.1"
134− , "\\NC[align=right] 1.2"
143+ , "\\NC[align=right] 1.2"
135− , "\\NC[align=middle] 1.3"
144+ , "\\NC[align=middle] 1.3"
136− , "\\NC 1.4"
145+ , "\\NC 1.4"
137− , "\\NC\\NR"
146+ , "\\NC\\NR"
138− , "\\NC[align=left] 2.1"
147+ , "\\NC[align=left] 2.1"
139− , "\\NC[align=right] 2.2"
148+ , "\\NC[align=right] 2.2"
140− , "\\NC[align=middle] 2.3"
149+ , "\\NC[align=middle] 2.3"
141− , "\\NC 2.4"
150+ , "\\NC 2.4"
142− , "\\NC\\NR"
151+ , "\\NC\\NR"
143− , "\\stopTABLEbody"
152+ , "\\stopTABLEbody"
144− , "\\startTABLEfoot"
153+ , "\\startTABLEfoot"
145− , "\\NC[align=left] 3.1"
154+ , "\\NC[align=left] 3.1"
146− , "\\NC[align=right] 3.2"
155+ , "\\NC[align=right] 3.2"
147− , "\\NC[align=middle] 3.3"
156+ , "\\NC[align=middle] 3.3"
148− , "\\NC 3.4"
157+ , "\\NC 3.4"
149− , "\\NC\\NR"
158+ , "\\NC\\NR"
150− , "\\stopTABLEfoot"
159+ , "\\stopTABLEfoot"
151− , "\\stopTABLE"
160+ , "\\stopTABLE"
152− , "\\stopplacetable" ]
161+ , "\\stopplacetable" ]
153− ]
162+ ]
154− ]
163+ ]
test/Tests/Writers/Docbook.hs+6−6
@@ -83,32 +83,32 @@ tests = [ testGroup "line blocks"
83 , "</warning>"
83 , "</warning>"
84 ]
84 ]
85 , "admonition-with-title" =:
85 , "admonition-with-title" =:
86− divWith ("foo", ["attention"], []) (
86+ divWith ("foo", ["note"], []) (
87 divWith ("foo", ["title"], [])
87 divWith ("foo", ["title"], [])
88 (plain (text "This is title")) <>
88 (plain (text "This is title")) <>
89 para "This is a test"
89 para "This is a test"
90 )
90 )
91 =?> unlines
91 =?> unlines
92− [ "<attention id=\"foo\">"
92+ [ "<note id=\"foo\">"
93 , " <title>This is title</title>"
93 , " <title>This is title</title>"
94 , " <para>"
94 , " <para>"
95 , " This is a test"
95 , " This is a test"
96 , " </para>"
96 , " </para>"
97− , "</attention>"
97+ , "</note>"
98 ]
98 ]
99 , "admonition-with-title-in-para" =:
99 , "admonition-with-title-in-para" =:
100− divWith ("foo", ["attention"], []) (
100+ divWith ("foo", ["note"], []) (
101 divWith ("foo", ["title"], [])
101 divWith ("foo", ["title"], [])
102 (para "This is title") <>
102 (para "This is title") <>
103 para "This is a test"
103 para "This is a test"
104 )
104 )
105 =?> unlines
105 =?> unlines
106− [ "<attention id=\"foo\">"
106+ [ "<note id=\"foo\">"
107 , " <title>This is title</title>"
107 , " <title>This is title</title>"
108 , " <para>"
108 , " <para>"
109 , " This is a test"
109 , " This is a test"
110 , " </para>"
110 , " </para>"
111− , "</attention>"
111+ , "</note>"
112 ]
112 ]
113 , "single-child" =:
113 , "single-child" =:
114 divWith ("foo", [], []) (para "This is a test")
114 divWith ("foo", [], []) (para "This is a test")
test/Tests/Writers/Docx.hs+5
@@ -111,6 +111,11 @@ tests = [ testGroup "inlines"
111 def
111 def
112 "docx/tables.native"
112 "docx/tables.native"
113 "docx/golden/tables.docx"
113 "docx/golden/tables.docx"
114+ , docxTest
115+ "tables without explicit column widths"
116+ def
117+ "docx/tables-default-widths.native"
118+ "docx/golden/tables-default-widths.docx"
114 , docxTest
119 , docxTest
115 "tables with lists in cells"
120 "tables with lists in cells"
116 def
121 def
test/Tests/Writers/HTML.hs+57−52
@@ -34,55 +34,60 @@ infix 4 =:
34(=:) = test html
34(=:) = test html
35
35
36tests :: [TestTree]
36tests :: [TestTree]
37+tests =
37−tests = [ testGroup "inline code"
38+ [ testGroup "inline code"
38− [ "basic" =: code "@&" =?> "<code>@&amp;</code>"
39+ [ "basic" =: code "@&" =?> "<code>@&amp;</code>"
39− , "haskell" =: codeWith ("",["haskell"],[]) ">>="
40+ , "haskell" =: codeWith ("",["haskell"],[]) ">>="
40− =?> "<code class=\"sourceCode haskell\"><span class=\"op\">&gt;&gt;=</span></code>"
41+ =?> "<code class=\"sourceCode haskell\"><span class=\"op\">&gt;&gt;=</span></code>"
41− , "nolanguage" =: codeWith ("",["nolanguage"],[]) ">>="
42+ , "nolanguage" =: codeWith ("",["nolanguage"],[]) ">>="
42− =?> "<code class=\"nolanguage\">&gt;&gt;=</code>"
43+ =?> "<code class=\"nolanguage\">&gt;&gt;=</code>"
43− ]
44+ ]
44− , testGroup "images"
45+ , testGroup "images"
45− [ "alt with formatting" =:
46+ [ "alt with formatting" =:
46− image "/url" "title" ("my " <> emph "image")
47+ image "/url" "title" ("my " <> emph "image")
47− =?> "<img src=\"/url\" title=\"title\" alt=\"my image\" />"
48+ =?> "<img src=\"/url\" title=\"title\" alt=\"my image\" />"
48− ]
49+ ]
49− , testGroup "blocks"
50+ , testGroup "blocks"
50− [ "definition list with empty <dt>" =:
51+ [ "definition list with empty <dt>" =:
51− definitionList [(mempty, [para $ text "foo bar"])]
52+ definitionList [(mempty, [para $ text "foo bar"])]
52− =?> "<dl><dt></dt><dd><p>foo bar</p></dd></dl>"
53+ =?> "<dl><dt></dt><dd><p>foo bar</p></dd></dl>"
54+ , "heading with disallowed attributes" =:
55+ headerWith ("", [], [("invalid","1"), ("lang", "en")]) 1 "test"
56+ =?>
57+ "<h1 lang=\"en\">test</h1>"
53− ]
58+ ]
54− , testGroup "quotes"
59+ , testGroup "quotes"
55− [ "quote with cite attribute (without q-tags)" =:
60+ [ "quote with cite attribute (without q-tags)" =:
56− doubleQuoted (spanWith ("", [], [("cite", "http://example.org")]) (str "examples"))
61+ doubleQuoted (spanWith ("", [], [("cite", "http://example.org")]) (str "examples"))
57− =?> "“<span cite=\"http://example.org\">examples</span>”"
62+ =?> "“<span cite=\"http://example.org\">examples</span>”"
58− , tQ "quote with cite attribute (with q-tags)" $
63+ , tQ "quote with cite attribute (with q-tags)" $
59− doubleQuoted (spanWith ("", [], [("cite", "http://example.org")]) (str "examples"))
64+ doubleQuoted (spanWith ("", [], [("cite", "http://example.org")]) (str "examples"))
60− =?> "<q cite=\"http://example.org\">examples</q>"
65+ =?> "<q cite=\"http://example.org\">examples</q>"
61− ]
66+ ]
62− , testGroup "sample"
67+ , testGroup "sample"
63− [ "sample should be rendered correctly" =:
68+ [ "sample should be rendered correctly" =:
64− plain (codeWith ("",["sample"],[]) "Answer is 42") =?>
69+ plain (codeWith ("",["sample"],[]) "Answer is 42") =?>
65− "<samp>Answer is 42</samp>"
70+ "<samp>Answer is 42</samp>"
66− ]
71+ ]
67− , testGroup "variable"
72+ , testGroup "variable"
68− [ "variable should be rendered correctly" =:
73+ [ "variable should be rendered correctly" =:
69− plain (codeWith ("",["variable"],[]) "result") =?>
74+ plain (codeWith ("",["variable"],[]) "result") =?>
70− "<var>result</var>"
75+ "<var>result</var>"
71− ]
76+ ]
72− , testGroup "sample with style"
77+ , testGroup "sample with style"
73− [ "samp should wrap highlighted code" =:
78+ [ "samp should wrap highlighted code" =:
74− codeWith ("",["sample","haskell"],[]) ">>="
79+ codeWith ("",["sample","haskell"],[]) ">>="
75− =?> ("<samp><code class=\"sourceCode haskell\">" ++
80+ =?> ("<samp><code class=\"sourceCode haskell\">" ++
76− "<span class=\"op\">&gt;&gt;=</span></code></samp>")
81+ "<span class=\"op\">&gt;&gt;=</span></code></samp>")
77− ]
82+ ]
78− , testGroup "variable with style"
83+ , testGroup "variable with style"
79− [ "var should wrap highlighted code" =:
84+ [ "var should wrap highlighted code" =:
80− codeWith ("",["haskell","variable"],[]) ">>="
85+ codeWith ("",["haskell","variable"],[]) ">>="
81− =?> ("<var><code class=\"sourceCode haskell\">" ++
86+ =?> ("<var><code class=\"sourceCode haskell\">" ++
82− "<span class=\"op\">&gt;&gt;=</span></code></var>")
87+ "<span class=\"op\">&gt;&gt;=</span></code></var>")
83− ]
88+ ]
84− ]
89+ ]
85− where
90+ where
86− tQ :: (ToString a, ToPandoc a)
91+ tQ :: (ToString a, ToPandoc a)
87− => String -> (a, String) -> TestTree
92+ => String -> (a, String) -> TestTree
88− tQ = test htmlQTags
93+ tQ = test htmlQTags
test/Tests/Writers/Jira.hs+12
@@ -61,12 +61,24 @@ tests =
61 , "user link with user as description" =:
61 , "user link with user as description" =:
62 linkWith ("", ["user-account"], []) "~johndoe" "" "~johndoe" =?>
62 linkWith ("", ["user-account"], []) "~johndoe" "" "~johndoe" =?>
63 "[~johndoe]"
63 "[~johndoe]"
64+
65+ , "'smart' link" =:
66+ para (linkWith ("", ["smart-link"], []) "http://example.com" "" "x") =?>
67+ "[x|http://example.com|smart-link]"
68+
69+ , "'smart' card" =:
70+ para (linkWith ("", ["smart-card"], []) "http://example.org" "" "x") =?>
71+ "[x|http://example.org|smart-card]"
64 ]
72 ]
65
73
66 , testGroup "spans"
74 , testGroup "spans"
67 [ "id is used as anchor" =:
75 [ "id is used as anchor" =:
68 spanWith ("unicorn", [], []) (str "Unicorn") =?>
76 spanWith ("unicorn", [], []) (str "Unicorn") =?>
69 "{anchor:unicorn}Unicorn"
77 "{anchor:unicorn}Unicorn"
78+
79+ , "use `color` attribute" =:
80+ spanWith ("",[],[("color","red")]) "ruby" =?>
81+ "{color:red}ruby{color}"
70 ]
82 ]
71
83
72 , testGroup "code"
84 , testGroup "code"
test/Tests/Writers/OOXML.hs+3−1
@@ -55,7 +55,9 @@ testArchive :: (WriterOptions -> Pandoc -> PandocIO BL.ByteString)
55 -> IO Archive
55 -> IO Archive
56testArchive writerFn opts fp = do
56testArchive writerFn opts fp = do
57 txt <- T.readFile fp
57 txt <- T.readFile fp
58+ bs <- runIOorExplode $ do
59+ setTranslations "en-US"
58− bs <- runIOorExplode $ readNative def txt >>= writerFn opts
60+ readNative def txt >>= writerFn opts
59 return $ toArchive bs
61 return $ toArchive bs
60
62
61compareFileList :: FilePath -> Archive -> Archive -> Maybe String
63compareFileList :: FilePath -> Archive -> Archive -> Maybe String
test/command/2874.md+2−2
@@ -3,12 +3,12 @@
3<a></a>
3<a></a>
4<br/>
4<br/>
5^D
5^D
6−{}~\\
6+{}\strut \\
7```
7```
8
8
9```
9```
10% pandoc -f html -t latex
10% pandoc -f html -t latex
11<a name="foo"></a><br/>
11<a name="foo"></a><br/>
12^D
12^D
13−\protect\hypertarget{foo}{}{}~\\
13+\protect\hypertarget{foo}{}{}\strut \\
14```
14```
test/command/3752.mdnew file+60
@@ -0,0 +1,60 @@
1+```
2+% pandoc command/chap1/text.md command/chap2/text.md -f markdown+rebase_relative_paths --verbose -t docx -o - | pandoc -f docx -t plain
3+^D
4+[INFO] Loaded command/chap1/spider.png from command/chap1/spider.png
5+[INFO] Loaded command/chap2/spider.png from command/chap2/spider.png
6+[INFO] Loaded command/chap1/../../lalune.jpg from command/chap1/../../lalune.jpg
7+Chapter one
8+
9+A spider: [spider]
10+
11+Another spider: [another spider]
12+
13+The moon: [moon]
14+
15+Link to spider picture.
16+
17+URL left alone: manual.
18+
19+Absolute path left alone: absolute.
20+
21+Link to fragment: chapter two.
22+
23+Empty path: empty.
24+
25+Chapter two
26+
27+A spider: [spider]
28+```
29+
30+```
31+% pandoc command/chap1/text.md command/chap2/text.md -f markdown+rebase_relative_paths -t html
32+^D
33+<h1 id="chapter-one">Chapter one</h1>
34+<p>A spider: <img src="command/chap1/spider.png" alt="spider" /></p>
35+<p>Another spider: <img src="command/chap2/spider.png" alt="another spider" /></p>
36+<p>The moon: <img src="command/chap1/../../lalune.jpg" alt="moon" /></p>
37+<p>Link to <a href="command/chap1/spider.png">spider picture</a>.</p>
38+<p>URL left alone: <a href="https://pandoc.org/MANUAL.html">manual</a>.</p>
39+<p>Absolute path left alone: <a href="/foo/bar/baz.png">absolute</a>.</p>
40+<p>Link to fragment: <a href="#chapter-two">chapter two</a>.</p>
41+<p>Empty path: <a href="">empty</a>.</p>
42+<h1 id="chapter-two">Chapter two</h1>
43+<p>A spider: <img src="command/chap2/spider.png" alt="spider" /></p>
44+```
45+
46+```
47+% pandoc command/chap1/text.md command/chap2/text.md -f commonmark+rebase_relative_paths -t html
48+^D
49+<h1>Chapter one</h1>
50+<p>A spider: <img src="command/chap1/spider.png" alt="spider" /></p>
51+<p>Another spider: <img src="command/chap2/spider.png" alt="another spider" /></p>
52+<p>The moon: <img src="command/chap1/../../lalune.jpg" alt="moon" /></p>
53+<p>Link to <a href="command/chap1/spider.png">spider picture</a>.</p>
54+<p>URL left alone: <a href="https://pandoc.org/MANUAL.html">manual</a>.</p>
55+<p>Absolute path left alone: <a href="/foo/bar/baz.png">absolute</a>.</p>
56+<p>Link to fragment: <a href="#chapter-two">chapter two</a>.</p>
57+<p>Empty path: <a href="">empty</a>.</p>
58+<h1>Chapter two</h1>
59+<p>A spider: <img src="command/chap2/spider.png" alt="spider" /></p>
60+```
test/command/3792.md+1−1
@@ -6,7 +6,7 @@ and properly escaped.
6ok
6ok
7^D
7^D
8---
8---
9−title: \<this\> \*that\*
9+title: \<this> \*that\*
10---
10---
11
11
12ok
12ok
test/command/4063.mdnew file+29
@@ -0,0 +1,29 @@
1+```
2+% pandoc -f html -t native
3+<table>
4+<colgroup>
5+ <col width="30%" />
6+ <col width="*" />
7+</colgroup>
8+<tr>
9+ <td>1</td>
10+ <td>2</td>
11+</tr>
12+</table>
13+^D
14+[Table ("",[],[]) (Caption Nothing
15+ [])
16+ [(AlignDefault,ColWidth 0.3)
17+ ,(AlignDefault,ColWidth 0.7)]
18+ (TableHead ("",[],[])
19+ [])
20+ [(TableBody ("",[],[]) (RowHeadColumns 0)
21+ []
22+ [Row ("",[],[])
23+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
24+ [Plain [Str "1"]]
25+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
26+ [Plain [Str "2"]]]])]
27+ (TableFoot ("",[],[])
28+ [])]
29+```
test/command/4164.md+1−1
@@ -26,6 +26,6 @@ Here is inline html:
26
26
27Here is inline html:
27Here is inline html:
28
28
29−\<div\> \<balise\> bla bla \</div\>
29+\<div> \<balise> bla bla \</div>
30
30
31```
31```
test/command/4442.md+1−1
@@ -5,5 +5,5 @@
5^D
5^D
6\newcommand{\myFruit}{Mango\xspace}
6\newcommand{\myFruit}{Mango\xspace}
7
7
8−Mango\xspace is the king of fruits.
8+Mango is the king of fruits.
9```
9```
test/command/4465.mdnew file+15
@@ -0,0 +1,15 @@
1+```
2+% pandoc -f html -t markdown
3+<ol>
4+ <li>An ordered list can contain block-level elements ind html, it means that divs are also allowed.</li>
5+ <li>Let's see the problem! <div class="example">This is an example.</div></li>
6+</ol>
7+^D
8+1. An ordered list can contain block-level elements ind html, it means
9+ that divs are also allowed.
10+2. Let\'s see the problem!
11+
12+ ::: example
13+ This is an example.
14+ :::
15+```
test/command/5367.md+6−2
@@ -24,11 +24,15 @@ hello\footnote{doc footnote}
24 >{\centering\arraybackslash}p{(\columnwidth - 0\tabcolsep) * \real{0.17}}@{}}
24 >{\centering\arraybackslash}p{(\columnwidth - 0\tabcolsep) * \real{0.17}}@{}}
25\caption[Sample table.]{Sample table.\footnote{caption footnote}}\tabularnewline
25\caption[Sample table.]{Sample table.\footnote{caption footnote}}\tabularnewline
26\toprule
26\toprule
27+\begin{minipage}[b]{\linewidth}\centering
27−Fruit\footnote{header footnote} \\
28+Fruit\footnote{header footnote}
29+\end{minipage} \\
28\midrule
30\midrule
29\endfirsthead
31\endfirsthead
30\toprule
32\toprule
33+\begin{minipage}[b]{\linewidth}\centering
31−Fruit{} \\
34+Fruit{}
35+\end{minipage} \\
32\midrule
36\midrule
33\endhead
37\endhead
34Bans\footnote{table cell footnote} \\
38Bans\footnote{table cell footnote} \\
test/command/6026.mdnew file+19
@@ -0,0 +1,19 @@
1+```
2+% pandoc -t native
3+@{https://openreview.net/forum?id=HkwoSDPgg}
4+
5+@https://openreview.net/forum?id=HkwoSDPgg
6+^D
7+[Para [Cite [Citation {citationId = "https://openreview.net/forum?id=HkwoSDPgg", citationPrefix = [], citationSuffix = [], citationMode = AuthorInText, citationNoteNum = 1, citationHash = 0}] [Str "@https://openreview.net/forum?id=HkwoSDPgg"]]
8+,Para [Cite [Citation {citationId = "https://openreview.net/forum?id", citationPrefix = [], citationSuffix = [], citationMode = AuthorInText, citationNoteNum = 2, citationHash = 0}] [Str "@https://openreview.net/forum?id"],Str "=HkwoSDPgg"]]
9+```
10+```
11+% pandoc -t markdown
12+@{https://openreview.net/forum?id=HkwoSDPgg}
13+
14+@https://openreview.net/forum?id=HkwoSDPgg
15+^D
16+@{https://openreview.net/forum?id=HkwoSDPgg}
17+
18+@https://openreview.net/forum?id=HkwoSDPgg
19+```
test/command/6541.mdnew file+27
@@ -0,0 +1,27 @@
1+```
2+% pandoc -f docbook -t markdown -s
3+<?xml version="1.0"?>
4+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
5+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
6+<book>
7+
8+<bookinfo>
9+<title>Title</title>
10+<author>
11+<firstname>Firstname</firstname><surname>Lastname</surname>
12+</author>
13+<releaseinfo>1.17</releaseinfo>
14+</bookinfo>
15+
16+<para>Text.</para>
17+
18+</book>
19+^D
20+---
21+author: Firstname Lastname
22+releaseinfo: 1.17
23+title: Title
24+---
25+
26+Text.
27+```
test/command/6620.md+3
@@ -7,9 +7,12 @@
7\SI{0.135(21)}{\m}
7\SI{0.135(21)}{\m}
8
8
9\SI{12.3(60)}{\m}
9\SI{12.3(60)}{\m}
10+
11+\SI{10.0 \pm 3.3}{\ms}
10^D
12^D
11<p>23 ± 2 m</p>
13<p>23 ± 2 m</p>
12<p>125 ± 12 m</p>
14<p>125 ± 12 m</p>
13<p>0.135 ± 0.021 m</p>
15<p>0.135 ± 0.021 m</p>
14<p>12.3 ± 6 m</p>
16<p>12.3 ± 6 m</p>
17+<p>10.0 ± 3.3 ms</p>
15```
18```
test/command/6658.mdnew file+75
@@ -0,0 +1,75 @@
1+```
2+pandoc -f latex -t html
3+\num{12345,67890}
4+
5+\num{1+-2i}
6+
7+\num{.3e45}
8+
9+\num{1.654 x 2.34 x 3.430}
10+
11+\si{kg.m.s^{-1}}
12+
13+\si{\kilogram\metre\per\second}
14+
15+\si[per-mode=symbol]{\kilogram\metre\per\second}
16+
17+\si[per-mode=symbol]{\kilogram\metre\per\ampere\per\second}
18+
19+\numlist{10;20;30}
20+
21+\SIlist{0.13;0.67;0.80}{\milli\metre}
22+
23+\numrange{10}{20}
24+
25+\SIrange{0.13}{0.67}{\milli\metre}
26+
27+\ang{10}
28+
29+\ang{1;2;3}
30+
31+\ang{;;1}
32+
33+\ang{+10;;}
34+
35+\ang{-0;1;}
36+
37+\si{kg.m/s^2}
38+
39+\si{g_{polymer}~mol_{cat}.s^{-1}}
40+
41+\si{\kilo\gram\metre\per\square\second}
42+
43+\si{\gram\per\cubic\centi\metre}
44+
45+\si{\square\volt\cubic\lumen\per\farad}
46+
47+\si{\metre\squared\per\gray\cubic\lux}
48+
49+\si{\henry\second}
50+^D
51+<p>12345.67890</p>
52+<p>1 ± 2i</p>
53+<p>0.3 × 10<sup>45</sup></p>
54+<p>1.654 × 2.34 × 3.430</p>
55+<p>kg m s<sup>−1</sup></p>
56+<p>kg m s<sup>−1</sup></p>
57+<p>kg m/s</p>
58+<p>kg m/A/s</p>
59+<p>10, 20, &amp; 30</p>
60+<p>0.13 mm, 0.67 mm, &amp; 0.80 mm</p>
61+<p>10–20</p>
62+<p>0.13 mm–0.67 mm</p>
63+<p>10°</p>
64+<p>1°2′3″</p>
65+<p>1″</p>
66+<p>10°</p>
67+<p>-0°1′</p>
68+<p>kg m/s<sup>2</sup></p>
69+<p>g<sub>polymer</sub> mol<sub>cat</sub> s<sup>−1</sup></p>
70+<p>kg m s<sup>−2</sup></p>
71+<p>g cm<sup>−3</sup></p>
72+<p>V<sup>2</sup> lm<sup>3</sup> F<sup>−1</sup></p>
73+<p>m<sup>2</sup> Gy<sup>−1</sup> lx<sup>3</sup></p>
74+<p>H s</p>
75+```
test/command/6890.md+2−2
@@ -23,12 +23,12 @@ references:
23
23
24@fruchtel-sozialer-2013a
24@fruchtel-sozialer-2013a
25
25
26−Some text [^1].
26+Some text.[^1]
27
27
28[^1]: @fruchtel-sozialer-2013a
28[^1]: @fruchtel-sozialer-2013a
29^D
29^D
30[Para [Cite [Citation {citationId = "fruchtel-sozialer-2013a", citationPrefix = [], citationSuffix = [], citationMode = AuthorInText, citationNoteNum = 1, citationHash = 0}] [Str "Fr\252chtel,",Space,Str "Budde,",Space,Str "and",Space,Str "Cyprian",Space,Str "(2013)"]]
30[Para [Cite [Citation {citationId = "fruchtel-sozialer-2013a", citationPrefix = [], citationSuffix = [], citationMode = AuthorInText, citationNoteNum = 1, citationHash = 0}] [Str "Fr\252chtel,",Space,Str "Budde,",Space,Str "and",Space,Str "Cyprian",Space,Str "(2013)"]]
31−,Para [Str "Some",Space,Str "text",Str ".",Note [Para [Cite [Citation {citationId = "fruchtel-sozialer-2013a", citationPrefix = [], citationSuffix = [], citationMode = AuthorInText, citationNoteNum = 2, citationHash = 0}] [Str "Fr\252chtel,",Space,Str "Budde,",Space,Str "and",Space,Str "Cyprian",Space,Str "(2013)"]]],Str ""]
31+,Para [Str "Some",Space,Str "text.",Note [Para [Cite [Citation {citationId = "fruchtel-sozialer-2013a", citationPrefix = [], citationSuffix = [], citationMode = AuthorInText, citationNoteNum = 2, citationHash = 0}] [Str "Fr\252chtel,",Space,Str "Budde,",Space,Str "and",Space,Str "Cyprian",Space,Str "(2013)"]]]]
32,Div ("refs",["references","csl-bib-body","hanging-indent"],[])
32,Div ("refs",["references","csl-bib-body","hanging-indent"],[])
33 [Div ("ref-fruchtel-sozialer-2013a",["csl-entry"],[])
33 [Div ("ref-fruchtel-sozialer-2013a",["csl-entry"],[])
34 [Para [Str "Fr\252chtel,",Space,Str "Frank,",Space,Str "Wolfgang",Space,Str "Budde,",Space,Str "and",Space,Str "Gudrun",Space,Str "Cyprian.",Space,Str "2013.",Space,Emph [Str "Sozialer",Space,Str "Raum",Space,Str "und",Space,Str "Soziale",Space,Str "Arbeit",Space,Str "Fieldbook:",Space,Str "Methoden",Space,Str "und",Space,Str "Techniken"],Str ".",Space,Str "3rd",Space,Str "ed.",Space,Str "Wiesbaden,",Space,Str "Germany:",Space,Str "Springer",Space,Str "VS."]]]]
34 [Para [Str "Fr\252chtel,",Space,Str "Frank,",Space,Str "Wolfgang",Space,Str "Budde,",Space,Str "and",Space,Str "Gudrun",Space,Str "Cyprian.",Space,Str "2013.",Space,Emph [Str "Sozialer",Space,Str "Raum",Space,Str "und",Space,Str "Soziale",Space,Str "Arbeit",Space,Str "Fieldbook:",Space,Str "Methoden",Space,Str "und",Space,Str "Techniken"],Str ".",Space,Str "3rd",Space,Str "ed.",Space,Str "Wiesbaden,",Space,Str "Germany:",Space,Str "Springer",Space,Str "VS."]]]]
test/command/6958.mdnew file+10
@@ -0,0 +1,10 @@
1+Add thin space between single and double quotes.
2+```
3+% pandoc -t latex+smart
4+---
5+lang: en-GB
6+---
7+'["On the Outside"]{}: Constructing Cycling Citizenship.'
8+^D
9+`\,{``On the Outside''}: Constructing Cycling Citizenship.'
10+```
test/command/7099.md+1−1
@@ -11,7 +11,7 @@
11<iframe src="h:invalid@url"></iframe>
11<iframe src="h:invalid@url"></iframe>
12^D
12^D
13[INFO] Fetching h:invalid@url...
13[INFO] Fetching h:invalid@url...
14−[WARNING] Could not fetch resource 'h:invalid@url': Could not fetch h:invalid@url
14+[WARNING] Could not fetch resource h:invalid@url: Could not fetch h:invalid@url
15 InvalidUrlException "h:invalid@url" "Invalid scheme"
15 InvalidUrlException "h:invalid@url" "Invalid scheme"
16[INFO] Skipped '<iframe src="h:invalid@url"></iframe>' at input line 1 column 29
16[INFO] Skipped '<iframe src="h:invalid@url"></iframe>' at input line 1 column 29
17[]
17[]
test/command/7208.md+1−1
@@ -2,5 +2,5 @@
2% pandoc -t gfm
2% pandoc -t gfm
3\<hi\>
3\<hi\>
4^D
4^D
5−\<hi\>
5+\<hi>
6```
6```
test/command/7272.md+4−1
@@ -18,7 +18,10 @@
18 >{\raggedright\arraybackslash}p{(\columnwidth - 0\tabcolsep) * \real{1.00}}@{}}
18 >{\raggedright\arraybackslash}p{(\columnwidth - 0\tabcolsep) * \real{1.00}}@{}}
19\toprule
19\toprule
20\endhead
20\endhead
21−{\vtop{\hbox{\strut text}\hbox{\strut text2 }}} \\
21+\begin{minipage}[t]{\linewidth}\raggedright
22+{ text\\
23+text2 }\strut
24+\end{minipage} \\
22\bottomrule
25\bottomrule
23\end{longtable}
26\end{longtable}
24```
27```
test/command/7278.mdnew file+38
@@ -0,0 +1,38 @@
1+```
2+% pandoc -t beamer
3+# Slide
4+
5+Some blocks:
6+
7+## example block title {.example}
8+
9+text in block
10+
11+## alert block title {.alert}
12+
13+text in block
14+
15+## block title
16+
17+text in block
18+^D
19+\begin{frame}{Slide}
20+\protect\hypertarget{slide}{}
21+Some blocks:
22+
23+\begin{exampleblock}{example block title}
24+\protect\hypertarget{example-block-title}{}
25+text in block
26+\end{exampleblock}
27+
28+\begin{alertblock}{alert block title}
29+\protect\hypertarget{alert-block-title}{}
30+text in block
31+\end{alertblock}
32+
33+\begin{block}{block title}
34+\protect\hypertarget{block-title}{}
35+text in block
36+\end{block}
37+\end{frame}
38+```
test/command/7282.mdnew file+7
@@ -0,0 +1,7 @@
1+Don't crash on unmatched closing tag.
2+```
3+% pandoc -f html -t native
4+</script>
5+^D
6+[]
7+```
test/command/7288.mdnew file+40
@@ -0,0 +1,40 @@
1+```
2+% pandoc -f rst -t ms
3+.. list-table::
4+ :widths: 50 50
5+ :header-rows: 1
6+
7+ * - Left
8+ - Right
9+ * - Long text that should be easy to break up into multiple lines
10+ - Another long text that should be easy to break up into multiple lines
11+
12+ Bar
13+^D
14+.PP
15+.na
16+.nr LLold \n[LL]
17+.TS
18+delim(@@) tab( );
19+lw(35.0n) lw(35.0n).
20+T{
21+Left
22+T} T{
23+Right
24+T}
25+_
26+T{
27+.nr LL 35.0n
28+.LP
29+Long text that should be easy to break up into multiple lines
30+T} T{
31+.nr LL 35.0n
32+.PP
33+Another long text that should be easy to break up into multiple lines
34+.PP
35+Bar
36+T}
37+.TE
38+.nr LL \n[LLold]
39+.ad
40+```
test/command/7299.mdnew file+23
@@ -0,0 +1,23 @@
1+```
2+% pandoc -f latex -t plain
3+$1-{\ensuremath{r}\xspace}$
4+^D
5+1 − r
6+```
7+
8+```
9+% pandoc -f latex -t plain
10+\newcommand{\foo}{Foo\xspace}
11+
12+$\text{\foo bar}$
13+^D
14+Foo bar
15+```
16+
17+```
18+% pandoc -f latex -t plain
19+a\xspace b
20+^D
21+a b
22+```
23+
test/command/7321.mdnew file+24
@@ -0,0 +1,24 @@
1+```
2+% pandoc -t plain --citeproc --wrap=none
3+---
4+references:
5+- id: fenner2012a
6+ title: One-click science marketing
7+ author:
8+ - family: Fenner
9+ given: Martin
10+ container-title: Nature Materials
11+ volume: 11
12+ issue: 4
13+ publisher: Nature Publishing Group
14+ type: article-journal
15+ issued:
16+ year: 2012
17+---
18+
19+[@fenner2012a, $a^2+b^2=c^2$]
20+^D
21+(Fenner 2012, a² + b² = c²)
22+
23+Fenner, Martin. 2012. “One-Click Science Marketing.” Nature Materials 11 (4).
24+```
test/command/7323.mdnew file+29
@@ -0,0 +1,29 @@
1+```
2+% pandoc --citeproc -t plain
3+---
4+references:
5+- id: smith
6+ author: John Smith
7+ issued: 2019
8+ title: Insects
9+ type: book
10+...
11+
12+@smith [chap. 6]
13+
14+@smith [chapter 6]
15+
16+@smith [Chap. 6]
17+
18+@smith [Chapter 6]
19+^D
20+John Smith (2019, chap. 6)
21+
22+John Smith (2019, chap. 6)
23+
24+John Smith (2019, chap. 6)
25+
26+John Smith (2019, chap. 6)
27+
28+John Smith. 2019. Insects.
29+```
test/command/7324.mdnew file+25
@@ -0,0 +1,25 @@
1+```
2+% pandoc --citeproc -t plain
3+---
4+references:
5+- id: smith
6+ author: John Smith
7+ issued: 2019
8+ title: Insects
9+ type: book
10+...
11+
12+@smith [, among others]
13+
14+@smith [ among others]
15+
16+@smith [among others]
17+^D
18+John Smith (2019, among others)
19+
20+John Smith (2019 among others)
21+
22+John Smith (2019, among others)
23+
24+John Smith. 2019. Insects.
25+```
test/command/7339.mdnew file+11
@@ -0,0 +1,11 @@
1+```
2+% pandoc -f gfm -s -t native
3+---
4+title: Test
5+---
6+
7+Hi
8+^D
9+Pandoc (Meta {unMeta = fromList [("title",MetaInlines [Str "Test"])]})
10+[Para [Str "Hi"]]
11+```
test/command/7340.mdnew file+6
@@ -0,0 +1,6 @@
1+```
2+% pandoc -f latex -t native
3+\(*\)
4+^D
5+[Para [Math InlineMath "*"]]
6+```
test/command/7376.mdnew file+16
@@ -0,0 +1,16 @@
1+```
2+% pandoc --citeproc -t plain
3+---
4+references:
5+- id: item1
6+ type: book
7+ author:
8+ - family: Doe
9+ given: Jane
10+ issued: 2020
11+ title: The title
12+...
13+^D
14+
15+
16+```
test/command/7394.mdnew file+85
@@ -0,0 +1,85 @@
1+```
2+% pandoc -f markdown -t plain --citeproc
3+---
4+csl: command/chicago-fullnote-bibliography.csl
5+references:
6+- author:
7+ - family: Wandt
8+ given: Manfred
9+ edition: 6
10+ id: wandt2014ges-sv
11+ issued: 2014
12+ publisher: Franz Vahlen
13+ publisher-place: München
14+ title: Gesetzliche schuldverhältnisse
15+ title-short: Gesetzl SV
16+ type: book
17+- author:
18+ - family: Smith
19+ given: Zenda
20+ edition: 6
21+ id: smith2015
22+ issued: 2015
23+ publisher: Macmillan
24+ publisher-place: New York
25+ title: A verb and a noun
26+ type: book
27+---
28+
29+Hi^[@wandt2014ges-sv.].
30+
31+Hi^[[@wandt2014ges-sv].].
32+
33+Hi^[[See also @wandt2014ges-sv].].
34+
35+Hi^[See also @wandt2014ges-sv.].
36+
37+Hi^[@wandt2014ges-sv [@smith2015].].
38+
39+Hi^[[@wandt2014ges-sv; @smith2015].].
40+
41+Hi [@wandt2014ges-sv].
42+
43+Hi [see also @wandt2014ges-sv].
44+
45+^D
46+Hi[1].
47+
48+Hi[2].
49+
50+Hi[3].
51+
52+Hi[4].
53+
54+Hi[5].
55+
56+Hi[6].
57+
58+Hi.[7]
59+
60+Hi.[8]
61+
62+Smith, Zenda. A Verb and a Noun. 6th ed. New York: Macmillan, 2015.
63+
64+Wandt, Manfred. Gesetzliche Schuldverhältnisse. 6th ed. München: Franz
65+Vahlen, 2014.
66+
67+[1] Manfred Wandt, Gesetzliche Schuldverhältnisse, 6th ed. (München:
68+Franz Vahlen, 2014).
69+
70+[2] Wandt.
71+
72+[3] See also Wandt.
73+
74+[4] See also Wandt.
75+
76+[5] Wandt, Zenda Smith, A Verb and a Noun, 6th ed. (New York: Macmillan,
77+2015).
78+
79+[6] Wandt, Gesetzl SV; Smith, A Verb and a Noun.
80+
81+[7] Wandt, Gesetzl SV.
82+
83+[8] See also Wandt.
84+```
85+
test/command/7397.mdnew file+14
@@ -0,0 +1,14 @@
1+````
2+% pandoc -t markdown
3+~~~~ { .haskell startFrom="100"}
4+qsort [] = []
5+qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++
6+ qsort (filter (>= x) xs)
7+~~~~
8+^D
9+``` {.haskell startFrom="100"}
10+qsort [] = []
11+qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++
12+ qsort (filter (>= x) xs)
13+```
14+````
test/command/7400.mdnew file+9
@@ -0,0 +1,9 @@
1+```
2+% pandoc -t native -s
3+---
4+# Comment only
5+...
6+^D
7+Pandoc (Meta {unMeta = fromList []})
8+[]
9+```
test/command/7416.mdnew file+19
@@ -0,0 +1,19 @@
1+```
2+% pandoc -f markdown -t html
3+![caption](../media/rId25.jpg "title"){alt="alt"}
4+
5+^D
6+<figure>
7+<img src="../media/rId25.jpg" title="title" alt="alt" /><figcaption>caption</figcaption>
8+</figure>
9+```
10+
11+```
12+% pandoc -f markdown -t html
13+![caption](../media/rId25.jpg "title")
14+
15+^D
16+<figure>
17+<img src="../media/rId25.jpg" title="title" alt="caption" /><figcaption aria-hidden="true">caption</figcaption>
18+</figure>
19+```
test/command/averroes.bibnew file+95
@@ -0,0 +1,95 @@
1+@string{anch-ie = {Angew.~Chem. Int.~Ed.}}
2+@string{cup = {Cambridge University Press}}
3+@string{dtv = {Deutscher Taschenbuch-Verlag}}
4+@string{hup = {Harvard University Press}}
5+@string{jams = {J.~Amer. Math. Soc.}}
6+@string{jchph = {J.~Chem. Phys.}}
7+@string{jomch = {J.~Organomet. Chem.}}
8+@string{pup = {Princeton University Press}}
9+
10+@book{averroes/bland,
11+ author = {Averroes},
12+ title = {The Epistle on the Possibility of Conjunction with the Active
13+ Intellect by {Ibn Rushd} with the Commentary of {Moses Narboni}},
14+ date = 1982,
15+ editor = {Bland, Kalman P.},
16+ translator = {Bland, Kalman P.},
17+ series = {Moreshet: Studies in {Jewish} History, Literature and Thought},
18+ number = 7,
19+ publisher = {Jewish Theological Seminary of America},
20+ location = {New York},
21+ keywords = {primary},
22+ langid = {english},
23+ langidopts = {variant=american},
24+ indextitle = {Epistle on the Possibility of Conjunction, The},
25+ shorttitle = {Possibility of Conjunction},
26+ annotation = {A \texttt{book} entry with a \texttt{series} and a
27+ \texttt{number}. Note the concatenation of the \texttt{editor}
28+ and \texttt{translator} fields as well as the
29+ \texttt{indextitle} field},
30+}
31+
32+@book{averroes/hannes,
33+ author = {Averroes},
34+ title = {Des Averro{\"e}s Abhandlung: \mkbibquote{{\"U}ber die
35+ M{\"o}glichkeit der Conjunktion} oder \mkbibquote{{\"U}ber den
36+ materiellen Intellekt}},
37+ date = 1892,
38+ editor = {Hannes, Ludwig},
39+ translator = {Hannes, Ludwig},
40+ annotator = {Hannes, Ludwig},
41+ publisher = {C.~A. Kaemmerer},
42+ location = {Halle an der Saale},
43+ keywords = {primary},
44+ langid = {german},
45+ sorttitle = {Uber die Moglichkeit der Conjunktion},
46+ indexsorttitle= {Uber die Moglichkeit der Conjunktion},
47+ indextitle = {{\"U}ber die M{\"o}glichkeit der Conjunktion},
48+ shorttitle = {{\"U}ber die M{\"o}glichkeit der Conjunktion},
49+ annotation = {An annotated edition. Note the concatenation of the
50+ \texttt{editor}, \texttt{translator}, and \texttt{annotator}
51+ fields. Also note the \texttt{shorttitle},
52+ \texttt{indextitle}, \texttt{sorttitle}, and
53+ \texttt{indexsorttitle} fields},
54+}
55+
56+@book{averroes/hercz,
57+ author = {Averroes},
58+ title = {Drei Abhandlungen {\"u}ber die Conjunction des separaten
59+ Intellects mit dem Menschen},
60+ date = 1869,
61+ editor = {Hercz, J.},
62+ translator = {Hercz, J.},
63+ publisher = {S.~Hermann},
64+ location = {Berlin},
65+ keywords = {primary},
66+ langid = {german},
67+ indexsorttitle= {Drei Abhandlungen uber die Conjunction},
68+ indextitle = {Drei Abhandlungen {\"u}ber die Conjunction},
69+ subtitle = {Von Averroes (Vater und Sohn), aus dem Arabischen
70+ {\"u}bersetzt von Samuel Ibn Tibbon},
71+ shorttitle = {Drei Abhandlungen},
72+ annotation = {A \texttt{book} entry. Note the concatenation of the
73+ \texttt{editor} and \texttt{translator} fields as well as the
74+ \texttt{indextitle} and \texttt{indexsorttitle} fields},
75+}
76+
77+@book{cicero,
78+ author = {Cicero, Marcus Tullius},
79+ title = {De natura deorum. {\"U}ber das Wesen der G{\"o}tter},
80+ date = 1995,
81+ editor = {Blank-Sangmeister, Ursula},
82+ translator = {Blank-Sangmeister, Ursula},
83+ afterword = {Thraede, Klaus},
84+ language = {langlatin and langgerman},
85+ publisher = {Reclam},
86+ location = {Stuttgart},
87+ langid = {german},
88+ indextitle = {De natura deorum},
89+ shorttitle = {De natura deorum},
90+ annotation = {A bilingual edition of Cicero's \emph{De natura deorum}, with
91+ a German translation. Note the format of the \texttt{language}
92+ field in the database file, the concatenation of the
93+ \texttt{editor} and \texttt{translator} fields, and the
94+ \texttt{afterword} field},
95+}
test/command/biblatex-basic.md+5−3
@@ -1,3 +1,5 @@
1+```
2+% pandoc -f biblatex -t markdown -s
1@Book{item1,
3@Book{item1,
2author="John Doe",
4author="John Doe",
3title="First Book",
5title="First Book",
@@ -27,7 +29,7 @@ year="2007"
27
29
28^D
30^D
29---
31---
30−nocite: '[@*]'
32+nocite: "[@*]"
31references:
33references:
32- author:
34- author:
33 - family: Doe
35 - family: Doe
@@ -44,9 +46,9 @@ references:
44 container-title: Journal of Generic Studies
46 container-title: Journal of Generic Studies
45 id: item2
47 id: item2
46 issued: 2006
48 issued: 2006
47− page: '33-34'
49+ page: 33-34
48 title: Article
50 title: Article
49− type: 'article-journal'
51+ type: article-journal
50 volume: 6
52 volume: 6
51- author:
53- author:
52 - family: Doe
54 - family: Doe
test/command/biblatex-examples.bibdeleted−1674
@@ -1,1674 +0,0 @@
1−@string{anch-ie = {Angew.~Chem. Int.~Ed.}}
2−@string{cup = {Cambridge University Press}}
3−@string{dtv = {Deutscher Taschenbuch-Verlag}}
4−@string{hup = {Harvard University Press}}
5−@string{jams = {J.~Amer. Math. Soc.}}
6−@string{jchph = {J.~Chem. Phys.}}
7−@string{jomch = {J.~Organomet. Chem.}}
8−@string{pup = {Princeton University Press}}
9−
10−@incollection{westfahl:space,
11− author = {Westfahl, Gary},
12− title = {The True Frontier},
13− subtitle = {Confronting and Avoiding the Realities of Space in {American}
14− Science Fiction Films},
15− pages = {55-65},
16− crossref = {westfahl:frontier},
17− langid = {english},
18− langidopts = {variant=american},
19− indextitle = {True Frontier, The},
20− annotation = {A cross-referenced article from a \texttt{collection}. This is
21− an \texttt{incollection} entry with a \texttt{crossref}
22− field. Note the \texttt{subtitle} and \texttt{indextitle}
23− fields},
24−}
25−
26−@set{set,
27− entryset = {herrmann,aksin,yoon},
28− annotation = {A \texttt{set} with three members. The \texttt{crossref} field
29− in the \texttt{@set} entry and the \texttt{entryset} field in
30− each set member entry is needed only when using BibTeX as the
31− backend},
32−}
33−
34−@set{stdmodel,
35− entryset = {glashow,weinberg,salam},
36− annotation = {A \texttt{set} with three members discussing the standard
37− model of particle physics. The \texttt{crossref} field
38− in the \texttt{@set} entry and the \texttt{entryset} field in
39− each set member entry is needed only when using BibTeX as the
40− backend},
41−}
42−
43−@article{aksin,
44− author = {Aks{\i}n, {\"O}zge and T{\"u}rkmen, Hayati and Artok, Levent
45− and {\c{C}}etinkaya, Bekir and Ni, Chaoying and
46− B{\"u}y{\"u}kg{\"u}ng{\"o}r, Orhan and {\"O}zkal, Erhan},
47− title = {Effect of immobilization on catalytic characteristics of
48− saturated {Pd-N}-heterocyclic carbenes in {Mizoroki-Heck}
49− reactions},
50− journaltitle = jomch,
51− date = 2006,
52− volume = 691,
53− number = 13,
54− pages = {3027-3036},
55− indextitle = {Effect of immobilization on catalytic characteristics},
56−}
57−
58−@article{angenendt,
59− author = {Angenendt, Arnold},
60− title = {In Honore Salvatoris~-- Vom Sinn und Unsinn der
61− Patrozinienkunde},
62− journaltitle = {Revue d'Histoire Eccl{\'e}siastique},
63− date = 2002,
64− volume = 97,
65− pages = {431--456, 791--823},
66− langid = {german},
67− indextitle = {In Honore Salvatoris},
68− shorttitle = {In Honore Salvatoris},
69− annotation = {A German article in a French journal. Apart from that, a
70− typical \texttt{article} entry. Note the \texttt{indextitle}
71− field},
72−}
73−
74−@article{baez/article,
75− author = {Baez, John C. and Lauda, Aaron D.},
76− title = {Higher-Dimensional Algebra {V}: 2-Groups},
77− journaltitle = {Theory and Applications of Categories},
78− date = 2004,
79− volume = 12,
80− pages = {423-491},
81− version = 3,
82− eprint = {math/0307200v3},
83− eprinttype = {arxiv},
84− langid = {english},
85− langidopts = {variant=american},
86− annotation = {An \texttt{article} with \texttt{eprint} and
87− \texttt{eprinttype} fields. Note that the arXiv reference is
88− transformed into a clickable link if \texttt{hyperref} support
89− has been enabled. Compare \texttt{baez\slash online}, which
90− is the same item given as an \texttt{online} entry},
91−}
92−
93−@article{bertram,
94− author = {Bertram, Aaron and Wentworth, Richard},
95− title = {Gromov invariants for holomorphic maps on {Riemann} surfaces},
96− journaltitle = jams,
97− date = 1996,
98− volume = 9,
99− number = 2,
100− pages = {529-571},
101− langid = {english},
102− langidopts = {variant=american},
103− shorttitle = {Gromov invariants},
104− annotation = {An \texttt{article} entry with a \texttt{volume} and a
105− \texttt{number} field},
106−}
107−
108−@article{doody,
109− author = {Doody, Terrence},
110− title = {Hemingway's Style and {Jake's} Narration},
111− year = 1974,
112− volume = 4,
113− number = 3,
114− pages = {212-225},
115− langid = {english},
116− langidopts = {variant=american},
117− related = {matuz:doody},
118− relatedstring= {\autocap{e}xcerpt in},
119− journal = {The Journal of Narrative Technique},
120− annotation = {An \texttt{article} entry cited as an excerpt from a
121− \texttt{collection} entry. Note the format of the
122− \texttt{related} and \texttt{relatedstring} fields},
123−}
124−
125−@collection{matuz:doody,
126− editor = {Matuz, Roger},
127− title = {Contemporary Literary Criticism},
128− year = 1990,
129− volume = 61,
130− publisher = {Gale},
131− location = {Detroit},
132− pages = {204-208},
133− langid = {english},
134− langidopts = {variant=american},
135− annotation = {A \texttt{collection} entry providing the excerpt information
136− for the \texttt{doody} entry. Note the format of the
137− \texttt{pages} field},
138−}
139−
140−@article{gillies,
141− author = {Gillies, Alexander},
142− title = {Herder and the Preparation of {Goethe's} Idea of World
143− Literature},
144− journaltitle = {Publications of the English Goethe Society},
145− date = 1933,
146− series = {newseries},
147− volume = 9,
148− pages = {46-67},
149− langid = {english},
150− langidopts = {variant=british},
151− annotation = {An \texttt{article} entry with a \texttt{series} and a
152− \texttt{volume} field. Note that format of the \texttt{series}
153− field in the database file},
154−}
155−
156−@article{glashow,
157− author = {Glashow, Sheldon},
158− title = {Partial Symmetries of Weak Interactions},
159− journaltitle = {Nucl.~Phys.},
160− date = 1961,
161− volume = 22,
162− pages = {579-588},
163−}
164−
165−@article{herrmann,
166− author = {Herrmann, Wolfgang A. and {\"O}fele, Karl and Schneider,
167− Sabine K. and Herdtweck, Eberhardt and Hoffmann, Stephan D.},
168− title = {A carbocyclic carbene as an efficient catalyst ligand for {C--C}
169− coupling reactions},
170− journaltitle = anch-ie,
171− date = 2006,
172− volume = 45,
173− number = 23,
174− pages = {3859-3862},
175− indextitle = {Carbocyclic carbene as an efficient catalyst, A},
176−}
177−
178−@article{kastenholz,
179− author = {Kastenholz, M. A. and H{\"u}nenberger, Philippe H.},
180− title = {Computation of methodology\hyphen independent ionic solvation
181− free energies from molecular simulations},
182− journaltitle = jchph,
183− date = 2006,
184− subtitle = {{I}. {The} electrostatic potential in molecular liquids},
185− volume = 124,
186− eid = 124106,
187− doi = {10.1063/1.2172593},
188− langid = {english},
189− langidopts = {variant=american},
190− indextitle = {Computation of ionic solvation free energies},
191− annotation = {An \texttt{article} entry with an \texttt{eid} and a
192− \texttt{doi} field. Note that the \textsc{doi} is transformed
193− into a clickable link if \texttt{hyperref} support has been
194− enabled},
195− abstract = {The computation of ionic solvation free energies from
196− atomistic simulations is a surprisingly difficult problem that
197− has found no satisfactory solution for more than 15 years. The
198− reason is that the charging free energies evaluated from such
199− simulations are affected by very large errors. One of these is
200− related to the choice of a specific convention for summing up
201− the contributions of solvent charges to the electrostatic
202− potential in the ionic cavity, namely, on the basis of point
203− charges within entire solvent molecules (M scheme) or on the
204− basis of individual point charges (P scheme). The use of an
205− inappropriate convention may lead to a charge-independent
206− offset in the calculated potential, which depends on the
207− details of the summation scheme, on the quadrupole-moment
208− trace of the solvent molecule, and on the approximate form
209− used to represent electrostatic interactions in the
210− system. However, whether the M or P scheme (if any) represents
211− the appropriate convention is still a matter of on-going
212− debate. The goal of the present article is to settle this
213− long-standing controversy by carefully analyzing (both
214− analytically and numerically) the properties of the
215− electrostatic potential in molecular liquids (and inside
216− cavities within them).},
217−}
218−
219−@article{murray,
220− author = {Hostetler, Michael J. and Wingate, Julia E. and Zhong,
221− Chuan-Jian and Harris, Jay E. and Vachet, Richard W. and
222− Clark, Michael R. and Londono, J. David and Green, Stephen
223− J. and Stokes, Jennifer J. and Wignall, George D. and Glish,
224− Gary L. and Porter, Marc D. and Evans, Neal D. and Murray,
225− Royce W.},
226− title = {Alkanethiolate gold cluster molecules with core diameters from
227− 1.5 to 5.2~{nm}},
228− journaltitle = {Langmuir},
229− date = 1998,
230− subtitle = {Core and monolayer properties as a function of core size},
231− volume = 14,
232− number = 1,
233− pages = {17-30},
234− langid = {english},
235− langidopts = {variant=american},
236− indextitle = {Alkanethiolate gold cluster molecules},
237− shorttitle = {Alkanethiolate gold cluster molecules},
238− annotation = {An \texttt{article} entry with \arabic{author} authors. By
239− default, long author and editor lists are automatically
240− truncated. This is configurable},
241−}
242−
243−@article{reese,
244− author = {Reese, Trevor R.},
245− title = {Georgia in {Anglo-Spanish} Diplomacy, 1736--1739},
246− journaltitle = {William and Mary Quarterly},
247− date = 1958,
248− series = 3,
249− volume = 15,
250− pages = {168-190},
251− langid = {english},
252− langidopts = {variant=american},
253− annotation = {An \texttt{article} entry with a \texttt{series} and a
254− \texttt{volume} field. Note the format of the series. If the
255− value of the \texttt{series} field is an integer, this number
256− is printed as an ordinal and the string \enquote*{series} is
257− appended automatically},
258−}
259−
260−@article{sarfraz,
261− author = {M. Sarfraz and M. F. A. Razzak},
262− title = {Technical section: {An} algorithm for automatic capturing of
263− the font outlines},
264− year = 2002,
265− volume = 26,
266− number = 5,
267− pages = {795-804},
268− issn = {0097-8493},
269− journal = {Computers and Graphics},
270− annotation = {An \texttt{article} entry with an \texttt{issn} field},
271−}
272−
273−@article{shore,
274− author = {Shore, Bradd},
275− title = {Twice-Born, Once Conceived},
276− journaltitle = {American Anthropologist},
277− date = {1991-03},
278− subtitle = {Meaning Construction and Cultural Cognition},
279− series = {newseries},
280− volume = 93,
281− number = 1,
282− pages = {9-27},
283− annotation = {An \texttt{article} entry with \texttt{series},
284− \texttt{volume}, and \texttt{number} fields. Note the format
285− of the \texttt{series} which is a localization key},
286−}
287−
288−@article{sigfridsson,
289− author = {Sigfridsson, Emma and Ryde, Ulf},
290− title = {Comparison of methods for deriving atomic charges from the
291− electrostatic potential and moments},
292− journaltitle = {Journal of Computational Chemistry},
293− date = 1998,
294− volume = 19,
295− number = 4,
296− pages = {377-395},
297− doi = {10.1002/(SICI)1096-987X(199803)19:4<377::AID-JCC1>3.0.CO;2-P},
298− langid = {english},
299− langidopts = {variant=american},
300− indextitle = {Methods for deriving atomic charges},
301− annotation = {An \texttt{article} entry with \texttt{volume},
302− \texttt{number}, and \texttt{doi} fields. Note that the
303− \textsc{doi} is transformed into a clickable link if
304− \texttt{hyperref} support has been enabled},
305− abstract = {Four methods for deriving partial atomic charges from the
306− quantum chemical electrostatic potential (CHELP, CHELPG,
307− Merz-Kollman, and RESP) have been compared and critically
308− evaluated. It is shown that charges strongly depend on how and
309− where the potential points are selected. Two alternative
310− methods are suggested to avoid the arbitrariness in the
311− point-selection schemes and van der Waals exclusion radii:
312− CHELP-BOW, which also estimates the charges from the
313− electrostatic potential, but with potential points that are
314− Boltzmann-weighted after their occurrence in actual
315− simulations using the energy function of the program in which
316− the charges will be used, and CHELMO, which estimates the
317− charges directly from the electrostatic multipole
318− moments. Different criteria for the quality of the charges are
319− discussed.},
320−}
321−
322−@article{spiegelberg,
323− author = {Spiegelberg, Herbert},
324− title = {\mkbibquote{Intention} und \mkbibquote{Intentionalit{\"a}t} in
325− der Scholastik, bei Brentano und Husserl},
326− journaltitle = {Studia Philosophica},
327− date = 1969,
328− volume = 29,
329− pages = {189-216},
330− langid = {german},
331− sorttitle = {Intention und Intentionalitat in der Scholastik, bei Brentano
332− und Husserl},
333− indexsorttitle= {Intention und Intentionalitat in der Scholastik, bei Brentano
334− und Husserl},
335− shorttitle = {Intention und Intentionalit{\"a}t},
336− annotation = {An \texttt{article} entry. Note the \texttt{sorttitle} and
337− \texttt{indexsorttitle} fields and the markup of the quotes in
338− the database file},
339−}
340−
341−@article{springer,
342− author = {Springer, Otto},
343− title = {Mediaeval Pilgrim Routes from {Scandinavia} to {Rome}},
344− journaltitle = {Mediaeval Studies},
345− date = 1950,
346− volume = 12,
347− pages = {92-122},
348− langid = {english},
349− langidopts = {variant=british},
350− shorttitle = {Mediaeval Pilgrim Routes},
351− annotation = {A plain \texttt{article} entry},
352−}
353−
354−@article{weinberg,
355− author = {Weinberg, Steven},
356− title = {A Model of Leptons},
357− journaltitle = {Phys.~Rev.~Lett.},
358− date = 1967,
359− volume = 19,
360− pages = {1264-1266},
361−}
362−
363−@article{yoon,
364− author = {Yoon, Myeong S. and Ryu, Dowook and Kim, Jeongryul and Ahn,
365− Kyo Han},
366− title = {Palladium pincer complexes with reduced bond angle strain:
367− efficient catalysts for the {Heck} reaction},
368− journaltitle = {Organometallics},
369− date = 2006,
370− volume = 25,
371− number = 10,
372− pages = {2409-2411},
373− indextitle = {Palladium pincer complexes},
374−}
375−
376−@book{aristotle:anima,
377− author = {Aristotle},
378− title = {De Anima},
379− date = 1907,
380− editor = {Hicks, Robert Drew},
381− publisher = cup,
382− location = {Cambridge},
383− keywords = {primary},
384− langid = {english},
385− langidopts = {variant=british},
386− annotation = {A \texttt{book} entry with an \texttt{author} and an
387− \texttt{editor}},
388−}
389−
390−@book{aristotle:physics,
391− author = {Aristotle},
392− title = {Physics},
393− date = 1929,
394− translator = {Wicksteed, P. H. and Cornford, F. M.},
395− publisher = {G. P. Putnam},
396− location = {New York},
397− keywords = {primary},
398− langid = {english},
399− langidopts = {variant=american},
400− shorttitle = {Physics},
401− annotation = {A \texttt{book} entry with a \texttt{translator} field},
402−}
403−
404−@book{aristotle:poetics,
405− author = {Aristotle},
406− title = {Poetics},
407− date = 1968,
408− editor = {Lucas, D. W.},
409− series = {Clarendon {Aristotle}},
410− publisher = {Clarendon Press},
411− location = {Oxford},
412− keywords = {primary},
413− langid = {english},
414− langidopts = {variant=british},
415− shorttitle = {Poetics},
416− annotation = {A \texttt{book} entry with an \texttt{author} and an
417− \texttt{editor} as well as a \texttt{series} field},
418−}
419−
420−@book{aristotle:rhetoric,
421− author = {Aristotle},
422− title = {The Rhetoric of {Aristotle} with a commentary by the late {Edward
423− Meredith Cope}},
424− date = 1877,
425− editor = {Cope, Edward Meredith},
426− commentator = {Cope, Edward Meredith},
427− volumes = 3,
428− publisher = cup,
429− keywords = {primary},
430− langid = {english},
431− langidopts = {variant=british},
432− sorttitle = {Rhetoric of Aristotle},
433− indextitle = {Rhetoric of {Aristotle}, The},
434− shorttitle = {Rhetoric},
435− annotation = {A commented edition. Note the concatenation of the
436− \texttt{editor} and \texttt{commentator} fields as well as the
437− \texttt{volumes}, \texttt{sorttitle}, and \texttt{indextitle}
438− fields},
439−}
440−
441−@book{augustine,
442− author = {Augustine, Robert L.},
443− title = {Heterogeneous catalysis for the synthetic chemist},
444− date = 1995,
445− publisher = {Marcel Dekker},
446− location = {New York},
447− langid = {english},
448− langidopts = {variant=american},
449− shorttitle = {Heterogeneous catalysis},
450− annotation = {A plain \texttt{book} entry},
451−}
452−
453−@book{averroes/bland,
454− author = {Averroes},
455− title = {The Epistle on the Possibility of Conjunction with the Active
456− Intellect by {Ibn Rushd} with the Commentary of {Moses Narboni}},
457− date = 1982,
458− editor = {Bland, Kalman P.},
459− translator = {Bland, Kalman P.},
460− series = {Moreshet: Studies in {Jewish} History, Literature and Thought},
461− number = 7,
462− publisher = {Jewish Theological Seminary of America},
463− location = {New York},
464− keywords = {primary},
465− langid = {english},
466− langidopts = {variant=american},
467− indextitle = {Epistle on the Possibility of Conjunction, The},
468− shorttitle = {Possibility of Conjunction},
469− annotation = {A \texttt{book} entry with a \texttt{series} and a
470− \texttt{number}. Note the concatenation of the \texttt{editor}
471− and \texttt{translator} fields as well as the
472− \texttt{indextitle} field},
473−}
474−
475−@book{averroes/hannes,
476− author = {Averroes},
477− title = {Des Averro{\"e}s Abhandlung: \mkbibquote{{\"U}ber die
478− M{\"o}glichkeit der Conjunktion} oder \mkbibquote{{\"U}ber den
479− materiellen Intellekt}},
480− date = 1892,
481− editor = {Hannes, Ludwig},
482− translator = {Hannes, Ludwig},
483− annotator = {Hannes, Ludwig},
484− publisher = {C.~A. Kaemmerer},
485− location = {Halle an der Saale},
486− keywords = {primary},
487− langid = {german},
488− sorttitle = {Uber die Moglichkeit der Conjunktion},
489− indexsorttitle= {Uber die Moglichkeit der Conjunktion},
490− indextitle = {{\"U}ber die M{\"o}glichkeit der Conjunktion},
491− shorttitle = {{\"U}ber die M{\"o}glichkeit der Conjunktion},
492− annotation = {An annotated edition. Note the concatenation of the
493− \texttt{editor}, \texttt{translator}, and \texttt{annotator}
494− fields. Also note the \texttt{shorttitle},
495− \texttt{indextitle}, \texttt{sorttitle}, and
496− \texttt{indexsorttitle} fields},
497−}
498−
499−@book{averroes/hercz,
500− author = {Averroes},
501− title = {Drei Abhandlungen {\"u}ber die Conjunction des separaten
502− Intellects mit dem Menschen},
503− date = 1869,
504− editor = {Hercz, J.},
505− translator = {Hercz, J.},
506− publisher = {S.~Hermann},
507− location = {Berlin},
508− keywords = {primary},
509− langid = {german},
510− indexsorttitle= {Drei Abhandlungen uber die Conjunction},
511− indextitle = {Drei Abhandlungen {\"u}ber die Conjunction},
512− subtitle = {Von Averroes (Vater und Sohn), aus dem Arabischen
513− {\"u}bersetzt von Samuel Ibn Tibbon},
514− shorttitle = {Drei Abhandlungen},
515− annotation = {A \texttt{book} entry. Note the concatenation of the
516− \texttt{editor} and \texttt{translator} fields as well as the
517− \texttt{indextitle} and \texttt{indexsorttitle} fields},
518−}
519−
520−@book{cicero,
521− author = {Cicero, Marcus Tullius},
522− title = {De natura deorum. {\"U}ber das Wesen der G{\"o}tter},
523− date = 1995,
524− editor = {Blank-Sangmeister, Ursula},
525− translator = {Blank-Sangmeister, Ursula},
526− afterword = {Thraede, Klaus},
527− language = {langlatin and langgerman},
528− publisher = {Reclam},
529− location = {Stuttgart},
530− langid = {german},
531− indextitle = {De natura deorum},
532− shorttitle = {De natura deorum},
533− annotation = {A bilingual edition of Cicero's \emph{De natura deorum}, with
534− a German translation. Note the format of the \texttt{language}
535− field in the database file, the concatenation of the
536− \texttt{editor} and \texttt{translator} fields, and the
537− \texttt{afterword} field},
538−}
539−
540−@book{coleridge,
541− author = {Coleridge, Samuel Taylor},
542− title = {Biographia literaria, or {Biographical} sketches of my literary
543− life and opinions},
544− date = 1983,
545− editor = {Coburn, Kathleen and Engell, James and Bate, W. Jackson},
546− maintitle = {The collected works of {Samuel Taylor Coleridge}},
547− volume = 7,
548− part = 2,
549− series = {Bollingen Series},
550− number = 75,
551− publisher = {Routledge {and} Kegan Paul},
552− location = {London},
553− langid = {english},
554− langidopts = {variant=british},
555− indextitle = {Biographia literaria},
556− shorttitle = {Biographia literaria},
557− annotation = {One (partial) volume of a multivolume book. This is a
558− \texttt{book} entry with a \texttt{volume} and a \texttt{part}
559− field which explicitly refers to the second (physical) part of
560− the seventh (logical) volume. Also note the \texttt{series}
561− and \texttt{number} fields},
562−}
563−
564−@book{companion,
565− author = {Goossens, Michel and Mittelbach, Frank and Samarin, Alexander},
566− title = {The {LaTeX} Companion},
567− date = 1994,
568− edition = 1,
569− publisher = {Addison-Wesley},
570− location = {Reading, Mass.},
571− pagetotal = 528,
572− langid = {english},
573− langidopts = {variant=american},
574− sorttitle = {LaTeX Companion},
575− indextitle = {LaTeX Companion, The},
576− shorttitle = {LaTeX Companion},
577− annotation = {A book with three authors. Note the formatting of the author
578− list. By default, only the first name is reversed in the
579− bibliography},
580−}
581−
582−@book{cotton,
583− author = {Cotton, Frank Albert and Wilkinson, Geoffrey and Murillio,
584− Carlos A. and Bochmann, Manfred},
585− title = {Advanced inorganic chemistry},
586− date = 1999,
587− edition = 6,
588− publisher = {Wiley},
589− location = {Chichester},
590− langid = {english},
591− langidopts = {variant=british},
592− annotation = {A \texttt{book} entry with \arabic{author} authors and an
593− \texttt{edition} field. By default, long \texttt{author} and
594− \texttt{editor} lists are automatically truncated. This is
595− configurable},
596−}
597−
598−@book{gerhardt,
599− author = {Gerhardt, Michael J.},
600− title = {The Federal Appointments Process},
601− date = 2000,
602− publisher = {Duke University Press},
603− location = {Durham and London},
604− langid = {english},
605− langidopts = {variant=american},
606− sorttitle = {Federal Appointments Process},
607− indextitle = {Federal Appointments Process, The},
608− subtitle = {A Constitutional and Historical Analysis},
609− shorttitle = {Federal Appointments Process},
610− annotation = {This is a \texttt{book} entry. Note the format of the
611− \texttt{location} field as well as the \texttt{sorttitle} and
612− \texttt{indextitle} fields},
613−}
614−
615−@book{gonzalez,
616− author = {Gonzalez, Ray},
617− title = {The Ghost of {John Wayne} and Other Stories},
618− date = 2001,
619− publisher = {The University of Arizona Press},
620− location = {Tucson},
621− isbn = {0-816-52066-6},
622− langid = {english},
623− langidopts = {variant=american},
624− sorttitle = {Ghost of John Wayne and Other Stories},
625− indextitle = {Ghost of {John Wayne} and Other Stories, The},
626− shorttitle = {Ghost of {John Wayne}},
627− annotation = {A collection of short stories. This is a \texttt{book} entry.
628− Note the \texttt{sorttitle} and \texttt{indextitle} fields in
629− the database file. There's also an \texttt{isbn} field},
630−}
631−
632−@book{hammond,
633− author = {Hammond, Christopher},
634− title = {The basics of crystallography and diffraction},
635− date = 1997,
636− publisher = {International Union of Crystallography and Oxford University
637− Press},
638− location = {Oxford},
639− langid = {english},
640− langidopts = {variant=british},
641− sorttitle = {Basics of crystallography and diffraction},
642− indextitle = {Basics of crystallography and diffraction, The},
643− shorttitle = {Crystallography and diffraction},
644− annotation = {A \texttt{book} entry. Note the \texttt{sorttitle} and
645− \texttt{indextitle} fields as well as the format of the
646− \texttt{publisher} field},
647−}
648−
649−@book{iliad,
650− author = {Homer},
651− title = {Die Ilias},
652− date = 2004,
653− translator = {Schadewaldt, Wolfgang},
654− introduction = {Latacz, Joachim},
655− edition = 3,
656− publisher = {Artemis \& Winkler},
657− location = {D{\"u}sseldorf and Z{\"u}rich},
658− langid = {german},
659− sorttitle = {Ilias},
660− indextitle = {Ilias, Die},
661− shorttitle = {Ilias},
662− annotation = {A German translation of the \emph{Iliad}. Note the
663− \texttt{translator} and \texttt{introduction} fields and the
664− format of the \texttt{location} field in the database
665− file. Also note the \texttt{sorttitle} and \texttt{indextitle}
666− fields},
667−}
668−
669−@book{knuth:ct,
670− author = {Knuth, Donald E.},
671− title = {Computers \& Typesetting},
672− date = {1984/1986},
673− volumes = 5,
674− publisher = {Addison-Wesley},
675− location = {Reading, Mass.},
676− langid = {english},
677− langidopts = {variant=american},
678− sortyear = {1984-0},
679− sorttitle = {Computers & Typesetting},
680− indexsorttitle= {Computers & Typesetting},
681− annotation = {A five-volume book cited as a whole. This is a \texttt{book}
682− entry, note the \texttt{volumes} field},
683−}
684−
685−@book{knuth:ct:a,
686− author = {Knuth, Donald E.},
687− title = {The {\TeX} book},
688− date = 1984,
689− maintitle = {Computers \& Typesetting},
690− volume = {A},
691− publisher = {Addison-Wesley},
692− location = {Reading, Mass.},
693− langid = {english},
694− langidopts = {variant=american},
695− sortyear = {1984-1},
696− sorttitle = {Computers & Typesetting A},
697− indexsorttitle= {The TeXbook},
698− indextitle = {\protect\TeX book, The},
699− shorttitle = {\TeX book},
700− annotation = {The first volume of a five-volume book. Note the
701− \texttt{sorttitle} and \texttt{sortyear} fields. We want this
702− volume to be listed after the entry referring to the entire
703− five-volume set. Also note the \texttt{indextitle} and
704− \texttt{indexsorttitle} fields. Indexing packages that don't
705− generate robust index entries require some control sequences
706− to be protected from expansion},
707−}
708−
709−@book{knuth:ct:b,
710− author = {Knuth, Donald E.},
711− title = {\TeX: The Program},
712− date = 1986,
713− maintitle = {Computers \& Typesetting},
714− volume = {B},
715− publisher = {Addison-Wesley},
716− location = {Reading, Mass.},
717− langid = {english},
718− langidopts = {variant=american},
719− sortyear = {1986-1},
720− sorttitle = {Computers & Typesetting B},
721− indexsorttitle= {TeX: The Program},
722− shorttitle = {\TeX},
723− annotation = {The second volume of a five-volume book. Note the
724− \texttt{sorttitle} and \texttt{sortyear} fields. Also note the
725− \texttt{indexsorttitle} field},
726−}
727−
728−@book{knuth:ct:c,
729− author = {Knuth, Donald E.},
730− title = {The {METAFONTbook}},
731− date = 1986,
732− maintitle = {Computers \& Typesetting},
733− volume = {C},
734− publisher = {Addison-Wesley},
735− location = {Reading, Mass.},
736− langid = {english},
737− langidopts = {variant=american},
738− sortyear = {1986-2},
739− sorttitle = {Computers & Typesetting C},
740− indextitle = {METAFONTbook, The},
741− shorttitle = {METAFONTbook},
742− annotation = {The third volume of a five-volume book. Note the
743− \texttt{sorttitle} and \texttt{sortyear} fields as well as the
744− \texttt{indextitle} field},
745−}
746−
747−@book{knuth:ct:d,
748− author = {Knuth, Donald E.},
749− title = {METAFONT: The Program},
750− date = 1986,
751− maintitle = {Computers \& Typesetting},
752− volume = {D},
753− publisher = {Addison-Wesley},
754− location = {Reading, Mass.},
755− langid = {english},
756− langidopts = {variant=american},
757− sortyear = {1986-3},
758− sorttitle = {Computers & Typesetting D},
759− shorttitle = {METAFONT},
760− annotation = {The fourth volume of a five-volume book. Note the
761− \texttt{sorttitle} and \texttt{sortyear} fields},
762−}
763−
764−@book{knuth:ct:e,
765− author = {Knuth, Donald E.},
766− title = {{Computer Modern} Typefaces},
767− date = 1986,
768− maintitle = {Computers \& Typesetting},
769− volume = {E},
770− publisher = {Addison-Wesley},
771− location = {Reading, Mass.},
772− langid = {english},
773− langidopts = {variant=american},
774− sortyear = {1986-4},
775− sorttitle = {Computers & Typesetting E},
776− annotation = {The fifth volume of a five-volume book. Note the
777− \texttt{sorttitle} and \texttt{sortyear} fields},
778−}
779−
780−@book{knuth:ct:related,
781− author = {Knuth, Donald E.},
782− title = {Computers \& Typesetting},
783− date = {1984/1986},
784− volumes = 5,
785− publisher = {Addison-Wesley},
786− location = {Reading, Mass.},
787− langid = {english},
788− langidopts = {variant=american},
789− sortyear = {1984-0},
790− sorttitle = {Computers & Typesetting},
791− indexsorttitle= {Computers & Typesetting},
792− related = {knuth:ct:a,knuth:ct:b,knuth:ct:c,knuth:ct:d,knuth:ct:e},
793− relatedtype = {multivolume},
794− annotation = {A five-volume book cited as a whole and related to its
795− individual volumes. Note the \texttt{related} and
796− \texttt{relatedtype} fields},
797−}
798−
799−@book{kullback,
800− author = {Kullback, Solomon},
801− title = {Information Theory and Statistics},
802− year = 1959,
803− publisher = {John Wiley \& Sons},
804− location = {New York},
805− langid = {english},
806− langidopts = {variant=american},
807−}
808−
809−@book{kullback:reprint,
810− author = {Kullback, Solomon},
811− title = {Information Theory and Statistics},
812− year = 1997,
813− publisher = {Dover Publications},
814− location = {New York},
815− origyear = 1959,
816− origpublisher= {John Wiley \& Sons},
817− langid = {english},
818− langidopts = {variant=american},
819− annotation = {A reprint of the \texttt{kullback} entry. Note the format of
820− \texttt{origyear} and \texttt{origpublisher}. These fields are
821− not used by the standard bibliography styles},
822−}
823−
824−@book{kullback:related,
825− author = {Kullback, Solomon},
826− title = {Information Theory and Statistics},
827− year = 1997,
828− publisher = {Dover Publications},
829− location = {New York},
830− langid = {english},
831− langidopts = {variant=american},
832− related = {kullback},
833− relatedtype = {origpubin},
834− annotation = {A reprint of the \texttt{kullback} entry. Note the format of
835− the \texttt{related} and \texttt{relatedtype} fields},
836−}
837−
838−@book{malinowski,
839− author = {Malinowski, Bronis{\l}aw},
840− title = {Argonauts of the {Western Pacific}},
841− date = 1972,
842− edition = 8,
843− publisher = {Routledge {and} Kegan Paul},
844− location = {London},
845− langid = {english},
846− langidopts = {variant=british},
847− subtitle = {An account of native enterprise and adventure in the
848− Archipelagoes of {Melanesian New Guinea}},
849− shorttitle = {Argonauts},
850− annotation = {This is a \texttt{book} entry. Note the format of the
851− \texttt{publisher} and \texttt{edition} fields as well as the
852− \texttt{subtitle} field},
853−}
854−
855−@book{maron,
856− author = {Maron, Monika},
857− title = {Animal Triste},
858− date = 2000,
859− translator = {Brigitte Goldstein},
860− origlanguage = {german},
861− publisher = {University of Nebraska Press},
862− location = {Lincoln},
863− langid = {english},
864− langidopts = {variant=american},
865− shorttitle = {Animal Triste},
866− annotation = {An English translation of a German novel with a French title.
867− In other words: a \texttt{book} entry with a
868− \texttt{translator} field. Note the \texttt{origlanguage}
869− field which is concatenated with the \texttt{translator}},
870−}
871−
872−@book{massa,
873− author = {Werner Massa},
874− title = {Crystal structure determination},
875− date = 2004,
876− edition = 2,
877− publisher = {Spinger},
878− location = {Berlin},
879− langid = {english},
880− langidopts = {variant=british},
881− annotation = {A \texttt{book} entry with an \texttt{edition} field},
882−}
883−
884−@article{moore,
885− author = {Moore, Gordon E.},
886− title = {Cramming more components onto integrated circuits},
887− journaltitle = {Electronics},
888− year = 1965,
889− volume = 38,
890− number = 8,
891− pages = {114-117},
892− langid = {english},
893− langidopts = {variant=american},
894−}
895−
896−@article{moore:related,
897− author = {Moore, Gordon E.},
898− title = {Cramming more components onto integrated circuits},
899− journaltitle = {Proceedings of the {IEEE}},
900− year = 1998,
901− volume = 86,
902− number = 1,
903− pages = {82-85},
904− langid = {english},
905− langidopts = {variant=american},
906− related = {moore},
907− relatedtype = {reprintfrom},
908− annotation = {A reprint of Moore's law. Note the \texttt{related} and
909− \texttt{relatedtype} fields},
910−}
911−
912−@book{nietzsche:ksa,
913− author = {Nietzsche, Friedrich},
914− title = {S{\"a}mtliche Werke},
915− date = 1988,
916− editor = {Colli, Giorgio and Montinari, Mazzino},
917− edition = 2,
918− volumes = 15,
919− publisher = dtv # { and Walter de Gruyter},
920− location = {M{\"u}nchen and Berlin and New York},
921− langid = {german},
922− sortyear = {1988-0},
923− sorttitle = {Werke-00-000},
924− indexsorttitle= {Samtliche Werke},
925− subtitle = {Kritische Studienausgabe},
926− annotation = {The critical edition of Nietzsche's works. This is a
927− \texttt{book} entry referring to a 15-volume work as a
928− whole. Note the \texttt{volumes} field and the format of the
929− \texttt{publisher} and \texttt{location} fields in the
930− database file. Also note the \texttt{sorttitle} and
931− \texttt{sortyear} fields which are used to fine-tune the
932− sorting order of the bibliography. We want this item listed
933− first in the bibliography},
934−}
935−
936−@book{nietzsche:ksa1,
937− author = {Nietzsche, Friedrich},
938− title = {Die Geburt der Trag{\"o}die. Unzeitgem{\"a}{\ss}e
939− Betrachtungen I--IV. Nachgelassene Schriften 1870--1973},
940− date = 1988,
941− editor = {Colli, Giorgio and Montinari, Mazzino},
942− maintitle = {S{\"a}mtliche Werke},
943− mainsubtitle = {Kritische Studienausgabe},
944− volume = 1,
945− edition = 2,
946− publisher = dtv # { and Walter de Gruyter},
947− location = {M{\"u}nchen and Berlin and New York},
948− langid = {german},
949− sortyear = {1988-1},
950− sorttitle = {Werke-01-000},
951− indexsorttitle= {Samtliche Werke I},
952− bookauthor = {Nietzsche, Friedrich},
953− indextitle = {S{\"a}mtliche Werke I},
954− shorttitle = {S{\"a}mtliche Werke I},
955− annotation = {A single volume from the critical edition of Nietzsche's
956− works. This \texttt{book} entry explicitly refers to the first
957− volume only. Note the \texttt{title} and \texttt{maintitle}
958− fields. Also note the \texttt{sorttitle} and \texttt{sortyear}
959− fields. We want this entry to be listed after the entry
960− referring to the entire edition},
961−}
962−
963−@book{nussbaum,
964− author = {Nussbaum, Martha},
965− title = {Aristotle's \mkbibquote{De Motu Animalium}},
966− date = 1978,
967− publisher = pup,
968− location = {Princeton},
969− keywords = {secondary},
970− langid = {english},
971− langidopts = {variant=american},
972− sorttitle = {Aristotle's De Motu Animalium},
973− indexsorttitle= {Aristotle's De Motu Animalium},
974− annotation = {A \texttt{book} entry. Note the \texttt{sorttitle} and
975− \texttt{indexsorttitle} fields and the markup of the quotes in
976− the database file},
977−}
978−
979−@book{piccato,
980− author = {Piccato, Pablo},
981− title = {City of Suspects},
982− date = 2001,
983− publisher = {Duke University Press},
984− location = {Durham and London},
985− langid = {english},
986− langidopts = {variant=american},
987− subtitle = {Crime in {Mexico City}, 1900--1931},
988− shorttitle = {City of Suspects},
989− annotation = {This is a \texttt{book} entry. Note the format of the
990− \texttt{location} field in the database file},
991−}
992−
993−@book{vangennep,
994− author = {van Gennep, Arnold},
995− title = {Les rites de passage},
996− date = 1909,
997− publisher = {Nourry},
998− location = {Paris},
999− options = {useprefix},
1000− langid = {french},
1001− sorttitle = {Rites de passage},
1002− indextitle = {Rites de passage, Les},
1003− shorttitle = {Rites de passage},
1004− annotation = {A \texttt{book} entry. Note the format of the printed name and
1005− compare the \texttt{useprefix} option in the \texttt{options}
1006− field as well as \texttt{brandt} and \texttt{geer}},
1007−}
1008−
1009−@book{vangennep:trans,
1010− author = {van Gennep, Arnold},
1011− title = {The Rites of Passage},
1012− year = 1960,
1013− translator = {Vizedom, Monika B. and Caffee, Gabrielle L.},
1014− language = {english},
1015− origlanguage = {french},
1016− publisher = {University of Chicago Press},
1017− options = {useprefix},
1018− indextitle = {Rites of Passage, The},
1019− sorttitle = {Rites of Passage},
1020− shorttitle = {Rites of Passage},
1021− langid = {english},
1022− langidopts = {variant=american},
1023− annotation = {A translation of the \texttt{vangennep} entry. Note the
1024− \texttt{translator} and \texttt{origlanguage} fields. Compare
1025− with the \texttt{vangennep:related} entry.},
1026−}
1027−
1028−@book{vangennep:related,
1029− author = {van Gennep, Arnold},
1030− title = {Les rites de passage},
1031− date = 1909,
1032− publisher = {Nourry},
1033− location = {Paris},
1034− options = {useprefix},
1035− langid = {french},
1036− related = {vizedom:related},
1037− relatedtype = {bytranslator},
1038− sorttitle = {Rites de passage},
1039− indextitle = {Rites de passage, Les},
1040− shorttitle = {Rites de passage},
1041− annotation = {A variant of the \texttt{vangennep} entry related to its
1042− translation. Note the format of the \texttt{related} and
1043− \texttt{relatedtype} fields},
1044−}
1045−
1046−@book{vizedom:related,
1047− title = {The Rites of Passage},
1048− year = 1960,
1049− translator = {Vizedom, Monika B. and Caffee, Gabrielle L.},
1050− language = {english},
1051− publisher = {University of Chicago Press},
1052− langid = {english},
1053− langidopts = {variant=american},
1054− options = {usetranslator},
1055− related = {vangennep},
1056− relatedtype = {translationof},
1057− indextitle = {Rites of Passage, The},
1058− sorttitle = {Rites of Passage},
1059− shorttitle = {Rites of Passage},
1060− annotation = {A translated work from \texttt{vangennep}. Note the format of
1061− the \texttt{related} and \texttt{relatedtype} fields},
1062−}
1063−
1064−@book{vazques-de-parga,
1065− author = {V{\'a}zques{ de }Parga, Luis and Lacarra, Jos{\'e} Mar{\'i}a
1066− and Ur{\'i}a R{\'i}u, Juan},
1067− title = {Las Peregrinaciones a Santiago de Compostela},
1068− date = 1993,
1069− volumes = 3,
1070− note = {Ed. facs. de la realizada en 1948--49},
1071− publisher = {Iberdrola},
1072− location = {Pamplona},
1073− langid = {spanish},
1074− sorttitle = {Peregrinaciones a Santiago de Compostela},
1075− indextitle = {Peregrinaciones a Santiago de Compostela, Las},
1076− shorttitle = {Peregrinaciones},
1077− annotation = {A multivolume book cited as a whole. This is a \texttt{book}
1078− entry with \texttt{volumes}, \texttt{note},
1079− \texttt{sorttitle}, and \texttt{indextitle} fields},
1080−}
1081−
1082−@book{wilde,
1083− author = {Wilde, Oscar},
1084− title = {The Importance of Being Earnest: A Trivial Comedy for Serious
1085− People},
1086− year = 1899,
1087− series = {English and {American} drama of the Nineteenth Century},
1088− publisher = {Leonard Smithers {and} Company},
1089− eprint = {4HIWAAAAYAAJ},
1090− eprinttype = {googlebooks},
1091− annotation = {A \texttt{book} with \texttt{eprint} and \texttt{eprinttype}
1092− fields.},
1093−}
1094−
1095−@book{worman,
1096− author = {Worman, Nancy},
1097− title = {The Cast of Character},
1098− date = 2002,
1099− publisher = {University of Texas Press},
1100− location = {Austin},
1101− langid = {english},
1102− langidopts = {variant=american},
1103− sorttitle = {Cast of Character},
1104− indextitle = {Cast of Character, The},
1105− subtitle = {Style in {Greek} Literature},
1106− shorttitle = {Cast of Character},
1107− annotation = {A \texttt{book} entry. Note the \texttt{sorttitle} and
1108− \texttt{indextitle} fields},
1109−}
1110−
1111−@collection{britannica,
1112− editor = {Preece, Warren E.},
1113− title = {The {New Encyclop{\ae}dia Britannica}},
1114− date = 2003,
1115− edition = 15,
1116− volumes = 32,
1117− publisher = {Encyclop{\ae}dia Britannica},
1118− location = {Chicago, Ill.},
1119− options = {useeditor=false},
1120− label = {EB},
1121− langid = {english},
1122− langidopts = {variant=british},
1123− sorttitle = {Encyclop{\ae}dia Britannica},
1124− indextitle = {{Encyclop{\ae}dia Britannica}, The {New}},
1125− shorttitle = {{Encyclop{\ae}dia Britannica}},
1126− annotation = {This is a \texttt{collection} entry for an encyclopedia. Note
1127− the \texttt{useeditor} option in the \texttt{options} field as
1128− well as the \texttt{sorttitle} field. We want this entry to be
1129− cited and alphabetized by title even though there is an
1130− editor. In addition to that, we want the title to be
1131− alphabetized under \enquote*{E} rather than \enquote*{T}. Also
1132− note the \texttt{label} field which is provided for
1133− author-year citation styles},
1134−}
1135−
1136−@collection{gaonkar,
1137− editor = {Gaonkar, Dilip Parameshwar},
1138− title = {Alternative Modernities},
1139− date = 2001,
1140− publisher = {Duke University Press},
1141− location = {Durham and London},
1142− isbn = {0-822-32714-7},
1143− langid = {english},
1144− langidopts = {variant=american},
1145− annotation = {This is a \texttt{collection} entry. Note the format of the
1146− \texttt{location} field in the database file as well as the
1147− \texttt{isbn} field},
1148−}
1149−
1150−@InCollection{gaonkar:in,
1151− author = {Gaonkar, Dilip Parameshwar},
1152− editor = {Gaonkar, Dilip Parameshwar},
1153− title = {On Alternative Modernities},
1154− date = 2001,
1155− booktitle = {Alternative Modernities},
1156− publisher = {Duke University Press},
1157− location = {Durham and London},
1158− isbn = {0-822-32714-7},
1159− pages = {1-23},
1160−}
1161−
1162−@collection{jaffe,
1163− editor = {Jaff{\'e}, Philipp},
1164− title = {Regesta Pontificum Romanorum ab condita ecclesia ad annum post
1165− Christum natum \textsc{mcxcviii}},
1166− date = {1885/1888},
1167− editora = {Loewenfeld, Samuel and Kaltenbrunner, Ferdinand and Ewald,
1168− Paul},
1169− edition = 2,
1170− volumes = 2,
1171− location = {Leipzig},
1172− langid = {latin},
1173− editoratype = {redactor},
1174− indextitle = {Regesta Pontificum Romanorum},
1175− shorttitle = {Regesta Pontificum Romanorum},
1176− annotation = {A \texttt{collection} entry with \texttt{edition} and
1177− \texttt{volumes} fields. Note the \texttt{editora} and
1178− \texttt{editoratype} fields},
1179−}
1180−
1181−@collection{westfahl:frontier,
1182− editor = {Westfahl, Gary},
1183− title = {Space and Beyond},
1184− date = 2000,
1185− subtitle = {The Frontier Theme in Science Fiction},
1186− publisher = {Greenwood},
1187− location = {Westport, Conn. and London},
1188− langid = {english},
1189− langidopts = {variant=american},
1190− booktitle = {Space and Beyond},
1191− booksubtitle = {The Frontier Theme in Science Fiction},
1192− annotation = {This is a \texttt{collection} entry. Note the format of the
1193− \texttt{location} field as well as the \texttt{subtitle} and
1194− \texttt{booksubtitle} fields},
1195−}
1196−
1197−@inbook{kant:kpv,
1198− title = {Kritik der praktischen Vernunft},
1199− date = 1968,
1200− author = {Kant, Immanuel},
1201− booktitle = {Kritik der praktischen Vernunft. Kritik der Urtheilskraft},
1202− bookauthor = {Kant, Immanuel},
1203− maintitle = {Kants Werke. Akademie Textausgabe},
1204− volume = 5,
1205− publisher = {Walter de Gruyter},
1206− location = {Berlin},
1207− pages = {1-163},
1208− shorthand = {KpV},
1209− langid = {german},
1210− shorttitle = {Kritik der praktischen Vernunft},
1211− annotation = {An edition of Kant's \emph{Collected Works}, volume five. This
1212− is an \texttt{inbook} entry which explicitly refers to the
1213− \emph{Critique of Practical Reason} only, not to the entire
1214− fifth volume. Note the \texttt{author} and \texttt{bookauthor}
1215− fields in the database file. By default, the
1216− \texttt{bookauthor} is omitted if the values of the
1217− \texttt{author} and \texttt{bookauthor} fields are identical},
1218−}
1219−
1220−@inbook{kant:ku,
1221− title = {Kritik der Urtheilskraft},
1222− date = 1968,
1223− author = {Kant, Immanuel},
1224− booktitle = {Kritik der praktischen Vernunft. Kritik der Urtheilskraft},
1225− bookauthor = {Kant, Immanuel},
1226− maintitle = {Kants Werke. Akademie Textausgabe},
1227− volume = 5,
1228− publisher = {Walter de Gruyter},
1229− location = {Berlin},
1230− pages = {165-485},
1231− shorthand = {KU},
1232− langid = {german},
1233− annotation = {An edition of Kant's \emph{Collected Works}, volume five. This
1234− is an \texttt{inbook} entry which explicitly refers to the
1235− \emph{Critique of Judgment} only, not to the entire fifth
1236− volume},
1237−}
1238−
1239−@inbook{nietzsche:historie,
1240− title = {Unzeitgem{\"a}sse Betrachtungen. Zweites St{\"u}ck},
1241− date = 1988,
1242− author = {Nietzsche, Friedrich},
1243− booktitle = {Die Geburt der Trag{\"o}die. Unzeitgem{\"a}{\ss}e
1244− Betrachtungen I--IV. Nachgelassene Schriften 1870--1973},
1245− bookauthor = {Nietzsche, Friedrich},
1246− editor = {Colli, Giorgio and Montinari, Mazzino},
1247− subtitle = {Vom Nutzen und Nachtheil der Historie f{\"u}r das Leben},
1248− maintitle = {S{\"a}mtliche Werke},
1249− mainsubtitle = {Kritische Studienausgabe},
1250− volume = 1,
1251− publisher = dtv # { and Walter de Gruyter},
1252− location = {M{\"u}nchen and Berlin and New York},
1253− pages = {243-334},
1254− langid = {german},
1255− sortyear = {1988-2},
1256− sorttitle = {Werke-01-243},
1257− indexsorttitle= {Vom Nutzen und Nachtheil der Historie fur das Leben},
1258− indextitle = {Vom Nutzen und Nachtheil der Historie f{\"u}r das Leben},
1259− shorttitle = {Vom Nutzen und Nachtheil der Historie},
1260− annotation = {A single essay from the critical edition of Nietzsche's works.
1261− This \texttt{inbook} entry explicitly refers to an essay found
1262− in the first volume. Note the \texttt{title},
1263− \texttt{booktitle}, and \texttt{maintitle} fields. Also note
1264− the \texttt{sorttitle} and \texttt{sortyear} fields. We want
1265− this entry to be listed after the entry referring to the
1266− entire first volume},
1267−}
1268−
1269−@incollection{brandt,
1270− author = {von Brandt, Ahasver and Erich Hoffmann},
1271− editor = {Ferdinand Seibt},
1272− title = {Die nordischen L{\"a}nder von der Mitte des 11.~Jahrhunderts
1273− bis 1448},
1274− date = 1987,
1275− booktitle = {Europa im Hoch- und Sp{\"a}tmittelalter},
1276− series = {Handbuch der europ{\"a}ischen Geschichte},
1277− number = 2,
1278− publisher = {Klett-Cotta},
1279− location = {Stuttgart},
1280− pages = {884-917},
1281− options = {useprefix=false},
1282− langid = {german},
1283− indexsorttitle= {Nordischen Lander von der Mitte des 11. Jahrhunderts bis
1284− 1448},
1285− indextitle = {Nordischen L{\"a}nder von der Mitte des 11.~Jahrhunderts bis
1286− 1448, Die},
1287− shorttitle = {Die nordischen L{\"a}nder},
1288− annotation = {An \texttt{incollection} entry with a \texttt{series} and a
1289− \texttt{number}. Note the format of the printed name and
1290− compare the \texttt{useprefix} option in the \texttt{options}
1291− field as well as \texttt{vangennep}. Also note the
1292− \texttt{indextitle, and \texttt{indexsorttitle} fields}},
1293−}
1294−
1295−@incollection{hyman,
1296− author = {Arthur Hyman},
1297− editor = {O'Meara, Dominic J.},
1298− title = {Aristotle's Theory of the Intellect and its Interpretation by
1299− {Averroes}},
1300− date = 1981,
1301− booktitle = {Studies in {Aristotle}},
1302− series = {Studies in Philosophy and the History of Philosophy},
1303− number = 9,
1304− publisher = {The Catholic University of America Press},
1305− location = {Washington, D.C.},
1306− pages = {161-191},
1307− keywords = {secondary},
1308− langid = {english},
1309− langidopts = {variant=american},
1310− indextitle = {Aristotle's Theory of the Intellect},
1311− shorttitle = {Aristotle's Theory of the Intellect},
1312− annotation = {An \texttt{incollection} entry with a \texttt{series} and
1313− \texttt{number} field},
1314−}
1315−
1316−@incollection{pines,
1317− author = {Pines, Shlomo},
1318− editor = {Twersky, Isadore},
1319− title = {The Limitations of Human Knowledge According to {Al-Farabi}, {ibn
1320− Bajja}, and {Maimonides}},
1321− date = 1979,
1322− booktitle = {Studies in Medieval {Jewish} History and Literature},
1323− publisher = hup,
1324− location = {Cambridge, Mass.},
1325− pages = {82-109},
1326− keywords = {secondary},
1327− langid = {english},
1328− langidopts = {variant=american},
1329− indextitle = {Limitations of Human Knowledge According to {Al-Farabi}, {ibn
1330− Bajja}, and {Maimonides}, The},
1331− shorttitle = {Limitations of Human Knowledge},
1332− annotation = {A typical \texttt{incollection} entry. Note the
1333− \texttt{indextitle} field},
1334−}
1335−
1336−@inproceedings{moraux,
1337− author = {Moraux, Paul},
1338− editor = {Lloyd, G. E. R. and Owen, G. E. L.},
1339− title = {Le \emph{De Anima} dans la tradition gr{\`e}cque},
1340− date = 1979,
1341− booktitle = {Aristotle on Mind and the Senses},
1342− subtitle = {Quelques aspects de l'interpretation du trait{\'e}, de
1343− Theophraste {\`a} Themistius},
1344− booktitleaddon= {Proceedings of the Seventh Symposium Aristotelicum},
1345− eventdate = 1975,
1346− publisher = cup,
1347− location = {Cambridge},
1348− pages = {281-324},
1349− keywords = {secondary},
1350− langid = {french},
1351− indexsorttitle= {De Anima dans la tradition grecque},
1352− indextitle = {\emph{De Anima} dans la tradition gr{\`e}cque, Le},
1353− shorttitle = {\emph{De Anima} dans la tradition gr{\`e}cque},
1354− annotation = {This is a typical \texttt{inproceedings} entry. Note the
1355− \texttt{booksubtitle}, \texttt{shorttitle},
1356− \texttt{indextitle}, and \texttt{indexsorttitle} fields. Also
1357− note the \texttt{eventdate} field.},
1358−}
1359−
1360−@inproceedings{salam,
1361− author = {Salam, Abdus},
1362− editor = {Svartholm, Nils},
1363− title = {Weak and Electromagnetic Interactions},
1364− date = 1968,
1365− booktitle = {Elementary particle theory},
1366− booksubtitle = {Relativistic groups and analyticity},
1367− booktitleaddon= {Proceedings of the {Eighth Nobel Symposium}},
1368− eventdate = {1968-05-19/1968-05-25},
1369− venue = {Aspen{\"a}sgarden, Lerum},
1370− publisher = {Almquist \& Wiksell},
1371− location = {Stockholm},
1372− pages = {367-377},
1373−}
1374−
1375−@manual{cms,
1376− title = {The {Chicago} Manual of Style},
1377− date = 2003,
1378− subtitle = {The Essential Guide for Writers, Editors, and Publishers},
1379− edition = 15,
1380− publisher = {University of Chicago Press},
1381− location = {Chicago, Ill.},
1382− isbn = {0-226-10403-6},
1383− label = {CMS},
1384− langid = {english},
1385− langidopts = {variant=american},
1386− sorttitle = {Chicago Manual of Style},
1387− indextitle = {Chicago Manual of Style, The},
1388− shorttitle = {Chicago Manual of Style},
1389− annotation = {This is a \texttt{manual} entry without an \texttt{author} or
1390− \texttt{editor}. Note the \texttt{label} field in the database
1391− file which is provided for author-year citation styles. Also
1392− note the \texttt{sorttitle} and \texttt{indextitle} fields. By
1393− default, all entries without an \texttt{author} or
1394− \texttt{editor} are alphabetized by \texttt{title} but we want
1395− this entry to be alphabetized under \enquote*{C} rather than
1396− \enquote*{T}. There's also an \texttt{isbn} field},
1397−}
1398−
1399−@online{baez/online,
1400− author = {Baez, John C. and Lauda, Aaron D.},
1401− title = {Higher-Dimensional Algebra {V}: 2-Groups},
1402− date = {2004-10-27},
1403− version = 3,
1404− langid = {english},
1405− langidopts = {variant=american},
1406− eprinttype = {arxiv},
1407− eprint = {math/0307200v3},
1408− annotation = {An \texttt{online} reference from arXiv. Note the
1409− \texttt{eprint} and \texttt{eprinttype} fields. Compare
1410− \texttt{baez\slash article} which is the same item given as an
1411− \texttt{article} entry with eprint information},
1412−}
1413−
1414−@online{ctan,
1415− title = {CTAN},
1416− date = 2006,
1417− url = {http://www.ctan.org},
1418− subtitle = {The {Comprehensive TeX Archive Network}},
1419− urldate = {2006-10-01},
1420− label = {CTAN},
1421− langid = {english},
1422− langidopts = {variant=american},
1423− annotation = {This is an \texttt{online} entry. The \textsc{url}, which is
1424− given in the \texttt{url} field, is transformed into a
1425− clickable link if \texttt{hyperref} support has been
1426− enabled. Note the format of the \texttt{urldate} field
1427− (\texttt{yyyy-mm-dd}) in the database file. Also note the
1428− \texttt{label} field which may be used as a fallback by
1429− citation styles which need an \texttt{author} and\slash or a
1430− \texttt{year}},
1431−}
1432−
1433−@online{itzhaki,
1434− author = {Itzhaki, Nissan},
1435− title = {Some remarks on {'t Hooft's} {S}-matrix for black holes},
1436− date = {1996-03-11},
1437− version = 1,
1438− langid = {english},
1439− langidopts = {variant=american},
1440− eprinttype = {arxiv},
1441− eprint = {hep-th/9603067},
1442− annotation = {An \texttt{online} reference from arXiv. Note the
1443− \texttt{eprint} and \texttt{eprinttype} fields. Also note that
1444− the arXiv reference is transformed into a clickable link if
1445− \texttt{hyperref} support has been enabled},
1446− abstract = {We discuss the limitations of 't Hooft's proposal for the
1447− black hole S-matrix. We find that the validity of the S-matrix
1448− implies violation of the semi-classical approximation at
1449− scales large compared to the Planck scale. We also show that
1450− the effect of the centrifugal barrier on the S-matrix is
1451− crucial even for large transverse distances.},
1452−}
1453−
1454−@online{markey,
1455− author = {Markey, Nicolas},
1456− title = {Tame the {BeaST}},
1457− date = {2005-10-16},
1458− url = {http://mirror.ctan.org/info/bibtex/tamethebeast/ttb_en.pdf},
1459− subtitle = {The {B} to {X} of {BibTeX}},
1460− version = {1.3},
1461− urldate = {2006-10-01},
1462− langid = {english},
1463− langidopts = {variant=american},
1464− sorttitle = {Tame the Beast},
1465− annotation = {An \texttt{online} entry for a tutorial. Note the format of
1466− the \texttt{date} field (\texttt{yyyy-mm-dd}) in the database
1467− file.},
1468−}
1469−
1470−@online{wassenberg,
1471− author = {Wassenberg, Jan and Sanders, Peter},
1472− title = {Faster Radix Sort via Virtual Memory and Write-Combining},
1473− date = {2010-08-17},
1474− version = 1,
1475− langid = {english},
1476− langidopts = {variant=american},
1477− eprinttype = {arxiv},
1478− eprintclass = {cs.DS},
1479− eprint = {1008.2849v1},
1480− annotation = {A recent \texttt{online} reference from arXiv using the new
1481− (April 2007 onward) identifier format. Note the
1482− \texttt{eprint}, \texttt{eprinttype}, and \texttt{eprintclass}
1483− fields. Also note that the arXiv reference is transformed into
1484− a clickable link if \texttt{hyperref} support has been
1485− enabled},
1486− abstract = {Sorting algorithms are the deciding factor for the performance
1487− of common operations such as removal of duplicates or database
1488− sort-merge joins. This work focuses on 32-bit integer keys,
1489− optionally paired with a 32-bit value. We present a fast radix
1490− sorting algorithm that builds upon a microarchitecture-aware
1491− variant of counting sort},
1492−}
1493−
1494−@patent{almendro,
1495− author = {Almendro, Jos{\'e} L. and Mart{\'i}n, Jacinto and S{\'a}nchez,
1496− Alberto and Nozal, Fernando},
1497− title = {Elektromagnetisches Signalhorn},
1498− number = {EU-29702195U},
1499− date = 1998,
1500− location = {countryfr and countryuk and countryde},
1501− langid = {german},
1502− annotation = {This is a \texttt{patent} entry with a \texttt{location}
1503− field. The number is given in the \texttt{number} field. Note
1504− the format of the \texttt{location} field in the database
1505− file. Compare \texttt{laufenberg}, \texttt{sorace}, and
1506− \texttt{kowalik}},
1507−}
1508−
1509−@patent{kowalik,
1510− author = {Kowalik, F. and Isard, M.},
1511− title = {Estimateur d'un d{\'e}faut de fonctionnement d'un modulateur
1512− en quadrature et {\'e}tage de modulation l'utilisant},
1513− number = 9500261,
1514− date = {1995-01-11},
1515− type = {patreqfr},
1516− langid = {french},
1517− indextitle = {Estimateur d'un d{\'e}faut de fonctionnement},
1518− annotation = {This is a \texttt{patent} entry for a French patent request
1519− with a full date. The number is given in the \texttt{number}
1520− field. Note the format of the \texttt{type} and \texttt{date}
1521− fields in the database file. Compare \texttt{almendro},
1522− \texttt{laufenberg}, and \texttt{sorace}},
1523−}
1524−
1525−@patent{laufenberg,
1526− author = {Laufenberg, Xaver and Eynius, Dominique and Suelzle, Helmut
1527− and Usbeck, Stephan and Spaeth, Matthias and Neuser-Hoffmann,
1528− Miriam and Myrzik, Christian and Schmid, Manfred and Nietfeld,
1529− Franz and Thiel, Alexander and Braun, Harald and Ebner,
1530− Norbert},
1531− title = {Elektrische Einrichtung und Betriebsverfahren},
1532− number = 1700367,
1533− date = {2006-09-13},
1534− holder = {{Robert Bosch GmbH} and {Daimler Chrysler AG} and {Bayerische
1535− Motoren Werke AG}},
1536− type = {patenteu},
1537− langid = {german},
1538− annotation = {This is a \texttt{patent} entry with a \texttt{holder} field.
1539− Note the format of the \texttt{type} and \texttt{location}
1540− fields in the database file. Compare \texttt{almendro},
1541− \texttt{sorace}, and \texttt{kowalik}},
1542− abstract = {The invention relates to an electric device comprising a
1543− generator, in particular for use in the vehicle electric
1544− system of a motor vehicle and a controller for controlling the
1545− generator voltage. The device is equipped with a control zone,
1546− in which the voltage is controlled and zones, in which the
1547− torque is controlled. The invention also relates to methods
1548− for operating a device of this type.},
1549− file = {http://v3.espacenet.com/textdoc?IDX=EP1700367},
1550−}
1551−
1552−@patent{sorace,
1553− author = {Sorace, Ronald E. and Reinhardt, Victor S. and Vaughn, Steven
1554− A.},
1555− title = {High-Speed Digital-to-{RF} Converter},
1556− number = 5668842,
1557− date = {1997-09-16},
1558− holder = {{Hughes Aircraft Company}},
1559− type = {patentus},
1560− langid = {english},
1561− langidopts = {variant=american},
1562− annotation = {This is a \texttt{patent} entry with a \texttt{holder} field.
1563− Note the format of the \texttt{type} and \texttt{date} fields
1564− in the database file. Compare \texttt{almendro},
1565− \texttt{laufenberg}, and \texttt{kowalik}},
1566−}
1567−
1568−@periodical{jcg,
1569− title = {Computers and Graphics},
1570− year = 2011,
1571− issuetitle = {Semantic {3D} Media and Content},
1572− volume = 35,
1573− number = 4,
1574− issn = {0097-8493},
1575− annotation = {This is a \texttt{periodical} entry with an \texttt{issn}
1576− field.},
1577−}
1578−
1579−@report{chiu,
1580− author = {Chiu, Willy W. and Chow, We Min},
1581− title = {A Hybrid Hierarchical Model of a {Multiple Virtual Storage}
1582− ({MVS}) Operating System},
1583− type = {resreport},
1584− institution = {IBM},
1585− date = 1978,
1586− number = {RC-6947},
1587− langid = {english},
1588− langidopts = {variant=american},
1589− sorttitle = {Hybrid Hierarchical Model of a Multiple Virtual Storage (MVS)
1590− Operating System},
1591− indextitle = {Hybrid Hierarchical Model, A},
1592− annotation = {This is a \texttt{report} entry for a research report. Note
1593− the format of the \texttt{type} field in the database file
1594− which uses a localization key. The number of the report is
1595− given in the \texttt{number} field. Also note the
1596− \texttt{sorttitle} and \texttt{indextitle} fields},
1597−}
1598−
1599−@report{padhye,
1600− author = {Padhye, Jitendra and Firoiu, Victor and Towsley, Don},
1601− title = {A Stochastic Model of {TCP Reno} Congestion Avoidance and
1602− Control},
1603− type = {techreport},
1604− institution = {University of Massachusetts},
1605− date = 1999,
1606− number = {99-02},
1607− location = {Amherst, Mass.},
1608− langid = {english},
1609− langidopts = {variant=american},
1610− sorttitle = {A Stochastic Model of TCP Reno Congestion Avoidance and
1611− Control},
1612− indextitle = {Stochastic Model of {TCP Reno} Congestion Avoidance and Control,
1613− A},
1614− annotation = {This is a \texttt{report} entry for a technical report. Note
1615− the format of the \texttt{type} field in the database file
1616− which uses a localization key. The number of the report is
1617− given in the \texttt{number} field. Also note the
1618− \texttt{sorttitle} and \texttt{indextitle} fields},
1619− abstract = {The steady state performance of a bulk transfer TCP flow
1620− (i.e. a flow with a large amount of data to send, such as FTP
1621− transfers) may be characterized by three quantities. The first
1622− is the send rate, which is the amount of data sent by the
1623− sender in unit time. The second is the throughput, which is
1624− the amount of data received by the receiver in unit time. Note
1625− that the throughput will always be less than or equal to the
1626− send rate due to losses. Finally, the number of non-duplicate
1627− packets received by the receiver in unit time gives us the
1628− goodput of the connection. The goodput is always less than or
1629− equal to the throughput, since the receiver may receive two
1630− copies of the same packet due to retransmissions by the
1631− sender. In a previous paper, we presented a simple model for
1632− predicting the steady state send rate of a bulk transfer TCP
1633− flow as a function of loss rate and round trip time. In this
1634− paper, we extend that work in two ways. First, we analyze the
1635− performance of bulk transfer TCP flows using more precise,
1636− stochastic analysis. Second, we build upon the previous
1637− analysis to provide both an approximate formula as well as a
1638− more accurate stochastic model for the steady state throughput
1639− of a bulk transfer TCP flow.},
1640− file = {ftp://gaia.cs.umass.edu/pub/Padhey99-markov.ps},
1641−}
1642−
1643−@thesis{geer,
1644− author = {de Geer, Ingrid},
1645− title = {Earl, Saint, Bishop, Skald~-- and Music},
1646− type = {phdthesis},
1647− institution = {Uppsala Universitet},
1648− date = 1985,
1649− subtitle = {The {Orkney Earldom} of the Twelfth Century. {A} Musicological
1650− Study},
1651− location = {Uppsala},
1652− options = {useprefix=false},
1653− langid = {english},
1654− langidopts = {variant=british},
1655− annotation = {This is a typical \texttt{thesis} entry for a PhD thesis. Note
1656− the \texttt{type} field in the database file which uses a
1657− localization key. Also note the format of the printed name and
1658− compare the \texttt{useprefix} option in the \texttt{options}
1659− field as well as \texttt{vangennep}},
1660−}
1661−
1662−@thesis{loh,
1663− author = {Loh, Nin C.},
1664− title = {High-Resolution Micromachined Interferometric Accelerometer},
1665− type = {mathesis},
1666− institution = {Massachusetts Institute of Technology},
1667− date = 1992,
1668− location = {Cambridge, Mass.},
1669− langid = {english},
1670− langidopts = {variant=american},
1671− annotation = {This is a typical \texttt{thesis} entry for an MA thesis. Note
1672− the \texttt{type} field in the database file which uses a
1673− localization key},
1674−}
test/command/biblatex-sigfridsson.md+1−1
@@ -90,7 +90,7 @@ references:
90 - family: Ryde
90 - family: Ryde
91 given: Ulf
91 given: Ulf
92 container-title: Journal of Computational Chemistry
92 container-title: Journal of Computational Chemistry
93− doi: "10.1002/(SICI)1096-987X(199803)19:4\\<377::AID-JCC1\\>3.0.CO;2-P"
93+ doi: "10.1002/(SICI)1096-987X(199803)19:4\\<377::AID-JCC1>3.0.CO;2-P"
94 id: sigfridsson
94 id: sigfridsson
95 issue: 4
95 issue: 4
96 issued: 1998
96 issued: 1998
test/command/chap1/spider.pngnew file

Binary file not shown.

test/command/chap1/text.mdnew file+17
@@ -0,0 +1,17 @@
1+# Chapter one
2+
3+A spider: ![spider](spider.png)
4+
5+Another spider: ![another spider][refspider]
6+
7+The moon: ![moon](../../lalune.jpg)
8+
9+Link to [spider picture](spider.png).
10+
11+URL left alone: [manual](https://pandoc.org/MANUAL.html).
12+
13+Absolute path left alone: [absolute](/foo/bar/baz.png).
14+
15+Link to fragment: [chapter two](#chapter-two).
16+
17+Empty path: [empty]().
test/command/chap2/spider.pngnew file

Binary file not shown.

test/command/chap2/text.mdnew file+5
@@ -0,0 +1,5 @@
1+# Chapter two
2+
3+A spider: ![spider](spider.png)
4+
5+[refspider]: spider.png
test/command/defaults-inheritance-2.md+1−1
@@ -1,5 +1,5 @@
1```
1```
2−% pandoc -d command/defaults6
2+% pandoc -d command/defaults6 2>&1
3^D
3^D
4Error: Circular defaults file reference in 'command/defaults7.yaml'
4Error: Circular defaults file reference in 'command/defaults7.yaml'
5```
5```
test/command/newif.mdnew file+55
@@ -0,0 +1,55 @@
1+```
2+% pandoc -f latex -t plain
3+\iftrue
4+should print
5+\iftrue
6+should print
7+\else
8+should not print
9+\fi
10+\else
11+should not print
12+\fi
13+
14+\iffalse
15+should not print
16+\else
17+\iftrue
18+should print
19+\else
20+should not print
21+\fi
22+\fi
23+
24+\newif\ifepub
25+
26+\ifepub
27+should not print
28+\fi
29+
30+\epubtrue
31+
32+\ifepub
33+should print
34+\else
35+should not print
36+\fi
37+
38+\epubfalse
39+
40+\ifepub
41+should not print
42+\else
43+should print
44+\fi
45+^D
46+should print
47+
48+should print
49+
50+should print
51+
52+should print
53+
54+should print
55+```
test/command/pandoc-citeproc-119.md+1−1
@@ -1,7 +1,7 @@
1```
1```
2% pandoc --citeproc -t markdown-citations
2% pandoc --citeproc -t markdown-citations
3---
3---
4−bibliography: 'command/biblatex-examples.bib'
4+bibliography: 'command/averroes.bib'
5csl: command/apa.csl
5csl: command/apa.csl
6---
6---
7
7
test/command/pandoc-citeproc-322.md+1−1
@@ -19,7 +19,7 @@ references:
19 type: 'article-journal'
19 type: 'article-journal'
20---
20---
21
21
22−Foo[@timmory__justice_1950].
22+Foo [@timmory__justice_1950].
23^D
23^D
24Foo.[^1]
24Foo.[^1]
25
25
test/command/pandoc-citeproc-356.md+2−7
@@ -15,11 +15,6 @@ references:
15
15
16[@bar]
16[@bar]
17^D
17^D
18−(Alice 2042)
18+[WARNING] Citeproc: citation bar not found
19−
19+(**bar?**)
20−::: {#refs .references .csl-bib-body .hanging-indent}
21−::: {#ref-foo .csl-entry}
22−Alice. 2042.
23−:::
24−:::
25```
20```
test/command/pandoc-citeproc-chicago-author-date.md+7−7
@@ -54,14 +54,14 @@ References {#references .unnumbered}
54
54
55([**nonexistent?**](#ref-nonexistent))
55([**nonexistent?**](#ref-nonexistent))
56
56
57−[Doe](#ref-item1) ([2005](#ref-item1)) says blah.
57+Doe ([2005](#ref-item1)) says blah.
58
58
59−[Doe](#ref-item1) ([2005, 30](#ref-item1)) says blah.
59+Doe ([2005, 30](#ref-item1)) says blah.
60
60
61−[Doe](#ref-item1) ([2005, 30](#ref-item1), with suffix) says blah.
61+Doe ([2005, 30](#ref-item1), with suffix) says blah.
62
62
63−[Doe](#ref-item1) ([2005](#ref-item1); [2006, 30](#ref-item2); see also
63+Doe ([2005](#ref-item1); [2006, 30](#ref-item2); see also [Doe and Roe
64−[Doe and Roe 2007](#ref-пункт3)) says blah.
64+2007](#ref-пункт3)) says blah.
65
65
66In a note.[^1]
66In a note.[^1]
67
67
@@ -98,8 +98,8 @@ edited by Sam Smith. Oxford: Oxford University Press.
98:::
98:::
99:::
99:::
100
100
101−[^1]: [Doe and Roe](#ref-пункт3) ([2007, 12](#ref-пункт3)) and a
101+[^1]: Doe and Roe ([2007, 12](#ref-пункт3)) and a citation without
102− citation without locators ([Doe and Roe 2007](#ref-пункт3)).
102+ locators ([Doe and Roe 2007](#ref-пункт3)).
103
103
104[^2]: Some citations (see [Doe 2005, chap. 3](#ref-item1);
104[^2]: Some citations (see [Doe 2005, chap. 3](#ref-item1);
105 [2006](#ref-item2); [Doe and Roe 2007](#ref-пункт3)).
105 [2006](#ref-item2); [Doe and Roe 2007](#ref-пункт3)).
test/command/pandoc-citeproc-chicago-fullnote-bibliography.md+6−7
@@ -55,13 +55,13 @@ References {#references .unnumbered}
55
55
56[^2]
56[^2]
57
57
58−[John Doe](#ref-item1)[^3] says blah.
58+John Doe[^3] says blah.
59
59
60−[Doe](#ref-item1)[^4] says blah.
60+Doe[^4] says blah.
61
61
62−[Doe](#ref-item1)[^5] says blah.
62+Doe[^5] says blah.
63
63
64−[Doe](#ref-item1)[^6] says blah.
64+Doe[^6] says blah.
65
65
66In a note.[^7]
66In a note.[^7]
67
67
@@ -112,9 +112,8 @@ Sam Smith. Oxford: Oxford University Press, 2007.
112 Roe, "Why Water Is Wet," in *Third Book*, ed. Sam Smith (Oxford:
112 Roe, "Why Water Is Wet," in *Third Book*, ed. Sam Smith (Oxford:
113 Oxford University Press, 2007)](#ref-пункт3).
113 Oxford University Press, 2007)](#ref-пункт3).
114
114
115−[^7]: [Doe and Roe](#ref-пункт3), ["Why Water Is Wet," 12](#ref-пункт3)
115+[^7]: Doe and Roe, ["Why Water Is Wet," 12](#ref-пункт3) and a citation
116− and a citation without locators ([Doe and Roe, "Why Water Is
116+ without locators ([Doe and Roe, "Why Water Is Wet"](#ref-пункт3)).
117− Wet"](#ref-пункт3)).
118
117
119[^8]: See [Doe, *First Book*, chap. 3](#ref-item1); also [Doe and Roe,
118[^8]: See [Doe, *First Book*, chap. 3](#ref-item1); also [Doe and Roe,
120 "Why Water Is Wet," 34--35](#ref-пункт3).
119 "Why Water Is Wet," 34--35](#ref-пункт3).
test/command/svg.md+1−1
@@ -2,7 +2,7 @@
2% pandoc -f latex -t icml
2% pandoc -f latex -t icml
3\includegraphics{command/corrupt.svg}
3\includegraphics{command/corrupt.svg}
4^D
4^D
5−[WARNING] Could not determine image size for 'command/corrupt.svg': could not determine image type
5+[WARNING] Could not determine image size for command/corrupt.svg: could not determine image type
6<ParagraphStyleRange AppliedParagraphStyle="ParagraphStyle/Paragraph">
6<ParagraphStyleRange AppliedParagraphStyle="ParagraphStyle/Paragraph">
7 <CharacterStyleRange AppliedCharacterStyle="$ID/NormalCharacterStyle">
7 <CharacterStyleRange AppliedCharacterStyle="$ID/NormalCharacterStyle">
8 <Rectangle Self="uec" StrokeWeight="0" ItemTransform="1 0 0 1 150 -100">
8 <Rectangle Self="uec" StrokeWeight="0" ItemTransform="1 0 0 1 150 -100">
test/docx/0_level_headers.native+2−2
@@ -1,6 +1,6 @@
1[Table ("",[],[]) (Caption Nothing
1[Table ("",[],[]) (Caption Nothing
2 [])
2 [])
3− [(AlignDefault,ColWidthDefault)]
3+ [(AlignDefault,ColWidth 1.0)]
4 (TableHead ("",[],[])
4 (TableHead ("",[],[])
5 [])
5 [])
6 [(TableBody ("",[],[]) (RowHeadColumns 0)
6 [(TableBody ("",[],[]) (RowHeadColumns 0)
@@ -49,4 +49,4 @@
49,Para [Strong [Str "Table",Space,Str "Page"]]
49,Para [Strong [Str "Table",Space,Str "Page"]]
50,Para [Strong [Str "No",Space,Str "table",Space,Str "of",Space,Str "figures",Space,Str "entries",Space,Str "found."]]
50,Para [Strong [Str "No",Space,Str "table",Space,Str "of",Space,Str "figures",Space,Str "entries",Space,Str "found."]]
51,Header 1 ("introduction",[],[]) [Str "Introduction"]
51,Header 1 ("introduction",[],[]) [Str "Introduction"]
52−,Para [Str "Nothing",Space,Str "to",Space,Str "introduce,",Space,Str "yet."]]
52+,Para [Str "Nothing",Space,Str "to",Space,Str "introduce,",Space,Str "yet."]]
test/docx/golden/block_quotes.docx

Binary file not shown.

test/docx/golden/codeblock.docx

Binary file not shown.

test/docx/golden/comments.docx

Binary file not shown.

test/docx/golden/custom_style_no_reference.docx

Binary file not shown.

test/docx/golden/custom_style_preserve.docx

Binary file not shown.

test/docx/golden/custom_style_reference.docx

Binary file not shown.

test/docx/golden/definition_list.docx

Binary file not shown.

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

Binary file not shown.

test/docx/golden/document-properties.docx

Binary file not shown.

test/docx/golden/headers.docx

Binary file not shown.

test/docx/golden/image.docx

Binary file not shown.

test/docx/golden/inline_code.docx

Binary file not shown.

test/docx/golden/inline_formatting.docx

Binary file not shown.

test/docx/golden/inline_images.docx

Binary file not shown.

test/docx/golden/link_in_notes.docx

Binary file not shown.

test/docx/golden/links.docx

Binary file not shown.

test/docx/golden/lists.docx

Binary file not shown.

test/docx/golden/lists_continuing.docx

Binary file not shown.

test/docx/golden/lists_multiple_initial.docx

Binary file not shown.

test/docx/golden/lists_restarting.docx

Binary file not shown.

test/docx/golden/nested_anchors_in_header.docx

Binary file not shown.

test/docx/golden/notes.docx

Binary file not shown.

test/docx/golden/raw-blocks.docx

Binary file not shown.

test/docx/golden/raw-bookmarks.docx

Binary file not shown.

test/docx/golden/table_one_row.docx

Binary file not shown.

test/docx/golden/table_with_list_cell.docx

Binary file not shown.

test/docx/golden/tables-default-widths.docxnew file

Binary file not shown.

test/docx/golden/tables.docx

Binary file not shown.

test/docx/golden/track_changes_deletion.docx

Binary file not shown.

test/docx/golden/track_changes_insertion.docx

Binary file not shown.

test/docx/golden/track_changes_move.docx

Binary file not shown.

test/docx/golden/track_changes_scrubbed_metadata.docx

Binary file not shown.

test/docx/golden/unicode.docx

Binary file not shown.

test/docx/golden/verbatim_subsuper.docx

Binary file not shown.

test/docx/sdt_elements.native+9−10
@@ -1,20 +1,19 @@
1[Table ("",[],[]) (Caption Nothing
1[Table ("",[],[]) (Caption Nothing
2 [])
2 [])
3− [(AlignDefault,ColWidthDefault)
3+ [(AlignDefault,ColWidth 0.22069570301081556)
4− ,(AlignDefault,ColWidthDefault)
4+ ,(AlignDefault,ColWidth 0.22069570301081556)
5− ,(AlignDefault,ColWidthDefault)]
5+ ,(AlignDefault,ColWidth 0.5586085939783689)]
6 (TableHead ("",[],[])
6 (TableHead ("",[],[])
7− [])
8− [(TableBody ("",[],[]) (RowHeadColumns 0)
9− []
10− [Row ("",[],[])
7+ [Row ("",[],[])
11 [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
8 [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
12 [Plain [Strong [Str "col1Header"]]]
9 [Plain [Strong [Str "col1Header"]]]
13 ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
10 ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
14 [Plain [Strong [Str "col2Header"]]]
11 [Plain [Strong [Str "col2Header"]]]
15 ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
12 ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
16− [Plain [Strong [Str "col3Header"]]]]
13+ [Plain [Strong [Str "col3Header"]]]]])
14+ [(TableBody ("",[],[]) (RowHeadColumns 0)
15+ []
17− ,Row ("",[],[])
16+ [Row ("",[],[])
18 [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
17 [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
19 [Plain [Str "col1",Space,Str "content"]]
18 [Plain [Str "col1",Space,Str "content"]]
20 ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
19 ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
@@ -22,4 +21,4 @@
22 ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
21 ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
23 [Plain [Str "col3",Space,Str "content"]]]])]
22 [Plain [Str "col3",Space,Str "content"]]]])]
24 (TableFoot ("",[],[])
23 (TableFoot ("",[],[])
25− [])]
24+ [])]
test/docx/table_captions_no_field.docxnew file

Binary file not shown.

test/docx/table_captions_no_field.nativenew file+34
@@ -0,0 +1,34 @@
1+[Para [Str "See",Space,Str "Table",Space,Str "5.1."]
2+,Para [Str "Table",Space,Str "5.1"]
3+,Table ("",[],[]) (Caption Nothing
4+ [])
5+ [(AlignDefault,ColWidth 0.7605739372523825)
6+ ,(AlignDefault,ColWidth 0.11971303137380876)
7+ ,(AlignDefault,ColWidth 0.11971303137380876)]
8+ (TableHead ("",[],[])
9+[Row ("",[],[])
10+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
11+ []
12+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
13+ [Plain [Str "Count"]]
14+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
15+ [Plain [Str "%"]]]])
16+ [(TableBody ("",[],[]) (RowHeadColumns 0)
17+ []
18+ [Row ("",[],[])
19+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
20+ [Plain [Str "First",Space,Str "option"]]
21+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
22+ [Plain [Str "242"]]
23+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
24+ [Plain [Str "45"]]]
25+,Row ("",[],[])
26+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
27+ [Plain [Str "Second",Space,Str "option"]]
28+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
29+ [Plain [Str "99"]]
30+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
31+ [Plain [Str "18"]]]])]
32+ (TableFoot ("",[],[])
33+ [])
34+,Header 2 ("section", [], []) []]
test/docx/table_captions_with_field.docxnew file

Binary file not shown.

test/docx/table_captions_with_field.nativenew file+54
@@ -0,0 +1,54 @@
1+[Para [Str "See",Space,Str "Table",Space,Str "1."]
2+,Para []
3+,Table ("",[],[]) (Caption Nothing
4+ [Para [Str "Table",Space,Str "1"]])
5+ [(AlignDefault,ColWidth 0.7605739372523825)
6+ ,(AlignDefault,ColWidth 0.11971303137380876)
7+ ,(AlignDefault,ColWidth 0.11971303137380876)]
8+ (TableHead ("",[],[])
9+[Row ("",[],[])
10+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
11+ []
12+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
13+ [Plain [Str "Count"]]
14+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
15+ [Plain [Str "%"]]]])
16+ [(TableBody ("",[],[]) (RowHeadColumns 0)
17+ []
18+ [Row ("",[],[])
19+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
20+ [Plain [Str "First",Space,Str "option"]]
21+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
22+ [Plain [Str "242"]]
23+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
24+ [Plain [Str "45"]]]
25+,Row ("",[],[])
26+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
27+ [Plain [Str "Second",Space,Str "option"]]
28+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
29+ [Plain [Str "99"]]
30+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
31+ [Plain [Str "18"]]]])]
32+ (TableFoot ("",[],[])
33+ [])
34+,Header 2 ("section", [], []) []
35+,Table ("",[],[]) (Caption Nothing
36+ [Para [Str "Table",Space,Str "2"]])
37+ [(AlignDefault,ColWidth 0.3332963620230701)
38+ ,(AlignDefault,ColWidth 0.3332963620230701)
39+ ,(AlignDefault,ColWidth 0.3334072759538598)]
40+ (TableHead ("",[],[])
41+ [Row ("",[],[])
42+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
43+ [Plain [Str "One"]]
44+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
45+ [Plain [Str "Two"]]
46+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
47+ [Plain [Str "Three"]]]])
48+ [(TableBody ("",[],[]) (RowHeadColumns 0)
49+ []
50+ [])]
51+ (TableFoot ("",[],[])
52+ [])
53+,Para []
54+,Para [Str "See",Space,Str "Table",Space,Str "2."]]
test/docx/table_header_rowspan.docxnew file

Binary file not shown.

test/docx/table_header_rowspan.nativenew file+189
@@ -0,0 +1,189 @@
1+[Table ("",[],[]) (Caption Nothing
2+ [])
3+ [(AlignDefault,ColWidth 0.30701754385964913)
4+ ,(AlignDefault,ColWidth 0.1364522417153996)
5+ ,(AlignDefault,ColWidth 0.10009746588693957)
6+ ,(AlignDefault,ColWidth 9.707602339181287e-2)
7+ ,(AlignDefault,ColWidth 7.719298245614035e-2)
8+ ,(AlignDefault,ColWidth 7.085769980506823e-2)
9+ ,(AlignDefault,ColWidth 7.09551656920078e-2)
10+ ,(AlignDefault,ColWidth 0.14035087719298245)]
11+ (TableHead ("",[],[])
12+[Row ("",[],[])
13+ [Cell ("",[],[]) AlignDefault (RowSpan 2) (ColSpan 1)
14+ [Plain [Str "A"]]
15+ ,Cell ("",[],[]) AlignDefault (RowSpan 2) (ColSpan 1)
16+ [Plain [Strong [Str "B"]]]
17+ ,Cell ("",[],[]) AlignDefault (RowSpan 2) (ColSpan 1)
18+ [Plain [Strong [Str "C"]]]
19+ ,Cell ("",[],[]) AlignDefault (RowSpan 2) (ColSpan 1)
20+ [Plain [Strong [Str "D"]]]
21+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 3)
22+ [Plain [Str "E"]]
23+ ,Cell ("",[],[]) AlignDefault (RowSpan 2) (ColSpan 1)
24+ [Plain [Str "F"]]]
25+,Row ("",[],[])
26+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
27+ [Plain [Strong [Str "G"]]]
28+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
29+ [Plain [Strong [Str "H"]]]
30+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
31+ [Plain [Strong [Str "I"]]]]])
32+ [(TableBody ("",[],[]) (RowHeadColumns 0)
33+ []
34+ [Row ("",[],[])
35+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
36+ [Plain [Str "1"]]
37+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
38+ [Plain [Str "2"]]
39+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
40+ [Plain [Str "3"]]
41+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
42+ [Plain [Str "4"]]
43+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
44+ [Plain [Str "5"]]
45+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
46+ [Plain [Str "6"]]
47+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
48+ [Plain [Str "7"]]
49+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
50+ [Plain [Str "8"]]]
51+ ,Row ("",[],[])
52+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
53+ [Plain [Str "1"]]
54+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
55+ [Plain [Str "2"]]
56+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
57+ [Plain [Str "3"]]
58+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
59+ [Plain [Str "4"]]
60+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
61+ [Plain [Str "5"]]
62+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
63+ [Plain [Str "6"]]
64+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
65+ [Plain [Str "7"]]
66+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
67+ [Plain [Str "8"]]]
68+ ,Row ("",[],[])
69+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
70+ [Plain [Str "1"]]
71+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
72+ [Plain [Str "2"]]
73+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
74+ [Plain [Str "3"]]
75+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
76+ [Plain [Str "4"]]
77+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
78+ [Plain [Str "5"]]
79+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
80+ [Plain [Str "6"]]
81+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
82+ [Plain [Str "7"]]
83+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
84+ [Plain [Str "8"]]]
85+ ,Row ("",[],[])
86+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
87+ [Plain [Str "1"]]
88+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
89+ [Plain [Str "2"]]
90+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
91+ [Plain [Str "3"]]
92+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
93+ [Plain [Str "4"]]
94+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
95+ [Plain [Str "5"]]
96+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
97+ [Plain [Str "6"]]
98+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
99+ [Plain [Str "7"]]
100+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
101+ [Plain [Str "8"]]]
102+ ,Row ("",[],[])
103+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
104+ [Plain [Str "1"]]
105+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
106+ [Plain [Str "2"]]
107+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
108+ [Plain [Str "3"]]
109+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
110+ [Plain [Str "4"]]
111+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
112+ [Plain [Str "5"]]
113+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
114+ [Plain [Str "6"]]
115+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
116+ [Plain [Str "7"]]
117+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
118+ [Plain [Str "8"]]]
119+ ,Row ("",[],[])
120+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
121+ [Plain [Str "1"]]
122+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
123+ [Plain [Str "2"]]
124+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
125+ [Plain [Str "3"]]
126+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
127+ [Plain [Str "4"]]
128+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
129+ [Plain [Str "5"]]
130+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
131+ [Plain [Str "6"]]
132+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
133+ [Plain [Str "7"]]
134+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
135+ [Plain [Str "8"]]]
136+ ,Row ("",[],[])
137+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
138+ [Plain [Str "1"]]
139+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
140+ [Plain [Str "2"]]
141+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
142+ [Plain [Str "3"]]
143+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
144+ [Plain [Str "4"]]
145+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
146+ [Plain [Str "5"]]
147+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
148+ [Plain [Str "6"]]
149+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
150+ [Plain [Str "7"]]
151+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
152+ [Plain [Str "8"]]]
153+ ,Row ("",[],[])
154+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
155+ [Plain [Str "1"]]
156+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
157+ [Plain [Str "2"]]
158+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
159+ [Plain [Str "3"]]
160+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
161+ [Plain [Str "4"]]
162+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
163+ [Plain [Str "5"]]
164+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
165+ [Plain [Str "6"]]
166+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
167+ [Plain [Str "7"]]
168+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
169+ [Plain [Str "8"]]]
170+ ,Row ("",[],[])
171+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
172+ [Plain [Str "1"]]
173+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
174+ [Plain [Str "2"]]
175+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
176+ [Plain [Str "3"]]
177+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
178+ [Plain [Str "4"]]
179+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
180+ [Plain [Str "5"]]
181+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
182+ [Plain [Str "6"]]
183+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
184+ [Plain [Str "7"]]
185+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
186+ [Plain [Str "8"]]]
187+ ])]
188+ (TableFoot ("",[],[])
189+ [])]
test/docx/table_one_header_row.docxnew file

Binary file not shown.

test/docx/table_one_header_row.nativenew file+18
@@ -0,0 +1,18 @@
1+[Table ("",[],[]) (Caption Nothing
2+ [])
3+ [(AlignDefault,ColWidth 0.33302433371958284)
4+ ,(AlignDefault,ColWidth 0.3332560834298957)
5+ ,(AlignDefault,ColWidth 0.33371958285052145)]
6+ (TableHead ("",[],[])
7+ [Row ("",[],[])
8+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
9+ [Plain [Str "One"]]
10+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
11+ [Plain [Str "Row"]]
12+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
13+ [Plain [Str "Table"]]]])
14+ [(TableBody ("",[],[]) (RowHeadColumns 0)
15+ []
16+ [])]
17+ (TableFoot ("",[],[])
18+ [])]
test/docx/table_one_row.docx

Binary file not shown.

test/docx/table_one_row.native+4−4
@@ -1,8 +1,8 @@
1[Table ("",[],[]) (Caption Nothing
1[Table ("",[],[]) (Caption Nothing
2 [])
2 [])
3− [(AlignDefault,ColWidthDefault)
3+ [(AlignDefault,ColWidth 0.3333333333333333)
4− ,(AlignDefault,ColWidthDefault)
4+ ,(AlignDefault,ColWidth 0.3333333333333333)
5− ,(AlignDefault,ColWidthDefault)]
5+ ,(AlignDefault,ColWidth 0.3333333333333333)]
6 (TableHead ("",[],[])
6 (TableHead ("",[],[])
7 [])
7 [])
8 [(TableBody ("",[],[]) (RowHeadColumns 0)
8 [(TableBody ("",[],[]) (RowHeadColumns 0)
@@ -15,4 +15,4 @@
15 ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
15 ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
16 [Plain [Str "Table"]]]])]
16 [Plain [Str "Table"]]]])]
17 (TableFoot ("",[],[])
17 (TableFoot ("",[],[])
18− [])]
18+ [])]
test/docx/table_variable_width.native+12−17
@@ -1,10 +1,11 @@
1[Table ("",[],[]) (Caption Nothing
1[Table ("",[],[]) (Caption Nothing
2 [])
2 [])
3− [(AlignDefault,ColWidthDefault)
3+ [(AlignDefault,ColWidth 2.0096205237840725e-2)
4− ,(AlignDefault,ColWidthDefault)
4+ ,(AlignDefault,ColWidth 1.9882415820416888e-2)
5− ,(AlignDefault,ColWidthDefault)
5+ ,(AlignDefault,ColWidth 0.22202030999465527)
6− ,(AlignDefault,ColWidthDefault)
6+ ,(AlignDefault,ColWidth 0.4761090326028862)
7− ,(AlignDefault,ColWidthDefault)]
7+ ,(AlignDefault,ColWidth 1.0689470871191876e-4)
8+ ,(AlignDefault,ColWidth 0.26178514163548905)]
8 (TableHead ("",[],[])
9 (TableHead ("",[],[])
9 [Row ("",[],[])
10 [Row ("",[],[])
10 [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
11 [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
@@ -13,33 +14,27 @@
13 []
14 []
14 ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
15 ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
15 [Plain [Str "h3"]]
16 [Plain [Str "h3"]]
16− ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
17+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 2)
17 [Plain [Str "h4"]]
18 [Plain [Str "h4"]]
18 ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
19 ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
19 [Plain [Str "h5"]]]])
20 [Plain [Str "h5"]]]])
20 [(TableBody ("",[],[]) (RowHeadColumns 0)
21 [(TableBody ("",[],[]) (RowHeadColumns 0)
21 []
22 []
22 [Row ("",[],[])
23 [Row ("",[],[])
23− [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
24+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 3)
24 [Plain [Str "c11"]]
25 [Plain [Str "c11"]]
25 ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
26 ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
26 []
27 []
27− ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
28+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 2)
28− []
29− ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
30− []
31− ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
32 []]
29 []]
33 ,Row ("",[],[])
30 ,Row ("",[],[])
34 [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
31 [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
35 []
32 []
36− ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
33+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 2)
37 [Plain [Str "c22"]]
34 [Plain [Str "c22"]]
38 ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
35 ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
39 [Plain [Str "c23"]]
36 [Plain [Str "c23"]]
40− ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
37+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 2)
41− []
42− ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
43 []]])]
38 []]])]
44 (TableFoot ("",[],[])
39 (TableFoot ("",[],[])
45− [])]
40+ [])]
test/docx/table_with_list_cell.native+3−3
@@ -1,7 +1,7 @@
1[Table ("",[],[]) (Caption Nothing
1[Table ("",[],[]) (Caption Nothing
2 [])
2 [])
3− [(AlignDefault,ColWidthDefault)
3+ [(AlignDefault,ColWidth 0.5)
4− ,(AlignDefault,ColWidthDefault)]
4+ ,(AlignDefault,ColWidth 0.5)]
5 (TableHead ("",[],[])
5 (TableHead ("",[],[])
6 [Row ("",[],[])
6 [Row ("",[],[])
7 [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
7 [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
@@ -22,4 +22,4 @@
22 ,[Para [Str "A"]]
22 ,[Para [Str "A"]]
23 ,[Para [Str "Numbered",Space,Str "list."]]]]]])]
23 ,[Para [Str "Numbered",Space,Str "list."]]]]]])]
24 (TableFoot ("",[],[])
24 (TableFoot ("",[],[])
25− [])]
25+ [])]
test/docx/tables-default-widths.nativenew file+92
@@ -0,0 +1,92 @@
1+[Header 2 ("a-table-with-and-without-a-header-row",[],[]) [Str "A",Space,Str "table,",Space,Str "with",Space,Str "and",Space,Str "without",Space,Str "a",Space,Str "header",Space,Str "row"]
2+,Table ("",[],[]) (Caption Nothing
3+ [])
4+ [(AlignDefault,ColWidthDefault)
5+ ,(AlignDefault,ColWidthDefault)
6+ ,(AlignDefault,ColWidthDefault)
7+ ,(AlignDefault,ColWidthDefault)]
8+ (TableHead ("",[],[])
9+ [Row ("",[],[])
10+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
11+ [Plain [Str "Name"]]
12+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
13+ [Plain [Str "Game"]]
14+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
15+ [Plain [Str "Fame"]]
16+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
17+ [Plain [Str "Blame"]]]])
18+ [(TableBody ("",[],[]) (RowHeadColumns 0)
19+ []
20+ [Row ("",[],[])
21+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
22+ [Plain [Str "Lebron",Space,Str "James"]]
23+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
24+ [Plain [Str "Basketball"]]
25+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
26+ [Plain [Str "Very",Space,Str "High"]]
27+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
28+ [Plain [Str "Leaving",Space,Str "Cleveland"]]]
29+ ,Row ("",[],[])
30+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
31+ [Plain [Str "Ryan",Space,Str "Braun"]]
32+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
33+ [Plain [Str "Baseball"]]
34+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
35+ [Plain [Str "Moderate"]]
36+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
37+ [Plain [Str "Steroids"]]]
38+ ,Row ("",[],[])
39+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
40+ [Plain [Str "Russell",Space,Str "Wilson"]]
41+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
42+ [Plain [Str "Football"]]
43+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
44+ [Plain [Str "High"]]
45+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
46+ [Plain [Str "Tacky",Space,Str "uniform"]]]])]
47+ (TableFoot ("",[],[])
48+ [])
49+,Table ("",[],[]) (Caption Nothing
50+ [])
51+ [(AlignDefault,ColWidthDefault)
52+ ,(AlignDefault,ColWidthDefault)]
53+ (TableHead ("",[],[])
54+ [])
55+ [(TableBody ("",[],[]) (RowHeadColumns 0)
56+ []
57+ [Row ("",[],[])
58+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
59+ [Plain [Str "Sinple"]]
60+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
61+ [Plain [Str "Table"]]]
62+ ,Row ("",[],[])
63+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
64+ [Plain [Str "Without"]]
65+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
66+ [Plain [Str "Header"]]]])]
67+ (TableFoot ("",[],[])
68+ [])
69+,Table ("",[],[]) (Caption Nothing
70+ [])
71+ [(AlignDefault,ColWidthDefault)
72+ ,(AlignDefault,ColWidthDefault)]
73+ (TableHead ("",[],[])
74+ [])
75+ [(TableBody ("",[],[]) (RowHeadColumns 0)
76+ []
77+ [Row ("",[],[])
78+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
79+ [Para [Str "Simple"]
80+ ,Para [Str "Multiparagraph"]]
81+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
82+ [Para [Str "Table"]
83+ ,Para [Str "Full"]]]
84+ ,Row ("",[],[])
85+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
86+ [Para [Str "Of"]
87+ ,Para [Str "Paragraphs"]]
88+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
89+ [Para [Str "In",Space,Str "each"]
90+ ,Para [Str "Cell."]]]])]
91+ (TableFoot ("",[],[])
92+ [])]
test/docx/tables.native+9−9
@@ -1,10 +1,10 @@
1[Header 2 ("a-table-with-and-without-a-header-row",[],[]) [Str "A",Space,Str "table,",Space,Str "with",Space,Str "and",Space,Str "without",Space,Str "a",Space,Str "header",Space,Str "row"]
1[Header 2 ("a-table-with-and-without-a-header-row",[],[]) [Str "A",Space,Str "table,",Space,Str "with",Space,Str "and",Space,Str "without",Space,Str "a",Space,Str "header",Space,Str "row"]
2,Table ("",[],[]) (Caption Nothing
2,Table ("",[],[]) (Caption Nothing
3 [])
3 [])
4− [(AlignDefault,ColWidthDefault)
4+ [(AlignDefault,ColWidth 0.25)
5− ,(AlignDefault,ColWidthDefault)
5+ ,(AlignDefault,ColWidth 0.25)
6− ,(AlignDefault,ColWidthDefault)
6+ ,(AlignDefault,ColWidth 0.25)
7− ,(AlignDefault,ColWidthDefault)]
7+ ,(AlignDefault,ColWidth 0.25)]
8 (TableHead ("",[],[])
8 (TableHead ("",[],[])
9 [Row ("",[],[])
9 [Row ("",[],[])
10 [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
10 [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
@@ -48,8 +48,8 @@
48 [])
48 [])
49,Table ("",[],[]) (Caption Nothing
49,Table ("",[],[]) (Caption Nothing
50 [])
50 [])
51− [(AlignDefault,ColWidthDefault)
51+ [(AlignDefault,ColWidth 0.5)
52− ,(AlignDefault,ColWidthDefault)]
52+ ,(AlignDefault,ColWidth 0.5)]
53 (TableHead ("",[],[])
53 (TableHead ("",[],[])
54 [])
54 [])
55 [(TableBody ("",[],[]) (RowHeadColumns 0)
55 [(TableBody ("",[],[]) (RowHeadColumns 0)
@@ -68,8 +68,8 @@
68 [])
68 [])
69,Table ("",[],[]) (Caption Nothing
69,Table ("",[],[]) (Caption Nothing
70 [])
70 [])
71− [(AlignDefault,ColWidthDefault)
71+ [(AlignDefault,ColWidth 0.5)
72− ,(AlignDefault,ColWidthDefault)]
72+ ,(AlignDefault,ColWidth 0.5)]
73 (TableHead ("",[],[])
73 (TableHead ("",[],[])
74 [])
74 [])
75 [(TableBody ("",[],[]) (RowHeadColumns 0)
75 [(TableBody ("",[],[]) (RowHeadColumns 0)
@@ -89,4 +89,4 @@
89 [Para [Str "In",Space,Str "each"]
89 [Para [Str "In",Space,Str "each"]
90 ,Para [Str "Cell."]]]])]
90 ,Para [Str "Cell."]]]])]
91 (TableFoot ("",[],[])
91 (TableFoot ("",[],[])
92− [])]
92+ [])]
test/epub/wasteland.epub

Binary file not shown.

test/fb2/images.fb2+1−1
@@ -1,2 +1,2 @@
1<?xml version="1.0" encoding="UTF-8"?>
1<?xml version="1.0" encoding="UTF-8"?>
2−<FictionBook xmlns="http://www.gribuser.ru/xml/fictionbook/2.0" xmlns:l="http://www.w3.org/1999/xlink"><description><title-info><genre>unrecognised</genre></title-info><document-info><program-used>pandoc</program-used></document-info></description><body><title><p /></title><section><p>This example test if Pandoc correctly embeds images into FictionBook.</p><p>Small inline image: <image l:href="#image1" l:type="inlineImageType" alt="alt text a small PNG image" />.</p><p>Paragraph image:</p><image l:href="#image2" l:type="imageType" alt="alt text of a big JPEG image" title="image title text" /><p>alt text of a big missing image</p><p>A missing image inline: alt text of missing image.</p></section></body><binary id="image2" content-type="image/jpeg">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</binary><binary id="image1" content-type="image/png">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</binary></FictionBook>
2+<FictionBook xmlns="http://www.gribuser.ru/xml/fictionbook/2.0" xmlns:l="http://www.w3.org/1999/xlink"><description><title-info><genre>unrecognised</genre></title-info><document-info><program-used>pandoc</program-used></document-info></description><body><title><p /></title><section><p>This example test if Pandoc correctly embeds images into FictionBook.</p><p>Small inline image: <image l:href="#image1" l:type="inlineImageType" alt="alt text a small PNG image" />.</p><p>Paragraph image:</p><image l:href="#image2" l:type="imageType" alt="alt text of a big JPEG image" title="image title text" /><p>alt text of a big missing image</p><p>A missing image inline: alt text of missing image.</p></section></body><binary id="image2" content-type="image/jpeg">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</binary><binary id="image1" content-type="image/png">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</binary></FictionBook>
test/fb2/test.jpg

Binary file not shown.

test/html-reader.native+2−1
@@ -1,5 +1,6 @@
1Pandoc (Meta {unMeta = fromList [("generator",MetaInlines [Str "pandoc"]),("title",MetaInlines [Str "Pandoc",Space,Str "Test",Space,Str "Suite"])]})
1Pandoc (Meta {unMeta = fromList [("generator",MetaInlines [Str "pandoc"]),("title",MetaInlines [Str "Pandoc",Space,Str "Test",Space,Str "Suite"])]})
2+[Header 1 ("pandoc-test-suite",["title"],[]) [Str "Pandoc",Space,Str "Test",Space,Str "Suite"]
2−[Para [Str "This",Space,Str "is",Space,Str "a",Space,Str "set",Space,Str "of",Space,Str "tests",Space,Str "for",Space,Str "pandoc.",Space,Str "Most",Space,Str "of",Space,Str "them",Space,Str "are",Space,Str "adapted",Space,Str "from",Space,Str "John",Space,Str "Gruber's",Space,Str "markdown",Space,Str "test",Space,Str "suite."]
3+,Para [Str "This",Space,Str "is",Space,Str "a",Space,Str "set",Space,Str "of",Space,Str "tests",Space,Str "for",Space,Str "pandoc.",Space,Str "Most",Space,Str "of",Space,Str "them",Space,Str "are",Space,Str "adapted",Space,Str "from",Space,Str "John",Space,Str "Gruber's",Space,Str "markdown",Space,Str "test",Space,Str "suite."]
3,HorizontalRule
4,HorizontalRule
4,Header 1 ("headers",[],[]) [Str "Headers"]
5,Header 1 ("headers",[],[]) [Str "Headers"]
5,Header 2 ("level-2-with-an-embedded-link",[],[]) [Str "Level",Space,Str "2",Space,Str "with",Space,Str "an",Space,Link ("",[],[]) [Str "embedded",Space,Str "link"] ("/url","")]
6,Header 2 ("level-2-with-an-embedded-link",[],[]) [Str "Level",Space,Str "2",Space,Str "with",Space,Str "an",Space,Link ("",[],[]) [Str "embedded",Space,Str "link"] ("/url","")]
test/lhs-test.html+2−1
@@ -21,7 +21,7 @@
21 padding-top: 50px;
21 padding-top: 50px;
22 padding-bottom: 50px;
22 padding-bottom: 50px;
23 hyphens: auto;
23 hyphens: auto;
24− word-wrap: break-word;
24+ overflow-wrap: break-word;
25 text-rendering: optimizeLegibility;
25 text-rendering: optimizeLegibility;
26 font-kerning: normal;
26 font-kerning: normal;
27 }
27 }
@@ -92,6 +92,7 @@
92 pre code {
92 pre code {
93 padding: 0;
93 padding: 0;
94 overflow: visible;
94 overflow: visible;
95+ overflow-wrap: normal;
95 }
96 }
96 .sourceCode {
97 .sourceCode {
97 background-color: transparent;
98 background-color: transparent;
test/lhs-test.html+lhs+2−1
@@ -21,7 +21,7 @@
21 padding-top: 50px;
21 padding-top: 50px;
22 padding-bottom: 50px;
22 padding-bottom: 50px;
23 hyphens: auto;
23 hyphens: auto;
24− word-wrap: break-word;
24+ overflow-wrap: break-word;
25 text-rendering: optimizeLegibility;
25 text-rendering: optimizeLegibility;
26 font-kerning: normal;
26 font-kerning: normal;
27 }
27 }
@@ -92,6 +92,7 @@
92 pre code {
92 pre code {
93 padding: 0;
93 padding: 0;
94 overflow: visible;
94 overflow: visible;
95+ overflow-wrap: normal;
95 }
96 }
96 .sourceCode {
97 .sourceCode {
97 background-color: transparent;
98 background-color: transparent;
test/pipe-tables.native+2−10
@@ -131,13 +131,7 @@
131 ,(AlignLeft,ColWidthDefault)
131 ,(AlignLeft,ColWidthDefault)
132 ,(AlignCenter,ColWidthDefault)]
132 ,(AlignCenter,ColWidthDefault)]
133 (TableHead ("",[],[])
133 (TableHead ("",[],[])
134− [Row ("",[],[])
135− [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
136− []
137− ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
138− []
139− ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
140− []]])
134+ [])
141 [(TableBody ("",[],[]) (RowHeadColumns 0)
135 [(TableBody ("",[],[]) (RowHeadColumns 0)
142 []
136 []
143 [Row ("",[],[])
137 [Row ("",[],[])
@@ -213,9 +207,7 @@
213 [])
207 [])
214 [(AlignCenter,ColWidthDefault)]
208 [(AlignCenter,ColWidthDefault)]
215 (TableHead ("",[],[])
209 (TableHead ("",[],[])
216− [Row ("",[],[])
217− [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
218− []]])
210+ [])
219 [(TableBody ("",[],[]) (RowHeadColumns 0)
211 [(TableBody ("",[],[]) (RowHeadColumns 0)
220 []
212 []
221 [Row ("",[],[])
213 [Row ("",[],[])
test/pptx/code-custom_templated.pptx

Binary file not shown.

test/pptx/code_templated.pptx

Binary file not shown.

test/pptx/document-properties-short-desc_templated.pptx

Binary file not shown.

test/pptx/document-properties_templated.pptx

Binary file not shown.

test/pptx/endnotes_templated.pptx

Binary file not shown.

test/pptx/endnotes_toc_templated.pptx

Binary file not shown.

test/pptx/images_templated.pptx

Binary file not shown.

test/pptx/inline_formatting_templated.pptx

Binary file not shown.

test/pptx/lists_templated.pptx

Binary file not shown.

test/pptx/raw_ooxml_templated.pptx

Binary file not shown.

test/pptx/reference_depth.pptx

Binary file not shown.

test/pptx/remove_empty_slides_templated.pptx

Binary file not shown.

test/pptx/slide_breaks_slide_level_1_templated.pptx

Binary file not shown.

test/pptx/slide_breaks_templated.pptx

Binary file not shown.

test/pptx/slide_breaks_toc_templated.pptx

Binary file not shown.

test/pptx/speaker_notes_after_metadata_templated.pptx

Binary file not shown.

test/pptx/speaker_notes_afterheader_templated.pptx

Binary file not shown.

test/pptx/speaker_notes_afterseps_templated.pptx

Binary file not shown.

test/pptx/speaker_notes_templated.pptx

Binary file not shown.

test/pptx/start_numbering_at_templated.pptx

Binary file not shown.

test/pptx/tables_templated.pptx

Binary file not shown.

test/pptx/two_column_templated.pptx

Binary file not shown.

test/tables.latex+27−3
@@ -56,11 +56,27 @@ Multiline table with caption:
56 >{\raggedright\arraybackslash}p{(\columnwidth - 6\tabcolsep) * \real{0.35}}@{}}
56 >{\raggedright\arraybackslash}p{(\columnwidth - 6\tabcolsep) * \real{0.35}}@{}}
57\caption{Here's the caption. It may span multiple lines.}\tabularnewline
57\caption{Here's the caption. It may span multiple lines.}\tabularnewline
58\toprule
58\toprule
59+\begin{minipage}[b]{\linewidth}\centering
59−Centered Header & Left Aligned & Right Aligned & Default aligned \\
60+Centered Header
61+\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright
62+Left Aligned
63+\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedleft
64+Right Aligned
65+\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright
66+Default aligned
67+\end{minipage} \\
60\midrule
68\midrule
61\endfirsthead
69\endfirsthead
62\toprule
70\toprule
71+\begin{minipage}[b]{\linewidth}\centering
63−Centered Header & Left Aligned & Right Aligned & Default aligned \\
72+Centered Header
73+\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright
74+Left Aligned
75+\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedleft
76+Right Aligned
77+\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright
78+Default aligned
79+\end{minipage} \\
64\midrule
80\midrule
65\endhead
81\endhead
66First & row & 12.0 & Example of a row that spans multiple lines. \\
82First & row & 12.0 & Example of a row that spans multiple lines. \\
@@ -76,7 +92,15 @@ Multiline table without caption:
76 >{\raggedleft\arraybackslash}p{(\columnwidth - 6\tabcolsep) * \real{0.16}}
92 >{\raggedleft\arraybackslash}p{(\columnwidth - 6\tabcolsep) * \real{0.16}}
77 >{\raggedright\arraybackslash}p{(\columnwidth - 6\tabcolsep) * \real{0.35}}@{}}
93 >{\raggedright\arraybackslash}p{(\columnwidth - 6\tabcolsep) * \real{0.35}}@{}}
78\toprule
94\toprule
95+\begin{minipage}[b]{\linewidth}\centering
79−Centered Header & Left Aligned & Right Aligned & Default aligned \\
96+Centered Header
97+\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright
98+Left Aligned
99+\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedleft
100+Right Aligned
101+\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright
102+Default aligned
103+\end{minipage} \\
80\midrule
104\midrule
81\endhead
105\endhead
82First & row & 12.0 & Example of a row that spans multiple lines. \\
106First & row & 12.0 & Example of a row that spans multiple lines. \\
test/tables.ms+30
@@ -143,6 +143,7 @@ Multiline table with caption:
143.PP
143.PP
144Here\[cq]s the caption. It may span multiple lines.
144Here\[cq]s the caption. It may span multiple lines.
145.na
145.na
146+.nr LLold \n[LL]
146.TS
147.TS
147delim(@@) tab( );
148delim(@@) tab( );
148cw(10.5n) lw(9.6n) rw(11.4n) lw(24.5n).
149cw(10.5n) lw(9.6n) rw(11.4n) lw(24.5n).
@@ -157,30 +158,40 @@ Default aligned
157T}
158T}
158_
159_
159T{
160T{
161+.nr LL 10.5n
160First
162First
161T} T{
163T} T{
164+.nr LL 9.6n
162row
165row
163T} T{
166T} T{
167+.nr LL 11.4n
16412.0
16812.0
165T} T{
169T} T{
170+.nr LL 24.5n
166Example of a row that spans multiple lines.
171Example of a row that spans multiple lines.
167T}
172T}
168T{
173T{
174+.nr LL 10.5n
169Second
175Second
170T} T{
176T} T{
177+.nr LL 9.6n
171row
178row
172T} T{
179T} T{
180+.nr LL 11.4n
1735.0
1815.0
174T} T{
182T} T{
183+.nr LL 24.5n
175Here\[cq]s another one.
184Here\[cq]s another one.
176Note the blank line between rows.
185Note the blank line between rows.
177T}
186T}
178.TE
187.TE
188+.nr LL \n[LLold]
179.ad
189.ad
180.LP
190.LP
181Multiline table without caption:
191Multiline table without caption:
182.PP
192.PP
183.na
193.na
194+.nr LLold \n[LL]
184.TS
195.TS
185delim(@@) tab( );
196delim(@@) tab( );
186cw(10.5n) lw(9.6n) rw(11.4n) lw(24.5n).
197cw(10.5n) lw(9.6n) rw(11.4n) lw(24.5n).
@@ -195,25 +206,34 @@ Default aligned
195T}
206T}
196_
207_
197T{
208T{
209+.nr LL 10.5n
198First
210First
199T} T{
211T} T{
212+.nr LL 9.6n
200row
213row
201T} T{
214T} T{
215+.nr LL 11.4n
20212.0
21612.0
203T} T{
217T} T{
218+.nr LL 24.5n
204Example of a row that spans multiple lines.
219Example of a row that spans multiple lines.
205T}
220T}
206T{
221T{
222+.nr LL 10.5n
207Second
223Second
208T} T{
224T} T{
225+.nr LL 9.6n
209row
226row
210T} T{
227T} T{
228+.nr LL 11.4n
2115.0
2295.0
212T} T{
230T} T{
231+.nr LL 24.5n
213Here\[cq]s another one.
232Here\[cq]s another one.
214Note the blank line between rows.
233Note the blank line between rows.
215T}
234T}
216.TE
235.TE
236+.nr LL \n[LLold]
217.ad
237.ad
218.LP
238.LP
219Table without column headers:
239Table without column headers:
@@ -255,27 +275,37 @@ T}
255Multiline table without column headers:
275Multiline table without column headers:
256.PP
276.PP
257.na
277.na
278+.nr LLold \n[LL]
258.TS
279.TS
259delim(@@) tab( );
280delim(@@) tab( );
260cw(10.5n) lw(9.6n) rw(11.4n) lw(24.5n).
281cw(10.5n) lw(9.6n) rw(11.4n) lw(24.5n).
261T{
282T{
283+.nr LL 10.5n
262First
284First
263T} T{
285T} T{
286+.nr LL 9.6n
264row
287row
265T} T{
288T} T{
289+.nr LL 11.4n
26612.0
29012.0
267T} T{
291T} T{
292+.nr LL 24.5n
268Example of a row that spans multiple lines.
293Example of a row that spans multiple lines.
269T}
294T}
270T{
295T{
296+.nr LL 10.5n
271Second
297Second
272T} T{
298T} T{
299+.nr LL 9.6n
273row
300row
274T} T{
301T} T{
302+.nr LL 11.4n
2755.0
3035.0
276T} T{
304T} T{
305+.nr LL 24.5n
277Here\[cq]s another one.
306Here\[cq]s another one.
278Note the blank line between rows.
307Note the blank line between rows.
279T}
308T}
280.TE
309.TE
310+.nr LL \n[LLold]
281.ad
311.ad
test/tables/nordics.latex+22−4
@@ -5,13 +5,31 @@
5 >{\raggedright\arraybackslash}p{(\columnwidth - 6\tabcolsep) * \real{0.20}}@{}}
5 >{\raggedright\arraybackslash}p{(\columnwidth - 6\tabcolsep) * \real{0.20}}@{}}
6\caption{States belonging to the \emph{Nordics.}}\tabularnewline
6\caption{States belonging to the \emph{Nordics.}}\tabularnewline
7\toprule
7\toprule
8−Name & Capital & \vtop{\hbox{\strut Population}\hbox{\strut (in 2018)}} &
8+\begin{minipage}[b]{\linewidth}\centering
9+Name
10+\end{minipage} & \begin{minipage}[b]{\linewidth}\centering
11+Capital
12+\end{minipage} & \begin{minipage}[b]{\linewidth}\centering
13+Population\\
14+(in 2018)\strut
15+\end{minipage} & \begin{minipage}[b]{\linewidth}\centering
16+Area\\
9−\vtop{\hbox{\strut Area}\hbox{\strut (in km\textsuperscript{2})}} \\
17+(in km\textsuperscript{2})\strut
18+\end{minipage} \\
10\midrule
19\midrule
11\endfirsthead
20\endfirsthead
12\toprule
21\toprule
13−Name & Capital & \vtop{\hbox{\strut Population}\hbox{\strut (in 2018)}} &
22+\begin{minipage}[b]{\linewidth}\centering
23+Name
24+\end{minipage} & \begin{minipage}[b]{\linewidth}\centering
25+Capital
26+\end{minipage} & \begin{minipage}[b]{\linewidth}\centering
27+Population\\
28+(in 2018)\strut
29+\end{minipage} & \begin{minipage}[b]{\linewidth}\centering
30+Area\\
14−\vtop{\hbox{\strut Area}\hbox{\strut (in km\textsuperscript{2})}} \\
31+(in km\textsuperscript{2})\strut
32+\end{minipage} \\
15\midrule
33\midrule
16\endhead
34\endhead
17Denmark & Copenhagen & 5,809,502 & 43,094 \\
35Denmark & Copenhagen & 5,809,502 & 43,094 \\
test/tables/planets.latex+4−4
@@ -1,18 +1,18 @@
1\begin{longtable}[]{@{}cclrrrrrrrrl@{}}
1\begin{longtable}[]{@{}cclrrrrrrrrl@{}}
2\caption{Data about the planets of our solar system.}\tabularnewline
2\caption{Data about the planets of our solar system.}\tabularnewline
3\toprule
3\toprule
4−\multicolumn{2}{l}{} & Name & Mass (10\^{}24kg) & Diameter (km) & Density
4+\multicolumn{2}{c}{} & Name & Mass (10\^{}24kg) & Diameter (km) & Density
5(kg/m\^{}3) & Gravity (m/s\^{}2) & Length of day (hours) & Distance from Sun
5(kg/m\^{}3) & Gravity (m/s\^{}2) & Length of day (hours) & Distance from Sun
6(10\^{}6km) & Mean temperature (C) & Number of moons & Notes \\
6(10\^{}6km) & Mean temperature (C) & Number of moons & Notes \\
7\midrule
7\midrule
8\endfirsthead
8\endfirsthead
9\toprule
9\toprule
10−\multicolumn{2}{l}{} & Name & Mass (10\^{}24kg) & Diameter (km) & Density
10+\multicolumn{2}{c}{} & Name & Mass (10\^{}24kg) & Diameter (km) & Density
11(kg/m\^{}3) & Gravity (m/s\^{}2) & Length of day (hours) & Distance from Sun
11(kg/m\^{}3) & Gravity (m/s\^{}2) & Length of day (hours) & Distance from Sun
12(10\^{}6km) & Mean temperature (C) & Number of moons & Notes \\
12(10\^{}6km) & Mean temperature (C) & Number of moons & Notes \\
13\midrule
13\midrule
14\endhead
14\endhead
15−\multicolumn{2}{l}{\multirow{4}{*}{Terrestrial planets}} & Mercury & 0.330 &
15+\multicolumn{2}{c}{\multirow{4}{*}{Terrestrial planets}} & Mercury & 0.330 &
164,879 & 5427 & 3.7 & 4222.6 & 57.9 & 167 & 0 & Closest to the Sun \\
164,879 & 5427 & 3.7 & 4222.6 & 57.9 & 167 & 0 & Closest to the Sun \\
17& & Venus & 4.87 & 12,104 & 5243 & 8.9 & 2802.0 & 108.2 & 464 & 0 & \\
17& & Venus & 4.87 & 12,104 & 5243 & 8.9 & 2802.0 & 108.2 & 464 & 0 & \\
18& & Earth & 5.97 & 12,756 & 5514 & 9.8 & 24.0 & 149.6 & 15 & 1 & Our world \\
18& & Earth & 5.97 & 12,756 & 5514 & 9.8 & 24.0 & 149.6 & 15 & 1 & Our world \\
@@ -24,7 +24,7 @@ planet \\
24& \multirow{2}{*}{Ice giants} & Uranus & 86.8 & 51,118 & 1271 & 8.7 & 17.2 &
24& \multirow{2}{*}{Ice giants} & Uranus & 86.8 & 51,118 & 1271 & 8.7 & 17.2 &
252872.5 & -195 & 27 & \\
252872.5 & -195 & 27 & \\
26& & Neptune & 102 & 49,528 & 1638 & 11.0 & 16.1 & 4495.1 & -200 & 14 & \\
26& & Neptune & 102 & 49,528 & 1638 & 11.0 & 16.1 & 4495.1 & -200 & 14 & \\
27−\multicolumn{2}{l}{Dwarf planets} & Pluto & 0.0146 & 2,370 & 2095 & 0.7 &
27+\multicolumn{2}{c}{Dwarf planets} & Pluto & 0.0146 & 2,370 & 2095 & 0.7 &
28153.3 & 5906.4 & -225 & 5 & Declassified as a planet in 2006. \\
28153.3 & 5906.4 & -225 & 5 & Declassified as a planet in 2006. \\
29\bottomrule
29\bottomrule
30\end{longtable}
30\end{longtable}
test/tables/students.latex+10−2
@@ -3,11 +3,19 @@
3 >{\raggedright\arraybackslash}p{(\columnwidth - 2\tabcolsep) * \real{0.50}}@{}}
3 >{\raggedright\arraybackslash}p{(\columnwidth - 2\tabcolsep) * \real{0.50}}@{}}
4\caption{List of Students}\tabularnewline
4\caption{List of Students}\tabularnewline
5\toprule
5\toprule
6+\begin{minipage}[b]{\linewidth}\centering
6−Student ID & Name \\
7+Student ID
8+\end{minipage} & \begin{minipage}[b]{\linewidth}\centering
9+Name
10+\end{minipage} \\
7\midrule
11\midrule
8\endfirsthead
12\endfirsthead
9\toprule
13\toprule
14+\begin{minipage}[b]{\linewidth}\centering
10−Student ID & Name \\
15+Student ID
16+\end{minipage} & \begin{minipage}[b]{\linewidth}\centering
17+Name
18+\end{minipage} \\
11\midrule
19\midrule
12\endhead
20\endhead
13\multicolumn{2}{l}{Computer Science} \\
21\multicolumn{2}{l}{Computer Science} \\
test/writer.context+42−38
@@ -17,6 +17,7 @@
17
17
18% use microtypography
18% use microtypography
19\definefontfeature[default][default][script=latn, protrusion=quality, expansion=quality, itlc=yes, textitalics=yes, onum=yes, pnum=yes]
19\definefontfeature[default][default][script=latn, protrusion=quality, expansion=quality, itlc=yes, textitalics=yes, onum=yes, pnum=yes]
20+\definefontfeature[default:tnum][default][tnum=yes, pnum=no]
20\definefontfeature[smallcaps][script=latn, protrusion=quality, expansion=quality, smcp=yes, onum=yes, pnum=yes]
21\definefontfeature[smallcaps][script=latn, protrusion=quality, expansion=quality, smcp=yes, onum=yes, pnum=yes]
21\setupalign[hz,hanging]
22\setupalign[hz,hanging]
22\setupitaliccorrection[global, always]
23\setupitaliccorrection[global, always]
@@ -48,6 +49,9 @@
48\setupitemize[autointro] % prevent orphan list intro
49\setupitemize[autointro] % prevent orphan list intro
49\setupitemize[indentnext=no]
50\setupitemize[indentnext=no]
50
51
52+\defineitemgroup[enumerate]
53+\setupenumerate[each][fit][itemalign=left,distance=.5em,style={\feature[+][default:tnum]}]
54+
51\setupfloat[figure][default={here,nonumber}]
55\setupfloat[figure][default={here,nonumber}]
52\setupfloat[table][default={here,nonumber}]
56\setupfloat[table][default={here,nonumber}]
53
57
@@ -133,12 +137,12 @@ sub status {
133
137
134A list:
138A list:
135
139
136−\startitemize[n,packed][stopper=.]
140+\startenumerate[n,packed][stopper=.]
137\item
141\item
138 item one
142 item one
139\item
143\item
140 item two
144 item two
141−\stopitemize
145+\stopenumerate
142
146
143Nested block quotes:
147Nested block quotes:
144
148
@@ -255,51 +259,51 @@ Minuses loose:
255
259
256Tight:
260Tight:
257
261
258−\startitemize[n,packed][stopper=.]
262+\startenumerate[n,packed][stopper=.]
259\item
263\item
260 First
264 First
261\item
265\item
262 Second
266 Second
263\item
267\item
264 Third
268 Third
265−\stopitemize
269+\stopenumerate
266
270
267and:
271and:
268
272
269−\startitemize[n,packed][stopper=.]
273+\startenumerate[n,packed][stopper=.]
270\item
274\item
271 One
275 One
272\item
276\item
273 Two
277 Two
274\item
278\item
275 Three
279 Three
276−\stopitemize
280+\stopenumerate
277
281
278Loose using tabs:
282Loose using tabs:
279
283
280−\startitemize[n][stopper=.]
284+\startenumerate[n][stopper=.]
281\item
285\item
282 First
286 First
283\item
287\item
284 Second
288 Second
285\item
289\item
286 Third
290 Third
287−\stopitemize
291+\stopenumerate
288
292
289and using spaces:
293and using spaces:
290
294
291−\startitemize[n][stopper=.]
295+\startenumerate[n][stopper=.]
292\item
296\item
293 One
297 One
294\item
298\item
295 Two
299 Two
296\item
300\item
297 Three
301 Three
298−\stopitemize
302+\stopenumerate
299
303
300Multiple paragraphs:
304Multiple paragraphs:
301
305
302−\startitemize[n][stopper=.]
306+\startenumerate[n][stopper=.]
303\item
307\item
304 Item 1, graf one.
308 Item 1, graf one.
305
309
@@ -308,7 +312,7 @@ Multiple paragraphs:
308 Item 2.
312 Item 2.
309\item
313\item
310 Item 3.
314 Item 3.
311−\stopitemize
315+\stopenumerate
312
316
313\subsection[title={Nested},reference={nested}]
317\subsection[title={Nested},reference={nested}]
314
318
@@ -327,7 +331,7 @@ Multiple paragraphs:
327
331
328Here's another:
332Here's another:
329
333
330−\startitemize[n,packed][stopper=.]
334+\startenumerate[n,packed][stopper=.]
331\item
335\item
332 First
336 First
333\item
337\item
@@ -342,11 +346,11 @@ Here's another:
342 \stopitemize
346 \stopitemize
343\item
347\item
344 Third
348 Third
345−\stopitemize
349+\stopenumerate
346
350
347Same thing but with paragraphs:
351Same thing but with paragraphs:
348
352
349−\startitemize[n][stopper=.]
353+\startenumerate[n][stopper=.]
350\item
354\item
351 First
355 First
352\item
356\item
@@ -362,7 +366,7 @@ Same thing but with paragraphs:
362 \stopitemize
366 \stopitemize
363\item
367\item
364 Third
368 Third
365−\stopitemize
369+\stopenumerate
366
370
367\subsection[title={Tabs and spaces},reference={tabs-and-spaces}]
371\subsection[title={Tabs and spaces},reference={tabs-and-spaces}]
368
372
@@ -382,7 +386,7 @@ Same thing but with paragraphs:
382
386
383\subsection[title={Fancy list markers},reference={fancy-list-markers}]
387\subsection[title={Fancy list markers},reference={fancy-list-markers}]
384
388
385−\startitemize[n][start=2,left=(,stopper=),width=2.0em]
389+\startenumerate[n][start=2,left=(,stopper=)]
386\item
390\item
387 begins with 2
391 begins with 2
388\item
392\item
@@ -390,51 +394,51 @@ Same thing but with paragraphs:
390
394
391 with a continuation
395 with a continuation
392
396
393− \startitemize[r,packed][start=4,stopper=.,width=2.0em]
397+ \startenumerate[r,packed][start=4,stopper=.]
394 \item
398 \item
395 sublist with roman numerals, starting with 4
399 sublist with roman numerals, starting with 4
396 \item
400 \item
397 more items
401 more items
398− \startitemize[A,packed][left=(,stopper=),width=2.0em]
402+ \startenumerate[A,packed][left=(,stopper=)]
399 \item
403 \item
400 a subsublist
404 a subsublist
401 \item
405 \item
402 a subsublist
406 a subsublist
403− \stopitemize
407+ \stopenumerate
404− \stopitemize
408+ \stopenumerate
405−\stopitemize
409+\stopenumerate
406
410
407Nesting:
411Nesting:
408
412
409−\startitemize[A,packed][stopper=.]
413+\startenumerate[A,packed][stopper=.]
410\item
414\item
411 Upper Alpha
415 Upper Alpha
412− \startitemize[R,packed][stopper=.]
416+ \startenumerate[R,packed][stopper=.]
413 \item
417 \item
414 Upper Roman.
418 Upper Roman.
415− \startitemize[n,packed][start=6,left=(,stopper=),width=2.0em]
419+ \startenumerate[n,packed][start=6,left=(,stopper=)]
416 \item
420 \item
417 Decimal start with 6
421 Decimal start with 6
418− \startitemize[a,packed][start=3,stopper=)]
422+ \startenumerate[a,packed][start=3,stopper=)]
419 \item
423 \item
420 Lower alpha with paren
424 Lower alpha with paren
421− \stopitemize
425+ \stopenumerate
422− \stopitemize
426+ \stopenumerate
423− \stopitemize
427+ \stopenumerate
424−\stopitemize
428+\stopenumerate
425
429
426Autonumbering:
430Autonumbering:
427
431
428−\startitemize[n,packed]
432+\startenumerate[n,packed]
429\item
433\item
430 Autonumber.
434 Autonumber.
431\item
435\item
432 More.
436 More.
433− \startitemize[a,packed]
437+ \startenumerate[a,packed]
434 \item
438 \item
435 Nested.
439 Nested.
436− \stopitemize
440+ \stopenumerate
437−\stopitemize
441+\stopenumerate
438
442
439Should not be a list item:
443Should not be a list item:
440
444
@@ -547,12 +551,12 @@ Blank line after term, indented marker, alternate markers:
547\startdescription{orange}
551\startdescription{orange}
548 orange fruit
552 orange fruit
549
553
550− \startitemize[n,packed][stopper=.]
554+ \startenumerate[n,packed][stopper=.]
551 \item
555 \item
552 sublist
556 sublist
553 \item
557 \item
554 sublist
558 sublist
555− \stopitemize
559+ \stopenumerate
556\stopdescription
560\stopdescription
557
561
558\section[title={HTML Blocks},reference={html-blocks}]
562\section[title={HTML Blocks},reference={html-blocks}]
@@ -897,10 +901,10 @@ note{]} Here is an inline note.\footnote{This is {\em easier} to type. Inline
897Notes can go in quotes.\footnote{In quote.}
901Notes can go in quotes.\footnote{In quote.}
898\stopblockquote
902\stopblockquote
899
903
900−\startitemize[n,packed][stopper=.]
904+\startenumerate[n,packed][stopper=.]
901\item
905\item
902 And in list items.\footnote{In list.}
906 And in list items.\footnote{In list.}
903−\stopitemize
907+\stopenumerate
904
908
905This paragraph should not be part of the note, as it is not indented.
909This paragraph should not be part of the note, as it is not indented.
906
910
test/writer.html4+2−1
@@ -24,7 +24,7 @@
24 padding-top: 50px;
24 padding-top: 50px;
25 padding-bottom: 50px;
25 padding-bottom: 50px;
26 hyphens: auto;
26 hyphens: auto;
27− word-wrap: break-word;
27+ overflow-wrap: break-word;
28 text-rendering: optimizeLegibility;
28 text-rendering: optimizeLegibility;
29 font-kerning: normal;
29 font-kerning: normal;
30 }
30 }
@@ -95,6 +95,7 @@
95 pre code {
95 pre code {
96 padding: 0;
96 padding: 0;
97 overflow: visible;
97 overflow: visible;
98+ overflow-wrap: normal;
98 }
99 }
99 .sourceCode {
100 .sourceCode {
100 background-color: transparent;
101 background-color: transparent;
test/writer.html5+2−1
@@ -24,7 +24,7 @@
24 padding-top: 50px;
24 padding-top: 50px;
25 padding-bottom: 50px;
25 padding-bottom: 50px;
26 hyphens: auto;
26 hyphens: auto;
27− word-wrap: break-word;
27+ overflow-wrap: break-word;
28 text-rendering: optimizeLegibility;
28 text-rendering: optimizeLegibility;
29 font-kerning: normal;
29 font-kerning: normal;
30 }
30 }
@@ -95,6 +95,7 @@
95 pre code {
95 pre code {
96 padding: 0;
96 padding: 0;
97 overflow: visible;
97 overflow: visible;
98+ overflow-wrap: normal;
98 }
99 }
99 .sourceCode {
100 .sourceCode {
100 background-color: transparent;
101 background-color: transparent;
test/writer.opml+1−1
@@ -52,7 +52,7 @@
52</outline>
52</outline>
53<outline text="LaTeX" _note="- &#10;- 2 + 2 = 4&#10;- *x* ∈ *y*&#10;- *α* ∧ *ω*&#10;- 223&#10;- *p*-Tree&#10;- Here’s some display math:&#10; $$\\frac{d}{dx}f(x)=\\lim\_{h\\to 0}\\frac{f(x+h)-f(x)}{h}$$&#10;- Here’s one that has a line break in it: *α* + *ω* × *x*².&#10;&#10;These shouldn’t be math:&#10;&#10;- To get the famous equation, write `$e = mc^2$`.&#10;- $22,000 is a *lot* of money. So is $34,000. (It worked if “lot” is&#10; emphasized.)&#10;- Shoes ($20) and socks ($5).&#10;- Escaped `$`: $73 *this should be emphasized* 23$.&#10;&#10;Here’s a LaTeX table:&#10;&#10;------------------------------------------------------------------------">
53<outline text="LaTeX" _note="- &#10;- 2 + 2 = 4&#10;- *x* ∈ *y*&#10;- *α* ∧ *ω*&#10;- 223&#10;- *p*-Tree&#10;- Here’s some display math:&#10; $$\\frac{d}{dx}f(x)=\\lim\_{h\\to 0}\\frac{f(x+h)-f(x)}{h}$$&#10;- Here’s one that has a line break in it: *α* + *ω* × *x*².&#10;&#10;These shouldn’t be math:&#10;&#10;- To get the famous equation, write `$e = mc^2$`.&#10;- $22,000 is a *lot* of money. So is $34,000. (It worked if “lot” is&#10; emphasized.)&#10;- Shoes ($20) and socks ($5).&#10;- Escaped `$`: $73 *this should be emphasized* 23$.&#10;&#10;Here’s a LaTeX table:&#10;&#10;------------------------------------------------------------------------">
54</outline>
54</outline>
55−<outline text="Special Characters" _note="Here is some unicode:&#10;&#10;- I hat: Î&#10;- o umlaut: ö&#10;- section: §&#10;- set membership: ∈&#10;- copyright: ©&#10;&#10;AT&amp;T has an ampersand in their name.&#10;&#10;AT&amp;T is another way to write it.&#10;&#10;This &amp; that.&#10;&#10;4 &amp;lt; 5.&#10;&#10;6 &amp;gt; 5.&#10;&#10;Backslash: \\&#10;&#10;Backtick: \`&#10;&#10;Asterisk: \*&#10;&#10;Underscore: \_&#10;&#10;Left brace: {&#10;&#10;Right brace: }&#10;&#10;Left bracket: \[&#10;&#10;Right bracket: \]&#10;&#10;Left paren: (&#10;&#10;Right paren: )&#10;&#10;Greater-than: &amp;gt;&#10;&#10;Hash: \#&#10;&#10;Period: .&#10;&#10;Bang: !&#10;&#10;Plus: +&#10;&#10;Minus: -&#10;&#10;------------------------------------------------------------------------">
55+<outline text="Special Characters" _note="Here is some unicode:&#10;&#10;- I hat: Î&#10;- o umlaut: ö&#10;- section: §&#10;- set membership: ∈&#10;- copyright: ©&#10;&#10;AT&amp;T has an ampersand in their name.&#10;&#10;AT&amp;T is another way to write it.&#10;&#10;This &amp; that.&#10;&#10;4 &amp;lt; 5.&#10;&#10;6 &amp;gt; 5.&#10;&#10;Backslash: \\&#10;&#10;Backtick: \`&#10;&#10;Asterisk: \*&#10;&#10;Underscore: \_&#10;&#10;Left brace: {&#10;&#10;Right brace: }&#10;&#10;Left bracket: \[&#10;&#10;Right bracket: \]&#10;&#10;Left paren: (&#10;&#10;Right paren: )&#10;&#10;Greater-than: &amp;gt;&#10;&#10;Hash: #&#10;&#10;Period: .&#10;&#10;Bang: !&#10;&#10;Plus: +&#10;&#10;Minus: -&#10;&#10;------------------------------------------------------------------------">
56</outline>
56</outline>
57<outline text="Links">
57<outline text="Links">
58 <outline text="Explicit" _note="Just a [URL](/url/).&#10;&#10;[URL and title](/url/ &quot;title&quot;).&#10;&#10;[URL and title](/url/ &quot;title preceded by two spaces&quot;).&#10;&#10;[URL and title](/url/ &quot;title preceded by a tab&quot;).&#10;&#10;[URL and title](/url/ &quot;title with &quot;quotes&quot; in it&quot;)&#10;&#10;[URL and title](/url/ &quot;title with single quotes&quot;)&#10;&#10;[with\_underscore](/url/with_underscore)&#10;&#10;[Email link](mailto:nobody@nowhere.net)&#10;&#10;[Empty]().">
58 <outline text="Explicit" _note="Just a [URL](/url/).&#10;&#10;[URL and title](/url/ &quot;title&quot;).&#10;&#10;[URL and title](/url/ &quot;title preceded by two spaces&quot;).&#10;&#10;[URL and title](/url/ &quot;title preceded by a tab&quot;).&#10;&#10;[URL and title](/url/ &quot;title with &quot;quotes&quot; in it&quot;)&#10;&#10;[URL and title](/url/ &quot;title with single quotes&quot;)&#10;&#10;[with\_underscore](/url/with_underscore)&#10;&#10;[Email link](mailto:nobody@nowhere.net)&#10;&#10;[Empty]().">
test/writer.zimwiki+3−3
@@ -8,9 +8,9 @@ This is a set of tests for pandoc. Most of them are adapted from John Gruber’s
8
8
9====== Headers ======
9====== Headers ======
10
10
11−===== Level 2 with an embedded link =====
11+===== Level 2 with an [[url|embedded link]] =====
12
12
13−==== Level 3 with emphasis ====
13+==== Level 3 with //emphasis// ====
14
14
15=== Level 4 ===
15=== Level 4 ===
16
16
@@ -18,7 +18,7 @@ This is a set of tests for pandoc. Most of them are adapted from John Gruber’s
18
18
19====== Level 1 ======
19====== Level 1 ======
20
20
21−===== Level 2 with emphasis =====
21+===== Level 2 with //emphasis// =====
22
22
23==== Level 3 ====
23==== Level 3 ====
24
24
test/writers-lang-and-dir.context+4
@@ -15,6 +15,7 @@
15
15
16% use microtypography
16% use microtypography
17\definefontfeature[default][default][script=latn, protrusion=quality, expansion=quality, itlc=yes, textitalics=yes, onum=yes, pnum=yes]
17\definefontfeature[default][default][script=latn, protrusion=quality, expansion=quality, itlc=yes, textitalics=yes, onum=yes, pnum=yes]
18+\definefontfeature[default:tnum][default][tnum=yes, pnum=no]
18\definefontfeature[smallcaps][script=latn, protrusion=quality, expansion=quality, smcp=yes, onum=yes, pnum=yes]
19\definefontfeature[smallcaps][script=latn, protrusion=quality, expansion=quality, smcp=yes, onum=yes, pnum=yes]
19\setupalign[hz,hanging]
20\setupalign[hz,hanging]
20\setupitaliccorrection[global, always]
21\setupitaliccorrection[global, always]
@@ -46,6 +47,9 @@
46\setupitemize[autointro] % prevent orphan list intro
47\setupitemize[autointro] % prevent orphan list intro
47\setupitemize[indentnext=no]
48\setupitemize[indentnext=no]
48
49
50+\defineitemgroup[enumerate]
51+\setupenumerate[each][fit][itemalign=left,distance=.5em,style={\feature[+][default:tnum]}]
52+
49\setupfloat[figure][default={here,nonumber}]
53\setupfloat[figure][default={here,nonumber}]
50\setupfloat[table][default={here,nonumber}]
54\setupfloat[table][default={here,nonumber}]
51
55
tools/build-arm.sh+3−1
@@ -1,6 +1,8 @@
1#!/bin/sh
1#!/bin/sh
2
2
3+#old version:
3−IMAGE_ID=ami-0fa8979d18f69948b
4+#IMAGE_ID=ami-0fa8979d18f69948b
5+IMAGE_ID=ami-0cd6b53a434812702
4INSTANCE_TYPE=t4g.2xlarge
6INSTANCE_TYPE=t4g.2xlarge
5KEY_NAME=debian-arm-us-east-2
7KEY_NAME=debian-arm-us-east-2
6SECURITY_GROUP_ID=sg-086ffbadc286c5c00
8SECURITY_GROUP_ID=sg-086ffbadc286c5c00