UNPKG

umbot

Version:

Universal bot(vk, telegram, viber) or skills for Yandex.Alisa, Маруся and sber

229 lines (228 loc) 7.24 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Navigation = void 0; const Text_1 = require("../../utils/standard/Text"); class Navigation { STANDARD_NEXT_TEXT = ['дальше', 'вперед']; STANDARD_OLD_TEXT = ['назад']; isUsedStandardText; nextText; oldText; elements; maxVisibleElements; thisPage; constructor(maxVisibleElements = 5) { this.isUsedStandardText = true; this.nextText = []; this.oldText = []; this.elements = []; this.maxVisibleElements = maxVisibleElements; this.thisPage = 0; } isNext(text) { let nextText; if (this.isUsedStandardText) { nextText = [...this.nextText, ...this.STANDARD_NEXT_TEXT]; } else { nextText = this.nextText; } return Text_1.Text.isSayText(nextText, text); } isOld(text) { let oldText; if (this.isUsedStandardText) { oldText = [...this.oldText, ...this.STANDARD_OLD_TEXT]; } else { oldText = this.oldText; } return Text_1.Text.isSayText(oldText, text); } _validatePage(maxPage) { if (typeof maxPage === 'undefined') { maxPage = this.getMaxPage(); } if (this.thisPage >= maxPage) { this.thisPage = maxPage - 1; } if (this.thisPage < 0) { this.thisPage = 0; } } numberPage(text) { const data = text.match(/((-|)\d) страни/imu); if (data) { this.thisPage = +data[1] - 1; this._validatePage(); return true; } return false; } _nextPage(text) { if (this.isNext(text)) { this.thisPage++; this._validatePage(); return true; } return false; } _oldPage(text) { if (this.isOld(text)) { this.thisPage--; this._validatePage(); return true; } return false; } getPageElements(elements = null, text = '') { const showElements = []; if (elements) { this.elements = elements; } this._nextPage(text); this._oldPage(text); const start = this.thisPage * this.maxVisibleElements; const end = start + this.maxVisibleElements; if (this.elements.length >= start) { for (let i = start; i < end; i++) { if (typeof this.elements[i] !== 'undefined') { showElements.push(this.elements[i]); } } } return showElements; } selectedElement(elements = null, text = '', keys = null, thisPage = null) { if (thisPage !== null) { this.thisPage = thisPage; } if (elements) { this.elements = elements; } let number = null; const data = text.match(/(\d)/imu); if (data) { number = +data[0][0]; } const start = this.thisPage * this.maxVisibleElements; let index = 1; let selectElement = null; let maxPercent = 0; const end = start + this.maxVisibleElements; const setMaxElement = (index, res) => { if (res.status && res.percent > maxPercent) { selectElement = this.elements[index]; maxPercent = res.percent; } }; for (let i = start; i < end; i++) { if (typeof this.elements[i] !== 'undefined') { if (index === number) { return this.elements[i]; } const elementsTypeof = typeof this.elements[i]; if (keys === null || elementsTypeof === 'string') { const r = Text_1.Text.textSimilarity(this.elements[i] + '', text, 75); setMaxElement(i, r); } else { if (elementsTypeof === 'object') { if (typeof keys === 'object') { keys.forEach((key) => { const value = this.elements[i][key]; if (value) { const r = Text_1.Text.textSimilarity(value, text, 75); setMaxElement(i, r); } }); } else { const value = this.elements[i][keys]; if (value) { const r = Text_1.Text.textSimilarity(value, text, 75); setMaxElement(i, r); } } } } index++; if (maxPercent > 90) { return selectElement; } } } return selectElement; } getPageNav(isNumber = false) { const maxPage = this.getMaxPage(); this._validatePage(maxPage); const buttons = []; if (!isNumber) { if (this.thisPage) { buttons.push('👈 Назад'); } if (this.thisPage + 1 < maxPage) { buttons.push('Дальше 👉'); } } else { let index = this.thisPage - 2; if (index < 0) { index = 0; } let count = 0; if (index === 1) { buttons.push('1'); } else if (index) { buttons.push('1 ...'); } for (let i = index; i < maxPage; i++) { if (i === this.thisPage) { buttons.push(`[${i + 1}]`); } else { buttons.push(`${i + 1}`); } count++; if (count > 4) { if (i === maxPage - 2) { buttons.push(`${maxPage}`); } else if (i < maxPage - 2) { buttons.push(`... ${maxPage}`); } break; } } } return buttons; } getPageInfo() { if (typeof this.elements[this.thisPage * this.maxVisibleElements] === 'undefined' || this.thisPage < 0) { this.thisPage = 0; } let pageInfo = this.thisPage + 1 + ' страница из '; const maxPage = this.getMaxPage(); if (maxPage > 1) { pageInfo += maxPage; } else { pageInfo = ''; } return pageInfo; } getMaxPage(elements = null) { if (elements) { this.elements = elements; } if (typeof this.elements === 'object') { const countEl = this.elements.length; return Math.ceil(countEl / this.maxVisibleElements); } return 0; } } exports.Navigation = Navigation;