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:
.github/ISSUE_TEMPLATE/bug_report.md+12−25
@@ -2,37 +2,24 @@
2name: Bug report
2name: Bug report
3about: Create a report to help us improve
3about: Create a report to help us improve
4title: ''
4title: ''
5−labels: ''
5+labels: 'bug'
6assignees: ''
6assignees: ''
7
7
8---
8---
9
9
10−**Describe the bug**
10+<!--
11−A clear and concise description of what the bug is.
11+Thank you for reporting an issue! Before you continue, please make sure that you have
12
12
13−**To Reproduce**
13+- searched the issue tracker for similar issues (including closed issues): https://github.com/jgm/pandoc/issues
14−Steps to reproduce the behavior:
14+- searched the pandoc-discuss mailing list for solutions: https://groups.google.com/forum/#!forum/pandoc-discuss
15−1. Go to '...'
15+- reproduced your issue on the latest release of pandoc, or on https://pandoc.org/try
16−2. Click on '....'
17−3. Scroll down to '....'
18−4. See error
19
16
20−**Expected behavior**
17+Note that this bug tracker is for reporting bugs, not asking questions. For questions, use the pandoc-discuss mailing list.
21−A clear and concise description of what you expected to happen.
18+-->
22
19
23−**Screenshots**
20+**Explain the problem.**
24−If applicable, add screenshots to help explain your 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.
25
22
26−**Desktop (please complete the following information):**
23+**Pandoc version?**
27− - OS: [e.g. iOS]
24+What version of pandoc are you using, on what OS?
28− - Browser [e.g. chrome, safari]
29− - Version [e.g. 22]
30
25
31−**Smartphone (please complete the following information):**
32− - Device: [e.g. iPhone6]
33− - OS: [e.g. iOS8.1]
34− - Browser [e.g. stock browser, safari]
35− - Version [e.g. 22]
36−
37−**Additional context**
38−Add any other context about the problem here.
.github/ISSUE_TEMPLATE/bug_report.ymldeleted−44
@@ -1,44 +0,0 @@
1−---
2−name: 📝 Bug Report
3−description: Report a bug, error, or misbehavior
4−title: "Briefly summarize your issue here"
5−labels: ["bug"]
6−body:
7−- type: markdown
8− attributes:
9− value: |
10− **Thank you for reporting an issue to our issue tracker!**
11− Before you proceed, please consult our available resources and collect as much information about your issue as possible:
12−
13−- type: checkboxes
14− attributes:
15− options:
16− - label: I have searched [the manual](https://pandoc.org/MANUAL.html) for solutions.
17− required: true
18− - label: I have searched [the FAQs](https://pandoc.org/faqs.html) for solutions.
19− required: true
20− - label: I have searched [the issue tracker](https://github.com/jgm/pandoc/issues) for similar issues (the closed issues too).
21− required: true
22− - label: I have searched [pandoc-discuss](https://groups.google.com/forum/#!forum/pandoc-discuss) for solutions.
23− required: true
24− - label: I can reproduce my issue on [the latest release](https://github.com/jgm/pandoc/releases) doom-emacs/commit) of pandoc, or on [try pandoc](https://pandoc.org/try).
25− required: true
26− - label: If reporting a behavior change, I have searched the [changelog](https://github.com/jgm/pandoc/changelog.md) to see if it was intentional.
27− required: true
28−- type: textarea
29− attributes:
30− label: Explain how to reproduce the problem.
31− description: |
32− + Please give as minimal an example as you can to reproduce the issue.
33− + Include full command line and all files necessary to reproduce.
34− validations:
35− required: true
36−- type: textarea
37− attributes:
38− label: What happened, and what did you expect to happen?
39−- type: textarea
40− attributes:
41− label: What pandoc version did you use? (`pandoc --version`)
42− validations:
43− required: true
44−
.github/ISSUE_TEMPLATE/config.yml+4−7
@@ -1,12 +1,9 @@
1blank_issues_enabled: false
1blank_issues_enabled: false
2contact_links:
2contact_links:
3− - name: Pandoc User's Guide
3+ - name: Ask a question
4− url: https://pandoc.org/MANUAL.html
5− about: "Official manual for pandoc"
6− - name: pandoc-discuss mailing list
7 url: https://groups.google.com/forum/#!forum/pandoc-discuss
4 url: https://groups.google.com/forum/#!forum/pandoc-discuss
8 about: "Discussion forum for pandoc (may be used as an email list)"
5 about: "Discussion forum for pandoc (may be used as an email list)"
9− - name: Frequently Asked Questions
6+ - name: Contributing Guidelines
10− url: https://pandoc.org/faqs.html
7+ url: https://pandoc.org/CONTRIBUTING.html
11− about: "Some frequently asked qusetions (and answers)"
8+ about: "Guidelines for submitting bug reports and code improvements"
12
9
.github/ISSUE_TEMPLATE/feature_request.md+10−9
@@ -2,19 +2,20 @@
2name: Feature request
2name: Feature request
3about: Suggest an idea for this project
3about: Suggest an idea for this project
4title: ''
4title: ''
5−labels: ''
5+labels: 'enhancement'
6assignees: ''
6assignees: ''
7
7
8---
8---
9
9
10−**Is your feature request related to a problem? Please describe.**
10+<!--
11−A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
11+Thank you for suggesting a feature! Before you continue, please make sure that you have
12
12
13−**Describe the solution you'd like**
13+- read the contributing guidelines: https://pandoc.org/CONTRIBUTING.html
14−A clear and concise description of what you want to happen.
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+-->
15
17
18+**Describe your proposed improvement and the problem it solves.**
19+
16−**Describe alternatives you've considered**
20+**Describe alternatives you've considered.**
17−A clear and concise description of any alternative solutions or features you've considered.
18
21
19−**Additional context**
20−Add any other context or screenshots about the feature request here.
.github/ISSUE_TEMPLATE/feature_request.ymldeleted−20
@@ -1,20 +0,0 @@
1−---
2−name: 📝 Feature Request
3−description: Propose a new idea or feature
4−title: "Briefly summarize your request here"
5−labels: ["enhancement"]
6−body:
7−- type: checkboxes
8− attributes:
9− options:
10− - label: I have read the [contributing guide](https://github.com/jgm/CONTRIBUTING.md).
11− required: true
12− - label: I have searched [the issue tracker](https://github.com/jgm/pandoc/issues) (including closed issues) for similar requests.
13− required: true
14− - label: I have searched [the pandoc-discuss mailing list](https://groups.google.com/forum/#!forum/pandoc-discuss) for relevant discussions.
15− required: true
16−- type: textarea
17− attributes:
18− label: Describe your request
19− required: true
20−
MANUAL.txt+4−4
@@ -1,7 +1,7 @@
1---
1---
2title: Pandoc User's Guide
2title: Pandoc User's Guide
3author: John MacFarlane
3author: John MacFarlane
4−date: June 11, 2021
4+date: June 20, 2021
5---
5---
6
6
7# Synopsis
7# Synopsis
@@ -6504,9 +6504,9 @@ application, here are some things to keep in mind:
65044. The HTML generated by pandoc is not guaranteed to be safe.
65044. The HTML generated by pandoc is not guaranteed to be safe.
6505 If `raw_html` is enabled for the Markdown input, users can
6505 If `raw_html` is enabled for the Markdown input, users can
6506 inject arbitrary HTML. Even if `raw_html` is disabled,
6506 inject arbitrary HTML. Even if `raw_html` is disabled,
6507− users can include dangerous content in attributes for
6507+ users can include dangerous content in URLs and attributes.
6508− headings, spans, and code blocks. To be safe, you should
6509− 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.
6510
6510
6511# Authors
6511# Authors
6512
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+9
@@ -2,3 +2,12 @@ packages: pandoc.cabal
2tests: True
2tests: True
3flags: +embed_data_files
3flags: +embed_data_files
4
4
5+source-repository-package
6+ type: git
7+ location: https://github.com/jgm/doctemplates
8+ tag: 428c26d5303cf7a2b1051fe1ffd9aafe9ba71c81
9+
10+source-repository-package
11+ type: git
12+ location: https://github.com/jgm/citeproc
13+ tag: 4ce0501cd6f9c86eee087afcf878c256e49b9615
changelog.md+53−5
@@ -1,6 +1,44 @@
1# Revision history for pandoc
1# Revision history for pandoc
2
2
3−## pandoc 2.14.0.2 (2021-06-11)
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)
4
42
5 * Fix MediaBag regressions (#7345). iIn the 2.14 release `--extract-media`
43 * Fix MediaBag regressions (#7345). iIn the 2.14 release `--extract-media`
6 stopped working as before; there could be mismatches between the
44 stopped working as before; there could be mismatches between the
@@ -48,6 +86,8 @@
48 ignoring the star usually gives acceptable results). But we
86 ignoring the star usually gives acceptable results). But we
49 don't want to do this for `\(*\)` and similar cases.
87 don't want to do this for `\(*\)` and similar cases.
50
88
89+ * Docx reader: handle absolute URIs in Relationship Target (#7374).
90+
51 * Docx writer: fix handling of empty table headers (Albert Krewinkel,
91 * Docx writer: fix handling of empty table headers (Albert Krewinkel,
52 #7369). A table header which does not contain any cells is now treated as
92 #7369). A table header which does not contain any cells is now treated as
53 an empty header.
93 an empty header.
@@ -65,8 +105,11 @@
65 `Ext_fenced_code_attributes`, `Ext_header_attributes`,
105 `Ext_fenced_code_attributes`, `Ext_header_attributes`,
66 `Ext_inline_code_attributes`, `Ext_link_attributes`.
106 `Ext_inline_code_attributes`, `Ext_link_attributes`.
67
107
108+ * Markdown writer:
109+
110+ + Allow `pipe_tables` to be disabled for commonmark formats
111+ (`commonmark_x`, `gfm`) (#7375).
68− * Markdown writer: re-use functions from Text.Pandoc.Markdown.Inline (Jan
112+ + Re-use functions from Text.Pandoc.Markdown.Inline (Jan Tojnar).
69− Tojnar).
70
113
71 * DocBook writer: Remove non-existent admonitions (Jan Tojnar).
114 * DocBook writer: Remove non-existent admonitions (Jan Tojnar).
72 `attention`, `error` and `hint` are reStructuredText specific.
115 `attention`, `error` and `hint` are reStructuredText specific.
@@ -84,8 +127,13 @@
84 Krewinkel, #7369). Passing an empty list of header cells now results
127 Krewinkel, #7369). Passing an empty list of header cells now results
85 in an empty table header.
128 in an empty table header.
86
129
130+ * Text.Pandoc.Citeproc:
131+
87− * Text.Pandoc.Citeproc: avoid duplicate classes and attributes on
132+ + Avoid duplicate classes and attributes on references div.
88− 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).
89
137
90 * Require citeproc 0.4.0.1. This fixes a bug which led to doubled
138 * Require citeproc 0.4.0.1. This fixes a bug which led to doubled
91 "et al." in some (rare) circumstances.
139 "et al." in some (rare) circumstances.
data/templates/default.latex+29−29
@@ -36,35 +36,6 @@ $for(classoption)$
36 $classoption$$sep$,
36 $classoption$$sep$,
37$endfor$
37$endfor$
38]{$documentclass$}
38]{$documentclass$}
39−$if(title)$
40−\title{$title$$if(thanks)$\thanks{$thanks$}$endif$}
41−$endif$
42−$if(subtitle)$
43−$if(beamer)$
44−$else$
45−\usepackage{etoolbox}
46−\makeatletter
47−\providecommand{\subtitle}[1]{% add subtitle to \maketitle
48− \apptocmd{\@title}{\par {\large #1 \par}}{}{}
49−}
50−\makeatother
51−$endif$
52−\subtitle{$subtitle$}
53−$endif$
54−\author{$for(author)$$author$$sep$ \and $endfor$}
55−\date{$date$}
56−$if(beamer)$
57−$if(institute)$
58−\institute{$for(institute)$$institute$$sep$ \and $endfor$}
59−$endif$
60−$if(titlegraphic)$
61−\titlegraphic{\includegraphics{$titlegraphic$}}
62−$endif$
63−$if(logo)$
64−\logo{\includegraphics{$logo$}}
65−$endif$
66−$endif$
67−
68$if(beamer)$
39$if(beamer)$
69$if(background-image)$
40$if(background-image)$
70\usebackgroundtemplate{%
41\usebackgroundtemplate{%
@@ -452,6 +423,35 @@ $if(csquotes)$
452\usepackage{csquotes}
423\usepackage{csquotes}
453$endif$
424$endif$
454
425
426+$if(title)$
427+\title{$title$$if(thanks)$\thanks{$thanks$}$endif$}
428+$endif$
429+$if(subtitle)$
430+$if(beamer)$
431+$else$
432+\usepackage{etoolbox}
433+\makeatletter
434+\providecommand{\subtitle}[1]{% add subtitle to \maketitle
435+ \apptocmd{\@title}{\par {\large #1 \par}}{}{}
436+}
437+\makeatother
438+$endif$
439+\subtitle{$subtitle$}
440+$endif$
441+\author{$for(author)$$author$$sep$ \and $endfor$}
442+\date{$date$}
443+$if(beamer)$
444+$if(institute)$
445+\institute{$for(institute)$$institute$$sep$ \and $endfor$}
446+$endif$
447+$if(titlegraphic)$
448+\titlegraphic{\includegraphics{$titlegraphic$}}
449+$endif$
450+$if(logo)$
451+\logo{\includegraphics{$logo$}}
452+$endif$
453+$endif$
454+
455\begin{document}
455\begin{document}
456$if(has-frontmatter)$
456$if(has-frontmatter)$
457\frontmatter
457\frontmatter
data/templates/default.revealjs+70−128
@@ -90,256 +90,198 @@ $endif$
90 // Full list of configuration options available at:
90 // Full list of configuration options available at:
91 // https://revealjs.com/config/
91 // https://revealjs.com/config/
92 Reveal.initialize({
92 Reveal.initialize({
93−$if(center)$
94− // Determines whether slide content should be vertically centered
95− center: $center$,
96−$endif$
97−$if(controls)$
98 // Display controls in the bottom right corner
93 // Display controls in the bottom right corner
99 controls: $controls$,
94 controls: $controls$,
100−$endif$
95+
101−$if(controlsTutorial)$
102 // 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
103 // bouncing the down arrow when they first encounter a vertical slide
97 // bouncing the down arrow when they first encounter a vertical slide
104 controlsTutorial: $controlsTutorial$,
98 controlsTutorial: $controlsTutorial$,
105−$endif$
99+
106−$if(controlsLayout)$
107 // Determines where controls appear, "edges" or "bottom-right"
100 // Determines where controls appear, "edges" or "bottom-right"
108 controlsLayout: '$controlsLayout$',
101 controlsLayout: '$controlsLayout$',
109−$endif$
102+
110−$if(controlsBackArrows)$
111 // Visibility rule for backwards navigation arrows; "faded", "hidden"
103 // Visibility rule for backwards navigation arrows; "faded", "hidden"
112 // or "visible"
104 // or "visible"
113 controlsBackArrows: '$controlsBackArrows$',
105 controlsBackArrows: '$controlsBackArrows$',
114−$endif$
106+
115−$if(progress)$
116 // Display a presentation progress bar
107 // Display a presentation progress bar
117 progress: $progress$,
108 progress: $progress$,
118−$endif$
109+
119−$if(slideNumber)$
120 // Display the page number of the current slide
110 // Display the page number of the current slide
121 slideNumber: $slideNumber$,
111 slideNumber: $slideNumber$,
122−$endif$
112+
123−$if(showSlideNumber)$
124 // 'all', 'print', or 'speaker'
113 // 'all', 'print', or 'speaker'
125 showSlideNumber: '$showSlideNumber$',
114 showSlideNumber: '$showSlideNumber$',
126−$endif$
115+
127 // 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
128 // page/copying the URL will return you to the same slide
117 // page/copying the URL will return you to the same slide
129− hash: $if(hash)$$hash$$else$true$endif$,
118+ hash: $hash$,
130−$if(hashOneBasedIndex)$
119+
131 // Start with 1 for the hash rather than 0
120 // Start with 1 for the hash rather than 0
132 hashOneBasedIndex: $hashOneBasedIndex$,
121 hashOneBasedIndex: $hashOneBasedIndex$,
133−$endif$
122+
134−$if(history)$
123+ // Flags if we should monitor the hash and change slides accordingly
124+ respondToHashChanges: $respondToHashChanges$,
125+
135 // Push each slide change to the browser history
126 // Push each slide change to the browser history
136 history: $history$,
127 history: $history$,
137−$endif$
128+
138−$if(keyboard)$
139 // Enable keyboard shortcuts for navigation
129 // Enable keyboard shortcuts for navigation
140 keyboard: $keyboard$,
130 keyboard: $keyboard$,
141−$endif$
131+
142−$if(overview)$
143 // Enable the slide overview mode
132 // Enable the slide overview mode
144 overview: $overview$,
133 overview: $overview$,
145−$endif$
134+
146−$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+
147 // Vertical centering of slides
139 // Vertical centering of slides
148 center: $center$,
140 center: $center$,
149−$endif$
141+
150−$if(touch)$
151 // Enables touch navigation on devices with touch input
142 // Enables touch navigation on devices with touch input
152 touch: $touch$,
143 touch: $touch$,
153−$endif$
144+
154−$if(loop)$
155 // Loop the presentation
145 // Loop the presentation
156 loop: $loop$,
146 loop: $loop$,
157−$endif$
147+
158−$if(rtl)$
159 // Change the presentation direction to be RTL
148 // Change the presentation direction to be RTL
160 rtl: $rtl$,
149 rtl: $rtl$,
161−$endif$
150+
162−$if(navigationMode)$
163 // see https://revealjs.com/vertical-slides/#navigation-mode
151 // see https://revealjs.com/vertical-slides/#navigation-mode
164 navigationMode: '$navigationMode$',
152 navigationMode: '$navigationMode$',
165−$endif$
153+
166−$if(shuffle)$
167 // Randomizes the order of slides each time the presentation loads
154 // Randomizes the order of slides each time the presentation loads
168 shuffle: $shuffle$,
155 shuffle: $shuffle$,
169−$endif$
156+
170−$if(fragments)$
171 // Turns fragments on and off globally
157 // Turns fragments on and off globally
172 fragments: $fragments$,
158 fragments: $fragments$,
173−$endif$
159+
174−$if(fragmentInURL)$
175 // Flags whether to include the current fragment in the URL,
160 // Flags whether to include the current fragment in the URL,
176 // so that reloading brings you to the same fragment position
161 // so that reloading brings you to the same fragment position
177 fragmentInURL: $fragmentInURL$,
162 fragmentInURL: $fragmentInURL$,
178−$endif$
163+
179−$if(embedded)$
180 // Flags if the presentation is running in an embedded mode,
164 // Flags if the presentation is running in an embedded mode,
181 // i.e. contained within a limited portion of the screen
165 // i.e. contained within a limited portion of the screen
182 embedded: $embedded$,
166 embedded: $embedded$,
183−$endif$
167+
184−$if(help)$
185 // Flags if we should show a help overlay when the questionmark
168 // Flags if we should show a help overlay when the questionmark
186 // key is pressed
169 // key is pressed
187 help: $help$,
170 help: $help$,
188−$endif$
171+
189−$if(pause)$
190− // Flags if it should be possible to pause the presentation (blackout)
172+ // Flags if it should be possible to pause the presentation (blackout)
191− pause: $pause$,
173+ pause: $pause$,
192−$endif$
174+
193−$if(showNotes)$
194 // Flags if speaker notes should be visible to all viewers
175 // Flags if speaker notes should be visible to all viewers
195 showNotes: $showNotes$,
176 showNotes: $showNotes$,
196−$endif$
177+
197−$if(autoPlayMedia)$
198− // Global override for autoplaying embedded media (video/audio/iframe)
178+ // Global override for autoplaying embedded media (null/true/false)
199− // - null: Media will only autoplay if data-autoplay is present
200− // - true: All media will autoplay, regardless of individual setting
201− // - false: No media will autoplay, regardless of individual setting
202 autoPlayMedia: $autoPlayMedia$,
179 autoPlayMedia: $autoPlayMedia$,
203−$endif$
180+
204−$if(preloadIframes)$
205− // Global override for preloading lazy-loaded iframes
181+ // Global override for preloading lazy-loaded iframes (null/true/false)
206− // - null: Iframes with data-src AND data-preload will be loaded when within
207− // the viewDistance, iframes with only data-src will be loaded when visible
208− // - true: All iframes with data-src will be loaded when within the viewDistance
209− // - false: All iframes with data-src will be loaded only when visible
210 preloadIframes: $preloadIframes$,
182 preloadIframes: $preloadIframes$,
211−$endif$
183+
212−$if(autoSlide)$
213 // Number of milliseconds between automatically proceeding to the
184 // Number of milliseconds between automatically proceeding to the
214 // 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
215 // by using a data-autoslide attribute on your slides
186 // by using a data-autoslide attribute on your slides
216 autoSlide: $autoSlide$,
187 autoSlide: $autoSlide$,
217−$endif$
188+
218−$if(autoSlideStoppable)$
219 // Stop auto-sliding after user input
189 // Stop auto-sliding after user input
220 autoSlideStoppable: $autoSlideStoppable$,
190 autoSlideStoppable: $autoSlideStoppable$,
221−$endif$
191+
222−$if(autoSlideMethod)$
223 // Use this method for navigation when auto-sliding
192 // Use this method for navigation when auto-sliding
224 autoSlideMethod: $autoSlideMethod$,
193 autoSlideMethod: $autoSlideMethod$,
225−$endif$
194+
226−$if(defaultTiming)$
227 // 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
228 // 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
229 // speaker view
197 // speaker view
230 defaultTiming: $defaultTiming$,
198 defaultTiming: $defaultTiming$,
231−$endif$
199+
232−$if(totalTime)$
233− // Specify the total time in seconds that is available to
234− // present. If this is set to a nonzero value, the pacing
235− // timer will work out the time available for each slide,
236− // instead of using the defaultTiming value
237− totalTime: $totalTime$,
238−$endif$
239−$if(minimumTimePerSlide)$
240− // Specify the minimum amount of time you want to allot to
241− // each slide, if using the totalTime calculation method. If
242− // the automated time allocation causes slide pacing to fall
243− // below this threshold, then you will see an alert in the
244− // speaker notes window
245− minimumTimePerSlide: $minimumTimePerSlide$,
246−$endif$
247−$if(mouseWheel)$
248 // Enable slide navigation via mouse wheel
200 // Enable slide navigation via mouse wheel
249 mouseWheel: $mouseWheel$,
201 mouseWheel: $mouseWheel$,
250−$endif$
202+
251−$if(rollingLinks)$
203+ // The display mode that will be used to show slides
252− // Apply a 3D roll to links on hover
204+ display: '$display$',
253− rollingLinks: $rollingLinks$,
205+
254−$endif$
255−$if(hideInactiveCursor)$
256 // Hide cursor if inactive
206 // Hide cursor if inactive
257 hideInactiveCursor: $hideInactiveCursor$,
207 hideInactiveCursor: $hideInactiveCursor$,
258−$endif$
208+
259−$if(hideCursorTime)$
260 // Time before the cursor is hidden (in ms)
209 // Time before the cursor is hidden (in ms)
261 hideCursorTime: $hideCursorTime$,
210 hideCursorTime: $hideCursorTime$,
262−$endif$
211+
263−$if(hideAddressBar)$
264− // Hides the address bar on mobile devices
265− hideAddressBar: $hideAddressBar$,
266−$endif$
267−$if(previewLinks)$
268 // Opens links in an iframe preview overlay
212 // Opens links in an iframe preview overlay
269 previewLinks: $previewLinks$,
213 previewLinks: $previewLinks$,
270−$endif$
214+
271−$if(transition)$
272− // Transition style
273− transition: '$transition$', // none/fade/slide/convex/concave/zoom
215+ // Transition style (none/fade/slide/convex/concave/zoom)
274−$endif$
216+ transition: '$transition$',
275−$if(transitionSpeed)$
217+
276− // Transition speed
218+ // Transition speed (default/fast/slow)
277− transitionSpeed: '$transitionSpeed$', // default/fast/slow
219+ transitionSpeed: '$transitionSpeed$',
278−$endif$
220+
279−$if(backgroundTransition)$
280 // Transition style for full page slide backgrounds
221 // Transition style for full page slide backgrounds
281− backgroundTransition: '$backgroundTransition$', // none/fade/slide/convex/concave/zoom
222+ // (none/fade/slide/convex/concave/zoom)
282−$endif$
223+ backgroundTransition: '$backgroundTransition$',
283−$if(viewDistance)$
224+
284 // Number of slides away from the current that are visible
225 // Number of slides away from the current that are visible
285 viewDistance: $viewDistance$,
226 viewDistance: $viewDistance$,
286−$endif$
227+
287−$if(mobileViewDistance)$
288 // 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
289 // 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
290 // viewDistance in order to save resources.
230 // viewDistance in order to save resources.
291 mobileViewDistance: $mobileViewDistance$,
231 mobileViewDistance: $mobileViewDistance$,
292−$endif$
293$if(parallaxBackgroundImage)$
232$if(parallaxBackgroundImage)$
233+
294 // Parallax background image
234 // Parallax background image
295 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'"
296$else$
236$else$
297$if(background-image)$
237$if(background-image)$
238+
298 // Parallax background image
239 // Parallax background image
299 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'"
300$endif$
241$endif$
301$endif$
242$endif$
302$if(parallaxBackgroundSize)$
243$if(parallaxBackgroundSize)$
244+
303 // Parallax background size
245 // Parallax background size
304 parallaxBackgroundSize: '$parallaxBackgroundSize$', // CSS syntax, e.g. "2100px 900px"
246 parallaxBackgroundSize: '$parallaxBackgroundSize$', // CSS syntax, e.g. "2100px 900px"
305$endif$
247$endif$
306$if(parallaxBackgroundHorizontal)$
248$if(parallaxBackgroundHorizontal)$
249+
307 // Amount to move parallax background (horizontal and vertical) on slide change
250 // Amount to move parallax background (horizontal and vertical) on slide change
308 // Number, e.g. 100
251 // Number, e.g. 100
309 parallaxBackgroundHorizontal: $parallaxBackgroundHorizontal$,
252 parallaxBackgroundHorizontal: $parallaxBackgroundHorizontal$,
310$endif$
253$endif$
311$if(parallaxBackgroundVertical)$
254$if(parallaxBackgroundVertical)$
255+
312 parallaxBackgroundVertical: $parallaxBackgroundVertical$,
256 parallaxBackgroundVertical: $parallaxBackgroundVertical$,
313$endif$
257$endif$
314$if(width)$
258$if(width)$
259+
315 // The "normal" size of the presentation, aspect ratio will be preserved
260 // The "normal" size of the presentation, aspect ratio will be preserved
316 // when the presentation is scaled to fit different resolutions. Can be
261 // when the presentation is scaled to fit different resolutions. Can be
317 // specified using percentage units.
262 // specified using percentage units.
318 width: $width$,
263 width: $width$,
319$endif$
264$endif$
320$if(height)$
265$if(height)$
266+
321 height: $height$,
267 height: $height$,
322$endif$
268$endif$
323$if(margin)$
269$if(margin)$
270+
324 // 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
325 margin: $margin$,
272 margin: $margin$,
326$endif$
273$endif$
327$if(minScale)$
274$if(minScale)$
275+
328 // Bounds for smallest/largest possible scale to apply to content
276 // Bounds for smallest/largest possible scale to apply to content
329 minScale: $minScale$,
277 minScale: $minScale$,
330$endif$
278$endif$
331$if(maxScale)$
279$if(maxScale)$
280+
332 maxScale: $maxScale$,
281 maxScale: $maxScale$,
333$endif$
282$endif$
334−$if(zoomKey)$
335− // Modifier key used to click-zoom to part of the slide
336− zoomKey: '$zoomKey$',
337−$endif$
338−$if(display)$
339− // The display mode that will be used to show slides
340− display: '$display$',
341−$endif$
342$if(mathjax)$
283$if(mathjax)$
284+
343 math: {
285 math: {
344 mathjax: '$mathjaxurl$',
286 mathjax: '$mathjaxurl$',
345 config: 'TeX-AMS_HTML-full',
287 config: 'TeX-AMS_HTML-full',
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/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+
man/pandoc.1+2−2
@@ -1,7 +1,7 @@
1'\" t
1'\" t
2.\" Automatically generated by Pandoc 2.14.0.1
2.\" Automatically generated by Pandoc 2.14.0.1
3.\"
3.\"
4−.TH "Pandoc User\[cq]s Guide" "" "June 11, 2021" "pandoc 2.14.0.2" ""
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
@@ -7708,7 +7708,7 @@ The HTML generated by pandoc is not guaranteed to be safe.
7708If \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
7709inject arbitrary HTML.
7709inject arbitrary HTML.
7710Even 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
7711−content in attributes for headings, spans, and code blocks.
7711+content in URLs and attributes.
7712To 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
7713sanitizer.
7713sanitizer.
7714.SH AUTHORS
7714.SH AUTHORS
pandoc.cabal+5−5
@@ -1,6 +1,6 @@
1cabal-version: 2.2
1cabal-version: 2.2
2name: pandoc
2name: pandoc
3−version: 2.14.0.2
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
@@ -451,9 +451,9 @@ library
451 bytestring >= 0.9 && < 0.12,
451 bytestring >= 0.9 && < 0.12,
452 case-insensitive >= 1.2 && < 1.3,
452 case-insensitive >= 1.2 && < 1.3,
453 citeproc >= 0.4.0.1 && < 0.4.1,
453 citeproc >= 0.4.0.1 && < 0.4.1,
454− commonmark >= 0.2 && < 0.3,
454+ commonmark >= 0.2.1 && < 0.3,
455 commonmark-extensions >= 0.2.1.2 && < 0.3,
455 commonmark-extensions >= 0.2.1.2 && < 0.3,
456− commonmark-pandoc >= 0.2.1 && < 0.3,
456+ commonmark-pandoc >= 0.2.1.1 && < 0.3,
457 connection >= 0.3.1,
457 connection >= 0.3.1,
458 containers >= 0.4.2.1 && < 0.7,
458 containers >= 0.4.2.1 && < 0.7,
459 data-default >= 0.4 && < 0.8,
459 data-default >= 0.4 && < 0.8,
@@ -484,8 +484,8 @@ library
484 random >= 1 && < 1.3,
484 random >= 1 && < 1.3,
485 safe >= 0.3.18 && < 0.4,
485 safe >= 0.3.18 && < 0.4,
486 scientific >= 0.3 && < 0.4,
486 scientific >= 0.3 && < 0.4,
487− skylighting >= 0.10.5.1 && < 0.10.6,
487+ skylighting >= 0.10.5.2 && < 0.10.6,
488− skylighting-core >= 0.10.5.1 && < 0.10.6,
488+ skylighting-core >= 0.10.5.2 && < 0.10.6,
489 split >= 0.2 && < 0.3,
489 split >= 0.2 && < 0.3,
490 syb >= 0.1 && < 0.8,
490 syb >= 0.1 && < 0.8,
491 tagsoup >= 0.14.6 && < 0.15,
491 tagsoup >= 0.14.6 && < 0.15,
src/Text/Pandoc/Citeproc.hs+66−40
@@ -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 ((<|>))
@@ -49,6 +49,7 @@ import qualified Data.Text as T
49import System.FilePath (takeExtension)
49import System.FilePath (takeExtension)
50import Safe (lastMay, initSafe)
50import Safe (lastMay, initSafe)
51
51
52+
52processCitations :: PandocMonad m => Pandoc -> m Pandoc
53processCitations :: PandocMonad m => Pandoc -> m Pandoc
53processCitations (Pandoc meta bs) = do
54processCitations (Pandoc meta bs) = do
54 style <- getStyle (Pandoc meta bs)
55 style <- getStyle (Pandoc meta bs)
@@ -90,22 +91,18 @@ processCitations (Pandoc meta bs) = do
90 walk (convertQuotes locale) .
91 walk (convertQuotes locale) .
91 insertSpace $ out)
92 insertSpace $ out)
92 (resultBibliography result)
93 (resultBibliography result)
93− let moveNotes = maybe True truish $
94+ let moveNotes = styleIsNoteStyle sopts &&
94− lookupMeta "notes-after-punctuation" meta
95+ maybe True truish (lookupMeta "notes-after-punctuation" meta)
95 let cits = map (walk (convertQuotes locale)) $
96 let cits = map (walk (convertQuotes locale)) $
96 resultCitations result
97 resultCitations result
97
98
98− let fixQuotes = case localePunctuationInQuote locale of
99− Just True ->
100− B.toList . movePunctuationInsideQuotes . B.fromList
101− _ -> id
102−
103 let metanocites = lookupMeta "nocite" meta
99 let metanocites = lookupMeta "nocite" meta
104 let Pandoc meta'' bs' =
100 let Pandoc meta'' bs' =
105 maybe id (setMeta "nocite") metanocites .
101 maybe id (setMeta "nocite") metanocites .
106− walk (map capitalizeNoteCitation .
107− fixQuotes . mvPunct moveNotes locale) .
102+ walk (mvPunct moveNotes locale) .
103+ (if styleIsNoteStyle sopts
108− walk deNote .
104+ then walk addNote . walk deNote
105+ else id) .
109 evalState (walkM insertResolvedCitations $ Pandoc meta' bs)
106 evalState (walkM insertResolvedCitations $ Pandoc meta' bs)
110 $ cits
107 $ cits
111 return $ Pandoc meta''
108 return $ Pandoc meta''
@@ -194,7 +191,9 @@ getReferences mblocale (Pandoc meta bs) = do
194 then const True
191 then const True
195 else (`Set.member` citeIds)
192 else (`Set.member` citeIds)
196 let inlineRefs = case lookupMeta "references" meta of
193 let inlineRefs = case lookupMeta "references" meta of
194+ Just (MetaList rs) ->
195+ filter (idpred . unItemId . referenceId)
197− Just (MetaList rs) -> mapMaybe metaValueToReference rs
196+ $ mapMaybe metaValueToReference rs
198 _ -> []
197 _ -> []
199 externalRefs <- case lookupMeta "bibliography" meta of
198 externalRefs <- case lookupMeta "bibliography" meta of
200 Just (MetaList xs) ->
199 Just (MetaList xs) ->
@@ -373,7 +372,6 @@ formatFromExtension fp = case dropWhile (== '.') $ takeExtension fp of
373
372
374
373
375isNote :: Inline -> Bool
374isNote :: Inline -> Bool
376−isNote (Note _) = True
377isNote (Cite _ [Note _]) = True
375isNote (Cite _ [Note _]) = True
378 -- 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
379 -- 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
@@ -386,6 +384,12 @@ isSpacy Space = True
386isSpacy SoftBreak = True
384isSpacy SoftBreak = True
387isSpacy _ = False
385isSpacy _ = False
388
386
387+movePunctInsideQuotes :: Locale -> [Inline] -> [Inline]
388+movePunctInsideQuotes locale
389+ | localePunctuationInQuote locale == Just True
390+ = B.toList . movePunctuationInsideQuotes . B.fromList
391+ | otherwise
392+ = id
389
393
390mvPunct :: Bool -> Locale -> [Inline] -> [Inline]
394mvPunct :: Bool -> Locale -> [Inline] -> [Inline]
391mvPunct moveNotes locale (x : xs)
395mvPunct moveNotes locale (x : xs)
@@ -398,7 +402,8 @@ mvPunct moveNotes locale (q : s : x : ys)
398 in if moveNotes
402 in if moveNotes
399 then if T.null spunct
403 then if T.null spunct
400 then q : x : mvPunct moveNotes locale ys
404 then q : x : mvPunct moveNotes locale ys
405+ else movePunctInsideQuotes locale
401− else q : Str spunct : x : mvPunct moveNotes locale
406+ [q , Str spunct , x] ++ mvPunct moveNotes locale
402 (B.toList
407 (B.toList
403 (dropTextWhile isPunctuation (B.fromList ys)))
408 (dropTextWhile isPunctuation (B.fromList ys)))
404 else q : x : mvPunct moveNotes locale ys
409 else q : x : mvPunct moveNotes locale ys
@@ -410,9 +415,10 @@ mvPunct moveNotes locale (Cite cs ils : ys)
410 , moveNotes
415 , moveNotes
411 = let s = stringify ys
416 = let s = stringify ys
412 spunct = T.takeWhile isPunctuation s
417 spunct = T.takeWhile isPunctuation s
418+ in Cite cs (movePunctInsideQuotes locale $
413− in Cite cs (init ils
419+ init ils
414− ++ [Str spunct | not (endWithPunct False (init ils))]
420+ ++ [Str spunct | not (endWithPunct False (init ils))]
415− ++ [last ils]) :
421+ ++ [last ils]) :
416 mvPunct moveNotes locale
422 mvPunct moveNotes locale
417 (B.toList (dropTextWhile isPunctuation (B.fromList ys)))
423 (B.toList (dropTextWhile isPunctuation (B.fromList ys)))
418mvPunct moveNotes locale (s : x : ys) | isSpacy s, isNote x =
424mvPunct moveNotes locale (s : x : ys) | isSpacy s, isNote x =
@@ -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/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/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/MediaBag.hs+10−5
@@ -26,13 +26,14 @@ module Text.Pandoc.MediaBag (
26import qualified Data.ByteString.Lazy as BL
26import qualified Data.ByteString.Lazy as BL
27import Data.Data (Data)
27import Data.Data (Data)
28import qualified Data.Map as M
28import qualified Data.Map as M
29−import Data.Maybe (fromMaybe)
29+import Data.Maybe (fromMaybe, isNothing)
30import Data.Typeable (Typeable)
30import Data.Typeable (Typeable)
31import System.FilePath
31import System.FilePath
32import Text.Pandoc.MIME (MimeType, getMimeTypeDef, extensionFromMimeType)
32import Text.Pandoc.MIME (MimeType, getMimeTypeDef, extensionFromMimeType)
33import Data.Text (Text)
33import Data.Text (Text)
34import qualified Data.Text as T
34import qualified Data.Text as T
35import Data.Digest.Pure.SHA (sha1, showDigest)
35import Data.Digest.Pure.SHA (sha1, showDigest)
36+import Network.URI (URI (..), parseURI)
36
37
37data MediaItem =
38data MediaItem =
38 MediaItem
39 MediaItem
@@ -76,16 +77,20 @@ insertMedia fp mbMime contents (MediaBag mediamap) =
76 , mediaContents = contents
77 , mediaContents = contents
77 , mediaMimeType = mt }
78 , mediaMimeType = mt }
78 fp' = canonicalize fp
79 fp' = canonicalize fp
80+ uri = parseURI fp
79− newpath = if isRelative fp && ".." `notElem` splitPath fp
81+ newpath = if isRelative fp
82+ && isNothing uri
83+ && ".." `notElem` splitPath fp
80 then T.unpack fp'
84 then T.unpack fp'
81 else showDigest (sha1 contents) <> "." <> ext
85 else showDigest (sha1 contents) <> "." <> ext
82 fallback = case takeExtension fp of
86 fallback = case takeExtension fp of
83 ".gz" -> getMimeTypeDef $ dropExtension fp
87 ".gz" -> getMimeTypeDef $ dropExtension fp
84 _ -> getMimeTypeDef fp
88 _ -> getMimeTypeDef fp
85 mt = fromMaybe fallback mbMime
89 mt = fromMaybe fallback mbMime
90+ path = maybe fp uriPath uri
86− ext = case takeExtension fp of
91+ ext = case takeExtension path of
87− '.':e -> e
92+ '.':e -> e
88− _ -> maybe "" T.unpack $ extensionFromMimeType mt
93+ _ -> maybe "" T.unpack $ extensionFromMimeType mt
89
94
90
95
91-- | 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.
src/Text/Pandoc/Parsing.hs+4−5
@@ -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
src/Text/Pandoc/Readers/Docx/Parse.hs+11−5
@@ -479,20 +479,26 @@ filePathToRelType path docXmlPath =
479 then Just InDocument
479 then Just InDocument
480 else Nothing
480 else Nothing
481
481
482−relElemToRelationship :: DocumentLocation -> Element -> Maybe Relationship
482+relElemToRelationship :: FilePath -> DocumentLocation -> Element
483+ -> Maybe Relationship
483−relElemToRelationship relType element | qName (elName element) == "Relationship" =
484+relElemToRelationship fp relType element | qName (elName element) == "Relationship" =
484 do
485 do
485 relId <- findAttr (QName "Id" Nothing Nothing) element
486 relId <- findAttr (QName "Id" Nothing Nothing) element
486 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
487− return $ Relationship relType relId target
493+ return $ Relationship relType relId target'
488−relElemToRelationship _ _ = Nothing
494+relElemToRelationship _ _ _ = Nothing
489
495
490filePathToRelationships :: Archive -> FilePath -> FilePath -> [Relationship]
496filePathToRelationships :: Archive -> FilePath -> FilePath -> [Relationship]
491filePathToRelationships ar docXmlPath fp
497filePathToRelationships ar docXmlPath fp
492 | Just relType <- filePathToRelType fp docXmlPath
498 | Just relType <- filePathToRelType fp docXmlPath
493 , Just entry <- findEntryByPath fp ar
499 , Just entry <- findEntryByPath fp ar
494 , Just relElems <- parseXMLFromEntry entry =
500 , Just relElems <- parseXMLFromEntry entry =
495− mapMaybe (relElemToRelationship relType) $ elChildren relElems
501+ mapMaybe (relElemToRelationship fp relType) $ elChildren relElems
496filePathToRelationships _ _ _ = []
502filePathToRelationships _ _ _ = []
497
503
498archiveToRelationships :: Archive -> FilePath -> [Relationship]
504archiveToRelationships :: Archive -> FilePath -> [Relationship]
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/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/Docx.hs+19−3
@@ -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)
@@ -854,14 +855,28 @@ blockToOpenXML' opts (Plain lst) = do
854-- title beginning with fig: indicates that the image is a figure
855-- title beginning with fig: indicates that the image is a figure
855blockToOpenXML' 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
856 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
857 prop <- pStyleM $
862 prop <- pStyleM $
858 if null alt
863 if null alt
859 then "Figure"
864 then "Figure"
860 else "Captioned Figure"
865 else "Captioned Figure"
861 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)
862 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 []
863− captionNode <- withParaPropM (pStyleM "Image Caption")
870+ else withParaPropM (pStyleM "Image Caption")
864− $ 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)
865 return $
880 return $
866 Elem (mknode "w:p" [] (map Elem paraProps ++ contents))
881 Elem (mknode "w:p" [] (map Elem paraProps ++ contents))
867 : captionNode
882 : captionNode
@@ -1289,6 +1304,7 @@ inlineToOpenXML' opts (Image attr@(imgident, _, _) alt (src, title)) = do
1289 Just Eps -> ".eps"
1304 Just Eps -> ".eps"
1290 Just Svg -> ".svg"
1305 Just Svg -> ".svg"
1291 Just Emf -> ".emf"
1306 Just Emf -> ".emf"
1307+ Just Tiff -> ".tiff"
1292 Nothing -> ""
1308 Nothing -> ""
1293 imgpath = "media/" <> ident <> imgext
1309 imgpath = "media/" <> ident <> imgext
1294 mbMimeType = mt <|> getMimeType (T.unpack imgpath)
1310 mbMimeType = mt <|> getMimeType (T.unpack imgpath)
src/Text/Pandoc/Writers/Docx/Table.hs+28−3
@@ -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,15 +34,23 @@ tableToOpenXML :: PandocMonad m
33 -> WS m [Content]
34 -> WS m [Content]
34tableToOpenXML blocksToOpenXML gridTable = do
35tableToOpenXML blocksToOpenXML gridTable = do
35 setFirstPara
36 setFirstPara
36− let (Grid.Table _attr caption colspecs _rowheads thead tbodies tfoot) =
37+ let (Grid.Table (ident,_,_) caption colspecs _rowheads thead tbodies tfoot) =
37 gridTable
38 gridTable
38 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
39 let captionStr = stringify captionBlocks
47 let captionStr = stringify captionBlocks
40 let aligns = map fst $ elems colspecs
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
45 -- We set "in table" after processing the caption, because we don't
54 -- We set "in table" after processing the caption, because we don't
46 -- want the "Table Caption" style to be overwritten with "Compact".
55 -- want the "Table Caption" style to be overwritten with "Compact".
47 modify $ \s -> s { stInTable = True }
56 modify $ \s -> s { stInTable = True }
@@ -81,6 +90,22 @@ tableToOpenXML blocksToOpenXML gridTable = do
81 modify $ \s -> s { stInTable = False }
90 modify $ \s -> s { stInTable = False }
82 return $ captionXml ++ [Elem tbl]
91 return $ captionXml ++ [Elem tbl]
83
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+
84-- | Parts of a table
109-- | Parts of a table
85data RowType = HeadRow | BodyRow | FootRow
110data RowType = HeadRow | BodyRow | FootRow
86
111
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+62−7
@@ -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
@@ -1387,7 +1441,7 @@ inlineToHtml opts inline = do
1387 return $ if T.null tit
1441 return $ if T.null tit
1388 then link'
1442 then link'
1389 else link' ! A.title (toValue tit)
1443 else link' ! A.title (toValue tit)
1390− (Image attr txt (s,tit)) -> do
1444+ (Image attr@(_, _, attrList) txt (s, tit)) -> do
1391 let alternate = stringify txt
1445 let alternate = stringify txt
1392 slideVariant <- gets stSlideVariant
1446 slideVariant <- gets stSlideVariant
1393 let isReveal = slideVariant == RevealJsSlides
1447 let isReveal = slideVariant == RevealJsSlides
@@ -1400,7 +1454,8 @@ inlineToHtml opts inline = do
1400 [A.title $ toValue tit | not (T.null tit)] ++
1454 [A.title $ toValue tit | not (T.null tit)] ++
1401 attrs
1455 attrs
1402 imageTag = (if html5 then H5.img else H.img
1456 imageTag = (if html5 then H5.img else H.img
1403− , [A.alt $ toValue alternate | not (null txt)] )
1457+ , [A.alt $ toValue alternate | not (null txt) &&
1458+ isNothing (lookup "alt" attrList)] )
1404 mediaTag tg fallbackTxt =
1459 mediaTag tg fallbackTxt =
1405 let linkTxt = if null txt
1460 let linkTxt = if null txt
1406 then fallbackTxt
1461 then fallbackTxt
src/Text/Pandoc/Writers/LaTeX.hs+1−1
@@ -919,7 +919,7 @@ inlineToLaTeX il@(RawInline f str) = do
919inlineToLaTeX LineBreak = do
919inlineToLaTeX LineBreak = do
920 emptyLine <- gets stEmptyLine
920 emptyLine <- gets stEmptyLine
921 setEmptyLine True
921 setEmptyLine True
922− return $ (if emptyLine then "~" else "") <> "\\\\" <> cr
922+ return $ (if emptyLine then "\\strut " else "") <> "\\\\" <> cr
923inlineToLaTeX SoftBreak = do
923inlineToLaTeX SoftBreak = do
924 wrapText <- gets (writerWrapText . stOptions)
924 wrapText <- gets (writerWrapText . stOptions)
925 case wrapText of
925 case wrapText of
src/Text/Pandoc/Writers/LaTeX/Table.hs+11−3
@@ -26,7 +26,8 @@ import Text.DocLayout
26 ( Doc, braces, cr, empty, hcat, hsep, isEmpty, literal, nest
26 ( Doc, braces, cr, empty, hcat, hsep, isEmpty, literal, nest
27 , text, vcat, ($$) )
27 , text, vcat, ($$) )
28import Text.Pandoc.Shared (blocksToInlines, splitBy, tshow)
28import Text.Pandoc.Shared (blocksToInlines, splitBy, tshow)
29−import Text.Pandoc.Walk (walk)
29+import Text.Pandoc.Walk (walk, query)
30+import Data.Monoid (Any(..))
30import Text.Pandoc.Writers.LaTeX.Caption (getCaption)
31import Text.Pandoc.Writers.LaTeX.Caption (getCaption)
31import Text.Pandoc.Writers.LaTeX.Notes (notesToLaTeX)
32import Text.Pandoc.Writers.LaTeX.Notes (notesToLaTeX)
32import Text.Pandoc.Writers.LaTeX.Types
33import Text.Pandoc.Writers.LaTeX.Types
@@ -261,8 +262,13 @@ cellToLaTeX blockListToLaTeX celltype annotatedCell = do
261 Para{} -> True
262 Para{} -> True
262 Plain{} -> True
263 Plain{} -> True
263 _ -> False
264 _ -> False
265+ let hasLineBreak LineBreak = Any True
266+ hasLineBreak _ = Any False
267+ let hasLineBreaks = getAny $ query hasLineBreak blocks
264 result <-
268 result <-
265− if not hasWidths || (celltype /= HeaderCell && all isPlainOrPara blocks)
269+ if not hasWidths || (celltype /= HeaderCell
270+ && all isPlainOrPara blocks
271+ && not hasLineBreaks)
266 then
272 then
267 blockListToLaTeX $ walk fixLineBreaks $ walk displayMathToInline blocks
273 blockListToLaTeX $ walk fixLineBreaks $ walk displayMathToInline blocks
268 else do
274 else do
@@ -275,7 +281,9 @@ cellToLaTeX blockListToLaTeX celltype annotatedCell = do
275 let halign = literal $ alignCommand align
281 let halign = literal $ alignCommand align
276 return $ "\\begin{minipage}" <> valign <>
282 return $ "\\begin{minipage}" <> valign <>
277 braces "\\linewidth" <> halign <> cr <>
283 braces "\\linewidth" <> halign <> cr <>
278− cellContents <> cr <>
284+ cellContents <>
285+ (if hasLineBreaks then "\\strut" else mempty)
286+ <> cr <>
279 "\\end{minipage}"
287 "\\end{minipage}"
280 modify $ \st -> st{ stExternalNotes = externalNotes }
288 modify $ \st -> st{ stExternalNotes = externalNotes }
281 when (rowspan /= RowSpan 1) $
289 when (rowspan /= RowSpan 1) $
src/Text/Pandoc/Writers/Markdown.hs+6−4
@@ -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,10 +256,10 @@ 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−-- | (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
261−-- no need to bother with curly braces.
260+-- standalone, no need to bother with curly braces.
262classOrAttrsToMarkdown :: Attr -> Doc Text
261classOrAttrsToMarkdown :: Attr -> Doc Text
263−classOrAttrsToMarkdown ("",[cls],_) = literal cls
262+classOrAttrsToMarkdown ("",[cls],[]) = literal cls
264classOrAttrsToMarkdown attrs = attrsToMarkdown attrs
263classOrAttrsToMarkdown attrs = attrsToMarkdown attrs
265
264
266-- | Ordered list start parser for use in Para below.
265-- | Ordered list start parser for use in Para below.
@@ -792,6 +791,9 @@ blockListToMarkdown opts blocks = do
792 b1 : commentSep : fixBlocks (b2:bs)
791 b1 : commentSep : fixBlocks (b2:bs)
793 fixBlocks (Plain ils : bs@(RawBlock{}:_)) =
792 fixBlocks (Plain ils : bs@(RawBlock{}:_)) =
794 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
795 fixBlocks (Plain ils : bs) | inlist =
797 fixBlocks (Plain ils : bs) | inlist =
796 Plain ils : fixBlocks bs
798 Plain ils : fixBlocks bs
797 fixBlocks (Plain ils : bs) =
799 fixBlocks (Plain ils : bs) =
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)
stack.yaml+9−11
@@ -7,18 +7,16 @@ flags:
7packages:
7packages:
8- '.'
8- '.'
9extra-deps:
9extra-deps:
10−- haddock-library-1.10.0
10+- commonmark-0.2.1
11−- hslua-1.3.0
11+- commonmark-pandoc-0.2.1.1
12−- hslua-module-path-0.1.0
12+- skylighting-core-0.10.5.2
13−- jira-wiki-markup-1.4.0
13+- skylighting-0.10.5.2
14−- random-1.2.0
14+- git: https://github.com/jgm/doctemplates
15−- unicode-collation-0.1.3
15+ commit: 428c26d5303cf7a2b1051fe1ffd9aafe9ba71c81
16−- citeproc-0.4.0.1
16+- git: https://github.com/jgm/citeproc
17−- commonmark-0.2
17+ commit: 4ce0501cd6f9c86eee087afcf878c256e49b9615
18−- commonmark-extensions-0.2.1.2
19−- commonmark-pandoc-0.2.1
20ghc-options:
18ghc-options:
21 "$locals": -fhide-source-paths -Wno-missing-home-modules
19 "$locals": -fhide-source-paths -Wno-missing-home-modules
22−resolver: lts-17.12
20+resolver: lts-18.0
23nix:
21nix:
24 packages: [zlib]
22 packages: [zlib]
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/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/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/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/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/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/docx/golden/image.docx

Binary file not shown.

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/lhs-test.latex+3−3
@@ -4,9 +4,6 @@
4%
4%
5\documentclass[
5\documentclass[
6]{article}
6]{article}
7−\author{}
8−\date{}
9−
10\usepackage{amsmath,amssymb}
7\usepackage{amsmath,amssymb}
11\usepackage{lmodern}
8\usepackage{lmodern}
12\usepackage{iftex}
9\usepackage{iftex}
@@ -88,6 +85,9 @@
88 \usepackage{selnolig} % disable illegal ligatures
85 \usepackage{selnolig} % disable illegal ligatures
89\fi
86\fi
90
87
88+\author{}
89+\date{}
90+
91\begin{document}
91\begin{document}
92
92
93\hypertarget{lhs-test}{%
93\hypertarget{lhs-test}{%
test/lhs-test.latex+lhs+3−3
@@ -4,9 +4,6 @@
4%
4%
5\documentclass[
5\documentclass[
6]{article}
6]{article}
7−\author{}
8−\date{}
9−
10\usepackage{amsmath,amssymb}
7\usepackage{amsmath,amssymb}
11\usepackage{lmodern}
8\usepackage{lmodern}
12\usepackage{iftex}
9\usepackage{iftex}
@@ -55,6 +52,9 @@
55 \usepackage{selnolig} % disable illegal ligatures
52 \usepackage{selnolig} % disable illegal ligatures
56\fi
53\fi
57
54
55+\author{}
56+\date{}
57+
58\begin{document}
58\begin{document}
59
59
60\hypertarget{lhs-test}{%
60\hypertarget{lhs-test}{%
test/tables/nordics.latex+4−4
@@ -11,10 +11,10 @@ Name
11Capital
11Capital
12\end{minipage} & \begin{minipage}[b]{\linewidth}\centering
12\end{minipage} & \begin{minipage}[b]{\linewidth}\centering
13Population\\
13Population\\
14−(in 2018)
14+(in 2018)\strut
15\end{minipage} & \begin{minipage}[b]{\linewidth}\centering
15\end{minipage} & \begin{minipage}[b]{\linewidth}\centering
16Area\\
16Area\\
17−(in km\textsuperscript{2})
17+(in km\textsuperscript{2})\strut
18\end{minipage} \\
18\end{minipage} \\
19\midrule
19\midrule
20\endfirsthead
20\endfirsthead
@@ -25,10 +25,10 @@ Name
25Capital
25Capital
26\end{minipage} & \begin{minipage}[b]{\linewidth}\centering
26\end{minipage} & \begin{minipage}[b]{\linewidth}\centering
27Population\\
27Population\\
28−(in 2018)
28+(in 2018)\strut
29\end{minipage} & \begin{minipage}[b]{\linewidth}\centering
29\end{minipage} & \begin{minipage}[b]{\linewidth}\centering
30Area\\
30Area\\
31−(in km\textsuperscript{2})
31+(in km\textsuperscript{2})\strut
32\end{minipage} \\
32\end{minipage} \\
33\midrule
33\midrule
34\endhead
34\endhead
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.latex+4−4
@@ -4,10 +4,6 @@
4%
4%
5\documentclass[
5\documentclass[
6]{article}
6]{article}
7−\title{Pandoc Test Suite}
8−\author{John MacFarlane \and Anonymous}
9−\date{July 17, 2006}
10−
11\usepackage{amsmath,amssymb}
7\usepackage{amsmath,amssymb}
12\usepackage{lmodern}
8\usepackage{lmodern}
13\usepackage{iftex}
9\usepackage{iftex}
@@ -71,6 +67,10 @@
71 \usepackage{selnolig} % disable illegal ligatures
67 \usepackage{selnolig} % disable illegal ligatures
72\fi
68\fi
73
69
70+\title{Pandoc Test Suite}
71+\author{John MacFarlane \and Anonymous}
72+\date{July 17, 2006}
73+
74\begin{document}
74\begin{document}
75\maketitle
75\maketitle
76
76
test/writers-lang-and-dir.latex+3−3
@@ -5,9 +5,6 @@
5\documentclass[
5\documentclass[
6 english,
6 english,
7]{article}
7]{article}
8−\author{}
9−\date{}
10−
11\usepackage{amsmath,amssymb}
8\usepackage{amsmath,amssymb}
12\usepackage{lmodern}
9\usepackage{lmodern}
13\usepackage{iftex}
10\usepackage{iftex}
@@ -87,6 +84,9 @@
87 \newenvironment{LTR}{\beginL}{\endL}
84 \newenvironment{LTR}{\beginL}{\endL}
88\fi
85\fi
89
86
87+\author{}
88+\date{}
89+
90\begin{document}
90\begin{document}
91
91
92\hypertarget{empty-divs-and-spans}{%
92\hypertarget{empty-divs-and-spans}{%
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