1/*
2 This file is part of Konsole, an X terminal.
3
4 Copyright 2006-2008 by Robert Knight <robertknight@gmail.com>
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU Lesser General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 02110-1301 USA.
20*/
21
22#ifndef TERMINAL_CHARACTER_DECODER_H
23#define TERMINAL_CHARACTER_DECODER_H
24
25#include "Character.h"
26
27#include <QList>
28
29class QTextStream;
30
31namespace Konsole
32{
33
34/**
35 * Base class for terminal character decoders
36 *
37 * The decoder converts lines of terminal characters which consist of a unicode character, foreground
38 * and background colours and other appearance-related properties into text strings.
39 *
40 * Derived classes may produce either plain text with no other colour or appearance information, or
41 * they may produce text which incorporates these additional properties.
42 */
43class TerminalCharacterDecoder
44{
45public:
46 virtual ~TerminalCharacterDecoder() {}
47
48 /** Begin decoding characters. The resulting text is appended to @p output. */
49 virtual void begin(QTextStream* output) = 0;
50 /** End decoding. */
51 virtual void end() = 0;
52
53 /**
54 * Converts a line of terminal characters with associated properties into a text string
55 * and writes the string into an output QTextStream.
56 *
57 * @param characters An array of characters of length @p count.
58 * @param count The number of characters
59 * @param properties Additional properties which affect all characters in the line
60 */
61 virtual void decodeLine(const Character* const characters,
62 int count,
63 LineProperty properties) = 0;
64};
65
66/**
67 * A terminal character decoder which produces plain text, ignoring colours and other appearance-related
68 * properties of the original characters.
69 */
70class PlainTextDecoder : public TerminalCharacterDecoder
71{
72public:
73 PlainTextDecoder();
74
75 /**
76 * Set whether trailing whitespace at the end of lines should be included
77 * in the output.
78 * Defaults to true.
79 */
80 void setTrailingWhitespace(bool enable);
81 /**
82 * Returns whether trailing whitespace at the end of lines is included
83 * in the output.
84 */
85 bool trailingWhitespace() const;
86 /**
87 * Returns of character positions in the output stream
88 * at which new lines where added. Returns an empty if setTrackLinePositions() is false or if
89 * the output device is not a string.
90 */
91 QList<int> linePositions() const;
92 /** Enables recording of character positions at which new lines are added. See linePositions() */
93 void setRecordLinePositions(bool record);
94
95 virtual void begin(QTextStream* output);
96 virtual void end();
97
98 virtual void decodeLine(const Character* const characters,
99 int count,
100 LineProperty properties);
101
102
103private:
104 QTextStream* _output;
105 bool _includeTrailingWhitespace;
106
107 bool _recordLinePositions;
108 QList<int> _linePositions;
109};
110
111/**
112 * A terminal character decoder which produces pretty HTML markup
113 */
114class HTMLDecoder : public TerminalCharacterDecoder
115{
116public:
117 /**
118 * Constructs an HTML decoder using a default black-on-white color scheme.
119 */
120 HTMLDecoder();
121
122 /**
123 * Sets the colour table which the decoder uses to produce the HTML colour codes in its
124 * output
125 */
126 void setColorTable( const ColorEntry* table );
127
128 virtual void decodeLine(const Character* const characters,
129 int count,
130 LineProperty properties);
131
132 virtual void begin(QTextStream* output);
133 virtual void end();
134
135private:
136 void openSpan(std::wstring& text , const QString& style);
137 void closeSpan(std::wstring& text);
138
139 QTextStream* _output;
140 const ColorEntry* _colorTable;
141 bool _innerSpanOpen;
142 quint8 _lastRendition;
143 CharacterColor _lastForeColor;
144 CharacterColor _lastBackColor;
145
146};
147
148}
149
150#endif
151