Участник: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), после чего предлагается внести сообщение для «истории».

См. также[править]

Категория:Программное обеспечение {{BookCat}}