1
0
Fork 0
why-cant-we-deploy-today/plugin/search/search.esm.js

140 lines
4.5 KiB
JavaScript

/*!
* Handles finding a text string anywhere in the slides and showing the next occurrence to the user
* by navigatating to that slide and highlighting it.
*
* @author Jon Snyder <snyder.jon@gmail.com>, February 2013
*/
export default () => {
let e, t, n, l, i, o, r;
function s() {
(t = document.createElement("div")),
t.classList.add("searchbox"),
(t.style.position = "absolute"),
(t.style.top = "10px"),
(t.style.right = "10px"),
(t.style.zIndex = 10),
(t.innerHTML =
'<input type="search" class="searchinput" placeholder="Search..." style="vertical-align: top;"/>\n\t\t</span>'),
(n = t.querySelector(".searchinput")),
(n.style.width = "240px"),
(n.style.fontSize = "14px"),
(n.style.padding = "4px 6px"),
(n.style.color = "#000"),
(n.style.background = "#fff"),
(n.style.borderRadius = "2px"),
(n.style.border = "0"),
(n.style.outline = "0"),
(n.style.boxShadow = "0 2px 18px rgba(0, 0, 0, 0.2)"),
(n.style["-webkit-appearance"] = "none"),
e.getRevealElement().appendChild(t),
n.addEventListener(
"keyup",
function (t) {
if (13 === t.keyCode)
t.preventDefault(),
(function () {
if (o) {
var t = n.value;
"" === t
? (r && r.remove(), (l = null))
: ((r = new c("slidecontent")), (l = r.apply(t)), (i = 0));
}
l &&
(l.length && l.length <= i && (i = 0),
l.length > i && (e.slide(l[i].h, l[i].v), i++));
})(),
(o = !1);
else o = !0;
},
!1
),
d();
}
function a() {
t || s(), (t.style.display = "inline"), n.focus(), n.select();
}
function d() {
t || s(), (t.style.display = "none"), r && r.remove();
}
function c(t, n) {
var l = document.getElementById(t) || document.body,
i = n || "EM",
o = new RegExp("^(?:" + i + "|SCRIPT|FORM)$"),
r = ["#ff6", "#a0ffff", "#9f9", "#f99", "#f6f"],
s = [],
a = 0,
d = "",
c = [];
(this.setRegex = function (e) {
(e = e.replace(/^[^\w]+|[^\w]+$/g, "").replace(/[^\w'-]+/g, "|")),
(d = new RegExp("(" + e + ")", "i"));
}),
(this.getRegex = function () {
return d
.toString()
.replace(/^\/\\b\(|\)\\b\/i$/g, "")
.replace(/\|/g, " ");
}),
(this.hiliteWords = function (t) {
if (null != t && t && d && !o.test(t.nodeName)) {
if (t.hasChildNodes())
for (var n = 0; n < t.childNodes.length; n++)
this.hiliteWords(t.childNodes[n]);
var l, p;
if (3 == t.nodeType)
if ((l = t.nodeValue) && (p = d.exec(l))) {
for (var u = t; null != u && "SECTION" != u.nodeName; )
u = u.parentNode;
var h = e.getIndices(u),
f = c.length,
y = !1;
for (n = 0; n < f; n++)
c[n].h === h.h && c[n].v === h.v && (y = !0);
y || c.push(h),
s[p[0].toLowerCase()] ||
(s[p[0].toLowerCase()] = r[a++ % r.length]);
var g = document.createElement(i);
g.appendChild(document.createTextNode(p[0])),
(g.style.backgroundColor = s[p[0].toLowerCase()]),
(g.style.fontStyle = "inherit"),
(g.style.color = "#000");
var v = t.splitText(p.index);
(v.nodeValue = v.nodeValue.substring(p[0].length)),
t.parentNode.insertBefore(g, v);
}
}
}),
(this.remove = function () {
for (
var e, t = document.getElementsByTagName(i);
t.length && (e = t[0]);
)
e.parentNode.replaceChild(e.firstChild, e);
}),
(this.apply = function (e) {
if (null != e && e)
return this.remove(), this.setRegex(e), this.hiliteWords(l), c;
});
}
return {
id: "search",
init: (n) => {
(e = n),
e.registerKeyboardShortcut("CTRL + Shift + F", "Search"),
document.addEventListener(
"keydown",
function (e) {
"F" == e.key &&
(e.ctrlKey || e.metaKey) &&
(e.preventDefault(),
t || s(),
"inline" !== t.style.display ? a() : d());
},
!1
);
},
open: a,
};
};