File indexing completed on 2024-05-12 16:36:43

0001 /* This file is part of the KDE project
0002    Copyright (C) 2009-2010 Benjamin Port <port.benjamin@gmail.com>
0003    Copyright (C) 2009 Yannick Motta <yannick.motta@gmail.com>
0004 
0005    This library is free software; you can redistribute it and/or
0006    modify it under the terms of the GNU Library General Public
0007    License as published by the Free Software Foundation; either
0008    version 2 of the License, or (at your option) any later version.
0009 
0010    This library is distributed in the hope that it will be useful,
0011    but WITHOUT ANY WARRANTY; without even the implied warranty of
0012    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0013    Library General Public License for more details.
0014 
0015    You should have received a copy of the GNU Library General Public License
0016    along with this library; see the file COPYING.LIB.  If not, write to
0017    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
0018  * Boston, MA 02110-1301, USA.
0019 */
0020 
0021 #include "KPrHtmlExport.h"
0022 
0023 #include <QTextStream>
0024 #include <QDir>
0025 #include <QUrl>
0026 #include <QTemporaryDir>
0027 #include <QStandardPaths>
0028 
0029 #include <kio/copyjob.h>
0030 #include <kmessagebox.h>
0031 #include <krun.h>
0032 #include <kzip.h>
0033 
0034 #include "KPrHtmlExportUiDelegate.h"
0035 #include "KPrView.h"
0036 #include "KPrPage.h"
0037 
0038 KPrHtmlExport::KPrHtmlExport()
0039 {
0040 }
0041 
0042 KPrHtmlExport::~KPrHtmlExport()
0043 {
0044 }
0045 
0046 void KPrHtmlExport::exportHtml(const KPrHtmlExport::Parameter &parameters)
0047 {
0048     m_parameters = parameters;
0049 
0050     // Create a temporary dir
0051     QTemporaryDir tmpDir;
0052     m_tmpDirPath = tmpDir.path();
0053     tmpDir.setAutoRemove(false);
0054     extractStyle();
0055     exportImageToTmpDir();
0056     generateHtml();
0057     generateToc();
0058     copyFromTmpToDest();
0059 }
0060 
0061 void KPrHtmlExport::extractStyle()
0062 {
0063     KZip zip(m_parameters.styleUrl.toLocalFile());
0064     zip.open(QIODevice::ReadOnly);
0065     zip.directory()->copyTo(m_tmpDirPath, true);
0066 }
0067 
0068 QUrl KPrHtmlExport::exportPreview(const Parameter &parameters)
0069 {
0070     m_parameters = parameters;
0071 
0072     // Create a temporary dir
0073     QTemporaryDir tmpDir;
0074     tmpDir.setAutoRemove(false);
0075     m_tmpDirPath = tmpDir.path();
0076     extractStyle();
0077     exportImageToTmpDir();
0078     generateHtml();
0079 
0080     QUrl previewUrl = QUrl::fromLocalFile(tmpDir.path()+QLatin1String("/slide0.html"));
0081     return previewUrl;
0082 }
0083 
0084 void KPrHtmlExport::exportImageToTmpDir()
0085 {
0086     // Export slides as image into the temporary export directory
0087     QUrl fileUrl;
0088     for(int i=0; i < m_parameters.slides.size(); ++i){
0089         fileUrl = QUrl::fromLocalFile(m_tmpDirPath+QString::fromLatin1("/slide%1.png").arg(i));
0090         KoPAPageBase *slide = m_parameters.slides.at(i);
0091         m_parameters.kprView->exportPageThumbnail(slide,fileUrl, slide->size().toSize(), "PNG", -1);
0092     }
0093 }
0094 
0095 void KPrHtmlExport::generateHtml()
0096 {
0097     QFile file(QStandardPaths::locate(QStandardPaths::GenericDataLocation, QStringLiteral("calligrastage/templates/exportHTML/slides.html")));
0098     file.open(QIODevice::ReadOnly);
0099     QString slideContent = file.readAll();
0100     file.close();
0101     // Create html slide file
0102     int nbSlides = m_parameters.slides.size();
0103     for(int i=0; i < m_parameters.slidesNames.size();++i){
0104         QString content = slideContent;
0105         content.replace("::TITLE::", m_parameters.title);
0106         content.replace("::AUTHOR::", m_parameters.author);
0107         content.replace("::IMAGE_PATH::", QString("slide%1.png").arg(i));
0108         content.replace("::SLIDE_NUM::", QString("%1").arg(i+1));
0109         content.replace("::NB_SLIDES::", QString("%1").arg(nbSlides));
0110         content.replace("::TITLE_SLIDE::", m_parameters.slidesNames.at(i));
0111         content.replace("::LAST_PATH::", QString("slide%1.html").arg(nbSlides-1));
0112         content.replace("::NEXT_PATH::", QString("slide%1.html").arg(((i+1) < nbSlides)? i + 1: i));
0113         content.replace("::PREVIOUS_PATH::", QString("slide%1.html").arg((i>0)? i - 1: 0));
0114         content.replace("::FIRST_PATH::", QString("slide0.html"));
0115         writeHtmlFileToTmpDir(QString("slide%1.html").arg(i), content);
0116     }
0117 }
0118 
0119 void KPrHtmlExport::generateToc()
0120 {
0121     QString toc = "<ul>";
0122     for(int i=0; i < m_parameters.slidesNames.size(); ++i){
0123         toc.append(QString("<li><a href=\"slide%1.html\">%2</a></li>").arg(i).arg(m_parameters.slidesNames.at(i)));
0124     }
0125     toc.append("</ul>");
0126     QFile file(QStandardPaths::locate(QStandardPaths::GenericDataLocation, QStringLiteral("calligrastage/templates/exportHTML/toc.html")));
0127     file.open(QIODevice::ReadOnly);
0128     QString content = file.readAll();
0129     file.close();
0130     content.replace("::TITLE::", m_parameters.title);
0131     content.replace("::AUTHOR::", m_parameters.author);
0132     content.replace("::TOC::", toc);
0133     writeHtmlFileToTmpDir("index.html", content);
0134 }
0135 
0136 void KPrHtmlExport::writeHtmlFileToTmpDir(const QString &fileName, const QString &htmlBody)
0137 {
0138     const QString filePath = m_tmpDirPath + QLatin1Char('/') + fileName;
0139     QFile file(filePath);
0140     file.open(QIODevice::WriteOnly);
0141     QTextStream stream(&file);
0142     stream << htmlBody;
0143 }
0144 
0145 void KPrHtmlExport::copyFromTmpToDest()
0146 {
0147     KIO::CopyJob *job = KIO::moveAs(QUrl::fromLocalFile(m_tmpDirPath), m_parameters.destination);
0148     job->setWriteIntoExistingDirectories(true);
0149     job->setUiDelegate(new KPrHtmlExportUiDelegate);
0150     connect(job, SIGNAL(result(KJob*)), this, SLOT(moveResult(KJob*)));
0151     job->exec();
0152 }
0153 
0154 void KPrHtmlExport::moveResult(KJob *job)
0155 {
0156     QDir((m_tmpDirPath)).removeRecursively();
0157     if (job->error()) {
0158         KMessageBox::error(m_parameters.kprView, job->errorText());
0159     }
0160     else {
0161         if(m_parameters.openBrowser){
0162             QUrl url = m_parameters.destination;
0163             url.setPath(url.path() + QLatin1String("/index.html"));
0164             KRun::runUrl(url, "text/html", m_parameters.kprView);
0165         }
0166     }
0167 }