fixed bug 1140; temp fix to 1321

git-svn-id: svn://10.0.0.236/trunk@15124 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
rickg%netscape.com
1998-11-22 08:01:28 +00:00
parent 8d0560f175
commit ba8fd871ca
16 changed files with 386 additions and 490 deletions

View File

@@ -34,6 +34,7 @@
#include "plstr.h"
#include "nsDTDUtils.h"
#include "nsTagHandler.h"
#include "nsViewSourceHTML.h"
#ifdef XP_PC
#include <direct.h> //this is here for debug reasons...
@@ -177,9 +178,17 @@ static eHTMLTags gInlineChildTags []={
eHTMLTag_dfn,
eHTMLTag_em, eHTMLTag_embed,
eHTMLTag_font,
eHTMLTag_form, //Added this for backward compatibility...
eHTMLTag_i, eHTMLTag_iframe, eHTMLTag_ilayer, eHTMLTag_img, eHTMLTag_input,
eHTMLTag_kbd,
eHTMLTag_label, eHTMLTag_li,
eHTMLTag_label,
eHTMLTag_layer, //Added this for backward compatibility...
eHTMLTag_li,
eHTMLTag_map,
eHTMLTag_nobr,
eHTMLTag_object,
@@ -189,8 +198,11 @@ static eHTMLTags gInlineChildTags []={
eHTMLTag_s, eHTMLTag_samp, eHTMLTag_script, eHTMLTag_select, eHTMLTag_small,
eHTMLTag_sound, eHTMLTag_spacer, eHTMLTag_span, eHTMLTag_strike, eHTMLTag_strong,
eHTMLTag_sub, eHTMLTag_sup,
eHTMLTag_table, //Added this for backward compatibility...
eHTMLTag_textarea,eHTMLTag_tt,
eHTMLTag_u,
eHTMLTag_u, eHTMLTag_userdefined,
eHTMLTag_var,
eHTMLTag_wbr,
eHTMLTag_text,
@@ -506,7 +518,7 @@ CNavDTD::CNavDTD() : nsIDTD(), mTokenDeque(gTokenKiller) {
mBodyContext=new nsDTDContext();
mFormContext=0;
mMapContext=0;
// DebugDumpContainmentRules(*this,"c:/temp/DTDRules1.out","New CNavDTD Containment Rules");
}
/**
@@ -713,25 +725,45 @@ nsresult CNavDTD::ReleaseTokenPump(nsITagHandler* aHandler){
*/
PRInt32 CNavDTD::DidHandleStartTag(CToken* aToken,eHTMLTags aChildTag){
PRInt32 result=kNoError;
CToken* theNextToken=mParser->PeekToken();
if(theNextToken) {
eHTMLTokenTypes theType=eHTMLTokenTypes(theNextToken->GetTokenType());
if(eToken_newline==theType){
switch(aChildTag){
case eHTMLTag_pre:
case eHTMLTag_listing:
//we skip the first newline token inside PRE and LISTING
mParser->PopToken();
break;
default:
break;
}//switch
switch(aChildTag){
case eHTMLTag_pre:
case eHTMLTag_listing:
{
if(theNextToken) {
eHTMLTokenTypes theType=eHTMLTokenTypes(theNextToken->GetTokenType());
if(eToken_newline==theType){
}//if
}//if
switch(aChildTag){
case eHTMLTag_pre:
case eHTMLTag_listing:
//we skip the first newline token inside PRE and LISTING
mParser->PopToken();
break;
default:
break;
}//switch
}//if
}//if
}
break;
case eHTMLTag_plaintext:
case eHTMLTag_xmp:
//grab the skipped content and dump it out as text...
if(theNextToken){
eHTMLTokenTypes theType=eHTMLTokenTypes(theNextToken->GetTokenType());
if(eToken_skippedcontent==theType){
nsString& theText=((CAttributeToken*)theNextToken)->GetKey();
CViewSourceHTML::WriteText(theText,*mSink,PR_TRUE);
}
}
break;
default:
break;
}//switch
return result;
}
@@ -835,6 +867,7 @@ nsresult CNavDTD::HandleStartToken(CToken* aToken) {
nsresult result=(0==attrCount) ? NS_OK : CollectAttributes(attrNode,attrCount);
eHTMLTags theParent=mBodyContext->mElements.Last();
eHTMLTags theChildTag=(eHTMLTags)aToken->GetTypeID();
PRInt32 theAttrCount;
if(NS_OK==result) {
//now check to see if this token should be omitted...
@@ -847,8 +880,8 @@ nsresult CNavDTD::HandleStartToken(CToken* aToken) {
{
result=OpenHead(attrNode); //open the head...
if(NS_OK==result) {
PRInt32 theCount;
result=CollectSkippedContent(attrNode,theCount);
result=CollectSkippedContent(attrNode,theAttrCount);
mSink->SetTitle(attrNode.GetSkippedContent());
result=CloseHead(attrNode); //close the head...
}
@@ -1271,90 +1304,6 @@ PRBool CNavDTD::CanContainStyles(eHTMLTags aParent) const {
return result;
}
/***********************************************************************************
The following tables determine the set of elements each tag can contain...
***********************************************************************************/
static eHTMLTags gTagSet1[]={
eHTMLTag_a, eHTMLTag_abbr, eHTMLTag_acronym,
eHTMLTag_address, eHTMLTag_applet,
eHTMLTag_blink, eHTMLTag_b, eHTMLTag_basefont, eHTMLTag_bdo,
eHTMLTag_big,
eHTMLTag_blockquote,eHTMLTag_br, eHTMLTag_button, eHTMLTag_center,
eHTMLTag_cite, eHTMLTag_code,
eHTMLTag_del, eHTMLTag_dfn, eHTMLTag_dir,
eHTMLTag_div, eHTMLTag_dl, eHTMLTag_dt,
eHTMLTag_em, eHTMLTag_embed,
eHTMLTag_fieldset, eHTMLTag_font, eHTMLTag_form,
eHTMLTag_h1, eHTMLTag_h2, eHTMLTag_h3,
eHTMLTag_h4, eHTMLTag_h5, eHTMLTag_h6,
eHTMLTag_hr, eHTMLTag_i, eHTMLTag_iframe, eHTMLTag_img,
eHTMLTag_input, eHTMLTag_ins, eHTMLTag_isindex,
eHTMLTag_kbd, eHTMLTag_label, eHTMLTag_layer, eHTMLTag_li,
eHTMLTag_map, eHTMLTag_menu, eHTMLTag_newline, eHTMLTag_nobr,
eHTMLTag_noframes, eHTMLTag_noscript,
eHTMLTag_object, eHTMLTag_ol, eHTMLTag_p, eHTMLTag_pre,
eHTMLTag_q, eHTMLTag_s, eHTMLTag_strike,
eHTMLTag_samp, eHTMLTag_script, eHTMLTag_select, eHTMLTag_small,
eHTMLTag_spacer, eHTMLTag_span, eHTMLTag_strong,
eHTMLTag_sub, eHTMLTag_sup, eHTMLTag_table, eHTMLTag_text,
eHTMLTag_textarea, eHTMLTag_tt, eHTMLTag_u, eHTMLTag_ul,
eHTMLTag_userdefined, eHTMLTag_var, eHTMLTag_wbr,
eHTMLTag_whitespace};
static eHTMLTags gTagSet2[]={
eHTMLTag_a, eHTMLTag_abbr, eHTMLTag_acronym,
eHTMLTag_applet, eHTMLTag_blink,
eHTMLTag_b,
eHTMLTag_basefont, eHTMLTag_bdo, eHTMLTag_big, eHTMLTag_br,
eHTMLTag_button, eHTMLTag_cite, eHTMLTag_code,
eHTMLTag_del, eHTMLTag_dfn, eHTMLTag_div,
eHTMLTag_em, eHTMLTag_font, eHTMLTag_form, eHTMLTag_hr,
eHTMLTag_embed,
eHTMLTag_i, eHTMLTag_iframe, eHTMLTag_img,
eHTMLTag_input, eHTMLTag_ins,
eHTMLTag_kbd,
eHTMLTag_label, eHTMLTag_layer, eHTMLTag_map, eHTMLTag_newline,
eHTMLTag_nobr, eHTMLTag_object, eHTMLTag_p,
eHTMLTag_q, eHTMLTag_s, eHTMLTag_strike,
eHTMLTag_samp, eHTMLTag_script, eHTMLTag_select, eHTMLTag_small,
eHTMLTag_spacer, eHTMLTag_span, eHTMLTag_strong,
eHTMLTag_sub, eHTMLTag_sup, eHTMLTag_text, eHTMLTag_textarea,
eHTMLTag_table,// XXX kipp was here
eHTMLTag_tt, eHTMLTag_u, eHTMLTag_userdefined, eHTMLTag_var,
eHTMLTag_wbr, eHTMLTag_whitespace};
static eHTMLTags gTagSet3[]={
eHTMLTag_a, eHTMLTag_abbr, eHTMLTag_acronym,
eHTMLTag_applet, eHTMLTag_blink,
eHTMLTag_b,
eHTMLTag_bdo, eHTMLTag_big, eHTMLTag_br, eHTMLTag_blockquote,
eHTMLTag_body, eHTMLTag_caption, eHTMLTag_center, eHTMLTag_cite,
eHTMLTag_code, eHTMLTag_dd, eHTMLTag_del, eHTMLTag_dfn,
eHTMLTag_div, eHTMLTag_dt, eHTMLTag_em, eHTMLTag_fieldset,
eHTMLTag_embed,
eHTMLTag_font, eHTMLTag_form, eHTMLTag_h1, eHTMLTag_h2,
eHTMLTag_h3, eHTMLTag_h4, eHTMLTag_h5, eHTMLTag_h6,
eHTMLTag_i, eHTMLTag_iframe, eHTMLTag_ins, eHTMLTag_kbd,
eHTMLTag_label, eHTMLTag_legend, eHTMLTag_li, eHTMLTag_map,
eHTMLTag_newline, eHTMLTag_noframes,
eHTMLTag_noscript, eHTMLTag_object, eHTMLTag_p, eHTMLTag_pre,
eHTMLTag_q, eHTMLTag_s, eHTMLTag_strike,
eHTMLTag_samp, eHTMLTag_small, eHTMLTag_spacer,
eHTMLTag_span, eHTMLTag_strong, eHTMLTag_sub, eHTMLTag_sup,
eHTMLTag_td, eHTMLTag_text,
eHTMLTag_th, eHTMLTag_tt, eHTMLTag_u, eHTMLTag_userdefined,
eHTMLTag_var, eHTMLTag_wbr, eHTMLTag_whitespace};
/***********************************************************************************
The preceeding tables determine the set of elements each tag can contain...
***********************************************************************************/
@@ -1429,7 +1378,12 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const {
break;
case eHTMLTag_button:
result=FindTagInSet(aChild,gTagSet3,sizeof(gTagSet3)/sizeof(eHTMLTag_unknown));
{
static eHTMLTags okTags[]={eHTMLTag_caption,eHTMLTag_legend};
result=FindTagInSet(aChild,okTags,sizeof(okTags)/sizeof(eHTMLTag_unknown));
if(PR_FALSE==result)
result=FindTagInSet(aChild,gBlockAndInlineChildTags,sizeof(gBlockAndInlineChildTags)/sizeof(eHTMLTag_unknown));
}
break;
case eHTMLTag_caption: case eHTMLTag_center:
@@ -1502,7 +1456,7 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const {
case eHTMLTag_html:
{
static eHTMLTags okTags[]={eHTMLTag_body,eHTMLTag_frameset,eHTMLTag_head,eHTMLTag_script};
static eHTMLTags okTags[]={eHTMLTag_body,eHTMLTag_frameset,eHTMLTag_head,eHTMLTag_script,eHTMLTag_noscript};
result=FindTagInSet(aChild,okTags,sizeof(okTags)/sizeof(eHTMLTag_unknown));
}
break;
@@ -1557,38 +1511,25 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const {
result=PRBool((eHTMLTag_option==aChild) || (aParent==aChild));
break;
case eHTMLTag_p:
{
static eHTMLTags datalistTags[]={eHTMLTag_dt,eHTMLTag_dd};
if(eHTMLTag_p==aChild)
result=PR_FALSE;
if(eHTMLTag_div==aChild)
result=PR_FALSE;
else if(FindTagInSet(aChild,datalistTags,sizeof(datalistTags)/sizeof(eHTMLTag_unknown))) {
//we now allow DT/DD inside a paragraph, so long as a DL is open...
if(PR_TRUE==HasOpenContainer(eHTMLTag_dl)) {
if(PR_TRUE==HasOpenContainer(eHTMLTag_dt))
result=PR_FALSE;
} else
result=PR_TRUE;
}
else
result=FindTagInSet(aChild,gTagSet2,sizeof(gTagSet2)/sizeof(eHTMLTag_unknown));
}
break;
case eHTMLTag_applet:
case eHTMLTag_object:
if(eHTMLTag_param==aChild) {
result=PR_TRUE;
break;
}
//otherwise fall through...
result=FindTagInSet(aChild,gBlockAndInlineChildTags,sizeof(gBlockAndInlineChildTags)/sizeof(eHTMLTag_unknown));
break;
case eHTMLTag_address:
if(eHTMLTag_p==aChild) {
result=PR_TRUE;
break;
}
//else fall through...
case eHTMLTag_p:
case eHTMLTag_pre:
result=FindTagInSet(aChild,gTagSet2,sizeof(gTagSet2)/sizeof(eHTMLTag_unknown));
result=FindTagInSet(aChild,gInlineChildTags,sizeof(gInlineChildTags)/sizeof(eHTMLTag_unknown));
break;
case eHTMLTag_script:
@@ -3325,8 +3266,7 @@ CNavDTD::ConsumeAttributes(PRUnichar aChar,CScanner& aScanner,CStartToken* aToke
* @return new token or null
*/
nsresult
CNavDTD::ConsumeContentToEndTag(const nsString& aString,
PRUnichar aChar,
CNavDTD::ConsumeContentToEndTag(PRUnichar aChar,
eHTMLTags aChildTag,
CScanner& aScanner,
CToken*& aToken){
@@ -3335,7 +3275,7 @@ CNavDTD::ConsumeContentToEndTag(const nsString& aString,
//consume all the input until we find a matching end tag.
nsAutoString endTag("</");
endTag.Append(aString);
endTag.Append(NS_EnumToTag(aChildTag));
endTag.Append(">");
aToken=gTokenRecycler.CreateTokenOfType(eToken_skippedcontent,aChildTag,endTag);
return aToken->Consume(aChar,aScanner); //tell new token to finish consuming text...
@@ -3352,7 +3292,15 @@ CNavDTD::ConsumeContentToEndTag(const nsString& aString,
* @return new token or null
*/
static eHTMLTags gSkippedContentTags[]={ eHTMLTag_script, eHTMLTag_style, eHTMLTag_title, eHTMLTag_textarea};
static eHTMLTags gSkippedContentTags[]=
{ eHTMLTag_noscript,
eHTMLTag_plaintext, eHTMLTag_script, eHTMLTag_style,
eHTMLTag_title, eHTMLTag_textarea, eHTMLTag_xmp};
static eHTMLTags gSkippedContentTargets[]=
{ eHTMLTag_noscript,
eHTMLTag_html, eHTMLTag_script, eHTMLTag_style,
eHTMLTag_title, eHTMLTag_textarea, eHTMLTag_xmp};
nsresult
CNavDTD::ConsumeStartTag(PRUnichar aChar,CScanner& aScanner,CToken*& aToken) {
@@ -3374,16 +3322,14 @@ CNavDTD::ConsumeStartTag(PRUnichar aChar,CScanner& aScanner,CToken*& aToken) {
eHTMLTags theTag=(eHTMLTags)aToken->GetTypeID();
if(FindTagInSet(theTag,gSkippedContentTags,sizeof(gSkippedContentTags)/sizeof(eHTMLTag_unknown))) {
PRInt32 theIndex=IndexOfTagInSet(theTag,gSkippedContentTags,sizeof(gSkippedContentTags)/sizeof(eHTMLTag_unknown));
if(-1<theIndex) {
//Do special case handling for <script>, <style>, <title> or <textarea>...
CToken* skippedToken=0;
nsString& str=aToken->GetStringValueXXX();
result=ConsumeContentToEndTag(str,aChar,theTag,aScanner,skippedToken);
result=ConsumeContentToEndTag(aChar,gSkippedContentTargets[theIndex],aScanner,skippedToken);
if((NS_OK==result) && skippedToken){
//now we strip the ending sequence from our new SkippedContent token...
nsString& skippedText=((CSkippedContentToken*)skippedToken)->GetKey();
mTokenDeque.Push(skippedToken);
//In the case that we just read a given tag, we should go and

View File

@@ -594,8 +594,7 @@ protected:
* @param aToken is the next token (or null)
* @return error code
*/
virtual nsresult ConsumeContentToEndTag(const nsString& aString,
PRUnichar aChar,
virtual nsresult ConsumeContentToEndTag(PRUnichar aChar,
eHTMLTags aChildTag,
CScanner& aScanner,
CToken*& aToken);

View File

@@ -773,12 +773,11 @@ nsresult COtherDTD::ConsumeAttributes(PRUnichar aChar,CScanner& aScanner,CStartT
* @param anErrorCode: arg that will hold error condition
* @return new token or null
*/
nsresult COtherDTD::ConsumeContentToEndTag(const nsString& aString,
PRUnichar aChar,
nsresult COtherDTD::ConsumeContentToEndTag(PRUnichar aChar,
eHTMLTags aChildTag,
CScanner& aScanner,
CToken*& aToken){
return CNavDTD::ConsumeContentToEndTag(aString,aChar,aChildTag,aScanner,aToken);
return CNavDTD::ConsumeContentToEndTag(aChar,aChildTag,aScanner,aToken);
}
/**

View File

@@ -558,8 +558,7 @@ private:
* @param aToken is the next token (or null)
* @return error code
*/
virtual nsresult ConsumeContentToEndTag(const nsString& aString,
PRUnichar aChar,
virtual nsresult ConsumeContentToEndTag(PRUnichar aChar,
eHTMLTags aChildTag,
CScanner& aScanner,
CToken*& aToken);

View File

@@ -270,6 +270,36 @@ CToken* CTokenRecycler::CreateTokenOfType(eHTMLTokenTypes aType,eHTMLTags aTag,
return result;
}
void DebugDumpContainmentRules(nsIDTD& theDTD,const char* aFilename,const char* aTitle) {
const char* prefix=" ";
fstream out(aFilename,ios::out);
out << "==================================================" << endl;
out << aTitle << endl;
out << "==================================================";
int i,j=0;
int written;
for(i=1;i<eHTMLTag_text;i++){
const char* tag=NS_EnumToTag((eHTMLTags)i);
out << endl << endl << "Tag: <" << tag << ">" << endl;
out << prefix;
written=0;
if(theDTD.IsContainer(i)) {
for(j=1;j<eHTMLTag_text;j++){
if(15==written) {
out << endl << prefix;
written=0;
}
if(theDTD.CanContain(i,j)){
tag=NS_EnumToTag((eHTMLTags)j);
if(tag) {
out<< tag << ", ";
written++;
}
}
}//for
}
else out<<"(not container)" << endl;
}
}

View File

@@ -31,6 +31,7 @@
#include "nsCRT.h"
#include "nsDeque.h"
#include "nsIDTD.h"
#include <fstream.h>
/***************************************************************
Before digging into the NavDTD, we'll define a helper
@@ -45,42 +46,7 @@
you can see the htmltags on the stack if its not dynamic.
***************************************************************/
/**
* This method quickly scans the given set of tags,
* looking for the given tag.
* @update gess8/27/98
* @param aTag -- tag to be search for in set
* @param aTagSet -- set of tags to be searched
* @return
*/
inline PRBool FindTagInSet(PRInt32 aTag,const eHTMLTags aTagSet[],PRInt32 aCount) {
PRInt32 index;
for(index=0;index<aCount;index++)
if(aTag==aTagSet[index]) {
return PR_TRUE;
}
return PR_FALSE;
}
/**
* Called from various DTD's to determine the type of data in the buffer...
* @update gess11/20/98
* @param
* @return
*/
inline PRBool BufferContainsHTML(nsString& aBuffer){
PRBool result=PR_FALSE;
nsString temp;
aBuffer.Left(temp,200);
temp.ToLowerCase();
if((-1<temp.Find("<html") || (-1<temp.Find("!doctype html public \"-//w3c//dtd html")))) {
result=PR_TRUE;
}
return result;
}
void DebugDumpContainmentRules(nsIDTD& theDTD,const char* aFilename,const char* aTitle);
//#define _dynstack 1
class nsTagStack {
@@ -174,6 +140,56 @@ public:
virtual PRBool HandleCapturedTokens(CToken* aToken,nsIDTD* aDTD)=0;
};
/************************************************************************
Here are a few useful utility methods...
************************************************************************/
/**
* This method quickly scans the given set of tags,
* looking for the given tag.
* @update gess8/27/98
* @param aTag -- tag to be search for in set
* @param aTagSet -- set of tags to be searched
* @return
*/
inline PRInt32 IndexOfTagInSet(PRInt32 aTag,const eHTMLTags aTagSet[],PRInt32 aCount) {
PRInt32 index;
for(index=0;index<aCount;index++)
if(aTag==aTagSet[index]) {
return index;
}
return kNotFound;
}
/**
* This method quickly scans the given set of tags,
* looking for the given tag.
* @update gess8/27/98
* @param aTag -- tag to be search for in set
* @param aTagSet -- set of tags to be searched
* @return
*/
inline PRBool FindTagInSet(PRInt32 aTag,const eHTMLTags aTagSet[],PRInt32 aCount) {
return PRBool(-1<IndexOfTagInSet(aTag,aTagSet,aCount));
}
/**
* Called from various DTD's to determine the type of data in the buffer...
* @update gess11/20/98
* @param
* @return
*/
inline PRBool BufferContainsHTML(nsString& aBuffer){
PRBool result=PR_FALSE;
nsString temp;
aBuffer.Left(temp,200);
temp.ToLowerCase();
if((-1<temp.Find("<html") || (-1<temp.Find("!doctype html public \"-//w3c//dtd html")))) {
result=PR_TRUE;
}
return result;
}
#endif

View File

@@ -805,59 +805,20 @@ nsresult WriteNBSP(PRInt32 aCount, nsIContentSink& aSink) {
* @param
* @return result status
*/
nsresult WriteText(CToken* aToken,nsIContentSink& aSink) {
nsresult CViewSourceHTML::WriteText(nsString& aTextString,nsIContentSink& aSink,PRBool aPreserveSpace) {
nsresult result=NS_OK;
nsString& theText=aToken->GetStringValueXXX();
PRInt32 theStart=0;
PRInt32 theOffset=theText.Find(kNewLine,theStart);
if(-1<theOffset){
while(-1!=theOffset){
nsString temp;
theText.Mid(temp,theStart,theOffset-theStart-1);
CTextToken theToken(temp);
nsCParserNode theNode((CToken*)&theToken,0);
result=aSink.AddLeaf(theNode); //just dump the whole string...
WriteNewline(aSink);
theStart=theOffset+1;
theOffset=theText.Find(kNewLine,theStart);
}
if(theStart>=theText.Length())
return result;
}
nsString temp;
theText.Mid(temp,theStart,theText.Length()-theStart);
CTextToken theToken(temp);
nsCParserNode theNode((CToken*)&theToken,0);
result=aSink.AddLeaf(theNode); //just dump the whole string...
return result;
}
/**
* This method gets called when a comment needs to be saved.
*
* @update gess 3/25/98
* @param
* @return result status
*/
nsresult WriteComment(CToken* aToken,nsIContentSink& aSink) {
nsresult result=NS_OK;
SetColor("green",PR_TRUE,aSink);
SetStyle(eHTMLTag_i,PR_TRUE,aSink);
nsString& theText=aToken->GetStringValueXXX();
CTextToken theTextToken;
nsCParserNode theTextNode((CToken*)&theTextToken,0);
nsString& temp=theTextToken.GetStringValueXXX();
PRInt32 theEnd=theText.Length();
PRInt32 theEnd=aTextString.Length();
PRInt32 theOffset=0;
while(theOffset<theEnd){
switch(theText[theOffset]){
case kCR:
switch(aTextString[theOffset]){
case kCR: break;
case kLF:
{
if(temp.Length())
result=aSink.AddLeaf(theTextNode); //just dump the whole string...
@@ -866,7 +827,7 @@ nsresult WriteComment(CToken* aToken,nsIContentSink& aSink) {
temp="";
break;
case kSpace:
if(kSpace==theText[theOffset+1]) {
if((PR_TRUE==aPreserveSpace) && (kSpace==aTextString[theOffset+1])) {
if(temp.Length())
result=aSink.AddLeaf(theTextNode); //just dump the whole string...
WriteNBSP(1,aSink);
@@ -876,31 +837,17 @@ nsresult WriteComment(CToken* aToken,nsIContentSink& aSink) {
//fall through...
default:
//scan ahead looking for valid chars...
temp+=theText[theOffset];
temp+=aTextString[theOffset];
break;
}//switch...
theOffset++;
}
if(temp.Length())
result=aSink.AddLeaf(theTextNode); //just dump the whole string...
SetStyle(eHTMLTag_i,PR_FALSE,aSink);
SetStyle(eHTMLTag_font,PR_FALSE,aSink);
return result;
}
/*
{
PRInt32 theFirst=theOffset;
while((++theOffset<theEnd) && (kNewLine!=theText[theOffset]) && (kSpace!=theText[theOffset]));
theText.Mid(temp,theFirst,theOffset-theFirst);
CTextToken theToken(temp);
nsCParserNode theNode((CToken*)&theToken,0);
}
*/
/**
* This method gets called when a tag needs to be sent out
*
@@ -1009,11 +956,21 @@ NS_IMETHODIMP CViewSourceHTML::HandleToken(CToken* aToken) {
break;
case eToken_comment:
WriteComment(aToken,*mSink);
{
SetColor("green",PR_TRUE,*mSink);
SetStyle(eHTMLTag_i,PR_TRUE,*mSink);
nsString& theText=aToken->GetStringValueXXX();
WriteText(theText,*mSink,PR_TRUE);
SetStyle(eHTMLTag_i,PR_FALSE,*mSink);
SetStyle(eHTMLTag_font,PR_FALSE,*mSink);
}
break;
case eToken_text:
WriteText(aToken,*mSink);
{
nsString& theText=aToken->GetStringValueXXX();
WriteText(theText,*mSink,PR_FALSE);
}
break;
case eToken_instruction:

View File

@@ -234,6 +234,8 @@ class CViewSourceHTML: public nsIDTD {
* @return ptr to recycler (or null)
*/
virtual nsITokenRecycler* GetTokenRecycler(void);
static nsresult WriteText(nsString& aTextString,nsIContentSink& aSink,PRBool aPreserveText);
protected: