В Рочестерском технологическом институте (RIT) проживает одна из самых больших групп глухих, NTID (Национальный технический институт для глухих) и слабослышащих студентов в мире. В результате доступно множество сервисов, таких как создание субтитров, перевод на ASL и создание заметок. Будучи студентом RIT, я работаю делопроизводителем NTID на некоторых моих курсах. Как правило, я делаю заметки и загружаю заметки, относящиеся к NTID, на веб-сайт RIT note taker, но я также загружаю все свои заметки на свой личный веб-сайт, чтобы я мог получить к ним доступ из любого места, если мне нужно учиться.

Я делаю свои заметки, используя систему набора текста LaTeX, поэтому заметки нужно скомпилировать в PDF с помощью команды pdflatex. Меня это немного раздражает, поскольку мне нужно подключаться по SSH к серверу, на котором размещен мой веб-сайт, каждый раз, когда я обновляю свои заметки, чтобы перекомпилировать их. Поскольку я программист, я ленив и не хочу этого делать. Давайте автоматизируем этот процесс. В этом техническом обзоре я собираюсь обсудить, как мне это удалось.

Мой рабочий процесс

Я храню свои заметки в отдельном репозитории на моем GitHub. Я использую gulpfile, чтобы автоматически перекомпилировать свои заметки, когда я веду их во время урока, чтобы я мог просматривать обновления в реальном времени в Atom (мой любимый текстовый редактор) с помощью пакета pdf-view Atom. Вот скриншот этого рабочего процесса.

Это отлично работает для меня, так как я могу видеть, как мои заметки обновляются в реальном времени каждый раз, когда я сохраняю документ.

Написание собственного плагина Gulp

Раньше я использовал make-файл для компиляции файлов .tex, так как я хотел скомпилировать только измененные файлы. Я вызвал команду make из файла gulp, чтобы я мог использовать наблюдатель файлов gulp для автоматического выполнения этого при каждом сохранении файла, но это оказалось запутанным и чрезмерно надуманным. Пока я писал этот пост, я понял, что использовать gulpfile для вызова make-файла для компиляции файлов .tex в файлы PDF было глупо. Я решил удалить make-файл и полностью выполнить компиляцию и мониторинг изменений в gulpfile.

После некоторого поиска я нашел два существующих плагина gulp, которые выполняли компиляцию LaTeX: gulp-latex и gulp-pdflatex. Первый, gulp-latex, дал мне необъяснимую ошибку, и я отказался от его отладки после того, как возился с его опциями в течение нескольких дней. Я попробовал gulp-pdflatex, и он работал фантастически, пока в моем файле .tex не было синтаксических ошибок.

Глядя на исходный код, я обнаружил, что gulp-pdflatex полагается на пакет под названием node-pdflatex для выполнения компиляции. Оба пакета написаны одним автором. Похоже, что пакет не возвращал данные об ошибках, вместо этого он просто выдавал сообщение Ошибка во время компиляции LaTeX, если компиляция не удалась.

Блин.

Он работал хорошо, когда файлы .tex не содержали синтаксических ошибок, но не был очень информативным, когда они были. Для компиляции файлов .tex пакет вызывает команду pdflatex в подпроцессе, использующем модуль узла child_process. Он сохраняет файлы, выводимые pdflatex, во временном каталоге, а затем возвращает объект Stream или Buffer с содержимым выведенного файла PDF.

Это было относительно легко перепроектировать, поэтому я написал свою собственную версию gulp-pdflatex для моей системы заметок, добавив функции, которые добавляли бы stdout и stderr pdflatex к ошибке. Вместо того, чтобы разделить функциональность на два пакета, я объединил их в один пакет и опубликовал как gulp-плагин под названием gulp-pdflatex2. Оглядываясь назад, я, вероятно, должен был разветвить gulp-pdflatex и отправить запрос на перенос. ¯ \ _ (ツ) _ / ¯

Что касается компиляции только измененных файлов, то это было легко сделать с помощью плагина gulp-changed.

Автоматизация компиляции на моем веб-сайте

Я отобразил свои заметки на своем веб-сайте, клонировав свой репозиторий заметок в статическую папку своего веб-сайта. Мне просто нужен был способ автоматически извлекать и вызывать задачу компиляции gulpfile.

GitHub имеет функцию, известную как веб-перехватчик, которая позволяет внешней службе определять, когда произошли такие события, как отправка в репозиторий. Я установил веб-перехватчик в моем репозитории заметок, чтобы определять, когда я отправляю ему обновление, чтобы он мог отправить POST-запрос на мой личный веб-сайт, когда это произошло.

Теперь для этого мне просто нужен обработчик на моем веб-сервере. Чтобы аутентифицировать запросы от веб-перехватчика GitHub, вам необходимо вычислить хэш для запроса, используя известный всем секретный токен.

Фрагмент вверху, auth_route.js, представляет собой небольшую часть промежуточного программного обеспечения, которое вычисляет хэш запроса. Фрагмент внизу, router.js, сравнивает их и вызывает команды:

git pull
gulp clean
gulp latex

Это извлекает все изменения, которые я внес в репозиторий заметок, очищает файлы журналов и посторонние файлы и перекомпилирует все измененные файлы. Вот ссылка на gulpfile в репозитории заметок, чтобы увидеть специфику каждой задачи gulp.

И это все! Мой личный веб-сайт теперь будет извлекать и перекомпилировать мои заметки LaTeX каждый раз, когда я отправляю им обновление.

Это все, что у меня есть на данный момент. Спасибо за чтение! Пожалуйста, оставьте отзыв, если у вас есть лучший способ сделать это или у вас есть идеи по улучшению, и нажмите кнопку ❤ внизу, если вам понравилась эта статья :)

Следуйте за мной в Twitter: @omgimanerd

Хакерский полдень - это то, с чего хакеры начинают свои дни. Мы часть семьи @AMI. Сейчас мы принимаем заявки и рады обсуждать рекламные и спонсорские возможности.

Если вам понравился этот рассказ, мы рекомендуем прочитать наши Последние технические истории и Современные технические истории. До следующего раза не воспринимайте реалии мира как должное!