void ImportHTML::UpdateFiles(HTMLResource &html_resource, QString & source, const QHash<QString, QString> &updates) { Q_ASSERT(&html_resource != NULL); QHash<QString, QString> html_updates; QHash<QString, QString> css_updates; QString newsource = source; QString currentpath = html_resource.GetCurrentBookRelPath(); std::tie(html_updates, css_updates, std::ignore) = UniversalUpdates::SeparateHtmlCssXmlUpdates(updates); QList<Resource *> all_files = m_Book->GetFolderKeeper().GetResourceList(); int num_files = all_files.count(); QList<CSSResource *> css_resources; for (int i = 0; i < num_files; ++i) { Resource *resource = all_files.at(i); if (resource->Type() == Resource::CSSResourceType) { css_resources.append(qobject_cast<CSSResource *>(resource)); } } QFutureSynchronizer<void> sync; sync.addFuture(QtConcurrent::map(css_resources, std::bind(UniversalUpdates::LoadAndUpdateOneCSSFile, std::placeholders::_1, css_updates))); html_resource.SetText(PerformHTMLUpdates(newsource, html_updates, css_updates, currentpath)()); html_resource.SetCurrentBookRelPath(""); sync.waitForFinished(); }
// Reads and parses the file // and returns the created Book QSharedPointer<Book> ImportEPUB::GetBook(bool extract_metadata) { QList<XMLResource *> non_well_formed; SettingsStore ss; if (!Utility::IsFileReadable(m_FullFilePath)) { throw (EPUBLoadParseError(QString(QObject::tr("Cannot read EPUB: %1")).arg(QDir::toNativeSeparators(m_FullFilePath)).toStdString())); } // These read the EPUB file ExtractContainer(); QHash<QString, QString> encrypted_files = ParseEncryptionXml(); if (BookContentEncrypted(encrypted_files)) { throw (FileEncryptedWithDrm("")); } QApplication::setOverrideCursor(Qt::WaitCursor); // These mutate the m_Book object LocateOPF(); // These mutate the m_Book object ReadOPF(); AddObfuscatedButUndeclaredFonts(encrypted_files); AddNonStandardAppleXML(); LoadInfrastructureFiles(); const QHash<QString, QString> updates = LoadFolderStructure(); const QList<Resource *> resources = m_Book->GetFolderKeeper()->GetResourceList(); // We're going to check all html files until we find one that isn't well formed then we'll prompt // the user if they want to auto fix or not. // // If we have non-well formed content and they shouldn't be auto fixed we'll pass that on to // the universal update function so it knows to skip them. Otherwise we won't include them and // let it modify the file. for (int i=0; i<resources.count(); ++i) { if (resources.at(i)->Type() == Resource::HTMLResourceType) { HTMLResource *hresource = dynamic_cast<HTMLResource *>(resources.at(i)); if (!hresource) { continue; } // Load the content into the HTMLResource so we can perform a well formed check. try { hresource->SetText(HTMLEncodingResolver::ReadHTMLFile(hresource->GetFullPath())); } catch (...) { if (ss.cleanOn() & CLEANON_OPEN) { non_well_formed << hresource; continue; } } if (ss.cleanOn() & CLEANON_OPEN) { if (!XhtmlDoc::IsDataWellFormed(hresource->GetText())) { non_well_formed << hresource; } } } } if (!non_well_formed.isEmpty()) { QApplication::restoreOverrideCursor(); if (QMessageBox::Yes == QMessageBox::warning(QApplication::activeWindow(), tr("Sigil"), tr("This EPUB has HTML files that are not well formed. " "Sigil can attempt to automatically fix these files, although this " "can result in data loss.\n\n" "Do you want to automatically fix the files?"), QMessageBox::Yes|QMessageBox::No) ) { non_well_formed.clear(); } QApplication::setOverrideCursor(Qt::WaitCursor); } const QStringList load_errors = UniversalUpdates::PerformUniversalUpdates(false, resources, updates, non_well_formed); Q_FOREACH (QString err, load_errors) { AddLoadWarning(QString("%1").arg(err)); }