Clarify lst glob semantics and tests

This commit is contained in:
Repinoid
2026-10-21 15:51:34 +03:00
parent ce44143a09
commit c0acb52cf6
+43 -15
View File
@@ -19,7 +19,7 @@
- пути относительны к выбранной папке;
- абсолютные пути и сегменты `..` запрещены;
- разделители `\` нормализуются в `/`;
- расширения сравниваются без учёта регистра;
- весь путь сравнивается без учёта регистра;
- несколько совпавших правил не создают дубли.
Пример:
@@ -44,10 +44,16 @@ reports/name*.docx
Семантика:
- `*.pdf` — PDF в выбранной папке и подпапках;
- `*.pdf` — PDF только в корне выбранной папки;
- `reports/*.pdf` — PDF внутри `reports`;
- `**/*.pdf` — PDF на любой глубине;
- `name*.pdf` — файлы с префиксом `name`.
- `name*.pdf` — файлы с префиксом `name` в корне;
- `reports/name*.pdf` — файлы с префиксом `name` непосредственно в `reports`;
- `reports/` — то же, что `reports/**`;
- `a**b` — две звёздочки внутри сегмента работают как обычная `*`.
Правило без `/` не применяется рекурсивно. Для поиска на любой глубине нужно
явно использовать `**/`, например `**/*.pdf`.
Положительные правила формируют набор кандидатов. Отрицательные правила
удаляют совпавшие файлы из результата.
@@ -56,7 +62,9 @@ reports/name*.docx
1. Получить все файлы выбранной папки и подпапок через `webkitdirectory`.
2. Нормализовать `webkitRelativePath`, убрав имя корневой выбранной папки.
3. Найти `.lst` только в корне выбранной папки, без учёта регистра.
3. Найти `.lst` только в корне выбранной папки, без учёта регистра. Если найдено
несколько `.lst`, использовать первый в стабильном алфавитном порядке и
показать предупреждение.
4. Если `.lst` нет, передать в текущую логику все поддерживаемые файлы.
5. Если `.lst` найден:
- прочитать UTF-8 и убрать BOM;
@@ -80,6 +88,21 @@ reports/name*.docx
Содержимое ZIP отдельно не фильтровать: ZIP выбирается как один файл и далее
обрабатывается существующим механизмом раскрытия архивов.
## Нормализация и предупреждения
Перед сопоставлением:
- заменить `\` на `/`;
- убрать ведущие `./`;
- свернуть повторные `/`;
- убрать имя корневой выбранной папки из `webkitRelativePath`;
- отклонить абсолютные пути, сегменты `..` и пустые правила;
- отклонить незакрытые классы `[` с указанием номера строки.
Ошибки и предупреждения передавать через существующий `cfg.onError` или
`statusEl`. Ошибка одного правила не должна останавливать остальные правила.
Ошибка чтения или декодирования `.lst` даёт предупреждение и пустой результат.
## Где менять код
Алгоритм фильтра вынести в чистый модуль рядом с текущим picker, например:
@@ -100,17 +123,22 @@ upload/frontend/table/lst_filter.js
1. Папка без `.lst` сохраняет старое поведение.
2. `.lst` не попадает в результат.
3. `*.pdf`, `name*.pdf`, `?`, `**` и классы символов.
4. Положительные и отрицательные правила вместе.
5. Комментарии, пустые строки, BOM, CRLF и пробелы.
6. Регистр расширения (`A.PDF` совпадает с `*.pdf`).
7. Кириллицу, пробелы и вложенные каталоги.
8. Дубли и перекрывающиеся маски.
9. Запрет `/etc/x`, `C:/x`, `../x`, `a/../b`.
10. Битую маску без падения всего picker.
11. Правило без совпадений с предупреждением.
12. Только отрицательные или полностью битые правила дают пустой результат.
13. `.lst` во вложенной папке не включает manifest-режим.
14. ZIP выбирается целиком, без фильтрации его внутреннего содержимого.
4. `*.pdf` совпадает только с файлом в корне, а `**/*.pdf` — также с `x.pdf`
в корне и файлами в подпапках.
5. `docs/name*.pdf`, `docs/`, `a**b` и точные пути.
6. Положительные и отрицательные правила вместе.
7. Комментарии, пустые строки, BOM, CRLF и пробелы.
8. Регистр всего пути (`DOCS/A.PDF` совпадает с `docs/*.pdf`).
9. Кириллицу, пробелы, вложенные каталоги и обратные слеши (`docs\a.pdf`).
10. Дубли и перекрывающиеся маски.
11. Запрет `/etc/x`, `C:/x`, `../x`, `a/../b`.
12. Битую маску без падения всего picker.
13. Ошибка чтения `.lst` даёт пустой результат и предупреждение.
14. Правило без совпадений даёт предупреждение.
15. Только отрицательные или полностью битые правила дают пустой результат.
16. Несколько `.lst` дают предупреждение и используют первый по имени.
17. `.lst` во вложенной папке не включает manifest-режим.
18. ZIP выбирается целиком, без фильтрации его внутреннего содержимого.
## Ограничения реализации