You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

120 lines
2.7 KiB

/*
SPDX-FileCopyrightText: 2007-2008 Robert Knight <robertknight@gmail.com>
SPDX-FileCopyrightText: 1997, 1998 Lars Doelle <lars.doelle@on-line.de>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "EscapeSequenceUrlExtractor.h"
#include <QUrl>
namespace Konsole {
EscapeSequenceUrlExtractor::EscapeSequenceUrlExtractor()
= default;
void Konsole::EscapeSequenceUrlExtractor::setScreen(Konsole::Screen* screen)
{
_screen = screen;
clear();
}
bool EscapeSequenceUrlExtractor::reading() const
{
return _reading;
}
void EscapeSequenceUrlExtractor::beginUrlInput()
{
_reading = true;
}
void EscapeSequenceUrlExtractor::appendUrlText(QChar c)
{
if (!reading()) {
return;
}
if (_currentUrl.text.isEmpty()) {
// We need to on getCursorX because we want the position of the
// last printed character, not the cursor.
const int realCcolumn = _screen->getCursorY() + _screen->getHistLines();
_currentUrl.begin = Coordinate{realCcolumn, _screen->getCursorX() - 1};
}
_currentUrl.text += c;
}
void EscapeSequenceUrlExtractor::setUrl(const QString& url)
{
if (_allowedUriSchemas.contains(QUrl(url).scheme() + QLatin1String("://"))) {
_currentUrl.url = url;
} else {
abortUrlInput();
}
}
void EscapeSequenceUrlExtractor::abortUrlInput()
{
_reading = false;
_currentUrl = ExtractedUrl{};
_ignoreNextUrlInput = true;
}
void EscapeSequenceUrlExtractor::endUrlInput()
{
Q_ASSERT(reading());
_reading = false;
const int realCcolumn = _screen->getCursorY() + _screen->getHistLines();
const auto currentPos = Coordinate{realCcolumn, _screen->getCursorX()};
_currentUrl.end = currentPos;
_history.append(_currentUrl);
_currentUrl = ExtractedUrl{};
}
void EscapeSequenceUrlExtractor::clear()
{
_history.clear();
}
void EscapeSequenceUrlExtractor::setAllowedLinkSchema(const QStringList& schema)
{
_allowedUriSchemas = schema;
}
void EscapeSequenceUrlExtractor::historyLinesRemoved(int lines)
{
for (auto &url : _history) {
url.begin.row -= lines;
url.end.row -= lines;
}
_history.erase(
std::remove_if(std::begin(_history), std::end(_history), [](const ExtractedUrl& url) {
const bool toRemove = url.begin.row < 0;
return toRemove;
}),
std::end(_history));
}
QVector<ExtractedUrl> EscapeSequenceUrlExtractor::history() const
{
return _history;
}
void Konsole::EscapeSequenceUrlExtractor::toggleUrlInput()
{
if (_ignoreNextUrlInput) {
_ignoreNextUrlInput = false;
return;
}
if (_reading) {
endUrlInput();
} else {
beginUrlInput();
}
}
}