diff options
author | Minteck <contact@minteck.org> | 2023-01-10 14:54:04 +0100 |
---|---|---|
committer | Minteck <contact@minteck.org> | 2023-01-10 14:54:04 +0100 |
commit | 99c1d9af689e5325f3cf535c4007b3aeb8325229 (patch) | |
tree | e663b3c2ebdbd67c818ac0c5147f0ce1d2463cda /school/node_modules/string-strip-html/dist/string-strip-html.esm.js | |
parent | 9871b03912fc28ad38b4037ebf26a78aa937baba (diff) | |
download | pluralconnect-99c1d9af689e5325f3cf535c4007b3aeb8325229.tar.gz pluralconnect-99c1d9af689e5325f3cf535c4007b3aeb8325229.tar.bz2 pluralconnect-99c1d9af689e5325f3cf535c4007b3aeb8325229.zip |
Update - This is an automated commit
Diffstat (limited to 'school/node_modules/string-strip-html/dist/string-strip-html.esm.js')
-rw-r--r-- | school/node_modules/string-strip-html/dist/string-strip-html.esm.js | 752 |
1 files changed, 752 insertions, 0 deletions
diff --git a/school/node_modules/string-strip-html/dist/string-strip-html.esm.js b/school/node_modules/string-strip-html/dist/string-strip-html.esm.js new file mode 100644 index 0000000..1cd9efd --- /dev/null +++ b/school/node_modules/string-strip-html/dist/string-strip-html.esm.js @@ -0,0 +1,752 @@ +/** + * @name string-strip-html + * @fileoverview Strips HTML tags from strings. No parser, accepts mixed sources. + * @version 8.3.0 + * @author Roy Revelt, Codsen Ltd + * @license MIT + * {@link https://codsen.com/os/string-strip-html/} + */ + +import isObj from 'lodash.isplainobject'; +import trim from 'lodash.trim'; +import without from 'lodash.without'; +import { decode } from 'html-entities'; +import { rApply } from 'ranges-apply'; +import { Ranges } from 'ranges-push'; +import { right } from 'string-left-right'; + +/* istanbul ignore next */ +function characterSuitableForNames(char) { + return /[-_A-Za-z0-9]/.test(char); +} +/* istanbul ignore next */ +function prepHopefullyAnArray(something, name) { + if (!something) { + return []; + } + if (Array.isArray(something)) { + return something.filter(val => typeof val === "string" && val.trim()); + } + if (typeof something === "string") { + return something.trim() ? [something] : []; + } + throw new TypeError(`string-strip-html/stripHtml(): [THROW_ID_03] ${name} must be array containing zero or more strings or something falsey. Currently it's equal to: ${something}, that a type of ${typeof something}.`); +} +/* istanbul ignore next */ +function xBeforeYOnTheRight(str, startingIdx, x, y) { + for (let i = startingIdx, len = str.length; i < len; i++) { + if (str.startsWith(x, i)) { + return true; + } + if (str.startsWith(y, i)) { + return false; + } + } + return false; +} +/* istanbul ignore next */ +function notWithinAttrQuotes(tag, str, i) { + return !tag || !tag.quotes || !xBeforeYOnTheRight(str, i + 1, tag.quotes.value, ">"); +} + +var version$1 = "8.3.0"; + +const version = version$1; +const defaults = { + ignoreTags: [], + onlyStripTags: [], + stripTogetherWithTheirContents: ["script", "style", "xml"], + skipHtmlDecoding: false, + trimOnlySpaces: false, + dumpLinkHrefsNearby: { + enabled: false, + putOnNewLine: false, + wrapHeads: "", + wrapTails: "" + }, + cb: null +}; +function stripHtml(str, originalOpts) { + const start = Date.now(); + const definitelyTagNames = new Set(["!doctype", "abbr", "address", "area", "article", "aside", "audio", "base", "bdi", "bdo", "blockquote", "body", "br", "button", "canvas", "caption", "cite", "code", "col", "colgroup", "data", "datalist", "dd", "del", "details", "dfn", "dialog", "div", "dl", "doctype", "dt", "em", "embed", "fieldset", "figcaption", "figure", "footer", "form", "h1", "h2", "h3", "h4", "h5", "h6", "head", "header", "hgroup", "hr", "html", "iframe", "img", "input", "ins", "kbd", "keygen", "label", "legend", "li", "link", "main", "map", "mark", "math", "menu", "menuitem", "meta", "meter", "nav", "noscript", "object", "ol", "optgroup", "option", "output", "param", "picture", "pre", "progress", "rb", "rp", "rt", "rtc", "ruby", "samp", "script", "section", "select", "slot", "small", "source", "span", "strong", "style", "sub", "summary", "sup", "svg", "table", "tbody", "td", "template", "textarea", "tfoot", "th", "thead", "time", "title", "tr", "track", "ul", "var", "video", "wbr", "xml"]); + const singleLetterTags = new Set(["a", "b", "i", "p", "q", "s", "u"]); + const punctuation = new Set([".", ",", "?", ";", ")", "\u2026", '"', "\u00BB"]); + const rangedOpeningTags = []; + const allTagLocations = []; + let filteredTagLocations = []; + let tag = {}; + function resetTag() { + tag = { + attributes: [] + }; + } + resetTag(); + let chunkOfWhitespaceStartsAt = null; + let chunkOfSpacesStartsAt = null; + let attrObj = {}; + let hrefDump = { + tagName: "", + hrefValue: "", + openingTagEnds: undefined + }; + let stringToInsertAfter = ""; + let hrefInsertionActive = false; + let spacesChunkWhichFollowsTheClosingBracketEndsAt = null; + function existy(x) { + return x != null; + } + function isStr(something) { + return typeof something === "string"; + } + function treatRangedTags(i, opts, rangesToDelete) { + if (Array.isArray(opts.stripTogetherWithTheirContents) && (opts.stripTogetherWithTheirContents.includes(tag.name) || opts.stripTogetherWithTheirContents.includes("*"))) { + if (Array.isArray(rangedOpeningTags) && rangedOpeningTags.some(obj => obj.name === tag.name && obj.lastClosingBracketAt < i)) { + for (let y = rangedOpeningTags.length; y--;) { + if (rangedOpeningTags[y].name === tag.name) { + /* istanbul ignore else */ + if (opts.stripTogetherWithTheirContents.includes(tag.name) || opts.stripTogetherWithTheirContents.includes("*")) { + filteredTagLocations = filteredTagLocations.filter(([from, upto]) => (from < rangedOpeningTags[y].lastOpeningBracketAt || from >= i + 1) && (upto <= rangedOpeningTags[y].lastOpeningBracketAt || upto > i + 1)); + } + let endingIdx = i + 1; + if (tag.lastClosingBracketAt) { + endingIdx = tag.lastClosingBracketAt + 1; + } + filteredTagLocations.push([rangedOpeningTags[y].lastOpeningBracketAt, endingIdx]); + /* istanbul ignore else */ + if (punctuation.has(str[i]) && opts.cb) { + opts.cb({ + tag: tag, + deleteFrom: rangedOpeningTags[y].lastOpeningBracketAt, + deleteTo: i + 1, + insert: null, + rangesArr: rangesToDelete, + proposedReturn: [rangedOpeningTags[y].lastOpeningBracketAt, i, null] + }); + } else if (opts.cb) { + opts.cb({ + tag: tag, + deleteFrom: rangedOpeningTags[y].lastOpeningBracketAt, + deleteTo: i, + insert: "", + rangesArr: rangesToDelete, + proposedReturn: [rangedOpeningTags[y].lastOpeningBracketAt, i, ""] + }); + } + rangedOpeningTags.splice(y, 1); + break; + } + } + } else { + rangedOpeningTags.push(tag); + } + } + } + function calculateWhitespaceToInsert(str2, + currCharIdx, + fromIdx, + toIdx, + lastOpeningBracketAt, + lastClosingBracketAt + ) { + let strToEvaluateForLineBreaks = ""; + if (Number.isInteger(fromIdx) && fromIdx < lastOpeningBracketAt) { + strToEvaluateForLineBreaks += str2.slice(fromIdx, lastOpeningBracketAt); + } + if (Number.isInteger(toIdx) && toIdx > lastClosingBracketAt + 1) { + const temp = str2.slice(lastClosingBracketAt + 1, toIdx); + if (temp.includes("\n") && isOpeningAt(toIdx, str2)) { + strToEvaluateForLineBreaks += " "; + } else { + strToEvaluateForLineBreaks += temp; + } + } + if (!punctuation.has(str2[currCharIdx]) && str2[currCharIdx] !== "!") { + const foundLineBreaks = strToEvaluateForLineBreaks.match(/\n/g); + if (Array.isArray(foundLineBreaks) && foundLineBreaks.length) { + if (foundLineBreaks.length === 1) { + return "\n"; + } + if (foundLineBreaks.length === 2) { + return "\n\n"; + } + return "\n\n\n"; + } + return " "; + } + return ""; + } + function calculateHrefToBeInserted(opts) { + if (opts.dumpLinkHrefsNearby.enabled && hrefDump.tagName && hrefDump.tagName === tag.name && tag.lastOpeningBracketAt && (hrefDump.openingTagEnds && tag.lastOpeningBracketAt > hrefDump.openingTagEnds || !hrefDump.openingTagEnds)) { + hrefInsertionActive = true; + } + if (hrefInsertionActive) { + const lineBreaks = opts.dumpLinkHrefsNearby.putOnNewLine ? "\n\n" : ""; + stringToInsertAfter = `${lineBreaks}${hrefDump.hrefValue}${lineBreaks}`; + } + } + function isOpeningAt(i, customStr) { + if (customStr) { + return customStr[i] === "<" && customStr[i + 1] !== "%"; + } + return str[i] === "<" && str[i + 1] !== "%"; + } + function isClosingAt(i) { + return str[i] === ">" && str[i - 1] !== "%"; + } + if (typeof str !== "string") { + throw new TypeError(`string-strip-html/stripHtml(): [THROW_ID_01] Input must be string! Currently it's: ${(typeof str).toLowerCase()}, equal to:\n${JSON.stringify(str, null, 4)}`); + } + if (originalOpts && !isObj(originalOpts)) { + throw new TypeError(`string-strip-html/stripHtml(): [THROW_ID_02] Optional Options Object must be a plain object! Currently it's: ${(typeof originalOpts).toLowerCase()}, equal to:\n${JSON.stringify(originalOpts, null, 4)}`); + } + function resetHrefMarkers() { + if (hrefInsertionActive) { + hrefDump = { + tagName: "", + hrefValue: "", + openingTagEnds: undefined + }; + hrefInsertionActive = false; + } + } + const opts = { ...defaults, + ...originalOpts + }; + if (Object.prototype.hasOwnProperty.call(opts, "returnRangesOnly")) { + throw new TypeError(`string-strip-html/stripHtml(): [THROW_ID_03] opts.returnRangesOnly has been removed from the API since v.5 release.`); + } + opts.ignoreTags = prepHopefullyAnArray(opts.ignoreTags, "opts.ignoreTags"); + opts.onlyStripTags = prepHopefullyAnArray(opts.onlyStripTags, "opts.onlyStripTags"); + const onlyStripTagsMode = !!opts.onlyStripTags.length; + if (opts.onlyStripTags.length && opts.ignoreTags.length) { + opts.onlyStripTags = without(opts.onlyStripTags, ...opts.ignoreTags); + } + if (!isObj(opts.dumpLinkHrefsNearby)) { + opts.dumpLinkHrefsNearby = { ...defaults.dumpLinkHrefsNearby + }; + } + opts.dumpLinkHrefsNearby = defaults.dumpLinkHrefsNearby; + if (originalOpts && Object.prototype.hasOwnProperty.call(originalOpts, "dumpLinkHrefsNearby") && existy(originalOpts.dumpLinkHrefsNearby)) { + /* istanbul ignore else */ + if (isObj(originalOpts.dumpLinkHrefsNearby)) { + opts.dumpLinkHrefsNearby = { ...defaults.dumpLinkHrefsNearby, + ...originalOpts.dumpLinkHrefsNearby + }; + } else if (originalOpts.dumpLinkHrefsNearby) { + throw new TypeError(`string-strip-html/stripHtml(): [THROW_ID_04] Optional Options Object's key dumpLinkHrefsNearby was set to ${typeof originalOpts.dumpLinkHrefsNearby}, equal to ${JSON.stringify(originalOpts.dumpLinkHrefsNearby, null, 4)}. The only allowed value is a plain object. See the API reference.`); + } + } + if (!opts.stripTogetherWithTheirContents) { + opts.stripTogetherWithTheirContents = []; + } else if (typeof opts.stripTogetherWithTheirContents === "string" && opts.stripTogetherWithTheirContents.length) { + opts.stripTogetherWithTheirContents = [opts.stripTogetherWithTheirContents]; + } + const somethingCaught = {}; + if (opts.stripTogetherWithTheirContents && Array.isArray(opts.stripTogetherWithTheirContents) && opts.stripTogetherWithTheirContents.length && !opts.stripTogetherWithTheirContents.every((el, i) => { + if (!(typeof el === "string")) { + somethingCaught.el = el; + somethingCaught.i = i; + return false; + } + return true; + })) { + throw new TypeError(`string-strip-html/stripHtml(): [THROW_ID_05] Optional Options Object's key stripTogetherWithTheirContents was set to contain not just string elements! For example, element at index ${somethingCaught.i} has a value ${somethingCaught.el} which is not string but ${(typeof somethingCaught.el).toLowerCase()}.`); + } + if (!opts.cb) { + opts.cb = ({ + rangesArr, + proposedReturn + }) => { + if (proposedReturn) { + rangesArr.push(...proposedReturn); + } + }; + } + const rangesToDelete = new Ranges({ + limitToBeAddedWhitespace: true, + limitLinebreaksCount: 2 + }); + if (!opts.skipHtmlDecoding) { + while (str !== decode(str, { + scope: "strict" + })) { + str = decode(str, { + scope: "strict" + }); + } + } + for (let i = 0, len = str.length; i < len; i++) { + if (Object.keys(tag).length > 1 && tag.lastClosingBracketAt && tag.lastClosingBracketAt < i && str[i] !== " " && spacesChunkWhichFollowsTheClosingBracketEndsAt === null) { + spacesChunkWhichFollowsTheClosingBracketEndsAt = i; + } + if (str[i] === "%" && str[i - 1] === "{" && str.includes("%}", i + 1)) { + i = str.indexOf("%}", i) - 1; + continue; + } + if (isClosingAt(i)) { + if ((!tag || Object.keys(tag).length < 2) && i > 1) { + for (let y = i; y--;) { + if (str[y - 1] === undefined || isClosingAt(y)) { + const startingPoint = str[y - 1] === undefined ? y : y + 1; + const culprit = str.slice(startingPoint, i + 1); + if (str !== `<${trim(culprit.trim(), "/>")}>` && + [...definitelyTagNames].some(val => trim(culprit.trim().split(/\s+/).filter(val2 => val2.trim()).filter((_val3, i3) => i3 === 0), "/>").toLowerCase() === val) && stripHtml(`<${culprit.trim()}>`, opts).result === "") { + /* istanbul ignore else */ + if (!allTagLocations.length || allTagLocations[allTagLocations.length - 1][0] !== tag.lastOpeningBracketAt) { + allTagLocations.push([startingPoint, i + 1]); + } + /* istanbul ignore else */ + if (!filteredTagLocations.length || filteredTagLocations[filteredTagLocations.length - 1][0] !== tag.lastOpeningBracketAt) { + filteredTagLocations.push([startingPoint, i + 1]); + } + const whiteSpaceCompensation = calculateWhitespaceToInsert(str, i, startingPoint, i + 1, startingPoint, i + 1); + let deleteUpTo = i + 1; + if (str[deleteUpTo] && !str[deleteUpTo].trim()) { + for (let z = deleteUpTo; z < len; z++) { + if (str[z].trim()) { + deleteUpTo = z; + break; + } + } + } + opts.cb({ + tag: tag, + deleteFrom: startingPoint, + deleteTo: deleteUpTo, + insert: whiteSpaceCompensation, + rangesArr: rangesToDelete, + proposedReturn: [startingPoint, deleteUpTo, whiteSpaceCompensation] + }); + } + break; + } + } + } + } + if (str[i] === "/" && !(tag.quotes && tag.quotes.value) && Number.isInteger(tag.lastOpeningBracketAt) && !Number.isInteger(tag.lastClosingBracketAt)) { + tag.slashPresent = i; + } + if (str[i] === '"' || str[i] === "'") { + if (tag.nameStarts && tag.quotes && tag.quotes.value && tag.quotes.value === str[i]) { + attrObj.valueEnds = i; + attrObj.value = str.slice(attrObj.valueStarts, i); + tag.attributes.push(attrObj); + attrObj = {}; + tag.quotes = undefined; + let hrefVal; + if (opts.dumpLinkHrefsNearby.enabled && + tag.attributes.some(obj => { + if (obj.name && obj.name.toLowerCase() === "href") { + hrefVal = `${opts.dumpLinkHrefsNearby.wrapHeads || ""}${obj.value}${opts.dumpLinkHrefsNearby.wrapTails || ""}`; + return true; + } + })) { + hrefDump = { + tagName: tag.name, + hrefValue: hrefVal, + openingTagEnds: undefined + }; + } + } else if (!tag.quotes && tag.nameStarts) { + tag.quotes = {}; + tag.quotes.value = str[i]; + tag.quotes.start = i; + if (attrObj.nameStarts && attrObj.nameEnds && attrObj.nameEnds < i && attrObj.nameStarts < i && !attrObj.valueStarts) { + attrObj.name = str.slice(attrObj.nameStarts, attrObj.nameEnds); + } + } + } + if (tag.nameStarts !== undefined && tag.nameEnds === undefined && (!str[i].trim() || !characterSuitableForNames(str[i]))) { + tag.nameEnds = i; + tag.name = str.slice(tag.nameStarts, tag.nameEnds + ( + /* istanbul ignore next */ + !isClosingAt(i) && str[i] !== "/" && str[i + 1] === undefined ? 1 : 0)); + if ( + str[tag.nameStarts - 1] !== "!" && + !tag.name.replace(/-/g, "").length || + /^\d+$/.test(tag.name[0])) { + tag = {}; + continue; + } + if (isOpeningAt(i)) { + calculateHrefToBeInserted(opts); + const whiteSpaceCompensation = calculateWhitespaceToInsert(str, i, tag.leftOuterWhitespace, i, tag.lastOpeningBracketAt, i); + if (opts.stripTogetherWithTheirContents.includes(tag.name) || opts.stripTogetherWithTheirContents.includes("*")) { + /* istanbul ignore next */ + filteredTagLocations = filteredTagLocations.filter(([from, upto]) => !(from === tag.leftOuterWhitespace && upto === i)); + } + opts.cb({ + tag: tag, + deleteFrom: tag.leftOuterWhitespace, + deleteTo: i, + insert: `${whiteSpaceCompensation}${stringToInsertAfter}${whiteSpaceCompensation}`, + rangesArr: rangesToDelete, + proposedReturn: [tag.leftOuterWhitespace, i, `${whiteSpaceCompensation}${stringToInsertAfter}${whiteSpaceCompensation}`] + }); + resetHrefMarkers(); + treatRangedTags(i, opts, rangesToDelete); + } + } + if (tag.quotes && tag.quotes.start && tag.quotes.start < i && !tag.quotes.end && attrObj.nameEnds && attrObj.equalsAt && !attrObj.valueStarts) { + attrObj.valueStarts = i; + } + if (!tag.quotes && attrObj.nameEnds && str[i] === "=" && !attrObj.valueStarts && !attrObj.equalsAt) { + attrObj.equalsAt = i; + } + if (!tag.quotes && attrObj.nameStarts && attrObj.nameEnds && !attrObj.valueStarts && str[i].trim() && str[i] !== "=") { + tag.attributes.push(attrObj); + attrObj = {}; + } + if (!tag.quotes && attrObj.nameStarts && !attrObj.nameEnds) { + if (!str[i].trim()) { + attrObj.nameEnds = i; + attrObj.name = str.slice(attrObj.nameStarts, attrObj.nameEnds); + } else if (str[i] === "=") { + /* istanbul ignore else */ + if (!attrObj.equalsAt) { + attrObj.nameEnds = i; + attrObj.equalsAt = i; + attrObj.name = str.slice(attrObj.nameStarts, attrObj.nameEnds); + } + } else if (str[i] === "/" || isClosingAt(i)) { + attrObj.nameEnds = i; + attrObj.name = str.slice(attrObj.nameStarts, attrObj.nameEnds); + tag.attributes.push(attrObj); + attrObj = {}; + } else if (isOpeningAt(i)) { + attrObj.nameEnds = i; + attrObj.name = str.slice(attrObj.nameStarts, attrObj.nameEnds); + tag.attributes.push(attrObj); + attrObj = {}; + } + } + if (!tag.quotes && tag.nameEnds < i && !str[i - 1].trim() && str[i].trim() && !`<>/!`.includes(str[i]) && !attrObj.nameStarts && !tag.lastClosingBracketAt) { + attrObj.nameStarts = i; + } + if (tag.lastOpeningBracketAt !== null && tag.lastOpeningBracketAt < i && str[i] === "/" && tag.onlyPlausible) { + tag.onlyPlausible = false; + } + if (tag.lastOpeningBracketAt !== null && tag.lastOpeningBracketAt < i && str[i] !== "/" + ) { + if (tag.onlyPlausible === undefined) { + if ((!str[i].trim() || isOpeningAt(i)) && !tag.slashPresent) { + tag.onlyPlausible = true; + } else { + tag.onlyPlausible = false; + } + } + if (str[i].trim() && tag.nameStarts === undefined && !isOpeningAt(i) && str[i] !== "/" && !isClosingAt(i) && str[i] !== "!") { + tag.nameStarts = i; + tag.nameContainsLetters = false; + } + } + if (tag.nameStarts && !tag.quotes && str[i].toLowerCase() !== str[i].toUpperCase()) { + tag.nameContainsLetters = true; + } + if ( + isClosingAt(i) && + notWithinAttrQuotes(tag, str, i)) { + if (tag.lastOpeningBracketAt !== undefined) { + tag.lastClosingBracketAt = i; + spacesChunkWhichFollowsTheClosingBracketEndsAt = null; + if (Object.keys(attrObj).length) { + tag.attributes.push(attrObj); + attrObj = {}; + } + if (opts.dumpLinkHrefsNearby.enabled && hrefDump.tagName && !hrefDump.openingTagEnds) { + hrefDump.openingTagEnds = i; + } + } + } + if (tag.lastOpeningBracketAt !== undefined) { + if (tag.lastClosingBracketAt === undefined) { + if (tag.lastOpeningBracketAt < i && !isOpeningAt(i) && ( + str[i + 1] === undefined || isOpeningAt(i + 1)) && tag.nameContainsLetters) { + tag.name = str.slice(tag.nameStarts, tag.nameEnds ? tag.nameEnds : i + 1).toLowerCase(); + /* istanbul ignore else */ + if (!allTagLocations.length || allTagLocations[allTagLocations.length - 1][0] !== tag.lastOpeningBracketAt) { + allTagLocations.push([tag.lastOpeningBracketAt, i + 1]); + } + if ( + opts.ignoreTags.includes(tag.name) || + tag.onlyPlausible && !definitelyTagNames.has(tag.name)) { + tag = {}; + attrObj = {}; + continue; + } + if ((definitelyTagNames.has(tag.name) || singleLetterTags.has(tag.name)) && (tag.onlyPlausible === false || tag.onlyPlausible === true && tag.attributes.length) || str[i + 1] === undefined) { + calculateHrefToBeInserted(opts); + const whiteSpaceCompensation = calculateWhitespaceToInsert(str, i, tag.leftOuterWhitespace, i + 1, tag.lastOpeningBracketAt, tag.lastClosingBracketAt); + opts.cb({ + tag: tag, + deleteFrom: tag.leftOuterWhitespace, + deleteTo: i + 1, + insert: `${whiteSpaceCompensation}${stringToInsertAfter}${whiteSpaceCompensation}`, + rangesArr: rangesToDelete, + proposedReturn: [tag.leftOuterWhitespace, i + 1, `${whiteSpaceCompensation}${stringToInsertAfter}${whiteSpaceCompensation}`] + }); + resetHrefMarkers(); + treatRangedTags(i, opts, rangesToDelete); + } + /* istanbul ignore else */ + if (!filteredTagLocations.length || filteredTagLocations[filteredTagLocations.length - 1][0] !== tag.lastOpeningBracketAt && filteredTagLocations[filteredTagLocations.length - 1][1] !== i + 1) { + if (opts.stripTogetherWithTheirContents.includes(tag.name) || opts.stripTogetherWithTheirContents.includes("*")) { + let lastRangedOpeningTag; + for (let z = rangedOpeningTags.length; z--;) { + /* istanbul ignore else */ + if (rangedOpeningTags[z].name === tag.name) { + lastRangedOpeningTag = rangedOpeningTags[z]; + } + } + /* istanbul ignore else */ + if (lastRangedOpeningTag) { + filteredTagLocations = filteredTagLocations.filter(([from]) => from !== lastRangedOpeningTag.lastOpeningBracketAt); + filteredTagLocations.push([lastRangedOpeningTag.lastOpeningBracketAt, i + 1]); + } else { + /* istanbul ignore next */ + filteredTagLocations.push([tag.lastOpeningBracketAt, i + 1]); + } + } else { + filteredTagLocations.push([tag.lastOpeningBracketAt, i + 1]); + } + } + } + } else if (i > tag.lastClosingBracketAt && str[i].trim() || str[i + 1] === undefined) { + let endingRangeIndex = tag.lastClosingBracketAt === i ? i + 1 : i; + if (opts.trimOnlySpaces && endingRangeIndex === len - 1 && spacesChunkWhichFollowsTheClosingBracketEndsAt !== null && spacesChunkWhichFollowsTheClosingBracketEndsAt < i) { + endingRangeIndex = spacesChunkWhichFollowsTheClosingBracketEndsAt; + } + /* istanbul ignore else */ + if (!allTagLocations.length || allTagLocations[allTagLocations.length - 1][0] !== tag.lastOpeningBracketAt) { + allTagLocations.push([tag.lastOpeningBracketAt, tag.lastClosingBracketAt + 1]); + } + if (!onlyStripTagsMode && opts.ignoreTags.includes(tag.name) || onlyStripTagsMode && !opts.onlyStripTags.includes(tag.name)) { + opts.cb({ + tag: tag, + deleteFrom: null, + deleteTo: null, + insert: null, + rangesArr: rangesToDelete, + proposedReturn: null + }); + tag = {}; + attrObj = {}; + } else if (!tag.onlyPlausible || + tag.attributes.length === 0 && tag.name && (definitelyTagNames.has(tag.name.toLowerCase()) || singleLetterTags.has(tag.name.toLowerCase())) || + tag.attributes && tag.attributes.some(attrObj2 => attrObj2.equalsAt)) { + /* istanbul ignore else */ + if (!filteredTagLocations.length || filteredTagLocations[filteredTagLocations.length - 1][0] !== tag.lastOpeningBracketAt) { + filteredTagLocations.push([tag.lastOpeningBracketAt, tag.lastClosingBracketAt + 1]); + } + const whiteSpaceCompensation = calculateWhitespaceToInsert(str, i, tag.leftOuterWhitespace, endingRangeIndex, tag.lastOpeningBracketAt, tag.lastClosingBracketAt); + stringToInsertAfter = ""; + hrefInsertionActive = false; + calculateHrefToBeInserted(opts); + let insert; + if (isStr(stringToInsertAfter) && stringToInsertAfter.length) { + insert = `${whiteSpaceCompensation}${stringToInsertAfter}${ + /* istanbul ignore next */ + whiteSpaceCompensation === "\n\n" ? "\n" : whiteSpaceCompensation}`; + } else { + insert = whiteSpaceCompensation; + } + if (tag.leftOuterWhitespace === 0 || !right(str, endingRangeIndex - 1)) { + insert = ""; + } + opts.cb({ + tag: tag, + deleteFrom: tag.leftOuterWhitespace, + deleteTo: endingRangeIndex, + insert, + rangesArr: rangesToDelete, + proposedReturn: [tag.leftOuterWhitespace, endingRangeIndex, insert] + }); + resetHrefMarkers(); + treatRangedTags(i, opts, rangesToDelete); + } else { + tag = {}; + } + if (!isClosingAt(i)) { + tag = {}; + } + } + } + if (isOpeningAt(i) && !isOpeningAt(i - 1) && !`'"`.includes(str[i + 1]) && (!`'"`.includes(str[i + 2]) || /\w/.test(str[i + 1])) && + !(str[i + 1] === "c" && str[i + 2] === ":") && + !(str[i + 1] === "f" && str[i + 2] === "m" && str[i + 3] === "t" && str[i + 4] === ":") && + !(str[i + 1] === "s" && str[i + 2] === "q" && str[i + 3] === "l" && str[i + 4] === ":") && + !(str[i + 1] === "x" && str[i + 2] === ":") && + !(str[i + 1] === "f" && str[i + 2] === "n" && str[i + 3] === ":") && + notWithinAttrQuotes(tag, str, i)) { + if (isClosingAt(right(str, i))) { + continue; + } else { + if (tag.nameEnds && tag.nameEnds < i && !tag.lastClosingBracketAt) { + if (tag.onlyPlausible === true && tag.attributes && tag.attributes.length || tag.onlyPlausible === false) { + const whiteSpaceCompensation = calculateWhitespaceToInsert(str, i, tag.leftOuterWhitespace, i, tag.lastOpeningBracketAt, i); + opts.cb({ + tag: tag, + deleteFrom: tag.leftOuterWhitespace, + deleteTo: i, + insert: whiteSpaceCompensation, + rangesArr: rangesToDelete, + proposedReturn: [tag.leftOuterWhitespace, i, whiteSpaceCompensation] + }); + treatRangedTags(i, opts, rangesToDelete); + tag = {}; + attrObj = {}; + } + } + if (tag.lastOpeningBracketAt !== undefined && tag.onlyPlausible && tag.name && !tag.quotes) { + tag.lastOpeningBracketAt = undefined; + tag.name = undefined; + tag.onlyPlausible = false; + } + if ((tag.lastOpeningBracketAt === undefined || !tag.onlyPlausible) && !tag.quotes) { + tag.lastOpeningBracketAt = i; + tag.slashPresent = false; + tag.attributes = []; + if (chunkOfWhitespaceStartsAt === null) { + tag.leftOuterWhitespace = i; + } else if (opts.trimOnlySpaces && chunkOfWhitespaceStartsAt === 0) { + /* istanbul ignore next */ + tag.leftOuterWhitespace = chunkOfSpacesStartsAt || i; + } else { + tag.leftOuterWhitespace = chunkOfWhitespaceStartsAt; + } + if (`${str[i + 1]}${str[i + 2]}${str[i + 3]}` === "!--" || `${str[i + 1]}${str[i + 2]}${str[i + 3]}${str[i + 4]}${str[i + 5]}${str[i + 6]}${str[i + 7]}${str[i + 8]}` === "![CDATA[") { + let cdata = true; + if (str[i + 2] === "-") { + cdata = false; + } + let closingFoundAt; + for (let y = i; y < len; y++) { + if (!closingFoundAt && cdata && `${str[y - 2]}${str[y - 1]}${str[y]}` === "]]>" || !cdata && `${str[y - 2]}${str[y - 1]}${str[y]}` === "-->") { + closingFoundAt = y; + } + if (closingFoundAt && (closingFoundAt < y && str[y].trim() || str[y + 1] === undefined)) { + let rangeEnd = y; + if (str[y + 1] === undefined && !str[y].trim() || str[y] === ">") { + rangeEnd += 1; + } + /* istanbul ignore else */ + if (!allTagLocations.length || allTagLocations[allTagLocations.length - 1][0] !== tag.lastOpeningBracketAt) { + allTagLocations.push([tag.lastOpeningBracketAt, closingFoundAt + 1]); + } + /* istanbul ignore else */ + if (!filteredTagLocations.length || filteredTagLocations[filteredTagLocations.length - 1][0] !== tag.lastOpeningBracketAt) { + filteredTagLocations.push([tag.lastOpeningBracketAt, closingFoundAt + 1]); + } + const whiteSpaceCompensation = calculateWhitespaceToInsert(str, y, tag.leftOuterWhitespace, rangeEnd, tag.lastOpeningBracketAt, closingFoundAt); + opts.cb({ + tag: tag, + deleteFrom: tag.leftOuterWhitespace, + deleteTo: rangeEnd, + insert: whiteSpaceCompensation, + rangesArr: rangesToDelete, + proposedReturn: [tag.leftOuterWhitespace, rangeEnd, whiteSpaceCompensation] + }); + i = y - 1; + if (str[y] === ">") { + i = y; + } + tag = {}; + attrObj = {}; + break; + } + } + } + } + } + } + if (!str[i].trim()) { + if (chunkOfWhitespaceStartsAt === null) { + chunkOfWhitespaceStartsAt = i; + if (tag.lastOpeningBracketAt !== undefined && tag.lastOpeningBracketAt < i && tag.nameStarts && tag.nameStarts < tag.lastOpeningBracketAt && i === tag.lastOpeningBracketAt + 1 && + !rangedOpeningTags.some( + rangedTagObj => rangedTagObj.name === tag.name)) { + tag.onlyPlausible = true; + tag.name = undefined; + tag.nameStarts = undefined; + } + } + } else if (chunkOfWhitespaceStartsAt !== null) { + if (!tag.quotes && attrObj.equalsAt > chunkOfWhitespaceStartsAt - 1 && attrObj.nameEnds && attrObj.equalsAt > attrObj.nameEnds && str[i] !== '"' && str[i] !== "'") { + /* istanbul ignore else */ + if (isObj(attrObj)) { + tag.attributes.push(attrObj); + } + attrObj = {}; + tag.equalsSpottedAt = undefined; + } + chunkOfWhitespaceStartsAt = null; + } + if (str[i] === " ") { + if (chunkOfSpacesStartsAt === null) { + chunkOfSpacesStartsAt = i; + } + } else if (chunkOfSpacesStartsAt !== null) { + chunkOfSpacesStartsAt = null; + } + } + if (str && ( + opts.trimOnlySpaces && + str[0] === " " || + !opts.trimOnlySpaces && + !str[0].trim())) { + for (let i = 0, len = str.length; i < len; i++) { + if (opts.trimOnlySpaces && str[i] !== " " || !opts.trimOnlySpaces && str[i].trim()) { + rangesToDelete.push([0, i]); + break; + } else if (!str[i + 1]) { + rangesToDelete.push([0, i + 1]); + } + } + } + if (str && ( + opts.trimOnlySpaces && + str[str.length - 1] === " " || + !opts.trimOnlySpaces && + !str[str.length - 1].trim())) { + for (let i = str.length; i--;) { + if (opts.trimOnlySpaces && str[i] !== " " || !opts.trimOnlySpaces && str[i].trim()) { + rangesToDelete.push([i + 1, str.length]); + break; + } + } + } + const curr = rangesToDelete.current(); + if ((!originalOpts || !originalOpts.cb) && curr) { + if (curr[0] && !curr[0][0]) { + curr[0][1]; + rangesToDelete.ranges[0] = [rangesToDelete.ranges[0][0], rangesToDelete.ranges[0][1]]; + } + if (curr[curr.length - 1] && curr[curr.length - 1][1] === str.length) { + curr[curr.length - 1][0]; + /* istanbul ignore else */ + if (rangesToDelete.ranges) { + let startingIdx2 = rangesToDelete.ranges[rangesToDelete.ranges.length - 1][0]; + if (str[startingIdx2 - 1] && (opts.trimOnlySpaces && str[startingIdx2 - 1] === " " || !opts.trimOnlySpaces && !str[startingIdx2 - 1].trim())) { + startingIdx2 -= 1; + } + const backupWhatToAdd = rangesToDelete.ranges[rangesToDelete.ranges.length - 1][2]; + rangesToDelete.ranges[rangesToDelete.ranges.length - 1] = [startingIdx2, rangesToDelete.ranges[rangesToDelete.ranges.length - 1][1]]; + if (backupWhatToAdd && backupWhatToAdd.trim()) { + rangesToDelete.ranges[rangesToDelete.ranges.length - 1].push(backupWhatToAdd.trimEnd()); + } + } + } + } + const res = { + log: { + timeTakenInMilliseconds: Date.now() - start + }, + result: rApply(str, rangesToDelete.current()), + ranges: rangesToDelete.current(), + allTagLocations, + filteredTagLocations + }; + return res; +} + +export { defaults, stripHtml, version }; |