Better factoring of code. This is not part of the build.

git-svn-id: svn://10.0.0.236/trunk@78687 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
vidur%netscape.com
2000-09-10 22:22:58 +00:00
parent 4cf084b048
commit 10f0ce919d
8 changed files with 366 additions and 316 deletions

View File

@@ -112,19 +112,15 @@ nsHTMLContentSerializer::Init(PRUint32 aFlags, PRUint32 aWrapColumn)
if ((mFlags & nsIDocumentEncoder::OutputCRLineBreak)
&& (mFlags & nsIDocumentEncoder::OutputLFLineBreak)) { // Windows/mail
mLineBreak.AssignWithConversion("\r\n");
mLineBreakLen = 2;
}
else if (mFlags & nsIDocumentEncoder::OutputCRLineBreak) { // Mac
mLineBreak.AssignWithConversion("\r");
mLineBreakLen = 1;
}
else if (mFlags & nsIDocumentEncoder::OutputLFLineBreak) { // Unix/DOM
mLineBreak.AssignWithConversion("\n");
mLineBreakLen = 1;
}
else {
mLineBreak.AssignWithConversion(NS_LINEBREAK); // Platform/default
mLineBreakLen = NS_LINEBREAK_LEN;
}
mPreLevel = 0;
@@ -144,20 +140,14 @@ nsHTMLContentSerializer::AppendText(nsIDOMText* aText,
nsresult rv;
rv = AppendTextData((nsIDOMNode*)aText, aStartOffset,
aEndOffset, data);
aEndOffset, data, PR_TRUE);
if (NS_FAILED(rv)) return NS_ERROR_FAILURE;
if (mPreLevel || (!mDoFormat && !HasLongLines(data))) {
AppendToString(data,
data.Length(),
aStr,
PR_TRUE);
AppendToString(data, aStr);
}
else {
AppendToStringWrapped(data,
data.Length(),
aStr,
PR_TRUE);
AppendToStringWrapped(data, aStr, PR_FALSE);
}
return NS_OK;
@@ -254,7 +244,7 @@ nsHTMLContentSerializer::AppendElementStart(nsIDOMElement *aElement,
}
if (LineBreakBeforeOpen(name, hasDirtyAttr)) {
AppendToString(mLineBreak, mLineBreakLen, aStr);
AppendToString(mLineBreak, aStr);
mColPos = 0;
}
@@ -264,18 +254,18 @@ nsHTMLContentSerializer::AppendElementStart(nsIDOMElement *aElement,
StartIndentation(name, hasDirtyAttr, aStr);
AppendToString(NS_LITERAL_STRING(kLessThan), -1, aStr);
AppendToString(NS_LITERAL_STRING(kLessThan), aStr);
nsXPIDLString sharedName;
name->GetUnicode(getter_Shares(sharedName));
AppendToString(sharedName, nsCRT::strlen(sharedName), aStr);
AppendToString(sharedName, -1, aStr);
SerializeAttributes(content, name, aStr);
AppendToString(NS_LITERAL_STRING(kGreaterThan), -1, aStr);
AppendToString(NS_LITERAL_STRING(kGreaterThan), aStr);
if (LineBreakAfterOpen(name, hasDirtyAttr)) {
AppendToString(mLineBreak, mLineBreakLen, aStr);
AppendToString(mLineBreak, aStr);
mColPos = 0;
}
@@ -314,18 +304,18 @@ nsHTMLContentSerializer::AppendElementEnd(nsIDOMElement *aElement,
}
if (LineBreakBeforeClose(name, hasDirtyAttr)) {
AppendToString(mLineBreak, mLineBreakLen, aStr);
AppendToString(mLineBreak, aStr);
mColPos = 0;
}
EndIndentation(name, hasDirtyAttr, aStr);
AppendToString(NS_LITERAL_STRING(kEndTag), -1, aStr);
AppendToString(NS_LITERAL_STRING(kEndTag), aStr);
AppendToString(sharedName, -1, aStr);
AppendToString(NS_LITERAL_STRING(kGreaterThan), -1, aStr);
AppendToString(NS_LITERAL_STRING(kGreaterThan), aStr);
if (LineBreakAfterClose(name, hasDirtyAttr)) {
AppendToString(mLineBreak, mLineBreakLen, aStr);
AppendToString(mLineBreak, aStr);
mColPos = 0;
}
@@ -345,19 +335,31 @@ nsHTMLContentSerializer::AppendToString(const PRUnichar* aStr,
mColPos += length;
aOutputStr.Append(aStr);
aOutputStr.Append(aStr, length);
}
void
nsHTMLContentSerializer::AppendToString(const PRUnichar aChar,
nsAWritableString& aOutputStr)
{
if (mBodyOnly && !mInBody) {
return;
}
mColPos += 1;
aOutputStr.Append(aChar);
}
void
nsHTMLContentSerializer::AppendToStringWrapped(const nsAReadableString& aStr,
PRInt32 aLength,
nsAWritableString& aOutputStr,
PRBool aTranslateEntities)
{
PRInt32 length = (aLength == -1) ? aStr.Length() : aLength;
PRInt32 length = aStr.Length();
if ((mColPos + length) < mMaxColumn) {
AppendToString(aStr, length, aOutputStr, aTranslateEntities);
AppendToString(aStr, aOutputStr, aTranslateEntities);
}
else {
nsAutoString line;
@@ -377,22 +379,20 @@ nsHTMLContentSerializer::AppendToStringWrapped(const nsAReadableString& aStr,
if (indx == kNotFound)
{
if (strOffset == 0) {
AppendToString(aStr, length, aOutputStr, aTranslateEntities);
AppendToString(aStr, aOutputStr, aTranslateEntities);
}
else {
lineLength = length - strOffset;
aStr.Right(line, lineLength);
AppendToString(line, lineLength,
aOutputStr, aTranslateEntities);
AppendToString(line, aOutputStr, aTranslateEntities);
}
done = PR_TRUE;
}
else {
lineLength = indx - strOffset;
aStr.Mid(line, strOffset, lineLength);
AppendToString(line, lineLength,
aOutputStr, aTranslateEntities);
AppendToString(mLineBreak, mLineBreakLen, aOutputStr);
AppendToString(line, aOutputStr, aTranslateEntities);
AppendToString(mLineBreak, aOutputStr);
strOffset = indx+1;
mColPos = 0;
}
@@ -402,7 +402,6 @@ nsHTMLContentSerializer::AppendToStringWrapped(const nsAReadableString& aStr,
void
nsHTMLContentSerializer::AppendToString(const nsAReadableString& aStr,
PRInt32 aLength,
nsAWritableString& aOutputStr,
PRBool aTranslateEntities)
{
@@ -411,9 +410,8 @@ nsHTMLContentSerializer::AppendToString(const nsAReadableString& aStr,
}
nsresult rv;
PRInt32 length = (aLength == -1) ? aStr.Length() : aLength;
mColPos += length;
mColPos += aStr.Length();
if (aTranslateEntities) {
nsCOMPtr<nsIEntityConverter> converter;

View File

@@ -63,17 +63,17 @@ class nsHTMLContentSerializer : public nsXMLContentSerializer {
void SerializeAttributes(nsIContent* aContent,
nsIAtom* aTagName,
nsAWritableString& aStr);
void AppendToString(const PRUnichar* aStr,
PRInt32 aLength,
nsAWritableString& aOutputStr);
void AppendToString(const nsAReadableString& aStr,
PRInt32 aLength,
nsAWritableString& aOutputStr,
PRBool aTranslateEntities = PR_FALSE);
void AppendToStringWrapped(const nsAReadableString& aStr,
PRInt32 aLength,
nsAWritableString& aOutputStr,
PRBool aTranslateEntities);
virtual void AppendToString(const PRUnichar* aStr,
PRInt32 aLength,
nsAWritableString& aOutputStr);
virtual void AppendToString(const PRUnichar aChar,
nsAWritableString& aOutputStr);
virtual void AppendToString(const nsAReadableString& aStr,
nsAWritableString& aOutputStr,
PRBool aTranslateEntities = PR_FALSE);
virtual void AppendToStringWrapped(const nsAReadableString& aStr,
nsAWritableString& aOutputStr,
PRBool aTranslateEntities);
PRBool HasLongLines(const nsString& text);
nsCOMPtr<nsIParserService> mParserService;
@@ -92,7 +92,6 @@ class nsHTMLContentSerializer : public nsXMLContentSerializer {
PRInt32 mMaxColumn;
nsString mLineBreak;
PRInt32 mLineBreakLen;
};
extern nsresult NS_NewHTMLContentSerializer(nsIContentSerializer** aSerializer);

View File

@@ -70,75 +70,33 @@ nsXMLContentSerializer::Init(PRUint32 flags, PRUint32 aWrapColumn)
return NS_OK;
}
static PRUint16 kGTVal = 62;
static const char* kEntities[] = {
"", "", "", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "", "", "",
"", "", "", "", "&quot;", "", "", "", "&amp;", "&apos;",
"", "", "", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "", "", "",
"&lt;", "", "&gt;"
};
void
nsXMLContentSerializer::ReplaceCharacterEntities(nsAWritableString& aStr,
PRUint32 aOffset)
{
nsReadingIterator<PRUnichar> done_reading;
aStr.EndReading(done_reading);
// for each chunk of |aString|...
PRUint32 fragmentLength = 0;
PRUint32 offset = aOffset;
nsReadingIterator<PRUnichar> iter;
aStr.BeginReading(iter);
for (iter.advance(PRInt32(offset));
iter != done_reading;
iter.advance(PRInt32(fragmentLength))) {
fragmentLength = iter.size_forward();
const PRUnichar* c = iter.get();
const PRUnichar* fragmentEnd = c + fragmentLength;
// for each character in this chunk...
for (; c < fragmentEnd; c++, offset++) {
PRUnichar val = *c;
if ((val <= kGTVal) && (kEntities[val][0] != 0)) {
aStr.Cut(offset, 1);
aStr.Insert(NS_LITERAL_STRING(kEntities[val]), offset);
aStr.EndReading(done_reading);
aStr.BeginReading(iter);
fragmentLength = offset+nsCRT::strlen(kEntities[val]);
break;
}
}
}
}
nsresult
nsXMLContentSerializer::AppendTextData(nsIDOMNode* aNode,
PRInt32 aStartOffset,
PRInt32 aEndOffset,
nsAWritableString& aStr)
nsAWritableString& aStr,
PRBool aTranslateEntities)
{
nsCOMPtr<nsITextContent> content = do_QueryInterface(aNode);
if (!content) return NS_ERROR_FAILURE;
const nsTextFragment* frag;
content->GetText(&frag);
if (frag) {
PRInt32 length = (aEndOffset == -1) ? frag->GetLength() : aEndOffset;
length -= aStartOffset;
PRInt32 length = ((aEndOffset == -1) ? frag->GetLength() : aEndOffset) - aStartOffset;
if (frag->Is2b()) {
aStr.Append(frag->Get2b()+aStartOffset, length);
AppendToString(nsLiteralString(frag->Get2b()+aStartOffset, length),
aStr,
aTranslateEntities);
}
else {
aStr.Append(NS_ConvertASCIItoUCS2(frag->Get1b()+aStartOffset, length));
AppendToString(NS_ConvertASCIItoUCS2(frag->Get1b()+aStartOffset, length),
aStr,
aTranslateEntities);
}
}
return NS_OK;
}
@@ -150,15 +108,8 @@ nsXMLContentSerializer::AppendText(nsIDOMText* aText,
{
NS_ENSURE_ARG(aText);
PRUint32 length = aStr.Length();
nsresult rv;
rv = AppendTextData(aText, aStartOffset, aEndOffset, aStr);
if (NS_FAILED(rv)) return NS_ERROR_FAILURE;
ReplaceCharacterEntities(aStr, length);
return NS_OK;
return AppendTextData(aText, aStartOffset, aEndOffset, aStr, PR_TRUE);
}
NS_IMETHODIMP
@@ -170,10 +121,10 @@ nsXMLContentSerializer::AppendCDATASection(nsIDOMCDATASection* aCDATASection,
NS_ENSURE_ARG(aCDATASection);
nsresult rv;
aStr.Append(NS_LITERAL_STRING("<![CDATA["));
rv = AppendTextData(aCDATASection, aStartOffset, aEndOffset, aStr);
AppendToString(NS_LITERAL_STRING("<![CDATA["), aStr);
rv = AppendTextData(aCDATASection, aStartOffset, aEndOffset, aStr, PR_FALSE);
if (NS_FAILED(rv)) return NS_ERROR_FAILURE;
aStr.Append(NS_LITERAL_STRING("]]>"));
AppendToString(NS_LITERAL_STRING("]]>"), aStr);
return NS_OK;
}
@@ -194,13 +145,13 @@ nsXMLContentSerializer::AppendProcessingInstruction(nsIDOMProcessingInstruction*
rv = aPI->GetData(data);
if (NS_FAILED(rv)) return NS_ERROR_FAILURE;
aStr.Append(NS_LITERAL_STRING("<?"));
aStr.Append(target);
AppendToString(NS_LITERAL_STRING("<?"), aStr);
AppendToString(target, aStr);
if (data.Length() > 0) {
aStr.Append(NS_LITERAL_STRING(" "));
aStr.Append(data);
AppendToString(NS_LITERAL_STRING(" "), aStr);
AppendToString(data, aStr);
}
aStr.Append(NS_LITERAL_STRING(">"));
AppendToString(NS_LITERAL_STRING(">"), aStr);
return NS_OK;
}
@@ -218,19 +169,19 @@ nsXMLContentSerializer::AppendComment(nsIDOMComment* aComment,
rv = aComment->GetData(data);
if (NS_FAILED(rv)) return NS_ERROR_FAILURE;
aStr.Append(NS_LITERAL_STRING("<!--"));
AppendToString(NS_LITERAL_STRING("<!--"), aStr);
if (aStartOffset || (aEndOffset != -1)) {
PRInt32 length = (aEndOffset == -1) ? data.Length() : aEndOffset;
length -= aStartOffset;
nsAutoString frag;
data.Mid(frag, aStartOffset, length);
aStr.Append(frag);
AppendToString(frag, aStr);
}
else {
aStr.Append(data);
AppendToString(data, aStr);
}
aStr.Append(NS_LITERAL_STRING("-->"));
AppendToString(NS_LITERAL_STRING("-->"), aStr);
return NS_OK;
}
@@ -252,30 +203,30 @@ nsXMLContentSerializer::AppendDoctype(nsIDOMDocumentType *aDoctype,
rv = aDoctype->GetInternalSubset(publicId);
if (NS_FAILED(rv)) return NS_ERROR_FAILURE;
aStr.Append(NS_LITERAL_STRING("<!DOCTYPE "));
aStr.Append(name);
AppendToString(NS_LITERAL_STRING("<!DOCTYPE "), aStr);
AppendToString(name, aStr);
PRUnichar quote;
if (publicId.Length() > 0) {
aStr.Append(NS_LITERAL_STRING(" PUBLIC "));
AppendToString(NS_LITERAL_STRING(" PUBLIC "), aStr);
if (publicId.FindChar(PRUnichar('"')) == -1) {
quote = PRUnichar('"');
}
else {
quote = PRUnichar('\'');
}
aStr.Append(quote);
aStr.Append(publicId);
aStr.Append(quote);
aStr.Append(PRUnichar(' '));
AppendToString(quote, aStr);
AppendToString(publicId, aStr);
AppendToString(quote, aStr);
AppendToString(PRUnichar(' '), aStr);
if (systemId.FindChar(PRUnichar('"')) == -1) {
quote = PRUnichar('"');
}
else {
quote = PRUnichar('\'');
}
aStr.Append(quote);
aStr.Append(systemId);
aStr.Append(quote);
AppendToString(quote, aStr);
AppendToString(systemId, aStr);
AppendToString(quote, aStr);
}
else if (systemId.Length() > 0) {
if (systemId.FindChar(PRUnichar('"')) == -1) {
@@ -284,18 +235,18 @@ nsXMLContentSerializer::AppendDoctype(nsIDOMDocumentType *aDoctype,
else {
quote = PRUnichar('\'');
}
aStr.Append(NS_LITERAL_STRING(" SYSTEM "));
aStr.Append(quote);
aStr.Append(systemId);
aStr.Append(quote);
AppendToString(NS_LITERAL_STRING(" SYSTEM "), aStr);
AppendToString(quote, aStr);
AppendToString(systemId, aStr);
AppendToString(quote, aStr);
}
if (internalSubset.Length() > 0) {
aStr.Append(PRUnichar(' '));
aStr.Append(internalSubset);
AppendToString(PRUnichar(' '), aStr);
AppendToString(internalSubset, aStr);
}
aStr.Append(NS_LITERAL_STRING(">"));
AppendToString(NS_LITERAL_STRING(">"), aStr);
return NS_OK;
}
@@ -402,16 +353,16 @@ nsXMLContentSerializer::SerializeAttr(const nsAReadableString& aPrefix,
const nsAReadableString& aValue,
nsAWritableString& aStr)
{
aStr.Append(NS_LITERAL_STRING(" "));
AppendToString(PRUnichar(' '), aStr);
if (aPrefix.Length() > 0) {
aStr.Append(aPrefix);
aStr.Append(NS_LITERAL_STRING(":"));
AppendToString(aPrefix, aStr);
AppendToString(NS_LITERAL_STRING(":"), aStr);
}
aStr.Append(aName);
AppendToString(aName, aStr);
aStr.Append(NS_LITERAL_STRING("=\""));
aStr.Append(aValue);
aStr.Append(NS_LITERAL_STRING("\""));
AppendToString(NS_LITERAL_STRING("=\""), aStr);
AppendToString(aValue, aStr, PR_TRUE);
AppendToString(NS_LITERAL_STRING("\""), aStr);
}
NS_IMETHODIMP
@@ -469,12 +420,12 @@ nsXMLContentSerializer::AppendElementStart(nsIDOMElement *aElement,
// Serialize the qualified name of the element
addNSAttr = ConfirmPrefix(tagPrefix, tagNamespaceURI);
aStr.Append(NS_LITERAL_STRING("<"));
AppendToString(NS_LITERAL_STRING("<"), aStr);
if (tagPrefix.Length() > 0) {
aStr.Append(tagPrefix);
aStr.Append(NS_LITERAL_STRING(":"));
AppendToString(tagPrefix, aStr);
AppendToString(NS_LITERAL_STRING(":"), aStr);
}
aStr.Append(tagLocalName);
AppendToString(tagLocalName, aStr);
// If we had to add a new namespace declaration, serialize
// and push it on the namespace stack
@@ -517,7 +468,6 @@ nsXMLContentSerializer::AppendElementStart(nsIDOMElement *aElement,
content->GetAttribute(namespaceID, attrName, valueStr);
attrName->ToString(nameStr);
ReplaceCharacterEntities(valueStr, 0);
SerializeAttr(prefixStr, nameStr, valueStr, aStr);
if (addNSAttr) {
@@ -526,7 +476,7 @@ nsXMLContentSerializer::AppendElementStart(nsIDOMElement *aElement,
}
}
aStr.Append(NS_LITERAL_STRING(">"));
AppendToString(NS_LITERAL_STRING(">"), aStr);
return NS_OK;
}
@@ -544,15 +494,86 @@ nsXMLContentSerializer::AppendElementEnd(nsIDOMElement *aElement,
aElement->GetNamespaceURI(tagNamespaceURI);
ConfirmPrefix(tagPrefix, tagNamespaceURI);
aStr.Append(NS_LITERAL_STRING("</"));
AppendToString(NS_LITERAL_STRING("</"), aStr);
if (tagPrefix.Length() > 0) {
aStr.Append(tagPrefix);
aStr.Append(NS_LITERAL_STRING(":"));
AppendToString(tagPrefix, aStr);
AppendToString(NS_LITERAL_STRING(":"), aStr);
}
aStr.Append(tagLocalName);
aStr.Append(NS_LITERAL_STRING(">"));
AppendToString(tagLocalName, aStr);
AppendToString(NS_LITERAL_STRING(">"), aStr);
PopNameSpaceDeclsFor(aElement);
return NS_OK;
}
void
nsXMLContentSerializer::AppendToString(const PRUnichar* aStr,
PRInt32 aLength,
nsAWritableString& aOutputStr)
{
PRInt32 length = (aLength == -1) ? nsCRT::strlen(aStr) : aLength;
aOutputStr.Append(aStr, length);
}
void
nsXMLContentSerializer::AppendToString(const PRUnichar aChar,
nsAWritableString& aOutputStr)
{
aOutputStr.Append(aChar);
}
static PRUint16 kGTVal = 62;
static const char* kEntities[] = {
"", "", "", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "", "", "",
"", "", "", "", "&quot;", "", "", "", "&amp;", "&apos;",
"", "", "", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "", "", "",
"&lt;", "", "&gt;"
};
void
nsXMLContentSerializer::AppendToString(const nsAReadableString& aStr,
nsAWritableString& aOutputStr,
PRBool aTranslateEntities)
{
if (aTranslateEntities) {
nsReadingIterator<PRUnichar> done_reading;
aStr.EndReading(done_reading);
// for each chunk of |aString|...
PRUint32 advanceLength = 0;
nsReadingIterator<PRUnichar> iter;
for (aStr.BeginReading(iter);
iter != done_reading;
iter.advance(PRInt32(advanceLength))) {
PRUint32 fragmentLength = iter.size_forward();
const PRUnichar* c = iter.get();
const PRUnichar* fragmentStart = c;
const PRUnichar* fragmentEnd = c + fragmentLength;
const char* entityText = nsnull;
// for each character in this chunk, check if it
// needs to be replaced
for (; c < fragmentEnd; c++, advanceLength++) {
PRUnichar val = *c;
if ((val <= kGTVal) && (kEntities[val][0] != 0)) {
entityText = kEntities[val];
break;
}
}
aOutputStr.Append(fragmentStart, advanceLength);
if (entityText) {
aOutputStr.Append(NS_ConvertASCIItoUCS2(entityText));
advanceLength++;
}
}
}
aOutputStr.Append(aStr);
}

View File

@@ -64,12 +64,19 @@ class nsXMLContentSerializer : public nsIContentSerializer {
nsAWritableString& aStr);
protected:
virtual void ReplaceCharacterEntities(nsAWritableString& aStr,
PRUint32 aOffset);
virtual void AppendToString(const PRUnichar* aStr,
PRInt32 aLength,
nsAWritableString& aOutputStr);
virtual void AppendToString(const PRUnichar aChar,
nsAWritableString& aOutputStr);
virtual void AppendToString(const nsAReadableString& aStr,
nsAWritableString& aOutputStr,
PRBool aTranslateEntities = PR_FALSE);
nsresult AppendTextData(nsIDOMNode* aNode,
PRInt32 aStartOffset,
PRInt32 aEndOffset,
nsAWritableString& aStr);
nsAWritableString& aStr,
PRBool aTranslateEntities);
virtual nsresult PushNameSpaceDecl(const nsAReadableString& aPrefix,
const nsAReadableString& aURI,
nsIDOMElement* aOwner);

View File

@@ -112,19 +112,15 @@ nsHTMLContentSerializer::Init(PRUint32 aFlags, PRUint32 aWrapColumn)
if ((mFlags & nsIDocumentEncoder::OutputCRLineBreak)
&& (mFlags & nsIDocumentEncoder::OutputLFLineBreak)) { // Windows/mail
mLineBreak.AssignWithConversion("\r\n");
mLineBreakLen = 2;
}
else if (mFlags & nsIDocumentEncoder::OutputCRLineBreak) { // Mac
mLineBreak.AssignWithConversion("\r");
mLineBreakLen = 1;
}
else if (mFlags & nsIDocumentEncoder::OutputLFLineBreak) { // Unix/DOM
mLineBreak.AssignWithConversion("\n");
mLineBreakLen = 1;
}
else {
mLineBreak.AssignWithConversion(NS_LINEBREAK); // Platform/default
mLineBreakLen = NS_LINEBREAK_LEN;
}
mPreLevel = 0;
@@ -144,20 +140,14 @@ nsHTMLContentSerializer::AppendText(nsIDOMText* aText,
nsresult rv;
rv = AppendTextData((nsIDOMNode*)aText, aStartOffset,
aEndOffset, data);
aEndOffset, data, PR_TRUE);
if (NS_FAILED(rv)) return NS_ERROR_FAILURE;
if (mPreLevel || (!mDoFormat && !HasLongLines(data))) {
AppendToString(data,
data.Length(),
aStr,
PR_TRUE);
AppendToString(data, aStr);
}
else {
AppendToStringWrapped(data,
data.Length(),
aStr,
PR_TRUE);
AppendToStringWrapped(data, aStr, PR_FALSE);
}
return NS_OK;
@@ -254,7 +244,7 @@ nsHTMLContentSerializer::AppendElementStart(nsIDOMElement *aElement,
}
if (LineBreakBeforeOpen(name, hasDirtyAttr)) {
AppendToString(mLineBreak, mLineBreakLen, aStr);
AppendToString(mLineBreak, aStr);
mColPos = 0;
}
@@ -264,18 +254,18 @@ nsHTMLContentSerializer::AppendElementStart(nsIDOMElement *aElement,
StartIndentation(name, hasDirtyAttr, aStr);
AppendToString(NS_LITERAL_STRING(kLessThan), -1, aStr);
AppendToString(NS_LITERAL_STRING(kLessThan), aStr);
nsXPIDLString sharedName;
name->GetUnicode(getter_Shares(sharedName));
AppendToString(sharedName, nsCRT::strlen(sharedName), aStr);
AppendToString(sharedName, -1, aStr);
SerializeAttributes(content, name, aStr);
AppendToString(NS_LITERAL_STRING(kGreaterThan), -1, aStr);
AppendToString(NS_LITERAL_STRING(kGreaterThan), aStr);
if (LineBreakAfterOpen(name, hasDirtyAttr)) {
AppendToString(mLineBreak, mLineBreakLen, aStr);
AppendToString(mLineBreak, aStr);
mColPos = 0;
}
@@ -314,18 +304,18 @@ nsHTMLContentSerializer::AppendElementEnd(nsIDOMElement *aElement,
}
if (LineBreakBeforeClose(name, hasDirtyAttr)) {
AppendToString(mLineBreak, mLineBreakLen, aStr);
AppendToString(mLineBreak, aStr);
mColPos = 0;
}
EndIndentation(name, hasDirtyAttr, aStr);
AppendToString(NS_LITERAL_STRING(kEndTag), -1, aStr);
AppendToString(NS_LITERAL_STRING(kEndTag), aStr);
AppendToString(sharedName, -1, aStr);
AppendToString(NS_LITERAL_STRING(kGreaterThan), -1, aStr);
AppendToString(NS_LITERAL_STRING(kGreaterThan), aStr);
if (LineBreakAfterClose(name, hasDirtyAttr)) {
AppendToString(mLineBreak, mLineBreakLen, aStr);
AppendToString(mLineBreak, aStr);
mColPos = 0;
}
@@ -345,19 +335,31 @@ nsHTMLContentSerializer::AppendToString(const PRUnichar* aStr,
mColPos += length;
aOutputStr.Append(aStr);
aOutputStr.Append(aStr, length);
}
void
nsHTMLContentSerializer::AppendToString(const PRUnichar aChar,
nsAWritableString& aOutputStr)
{
if (mBodyOnly && !mInBody) {
return;
}
mColPos += 1;
aOutputStr.Append(aChar);
}
void
nsHTMLContentSerializer::AppendToStringWrapped(const nsAReadableString& aStr,
PRInt32 aLength,
nsAWritableString& aOutputStr,
PRBool aTranslateEntities)
{
PRInt32 length = (aLength == -1) ? aStr.Length() : aLength;
PRInt32 length = aStr.Length();
if ((mColPos + length) < mMaxColumn) {
AppendToString(aStr, length, aOutputStr, aTranslateEntities);
AppendToString(aStr, aOutputStr, aTranslateEntities);
}
else {
nsAutoString line;
@@ -377,22 +379,20 @@ nsHTMLContentSerializer::AppendToStringWrapped(const nsAReadableString& aStr,
if (indx == kNotFound)
{
if (strOffset == 0) {
AppendToString(aStr, length, aOutputStr, aTranslateEntities);
AppendToString(aStr, aOutputStr, aTranslateEntities);
}
else {
lineLength = length - strOffset;
aStr.Right(line, lineLength);
AppendToString(line, lineLength,
aOutputStr, aTranslateEntities);
AppendToString(line, aOutputStr, aTranslateEntities);
}
done = PR_TRUE;
}
else {
lineLength = indx - strOffset;
aStr.Mid(line, strOffset, lineLength);
AppendToString(line, lineLength,
aOutputStr, aTranslateEntities);
AppendToString(mLineBreak, mLineBreakLen, aOutputStr);
AppendToString(line, aOutputStr, aTranslateEntities);
AppendToString(mLineBreak, aOutputStr);
strOffset = indx+1;
mColPos = 0;
}
@@ -402,7 +402,6 @@ nsHTMLContentSerializer::AppendToStringWrapped(const nsAReadableString& aStr,
void
nsHTMLContentSerializer::AppendToString(const nsAReadableString& aStr,
PRInt32 aLength,
nsAWritableString& aOutputStr,
PRBool aTranslateEntities)
{
@@ -411,9 +410,8 @@ nsHTMLContentSerializer::AppendToString(const nsAReadableString& aStr,
}
nsresult rv;
PRInt32 length = (aLength == -1) ? aStr.Length() : aLength;
mColPos += length;
mColPos += aStr.Length();
if (aTranslateEntities) {
nsCOMPtr<nsIEntityConverter> converter;

View File

@@ -63,17 +63,17 @@ class nsHTMLContentSerializer : public nsXMLContentSerializer {
void SerializeAttributes(nsIContent* aContent,
nsIAtom* aTagName,
nsAWritableString& aStr);
void AppendToString(const PRUnichar* aStr,
PRInt32 aLength,
nsAWritableString& aOutputStr);
void AppendToString(const nsAReadableString& aStr,
PRInt32 aLength,
nsAWritableString& aOutputStr,
PRBool aTranslateEntities = PR_FALSE);
void AppendToStringWrapped(const nsAReadableString& aStr,
PRInt32 aLength,
nsAWritableString& aOutputStr,
PRBool aTranslateEntities);
virtual void AppendToString(const PRUnichar* aStr,
PRInt32 aLength,
nsAWritableString& aOutputStr);
virtual void AppendToString(const PRUnichar aChar,
nsAWritableString& aOutputStr);
virtual void AppendToString(const nsAReadableString& aStr,
nsAWritableString& aOutputStr,
PRBool aTranslateEntities = PR_FALSE);
virtual void AppendToStringWrapped(const nsAReadableString& aStr,
nsAWritableString& aOutputStr,
PRBool aTranslateEntities);
PRBool HasLongLines(const nsString& text);
nsCOMPtr<nsIParserService> mParserService;
@@ -92,7 +92,6 @@ class nsHTMLContentSerializer : public nsXMLContentSerializer {
PRInt32 mMaxColumn;
nsString mLineBreak;
PRInt32 mLineBreakLen;
};
extern nsresult NS_NewHTMLContentSerializer(nsIContentSerializer** aSerializer);

View File

@@ -70,75 +70,33 @@ nsXMLContentSerializer::Init(PRUint32 flags, PRUint32 aWrapColumn)
return NS_OK;
}
static PRUint16 kGTVal = 62;
static const char* kEntities[] = {
"", "", "", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "", "", "",
"", "", "", "", "&quot;", "", "", "", "&amp;", "&apos;",
"", "", "", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "", "", "",
"&lt;", "", "&gt;"
};
void
nsXMLContentSerializer::ReplaceCharacterEntities(nsAWritableString& aStr,
PRUint32 aOffset)
{
nsReadingIterator<PRUnichar> done_reading;
aStr.EndReading(done_reading);
// for each chunk of |aString|...
PRUint32 fragmentLength = 0;
PRUint32 offset = aOffset;
nsReadingIterator<PRUnichar> iter;
aStr.BeginReading(iter);
for (iter.advance(PRInt32(offset));
iter != done_reading;
iter.advance(PRInt32(fragmentLength))) {
fragmentLength = iter.size_forward();
const PRUnichar* c = iter.get();
const PRUnichar* fragmentEnd = c + fragmentLength;
// for each character in this chunk...
for (; c < fragmentEnd; c++, offset++) {
PRUnichar val = *c;
if ((val <= kGTVal) && (kEntities[val][0] != 0)) {
aStr.Cut(offset, 1);
aStr.Insert(NS_LITERAL_STRING(kEntities[val]), offset);
aStr.EndReading(done_reading);
aStr.BeginReading(iter);
fragmentLength = offset+nsCRT::strlen(kEntities[val]);
break;
}
}
}
}
nsresult
nsXMLContentSerializer::AppendTextData(nsIDOMNode* aNode,
PRInt32 aStartOffset,
PRInt32 aEndOffset,
nsAWritableString& aStr)
nsAWritableString& aStr,
PRBool aTranslateEntities)
{
nsCOMPtr<nsITextContent> content = do_QueryInterface(aNode);
if (!content) return NS_ERROR_FAILURE;
const nsTextFragment* frag;
content->GetText(&frag);
if (frag) {
PRInt32 length = (aEndOffset == -1) ? frag->GetLength() : aEndOffset;
length -= aStartOffset;
PRInt32 length = ((aEndOffset == -1) ? frag->GetLength() : aEndOffset) - aStartOffset;
if (frag->Is2b()) {
aStr.Append(frag->Get2b()+aStartOffset, length);
AppendToString(nsLiteralString(frag->Get2b()+aStartOffset, length),
aStr,
aTranslateEntities);
}
else {
aStr.Append(NS_ConvertASCIItoUCS2(frag->Get1b()+aStartOffset, length));
AppendToString(NS_ConvertASCIItoUCS2(frag->Get1b()+aStartOffset, length),
aStr,
aTranslateEntities);
}
}
return NS_OK;
}
@@ -150,15 +108,8 @@ nsXMLContentSerializer::AppendText(nsIDOMText* aText,
{
NS_ENSURE_ARG(aText);
PRUint32 length = aStr.Length();
nsresult rv;
rv = AppendTextData(aText, aStartOffset, aEndOffset, aStr);
if (NS_FAILED(rv)) return NS_ERROR_FAILURE;
ReplaceCharacterEntities(aStr, length);
return NS_OK;
return AppendTextData(aText, aStartOffset, aEndOffset, aStr, PR_TRUE);
}
NS_IMETHODIMP
@@ -170,10 +121,10 @@ nsXMLContentSerializer::AppendCDATASection(nsIDOMCDATASection* aCDATASection,
NS_ENSURE_ARG(aCDATASection);
nsresult rv;
aStr.Append(NS_LITERAL_STRING("<![CDATA["));
rv = AppendTextData(aCDATASection, aStartOffset, aEndOffset, aStr);
AppendToString(NS_LITERAL_STRING("<![CDATA["), aStr);
rv = AppendTextData(aCDATASection, aStartOffset, aEndOffset, aStr, PR_FALSE);
if (NS_FAILED(rv)) return NS_ERROR_FAILURE;
aStr.Append(NS_LITERAL_STRING("]]>"));
AppendToString(NS_LITERAL_STRING("]]>"), aStr);
return NS_OK;
}
@@ -194,13 +145,13 @@ nsXMLContentSerializer::AppendProcessingInstruction(nsIDOMProcessingInstruction*
rv = aPI->GetData(data);
if (NS_FAILED(rv)) return NS_ERROR_FAILURE;
aStr.Append(NS_LITERAL_STRING("<?"));
aStr.Append(target);
AppendToString(NS_LITERAL_STRING("<?"), aStr);
AppendToString(target, aStr);
if (data.Length() > 0) {
aStr.Append(NS_LITERAL_STRING(" "));
aStr.Append(data);
AppendToString(NS_LITERAL_STRING(" "), aStr);
AppendToString(data, aStr);
}
aStr.Append(NS_LITERAL_STRING(">"));
AppendToString(NS_LITERAL_STRING(">"), aStr);
return NS_OK;
}
@@ -218,19 +169,19 @@ nsXMLContentSerializer::AppendComment(nsIDOMComment* aComment,
rv = aComment->GetData(data);
if (NS_FAILED(rv)) return NS_ERROR_FAILURE;
aStr.Append(NS_LITERAL_STRING("<!--"));
AppendToString(NS_LITERAL_STRING("<!--"), aStr);
if (aStartOffset || (aEndOffset != -1)) {
PRInt32 length = (aEndOffset == -1) ? data.Length() : aEndOffset;
length -= aStartOffset;
nsAutoString frag;
data.Mid(frag, aStartOffset, length);
aStr.Append(frag);
AppendToString(frag, aStr);
}
else {
aStr.Append(data);
AppendToString(data, aStr);
}
aStr.Append(NS_LITERAL_STRING("-->"));
AppendToString(NS_LITERAL_STRING("-->"), aStr);
return NS_OK;
}
@@ -252,30 +203,30 @@ nsXMLContentSerializer::AppendDoctype(nsIDOMDocumentType *aDoctype,
rv = aDoctype->GetInternalSubset(publicId);
if (NS_FAILED(rv)) return NS_ERROR_FAILURE;
aStr.Append(NS_LITERAL_STRING("<!DOCTYPE "));
aStr.Append(name);
AppendToString(NS_LITERAL_STRING("<!DOCTYPE "), aStr);
AppendToString(name, aStr);
PRUnichar quote;
if (publicId.Length() > 0) {
aStr.Append(NS_LITERAL_STRING(" PUBLIC "));
AppendToString(NS_LITERAL_STRING(" PUBLIC "), aStr);
if (publicId.FindChar(PRUnichar('"')) == -1) {
quote = PRUnichar('"');
}
else {
quote = PRUnichar('\'');
}
aStr.Append(quote);
aStr.Append(publicId);
aStr.Append(quote);
aStr.Append(PRUnichar(' '));
AppendToString(quote, aStr);
AppendToString(publicId, aStr);
AppendToString(quote, aStr);
AppendToString(PRUnichar(' '), aStr);
if (systemId.FindChar(PRUnichar('"')) == -1) {
quote = PRUnichar('"');
}
else {
quote = PRUnichar('\'');
}
aStr.Append(quote);
aStr.Append(systemId);
aStr.Append(quote);
AppendToString(quote, aStr);
AppendToString(systemId, aStr);
AppendToString(quote, aStr);
}
else if (systemId.Length() > 0) {
if (systemId.FindChar(PRUnichar('"')) == -1) {
@@ -284,18 +235,18 @@ nsXMLContentSerializer::AppendDoctype(nsIDOMDocumentType *aDoctype,
else {
quote = PRUnichar('\'');
}
aStr.Append(NS_LITERAL_STRING(" SYSTEM "));
aStr.Append(quote);
aStr.Append(systemId);
aStr.Append(quote);
AppendToString(NS_LITERAL_STRING(" SYSTEM "), aStr);
AppendToString(quote, aStr);
AppendToString(systemId, aStr);
AppendToString(quote, aStr);
}
if (internalSubset.Length() > 0) {
aStr.Append(PRUnichar(' '));
aStr.Append(internalSubset);
AppendToString(PRUnichar(' '), aStr);
AppendToString(internalSubset, aStr);
}
aStr.Append(NS_LITERAL_STRING(">"));
AppendToString(NS_LITERAL_STRING(">"), aStr);
return NS_OK;
}
@@ -402,16 +353,16 @@ nsXMLContentSerializer::SerializeAttr(const nsAReadableString& aPrefix,
const nsAReadableString& aValue,
nsAWritableString& aStr)
{
aStr.Append(NS_LITERAL_STRING(" "));
AppendToString(PRUnichar(' '), aStr);
if (aPrefix.Length() > 0) {
aStr.Append(aPrefix);
aStr.Append(NS_LITERAL_STRING(":"));
AppendToString(aPrefix, aStr);
AppendToString(NS_LITERAL_STRING(":"), aStr);
}
aStr.Append(aName);
AppendToString(aName, aStr);
aStr.Append(NS_LITERAL_STRING("=\""));
aStr.Append(aValue);
aStr.Append(NS_LITERAL_STRING("\""));
AppendToString(NS_LITERAL_STRING("=\""), aStr);
AppendToString(aValue, aStr, PR_TRUE);
AppendToString(NS_LITERAL_STRING("\""), aStr);
}
NS_IMETHODIMP
@@ -469,12 +420,12 @@ nsXMLContentSerializer::AppendElementStart(nsIDOMElement *aElement,
// Serialize the qualified name of the element
addNSAttr = ConfirmPrefix(tagPrefix, tagNamespaceURI);
aStr.Append(NS_LITERAL_STRING("<"));
AppendToString(NS_LITERAL_STRING("<"), aStr);
if (tagPrefix.Length() > 0) {
aStr.Append(tagPrefix);
aStr.Append(NS_LITERAL_STRING(":"));
AppendToString(tagPrefix, aStr);
AppendToString(NS_LITERAL_STRING(":"), aStr);
}
aStr.Append(tagLocalName);
AppendToString(tagLocalName, aStr);
// If we had to add a new namespace declaration, serialize
// and push it on the namespace stack
@@ -517,7 +468,6 @@ nsXMLContentSerializer::AppendElementStart(nsIDOMElement *aElement,
content->GetAttribute(namespaceID, attrName, valueStr);
attrName->ToString(nameStr);
ReplaceCharacterEntities(valueStr, 0);
SerializeAttr(prefixStr, nameStr, valueStr, aStr);
if (addNSAttr) {
@@ -526,7 +476,7 @@ nsXMLContentSerializer::AppendElementStart(nsIDOMElement *aElement,
}
}
aStr.Append(NS_LITERAL_STRING(">"));
AppendToString(NS_LITERAL_STRING(">"), aStr);
return NS_OK;
}
@@ -544,15 +494,86 @@ nsXMLContentSerializer::AppendElementEnd(nsIDOMElement *aElement,
aElement->GetNamespaceURI(tagNamespaceURI);
ConfirmPrefix(tagPrefix, tagNamespaceURI);
aStr.Append(NS_LITERAL_STRING("</"));
AppendToString(NS_LITERAL_STRING("</"), aStr);
if (tagPrefix.Length() > 0) {
aStr.Append(tagPrefix);
aStr.Append(NS_LITERAL_STRING(":"));
AppendToString(tagPrefix, aStr);
AppendToString(NS_LITERAL_STRING(":"), aStr);
}
aStr.Append(tagLocalName);
aStr.Append(NS_LITERAL_STRING(">"));
AppendToString(tagLocalName, aStr);
AppendToString(NS_LITERAL_STRING(">"), aStr);
PopNameSpaceDeclsFor(aElement);
return NS_OK;
}
void
nsXMLContentSerializer::AppendToString(const PRUnichar* aStr,
PRInt32 aLength,
nsAWritableString& aOutputStr)
{
PRInt32 length = (aLength == -1) ? nsCRT::strlen(aStr) : aLength;
aOutputStr.Append(aStr, length);
}
void
nsXMLContentSerializer::AppendToString(const PRUnichar aChar,
nsAWritableString& aOutputStr)
{
aOutputStr.Append(aChar);
}
static PRUint16 kGTVal = 62;
static const char* kEntities[] = {
"", "", "", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "", "", "",
"", "", "", "", "&quot;", "", "", "", "&amp;", "&apos;",
"", "", "", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "", "", "",
"&lt;", "", "&gt;"
};
void
nsXMLContentSerializer::AppendToString(const nsAReadableString& aStr,
nsAWritableString& aOutputStr,
PRBool aTranslateEntities)
{
if (aTranslateEntities) {
nsReadingIterator<PRUnichar> done_reading;
aStr.EndReading(done_reading);
// for each chunk of |aString|...
PRUint32 advanceLength = 0;
nsReadingIterator<PRUnichar> iter;
for (aStr.BeginReading(iter);
iter != done_reading;
iter.advance(PRInt32(advanceLength))) {
PRUint32 fragmentLength = iter.size_forward();
const PRUnichar* c = iter.get();
const PRUnichar* fragmentStart = c;
const PRUnichar* fragmentEnd = c + fragmentLength;
const char* entityText = nsnull;
// for each character in this chunk, check if it
// needs to be replaced
for (; c < fragmentEnd; c++, advanceLength++) {
PRUnichar val = *c;
if ((val <= kGTVal) && (kEntities[val][0] != 0)) {
entityText = kEntities[val];
break;
}
}
aOutputStr.Append(fragmentStart, advanceLength);
if (entityText) {
aOutputStr.Append(NS_ConvertASCIItoUCS2(entityText));
advanceLength++;
}
}
}
aOutputStr.Append(aStr);
}

View File

@@ -64,12 +64,19 @@ class nsXMLContentSerializer : public nsIContentSerializer {
nsAWritableString& aStr);
protected:
virtual void ReplaceCharacterEntities(nsAWritableString& aStr,
PRUint32 aOffset);
virtual void AppendToString(const PRUnichar* aStr,
PRInt32 aLength,
nsAWritableString& aOutputStr);
virtual void AppendToString(const PRUnichar aChar,
nsAWritableString& aOutputStr);
virtual void AppendToString(const nsAReadableString& aStr,
nsAWritableString& aOutputStr,
PRBool aTranslateEntities = PR_FALSE);
nsresult AppendTextData(nsIDOMNode* aNode,
PRInt32 aStartOffset,
PRInt32 aEndOffset,
nsAWritableString& aStr);
nsAWritableString& aStr,
PRBool aTranslateEntities);
virtual nsresult PushNameSpaceDecl(const nsAReadableString& aPrefix,
const nsAReadableString& aURI,
nsIDOMElement* aOwner);