390 lines
17 KiB
C++
390 lines
17 KiB
C++
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// 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 );
|
||
|
}
|
||
|
|