billy-herrington-utils 1.4.6 → 1.4.8
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/dist/billy-herrington-utils.es.js +43 -26
- package/dist/billy-herrington-utils.es.js.map +1 -1
- package/dist/billy-herrington-utils.umd.js +43 -26
- package/dist/billy-herrington-utils.umd.js.map +1 -1
- package/dist/index.d.ts +10 -11
- package/package.json +1 -1
- package/src/userscripts/data-manager/index.ts +7 -7
- package/src/userscripts/infinite-scroll/index.ts +8 -8
- package/src/userscripts/jabroni-outfit-wrap/index.ts +13 -12
- package/src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategy.ts +11 -0
- package/src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategyDataParams.ts +2 -2
- package/src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategyTrash.ts +2 -2
- package/src/userscripts/rules/index.ts +6 -0
|
@@ -65,8 +65,8 @@ class DataFilter {
|
|
|
65
65
|
return (v) => {
|
|
66
66
|
const isPublic = !this.rules.isPrivate(v.element);
|
|
67
67
|
return {
|
|
68
|
-
|
|
69
|
-
|
|
68
|
+
condition: this.state.filterPublic && isPublic,
|
|
69
|
+
tag: "filter-public"
|
|
70
70
|
};
|
|
71
71
|
};
|
|
72
72
|
});
|
|
@@ -74,8 +74,8 @@ class DataFilter {
|
|
|
74
74
|
return (v) => {
|
|
75
75
|
const isPrivate = this.rules.isPrivate(v.element);
|
|
76
76
|
return {
|
|
77
|
-
|
|
78
|
-
|
|
77
|
+
condition: this.state.filterPrivate && isPrivate,
|
|
78
|
+
tag: "filter-private"
|
|
79
79
|
};
|
|
80
80
|
};
|
|
81
81
|
});
|
|
@@ -83,8 +83,8 @@ class DataFilter {
|
|
|
83
83
|
return (v) => {
|
|
84
84
|
const isHD = this.rules.isHD(v.element);
|
|
85
85
|
return {
|
|
86
|
-
|
|
87
|
-
|
|
86
|
+
condition: this.state.filterHD && isHD,
|
|
87
|
+
tag: "filter-hd"
|
|
88
88
|
};
|
|
89
89
|
};
|
|
90
90
|
});
|
|
@@ -92,8 +92,8 @@ class DataFilter {
|
|
|
92
92
|
return (v) => {
|
|
93
93
|
const notInRange = v.duration < this.state.filterDurationFrom || v.duration > this.state.filterDurationTo;
|
|
94
94
|
return {
|
|
95
|
-
|
|
96
|
-
|
|
95
|
+
condition: this.state.filterDuration && notInRange,
|
|
96
|
+
tag: "filter-duration"
|
|
97
97
|
};
|
|
98
98
|
};
|
|
99
99
|
});
|
|
@@ -102,8 +102,8 @@ class DataFilter {
|
|
|
102
102
|
return (v) => {
|
|
103
103
|
const containTags = tags.some((tag) => tag.test(v.title));
|
|
104
104
|
return {
|
|
105
|
-
|
|
106
|
-
|
|
105
|
+
condition: this.state.filterExclude && containTags,
|
|
106
|
+
tag: "filter-exclude"
|
|
107
107
|
};
|
|
108
108
|
};
|
|
109
109
|
});
|
|
@@ -112,8 +112,8 @@ class DataFilter {
|
|
|
112
112
|
return (v) => {
|
|
113
113
|
const containTagsNot = tags.some((tag) => !tag.test(v.title));
|
|
114
114
|
return {
|
|
115
|
-
|
|
116
|
-
|
|
115
|
+
condition: this.state.filterInclude && containTagsNot,
|
|
116
|
+
tag: "filter-include"
|
|
117
117
|
};
|
|
118
118
|
};
|
|
119
119
|
});
|
|
@@ -195,8 +195,8 @@ class DataManager {
|
|
|
195
195
|
const targets = [window, globalThis.unsafeWindow].filter(Boolean);
|
|
196
196
|
targets.forEach((w) => {
|
|
197
197
|
Object.assign(w, {
|
|
198
|
-
|
|
199
|
-
|
|
198
|
+
sortByDuration: () => this.sort("duration"),
|
|
199
|
+
sortByViews: () => this.sort("view")
|
|
200
200
|
});
|
|
201
201
|
});
|
|
202
202
|
}
|
|
@@ -331,13 +331,13 @@ function objectToFormData(object) {
|
|
|
331
331
|
class InfiniteScroller {
|
|
332
332
|
constructor({
|
|
333
333
|
enabled = true,
|
|
334
|
-
delay =
|
|
334
|
+
delay = 300,
|
|
335
335
|
writeHistory = false,
|
|
336
336
|
paginationOffset,
|
|
337
337
|
paginationLast,
|
|
338
338
|
paginationElement,
|
|
339
339
|
paginationUrlGenerator,
|
|
340
|
-
|
|
340
|
+
parseData,
|
|
341
341
|
alternativeGenerator,
|
|
342
342
|
intersectionObservable
|
|
343
343
|
}) {
|
|
@@ -347,7 +347,7 @@ class InfiniteScroller {
|
|
|
347
347
|
__publicField(this, "paginationOffset");
|
|
348
348
|
__publicField(this, "paginationLast");
|
|
349
349
|
__publicField(this, "writeHistory");
|
|
350
|
-
__publicField(this, "
|
|
350
|
+
__publicField(this, "parseData");
|
|
351
351
|
__publicField(this, "onScrollCBs", []);
|
|
352
352
|
__publicField(this, "generatorConsumer", async () => {
|
|
353
353
|
if (!this.enabled) return false;
|
|
@@ -356,7 +356,7 @@ class InfiniteScroller {
|
|
|
356
356
|
const nextPageHTML = await fetchHtml(url);
|
|
357
357
|
const prevScrollPos = document.documentElement.scrollTop;
|
|
358
358
|
this.paginationOffset = offset;
|
|
359
|
-
this.
|
|
359
|
+
this.parseData(nextPageHTML);
|
|
360
360
|
this._onScroll();
|
|
361
361
|
window.scrollTo(0, prevScrollPos);
|
|
362
362
|
if (this.writeHistory) {
|
|
@@ -370,7 +370,7 @@ class InfiniteScroller {
|
|
|
370
370
|
this.writeHistory = writeHistory;
|
|
371
371
|
this.paginationOffset = paginationOffset;
|
|
372
372
|
this.paginationLast = paginationLast;
|
|
373
|
-
this.
|
|
373
|
+
this.parseData = parseData;
|
|
374
374
|
this.paginationGenerator = alternativeGenerator?.() ?? InfiniteScroller.createPaginationGenerator(
|
|
375
375
|
paginationOffset,
|
|
376
376
|
paginationLast,
|
|
@@ -396,15 +396,23 @@ class InfiniteScroller {
|
|
|
396
396
|
}
|
|
397
397
|
}
|
|
398
398
|
}
|
|
399
|
-
function createInfiniteScroller(store,
|
|
399
|
+
function createInfiniteScroller(store, parseData, rules) {
|
|
400
400
|
const enabled = store.state.infiniteScrollEnabled;
|
|
401
|
+
const paginationOffset = rules.paginationStrategy.getPaginationOffset();
|
|
402
|
+
const paginationElement = rules.paginationStrategy.getPaginationElement();
|
|
403
|
+
const paginationLast = rules.paginationStrategy.getPaginationLast();
|
|
404
|
+
const paginationUrlGenerator = rules.paginationStrategy.getPaginationUrlGenerator();
|
|
401
405
|
const iscroller = new InfiniteScroller({
|
|
402
406
|
enabled,
|
|
403
|
-
|
|
407
|
+
parseData,
|
|
408
|
+
paginationLast,
|
|
409
|
+
paginationOffset,
|
|
410
|
+
paginationElement,
|
|
411
|
+
paginationUrlGenerator,
|
|
404
412
|
...rules
|
|
405
|
-
}).onScroll(({ paginationLast, paginationOffset }) => {
|
|
406
|
-
store.localState.pagIndexLast =
|
|
407
|
-
store.localState.pagIndexCur =
|
|
413
|
+
}).onScroll(({ paginationLast: paginationLast2, paginationOffset: paginationOffset2 }) => {
|
|
414
|
+
store.localState.pagIndexLast = paginationLast2;
|
|
415
|
+
store.localState.pagIndexCur = paginationOffset2;
|
|
408
416
|
}, true);
|
|
409
417
|
store.subscribe(() => {
|
|
410
418
|
iscroller.enabled = store.state.infiniteScrollEnabled;
|
|
@@ -448,6 +456,15 @@ class PaginationStrategy {
|
|
|
448
456
|
getPaginationElement() {
|
|
449
457
|
return this.doc.querySelector(this.paginationSelector) || this.doc;
|
|
450
458
|
}
|
|
459
|
+
getPaginationOffset() {
|
|
460
|
+
return this.offsetMin;
|
|
461
|
+
}
|
|
462
|
+
getPaginationLast() {
|
|
463
|
+
return this.offsetMin;
|
|
464
|
+
}
|
|
465
|
+
getPaginationUrlGenerator() {
|
|
466
|
+
return (_) => this.url.href;
|
|
467
|
+
}
|
|
451
468
|
}
|
|
452
469
|
function formatTimeToHHMMSS(timeString) {
|
|
453
470
|
const regex = /(?:(\d+)\s*h\s*)?(?:(\d+)\s*mi?n?\s*)?(?:(\d+)\s*sec)?/;
|
|
@@ -512,9 +529,9 @@ class PaginationStrategyDataParams extends PaginationStrategy {
|
|
|
512
529
|
const block_id = parametersElement?.getAttribute("data-block-id") || "";
|
|
513
530
|
const parameters = parseDataParams(parametersElement?.getAttribute("data-parameters") || "");
|
|
514
531
|
const attrs = {
|
|
515
|
-
mode: "async",
|
|
516
|
-
function: "get_block",
|
|
517
532
|
block_id,
|
|
533
|
+
function: "get_block",
|
|
534
|
+
mode: "async",
|
|
518
535
|
...parameters
|
|
519
536
|
};
|
|
520
537
|
Object.keys(attrs).forEach((k) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"billy-herrington-utils.es.js","sources":["../src/utils/observers/index.ts","../src/utils/strings/index.ts","../src/userscripts/data-manager/index.ts","../src/utils/dom/index.ts","../src/utils/fetch/index.ts","../src/userscripts/infinite-scroll/index.ts","../src/userscripts/jabroni-outfit-wrap/index.ts","../src/userscripts/pagination-parsing/pagination-utils/index.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategy.ts","../src/utils/parsers/index.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategyDataParams.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategyPathnameParams.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategySearchParams.ts","../src/userscripts/pagination-parsing/index.ts","../src/utils/arrays/index.ts","../src/utils/async/index.ts","../src/utils/device/index.ts","../src/utils/events/index.ts","../src/utils/math/index.ts"],"sourcesContent":["export class Observer {\n public observer: IntersectionObserver;\n constructor(private callback: (entry: Element) => void) {\n this.observer = new IntersectionObserver(this.handleIntersection.bind(this));\n }\n\n observe(target: Element) {\n this.observer.observe(target);\n }\n\n throttle(target: Element, throttleTime: number) {\n this.observer.unobserve(target);\n setTimeout(() => this.observer.observe(target), throttleTime);\n }\n\n handleIntersection(entries: Iterable<IntersectionObserverEntry>) {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n this.callback(entry.target);\n }\n }\n }\n\n static observeWhile(\n target: Element,\n callback: () => Promise<boolean> | boolean,\n throttleTime: number,\n ) {\n const observer_ = new Observer(async (target: Element) => {\n const condition = await callback();\n if (condition) observer_.throttle(target, throttleTime);\n });\n observer_.observe(target);\n return observer_;\n }\n}\n\nexport class LazyImgLoader {\n public lazyImgObserver: Observer;\n private attributeName = 'data-lazy-load';\n\n constructor(shouldDelazify: (target: Element) => boolean) {\n this.lazyImgObserver = new Observer((target: Element) => {\n if (shouldDelazify(target)) {\n this.delazify(target as HTMLImageElement);\n }\n });\n }\n\n lazify(_target: Element, img: HTMLImageElement, imgSrc: string) {\n if (!img || !imgSrc) return;\n img.setAttribute(this.attributeName, imgSrc);\n img.src = '';\n this.lazyImgObserver.observe(img);\n }\n\n delazify = (target: HTMLImageElement) => {\n this.lazyImgObserver.observer.unobserve(target);\n target.src = target.getAttribute(this.attributeName) as string;\n target.removeAttribute(this.attributeName);\n };\n}\n","export function stringToWords(s: string): Array<string> {\n return s.split(\",\").map(s => s.trim().toLowerCase()).filter(_ => _);\n}\n\nexport function sanitizeStr(s: string) {\n return s?.replace(/\\n|\\t/, ' ').replace(/ {2,}/, ' ').trim().toLowerCase() || \"\";\n}\n","import { LazyImgLoader } from '../../utils/observers';\nimport { stringToWords } from '../../utils/strings';\n\ninterface DataFilterState {\n filterPublic: boolean;\n filterPrivate: boolean;\n filterHD: boolean;\n filterDuration: boolean;\n filterDurationFrom: number;\n filterDurationTo: number;\n filterExclude: boolean;\n filterExcludeWords: string;\n filterInclude: boolean;\n filterIncludeWords: string;\n}\n\ninterface FilterResult {\n tag: string;\n condition: boolean;\n}\n\ntype FilterInput = Record<string, string | number | boolean | HTMLElement>;\ntype FilterFunction = (v: FilterInput) => FilterResult;\n\nclass DataFilter {\n public filters: { [key: string]: () => FilterFunction };\n\n constructor(\n private rules: IRules,\n private state: DataFilterState,\n ) {\n this.state = state;\n\n const methods = Object.getOwnPropertyNames(this);\n this.filters = methods.reduce((acc: { [key: string]: () => FilterFunction }, k) => {\n if (k in this.state) {\n acc[k] = this[k as keyof DataFilter] as unknown as () => FilterFunction;\n GM_addStyle(`.filter-${k.toLowerCase().slice(6)} { display: none !important; }`);\n }\n return acc;\n }, {});\n }\n\n filterPublic = (): FilterFunction => {\n return (v: FilterInput) => {\n const isPublic = !this.rules.isPrivate(v.element as HTMLElement);\n return {\n tag: 'filter-public',\n condition: this.state.filterPublic && isPublic,\n };\n };\n };\n\n filterPrivate = (): FilterFunction => {\n return (v: FilterInput) => {\n const isPrivate = this.rules.isPrivate(v.element as HTMLElement);\n return {\n tag: 'filter-private',\n condition: this.state.filterPrivate && isPrivate,\n };\n };\n };\n\n filterHD = (): FilterFunction => {\n return (v: FilterInput) => {\n const isHD = this.rules.isHD(v.element as HTMLElement);\n return {\n tag: 'filter-hd',\n condition: this.state.filterHD && isHD,\n };\n };\n };\n\n filterDuration = (): FilterFunction => {\n return (v: FilterInput) => {\n const notInRange =\n (v.duration as number) < this.state.filterDurationFrom ||\n (v.duration as number) > this.state.filterDurationTo;\n return {\n tag: 'filter-duration',\n condition: this.state.filterDuration && notInRange,\n };\n };\n };\n\n filterExclude = (): FilterFunction => {\n const tags = DataManager.filterDSLToRegex(this.state.filterExcludeWords);\n return (v: FilterInput) => {\n const containTags = tags.some((tag) => tag.test(v.title as string));\n return {\n tag: 'filter-exclude',\n condition: this.state.filterExclude && containTags,\n };\n };\n };\n\n filterInclude = (): FilterFunction => {\n const tags = DataManager.filterDSLToRegex(this.state.filterIncludeWords);\n return (v: FilterInput) => {\n const containTagsNot = tags.some((tag) => !tag.test(v.title as string));\n return {\n tag: 'filter-include',\n condition: this.state.filterInclude && containTagsNot,\n };\n };\n };\n}\n\ninterface IRules {\n getThumbs: (html: HTMLElement) => HTMLElement[];\n getThumbUrl: (thumbElement: HTMLElement) => string;\n getThumbData: (thumbElement: HTMLElement) => { title: string; duration: number };\n getThumbImgData: (thumbElement: HTMLElement) => { img: HTMLElement; imgSrc: string };\n container: HTMLElement;\n isPrivate: (element: HTMLElement) => boolean;\n isHD: (element: HTMLElement) => boolean;\n}\n\nexport class DataManager {\n private rules: IRules;\n private state: DataFilterState;\n private data: Map<string, FilterInput>;\n private lazyImgLoader: LazyImgLoader;\n public dataFilters: { [key: string]: () => FilterFunction };\n\n constructor(rules: IRules, state: DataFilterState) {\n this.rules = rules;\n this.state = state;\n this.data = new Map();\n this.lazyImgLoader = new LazyImgLoader(\n (target: Element) => !this.isFiltered(target as HTMLElement),\n );\n this.dataFilters = new DataFilter(rules, state).filters;\n\n const targets = [window, (globalThis as any).unsafeWindow].filter(Boolean);\n targets.forEach((w: any) => {\n Object.assign(w, {\n sortByViews: () => this.sort('view'),\n sortByDuration: () => this.sort('duration'),\n });\n });\n }\n\n static filterDSLToRegex(str: string): RegExp[] {\n const toFullWord = (w: string) => `(^|\\\\ )${w}($|\\\\ )`;\n const str_ = str.replace(/f:(\\w+)/g, (_, w) => toFullWord(w));\n return stringToWords(str_).map((expr: string) => new RegExp(expr, 'i'));\n }\n\n isFiltered(el: HTMLElement): boolean {\n return el.className.includes('filtered');\n }\n\n applyFilters = (filters: { [key: string]: boolean }, offset = 0): void => {\n const filtersToApply = Object.keys(filters)\n .filter((k) => Object.hasOwn(this.dataFilters, k))\n .map((k) => this.dataFilters[k]());\n\n if (filtersToApply.length === 0) return;\n\n const updates: (() => void)[] = [];\n let offset_counter = 1;\n for (const v of this.data.values()) {\n if (++offset_counter > offset) {\n for (const f of filtersToApply) {\n const { tag, condition } = f(v as FilterInput);\n updates.push(() => (v.element as HTMLElement).classList.toggle(tag, condition));\n }\n }\n }\n\n requestAnimationFrame(() => {\n updates.forEach((update) => {\n update();\n });\n });\n };\n\n filterAll = (offset?: number): void => {\n const filters = Object.assign(\n {},\n ...Object.keys(this.dataFilters).map((f) => ({\n [f]: this.state[f as keyof DataFilterState],\n })),\n );\n this.applyFilters(filters, offset);\n };\n\n parseData = (\n html: HTMLElement,\n container?: HTMLElement,\n removeDuplicates = false,\n shouldLazify = true,\n ): void => {\n const thumbs = this.rules.getThumbs(html);\n const data_offset = this.data.size;\n\n for (const thumbElement of thumbs) {\n const url = this.rules.getThumbUrl(thumbElement);\n if (!url || this.data.has(url)) {\n if (removeDuplicates) thumbElement.remove();\n continue;\n }\n\n const data = this.rules.getThumbData(thumbElement);\n this.data.set(url, { element: thumbElement, ...data });\n\n if (shouldLazify) {\n const { img, imgSrc } = this.rules.getThumbImgData(thumbElement);\n this.lazyImgLoader.lazify(thumbElement, img as HTMLImageElement, imgSrc);\n }\n\n const parent = container || this.rules.container;\n if (!parent.contains(thumbElement)) parent.appendChild(thumbElement);\n }\n\n this.filterAll(data_offset);\n };\n\n sort(propName: string) {\n if (this.data.size < 2) return;\n\n const sorted = Array.from(this.data.keys()).sort((b, a) => {\n return (\n ((this.data.get(a) as FilterInput)[propName] as number) -\n ((this.data.get(b) as FilterInput)[propName] as number)\n );\n });\n\n const container = ((this.data.get(sorted[0]) as FilterInput).element as HTMLElement)\n .parentElement as HTMLElement;\n\n sorted.forEach((s) => {\n const e = (this.data.get(s) as FilterInput).element as HTMLElement;\n container.append(e);\n });\n }\n}\n","export function parseDom(html: string): HTMLElement {\n const parsed = new DOMParser().parseFromString(html, 'text/html').body;\n return parsed.children.length > 1 ? parsed : parsed.firstElementChild as HTMLElement;\n}\n\nexport function copyAttributes(target: HTMLElement | Element, source: HTMLElement | Element) {\n for (const attr of source.attributes) {\n attr.nodeValue && target.setAttribute(attr.nodeName, attr.nodeValue);\n }\n}\n\nexport function replaceElementTag(e: HTMLElement | Element, tagName: string) {\n const newTagElement = document.createElement(tagName);\n copyAttributes(newTagElement, e);\n newTagElement.innerHTML = e.innerHTML;\n e.parentNode?.replaceChild(newTagElement, e);\n return newTagElement;\n}\n\nexport function getAllUniqueParents(elements: HTMLCollection): Array<HTMLElement | Element> {\n return Array.from(elements).reduce((acc, v) => {\n if (v.parentElement && !acc.includes(v.parentElement as HTMLElement)) { acc.push(v.parentElement); }\n return acc;\n }, [] as Array<HTMLElement | Element>);\n}\n\nexport function findNextSibling(el: HTMLElement | Element) {\n if (el.nextElementSibling) return el.nextElementSibling;\n if (el.parentElement) return findNextSibling(el.parentElement);\n return null;\n}\n\nexport function waitForElementExists(parent: HTMLElement | Element, selector: string, callback: (el: Element) => void): void {\n const observer = new MutationObserver((_mutations) => {\n const el = parent.querySelector(selector);\n if (el) {\n observer.disconnect();\n callback(el);\n }\n });\n observer.observe(document.body, { childList: true, subtree: true });\n}\n\nexport function watchElementChildrenCount(element: HTMLElement | Element,\n callback: (observer: MutationObserver, count: number) => void): void {\n let count = element.children.length;\n const observer = new MutationObserver((mutationList, observer) => {\n for (const mutation of mutationList) {\n if (mutation.type === \"childList\") {\n if (count !== element.children.length) {\n count = element.children.length;\n callback(observer, count);\n }\n }\n }\n });\n observer.observe(element, { childList: true });\n}\n\nexport function watchDomChangesWithThrottle(\n element: HTMLElement | Element, \n callback: () => void,\n throttle = 1000,\n times = Infinity,\n options: Record<string, boolean> = { childList: true, subtree: true, attributes: true }\n) {\n let lastMutationTime: number;\n let timeout: number;\n let times_ = times;\n const observer = new MutationObserver((_mutationList, _observer) => {\n if (times_ !== Infinity && times_ < 1) {\n observer.disconnect();\n return;\n }\n times_--;\n const now = Date.now();\n if (lastMutationTime && now - lastMutationTime < throttle) {\n timeout && clearTimeout(timeout);\n }\n timeout = setTimeout(callback, throttle);\n lastMutationTime = now;\n });\n observer.observe(element, options);\n return observer;\n}\n\nexport function downloader(options = { append: \"\", after: \"\", button: \"\", cbBefore: () => { } }) {\n const btn = parseDom(options.button);\n\n if (options.append) document.querySelector(options.append)?.append(btn);\n if (options.after) document.querySelector(options.after)?.after(btn);\n\n btn.addEventListener('click', (e) => {\n e.preventDefault();\n\n if (options.cbBefore) options.cbBefore();\n\n waitForElementExists(document.body, 'video', (video: Element) => {\n window.location.href = video.getAttribute('src') as string;\n });\n });\n}\n\nexport function exterminateVideo(video: HTMLVideoElement) {\n video.removeAttribute('src');\n video.load();\n video.remove();\n}","import { parseDom } from '../dom';\n\nexport const MOBILE_UA = [\n 'Mozilla/5.0 (Linux; Android 10; K)',\n 'AppleWebKit/537.36 (KHTML, like Gecko)',\n 'Chrome/114.0.0.0 Mobile Safari/537.36',\n].join(' ');\n\nexport function fetchWith(\n url: string,\n options: Record<string, boolean> = { html: false, mobile: false },\n) {\n const reqOpts = {};\n if (options.mobile) Object.assign(reqOpts, { headers: new Headers({ 'User-Agent': MOBILE_UA }) });\n return fetch(url, reqOpts)\n .then((r) => r.text())\n .then((r) => (options.html ? parseDom(r) : r));\n}\n\nexport const fetchHtml = (url: string) => fetchWith(url, { html: true }) as Promise<HTMLElement>;\n\nexport const fetchText = (url: string) => fetchWith(url) as Promise<string>;\n\nexport function objectToFormData(object: Record<string, number | boolean | string>): FormData {\n const formData = new FormData();\n Object.entries(object).forEach(([k, v]) => formData.append(k, v as string));\n return formData;\n}\n","import { fetchHtml } from '../../utils/fetch';\nimport { Observer } from '../../utils/observers';\n\ninterface IInfiniteScroller {\n delay: number;\n enabled: boolean;\n writeHistory?: boolean;\n paginationOffset: number;\n paginationLast: number;\n paginationElement: HTMLElement;\n paginationUrlGenerator: (offset: number) => string;\n handleHtmlCallback: (document: HTMLElement) => void;\n intersectionObservable?: HTMLElement;\n alternativeGenerator?: () => OffsetGenerator;\n}\n\ninterface GeneratorResult {\n url: string;\n offset: number;\n}\n\ntype OffsetGenerator = Generator<GeneratorResult> | AsyncGenerator<GeneratorResult>;\n\nexport class InfiniteScroller {\n public paginationGenerator: OffsetGenerator;\n public enabled: boolean;\n public delay: number;\n public paginationOffset: number;\n public paginationLast: number;\n public writeHistory: boolean;\n private handleHtmlCallback: (document: HTMLElement) => void;\n\n constructor({\n enabled = true,\n delay = 350,\n writeHistory = false,\n paginationOffset,\n paginationLast,\n paginationElement,\n paginationUrlGenerator,\n handleHtmlCallback,\n alternativeGenerator,\n intersectionObservable,\n }: IInfiniteScroller) {\n this.enabled = enabled;\n this.delay = delay;\n this.writeHistory = writeHistory;\n this.paginationOffset = paginationOffset;\n this.paginationLast = paginationLast;\n this.handleHtmlCallback = handleHtmlCallback;\n\n this.paginationGenerator =\n alternativeGenerator?.() ??\n InfiniteScroller.createPaginationGenerator(\n paginationOffset,\n paginationLast,\n paginationUrlGenerator,\n );\n\n const observable = intersectionObservable || paginationElement;\n Observer.observeWhile(observable, this.generatorConsumer, this.delay);\n }\n\n private onScrollCBs: Array<(scroller: InfiniteScroller) => void> = [];\n\n public onScroll(callback: (scroller: InfiniteScroller) => void, initCall = false) {\n if (initCall) callback(this);\n this.onScrollCBs.push(callback);\n return this;\n }\n\n private _onScroll() {\n this.onScrollCBs.forEach((cb) => {\n cb(this);\n });\n }\n\n generatorConsumer = async () => {\n if (!this.enabled) return false;\n const { value: { url, offset } = {}, done } = await this.paginationGenerator.next();\n if (!done) {\n const nextPageHTML = await fetchHtml(url);\n const prevScrollPos = document.documentElement.scrollTop;\n this.paginationOffset = offset;\n this.handleHtmlCallback(nextPageHTML);\n this._onScroll();\n window.scrollTo(0, prevScrollPos);\n if (this.writeHistory) {\n history.replaceState({}, '', url);\n }\n }\n return !done;\n };\n\n static *createPaginationGenerator(\n currentPage: number,\n totalPages: number,\n generateURL: (offset: number) => string,\n ): OffsetGenerator {\n for (let offset = currentPage + 1; offset <= totalPages; offset++) {\n const url = generateURL(offset);\n yield { url, offset };\n }\n }\n}\n","import { InfiniteScroller } from '../infinite-scroll';\nimport type { PaginationStrategy } from '../pagination-parsing/pagination-strategies';\n\ninterface IRules {\n paginationStrategy: PaginationStrategy;\n delay: number;\n paginationOffset: number;\n paginationLast: number;\n paginationElement: HTMLElement;\n paginationUrlGenerator: (n: number) => string;\n}\n\nexport interface JabroniStore {\n state: Record<string, boolean | string | number>;\n localState: Record<string, boolean | string | number>;\n subscribe: (callback: () => void) => void;\n}\n\nexport function createInfiniteScroller(\n store: JabroniStore,\n handleHtmlCallback: (document: HTMLElement) => void,\n rules: IRules,\n) {\n const enabled = store.state.infiniteScrollEnabled as boolean;\n const iscroller = new InfiniteScroller({\n enabled,\n handleHtmlCallback,\n ...rules,\n }).onScroll(({ paginationLast, paginationOffset }) => {\n store.localState.pagIndexLast = paginationLast;\n store.localState.pagIndexCur = paginationOffset;\n }, true);\n\n store.subscribe(() => {\n iscroller.enabled = store.state.infiniteScrollEnabled as boolean;\n });\n\n return iscroller;\n}\n","export function getPaginationLinks(\n doc: HTMLElement | Document = document,\n url: Location | URL | string = location.href,\n pathnameSelector = /\\/(page\\/)?\\d+\\/?$/,\n): string[] {\n const currentUrl = parseURL(url);\n currentUrl.pathname = currentUrl.pathname.replace(pathnameSelector, '/');\n const pageLinks = Array.from(\n (doc.querySelectorAll('a[href]') as NodeListOf<HTMLAnchorElement>) || [],\n (a) => a.href,\n ).filter((h) => {\n try {\n const linkUrl = new URL(h.replace(/#$/, ''), doc.baseURI || currentUrl.origin);\n return (\n linkUrl.origin === currentUrl.origin && linkUrl.pathname.startsWith(currentUrl.pathname)\n );\n } catch {\n return false;\n }\n });\n return pageLinks;\n}\n\nexport function parseURL(s: HTMLAnchorElement | Location | URL | string): URL {\n if (typeof s === 'string') return new URL(s);\n return new URL(s.href);\n}\n","import { parseURL } from '../pagination-utils';\n\nexport interface IPaginationStrategy {\n url?: URL | Location | string;\n doc?: Document | HTMLElement;\n paginationSelector?: string;\n fixPaginationLast?: (n: number, offset?: number) => number;\n pathnameSelector?: RegExp;\n searchParamSelector?: string;\n offsetMin?: number;\n}\n\nexport class PaginationStrategy {\n public doc = document;\n public url: URL;\n public paginationSelector = '.pagination';\n public fixPaginationLast?: (n: number, offset?: number) => number;\n public offsetMin = 1;\n\n constructor(options?: IPaginationStrategy) {\n if (options) {\n Object.entries(options).forEach(([k, v]) => {\n Object.assign(this, { [k]: v });\n });\n }\n\n this.url = parseURL(options?.url || this.doc.URL);\n }\n\n getPaginationElement() {\n return (this.doc.querySelector(this.paginationSelector) || this.doc) as HTMLElement;\n }\n}\n","export function formatTimeToHHMMSS(timeString: string): string {\n const regex: RegExp = /(?:(\\d+)\\s*h\\s*)?(?:(\\d+)\\s*mi?n?\\s*)?(?:(\\d+)\\s*sec)?/;\n const match: RegExpMatchArray | null = timeString.match(regex);\n const h: number = parseInt(match?.[1] || '0');\n const m: number = parseInt(match?.[2] || '0');\n const s: number = parseInt(match?.[3] || '0');\n const pad = (num: number): string => String(num).padStart(2, '0');\n return `${pad(h)}:${pad(m)}:${pad(s)}`;\n}\n\n// \"01:22:03\" -> 4923\nexport function timeToSeconds(t: string): number {\n const r = /sec|min|h|m/.test(t) ? formatTimeToHHMMSS(t) : t;\n return (r?.match(/\\d+/gm) || [0])\n .reverse()\n .map((s, i) => parseInt(s as string) * 60 ** i)\n .reduce((a, b) => a + b);\n}\n\nexport function parseIntegerOr(n: string | number, or: number): number {\n return (num => Number.isNaN(num) ? or : num)(parseInt(n as string));\n}\n\n// \"data:02;body+head:async;void:;zero:;\"\nexport function parseDataParams(str: string): Record<string, string> {\n const paramsStr = decodeURI(str.trim()).split(';');\n return paramsStr.reduce((acc, s) => {\n const parsed = s.match(/([\\+\\w]+):([\\w\\-\\ ]+)?/);\n if (parsed) {\n const [, key, value] = parsed;\n if (value) {\n key.split('+').forEach(p => { acc[p] = value; });\n }\n }\n return acc;\n }, {} as Record<string, string>);\n}\n\nexport function parseCSSUrl(s: string) {\n return s.replace(/url\\(\"|\\\"\\).*/g, '');\n}\n","import { parseDataParams } from '../../../utils/parsers';\nimport { PaginationStrategy } from './PaginationStrategy';\n\nexport class PaginationStrategyDataParams extends PaginationStrategy {\n getPaginationLast() {\n const links = this.getPaginationElement()?.querySelectorAll('[data-parameters *= from]');\n const pages = Array.from(links || [], (l) => {\n const p = l.getAttribute('data-parameters');\n const v = p?.match(/from\\w*:(\\d+)/)?.[1] || this.offsetMin.toString();\n return parseInt(v);\n });\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n const link = this.getPaginationElement()?.querySelector(\n '.prev[data-parameters *= from], .prev [data-parameters *= from]',\n );\n if (!link) return this.offsetMin;\n const p = link.getAttribute('data-parameters');\n const v = p?.match(/from\\w*:(\\d+)/)?.[1] || this.offsetMin.toString();\n return parseInt(v);\n }\n\n getPaginationUrlGenerator() {\n const url = new URL(this.url.href);\n\n const parametersElement = this.getPaginationElement()?.querySelector(\n 'a[data-block-id][data-parameters]',\n );\n const block_id = parametersElement?.getAttribute('data-block-id') || '';\n const parameters = parseDataParams(parametersElement?.getAttribute('data-parameters') || '');\n\n const attrs: Record<string, string> = {\n mode: 'async',\n function: 'get_block',\n block_id,\n ...parameters,\n };\n\n Object.keys(attrs).forEach((k) => {\n url.searchParams.set(k, attrs[k]);\n });\n\n const paginationUrlGenerator = (n: number) => {\n Object.keys(attrs).forEach((k) => {\n k.includes('from') && url.searchParams.set(k, n.toString());\n });\n url.searchParams.set('_', Date.now().toString());\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import { getPaginationLinks } from '../pagination-utils';\nimport { PaginationStrategy } from './PaginationStrategy';\n\n// const fixPaginationLast = (n) => {\n// if difference < 9 = 999\n// }\n// maybe update doc after scroll to fix issues\n\nexport class PaginationStrategyPathnameParams extends PaginationStrategy {\n public pathnameSelector = /\\/(\\d+)\\/?$/;\n\n extractPage = (a: HTMLAnchorElement | Location | string): number => {\n const href = typeof a === 'string' ? a : a.href;\n const { pathname } = new URL(href, this.doc.baseURI || this.url.origin);\n return parseInt(pathname.match(this.pathnameSelector)?.pop() || this.offsetMin.toString());\n };\n\n getPaginationLast() {\n const links = getPaginationLinks(\n this.getPaginationElement(),\n this.url.href,\n this.pathnameSelector,\n );\n const pages = Array.from(links, this.extractPage);\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n return this.extractPage(this.url.href);\n }\n\n getPaginationUrlGenerator(url_: URL = this.url) {\n const url = new URL(url_.href);\n\n const pathnameSelectorPlaceholder = this.pathnameSelector\n .toString()\n .replace(/[/|\\\\|$|?|(|)]+/g, '/');\n\n if (!this.pathnameSelector.test(url.pathname)) {\n url.pathname = url.pathname\n .concat(pathnameSelectorPlaceholder.replace(/d\\+/, this.offsetMin.toString()))\n .replace(/\\/{2,}/g, '/');\n }\n\n const paginationUrlGenerator = (offset: number) => {\n url.pathname = url.pathname.replace(\n this.pathnameSelector,\n pathnameSelectorPlaceholder.replace(/d\\+/, offset.toString()),\n );\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import { getPaginationLinks } from '../pagination-utils';\nimport { PaginationStrategy } from './PaginationStrategy';\n\nexport class PaginationStrategySearchParams extends PaginationStrategy {\n public searchParamSelector = 'page';\n\n getPaginationElement() {\n return (this.doc.querySelector(this.paginationSelector) || this.doc) as HTMLElement;\n }\n\n extractPage(a: HTMLAnchorElement | Location | URL | string): number {\n const href = typeof a === 'string' ? a : a.href;\n const p = new URL(href).searchParams.get(this.searchParamSelector) as string;\n return parseInt(p) || this.offsetMin;\n }\n\n getPaginationLast() {\n const links = getPaginationLinks(this.getPaginationElement(), this.url.href).filter((h) =>\n /(page|p)=\\d+/.test(h),\n );\n const pages = links.map(this.extractPage);\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n if (this.doc === document) {\n return this.extractPage(this.url);\n }\n const link = this.getPaginationElement().querySelector(\n `a.active[href *= \"${this.searchParamSelector}=\"]`,\n ) as HTMLAnchorElement;\n return this.extractPage(link);\n }\n\n getPaginationUrlGenerator() {\n const url = new URL(this.url.href);\n\n const paginationUrlGenerator = (offset: number) => {\n url.searchParams.set(this.searchParamSelector, offset.toString());\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import {\n type IPaginationStrategy,\n PaginationStrategy,\n PaginationStrategyDataParams,\n PaginationStrategyPathnameParams,\n PaginationStrategySearchParams,\n} from './pagination-strategies';\nimport { getPaginationLinks } from './pagination-utils';\n\nexport function getPaginationStrategy(options: IPaginationStrategy) {\n const { doc = document, url = location.href } = options;\n const pageLinks = getPaginationLinks(doc, url);\n\n console.log({ pageLinks });\n\n const getStrategy = (): typeof PaginationStrategy => {\n if (pageLinks.some((h) => /(page|p)=\\d+/.test(h))) {\n const l = pageLinks.filter((h) => /(page|p)=\\d+/.test(h));\n console.log('PaginationStrategySearchParams', l);\n return PaginationStrategySearchParams;\n }\n\n if (pageLinks.some((h) => /\\/(page\\/)?\\d+\\/?$/.test(h))) {\n const l = pageLinks.filter((h) => /\\/(page\\/)?\\d+\\/?$/.test(h));\n console.log('PaginationStrategyPathnameParams', l);\n return PaginationStrategyPathnameParams;\n }\n\n const type5Links = Array.from(document.querySelectorAll('[data-parameters *= from]'));\n if (type5Links.length > 0) {\n console.log('PaginationStrategyDataParams', type5Links);\n return PaginationStrategyDataParams;\n }\n\n console.error('Found No Strategy');\n return PaginationStrategy;\n };\n\n const paginationStrategy = new (getStrategy())(options);\n\n return paginationStrategy;\n}\n\n// const p = new PaginationStrategyPathnameParams();\n\n// console.table({\n// pagination: `class:${p.getPaginationElement().className} + id:${p.getPaginationElement().id}`,\n// last: p.getPaginationLast(),\n// offset: p.getPaginationOffset(),\n// generator: p.getPaginationUrlGenerator()(1488),\n// });\n","export function chunks<T>(arr: Array<T>, n: number): Array<Array<T>> {\n return Array.from({ length: Math.ceil(arr.length / n) }, (_, i) => arr.slice(i * n, i * n + n));\n}\n\nexport function range(size: number, startAt: number = 1, step: number = 1): number[] {\n return Array.from({ length: size }, (_, index) => startAt + index * step);\n}\n","// https://2ality.com/2016/10/asynchronous-iteration.html\nexport async function computeAsyncOneAtTime(iterable: Iterable<() => Promise<void>>) {\n const res = [];\n for await (const f of iterable) {\n res.push(await f());\n }\n return res;\n}\n\nexport function wait(milliseconds: number) {\n return new Promise((resolve) => setTimeout(resolve, milliseconds));\n}\n\ninterface AsyncPoolTask {\n v: () => Promise<void>;\n p: number;\n}\n\nexport class AsyncPool {\n private cur = 0;\n private finished: Promise<boolean>;\n private _resolve?: (value: boolean | PromiseLike<boolean>) => void;\n\n public static async doNAsyncAtOnce(max = 1, pool: Array<AsyncPoolTask | (() => Promise<void>)> = []) {\n const spool = new AsyncPool(max);\n pool.forEach(f => spool.push(f));\n return spool.run();\n }\n\n constructor(private max = 1, private pool: Array<AsyncPoolTask> = []) {\n this.finished = new Promise((resolve) => {\n this._resolve = resolve;\n });\n }\n\n private getHighPriorityFirst(p = 0): (() => Promise<void>) | undefined {\n if (p > 3 || this.pool.length === 0) return undefined;\n const i = this.pool.findIndex((e) => e.p === p);\n if (i >= 0) {\n const res = this.pool[i].v;\n this.pool.splice(i, 1);\n return res;\n }\n return this.getHighPriorityFirst(p + 1);\n }\n\n private async runTask() {\n this.cur++;\n const f = this.getHighPriorityFirst();\n await f?.();\n this.cur--;\n this.runTasks();\n }\n\n private runTasks() {\n if (!this.pool.length) {\n this._resolve?.(true);\n return;\n }\n if (this.cur < this.max) {\n this.runTask();\n this.runTasks();\n }\n }\n\n public async run() {\n this.runTasks();\n return this.finished;\n }\n\n public push(x: AsyncPoolTask | (() => Promise<void>)) {\n this.pool.push('p' in x ? x : { v: x, p: 0 });\n }\n}\n\n","export function isMob() {\n return /iPhone|Android/i.test(navigator.userAgent);\n}","export function listenEvents(dom: HTMLElement | Element, events: Array<string>, callback: (e: Event) => void): void {\n for (const e of events) {\n dom.addEventListener(e, callback, true);\n }\n}\n\nexport class Tick {\n private tick?: number;\n private callbackFinal?: () => void;\n\n constructor(private delay: number, private startImmediate: boolean = true) {}\n\n public start(callback: () => void, callbackFinal?: () => void): void {\n this.stop();\n this.callbackFinal = callbackFinal;\n if (this.startImmediate) callback();\n this.tick = window.setInterval(callback, this.delay);\n }\n\n public stop(): void {\n if (this.tick !== undefined) {\n clearInterval(this.tick);\n this.tick = undefined;\n }\n if (this.callbackFinal) {\n this.callbackFinal();\n this.callbackFinal = undefined;\n }\n }\n}\n","export function circularShift(n: number, c = 6, s = 1): number {\n return (n + s) % c || c;\n}\n"],"names":["target","s","observer"],"mappings":";;;AAAO,MAAM,SAAS;AAAA,EAEpB,YAAoB,UAAoC;AADjD;AACa,SAAA,WAAA;AAClB,SAAK,WAAW,IAAI,qBAAqB,KAAK,mBAAmB,KAAK,IAAI,CAAC;AAAA,EAAA;AAAA,EAG7E,QAAQ,QAAiB;AAClB,SAAA,SAAS,QAAQ,MAAM;AAAA,EAAA;AAAA,EAG9B,SAAS,QAAiB,cAAsB;AACzC,SAAA,SAAS,UAAU,MAAM;AAC9B,eAAW,MAAM,KAAK,SAAS,QAAQ,MAAM,GAAG,YAAY;AAAA,EAAA;AAAA,EAG9D,mBAAmB,SAA8C;AAC/D,eAAW,SAAS,SAAS;AAC3B,UAAI,MAAM,gBAAgB;AACnB,aAAA,SAAS,MAAM,MAAM;AAAA,MAAA;AAAA,IAC5B;AAAA,EACF;AAAA,EAGF,OAAO,aACL,QACA,UACA,cACA;AACA,UAAM,YAAY,IAAI,SAAS,OAAOA,YAAoB;AAClD,YAAA,YAAY,MAAM,SAAS;AACjC,UAAI,UAAW,WAAU,SAASA,SAAQ,YAAY;AAAA,IAAA,CACvD;AACD,cAAU,QAAQ,MAAM;AACjB,WAAA;AAAA,EAAA;AAEX;AAEO,MAAM,cAAc;AAAA,EAIzB,YAAY,gBAA8C;AAHnD;AACC,yCAAgB;AAiBxB,oCAAW,CAAC,WAA6B;AAClC,WAAA,gBAAgB,SAAS,UAAU,MAAM;AAC9C,aAAO,MAAM,OAAO,aAAa,KAAK,aAAa;AAC5C,aAAA,gBAAgB,KAAK,aAAa;AAAA,IAC3C;AAlBE,SAAK,kBAAkB,IAAI,SAAS,CAAC,WAAoB;AACnD,UAAA,eAAe,MAAM,GAAG;AAC1B,aAAK,SAAS,MAA0B;AAAA,MAAA;AAAA,IAC1C,CACD;AAAA,EAAA;AAAA,EAGH,OAAO,SAAkB,KAAuB,QAAgB;AAC1D,QAAA,CAAC,OAAO,CAAC,OAAQ;AACjB,QAAA,aAAa,KAAK,eAAe,MAAM;AAC3C,QAAI,MAAM;AACL,SAAA,gBAAgB,QAAQ,GAAG;AAAA,EAAA;AAQpC;AC7DO,SAAS,cAAc,GAA0B;AACtD,SAAO,EAAE,MAAM,GAAG,EAAE,IAAI,CAAAC,OAAKA,GAAE,OAAO,YAAY,CAAC,EAAE,OAAO,OAAK,CAAC;AACpE;AAEO,SAAS,YAAY,GAAW;AACrC,SAAO,GAAG,QAAQ,SAAS,GAAG,EAAE,QAAQ,SAAS,GAAG,EAAE,OAAO,YAAiB,KAAA;AAChF;ACkBA,MAAM,WAAW;AAAA,EAGf,YACU,OACA,OACR;AALK;AAkBP,wCAAe,MAAsB;AACnC,aAAO,CAAC,MAAmB;AACzB,cAAM,WAAW,CAAC,KAAK,MAAM,UAAU,EAAE,OAAsB;AACxD,eAAA;AAAA,UACL,KAAK;AAAA,UACL,WAAW,KAAK,MAAM,gBAAgB;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAEA,yCAAgB,MAAsB;AACpC,aAAO,CAAC,MAAmB;AACzB,cAAM,YAAY,KAAK,MAAM,UAAU,EAAE,OAAsB;AACxD,eAAA;AAAA,UACL,KAAK;AAAA,UACL,WAAW,KAAK,MAAM,iBAAiB;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAEA,oCAAW,MAAsB;AAC/B,aAAO,CAAC,MAAmB;AACzB,cAAM,OAAO,KAAK,MAAM,KAAK,EAAE,OAAsB;AAC9C,eAAA;AAAA,UACL,KAAK;AAAA,UACL,WAAW,KAAK,MAAM,YAAY;AAAA,QACpC;AAAA,MACF;AAAA,IACF;AAEA,0CAAiB,MAAsB;AACrC,aAAO,CAAC,MAAmB;AACnB,cAAA,aACH,EAAE,WAAsB,KAAK,MAAM,sBACnC,EAAE,WAAsB,KAAK,MAAM;AAC/B,eAAA;AAAA,UACL,KAAK;AAAA,UACL,WAAW,KAAK,MAAM,kBAAkB;AAAA,QAC1C;AAAA,MACF;AAAA,IACF;AAEA,yCAAgB,MAAsB;AACpC,YAAM,OAAO,YAAY,iBAAiB,KAAK,MAAM,kBAAkB;AACvE,aAAO,CAAC,MAAmB;AACnB,cAAA,cAAc,KAAK,KAAK,CAAC,QAAQ,IAAI,KAAK,EAAE,KAAe,CAAC;AAC3D,eAAA;AAAA,UACL,KAAK;AAAA,UACL,WAAW,KAAK,MAAM,iBAAiB;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAEA,yCAAgB,MAAsB;AACpC,YAAM,OAAO,YAAY,iBAAiB,KAAK,MAAM,kBAAkB;AACvE,aAAO,CAAC,MAAmB;AACnB,cAAA,iBAAiB,KAAK,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,EAAE,KAAe,CAAC;AAC/D,eAAA;AAAA,UACL,KAAK;AAAA,UACL,WAAW,KAAK,MAAM,iBAAiB;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AA7EU,SAAA,QAAA;AACA,SAAA,QAAA;AAER,SAAK,QAAQ;AAEP,UAAA,UAAU,OAAO,oBAAoB,IAAI;AAC/C,SAAK,UAAU,QAAQ,OAAO,CAAC,KAA8C,MAAM;AAC7E,UAAA,KAAK,KAAK,OAAO;AACf,YAAA,CAAC,IAAI,KAAK,CAAqB;AACnC,oBAAY,WAAW,EAAE,cAAc,MAAM,CAAC,CAAC,gCAAgC;AAAA,MAAA;AAE1E,aAAA;AAAA,IACT,GAAG,EAAE;AAAA,EAAA;AAkET;AAYO,MAAM,YAAY;AAAA,EAOvB,YAAY,OAAe,OAAwB;AAN3C;AACA;AACA;AACA;AACD;AA8BP,wCAAe,CAAC,SAAqC,SAAS,MAAY;AAClE,YAAA,iBAAiB,OAAO,KAAK,OAAO,EACvC,OAAO,CAAC,MAAM,OAAO,OAAO,KAAK,aAAa,CAAC,CAAC,EAChD,IAAI,CAAC,MAAM,KAAK,YAAY,CAAC,GAAG;AAE/B,UAAA,eAAe,WAAW,EAAG;AAEjC,YAAM,UAA0B,CAAC;AACjC,UAAI,iBAAiB;AACrB,iBAAW,KAAK,KAAK,KAAK,OAAA,GAAU;AAC9B,YAAA,EAAE,iBAAiB,QAAQ;AAC7B,qBAAW,KAAK,gBAAgB;AAC9B,kBAAM,EAAE,KAAK,cAAc,EAAE,CAAgB;AACrC,oBAAA,KAAK,MAAO,EAAE,QAAwB,UAAU,OAAO,KAAK,SAAS,CAAC;AAAA,UAAA;AAAA,QAChF;AAAA,MACF;AAGF,4BAAsB,MAAM;AAClB,gBAAA,QAAQ,CAAC,WAAW;AACnB,iBAAA;AAAA,QAAA,CACR;AAAA,MAAA,CACF;AAAA,IACH;AAEA,qCAAY,CAAC,WAA0B;AACrC,YAAM,UAAU,OAAO;AAAA,QACrB,CAAC;AAAA,QACD,GAAG,OAAO,KAAK,KAAK,WAAW,EAAE,IAAI,CAAC,OAAO;AAAA,UAC3C,CAAC,CAAC,GAAG,KAAK,MAAM,CAA0B;AAAA,QAAA,EAC1C;AAAA,MACJ;AACK,WAAA,aAAa,SAAS,MAAM;AAAA,IACnC;AAEA,qCAAY,CACV,MACA,WACA,mBAAmB,OACnB,eAAe,SACN;AACT,YAAM,SAAS,KAAK,MAAM,UAAU,IAAI;AAClC,YAAA,cAAc,KAAK,KAAK;AAE9B,iBAAW,gBAAgB,QAAQ;AACjC,cAAM,MAAM,KAAK,MAAM,YAAY,YAAY;AAC/C,YAAI,CAAC,OAAO,KAAK,KAAK,IAAI,GAAG,GAAG;AAC1B,cAAA,+BAA+B,OAAO;AAC1C;AAAA,QAAA;AAGF,cAAM,OAAO,KAAK,MAAM,aAAa,YAAY;AAC5C,aAAA,KAAK,IAAI,KAAK,EAAE,SAAS,cAAc,GAAG,MAAM;AAErD,YAAI,cAAc;AAChB,gBAAM,EAAE,KAAK,WAAW,KAAK,MAAM,gBAAgB,YAAY;AAC/D,eAAK,cAAc,OAAO,cAAc,KAAyB,MAAM;AAAA,QAAA;AAGnE,cAAA,SAAS,aAAa,KAAK,MAAM;AACvC,YAAI,CAAC,OAAO,SAAS,YAAY,EAAG,QAAO,YAAY,YAAY;AAAA,MAAA;AAGrE,WAAK,UAAU,WAAW;AAAA,IAC5B;AA3FE,SAAK,QAAQ;AACb,SAAK,QAAQ;AACR,SAAA,2BAAW,IAAI;AACpB,SAAK,gBAAgB,IAAI;AAAA,MACvB,CAAC,WAAoB,CAAC,KAAK,WAAW,MAAqB;AAAA,IAC7D;AACA,SAAK,cAAc,IAAI,WAAW,OAAO,KAAK,EAAE;AAEhD,UAAM,UAAU,CAAC,QAAS,WAAmB,YAAY,EAAE,OAAO,OAAO;AACjE,YAAA,QAAQ,CAAC,MAAW;AAC1B,aAAO,OAAO,GAAG;AAAA,QACf,aAAa,MAAM,KAAK,KAAK,MAAM;AAAA,QACnC,gBAAgB,MAAM,KAAK,KAAK,UAAU;AAAA,MAAA,CAC3C;AAAA,IAAA,CACF;AAAA,EAAA;AAAA,EAGH,OAAO,iBAAiB,KAAuB;AAC7C,UAAM,aAAa,CAAC,MAAc,UAAU,CAAC;AACvC,UAAA,OAAO,IAAI,QAAQ,YAAY,CAAC,GAAG,MAAM,WAAW,CAAC,CAAC;AACrD,WAAA,cAAc,IAAI,EAAE,IAAI,CAAC,SAAiB,IAAI,OAAO,MAAM,GAAG,CAAC;AAAA,EAAA;AAAA,EAGxE,WAAW,IAA0B;AAC5B,WAAA,GAAG,UAAU,SAAS,UAAU;AAAA,EAAA;AAAA,EAqEzC,KAAK,UAAkB;AACjB,QAAA,KAAK,KAAK,OAAO,EAAG;AAElB,UAAA,SAAS,MAAM,KAAK,KAAK,KAAK,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM;AACzD,aACI,KAAK,KAAK,IAAI,CAAC,EAAkB,QAAQ,IACzC,KAAK,KAAK,IAAI,CAAC,EAAkB,QAAQ;AAAA,IAAA,CAE9C;AAEK,UAAA,YAAc,KAAK,KAAK,IAAI,OAAO,CAAC,CAAC,EAAkB,QAC1D;AAEI,WAAA,QAAQ,CAAC,MAAM;AACpB,YAAM,IAAK,KAAK,KAAK,IAAI,CAAC,EAAkB;AAC5C,gBAAU,OAAO,CAAC;AAAA,IAAA,CACnB;AAAA,EAAA;AAEL;AC7OO,SAAS,SAAS,MAA2B;AAClD,QAAM,SAAS,IAAI,YAAY,gBAAgB,MAAM,WAAW,EAAE;AAClE,SAAO,OAAO,SAAS,SAAS,IAAI,SAAS,OAAO;AACtD;AAEgB,SAAA,eAAe,QAA+B,QAA+B;AAChF,aAAA,QAAQ,OAAO,YAAY;AACpC,SAAK,aAAa,OAAO,aAAa,KAAK,UAAU,KAAK,SAAS;AAAA,EAAA;AAEvE;AAEgB,SAAA,kBAAkB,GAA0B,SAAiB;AACrE,QAAA,gBAAgB,SAAS,cAAc,OAAO;AACpD,iBAAe,eAAe,CAAC;AAC/B,gBAAc,YAAY,EAAE;AAC1B,IAAA,YAAY,aAAa,eAAe,CAAC;AACpC,SAAA;AACT;AAEO,SAAS,oBAAoB,UAAwD;AAC1F,SAAO,MAAM,KAAK,QAAQ,EAAE,OAAO,CAAC,KAAK,MAAM;AAC7C,QAAI,EAAE,iBAAiB,CAAC,IAAI,SAAS,EAAE,aAA4B,GAAG;AAAM,UAAA,KAAK,EAAE,aAAa;AAAA,IAAA;AACzF,WAAA;AAAA,EACT,GAAG,EAAkC;AACvC;AAEO,SAAS,gBAAgB,IAA2B;AACrD,MAAA,GAAG,mBAAoB,QAAO,GAAG;AACrC,MAAI,GAAG,cAAsB,QAAA,gBAAgB,GAAG,aAAa;AACtD,SAAA;AACT;AAEgB,SAAA,qBAAqB,QAA+B,UAAkB,UAAuC;AAC3H,QAAM,WAAW,IAAI,iBAAiB,CAAC,eAAe;AAC9C,UAAA,KAAK,OAAO,cAAc,QAAQ;AACxC,QAAI,IAAI;AACN,eAAS,WAAW;AACpB,eAAS,EAAE;AAAA,IAAA;AAAA,EACb,CACD;AACQ,WAAA,QAAQ,SAAS,MAAM,EAAE,WAAW,MAAM,SAAS,MAAM;AACpE;AAEgB,SAAA,0BAA0B,SACxC,UAAqE;AACjE,MAAA,QAAQ,QAAQ,SAAS;AAC7B,QAAM,WAAW,IAAI,iBAAiB,CAAC,cAAcC,cAAa;AAChE,eAAW,YAAY,cAAc;AAC/B,UAAA,SAAS,SAAS,aAAa;AAC7B,YAAA,UAAU,QAAQ,SAAS,QAAQ;AACrC,kBAAQ,QAAQ,SAAS;AACzB,mBAASA,WAAU,KAAK;AAAA,QAAA;AAAA,MAC1B;AAAA,IACF;AAAA,EACF,CACD;AACD,WAAS,QAAQ,SAAS,EAAE,WAAW,MAAM;AAC/C;AAEO,SAAS,4BACd,SACA,UACA,WAAW,KACX,QAAQ,UACR,UAAmC,EAAE,WAAW,MAAM,SAAS,MAAM,YAAY,QACjF;AACI,MAAA;AACA,MAAA;AACJ,MAAI,SAAS;AACb,QAAM,WAAW,IAAI,iBAAiB,CAAC,eAAe,cAAc;AAC9D,QAAA,WAAW,YAAY,SAAS,GAAG;AACrC,eAAS,WAAW;AACpB;AAAA,IAAA;AAEF;AACM,UAAA,MAAM,KAAK,IAAI;AACjB,QAAA,oBAAoB,MAAM,mBAAmB,UAAU;AACzD,iBAAW,aAAa,OAAO;AAAA,IAAA;AAEvB,cAAA,WAAW,UAAU,QAAQ;AACpB,uBAAA;AAAA,EAAA,CACpB;AACQ,WAAA,QAAQ,SAAS,OAAO;AAC1B,SAAA;AACT;AAEgB,SAAA,WAAW,UAAU,EAAE,QAAQ,IAAI,OAAO,IAAI,QAAQ,IAAI,UAAU,MAAM;AAAE,KAAK;AACzF,QAAA,MAAM,SAAS,QAAQ,MAAM;AAE/B,MAAA,QAAQ,OAAiB,UAAA,cAAc,QAAQ,MAAM,GAAG,OAAO,GAAG;AAClE,MAAA,QAAQ,MAAgB,UAAA,cAAc,QAAQ,KAAK,GAAG,MAAM,GAAG;AAE/D,MAAA,iBAAiB,SAAS,CAAC,MAAM;AACnC,MAAE,eAAe;AAEb,QAAA,QAAQ,SAAU,SAAQ,SAAS;AAEvC,yBAAqB,SAAS,MAAM,SAAS,CAAC,UAAmB;AAC/D,aAAO,SAAS,OAAO,MAAM,aAAa,KAAK;AAAA,IAAA,CAChD;AAAA,EAAA,CACF;AACH;AAEO,SAAS,iBAAiB,OAAyB;AACxD,QAAM,gBAAgB,KAAK;AAC3B,QAAM,KAAK;AACX,QAAM,OAAO;AACf;ACzGO,MAAM,YAAY;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,GAAG;AAEM,SAAA,UACd,KACA,UAAmC,EAAE,MAAM,OAAO,QAAQ,SAC1D;AACA,QAAM,UAAU,CAAC;AACjB,MAAI,QAAQ,OAAe,QAAA,OAAO,SAAS,EAAE,SAAS,IAAI,QAAQ,EAAE,cAAc,UAAU,CAAC,GAAG;AAChG,SAAO,MAAM,KAAK,OAAO,EACtB,KAAK,CAAC,MAAM,EAAE,KAAA,CAAM,EACpB,KAAK,CAAC,MAAO,QAAQ,OAAO,SAAS,CAAC,IAAI,CAAE;AACjD;AAEa,MAAA,YAAY,CAAC,QAAgB,UAAU,KAAK,EAAE,MAAM,KAAM,CAAA;AAEhE,MAAM,YAAY,CAAC,QAAgB,UAAU,GAAG;AAEhD,SAAS,iBAAiB,QAA6D;AACtF,QAAA,WAAW,IAAI,SAAS;AAC9B,SAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,MAAM,SAAS,OAAO,GAAG,CAAW,CAAC;AACnE,SAAA;AACT;ACJO,MAAM,iBAAiB;AAAA,EAS5B,YAAY;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,GACoB;AAnBf;AACA;AACA;AACA;AACA;AACA;AACC;AAiCA,uCAA2D,CAAC;AAcpE,6CAAoB,YAAY;AAC1B,UAAA,CAAC,KAAK,QAAgB,QAAA;AAC1B,YAAM,EAAE,OAAO,EAAE,KAAK,OAAO,IAAI,IAAI,SAAS,MAAM,KAAK,oBAAoB,KAAK;AAClF,UAAI,CAAC,MAAM;AACH,cAAA,eAAe,MAAM,UAAU,GAAG;AAClC,cAAA,gBAAgB,SAAS,gBAAgB;AAC/C,aAAK,mBAAmB;AACxB,aAAK,mBAAmB,YAAY;AACpC,aAAK,UAAU;AACR,eAAA,SAAS,GAAG,aAAa;AAChC,YAAI,KAAK,cAAc;AACrB,kBAAQ,aAAa,IAAI,IAAI,GAAG;AAAA,QAAA;AAAA,MAClC;AAEF,aAAO,CAAC;AAAA,IACV;AAhDE,SAAK,UAAU;AACf,SAAK,QAAQ;AACb,SAAK,eAAe;AACpB,SAAK,mBAAmB;AACxB,SAAK,iBAAiB;AACtB,SAAK,qBAAqB;AAErB,SAAA,sBACH,uBAAuB,KACvB,iBAAiB;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEF,UAAM,aAAa,0BAA0B;AAC7C,aAAS,aAAa,YAAY,KAAK,mBAAmB,KAAK,KAAK;AAAA,EAAA;AAAA,EAK/D,SAAS,UAAgD,WAAW,OAAO;AAC5E,QAAA,mBAAmB,IAAI;AACtB,SAAA,YAAY,KAAK,QAAQ;AACvB,WAAA;AAAA,EAAA;AAAA,EAGD,YAAY;AACb,SAAA,YAAY,QAAQ,CAAC,OAAO;AAC/B,SAAG,IAAI;AAAA,IAAA,CACR;AAAA,EAAA;AAAA,EAoBH,QAAQ,0BACN,aACA,YACA,aACiB;AACjB,aAAS,SAAS,cAAc,GAAG,UAAU,YAAY,UAAU;AAC3D,YAAA,MAAM,YAAY,MAAM;AACxB,YAAA,EAAE,KAAK,OAAO;AAAA,IAAA;AAAA,EACtB;AAEJ;ACtFgB,SAAA,uBACd,OACA,oBACA,OACA;AACM,QAAA,UAAU,MAAM,MAAM;AACtB,QAAA,YAAY,IAAI,iBAAiB;AAAA,IACrC;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACJ,CAAA,EAAE,SAAS,CAAC,EAAE,gBAAgB,uBAAuB;AACpD,UAAM,WAAW,eAAe;AAChC,UAAM,WAAW,cAAc;AAAA,KAC9B,IAAI;AAEP,QAAM,UAAU,MAAM;AACV,cAAA,UAAU,MAAM,MAAM;AAAA,EAAA,CACjC;AAEM,SAAA;AACT;ACtCO,SAAS,mBACd,MAA8B,UAC9B,MAA+B,SAAS,MACxC,mBAAmB,sBACT;AACJ,QAAA,aAAa,SAAS,GAAG;AAC/B,aAAW,WAAW,WAAW,SAAS,QAAQ,kBAAkB,GAAG;AACvE,QAAM,YAAY,MAAM;AAAA,IACrB,IAAI,iBAAiB,SAAS,KAAuC,CAAC;AAAA,IACvE,CAAC,MAAM,EAAE;AAAA,EAAA,EACT,OAAO,CAAC,MAAM;AACV,QAAA;AACI,YAAA,UAAU,IAAI,IAAI,EAAE,QAAQ,MAAM,EAAE,GAAG,IAAI,WAAW,WAAW,MAAM;AAE3E,aAAA,QAAQ,WAAW,WAAW,UAAU,QAAQ,SAAS,WAAW,WAAW,QAAQ;AAAA,IAAA,QAEnF;AACC,aAAA;AAAA,IAAA;AAAA,EACT,CACD;AACM,SAAA;AACT;AAEO,SAAS,SAAS,GAAqD;AAC5E,MAAI,OAAO,MAAM,SAAiB,QAAA,IAAI,IAAI,CAAC;AACpC,SAAA,IAAI,IAAI,EAAE,IAAI;AACvB;ACdO,MAAM,mBAAmB;AAAA,EAO9B,YAAY,SAA+B;AANpC,+BAAM;AACN;AACA,8CAAqB;AACrB;AACA,qCAAY;AAGjB,QAAI,SAAS;AACJ,aAAA,QAAQ,OAAO,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,MAAM;AAC1C,eAAO,OAAO,MAAM,EAAE,CAAC,CAAC,GAAG,GAAG;AAAA,MAAA,CAC/B;AAAA,IAAA;AAGH,SAAK,MAAM,SAAS,SAAS,OAAO,KAAK,IAAI,GAAG;AAAA,EAAA;AAAA,EAGlD,uBAAuB;AACrB,WAAQ,KAAK,IAAI,cAAc,KAAK,kBAAkB,KAAK,KAAK;AAAA,EAAA;AAEpE;AChCO,SAAS,mBAAmB,YAA4B;AAC7D,QAAM,QAAgB;AAChB,QAAA,QAAiC,WAAW,MAAM,KAAK;AAC7D,QAAM,IAAY,SAAS,QAAQ,CAAC,KAAK,GAAG;AAC5C,QAAM,IAAY,SAAS,QAAQ,CAAC,KAAK,GAAG;AAC5C,QAAM,IAAY,SAAS,QAAQ,CAAC,KAAK,GAAG;AACtC,QAAA,MAAM,CAAC,QAAwB,OAAO,GAAG,EAAE,SAAS,GAAG,GAAG;AACzD,SAAA,GAAG,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;AACtC;AAGO,SAAS,cAAc,GAAmB;AAC/C,QAAM,IAAI,cAAc,KAAK,CAAC,IAAI,mBAAmB,CAAC,IAAI;AAClD,UAAA,GAAG,MAAM,OAAO,KAAK,CAAC,CAAC,GAC5B,QAAA,EACA,IAAI,CAAC,GAAG,MAAM,SAAS,CAAW,IAAI,MAAM,CAAC,EAC7C,OAAO,CAAC,GAAG,MAAM,IAAI,CAAC;AAC3B;AAEgB,SAAA,eAAe,GAAoB,IAAoB;AAC7D,UAAA,CAAA,QAAO,OAAO,MAAM,GAAG,IAAI,KAAK,KAAK,SAAS,CAAW,CAAC;AACpE;AAGO,SAAS,gBAAgB,KAAqC;AACnE,QAAM,YAAY,UAAU,IAAI,MAAM,EAAE,MAAM,GAAG;AACjD,SAAO,UAAU,OAAO,CAAC,KAAK,MAAM;AAC5B,UAAA,SAAS,EAAE,MAAM,wBAAwB;AAC/C,QAAI,QAAQ;AACV,YAAM,CAAG,EAAA,KAAK,KAAK,IAAI;AACvB,UAAI,OAAO;AACT,YAAI,MAAM,GAAG,EAAE,QAAQ,CAAK,MAAA;AAAE,cAAI,CAAC,IAAI;AAAA,QAAA,CAAQ;AAAA,MAAA;AAAA,IACjD;AAEK,WAAA;AAAA,EACT,GAAG,EAA4B;AACjC;AAEO,SAAS,YAAY,GAAW;AAC9B,SAAA,EAAE,QAAQ,kBAAkB,EAAE;AACvC;ACrCO,MAAM,qCAAqC,mBAAmB;AAAA,EACnE,oBAAoB;AAClB,UAAM,QAAQ,KAAK,qBAAqB,GAAG,iBAAiB,2BAA2B;AACvF,UAAM,QAAQ,MAAM,KAAK,SAAS,CAAA,GAAI,CAAC,MAAM;AACrC,YAAA,IAAI,EAAE,aAAa,iBAAiB;AACpC,YAAA,IAAI,GAAG,MAAM,eAAe,IAAI,CAAC,KAAK,KAAK,UAAU,SAAS;AACpE,aAAO,SAAS,CAAC;AAAA,IAAA,CAClB;AACD,UAAM,WAAW,KAAK,IAAI,GAAG,OAAO,KAAK,SAAS;AAClD,QAAI,KAAK,kBAA0B,QAAA,KAAK,kBAAkB,QAAQ;AAC3D,WAAA;AAAA,EAAA;AAAA,EAGT,sBAAsB;AACd,UAAA,OAAO,KAAK,qBAAA,GAAwB;AAAA,MACxC;AAAA,IACF;AACI,QAAA,CAAC,KAAM,QAAO,KAAK;AACjB,UAAA,IAAI,KAAK,aAAa,iBAAiB;AACvC,UAAA,IAAI,GAAG,MAAM,eAAe,IAAI,CAAC,KAAK,KAAK,UAAU,SAAS;AACpE,WAAO,SAAS,CAAC;AAAA,EAAA;AAAA,EAGnB,4BAA4B;AAC1B,UAAM,MAAM,IAAI,IAAI,KAAK,IAAI,IAAI;AAE3B,UAAA,oBAAoB,KAAK,qBAAA,GAAwB;AAAA,MACrD;AAAA,IACF;AACA,UAAM,WAAW,mBAAmB,aAAa,eAAe,KAAK;AACrE,UAAM,aAAa,gBAAgB,mBAAmB,aAAa,iBAAiB,KAAK,EAAE;AAE3F,UAAM,QAAgC;AAAA,MACpC,MAAM;AAAA,MACN,UAAU;AAAA,MACV;AAAA,MACA,GAAG;AAAA,IACL;AAEA,WAAO,KAAK,KAAK,EAAE,QAAQ,CAAC,MAAM;AAChC,UAAI,aAAa,IAAI,GAAG,MAAM,CAAC,CAAC;AAAA,IAAA,CACjC;AAEK,UAAA,yBAAyB,CAAC,MAAc;AAC5C,aAAO,KAAK,KAAK,EAAE,QAAQ,CAAC,MAAM;AAC9B,UAAA,SAAS,MAAM,KAAK,IAAI,aAAa,IAAI,GAAG,EAAE,UAAU;AAAA,MAAA,CAC3D;AACD,UAAI,aAAa,IAAI,KAAK,KAAK,IAAI,EAAE,UAAU;AAC/C,aAAO,IAAI;AAAA,IACb;AAEO,WAAA;AAAA,EAAA;AAEX;AChDO,MAAM,yCAAyC,mBAAmB;AAAA,EAAlE;AAAA;AACE,4CAAmB;AAE1B,uCAAc,CAAC,MAAqD;AAClE,YAAM,OAAO,OAAO,MAAM,WAAW,IAAI,EAAE;AACrC,YAAA,EAAE,SAAS,IAAI,IAAI,IAAI,MAAM,KAAK,IAAI,WAAW,KAAK,IAAI,MAAM;AAC/D,aAAA,SAAS,SAAS,MAAM,KAAK,gBAAgB,GAAG,SAAS,KAAK,UAAU,SAAA,CAAU;AAAA,IAC3F;AAAA;AAAA,EAEA,oBAAoB;AAClB,UAAM,QAAQ;AAAA,MACZ,KAAK,qBAAqB;AAAA,MAC1B,KAAK,IAAI;AAAA,MACT,KAAK;AAAA,IACP;AACA,UAAM,QAAQ,MAAM,KAAK,OAAO,KAAK,WAAW;AAChD,UAAM,WAAW,KAAK,IAAI,GAAG,OAAO,KAAK,SAAS;AAClD,QAAI,KAAK,kBAA0B,QAAA,KAAK,kBAAkB,QAAQ;AAC3D,WAAA;AAAA,EAAA;AAAA,EAGT,sBAAsB;AACpB,WAAO,KAAK,YAAY,KAAK,IAAI,IAAI;AAAA,EAAA;AAAA,EAGvC,0BAA0B,OAAY,KAAK,KAAK;AAC9C,UAAM,MAAM,IAAI,IAAI,KAAK,IAAI;AAE7B,UAAM,8BAA8B,KAAK,iBACtC,WACA,QAAQ,oBAAoB,GAAG;AAElC,QAAI,CAAC,KAAK,iBAAiB,KAAK,IAAI,QAAQ,GAAG;AAC7C,UAAI,WAAW,IAAI,SAChB,OAAO,4BAA4B,QAAQ,OAAO,KAAK,UAAU,SAAU,CAAA,CAAC,EAC5E,QAAQ,WAAW,GAAG;AAAA,IAAA;AAGrB,UAAA,yBAAyB,CAAC,WAAmB;AAC7C,UAAA,WAAW,IAAI,SAAS;AAAA,QAC1B,KAAK;AAAA,QACL,4BAA4B,QAAQ,OAAO,OAAO,SAAU,CAAA;AAAA,MAC9D;AACA,aAAO,IAAI;AAAA,IACb;AAEO,WAAA;AAAA,EAAA;AAEX;ACrDO,MAAM,uCAAuC,mBAAmB;AAAA,EAAhE;AAAA;AACE,+CAAsB;AAAA;AAAA,EAE7B,uBAAuB;AACrB,WAAQ,KAAK,IAAI,cAAc,KAAK,kBAAkB,KAAK,KAAK;AAAA,EAAA;AAAA,EAGlE,YAAY,GAAwD;AAClE,UAAM,OAAO,OAAO,MAAM,WAAW,IAAI,EAAE;AACrC,UAAA,IAAI,IAAI,IAAI,IAAI,EAAE,aAAa,IAAI,KAAK,mBAAmB;AAC1D,WAAA,SAAS,CAAC,KAAK,KAAK;AAAA,EAAA;AAAA,EAG7B,oBAAoB;AACZ,UAAA,QAAQ,mBAAmB,KAAK,wBAAwB,KAAK,IAAI,IAAI,EAAE;AAAA,MAAO,CAAC,MACnF,eAAe,KAAK,CAAC;AAAA,IACvB;AACA,UAAM,QAAQ,MAAM,IAAI,KAAK,WAAW;AACxC,UAAM,WAAW,KAAK,IAAI,GAAG,OAAO,KAAK,SAAS;AAClD,QAAI,KAAK,kBAA0B,QAAA,KAAK,kBAAkB,QAAQ;AAC3D,WAAA;AAAA,EAAA;AAAA,EAGT,sBAAsB;AAChB,QAAA,KAAK,QAAQ,UAAU;AAClB,aAAA,KAAK,YAAY,KAAK,GAAG;AAAA,IAAA;AAE5B,UAAA,OAAO,KAAK,qBAAA,EAAuB;AAAA,MACvC,qBAAqB,KAAK,mBAAmB;AAAA,IAC/C;AACO,WAAA,KAAK,YAAY,IAAI;AAAA,EAAA;AAAA,EAG9B,4BAA4B;AAC1B,UAAM,MAAM,IAAI,IAAI,KAAK,IAAI,IAAI;AAE3B,UAAA,yBAAyB,CAAC,WAAmB;AACjD,UAAI,aAAa,IAAI,KAAK,qBAAqB,OAAO,UAAU;AAChE,aAAO,IAAI;AAAA,IACb;AAEO,WAAA;AAAA,EAAA;AAEX;ACrCO,SAAS,sBAAsB,SAA8B;AAClE,QAAM,EAAE,MAAM,UAAU,MAAM,SAAS,SAAS;AAC1C,QAAA,YAAY,mBAAmB,KAAK,GAAG;AAErC,UAAA,IAAI,EAAE,WAAW;AAEzB,QAAM,cAAc,MAAiC;AAC/C,QAAA,UAAU,KAAK,CAAC,MAAM,eAAe,KAAK,CAAC,CAAC,GAAG;AAC3C,YAAA,IAAI,UAAU,OAAO,CAAC,MAAM,eAAe,KAAK,CAAC,CAAC;AAChD,cAAA,IAAI,kCAAkC,CAAC;AACxC,aAAA;AAAA,IAAA;AAGL,QAAA,UAAU,KAAK,CAAC,MAAM,qBAAqB,KAAK,CAAC,CAAC,GAAG;AACjD,YAAA,IAAI,UAAU,OAAO,CAAC,MAAM,qBAAqB,KAAK,CAAC,CAAC;AACtD,cAAA,IAAI,oCAAoC,CAAC;AAC1C,aAAA;AAAA,IAAA;AAGT,UAAM,aAAa,MAAM,KAAK,SAAS,iBAAiB,2BAA2B,CAAC;AAChF,QAAA,WAAW,SAAS,GAAG;AACjB,cAAA,IAAI,gCAAgC,UAAU;AAC/C,aAAA;AAAA,IAAA;AAGT,YAAQ,MAAM,mBAAmB;AAC1B,WAAA;AAAA,EACT;AAEA,QAAM,qBAAqB,KAAK,YAAY,GAAG,OAAO;AAE/C,SAAA;AACT;ACzCgB,SAAA,OAAU,KAAe,GAA4B;AAC5D,SAAA,MAAM,KAAK,EAAE,QAAQ,KAAK,KAAK,IAAI,SAAS,CAAC,EAAA,GAAK,CAAC,GAAG,MAAM,IAAI,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC;AAChG;AAEO,SAAS,MAAM,MAAc,UAAkB,GAAG,OAAe,GAAa;AAC5E,SAAA,MAAM,KAAK,EAAE,QAAQ,KAAA,GAAQ,CAAC,GAAG,UAAU,UAAU,QAAQ,IAAI;AAC1E;ACLA,eAAsB,sBAAsB,UAAyC;AACnF,QAAM,MAAM,CAAC;AACb,mBAAiB,KAAK,UAAU;AAC1B,QAAA,KAAK,MAAM,GAAG;AAAA,EAAA;AAEb,SAAA;AACT;AAEO,SAAS,KAAK,cAAsB;AACzC,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,YAAY,CAAC;AACnE;AAOO,MAAM,UAAU;AAAA,EAWrB,YAAoB,MAAM,GAAW,OAA6B,CAAA,GAAI;AAV9D,+BAAM;AACN;AACA;AAQY,SAAA,MAAA;AAAiB,SAAA,OAAA;AACnC,SAAK,WAAW,IAAI,QAAQ,CAAC,YAAY;AACvC,WAAK,WAAW;AAAA,IAAA,CACjB;AAAA,EAAA;AAAA,EATH,aAAoB,eAAe,MAAM,GAAG,OAAqD,CAAA,GAAI;AAC7F,UAAA,QAAQ,IAAI,UAAU,GAAG;AAC/B,SAAK,QAAQ,CAAA,MAAK,MAAM,KAAK,CAAC,CAAC;AAC/B,WAAO,MAAM,IAAI;AAAA,EAAA;AAAA,EASX,qBAAqB,IAAI,GAAsC;AACrE,QAAI,IAAI,KAAK,KAAK,KAAK,WAAW,EAAU,QAAA;AACtC,UAAA,IAAI,KAAK,KAAK,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC;AAC9C,QAAI,KAAK,GAAG;AACV,YAAM,MAAM,KAAK,KAAK,CAAC,EAAE;AACpB,WAAA,KAAK,OAAO,GAAG,CAAC;AACd,aAAA;AAAA,IAAA;AAEF,WAAA,KAAK,qBAAqB,IAAI,CAAC;AAAA,EAAA;AAAA,EAGxC,MAAc,UAAU;AACjB,SAAA;AACC,UAAA,IAAI,KAAK,qBAAqB;AACpC,UAAM,IAAI;AACL,SAAA;AACL,SAAK,SAAS;AAAA,EAAA;AAAA,EAGR,WAAW;AACb,QAAA,CAAC,KAAK,KAAK,QAAQ;AACrB,WAAK,WAAW,IAAI;AACpB;AAAA,IAAA;AAEE,QAAA,KAAK,MAAM,KAAK,KAAK;AACvB,WAAK,QAAQ;AACb,WAAK,SAAS;AAAA,IAAA;AAAA,EAChB;AAAA,EAGF,MAAa,MAAM;AACjB,SAAK,SAAS;AACd,WAAO,KAAK;AAAA,EAAA;AAAA,EAGP,KAAK,GAA0C;AAC/C,SAAA,KAAK,KAAK,OAAO,IAAI,IAAI,EAAE,GAAG,GAAG,GAAG,EAAA,CAAG;AAAA,EAAA;AAEhD;ACzEO,SAAS,QAAQ;AACf,SAAA,kBAAkB,KAAK,UAAU,SAAS;AACnD;ACFgB,SAAA,aAAa,KAA4B,QAAuB,UAAoC;AAClH,aAAW,KAAK,QAAQ;AAClB,QAAA,iBAAiB,GAAG,UAAU,IAAI;AAAA,EAAA;AAE1C;AAEO,MAAM,KAAK;AAAA,EAIhB,YAAoB,OAAuB,iBAA0B,MAAM;AAHnE;AACA;AAEY,SAAA,QAAA;AAAuB,SAAA,iBAAA;AAAA,EAAA;AAAA,EAEpC,MAAM,UAAsB,eAAkC;AACnE,SAAK,KAAK;AACV,SAAK,gBAAgB;AACjB,QAAA,KAAK,eAAyB,UAAA;AAClC,SAAK,OAAO,OAAO,YAAY,UAAU,KAAK,KAAK;AAAA,EAAA;AAAA,EAG9C,OAAa;AACd,QAAA,KAAK,SAAS,QAAW;AAC3B,oBAAc,KAAK,IAAI;AACvB,WAAK,OAAO;AAAA,IAAA;AAEd,QAAI,KAAK,eAAe;AACtB,WAAK,cAAc;AACnB,WAAK,gBAAgB;AAAA,IAAA;AAAA,EACvB;AAEJ;AC7BO,SAAS,cAAc,GAAW,IAAI,GAAG,IAAI,GAAW;AACrD,UAAA,IAAI,KAAK,KAAK;AACxB;"}
|
|
1
|
+
{"version":3,"file":"billy-herrington-utils.es.js","sources":["../src/utils/observers/index.ts","../src/utils/strings/index.ts","../src/userscripts/data-manager/index.ts","../src/utils/dom/index.ts","../src/utils/fetch/index.ts","../src/userscripts/infinite-scroll/index.ts","../src/userscripts/jabroni-outfit-wrap/index.ts","../src/userscripts/pagination-parsing/pagination-utils/index.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategy.ts","../src/utils/parsers/index.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategyDataParams.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategyPathnameParams.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategySearchParams.ts","../src/userscripts/pagination-parsing/index.ts","../src/utils/arrays/index.ts","../src/utils/async/index.ts","../src/utils/device/index.ts","../src/utils/events/index.ts","../src/utils/math/index.ts"],"sourcesContent":["export class Observer {\n public observer: IntersectionObserver;\n constructor(private callback: (entry: Element) => void) {\n this.observer = new IntersectionObserver(this.handleIntersection.bind(this));\n }\n\n observe(target: Element) {\n this.observer.observe(target);\n }\n\n throttle(target: Element, throttleTime: number) {\n this.observer.unobserve(target);\n setTimeout(() => this.observer.observe(target), throttleTime);\n }\n\n handleIntersection(entries: Iterable<IntersectionObserverEntry>) {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n this.callback(entry.target);\n }\n }\n }\n\n static observeWhile(\n target: Element,\n callback: () => Promise<boolean> | boolean,\n throttleTime: number,\n ) {\n const observer_ = new Observer(async (target: Element) => {\n const condition = await callback();\n if (condition) observer_.throttle(target, throttleTime);\n });\n observer_.observe(target);\n return observer_;\n }\n}\n\nexport class LazyImgLoader {\n public lazyImgObserver: Observer;\n private attributeName = 'data-lazy-load';\n\n constructor(shouldDelazify: (target: Element) => boolean) {\n this.lazyImgObserver = new Observer((target: Element) => {\n if (shouldDelazify(target)) {\n this.delazify(target as HTMLImageElement);\n }\n });\n }\n\n lazify(_target: Element, img: HTMLImageElement, imgSrc: string) {\n if (!img || !imgSrc) return;\n img.setAttribute(this.attributeName, imgSrc);\n img.src = '';\n this.lazyImgObserver.observe(img);\n }\n\n delazify = (target: HTMLImageElement) => {\n this.lazyImgObserver.observer.unobserve(target);\n target.src = target.getAttribute(this.attributeName) as string;\n target.removeAttribute(this.attributeName);\n };\n}\n","export function stringToWords(s: string): Array<string> {\n return s.split(\",\").map(s => s.trim().toLowerCase()).filter(_ => _);\n}\n\nexport function sanitizeStr(s: string) {\n return s?.replace(/\\n|\\t/, ' ').replace(/ {2,}/, ' ').trim().toLowerCase() || \"\";\n}\n","import { LazyImgLoader } from '../../utils/observers';\nimport { stringToWords } from '../../utils/strings';\n\ninterface DataFilterState {\n filterPublic: boolean;\n filterPrivate: boolean;\n filterHD: boolean;\n filterDuration: boolean;\n filterDurationFrom: number;\n filterDurationTo: number;\n filterExclude: boolean;\n filterExcludeWords: string;\n filterInclude: boolean;\n filterIncludeWords: string;\n}\n\ninterface FilterResult {\n tag: string;\n condition: boolean;\n}\n\ntype FilterInput = Record<string, string | number | boolean | HTMLElement>;\ntype FilterFunction = (v: FilterInput) => FilterResult;\n\nclass DataFilter {\n public filters: { [key: string]: () => FilterFunction };\n\n constructor(\n private rules: IRules,\n private state: DataFilterState,\n ) {\n this.state = state;\n\n const methods = Object.getOwnPropertyNames(this);\n this.filters = methods.reduce((acc: { [key: string]: () => FilterFunction }, k) => {\n if (k in this.state) {\n acc[k] = this[k as keyof DataFilter] as unknown as () => FilterFunction;\n GM_addStyle(`.filter-${k.toLowerCase().slice(6)} { display: none !important; }`);\n }\n return acc;\n }, {});\n }\n\n filterPublic = (): FilterFunction => {\n return (v: FilterInput) => {\n const isPublic = !this.rules.isPrivate(v.element as HTMLElement);\n return {\n condition: this.state.filterPublic && isPublic,\n tag: 'filter-public',\n };\n };\n };\n\n filterPrivate = (): FilterFunction => {\n return (v: FilterInput) => {\n const isPrivate = this.rules.isPrivate(v.element as HTMLElement);\n return {\n condition: this.state.filterPrivate && isPrivate,\n tag: 'filter-private',\n };\n };\n };\n\n filterHD = (): FilterFunction => {\n return (v: FilterInput) => {\n const isHD = this.rules.isHD(v.element as HTMLElement);\n return {\n condition: this.state.filterHD && isHD,\n tag: 'filter-hd',\n };\n };\n };\n\n filterDuration = (): FilterFunction => {\n return (v: FilterInput) => {\n const notInRange =\n (v.duration as number) < this.state.filterDurationFrom ||\n (v.duration as number) > this.state.filterDurationTo;\n return {\n condition: this.state.filterDuration && notInRange,\n tag: 'filter-duration',\n };\n };\n };\n\n filterExclude = (): FilterFunction => {\n const tags = DataManager.filterDSLToRegex(this.state.filterExcludeWords);\n return (v: FilterInput) => {\n const containTags = tags.some((tag) => tag.test(v.title as string));\n return {\n condition: this.state.filterExclude && containTags,\n tag: 'filter-exclude',\n };\n };\n };\n\n filterInclude = (): FilterFunction => {\n const tags = DataManager.filterDSLToRegex(this.state.filterIncludeWords);\n return (v: FilterInput) => {\n const containTagsNot = tags.some((tag) => !tag.test(v.title as string));\n return {\n condition: this.state.filterInclude && containTagsNot,\n tag: 'filter-include',\n };\n };\n };\n}\n\ninterface IRules {\n getThumbs: (html: HTMLElement) => HTMLElement[];\n getThumbUrl: (thumbElement: HTMLElement) => string;\n getThumbData: (thumbElement: HTMLElement) => { title: string; duration: number };\n getThumbImgData: (thumbElement: HTMLElement) => { img: HTMLElement; imgSrc: string };\n container: HTMLElement;\n isPrivate: (element: HTMLElement) => boolean;\n isHD: (element: HTMLElement) => boolean;\n}\n\nexport class DataManager {\n private rules: IRules;\n private state: DataFilterState;\n private data: Map<string, FilterInput>;\n private lazyImgLoader: LazyImgLoader;\n public dataFilters: { [key: string]: () => FilterFunction };\n\n constructor(rules: IRules, state: DataFilterState) {\n this.rules = rules;\n this.state = state;\n this.data = new Map();\n this.lazyImgLoader = new LazyImgLoader(\n (target: Element) => !this.isFiltered(target as HTMLElement),\n );\n this.dataFilters = new DataFilter(rules, state).filters;\n\n const targets = [window, (globalThis as any).unsafeWindow].filter(Boolean);\n targets.forEach((w: any) => {\n Object.assign(w, {\n sortByDuration: () => this.sort('duration'),\n sortByViews: () => this.sort('view'),\n });\n });\n }\n\n static filterDSLToRegex(str: string): RegExp[] {\n const toFullWord = (w: string) => `(^|\\\\ )${w}($|\\\\ )`;\n const str_ = str.replace(/f:(\\w+)/g, (_, w) => toFullWord(w));\n return stringToWords(str_).map((expr: string) => new RegExp(expr, 'i'));\n }\n\n isFiltered(el: HTMLElement): boolean {\n return el.className.includes('filtered');\n }\n\n applyFilters = (filters: { [key: string]: boolean }, offset = 0): void => {\n const filtersToApply = Object.keys(filters)\n .filter((k) => Object.hasOwn(this.dataFilters, k))\n .map((k) => this.dataFilters[k]());\n\n if (filtersToApply.length === 0) return;\n\n const updates: (() => void)[] = [];\n let offset_counter = 1;\n for (const v of this.data.values()) {\n if (++offset_counter > offset) {\n for (const f of filtersToApply) {\n const { tag, condition } = f(v as FilterInput);\n updates.push(() => (v.element as HTMLElement).classList.toggle(tag, condition));\n }\n }\n }\n\n requestAnimationFrame(() => {\n updates.forEach((update) => {\n update();\n });\n });\n };\n\n filterAll = (offset?: number): void => {\n const filters = Object.assign(\n {},\n ...Object.keys(this.dataFilters).map((f) => ({\n [f]: this.state[f as keyof DataFilterState],\n })),\n );\n this.applyFilters(filters, offset);\n };\n\n parseData = (\n html: HTMLElement,\n container?: HTMLElement,\n removeDuplicates = false,\n shouldLazify = true,\n ): void => {\n const thumbs = this.rules.getThumbs(html);\n const data_offset = this.data.size;\n\n for (const thumbElement of thumbs) {\n const url = this.rules.getThumbUrl(thumbElement);\n if (!url || this.data.has(url)) {\n if (removeDuplicates) thumbElement.remove();\n continue;\n }\n\n const data = this.rules.getThumbData(thumbElement);\n this.data.set(url, { element: thumbElement, ...data });\n\n if (shouldLazify) {\n const { img, imgSrc } = this.rules.getThumbImgData(thumbElement);\n this.lazyImgLoader.lazify(thumbElement, img as HTMLImageElement, imgSrc);\n }\n\n const parent = container || this.rules.container;\n if (!parent.contains(thumbElement)) parent.appendChild(thumbElement);\n }\n\n this.filterAll(data_offset);\n };\n\n sort(propName: string) {\n if (this.data.size < 2) return;\n\n const sorted = Array.from(this.data.keys()).sort((b, a) => {\n return (\n ((this.data.get(a) as FilterInput)[propName] as number) -\n ((this.data.get(b) as FilterInput)[propName] as number)\n );\n });\n\n const container = ((this.data.get(sorted[0]) as FilterInput).element as HTMLElement)\n .parentElement as HTMLElement;\n\n sorted.forEach((s) => {\n const e = (this.data.get(s) as FilterInput).element as HTMLElement;\n container.append(e);\n });\n }\n}\n","export function parseDom(html: string): HTMLElement {\n const parsed = new DOMParser().parseFromString(html, 'text/html').body;\n return parsed.children.length > 1 ? parsed : parsed.firstElementChild as HTMLElement;\n}\n\nexport function copyAttributes(target: HTMLElement | Element, source: HTMLElement | Element) {\n for (const attr of source.attributes) {\n attr.nodeValue && target.setAttribute(attr.nodeName, attr.nodeValue);\n }\n}\n\nexport function replaceElementTag(e: HTMLElement | Element, tagName: string) {\n const newTagElement = document.createElement(tagName);\n copyAttributes(newTagElement, e);\n newTagElement.innerHTML = e.innerHTML;\n e.parentNode?.replaceChild(newTagElement, e);\n return newTagElement;\n}\n\nexport function getAllUniqueParents(elements: HTMLCollection): Array<HTMLElement | Element> {\n return Array.from(elements).reduce((acc, v) => {\n if (v.parentElement && !acc.includes(v.parentElement as HTMLElement)) { acc.push(v.parentElement); }\n return acc;\n }, [] as Array<HTMLElement | Element>);\n}\n\nexport function findNextSibling(el: HTMLElement | Element) {\n if (el.nextElementSibling) return el.nextElementSibling;\n if (el.parentElement) return findNextSibling(el.parentElement);\n return null;\n}\n\nexport function waitForElementExists(parent: HTMLElement | Element, selector: string, callback: (el: Element) => void): void {\n const observer = new MutationObserver((_mutations) => {\n const el = parent.querySelector(selector);\n if (el) {\n observer.disconnect();\n callback(el);\n }\n });\n observer.observe(document.body, { childList: true, subtree: true });\n}\n\nexport function watchElementChildrenCount(element: HTMLElement | Element,\n callback: (observer: MutationObserver, count: number) => void): void {\n let count = element.children.length;\n const observer = new MutationObserver((mutationList, observer) => {\n for (const mutation of mutationList) {\n if (mutation.type === \"childList\") {\n if (count !== element.children.length) {\n count = element.children.length;\n callback(observer, count);\n }\n }\n }\n });\n observer.observe(element, { childList: true });\n}\n\nexport function watchDomChangesWithThrottle(\n element: HTMLElement | Element, \n callback: () => void,\n throttle = 1000,\n times = Infinity,\n options: Record<string, boolean> = { childList: true, subtree: true, attributes: true }\n) {\n let lastMutationTime: number;\n let timeout: number;\n let times_ = times;\n const observer = new MutationObserver((_mutationList, _observer) => {\n if (times_ !== Infinity && times_ < 1) {\n observer.disconnect();\n return;\n }\n times_--;\n const now = Date.now();\n if (lastMutationTime && now - lastMutationTime < throttle) {\n timeout && clearTimeout(timeout);\n }\n timeout = setTimeout(callback, throttle);\n lastMutationTime = now;\n });\n observer.observe(element, options);\n return observer;\n}\n\nexport function downloader(options = { append: \"\", after: \"\", button: \"\", cbBefore: () => { } }) {\n const btn = parseDom(options.button);\n\n if (options.append) document.querySelector(options.append)?.append(btn);\n if (options.after) document.querySelector(options.after)?.after(btn);\n\n btn.addEventListener('click', (e) => {\n e.preventDefault();\n\n if (options.cbBefore) options.cbBefore();\n\n waitForElementExists(document.body, 'video', (video: Element) => {\n window.location.href = video.getAttribute('src') as string;\n });\n });\n}\n\nexport function exterminateVideo(video: HTMLVideoElement) {\n video.removeAttribute('src');\n video.load();\n video.remove();\n}","import { parseDom } from '../dom';\n\nexport const MOBILE_UA = [\n 'Mozilla/5.0 (Linux; Android 10; K)',\n 'AppleWebKit/537.36 (KHTML, like Gecko)',\n 'Chrome/114.0.0.0 Mobile Safari/537.36',\n].join(' ');\n\nexport function fetchWith(\n url: string,\n options: Record<string, boolean> = { html: false, mobile: false },\n) {\n const reqOpts = {};\n if (options.mobile) Object.assign(reqOpts, { headers: new Headers({ 'User-Agent': MOBILE_UA }) });\n return fetch(url, reqOpts)\n .then((r) => r.text())\n .then((r) => (options.html ? parseDom(r) : r));\n}\n\nexport const fetchHtml = (url: string) => fetchWith(url, { html: true }) as Promise<HTMLElement>;\n\nexport const fetchText = (url: string) => fetchWith(url) as Promise<string>;\n\nexport function objectToFormData(object: Record<string, number | boolean | string>): FormData {\n const formData = new FormData();\n Object.entries(object).forEach(([k, v]) => formData.append(k, v as string));\n return formData;\n}\n","import { fetchHtml } from '../../utils/fetch';\nimport { Observer } from '../../utils/observers';\n\ninterface IInfiniteScroller {\n delay?: number;\n enabled?: boolean;\n writeHistory?: boolean;\n paginationOffset: number;\n paginationLast: number;\n paginationElement: HTMLElement;\n paginationUrlGenerator: (offset: number) => string;\n parseData: (document: HTMLElement) => void;\n intersectionObservable?: HTMLElement;\n alternativeGenerator?: () => OffsetGenerator;\n}\n\ninterface GeneratorResult {\n url: string;\n offset: number;\n}\n\ntype OffsetGenerator = Generator<GeneratorResult> | AsyncGenerator<GeneratorResult>;\n\nexport class InfiniteScroller {\n public paginationGenerator: OffsetGenerator;\n public enabled: boolean;\n public delay: number;\n public paginationOffset: number;\n public paginationLast: number;\n public writeHistory: boolean;\n private parseData: (document: HTMLElement) => void;\n\n constructor({\n enabled = true,\n delay = 300,\n writeHistory = false,\n paginationOffset,\n paginationLast,\n paginationElement,\n paginationUrlGenerator,\n parseData,\n alternativeGenerator,\n intersectionObservable,\n }: IInfiniteScroller) {\n this.enabled = enabled;\n this.delay = delay;\n this.writeHistory = writeHistory;\n this.paginationOffset = paginationOffset;\n this.paginationLast = paginationLast;\n this.parseData = parseData;\n\n this.paginationGenerator =\n alternativeGenerator?.() ??\n InfiniteScroller.createPaginationGenerator(\n paginationOffset,\n paginationLast,\n paginationUrlGenerator,\n );\n\n const observable = intersectionObservable || paginationElement;\n Observer.observeWhile(observable, this.generatorConsumer, this.delay);\n }\n\n private onScrollCBs: Array<(scroller: InfiniteScroller) => void> = [];\n\n public onScroll(callback: (scroller: InfiniteScroller) => void, initCall = false) {\n if (initCall) callback(this);\n this.onScrollCBs.push(callback);\n return this;\n }\n\n private _onScroll() {\n this.onScrollCBs.forEach((cb) => {\n cb(this);\n });\n }\n\n generatorConsumer = async () => {\n if (!this.enabled) return false;\n const { value: { url, offset } = {}, done } = await this.paginationGenerator.next();\n if (!done) {\n const nextPageHTML = await fetchHtml(url);\n const prevScrollPos = document.documentElement.scrollTop;\n this.paginationOffset = offset;\n this.parseData(nextPageHTML);\n this._onScroll();\n window.scrollTo(0, prevScrollPos);\n if (this.writeHistory) {\n history.replaceState({}, '', url);\n }\n }\n return !done;\n };\n\n static *createPaginationGenerator(\n currentPage: number,\n totalPages: number,\n generateURL: (offset: number) => string,\n ): OffsetGenerator {\n for (let offset = currentPage + 1; offset <= totalPages; offset++) {\n const url = generateURL(offset);\n yield { url, offset };\n }\n }\n}\n","import { InfiniteScroller } from '../infinite-scroll';\nimport type { IRules } from '../rules';\n\nexport interface JabroniStore {\n state: Record<string, boolean | string | number>;\n localState: Record<string, boolean | string | number>;\n subscribe: (callback: () => void) => void;\n}\n\nexport function createInfiniteScroller(\n store: JabroniStore,\n parseData: (document: HTMLElement) => void,\n rules: IRules,\n) {\n const enabled = store.state.infiniteScrollEnabled as boolean;\n\n const paginationOffset = rules.paginationStrategy.getPaginationOffset();\n const paginationElement = rules.paginationStrategy.getPaginationElement();\n const paginationLast = rules.paginationStrategy.getPaginationLast();\n const paginationUrlGenerator = rules.paginationStrategy.getPaginationUrlGenerator();\n\n const iscroller = new InfiniteScroller({\n enabled,\n parseData,\n paginationLast,\n paginationOffset,\n paginationElement,\n paginationUrlGenerator,\n ...rules,\n }).onScroll(({ paginationLast, paginationOffset }) => {\n store.localState.pagIndexLast = paginationLast;\n store.localState.pagIndexCur = paginationOffset;\n }, true);\n\n store.subscribe(() => {\n iscroller.enabled = store.state.infiniteScrollEnabled as boolean;\n });\n\n return iscroller;\n}\n","export function getPaginationLinks(\n doc: HTMLElement | Document = document,\n url: Location | URL | string = location.href,\n pathnameSelector = /\\/(page\\/)?\\d+\\/?$/,\n): string[] {\n const currentUrl = parseURL(url);\n currentUrl.pathname = currentUrl.pathname.replace(pathnameSelector, '/');\n const pageLinks = Array.from(\n (doc.querySelectorAll('a[href]') as NodeListOf<HTMLAnchorElement>) || [],\n (a) => a.href,\n ).filter((h) => {\n try {\n const linkUrl = new URL(h.replace(/#$/, ''), doc.baseURI || currentUrl.origin);\n return (\n linkUrl.origin === currentUrl.origin && linkUrl.pathname.startsWith(currentUrl.pathname)\n );\n } catch {\n return false;\n }\n });\n return pageLinks;\n}\n\nexport function parseURL(s: HTMLAnchorElement | Location | URL | string): URL {\n if (typeof s === 'string') return new URL(s);\n return new URL(s.href);\n}\n","import { parseURL } from '../pagination-utils';\n\nexport interface IPaginationStrategy {\n url?: URL | Location | string;\n doc?: Document | HTMLElement;\n paginationSelector?: string;\n fixPaginationLast?: (n: number, offset?: number) => number;\n pathnameSelector?: RegExp;\n searchParamSelector?: string;\n offsetMin?: number;\n}\n\nexport class PaginationStrategy {\n public doc = document;\n public url: URL;\n public paginationSelector = '.pagination';\n public fixPaginationLast?: (n: number, offset?: number) => number;\n public offsetMin = 1;\n\n constructor(options?: IPaginationStrategy) {\n if (options) {\n Object.entries(options).forEach(([k, v]) => {\n Object.assign(this, { [k]: v });\n });\n }\n\n this.url = parseURL(options?.url || this.doc.URL);\n }\n\n getPaginationElement() {\n return (this.doc.querySelector(this.paginationSelector) || this.doc) as HTMLElement;\n }\n\n getPaginationOffset() {\n return this.offsetMin;\n }\n getPaginationLast() {\n return this.offsetMin;\n }\n\n getPaginationUrlGenerator() {\n return (_: number) => this.url.href;\n }\n}\n","export function formatTimeToHHMMSS(timeString: string): string {\n const regex: RegExp = /(?:(\\d+)\\s*h\\s*)?(?:(\\d+)\\s*mi?n?\\s*)?(?:(\\d+)\\s*sec)?/;\n const match: RegExpMatchArray | null = timeString.match(regex);\n const h: number = parseInt(match?.[1] || '0');\n const m: number = parseInt(match?.[2] || '0');\n const s: number = parseInt(match?.[3] || '0');\n const pad = (num: number): string => String(num).padStart(2, '0');\n return `${pad(h)}:${pad(m)}:${pad(s)}`;\n}\n\n// \"01:22:03\" -> 4923\nexport function timeToSeconds(t: string): number {\n const r = /sec|min|h|m/.test(t) ? formatTimeToHHMMSS(t) : t;\n return (r?.match(/\\d+/gm) || [0])\n .reverse()\n .map((s, i) => parseInt(s as string) * 60 ** i)\n .reduce((a, b) => a + b);\n}\n\nexport function parseIntegerOr(n: string | number, or: number): number {\n return (num => Number.isNaN(num) ? or : num)(parseInt(n as string));\n}\n\n// \"data:02;body+head:async;void:;zero:;\"\nexport function parseDataParams(str: string): Record<string, string> {\n const paramsStr = decodeURI(str.trim()).split(';');\n return paramsStr.reduce((acc, s) => {\n const parsed = s.match(/([\\+\\w]+):([\\w\\-\\ ]+)?/);\n if (parsed) {\n const [, key, value] = parsed;\n if (value) {\n key.split('+').forEach(p => { acc[p] = value; });\n }\n }\n return acc;\n }, {} as Record<string, string>);\n}\n\nexport function parseCSSUrl(s: string) {\n return s.replace(/url\\(\"|\\\"\\).*/g, '');\n}\n","import { parseDataParams } from '../../../utils/parsers';\nimport { PaginationStrategy } from './PaginationStrategy';\n\nexport class PaginationStrategyDataParams extends PaginationStrategy {\n getPaginationLast() {\n const links = this.getPaginationElement()?.querySelectorAll('[data-parameters *= from]');\n const pages = Array.from(links || [], (l) => {\n const p = l.getAttribute('data-parameters');\n const v = p?.match(/from\\w*:(\\d+)/)?.[1] || this.offsetMin.toString();\n return parseInt(v);\n });\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n const link = this.getPaginationElement()?.querySelector(\n '.prev[data-parameters *= from], .prev [data-parameters *= from]',\n );\n if (!link) return this.offsetMin;\n const p = link.getAttribute('data-parameters');\n const v = p?.match(/from\\w*:(\\d+)/)?.[1] || this.offsetMin.toString();\n return parseInt(v);\n }\n\n getPaginationUrlGenerator() {\n const url = new URL(this.url.href);\n\n const parametersElement = this.getPaginationElement()?.querySelector(\n 'a[data-block-id][data-parameters]',\n );\n const block_id = parametersElement?.getAttribute('data-block-id') || '';\n const parameters = parseDataParams(parametersElement?.getAttribute('data-parameters') || '');\n\n const attrs: Record<string, string> = {\n block_id,\n function: 'get_block',\n mode: 'async',\n ...parameters,\n };\n\n Object.keys(attrs).forEach((k) => {\n url.searchParams.set(k, attrs[k]);\n });\n\n const paginationUrlGenerator = (n: number) => {\n Object.keys(attrs).forEach((k) => {\n k.includes('from') && url.searchParams.set(k, n.toString());\n });\n url.searchParams.set('_', Date.now().toString());\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import { getPaginationLinks } from '../pagination-utils';\nimport { PaginationStrategy } from './PaginationStrategy';\n\n// const fixPaginationLast = (n) => {\n// if difference < 9 = 999\n// }\n// maybe update doc after scroll to fix issues\n\nexport class PaginationStrategyPathnameParams extends PaginationStrategy {\n public pathnameSelector = /\\/(\\d+)\\/?$/;\n\n extractPage = (a: HTMLAnchorElement | Location | string): number => {\n const href = typeof a === 'string' ? a : a.href;\n const { pathname } = new URL(href, this.doc.baseURI || this.url.origin);\n return parseInt(pathname.match(this.pathnameSelector)?.pop() || this.offsetMin.toString());\n };\n\n getPaginationLast() {\n const links = getPaginationLinks(\n this.getPaginationElement(),\n this.url.href,\n this.pathnameSelector,\n );\n const pages = Array.from(links, this.extractPage);\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n return this.extractPage(this.url.href);\n }\n\n getPaginationUrlGenerator(url_: URL = this.url) {\n const url = new URL(url_.href);\n\n const pathnameSelectorPlaceholder = this.pathnameSelector\n .toString()\n .replace(/[/|\\\\|$|?|(|)]+/g, '/');\n\n if (!this.pathnameSelector.test(url.pathname)) {\n url.pathname = url.pathname\n .concat(pathnameSelectorPlaceholder.replace(/d\\+/, this.offsetMin.toString()))\n .replace(/\\/{2,}/g, '/');\n }\n\n const paginationUrlGenerator = (offset: number) => {\n url.pathname = url.pathname.replace(\n this.pathnameSelector,\n pathnameSelectorPlaceholder.replace(/d\\+/, offset.toString()),\n );\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import { getPaginationLinks } from '../pagination-utils';\nimport { PaginationStrategy } from './PaginationStrategy';\n\nexport class PaginationStrategySearchParams extends PaginationStrategy {\n public searchParamSelector = 'page';\n\n getPaginationElement() {\n return (this.doc.querySelector(this.paginationSelector) || this.doc) as HTMLElement;\n }\n\n extractPage(a: HTMLAnchorElement | Location | URL | string): number {\n const href = typeof a === 'string' ? a : a.href;\n const p = new URL(href).searchParams.get(this.searchParamSelector) as string;\n return parseInt(p) || this.offsetMin;\n }\n\n getPaginationLast() {\n const links = getPaginationLinks(this.getPaginationElement(), this.url.href).filter((h) =>\n /(page|p)=\\d+/.test(h),\n );\n const pages = links.map(this.extractPage);\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n if (this.doc === document) {\n return this.extractPage(this.url);\n }\n const link = this.getPaginationElement().querySelector(\n `a.active[href *= \"${this.searchParamSelector}=\"]`,\n ) as HTMLAnchorElement;\n return this.extractPage(link);\n }\n\n getPaginationUrlGenerator() {\n const url = new URL(this.url.href);\n\n const paginationUrlGenerator = (offset: number) => {\n url.searchParams.set(this.searchParamSelector, offset.toString());\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import {\n type IPaginationStrategy,\n PaginationStrategy,\n PaginationStrategyDataParams,\n PaginationStrategyPathnameParams,\n PaginationStrategySearchParams,\n} from './pagination-strategies';\nimport { getPaginationLinks } from './pagination-utils';\n\nexport function getPaginationStrategy(options: IPaginationStrategy) {\n const { doc = document, url = location.href } = options;\n const pageLinks = getPaginationLinks(doc, url);\n\n console.log({ pageLinks });\n\n const getStrategy = (): typeof PaginationStrategy => {\n if (pageLinks.some((h) => /(page|p)=\\d+/.test(h))) {\n const l = pageLinks.filter((h) => /(page|p)=\\d+/.test(h));\n console.log('PaginationStrategySearchParams', l);\n return PaginationStrategySearchParams;\n }\n\n if (pageLinks.some((h) => /\\/(page\\/)?\\d+\\/?$/.test(h))) {\n const l = pageLinks.filter((h) => /\\/(page\\/)?\\d+\\/?$/.test(h));\n console.log('PaginationStrategyPathnameParams', l);\n return PaginationStrategyPathnameParams;\n }\n\n const type5Links = Array.from(document.querySelectorAll('[data-parameters *= from]'));\n if (type5Links.length > 0) {\n console.log('PaginationStrategyDataParams', type5Links);\n return PaginationStrategyDataParams;\n }\n\n console.error('Found No Strategy');\n return PaginationStrategy;\n };\n\n const paginationStrategy = new (getStrategy())(options);\n\n return paginationStrategy;\n}\n\n// const p = new PaginationStrategyPathnameParams();\n\n// console.table({\n// pagination: `class:${p.getPaginationElement().className} + id:${p.getPaginationElement().id}`,\n// last: p.getPaginationLast(),\n// offset: p.getPaginationOffset(),\n// generator: p.getPaginationUrlGenerator()(1488),\n// });\n","export function chunks<T>(arr: Array<T>, n: number): Array<Array<T>> {\n return Array.from({ length: Math.ceil(arr.length / n) }, (_, i) => arr.slice(i * n, i * n + n));\n}\n\nexport function range(size: number, startAt: number = 1, step: number = 1): number[] {\n return Array.from({ length: size }, (_, index) => startAt + index * step);\n}\n","// https://2ality.com/2016/10/asynchronous-iteration.html\nexport async function computeAsyncOneAtTime(iterable: Iterable<() => Promise<void>>) {\n const res = [];\n for await (const f of iterable) {\n res.push(await f());\n }\n return res;\n}\n\nexport function wait(milliseconds: number) {\n return new Promise((resolve) => setTimeout(resolve, milliseconds));\n}\n\ninterface AsyncPoolTask {\n v: () => Promise<void>;\n p: number;\n}\n\nexport class AsyncPool {\n private cur = 0;\n private finished: Promise<boolean>;\n private _resolve?: (value: boolean | PromiseLike<boolean>) => void;\n\n public static async doNAsyncAtOnce(max = 1, pool: Array<AsyncPoolTask | (() => Promise<void>)> = []) {\n const spool = new AsyncPool(max);\n pool.forEach(f => spool.push(f));\n return spool.run();\n }\n\n constructor(private max = 1, private pool: Array<AsyncPoolTask> = []) {\n this.finished = new Promise((resolve) => {\n this._resolve = resolve;\n });\n }\n\n private getHighPriorityFirst(p = 0): (() => Promise<void>) | undefined {\n if (p > 3 || this.pool.length === 0) return undefined;\n const i = this.pool.findIndex((e) => e.p === p);\n if (i >= 0) {\n const res = this.pool[i].v;\n this.pool.splice(i, 1);\n return res;\n }\n return this.getHighPriorityFirst(p + 1);\n }\n\n private async runTask() {\n this.cur++;\n const f = this.getHighPriorityFirst();\n await f?.();\n this.cur--;\n this.runTasks();\n }\n\n private runTasks() {\n if (!this.pool.length) {\n this._resolve?.(true);\n return;\n }\n if (this.cur < this.max) {\n this.runTask();\n this.runTasks();\n }\n }\n\n public async run() {\n this.runTasks();\n return this.finished;\n }\n\n public push(x: AsyncPoolTask | (() => Promise<void>)) {\n this.pool.push('p' in x ? x : { v: x, p: 0 });\n }\n}\n\n","export function isMob() {\n return /iPhone|Android/i.test(navigator.userAgent);\n}","export function listenEvents(dom: HTMLElement | Element, events: Array<string>, callback: (e: Event) => void): void {\n for (const e of events) {\n dom.addEventListener(e, callback, true);\n }\n}\n\nexport class Tick {\n private tick?: number;\n private callbackFinal?: () => void;\n\n constructor(private delay: number, private startImmediate: boolean = true) {}\n\n public start(callback: () => void, callbackFinal?: () => void): void {\n this.stop();\n this.callbackFinal = callbackFinal;\n if (this.startImmediate) callback();\n this.tick = window.setInterval(callback, this.delay);\n }\n\n public stop(): void {\n if (this.tick !== undefined) {\n clearInterval(this.tick);\n this.tick = undefined;\n }\n if (this.callbackFinal) {\n this.callbackFinal();\n this.callbackFinal = undefined;\n }\n }\n}\n","export function circularShift(n: number, c = 6, s = 1): number {\n return (n + s) % c || c;\n}\n"],"names":["target","s","observer","paginationLast","paginationOffset"],"mappings":"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"}
|
|
@@ -69,8 +69,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
69
69
|
return (v) => {
|
|
70
70
|
const isPublic = !this.rules.isPrivate(v.element);
|
|
71
71
|
return {
|
|
72
|
-
|
|
73
|
-
|
|
72
|
+
condition: this.state.filterPublic && isPublic,
|
|
73
|
+
tag: "filter-public"
|
|
74
74
|
};
|
|
75
75
|
};
|
|
76
76
|
});
|
|
@@ -78,8 +78,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
78
78
|
return (v) => {
|
|
79
79
|
const isPrivate = this.rules.isPrivate(v.element);
|
|
80
80
|
return {
|
|
81
|
-
|
|
82
|
-
|
|
81
|
+
condition: this.state.filterPrivate && isPrivate,
|
|
82
|
+
tag: "filter-private"
|
|
83
83
|
};
|
|
84
84
|
};
|
|
85
85
|
});
|
|
@@ -87,8 +87,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
87
87
|
return (v) => {
|
|
88
88
|
const isHD = this.rules.isHD(v.element);
|
|
89
89
|
return {
|
|
90
|
-
|
|
91
|
-
|
|
90
|
+
condition: this.state.filterHD && isHD,
|
|
91
|
+
tag: "filter-hd"
|
|
92
92
|
};
|
|
93
93
|
};
|
|
94
94
|
});
|
|
@@ -96,8 +96,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
96
96
|
return (v) => {
|
|
97
97
|
const notInRange = v.duration < this.state.filterDurationFrom || v.duration > this.state.filterDurationTo;
|
|
98
98
|
return {
|
|
99
|
-
|
|
100
|
-
|
|
99
|
+
condition: this.state.filterDuration && notInRange,
|
|
100
|
+
tag: "filter-duration"
|
|
101
101
|
};
|
|
102
102
|
};
|
|
103
103
|
});
|
|
@@ -106,8 +106,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
106
106
|
return (v) => {
|
|
107
107
|
const containTags = tags.some((tag) => tag.test(v.title));
|
|
108
108
|
return {
|
|
109
|
-
|
|
110
|
-
|
|
109
|
+
condition: this.state.filterExclude && containTags,
|
|
110
|
+
tag: "filter-exclude"
|
|
111
111
|
};
|
|
112
112
|
};
|
|
113
113
|
});
|
|
@@ -116,8 +116,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
116
116
|
return (v) => {
|
|
117
117
|
const containTagsNot = tags.some((tag) => !tag.test(v.title));
|
|
118
118
|
return {
|
|
119
|
-
|
|
120
|
-
|
|
119
|
+
condition: this.state.filterInclude && containTagsNot,
|
|
120
|
+
tag: "filter-include"
|
|
121
121
|
};
|
|
122
122
|
};
|
|
123
123
|
});
|
|
@@ -199,8 +199,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
199
199
|
const targets = [window, globalThis.unsafeWindow].filter(Boolean);
|
|
200
200
|
targets.forEach((w) => {
|
|
201
201
|
Object.assign(w, {
|
|
202
|
-
|
|
203
|
-
|
|
202
|
+
sortByDuration: () => this.sort("duration"),
|
|
203
|
+
sortByViews: () => this.sort("view")
|
|
204
204
|
});
|
|
205
205
|
});
|
|
206
206
|
}
|
|
@@ -335,13 +335,13 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
335
335
|
class InfiniteScroller {
|
|
336
336
|
constructor({
|
|
337
337
|
enabled = true,
|
|
338
|
-
delay =
|
|
338
|
+
delay = 300,
|
|
339
339
|
writeHistory = false,
|
|
340
340
|
paginationOffset,
|
|
341
341
|
paginationLast,
|
|
342
342
|
paginationElement,
|
|
343
343
|
paginationUrlGenerator,
|
|
344
|
-
|
|
344
|
+
parseData,
|
|
345
345
|
alternativeGenerator,
|
|
346
346
|
intersectionObservable
|
|
347
347
|
}) {
|
|
@@ -351,7 +351,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
351
351
|
__publicField(this, "paginationOffset");
|
|
352
352
|
__publicField(this, "paginationLast");
|
|
353
353
|
__publicField(this, "writeHistory");
|
|
354
|
-
__publicField(this, "
|
|
354
|
+
__publicField(this, "parseData");
|
|
355
355
|
__publicField(this, "onScrollCBs", []);
|
|
356
356
|
__publicField(this, "generatorConsumer", async () => {
|
|
357
357
|
if (!this.enabled) return false;
|
|
@@ -360,7 +360,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
360
360
|
const nextPageHTML = await fetchHtml(url);
|
|
361
361
|
const prevScrollPos = document.documentElement.scrollTop;
|
|
362
362
|
this.paginationOffset = offset;
|
|
363
|
-
this.
|
|
363
|
+
this.parseData(nextPageHTML);
|
|
364
364
|
this._onScroll();
|
|
365
365
|
window.scrollTo(0, prevScrollPos);
|
|
366
366
|
if (this.writeHistory) {
|
|
@@ -374,7 +374,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
374
374
|
this.writeHistory = writeHistory;
|
|
375
375
|
this.paginationOffset = paginationOffset;
|
|
376
376
|
this.paginationLast = paginationLast;
|
|
377
|
-
this.
|
|
377
|
+
this.parseData = parseData;
|
|
378
378
|
this.paginationGenerator = alternativeGenerator?.() ?? InfiniteScroller.createPaginationGenerator(
|
|
379
379
|
paginationOffset,
|
|
380
380
|
paginationLast,
|
|
@@ -400,15 +400,23 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
400
400
|
}
|
|
401
401
|
}
|
|
402
402
|
}
|
|
403
|
-
function createInfiniteScroller(store,
|
|
403
|
+
function createInfiniteScroller(store, parseData, rules) {
|
|
404
404
|
const enabled = store.state.infiniteScrollEnabled;
|
|
405
|
+
const paginationOffset = rules.paginationStrategy.getPaginationOffset();
|
|
406
|
+
const paginationElement = rules.paginationStrategy.getPaginationElement();
|
|
407
|
+
const paginationLast = rules.paginationStrategy.getPaginationLast();
|
|
408
|
+
const paginationUrlGenerator = rules.paginationStrategy.getPaginationUrlGenerator();
|
|
405
409
|
const iscroller = new InfiniteScroller({
|
|
406
410
|
enabled,
|
|
407
|
-
|
|
411
|
+
parseData,
|
|
412
|
+
paginationLast,
|
|
413
|
+
paginationOffset,
|
|
414
|
+
paginationElement,
|
|
415
|
+
paginationUrlGenerator,
|
|
408
416
|
...rules
|
|
409
|
-
}).onScroll(({ paginationLast, paginationOffset }) => {
|
|
410
|
-
store.localState.pagIndexLast =
|
|
411
|
-
store.localState.pagIndexCur =
|
|
417
|
+
}).onScroll(({ paginationLast: paginationLast2, paginationOffset: paginationOffset2 }) => {
|
|
418
|
+
store.localState.pagIndexLast = paginationLast2;
|
|
419
|
+
store.localState.pagIndexCur = paginationOffset2;
|
|
412
420
|
}, true);
|
|
413
421
|
store.subscribe(() => {
|
|
414
422
|
iscroller.enabled = store.state.infiniteScrollEnabled;
|
|
@@ -452,6 +460,15 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
452
460
|
getPaginationElement() {
|
|
453
461
|
return this.doc.querySelector(this.paginationSelector) || this.doc;
|
|
454
462
|
}
|
|
463
|
+
getPaginationOffset() {
|
|
464
|
+
return this.offsetMin;
|
|
465
|
+
}
|
|
466
|
+
getPaginationLast() {
|
|
467
|
+
return this.offsetMin;
|
|
468
|
+
}
|
|
469
|
+
getPaginationUrlGenerator() {
|
|
470
|
+
return (_) => this.url.href;
|
|
471
|
+
}
|
|
455
472
|
}
|
|
456
473
|
function formatTimeToHHMMSS(timeString) {
|
|
457
474
|
const regex = /(?:(\d+)\s*h\s*)?(?:(\d+)\s*mi?n?\s*)?(?:(\d+)\s*sec)?/;
|
|
@@ -516,9 +533,9 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
516
533
|
const block_id = parametersElement?.getAttribute("data-block-id") || "";
|
|
517
534
|
const parameters = parseDataParams(parametersElement?.getAttribute("data-parameters") || "");
|
|
518
535
|
const attrs = {
|
|
519
|
-
mode: "async",
|
|
520
|
-
function: "get_block",
|
|
521
536
|
block_id,
|
|
537
|
+
function: "get_block",
|
|
538
|
+
mode: "async",
|
|
522
539
|
...parameters
|
|
523
540
|
};
|
|
524
541
|
Object.keys(attrs).forEach((k) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"billy-herrington-utils.umd.js","sources":["../src/utils/observers/index.ts","../src/utils/strings/index.ts","../src/userscripts/data-manager/index.ts","../src/utils/dom/index.ts","../src/utils/fetch/index.ts","../src/userscripts/infinite-scroll/index.ts","../src/userscripts/jabroni-outfit-wrap/index.ts","../src/userscripts/pagination-parsing/pagination-utils/index.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategy.ts","../src/utils/parsers/index.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategyDataParams.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategyPathnameParams.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategySearchParams.ts","../src/userscripts/pagination-parsing/index.ts","../src/utils/arrays/index.ts","../src/utils/async/index.ts","../src/utils/device/index.ts","../src/utils/events/index.ts","../src/utils/math/index.ts"],"sourcesContent":["export class Observer {\n public observer: IntersectionObserver;\n constructor(private callback: (entry: Element) => void) {\n this.observer = new IntersectionObserver(this.handleIntersection.bind(this));\n }\n\n observe(target: Element) {\n this.observer.observe(target);\n }\n\n throttle(target: Element, throttleTime: number) {\n this.observer.unobserve(target);\n setTimeout(() => this.observer.observe(target), throttleTime);\n }\n\n handleIntersection(entries: Iterable<IntersectionObserverEntry>) {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n this.callback(entry.target);\n }\n }\n }\n\n static observeWhile(\n target: Element,\n callback: () => Promise<boolean> | boolean,\n throttleTime: number,\n ) {\n const observer_ = new Observer(async (target: Element) => {\n const condition = await callback();\n if (condition) observer_.throttle(target, throttleTime);\n });\n observer_.observe(target);\n return observer_;\n }\n}\n\nexport class LazyImgLoader {\n public lazyImgObserver: Observer;\n private attributeName = 'data-lazy-load';\n\n constructor(shouldDelazify: (target: Element) => boolean) {\n this.lazyImgObserver = new Observer((target: Element) => {\n if (shouldDelazify(target)) {\n this.delazify(target as HTMLImageElement);\n }\n });\n }\n\n lazify(_target: Element, img: HTMLImageElement, imgSrc: string) {\n if (!img || !imgSrc) return;\n img.setAttribute(this.attributeName, imgSrc);\n img.src = '';\n this.lazyImgObserver.observe(img);\n }\n\n delazify = (target: HTMLImageElement) => {\n this.lazyImgObserver.observer.unobserve(target);\n target.src = target.getAttribute(this.attributeName) as string;\n target.removeAttribute(this.attributeName);\n };\n}\n","export function stringToWords(s: string): Array<string> {\n return s.split(\",\").map(s => s.trim().toLowerCase()).filter(_ => _);\n}\n\nexport function sanitizeStr(s: string) {\n return s?.replace(/\\n|\\t/, ' ').replace(/ {2,}/, ' ').trim().toLowerCase() || \"\";\n}\n","import { LazyImgLoader } from '../../utils/observers';\nimport { stringToWords } from '../../utils/strings';\n\ninterface DataFilterState {\n filterPublic: boolean;\n filterPrivate: boolean;\n filterHD: boolean;\n filterDuration: boolean;\n filterDurationFrom: number;\n filterDurationTo: number;\n filterExclude: boolean;\n filterExcludeWords: string;\n filterInclude: boolean;\n filterIncludeWords: string;\n}\n\ninterface FilterResult {\n tag: string;\n condition: boolean;\n}\n\ntype FilterInput = Record<string, string | number | boolean | HTMLElement>;\ntype FilterFunction = (v: FilterInput) => FilterResult;\n\nclass DataFilter {\n public filters: { [key: string]: () => FilterFunction };\n\n constructor(\n private rules: IRules,\n private state: DataFilterState,\n ) {\n this.state = state;\n\n const methods = Object.getOwnPropertyNames(this);\n this.filters = methods.reduce((acc: { [key: string]: () => FilterFunction }, k) => {\n if (k in this.state) {\n acc[k] = this[k as keyof DataFilter] as unknown as () => FilterFunction;\n GM_addStyle(`.filter-${k.toLowerCase().slice(6)} { display: none !important; }`);\n }\n return acc;\n }, {});\n }\n\n filterPublic = (): FilterFunction => {\n return (v: FilterInput) => {\n const isPublic = !this.rules.isPrivate(v.element as HTMLElement);\n return {\n tag: 'filter-public',\n condition: this.state.filterPublic && isPublic,\n };\n };\n };\n\n filterPrivate = (): FilterFunction => {\n return (v: FilterInput) => {\n const isPrivate = this.rules.isPrivate(v.element as HTMLElement);\n return {\n tag: 'filter-private',\n condition: this.state.filterPrivate && isPrivate,\n };\n };\n };\n\n filterHD = (): FilterFunction => {\n return (v: FilterInput) => {\n const isHD = this.rules.isHD(v.element as HTMLElement);\n return {\n tag: 'filter-hd',\n condition: this.state.filterHD && isHD,\n };\n };\n };\n\n filterDuration = (): FilterFunction => {\n return (v: FilterInput) => {\n const notInRange =\n (v.duration as number) < this.state.filterDurationFrom ||\n (v.duration as number) > this.state.filterDurationTo;\n return {\n tag: 'filter-duration',\n condition: this.state.filterDuration && notInRange,\n };\n };\n };\n\n filterExclude = (): FilterFunction => {\n const tags = DataManager.filterDSLToRegex(this.state.filterExcludeWords);\n return (v: FilterInput) => {\n const containTags = tags.some((tag) => tag.test(v.title as string));\n return {\n tag: 'filter-exclude',\n condition: this.state.filterExclude && containTags,\n };\n };\n };\n\n filterInclude = (): FilterFunction => {\n const tags = DataManager.filterDSLToRegex(this.state.filterIncludeWords);\n return (v: FilterInput) => {\n const containTagsNot = tags.some((tag) => !tag.test(v.title as string));\n return {\n tag: 'filter-include',\n condition: this.state.filterInclude && containTagsNot,\n };\n };\n };\n}\n\ninterface IRules {\n getThumbs: (html: HTMLElement) => HTMLElement[];\n getThumbUrl: (thumbElement: HTMLElement) => string;\n getThumbData: (thumbElement: HTMLElement) => { title: string; duration: number };\n getThumbImgData: (thumbElement: HTMLElement) => { img: HTMLElement; imgSrc: string };\n container: HTMLElement;\n isPrivate: (element: HTMLElement) => boolean;\n isHD: (element: HTMLElement) => boolean;\n}\n\nexport class DataManager {\n private rules: IRules;\n private state: DataFilterState;\n private data: Map<string, FilterInput>;\n private lazyImgLoader: LazyImgLoader;\n public dataFilters: { [key: string]: () => FilterFunction };\n\n constructor(rules: IRules, state: DataFilterState) {\n this.rules = rules;\n this.state = state;\n this.data = new Map();\n this.lazyImgLoader = new LazyImgLoader(\n (target: Element) => !this.isFiltered(target as HTMLElement),\n );\n this.dataFilters = new DataFilter(rules, state).filters;\n\n const targets = [window, (globalThis as any).unsafeWindow].filter(Boolean);\n targets.forEach((w: any) => {\n Object.assign(w, {\n sortByViews: () => this.sort('view'),\n sortByDuration: () => this.sort('duration'),\n });\n });\n }\n\n static filterDSLToRegex(str: string): RegExp[] {\n const toFullWord = (w: string) => `(^|\\\\ )${w}($|\\\\ )`;\n const str_ = str.replace(/f:(\\w+)/g, (_, w) => toFullWord(w));\n return stringToWords(str_).map((expr: string) => new RegExp(expr, 'i'));\n }\n\n isFiltered(el: HTMLElement): boolean {\n return el.className.includes('filtered');\n }\n\n applyFilters = (filters: { [key: string]: boolean }, offset = 0): void => {\n const filtersToApply = Object.keys(filters)\n .filter((k) => Object.hasOwn(this.dataFilters, k))\n .map((k) => this.dataFilters[k]());\n\n if (filtersToApply.length === 0) return;\n\n const updates: (() => void)[] = [];\n let offset_counter = 1;\n for (const v of this.data.values()) {\n if (++offset_counter > offset) {\n for (const f of filtersToApply) {\n const { tag, condition } = f(v as FilterInput);\n updates.push(() => (v.element as HTMLElement).classList.toggle(tag, condition));\n }\n }\n }\n\n requestAnimationFrame(() => {\n updates.forEach((update) => {\n update();\n });\n });\n };\n\n filterAll = (offset?: number): void => {\n const filters = Object.assign(\n {},\n ...Object.keys(this.dataFilters).map((f) => ({\n [f]: this.state[f as keyof DataFilterState],\n })),\n );\n this.applyFilters(filters, offset);\n };\n\n parseData = (\n html: HTMLElement,\n container?: HTMLElement,\n removeDuplicates = false,\n shouldLazify = true,\n ): void => {\n const thumbs = this.rules.getThumbs(html);\n const data_offset = this.data.size;\n\n for (const thumbElement of thumbs) {\n const url = this.rules.getThumbUrl(thumbElement);\n if (!url || this.data.has(url)) {\n if (removeDuplicates) thumbElement.remove();\n continue;\n }\n\n const data = this.rules.getThumbData(thumbElement);\n this.data.set(url, { element: thumbElement, ...data });\n\n if (shouldLazify) {\n const { img, imgSrc } = this.rules.getThumbImgData(thumbElement);\n this.lazyImgLoader.lazify(thumbElement, img as HTMLImageElement, imgSrc);\n }\n\n const parent = container || this.rules.container;\n if (!parent.contains(thumbElement)) parent.appendChild(thumbElement);\n }\n\n this.filterAll(data_offset);\n };\n\n sort(propName: string) {\n if (this.data.size < 2) return;\n\n const sorted = Array.from(this.data.keys()).sort((b, a) => {\n return (\n ((this.data.get(a) as FilterInput)[propName] as number) -\n ((this.data.get(b) as FilterInput)[propName] as number)\n );\n });\n\n const container = ((this.data.get(sorted[0]) as FilterInput).element as HTMLElement)\n .parentElement as HTMLElement;\n\n sorted.forEach((s) => {\n const e = (this.data.get(s) as FilterInput).element as HTMLElement;\n container.append(e);\n });\n }\n}\n","export function parseDom(html: string): HTMLElement {\n const parsed = new DOMParser().parseFromString(html, 'text/html').body;\n return parsed.children.length > 1 ? parsed : parsed.firstElementChild as HTMLElement;\n}\n\nexport function copyAttributes(target: HTMLElement | Element, source: HTMLElement | Element) {\n for (const attr of source.attributes) {\n attr.nodeValue && target.setAttribute(attr.nodeName, attr.nodeValue);\n }\n}\n\nexport function replaceElementTag(e: HTMLElement | Element, tagName: string) {\n const newTagElement = document.createElement(tagName);\n copyAttributes(newTagElement, e);\n newTagElement.innerHTML = e.innerHTML;\n e.parentNode?.replaceChild(newTagElement, e);\n return newTagElement;\n}\n\nexport function getAllUniqueParents(elements: HTMLCollection): Array<HTMLElement | Element> {\n return Array.from(elements).reduce((acc, v) => {\n if (v.parentElement && !acc.includes(v.parentElement as HTMLElement)) { acc.push(v.parentElement); }\n return acc;\n }, [] as Array<HTMLElement | Element>);\n}\n\nexport function findNextSibling(el: HTMLElement | Element) {\n if (el.nextElementSibling) return el.nextElementSibling;\n if (el.parentElement) return findNextSibling(el.parentElement);\n return null;\n}\n\nexport function waitForElementExists(parent: HTMLElement | Element, selector: string, callback: (el: Element) => void): void {\n const observer = new MutationObserver((_mutations) => {\n const el = parent.querySelector(selector);\n if (el) {\n observer.disconnect();\n callback(el);\n }\n });\n observer.observe(document.body, { childList: true, subtree: true });\n}\n\nexport function watchElementChildrenCount(element: HTMLElement | Element,\n callback: (observer: MutationObserver, count: number) => void): void {\n let count = element.children.length;\n const observer = new MutationObserver((mutationList, observer) => {\n for (const mutation of mutationList) {\n if (mutation.type === \"childList\") {\n if (count !== element.children.length) {\n count = element.children.length;\n callback(observer, count);\n }\n }\n }\n });\n observer.observe(element, { childList: true });\n}\n\nexport function watchDomChangesWithThrottle(\n element: HTMLElement | Element, \n callback: () => void,\n throttle = 1000,\n times = Infinity,\n options: Record<string, boolean> = { childList: true, subtree: true, attributes: true }\n) {\n let lastMutationTime: number;\n let timeout: number;\n let times_ = times;\n const observer = new MutationObserver((_mutationList, _observer) => {\n if (times_ !== Infinity && times_ < 1) {\n observer.disconnect();\n return;\n }\n times_--;\n const now = Date.now();\n if (lastMutationTime && now - lastMutationTime < throttle) {\n timeout && clearTimeout(timeout);\n }\n timeout = setTimeout(callback, throttle);\n lastMutationTime = now;\n });\n observer.observe(element, options);\n return observer;\n}\n\nexport function downloader(options = { append: \"\", after: \"\", button: \"\", cbBefore: () => { } }) {\n const btn = parseDom(options.button);\n\n if (options.append) document.querySelector(options.append)?.append(btn);\n if (options.after) document.querySelector(options.after)?.after(btn);\n\n btn.addEventListener('click', (e) => {\n e.preventDefault();\n\n if (options.cbBefore) options.cbBefore();\n\n waitForElementExists(document.body, 'video', (video: Element) => {\n window.location.href = video.getAttribute('src') as string;\n });\n });\n}\n\nexport function exterminateVideo(video: HTMLVideoElement) {\n video.removeAttribute('src');\n video.load();\n video.remove();\n}","import { parseDom } from '../dom';\n\nexport const MOBILE_UA = [\n 'Mozilla/5.0 (Linux; Android 10; K)',\n 'AppleWebKit/537.36 (KHTML, like Gecko)',\n 'Chrome/114.0.0.0 Mobile Safari/537.36',\n].join(' ');\n\nexport function fetchWith(\n url: string,\n options: Record<string, boolean> = { html: false, mobile: false },\n) {\n const reqOpts = {};\n if (options.mobile) Object.assign(reqOpts, { headers: new Headers({ 'User-Agent': MOBILE_UA }) });\n return fetch(url, reqOpts)\n .then((r) => r.text())\n .then((r) => (options.html ? parseDom(r) : r));\n}\n\nexport const fetchHtml = (url: string) => fetchWith(url, { html: true }) as Promise<HTMLElement>;\n\nexport const fetchText = (url: string) => fetchWith(url) as Promise<string>;\n\nexport function objectToFormData(object: Record<string, number | boolean | string>): FormData {\n const formData = new FormData();\n Object.entries(object).forEach(([k, v]) => formData.append(k, v as string));\n return formData;\n}\n","import { fetchHtml } from '../../utils/fetch';\nimport { Observer } from '../../utils/observers';\n\ninterface IInfiniteScroller {\n delay: number;\n enabled: boolean;\n writeHistory?: boolean;\n paginationOffset: number;\n paginationLast: number;\n paginationElement: HTMLElement;\n paginationUrlGenerator: (offset: number) => string;\n handleHtmlCallback: (document: HTMLElement) => void;\n intersectionObservable?: HTMLElement;\n alternativeGenerator?: () => OffsetGenerator;\n}\n\ninterface GeneratorResult {\n url: string;\n offset: number;\n}\n\ntype OffsetGenerator = Generator<GeneratorResult> | AsyncGenerator<GeneratorResult>;\n\nexport class InfiniteScroller {\n public paginationGenerator: OffsetGenerator;\n public enabled: boolean;\n public delay: number;\n public paginationOffset: number;\n public paginationLast: number;\n public writeHistory: boolean;\n private handleHtmlCallback: (document: HTMLElement) => void;\n\n constructor({\n enabled = true,\n delay = 350,\n writeHistory = false,\n paginationOffset,\n paginationLast,\n paginationElement,\n paginationUrlGenerator,\n handleHtmlCallback,\n alternativeGenerator,\n intersectionObservable,\n }: IInfiniteScroller) {\n this.enabled = enabled;\n this.delay = delay;\n this.writeHistory = writeHistory;\n this.paginationOffset = paginationOffset;\n this.paginationLast = paginationLast;\n this.handleHtmlCallback = handleHtmlCallback;\n\n this.paginationGenerator =\n alternativeGenerator?.() ??\n InfiniteScroller.createPaginationGenerator(\n paginationOffset,\n paginationLast,\n paginationUrlGenerator,\n );\n\n const observable = intersectionObservable || paginationElement;\n Observer.observeWhile(observable, this.generatorConsumer, this.delay);\n }\n\n private onScrollCBs: Array<(scroller: InfiniteScroller) => void> = [];\n\n public onScroll(callback: (scroller: InfiniteScroller) => void, initCall = false) {\n if (initCall) callback(this);\n this.onScrollCBs.push(callback);\n return this;\n }\n\n private _onScroll() {\n this.onScrollCBs.forEach((cb) => {\n cb(this);\n });\n }\n\n generatorConsumer = async () => {\n if (!this.enabled) return false;\n const { value: { url, offset } = {}, done } = await this.paginationGenerator.next();\n if (!done) {\n const nextPageHTML = await fetchHtml(url);\n const prevScrollPos = document.documentElement.scrollTop;\n this.paginationOffset = offset;\n this.handleHtmlCallback(nextPageHTML);\n this._onScroll();\n window.scrollTo(0, prevScrollPos);\n if (this.writeHistory) {\n history.replaceState({}, '', url);\n }\n }\n return !done;\n };\n\n static *createPaginationGenerator(\n currentPage: number,\n totalPages: number,\n generateURL: (offset: number) => string,\n ): OffsetGenerator {\n for (let offset = currentPage + 1; offset <= totalPages; offset++) {\n const url = generateURL(offset);\n yield { url, offset };\n }\n }\n}\n","import { InfiniteScroller } from '../infinite-scroll';\nimport type { PaginationStrategy } from '../pagination-parsing/pagination-strategies';\n\ninterface IRules {\n paginationStrategy: PaginationStrategy;\n delay: number;\n paginationOffset: number;\n paginationLast: number;\n paginationElement: HTMLElement;\n paginationUrlGenerator: (n: number) => string;\n}\n\nexport interface JabroniStore {\n state: Record<string, boolean | string | number>;\n localState: Record<string, boolean | string | number>;\n subscribe: (callback: () => void) => void;\n}\n\nexport function createInfiniteScroller(\n store: JabroniStore,\n handleHtmlCallback: (document: HTMLElement) => void,\n rules: IRules,\n) {\n const enabled = store.state.infiniteScrollEnabled as boolean;\n const iscroller = new InfiniteScroller({\n enabled,\n handleHtmlCallback,\n ...rules,\n }).onScroll(({ paginationLast, paginationOffset }) => {\n store.localState.pagIndexLast = paginationLast;\n store.localState.pagIndexCur = paginationOffset;\n }, true);\n\n store.subscribe(() => {\n iscroller.enabled = store.state.infiniteScrollEnabled as boolean;\n });\n\n return iscroller;\n}\n","export function getPaginationLinks(\n doc: HTMLElement | Document = document,\n url: Location | URL | string = location.href,\n pathnameSelector = /\\/(page\\/)?\\d+\\/?$/,\n): string[] {\n const currentUrl = parseURL(url);\n currentUrl.pathname = currentUrl.pathname.replace(pathnameSelector, '/');\n const pageLinks = Array.from(\n (doc.querySelectorAll('a[href]') as NodeListOf<HTMLAnchorElement>) || [],\n (a) => a.href,\n ).filter((h) => {\n try {\n const linkUrl = new URL(h.replace(/#$/, ''), doc.baseURI || currentUrl.origin);\n return (\n linkUrl.origin === currentUrl.origin && linkUrl.pathname.startsWith(currentUrl.pathname)\n );\n } catch {\n return false;\n }\n });\n return pageLinks;\n}\n\nexport function parseURL(s: HTMLAnchorElement | Location | URL | string): URL {\n if (typeof s === 'string') return new URL(s);\n return new URL(s.href);\n}\n","import { parseURL } from '../pagination-utils';\n\nexport interface IPaginationStrategy {\n url?: URL | Location | string;\n doc?: Document | HTMLElement;\n paginationSelector?: string;\n fixPaginationLast?: (n: number, offset?: number) => number;\n pathnameSelector?: RegExp;\n searchParamSelector?: string;\n offsetMin?: number;\n}\n\nexport class PaginationStrategy {\n public doc = document;\n public url: URL;\n public paginationSelector = '.pagination';\n public fixPaginationLast?: (n: number, offset?: number) => number;\n public offsetMin = 1;\n\n constructor(options?: IPaginationStrategy) {\n if (options) {\n Object.entries(options).forEach(([k, v]) => {\n Object.assign(this, { [k]: v });\n });\n }\n\n this.url = parseURL(options?.url || this.doc.URL);\n }\n\n getPaginationElement() {\n return (this.doc.querySelector(this.paginationSelector) || this.doc) as HTMLElement;\n }\n}\n","export function formatTimeToHHMMSS(timeString: string): string {\n const regex: RegExp = /(?:(\\d+)\\s*h\\s*)?(?:(\\d+)\\s*mi?n?\\s*)?(?:(\\d+)\\s*sec)?/;\n const match: RegExpMatchArray | null = timeString.match(regex);\n const h: number = parseInt(match?.[1] || '0');\n const m: number = parseInt(match?.[2] || '0');\n const s: number = parseInt(match?.[3] || '0');\n const pad = (num: number): string => String(num).padStart(2, '0');\n return `${pad(h)}:${pad(m)}:${pad(s)}`;\n}\n\n// \"01:22:03\" -> 4923\nexport function timeToSeconds(t: string): number {\n const r = /sec|min|h|m/.test(t) ? formatTimeToHHMMSS(t) : t;\n return (r?.match(/\\d+/gm) || [0])\n .reverse()\n .map((s, i) => parseInt(s as string) * 60 ** i)\n .reduce((a, b) => a + b);\n}\n\nexport function parseIntegerOr(n: string | number, or: number): number {\n return (num => Number.isNaN(num) ? or : num)(parseInt(n as string));\n}\n\n// \"data:02;body+head:async;void:;zero:;\"\nexport function parseDataParams(str: string): Record<string, string> {\n const paramsStr = decodeURI(str.trim()).split(';');\n return paramsStr.reduce((acc, s) => {\n const parsed = s.match(/([\\+\\w]+):([\\w\\-\\ ]+)?/);\n if (parsed) {\n const [, key, value] = parsed;\n if (value) {\n key.split('+').forEach(p => { acc[p] = value; });\n }\n }\n return acc;\n }, {} as Record<string, string>);\n}\n\nexport function parseCSSUrl(s: string) {\n return s.replace(/url\\(\"|\\\"\\).*/g, '');\n}\n","import { parseDataParams } from '../../../utils/parsers';\nimport { PaginationStrategy } from './PaginationStrategy';\n\nexport class PaginationStrategyDataParams extends PaginationStrategy {\n getPaginationLast() {\n const links = this.getPaginationElement()?.querySelectorAll('[data-parameters *= from]');\n const pages = Array.from(links || [], (l) => {\n const p = l.getAttribute('data-parameters');\n const v = p?.match(/from\\w*:(\\d+)/)?.[1] || this.offsetMin.toString();\n return parseInt(v);\n });\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n const link = this.getPaginationElement()?.querySelector(\n '.prev[data-parameters *= from], .prev [data-parameters *= from]',\n );\n if (!link) return this.offsetMin;\n const p = link.getAttribute('data-parameters');\n const v = p?.match(/from\\w*:(\\d+)/)?.[1] || this.offsetMin.toString();\n return parseInt(v);\n }\n\n getPaginationUrlGenerator() {\n const url = new URL(this.url.href);\n\n const parametersElement = this.getPaginationElement()?.querySelector(\n 'a[data-block-id][data-parameters]',\n );\n const block_id = parametersElement?.getAttribute('data-block-id') || '';\n const parameters = parseDataParams(parametersElement?.getAttribute('data-parameters') || '');\n\n const attrs: Record<string, string> = {\n mode: 'async',\n function: 'get_block',\n block_id,\n ...parameters,\n };\n\n Object.keys(attrs).forEach((k) => {\n url.searchParams.set(k, attrs[k]);\n });\n\n const paginationUrlGenerator = (n: number) => {\n Object.keys(attrs).forEach((k) => {\n k.includes('from') && url.searchParams.set(k, n.toString());\n });\n url.searchParams.set('_', Date.now().toString());\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import { getPaginationLinks } from '../pagination-utils';\nimport { PaginationStrategy } from './PaginationStrategy';\n\n// const fixPaginationLast = (n) => {\n// if difference < 9 = 999\n// }\n// maybe update doc after scroll to fix issues\n\nexport class PaginationStrategyPathnameParams extends PaginationStrategy {\n public pathnameSelector = /\\/(\\d+)\\/?$/;\n\n extractPage = (a: HTMLAnchorElement | Location | string): number => {\n const href = typeof a === 'string' ? a : a.href;\n const { pathname } = new URL(href, this.doc.baseURI || this.url.origin);\n return parseInt(pathname.match(this.pathnameSelector)?.pop() || this.offsetMin.toString());\n };\n\n getPaginationLast() {\n const links = getPaginationLinks(\n this.getPaginationElement(),\n this.url.href,\n this.pathnameSelector,\n );\n const pages = Array.from(links, this.extractPage);\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n return this.extractPage(this.url.href);\n }\n\n getPaginationUrlGenerator(url_: URL = this.url) {\n const url = new URL(url_.href);\n\n const pathnameSelectorPlaceholder = this.pathnameSelector\n .toString()\n .replace(/[/|\\\\|$|?|(|)]+/g, '/');\n\n if (!this.pathnameSelector.test(url.pathname)) {\n url.pathname = url.pathname\n .concat(pathnameSelectorPlaceholder.replace(/d\\+/, this.offsetMin.toString()))\n .replace(/\\/{2,}/g, '/');\n }\n\n const paginationUrlGenerator = (offset: number) => {\n url.pathname = url.pathname.replace(\n this.pathnameSelector,\n pathnameSelectorPlaceholder.replace(/d\\+/, offset.toString()),\n );\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import { getPaginationLinks } from '../pagination-utils';\nimport { PaginationStrategy } from './PaginationStrategy';\n\nexport class PaginationStrategySearchParams extends PaginationStrategy {\n public searchParamSelector = 'page';\n\n getPaginationElement() {\n return (this.doc.querySelector(this.paginationSelector) || this.doc) as HTMLElement;\n }\n\n extractPage(a: HTMLAnchorElement | Location | URL | string): number {\n const href = typeof a === 'string' ? a : a.href;\n const p = new URL(href).searchParams.get(this.searchParamSelector) as string;\n return parseInt(p) || this.offsetMin;\n }\n\n getPaginationLast() {\n const links = getPaginationLinks(this.getPaginationElement(), this.url.href).filter((h) =>\n /(page|p)=\\d+/.test(h),\n );\n const pages = links.map(this.extractPage);\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n if (this.doc === document) {\n return this.extractPage(this.url);\n }\n const link = this.getPaginationElement().querySelector(\n `a.active[href *= \"${this.searchParamSelector}=\"]`,\n ) as HTMLAnchorElement;\n return this.extractPage(link);\n }\n\n getPaginationUrlGenerator() {\n const url = new URL(this.url.href);\n\n const paginationUrlGenerator = (offset: number) => {\n url.searchParams.set(this.searchParamSelector, offset.toString());\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import {\n type IPaginationStrategy,\n PaginationStrategy,\n PaginationStrategyDataParams,\n PaginationStrategyPathnameParams,\n PaginationStrategySearchParams,\n} from './pagination-strategies';\nimport { getPaginationLinks } from './pagination-utils';\n\nexport function getPaginationStrategy(options: IPaginationStrategy) {\n const { doc = document, url = location.href } = options;\n const pageLinks = getPaginationLinks(doc, url);\n\n console.log({ pageLinks });\n\n const getStrategy = (): typeof PaginationStrategy => {\n if (pageLinks.some((h) => /(page|p)=\\d+/.test(h))) {\n const l = pageLinks.filter((h) => /(page|p)=\\d+/.test(h));\n console.log('PaginationStrategySearchParams', l);\n return PaginationStrategySearchParams;\n }\n\n if (pageLinks.some((h) => /\\/(page\\/)?\\d+\\/?$/.test(h))) {\n const l = pageLinks.filter((h) => /\\/(page\\/)?\\d+\\/?$/.test(h));\n console.log('PaginationStrategyPathnameParams', l);\n return PaginationStrategyPathnameParams;\n }\n\n const type5Links = Array.from(document.querySelectorAll('[data-parameters *= from]'));\n if (type5Links.length > 0) {\n console.log('PaginationStrategyDataParams', type5Links);\n return PaginationStrategyDataParams;\n }\n\n console.error('Found No Strategy');\n return PaginationStrategy;\n };\n\n const paginationStrategy = new (getStrategy())(options);\n\n return paginationStrategy;\n}\n\n// const p = new PaginationStrategyPathnameParams();\n\n// console.table({\n// pagination: `class:${p.getPaginationElement().className} + id:${p.getPaginationElement().id}`,\n// last: p.getPaginationLast(),\n// offset: p.getPaginationOffset(),\n// generator: p.getPaginationUrlGenerator()(1488),\n// });\n","export function chunks<T>(arr: Array<T>, n: number): Array<Array<T>> {\n return Array.from({ length: Math.ceil(arr.length / n) }, (_, i) => arr.slice(i * n, i * n + n));\n}\n\nexport function range(size: number, startAt: number = 1, step: number = 1): number[] {\n return Array.from({ length: size }, (_, index) => startAt + index * step);\n}\n","// https://2ality.com/2016/10/asynchronous-iteration.html\nexport async function computeAsyncOneAtTime(iterable: Iterable<() => Promise<void>>) {\n const res = [];\n for await (const f of iterable) {\n res.push(await f());\n }\n return res;\n}\n\nexport function wait(milliseconds: number) {\n return new Promise((resolve) => setTimeout(resolve, milliseconds));\n}\n\ninterface AsyncPoolTask {\n v: () => Promise<void>;\n p: number;\n}\n\nexport class AsyncPool {\n private cur = 0;\n private finished: Promise<boolean>;\n private _resolve?: (value: boolean | PromiseLike<boolean>) => void;\n\n public static async doNAsyncAtOnce(max = 1, pool: Array<AsyncPoolTask | (() => Promise<void>)> = []) {\n const spool = new AsyncPool(max);\n pool.forEach(f => spool.push(f));\n return spool.run();\n }\n\n constructor(private max = 1, private pool: Array<AsyncPoolTask> = []) {\n this.finished = new Promise((resolve) => {\n this._resolve = resolve;\n });\n }\n\n private getHighPriorityFirst(p = 0): (() => Promise<void>) | undefined {\n if (p > 3 || this.pool.length === 0) return undefined;\n const i = this.pool.findIndex((e) => e.p === p);\n if (i >= 0) {\n const res = this.pool[i].v;\n this.pool.splice(i, 1);\n return res;\n }\n return this.getHighPriorityFirst(p + 1);\n }\n\n private async runTask() {\n this.cur++;\n const f = this.getHighPriorityFirst();\n await f?.();\n this.cur--;\n this.runTasks();\n }\n\n private runTasks() {\n if (!this.pool.length) {\n this._resolve?.(true);\n return;\n }\n if (this.cur < this.max) {\n this.runTask();\n this.runTasks();\n }\n }\n\n public async run() {\n this.runTasks();\n return this.finished;\n }\n\n public push(x: AsyncPoolTask | (() => Promise<void>)) {\n this.pool.push('p' in x ? x : { v: x, p: 0 });\n }\n}\n\n","export function isMob() {\n return /iPhone|Android/i.test(navigator.userAgent);\n}","export function listenEvents(dom: HTMLElement | Element, events: Array<string>, callback: (e: Event) => void): void {\n for (const e of events) {\n dom.addEventListener(e, callback, true);\n }\n}\n\nexport class Tick {\n private tick?: number;\n private callbackFinal?: () => void;\n\n constructor(private delay: number, private startImmediate: boolean = true) {}\n\n public start(callback: () => void, callbackFinal?: () => void): void {\n this.stop();\n this.callbackFinal = callbackFinal;\n if (this.startImmediate) callback();\n this.tick = window.setInterval(callback, this.delay);\n }\n\n public stop(): void {\n if (this.tick !== undefined) {\n clearInterval(this.tick);\n this.tick = undefined;\n }\n if (this.callbackFinal) {\n this.callbackFinal();\n this.callbackFinal = undefined;\n }\n }\n}\n","export function circularShift(n: number, c = 6, s = 1): number {\n return (n + s) % c || c;\n}\n"],"names":["target","s","observer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"billy-herrington-utils.umd.js","sources":["../src/utils/observers/index.ts","../src/utils/strings/index.ts","../src/userscripts/data-manager/index.ts","../src/utils/dom/index.ts","../src/utils/fetch/index.ts","../src/userscripts/infinite-scroll/index.ts","../src/userscripts/jabroni-outfit-wrap/index.ts","../src/userscripts/pagination-parsing/pagination-utils/index.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategy.ts","../src/utils/parsers/index.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategyDataParams.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategyPathnameParams.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategySearchParams.ts","../src/userscripts/pagination-parsing/index.ts","../src/utils/arrays/index.ts","../src/utils/async/index.ts","../src/utils/device/index.ts","../src/utils/events/index.ts","../src/utils/math/index.ts"],"sourcesContent":["export class Observer {\n public observer: IntersectionObserver;\n constructor(private callback: (entry: Element) => void) {\n this.observer = new IntersectionObserver(this.handleIntersection.bind(this));\n }\n\n observe(target: Element) {\n this.observer.observe(target);\n }\n\n throttle(target: Element, throttleTime: number) {\n this.observer.unobserve(target);\n setTimeout(() => this.observer.observe(target), throttleTime);\n }\n\n handleIntersection(entries: Iterable<IntersectionObserverEntry>) {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n this.callback(entry.target);\n }\n }\n }\n\n static observeWhile(\n target: Element,\n callback: () => Promise<boolean> | boolean,\n throttleTime: number,\n ) {\n const observer_ = new Observer(async (target: Element) => {\n const condition = await callback();\n if (condition) observer_.throttle(target, throttleTime);\n });\n observer_.observe(target);\n return observer_;\n }\n}\n\nexport class LazyImgLoader {\n public lazyImgObserver: Observer;\n private attributeName = 'data-lazy-load';\n\n constructor(shouldDelazify: (target: Element) => boolean) {\n this.lazyImgObserver = new Observer((target: Element) => {\n if (shouldDelazify(target)) {\n this.delazify(target as HTMLImageElement);\n }\n });\n }\n\n lazify(_target: Element, img: HTMLImageElement, imgSrc: string) {\n if (!img || !imgSrc) return;\n img.setAttribute(this.attributeName, imgSrc);\n img.src = '';\n this.lazyImgObserver.observe(img);\n }\n\n delazify = (target: HTMLImageElement) => {\n this.lazyImgObserver.observer.unobserve(target);\n target.src = target.getAttribute(this.attributeName) as string;\n target.removeAttribute(this.attributeName);\n };\n}\n","export function stringToWords(s: string): Array<string> {\n return s.split(\",\").map(s => s.trim().toLowerCase()).filter(_ => _);\n}\n\nexport function sanitizeStr(s: string) {\n return s?.replace(/\\n|\\t/, ' ').replace(/ {2,}/, ' ').trim().toLowerCase() || \"\";\n}\n","import { LazyImgLoader } from '../../utils/observers';\nimport { stringToWords } from '../../utils/strings';\n\ninterface DataFilterState {\n filterPublic: boolean;\n filterPrivate: boolean;\n filterHD: boolean;\n filterDuration: boolean;\n filterDurationFrom: number;\n filterDurationTo: number;\n filterExclude: boolean;\n filterExcludeWords: string;\n filterInclude: boolean;\n filterIncludeWords: string;\n}\n\ninterface FilterResult {\n tag: string;\n condition: boolean;\n}\n\ntype FilterInput = Record<string, string | number | boolean | HTMLElement>;\ntype FilterFunction = (v: FilterInput) => FilterResult;\n\nclass DataFilter {\n public filters: { [key: string]: () => FilterFunction };\n\n constructor(\n private rules: IRules,\n private state: DataFilterState,\n ) {\n this.state = state;\n\n const methods = Object.getOwnPropertyNames(this);\n this.filters = methods.reduce((acc: { [key: string]: () => FilterFunction }, k) => {\n if (k in this.state) {\n acc[k] = this[k as keyof DataFilter] as unknown as () => FilterFunction;\n GM_addStyle(`.filter-${k.toLowerCase().slice(6)} { display: none !important; }`);\n }\n return acc;\n }, {});\n }\n\n filterPublic = (): FilterFunction => {\n return (v: FilterInput) => {\n const isPublic = !this.rules.isPrivate(v.element as HTMLElement);\n return {\n condition: this.state.filterPublic && isPublic,\n tag: 'filter-public',\n };\n };\n };\n\n filterPrivate = (): FilterFunction => {\n return (v: FilterInput) => {\n const isPrivate = this.rules.isPrivate(v.element as HTMLElement);\n return {\n condition: this.state.filterPrivate && isPrivate,\n tag: 'filter-private',\n };\n };\n };\n\n filterHD = (): FilterFunction => {\n return (v: FilterInput) => {\n const isHD = this.rules.isHD(v.element as HTMLElement);\n return {\n condition: this.state.filterHD && isHD,\n tag: 'filter-hd',\n };\n };\n };\n\n filterDuration = (): FilterFunction => {\n return (v: FilterInput) => {\n const notInRange =\n (v.duration as number) < this.state.filterDurationFrom ||\n (v.duration as number) > this.state.filterDurationTo;\n return {\n condition: this.state.filterDuration && notInRange,\n tag: 'filter-duration',\n };\n };\n };\n\n filterExclude = (): FilterFunction => {\n const tags = DataManager.filterDSLToRegex(this.state.filterExcludeWords);\n return (v: FilterInput) => {\n const containTags = tags.some((tag) => tag.test(v.title as string));\n return {\n condition: this.state.filterExclude && containTags,\n tag: 'filter-exclude',\n };\n };\n };\n\n filterInclude = (): FilterFunction => {\n const tags = DataManager.filterDSLToRegex(this.state.filterIncludeWords);\n return (v: FilterInput) => {\n const containTagsNot = tags.some((tag) => !tag.test(v.title as string));\n return {\n condition: this.state.filterInclude && containTagsNot,\n tag: 'filter-include',\n };\n };\n };\n}\n\ninterface IRules {\n getThumbs: (html: HTMLElement) => HTMLElement[];\n getThumbUrl: (thumbElement: HTMLElement) => string;\n getThumbData: (thumbElement: HTMLElement) => { title: string; duration: number };\n getThumbImgData: (thumbElement: HTMLElement) => { img: HTMLElement; imgSrc: string };\n container: HTMLElement;\n isPrivate: (element: HTMLElement) => boolean;\n isHD: (element: HTMLElement) => boolean;\n}\n\nexport class DataManager {\n private rules: IRules;\n private state: DataFilterState;\n private data: Map<string, FilterInput>;\n private lazyImgLoader: LazyImgLoader;\n public dataFilters: { [key: string]: () => FilterFunction };\n\n constructor(rules: IRules, state: DataFilterState) {\n this.rules = rules;\n this.state = state;\n this.data = new Map();\n this.lazyImgLoader = new LazyImgLoader(\n (target: Element) => !this.isFiltered(target as HTMLElement),\n );\n this.dataFilters = new DataFilter(rules, state).filters;\n\n const targets = [window, (globalThis as any).unsafeWindow].filter(Boolean);\n targets.forEach((w: any) => {\n Object.assign(w, {\n sortByDuration: () => this.sort('duration'),\n sortByViews: () => this.sort('view'),\n });\n });\n }\n\n static filterDSLToRegex(str: string): RegExp[] {\n const toFullWord = (w: string) => `(^|\\\\ )${w}($|\\\\ )`;\n const str_ = str.replace(/f:(\\w+)/g, (_, w) => toFullWord(w));\n return stringToWords(str_).map((expr: string) => new RegExp(expr, 'i'));\n }\n\n isFiltered(el: HTMLElement): boolean {\n return el.className.includes('filtered');\n }\n\n applyFilters = (filters: { [key: string]: boolean }, offset = 0): void => {\n const filtersToApply = Object.keys(filters)\n .filter((k) => Object.hasOwn(this.dataFilters, k))\n .map((k) => this.dataFilters[k]());\n\n if (filtersToApply.length === 0) return;\n\n const updates: (() => void)[] = [];\n let offset_counter = 1;\n for (const v of this.data.values()) {\n if (++offset_counter > offset) {\n for (const f of filtersToApply) {\n const { tag, condition } = f(v as FilterInput);\n updates.push(() => (v.element as HTMLElement).classList.toggle(tag, condition));\n }\n }\n }\n\n requestAnimationFrame(() => {\n updates.forEach((update) => {\n update();\n });\n });\n };\n\n filterAll = (offset?: number): void => {\n const filters = Object.assign(\n {},\n ...Object.keys(this.dataFilters).map((f) => ({\n [f]: this.state[f as keyof DataFilterState],\n })),\n );\n this.applyFilters(filters, offset);\n };\n\n parseData = (\n html: HTMLElement,\n container?: HTMLElement,\n removeDuplicates = false,\n shouldLazify = true,\n ): void => {\n const thumbs = this.rules.getThumbs(html);\n const data_offset = this.data.size;\n\n for (const thumbElement of thumbs) {\n const url = this.rules.getThumbUrl(thumbElement);\n if (!url || this.data.has(url)) {\n if (removeDuplicates) thumbElement.remove();\n continue;\n }\n\n const data = this.rules.getThumbData(thumbElement);\n this.data.set(url, { element: thumbElement, ...data });\n\n if (shouldLazify) {\n const { img, imgSrc } = this.rules.getThumbImgData(thumbElement);\n this.lazyImgLoader.lazify(thumbElement, img as HTMLImageElement, imgSrc);\n }\n\n const parent = container || this.rules.container;\n if (!parent.contains(thumbElement)) parent.appendChild(thumbElement);\n }\n\n this.filterAll(data_offset);\n };\n\n sort(propName: string) {\n if (this.data.size < 2) return;\n\n const sorted = Array.from(this.data.keys()).sort((b, a) => {\n return (\n ((this.data.get(a) as FilterInput)[propName] as number) -\n ((this.data.get(b) as FilterInput)[propName] as number)\n );\n });\n\n const container = ((this.data.get(sorted[0]) as FilterInput).element as HTMLElement)\n .parentElement as HTMLElement;\n\n sorted.forEach((s) => {\n const e = (this.data.get(s) as FilterInput).element as HTMLElement;\n container.append(e);\n });\n }\n}\n","export function parseDom(html: string): HTMLElement {\n const parsed = new DOMParser().parseFromString(html, 'text/html').body;\n return parsed.children.length > 1 ? parsed : parsed.firstElementChild as HTMLElement;\n}\n\nexport function copyAttributes(target: HTMLElement | Element, source: HTMLElement | Element) {\n for (const attr of source.attributes) {\n attr.nodeValue && target.setAttribute(attr.nodeName, attr.nodeValue);\n }\n}\n\nexport function replaceElementTag(e: HTMLElement | Element, tagName: string) {\n const newTagElement = document.createElement(tagName);\n copyAttributes(newTagElement, e);\n newTagElement.innerHTML = e.innerHTML;\n e.parentNode?.replaceChild(newTagElement, e);\n return newTagElement;\n}\n\nexport function getAllUniqueParents(elements: HTMLCollection): Array<HTMLElement | Element> {\n return Array.from(elements).reduce((acc, v) => {\n if (v.parentElement && !acc.includes(v.parentElement as HTMLElement)) { acc.push(v.parentElement); }\n return acc;\n }, [] as Array<HTMLElement | Element>);\n}\n\nexport function findNextSibling(el: HTMLElement | Element) {\n if (el.nextElementSibling) return el.nextElementSibling;\n if (el.parentElement) return findNextSibling(el.parentElement);\n return null;\n}\n\nexport function waitForElementExists(parent: HTMLElement | Element, selector: string, callback: (el: Element) => void): void {\n const observer = new MutationObserver((_mutations) => {\n const el = parent.querySelector(selector);\n if (el) {\n observer.disconnect();\n callback(el);\n }\n });\n observer.observe(document.body, { childList: true, subtree: true });\n}\n\nexport function watchElementChildrenCount(element: HTMLElement | Element,\n callback: (observer: MutationObserver, count: number) => void): void {\n let count = element.children.length;\n const observer = new MutationObserver((mutationList, observer) => {\n for (const mutation of mutationList) {\n if (mutation.type === \"childList\") {\n if (count !== element.children.length) {\n count = element.children.length;\n callback(observer, count);\n }\n }\n }\n });\n observer.observe(element, { childList: true });\n}\n\nexport function watchDomChangesWithThrottle(\n element: HTMLElement | Element, \n callback: () => void,\n throttle = 1000,\n times = Infinity,\n options: Record<string, boolean> = { childList: true, subtree: true, attributes: true }\n) {\n let lastMutationTime: number;\n let timeout: number;\n let times_ = times;\n const observer = new MutationObserver((_mutationList, _observer) => {\n if (times_ !== Infinity && times_ < 1) {\n observer.disconnect();\n return;\n }\n times_--;\n const now = Date.now();\n if (lastMutationTime && now - lastMutationTime < throttle) {\n timeout && clearTimeout(timeout);\n }\n timeout = setTimeout(callback, throttle);\n lastMutationTime = now;\n });\n observer.observe(element, options);\n return observer;\n}\n\nexport function downloader(options = { append: \"\", after: \"\", button: \"\", cbBefore: () => { } }) {\n const btn = parseDom(options.button);\n\n if (options.append) document.querySelector(options.append)?.append(btn);\n if (options.after) document.querySelector(options.after)?.after(btn);\n\n btn.addEventListener('click', (e) => {\n e.preventDefault();\n\n if (options.cbBefore) options.cbBefore();\n\n waitForElementExists(document.body, 'video', (video: Element) => {\n window.location.href = video.getAttribute('src') as string;\n });\n });\n}\n\nexport function exterminateVideo(video: HTMLVideoElement) {\n video.removeAttribute('src');\n video.load();\n video.remove();\n}","import { parseDom } from '../dom';\n\nexport const MOBILE_UA = [\n 'Mozilla/5.0 (Linux; Android 10; K)',\n 'AppleWebKit/537.36 (KHTML, like Gecko)',\n 'Chrome/114.0.0.0 Mobile Safari/537.36',\n].join(' ');\n\nexport function fetchWith(\n url: string,\n options: Record<string, boolean> = { html: false, mobile: false },\n) {\n const reqOpts = {};\n if (options.mobile) Object.assign(reqOpts, { headers: new Headers({ 'User-Agent': MOBILE_UA }) });\n return fetch(url, reqOpts)\n .then((r) => r.text())\n .then((r) => (options.html ? parseDom(r) : r));\n}\n\nexport const fetchHtml = (url: string) => fetchWith(url, { html: true }) as Promise<HTMLElement>;\n\nexport const fetchText = (url: string) => fetchWith(url) as Promise<string>;\n\nexport function objectToFormData(object: Record<string, number | boolean | string>): FormData {\n const formData = new FormData();\n Object.entries(object).forEach(([k, v]) => formData.append(k, v as string));\n return formData;\n}\n","import { fetchHtml } from '../../utils/fetch';\nimport { Observer } from '../../utils/observers';\n\ninterface IInfiniteScroller {\n delay?: number;\n enabled?: boolean;\n writeHistory?: boolean;\n paginationOffset: number;\n paginationLast: number;\n paginationElement: HTMLElement;\n paginationUrlGenerator: (offset: number) => string;\n parseData: (document: HTMLElement) => void;\n intersectionObservable?: HTMLElement;\n alternativeGenerator?: () => OffsetGenerator;\n}\n\ninterface GeneratorResult {\n url: string;\n offset: number;\n}\n\ntype OffsetGenerator = Generator<GeneratorResult> | AsyncGenerator<GeneratorResult>;\n\nexport class InfiniteScroller {\n public paginationGenerator: OffsetGenerator;\n public enabled: boolean;\n public delay: number;\n public paginationOffset: number;\n public paginationLast: number;\n public writeHistory: boolean;\n private parseData: (document: HTMLElement) => void;\n\n constructor({\n enabled = true,\n delay = 300,\n writeHistory = false,\n paginationOffset,\n paginationLast,\n paginationElement,\n paginationUrlGenerator,\n parseData,\n alternativeGenerator,\n intersectionObservable,\n }: IInfiniteScroller) {\n this.enabled = enabled;\n this.delay = delay;\n this.writeHistory = writeHistory;\n this.paginationOffset = paginationOffset;\n this.paginationLast = paginationLast;\n this.parseData = parseData;\n\n this.paginationGenerator =\n alternativeGenerator?.() ??\n InfiniteScroller.createPaginationGenerator(\n paginationOffset,\n paginationLast,\n paginationUrlGenerator,\n );\n\n const observable = intersectionObservable || paginationElement;\n Observer.observeWhile(observable, this.generatorConsumer, this.delay);\n }\n\n private onScrollCBs: Array<(scroller: InfiniteScroller) => void> = [];\n\n public onScroll(callback: (scroller: InfiniteScroller) => void, initCall = false) {\n if (initCall) callback(this);\n this.onScrollCBs.push(callback);\n return this;\n }\n\n private _onScroll() {\n this.onScrollCBs.forEach((cb) => {\n cb(this);\n });\n }\n\n generatorConsumer = async () => {\n if (!this.enabled) return false;\n const { value: { url, offset } = {}, done } = await this.paginationGenerator.next();\n if (!done) {\n const nextPageHTML = await fetchHtml(url);\n const prevScrollPos = document.documentElement.scrollTop;\n this.paginationOffset = offset;\n this.parseData(nextPageHTML);\n this._onScroll();\n window.scrollTo(0, prevScrollPos);\n if (this.writeHistory) {\n history.replaceState({}, '', url);\n }\n }\n return !done;\n };\n\n static *createPaginationGenerator(\n currentPage: number,\n totalPages: number,\n generateURL: (offset: number) => string,\n ): OffsetGenerator {\n for (let offset = currentPage + 1; offset <= totalPages; offset++) {\n const url = generateURL(offset);\n yield { url, offset };\n }\n }\n}\n","import { InfiniteScroller } from '../infinite-scroll';\nimport type { IRules } from '../rules';\n\nexport interface JabroniStore {\n state: Record<string, boolean | string | number>;\n localState: Record<string, boolean | string | number>;\n subscribe: (callback: () => void) => void;\n}\n\nexport function createInfiniteScroller(\n store: JabroniStore,\n parseData: (document: HTMLElement) => void,\n rules: IRules,\n) {\n const enabled = store.state.infiniteScrollEnabled as boolean;\n\n const paginationOffset = rules.paginationStrategy.getPaginationOffset();\n const paginationElement = rules.paginationStrategy.getPaginationElement();\n const paginationLast = rules.paginationStrategy.getPaginationLast();\n const paginationUrlGenerator = rules.paginationStrategy.getPaginationUrlGenerator();\n\n const iscroller = new InfiniteScroller({\n enabled,\n parseData,\n paginationLast,\n paginationOffset,\n paginationElement,\n paginationUrlGenerator,\n ...rules,\n }).onScroll(({ paginationLast, paginationOffset }) => {\n store.localState.pagIndexLast = paginationLast;\n store.localState.pagIndexCur = paginationOffset;\n }, true);\n\n store.subscribe(() => {\n iscroller.enabled = store.state.infiniteScrollEnabled as boolean;\n });\n\n return iscroller;\n}\n","export function getPaginationLinks(\n doc: HTMLElement | Document = document,\n url: Location | URL | string = location.href,\n pathnameSelector = /\\/(page\\/)?\\d+\\/?$/,\n): string[] {\n const currentUrl = parseURL(url);\n currentUrl.pathname = currentUrl.pathname.replace(pathnameSelector, '/');\n const pageLinks = Array.from(\n (doc.querySelectorAll('a[href]') as NodeListOf<HTMLAnchorElement>) || [],\n (a) => a.href,\n ).filter((h) => {\n try {\n const linkUrl = new URL(h.replace(/#$/, ''), doc.baseURI || currentUrl.origin);\n return (\n linkUrl.origin === currentUrl.origin && linkUrl.pathname.startsWith(currentUrl.pathname)\n );\n } catch {\n return false;\n }\n });\n return pageLinks;\n}\n\nexport function parseURL(s: HTMLAnchorElement | Location | URL | string): URL {\n if (typeof s === 'string') return new URL(s);\n return new URL(s.href);\n}\n","import { parseURL } from '../pagination-utils';\n\nexport interface IPaginationStrategy {\n url?: URL | Location | string;\n doc?: Document | HTMLElement;\n paginationSelector?: string;\n fixPaginationLast?: (n: number, offset?: number) => number;\n pathnameSelector?: RegExp;\n searchParamSelector?: string;\n offsetMin?: number;\n}\n\nexport class PaginationStrategy {\n public doc = document;\n public url: URL;\n public paginationSelector = '.pagination';\n public fixPaginationLast?: (n: number, offset?: number) => number;\n public offsetMin = 1;\n\n constructor(options?: IPaginationStrategy) {\n if (options) {\n Object.entries(options).forEach(([k, v]) => {\n Object.assign(this, { [k]: v });\n });\n }\n\n this.url = parseURL(options?.url || this.doc.URL);\n }\n\n getPaginationElement() {\n return (this.doc.querySelector(this.paginationSelector) || this.doc) as HTMLElement;\n }\n\n getPaginationOffset() {\n return this.offsetMin;\n }\n getPaginationLast() {\n return this.offsetMin;\n }\n\n getPaginationUrlGenerator() {\n return (_: number) => this.url.href;\n }\n}\n","export function formatTimeToHHMMSS(timeString: string): string {\n const regex: RegExp = /(?:(\\d+)\\s*h\\s*)?(?:(\\d+)\\s*mi?n?\\s*)?(?:(\\d+)\\s*sec)?/;\n const match: RegExpMatchArray | null = timeString.match(regex);\n const h: number = parseInt(match?.[1] || '0');\n const m: number = parseInt(match?.[2] || '0');\n const s: number = parseInt(match?.[3] || '0');\n const pad = (num: number): string => String(num).padStart(2, '0');\n return `${pad(h)}:${pad(m)}:${pad(s)}`;\n}\n\n// \"01:22:03\" -> 4923\nexport function timeToSeconds(t: string): number {\n const r = /sec|min|h|m/.test(t) ? formatTimeToHHMMSS(t) : t;\n return (r?.match(/\\d+/gm) || [0])\n .reverse()\n .map((s, i) => parseInt(s as string) * 60 ** i)\n .reduce((a, b) => a + b);\n}\n\nexport function parseIntegerOr(n: string | number, or: number): number {\n return (num => Number.isNaN(num) ? or : num)(parseInt(n as string));\n}\n\n// \"data:02;body+head:async;void:;zero:;\"\nexport function parseDataParams(str: string): Record<string, string> {\n const paramsStr = decodeURI(str.trim()).split(';');\n return paramsStr.reduce((acc, s) => {\n const parsed = s.match(/([\\+\\w]+):([\\w\\-\\ ]+)?/);\n if (parsed) {\n const [, key, value] = parsed;\n if (value) {\n key.split('+').forEach(p => { acc[p] = value; });\n }\n }\n return acc;\n }, {} as Record<string, string>);\n}\n\nexport function parseCSSUrl(s: string) {\n return s.replace(/url\\(\"|\\\"\\).*/g, '');\n}\n","import { parseDataParams } from '../../../utils/parsers';\nimport { PaginationStrategy } from './PaginationStrategy';\n\nexport class PaginationStrategyDataParams extends PaginationStrategy {\n getPaginationLast() {\n const links = this.getPaginationElement()?.querySelectorAll('[data-parameters *= from]');\n const pages = Array.from(links || [], (l) => {\n const p = l.getAttribute('data-parameters');\n const v = p?.match(/from\\w*:(\\d+)/)?.[1] || this.offsetMin.toString();\n return parseInt(v);\n });\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n const link = this.getPaginationElement()?.querySelector(\n '.prev[data-parameters *= from], .prev [data-parameters *= from]',\n );\n if (!link) return this.offsetMin;\n const p = link.getAttribute('data-parameters');\n const v = p?.match(/from\\w*:(\\d+)/)?.[1] || this.offsetMin.toString();\n return parseInt(v);\n }\n\n getPaginationUrlGenerator() {\n const url = new URL(this.url.href);\n\n const parametersElement = this.getPaginationElement()?.querySelector(\n 'a[data-block-id][data-parameters]',\n );\n const block_id = parametersElement?.getAttribute('data-block-id') || '';\n const parameters = parseDataParams(parametersElement?.getAttribute('data-parameters') || '');\n\n const attrs: Record<string, string> = {\n block_id,\n function: 'get_block',\n mode: 'async',\n ...parameters,\n };\n\n Object.keys(attrs).forEach((k) => {\n url.searchParams.set(k, attrs[k]);\n });\n\n const paginationUrlGenerator = (n: number) => {\n Object.keys(attrs).forEach((k) => {\n k.includes('from') && url.searchParams.set(k, n.toString());\n });\n url.searchParams.set('_', Date.now().toString());\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import { getPaginationLinks } from '../pagination-utils';\nimport { PaginationStrategy } from './PaginationStrategy';\n\n// const fixPaginationLast = (n) => {\n// if difference < 9 = 999\n// }\n// maybe update doc after scroll to fix issues\n\nexport class PaginationStrategyPathnameParams extends PaginationStrategy {\n public pathnameSelector = /\\/(\\d+)\\/?$/;\n\n extractPage = (a: HTMLAnchorElement | Location | string): number => {\n const href = typeof a === 'string' ? a : a.href;\n const { pathname } = new URL(href, this.doc.baseURI || this.url.origin);\n return parseInt(pathname.match(this.pathnameSelector)?.pop() || this.offsetMin.toString());\n };\n\n getPaginationLast() {\n const links = getPaginationLinks(\n this.getPaginationElement(),\n this.url.href,\n this.pathnameSelector,\n );\n const pages = Array.from(links, this.extractPage);\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n return this.extractPage(this.url.href);\n }\n\n getPaginationUrlGenerator(url_: URL = this.url) {\n const url = new URL(url_.href);\n\n const pathnameSelectorPlaceholder = this.pathnameSelector\n .toString()\n .replace(/[/|\\\\|$|?|(|)]+/g, '/');\n\n if (!this.pathnameSelector.test(url.pathname)) {\n url.pathname = url.pathname\n .concat(pathnameSelectorPlaceholder.replace(/d\\+/, this.offsetMin.toString()))\n .replace(/\\/{2,}/g, '/');\n }\n\n const paginationUrlGenerator = (offset: number) => {\n url.pathname = url.pathname.replace(\n this.pathnameSelector,\n pathnameSelectorPlaceholder.replace(/d\\+/, offset.toString()),\n );\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import { getPaginationLinks } from '../pagination-utils';\nimport { PaginationStrategy } from './PaginationStrategy';\n\nexport class PaginationStrategySearchParams extends PaginationStrategy {\n public searchParamSelector = 'page';\n\n getPaginationElement() {\n return (this.doc.querySelector(this.paginationSelector) || this.doc) as HTMLElement;\n }\n\n extractPage(a: HTMLAnchorElement | Location | URL | string): number {\n const href = typeof a === 'string' ? a : a.href;\n const p = new URL(href).searchParams.get(this.searchParamSelector) as string;\n return parseInt(p) || this.offsetMin;\n }\n\n getPaginationLast() {\n const links = getPaginationLinks(this.getPaginationElement(), this.url.href).filter((h) =>\n /(page|p)=\\d+/.test(h),\n );\n const pages = links.map(this.extractPage);\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n if (this.doc === document) {\n return this.extractPage(this.url);\n }\n const link = this.getPaginationElement().querySelector(\n `a.active[href *= \"${this.searchParamSelector}=\"]`,\n ) as HTMLAnchorElement;\n return this.extractPage(link);\n }\n\n getPaginationUrlGenerator() {\n const url = new URL(this.url.href);\n\n const paginationUrlGenerator = (offset: number) => {\n url.searchParams.set(this.searchParamSelector, offset.toString());\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import {\n type IPaginationStrategy,\n PaginationStrategy,\n PaginationStrategyDataParams,\n PaginationStrategyPathnameParams,\n PaginationStrategySearchParams,\n} from './pagination-strategies';\nimport { getPaginationLinks } from './pagination-utils';\n\nexport function getPaginationStrategy(options: IPaginationStrategy) {\n const { doc = document, url = location.href } = options;\n const pageLinks = getPaginationLinks(doc, url);\n\n console.log({ pageLinks });\n\n const getStrategy = (): typeof PaginationStrategy => {\n if (pageLinks.some((h) => /(page|p)=\\d+/.test(h))) {\n const l = pageLinks.filter((h) => /(page|p)=\\d+/.test(h));\n console.log('PaginationStrategySearchParams', l);\n return PaginationStrategySearchParams;\n }\n\n if (pageLinks.some((h) => /\\/(page\\/)?\\d+\\/?$/.test(h))) {\n const l = pageLinks.filter((h) => /\\/(page\\/)?\\d+\\/?$/.test(h));\n console.log('PaginationStrategyPathnameParams', l);\n return PaginationStrategyPathnameParams;\n }\n\n const type5Links = Array.from(document.querySelectorAll('[data-parameters *= from]'));\n if (type5Links.length > 0) {\n console.log('PaginationStrategyDataParams', type5Links);\n return PaginationStrategyDataParams;\n }\n\n console.error('Found No Strategy');\n return PaginationStrategy;\n };\n\n const paginationStrategy = new (getStrategy())(options);\n\n return paginationStrategy;\n}\n\n// const p = new PaginationStrategyPathnameParams();\n\n// console.table({\n// pagination: `class:${p.getPaginationElement().className} + id:${p.getPaginationElement().id}`,\n// last: p.getPaginationLast(),\n// offset: p.getPaginationOffset(),\n// generator: p.getPaginationUrlGenerator()(1488),\n// });\n","export function chunks<T>(arr: Array<T>, n: number): Array<Array<T>> {\n return Array.from({ length: Math.ceil(arr.length / n) }, (_, i) => arr.slice(i * n, i * n + n));\n}\n\nexport function range(size: number, startAt: number = 1, step: number = 1): number[] {\n return Array.from({ length: size }, (_, index) => startAt + index * step);\n}\n","// https://2ality.com/2016/10/asynchronous-iteration.html\nexport async function computeAsyncOneAtTime(iterable: Iterable<() => Promise<void>>) {\n const res = [];\n for await (const f of iterable) {\n res.push(await f());\n }\n return res;\n}\n\nexport function wait(milliseconds: number) {\n return new Promise((resolve) => setTimeout(resolve, milliseconds));\n}\n\ninterface AsyncPoolTask {\n v: () => Promise<void>;\n p: number;\n}\n\nexport class AsyncPool {\n private cur = 0;\n private finished: Promise<boolean>;\n private _resolve?: (value: boolean | PromiseLike<boolean>) => void;\n\n public static async doNAsyncAtOnce(max = 1, pool: Array<AsyncPoolTask | (() => Promise<void>)> = []) {\n const spool = new AsyncPool(max);\n pool.forEach(f => spool.push(f));\n return spool.run();\n }\n\n constructor(private max = 1, private pool: Array<AsyncPoolTask> = []) {\n this.finished = new Promise((resolve) => {\n this._resolve = resolve;\n });\n }\n\n private getHighPriorityFirst(p = 0): (() => Promise<void>) | undefined {\n if (p > 3 || this.pool.length === 0) return undefined;\n const i = this.pool.findIndex((e) => e.p === p);\n if (i >= 0) {\n const res = this.pool[i].v;\n this.pool.splice(i, 1);\n return res;\n }\n return this.getHighPriorityFirst(p + 1);\n }\n\n private async runTask() {\n this.cur++;\n const f = this.getHighPriorityFirst();\n await f?.();\n this.cur--;\n this.runTasks();\n }\n\n private runTasks() {\n if (!this.pool.length) {\n this._resolve?.(true);\n return;\n }\n if (this.cur < this.max) {\n this.runTask();\n this.runTasks();\n }\n }\n\n public async run() {\n this.runTasks();\n return this.finished;\n }\n\n public push(x: AsyncPoolTask | (() => Promise<void>)) {\n this.pool.push('p' in x ? x : { v: x, p: 0 });\n }\n}\n\n","export function isMob() {\n return /iPhone|Android/i.test(navigator.userAgent);\n}","export function listenEvents(dom: HTMLElement | Element, events: Array<string>, callback: (e: Event) => void): void {\n for (const e of events) {\n dom.addEventListener(e, callback, true);\n }\n}\n\nexport class Tick {\n private tick?: number;\n private callbackFinal?: () => void;\n\n constructor(private delay: number, private startImmediate: boolean = true) {}\n\n public start(callback: () => void, callbackFinal?: () => void): void {\n this.stop();\n this.callbackFinal = callbackFinal;\n if (this.startImmediate) callback();\n this.tick = window.setInterval(callback, this.delay);\n }\n\n public stop(): void {\n if (this.tick !== undefined) {\n clearInterval(this.tick);\n this.tick = undefined;\n }\n if (this.callbackFinal) {\n this.callbackFinal();\n this.callbackFinal = undefined;\n }\n }\n}\n","export function circularShift(n: number, c = 6, s = 1): number {\n return (n + s) % c || c;\n}\n"],"names":["target","s","observer","paginationLast","paginationOffset"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -26,7 +26,7 @@ export declare function computeAsyncOneAtTime(iterable: Iterable<() => Promise<v
|
|
|
26
26
|
|
|
27
27
|
export declare function copyAttributes(target: HTMLElement | Element, source: HTMLElement | Element): void;
|
|
28
28
|
|
|
29
|
-
export declare function createInfiniteScroller(store: JabroniStore,
|
|
29
|
+
export declare function createInfiniteScroller(store: JabroniStore, parseData: (document: HTMLElement) => void, rules: IRules_2): InfiniteScroller;
|
|
30
30
|
|
|
31
31
|
declare interface DataFilterState {
|
|
32
32
|
filterPublic: boolean;
|
|
@@ -96,14 +96,14 @@ export declare function getAllUniqueParents(elements: HTMLCollection): Array<HTM
|
|
|
96
96
|
export declare function getPaginationStrategy(options: IPaginationStrategy): PaginationStrategy;
|
|
97
97
|
|
|
98
98
|
declare interface IInfiniteScroller {
|
|
99
|
-
delay
|
|
100
|
-
enabled
|
|
99
|
+
delay?: number;
|
|
100
|
+
enabled?: boolean;
|
|
101
101
|
writeHistory?: boolean;
|
|
102
102
|
paginationOffset: number;
|
|
103
103
|
paginationLast: number;
|
|
104
104
|
paginationElement: HTMLElement;
|
|
105
105
|
paginationUrlGenerator: (offset: number) => string;
|
|
106
|
-
|
|
106
|
+
parseData: (document: HTMLElement) => void;
|
|
107
107
|
intersectionObservable?: HTMLElement;
|
|
108
108
|
alternativeGenerator?: () => OffsetGenerator;
|
|
109
109
|
}
|
|
@@ -115,8 +115,8 @@ export declare class InfiniteScroller {
|
|
|
115
115
|
paginationOffset: number;
|
|
116
116
|
paginationLast: number;
|
|
117
117
|
writeHistory: boolean;
|
|
118
|
-
private
|
|
119
|
-
constructor({ enabled, delay, writeHistory, paginationOffset, paginationLast, paginationElement, paginationUrlGenerator,
|
|
118
|
+
private parseData;
|
|
119
|
+
constructor({ enabled, delay, writeHistory, paginationOffset, paginationLast, paginationElement, paginationUrlGenerator, parseData, alternativeGenerator, intersectionObservable, }: IInfiniteScroller);
|
|
120
120
|
private onScrollCBs;
|
|
121
121
|
onScroll(callback: (scroller: InfiniteScroller) => void, initCall?: boolean): this;
|
|
122
122
|
private _onScroll;
|
|
@@ -152,11 +152,7 @@ declare interface IRules {
|
|
|
152
152
|
|
|
153
153
|
declare interface IRules_2 {
|
|
154
154
|
paginationStrategy: PaginationStrategy;
|
|
155
|
-
delay
|
|
156
|
-
paginationOffset: number;
|
|
157
|
-
paginationLast: number;
|
|
158
|
-
paginationElement: HTMLElement;
|
|
159
|
-
paginationUrlGenerator: (n: number) => string;
|
|
155
|
+
delay?: number;
|
|
160
156
|
}
|
|
161
157
|
|
|
162
158
|
export declare function isMob(): boolean;
|
|
@@ -201,6 +197,9 @@ export declare class PaginationStrategy {
|
|
|
201
197
|
offsetMin: number;
|
|
202
198
|
constructor(options?: IPaginationStrategy);
|
|
203
199
|
getPaginationElement(): HTMLElement;
|
|
200
|
+
getPaginationOffset(): number;
|
|
201
|
+
getPaginationLast(): number;
|
|
202
|
+
getPaginationUrlGenerator(): (_: number) => string;
|
|
204
203
|
}
|
|
205
204
|
|
|
206
205
|
export declare class PaginationStrategyDataParams extends PaginationStrategy {
|
package/package.json
CHANGED
|
@@ -45,8 +45,8 @@ class DataFilter {
|
|
|
45
45
|
return (v: FilterInput) => {
|
|
46
46
|
const isPublic = !this.rules.isPrivate(v.element as HTMLElement);
|
|
47
47
|
return {
|
|
48
|
-
tag: 'filter-public',
|
|
49
48
|
condition: this.state.filterPublic && isPublic,
|
|
49
|
+
tag: 'filter-public',
|
|
50
50
|
};
|
|
51
51
|
};
|
|
52
52
|
};
|
|
@@ -55,8 +55,8 @@ class DataFilter {
|
|
|
55
55
|
return (v: FilterInput) => {
|
|
56
56
|
const isPrivate = this.rules.isPrivate(v.element as HTMLElement);
|
|
57
57
|
return {
|
|
58
|
-
tag: 'filter-private',
|
|
59
58
|
condition: this.state.filterPrivate && isPrivate,
|
|
59
|
+
tag: 'filter-private',
|
|
60
60
|
};
|
|
61
61
|
};
|
|
62
62
|
};
|
|
@@ -65,8 +65,8 @@ class DataFilter {
|
|
|
65
65
|
return (v: FilterInput) => {
|
|
66
66
|
const isHD = this.rules.isHD(v.element as HTMLElement);
|
|
67
67
|
return {
|
|
68
|
-
tag: 'filter-hd',
|
|
69
68
|
condition: this.state.filterHD && isHD,
|
|
69
|
+
tag: 'filter-hd',
|
|
70
70
|
};
|
|
71
71
|
};
|
|
72
72
|
};
|
|
@@ -77,8 +77,8 @@ class DataFilter {
|
|
|
77
77
|
(v.duration as number) < this.state.filterDurationFrom ||
|
|
78
78
|
(v.duration as number) > this.state.filterDurationTo;
|
|
79
79
|
return {
|
|
80
|
-
tag: 'filter-duration',
|
|
81
80
|
condition: this.state.filterDuration && notInRange,
|
|
81
|
+
tag: 'filter-duration',
|
|
82
82
|
};
|
|
83
83
|
};
|
|
84
84
|
};
|
|
@@ -88,8 +88,8 @@ class DataFilter {
|
|
|
88
88
|
return (v: FilterInput) => {
|
|
89
89
|
const containTags = tags.some((tag) => tag.test(v.title as string));
|
|
90
90
|
return {
|
|
91
|
-
tag: 'filter-exclude',
|
|
92
91
|
condition: this.state.filterExclude && containTags,
|
|
92
|
+
tag: 'filter-exclude',
|
|
93
93
|
};
|
|
94
94
|
};
|
|
95
95
|
};
|
|
@@ -99,8 +99,8 @@ class DataFilter {
|
|
|
99
99
|
return (v: FilterInput) => {
|
|
100
100
|
const containTagsNot = tags.some((tag) => !tag.test(v.title as string));
|
|
101
101
|
return {
|
|
102
|
-
tag: 'filter-include',
|
|
103
102
|
condition: this.state.filterInclude && containTagsNot,
|
|
103
|
+
tag: 'filter-include',
|
|
104
104
|
};
|
|
105
105
|
};
|
|
106
106
|
};
|
|
@@ -135,8 +135,8 @@ export class DataManager {
|
|
|
135
135
|
const targets = [window, (globalThis as any).unsafeWindow].filter(Boolean);
|
|
136
136
|
targets.forEach((w: any) => {
|
|
137
137
|
Object.assign(w, {
|
|
138
|
-
sortByViews: () => this.sort('view'),
|
|
139
138
|
sortByDuration: () => this.sort('duration'),
|
|
139
|
+
sortByViews: () => this.sort('view'),
|
|
140
140
|
});
|
|
141
141
|
});
|
|
142
142
|
}
|
|
@@ -2,14 +2,14 @@ import { fetchHtml } from '../../utils/fetch';
|
|
|
2
2
|
import { Observer } from '../../utils/observers';
|
|
3
3
|
|
|
4
4
|
interface IInfiniteScroller {
|
|
5
|
-
delay
|
|
6
|
-
enabled
|
|
5
|
+
delay?: number;
|
|
6
|
+
enabled?: boolean;
|
|
7
7
|
writeHistory?: boolean;
|
|
8
8
|
paginationOffset: number;
|
|
9
9
|
paginationLast: number;
|
|
10
10
|
paginationElement: HTMLElement;
|
|
11
11
|
paginationUrlGenerator: (offset: number) => string;
|
|
12
|
-
|
|
12
|
+
parseData: (document: HTMLElement) => void;
|
|
13
13
|
intersectionObservable?: HTMLElement;
|
|
14
14
|
alternativeGenerator?: () => OffsetGenerator;
|
|
15
15
|
}
|
|
@@ -28,17 +28,17 @@ export class InfiniteScroller {
|
|
|
28
28
|
public paginationOffset: number;
|
|
29
29
|
public paginationLast: number;
|
|
30
30
|
public writeHistory: boolean;
|
|
31
|
-
private
|
|
31
|
+
private parseData: (document: HTMLElement) => void;
|
|
32
32
|
|
|
33
33
|
constructor({
|
|
34
34
|
enabled = true,
|
|
35
|
-
delay =
|
|
35
|
+
delay = 300,
|
|
36
36
|
writeHistory = false,
|
|
37
37
|
paginationOffset,
|
|
38
38
|
paginationLast,
|
|
39
39
|
paginationElement,
|
|
40
40
|
paginationUrlGenerator,
|
|
41
|
-
|
|
41
|
+
parseData,
|
|
42
42
|
alternativeGenerator,
|
|
43
43
|
intersectionObservable,
|
|
44
44
|
}: IInfiniteScroller) {
|
|
@@ -47,7 +47,7 @@ export class InfiniteScroller {
|
|
|
47
47
|
this.writeHistory = writeHistory;
|
|
48
48
|
this.paginationOffset = paginationOffset;
|
|
49
49
|
this.paginationLast = paginationLast;
|
|
50
|
-
this.
|
|
50
|
+
this.parseData = parseData;
|
|
51
51
|
|
|
52
52
|
this.paginationGenerator =
|
|
53
53
|
alternativeGenerator?.() ??
|
|
@@ -82,7 +82,7 @@ export class InfiniteScroller {
|
|
|
82
82
|
const nextPageHTML = await fetchHtml(url);
|
|
83
83
|
const prevScrollPos = document.documentElement.scrollTop;
|
|
84
84
|
this.paginationOffset = offset;
|
|
85
|
-
this.
|
|
85
|
+
this.parseData(nextPageHTML);
|
|
86
86
|
this._onScroll();
|
|
87
87
|
window.scrollTo(0, prevScrollPos);
|
|
88
88
|
if (this.writeHistory) {
|
|
@@ -1,14 +1,5 @@
|
|
|
1
1
|
import { InfiniteScroller } from '../infinite-scroll';
|
|
2
|
-
import type {
|
|
3
|
-
|
|
4
|
-
interface IRules {
|
|
5
|
-
paginationStrategy: PaginationStrategy;
|
|
6
|
-
delay: number;
|
|
7
|
-
paginationOffset: number;
|
|
8
|
-
paginationLast: number;
|
|
9
|
-
paginationElement: HTMLElement;
|
|
10
|
-
paginationUrlGenerator: (n: number) => string;
|
|
11
|
-
}
|
|
2
|
+
import type { IRules } from '../rules';
|
|
12
3
|
|
|
13
4
|
export interface JabroniStore {
|
|
14
5
|
state: Record<string, boolean | string | number>;
|
|
@@ -18,13 +9,23 @@ export interface JabroniStore {
|
|
|
18
9
|
|
|
19
10
|
export function createInfiniteScroller(
|
|
20
11
|
store: JabroniStore,
|
|
21
|
-
|
|
12
|
+
parseData: (document: HTMLElement) => void,
|
|
22
13
|
rules: IRules,
|
|
23
14
|
) {
|
|
24
15
|
const enabled = store.state.infiniteScrollEnabled as boolean;
|
|
16
|
+
|
|
17
|
+
const paginationOffset = rules.paginationStrategy.getPaginationOffset();
|
|
18
|
+
const paginationElement = rules.paginationStrategy.getPaginationElement();
|
|
19
|
+
const paginationLast = rules.paginationStrategy.getPaginationLast();
|
|
20
|
+
const paginationUrlGenerator = rules.paginationStrategy.getPaginationUrlGenerator();
|
|
21
|
+
|
|
25
22
|
const iscroller = new InfiniteScroller({
|
|
26
23
|
enabled,
|
|
27
|
-
|
|
24
|
+
parseData,
|
|
25
|
+
paginationLast,
|
|
26
|
+
paginationOffset,
|
|
27
|
+
paginationElement,
|
|
28
|
+
paginationUrlGenerator,
|
|
28
29
|
...rules,
|
|
29
30
|
}).onScroll(({ paginationLast, paginationOffset }) => {
|
|
30
31
|
store.localState.pagIndexLast = paginationLast;
|
|
@@ -30,4 +30,15 @@ export class PaginationStrategy {
|
|
|
30
30
|
getPaginationElement() {
|
|
31
31
|
return (this.doc.querySelector(this.paginationSelector) || this.doc) as HTMLElement;
|
|
32
32
|
}
|
|
33
|
+
|
|
34
|
+
getPaginationOffset() {
|
|
35
|
+
return this.offsetMin;
|
|
36
|
+
}
|
|
37
|
+
getPaginationLast() {
|
|
38
|
+
return this.offsetMin;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
getPaginationUrlGenerator() {
|
|
42
|
+
return (_: number) => this.url.href;
|
|
43
|
+
}
|
|
33
44
|
}
|
package/src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategyDataParams.ts
CHANGED
|
@@ -34,9 +34,9 @@ export class PaginationStrategyDataParams extends PaginationStrategy {
|
|
|
34
34
|
const parameters = parseDataParams(parametersElement?.getAttribute('data-parameters') || '');
|
|
35
35
|
|
|
36
36
|
const attrs: Record<string, string> = {
|
|
37
|
-
mode: 'async',
|
|
38
|
-
function: 'get_block',
|
|
39
37
|
block_id,
|
|
38
|
+
function: 'get_block',
|
|
39
|
+
mode: 'async',
|
|
40
40
|
...parameters,
|
|
41
41
|
};
|
|
42
42
|
|
|
@@ -26,9 +26,9 @@ export class PaginationStrategyTrash extends PaginationStrategy {
|
|
|
26
26
|
};
|
|
27
27
|
|
|
28
28
|
getPaginationUrlGenerator() {
|
|
29
|
-
const paginationUrlGenerator = () => {
|
|
29
|
+
const paginationUrlGenerator = (_: number) => {
|
|
30
30
|
this.eHentaiNext();
|
|
31
|
-
return unsafeWindow.PAGINATION_NEXT;
|
|
31
|
+
return unsafeWindow.PAGINATION_NEXT as string;
|
|
32
32
|
};
|
|
33
33
|
|
|
34
34
|
return paginationUrlGenerator;
|