Members of the KDE Community are recommended to subscribe to the kde-community mailing list at https://mail.kde.org/mailman/listinfo/kde-community to allow them to participate in important discussions and receive other important announcements

Commit 9f71cc38 authored by Gustavo Carneiro's avatar Gustavo Carneiro Committed by Kurt Hindenburg

Move PlainTextDecode and HTMLDecoder Classes to a new files.

parent c9b9d590
......@@ -150,7 +150,8 @@ set(konsoleprivate_SRCS ${sessionadaptors_SRCS}
session/SessionListModel.cpp
session/SessionTask.cpp
widgets/TabTitleFormatButton.cpp
TerminalCharacterDecoder.cpp
PlainTextDecoder.cpp
HTMLDecoder.cpp
ExtendedCharTable.cpp
widgets/TerminalDisplay.cpp
widgets/TerminalDisplayAccessible.cpp
......
......@@ -20,141 +20,16 @@
*/
// Own
#include "TerminalCharacterDecoder.h"
// Qt
#include <QTextStream>
#include "HTMLDecoder.h"
// Konsole
#include "ExtendedCharTable.h"
#include "ColorScheme.h"
#include "ColorSchemeManager.h"
#include "profile/Profile.h"
using namespace Konsole;
PlainTextDecoder::PlainTextDecoder()
: _output(nullptr)
, _includeLeadingWhitespace(true)
, _includeTrailingWhitespace(true)
, _recordLinePositions(false)
, _linePositions(QList<int>())
{
}
void PlainTextDecoder::setLeadingWhitespace(bool enable)
{
_includeLeadingWhitespace = enable;
}
void PlainTextDecoder::setTrailingWhitespace(bool enable)
{
_includeTrailingWhitespace = enable;
}
void PlainTextDecoder::begin(QTextStream* output)
{
_output = output;
if (!_linePositions.isEmpty()) {
_linePositions.clear();
}
}
void PlainTextDecoder::end()
{
_output = nullptr;
}
void PlainTextDecoder::setRecordLinePositions(bool record)
{
_recordLinePositions = record;
}
QList<int> PlainTextDecoder::linePositions() const
{
return _linePositions;
}
void PlainTextDecoder::decodeLine(const Character* const characters, int count, LineProperty /*properties*/
)
{
Q_ASSERT(_output);
if (_recordLinePositions && (_output->string() != nullptr)) {
int pos = _output->string()->count();
_linePositions << pos;
}
//TODO should we ignore or respect the LINE_WRAPPED line property?
//note: we build up a QString and send it to the text stream rather writing into the text
//stream a character at a time because it is more efficient.
//(since QTextStream always deals with QStrings internally anyway)
QString plainText;
plainText.reserve(count);
// If we should remove leading whitespace find the first non-space character
int start = 0;
if (!_includeLeadingWhitespace) {
for (start = 0; start < count; start++) {
if (!characters[start].isSpace()) {
break;
}
}
}
int outputCount = count - start;
if (outputCount <= 0) {
return;
}
// if inclusion of trailing whitespace is disabled then find the end of the
// line
if (!_includeTrailingWhitespace) {
for (int i = count - 1 ; i >= start ; i--) {
if (!characters[i].isSpace()) {
break;
} else {
outputCount--;
}
}
}
#include "ExtendedCharTable.h"
// find out the last technically real character in the line
int realCharacterGuard = -1;
for (int i = count - 1 ; i >= start ; i--) {
// FIXME: the special case of '\n' here is really ugly
// Maybe the '\n' should be added after calling this method in
// Screen::copyLineToStream()
if (characters[i].isRealCharacter && characters[i].character != '\n') {
realCharacterGuard = i;
break;
}
}
// Qt
#include <QTextStream>
for (int i = start; i < outputCount;) {
if ((characters[i].rendition & RE_EXTENDED_CHAR) != 0) {
ushort extendedCharLength = 0;
const uint* chars = ExtendedCharTable::instance.lookupExtendedChar(characters[i].character, extendedCharLength);
if (chars != nullptr) {
const QString s = QString::fromUcs4(chars, extendedCharLength);
plainText.append(s);
i += qMax(1, Character::stringWidth(s));
} else {
++i;
}
} else {
// All characters which appear before the last real character are
// seen as real characters, even when they are technically marked as
// non-real.
//
// This feels tricky, but otherwise leading "whitespaces" may be
// lost in some situation. One typical example is copying the result
// of `dialog --infobox "qwe" 10 10` .
if (characters[i].isRealCharacter || i <= realCharacterGuard) {
plainText.append(QString::fromUcs4(&characters[i].character, 1));
i += qMax(1, characters[i].width());
} else {
++i; // should we 'break' directly here?
}
}
}
*_output << plainText;
}
using namespace Konsole;
HTMLDecoder::HTMLDecoder(const QExplicitlySharedDataPointer<Profile> &profile) :
_output(nullptr)
......
/*
This file is part of Konsole, an X terminal.
Copyright 2006-2008 by Robert Knight <robertknight@gmail.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
*/
#ifndef HTMLDECODER_H
#define HTMLDECODER_H
// Konsole
#include "TerminalCharacterDecoder.h"
#include "profile/Profile.h"
namespace Konsole
{
/**
* A terminal character decoder which produces pretty HTML markup
*/
class KONSOLEPRIVATE_EXPORT HTMLDecoder : public TerminalCharacterDecoder
{
public:
/**
* Constructs an HTML decoder using a default black-on-white color scheme.
*/
explicit HTMLDecoder(const Profile::Ptr &profile = Profile::Ptr());
void decodeLine(const Character * const characters, int count,
LineProperty properties) override;
void begin(QTextStream *output) override;
void end() override;
private:
void openSpan(QString &text, const QString &style);
void closeSpan(QString &text);
QTextStream *_output;
Profile::Ptr _profile;
ColorEntry _colorTable[TABLE_COLORS];
bool _innerSpanOpen;
RenditionFlags _lastRendition;
CharacterColor _lastForeColor;
CharacterColor _lastBackColor;
};
}
#endif
/*
This file is part of Konsole, an X terminal.
Copyright 2006-2008 by Robert Knight <robertknight@gmail.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
*/
// Own
#include "PlainTextDecoder.h"
// Konsole
#include "ExtendedCharTable.h"
// Qt
#include <QList>
#include <QTextStream>
using namespace Konsole;
PlainTextDecoder::PlainTextDecoder()
: _output(nullptr)
, _includeLeadingWhitespace(true)
, _includeTrailingWhitespace(true)
, _recordLinePositions(false)
, _linePositions(QList<int>())
{
}
void PlainTextDecoder::setLeadingWhitespace(bool enable)
{
_includeLeadingWhitespace = enable;
}
void PlainTextDecoder::setTrailingWhitespace(bool enable)
{
_includeTrailingWhitespace = enable;
}
void PlainTextDecoder::begin(QTextStream* output)
{
_output = output;
if (!_linePositions.isEmpty()) {
_linePositions.clear();
}
}
void PlainTextDecoder::end()
{
_output = nullptr;
}
void PlainTextDecoder::setRecordLinePositions(bool record)
{
_recordLinePositions = record;
}
QList<int> PlainTextDecoder::linePositions() const
{
return _linePositions;
}
void PlainTextDecoder::decodeLine(const Character* const characters, int count, LineProperty /*properties*/)
{
Q_ASSERT(_output);
if (_recordLinePositions && (_output->string() != nullptr)) {
int pos = _output->string()->count();
_linePositions << pos;
}
//TODO should we ignore or respect the LINE_WRAPPED line property?
//note: we build up a QString and send it to the text stream rather writing into the text
//stream a character at a time because it is more efficient.
//(since QTextStream always deals with QStrings internally anyway)
QString plainText;
plainText.reserve(count);
// If we should remove leading whitespace find the first non-space character
int start = 0;
if (!_includeLeadingWhitespace) {
for (start = 0; start < count; start++) {
if (!characters[start].isSpace()) {
break;
}
}
}
int outputCount = count - start;
if (outputCount <= 0) {
return;
}
// if inclusion of trailing whitespace is disabled then find the end of the
// line
if (!_includeTrailingWhitespace) {
for (int i = count - 1 ; i >= start ; i--) {
if (!characters[i].isSpace()) {
break;
} else {
outputCount--;
}
}
}
// find out the last technically real character in the line
int realCharacterGuard = -1;
for (int i = count - 1 ; i >= start ; i--) {
// FIXME: the special case of '\n' here is really ugly
// Maybe the '\n' should be added after calling this method in
// Screen::copyLineToStream()
if (characters[i].isRealCharacter && characters[i].character != '\n') {
realCharacterGuard = i;
break;
}
}
for (int i = start; i < outputCount;) {
if ((characters[i].rendition & RE_EXTENDED_CHAR) != 0) {
ushort extendedCharLength = 0;
const uint* chars = ExtendedCharTable::instance.lookupExtendedChar(characters[i].character, extendedCharLength);
if (chars != nullptr) {
const QString s = QString::fromUcs4(chars, extendedCharLength);
plainText.append(s);
i += qMax(1, Character::stringWidth(s));
} else {
++i;
}
} else {
// All characters which appear before the last real character are
// seen as real characters, even when they are technically marked as
// non-real.
//
// This feels tricky, but otherwise leading "whitespaces" may be
// lost in some situation. One typical example is copying the result
// of `dialog --infobox "qwe" 10 10` .
if (characters[i].isRealCharacter || i <= realCharacterGuard) {
plainText.append(QString::fromUcs4(&characters[i].character, 1));
i += qMax(1, characters[i].width());
} else {
++i; // should we 'break' directly here?
}
}
}
*_output << plainText;
}
/*
This file is part of Konsole, an X terminal.
Copyright 2006-2008 by Robert Knight <robertknight@gmail.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
*/
#ifndef PLAINTEXTDECODER_H
#define PLAINTEXTDECODER_H
#include "konsoleprivate_export.h"
#include "TerminalCharacterDecoder.h"
class QTextStream;
template<typename> class QList;
namespace Konsole
{
/**
* A terminal character decoder which produces plain text, ignoring colors and other appearance-related
* properties of the original characters.
*/
class KONSOLEPRIVATE_EXPORT PlainTextDecoder : public TerminalCharacterDecoder
{
public:
PlainTextDecoder();
/**
* Set whether leading whitespace at the end of lines should be included
* in the output.
* Defaults to true.
*/
void setLeadingWhitespace(bool enable);
/**
* Set whether trailing whitespace at the end of lines should be included
* in the output.
* Defaults to true.
*/
void setTrailingWhitespace(bool enable);
/**
* Returns of character positions in the output stream
* at which new lines where added. Returns an empty if setTrackLinePositions() is false or if
* the output device is not a string.
*/
QList<int> linePositions() const;
/** Enables recording of character positions at which new lines are added. See linePositions() */
void setRecordLinePositions(bool record);
void begin(QTextStream *output) override;
void end() override;
void decodeLine(const Character * const characters, int count,
LineProperty properties) override;
private:
QTextStream *_output;
bool _includeLeadingWhitespace;
bool _includeTrailingWhitespace;
bool _recordLinePositions;
QList<int> _linePositions;
};
}
#endif
......@@ -33,6 +33,9 @@
#include "session/SessionManager.h"
#include "Emulation.h"
#include "PlainTextDecoder.h"
#include "HTMLDecoder.h"
namespace Konsole {
QString SaveHistoryTask::_saveDialogRecentURL;
......
......@@ -22,13 +22,14 @@
#define SAVEHISTORYTASK_H
#include "session/SessionTask.h"
#include "TerminalCharacterDecoder.h"
#include <kio/job.h>
namespace Konsole
{
class TerminalCharacterDecoder;
/**
* A task which prompts for a URL for each session and saves that session's output
* to the given URL
......
......@@ -27,7 +27,8 @@
#include <QTextStream>
// Konsole
#include "TerminalCharacterDecoder.h"
#include "PlainTextDecoder.h"
#include "HTMLDecoder.h"
#include "history/HistoryType.h"
#include "history/HistoryScrollNone.h"
#include "ExtendedCharTable.h"
......
......@@ -23,9 +23,8 @@
#include <QApplication>
#include <QTextStream>
#include "TerminalCharacterDecoder.h"
#include "profile/Profile.h"
#include "Emulation.h"
#include "PlainTextDecoder.h"
namespace Konsole {
......
......@@ -68,80 +68,6 @@ public:
LineProperty properties) = 0;
};
/**
* A terminal character decoder which produces plain text, ignoring colors and other appearance-related
* properties of the original characters.
*/
class KONSOLEPRIVATE_EXPORT PlainTextDecoder : public TerminalCharacterDecoder
{
public:
PlainTextDecoder();
/**
* Set whether leading whitespace at the end of lines should be included
* in the output.
* Defaults to true.
*/
void setLeadingWhitespace(bool enable);
/**
* Set whether trailing whitespace at the end of lines should be included
* in the output.
* Defaults to true.
*/
void setTrailingWhitespace(bool enable);
/**
* Returns of character positions in the output stream
* at which new lines where added. Returns an empty if setTrackLinePositions() is false or if
* the output device is not a string.
*/
QList<int> linePositions() const;
/** Enables recording of character positions at which new lines are added. See linePositions() */
void setRecordLinePositions(bool record);
void begin(QTextStream *output) override;
void end() override;
void decodeLine(const Character * const characters, int count,
LineProperty properties) override;
private:
QTextStream *_output;
bool _includeLeadingWhitespace;
bool _includeTrailingWhitespace;
bool _recordLinePositions;
QList<int> _linePositions;
};
/**
* A terminal character decoder which produces pretty HTML markup
*/
class KONSOLEPRIVATE_EXPORT HTMLDecoder : public TerminalCharacterDecoder
{
public:
/**
* Constructs an HTML decoder using a default black-on-white color scheme.
*/
explicit HTMLDecoder(const QExplicitlySharedDataPointer<Profile> &profile = QExplicitlySharedDataPointer<Profile>());
void decodeLine(const Character * const characters, int count,
LineProperty properties) override;
void begin(QTextStream *output) override;
void end() override;
private:
void openSpan(QString &text, const QString &style);
void closeSpan(QString &text);
QTextStream *_output;
QExplicitlySharedDataPointer<Profile> _profile;
ColorEntry _colorTable[TABLE_COLORS];
bool _innerSpanOpen;
RenditionFlags _lastRendition;
CharacterColor _lastForeColor;
CharacterColor _lastBackColor;
};
}
#endif
......@@ -21,10 +21,13 @@
// Own
#include "TerminalCharacterDecoderTest.h"
// Konsole
#include "../PlainTextDecoder.h"
#include "../HTMLDecoder.h"
// Qt
#include <QTextStream>
// KDE
#include <qtest.h>
......
......@@ -23,9 +23,7 @@
#include <QObject>
#include "../profile/Profile.h"
#include "../TerminalCharacterDecoder.h"
#include "../Character.h"
namespace Konsole
{
......
......@@ -22,7 +22,7 @@
#include <QTextStream>
#include "TerminalCharacterDecoder.h"
#include "PlainTextDecoder.h"
using namespace Konsole;
......
......@@ -68,7 +68,7 @@
#include "filterHotSpots/FileFilterHotspot.h"
#include "konsoledebug.h"
#include "TerminalCharacterDecoder.h"
#include "PlainTextDecoder.h"
#include "Screen.h"
#include "ExtendedCharTable.h"
#include "TerminalDisplayAccessible.h"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment