diff options
| author | Mike Skec <skec@protonmail.ch> | 2021-03-07 18:32:35 +1100 |
|---|---|---|
| committer | Felix Queißner <felix@ib-queissner.de> | 2021-03-07 11:25:59 +0100 |
| commit | 27236f6ef005674dd5799e277dd7843be3b39aac (patch) | |
| tree | 02817ed3e00020b782c7afbc3e1a46b6324ff28b /src | |
| parent | bde8f18a167460c1b31f4bef2f4adc6ff20e13d2 (diff) | |
| download | kristall-27236f6ef005674dd5799e277dd7843be3b39aac.tar.gz | |
Add preference for ANSI escape codes
Diffstat (limited to 'src')
| -rw-r--r-- | src/dialogs/settingsdialog.cpp | 20 | ||||
| -rw-r--r-- | src/dialogs/settingsdialog.hpp | 2 | ||||
| -rw-r--r-- | src/dialogs/settingsdialog.ui | 41 | ||||
| -rw-r--r-- | src/kristall.hpp | 8 | ||||
| -rw-r--r-- | src/main.cpp | 16 | ||||
| -rw-r--r-- | src/renderers/geminirenderer.cpp | 15 | ||||
| -rw-r--r-- | src/renderers/renderhelpers.cpp | 17 |
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); } } |
