SVN commit 1194367 by cfeck:
[kate:kate.git] / part / plugins / exporter / htmlexporter.cpp
1 /**
2  * This file is part of the KDE libraries
3  * Copyright (C) 2009 Milian Wolff <mail@milianw.de>
4  * Copyright (C) 2002 John Firebaugh <jfirebaugh@kde.org>
5  * Copyright (C) 2001 Christoph Cullmann <cullmann@kde.org>
6  * Copyright (C) 2001 Joseph Wenninger <jowenn@kde.org>
7  * Copyright (C) 1999 Jochen Wilhelmy <digisnap@cs.tu-berlin.de>
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Library General Public
11  * License version 2 as published by the Free Software Foundation.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Library General Public License for more details.
17  *
18  * You should have received a copy of the GNU Library General Public License
19  * along with this library; see the file COPYING.LIB.  If not, write to
20  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21  * Boston, MA 02110-1301, USA.
22  */
23
24 #include "htmlexporter.h"
25
26 #include <ktexteditor/document.h>
27
28 #include <QtGui/QTextDocument>
29
30 HTMLExporter::HTMLExporter(KTextEditor::View* view, QTextStream& output, const bool encapsulate)
31   : AbstractExporter(view, output, encapsulate)
32 {
33   if ( m_encapsulate ) {
34     // let's write the HTML header :
35     m_output << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" << endl;
36     m_output << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"DTD/xhtml1-strict.dtd\">" << endl;
37     m_output << "<html xmlns=\"http://www.w3.org/1999/xhtml\">" << endl;
38     m_output << "<head>" << endl;
39     m_output << "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />" << endl;
40     m_output << "<meta name=\"Generator\" content=\"Kate, the KDE Advanced Text Editor\" />" << endl;
41     // for the title, we write the name of the file (/usr/local/emmanuel/myfile.cpp -> myfile.cpp)
42     m_output << "<title>" << view->document()->documentName() << "</title>" << endl;
43     m_output << "</head>" << endl;
44     m_output << "<body>" << endl;
45   }
46
47   if ( !m_defaultAttribute ) {
48     m_output << "<pre>" << endl;
49   } else {
50     m_output << QString("<pre style='%1%2%3%4'>")
51                   .arg(m_defaultAttribute->fontBold() ? "font-weight:bold;" : "")
52                   .arg(m_defaultAttribute->fontItalic() ? "text-style:italic;" : "")
53                   .arg("color:" + m_defaultAttribute->foreground().color().name() + ';')
54                   .arg("background-color:" + m_defaultAttribute->background().color().name() + ';')
55              << endl;
56   }
57 }
58
59 HTMLExporter::~HTMLExporter()
60 {
61   m_output << "</pre>" << endl;
62
63   if ( m_encapsulate ) {
64     m_output << "</body>" << endl;
65     m_output << "</html>" << endl;
66   }
67 }
68
69 void HTMLExporter::openLine()
70 {
71 }
72
73 void HTMLExporter::closeLine(const bool lastLine)
74 {
75   if ( !lastLine ) {
76     //we are inside a <pre>, so a \n is a new line
77     m_output << "\n";
78   }
79 }
80
81 void HTMLExporter::exportText(const QString& text, const KTextEditor::Attribute::Ptr& attrib)
82 {
83   if ( !attrib || !attrib->hasAnyProperty() || attrib == m_defaultAttribute ) {
84     m_output << Qt::escape(text);
85     return;
86   }
87
88   if ( attrib->fontBold() ) {
89     m_output << "<b>";
90   }
91   if ( attrib->fontItalic() ) {
92     m_output << "<i>";
93   }
94
95   bool writeForeground = attrib->hasProperty(QTextCharFormat::ForegroundBrush)
96     && (!m_defaultAttribute || attrib->foreground().color() != m_defaultAttribute->foreground().color());
97   bool writeBackground = attrib->hasProperty(QTextCharFormat::BackgroundBrush)
98     && (!m_defaultAttribute || attrib->background().color() != m_defaultAttribute->background().color());
99
100   if ( writeForeground || writeBackground ) {
101     m_output << QString("<span style='%1%2'>")
102                   .arg(writeForeground ? QString(QLatin1String("color:") + attrib->foreground().color().name() + QLatin1Char(';')) : QString())
103                   .arg(writeBackground ? QString(QLatin1String("background:") + attrib->background().color().name() + QLatin1Char(';')) : QString());
104   }
105
106   m_output << Qt::escape(text);
107
108   if ( writeBackground || writeForeground ) {
109     m_output << "</span>";
110   }
111   if ( attrib->fontItalic() ) {
112     m_output << "</i>";
113   }
114   if ( attrib->fontBold() ) {
115     m_output << "</b>";
116   }
117 }
118
119 // kate: space-indent on; indent-width 2; replace-tabs on;