您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
inline
// ==UserScript== // @name LOLZ Inline Assistant // @namespace http://tampermonkey.net/ // @namespace http://tampermonkey.net/ // @author @umikud // @version 1.2 // @description inline // @match https://*.lolz.live/* // @grant none // @license MIT // ==/UserScript== (function () { 'use strict'; const sectionsDict = { "Android": "https://lolz.live/forums/437/", "Apex Legends": "https://lolz.live/forums/apex-legends/", "Battle.net": "https://lolz.live/forums/688/", "Battlefield": "https://lolz.live/forums/battlefield-all/", "Battlefield 1": "https://lolz.live/forums/759/", "Battlefield 2042": "https://lolz.live/forums/920/", "Battlefield V": "https://lolz.live/forums/821/", "C#": "https://lolz.live/forums/97/", "C/C++": "https://lolz.live/forums/96/", "Call of Duty": "https://lolz.live/forums/418/", "Counter-Strike 2": "https://lolz.live/forums/cs2/", "CrackME / UnpackME": "https://lolz.live/forums/872/", "DayZ": "https://lolz.live/forums/998/", "Deadlock": "https://lolz.live/forums/deadlock/", "Discord": "https://lolz.live/forums/898/", "Dota 2": "https://lolz.live/forums/dota2/", "EFT: Arena": "https://lolz.live/forums/1000/", "Escape from Tarkov": "https://lolz.live/forums/857/", "FIFA": "https://lolz.live/forums/946/", "Fortnite": "https://lolz.live/forums/790/", "Fortnite, Epic Games": "https://lolz.live/forums/800/", "GTA": "https://lolz.live/forums/981/", "GTA SAMP": "https://lolz.live/forums/139/", "GTA V": "https://lolz.live/forums/141/", "GTA V MODS": "https://lolz.live/forums/669/", "Genshin Impact": "https://lolz.live/forums/genshin-impact/", "Go": "https://lolz.live/forums/1016/", "HTML шаблоны, лендинги": "https://lolz.live/forums/694/", "HTML, CSS, Javascript": "https://lolz.live/forums/820/", "Hash": "https://lolz.live/forums/hash/", "Honkai Star Rail": "https://lolz.live/forums/honkai-star-rail/", "Kali Linux": "https://lolz.live/forums/713/", "League of Legends": "https://lolz.live/forums/130/", "Linux": "https://lolz.live/forums/588/", "Malware": "https://lolz.live/forums/343/", "Minecraft": "https://lolz.live/forums/729/", "Node.js": "https://lolz.live/forums/867/", "Origin (EA)": "https://lolz.live/forums/origin/", "Overwatch 2": "https://lolz.live/forums/967/", "P2P обмены": "https://lolz.live/forums/1001/", "PHP, MySQL": "https://lolz.live/forums/510/", "PSN": "https://lolz.live/forums/psn/", "PUBG": "https://lolz.live/forums/767/", "Private Keeper, BAS, OB": "https://lolz.live/forums/818/", "Python": "https://lolz.live/forums/830/", "Rainbow Six Siege": "https://lolz.live/forums/1036/", "Roblox": "https://lolz.live/forums/1019/", "Roblox Studio": "https://lolz.live/forums/1034/", "Rocket League": "https://lolz.live/forums/869/", "Rust": "https://lolz.live/forums/rust/", "S.T.A.L.K.E.R.": "https://lolz.live/forums/560/", "S.T.A.L.K.E.R. 2": "https://lolz.live/forums/1032/", "SAMP": "https://lolz.live/forums/690/", "SEO, продвижение": "https://lolz.live/forums/95/", "SMM": "https://lolz.live/forums/746/", "SMM Instagram": "https://lolz.live/forums/748/", "SMM ВКонтакте": "https://lolz.live/forums/747/", "SQLI, Dork Parsers": "https://lolz.live/forums/sqli/", "Social Club": "https://lolz.live/forums/720/", "Steam": "https://lolz.live/forums/steam/", "Supercell": "https://lolz.live/forums/892/", "Team Fortress 2": "https://lolz.live/forums/983/", "The Finals": "https://lolz.live/forums/982/", "Uplay": "https://lolz.live/forums/uplay/", "VR игры": "https://lolz.live/forums/944/", "Valorant": "https://lolz.live/forums/914/", "War Thunder": "https://lolz.live/forums/1037/", "Warface": "https://lolz.live/forums/warface/", "Wi-Fi": "https://lolz.live/forums/749/", "Windows": "https://lolz.live/forums/109/", "World of Tanks": "https://lolz.live/forums/689/", "YouTube, Twitch": "https://lolz.live/forums/839/", "Zenless Zone Zero": "https://lolz.live/forums/zenless-zone-zero/", "iOS": "https://lolz.live/forums/436/", "macOS": "https://lolz.live/forums/794/", "miHoYo": "https://lolz.live/forums/990/", "osu!": "https://lolz.live/forums/870/", "Авто, мото": "https://lolz.live/forums/961/", "Автореггеры": "https://lolz.live/forums/267/", "Авторские курсы": "https://lolz.live/forums/906/", "Акки с балансом, бонусами": "https://lolz.live/forums/806/", "Аниме": "https://lolz.live/forums/835/", "Анонимность": "https://lolz.live/forums/311/", "Арбитраж": "https://lolz.live/forums/arbitrage/", "Баги Warface": "https://lolz.live/forums/536/", "Баги, скрипты Apex Legends": "https://lolz.live/forums/934/", "Баги, скрипты для Dota 2": "https://lolz.live/forums/227/", "Базы, запросы с почт": "https://lolz.live/forums/431/", "Безопасность": "https://lolz.live/forums/745/", "Бесплатная графика": "https://lolz.live/forums/833/", "Бесплатная накрутка": "https://lolz.live/forums/851/", "Бесплатная разработка": "https://lolz.live/forums/1039/", "Брут, чекеры": "https://lolz.live/forums/110/", "Буст аккаунтов": "https://lolz.live/forums/664/", "Валюта Escape from Tarkov": "https://lolz.live/forums/919/", "Ваше творчество": "https://lolz.live/forums/845/", "Ваши истории": "https://lolz.live/forums/819/", "Ваши работы": "https://lolz.live/forums/372/", "Ваши сайты": "https://lolz.live/forums/838/", "Веб уязвимости": "https://lolz.live/forums/392/", "Веб-разработка": "https://lolz.live/forums/85/", "Вещи, техника": "https://lolz.live/forums/912/", "Видео Battlefield 1": "https://lolz.live/forums/924/", "Видео Battlefield 2042": "https://lolz.live/forums/922/", "Видео Battlefield V": "https://lolz.live/forums/923/", "Видео DeadLock": "https://lolz.live/forums/1030/", "Видео GTA V": "https://lolz.live/forums/175/", "Видео League of Legends": "https://lolz.live/forums/219/", "Видео Minecraft": "https://lolz.live/forums/204/", "Видео Rocket League": "https://lolz.live/forums/973/", "Видео SAMP": "https://lolz.live/forums/171/", "Видео Valorant": "https://lolz.live/forums/978/", "Видео Warface": "https://lolz.live/forums/77/", "Видео World of Tanks": "https://lolz.live/forums/215/", "Вирусология": "https://lolz.live/forums/752/", "Вопрос - Ответ": "https://lolz.live/forums/899/", "Воркеры": "https://lolz.live/forums/workers_deleted/", "Вторичка": "https://lolz.live/forums/913/", "Вторичка дедиков, хостингов": "https://lolz.live/forums/932/", "Вторичка софта": "https://lolz.live/forums/671/", "Вторичка читов": "https://lolz.live/forums/929/", "Вязка каналов": "https://lolz.live/forums/948/", "Гайды Apex Legends": "https://lolz.live/forums/878/", "Гайды Battlefield 1": "https://lolz.live/forums/887/", "Гайды Battlefield 2042": "https://lolz.live/forums/921/", "Гайды Battlefield V": "https://lolz.live/forums/886/", "Гайды CS2": "https://lolz.live/forums/36/", "Гайды Call of Duty": "https://lolz.live/forums/881/", "Гайды DayZ": "https://lolz.live/forums/1020/", "Гайды DeadLock": "https://lolz.live/forums/1031/", "Гайды Escape from Tarkov": "https://lolz.live/forums/885/", "Гайды FIFA": "https://lolz.live/forums/970/", "Гайды Fortnite": "https://lolz.live/forums/792/", "Гайды Genshin Impact": "https://lolz.live/forums/891/", "Гайды Honkai Star Rail": "https://lolz.live/forums/994/", "Гайды Overwatch 2": "https://lolz.live/forums/968/", "Гайды PUBG": "https://lolz.live/forums/768/", "Гайды Rocket League": "https://lolz.live/forums/888/", "Гайды Rust": "https://lolz.live/forums/883/", "Гайды SAMP": "https://lolz.live/forums/170/", "Гайды Supercell": "https://lolz.live/forums/893/", "Гайды Valorant": "https://lolz.live/forums/917/", "Гайды Warface": "https://lolz.live/forums/76/", "Гайды World of Tanks": "https://lolz.live/forums/214/", "Гайды Zenless Zone Zero": "https://lolz.live/forums/1005/", "Гайды osu!": "https://lolz.live/forums/877/", "Гайды по VR играм": "https://lolz.live/forums/959/", "Гайды по форуму": "https://lolz.live/forums/7/", "Гайды, рецепты Minecraft": "https://lolz.live/forums/201/", "Гайды, тактики по Dota 2": "https://lolz.live/forums/228/", "Гайды, тактики по GTA V": "https://lolz.live/forums/176/", "Гайды, тактики по LoL": "https://lolz.live/forums/218/", "Гифты, ключи, балансы Steam": "https://lolz.live/forums/728/", "Графика": "https://lolz.live/forums/88/", "Движки, фреймворки": "https://lolz.live/forums/93/", "Девайсы": "https://lolz.live/forums/837/", "Дедики, хостинги": "https://lolz.live/forums/763/", "Дизайн": "https://lolz.live/forums/design/", "Дополнения": "https://lolz.live/forums/976/", "Другие игры": "https://lolz.live/forums/816/", "Другое": "https://lolz.live/forums/815/", "Жалобы": "https://lolz.live/forums/801/", "Жизнь форума": "https://lolz.live/forums/4/", "Завершенные P2P обмены": "https://lolz.live/forums/1013/", "Завершенные розыгрыши": "https://lolz.live/forums/771/", "Задания за деньги": "https://lolz.live/forums/834/", "Игры": "https://lolz.live/forums/682/", "Инвентарь Steam": "https://lolz.live/forums/726/", "Инсталлы, крипт": "https://lolz.live/forums/595/", "Интервью": "https://lolz.live/forums/interviews/", "Исходники": "https://lolz.live/forums/696/", "Ищу работу": "https://lolz.live/forums/832/", "Ищу софт": "https://lolz.live/forums/718/", "Карты и скины osu!": "https://lolz.live/forums/905/", "Кино и мультфильмы": "https://lolz.live/forums/873/", "Кисти, текстуры, градиенты": "https://lolz.live/forums/698/", "Компьютеры": "https://lolz.live/forums/587/", "Конкурсы и турниры": "https://lolz.live/forums/107/", "Конфиги CS2": "https://lolz.live/forums/38/", "Кошельки, верификация": "https://lolz.live/forums/817/", "Криптовалюты": "https://lolz.live/forums/780/", "Крипторы": "https://lolz.live/forums/347/", "Кулинария": "https://lolz.live/forums/cookery/", "Логи": "https://lolz.live/forums/810/", "Модификации World of Tanks": "https://lolz.live/forums/213/", "Моды SAMP": "https://lolz.live/forums/722/", "Моды, текстуры для Minecraft": "https://lolz.live/forums/202/", "Музыкальные утечки": "https://lolz.live/forums/862/", "Накрутка в соц. сетях": "https://lolz.live/forums/593/", "Недочеты": "https://lolz.live/forums/bugs/", "Нейросети": "https://lolz.live/forums/neural-networks/", "Неоплаченные претензии": "https://lolz.live/forums/918/", "Новости сайта": "https://lolz.live/forums/265/", "Обмен средств": "https://lolz.live/forums/805/", "Озвучка": "https://lolz.live/forums/863/", "Остальные игры": "https://lolz.live/forums/760/", "Ответы ЕГЭ и ОГЭ, ЗНО 2025": "https://lolz.live/forums/otvety-ege-oge-25/", "Оценка товара": "https://lolz.live/forums/381/", "Палата №8 (Оффтоп)": "https://lolz.live/forums/8/", "Парсеры": "https://lolz.live/forums/275/", "Плагины и сборки Minecraft": "https://lolz.live/forums/251/", "Платные обжалования": "https://lolz.live/forums/paid-appeals/", "Подарки в соц. сетях": "https://lolz.live/forums/840/", "Поиск исполнителей": "https://lolz.live/forums/975/", "Поиск отработчиков": "https://lolz.live/forums/1007/", "Полезное ПО": "https://lolz.live/forums/1044/", "Пополнение баланса": "https://lolz.live/forums/1014/", "Почты": "https://lolz.live/forums/814/", "Предложения": "https://lolz.live/forums/suggestions/", "Приватные читы": "https://lolz.live/forums/263/", "Приватный софт": "https://lolz.live/forums/345/", "Приём смс": "https://lolz.live/forums/925/", "Проблемы с VR играми": "https://lolz.live/forums/960/", "Проблемы с загрузкой аккаунтов": "https://lolz.live/forums/account-upload-issues/", "Проблемы с игрой Apex Legends": "https://lolz.live/forums/933/", "Проблемы с игрой Call of Duty": "https://lolz.live/forums/958/", "Проблемы с игрой DayZ": "https://lolz.live/forums/1029/", "Проблемы с игрой Escape from Tarkov": "https://lolz.live/forums/941/", "Проблемы с игрой FIFA": "https://lolz.live/forums/971/", "Проблемы с игрой Fortnite": "https://lolz.live/forums/987/", "Проблемы с игрой GTA V": "https://lolz.live/forums/179/", "Проблемы с игрой Genshin Impact": "https://lolz.live/forums/939/", "Проблемы с игрой Honkai Star Rail": "https://lolz.live/forums/995/", "Проблемы с игрой League of Legends": "https://lolz.live/forums/221/", "Проблемы с игрой Minecraft": "https://lolz.live/forums/205/", "Проблемы с игрой Rust": "https://lolz.live/forums/942/", "Проблемы с игрой SAMP": "https://lolz.live/forums/172/", "Проблемы с игрой Valorant": "https://lolz.live/forums/980/", "Проблемы с игрой Warface": "https://lolz.live/forums/79/", "Проблемы с игрой Zenless Zone Zero": "https://lolz.live/forums/1006/", "Проблемы с игрой osu!": "https://lolz.live/forums/945/", "Программирование": "https://lolz.live/forums/733/", "Прокси чекеры": "https://lolz.live/forums/278/", "Прокси-серверы": "https://lolz.live/forums/1003/", "Промокоды": "https://lolz.live/forums/897/", "Прошивки": "https://lolz.live/forums/1047/", "Психология": "https://lolz.live/forums/903/", "Работа и услуги": "https://lolz.live/forums/105/", "Работа с базами": "https://lolz.live/forums/277/", "Работа с видео": "https://lolz.live/forums/91/", "Работа с дедиками": "https://lolz.live/forums/374/", "Работа с логами": "https://lolz.live/forums/926/", "Работа с текстом": "https://lolz.live/forums/391/", "Работа с хэшами": "https://lolz.live/forums/586/", "Раздачи аккаунтов, ключей": "https://lolz.live/forums/21/", "Раздачи баз": "https://lolz.live/forums/444/", "Раздачи вещей Steam": "https://lolz.live/forums/849/", "Раздачи дедиков": "https://lolz.live/forums/762/", "Раздачи логов": "https://lolz.live/forums/848/", "Раздачи прокси": "https://lolz.live/forums/566/", "Раздел для кураторов": "https://lolz.live/forums/911/", "Рассмотренные вопросы": "https://lolz.live/forums/902/", "Рассмотренные недочеты": "https://lolz.live/forums/827/", "Рассмотренные предложения": "https://lolz.live/forums/809/", "Реверсинг / Assembler": "https://lolz.live/forums/584/", "Реклама": "https://lolz.live/forums/962/", "Ресурсы": "https://lolz.live/forums/608/", "Решенные жалобы": "https://lolz.live/forums/803/", "Решенные претензии": "https://lolz.live/forums/774/", "Розыгрыши": "https://lolz.live/forums/contests/", "Серверы Minecraft": "https://lolz.live/forums/203/", "Сигны": "https://lolz.live/forums/868/", "Скрипты сайтов": "https://lolz.live/forums/650/", "Скрипты, боты": "https://lolz.live/forums/685/", "Слив фотографий 18+": "https://lolz.live/forums/media-leaks18/", "Софт": "https://lolz.live/forums/607/", "Софт для графики": "https://lolz.live/forums/92/", "Соц. сети": "https://lolz.live/forums/683/", "Социальная инженерия": "https://lolz.live/forums/743/", "Социальные сети": "https://lolz.live/forums/757/", "Спамеры, бомберы": "https://lolz.live/forums/276/", "Спорт": "https://lolz.live/forums/904/", "Способы заработка": "https://lolz.live/forums/363/", "Спроси у ChatGPT": "https://lolz.live/forums/ask-chatgpt/", "Сталкер: Зов припяти": "https://lolz.live/forums/561/", "Сталкер: Тень Чернобыля": "https://lolz.live/forums/562/", "Сталкер: Чистое Небо": "https://lolz.live/forums/563/", "Статьи": "https://lolz.live/forums/421/", "Телефоны": "https://lolz.live/forums/435/", "Тематические вопросы": "https://lolz.live/forums/585/", "Тестовый раздел": "https://lolz.live/forums/test-forum/", "Торговля": "https://lolz.live/forums/104/", "Трафферы": "https://lolz.live/forums/936/", "Уроки": "https://lolz.live/forums/823/", "Уроки по анимациям": "https://lolz.live/forums/393/", "Уроки реверсинга": "https://lolz.live/forums/601/", "Учеба": "https://lolz.live/forums/853/", "Фишинг": "https://lolz.live/forums/855/", "Халява": "https://lolz.live/forums/9/", "Хостинг, аренда магазина": "https://lolz.live/forums/596/", "Чек игрового инвентаря": "https://lolz.live/forums/909/", "Чек криптовалюты": "https://lolz.live/forums/908/", "Чек логов, баз": "https://lolz.live/forums/597/", "Читы Apex Legends": "https://lolz.live/forums/828/", "Читы CS2": "https://lolz.live/forums/785/", "Читы Call of Duty": "https://lolz.live/forums/901/", "Читы DayZ": "https://lolz.live/forums/1028/", "Читы Dota 2": "https://lolz.live/forums/858/", "Читы Escape from Tarkov": "https://lolz.live/forums/884/", "Читы Fortnite": "https://lolz.live/forums/791/", "Читы PUBG": "https://lolz.live/forums/784/", "Читы Rust": "https://lolz.live/forums/900/", "Читы SAMP": "https://lolz.live/forums/518/", "Читы Valorant": "https://lolz.live/forums/916/", "Читы Warface": "https://lolz.live/forums/75/", "Читы для Android игр": "https://lolz.live/forums/783/", "Читы для игр miHoYo": "https://lolz.live/forums/966/", "Читы, баги Minecraft": "https://lolz.live/forums/200/", "Читы, баги для GTA V": "https://lolz.live/forums/177/", "Читы, баги для League of Legends": "https://lolz.live/forums/217/", "Шип, рефанд": "https://lolz.live/forums/841/", "Шрифты": "https://lolz.live/forums/697/", "Юмор": "https://lolz.live/forums/874/", }; const cryptoSymbols = { btc: 'bitcoin', eth: 'ethereum', ton: 'the-open-network', usdt: 'tether', usdc: 'usd-coin', bnb: 'binancecoin', sol: 'solana', xrp: 'ripple', doge: 'dogecoin', ada: 'cardano', avax: 'avalanche-2', trx: 'tron', shib: 'shiba-inu', dot: 'polkadot', matic: 'matic-network', dai: 'dai', ltc: 'litecoin', link: 'chainlink', op: 'optimism', arb: 'arbitrum', near: 'near' }; const priceCache = {}; const CACHE_TTL = 60000; let popup = null; let editor = null; let debounceTimer = null; function getCaretPositionRect() { const sel = window.getSelection(); if (!sel.rangeCount) return null; const range = sel.getRangeAt(0).cloneRange(); const rects = range.getClientRects(); return rects.length ? rects[0] : null; } function createPopupIfNeeded() { if (popup) return; popup = document.createElement('div'); popup.className = 'fr-popup fr-desktop fr-ltr fe-acPopup fr-above fr-active'; popup.style.zIndex = 9999; popup.style.position = 'absolute'; popup.style.maxWidth = '350px'; const scrollWrapper = document.createElement('div'); scrollWrapper.className = 'scroll-wrapper fe-ac fe-ac-user'; scrollWrapper.style.position = 'relative'; const scrollContent = document.createElement('div'); scrollContent.className = 'fe-ac fe-ac-user scroll-content'; scrollContent.style.maxHeight = '132px'; scrollWrapper.appendChild(scrollContent); popup.appendChild(scrollWrapper); document.body.appendChild(popup); const style = document.createElement('style'); style.textContent = ` .guarantor_block_card_payment { padding: 4px 8px; font-weight: bold; border-radius: 6px; font-size: 13px; font-family: -apple-system,BlinkMacSystemFont,'Open Sans','Helvetica Neue',sans-serif; display: inline-block; margin-right: 8px; } .guarantor_block_card_payment.btc_color { color: #D1AC40; background-color: #413D31; } .guarantor_block_card_payment.eth_color { color: #4093D6; background-color: #313A41; } .guarantor_block_card_payment.ton_color { color: #40c0d6; background-color: #36474c; } .guarantor_block_card_payment.usdt_color { color: #26A17B; background-color: #222; } .guarantor_block_card_payment.usdc_color { color: #2775CA; background-color: #1E1E1E; } .guarantor_block_card_payment.bnb_color { color: #F3BA2F; background-color: #1E1E1E; } .guarantor_block_card_payment.sol_color { color: #66F9A1; background-color: #2A2A2A; } .guarantor_block_card_payment.xrp_color { color: #00AAE4; background-color: #1C1C1C; } .guarantor_block_card_payment.doge_color { color: #C2A633; background-color: #3A3A3A; } .guarantor_block_card_payment.ada_color { color: #0033AD; background-color: #202020; } .guarantor_block_card_payment.avax_color { color: #E84142; background-color: #1F1F1F; } .guarantor_block_card_payment.trx_color { color: #EF0027; background-color: #191919; } .guarantor_block_card_payment.shib_color { color: #F55C44; background-color: #2C2C2C; } .guarantor_block_card_payment.dot_color { color: #E6007A; background-color: #242424; } .guarantor_block_card_payment.matic_color{ color: #8247E5; background-color: #282828; } .guarantor_block_card_payment.dai_color { color: #F4B731; background-color: #292929; } .guarantor_block_card_payment.ltc_color { color: #BEBEBE; background-color: #2E2E2E; } .guarantor_block_card_payment.link_color { color: #2A5ADA; background-color: #303030; } .guarantor_block_card_payment.op_color { color: #FF0420; background-color: #1B1B1B; } .guarantor_block_card_payment.arb_color { color: #28A0F0; background-color: #1D1D1D; } .guarantor_block_card_payment.near_color { color: #000000; background-color: #F8F8F8; } `; popup.appendChild(style); } function updatePopup(results, insertCallback, position) { createPopupIfNeeded(); popup.style.left = `${position.left}px`; popup.style.top = `${position.top + 20}px`; const scrollContent = popup.querySelector('.scroll-content'); scrollContent.innerHTML = ''; results.forEach(r => { const div = document.createElement('div'); div.className = 'fe-ac-user-result fe-ac-result'; div.innerHTML = r.isHtml ? r.title : `<span class="username"><span class="style2">${r.title}</span></span><span class="item">${r.subtitle}</span>`; div.addEventListener('click', (event) => { event.preventDefault(); event.stopPropagation(); insertCallback(r.insertText); hidePopup(); }); scrollContent.appendChild(div); }); } function hidePopup() { if (popup) popup.remove(); popup = null; } async function fetchSuggestions(query) { const results = []; console.log(query) const calcMatch = query.match(/^([a-z]{2,5})\s*([\*\+\/\-])\s*(\d+(\.\d+)?%?)$/i); if (calcMatch) { const [, symbolKey, operator, valueRaw] = calcMatch; const coinId = cryptoSymbols[symbolKey]; if (coinId) { const now = Date.now(); let price; const cacheEntry = priceCache[symbolKey]; if (cacheEntry && now - cacheEntry.timestamp < CACHE_TTL) { price = cacheEntry.price; } else { try { const res = await fetch(`https://api.coingecko.com/api/v3/simple/price?ids=${coinId}&vs_currencies=usd`); const data = await res.json(); price = data[coinId]?.usd; if (!price) throw new Error(); priceCache[symbolKey] = { price, timestamp: now }; } catch (e) { console.error('Ошибка получения курс:', e); } } if (price) { const isPercent = valueRaw.endsWith('%'); const value = parseFloat(valueRaw.replace('%', '')); let result; switch (operator) { case '*': result = price * value; break; case '/': result = price / value; break; case '+': result = isPercent ? price * (1 + value / 100) : price + value; break; case '-': result = isPercent ? price * (1 - value / 100) : price - value; break; } const rounded = result.toFixed(2); results.push({ title: `<span class="guarantor_block_card_payment ${symbolKey}_color">${symbolKey.toUpperCase()} → ${rounded} USD</span>`, subtitle: '', insertText: `${symbolKey.toUpperCase()}: ${rounded} USD`, isHtml: true }); } return results; } } if (cryptoSymbols[query]) { const coinId = cryptoSymbols[query]; const now = Date.now(); let price; const cacheEntry = priceCache[query]; if (cacheEntry && now - cacheEntry.timestamp < CACHE_TTL) { price = cacheEntry.price; } else { try { const res = await fetch(`https://api.coingecko.com/api/v3/simple/price?ids=${coinId}&vs_currencies=usd`); const data = await res.json(); price = data[coinId]?.usd; if (!price) throw new Error(); priceCache[query] = { price, timestamp: now }; } catch (e) { console.error('Ошибка получения курса:', e); } } if (price) { const symbol = query.toUpperCase(); const html = `<span class="guarantor_block_card_payment ${query}_color">${symbol} ${price} USD</span>`; results.push({ title: html, subtitle: '', insertText: `${symbol}: ${price} USD`, isHtml: true }); } } for (const [key, url] of Object.entries(sectionsDict)) { if (key.toLowerCase().includes(query.toLowerCase())) { const urlParts = url.split("/"); const last = urlParts.filter(Boolean).pop(); const nodeId = last.match(/^\d+$/) ? `node${last}` : `node_${last}`; const html = `<span class="internalNodeLink ${nodeId}"><a href="${url}" class="internalLink internalNodeLink ${nodeId}">${key}</a></span>`; results.push({ title: html, subtitle: '', insertText: `${url}`, isHtml: true }); } } return results; } function insertTextAtCursor(oldTrigger, newText) { const sel = window.getSelection(); if (!sel.rangeCount) return; const node = sel.anchorNode; if (!node || !node.textContent) return; const text = node.textContent; const replaced = text.replace(oldTrigger, newText + ' '); node.textContent = replaced; const range = document.createRange(); range.setStart(node, replaced.length); range.setEnd(node, replaced.length); sel.removeAllRanges(); sel.addRange(range); } function handleKeyup(e) { if (debounceTimer) clearTimeout(debounceTimer); debounceTimer = setTimeout(async () => { const sel = window.getSelection(); if (!sel.rangeCount) return; const node = sel.anchorNode; if (!node || !node.textContent) return; const text = node.textContent; const match = text.match(/!([\p{L}\p{N}\s\-\+\*\/%.,]{2,40})$/u); if (match) { const query = match[1].toLowerCase(); const caretRect = getCaretPositionRect(); if (!caretRect) return; const suggestions = await fetchSuggestions(query); if (suggestions.length) { updatePopup(suggestions, (txt) => insertTextAtCursor('!' + query, txt), caretRect); } else { hidePopup(); } } else { hidePopup(); } }, 250); } function setup() { if (editor) return; editor = document.querySelector('.fr-element[contenteditable="true"]'); if (editor) { editor.addEventListener('keyup', handleKeyup); } } const observer = new MutationObserver(() => setup()); observer.observe(document.body, { childList: true, subtree: true }); window.addEventListener('load', setup); })();