Участник:Ivan Shmakov/MediaWiki как система управления редакциями
Модуль vc-mw
пакета MW позволяет (хотя и весьма ограниченно) использовать MediaWiki в качестве системы управления редакциями (СУР), поддерживая следующие стандартные команды vc.el
:
vc-next-action
(C-x v v);vc-ediff
;vc-print-log
(C-x v l.)
Подготовка к работе[править]
Отметим, что использование модуля vc
предполагает связь выбранного буфера с существующим файлом. Иными словами, первым действием для работы со страницей MediaWiki должно быть обращение к некоторому файлу (возможно — создаваемому для данной цели), для чего можно использовать обычную find-file
(C-x C-f.)
Перед использованием интерфейса MediaWiki, буфер кроме того необходимо «связать» с конкретным экземпляром MediaWiki и конкретной страницей на нем, для чего могут быть применены средства .dir-locals.el
и desktop
(.emacs.desktop
), переменная find-file-hook, а также явные команды.
Автоматическое связывание[править]
(setq mw-buffer-endpoint-safe-hook
(regexp-opt '("https://commons.wikimedia.org/w/api.php"
"https://directory.fsf.org/w/api.php"
"https://en.wikipedia.org/w/api.php"
"https://ru.wikibooks.org/w/api.php"))
mw-buffer-try-file-name-hook
'(mw-buffer-try-file-name-page))
Пример выше задает (mw-buffer-endpoint-safe-hook) список «безопасных» значений для переменной mw-buffer-endpoint-uri, который будет использован, в частности, при указании этой переменной средствами файла .dir-locals.el
, размещаемого в директории рабочих копий страниц MediaWiki. Последний, в свою очередь, может иметь примерно следующее содержание:
;;; .dir-locals.el -*- Emacs-Lisp -*- ((nil (mw-buffer-endpoint-uri . "https://ru.wikibooks.org/w/api.php") (ispell-local-dictionary . "russian") (indent-tabs-mode . nil))) ;;; .dir-locals.el ends here
Требование задать список «безопасных» значений mw-buffer-endpoint-uri оправдано тем, что при использовании автоматического связывания, а равно и средств vc.el
, обращения к указанным URI могут, в общем случае, происходить и без явной команды пользователя.
Значение mw-buffer-endpoint-safe-hook может также быть списком, элементы которого будут поочередно вызываться как функции, с проверяемым URI в качестве единственного аргумента. URI будет считаться допустимым, если любая из этих функций возвратит не-nil
(после чего обход списка будет завершен досрочно.) В противном случае, URI будет отвергнут.
При работе с разноязычными проектами, имеет смысл использовать двухуровневую иерархию директорий, вида: en/wikipedia
, ru/wikibooks
. При этом, в файле .dir-locals.el
«корневой» директории оказывается легко выделить группы настроек, общих для всех проектов, общих для определенного языка (как, например, ispell-local-dictionary), и специфичных для каждого конкретного проекта (mw-buffer-endpoint-uri), подобно:
;;; .dir-locals.el -*- Emacs-Lisp -*- ((nil (indent-tabs-mode . nil)) ("ru" (ispell-local-dictionary . "russian")) ("ru/wikibooks" (mw-buffer-endpoint-uri . "https://ru.wikibooks.org/w/api.php"))) ;;; .dir-locals.el ends here
Переменная (mw-buffer-try-file-name-hook) определяет список функций, используемых для автоматической связи буфера со страницей MediaWiki на этапе find-file
(и косвенно вызываемых из find-file-hook.) Модуль mw-buffer
определяет две таких функции:
mw-buffer-try-file-name-page
- Пытается привязать буфер к странице с именем, совпадающим с именем файла. Ведущие директории игнорируются; символ
_
заменяется на/
. Если страница не найдена, а имя файла состоит из одних десятичных цифр, — интерпретирует его как числовой идентификатор страницы (pageid
, curid.) Если найти подходящую существующую страницу не удается, — считает имя файла именем новой страницы и возвращаетt
. mw-buffer-try-file-name-revision
- Пытается привязать буфер к редакции, числовой идентификатор которой (
revid
, oldid) совпадает с именем файла. Ведущие директории игнорируются, равно как и файлы, имя которых не состоит из одних десятичных цифр. Если соответствующей редакции найти не удается, — возвращаетnil
.
Функция mw-buffer-try-file-name
вызывает функции из списка по-очереди, передавая им имя файла в качестве единственного аргумента, и останавливаясь досрочно, если какая-либо из функций возвращает не-nil
.
Явное связывание[править]
Явно связать буфер с экземпляром MediaWiki и страницей (редакцией) на нем позволяют команды mw-buffer-associate-endpoint
, mw-buffer-associate-page
и mw-buffer-associate-revision
модуля mw-buffer
. Например (где команды кроме первой большей частью равнозначны):
- M-x
mw-buffer-associate-endpoint
RET https://ru.wikibooks.org/w/api.php RET; - M-x
mw-buffer-associate-page
RET 14719 RET; - C-u 14719 M-x
mw-buffer-associate-page
RET; - M-x
mw-buffer-associate-page
RET Участник:Ivan Shmakov/MediaWiki как система управления редакциями RET; - M-x
mw-buffer-associate-revision
RET - RET.
В качестве альтернативы можно воспользоваться командой mw-info-describe-page
, которая вызовет первые две из вышеупомянутых команд если соответствующая информация не была внесена в локальные переменные текущего буфера ранее.
При использовании средств модуля desktop
, соответствующие переменные сохраняются в desktop-файле. Тем самым, загрузка последнего автоматически восстановит обсуждаемую «привязку».
Выполнение кода после связывания[править]
Успешный вызов mw-buffer-associate-page
и mw-buffer-associate-revision
(в том числе и косвенно — через mw-buffer-try-file-name-page
, mw-buffer-try-file-name-revision
) приводит также к выполнению функций, перечисленных в mw-buffer-associate-page-hook. Модуль vc-mw
дополняет значение этой переменной (по-умолчанию: nil
) командой vc-mw-buffer-associated
, которая «сбрасывает» состояние vc.el
для текущего файла, что позволяет модулю обнаружить привязку файла (буфера) к хранилищу редакций.
Загрузка редакции[править]
Загрузить последнюю редакцию в буфер можно используя M-x vc-ediff RET. Далее, SPC в управляющем буфере Ediff (*Ediff Control Panel*
) — перейти на первое (и единственное) различие, после чего a — перенести текст из текущей редакции MediaWiki в «рабочий» буфер.
Удостовериться в совпадении содержания позволит ! — в строке режима появится текст At start of 0 diffs.
Для сравнения текущего содержимого файла с произвольной редакцией можно использовать префиксный аргумент — C-u M-x vc-ediff RET. При этом, редакция для сравнения может относиться к произвольной странице MediaWiki.
Узнать номера редакций для текущей страницы можно используя C-x v l (vc-print-log
.)
Регистрация изменений[править]
Перед регистрацией изменений в MediaWiki имеет смысл повторно воспользоваться M-x mw-buffer-associate-page RET RET (что обновит номер связанной с буфером редакции до последней для данной страницы) и M-x vc-ediff RET, чтобы учесть изменения, внесенные другими пользователями за время работы над содержанием страницы. Помимо прочего, последняя команда также обновит т. н. CSRF token (или edit token — для более ранних версий MediaWiki), а равно и значения переменных vc-mw-buffer-time-stamp и, возможно, vc-mw-buffer-page-time-stamp, — соответствующие параметрам starttimestamp и basetimestamp API. (В противном случае, MediaWiki может отказать в регистрации новой редакции страницы.)
Кроме того, можно воспользоваться M-x mw-eww-preview RET для предварительного просмотра HTML-варианта страницы.
После действий выше, изменения регистрируются обычным C-x v v (vc-next-action
), после чего предлагается внести сообщение для «истории».
См. также[править]
- https://am-1.org/~ivan/archives/git/gitweb.cgi?p=mw-el-2014.git — текущая разрабатываемая версия пакета (Gitweb.)