Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Open sidebar
Utilities
Konsole
Commits
9f71cc38
Commit
9f71cc38
authored
Jul 28, 2020
by
Gustavo Carneiro
Committed by
Kurt Hindenburg
Jul 28, 2020
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Move PlainTextDecode and HTMLDecoder Classes to a new files.
parent
c9b9d590
Changes
14
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
326 additions
and
215 deletions
+326
-215
src/CMakeLists.txt
src/CMakeLists.txt
+2
-1
src/HTMLDecoder.cpp
src/HTMLDecoder.cpp
+5
-130
src/HTMLDecoder.h
src/HTMLDecoder.h
+63
-0
src/PlainTextDecoder.cpp
src/PlainTextDecoder.cpp
+161
-0
src/PlainTextDecoder.h
src/PlainTextDecoder.h
+80
-0
src/SaveHistoryTask.cpp
src/SaveHistoryTask.cpp
+3
-0
src/SaveHistoryTask.h
src/SaveHistoryTask.h
+2
-1
src/Screen.cpp
src/Screen.cpp
+2
-1
src/SearchHistoryTask.cpp
src/SearchHistoryTask.cpp
+1
-2
src/TerminalCharacterDecoder.h
src/TerminalCharacterDecoder.h
+0
-74
src/autotests/TerminalCharacterDecoderTest.cpp
src/autotests/TerminalCharacterDecoderTest.cpp
+4
-1
src/autotests/TerminalCharacterDecoderTest.h
src/autotests/TerminalCharacterDecoderTest.h
+1
-3
src/filterHotSpots/TerminalImageFilterChain.cpp
src/filterHotSpots/TerminalImageFilterChain.cpp
+1
-1
src/widgets/TerminalDisplay.cpp
src/widgets/TerminalDisplay.cpp
+1
-1
No files found.
src/CMakeLists.txt
View file @
9f71cc38
...
...
@@ -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
...
...
src/
TerminalCharacter
Decoder.cpp
→
src/
HTML
Decoder.cpp
View file @
9f71cc38
...
...
@@ -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
)
...
...
src/HTMLDecoder.h
0 → 100644
View file @
9f71cc38
/*
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
src/PlainTextDecoder.cpp
0 → 100644
View file @
9f71cc38
/*
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
;
}
src/PlainTextDecoder.h
0 → 100644
View file @
9f71cc38
/*
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
src/SaveHistoryTask.cpp
View file @
9f71cc38
...
...
@@ -33,6 +33,9 @@
#include "session/SessionManager.h"
#include "Emulation.h"
#include "PlainTextDecoder.h"
#include "HTMLDecoder.h"
namespace
Konsole
{
QString
SaveHistoryTask
::
_saveDialogRecentURL
;
...
...
src/SaveHistoryTask.h
View file @
9f71cc38
...
...
@@ -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
...
...
src/Screen.cpp
View file @
9f71cc38
...
...
@@ -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"
...
...
src/SearchHistoryTask.cpp
View file @
9f71cc38
...
...
@@ -23,9 +23,8 @@
#include <QApplication>
#include <QTextStream>
#include "TerminalCharacterDecoder.h"
#include "profile/Profile.h"
#include "Emulation.h"
#include "PlainTextDecoder.h"
namespace
Konsole
{
...
...
src/TerminalCharacterDecoder.h
View file @
9f71cc38
...
...
@@ -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
src/autotests/TerminalCharacterDecoderTest.cpp
View file @
9f71cc38
...
...
@@ -21,10 +21,13 @@
// Own
#include "TerminalCharacterDecoderTest.h"
// Konsole
#include "../PlainTextDecoder.h"
#include "../HTMLDecoder.h"
// Qt
#include <QTextStream>
// KDE
#include <qtest.h>
...
...
src/autotests/TerminalCharacterDecoderTest.h
View file @
9f71cc38
...
...
@@ -23,9 +23,7 @@
#include <QObject>
#include "../profile/Profile.h"
#include "../TerminalCharacterDecoder.h"
#include "../Character.h"
namespace
Konsole
{
...
...
src/filterHotSpots/TerminalImageFilterChain.cpp
View file @
9f71cc38
...
...
@@ -22,7 +22,7 @@
#include <QTextStream>