Дополнения (plugin), использование, создание

<span lang="ru">
ITEM:   Что такое дополнения (plugin)?

Дополнения (pluginы) это фрагменты кода, которые позволяют модифицировать
работу приложения album. Вероятно создание дополнений - это
один из самых простых способов от создания новых элементов
EXIF комментариев до создания базы данных изображений, основанных
на собственном алгоритме иерархии, а не на иерархии файловой системы.

ITEM:   Установка дополнения и их поддержка

Вообще, есть большое число дополнений, доступных при стандартной установки
приложения album. Если вы обновили приложение album дополнениями из
более ранних версий приложения (ранее версии 3.10), вам может потребоваться
запустить команду, для конфигурирования приложения:

<code>% album -configure</code>

Позже, при работе с приложением album, эту команду запускать еще раз не нужно.

Эта команда устанавливает доступные на данный момент времени дополнения в
папку, указанную по умолчанию. Но вообще, приложение album ищет доступные
дополнения в следующих папках (это места по умолчанию):
<tt>
  /etc/album/plugins/
  /usr/share/album/plugins/
  $HOME/.album/plugins/
</tt>
Все эти папки для дополнений можно указать приложению при запуске с опцией 
'--data_path', но все же по умолчанию определено:
<tt>
  /etc/album/
  /usr/share/album/
  $HOME/.album/
</tt>
Иными словами вы можете указать новое расположение папок опцией
 --data_path, а затем добавить папку конкретного дополнения путем
указание пути к ней, через опцию --plugin_path.

Сами файлы дополнений обычно имеют префикс ".alp", при использовании
дополнения его указывать не нужно. К примеру, у вас есть дополнения, 
установленное в:

<tt>/etc/album/plugins/utils/mv.alp</tt>

То вам при обращении к нему можно просто указать:  utils/mv

ITEM:   Загрузка/Выгрузка дополнений

Чтобы увидеть все установленные в данный момент времени дополнения
введите команду:

<code>% album -list_plugins</code>

А, чтобы посмотреть информацию об указанном дополнении (использующим
путь 'utils/mv'?, к примеру):

<code>% album -plugin_info utils/mv</code>

Дополнения будут сохранены как часть конфигурации для данной галереи,
поэтому не надо будет каждый раз их указывать по-новой при последующих
запусках, за исключением дополнений, которые работают однократно, таких 
как 'utils/mv')

Вы можете использовать опции -no_plugin и -clear_plugin для отключения
дополнений, которые уже сохранены как часть конфигурации приложения
album. Как и другие <a href="Section_3.html#Options">обычные опции</a>, предназначенные для отключения 
чего-либо, опция -no_plugin отключит указанное дополнение, а -clear_plugin 
отключит все дополнения.  Любые опции, которые были указаны для дополнения,
будут стерты тоже.

ITEM:   Опции дополнений

Сами дополнения способны воспринимать опции командной строки, чтобы посмотреть
использование можно ввести команду:

<code>% album -plugin_usage utils/mv</code>

Но когда указывают опции для дополнений, вам необходимо указать и то, 
к каккому дополнению имеет отношения данная опция, поэтому 
вместо обычного стиля указаний опций:

<code>% album -some_option</code>

При этом опция для дополнения отделяется двоеточием:

<code>% album -some_plugin:some_option</code>

К примеру, вы можете указать 'index' созданный дополнением
'utils/capindex', тогда следуюет ввести команду:

<code>% album -plugin utils/capindex  -utils/capindex:index blah.html</code>

Получается не очень коротко, но можно укоротить названия для
дополнения, при условии если он не будет конфликтовать с другим
названием другого дополнения (с тем же самым именем).

<code>% album -plugin utils/capindex  -capindex:index</code>

Есть и другие виды опций (строки, числа и множества) для них
вомзожно использовать те же самые соотношения. Они сохраняются
конфигурации приложения, как и другие обычные опции.

Одно предупреждение... Как было упомянуто выше, когда используется дополнения
они сохраняется в конфигурации приложения album. Если вы хотите добавить
опции, к приложению, которые обычно используются совместно с данным
дополнением, то необходимо либо упомянуть дополнение снова, либо
использоваться полное название когда указываются обычные опции.

К примеру, рассмотрим:

<code>% album -plugin some/example/thumbGen Photos/Spain</code>

Предположим, что после этого, необходимо использовать опцию "fast" для
thumbGen, то вот так ничего работать не будет работать:

<code>% album -thumbGen:fast Photos/Spain</code>

А вот это будет работать нормально:

<code>% album -plugin some/example/thumbGen -thumbGen:fast blah.html Photos/Spain</code>
<code>% album -some/example/thumbGen:fast Photos/Spain</code>

ITEM:   Написание дополнений

Фактически дополнение - это маленькие программные модули perl, которые
"добавляются" в код приложения album.

Есть много вариантов программных модулей, расширяюших возможности
работы приложения album. Общая особенность всех их состоит в том, что они
либо замещают часть программного кода самого приложения, либо
замещают его собственным программным кодом. Естественно, по мере необходимости, со временем
можно будет добавить любые дополнения...

Перечь все установленных модулей можно увидеть путем ввода команды:

<code>% album -list_hooks</code>

Так же вы можете получить дополнительную информацию о программном коде:

<code>% album -hook_info &lt;hook_name&gt;</code>

Мы можем использовать приложения album для генерации каркаса дополнения:

<code>% album -create_plugin</code>

Для этой работы, необходимо четко понимать как работает приложение, и,
что позволяют получить опции.

Мы можем также написать дополнение полностью вручную, чтобы это сделать, 
полезно изучить уже написанные дополнения, чтобы понять принцип их
работы.

Регистрация дополнений, производится путем вызова функции album::hook().
Для вызова функций в кода приложения album, используется пространство
имен приложения album.
К примеру, для регистрации программного кода для clean_name 
дополнения hook производится вызов:

album::hook($opt,'clean_name',\&my_clean);

Затем если приложение album 
Then whenever album does a clean_name it will also call the plugin
subroutine called my_clean (which we need to provide).

To write <code>my_clean</code> let's look at the clean_name hook info:
<tt>
  Args: ($opt, 'clean_name',  $name, $iscaption)
  Description: Clean a filename for printing.
    The name is either the filename or comes from the caption file.
  Returns: Clean name
</tt>
Аргументы, которые соответствует подрограмме my_clean указаны
в первой строке. Если необходимо конвертировать их
в строчные буквам, то нужно использовать:
<tt>
sub my_clean {
  my ($opt, $hookname, $name, $iscaption) = @_;
  return uc($name);
}
</tt>
Объяснение аргументов:

<b>$opt</b>        Это обозначение для все опций приложения album.
            Здесь оно не используется. Но иногда оно может понадобится,
            если необходимо вызвать какую-либо встроенную функцию
            приложения album. Это же справедливо если использует аргумент
             $data.
<b>$hookname</b>   In this case it will be 'clean_name'.  This allows us
            to register the same subroutine to handle different hooks.
<b>$name</b>       This is the name we are going to clean.
<b>$iscaption</b>  This tells us whether the name came from a caption file.
            To understand any of the options after the $hookname you
            may need to look at the corresponding code in album.

In this case we only needed to use the supplied <b>$name</b>, we called
the perl uppercase routine and returned that.  The code is done, but now
we need to create the plugin framework.
 
Некоторые программные модули, позволяют заместить программный код
самого приложения album. К примеру, необходимос написать 
программный модуль, который будет генерировать иконки
предпросмотра для pdf файлов (приложение 'convert' именно этот 
подход). Можно зарегистрировать программный для модуля 
'thumbnail' и получить только поле 'undef', если не pdf файл
не найден, но когда pdf файл найден, создается иконка
предпросмотра, и только потом происходит возврат. Когда
приложение album возвращает иконку предпросмотра, то
он же и будет ее использовать, пропуская собственный фрагмент
программного кода для создания иконок предпросмотра.

Теперь пришла пора закончить написание нашего дополнения для 
преобразования в происные буквы. Дополнение должны делать
следующее:

<b>1)</b> Поддерживать 'start_plugin' подпрограмму.  Т.е. тот фрагмент кода
   где происходит регистрация дополнительных программных модулей
   и соответствующих им опций командной строки.

<b>2)</b> Подрограмма 'start_plugin' должна возращать информацию дополнения
   в hash, в которой необходимо указать следующие поля:
   <i>author</i>      =&gt; Имя автора
   <i>href</i>        =&gt; URL (или mailto, конечно) для автора
   <i>version</i>     =&gt; Номер версии для дополнения
   <i>description</i> =&gt; Текстовое описание дополнения

<b>3)</b> По окончанию дополнение возвращает '1' (аналогично как и perl модуль).

Ниже представлен наш пример, код дополнения <code>clean_name</code> полностью:

<hr>
sub start_plugin {
  my ($opt) = @_;

  album::hook($opt,'clean_name',\&my_clean);

  return {
    author =&gt; 'David Ljung Madison',
    href =&gt; 'http://MarginalHacks.com/',
    version =&gt; '1.0',
    description =&gt; "Conver image names to uppercase",
  };
}

sub my_clean {
  return uc($name);
}

1;
<hr>

В конечном счете, нам необходимо все это сохранить где-либо. 
Дополнения организованы в папке для дополнений,  в соответствии
с иерархией данной папки, в нашем случае можно сохранить данные
по пути:

  <tt>captions/formatting/NAME.alp</tt>

Фактически, если посмотреть examples/formatting/NAME.alp 
можно обнаружить, что дополнение уже там находится, и, что
фактически оно одно и тоже.

Если необходимо, чтобы дополнение имело доступ к опциям
командной строки, то нужно использовать конструкцию 'add_option.'
И это должно быть сделано в разделе start_plugin. 
Вот некоторые примеры:
<tt>
  album::add_option(1,"fast",album::OPTION_BOOL, usage=&gt;"Делает это быстро");
  album::add_option(1,"name", album::OPTION_STR, usage=&gt;"Ваше имя");
  album::add_option(1,"colors",album::OPTION_ARR, usage=&gt;"Цвет списка");
</tt>
Для большей информации, посмотрите код 'add_option' в приложении album 
и ознакомьтесь со все вариантами его использования (в приложении album
и в дополнениях, которые испольузют 'add_option')

Для чтения опций, которые пользователь может установить, 
используется option():
<tt>
  my $fast = album::option($opt, "быстро");
</tt>
Чтобы пользователь не вводил неправильные значения опций, можно использовать
usage():
<tt>
  album::usage("-colors array can only include values [red, green, blue]");
</tt>
Если вашему дополнению нужно загрузить модули, которые
не являются часть стандартного дистрибутива Perl, посмотрите
пример plugins/extra/rss.alp.

Так же можно вызывать любой фргамент программного кода в скрипте
приложение album, путем использования двоеточие. Чтобы точно знать
как это можно сделать посмотрите примеры:

<tt>
  album::add_head($opt,$data, "&lt;meta name='add_this' content='to the &lt;head&gt;'&gt;");
  album::add_header($opt,$data, "&lt;p&gt;This gets added to the album header");
  album::add_footer($opt,$data, "&lt;p&gt;This gets added to the album footer");
</tt>

Лучший способ понять как написать дополнения - это посмотреть другое
работающее дополнение. Вероятно надо будет скопировать какую-либо
его часть и запустить его отдельно, чтобы понять как оно работает.
В будущем возможно появятся специальные программы для создание дополнений
для приложения album.

Есть опция, которая позволяет создать шаблон дополнения:

<code>% album -create_plugin</code>

ITEM: Переведено
Чубаровым И.Ю. (Tchubarov I, aka krolik, ceramic64@yandex.ru)
</span>
