В предыдущей статье мы попытались определить минимально необходимые свойства сортировщика таблиц. Вряд ли произведённые определения можно сильно оспорить; другие минималистские сортировщики в общем с ними согласуются.
Максимальный список задач для сортировщика HTML-таблиц тоже определить несложно – напихать туда всё, что только можно собрать (включая массовое переименование файлов, растеризацию postscript и отправку почты), и дело с концом.
Самое сложное – найти золотую середину. Или хотя бы только один, первый шаг в сторону усложнения Simple Table Sorter. Сейчас наш маленький сортировщик – абсолютно законченная, совершенная вещь в себе; любой сдвиг может нарушить равновесие и всё испортить. Попробуем понять, чего же «нулевой» версии не хватает.
Новые функции добавляются в программу под давлением двух обстоятельств: пожеланий пользователей и требований, предъявляемых самим обрабатываемым материалом. Материал в этой части выглядит как фатальная неизбежность (если проигнорировать, программа не сможет работать), поэтому его требования поставим первыми.
(1) Требование со стороны материала (HTML-таблиц), в общем, только одно: возможность обрабатывать большие объёмы.
Требования со стороны пользователей тоже неоднородны по весу. Их условно можно разделить на «рюшечки для души» и на «системные». Последние, конечно, важнее. Одно из них прямо вытекает из логики программы. Для чего вообще сортировать таблицы? – Чтобы представить данные в более удобном виде. А для чего этот более удобный вид? – Чтобы быстрее что-то в таблице найти. Сортировка – это, в сущности, косвенный способ отбора, поиска данных.
(2) Таким образом, первое системное улучшение «от пользователей» – добавление прямого поиска – фильтрации, отбора данных по столбцам таблицы.
Вот, собственно, и всё. Если попытаться выполнить хотя бы одно требование материала (1) и одно требование пользователей (2), Simple Table Sorter неизбежно и немедленно превратится в Big Table Sorter; то есть для Простого сортировщика возможна только одна версия. Теоретически можно, конечно, попытаться добавить фильтрацию данных без учёта больших объёмов текста, но это просто будет лишняя работа, так сильно всё в программе взаимосвязано. То есть поиск данных для таблицы в 200 строк будет радикально отличаться от поиска для таблицы в 2000 строк, а с учётом того что массив для поиска и сортировки используется один (для скорости работы и внутренней логичности программы), переделывать пришлось бы всю программу.
Принципы работы с большими таблицами в браузере подробно описаны в статье Javascript база данных.
(3) Один из них – постраничный вывод: без него принципиально невозможно работать с большой (несколько тысяч строк) таблицей (ну, и на следующем этапе усложнения задач его всё равно бы запросили для удобства пользователи).
В итоге схема программы вырисовывается примерно такая:
Ядро Простого сортировщика находится у нас внутри одного объекта (функции) и состоит из двух основных функций: подготовки таблиц и обработки действий пользователя. Мы бы хотели сохранить это и дальше, в Большом сортировщике. Но код в нём вырастет лавинообразно. Я бы даже сказал, взрывообразно. И для удобства работы с этим кодом лучше вынести вспомогательные функции в отдельный файл.
Хотя бы один отдельный файл – потому что по своему назначению вспомогательные элементы можно разделить минимум на три группы: 1) обслуживающие функции «общего назначения» типа trim(), getCookie(); 2) рисование HTML-элементов (типа полей ввода для поиска); 3) обработка подключаемых модулей (типа «Сохранять состояние сортировки между загрузками», «Вести хронометраж»).
Даже при одном вспомогательном файле могут быть противоречия: например, фильтрация данных является отключаемым модулем, но функции поиска лучше бы быть в ядре, так как она слишком тесно связана с другими (непосредственно влияет на работу сортировщика).
Готовый набор с учётом предлагаемого минимума функциональности находится в файле BigTableSorter1.zip.
Подключать, как предыдущий, но вписывать в HEAD HTML-страницы надо больше файлов:
А к оформлению таблицы предъявляются более строгие требования:
1) Обязательно наличие элемента THEAD, внутри которого должна находится одна строка с ячейками заголовка таблицы.
2) В ячейках заголовка обязательно указывать явно тип данных для сортировки, с помощью атрибута axis:
Если не указать тип данных явно (в виде axis='num' или axis='str'), колонка сортироваться не будет.
3) TBODY можно в таблице явно не указывать; но если указывать, то этот элемент должен быть в таблице только один.
Чтобы отключить вывод хронометража, нужно в 3-ей строке файла tabtools1.js указать show_log: false. Измерение скорости установлено по умолчанию, так как это тестовая версия – по сути, «болванка», для которой можно теперь наращивать функциональность, пока не дорастёт до полного Big Table Sorter 3. Да, полная версия уже существует! :-) Но она недостаточно оптимально написана. Поэтому и создаю для неё заново более правильный, аккуратный «скелет».
В начале файла tabtools1.js находится объект def, содержащий в первой, минимальной версии следующие данные для настройки:
Вот и всё. Никаких тебе use_cookie для сохранения состояния сортировки, или is_dict для работы с большим словарём, как в версии 3 (BigTableSorter.zip). Об этом будет следующая статья.
Поправочка. Разрабатывая новый сайт для телефонного справочника «Иркутские Жёлтые Страницы», я заметил, что в Сортировщике кое-чего не хватает. Нужно дополнить список необходимых задач подсвечиванием искомого фрагмента (в отобранных при фильтрации строках таблицы). Мелочь, но очень удобно:
После добавления этой возможности в телефонный справочник, добавил её также и в исходный BigTableSorter1.