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 ¶meters) 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 ¶meters) 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 }