9.0 KiB
План: фильтрация файлов через .lst
Цель
Добавить в file picker режим manifest-фильтра:
- пользователь выбирает папку целиком;
- если в корне выбранной папки есть
obscure.lst, он ограничивает набор файлов; - если
.lstнет, сохраняется текущее поведение: выбираются все поддерживаемые файлы; - сам
obscure.lstникогда не отправляется на обработку; - другие файлы с расширением
.lstне являются manifest-файлами и не загружаются.
Правила obscure.lst
Одна строка — одно правило.
- пустые строки игнорируются;
- строки, начинающиеся с
#, являются комментариями; !в начале строки означает отрицательное правило;- пути относительны к выбранной папке;
- абсолютные пути и сегменты
..запрещены; - разделители
\нормализуются в/; - весь путь сравнивается без учёта регистра;
- несколько совпавших правил не создают дубли.
Пример:
*.pdf
reports/name*.docx
!archive/**
!**/*draft*.*
Glob-маски
Поддержать общепринятые шаблоны:
*— любое количество символов, кроме/;?— один символ, кроме/;**— любое количество каталогов;[abc]и[a-z]— классы и диапазоны символов;[!a]и[^a]— отрицательные классы;- обычный путь без glob-символов — точное совпадение.
Семантика:
*.pdf— PDF только в корне выбранной папки;reports/*.pdf— PDF внутриreports;**/*.pdf— PDF на любой глубине;name*.pdf— файлы с префиксомnameв корне;reports/name*.pdf— файлы с префиксомnameнепосредственно вreports;reports/— то же, чтоreports/**;a**b— две звёздочки внутри сегмента работают как обычная*.
Правило без / не применяется рекурсивно. Для поиска на любой глубине нужно
явно использовать **/, например **/*.pdf.
Положительные правила формируют набор кандидатов. Отрицательные правила удаляют совпавшие файлы из результата.
Алгоритм
- Получить все файлы выбранной папки и подпапок через
webkitdirectory. - Нормализовать
webkitRelativePath, убрав имя корневой выбранной папки. - Найти только
obscure.lstв корне выбранной папки, без учёта регистра. Остальные.lstигнорировать. - Если
obscure.lstнет, передать в текущую логику все поддерживаемые файлы. - Если
obscure.lstнайден:- прочитать UTF-8 и убрать BOM;
- разобрать строки и скомпилировать glob в RegExp;
- отбросить некорректные правила с предупреждением и номером строки;
- выбрать поддерживаемые файлы, совпавшие хотя бы с одним положительным правилом;
- удалить совпадения с отрицательными правилами;
- удалить
.lstиз результата; - сохранить исходный порядок файлов и убрать дубли по нормализованному пути.
- Передать итоговый список в существующий цикл построения таблицы без изменений.
Если все положительные правила отсутствуют или некорректны, результат пустой. Автоматический fallback на все файлы запрещён.
Если положительное правило не совпало ни с одним файлом, показать предупреждение, но продолжить обработку остальных правил. Неподдерживаемые файлы не добавлять.
obscure.lst во вложенной папке не является manifest-фильтром и обрабатывается как
обычный неподдерживаемый файл.
Содержимое ZIP отдельно не фильтровать: ZIP выбирается как один файл и далее обрабатывается существующим механизмом раскрытия архивов.
Нормализация и предупреждения
Перед сопоставлением:
- заменить
\на/; - убрать ведущие
./; - свернуть повторные
/; - убрать имя корневой выбранной папки из
webkitRelativePath; - отклонить абсолютные пути, сегменты
..и пустые правила; - отклонить незакрытые классы
[с указанием номера строки.
Ошибки и предупреждения передавать через существующий cfg.onError или
statusEl. Ошибка одного правила не должна останавливать остальные правила.
Ошибка чтения или декодирования obscure.lst даёт предупреждение и пустой результат.
Где менять код
Алгоритм фильтра вынести в чистый модуль рядом с текущим picker, например:
upload/frontend/table/lst_filter.js
Точка подключения — on_folder_change.js, до существующего цикла построения
дерева. DOM и upload-транспорт в модуль фильтра не добавлять.
Сборочные site/static/dist/*.js изменять только штатной сборкой.
Минимальные тесты
Проверить:
- Папка без
.lstсохраняет старое поведение. obscure.lstне попадает в результат, другие.lstтакже не загружаются.*.pdf,name*.pdf,?,**и классы символов.*.pdfсовпадает только с файлом в корне, а**/*.pdf— также сx.pdfв корне и файлами в подпапках.docs/name*.pdf,docs/,a**bи точные пути.- Положительные и отрицательные правила вместе.
- Комментарии, пустые строки, BOM, CRLF и пробелы.
- Регистр всего пути (
DOCS/A.PDFсовпадает сdocs/*.pdf). - Кириллицу, пробелы, вложенные каталоги и обратные слеши (
docs\a.pdf). - Дубли и перекрывающиеся маски.
- Запрет
/etc/x,C:/x,../x,a/../b. - Битую маску без падения всего picker.
- Ошибка чтения
.lstдаёт пустой результат и предупреждение. - Правило без совпадений даёт предупреждение.
- Только отрицательные или полностью битые правила дают пустой результат.
- Другой
.lstв корне не включает manifest-режим. obscure.lstво вложенной папке не включает manifest-режим.- ZIP выбирается целиком, без фильтрации его внутреннего содержимого.
Ограничения реализации
- Не менять backend-контракт.
- Не добавлять базу данных, отдельный сервис или новый формат конфигурации.
- Не переписывать существующий picker.
- Изменить минимальное число файлов.
- Сначала реализовать алгоритм и тесты, затем обновить dist штатной сборкой.