QList<BookmarksModel::Bookmark> HtmlImporter::exportBookmarks() { QList<BookmarksModel::Bookmark> list; QString bookmarks = QString::fromUtf8(m_file.readAll()); m_file.close(); // Converting tags to lower case -,- // For some reason Qt::CaseInsensitive is not everytime insensitive :-D bookmarks.replace("<DL", "<dl"); bookmarks.replace("</DL", "</dl"); bookmarks.replace("<DT", "<dt"); bookmarks.replace("</DT", "</dt"); bookmarks.replace("<P", "<p"); bookmarks.replace("</P", "</p"); bookmarks.replace("<A", "<a"); bookmarks.replace("</A", "</a"); bookmarks.replace("HREF=", "href="); bookmarks.replace("<H3", "<h3"); bookmarks.replace("</H3", "</h3"); bookmarks = bookmarks.left(bookmarks.lastIndexOf("</dl><p>")); int start = bookmarks.indexOf("<dl><p>"); QStringList folders("Html Import"); while (start > 0) { QString string = bookmarks.mid(start); int posOfFolder = string.indexOf("<dt><h3"); int posOfEndFolder = string.indexOf("</dl><p>"); int posOfLink = string.indexOf("<dt><a"); int nearest = qzMin(posOfLink, qzMin(posOfFolder, posOfEndFolder)); if (nearest == -1) { break; } if (nearest == posOfFolder) { // Next is folder QRegExp rx("<dt><h3(.*)>(.*)</h3>"); rx.setMinimal(true); rx.indexIn(string); // QString arguments = rx.cap(1); QString folderName = rx.cap(2); folders.append(folderName); start += posOfFolder + rx.cap(0).size(); } else if (nearest == posOfEndFolder) { // Next is end of folder if (!folders.isEmpty()) { folders.removeLast(); } start += posOfEndFolder + 8; } else { // Next is link QRegExp rx("<dt><a(.*)>(.*)</a>"); rx.setMinimal(true); rx.indexIn(string); QString arguments = rx.cap(1); QString linkName = rx.cap(2); QRegExp rx2("href=\"(.*)\""); rx2.setMinimal(true); rx2.indexIn(arguments); QUrl url = QUrl::fromEncoded(rx2.cap(1).toUtf8()); start += posOfLink + rx.cap(0).size(); if (linkName.isEmpty() || url.isEmpty() || url.scheme() == "place" || url.scheme() == "about") { continue; } BookmarksModel::Bookmark b; b.folder = folders.last(); b.title = linkName; b.url = url; list.append(b); } } return list; }
BookmarkItem* HtmlImporter::importBookmarks() { QString bookmarks = QString::fromUtf8(m_file.readAll()); m_file.close(); // Converting tags to lower case -,- // For some reason Qt::CaseInsensitive is not everytime insensitive :-D bookmarks.replace(QLatin1String("<DL"), QLatin1String("<dl")); bookmarks.replace(QLatin1String("</DL"), QLatin1String("</dl")); bookmarks.replace(QLatin1String("<DT"), QLatin1String("<dt")); bookmarks.replace(QLatin1String("</DT"), QLatin1String("</dt")); bookmarks.replace(QLatin1String("<P"), QLatin1String("<p")); bookmarks.replace(QLatin1String("</P"), QLatin1String("</p")); bookmarks.replace(QLatin1String("<A"), QLatin1String("<a")); bookmarks.replace(QLatin1String("</A"), QLatin1String("</a")); bookmarks.replace(QLatin1String("HREF="), QLatin1String("href=")); bookmarks.replace(QLatin1String("<H3"), QLatin1String("<h3")); bookmarks.replace(QLatin1String("</H3"), QLatin1String("</h3")); bookmarks = bookmarks.left(bookmarks.lastIndexOf(QLatin1String("</dl><p>"))); int start = bookmarks.indexOf(QLatin1String("<dl><p>")); BookmarkItem* root = new BookmarkItem(BookmarkItem::Folder); root->setTitle("HTML Import"); QList<BookmarkItem*> folders; folders.append(root); while (start > 0) { QString string = bookmarks.mid(start); int posOfFolder = string.indexOf(QLatin1String("<dt><h3")); int posOfEndFolder = string.indexOf(QLatin1String("</dl><p>")); int posOfLink = string.indexOf(QLatin1String("<dt><a")); int nearest = qzMin(posOfLink, qzMin(posOfFolder, posOfEndFolder)); if (nearest == -1) { break; } if (nearest == posOfFolder) { // Next is folder QzRegExp rx("<dt><h3(.*)>(.*)</h3>"); rx.setMinimal(true); rx.indexIn(string); // QString arguments = rx.cap(1); QString folderName = rx.cap(2).trimmed(); BookmarkItem* folder = new BookmarkItem(BookmarkItem::Folder, folders.isEmpty() ? root : folders.last()); folder->setTitle(folderName); folders.append(folder); start += posOfFolder + rx.cap(0).size(); } else if (nearest == posOfEndFolder) { // Next is end of folder if (!folders.isEmpty()) { folders.removeLast(); } start += posOfEndFolder + 8; } else { // Next is link QzRegExp rx("<dt><a(.*)>(.*)</a>"); rx.setMinimal(true); rx.indexIn(string); QString arguments = rx.cap(1); QString linkName = rx.cap(2).trimmed(); QzRegExp rx2("href=\"(.*)\""); rx2.setMinimal(true); rx2.indexIn(arguments); QUrl url = QUrl::fromEncoded(rx2.cap(1).trimmed().toUtf8()); start += posOfLink + rx.cap(0).size(); if (linkName.isEmpty() || url.isEmpty() || url.scheme() == QLatin1String("place") || url.scheme() == QLatin1String("about")) { continue; } BookmarkItem* b = new BookmarkItem(BookmarkItem::Url, folders.isEmpty() ? root : folders.last()); b->setTitle(linkName); b->setUrl(url); } } return root; }