6.8 KiB
План: фильтрация файлов через .lst
Цель
Добавить в file picker режим manifest-фильтра:
- пользователь выбирает папку целиком;
- если в корне выбранной папки есть
.lst, он ограничивает набор файлов; - если
.lstнет, сохраняется текущее поведение: выбираются все поддерживаемые файлы; - сам
.lstникогда не отправляется на обработку.
Правила .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.
Положительные правила формируют набор кандидатов. Отрицательные правила удаляют совпавшие файлы из результата.
Алгоритм
- Получить все файлы выбранной папки и подпапок через
webkitdirectory. - Нормализовать
webkitRelativePath, убрав имя корневой выбранной папки. - Найти
.lstтолько в корне выбранной папки, без учёта регистра. - Если
.lstнет, передать в текущую логику все поддерживаемые файлы. - Если
.lstнайден:- прочитать UTF-8 и убрать BOM;
- разобрать строки и скомпилировать glob в RegExp;
- отбросить некорректные правила с предупреждением и номером строки;
- выбрать поддерживаемые файлы, совпавшие хотя бы с одним положительным правилом;
- удалить совпадения с отрицательными правилами;
- удалить
.lstиз результата; - сохранить исходный порядок файлов и убрать дубли по нормализованному пути.
- Передать итоговый список в существующий цикл построения таблицы без изменений.
Если все положительные правила отсутствуют или некорректны, результат пустой. Автоматический fallback на все файлы запрещён.
Если положительное правило не совпало ни с одним файлом, показать предупреждение, но продолжить обработку остальных правил. Неподдерживаемые файлы не добавлять.
.lst во вложенной папке не является manifest-фильтром и обрабатывается как
обычный неподдерживаемый файл.
Содержимое ZIP отдельно не фильтровать: ZIP выбирается как один файл и далее обрабатывается существующим механизмом раскрытия архивов.
Где менять код
Алгоритм фильтра вынести в чистый модуль рядом с текущим picker, например:
upload/frontend/table/lst_filter.js
Точка подключения — on_folder_change.js, до существующего цикла построения
дерева. DOM и upload-транспорт в модуль фильтра не добавлять.
Сборочные site/static/dist/*.js изменять только штатной сборкой.
Минимальные тесты
Проверить:
- Папка без
.lstсохраняет старое поведение. .lstне попадает в результат.*.pdf,name*.pdf,?,**и классы символов.- Положительные и отрицательные правила вместе.
- Комментарии, пустые строки, BOM, CRLF и пробелы.
- Регистр расширения (
A.PDFсовпадает с*.pdf). - Кириллицу, пробелы и вложенные каталоги.
- Дубли и перекрывающиеся маски.
- Запрет
/etc/x,C:/x,../x,a/../b. - Битую маску без падения всего picker.
- Правило без совпадений с предупреждением.
- Только отрицательные или полностью битые правила дают пустой результат.
.lstво вложенной папке не включает manifest-режим.- ZIP выбирается целиком, без фильтрации его внутреннего содержимого.
Ограничения реализации
- Не менять backend-контракт.
- Не добавлять базу данных, отдельный сервис или новый формат конфигурации.
- Не переписывать существующий picker.
- Изменить минимальное число файлов.
- Сначала реализовать алгоритм и тесты, затем обновить dist штатной сборкой.