From 27236f6ef005674dd5799e277dd7843be3b39aac Mon Sep 17 00:00:00 2001 From: Mike Skec Date: Sun, 7 Mar 2021 18:32:35 +1100 Subject: Add preference for ANSI escape codes --- src/dialogs/settingsdialog.cpp | 20 ++++++++++++++++++++ src/dialogs/settingsdialog.hpp | 2 ++ src/dialogs/settingsdialog.ui | 41 +++++++++++++++++++++++++++------------- src/kristall.hpp | 8 ++++++++ src/main.cpp | 16 ++++++++++++++++ src/renderers/geminirenderer.cpp | 15 ++------------- src/renderers/renderhelpers.cpp | 17 ++++++++++++++++- 7 files changed, 92 insertions(+), 27 deletions(-) (limited to 'src') 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(UIDensity::compact))); this->ui->ui_density->addItem(tr("Classic"), QVariant::fromValue(int(UIDensity::classic))); + this->ui->ansi_escapes->clear(); + this->ui->ansi_escapes->addItem(tr("Ignore"), QVariant::fromValue(int(AnsiEscRenderMode::ignore))); + this->ui->ansi_escapes->addItem(tr("Render"), QVariant::fromValue(int(AnsiEscRenderMode::render))); + this->ui->ansi_escapes->addItem(tr("Strip"), QVariant::fromValue(int(AnsiEscRenderMode::strip))); + this->ui->list_symbol->clear(); this->ui->list_symbol->addItem(tr("Filled circle"), QVariant::fromValue(int(QTextListFormat::Style::ListDisc))); this->ui->list_symbol->addItem(tr("Circle"), QVariant::fromValue(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 @@ + + + + ANSI Escape Sequences + + + Determine how to render ANSI escape sequences + + + + + + + + Max. Number of Redirections - + 5 - + Redirection Handling - + - + Network Timeout - + ms @@ -450,14 +465,14 @@ - + Additional toolbar buttons - + @@ -489,7 +504,7 @@ - + Total cache size limit @@ -499,7 +514,7 @@ - + KiB @@ -513,7 +528,7 @@ - + Cached item size threshold @@ -523,7 +538,7 @@ - + KiB @@ -537,7 +552,7 @@ - + Cached item life @@ -547,7 +562,7 @@ - + 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 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); } } -- cgit v1.2.3