diff --git a/js/misc/util.js b/js/misc/util.js index 161733b5d..4c172988a 100644 --- a/js/misc/util.js +++ b/js/misc/util.js @@ -2,6 +2,7 @@ import Gio from 'gi://Gio'; import GLib from 'gi://GLib'; +import Pango from 'gi://Pango'; import Shell from 'gi://Shell'; import St from 'gi://St'; import GnomeDesktop from 'gi://GnomeDesktop'; @@ -189,6 +190,35 @@ function _handleSpawnError(command, err) { ({notifyError}) => notifyError(title, err.message)); } +/** + * Fix up embedded markup so that it can be displayed correctly in + * UI elements such as the message list. In some cases, we might want to + * keep some of the embedded markup, so specify allowMarkup for that case + * + * @param {string} text containing markup to escape and parse + * @param {boolean} allowMarkup to allow embedded markup or just escape it all + * @returns the escaped string + */ +export function fixMarkup(text, allowMarkup) { + if (allowMarkup) { + // Support &, ", ', < and >, escape all other + // occurrences of '&'. + let _text = text.replace(/&(?!amp;|quot;|apos;|lt;|gt;)/g, '&'); + + // Support , , and , escape anything else + // so it displays as raw markup. + _text = _text.replace(/<(?!\/?[biu]>)/g, '<'); + + try { + Pango.parse_markup(_text, -1, ''); + return _text; + } catch (e) {} + } + + // !allowMarkup, or invalid markup + return GLib.markup_escape_text(text, -1); +} + /** * Returns an {@link St.Label} with the date passed formatted * using {@link formatTime} diff --git a/js/ui/messageList.js b/js/ui/messageList.js index c3039e020..ddd5abb17 100644 --- a/js/ui/messageList.js +++ b/js/ui/messageList.js @@ -18,32 +18,6 @@ const MESSAGE_ANIMATION_TIME = 100; const DEFAULT_EXPAND_LINES = 6; -/** - * @param {string} text - * @param {boolean} allowMarkup - * @returns {string} - */ -export function _fixMarkup(text, allowMarkup) { - if (allowMarkup) { - // Support &, ", ', < and >, escape all other - // occurrences of '&'. - let _text = text.replace(/&(?!amp;|quot;|apos;|lt;|gt;)/g, '&'); - - // Support , , and , escape anything else - // so it displays as raw markup. - // Ref: https://developer.gnome.org/notification-spec/#markup - _text = _text.replace(/<(?!\/?[biu]>)/g, '<'); - - try { - Pango.parse_markup(_text, -1, ''); - return _text; - } catch (e) {} - } - - // !allowMarkup, or invalid markup - return GLib.markup_escape_text(text, -1); -} - export const URLHighlighter = GObject.registerClass( class URLHighlighter extends St.Label { _init(text = '', lineWrap, allowMarkup) { @@ -127,7 +101,7 @@ class URLHighlighter extends St.Label { } setMarkup(text, allowMarkup) { - text = text ? _fixMarkup(text, allowMarkup) : ''; + text = text ? Util.fixMarkup(text, allowMarkup) : ''; this._text = text; this.clutter_text.set_markup(text); @@ -560,7 +534,7 @@ export const Message = GObject.registerClass({ set title(text) { this._titleText = text; - const title = text ? _fixMarkup(text.replace(/\n/g, ' '), false) : ''; + const title = text ? Util.fixMarkup(text.replace(/\n/g, ' '), false) : ''; this.titleLabel.clutter_text.set_markup(title); this.notify('title'); } diff --git a/tests/unit/markup.js b/tests/unit/markup.js index 885b213a2..78c120976 100644 --- a/tests/unit/markup.js +++ b/tests/unit/markup.js @@ -5,10 +5,7 @@ const JsUnit = imports.jsUnit; import Pango from 'gi://Pango'; -import 'resource:///org/gnome/shell/ui/environment.js'; -import 'resource:///org/gnome/shell/ui/main.js'; - -import * as MessageList from 'resource:///org/gnome/shell/ui/messageList.js'; +import {fixMarkup} from 'resource:///org/gnome/shell/misc/util.js'; /** * Assert that `input`, assumed to be markup, gets "fixed" to `output`, @@ -21,7 +18,7 @@ import * as MessageList from 'resource:///org/gnome/shell/ui/messageList.js'; function assertConverts(input, output) { if (!output) output = input; - let fixed = MessageList._fixMarkup(input, true); + let fixed = fixMarkup(input, true); JsUnit.assertEquals(output, fixed); let parsed = false; @@ -41,7 +38,7 @@ function assertConverts(input, output) { * @param {string} output the output */ function assertEscapes(input, output) { - let fixed = MessageList._fixMarkup(input, false); + let fixed = fixMarkup(input, false); JsUnit.assertEquals(output, fixed); let parsed = false;