Bug 380689 - Import & Export separators titles. r=sspitzer.

This commit is contained in:
mozilla.mano@sent.com 2007-05-14 21:18:25 -07:00
Родитель 1355c9bb8a
Коммит eb9309e413
2 изменённых файлов: 59 добавлений и 9 удалений

Просмотреть файл

@ -117,6 +117,7 @@ static NS_DEFINE_CID(kParserCID, NS_PARSER_CID);
#define KEY_SHORTCUTURL_LOWER "shortcuturl"
#define KEY_POST_DATA_LOWER "post_data"
#define KEY_ID_LOWER "id"
#define KEY_NAME_LOWER "name"
#define LOAD_IN_SIDEBAR_ANNO NS_LITERAL_CSTRING("bookmarkProperties/loadInSidebar")
#define DESCRIPTION_ANNO NS_LITERAL_CSTRING("bookmarkProperties/description")
@ -378,7 +379,7 @@ protected:
void HandleHeadEnd();
void HandleLinkBegin(const nsIParserNode& node);
void HandleLinkEnd();
void HandleSeparator();
void HandleSeparator(const nsIParserNode& node);
// This is a list of frames. We really want a recursive parser, but the HTML
// parser gives us tags as a stream. This implements all the state on a stack
@ -576,7 +577,7 @@ BookmarkContentSink::AddLeaf(const nsIParserNode& aNode)
CurFrame().mPreviousText.Append(PRUnichar(' '));
break;
case eHTMLTag_hr:
HandleSeparator();
HandleSeparator(aNode);
break;
}
@ -924,7 +925,7 @@ BookmarkContentSink::HandleLinkEnd()
//
// Inserts a separator into the current container
void
BookmarkContentSink::HandleSeparator()
BookmarkContentSink::HandleSeparator(const nsIParserNode& node)
{
BookmarkImportFrame& frame = CurFrame();
@ -941,6 +942,19 @@ BookmarkContentSink::HandleSeparator()
mBookmarksService->InsertSeparator(frame.mContainerID,
mBookmarksService->DEFAULT_INDEX,
&itemId);
// Import separator title if set
nsAutoString name;
PRInt32 attrCount = node.GetAttributeCount();
for (PRInt32 i = 0; i < attrCount; i ++) {
const nsAString& key = node.GetKeyAt(i);
if (key.LowerCaseEqualsLiteral(KEY_NAME_LOWER))
name = node.GetValueAt(i);
}
name.Trim(kWhitespace);
if (!name.IsEmpty())
mBookmarksService->SetItemTitle(itemId, name);
}
}
@ -1240,7 +1254,7 @@ static const char kContainerIntro[] = "<DT><H3";
static const char kContainerClose[] = "</H3>" NS_LINEBREAK;
static const char kItemOpen[] = "<DT><A";
static const char kItemClose[] = "</A>" NS_LINEBREAK;
static const char kSeparator[] = "<HR>" NS_LINEBREAK;
static const char kSeparator[] = "<HR";
static const char kQuoteStr[] = "\"";
static const char kCloseAngle[] = ">";
static const char kIndent[] = " ";
@ -1258,6 +1272,7 @@ static const char kWebPanelAttribute[] = " WEB_PANEL=\"true\"";
static const char kKeywordAttribute[] = " SHORTCUTURL=\"";
static const char kPostDataAttribute[] = " POST_DATA=\"";
static const char kIdAttribute[] = " ID=\"";
static const char kNameAttribute[] = " NAME=\"";
// WriteContainerPrologue
//
@ -1754,23 +1769,57 @@ nsPlacesImportExportService::WriteLivemark(PRInt64 aFolderId, const nsACString&
}
// WriteSeparator
// nsPlacesImportExportService::WriteSeparator
//
// "<HR>"
// "<HR NAME="...">"
nsresult
WriteSeparator(const nsCString& aIndent, nsIOutputStream* aOutput)
nsPlacesImportExportService::WriteSeparator(nsINavHistoryResultNode* aItem,
const nsACString& aIndent,
nsIOutputStream* aOutput)
{
PRUint32 dummy;
nsresult rv;
// indent
if (!aIndent.IsEmpty()) {
rv = aOutput->Write(aIndent.get(), aIndent.Length(), &dummy);
rv = aOutput->Write(PromiseFlatCString(aIndent).get(), aIndent.Length(),
&dummy);
NS_ENSURE_SUCCESS(rv, rv);
}
rv = aOutput->Write(kSeparator, sizeof(kSeparator)-1, &dummy);
// XXX: separator result nodes don't support the title getter yet
PRInt64 itemId;
rv = aItem->GetItemId(&itemId);
NS_ENSURE_SUCCESS(rv, rv);
nsAutoString title;
rv = mBookmarksService->GetItemTitle(itemId, title);
if (NS_SUCCEEDED(rv) && !title.IsEmpty()) {
rv = aOutput->Write(kNameAttribute, strlen(kNameAttribute), &dummy);
NS_ENSURE_SUCCESS(rv, rv);
char* escapedTitle = nsEscapeHTML(NS_ConvertUTF16toUTF8(title).get());
if (escapedTitle) {
PRUint32 dummy;
rv = aOutput->Write(escapedTitle, strlen(escapedTitle), &dummy);
nsMemory::Free(escapedTitle);
NS_ENSURE_SUCCESS(rv, rv);
rv = aOutput->Write(kQuoteStr, sizeof(kQuoteStr)-1, &dummy);
NS_ENSURE_SUCCESS(rv, rv);
}
}
// '>'
rv = aOutput->Write(kCloseAngle, sizeof(kCloseAngle)-1, &dummy);
NS_ENSURE_SUCCESS(rv, rv);
// line break
rv = aOutput->Write(NS_LINEBREAK, sizeof(NS_LINEBREAK)-1, &dummy);
NS_ENSURE_SUCCESS(rv, rv);
return rv;
}
@ -1882,7 +1931,7 @@ nsPlacesImportExportService::WriteContainerContents(PRInt64 aFolder, const nsACS
else
rv = WriteContainer(folderId, myIndent, aOutput);
} else if (type == nsINavHistoryResultNode::RESULT_TYPE_SEPARATOR) {
rv = WriteSeparator(myIndent, aOutput);
rv = WriteSeparator(child, myIndent, aOutput);
} else {
rv = WriteItem(child, myIndent, aOutput);
}

Просмотреть файл

@ -41,6 +41,7 @@ class nsPlacesImportExportService : public nsIPlacesImportExportService
nsresult WriteItem(nsINavHistoryResultNode* aItem, const nsACString& aIndent, nsIOutputStream* aOutput);
nsresult WriteLivemark(PRInt64 aFolderId, const nsACString& aIndent, nsIOutputStream* aOutput);
nsresult WriteContainerContents(PRInt64 aFolder, const nsACString& aIndent, nsIOutputStream* aOutput);
nsresult WriteSeparator(nsINavHistoryResultNode* aItem, const nsACString& aIndent, nsIOutputStream* aOutput);
nsresult WriteDescription(PRInt64 aId, PRInt32 aType, nsIOutputStream* aOutput);
nsresult ArchiveBookmarksFile(PRInt32 aNumberOfBackups, PRBool aForceArchive);