Warning, file /plasma/libksysguard/processui/KTextEditVT.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /*
0002     KSysGuard, the KDE System Guard
0003 
0004     SPDX-FileCopyrightText: 2007 Trent Waddington <trent.waddington@gmail.com>
0005     SPDX-FileCopyrightText: 2008 John Tapsell <tapsell@kde.org>
0006 
0007     SPDX-License-Identifier: LGPL-2.0-or-later
0008 
0009 
0010 */
0011 
0012 #include "KTextEditVT.h"
0013 
0014 #include <QFontDatabase>
0015 
0016 KTextEditVT::KTextEditVT(QWidget *parent)
0017     : QTextEdit(parent)
0018     , escape_code(QChar(0))
0019 {
0020     mParseAnsi = true;
0021     escape_sequence = false;
0022     escape_CSI = false;
0023     escape_OSC = false;
0024     escape_number1 = -1;
0025     escape_number_separator = false;
0026     escape_number2 = -1;
0027     setFont(QFontDatabase::systemFont(QFontDatabase::FixedFont));
0028 }
0029 
0030 void KTextEditVT::insertVTChar(const QChar &c)
0031 {
0032     if (escape_sequence) {
0033         if (escape_CSI || escape_OSC) {
0034             if (c.isDigit()) {
0035                 if (!escape_number_separator) {
0036                     if (escape_number1 == -1)
0037                         escape_number1 = c.digitValue();
0038                     else
0039                         escape_number1 = escape_number1 * 10 + c.digitValue();
0040                 } else {
0041                     if (escape_number2 == -1)
0042                         escape_number2 = c.digitValue();
0043                     else
0044                         escape_number2 = escape_number2 * 10 + c.digitValue();
0045                 }
0046             } else if (c == QLatin1Char(';')) {
0047                 escape_number_separator = true;
0048             } else if (escape_OSC && c == QChar(7)) { // Throw away any letters that are not OSC
0049                 escape_code = c;
0050             } else if (escape_CSI)
0051                 escape_code = c;
0052         } else if (c == QLatin1Char('[')) {
0053             escape_CSI = true;
0054         } else if (c == QLatin1Char(']')) {
0055             escape_OSC = true;
0056         } else if (c == QLatin1Char('(') || c == QLatin1Char(')')) {
0057         } else
0058             escape_code = c;
0059         if (!escape_code.isNull()) {
0060             // We've read in the whole escape sequence.  Now parse it
0061             if (escape_code == QLatin1Char('m')) { // change color
0062                 switch (escape_number2) {
0063                 case 0: // all off
0064                     setFontWeight(QFont::Normal);
0065                     setTextColor(Qt::black);
0066                     break;
0067                 case 1: // bold
0068                     setFontWeight(QFont::Bold);
0069                     break;
0070                 case 31: // red
0071                     setTextColor(Qt::red);
0072                     break;
0073                 case 32: // green
0074                     setTextColor(Qt::green);
0075                     break;
0076                 case 33: // yellow
0077                     setTextColor(Qt::yellow);
0078                     break;
0079                 case 34: // blue
0080                     setTextColor(Qt::blue);
0081                     break;
0082                 case 35: // magenta
0083                     setTextColor(Qt::magenta);
0084                     break;
0085                 case 36: // cyan
0086                     setTextColor(Qt::cyan);
0087                     break;
0088                 case -1:
0089                 case 30: // black
0090                 case 39: // reset
0091                 case 37: // white
0092                     setTextColor(Qt::black);
0093                     break;
0094                 }
0095             }
0096             escape_code = QChar(0);
0097             escape_number1 = -1;
0098             escape_number2 = -1;
0099             escape_CSI = false;
0100             escape_OSC = false;
0101             escape_sequence = false;
0102             escape_number_separator = false;
0103         }
0104     } else if (c == QChar(0x0d)) {
0105         insertPlainText(QStringLiteral("\n"));
0106     } else if (c.isPrint() || c == QLatin1Char('\n')) {
0107         insertPlainText(c);
0108     } else if (mParseAnsi) {
0109         if (c == QChar(127) || c == QChar(8)) { // delete or backspace, respectively
0110             textCursor().deletePreviousChar();
0111         } else if (c == QChar(27)) { // escape key
0112             escape_sequence = true;
0113         } else if (c == QChar(0x9b)) { // CSI - equivalent to esc [
0114             escape_sequence = true;
0115             escape_CSI = true;
0116         } else if (c == QChar(0x9d)) { // OSC - equivalent to esc ]
0117             escape_sequence = true;
0118             escape_OSC = true;
0119         }
0120 
0121     } else if (!c.isNull()) {
0122         insertPlainText(QStringLiteral("["));
0123         QString num;
0124         num = c;
0125         insertPlainText(num);
0126         insertPlainText(QStringLiteral("]"));
0127     }
0128 }
0129 
0130 void KTextEditVT::insertVTText(const QByteArray &string)
0131 {
0132     const int size = string.size();
0133     for (int i = 0; i < size; i++)
0134         insertVTChar(QLatin1Char(string.at(i)));
0135 }
0136 
0137 void KTextEditVT::insertVTText(const QString &string)
0138 {
0139     int size = string.size();
0140     for (int i = 0; i < size; i++)
0141         insertVTChar(string.at(i));
0142 }
0143 
0144 void KTextEditVT::setParseAnsiEscapeCodes(bool parseAnsi)
0145 {
0146     mParseAnsi = parseAnsi;
0147 }
0148 
0149 bool KTextEditVT::parseAnsiEscapeCodes() const
0150 {
0151     return mParseAnsi;
0152 }