Работа с данными
Постарался оптимизировать работу скрипта как сервером, так и с клиентом.
Заходя в тему, скрипт строит объектное представления текущей страницы, сохраняет его в локальное хранилище браузера (если в теме больше одной страницы) и начинается работа со страницей (описано в следующем пункте).
Если в теме больше двух страниц, то они будут загружены с сервера. Загружаются те страницы, на которые можно перейти с помощью пагинации (кроме текущей и последней так, как в этом нет необходимости).
Страницы загружаются с интервалом в 200 мс, на каждом шаге строится объектное представление, сохраняется и обновляется контент на текущей странице, если в этом есть необходимость.
Изобразил схематически разные варианты загрузки на примере темы из 6 страниц
[ GanjaFoto:#2293148 ]
После этого дополнительные запросы будут только в том случае, если в теме появилось больше одной страницы с последнего посещения (будут загружены только недостающие страницы).
Данные хранятся 5 дней (можно изменить). Страница весит ~15-20 Кб. В хроме, по умолчанию, хранилище размером 5 Мб на сайт.
Если хранилище будет переполнено, то будут удаляться самые старые данные.
Работа со страницей
После того, как построено объектное представление, начинается работа со страницей.
Скрипт находит все обращения на странице и заменяет их на ссылки, сами сообщения при этом на страницу не добавляются. Сообщения будут добавлены только в том случае, если пользователь кликнет по номеру обращения или включит в настройках показ всех сообщений.
Форма для ответа будет добавлена только тогда, когда пользователь кликнет на кнопку [Ответить]. При закрытии формы она скрывается, состояние сохраняется.
Отправить сообщение без перезагрузки получилось, но есть проблема с кодировкой. Игра использует windows-1251, аякс запросы летят в UTF-8, в итоге кириллица отображается некорректно. Тут поможет только админ.
На всё про всё добавлено два слушателя с делегацией событий - один на все клики, второй на комбинацию клавиш [ctrl+enter] для отправки всех форм.
Паттерн
Для того, чтобы скрипт нашел обращение, сообщение должно следовать определенному паттерну.
Сообщение опционально может начинаться с не цифро-буквенного символа или пробела (или комбинации последних двух), далее обязательно число, за ним или не цифро-буквенный символ, или пробел, или перенос строки, или комбинация последних.
Несколько примеров валидных обращений:
4 сообщение
+8 сообщение
15:сообщение
# 16. сообщение
23
сообщение
Скрипт обрабатывает только первое обращение в начале сообщения.