Change css-escape-polyfill to a tw uitility method (#5552)

* Replace css-escape-polyfill.js with escapecss.js utility module

* Add $tw.utils.escapeCSS() method and invoke that function within the
  escapecss operator.

* Add test cases for the "escapecss" filter operator

* Fix $tw.boot.doesTaskMatchPlatform() so it works as expected if
  a module's export.platforms contains more than one values

* Add missed files to the last commit
This commit is contained in:
cdruan 2021-04-02 01:25:01 -07:00 committed by GitHub
parent d6ea369f5e
commit 3b35411aba
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 45 additions and 31 deletions

View File

@ -2467,16 +2467,29 @@ $tw.boot.executeNextStartupTask = function(callback) {
}; };
/* /*
Returns true if we are running on one platforms specified in a task modules `platforms` array Returns true if we are running on one of the platforms specified in taskModule's
`platforms` array; or if `platforms` property is not defined.
*/ */
$tw.boot.doesTaskMatchPlatform = function(taskModule) { $tw.boot.doesTaskMatchPlatform = function(taskModule) {
var platforms = taskModule.platforms; var platforms = taskModule.platforms;
if(platforms) { if(platforms) {
for(var t=0; t<platforms.length; t++) { for(var t=0; t<platforms.length; t++) {
if((platforms[t] === "browser" && !$tw.browser) || (platforms[t] === "node" && !$tw.node)) { switch (platforms[t]) {
return false; case "browser":
if ($tw.browser) {
return true;
}
break;
case "node":
if ($tw.node) {
return true;
}
break;
default:
$tw.utils.error("Module " + taskModule.name + ": '" + platforms[t] + "' in export.platforms invalid");
} }
} }
return false;
} }
return true; return true;
}; };

View File

@ -102,7 +102,7 @@ exports.escapecss = function(source,operator,options) {
var results = []; var results = [];
source(function(tiddler,title) { source(function(tiddler,title) {
// escape any character with a special meaning in CSS using CSS.escape() // escape any character with a special meaning in CSS using CSS.escape()
results.push(CSS.escape(title)); results.push($tw.utils.escapeCSS(title));
}); });
return results; return results;
}; };

View File

@ -1,33 +1,28 @@
/*\ /*\
title: $:/core/modules/startup/CSSescape.js title: $:/core/modules/utils/escapecss.js
type: application/javascript type: application/javascript
module-type: startup module-type: utils
Polyfill for CSS.escape() Provides CSS.escape() functionality.
\*/ \*/
(function(root,factory){ (function(){
/*jslint node: true, browser: true */ /*jslint node: true, browser: true */
/*global $tw: false */ /*global $tw: false, window: false */
"use strict"; "use strict";
// Export name and synchronous status exports.escapeCSS = (function() {
exports.name = "css-escape"; // use browser's native CSS.escape() function if available
exports.platforms = ["browser"]; if ($tw.browser && window.CSS && window.CSS.escape) {
exports.after = ["startup"]; return window.CSS.escape;
exports.synchronous = true;
/*! https://mths.be/cssescape v1.5.1 by @mathias | MIT license */
// https://github.com/umdjs/umd/blob/master/returnExports.js
exports.startup = function() {factory(root);};
}(typeof global != 'undefined' ? global : this, function(root) {
if (root.CSS && root.CSS.escape) {
return;
} }
// https://drafts.csswg.org/cssom/#serialize-an-identifier // otherwise, a utility method is provided
var cssEscape = function(value) { // see also https://drafts.csswg.org/cssom/#serialize-an-identifier
/*! https://mths.be/cssescape v1.5.1 by @mathias | MIT license */
return function(value) {
if (arguments.length == 0) { if (arguments.length == 0) {
throw new TypeError('`CSS.escape` requires an argument.'); throw new TypeError('`CSS.escape` requires an argument.');
} }
@ -104,11 +99,6 @@ exports.startup = function() {factory(root);};
} }
return result; return result;
}; };
})();
if (!root.CSS) { })();
root.CSS = {};
}
Object.getPrototypeOf(root.CSS).escape = cssEscape;
}));

View File

@ -796,6 +796,17 @@ function runTests(wiki) {
expect(wiki.filterTiddlers("[[12]pad[9],[abc]]").join(",")).toBe("abcabca12"); expect(wiki.filterTiddlers("[[12]pad[9],[abc]]").join(",")).toBe("abcabca12");
expect(wiki.filterTiddlers("[[12]pad:suffix[9],[abc]]").join(",")).toBe("12abcabca"); expect(wiki.filterTiddlers("[[12]pad:suffix[9],[abc]]").join(",")).toBe("12abcabca");
}); });
it("should handle the escapecss operator", function() {
expect(wiki.filterTiddlers("[[Hello There]escapecss[]]").join(",")).toBe("Hello\\ There");
expect(wiki.filterTiddlers('\'"Reveal.js" by Devin Weaver[1]\' +[escapecss[]]').join(",")).toBe('\\"Reveal\\.js\\"\\ by\\ Devin\\ Weaver\\[1\\]');
expect(wiki.filterTiddlers(".foo#bar (){} '--a' 0 \0 +[escapecss[]]").join(",")).toBe("\\.foo\\#bar,\\(\\)\\{\\},--a,\\30 ,\ufffd");
expect(wiki.filterTiddlers("'' +[escapecss[]]").join(",")).toBe("");
expect(wiki.filterTiddlers("1234 +[escapecss[]]").join(",")).toBe("\\31 234");
expect(wiki.filterTiddlers("'-25' +[escapecss[]]").join(",")).toBe("-\\32 5");
expect(wiki.filterTiddlers("'-' +[escapecss[]]").join(",")).toBe("\\-");
});
} }
}); });