From 5597323fbfba14845cfc565f37599bd5b3a86ae3 Mon Sep 17 00:00:00 2001 From: iska Date: Sun, 12 Oct 2014 18:55:24 +0200 Subject: [PATCH] Add a Numeric Entity Replacement table to replace the switch-statement for windows1525 trick --- HTMLKit/HTMLTokenizerCharacters.h | 76 +++++++++++++++++++------------ 1 file changed, 46 insertions(+), 30 deletions(-) diff --git a/HTMLKit/HTMLTokenizerCharacters.h b/HTMLKit/HTMLTokenizerCharacters.h index 5b5911b..6e7c574 100644 --- a/HTMLKit/HTMLTokenizerCharacters.h +++ b/HTMLKit/HTMLTokenizerCharacters.h @@ -42,6 +42,46 @@ CHARACTERS #undef CHAR +#define NUMERIC_REPLACEMENT_CHARACTERS \ + CHAR( 0x0080, 0x20AC /* EURO SIGN */ ) \ + CHAR( 0x0081, 0x0000 /* NO REPLACEMENT */ ) \ + CHAR( 0x0082, 0x201A /* SINGLE LOW-9 QUOTATION MARK */ ) \ + CHAR( 0x0083, 0x0192 /* LATIN SMALL LETTER F WITH HOOK */ ) \ + CHAR( 0x0084, 0x201E /* DOUBLE LOW-9 QUOTATION MARK */ ) \ + CHAR( 0x0085, 0x2026 /* HORIZONTAL ELLIPSIS */ ) \ + CHAR( 0x0086, 0x2020 /* DAGGER */ ) \ + CHAR( 0x0087, 0x2021 /* DOUBLE DAGGER */ ) \ + CHAR( 0x0088, 0x02C6 /* MODIFIER LETTER CIRCUMFLEX ACCENT */ ) \ + CHAR( 0x0089, 0x2030 /* PER MILLE SIGN */ ) \ + CHAR( 0x008A, 0x0160 /* LATIN CAPITAL LETTER S WITH CARON */ ) \ + CHAR( 0x008B, 0x2039 /* SINGLE LEFT-POINTING ANGLE QUOTATION MARK */ ) \ + CHAR( 0x008C, 0x0152 /* LATIN CAPITAL LIGATURE OE */ ) \ + CHAR( 0x008D, 0x0000 /* NO REPLACEMENT */ ) \ + CHAR( 0x008E, 0x017D /* LATIN CAPITAL LETTER Z WITH CARON */ ) \ + CHAR( 0x008F, 0x0000 /* NO REPLACEMENT */ ) \ + CHAR( 0x0090, 0x0000 /* NO REPLACEMENT */ ) \ + CHAR( 0x0091, 0x2018 /* LEFT SINGLE QUOTATION MARK */ ) \ + CHAR( 0x0092, 0x2019 /* RIGHT SINGLE QUOTATION MARK */ ) \ + CHAR( 0x0093, 0x201C /* LEFT DOUBLE QUOTATION MARK */ ) \ + CHAR( 0x0094, 0x201D /* RIGHT DOUBLE QUOTATION MARK */ ) \ + CHAR( 0x0095, 0x2022 /* BULLET */ ) \ + CHAR( 0x0096, 0x2013 /* EN DASH */ ) \ + CHAR( 0x0097, 0x2014 /* EM DASH */ ) \ + CHAR( 0x0098, 0x02DC /* SMALL TILDE */ ) \ + CHAR( 0x0099, 0x2122 /* TRADE MARK SIGN */ ) \ + CHAR( 0x009A, 0x0161 /* LATIN SMALL LETTER S WITH CARON */ ) \ + CHAR( 0x009B, 0x203A /* SINGLE RIGHT-POINTING ANGLE QUOTATION MARK */ ) \ + CHAR( 0x009C, 0x0153 /* LATIN SMALL LIGATURE OE */ ) \ + CHAR( 0x009D, 0x0000 /* NO REPLACEMENT */ ) \ + CHAR( 0x009E, 0x017E /* LATIN SMALL LETTER Z WITH CARON */ ) \ + CHAR( 0x009F, 0x0178 /* LATIN CAPITAL LETTER Y WITH DIAERESIS */ ) + +static unichar NumericReplacementTable[] = { +#define CHAR( character, replacement ) replacement, +NUMERIC_REPLACEMENT_CHARACTERS +#undef CHAR +}; + NS_INLINE BOOL isControlOrUndefinedCharacter(UTF32Char character) { return ((character >= 0x0001 && character <= 0x0008) || @@ -105,37 +145,13 @@ NS_INLINE BOOL isValidNumericRange(UTF32Char character) NS_INLINE unichar NumericReplacementCharacter(UTF32Char character) { - switch(character) { - case 0x00: return 0xFFFD; /* REPLACEMENT CHARACTER */ - case 0x80: return 0x20AC; /* EURO SIGN */ - case 0x82: return 0x201A; /* SINGLE LOW-9 QUOTATION MARK */ - case 0x83: return 0x0192; /* LATIN SMALL LETTER F WITH HOOK */ - case 0x84: return 0x201E; /* DOUBLE LOW-9 QUOTATION MARK */ - case 0x85: return 0x2026; /* HORIZONTAL ELLIPSIS */ - case 0x86: return 0x2020; /* DAGGER */ - case 0x87: return 0x2021; /* DOUBLE DAGGER */ - case 0x88: return 0x02C6; /* MODIFIER LETTER CIRCUMFLEX ACCENT */ - case 0x89: return 0x2030; /* PER MILLE SIGN */ - case 0x8A: return 0x0160; /* LATIN CAPITAL LETTER S WITH CARON */ - case 0x8B: return 0x2039; /* SINGLE LEFT-POINTING ANGLE QUOTATION MARK */ - case 0x8C: return 0x0152; /* LATIN CAPITAL LIGATURE OE */ - case 0x8E: return 0x017D; /* LATIN CAPITAL LETTER Z WITH CARON */ - case 0x91: return 0x2018; /* LEFT SINGLE QUOTATION MARK */ - case 0x92: return 0x2019; /* RIGHT SINGLE QUOTATION MARK */ - case 0x93: return 0x201C; /* LEFT DOUBLE QUOTATION MARK */ - case 0x94: return 0x201D; /* RIGHT DOUBLE QUOTATION MARK */ - case 0x95: return 0x2022; /* BULLET */ - case 0x96: return 0x2013; /* EN DASH */ - case 0x97: return 0x2014; /* EM DASH */ - case 0x98: return 0x02DC; /* SMALL TILDE */ - case 0x99: return 0x2122; /* TRADE MARK SIGN */ - case 0x9A: return 0x0161; /* LATIN SMALL LETTER S WITH CARON */ - case 0x9B: return 0x203A; /* SINGLE RIGHT-POINTING ANGLE QUOTATION MARK */ - case 0x9C: return 0x0153; /* LATIN SMALL LIGATURE OE */ - case 0x9E: return 0x017E; /* LATIN SMALL LETTER Z WITH CARON */ - case 0x9F: return 0x0178; /* LATIN CAPITAL LETTER Y WITH DIAERESIS */ + if (character == NULL_CHAR) { + return REPLACEMENT_CHAR; + } else if (character >= 0x0080 && character <= 0x009F) { + return NumericReplacementTable[character - 0x0080]; + } else { + return character; } - return 0x00; } NS_INLINE NSString * StringFromUniChar(unichar character)