|
|
//+---------------------------------------------------------------------------
//
// Copyright (C) 1996, Microsoft Corporation.
//
// File: htmlchar.cxx
//
// Contents: Contains a translate table from WCHAR to HTML WCHAR
// Translates an WCHAR string to its HTML equivalent
//
// History: 96/Jan/3 DwightKr Created
// 19 Nov 1997 AlanW Added missing named entities. Allow
// for outputing numeric entities if
// codepage translation fails.
//
//----------------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
#include <htmlchar.hxx>
struct WCHAR_TO_HTML { WCHAR * wszTranslated; ULONG cchTranslated; };
//+---------------------------------------------------------------------------
//----------------------------------------------------------------------------
static const struct WCHAR_TO_HTML WCHAR_TO_HTML[] = { L"never", 0xffffffff, // 0 end-of-string
0, 0, // 1
0, 0, // 2
0, 0, // 3
0, 0, // 4
0, 0, // 5
0, 0, // 6
0, 0, // 7
0, 0, // 8
L"\t", 1, // 9 tab
L"\n", 1, // 10 newline
0, 0, // 11
0, 0, // 12
L"\r", 1, // 13 carriage return
0, 0, // 14
0, 0, // 15
0, 0, // 16
0, 0, // 17
0, 0, // 18
0, 0, // 19
0, 0, // 20
0, 0, // 21
0, 0, // 22
0, 0, // 23
0, 0, // 24
0, 0, // 25
0, 0, // 26
0, 0, // 27
0, 0, // 28
0, 0, // 29
0, 0, // 30
0, 0, // 31
L" ", 1, // 32
L"!", 1, // 33
L""", 6, // 34
L"#", 1, // 35
L"$", 1, // 36
L"%", 1, // 37
L"&", 5, // 38
L"'", 1, // 39
L"(", 1, // 40
L")", 1, // 41
L"*", 1, // 42
L"+", 1, // 43
L",", 1, // 44
L"-", 1, // 45
L".", 1, // 46
L"/", 1, // 47
L"0", 1, // 48
L"1", 1, // 49
L"2", 1, // 50
L"3", 1, // 51
L"4", 1, // 52
L"5", 1, // 53
L"6", 1, // 54
L"7", 1, // 55
L"8", 1, // 56
L"9", 1, // 57
L":", 1, // 58
L";", 1, // 59
L"<", 4, // 60
L"=", 1, // 61
L">", 4, // 62
L"?", 1, // 63
L"@", 1, // 64
L"A", 1, // 65
L"B", 1, // 66
L"C", 1, // 67
L"D", 1, // 68
L"E", 1, // 69
L"F", 1, // 70
L"G", 1, // 71
L"H", 1, // 72
L"I", 1, // 73
L"J", 1, // 74
L"K", 1, // 75
L"L", 1, // 76
L"M", 1, // 77
L"N", 1, // 78
L"O", 1, // 79
L"P", 1, // 80
L"Q", 1, // 81
L"R", 1, // 82
L"S", 1, // 83
L"T", 1, // 84
L"U", 1, // 85
L"V", 1, // 86
L"W", 1, // 87
L"X", 1, // 88
L"Y", 1, // 89
L"Z", 1, // 90
L"[", 1, // 91
L"\\", 1, // 92
L"]", 1, // 93
L"^", 1, // 94
L"_", 1, // 95
L"`", 1, // 96
L"a", 1, // 97
L"b", 1, // 98
L"c", 1, // 99
L"d", 1, // 100
L"e", 1, // 101
L"f", 1, // 102
L"g", 1, // 103
L"h", 1, // 104
L"i", 1, // 105
L"j", 1, // 106
L"k", 1, // 107
L"l", 1, // 108
L"m", 1, // 109
L"n", 1, // 110
L"o", 1, // 111
L"p", 1, // 112
L"q", 1, // 113
L"r", 1, // 114
L"s", 1, // 115
L"t", 1, // 116
L"u", 1, // 117
L"v", 1, // 118
L"w", 1, // 119
L"x", 1, // 120
L"y", 1, // 121
L"z", 1, // 122
L"{", 1, // 123
L"|", 1, // 124
L"}", 1, // 125
L"~", 1, // 126
0, 0, // 127
0, 0, // 128
0, 0, // 129
0, 0, // 130
0, 0, // 131
0, 0, // 132
0, 0, // 133
0, 0, // 134
0, 0, // 135
0, 0, // 136
0, 0, // 137
0, 0, // 138
0, 0, // 139
0, 0, // 140
0, 0, // 141
0, 0, // 142
0, 0, // 143
0, 0, // 144
0, 0, // 145
0, 0, // 146
0, 0, // 147
0, 0, // 148
0, 0, // 149
0, 0, // 150
0, 0, // 151
0, 0, // 152
0, 0, // 153
0, 0, // 154
0, 0, // 155
0, 0, // 156
0, 0, // 157
0, 0, // 158
0, 0, // 159
L" ", 6, // 160
L"¡", 7, // 161
L"¢", 6, // 162
L"£", 7, // 163
L"¤", 8, // 164
L"¥", 5, // 165
L"¦", 8, // 166
L"§", 6, // 167
L"¨", 5, // 168
L"©", 6, // 169
L"ª", 6, // 170 - feminine ordinal indicator
L"«", 7, // 171
L"¬", 5, // 172 - not sign
L"­", 5, // 173 - soft hyphen
L"®", 5, // 174
L"¯", 6, // 175
L"°", 5, // 176
L"±", 8, // 177
L"²", 6, // 178
L"³", 6, // 179
L"´", 7, // 180
L"µ", 7, // 181
L"¶", 6, // 182
L"·", 8, // 183
L"¸", 7, // 184
L"¹", 6, // 185
L"º", 6, // 186 - masculine ordinal indicator
L"»", 7, // 187
L"¼", 8, // 188
L"½", 8, // 189
L"¾", 8, // 190
L"¿", 8, // 191
L"À", 8, // 192
L"Á", 8, // 193
L"Â", 7, // 194
L"Ã", 8, // 195
L"Ä", 6, // 196
L"Å", 7, // 197
L"Æ", 7, // 198
L"Ç", 8, // 199
L"È", 8, // 200
L"É", 8, // 201
L"Ê", 7, // 202
L"Ë", 6, // 203
L"Ì", 8, // 204
L"Í", 8, // 205
L"Î", 7, // 206
L"Ï", 6, // 207
L"Ð", 5, // 208
L"Ñ", 8, // 209
L"Ò", 8, // 210
L"Ó", 8, // 211
L"Ô", 7, // 212
L"Õ", 8, // 213
L"Ö", 6, // 214
L"×", 7, // 215
L"Ø", 8, // 216
L"Ù", 8, // 217
L"Ú", 8, // 218
L"Û", 7, // 219
L"Ü", 6, // 220
L"Ý", 8, // 221
L"Þ", 7, // 222
L"ß", 7, // 223
L"à", 8, // 224
L"á", 8, // 225
L"â", 7, // 226
L"ã", 8, // 227
L"ä", 6, // 228
L"å", 7, // 229
L"æ", 7, // 230
L"ç", 8, // 231
L"è", 8, // 232
L"é", 8, // 233
L"ê", 7, // 234
L"ë", 6, // 235
L"ì", 8, // 236
L"í", 8, // 237
L"î", 7, // 238
L"ï", 6, // 239
L"ð", 5, // 240
L"ñ", 8, // 241
L"ò", 8, // 242
L"ó", 8, // 243
L"ô", 7, // 244
L"õ", 8, // 245
L"ö", 6, // 246
L"÷", 8, // 247
L"ø", 8, // 248
L"ù", 8, // 249
L"ú", 8, // 250
L"û", 7, // 251
L"ü", 6, // 252
L"ý", 8, // 253
L"þ", 7, // 254
L"ÿ", 6, // 255
};
//+---------------------------------------------------------------------------
//
// Function: HTMLEscapeW, public
//
// Synopsis: Appends an escaped version of a string to a virtual string.
//
// Arguments: [wcsString] - string to be translated
// [StrResult] - CVirtualString to which result will be appended
// [ulCodePage] - output codepage
//
// History: 96/Apr/03 dlee Created.
//
//----------------------------------------------------------------------------
void HTMLEscapeW( WCHAR const * wcsString, CVirtualString & StrResult, ULONG ulCodePage ) { unsigned iUnicodeOutputMethod = 0;
do { if ( *wcsString < 256 ) { const struct WCHAR_TO_HTML &Entry = WCHAR_TO_HTML[*wcsString];
if ( 1 == Entry.cchTranslated ) { StrResult.CharCat( *Entry.wszTranslated ); wcsString++; continue; }
// Do the check for end-of-string here, as this is an
// unusual code-path. This saves a compare per loop.
if ( 0 == *wcsString ) break;
// it's ok to pass 0 to StrCat
StrResult.StrCat( Entry.wszTranslated, Entry.cchTranslated ); } else { //
// A unicode character >= 256 has been found. Either leave it
// as-is in the output string, or convert to the numeric HTML
// entity, depending on whether all unicode characters in the
// string can be translated using the codepage.
//
if ( 0 == iUnicodeOutputMethod ) { iUnicodeOutputMethod++; BOOL fUsedDefaultChar = FALSE; int cchOut = WideCharToMultiByte( ulCodePage, #if (WINVER >= 0x0500)
WC_NO_BEST_FIT_CHARS | #endif // (WINVER >= 0x0500)
WC_COMPOSITECHECK | WC_DEFAULTCHAR, wcsString, -1, 0, 0, 0, &fUsedDefaultChar ); Win4Assert( cchOut != 0 || ERROR_INVALID_PARAMETER == GetLastError() );
if ( fUsedDefaultChar || cchOut == 0 && ERROR_INVALID_PARAMETER == GetLastError() ) iUnicodeOutputMethod++; }
if ( 1 == iUnicodeOutputMethod ) { StrResult.CharCat( *wcsString ); } else { Win4Assert( 2 == iUnicodeOutputMethod );
// Output the numeric html entity
USHORT wch = *wcsString; WCHAR achNum[6]; _itow( wch, achNum, 10 ); StrResult.CharCat( L'&' ); StrResult.CharCat( L'#' ); StrResult.StrCat( achNum ); StrResult.CharCat( L';' ); } }
wcsString++; } while( TRUE ); }
|