diff --git a/lib/rubrik/document/serialize_object.rb b/lib/rubrik/document/serialize_object.rb index 4d7a4aa..74e322c 100644 --- a/lib/rubrik/document/serialize_object.rb +++ b/lib/rubrik/document/serialize_object.rb @@ -15,7 +15,7 @@ def [](obj) serialized_objs = obj.flatten.map { |e| SerializeObject[e] } "<<#{serialized_objs.join(" ")}>>" when Symbol - "/#{obj}" + serialize_symbol(obj) when Array serialized_objs = obj.map { |e| SerializeObject[e] } "[#{serialized_objs.join(" ")}]" @@ -51,7 +51,7 @@ def [](obj) private - ESCAPE_MAP = { + STRING_ESCAPE_MAP = { "\n" => "\\\n", "\r" => "\\\r", "\t" => "\\\t", @@ -64,7 +64,26 @@ def [](obj) sig {params(string: String).returns(String)} def serialize_string(string) - "(#{string.gsub(/[\n\r\t\b\f\\()]/n, ESCAPE_MAP)})" + "(#{string.gsub(/[\n\r\t\b\f\\()]/n, STRING_ESCAPE_MAP)})" + end + + DELIMITERS = "()<>[]{}/%".bytes.freeze + REGULAR_CHARACTERS = + "!\"\#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~".bytes.freeze + + + NAME_ESCAPE_CHARACTERS = (0..255).to_a - REGULAR_CHARACTERS + DELIMITERS + "#".bytes + NAME_ESCAPE_CHARACTERS.freeze + + NAME_ESCAPE_MAP = NAME_ESCAPE_CHARACTERS.each_with_object({}) do |char, escape_map| + escape_map[char.chr] = "##{char.to_s(16).rjust(2, "0")}" + end.freeze + + NAME_ESCAPE_REGEX = /[#{Regexp.escape(NAME_ESCAPE_CHARACTERS.map(&:chr).join)}]/ + + sig {params(symbol: Symbol).returns(String)} + def serialize_symbol(symbol) + "/#{symbol.to_s.b.gsub(NAME_ESCAPE_REGEX, NAME_ESCAPE_MAP)}" end end end diff --git a/test/rubrik/document/serialize_object_test.rb b/test/rubrik/document/serialize_object_test.rb index e8bd523..5d93ec7 100644 --- a/test/rubrik/document/serialize_object_test.rb +++ b/test/rubrik/document/serialize_object_test.rb @@ -17,11 +17,23 @@ def test_hash_serialization end def test_symbol_serialization - # Act - result = SerializeObject[:Test] - - # Assert - assert_equal("/Test", result) + # Act + Assert + [ + ["/Name1", :"Name1"], + ["/ASomewhatLongerName", :"ASomewhatLongerName"], + ["/A;Name_With-Various***Characters?", :"A;Name_With-Various***Characters?"], + ["/1.2", :"1.2"], + ["/$$", :"$$"], + ["/@pattern", :"@pattern"], + ["/.notdef", :".notdef"], + ["/Lime#20Green", :"Lime Green"], + ["/paired#28#29parentheses", :"paired()parentheses"], + ["/The_Key_of_F#23_Minor", :"The_Key_of_F#_Minor"], + ["/AB", :"AB"], + ["/H#c3#b6#c3#9fgang", :"Hößgang"], + ].each do |(expected, subject)| + assert_equal(expected, SerializeObject[subject]) + end end def test_array_serialization diff --git a/test/support/inline_interactive_form.expected.pdf b/test/support/inline_interactive_form.expected.pdf index df68028..53e3cd5 100644 Binary files a/test/support/inline_interactive_form.expected.pdf and b/test/support/inline_interactive_form.expected.pdf differ diff --git a/test/support/inline_interactive_form.pdf b/test/support/inline_interactive_form.pdf index 1a5c082..52af3e7 100644 Binary files a/test/support/inline_interactive_form.pdf and b/test/support/inline_interactive_form.pdf differ