Расширение для браузеров на базе Chromium (Chrome, Edge и совместимые) для поиска по странице с учётом русской морфологии, аннотирования текста, режима чтения, офлайн-архивов, личного словаря и работы с QR-кодами.
Репозиторий: https://github.com/ppvikentiy/web-search
Лицензия: GNU General Public License v3.0 (GPLv3)
Версия: 1.5.0 (Manifest V3)
- Зачем это нужно
- Возможности
- Установка
- Быстрый старт
- Поиск по странице
- Аннотации
- Режим чтения
- Офлайн-архив
- Словарь
- QR-коды
- Настройки
- Горячие клавиши
- Экспорт
- Русская морфология
- Структура проекта
- Разрешения
- Разработка
- Ограничения
- Миссия
- Лицензия
- Ссылки
Встроенный поиск браузера не знает русских словоформ: запрос «кот» не найдёт «кота», «коту» или «котами». Это расширение ищет с учётом морфологии, подсвечивает совпадения, позволяет выделять цитаты с заметками, открывать статьи в чистом читателе, сохранять страницы в ZIP для офлайн-просмотра и вести личный словарь терминов.
Всё работает локально в браузере: без аккаунта, без облака и без обязательной сборки перед установкой.
| Модуль | Кратко |
|---|---|
| Поиск | Слова и фразы, регистр, целое слово / подстрока, морфология, iframe и Shadow DOM |
| Подсветка | Цвета обычного и текущего совпадения, навигация «N из M» |
| Аннотации | Выделение цитат, заметки, экспорт, библиография (ГОСТ / APA / MLA / Chicago) |
| Читатель | Mozilla Readability + DOMPurify, поиск и аннотации внутри статьи, Markdown |
| Офлайн-архив | Самодостаточный ZIP (index.html + ресурсы), журнал и встроенный просмотрщик |
| Словарь | Папки, теги, формы, импорт/экспорт JSON, поиск по выделению |
| QR | QR текущей страницы (копирование / PNG) и сканирование QR с изображений |
| Боковая панель | Те же инструменты поиска и аннотаций, закреплённые у края страницы |
Расширение пока не публикуется в Chrome Web Store — ставится как распакованное.
git clone https://github.com/ppvikentiy/web-search.git
cd web-searchЛибо скачайте ZIP с GitHub: Code → Download ZIP и распакуйте.
- Откройте страницу расширений:
- Chrome:
chrome://extensions - Edge:
edge://extensions
- Chrome:
- Включите Режим разработчика.
- Нажмите Загрузить распакованное расширение.
- Укажите папку проекта — ту, где лежит
manifest.json. - При желании закрепите иконку на панели инструментов.
Сборка не нужна: расширение — обычный JavaScript без зависимостей.
В архив должны попасть только файлы расширения (manifest.json, background/, content/, popup/, …). Не включайте README и служебные файлы репозитория, если Store на это жалуется.
Для CRX: chrome://extensions → Упаковать расширение → укажите папку с manifest.json. Ключ .pem сохраните для обновлений.
После правок кода нажмите Обновить на карточке расширения.
- Откройте обычную страницу
http://илиhttps://(неchrome:///edge://). - Нажмите иконку расширения.
- Введите слово или фразу → Найти (или Enter).
- Листайте совпадения стрелками в попапе или клавишами F3 / Ctrl+G.
- Включите Формы слова, чтобы искать русские словоформы.
- Включите Режим аннотаций, выделите текст — появится цитата с заметкой и экспортом.
- Попап на панели инструментов
- Кнопка Закрепить у края экрана — боковая панель на самой странице
- Контекстное меню по выделенному тексту: Найти на странице
- Кнопка Найти выделенное в попапе / панели
| Параметр | Описание |
|---|---|
| Учитывать регистр | «Дом» и «дом» — разные совпадения |
| Целое слово | Не искать внутри других слов («кот» ≠ «который») |
| Формы слова | Русская морфология: «кот» → «кота», «коту», … |
| Режим фразы | Точная / гибкая (пробелы и пунктуация) / морфология каждого слова |
| Режим совпадения | Целое слово или подстрока |
| Iframe / Shadow DOM | Опциональный поиск во вложенных документах и теневом DOM |
| Исключения | HTML-теги и CSS-селекторы, которые пропускаются |
Совпадения подсвечиваются на странице; активное — отдельным цветом. Счётчик показывает текущую позицию среди всех найденных.
- Включите Режим аннотаций в попапе или боковой панели.
- Выделите фрагмент текста — создаётся аннотация.
- Либо выделите текст и выберите в контекстном меню Аннотировать.
- Добавлять и редактировать заметку к цитате
- Переходить между аннотациями через плавающую «пилюлю» (счётчик, список, очистка)
- Экспортировать цитату (TXT / Markdown по шаблону)
- Копировать библиографическую ссылку
- Экспортировать запись как литературу
- Удалять заметку или всю аннотацию
Стиль: фон, подчёркивание или оба. Цвета обычной и активной аннотации настраиваются. Тема всплывающих окон: системная, светлая, тёмная или свои цвета.
Аннотации сохраняются локально для URL страницы (chrome.storage.local). Хэш в адресе не учитывается; в режиме чтения используется URL исходной статьи.
Открывается из попапа (иконка книги), контекстного меню Открыть в читателе или из логики расширения на странице.
- Статья извлекается через Mozilla Readability.
- HTML очищается DOMPurify.
- Открывается вкладка
reader/reader.htmlс чистым текстом, заголовком и метаданными.
- Поиск по статье (включая морфологию)
- Режим аннотаций и список цитат
- Внешний вид: размер шрифта, межстрочный интервал, ширина колонки, цвет фона
- Переход К оригиналу
- Навигация по внутренним ссылкам статьи (извлечение следующей статьи в том же читателе)
- Экспорт: скачать Markdown, скопировать текст или Markdown (опционально с блоком аннотаций)
Сохраняет страницу как самодостаточный ZIP для чтения без сети.
- Иконка загрузки в попапе
- Раздел Офлайн-архив в настройках
- Сохранение по вставленному URL (фоновая вкладка → архив → закрытие вкладки)
archive.zip
├── index.html # страница с переписанными локальными ссылками
├── README.txt # краткая справка
└── assets/
├── styles/
├── scripts/
├── fonts/
├── images/
└── files/
- Метаданные архивов хранятся в
chrome.storage.local - Байты ZIP — в IndexedDB (с вытеснением по размеру кэша)
- Открытие из журнала или выбор / перетаскивание ZIP →
archive/viewer.html - При необходимости можно снова указать файл, если кэш очищен
Перед сбором ресурсов страница прокручивается для подгрузки ленивых изображений. Есть лимиты на размер страницы, одного ресурса и число ресурсов (см. lib/defaults.js).
Личный глоссарий в настройках → Словарь.
- Папки и теги
- Основная форма, дополнительные формы, описание
- Поиск и фильтры
- Импорт и экспорт JSON
- Контекстное меню по выделению: Найти в словаре (с учётом морфологии)
Данные хранятся в chrome.storage.local (схема v2). В режиме аннотаций пункт словаря в контекстном меню отключается, чтобы не мешать выделению цитат.
| Действие | Как |
|---|---|
| Создать | В попапе — QR URL текущей вкладки → скопировать ссылку или скачать PNG |
| Сканировать | ПКМ по изображению → Сканировать QR-код → текст, копирование, открытие URL |
Декодирование выполняется на странице или через offscreen-документ, если прямой доступ к изображению недоступен.
Открываются шестерёнкой в попапе или через страницу параметров расширения (settings/settings.html). Изменения сохраняются автоматически в chrome.storage.sync.
| Раздел | Что настраивается |
|---|---|
| Поиск | Регистр, целое слово, морфология, режим фразы и совпадения |
| Подсветка | Цвета совпадений |
| Аннотации | Цвета, стиль, тема попапов, iframe, исключения |
| Экспорт цитат | TXT / MD, поля (заметка, URL, заголовок, дата), шаблоны {text} {note} {url} {title} {date} |
| Экспорт литературы | Пресет: ГОСТ, APA 7, MLA 9, Chicago |
| Морфология | Глубина: базовая или расширенная |
| Словарь | Управление записями |
| Область поиска | Iframe, Shadow DOM |
| Исключения | Теги и CSS-селекторы для поиска |
| Офлайн-архив | Журнал, сохранение по URL, открытие ZIP |
| О нас | Версия, лицензия, миссия (RU / EN / UK) |
Кнопка сброса восстанавливает значения по умолчанию из lib/defaults.js.
Глобальных команд в manifest.json нет — сочетания работают на странице при активном поиске и в читателе (не в полях ввода и не поверх UI расширения).
| Клавиши | Действие |
|---|---|
| Enter | Запуск поиска (поле ввода) |
| F3 | Следующее совпадение |
| Shift+F3 | Предыдущее совпадение |
| Ctrl+G / Cmd+G | Следующее совпадение |
| Ctrl+Shift+G / Cmd+Shift+G | Предыдущее совпадение |
- Форматы:
.txt,.md - Шаблон с плейсхолдерами; дата в локали
ru-RU - Имя файла:
{slug-цитаты}_{ГГГГ-ММ-ДД}.{ext}
Пресеты для веб-источников (без автора в данных страницы):
- gost — ГОСТ (электронный ресурс)
- apa7 — APA 7th
- mla9 — MLA 9th
- chicago — Chicago (сносочный стиль)
Действия: копировать библиографическую ссылку или скачать .txt.
- Скачать Markdown (Turndown + GFM)
- Копировать обычный текст или Markdown
- Опционально включить раздел «Аннотации»
- ZIP с
index.html,README.txtи папкойassets/
Движок: content/morphology.js + словарь content/morphology-dict.json.
- Офлайн-словарь лемм (сотни лемм, тысячи базовых и расширенных форм)
- Нормализация
ё→е - Обратный индекс форма → лемма
- Глубина:
basicилиextended - Эвристический стемминг русских окончаний, если леммы нет в словаре
- Для фразового режима
morph— развёртка каждого слова (ограничение комбинаций) - Границы слов учитывают кириллицу (
lib/word-boundary.js)
Морфология используется в поиске и при поиске по пользовательскому словарю.
web-search/
├── manifest.json # Manifest V3
├── background/ # Service worker: меню, инъекция, читатель, архив, QR
├── content/ # Скрипты на странице: поиск, аннотации, словарь, QR, сбор архива
├── popup/ # Всплывающее окно панели инструментов
├── settings/ # Полные настройки + словарь + журнал архивов
├── reader/ # Вкладка режима чтения
├── archive/ # Просмотрщик офлайн-ZIP
├── offscreen/ # Blob URL и декодирование QR вне service worker
├── lib/ # Общие модули и вендорные библиотеки
├── icons/ # Иконки расширения
├── LICENSE # GPLv3
├── README.md # Этот файл (русский)
└── README-EN.md # English README
| Библиотека | Назначение |
|---|---|
| Mozilla Readability | Извлечение статьи |
| DOMPurify | Санитизация HTML читателя |
| Turndown (+ GFM) | HTML → Markdown |
| fflate | ZIP-архивы |
| qrcode | Генерация QR |
| jsQR | Распознавание QR |
Всё необходимое уже в репозитории: отдельных зависимостей нет.
| Разрешение | Зачем |
|---|---|
activeTab |
Работа с активной вкладкой по действию пользователя |
scripting |
Внедрение CSS/JS на страницы |
storage |
Настройки, аннотации, словарь, журнал, сессионные данные |
contextMenus |
Пункты ПКМ: поиск, аннотации, словарь, QR, читатель |
tabs |
Вкладки читателя, архива, ожидание загрузки |
offscreen |
Blob URL для загрузок и декодирование QR |
downloads |
Сохранение ZIP |
<all_urls> |
Инъекция и загрузка ресурсов на сайтах |
web_accessible_resources: content/morphology-dict.json — доступен content-скриптам.
При выпуске синхронно обновляйте:
versionвmanifest.json- константу версии content-скрипта в
background/background.js(чтобы переинъекция подхватывала изменения)
- Целевая платформа — Chromium (Chrome / Edge). Отдельной сборки под Firefox нет.
- Не работает на служебных страницах:
chrome://,edge://,about:, страницах самого расширения. - Поиск во внешних iframe ограничен политикой same-origin.
- Морфологический словарь покрывает распространённые леммы, но не весь русский язык; для отсутствующих слов есть эвристики.
- Архив зависит от доступности ресурсов страницы и лимитов размера; динамический контент после «заморозки» DOM может отличаться от живой страницы.
- Глобальных хоткеев расширения в настройках Chrome нет — только локальные на странице.
Сегодня крупнейшие корпорации и научные издательства возводят цифровые стены, требуя плату за доступ к знаниям. Актуальные научные открытия, медицинские исследования и важнейшие данные человечества становятся роскошью, доступной лишь избранным.
Это в корне неверно. Знание не должно быть товаром. Оно не принадлежит корпорациям — оно принадлежит всему человечеству.
Мы глубоко убеждены: право на информацию фундаментально. Доступ к знаниям должен быть открыт для каждого человека на Земле — независимо от его бюджета, национальности, происхождения или географии. Границы и кошельки не должны определять, насколько человек может быть образован и свободен.
У нас нет многомиллионных бюджетов, чтобы разрушить эти стены в одиночку.
Но у нас есть общая цель и технологии.
Наше небольшое расширение позволит просто удобно читать статьи в интернете. Просматривать, аннотировать, читать и даже сохранять.
Полный текст миссии (RU / EN / UK) также доступен в настройках → О нас.
Этот проект распространяется на условиях GNU General Public License версии 3 (GPLv3).
Полный текст: файл LICENSE и gnu.org/licenses/gpl-3.0.html.
Кратко: вы можете использовать, изучать, изменять и распространять программу при соблюдении условий GPLv3, в том числе сохранения свободной лицензии для производных работ.
- Репозиторий: https://github.com/ppvikentiy/web-search
- Лицензия GPLv3: https://www.gnu.org/licenses/gpl-3.0.html
- English README: README-EN.md
Issues и pull request’ы приветствуются в репозитории на GitHub. Перед PR имеет смысл проверить ключевые сценарии на реальной странице в Chrome или Edge.