Remiander of bug 169590. Hook a catch-all W3C entity converter and user-prefs for custom levels of entity-zation in the editor's '<HTML> Source' and 'Save As...'

git-svn-id: svn://10.0.0.236/trunk@135372 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
rbs%maths.uq.edu.au
2002-12-17 00:41:25 +00:00
parent 13a28d0c07
commit 2129932d47
8 changed files with 80 additions and 11 deletions

View File

@@ -136,6 +136,11 @@ nsHTMLContentSerializer::Init(PRUint32 aFlags, PRUint32 aWrapColumn,
mCharSet = aCharSet;
// set up entity converter if we are going to need it
if (mFlags & nsIDocumentEncoder::OutputEncodeW3CEntities) {
mEntityConverter = do_CreateInstance(NS_ENTITYCONVERTER_CONTRACTID);
}
return NS_OK;
}
@@ -802,9 +807,10 @@ nsHTMLContentSerializer::AppendToString(const nsAString& aStr,
}
if (aTranslateEntities && !mInCDATA) {
if (mFlags & nsIDocumentEncoder::OutputEncodeBasicEntities ||
mFlags & nsIDocumentEncoder::OutputEncodeLatin1Entities ||
mFlags & nsIDocumentEncoder::OutputEncodeHTMLEntities) {
if (mFlags & (nsIDocumentEncoder::OutputEncodeBasicEntities |
nsIDocumentEncoder::OutputEncodeLatin1Entities |
nsIDocumentEncoder::OutputEncodeHTMLEntities |
nsIDocumentEncoder::OutputEncodeW3CEntities)) {
nsIParserService* parserService =
nsContentUtils::GetParserServiceWeakRef();
@@ -831,6 +837,7 @@ nsHTMLContentSerializer::AppendToString(const nsAString& aStr,
const PRUnichar* fragmentEnd = c + fragmentLength;
const char* entityText = nsnull;
nsCAutoString entityReplacement;
char* fullEntityText = nsnull;
advanceLength = 0;
// for each character in this chunk, check if it
@@ -855,6 +862,13 @@ nsHTMLContentSerializer::AppendToString(const nsAString& aStr,
break;
}
}
else if (val > 127 &&
mFlags & nsIDocumentEncoder::OutputEncodeW3CEntities &&
mEntityConverter &&
NS_SUCCEEDED(mEntityConverter->ConvertToEntity(val,
nsIEntityConverter::entityW3C, &fullEntityText))) {
break;
}
}
aOutputStr.Append(fragmentStart, advanceLength);
@@ -864,6 +878,12 @@ nsHTMLContentSerializer::AppendToString(const nsAString& aStr,
aOutputStr.Append(PRUnichar(';'));
advanceLength++;
}
// if it comes from nsIEntityConverter, it already has '&' and ';'
else if (fullEntityText) {
aOutputStr.Append(NS_ConvertASCIItoUCS2(fullEntityText));
nsMemory::Free(fullEntityText);
advanceLength++;
}
}
} else {
nsXMLContentSerializer::AppendToString(aStr, aOutputStr, aTranslateEntities, aIncrColumn);