File: pdfmark_spec.rb

package info (click to toggle)
ruby-asciidoctor-pdf 2.3.19-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 15,972 kB
  • sloc: ruby: 44,316; sh: 133; java: 45; makefile: 4
file content (224 lines) | stat: -rw-r--r-- 8,158 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
# frozen_string_literal: true

require_relative 'spec_helper'

describe Asciidoctor::PDF::Pdfmark do
  subject { described_class }

  context 'generator' do
    it 'should generate pdfmark info from document' do
      doc = Asciidoctor.load <<~'EOS', safe: :safe
      = Materials Science and Engineering: An Introduction
      William D. Callister
      :doctype: book
      :docdatetime: 2018-01-17
      :localdatetime: 2018-01-17
      :subject: Materials Science
      :keywords: semiconductors, band gap
      EOS

      contents = (subject.new doc).generate
      (expect contents).to include '/Title (Materials Science and Engineering: An Introduction)'
      (expect contents).to include '/Author (William D. Callister)'
      (expect contents).to include '/Subject (Materials Science)'
      (expect contents).to include '/Keywords (semiconductors, band gap)'
      (expect contents).to include '/ModDate (D:20180117000000'
      (expect contents).to include '/CreationDate (D:20180117000000'
      (expect contents).to include '/Producer null'
      (expect contents).to end_with %(/DOCINFO pdfmark\n)
    end

    it 'should use value of untitled-label as title if document has no header' do
      doc = Asciidoctor.load <<~'EOS', safe: :safe
      == Section

      content
      EOS

      contents = (subject.new doc).generate
      (expect contents).to include '/Title (Untitled)'
      (expect contents).to end_with %(/DOCINFO pdfmark\n)
    end

    it 'should sanitize values of Author, Subject, Keywords, and Producer fields' do
      doc = Asciidoctor.load <<~'EOS', safe: :safe
      = Document Title
      D&#95;J Allen
      :subject: Science &amp; Math
      :keywords: mass&#8211;energy equivalence
      :publisher: Schr&#246;dinger&#8217;s Cat

      content
      EOS

      contents = (subject.new doc).generate
      (expect contents).to include '/Author (D_J Allen)'
      (expect contents).to include '/Subject (Science & Math)'
      (expect contents).to include '/Keywords <feff006d00610073007320130065006e00650072006700790020006500710075006900760061006c0065006e00630065>'
      (expect contents).to include '/Producer <feff005300630068007200f600640069006e006700650072201900730020004300610074>'
      (expect contents).to end_with %(/DOCINFO pdfmark\n)
    end

    it 'should set Author field to value of author attribute if locked by the API' do
      doc = Asciidoctor.load <<~'EOS', safe: :safe, attributes: { 'author' => 'Doc Writer' }
      = Document Title
      Author Name

      content
      EOS

      contents = (subject.new doc).generate
      (expect contents).to include '/Author (Doc Writer)'
      (expect contents).to end_with %(/DOCINFO pdfmark\n)
    end

    it 'should set Author field to value of authors attribute if locked by the API' do
      doc = Asciidoctor.load <<~'EOS', safe: :safe, attributes: { 'authors' => 'Doc Writer' }
      = Document Title
      Author Name

      content
      EOS

      contents = (subject.new doc).generate
      (expect contents).to include '/Author (Doc Writer)'
      (expect contents).to end_with %(/DOCINFO pdfmark\n)
    end

    it 'should set Author field to value of authors attribute if both author and authors attribute locked by the API' do
      doc = Asciidoctor.load <<~'EOS', safe: :safe, attributes: { 'authors' => 'Doc Writer', 'author' => 'Anonymous' }
      = Document Title
      Author Name

      content
      EOS

      contents = (subject.new doc).generate
      (expect contents).to include '/Author (Doc Writer)'
      (expect contents).to end_with %(/DOCINFO pdfmark\n)
    end

    it 'should set Author field to value of author attribute if document has no doctitle' do
      doc = Asciidoctor.load <<~'EOS', safe: :safe
      :author: Author Name

      == Section Title

      content
      EOS

      contents = (subject.new doc).generate
      (expect contents).to include '/Author (Author Name)'
      (expect contents).to end_with %(/DOCINFO pdfmark\n)
    end

    it 'should set Author field to value of authors attribute if document has no doctitle' do
      doc = Asciidoctor.load <<~'EOS', safe: :safe
      :authors: Author Name

      == Section Title

      content
      EOS

      contents = (subject.new doc).generate
      (expect contents).to include '/Author (Author Name)'
      (expect contents).to end_with %(/DOCINFO pdfmark\n)
    end

    it 'should set date to Unix epoch in UTC if reproducible attribute is set' do
      doc = Asciidoctor.load <<~'EOS', safe: :safe
      = Document Title
      Author Name
      :reproducible:

      body
      EOS

      contents = (subject.new doc).generate
      (expect contents).to include '/Title (Document Title)'
      (expect contents).to include '/ModDate (D:19700101000000+00\'00\')'
      (expect contents).to include '/CreationDate (D:19700101000000+00\'00\')'
      (expect contents).to end_with %(/DOCINFO pdfmark\n)
    end

    it 'should fallback to current date if dates are not parsable' do
      doc = Asciidoctor.load <<~'EOS', safe: :safe
      = Document Title
      Author Name
      :docdatetime: garbage
      :localdatetime: garbage

      body
      EOS

      expected_date = Time.now.to_pdf_object.slice 0, 11
      contents = (subject.new doc).generate
      (expect contents).to include '/Title (Document Title)'
      (expect contents).to include %(/ModDate #{expected_date})
      (expect contents).to include %(/CreationDate #{expected_date})
      (expect contents).to end_with %(/DOCINFO pdfmark\n)
    end

    it 'should fallback to current date if only localdatetime is not parsable' do
      doc = Asciidoctor.load <<~'EOS', safe: :safe
      = Document Title
      Author Name
      :localdatetime: garbage

      body
      EOS

      expected_date = Time.now.to_pdf_object.slice 0, 11
      contents = (subject.new doc).generate
      (expect contents).to include '/Title (Document Title)'
      (expect contents).to include %(/CreationDate #{expected_date})
      (expect contents).to end_with %(/DOCINFO pdfmark\n)
    end

    it 'should set mod and creation dates to match SOURCE_DATE_EPOCH environment variable' do
      old_source_date_epoch = ENV.delete 'SOURCE_DATE_EPOCH'
      ENV['SOURCE_DATE_EPOCH'] = '1234123412'
      doc = Asciidoctor.load 'content', safe: :safe
      contents = (subject.new doc).generate
      (expect contents).to include '/ModDate (D:20090208200332+00\'00\')'
      (expect contents).to include '/CreationDate (D:20090208200332+00\'00\')'
    ensure
      if old_source_date_epoch
        ENV['SOURCE_DATE_EPOCH'] = old_source_date_epoch
      else
        ENV.delete 'SOURCE_DATE_EPOCH'
      end
    end
  end

  context 'pdfmark file' do
    it 'should generate pdfmark file if pdfmark attribute is set' do
      input_file = Pathname.new fixture_file 'book.adoc'
      pdfmark_file = Pathname.new output_file 'book.pdfmark'
      to_pdf input_file, to_dir: output_dir, attribute_overrides: { 'pdfmark' => '' }
      (expect pdfmark_file).to exist
      pdfmark_contents = pdfmark_file.read
      (expect pdfmark_contents).to include '/Title (Book Title)'
      (expect pdfmark_contents).to include '/Author (Author Name)'
      (expect pdfmark_contents).to include '/DOCINFO pdfmark'
    ensure
      File.unlink pdfmark_file
    end

    it 'should hex encode title if contains non-ASCII character' do
      input_file = Pathname.new fixture_file 'pdfmark-non-ascii-title.adoc'
      pdfmark_file = Pathname.new output_file 'pdfmark-non-ascii-title.pdfmark'
      to_pdf input_file, to_dir: output_dir, attribute_overrides: { 'pdfmark' => '' }
      (expect pdfmark_file).to exist
      pdfmark_contents = pdfmark_file.read
      (expect pdfmark_contents).to include '/Title <feff004c006500730020004d0069007300e9007200610062006c00650073>'
      (expect pdfmark_contents).to include '/Author (Victor Hugo)'
      (expect pdfmark_contents).to include '/Subject (June Rebellion)'
      (expect pdfmark_contents).to include '/Keywords (france, poor, rebellion)'
      (expect pdfmark_contents).to include '/DOCINFO pdfmark'
    ensure
      File.unlink pdfmark_file
    end
  end
end