2000-01-22 12:49:49 +00:00
|
|
|
|
/* NSString+HTML.m
|
|
|
|
|
Copyright (C) 1999 Free Software Foundation, Inc.
|
|
|
|
|
|
|
|
|
|
Written by: Manuel Guesdon <mguesdon@sbuilders.com>
|
|
|
|
|
Date: Jan 1999
|
|
|
|
|
|
|
|
|
|
This file is part of the GNUstep Web Library.
|
|
|
|
|
|
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
|
|
|
modify it under the terms of the GNU Library General Public
|
|
|
|
|
License as published by the Free Software Foundation; either
|
|
|
|
|
version 2 of the License, or (at your option) any later version.
|
|
|
|
|
|
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
|
Library General Public License for more details.
|
|
|
|
|
|
|
|
|
|
You should have received a copy of the GNU Library General Public
|
|
|
|
|
License along with this library; if not, write to the Free
|
|
|
|
|
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
static char rcsId[] = "$Id$";
|
|
|
|
|
|
2000-10-30 15:36:50 +00:00
|
|
|
|
#include <GSWeb/GSWeb.h>
|
2000-01-22 12:49:49 +00:00
|
|
|
|
|
|
|
|
|
static NSArray* normalChars=nil;
|
|
|
|
|
static NSArray* htmlChars=nil;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
<!ENTITY amp CDATA "&" -- ampersand -->
|
|
|
|
|
<!ENTITY gt CDATA ">" -- greater than -->
|
|
|
|
|
<!ENTITY lt CDATA "<" -- less than -->
|
|
|
|
|
<!ENTITY quot CDATA """ -- double quote -->
|
|
|
|
|
<!ENTITY nbsp CDATA " " -- no-break space -->
|
|
|
|
|
<!ENTITY iexcl CDATA "¡" -- inverted exclamation mark -->
|
|
|
|
|
<!ENTITY cent CDATA "¢" -- cent sign -->
|
|
|
|
|
<!ENTITY pound CDATA "£" -- pound sterling sign -->
|
|
|
|
|
<!ENTITY curren CDATA "¤" -- general currency sign -->
|
|
|
|
|
<!ENTITY yen CDATA "¥" -- yen sign -->
|
|
|
|
|
<!ENTITY brvbar CDATA "¦" -- broken (vertical) bar -->
|
|
|
|
|
<!ENTITY sect CDATA "§" -- section sign -->
|
|
|
|
|
<!ENTITY uml CDATA "¨" -- umlaut (dieresis) -->
|
|
|
|
|
<!ENTITY copy CDATA "©" -- copyright sign -->
|
|
|
|
|
<!ENTITY ordf CDATA "ª" -- ordinal indicator, feminine -->
|
|
|
|
|
<!ENTITY laquo CDATA "«" -- angle quotation mark, left -->
|
|
|
|
|
<!ENTITY not CDATA "¬" -- not sign -->
|
|
|
|
|
<!ENTITY shy CDATA "­" -- soft hyphen -->
|
|
|
|
|
<!ENTITY reg CDATA "®" -- registered sign -->
|
|
|
|
|
<!ENTITY macr CDATA "¯" -- macron -->
|
|
|
|
|
<!ENTITY deg CDATA "°" -- degree sign -->
|
|
|
|
|
<!ENTITY plusmn CDATA "±" -- plus-or-minus sign -->
|
|
|
|
|
<!ENTITY sup2 CDATA "²" -- superscript two -->
|
|
|
|
|
<!ENTITY sup3 CDATA "³" -- superscript three -->
|
|
|
|
|
<!ENTITY acute CDATA "´" -- acute accent -->
|
|
|
|
|
<!ENTITY micro CDATA "µ" -- micro sign -->
|
|
|
|
|
<!ENTITY para CDATA "¶" -- pilcrow (paragraph sign) -->
|
|
|
|
|
<!ENTITY middot CDATA "·" -- middle dot -->
|
|
|
|
|
<!ENTITY cedil CDATA "¸" -- cedilla -->
|
|
|
|
|
<!ENTITY sup1 CDATA "¹" -- superscript one -->
|
|
|
|
|
<!ENTITY ordm CDATA "º" -- ordinal indicator, masculine -->
|
|
|
|
|
<!ENTITY raquo CDATA "»" -- angle quotation mark, right -->
|
|
|
|
|
<!ENTITY frac14 CDATA "¼" -- fraction one-quarter -->
|
|
|
|
|
<!ENTITY frac12 CDATA "½" -- fraction one-half -->
|
|
|
|
|
<!ENTITY frac34 CDATA "¾" -- fraction three-quarters -->
|
|
|
|
|
<!ENTITY iquest CDATA "¿" -- inverted question mark -->
|
|
|
|
|
<!ENTITY Agrave CDATA "À" -- capital A, grave accent -->
|
|
|
|
|
<!ENTITY Aacute CDATA "Á" -- capital A, acute accent -->
|
|
|
|
|
<!ENTITY Acirc CDATA "Â" -- capital A, circumflex accent -->
|
|
|
|
|
<!ENTITY Atilde CDATA "Ã" -- capital A, tilde -->
|
|
|
|
|
<!ENTITY Auml CDATA "Ä" -- capital A, dieresis or umlaut -->
|
|
|
|
|
<!ENTITY Aring CDATA "Å" -- capital A, ring -->
|
|
|
|
|
<!ENTITY AElig CDATA "Æ" -- capital AE diphthong (ligature) -->
|
|
|
|
|
<!ENTITY Ccedil CDATA "Ç" -- capital C, cedilla -->
|
|
|
|
|
<!ENTITY Egrave CDATA "È" -- capital E, grave accent -->
|
|
|
|
|
<!ENTITY Eacute CDATA "É" -- capital E, acute accent -->
|
|
|
|
|
<!ENTITY Ecirc CDATA "Ê" -- capital E, circumflex accent -->
|
|
|
|
|
<!ENTITY Euml CDATA "Ë" -- capital E, dieresis or umlaut -->
|
|
|
|
|
<!ENTITY Igrave CDATA "Ì" -- capital I, grave accent -->
|
|
|
|
|
<!ENTITY Iacute CDATA "Í" -- capital I, acute accent -->
|
|
|
|
|
<!ENTITY Icirc CDATA "Î" -- capital I, circumflex accent -->
|
|
|
|
|
<!ENTITY Iuml CDATA "Ï" -- capital I, dieresis or umlaut -->
|
|
|
|
|
<!ENTITY ETH CDATA "Ð" -- capital Eth, Icelandic -->
|
|
|
|
|
<!ENTITY Ntilde CDATA "Ñ" -- capital N, tilde -->
|
|
|
|
|
<!ENTITY Ograve CDATA "Ò" -- capital O, grave accent -->
|
|
|
|
|
<!ENTITY Oacute CDATA "Ó" -- capital O, acute accent -->
|
|
|
|
|
<!ENTITY Ocirc CDATA "Ô" -- capital O, circumflex accent -->
|
|
|
|
|
<!ENTITY Otilde CDATA "Õ" -- capital O, tilde -->
|
|
|
|
|
<!ENTITY Ouml CDATA "Ö" -- capital O, dieresis or umlaut -->
|
|
|
|
|
<!ENTITY times CDATA "×" -- multiply sign -->
|
|
|
|
|
<!ENTITY Oslash CDATA "Ø" -- capital O, slash -->
|
|
|
|
|
<!ENTITY Ugrave CDATA "Ù" -- capital U, grave accent -->
|
|
|
|
|
<!ENTITY Uacute CDATA "Ú" -- capital U, acute accent -->
|
|
|
|
|
<!ENTITY Ucirc CDATA "Û" -- capital U, circumflex accent -->
|
|
|
|
|
<!ENTITY Uuml CDATA "Ü" -- capital U, dieresis or umlaut -->
|
|
|
|
|
<!ENTITY Yacute CDATA "Ý" -- capital Y, acute accent -->
|
|
|
|
|
<!ENTITY THORN CDATA "Þ" -- capital Thorn, Icelandic -->
|
|
|
|
|
<!ENTITY szlig CDATA "ß" -- small sharp s, German (sz ligature) -->
|
|
|
|
|
<!ENTITY agrave CDATA "à" -- small a, grave accent -->
|
|
|
|
|
<!ENTITY aacute CDATA "á" -- small a, acute accent -->
|
|
|
|
|
<!ENTITY acirc CDATA "â" -- small a, circumflex accent -->
|
|
|
|
|
<!ENTITY atilde CDATA "ã" -- small a, tilde -->
|
|
|
|
|
<!ENTITY auml CDATA "ä" -- small a, dieresis or umlaut -->
|
|
|
|
|
<!ENTITY aring CDATA "å" -- small a, ring -->
|
|
|
|
|
<!ENTITY aelig CDATA "æ" -- small ae diphthong (ligature) -->
|
|
|
|
|
<!ENTITY ccedil CDATA "ç" -- small c, cedilla -->
|
|
|
|
|
<!ENTITY egrave CDATA "è" -- small e, grave accent -->
|
|
|
|
|
<!ENTITY eacute CDATA "é" -- small e, acute accent -->
|
|
|
|
|
<!ENTITY ecirc CDATA "ê" -- small e, circumflex accent -->
|
|
|
|
|
<!ENTITY euml CDATA "ë" -- small e, dieresis or umlaut -->
|
|
|
|
|
<!ENTITY igrave CDATA "ì" -- small i, grave accent -->
|
|
|
|
|
<!ENTITY iacute CDATA "í" -- small i, acute accent -->
|
|
|
|
|
<!ENTITY icirc CDATA "î" -- small i, circumflex accent -->
|
|
|
|
|
<!ENTITY iuml CDATA "ï" -- small i, dieresis or umlaut -->
|
|
|
|
|
<!ENTITY eth CDATA "ð" -- small eth, Icelandic -->
|
|
|
|
|
<!ENTITY ntilde CDATA "ñ" -- small n, tilde -->
|
|
|
|
|
<!ENTITY ograve CDATA "ò" -- small o, grave accent -->
|
|
|
|
|
<!ENTITY oacute CDATA "ó" -- small o, acute accent -->
|
|
|
|
|
<!ENTITY ocirc CDATA "ô" -- small o, circumflex accent -->
|
|
|
|
|
<!ENTITY otilde CDATA "õ" -- small o, tilde -->
|
|
|
|
|
<!ENTITY ouml CDATA "ö" -- small o, dieresis or umlaut -->
|
|
|
|
|
<!ENTITY divide CDATA "÷" -- divide sign -->
|
|
|
|
|
<!ENTITY oslash CDATA "ø" -- small o, slash -->
|
|
|
|
|
<!ENTITY ugrave CDATA "ù" -- small u, grave accent -->
|
|
|
|
|
<!ENTITY uacute CDATA "ú" -- small u, acute accent -->
|
|
|
|
|
<!ENTITY ucirc CDATA "û" -- small u, circumflex accent -->
|
|
|
|
|
<!ENTITY uuml CDATA "ü" -- small u, dieresis or umlaut -->
|
|
|
|
|
<!ENTITY yacute CDATA "ý" -- small y, acute accent -->
|
|
|
|
|
<!ENTITY thorn CDATA "þ" -- small thorn, Icelandic -->
|
|
|
|
|
<!ENTITY yuml CDATA "ÿ" -- small y, dieresis or umlaut -->
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void initHtmlChars()
|
|
|
|
|
{
|
|
|
|
|
if (!normalChars)
|
|
|
|
|
{
|
|
|
|
|
normalChars=[[NSArray arrayWithObjects:
|
|
|
|
|
@"&",
|
|
|
|
|
@">",
|
|
|
|
|
@"<",
|
|
|
|
|
@"\"",
|
|
|
|
|
@"<22>",
|
|
|
|
|
@"|",
|
|
|
|
|
@"<22>",
|
|
|
|
|
@"<22>",
|
|
|
|
|
@"<22>",
|
|
|
|
|
@"<22>",
|
|
|
|
|
@"<22>",
|
|
|
|
|
@"<22>",
|
|
|
|
|
@"<22>",
|
|
|
|
|
@"<22>",
|
|
|
|
|
@"<22>",
|
|
|
|
|
@"<22>",
|
|
|
|
|
@"<22>",
|
|
|
|
|
@"<22>",
|
|
|
|
|
@"<22>",
|
|
|
|
|
@"<22>",
|
|
|
|
|
@"<22>",
|
|
|
|
|
nil
|
|
|
|
|
] retain];
|
|
|
|
|
};
|
|
|
|
|
if (!htmlChars)
|
|
|
|
|
{
|
|
|
|
|
htmlChars=[[NSArray arrayWithObjects:
|
|
|
|
|
@"&",
|
|
|
|
|
@">",
|
|
|
|
|
@"<",
|
|
|
|
|
@""",
|
|
|
|
|
@"£",
|
|
|
|
|
@"¦",
|
|
|
|
|
@"°",
|
|
|
|
|
@"é",
|
|
|
|
|
@"ç",
|
|
|
|
|
@"à",
|
|
|
|
|
@"â",
|
|
|
|
|
@"ã",
|
|
|
|
|
@"è",
|
|
|
|
|
@"ê",
|
|
|
|
|
@"ì",
|
|
|
|
|
@"î",
|
|
|
|
|
@"ñ",
|
|
|
|
|
@"ô",
|
|
|
|
|
@"õ",
|
|
|
|
|
@"ù",
|
|
|
|
|
@"û",
|
|
|
|
|
nil
|
|
|
|
|
] retain];
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
//====================================================================
|
|
|
|
|
@implementation NSString (HTMLString)
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
-(NSString*)htmlPlus2Space
|
|
|
|
|
{
|
|
|
|
|
return [self stringByReplacingString:@"+"
|
|
|
|
|
withString:@" "];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
// void decodeURL(String &str)
|
|
|
|
|
// Convert the given URL string to a normal string. This means that
|
|
|
|
|
// all escaped characters are converted to their normal values. The
|
|
|
|
|
// escape character is '%' and is followed by 2 hex digits
|
|
|
|
|
// representing the octet.
|
|
|
|
|
//
|
|
|
|
|
-(NSString*)decodeURL
|
|
|
|
|
{
|
|
|
|
|
//TODO speed
|
|
|
|
|
unichar* _unichars=NULL;
|
|
|
|
|
unichar _uniChar=0;
|
|
|
|
|
NSString* _void=nil;
|
|
|
|
|
NSString* temp=nil;
|
|
|
|
|
const char* p=NULL;
|
|
|
|
|
int uniCharsIndex=0;
|
|
|
|
|
NSDebugMLLog(@"low",@"self=%@",self);
|
|
|
|
|
_void=[self htmlPlus2Space];
|
|
|
|
|
NSDebugMLLog(@"low",@"_void=%@",_void);
|
|
|
|
|
_unichars=_fastMallocBuffer(sizeof(unichar)*([_void length]+1));
|
|
|
|
|
NSDebugMLLog(@"low",@"[_void cString]=%s",[_void cString]);
|
|
|
|
|
for (p=[_void cString];p && *p;p++)
|
|
|
|
|
{
|
|
|
|
|
if (*p == '%')
|
|
|
|
|
{
|
|
|
|
|
//
|
|
|
|
|
// 2 hex digits follow...
|
|
|
|
|
//
|
|
|
|
|
int i=0;
|
|
|
|
|
_uniChar=0;
|
|
|
|
|
for (i=0;p[1] && i<2;i++)
|
|
|
|
|
{
|
|
|
|
|
p++;
|
|
|
|
|
NSDebugMLLog(@"low",@"*p=%c %u",(char)*p,(unsigned int)*p);
|
|
|
|
|
_uniChar <<= 4;
|
|
|
|
|
NSDebugMLLog(@"low",@"_uniChar=%x",(unsigned int)_uniChar);
|
|
|
|
|
if (isdigit(*p))
|
|
|
|
|
_uniChar+=*p-'0';
|
|
|
|
|
else
|
|
|
|
|
_uniChar+=toupper(*p)-'A'+10;
|
|
|
|
|
NSDebugMLLog(@"low",@"_uniChar=%x",(unsigned int)_uniChar);
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
_uniChar=(unsigned char)*p;
|
|
|
|
|
_unichars[uniCharsIndex]=_uniChar;
|
|
|
|
|
uniCharsIndex++;
|
|
|
|
|
};
|
|
|
|
|
temp=[NSString stringWithCharacters:_unichars
|
|
|
|
|
length:uniCharsIndex];
|
|
|
|
|
NSDebugMLLog(@"low",@"temp=%@",temp);
|
|
|
|
|
NSDebugMLLog(@"low",@"temp data=%@",[temp dataUsingEncoding:NSISOLatin1StringEncoding]);
|
|
|
|
|
return temp;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
// void encodeURL(String &str, char *valid)
|
|
|
|
|
// Convert a normal string to a URL 'safe' string. This means that
|
|
|
|
|
// all characters not explicitly mentioned in the URL BNF will be
|
|
|
|
|
// escaped. The escape character is '%' and is followed by 2 hex
|
|
|
|
|
// digits representing the octet.
|
|
|
|
|
//
|
|
|
|
|
-(NSString*)encodeURL
|
|
|
|
|
{
|
|
|
|
|
return [self encodeURLWithValid:nil];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
-(NSString*)encodeURLWithValid:(NSString*)_valid
|
|
|
|
|
{
|
|
|
|
|
NSMutableString* temp=[NSMutableString stringWithCapacity:[self length]];
|
|
|
|
|
const char* p=NULL;
|
|
|
|
|
const char* valid=[_valid cString];
|
|
|
|
|
static char *digits = "0123456789ABCDEF";
|
|
|
|
|
for (p =[self cString]; p && *p; p++)
|
|
|
|
|
{
|
|
|
|
|
if (isdigit(*p) || isalpha(*p) || (valid && strchr(valid, *p)))
|
|
|
|
|
[temp appendFormat:@"%c",*p];
|
|
|
|
|
else
|
|
|
|
|
[temp appendFormat:@"%%%c%c",digits[(*p >> 4) & 0x0f],digits[*p & 0x0f]];
|
|
|
|
|
};
|
|
|
|
|
return [NSString stringWithString:temp];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
-(NSDictionary*)dictionaryQueryString
|
|
|
|
|
{
|
|
|
|
|
return [self dictionaryWithSep1:@"&"
|
|
|
|
|
withSep2:@"="
|
|
|
|
|
withOptionUnescape:YES];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
-(NSDictionary*)dictionaryWithSep1:(NSString*)p_pstrSep1
|
|
|
|
|
withSep2:(NSString*)p_pstrSep2
|
|
|
|
|
withOptionUnescape:(BOOL)_unescape
|
|
|
|
|
{
|
|
|
|
|
NSMutableDictionary* pDico=nil;
|
|
|
|
|
if ([self length]>0)
|
|
|
|
|
{
|
|
|
|
|
NSArray* listItems = [self componentsSeparatedByString:p_pstrSep1];
|
|
|
|
|
int iCount=0;
|
|
|
|
|
pDico=[NSMutableDictionary dictionary];
|
|
|
|
|
for(iCount=0;iCount<[listItems count];iCount++)
|
|
|
|
|
{
|
|
|
|
|
if ([[listItems objectAtIndex:iCount] length]>0)
|
|
|
|
|
{
|
|
|
|
|
NSArray* listParam = [[listItems objectAtIndex:iCount] componentsSeparatedByString:p_pstrSep2];
|
|
|
|
|
id key=nil;
|
|
|
|
|
id value=nil;
|
|
|
|
|
if ([listParam count]==1)
|
|
|
|
|
{
|
|
|
|
|
key=[listParam objectAtIndex:0];
|
|
|
|
|
if (_unescape)
|
|
|
|
|
key=[key decodeURL];
|
|
|
|
|
}
|
|
|
|
|
else if ([listParam count]==2)
|
|
|
|
|
{
|
|
|
|
|
key=[listParam objectAtIndex:0];
|
|
|
|
|
value=[listParam objectAtIndex:1];
|
|
|
|
|
if (_unescape)
|
|
|
|
|
{
|
|
|
|
|
key=[key decodeURL];
|
|
|
|
|
value=[value decodeURL];
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
if (key)
|
|
|
|
|
{
|
|
|
|
|
id newValue=nil;
|
|
|
|
|
id prevValue=[pDico objectForKey:key];
|
|
|
|
|
if (!value)
|
|
|
|
|
value=[NSString string];
|
|
|
|
|
if (prevValue)
|
|
|
|
|
newValue=[prevValue arrayByAddingObject:value];
|
|
|
|
|
else
|
|
|
|
|
newValue=[NSArray arrayWithObject:value];
|
|
|
|
|
[pDico setObject:newValue
|
|
|
|
|
forKey: key];
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
pDico=[NSDictionary dictionaryWithDictionary:pDico];
|
|
|
|
|
};
|
|
|
|
|
return pDico;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
-(BOOL)ismapCoordx:(int*)x_
|
|
|
|
|
y:(int*)y_
|
|
|
|
|
{
|
|
|
|
|
BOOL _ok=NO;
|
|
|
|
|
NSScanner* _scanner=[NSScanner scannerWithString:self];
|
|
|
|
|
if ([_scanner scanInt:x_])
|
|
|
|
|
{
|
|
|
|
|
if (x_)
|
|
|
|
|
{
|
|
|
|
|
NSDebugMLLog(@"low",@"x=%d",*x_);
|
|
|
|
|
};
|
|
|
|
|
if ([_scanner scanString:@"," intoString:NULL])
|
|
|
|
|
{
|
|
|
|
|
if ([_scanner scanInt:y_])
|
|
|
|
|
{
|
|
|
|
|
if (y_)
|
|
|
|
|
{
|
|
|
|
|
NSDebugMLLog(@"low",@"y=%d",*y_);
|
|
|
|
|
};
|
|
|
|
|
NSDebugMLLog(@"low",@"[_scanner isAtEnd]=%d",(int)[_scanner isAtEnd]);
|
|
|
|
|
if ([_scanner isAtEnd])
|
|
|
|
|
{
|
|
|
|
|
_ok=YES;
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
if (!_ok)
|
|
|
|
|
{
|
|
|
|
|
if (x_)
|
|
|
|
|
*x_=INT_MAX;
|
|
|
|
|
if (y_)
|
|
|
|
|
*y_=INT_MAX;
|
|
|
|
|
};
|
|
|
|
|
return _ok;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
-(NSString*)stringByEscapingHTMLString
|
|
|
|
|
{
|
|
|
|
|
//TODO speed
|
|
|
|
|
NSString* str=nil;
|
|
|
|
|
if ([self length]>0)
|
|
|
|
|
{
|
|
|
|
|
NSMutableString* tmp=[self mutableCopy];
|
|
|
|
|
[tmp replaceString:@"&" withString:@"&"];
|
|
|
|
|
[tmp replaceString:@"\"" withString:@"""];
|
|
|
|
|
[tmp replaceString:@"<" withString:@"<"];
|
|
|
|
|
[tmp replaceString:@">" withString:@">"];
|
|
|
|
|
str = AUTORELEASE([tmp copy]);
|
|
|
|
|
RELEASE(tmp);
|
|
|
|
|
};
|
|
|
|
|
return str;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
-(NSString*)stringByEscapingHTMLAttributeValue
|
|
|
|
|
{
|
|
|
|
|
//TODO speed
|
|
|
|
|
NSString* str=nil;
|
|
|
|
|
if ([self length]>0)
|
|
|
|
|
{
|
|
|
|
|
NSMutableString* tmp=[self mutableCopy];
|
|
|
|
|
[tmp replaceString:@"&" withString:@"&"];
|
|
|
|
|
[tmp replaceString:@"\"" withString:@"""];
|
|
|
|
|
[tmp replaceString:@"<" withString:@"<"];
|
|
|
|
|
[tmp replaceString:@">" withString:@">"];
|
|
|
|
|
[tmp replaceString:@"\t" withString:@"	"];
|
|
|
|
|
[tmp replaceString:@"\n" withString:@" "];
|
|
|
|
|
[tmp replaceString:@"\r" withString:@" "];
|
|
|
|
|
str = AUTORELEASE([tmp copy]);
|
|
|
|
|
RELEASE(tmp);
|
|
|
|
|
};
|
|
|
|
|
return str;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
-(NSString*)stringByConvertingToHTMLEntities
|
|
|
|
|
{
|
|
|
|
|
//TODO speed
|
|
|
|
|
NSString* str=nil;
|
|
|
|
|
if ([self length]>0)
|
|
|
|
|
{
|
|
|
|
|
int i=0;
|
|
|
|
|
NSMutableString* tmp=[self mutableCopy];
|
|
|
|
|
if (!normalChars)
|
|
|
|
|
initHtmlChars();
|
|
|
|
|
for(i=0;i<[normalChars count];i++)
|
|
|
|
|
{
|
|
|
|
|
[tmp replaceString:[normalChars objectAtIndex:i]
|
|
|
|
|
withString:[htmlChars objectAtIndex:i]];
|
|
|
|
|
};
|
|
|
|
|
str = AUTORELEASE([tmp copy]);
|
|
|
|
|
RELEASE(tmp);
|
|
|
|
|
};
|
|
|
|
|
return str;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
-(NSString*)stringByConvertingFromHTMLEntities
|
|
|
|
|
{
|
|
|
|
|
NSString* str=nil;
|
|
|
|
|
if ([self length]>0)
|
|
|
|
|
{
|
|
|
|
|
int i=0;
|
|
|
|
|
NSMutableString* tmp=[self mutableCopy];
|
|
|
|
|
if (!normalChars)
|
|
|
|
|
initHtmlChars();
|
|
|
|
|
for(i=0;i<[normalChars count];i++)
|
|
|
|
|
{
|
|
|
|
|
[tmp replaceString:[htmlChars objectAtIndex:i]
|
|
|
|
|
withString:[normalChars objectAtIndex:i]];
|
|
|
|
|
};
|
|
|
|
|
str = AUTORELEASE([tmp copy]);
|
|
|
|
|
RELEASE(tmp);
|
|
|
|
|
};
|
|
|
|
|
return str;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
-(NSString*)stringByConvertingToHTML
|
|
|
|
|
{
|
|
|
|
|
NSString* str=nil;
|
|
|
|
|
if ([self length]>0)
|
|
|
|
|
{
|
|
|
|
|
//TODO speed
|
|
|
|
|
NSMutableString* tmp=[[self stringByConvertingToHTMLEntities] mutableCopy];
|
|
|
|
|
[tmp replaceString:@"\r\n" withString:@"<BR>"];
|
|
|
|
|
[tmp replaceString:@"\r" withString:@"<BR>"];
|
|
|
|
|
[tmp replaceString:@"\n" withString:@"<BR>"];
|
|
|
|
|
str = AUTORELEASE([tmp copy]);
|
|
|
|
|
RELEASE(tmp);
|
|
|
|
|
};
|
|
|
|
|
return str;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
-(NSString*)stringByConvertingFromHTML
|
|
|
|
|
{
|
|
|
|
|
NSString* str=nil;
|
|
|
|
|
if ([self length]>0)
|
|
|
|
|
{
|
|
|
|
|
//TODO speed
|
|
|
|
|
NSMutableString* tmp=[[self stringByConvertingFromHTMLEntities] mutableCopy];
|
|
|
|
|
[tmp replaceString:@"<BR>" withString:@"\n"];
|
|
|
|
|
str = AUTORELEASE([tmp copy]);
|
|
|
|
|
RELEASE(tmp);
|
|
|
|
|
};
|
|
|
|
|
return str;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
@end
|
|
|
|
|
|