origami-docspring 2.2.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +18 -0
  3. data/examples/attachments/attachment.rb +7 -8
  4. data/examples/attachments/nested_document.rb +6 -5
  5. data/examples/encryption/encryption.rb +5 -4
  6. data/examples/events/events.rb +7 -6
  7. data/examples/flash/flash.rb +10 -9
  8. data/examples/forms/javascript.rb +14 -13
  9. data/examples/forms/xfa.rb +67 -66
  10. data/examples/javascript/hello_world.rb +6 -5
  11. data/examples/javascript/js_emulation.rb +26 -26
  12. data/examples/loop/goto.rb +12 -11
  13. data/examples/loop/named.rb +17 -16
  14. data/examples/signature/signature.rb +11 -11
  15. data/examples/uri/javascript.rb +25 -24
  16. data/examples/uri/open-uri.rb +5 -4
  17. data/examples/uri/submitform.rb +11 -10
  18. data/lib/origami/3d.rb +330 -334
  19. data/lib/origami/acroform.rb +267 -268
  20. data/lib/origami/actions.rb +266 -278
  21. data/lib/origami/annotations.rb +659 -670
  22. data/lib/origami/array.rb +192 -196
  23. data/lib/origami/boolean.rb +66 -70
  24. data/lib/origami/catalog.rb +360 -363
  25. data/lib/origami/collections.rb +132 -133
  26. data/lib/origami/compound.rb +125 -129
  27. data/lib/origami/destinations.rb +226 -237
  28. data/lib/origami/dictionary.rb +155 -154
  29. data/lib/origami/encryption.rb +967 -923
  30. data/lib/origami/extensions/fdf.rb +270 -275
  31. data/lib/origami/extensions/ppklite.rb +323 -328
  32. data/lib/origami/filespec.rb +170 -173
  33. data/lib/origami/filters/ascii.rb +162 -167
  34. data/lib/origami/filters/ccitt/tables.rb +248 -252
  35. data/lib/origami/filters/ccitt.rb +309 -312
  36. data/lib/origami/filters/crypt.rb +31 -34
  37. data/lib/origami/filters/dct.rb +47 -50
  38. data/lib/origami/filters/flate.rb +57 -60
  39. data/lib/origami/filters/jbig2.rb +50 -53
  40. data/lib/origami/filters/jpx.rb +40 -43
  41. data/lib/origami/filters/lzw.rb +151 -155
  42. data/lib/origami/filters/predictors.rb +250 -255
  43. data/lib/origami/filters/runlength.rb +111 -115
  44. data/lib/origami/filters.rb +319 -325
  45. data/lib/origami/font.rb +173 -177
  46. data/lib/origami/functions.rb +62 -66
  47. data/lib/origami/graphics/colors.rb +203 -208
  48. data/lib/origami/graphics/instruction.rb +79 -81
  49. data/lib/origami/graphics/path.rb +141 -144
  50. data/lib/origami/graphics/patterns.rb +156 -160
  51. data/lib/origami/graphics/render.rb +51 -47
  52. data/lib/origami/graphics/state.rb +144 -142
  53. data/lib/origami/graphics/text.rb +185 -188
  54. data/lib/origami/graphics/xobject.rb +818 -804
  55. data/lib/origami/graphics.rb +25 -26
  56. data/lib/origami/header.rb +63 -65
  57. data/lib/origami/javascript.rb +718 -651
  58. data/lib/origami/linearization.rb +284 -285
  59. data/lib/origami/metadata.rb +156 -135
  60. data/lib/origami/name.rb +98 -100
  61. data/lib/origami/null.rb +49 -51
  62. data/lib/origami/numeric.rb +133 -135
  63. data/lib/origami/obfuscation.rb +180 -182
  64. data/lib/origami/object.rb +634 -631
  65. data/lib/origami/optionalcontent.rb +147 -149
  66. data/lib/origami/outline.rb +46 -48
  67. data/lib/origami/outputintents.rb +76 -77
  68. data/lib/origami/page.rb +637 -596
  69. data/lib/origami/parser.rb +214 -221
  70. data/lib/origami/parsers/fdf.rb +44 -45
  71. data/lib/origami/parsers/pdf/lazy.rb +147 -154
  72. data/lib/origami/parsers/pdf/linear.rb +104 -109
  73. data/lib/origami/parsers/pdf.rb +109 -107
  74. data/lib/origami/parsers/ppklite.rb +44 -46
  75. data/lib/origami/pdf.rb +886 -896
  76. data/lib/origami/reference.rb +116 -120
  77. data/lib/origami/signature.rb +617 -625
  78. data/lib/origami/stream.rb +560 -558
  79. data/lib/origami/string.rb +366 -368
  80. data/lib/origami/template/patterns.rb +50 -52
  81. data/lib/origami/template/widgets.rb +111 -114
  82. data/lib/origami/trailer.rb +153 -157
  83. data/lib/origami/tree.rb +55 -57
  84. data/lib/origami/version.rb +19 -19
  85. data/lib/origami/webcapture.rb +87 -90
  86. data/lib/origami/xfa/config.rb +409 -414
  87. data/lib/origami/xfa/connectionset.rb +113 -117
  88. data/lib/origami/xfa/datasets.rb +38 -42
  89. data/lib/origami/xfa/localeset.rb +33 -37
  90. data/lib/origami/xfa/package.rb +49 -52
  91. data/lib/origami/xfa/pdf.rb +54 -59
  92. data/lib/origami/xfa/signature.rb +33 -37
  93. data/lib/origami/xfa/sourceset.rb +34 -38
  94. data/lib/origami/xfa/stylesheet.rb +35 -39
  95. data/lib/origami/xfa/template.rb +1630 -1634
  96. data/lib/origami/xfa/xdc.rb +33 -37
  97. data/lib/origami/xfa/xfa.rb +132 -123
  98. data/lib/origami/xfa/xfdf.rb +34 -38
  99. data/lib/origami/xfa/xmpmeta.rb +34 -38
  100. data/lib/origami/xfa.rb +50 -53
  101. data/lib/origami/xreftable.rb +462 -462
  102. data/lib/origami.rb +37 -38
  103. data/test/test_actions.rb +22 -20
  104. data/test/test_annotations.rb +54 -52
  105. data/test/test_forms.rb +23 -21
  106. data/test/test_native_types.rb +82 -78
  107. data/test/test_object_tree.rb +25 -24
  108. data/test/test_pages.rb +43 -41
  109. data/test/test_pdf.rb +2 -0
  110. data/test/test_pdf_attachment.rb +23 -21
  111. data/test/test_pdf_create.rb +16 -15
  112. data/test/test_pdf_encrypt.rb +69 -66
  113. data/test/test_pdf_parse.rb +131 -129
  114. data/test/test_pdf_parse_lazy.rb +53 -53
  115. data/test/test_pdf_sign.rb +67 -67
  116. data/test/test_streams.rb +145 -143
  117. data/test/test_xrefs.rb +46 -45
  118. metadata +64 -8
@@ -1,92 +1,113 @@
1
- =begin
2
-
3
- This file is part of Origami, PDF manipulation framework for Ruby
4
- Copyright (C) 2016 Guillaume Delugré.
5
-
6
- Origami is free software: you can redistribute it and/or modify
7
- it under the terms of the GNU Lesser General Public License as published by
8
- the Free Software Foundation, either version 3 of the License, or
9
- (at your option) any later version.
10
-
11
- Origami is distributed in the hope that it will be useful,
12
- but WITHOUT ANY WARRANTY; without even the implied warranty of
13
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
- GNU Lesser General Public License for more details.
15
-
16
- You should have received a copy of the GNU Lesser General Public License
17
- along with Origami. If not, see <http://www.gnu.org/licenses/>.
18
-
19
- =end
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # This file is part of Origami, PDF manipulation framework for Ruby
5
+ # Copyright (C) 2016 Guillaume Delugré.
6
+ #
7
+ # Origami is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Lesser General Public License as published by
9
+ # the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # Origami is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Lesser General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Lesser General Public License
18
+ # along with Origami. If not, see <http://www.gnu.org/licenses/>.
19
+ #
20
20
 
21
21
  require 'rexml/document'
22
22
 
23
23
  module Origami
24
+ class PDF
25
+ #
26
+ # Returns true if the document has a document information dictionary.
27
+ #
28
+ def document_info?
29
+ trailer_key? :Info
30
+ end
24
31
 
25
- class PDF
26
- #
27
- # Returns true if the document has a document information dictionary.
28
- #
29
- def document_info?
30
- trailer_key? :Info
31
- end
32
+ #
33
+ # Returns the document information dictionary if present.
34
+ #
35
+ def document_info
36
+ trailer_key :Info
37
+ end
32
38
 
33
- #
34
- # Returns the document information dictionary if present.
35
- #
36
- def document_info
37
- trailer_key :Info
38
- end
39
+ def title
40
+ get_document_info_field(:Title)
41
+ end
39
42
 
40
- def title; get_document_info_field(:Title) end
41
- def author; get_document_info_field(:Author) end
42
- def subject; get_document_info_field(:Subject) end
43
- def keywords; get_document_info_field(:Keywords) end
44
- def creator; get_document_info_field(:Creator) end
45
- def producer; get_document_info_field(:Producer) end
46
- def creation_date; get_document_info_field(:CreationDate) end
47
- def mod_date; get_document_info_field(:ModDate) end
48
-
49
- #
50
- # Returns true if the document has a catalog metadata stream.
51
- #
52
- def metadata?
53
- self.Catalog.Metadata.is_a?(Stream)
54
- end
43
+ def author
44
+ get_document_info_field(:Author)
45
+ end
46
+
47
+ def subject
48
+ get_document_info_field(:Subject)
49
+ end
50
+
51
+ def keywords
52
+ get_document_info_field(:Keywords)
53
+ end
55
54
 
56
- #
57
- # Returns a Hash of the information found in the metadata stream
58
- #
59
- def metadata
60
- metadata_stm = self.Catalog.Metadata
55
+ def creator
56
+ get_document_info_field(:Creator)
57
+ end
61
58
 
62
- if metadata_stm.is_a?(Stream)
63
- doc = REXML::Document.new(metadata_stm.data)
64
- info = {}
59
+ def producer
60
+ get_document_info_field(:Producer)
61
+ end
65
62
 
66
- doc.elements.each('*/*/rdf:Description') do |description|
63
+ def creation_date
64
+ get_document_info_field(:CreationDate)
65
+ end
67
66
 
68
- description.attributes.each_attribute do |attr|
69
- case attr.prefix
70
- when 'pdf','xap'
71
- info[attr.name] = attr.value
72
- end
73
- end
67
+ def mod_date
68
+ get_document_info_field(:ModDate)
69
+ end
74
70
 
75
- description.elements.each('*') do |element|
76
- value = (element.elements['.//rdf:li'] || element).text
77
- info[element.name] = value.to_s
78
- end
79
- end
71
+ #
72
+ # Returns true if the document has a catalog metadata stream.
73
+ #
74
+ def metadata?
75
+ self.Catalog.Metadata.is_a?(Stream)
76
+ end
80
77
 
81
- info
78
+ #
79
+ # Returns a Hash of the information found in the metadata stream
80
+ #
81
+ def metadata
82
+ metadata_stm = self.Catalog.Metadata
83
+
84
+ if metadata_stm.is_a?(Stream)
85
+ doc = REXML::Document.new(metadata_stm.data)
86
+ info = {}
87
+
88
+ doc.elements.each('*/*/rdf:Description') do |description|
89
+ description.attributes.each_attribute do |attr|
90
+ case attr.prefix
91
+ when 'pdf', 'xap'
92
+ info[attr.name] = attr.value
82
93
  end
94
+ end
95
+
96
+ description.elements.each('*') do |element|
97
+ value = (element.elements['.//rdf:li'] || element).text
98
+ info[element.name] = value.to_s
99
+ end
83
100
  end
84
101
 
85
- #
86
- # Modifies or creates a metadata stream.
87
- #
88
- def create_metadata(info = {})
89
- skeleton = <<-XMP
102
+ info
103
+ end
104
+ end
105
+
106
+ #
107
+ # Modifies or creates a metadata stream.
108
+ #
109
+ def create_metadata(info = {})
110
+ skeleton = <<-XMP
90
111
  <?packet begin="\xef\xbb\xbf" id="W5M0MpCehiHzreSzNTczkc9d"?>
91
112
  <x:xmpmeta xmlns:x="adobe:ns:meta/">
92
113
  <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
@@ -95,78 +116,78 @@ module Origami
95
116
  </rdf:RDF>
96
117
  </x:xmpmeta>
97
118
  <?xpacket end="w"?>
98
- XMP
99
-
100
- xml =
101
- if self.Catalog.Metadata.is_a?(Stream)
102
- self.Catalog.Metadata.data
103
- else
104
- skeleton
105
- end
119
+ XMP
106
120
 
107
- doc = REXML::Document.new(xml)
108
- desc = doc.elements['*/*/rdf:Description']
109
-
110
- info.each do |name, value|
111
- elt = REXML::Element.new "pdf:#{name}"
112
- elt.text = value
113
-
114
- desc.elements << elt
115
- end
121
+ xml =
122
+ if self.Catalog.Metadata.is_a?(Stream)
123
+ self.Catalog.Metadata.data
124
+ else
125
+ skeleton
126
+ end
116
127
 
117
- xml = ""; doc.write(xml, 4)
128
+ doc = REXML::Document.new(xml)
129
+ desc = doc.elements['*/*/rdf:Description']
118
130
 
119
- if self.Catalog.Metadata.is_a?(Stream)
120
- self.Catalog.Metadata.data = xml
121
- else
122
- self.Catalog.Metadata = Stream.new(xml)
123
- end
131
+ info.each do |name, value|
132
+ elt = REXML::Element.new "pdf:#{name}"
133
+ elt.text = value
124
134
 
125
- self.Catalog.Metadata
126
- end
135
+ desc.elements << elt
136
+ end
127
137
 
128
- private
138
+ xml = ""
139
+ doc.write(xml, 4)
129
140
 
130
- def get_document_info_field(field) #:nodoc:
131
- if self.document_info?
132
- doc_info = self.document_info
141
+ if self.Catalog.Metadata.is_a?(Stream)
142
+ self.Catalog.Metadata.data = xml
143
+ else
144
+ self.Catalog.Metadata = Stream.new(xml)
145
+ end
133
146
 
134
- if doc_info.key?(field)
135
- case obj = doc_info[field].solve
136
- when String then obj.value
137
- when Stream then obj.data
138
- end
139
- end
140
- end
141
- end
147
+ self.Catalog.Metadata
142
148
  end
143
149
 
144
- #
145
- # Class representing an information Dictionary, containing title, author, date of creation and the like.
146
- #
147
- class Metadata < Dictionary
148
- include StandardObject
149
-
150
- field :Title, :Type => String, :Version => "1.1"
151
- field :Author, :Type => String
152
- field :Subject, :Type => String, :Version => "1.1"
153
- field :Keywords, :Type => String, :Version => "1.1"
154
- field :Creator, :Type => String
155
- field :Producer, :Type => String
156
- field :CreationDate, :Type => String
157
- field :ModDate, :Type => String, :Version => "1.1"
158
- field :Trapped, :Type => Name, :Default => :Unknown, :Version => "1.3"
159
- end
150
+ private
160
151
 
161
- #
162
- # Class representing a metadata Stream.
163
- # This stream can contain the same information as the Metadata dictionary, but is storing in XML data.
164
- #
165
- class MetadataStream < Stream
166
- include StandardObject
152
+ def get_document_info_field(field) # :nodoc:
153
+ if document_info?
154
+ doc_info = document_info
167
155
 
168
- field :Type, :Type => Name, :Default => :Metadata, :Required => true
169
- field :Subtype, :Type => Name, :Default =>:XML, :Required => true
156
+ if doc_info.key?(field)
157
+ case obj = doc_info[field].solve
158
+ when String then obj.value
159
+ when Stream then obj.data
160
+ end
161
+ end
162
+ end
170
163
  end
171
-
164
+ end
165
+
166
+ #
167
+ # Class representing an information Dictionary, containing title, author, date of creation and the like.
168
+ #
169
+ class Metadata < Dictionary
170
+ include StandardObject
171
+
172
+ field :Title, Type: String, Version: "1.1"
173
+ field :Author, Type: String
174
+ field :Subject, Type: String, Version: "1.1"
175
+ field :Keywords, Type: String, Version: "1.1"
176
+ field :Creator, Type: String
177
+ field :Producer, Type: String
178
+ field :CreationDate, Type: String
179
+ field :ModDate, Type: String, Version: "1.1"
180
+ field :Trapped, Type: Name, Default: :Unknown, Version: "1.3"
181
+ end
182
+
183
+ #
184
+ # Class representing a metadata Stream.
185
+ # This stream can contain the same information as the Metadata dictionary, but is storing in XML data.
186
+ #
187
+ class MetadataStream < Stream
188
+ include StandardObject
189
+
190
+ field :Type, Type: Name, Default: :Metadata, Required: true
191
+ field :Subtype, Type: Name, Default: :XML, Required: true
192
+ end
172
193
  end
data/lib/origami/name.rb CHANGED
@@ -1,135 +1,133 @@
1
- =begin
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # This file is part of Origami, PDF manipulation framework for Ruby
5
+ # Copyright (C) 2016 Guillaume Delugré.
6
+ #
7
+ # Origami is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Lesser General Public License as published by
9
+ # the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # Origami is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Lesser General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Lesser General Public License
18
+ # along with Origami. If not, see <http://www.gnu.org/licenses/>.
19
+ #
2
20
 
3
- This file is part of Origami, PDF manipulation framework for Ruby
4
- Copyright (C) 2016 Guillaume Delugré.
5
-
6
- Origami is free software: you can redistribute it and/or modify
7
- it under the terms of the GNU Lesser General Public License as published by
8
- the Free Software Foundation, either version 3 of the License, or
9
- (at your option) any later version.
10
-
11
- Origami is distributed in the hope that it will be useful,
12
- but WITHOUT ANY WARRANTY; without even the implied warranty of
13
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
- GNU Lesser General Public License for more details.
15
-
16
- You should have received a copy of the GNU Lesser General Public License
17
- along with Origami. If not, see <http://www.gnu.org/licenses/>.
21
+ module Origami
22
+ REGULARCHARS = "([^ \\t\\r\\n\\0\\[\\]<>()%\\/]|#[a-fA-F0-9][a-fA-F0-9])*" # :nodoc:
18
23
 
19
- =end
24
+ class InvalidNameObjectError < InvalidObjectError # :nodoc:
25
+ end
20
26
 
21
- module Origami
27
+ #
28
+ # Class representing a Name Object.
29
+ # Name objects are strings which identify some PDF file inner structures.
30
+ #
31
+ class Name
32
+ include Origami::Object
33
+ include Comparable
22
34
 
23
- REGULARCHARS = "([^ \\t\\r\\n\\0\\[\\]<>()%\\/]|#[a-fA-F0-9][a-fA-F0-9])*" #:nodoc:
35
+ TOKENS = %w[/] # :nodoc:
24
36
 
25
- class InvalidNameObjectError < InvalidObjectError #:nodoc:
26
- end
37
+ @@regexp = Regexp.new(WHITESPACES + TOKENS.first + "(?<name>#{REGULARCHARS})" + WHITESPACES) # :nodoc
27
38
 
28
39
  #
29
- # Class representing a Name Object.
30
- # Name objects are strings which identify some PDF file inner structures.
40
+ # Creates a new Name.
41
+ # _name_:: A symbol representing the new Name value.
31
42
  #
32
- class Name
33
- include Origami::Object
34
- include Comparable
35
-
36
- TOKENS = %w{ / } #:nodoc:
37
-
38
- @@regexp = Regexp.new(WHITESPACES + TOKENS.first + "(?<name>#{REGULARCHARS})" + WHITESPACES) #:nodoc
43
+ def initialize(name = "")
44
+ unless name.is_a?(Symbol) || name.is_a?(::String)
45
+ raise TypeError, "Expected type Symbol or String, received #{name.class}."
46
+ end
39
47
 
40
- #
41
- # Creates a new Name.
42
- # _name_:: A symbol representing the new Name value.
43
- #
44
- def initialize(name = "")
45
- unless name.is_a?(Symbol) or name.is_a?(::String)
46
- raise TypeError, "Expected type Symbol or String, received #{name.class}."
47
- end
48
+ @value = name.to_s
48
49
 
49
- @value = name.to_s
50
-
51
- super()
52
- end
53
-
54
- def value
55
- @value.to_sym
56
- end
57
- alias to_sym value
58
-
59
- def <=>(name)
60
- return unless name.is_a?(Name)
50
+ super()
51
+ end
61
52
 
62
- self.value <=> name.value
63
- end
53
+ def value
54
+ @value.to_sym
55
+ end
56
+ alias_method :to_sym, :value
64
57
 
65
- def ==(object) #:nodoc:
66
- self.eql?(object) or @value.to_sym == object
67
- end
58
+ def <=>(other)
59
+ return unless other.is_a?(Name)
68
60
 
69
- def eql?(object) #:nodoc:
70
- object.is_a?(Name) and self.value.eql?(object.value)
71
- end
61
+ value <=> other.value
62
+ end
72
63
 
73
- def hash #:nodoc:
74
- @value.hash
75
- end
64
+ def ==(other) # :nodoc:
65
+ eql?(other) or @value.to_sym == other
66
+ end
76
67
 
77
- def to_s(eol: $/) #:nodoc:
78
- super(TOKENS.first + Name.expand(@value), eol: eol)
79
- end
68
+ def eql?(other) # :nodoc:
69
+ other.is_a?(Name) and value.eql?(other.value)
70
+ end
80
71
 
81
- def self.parse(stream, _parser = nil) #:nodoc:
82
- scanner = Parser.init_scanner(stream)
83
- offset = scanner.pos
72
+ def hash # :nodoc:
73
+ @value.hash
74
+ end
84
75
 
85
- name =
86
- if scanner.scan(@@regexp).nil?
87
- raise InvalidNameObjectError, "Bad name format"
88
- else
89
- value = scanner['name']
76
+ def to_s(eol: $/) # :nodoc:
77
+ super(TOKENS.first + Name.expand(@value), eol: eol)
78
+ end
90
79
 
91
- Name.new(value.include?('#') ? contract(value) : value)
92
- end
80
+ def self.parse(stream, _parser = nil) # :nodoc:
81
+ scanner = Parser.init_scanner(stream)
82
+ offset = scanner.pos
93
83
 
94
- name.file_offset = offset
84
+ name =
85
+ if scanner.scan(@@regexp).nil?
86
+ raise InvalidNameObjectError, "Bad name format"
87
+ else
88
+ value = scanner['name']
95
89
 
96
- name
90
+ Name.new(value.include?('#') ? contract(value) : value)
97
91
  end
98
92
 
99
- def self.contract(name) #:nodoc:
100
- i = 0
101
- name = name.dup
93
+ name.file_offset = offset
102
94
 
103
- while i < name.length
104
- if name[i] == "#"
105
- digits = name[i+1, 2]
95
+ name
96
+ end
106
97
 
107
- unless digits =~ /^[A-Za-z0-9]{2}$/
108
- raise InvalidNameObjectError, "Irregular use of # token"
109
- end
98
+ def self.contract(name) # :nodoc:
99
+ i = 0
100
+ name = name.dup
110
101
 
111
- char = digits.hex.chr
102
+ while i < name.length
103
+ if name[i] == "#"
104
+ digits = name[i + 1, 2]
112
105
 
113
- if char == "\0"
114
- raise InvalidNameObjectError, "Null byte forbidden inside name definition"
115
- end
106
+ unless digits =~ /^[A-Za-z0-9]{2}$/
107
+ raise InvalidNameObjectError, "Irregular use of # token"
108
+ end
116
109
 
117
- name[i, 3] = char
118
- end
110
+ char = digits.hex.chr
119
111
 
120
- i = i + 1
121
- end
112
+ if char == "\0"
113
+ raise InvalidNameObjectError, "Null byte forbidden inside name definition"
114
+ end
122
115
 
123
- name
116
+ name[i, 3] = char
124
117
  end
125
118
 
126
- def self.expand(name) #:nodoc:
127
- forbiddenchars = /[ #\t\r\n\0\[\]<>()%\/]/
119
+ i += 1
120
+ end
128
121
 
129
- name.gsub(forbiddenchars) do |c|
130
- "#" + c.ord.to_s(16).rjust(2,"0")
131
- end
132
- end
122
+ name
133
123
  end
134
124
 
125
+ def self.expand(name) # :nodoc:
126
+ forbiddenchars = /[ #\t\r\n\0\[\]<>()%\/]/
127
+
128
+ name.gsub(forbiddenchars) do |c|
129
+ "#" + c.ord.to_s(16).rjust(2, "0")
130
+ end
131
+ end
132
+ end
135
133
  end
data/lib/origami/null.rb CHANGED
@@ -1,65 +1,63 @@
1
- =begin
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # This file is part of Origami, PDF manipulation framework for Ruby
5
+ # Copyright (C) 2016 Guillaume Delugré.
6
+ #
7
+ # Origami is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Lesser General Public License as published by
9
+ # the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # Origami is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Lesser General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Lesser General Public License
18
+ # along with Origami. If not, see <http://www.gnu.org/licenses/>.
19
+ #
2
20
 
3
- This file is part of Origami, PDF manipulation framework for Ruby
4
- Copyright (C) 2016 Guillaume Delugré.
21
+ module Origami
22
+ class InvalidNullObjectError < InvalidObjectError # :nodoc:
23
+ end
24
+
25
+ #
26
+ # Class representing Null Object.
27
+ #
28
+ class Null
29
+ include Origami::Object
5
30
 
6
- Origami is free software: you can redistribute it and/or modify
7
- it under the terms of the GNU Lesser General Public License as published by
8
- the Free Software Foundation, either version 3 of the License, or
9
- (at your option) any later version.
31
+ TOKENS = %w[null] # :nodoc:
32
+ @@regexp = Regexp.new(WHITESPACES + TOKENS.first)
10
33
 
11
- Origami is distributed in the hope that it will be useful,
12
- but WITHOUT ANY WARRANTY; without even the implied warranty of
13
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
- GNU Lesser General Public License for more details.
34
+ def initialize
35
+ super
36
+ end
15
37
 
16
- You should have received a copy of the GNU Lesser General Public License
17
- along with Origami. If not, see <http://www.gnu.org/licenses/>.
38
+ def self.parse(stream, _parser = nil) # :nodoc:
39
+ scanner = Parser.init_scanner(stream)
40
+ offset = scanner.pos
18
41
 
19
- =end
42
+ if scanner.skip(@@regexp).nil?
43
+ raise InvalidNullObjectError
44
+ end
20
45
 
21
- module Origami
46
+ null = Null.new
47
+ null.file_offset = offset
22
48
 
23
- class InvalidNullObjectError < InvalidObjectError #:nodoc:
49
+ null
24
50
  end
25
51
 
26
52
  #
27
- # Class representing Null Object.
53
+ # Returns *nil*.
28
54
  #
29
- class Null
30
- include Origami::Object
31
-
32
- TOKENS = %w{ null } #:nodoc:
33
- @@regexp = Regexp.new(WHITESPACES + TOKENS.first)
34
-
35
- def initialize
36
- super
37
- end
38
-
39
- def self.parse(stream, _parser = nil) #:nodoc:
40
- scanner = Parser.init_scanner(stream)
41
- offset = scanner.pos
42
-
43
- if scanner.skip(@@regexp).nil?
44
- raise InvalidNullObjectError
45
- end
46
-
47
- null = Null.new
48
- null.file_offset = offset
49
-
50
- null
51
- end
52
-
53
- #
54
- # Returns *nil*.
55
- #
56
- def value
57
- nil
58
- end
59
-
60
- def to_s(eol: $/) #:nodoc:
61
- super(TOKENS.first, eol: eol)
62
- end
55
+ def value
56
+ nil
63
57
  end
64
58
 
59
+ def to_s(eol: $/) # :nodoc:
60
+ super(TOKENS.first, eol: eol)
61
+ end
62
+ end
65
63
  end