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