296 lines
8.0 KiB
JavaScript
296 lines
8.0 KiB
JavaScript
"use strict";
|
|
var wp;
|
|
(wp ||= {}).shortcode = (() => {
|
|
var __defProp = Object.defineProperty;
|
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
var __export = (target, all) => {
|
|
for (var name in all)
|
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
};
|
|
var __copyProps = (to, from, except, desc) => {
|
|
if (from && typeof from === "object" || typeof from === "function") {
|
|
for (let key of __getOwnPropNames(from))
|
|
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
}
|
|
return to;
|
|
};
|
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
|
|
// packages/shortcode/build-module/index.mjs
|
|
var index_exports = {};
|
|
__export(index_exports, {
|
|
attrs: () => attrs,
|
|
default: () => index_default,
|
|
fromMatch: () => fromMatch,
|
|
next: () => next,
|
|
regexp: () => regexp,
|
|
replace: () => replace,
|
|
string: () => string
|
|
});
|
|
|
|
// node_modules/memize/dist/index.js
|
|
function memize(fn, options) {
|
|
var size = 0;
|
|
var head;
|
|
var tail;
|
|
options = options || {};
|
|
function memoized() {
|
|
var node = head, len = arguments.length, args, i;
|
|
searchCache: while (node) {
|
|
if (node.args.length !== arguments.length) {
|
|
node = node.next;
|
|
continue;
|
|
}
|
|
for (i = 0; i < len; i++) {
|
|
if (node.args[i] !== arguments[i]) {
|
|
node = node.next;
|
|
continue searchCache;
|
|
}
|
|
}
|
|
if (node !== head) {
|
|
if (node === tail) {
|
|
tail = node.prev;
|
|
}
|
|
node.prev.next = node.next;
|
|
if (node.next) {
|
|
node.next.prev = node.prev;
|
|
}
|
|
node.next = head;
|
|
node.prev = null;
|
|
head.prev = node;
|
|
head = node;
|
|
}
|
|
return node.val;
|
|
}
|
|
args = new Array(len);
|
|
for (i = 0; i < len; i++) {
|
|
args[i] = arguments[i];
|
|
}
|
|
node = {
|
|
args,
|
|
// Generate the result from original function
|
|
val: fn.apply(null, args)
|
|
};
|
|
if (head) {
|
|
head.prev = node;
|
|
node.next = head;
|
|
} else {
|
|
tail = node;
|
|
}
|
|
if (size === /** @type {MemizeOptions} */
|
|
options.maxSize) {
|
|
tail = /** @type {MemizeCacheNode} */
|
|
tail.prev;
|
|
tail.next = null;
|
|
} else {
|
|
size++;
|
|
}
|
|
head = node;
|
|
return node.val;
|
|
}
|
|
memoized.clear = function() {
|
|
head = null;
|
|
tail = null;
|
|
size = 0;
|
|
};
|
|
return memoized;
|
|
}
|
|
|
|
// packages/shortcode/build-module/index.mjs
|
|
function next(tag, text, index = 0) {
|
|
const re = regexp(tag);
|
|
re.lastIndex = index;
|
|
const match = re.exec(text);
|
|
if (!match) {
|
|
return;
|
|
}
|
|
if ("[" === match[1] && "]" === match[7]) {
|
|
return next(tag, text, re.lastIndex);
|
|
}
|
|
const result = {
|
|
index: match.index,
|
|
content: match[0],
|
|
shortcode: fromMatch(match)
|
|
};
|
|
if (match[1]) {
|
|
result.content = result.content.slice(1);
|
|
result.index++;
|
|
}
|
|
if (match[7]) {
|
|
result.content = result.content.slice(0, -1);
|
|
}
|
|
return result;
|
|
}
|
|
function replace(tag, text, callback) {
|
|
return text.replace(
|
|
regexp(tag),
|
|
// Let us use spread syntax to capture the arguments object.
|
|
(...args) => {
|
|
const match = args[0];
|
|
const left = args[1];
|
|
const right = args[7];
|
|
if (left === "[" && right === "]") {
|
|
return match;
|
|
}
|
|
const result = callback(fromMatch(args));
|
|
return result || result === "" ? left + result + right : match;
|
|
}
|
|
);
|
|
}
|
|
function string(options) {
|
|
return new Shortcode(options).string();
|
|
}
|
|
function regexp(tag) {
|
|
return new RegExp(
|
|
"\\[(\\[?)(" + tag + ")(?![\\w-])([^\\]\\/]*(?:\\/(?!\\])[^\\]\\/]*)*?)(?:(\\/)\\]|\\](?:([^\\[]*(?:\\[(?!\\/\\2\\])[^\\[]*)*)(\\[\\/\\2\\]))?)(\\]?)",
|
|
"g"
|
|
);
|
|
}
|
|
var attrs = memize((text) => {
|
|
const named = {};
|
|
const numeric = [];
|
|
const pattern = /([\w-]+)\s*=\s*"([^"]*)"(?:\s|$)|([\w-]+)\s*=\s*'([^']*)'(?:\s|$)|([\w-]+)\s*=\s*([^\s'"]+)(?:\s|$)|"([^"]*)"(?:\s|$)|'([^']*)'(?:\s|$)|(\S+)(?:\s|$)/g;
|
|
text = text.replace(/[\u00a0\u200b]/g, " ");
|
|
let match;
|
|
while (match = pattern.exec(text)) {
|
|
if (match[1]) {
|
|
named[match[1].toLowerCase()] = match[2];
|
|
} else if (match[3]) {
|
|
named[match[3].toLowerCase()] = match[4];
|
|
} else if (match[5]) {
|
|
named[match[5].toLowerCase()] = match[6];
|
|
} else if (match[7]) {
|
|
numeric.push(match[7]);
|
|
} else if (match[8]) {
|
|
numeric.push(match[8]);
|
|
} else if (match[9]) {
|
|
numeric.push(match[9]);
|
|
}
|
|
}
|
|
return { named, numeric };
|
|
});
|
|
function fromMatch(match) {
|
|
let type;
|
|
if (match[4]) {
|
|
type = "self-closing";
|
|
} else if (match[6]) {
|
|
type = "closed";
|
|
} else {
|
|
type = "single";
|
|
}
|
|
return new Shortcode({
|
|
tag: match[2],
|
|
attrs: match[3],
|
|
type,
|
|
content: match[5]
|
|
});
|
|
}
|
|
var Shortcode = class {
|
|
// Instance properties
|
|
tag;
|
|
type;
|
|
content;
|
|
attrs;
|
|
// Static methods
|
|
static next = next;
|
|
static replace = replace;
|
|
static string = string;
|
|
static regexp = regexp;
|
|
static attrs = attrs;
|
|
static fromMatch = fromMatch;
|
|
constructor(options) {
|
|
const { tag, attrs: attributes, type, content } = options;
|
|
this.tag = tag;
|
|
this.type = type;
|
|
this.content = content;
|
|
this.attrs = {
|
|
named: {},
|
|
numeric: []
|
|
};
|
|
if (!attributes) {
|
|
return;
|
|
}
|
|
if (typeof attributes === "string") {
|
|
this.attrs = attrs(attributes);
|
|
} else if ("named" in attributes && "numeric" in attributes && attributes.named !== void 0 && attributes.numeric !== void 0) {
|
|
this.attrs = attributes;
|
|
} else {
|
|
Object.entries(attributes).forEach(([key, value]) => {
|
|
if (value !== void 0) {
|
|
this.set(key, String(value));
|
|
}
|
|
});
|
|
}
|
|
}
|
|
/**
|
|
* Get a shortcode attribute.
|
|
*
|
|
* Automatically detects whether `attr` is named or numeric and routes it
|
|
* accordingly.
|
|
*
|
|
* @param attr Attribute key.
|
|
*
|
|
* @return Attribute value.
|
|
*/
|
|
get(attr) {
|
|
if (typeof attr === "number") {
|
|
return this.attrs.numeric[attr];
|
|
}
|
|
return this.attrs.named[attr];
|
|
}
|
|
/**
|
|
* Set a shortcode attribute.
|
|
*
|
|
* Automatically detects whether `attr` is named or numeric and routes it
|
|
* accordingly.
|
|
*
|
|
* @param attr Attribute key.
|
|
* @param value Attribute value.
|
|
*
|
|
* @return Shortcode instance.
|
|
*/
|
|
set(attr, value) {
|
|
if (typeof attr === "number") {
|
|
this.attrs.numeric[attr] = value;
|
|
} else {
|
|
this.attrs.named[attr] = value;
|
|
}
|
|
return this;
|
|
}
|
|
/**
|
|
* Transform the shortcode into a string.
|
|
*
|
|
* @return String representation of the shortcode.
|
|
*/
|
|
string() {
|
|
let text = "[" + this.tag;
|
|
this.attrs.numeric.forEach((value) => {
|
|
if (/\s/.test(value)) {
|
|
text += ' "' + value + '"';
|
|
} else {
|
|
text += " " + value;
|
|
}
|
|
});
|
|
Object.entries(this.attrs.named).forEach(([name, value]) => {
|
|
text += " " + name + '="' + value + '"';
|
|
});
|
|
if ("single" === this.type) {
|
|
return text + "]";
|
|
} else if ("self-closing" === this.type) {
|
|
return text + " /]";
|
|
}
|
|
text += "]";
|
|
if (this.content) {
|
|
text += this.content;
|
|
}
|
|
return text + "[/" + this.tag + "]";
|
|
}
|
|
};
|
|
var index_default = Shortcode;
|
|
return __toCommonJS(index_exports);
|
|
})();
|
|
if (typeof wp.shortcode === 'object' && wp.shortcode.default) { wp.shortcode = wp.shortcode.default; }
|