rubrik 1.0.1 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rubrik/document/serialize_object.rb +39 -2
- data/lib/rubrik/document.rb +26 -3
- data/lib/rubrik/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1092e4bfdff7f05272eab8cf226a09b54737f368c24e883370002a399036ce4a
|
4
|
+
data.tar.gz: 818072d3ea9003599a9ec5fb49af2df99f3f43045e9aa6a81a1e62e8f2c11fd3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 173091b0ab44b398a10260e267de6ff92fe8083d2668dabe86e79bdb93547151ad9b73e08296c955e3e604ebba4b1f9f74fc44ae91ef661839883cd96f71fe9d
|
7
|
+
data.tar.gz: 60a0c1647190a473703ac1ae1cf1e5d407bc59e4f599b1de6d3111c3dd7105fa8077ec7955fed5df1c5c088dc9a515e7b5b3bd1987a0d42dc2835f5ca8585313
|
@@ -15,14 +15,14 @@ module Rubrik
|
|
15
15
|
serialized_objs = obj.flatten.map { |e| SerializeObject[e] }
|
16
16
|
"<<#{serialized_objs.join(" ")}>>"
|
17
17
|
when Symbol
|
18
|
-
|
18
|
+
serialize_symbol(obj)
|
19
19
|
when Array
|
20
20
|
serialized_objs = obj.map { |e| SerializeObject[e] }
|
21
21
|
"[#{serialized_objs.join(" ")}]"
|
22
22
|
when PDF::Reader::Reference
|
23
23
|
"#{obj.id} #{obj.gen} R"
|
24
24
|
when String
|
25
|
-
|
25
|
+
serialize_string(obj)
|
26
26
|
when TrueClass
|
27
27
|
"true"
|
28
28
|
when FalseClass
|
@@ -48,6 +48,43 @@ module Rubrik
|
|
48
48
|
end
|
49
49
|
|
50
50
|
alias call []
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
STRING_ESCAPE_MAP = {
|
55
|
+
"\n" => "\\\n",
|
56
|
+
"\r" => "\\\r",
|
57
|
+
"\t" => "\\\t",
|
58
|
+
"\b" => "\\\b",
|
59
|
+
"\f" => "\\\f",
|
60
|
+
"\\" => "\\\\",
|
61
|
+
"(" => "\\(",
|
62
|
+
")" => "\\)"
|
63
|
+
}.freeze
|
64
|
+
|
65
|
+
sig {params(string: String).returns(String)}
|
66
|
+
def serialize_string(string)
|
67
|
+
"(#{string.gsub(/[\n\r\t\b\f\\()]/n, STRING_ESCAPE_MAP)})"
|
68
|
+
end
|
69
|
+
|
70
|
+
DELIMITERS = "()<>[]{}/%".bytes.freeze
|
71
|
+
REGULAR_CHARACTERS =
|
72
|
+
"!\"\#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~".bytes.freeze
|
73
|
+
|
74
|
+
|
75
|
+
NAME_ESCAPE_CHARACTERS = (0..255).to_a - REGULAR_CHARACTERS + DELIMITERS + "#".bytes
|
76
|
+
NAME_ESCAPE_CHARACTERS.freeze
|
77
|
+
|
78
|
+
NAME_ESCAPE_MAP = NAME_ESCAPE_CHARACTERS.each_with_object({}) do |char, escape_map|
|
79
|
+
escape_map[char.chr] = "##{char.to_s(16).rjust(2, "0")}"
|
80
|
+
end.freeze
|
81
|
+
|
82
|
+
NAME_ESCAPE_REGEX = /[#{Regexp.escape(NAME_ESCAPE_CHARACTERS.map(&:chr).join)}]/
|
83
|
+
|
84
|
+
sig {params(symbol: Symbol).returns(String)}
|
85
|
+
def serialize_symbol(symbol)
|
86
|
+
"/#{symbol.to_s.b.gsub(NAME_ESCAPE_REGEX, NAME_ESCAPE_MAP)}"
|
87
|
+
end
|
51
88
|
end
|
52
89
|
end
|
53
90
|
end
|
data/lib/rubrik/document.rb
CHANGED
@@ -91,7 +91,15 @@ module Rubrik
|
|
91
91
|
modified_objects << {id: first_page_reference, value: new_first_page}
|
92
92
|
end
|
93
93
|
|
94
|
-
|
94
|
+
fields_entry = interactive_form[:Fields]
|
95
|
+
if fields_entry.is_a?(PDF::Reader::Reference)
|
96
|
+
new_fields_array = objects.fetch(fields_entry).dup
|
97
|
+
new_fields_array << signature_field_id
|
98
|
+
|
99
|
+
modified_objects << {id: fields_entry, value: new_fields_array}
|
100
|
+
else
|
101
|
+
(interactive_form[:Fields] ||= []) << signature_field_id
|
102
|
+
end
|
95
103
|
|
96
104
|
signature_value_id
|
97
105
|
end
|
@@ -118,11 +126,22 @@ module Rubrik
|
|
118
126
|
root_ref = objects.trailer[:Root]
|
119
127
|
root = T.let(objects.fetch(root_ref), T::Hash[Symbol, T.untyped])
|
120
128
|
|
121
|
-
|
129
|
+
interactive_form_value = root[:AcroForm]
|
130
|
+
case interactive_form_value
|
131
|
+
when PDF::Reader::Reference
|
122
132
|
form_id = root[:AcroForm]
|
123
133
|
|
124
134
|
modified_objects << {id: form_id, value: objects.fetch(form_id).dup}
|
125
|
-
|
135
|
+
when Hash
|
136
|
+
interactive_form_id = assign_new_object_id!
|
137
|
+
|
138
|
+
modified_objects << {id: interactive_form_id, value: interactive_form_value.dup}
|
139
|
+
|
140
|
+
new_root = root.dup
|
141
|
+
new_root[:AcroForm] = interactive_form_id
|
142
|
+
|
143
|
+
modified_objects << {id: root_ref, value: new_root}
|
144
|
+
when NilClass
|
126
145
|
interactive_form_id = assign_new_object_id!
|
127
146
|
modified_objects << {id: interactive_form_id, value: {Fields: []}}
|
128
147
|
|
@@ -131,6 +150,10 @@ module Rubrik
|
|
131
150
|
updated_root[:AcroForm] = interactive_form_id
|
132
151
|
|
133
152
|
modified_objects << {id: root_ref, value: updated_root}
|
153
|
+
else
|
154
|
+
raise Error.new(
|
155
|
+
"Expected dictionary, reference or nil but got " \
|
156
|
+
"#{interactive_form_value.class} on AcroForm entry.")
|
134
157
|
end
|
135
158
|
|
136
159
|
interactive_form[:SigFlags] = 3 # dont modify, append only
|
data/lib/rubrik/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubrik
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tomás Coêlho
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-12-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pdf-reader
|