util: Implement fixMarkup in util as opposed to messageList

We want to be able to import it in the markup unit test without
bringing in a UI dependency.

https://bugzilla.gnome.org/show_bug.cgi?id=783738

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3164>
This commit is contained in:
Sam Spilsbury 2017-06-14 00:50:03 +08:00 committed by Marge Bot
parent 4711f6eee4
commit 3d9c40783f
3 changed files with 35 additions and 34 deletions

View File

@ -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 &amp;, &quot;, &apos;, &lt; and &gt;, escape all other
// occurrences of '&'.
let _text = text.replace(/&(?!amp;|quot;|apos;|lt;|gt;)/g, '&amp;');
// Support <b>, <i>, and <u>, escape anything else
// so it displays as raw markup.
_text = _text.replace(/<(?!\/?[biu]>)/g, '&lt;');
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}

View File

@ -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 &amp;, &quot;, &apos;, &lt; and &gt;, escape all other
// occurrences of '&'.
let _text = text.replace(/&(?!amp;|quot;|apos;|lt;|gt;)/g, '&amp;');
// Support <b>, <i>, and <u>, escape anything else
// so it displays as raw markup.
// Ref: https://developer.gnome.org/notification-spec/#markup
_text = _text.replace(/<(?!\/?[biu]>)/g, '&lt;');
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');
}

View File

@ -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;