2 Copyright (C) 2000-2005 SKYRIX Software AG
4 This file is part of SOPE.
6 SOPE is free software; you can redistribute it and/or modify it under
7 the terms of the GNU Lesser General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
11 SOPE is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
14 License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with SOPE; see the file COPYING. If not, write to the
18 Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
22 #include "NSString+misc.h"
25 @implementation NSString(HTMLEscaping)
27 - (NSString *)stringByEscapingHTMLStringUsingCharacters {
28 register unsigned i, len, j;
29 register unichar *chars, *buf;
32 if ((len = [self length]) == 0) return @"";
34 chars = malloc((len + 3) * sizeof(unichar));
35 [self getCharacters:chars];
37 /* check for characters to escape ... */
38 for (i = 0, escapeCount = 0; i < len; i++) {
40 case '&': case '"': case '<': case '>':
49 if (escapeCount == 0 ) {
50 /* nothing to escape ... */
51 if (chars) free(chars);
52 return [[self copy] autorelease];
55 buf = calloc((len + 5) + (escapeCount * 8), sizeof(unichar));
56 for (i = 0, j = 0; i < len; i++) {
58 /* escape special chars */
60 buf[j] = '&'; j++; buf[j] = 'a'; j++; buf[j] = 'm'; j++;
61 buf[j] = 'p'; j++; buf[j] = ';'; j++;
64 buf[j] = '&'; j++; buf[j] = 'q'; j++; buf[j] = 'u'; j++;
65 buf[j] = 'o'; j++; buf[j] = 't'; j++; buf[j] = ';'; j++;
68 buf[j] = '&'; j++; buf[j] = 'l'; j++; buf[j] = 't'; j++;
72 buf[j] = '&'; j++; buf[j] = 'g'; j++; buf[j] = 't'; j++;
75 case 223: /* ß */
76 buf[j] = '&'; j++; buf[j] = 's'; j++; buf[j] = 'z'; j++;
77 buf[j] = 'l'; j++; buf[j] = 'i'; j++; buf[j] = 'g'; j++;
80 // TODO: this is missing a LOT?
81 case 252: /* ü */
82 buf[j] = '&'; j++; buf[j] = 'u'; j++; buf[j] = 'u'; j++;
83 buf[j] = 'm'; j++; buf[j] = 'l'; j++; buf[j] = ';'; j++;
85 case 220: /* Ü */
86 buf[j] = '&'; j++; buf[j] = 'U'; j++; buf[j] = 'u'; j++;
87 buf[j] = 'm'; j++; buf[j] = 'l'; j++; buf[j] = ';'; j++;
89 case 228: /* ä */
90 buf[j] = '&'; j++; buf[j] = 'a'; j++; buf[j] = 'u'; j++;
91 buf[j] = 'm'; j++; buf[j] = 'l'; j++; buf[j] = ';'; j++;
93 case 196: /* Ä */
94 buf[j] = '&'; j++; buf[j] = 'A'; j++; buf[j] = 'u'; j++;
95 buf[j] = 'm'; j++; buf[j] = 'l'; j++; buf[j] = ';'; j++;
97 case 246: /* ö */
98 buf[j] = '&'; j++; buf[j] = 'o'; j++; buf[j] = 'u'; j++;
99 buf[j] = 'm'; j++; buf[j] = 'l'; j++; buf[j] = ';'; j++;
101 case 214: /* Ö */
102 buf[j] = '&'; j++; buf[j] = 'O'; j++; buf[j] = 'u'; j++;
103 buf[j] = 'm'; j++; buf[j] = 'l'; j++; buf[j] = ';'; j++;
107 /* escape big chars */
108 if (chars[i] > 127) {
109 unsigned char nbuf[16];
112 sprintf((char *)nbuf, "&#%i;", (int)chars[i]);
113 for (k = 0; nbuf[k] != '\0'; k++) {
119 /* nothing to escape */
127 self = [NSString stringWithCharacters:buf length:j];
129 if (chars) free(chars);
134 - (NSString *)stringByEscapingHTMLAttributeValueUsingCharacters {
135 register unsigned i, len, j;
136 register unichar *chars, *buf;
137 unsigned escapeCount;
139 if ((len = [self length]) == 0) return @"";
141 chars = malloc((len + 3) * sizeof(unichar));
142 [self getCharacters:chars];
144 /* check for characters to escape ... */
145 for (i = 0, escapeCount = 0; i < len; i++) {
162 if (escapeCount == 0 ) {
163 /* nothing to escape ... */
164 if (chars) free(chars);
165 return [[self copy] autorelease];
168 buf = calloc((len + 3) + (escapeCount * 8), sizeof(unichar));
169 for (i = 0, j = 0; i < len; i++) {
171 /* escape special chars */
173 buf[j] = '&'; j++; buf[j] = 'a'; j++; buf[j] = 'm'; j++;
174 buf[j] = 'p'; j++; buf[j] = ';'; j++;
177 buf[j] = '&'; j++; buf[j] = 'q'; j++; buf[j] = 'u'; j++;
178 buf[j] = 'o'; j++; buf[j] = 't'; j++; buf[j] = ';'; j++;
181 buf[j] = '&'; j++; buf[j] = 'l'; j++; buf[j] = 't'; j++;
185 buf[j] = '&'; j++; buf[j] = 'g'; j++; buf[j] = 't'; j++;
190 buf[j] = '&'; j++; buf[j] = '#'; j++; buf[j] = '9'; j++;
194 buf[j] = '&'; j++; buf[j] = '#'; j++; buf[j] = '1'; j++;
195 buf[j] = '0'; j++; buf[j] = ';'; j++;
198 buf[j] = '&'; j++; buf[j] = '#'; j++; buf[j] = '1'; j++;
199 buf[j] = '3'; j++; buf[j] = ';'; j++;
203 /* escape big chars */
204 if (chars[i] > 127) {
205 unsigned char nbuf[16];
208 sprintf((char *)nbuf, "&#%i;", (int)chars[i]);
209 for (k = 0; nbuf[k] != '\0'; k++) {
215 /* nothing to escape */
216 buf[j] = chars[i]; j++;
222 self = [NSString stringWithCharacters:buf length:j];
224 if (chars) free(chars);
229 - (NSString *)stringByEscapingHTMLString {
230 return [self stringByEscapingHTMLStringUsingCharacters];
232 - (NSString *)stringByEscapingHTMLAttributeValue {
233 return [self stringByEscapingHTMLAttributeValueUsingCharacters];
236 @end /* NSString(HTMLEscaping) */