@@ -34,6 +34,7 @@ EUCJPDecoder s_euc_jp_decoder;
34
34
ISO2022JPDecoder s_iso_2022_jp_decoder;
35
35
ShiftJISDecoder s_shift_jis_decoder;
36
36
EUCKRDecoder s_euc_kr_decoder;
37
+ ReplacementDecoder s_replacement_decoder;
37
38
38
39
// clang-format off
39
40
// https://encoding.spec.whatwg.org/index-ibm866.txt
@@ -353,6 +354,8 @@ Optional<Decoder&> decoder_for(StringView a_encoding)
353
354
return s_mac_roman_decoder;
354
355
if (encoding.value ().equals_ignoring_ascii_case (" PDFDocEncoding" sv))
355
356
return s_pdf_doc_encoding_decoder;
357
+ if (encoding.value ().equals_ignoring_ascii_case (" replacement" sv))
358
+ return s_replacement_decoder;
356
359
if (encoding.value ().equals_ignoring_ascii_case (" shift_jis" sv))
357
360
return s_shift_jis_decoder;
358
361
if (encoding.value ().equals_ignoring_ascii_case (" windows-874" sv))
@@ -1777,4 +1780,18 @@ ErrorOr<void> EUCKRDecoder::process(StringView input, Function<ErrorOr<void>(u32
1777
1780
}
1778
1781
}
1779
1782
1783
+ // https://encoding.spec.whatwg.org/#replacement-decoder
1784
+ ErrorOr<void > ReplacementDecoder::process (StringView input, Function<ErrorOr<void >(u32 )> on_code_point)
1785
+ {
1786
+ // replacement’s decoder has an associated replacement error returned (initially false).
1787
+ // replacement’s decoder’s handler, given ioQueue and byte, runs these steps:
1788
+ // 1. If byte is end-of-queue, return finished.
1789
+ // 2. If replacement error returned is false, set replacement error returned to true and return error.
1790
+ // 3. Return finished.
1791
+
1792
+ if (!input.is_empty ())
1793
+ return on_code_point (replacement_code_point);
1794
+ return {};
1795
+ }
1796
+
1780
1797
}
0 commit comments