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:
parent
4711f6eee4
commit
3d9c40783f
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
import Gio from 'gi://Gio';
|
import Gio from 'gi://Gio';
|
||||||
import GLib from 'gi://GLib';
|
import GLib from 'gi://GLib';
|
||||||
|
import Pango from 'gi://Pango';
|
||||||
import Shell from 'gi://Shell';
|
import Shell from 'gi://Shell';
|
||||||
import St from 'gi://St';
|
import St from 'gi://St';
|
||||||
import GnomeDesktop from 'gi://GnomeDesktop';
|
import GnomeDesktop from 'gi://GnomeDesktop';
|
||||||
@ -189,6 +190,35 @@ function _handleSpawnError(command, err) {
|
|||||||
({notifyError}) => notifyError(title, err.message));
|
({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 <b>, <i>, and <u>, 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
|
* Returns an {@link St.Label} with the date passed formatted
|
||||||
* using {@link formatTime}
|
* using {@link formatTime}
|
||||||
|
@ -18,32 +18,6 @@ const MESSAGE_ANIMATION_TIME = 100;
|
|||||||
|
|
||||||
const DEFAULT_EXPAND_LINES = 6;
|
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 <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, '<');
|
|
||||||
|
|
||||||
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(
|
export const URLHighlighter = GObject.registerClass(
|
||||||
class URLHighlighter extends St.Label {
|
class URLHighlighter extends St.Label {
|
||||||
_init(text = '', lineWrap, allowMarkup) {
|
_init(text = '', lineWrap, allowMarkup) {
|
||||||
@ -127,7 +101,7 @@ class URLHighlighter extends St.Label {
|
|||||||
}
|
}
|
||||||
|
|
||||||
setMarkup(text, allowMarkup) {
|
setMarkup(text, allowMarkup) {
|
||||||
text = text ? _fixMarkup(text, allowMarkup) : '';
|
text = text ? Util.fixMarkup(text, allowMarkup) : '';
|
||||||
this._text = text;
|
this._text = text;
|
||||||
|
|
||||||
this.clutter_text.set_markup(text);
|
this.clutter_text.set_markup(text);
|
||||||
@ -560,7 +534,7 @@ export const Message = GObject.registerClass({
|
|||||||
|
|
||||||
set title(text) {
|
set title(text) {
|
||||||
this._titleText = 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.titleLabel.clutter_text.set_markup(title);
|
||||||
this.notify('title');
|
this.notify('title');
|
||||||
}
|
}
|
||||||
|
@ -5,10 +5,7 @@
|
|||||||
const JsUnit = imports.jsUnit;
|
const JsUnit = imports.jsUnit;
|
||||||
import Pango from 'gi://Pango';
|
import Pango from 'gi://Pango';
|
||||||
|
|
||||||
import 'resource:///org/gnome/shell/ui/environment.js';
|
import {fixMarkup} from 'resource:///org/gnome/shell/misc/util.js';
|
||||||
import 'resource:///org/gnome/shell/ui/main.js';
|
|
||||||
|
|
||||||
import * as MessageList from 'resource:///org/gnome/shell/ui/messageList.js';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Assert that `input`, assumed to be markup, gets "fixed" to `output`,
|
* 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) {
|
function assertConverts(input, output) {
|
||||||
if (!output)
|
if (!output)
|
||||||
output = input;
|
output = input;
|
||||||
let fixed = MessageList._fixMarkup(input, true);
|
let fixed = fixMarkup(input, true);
|
||||||
JsUnit.assertEquals(output, fixed);
|
JsUnit.assertEquals(output, fixed);
|
||||||
|
|
||||||
let parsed = false;
|
let parsed = false;
|
||||||
@ -41,7 +38,7 @@ function assertConverts(input, output) {
|
|||||||
* @param {string} output the output
|
* @param {string} output the output
|
||||||
*/
|
*/
|
||||||
function assertEscapes(input, output) {
|
function assertEscapes(input, output) {
|
||||||
let fixed = MessageList._fixMarkup(input, false);
|
let fixed = fixMarkup(input, false);
|
||||||
JsUnit.assertEquals(output, fixed);
|
JsUnit.assertEquals(output, fixed);
|
||||||
|
|
||||||
let parsed = false;
|
let parsed = false;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user