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 29 class QTextStream; 30 31 namespace 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 */ 43 class TerminalCharacterDecoder 44 { 45 public: ~TerminalCharacterDecoder()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 */ 70 class PlainTextDecoder : public TerminalCharacterDecoder 71 { 72 public: 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 103 private: 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 */ 114 class HTMLDecoder : public TerminalCharacterDecoder 115 { 116 public: 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 135 private: 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