mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-04-30 09:32:05 -04:00
launcher: add elide helpers for RichText
This commit is contained in:
93
quickshell/Common/htmlElide.js
Normal file
93
quickshell/Common/htmlElide.js
Normal file
@@ -0,0 +1,93 @@
|
||||
.pragma library
|
||||
|
||||
function stripHtmlTags(html) {
|
||||
if (!html)
|
||||
return "";
|
||||
return String(html)
|
||||
.replace(/<[^>]+>/g, "")
|
||||
.replace(/ /g, " ")
|
||||
.replace(/&/g, "&")
|
||||
.replace(/</g, "<")
|
||||
.replace(/>/g, ">")
|
||||
.replace(/"/g, "\"")
|
||||
.replace(/'/g, "'");
|
||||
}
|
||||
|
||||
function elideRichText(html, visibleBudget) {
|
||||
if (!html)
|
||||
return "";
|
||||
if (visibleBudget <= 0)
|
||||
return "";
|
||||
|
||||
var out = "";
|
||||
var visible = 0;
|
||||
var i = 0;
|
||||
var openTags = [];
|
||||
var len = html.length;
|
||||
|
||||
while (i < len && visible < visibleBudget) {
|
||||
var ch = html.charAt(i);
|
||||
if (ch === "<") {
|
||||
var end = html.indexOf(">", i);
|
||||
if (end < 0)
|
||||
break;
|
||||
var tag = html.substring(i, end + 1);
|
||||
out += tag;
|
||||
var isClose = tag.charAt(1) === "/";
|
||||
var match = tag.match(/^<\/?([a-zA-Z]+)/);
|
||||
var name = match ? match[1] : "";
|
||||
if (isClose) {
|
||||
if (openTags.length > 0 && openTags[openTags.length - 1] === name)
|
||||
openTags.pop();
|
||||
} else if (!tag.endsWith("/>") && name) {
|
||||
openTags.push(name);
|
||||
}
|
||||
i = end + 1;
|
||||
} else if (ch === "&") {
|
||||
var eend = html.indexOf(";", i);
|
||||
if (eend < 0 || eend - i > 6) {
|
||||
out += "&";
|
||||
visible++;
|
||||
i++;
|
||||
} else {
|
||||
out += html.substring(i, eend + 1);
|
||||
visible++;
|
||||
i = eend + 1;
|
||||
}
|
||||
} else {
|
||||
out += ch;
|
||||
visible++;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
while (i < len && html.charAt(i) === "<") {
|
||||
var tend = html.indexOf(">", i);
|
||||
if (tend < 0)
|
||||
break;
|
||||
var ttag = html.substring(i, tend + 1);
|
||||
out += ttag;
|
||||
var tisClose = ttag.charAt(1) === "/";
|
||||
var tmatch = ttag.match(/^<\/?([a-zA-Z]+)/);
|
||||
var tname = tmatch ? tmatch[1] : "";
|
||||
if (tisClose) {
|
||||
if (openTags.length > 0 && openTags[openTags.length - 1] === tname)
|
||||
openTags.pop();
|
||||
} else if (!ttag.endsWith("/>") && tname) {
|
||||
openTags.push(tname);
|
||||
}
|
||||
i = tend + 1;
|
||||
}
|
||||
|
||||
if (i < len) {
|
||||
out = out.replace(/\s+$/, "");
|
||||
while (openTags.length > 0)
|
||||
out += "</" + openTags.pop() + ">";
|
||||
out += "…";
|
||||
} else {
|
||||
while (openTags.length > 0)
|
||||
out += "</" + openTags.pop() + ">";
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
Reference in New Issue
Block a user