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:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
|
||||
Reference in New Issue
Block a user