aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Skec <skec@protonmail.ch>2021-03-07 18:32:35 +1100
committerFelix Queißner <felix@ib-queissner.de>2021-03-07 11:25:59 +0100
commit27236f6ef005674dd5799e277dd7843be3b39aac (patch)
tree02817ed3e00020b782c7afbc3e1a46b6324ff28b /src
parentbde8f18a167460c1b31f4bef2f4adc6ff20e13d2 (diff)
downloadkristall-27236f6ef005674dd5799e277dd7843be3b39aac.tar.gz
Add preference for ANSI escape codes
Diffstat (limited to 'src')
-rw-r--r--src/dialogs/settingsdialog.cpp20
-rw-r--r--src/dialogs/settingsdialog.hpp2
-rw-r--r--src/dialogs/settingsdialog.ui41
-rw-r--r--src/kristall.hpp8
-rw-r--r--src/main.cpp16
-rw-r--r--src/renderers/geminirenderer.cpp15
-rw-r--r--src/renderers/renderhelpers.cpp17
7 files changed, 92 insertions, 27 deletions
diff --git a/src/dialogs/settingsdialog.cpp b/src/dialogs/settingsdialog.cpp
index 862963b..941b1d0 100644
--- a/src/dialogs/settingsdialog.cpp
+++ b/src/dialogs/settingsdialog.cpp
@@ -44,6 +44,11 @@ SettingsDialog::SettingsDialog(QWidget *parent) :
this->ui->ui_density->addItem(tr("Compact"), QVariant::fromValue<int>(int(UIDensity::compact)));
this->ui->ui_density->addItem(tr("Classic"), QVariant::fromValue<int>(int(UIDensity::classic)));
+ this->ui->ansi_escapes->clear();
+ this->ui->ansi_escapes->addItem(tr("Ignore"), QVariant::fromValue<int>(int(AnsiEscRenderMode::ignore)));
+ this->ui->ansi_escapes->addItem(tr("Render"), QVariant::fromValue<int>(int(AnsiEscRenderMode::render)));
+ this->ui->ansi_escapes->addItem(tr("Strip"), QVariant::fromValue<int>(int(AnsiEscRenderMode::strip)));
+
this->ui->list_symbol->clear();
this->ui->list_symbol->addItem(tr("Filled circle"), QVariant::fromValue<int>(int(QTextListFormat::Style::ListDisc)));
this->ui->list_symbol->addItem(tr("Circle"), QVariant::fromValue<int>(int(QTextListFormat::Style::ListCircle)));
@@ -256,6 +261,16 @@ void SettingsDialog::setOptions(const GenericSettings &options)
}
}
+ this->ui->ansi_escapes->setCurrentIndex(0);
+ for(int i = 0; i < this->ui->ansi_escapes->count(); ++i)
+ {
+ if(this->ui->ansi_escapes->itemData(i).toInt() == int(options.ansi_escapes)) {
+ this->ui->ansi_escapes->setCurrentIndex(i);
+ break;
+ }
+ }
+
+
this->ui->start_page->setText(this->current_options.start_page);
this->ui->search_engine->clear();
@@ -867,6 +882,11 @@ void SettingsDialog::on_emojis_off_clicked()
this->current_options.emojis_enabled = false;
}
+void SettingsDialog::on_ansi_escapes_currentIndexChanged(int index)
+{
+ this->current_options.ansi_escapes = AnsiEscRenderMode(this->ui->ansi_escapes->itemData(index).toInt());
+}
+
void SettingsDialog::on_fancyquotes_on_clicked()
{
this->current_options.fancy_quotes = true;
diff --git a/src/dialogs/settingsdialog.hpp b/src/dialogs/settingsdialog.hpp
index c1ba1c3..e564157 100644
--- a/src/dialogs/settingsdialog.hpp
+++ b/src/dialogs/settingsdialog.hpp
@@ -154,6 +154,8 @@ private slots:
void on_emojis_on_clicked();
void on_emojis_off_clicked();
+ void on_ansi_escapes_currentIndexChanged(int index);
+
void on_redirection_mode_currentIndexChanged(int index);
void on_max_redirects_valueChanged(int arg1);
diff --git a/src/dialogs/settingsdialog.ui b/src/dialogs/settingsdialog.ui
index 3f30c11..f442603 100644
--- a/src/dialogs/settingsdialog.ui
+++ b/src/dialogs/settingsdialog.ui
@@ -406,38 +406,53 @@
</item>
</layout>
</item>
+
<item row="14" column="0">
+ <widget class="QLabel" name="ansi_label">
+ <property name="text">
+ <string>ANSI Escape Sequences</string>
+ </property>
+ <property name="toolTip">
+ <string>Determine how to render ANSI escape sequences</string>
+ </property>
+ </widget>
+ </item>
+ <item row="14" column="1">
+ <widget class="QComboBox" name="ansi_escapes"/>
+ </item>
+
+ <item row="15" column="0">
<widget class="QLabel" name="label_26">
<property name="text">
<string>Max. Number of Redirections</string>
</property>
</widget>
</item>
- <item row="14" column="1">
+ <item row="15" column="1">
<widget class="QSpinBox" name="max_redirects">
<property name="value">
<number>5</number>
</property>
</widget>
</item>
- <item row="15" column="0">
+ <item row="16" column="0">
<widget class="QLabel" name="label_27">
<property name="text">
<string>Redirection Handling</string>
</property>
</widget>
</item>
- <item row="15" column="1">
+ <item row="16" column="1">
<widget class="QComboBox" name="redirection_mode"/>
</item>
- <item row="16" column="0">
+ <item row="17" column="0">
<widget class="QLabel" name="label_28">
<property name="text">
<string>Network Timeout</string>
</property>
</widget>
</item>
- <item row="16" column="1">
+ <item row="17" column="1">
<widget class="QSpinBox" name="network_timeout">
<property name="suffix">
<string> ms</string>
@@ -450,14 +465,14 @@
</property>
</widget>
</item>
- <item row="17" column="0">
+ <item row="18" column="0">
<widget class="QLabel" name="label_29">
<property name="text">
<string>Additional toolbar buttons</string>
</property>
</widget>
</item>
- <item row="17" column="1">
+ <item row="18" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_99">
<item>
<widget class="QCheckBox" name="enable_home_btn">
@@ -489,7 +504,7 @@
</item>
</layout>
</item>
- <item row="18" column="0">
+ <item row="19" column="0">
<widget class="QLabel" name="label_30">
<property name="text">
<string>Total cache size limit</string>
@@ -499,7 +514,7 @@
</property>
</widget>
</item>
- <item row="18" column="1">
+ <item row="19" column="1">
<widget class="QSpinBox" name="cache_limit">
<property name="suffix">
<string> KiB</string>
@@ -513,7 +528,7 @@
</widget>
</item>
- <item row="19" column="0">
+ <item row="20" column="0">
<widget class="QLabel" name="label_31">
<property name="text">
<string>Cached item size threshold</string>
@@ -523,7 +538,7 @@
</property>
</widget>
</item>
- <item row="19" column="1">
+ <item row="20" column="1">
<widget class="QSpinBox" name="cache_threshold">
<property name="suffix">
<string> KiB</string>
@@ -537,7 +552,7 @@
</widget>
</item>
- <item row="20" column="0">
+ <item row="21" column="0">
<widget class="QLabel" name="label_31">
<property name="text">
<string>Cached item life</string>
@@ -547,7 +562,7 @@
</property>
</widget>
</item>
- <item row="20" column="1">
+ <item row="21" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_25">
<item>
<widget class="QSpinBox" name="cache_life">
diff --git a/src/kristall.hpp b/src/kristall.hpp
index 096c6e9..950d811 100644
--- a/src/kristall.hpp
+++ b/src/kristall.hpp
@@ -43,6 +43,13 @@ enum class IconTheme : int
light = 1
};
+enum class AnsiEscRenderMode : int
+{
+ ignore = 0,
+ render = 1,
+ strip = 2
+};
+
struct GenericSettings
{
enum TextDisplay {
@@ -70,6 +77,7 @@ struct GenericSettings
bool fancy_urlbar = true;
bool fancy_quotes = true;
bool emojis_enabled = true;
+ AnsiEscRenderMode ansi_escapes = AnsiEscRenderMode::render;
// This is set automatically
QColor fancy_urlbar_dim_colour;
diff --git a/src/main.cpp b/src/main.cpp
index 82a225f..fcc1803 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -745,6 +745,14 @@ void GenericSettings::load(QSettings &settings)
? settings.value("emojis_enabled", true).toBool()
: false;
+ QString ansi = settings.value("ansi_escapes", "render").toString();
+ if(ansi == "ignore")
+ ansi_escapes = AnsiEscRenderMode::ignore;
+ else if(ansi == "render")
+ ansi_escapes = AnsiEscRenderMode::render;
+ else if(ansi == "strip")
+ ansi_escapes = AnsiEscRenderMode::strip;
+
max_redirections = settings.value("max_redirections", 5).toInt();
redirection_policy = RedirectionWarning(settings.value("redirection_policy ", WarnOnHostChange).toInt());
@@ -788,6 +796,14 @@ void GenericSettings::save(QSettings &settings) const
}
settings.setValue("ui_density", density);
+ QString ansi = "render";
+ switch(ansi_escapes) {
+ case AnsiEscRenderMode::ignore: ansi = "ignore"; break;
+ case AnsiEscRenderMode::render: ansi = "render"; break;
+ case AnsiEscRenderMode::strip: ansi = "strip"; break;
+ }
+ settings.setValue("ansi_escapes", ansi);
+
settings.setValue("gophermap_display", (gophermap_display == FormattedText) ? "rendered" : "text");
settings.setValue("use_os_scheme_handler", use_os_scheme_handler);
settings.setValue("show_hidden_files_in_dirs", show_hidden_files_in_dirs);
diff --git a/src/renderers/geminirenderer.cpp b/src/renderers/geminirenderer.cpp
index f3e9f16..6bcd3a4 100644
--- a/src/renderers/geminirenderer.cpp
+++ b/src/renderers/geminirenderer.cpp
@@ -84,19 +84,8 @@ std::unique_ptr<GeminiDocument> GeminiRenderer::render(
else
{
cursor.setBlockFormat(text_style.preformatted_format);
-
- // TODO: make this a preference
- const bool RENDER_ESCAPES = true;
-
- if (RENDER_ESCAPES)
- {
- renderhelpers::renderEscapeCodes(line, preformatted_fmt, text_style.preformatted, cursor);
- cursor.insertText("\n", text_style.preformatted);
- }
- else
- {
- cursor.insertText(line + "\n", text_style.preformatted);
- }
+ renderhelpers::renderEscapeCodes(line, preformatted_fmt, text_style.preformatted, cursor);
+ cursor.insertText("\n", text_style.preformatted);
}
continue;
diff --git a/src/renderers/renderhelpers.cpp b/src/renderers/renderhelpers.cpp
index 9e44fa8..a18d434 100644
--- a/src/renderers/renderhelpers.cpp
+++ b/src/renderers/renderhelpers.cpp
@@ -340,9 +340,17 @@ static QString cleanLineEndings(QString &input)
void renderhelpers::renderEscapeCodes(const QByteArray &input,
QTextCharFormat& format, const QTextCharFormat& defaultFormat, QTextCursor& cursor)
{
- const auto tokens = input.split(escapeString);
QString inputString = QString::fromUtf8(input);
cleanLineEndings(inputString);
+
+ // Don't render escapes if set to 'ignore'
+ if (kristall::globals().options.ansi_escapes == AnsiEscRenderMode::ignore)
+ {
+ cursor.insertText(input, defaultFormat);
+ return;
+ }
+
+ const auto tokens = input.split(escapeString);
for (QString::const_iterator it = inputString.cbegin(); it != inputString.cend(); ++it)
{
const auto currentCharacter = *it;;
@@ -356,8 +364,15 @@ void renderhelpers::renderEscapeCodes(const QByteArray &input,
parseCSI(input, it, format, defaultFormat, cursor);
}
}
+ else if (kristall::globals().options.ansi_escapes == AnsiEscRenderMode::strip)
+ {
+ // 'strip' mode -> we still interpret escapes as above, but just render
+ // text in the default format.
+ cursor.insertText(currentCharacter, defaultFormat);
+ }
else
{
+ // 'render' mode -> we use the interpreted ANSI format
cursor.insertText(currentCharacter, format);
}
}