23#include <QRegularExpression>
32 return BookmarksImporter::tr(
"You can import bookmarks from any browser that supports HTML exporting. "
33 "This file has usually these suffixes");
38 return QStringLiteral(
".htm, .html");
43 const QString filter = BookmarksImporter::tr(
"HTML Bookmarks") + QLatin1String(
" (*.htm *.html)");
44 m_path = QFileDialog::getOpenFileName(parent, BookmarksImporter::tr(
"Choose file..."), QDir::homePath(), filter);
50 m_file.setFileName(m_path);
52 if (!m_file.open(QFile::ReadOnly)) {
53 setError(BookmarksImporter::tr(
"Unable to open file."));
60static int qzMin(
int a,
int b)
62 if (a > -1 && b > -1) {
76 QString bookmarks = QString::fromUtf8(m_file.readAll());
82 bookmarks.replace(QLatin1String(
"<DL"), QLatin1String(
"<dl"));
83 bookmarks.replace(QLatin1String(
"</DL"), QLatin1String(
"</dl"));
84 bookmarks.replace(QLatin1String(
"<DT"), QLatin1String(
"<dt"));
85 bookmarks.replace(QLatin1String(
"</DT"), QLatin1String(
"</dt"));
86 bookmarks.replace(QLatin1String(
"<P"), QLatin1String(
"<p"));
87 bookmarks.replace(QLatin1String(
"</P"), QLatin1String(
"</p"));
88 bookmarks.replace(QLatin1String(
"<A"), QLatin1String(
"<a"));
89 bookmarks.replace(QLatin1String(
"</A"), QLatin1String(
"</a"));
90 bookmarks.replace(QLatin1String(
"HREF="), QLatin1String(
"href="));
91 bookmarks.replace(QLatin1String(
"<H3"), QLatin1String(
"<h3"));
92 bookmarks.replace(QLatin1String(
"</H3"), QLatin1String(
"</h3"));
94 bookmarks = bookmarks.left(bookmarks.lastIndexOf(QLatin1String(
"</dl><p>")));
95 int start = bookmarks.indexOf(QLatin1String(
"<dl><p>"));
98 root->setTitle(QStringLiteral(
"HTML Import"));
100 QList<BookmarkItem*> folders;
101 folders.append(root);
104 QString
string = bookmarks.mid(start);
106 int posOfFolder =
string.indexOf(QLatin1String(
"<dt><h3"));
107 int posOfEndFolder =
string.indexOf(QLatin1String(
"</dl><p>"));
108 int posOfLink =
string.indexOf(QLatin1String(
"<dt><a"));
110 int nearest = qzMin(posOfLink, qzMin(posOfFolder, posOfEndFolder));
115 if (nearest == posOfFolder) {
117 QRegularExpression rx(
QSL(
"<dt><h3(.*)>(.*)</h3>"), QRegularExpression::InvertedGreedinessOption | QRegularExpression::DotMatchesEverythingOption);
118 QRegularExpressionMatch match = rx.match(
string);
119 QString folderName = match.captured(2).trimmed();
122 folder->setTitle(folderName);
123 folders.append(folder);
125 start += posOfFolder + match.captured(0).size();
127 else if (nearest == posOfEndFolder) {
129 if (!folders.isEmpty()) {
130 folders.removeLast();
133 start += posOfEndFolder + 8;
137 QRegularExpression rx(
QSL(
"<dt><a(.*)>(.*)</a>"), QRegularExpression::InvertedGreedinessOption | QRegularExpression::DotMatchesEverythingOption);
138 QRegularExpressionMatch match = rx.match(
string);
140 QString arguments = match.captured(1);
141 QString linkName = match.captured(2).trimmed();
143 QRegularExpression rx2(
QSL(
"href=\"(.*)\""), QRegularExpression::InvertedGreedinessOption | QRegularExpression::DotMatchesEverythingOption);
144 QRegularExpressionMatch match2 = rx2.match(arguments);
146 QUrl url = QUrl::fromEncoded(match2.captured(1).trimmed().toUtf8());
148 start += posOfLink + match.captured(0).size();
150 if (url.isEmpty() || url.scheme() ==
QL1S(
"place") || url.scheme() ==
QL1S(
"about"))
154 b->setTitle(linkName.isEmpty() ? url.toString() : linkName);
void setError(const QString &error)
QString standardPath() const override
QString getPath(QWidget *parent) override
QString description() const override
HtmlImporter(QObject *parent=nullptr)
bool prepareImport() override
BookmarkItem * importBookmarks() override