211 lines
6.9 KiB
JavaScript
211 lines
6.9 KiB
JavaScript
"use strict";
|
|
var wp;
|
|
(wp ||= {}).wordcount = (() => {
|
|
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/wordcount/build-module/index.mjs
|
|
var index_exports = {};
|
|
__export(index_exports, {
|
|
count: () => count
|
|
});
|
|
|
|
// packages/wordcount/build-module/defaultSettings.mjs
|
|
var defaultSettings = {
|
|
HTMLRegExp: /<\/?[a-z][^>]*?>/gi,
|
|
HTMLcommentRegExp: /<!--[\s\S]*?-->/g,
|
|
spaceRegExp: / | /gi,
|
|
HTMLEntityRegExp: /&\S+?;/g,
|
|
// \u2014 = em-dash.
|
|
connectorRegExp: /--|\u2014/g,
|
|
// Characters to be removed from input text.
|
|
removeRegExp: new RegExp(
|
|
[
|
|
"[",
|
|
// Basic Latin (extract)
|
|
"!-/:-@[-`{-~",
|
|
// Latin-1 Supplement (extract)
|
|
"\x80-\xBF\xD7\xF7",
|
|
/*
|
|
* The following range consists of:
|
|
* General Punctuation
|
|
* Superscripts and Subscripts
|
|
* Currency Symbols
|
|
* Combining Diacritical Marks for Symbols
|
|
* Letterlike Symbols
|
|
* Number Forms
|
|
* Arrows
|
|
* Mathematical Operators
|
|
* Miscellaneous Technical
|
|
* Control Pictures
|
|
* Optical Character Recognition
|
|
* Enclosed Alphanumerics
|
|
* Box Drawing
|
|
* Block Elements
|
|
* Geometric Shapes
|
|
* Miscellaneous Symbols
|
|
* Dingbats
|
|
* Miscellaneous Mathematical Symbols-A
|
|
* Supplemental Arrows-A
|
|
* Braille Patterns
|
|
* Supplemental Arrows-B
|
|
* Miscellaneous Mathematical Symbols-B
|
|
* Supplemental Mathematical Operators
|
|
* Miscellaneous Symbols and Arrows
|
|
*/
|
|
"\u2000-\u2BFF",
|
|
// Supplemental Punctuation.
|
|
"\u2E00-\u2E7F",
|
|
"]"
|
|
].join(""),
|
|
"g"
|
|
),
|
|
// Remove UTF-16 surrogate points, see https://en.wikipedia.org/wiki/UTF-16#U.2BD800_to_U.2BDFFF
|
|
astralRegExp: /[\uD800-\uDBFF][\uDC00-\uDFFF]/g,
|
|
wordsRegExp: /\S\s+/g,
|
|
characters_excluding_spacesRegExp: /\S/g,
|
|
/*
|
|
* Match anything that is not a formatting character, excluding:
|
|
* \f = form feed
|
|
* \n = new line
|
|
* \r = carriage return
|
|
* \t = tab
|
|
* \v = vertical tab
|
|
* \u00AD = soft hyphen
|
|
* \u2028 = line separator
|
|
* \u2029 = paragraph separator
|
|
*/
|
|
characters_including_spacesRegExp: /[^\f\n\r\t\v\u00AD\u2028\u2029]/g,
|
|
l10n: {
|
|
type: "words"
|
|
}
|
|
};
|
|
|
|
// packages/wordcount/build-module/stripTags.mjs
|
|
function stripTags(settings, text) {
|
|
return text.replace(settings.HTMLRegExp, "\n");
|
|
}
|
|
|
|
// packages/wordcount/build-module/transposeAstralsToCountableChar.mjs
|
|
function transposeAstralsToCountableChar(settings, text) {
|
|
return text.replace(settings.astralRegExp, "a");
|
|
}
|
|
|
|
// packages/wordcount/build-module/stripHTMLEntities.mjs
|
|
function stripHTMLEntities(settings, text) {
|
|
return text.replace(settings.HTMLEntityRegExp, "");
|
|
}
|
|
|
|
// packages/wordcount/build-module/stripConnectors.mjs
|
|
function stripConnectors(settings, text) {
|
|
return text.replace(settings.connectorRegExp, " ");
|
|
}
|
|
|
|
// packages/wordcount/build-module/stripRemovables.mjs
|
|
function stripRemovables(settings, text) {
|
|
return text.replace(settings.removeRegExp, "");
|
|
}
|
|
|
|
// packages/wordcount/build-module/stripHTMLComments.mjs
|
|
function stripHTMLComments(settings, text) {
|
|
return text.replace(settings.HTMLcommentRegExp, "");
|
|
}
|
|
|
|
// packages/wordcount/build-module/stripShortcodes.mjs
|
|
function stripShortcodes(settings, text) {
|
|
if (settings.shortcodesRegExp) {
|
|
return text.replace(settings.shortcodesRegExp, "\n");
|
|
}
|
|
return text;
|
|
}
|
|
|
|
// packages/wordcount/build-module/stripSpaces.mjs
|
|
function stripSpaces(settings, text) {
|
|
return text.replace(settings.spaceRegExp, " ");
|
|
}
|
|
|
|
// packages/wordcount/build-module/transposeHTMLEntitiesToCountableChars.mjs
|
|
function transposeHTMLEntitiesToCountableChars(settings, text) {
|
|
return text.replace(settings.HTMLEntityRegExp, "a");
|
|
}
|
|
|
|
// packages/wordcount/build-module/index.mjs
|
|
function loadSettings(type = "words", userSettings = {}) {
|
|
const mergedSettings = { ...defaultSettings, ...userSettings };
|
|
const settings = {
|
|
...mergedSettings,
|
|
type,
|
|
shortcodes: []
|
|
};
|
|
settings.shortcodes = settings.l10n?.shortcodes ?? [];
|
|
if (settings.shortcodes && settings.shortcodes.length) {
|
|
settings.shortcodesRegExp = new RegExp(
|
|
"\\[\\/?(?:" + settings.shortcodes.join("|") + ")[^\\]]*?\\]",
|
|
"g"
|
|
);
|
|
}
|
|
if (settings.type !== "characters_excluding_spaces" && settings.type !== "characters_including_spaces") {
|
|
settings.type = "words";
|
|
}
|
|
return settings;
|
|
}
|
|
function countWords(text, regex, settings) {
|
|
text = [
|
|
stripTags.bind(null, settings),
|
|
stripHTMLComments.bind(null, settings),
|
|
stripShortcodes.bind(null, settings),
|
|
stripSpaces.bind(null, settings),
|
|
stripHTMLEntities.bind(null, settings),
|
|
stripConnectors.bind(null, settings),
|
|
stripRemovables.bind(null, settings)
|
|
].reduce((result, fn) => fn(result), text);
|
|
text = text + "\n";
|
|
return text.match(regex)?.length ?? 0;
|
|
}
|
|
function countCharacters(text, regex, settings) {
|
|
text = [
|
|
stripTags.bind(null, settings),
|
|
stripHTMLComments.bind(null, settings),
|
|
stripShortcodes.bind(null, settings),
|
|
transposeAstralsToCountableChar.bind(null, settings),
|
|
stripSpaces.bind(null, settings),
|
|
transposeHTMLEntitiesToCountableChars.bind(null, settings)
|
|
].reduce((result, fn) => fn(result), text);
|
|
text = text + "\n";
|
|
return text.match(regex)?.length ?? 0;
|
|
}
|
|
function count(text, type, userSettings) {
|
|
const settings = loadSettings(type, userSettings);
|
|
let matchRegExp;
|
|
switch (settings.type) {
|
|
case "words":
|
|
matchRegExp = settings.wordsRegExp;
|
|
return countWords(text, matchRegExp, settings);
|
|
case "characters_including_spaces":
|
|
matchRegExp = settings.characters_including_spacesRegExp;
|
|
return countCharacters(text, matchRegExp, settings);
|
|
case "characters_excluding_spaces":
|
|
matchRegExp = settings.characters_excluding_spacesRegExp;
|
|
return countCharacters(text, matchRegExp, settings);
|
|
default:
|
|
return 0;
|
|
}
|
|
}
|
|
return __toCommonJS(index_exports);
|
|
})();
|