asciidoctor-pdf 1.5.0.beta.8 → 1.5.0.rc.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.adoc +49 -0
- data/LICENSE.adoc +1 -1
- data/NOTICE.adoc +1 -1
- data/README.adoc +43 -47
- data/asciidoctor-pdf.gemspec +5 -1
- data/bin/asciidoctor-pdf-optimize +1 -1
- data/data/themes/base-theme.yml +4 -3
- data/data/themes/default-theme.yml +10 -5
- data/docs/theming-guide.adoc +286 -22
- data/lib/asciidoctor-pdf.rb +1 -0
- data/lib/asciidoctor-pdf/converter.rb +1 -0
- data/lib/asciidoctor-pdf/version.rb +1 -0
- data/lib/asciidoctor/pdf.rb +13 -2
- data/lib/asciidoctor/pdf/converter.rb +3962 -3955
- data/lib/asciidoctor/pdf/ext.rb +9 -0
- data/lib/asciidoctor/pdf/ext/asciidoctor.rb +1 -0
- data/lib/asciidoctor/pdf/ext/asciidoctor/abstract_block.rb +1 -0
- data/lib/asciidoctor/pdf/ext/asciidoctor/abstract_node.rb +1 -0
- data/lib/asciidoctor/pdf/ext/asciidoctor/document.rb +1 -0
- data/lib/asciidoctor/pdf/ext/asciidoctor/image.rb +18 -16
- data/lib/asciidoctor/pdf/ext/asciidoctor/list.rb +3 -2
- data/lib/asciidoctor/pdf/ext/asciidoctor/list_item.rb +2 -1
- data/lib/asciidoctor/pdf/ext/asciidoctor/logging_shim.rb +3 -4
- data/lib/asciidoctor/pdf/ext/asciidoctor/section.rb +8 -6
- data/lib/asciidoctor/pdf/ext/core.rb +2 -0
- data/lib/asciidoctor/pdf/ext/core/array.rb +1 -0
- data/lib/asciidoctor/pdf/ext/core/hash.rb +1 -0
- data/lib/asciidoctor/pdf/ext/core/numeric.rb +4 -3
- data/lib/asciidoctor/pdf/ext/core/object.rb +1 -0
- data/lib/asciidoctor/pdf/ext/core/quantifiable_stdout.rb +8 -1
- data/lib/asciidoctor/pdf/ext/core/regexp.rb +1 -0
- data/lib/asciidoctor/pdf/ext/core/string.rb +6 -7
- data/lib/asciidoctor/pdf/ext/pdf-core.rb +1 -0
- data/lib/asciidoctor/pdf/ext/pdf-core/page.rb +3 -4
- data/lib/asciidoctor/pdf/ext/pdf-core/pdf_object.rb +2 -1
- data/lib/asciidoctor/pdf/ext/prawn-svg.rb +1 -0
- data/lib/asciidoctor/pdf/ext/prawn-svg/interface.rb +11 -8
- data/lib/asciidoctor/pdf/ext/prawn-table.rb +2 -1
- data/lib/asciidoctor/pdf/ext/prawn-table/cell.rb +9 -10
- data/lib/asciidoctor/pdf/ext/prawn-table/cell/asciidoc.rb +62 -57
- data/lib/asciidoctor/pdf/ext/prawn-table/cell/text.rb +5 -3
- data/lib/asciidoctor/pdf/ext/prawn-templates.rb +1 -0
- data/lib/asciidoctor/pdf/ext/prawn.rb +1 -0
- data/lib/asciidoctor/pdf/ext/prawn/coderay_encoder.rb +73 -72
- data/lib/asciidoctor/pdf/ext/prawn/extensions.rb +814 -818
- data/lib/asciidoctor/pdf/ext/prawn/font/afm.rb +4 -3
- data/lib/asciidoctor/pdf/ext/prawn/formatted_text/box.rb +2 -1
- data/lib/asciidoctor/pdf/ext/prawn/formatted_text/fragment.rb +7 -2
- data/lib/asciidoctor/pdf/ext/prawn/images.rb +45 -44
- data/lib/asciidoctor/pdf/ext/pygments.rb +34 -0
- data/lib/asciidoctor/pdf/ext/rouge.rb +1 -1
- data/lib/asciidoctor/pdf/ext/rouge/formatters/prawn.rb +181 -149
- data/lib/asciidoctor/pdf/ext/rouge/themes/asciidoctor_pdf_default.rb +1 -0
- data/lib/asciidoctor/pdf/formatted_text.rb +2 -0
- data/lib/asciidoctor/pdf/formatted_text/formatter.rb +35 -34
- data/lib/asciidoctor/pdf/formatted_text/fragment_position_renderer.rb +8 -7
- data/lib/asciidoctor/pdf/formatted_text/inline_destination_marker.rb +13 -14
- data/lib/asciidoctor/pdf/formatted_text/inline_image_arranger.rb +112 -133
- data/lib/asciidoctor/pdf/formatted_text/inline_image_renderer.rb +43 -41
- data/lib/asciidoctor/pdf/formatted_text/inline_text_aligner.rb +15 -14
- data/lib/asciidoctor/pdf/formatted_text/source_wrap.rb +43 -0
- data/lib/asciidoctor/pdf/formatted_text/text_background_and_border_renderer.rb +46 -37
- data/lib/asciidoctor/pdf/formatted_text/transform.rb +371 -352
- data/lib/asciidoctor/pdf/index_catalog.rb +99 -95
- data/lib/asciidoctor/pdf/measurements.rb +51 -48
- data/lib/asciidoctor/pdf/optimizer.rb +34 -31
- data/lib/asciidoctor/pdf/pdfmark.rb +34 -33
- data/lib/asciidoctor/pdf/roman_numeral.rb +80 -79
- data/lib/asciidoctor/pdf/sanitizer.rb +38 -37
- data/lib/asciidoctor/pdf/temporary_path.rb +10 -9
- data/lib/asciidoctor/pdf/text_transformer.rb +101 -100
- data/lib/asciidoctor/pdf/theme_loader.rb +258 -256
- data/lib/asciidoctor/pdf/version.rb +5 -4
- metadata +55 -6
- data/lib/asciidoctor/pdf/ext/rouge/themes/bw.rb +0 -39
- data/lib/asciidoctor/pdf/ext/ttfunk.rb +0 -9
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
########################################################################
|
3
4
|
#
|
4
5
|
# This file was copied from roman-numerals and modified for use with
|
@@ -29,99 +30,99 @@
|
|
29
30
|
########################################################################
|
30
31
|
|
31
32
|
module Asciidoctor
|
32
|
-
module PDF
|
33
|
-
class RomanNumeral
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
33
|
+
module PDF
|
34
|
+
class RomanNumeral
|
35
|
+
BaseDigits = {
|
36
|
+
1 => 'I',
|
37
|
+
4 => 'IV',
|
38
|
+
5 => 'V',
|
39
|
+
9 => 'IX',
|
40
|
+
10 => 'X',
|
41
|
+
40 => 'XL',
|
42
|
+
50 => 'L',
|
43
|
+
90 => 'XC',
|
44
|
+
100 => 'C',
|
45
|
+
400 => 'CD',
|
46
|
+
500 => 'D',
|
47
|
+
900 => 'CM',
|
48
|
+
1000 => 'M',
|
49
|
+
}
|
49
50
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
51
|
+
def initialize initial_value, letter_case = nil
|
52
|
+
initial_value ||= 1
|
53
|
+
if ::Integer === initial_value
|
54
|
+
@integer_value = initial_value
|
55
|
+
else
|
56
|
+
@integer_value = RomanNumeral.roman_to_int initial_value
|
57
|
+
letter_case = :lower if letter_case.nil? && initial_value.upcase != initial_value
|
58
|
+
end
|
59
|
+
@letter_case = letter_case.nil? ? :upper : letter_case
|
60
|
+
end
|
60
61
|
|
61
|
-
|
62
|
-
|
63
|
-
|
62
|
+
def to_s
|
63
|
+
to_r
|
64
|
+
end
|
64
65
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
66
|
+
def to_r
|
67
|
+
if (int = @integer_value) < 1
|
68
|
+
return int.to_s
|
69
|
+
end
|
70
|
+
roman = RomanNumeral.int_to_roman int
|
71
|
+
@letter_case == :lower ? roman.downcase : roman
|
72
|
+
end
|
72
73
|
|
73
|
-
|
74
|
-
|
75
|
-
|
74
|
+
def to_i
|
75
|
+
@integer_value
|
76
|
+
end
|
76
77
|
|
77
|
-
|
78
|
-
|
79
|
-
|
78
|
+
def odd?
|
79
|
+
to_i.odd?
|
80
|
+
end
|
80
81
|
|
81
|
-
|
82
|
-
|
83
|
-
|
82
|
+
def even?
|
83
|
+
to_i.even?
|
84
|
+
end
|
84
85
|
|
85
|
-
|
86
|
-
|
87
|
-
|
86
|
+
def next
|
87
|
+
RomanNumeral.new @integer_value + 1, @letter_case
|
88
|
+
end
|
88
89
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
90
|
+
def next!
|
91
|
+
@integer_value += 1
|
92
|
+
self
|
93
|
+
end
|
93
94
|
|
94
|
-
|
95
|
-
|
96
|
-
|
95
|
+
def pred
|
96
|
+
RomanNumeral.new @integer_value - 1, @letter_case
|
97
|
+
end
|
97
98
|
|
98
|
-
|
99
|
-
|
100
|
-
|
99
|
+
def empty?
|
100
|
+
false
|
101
|
+
end
|
101
102
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
103
|
+
def self.int_to_roman value
|
104
|
+
result = []
|
105
|
+
BaseDigits.keys.reverse_each do |ival|
|
106
|
+
while value >= ival
|
107
|
+
value -= ival
|
108
|
+
result << BaseDigits[ival]
|
109
|
+
end
|
110
|
+
end
|
111
|
+
result.join
|
108
112
|
end
|
109
|
-
end
|
110
|
-
result.join
|
111
|
-
end
|
112
113
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
114
|
+
def self.roman_to_int value
|
115
|
+
value = value.upcase
|
116
|
+
result = 0
|
117
|
+
BaseDigits.values.reverse_each do |rval|
|
118
|
+
while value.start_with? rval
|
119
|
+
offset = rval.length
|
120
|
+
value = value[offset..offset]
|
121
|
+
result += BaseDigits.key rval
|
122
|
+
end
|
123
|
+
end
|
124
|
+
result
|
121
125
|
end
|
122
126
|
end
|
123
|
-
result
|
124
127
|
end
|
125
128
|
end
|
126
|
-
end
|
127
|
-
end
|
@@ -1,44 +1,45 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Asciidoctor
|
3
|
-
module PDF
|
4
|
-
module Sanitizer
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
4
|
+
module PDF
|
5
|
+
module Sanitizer
|
6
|
+
XMLSpecialChars = {
|
7
|
+
'<' => ?<,
|
8
|
+
'>' => ?>,
|
9
|
+
'&' => ?&,
|
10
|
+
}
|
11
|
+
XMLSpecialCharsRx = /(?:#{XMLSpecialChars.keys.join ?|})/
|
12
|
+
InverseXMLSpecialChars = XMLSpecialChars.invert
|
13
|
+
InverseXMLSpecialCharsRx = /[#{InverseXMLSpecialChars.keys.join}]/
|
14
|
+
(BuiltInNamedEntities = {
|
15
|
+
'amp' => ?&,
|
16
|
+
'apos' => ?',
|
17
|
+
'gt' => ?>,
|
18
|
+
'lt' => ?<,
|
19
|
+
'nbsp' => ' ',
|
20
|
+
'quot' => ?",
|
21
|
+
}).default = ??
|
22
|
+
SanitizeXMLRx = /<[^>]+>/
|
23
|
+
CharRefRx = /&(?:([a-z][a-z]+\d{0,2})|#(?:(\d\d\d{0,4})|x([a-f\d][a-f\d][a-f\d]{0,3})));/
|
23
24
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
25
|
+
# Strip leading, trailing and repeating whitespace, remove XML tags and
|
26
|
+
# resolve all entities in the specified string.
|
27
|
+
#
|
28
|
+
# FIXME move to a module so we can mix it in elsewhere
|
29
|
+
# FIXME add option to control escaping entities, or a filter mechanism in general
|
30
|
+
def sanitize string
|
31
|
+
string = string.gsub SanitizeXMLRx, '' if string.include? '<'
|
32
|
+
string = string.gsub(CharRefRx) { $1 ? BuiltInNamedEntities[$1] : ([$2 ? $2.to_i : ($3.to_i 16)].pack 'U1') } if string.include? '&'
|
33
|
+
string.strip.tr_s ' ', ' '
|
34
|
+
end
|
34
35
|
|
35
|
-
|
36
|
-
|
37
|
-
|
36
|
+
def escape_xml string
|
37
|
+
string.gsub InverseXMLSpecialCharsRx, InverseXMLSpecialChars
|
38
|
+
end
|
38
39
|
|
39
|
-
|
40
|
-
|
40
|
+
def encode_quotes string
|
41
|
+
(string.include? ?") ? (string.gsub ?", '"') : string
|
42
|
+
end
|
43
|
+
end
|
41
44
|
end
|
42
45
|
end
|
43
|
-
end
|
44
|
-
end
|
@@ -1,14 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Asciidoctor
|
3
|
-
module PDF
|
4
|
-
module TemporaryPath
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
module PDF
|
5
|
+
module TemporaryPath
|
6
|
+
def unlink
|
7
|
+
::File.unlink self
|
8
|
+
end
|
8
9
|
|
9
|
-
|
10
|
-
|
10
|
+
def exist?
|
11
|
+
::File.file? self
|
12
|
+
end
|
13
|
+
end
|
11
14
|
end
|
12
15
|
end
|
13
|
-
end
|
14
|
-
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
unless RUBY_VERSION >= '2.4'
|
3
4
|
begin
|
4
5
|
require 'unicode' unless defined? Unicode::VERSION
|
@@ -10,106 +11,106 @@ unless RUBY_VERSION >= '2.4'
|
|
10
11
|
end
|
11
12
|
|
12
13
|
module Asciidoctor
|
13
|
-
module PDF
|
14
|
-
module TextTransformer
|
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
|
-
|
14
|
+
module PDF
|
15
|
+
module TextTransformer
|
16
|
+
XMLMarkupRx = /&#?[a-z\d]+;|</
|
17
|
+
PCDATAFilterRx = /(&#?[a-z\d]+;|<[^>]+>)|([^&<]+)/
|
18
|
+
TagFilterRx = /(<[^>]+>)|([^<]+)/
|
19
|
+
WordRx = /\S+/
|
20
|
+
SoftHyphen = ?\u00ad
|
21
|
+
|
22
|
+
def capitalize_words_pcdata string
|
23
|
+
if XMLMarkupRx.match? string
|
24
|
+
string.gsub(PCDATAFilterRx) { $2 ? (capitalize_words_mb $2) : $1 }
|
25
|
+
else
|
26
|
+
capitalize_words_mb string
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def capitalize_words_mb string
|
31
|
+
string.gsub(WordRx) { capitalize_mb $& }
|
32
|
+
end
|
33
|
+
|
34
|
+
def hyphenate_words_pcdata string, hyphenator
|
35
|
+
if XMLMarkupRx.match? string
|
36
|
+
string.gsub(PCDATAFilterRx) { $2 ? (hyphenate_words $2, hyphenator) : $1 }
|
37
|
+
else
|
38
|
+
hyphenate_words string, hyphenator
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def hyphenate_words string, hyphenator
|
43
|
+
string.gsub(WordRx) { hyphenator.visualize $&, SoftHyphen }
|
44
|
+
end
|
45
|
+
|
46
|
+
def lowercase_pcdata string
|
47
|
+
if string.include? '<'
|
48
|
+
string.gsub(TagFilterRx) { $2 ? (lowercase_mb $2) : $1 }
|
49
|
+
else
|
50
|
+
lowercase_mb string
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def uppercase_pcdata string
|
55
|
+
if XMLMarkupRx.match? string
|
56
|
+
string.gsub(PCDATAFilterRx) { $2 ? (uppercase_mb $2) : $1 }
|
57
|
+
else
|
58
|
+
uppercase_mb string
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
if RUBY_VERSION >= '2.4'
|
63
|
+
def capitalize_mb string
|
64
|
+
string.capitalize
|
65
|
+
end
|
66
|
+
|
67
|
+
def lowercase_mb string
|
68
|
+
string.downcase
|
69
|
+
end
|
70
|
+
|
71
|
+
def uppercase_mb string
|
72
|
+
string.upcase
|
73
|
+
end
|
74
|
+
# NOTE Unicode library is 4x as fast as ActiveSupport::MultiByte::Chars
|
75
|
+
elsif defined? ::Unicode
|
76
|
+
def capitalize_mb string
|
77
|
+
string.ascii_only? ? string.capitalize : (::Unicode.capitalize string)
|
78
|
+
end
|
79
|
+
|
80
|
+
def lowercase_mb string
|
81
|
+
string.ascii_only? ? string.downcase : (::Unicode.downcase string)
|
82
|
+
end
|
83
|
+
|
84
|
+
def uppercase_mb string
|
85
|
+
string.ascii_only? ? string.upcase : (::Unicode.upcase string)
|
86
|
+
end
|
87
|
+
elsif defined? ::ActiveSupport::Multibyte
|
88
|
+
MultibyteChars = ::ActiveSupport::Multibyte::Chars
|
89
|
+
|
90
|
+
def capitalize_mb string
|
91
|
+
string.ascii_only? ? string.capitalize : (MultibyteChars.new string).capitalize.to_s
|
92
|
+
end
|
93
|
+
|
94
|
+
def lowercase_mb string
|
95
|
+
string.ascii_only? ? string.downcase : (MultibyteChars.new string).downcase.to_s
|
96
|
+
end
|
97
|
+
|
98
|
+
def uppercase_mb string
|
99
|
+
string.ascii_only? ? string.upcase : (MultibyteChars.new string).upcase.to_s
|
100
|
+
end
|
101
|
+
else
|
102
|
+
def capitalize_mb string
|
103
|
+
string.capitalize
|
104
|
+
end
|
105
|
+
|
106
|
+
def lowercase_mb string
|
107
|
+
string.downcase
|
108
|
+
end
|
109
|
+
|
110
|
+
def uppercase_mb string
|
111
|
+
string.upcase
|
112
|
+
end
|
113
|
+
end
|
50
114
|
end
|
51
115
|
end
|
52
|
-
|
53
|
-
def uppercase_pcdata string
|
54
|
-
if XMLMarkupRx.match? string
|
55
|
-
string.gsub(PCDATAFilterRx) { $2 ? (uppercase_mb $2) : $1 }
|
56
|
-
else
|
57
|
-
uppercase_mb string
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
if RUBY_VERSION >= '2.4'
|
62
|
-
def capitalize_mb string
|
63
|
-
string.capitalize
|
64
|
-
end
|
65
|
-
|
66
|
-
def lowercase_mb string
|
67
|
-
string.downcase
|
68
|
-
end
|
69
|
-
|
70
|
-
def uppercase_mb string
|
71
|
-
string.upcase
|
72
|
-
end
|
73
|
-
# NOTE Unicode library is 4x as fast as ActiveSupport::MultiByte::Chars
|
74
|
-
elsif defined? ::Unicode
|
75
|
-
def capitalize_mb string
|
76
|
-
string.ascii_only? ? string.capitalize : (::Unicode.capitalize string)
|
77
|
-
end
|
78
|
-
|
79
|
-
def lowercase_mb string
|
80
|
-
string.ascii_only? ? string.downcase : (::Unicode.downcase string)
|
81
|
-
end
|
82
|
-
|
83
|
-
def uppercase_mb string
|
84
|
-
string.ascii_only? ? string.upcase : (::Unicode.upcase string)
|
85
|
-
end
|
86
|
-
elsif defined? ::ActiveSupport::Multibyte
|
87
|
-
MultibyteChars = ::ActiveSupport::Multibyte::Chars
|
88
|
-
|
89
|
-
def capitalize_mb string
|
90
|
-
string.ascii_only? ? string.capitalize : (MultibyteChars.new string).capitalize.to_s
|
91
|
-
end
|
92
|
-
|
93
|
-
def lowercase_mb string
|
94
|
-
string.ascii_only? ? string.downcase : (MultibyteChars.new string).downcase.to_s
|
95
|
-
end
|
96
|
-
|
97
|
-
def uppercase_mb string
|
98
|
-
string.ascii_only? ? string.upcase : (MultibyteChars.new string).upcase.to_s
|
99
|
-
end
|
100
|
-
else
|
101
|
-
def capitalize_mb string
|
102
|
-
string.capitalize
|
103
|
-
end
|
104
|
-
|
105
|
-
def lowercase_mb string
|
106
|
-
string.downcase
|
107
|
-
end
|
108
|
-
|
109
|
-
def uppercase_mb string
|
110
|
-
string.upcase
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|
114
|
-
end
|
115
116
|
end
|