Skip to content

Repository files navigation

Поиск слов на странице

English

Расширение для браузеров на базе Chromium (Chrome, Edge и совместимые) для поиска по странице с учётом русской морфологии, аннотирования текста, режима чтения, офлайн-архивов, личного словаря и работы с QR-кодами.

Репозиторий: https://github.com/ppvikentiy/web-search
Лицензия: GNU General Public License v3.0 (GPLv3)
Версия: 1.5.0 (Manifest V3)


Содержание


Зачем это нужно

Встроенный поиск браузера не знает русских словоформ: запрос «кот» не найдёт «кота», «коту» или «котами». Это расширение ищет с учётом морфологии, подсвечивает совпадения, позволяет выделять цитаты с заметками, открывать статьи в чистом читателе, сохранять страницы в ZIP для офлайн-просмотра и вести личный словарь терминов.

Всё работает локально в браузере: без аккаунта, без облака и без обязательной сборки перед установкой.


Возможности

Модуль Кратко
Поиск Слова и фразы, регистр, целое слово / подстрока, морфология, iframe и Shadow DOM
Подсветка Цвета обычного и текущего совпадения, навигация «N из M»
Аннотации Выделение цитат, заметки, экспорт, библиография (ГОСТ / APA / MLA / Chicago)
Читатель Mozilla Readability + DOMPurify, поиск и аннотации внутри статьи, Markdown
Офлайн-архив Самодостаточный ZIP (index.html + ресурсы), журнал и встроенный просмотрщик
Словарь Папки, теги, формы, импорт/экспорт JSON, поиск по выделению
QR QR текущей страницы (копирование / PNG) и сканирование QR с изображений
Боковая панель Те же инструменты поиска и аннотаций, закреплённые у края страницы

Установка

Расширение пока не публикуется в Chrome Web Store — ставится как распакованное.

1. Получить исходники

git clone https://github.com/ppvikentiy/web-search.git
cd web-search

Либо скачайте ZIP с GitHub: Code → Download ZIP и распакуйте.

2. Загрузить в браузер

  1. Откройте страницу расширений:
    • Chrome: chrome://extensions
    • Edge: edge://extensions
  2. Включите Режим разработчика.
  3. Нажмите Загрузить распакованное расширение.
  4. Укажите папку проекта — ту, где лежит manifest.json.
  5. При желании закрепите иконку на панели инструментов.

Сборка не нужна: расширение — обычный JavaScript без зависимостей.

Публикация в Store (ZIP / CRX)

В архив должны попасть только файлы расширения (manifest.json, background/, content/, popup/, …). Не включайте README и служебные файлы репозитория, если Store на это жалуется.

Для CRX: chrome://extensionsУпаковать расширение → укажите папку с manifest.json. Ключ .pem сохраните для обновлений.

После правок кода нажмите Обновить на карточке расширения.


Быстрый старт

  1. Откройте обычную страницу http:// или https:// (не chrome:// / edge://).
  2. Нажмите иконку расширения.
  3. Введите слово или фразу → Найти (или Enter).
  4. Листайте совпадения стрелками в попапе или клавишами F3 / Ctrl+G.
  5. Включите Формы слова, чтобы искать русские словоформы.
  6. Включите Режим аннотаций, выделите текст — появится цитата с заметкой и экспортом.

Поиск по странице

Как открыть

  • Попап на панели инструментов
  • Кнопка Закрепить у края экрана — боковая панель на самой странице
  • Контекстное меню по выделенному тексту: Найти на странице
  • Кнопка Найти выделенное в попапе / панели

Параметры поиска

Параметр Описание
Учитывать регистр «Дом» и «дом» — разные совпадения
Целое слово Не искать внутри других слов («кот» ≠ «который»)
Формы слова Русская морфология: «кот» → «кота», «коту», …
Режим фразы Точная / гибкая (пробелы и пунктуация) / морфология каждого слова
Режим совпадения Целое слово или подстрока
Iframe / Shadow DOM Опциональный поиск во вложенных документах и теневом DOM
Исключения HTML-теги и CSS-селекторы, которые пропускаются

Совпадения подсвечиваются на странице; активное — отдельным цветом. Счётчик показывает текущую позицию среди всех найденных.


Аннотации

  1. Включите Режим аннотаций в попапе или боковой панели.
  2. Выделите фрагмент текста — создаётся аннотация.
  3. Либо выделите текст и выберите в контекстном меню Аннотировать.

Что можно делать

  • Добавлять и редактировать заметку к цитате
  • Переходить между аннотациями через плавающую «пилюлю» (счётчик, список, очистка)
  • Экспортировать цитату (TXT / Markdown по шаблону)
  • Копировать библиографическую ссылку
  • Экспортировать запись как литературу
  • Удалять заметку или всю аннотацию

Стиль: фон, подчёркивание или оба. Цвета обычной и активной аннотации настраиваются. Тема всплывающих окон: системная, светлая, тёмная или свои цвета.

Аннотации сохраняются локально для URL страницы (chrome.storage.local). Хэш в адресе не учитывается; в режиме чтения используется URL исходной статьи.


Режим чтения

Открывается из попапа (иконка книги), контекстного меню Открыть в читателе или из логики расширения на странице.

Что происходит

  1. Статья извлекается через Mozilla Readability.
  2. HTML очищается DOMPurify.
  3. Открывается вкладка reader/reader.html с чистым текстом, заголовком и метаданными.

В читателе доступны

  • Поиск по статье (включая морфологию)
  • Режим аннотаций и список цитат
  • Внешний вид: размер шрифта, межстрочный интервал, ширина колонки, цвет фона
  • Переход К оригиналу
  • Навигация по внутренним ссылкам статьи (извлечение следующей статьи в том же читателе)
  • Экспорт: скачать Markdown, скопировать текст или Markdown (опционально с блоком аннотаций)

Офлайн-архив

Сохраняет страницу как самодостаточный ZIP для чтения без сети.

Как сохранить

  • Иконка загрузки в попапе
  • Раздел Офлайн-архив в настройках
  • Сохранение по вставленному URL (фоновая вкладка → архив → закрытие вкладки)

Содержимое ZIP

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-коды

Действие Как
Создать В попапе — 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

Вендорные библиотеки в lib/ / content/

Библиотека Назначение
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, в том числе сохранения свободной лицензии для производных работ.


Ссылки


Участие

Issues и pull request’ы приветствуются в репозитории на GitHub. Перед PR имеет смысл проверить ключевые сценарии на реальной странице в Chrome или Edge.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages