nodebb-plugin-ezoic-infinite 1.6.12 → 1.6.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/public/client.js +119 -0
package/package.json
CHANGED
package/public/client.js
CHANGED
|
@@ -1,6 +1,74 @@
|
|
|
1
1
|
(function () {
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
+
function ezoicAnchorKeyFromNode(node) {
|
|
5
|
+
// Robustly extract an anchor id from a <li> topic or any descendant.
|
|
6
|
+
try {
|
|
7
|
+
if (!node) return '';
|
|
8
|
+
var el = node;
|
|
9
|
+
// If node itself doesn't have ids, search descendants.
|
|
10
|
+
if (!(el.getAttribute && (el.getAttribute('data-tid') || el.getAttribute('data-topic-id') || el.getAttribute('data-pid') || el.getAttribute('data-id')))) {
|
|
11
|
+
if (el.querySelector) {
|
|
12
|
+
el = el.querySelector('[data-tid],[data-topic-id],[data-pid],[data-id]') || node;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
if (el.getAttribute) {
|
|
16
|
+
var tid = el.getAttribute('data-tid') || el.getAttribute('data-topic-id');
|
|
17
|
+
if (tid) return 'tid:' + String(tid);
|
|
18
|
+
var pid = el.getAttribute('data-pid') || el.getAttribute('data-id');
|
|
19
|
+
if (pid) return 'pid:' + String(pid);
|
|
20
|
+
}
|
|
21
|
+
} catch (e) {}
|
|
22
|
+
return '';
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function ezoicFindAnchorLi(anchorKey, listEl) {
|
|
26
|
+
try {
|
|
27
|
+
if (!anchorKey) return null;
|
|
28
|
+
var root = listEl || document;
|
|
29
|
+
var el = null;
|
|
30
|
+
if (anchorKey.indexOf('tid:') === 0) {
|
|
31
|
+
var v = anchorKey.slice(4);
|
|
32
|
+
el = root.querySelector('[data-tid="' + v + '"], [data-topic-id="' + v + '"]');
|
|
33
|
+
} else if (anchorKey.indexOf('pid:') === 0) {
|
|
34
|
+
var p = anchorKey.slice(4);
|
|
35
|
+
el = root.querySelector('[data-pid="' + p + '"], [data-id="' + p + '"]');
|
|
36
|
+
}
|
|
37
|
+
if (!el) return null;
|
|
38
|
+
return el.closest ? (el.closest('li') || null) : null;
|
|
39
|
+
} catch (e) { return null; }
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function ezoicReconcileOrPurgeHosts(scope) {
|
|
43
|
+
// Reposition each host after its anchor li. If anchor doesn't exist (virtualized away),
|
|
44
|
+
// remove the host to prevent it from collecting at the top.
|
|
45
|
+
try {
|
|
46
|
+
var root = scope || document;
|
|
47
|
+
var hosts = root.querySelectorAll('li.nodebb-ezoic-host[data-ezoic-anchor]');
|
|
48
|
+
if (!hosts || !hosts.length) return;
|
|
49
|
+
|
|
50
|
+
hosts.forEach(function(host){
|
|
51
|
+
try {
|
|
52
|
+
var listEl = host.parentElement;
|
|
53
|
+
if (!listEl) return;
|
|
54
|
+
var anchorKey = host.getAttribute('data-ezoic-anchor') || '';
|
|
55
|
+
if (!anchorKey) return;
|
|
56
|
+
|
|
57
|
+
var anchorLi = ezoicFindAnchorLi(anchorKey, listEl) || ezoicFindAnchorLi(anchorKey, document);
|
|
58
|
+
if (!anchorLi) {
|
|
59
|
+
// Anchor not in DOM right now => delete host to avoid "pile at top"
|
|
60
|
+
host.remove();
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (host.previousElementSibling !== anchorLi) {
|
|
64
|
+
anchorLi.insertAdjacentElement('afterend', host);
|
|
65
|
+
}
|
|
66
|
+
} catch (e) {}
|
|
67
|
+
});
|
|
68
|
+
} catch (e) {}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
|
|
4
72
|
function ezoicInsertAfterWithUlGuard(target, wrap, kindClass) {
|
|
5
73
|
try {
|
|
6
74
|
if (!target || !wrap) return;
|
|
@@ -14,6 +82,8 @@ function ezoicInsertAfterWithUlGuard(target, wrap, kindClass) {
|
|
|
14
82
|
host.setAttribute('role', 'listitem');
|
|
15
83
|
host.style.listStyle = 'none';
|
|
16
84
|
host.style.width = '100%';
|
|
85
|
+
try { var prev = wrap.previousElementSibling; var ak2 = ezoicAnchorKeyFromNode(prev || (wrap.parentElement && wrap.parentElement.previousElementSibling)); if (ak2) host.setAttribute('data-ezoic-anchor', ak2); } catch(e) {}
|
|
86
|
+
try { var ak = ezoicAnchorKeyFromNode(target); if (ak) host.setAttribute('data-ezoic-anchor', ak); } catch(e) {}
|
|
17
87
|
|
|
18
88
|
// Insert host after the target listitem, then move the wrap inside.
|
|
19
89
|
if (target.insertAdjacentElement) {
|
|
@@ -48,6 +118,7 @@ function ezoicRepairInvalidBetweenWraps() {
|
|
|
48
118
|
host.setAttribute('role', 'listitem');
|
|
49
119
|
host.style.listStyle = 'none';
|
|
50
120
|
host.style.width = '100%';
|
|
121
|
+
try { var ak = ezoicAnchorKeyFromNode(target); if (ak) host.setAttribute('data-ezoic-anchor', ak); } catch(e) {}
|
|
51
122
|
p.insertBefore(host, wrap);
|
|
52
123
|
host.appendChild(wrap);
|
|
53
124
|
try { wrap.style.width = '100%'; } catch (e) {}
|
|
@@ -1577,3 +1648,51 @@ if (window.jQuery) {
|
|
|
1577
1648
|
} catch (e) {}
|
|
1578
1649
|
}
|
|
1579
1650
|
// ===== /V12.2 =====
|
|
1651
|
+
|
|
1652
|
+
|
|
1653
|
+
// ===== V12.4 reconcile+purge scheduler =====
|
|
1654
|
+
(function(){
|
|
1655
|
+
var pending=false, last=0, COOLDOWN=160;
|
|
1656
|
+
function schedule(scope){
|
|
1657
|
+
var now=Date.now();
|
|
1658
|
+
if (now-last<COOLDOWN) return;
|
|
1659
|
+
if (pending) return;
|
|
1660
|
+
pending=true;
|
|
1661
|
+
requestAnimationFrame(function(){
|
|
1662
|
+
pending=false; last=Date.now();
|
|
1663
|
+
try { ezoicReconcileOrPurgeHosts(scope); } catch(e) {}
|
|
1664
|
+
});
|
|
1665
|
+
}
|
|
1666
|
+
|
|
1667
|
+
window.addEventListener('scroll', function(){ schedule(document); }, { passive:true });
|
|
1668
|
+
window.addEventListener('resize', function(){ schedule(document); }, { passive:true });
|
|
1669
|
+
|
|
1670
|
+
if (window.jQuery) {
|
|
1671
|
+
window.jQuery(window).on('action:ajaxify.end action:infiniteScroll.loaded', function(){
|
|
1672
|
+
setTimeout(function(){ schedule(document); }, 0);
|
|
1673
|
+
setTimeout(function(){ schedule(document); }, 220);
|
|
1674
|
+
setTimeout(function(){ schedule(document); }, 700);
|
|
1675
|
+
});
|
|
1676
|
+
}
|
|
1677
|
+
|
|
1678
|
+
// Observe only the main list containers if present to reduce overhead
|
|
1679
|
+
try {
|
|
1680
|
+
if (typeof MutationObserver !== 'undefined') {
|
|
1681
|
+
var mo = new MutationObserver(function(muts){
|
|
1682
|
+
for (var i=0;i<muts.length;i++){
|
|
1683
|
+
var m=muts[i];
|
|
1684
|
+
if ((m.addedNodes && m.addedNodes.length) || (m.removedNodes && m.removedNodes.length)) {
|
|
1685
|
+
schedule(m.target);
|
|
1686
|
+
break;
|
|
1687
|
+
}
|
|
1688
|
+
}
|
|
1689
|
+
});
|
|
1690
|
+
document.querySelectorAll('ul[component], ul.topic-list, ul.categories, ol[component]').forEach(function(list){
|
|
1691
|
+
try { mo.observe(list, {childList:true}); } catch(e) {}
|
|
1692
|
+
});
|
|
1693
|
+
}
|
|
1694
|
+
} catch(e){}
|
|
1695
|
+
|
|
1696
|
+
setTimeout(function(){ schedule(document); }, 0);
|
|
1697
|
+
})();
|
|
1698
|
+
// ===== /V12.4 =====
|