Инструменты пользователя

Инструменты сайта


foobar2000:tagz:tutorial:tagz_intro

Это старая версия документа!


Введение в написание скриптов с использованием Tagz

Tagz это скриптовый язык используемый в foobar2000 не только для конфигурации внешнего вида плэйлистов, но и вообще для реализации любой функциональности уровня продвинутых пользователей. После изучения этого пособия Вы сможете легко использовать этот язык в любых ситуациях. Но начнем мы все же с азов.

Доступ к тэгам и полям

В своей простейшей форме Tagz просто читает информацию из тэгов Ваших музыкальных фалов. Вот так:

%artist%

Foobar2000 ищет тэг artist в песне и возвращает имя испонителя. В случае если этот тэг отутсвует в файле Вы получите в качестве результата вопросительный знак (?). Все что заключено между знаками % рассматривается как тэг, не смотря на имя. Если Вы используете тэг с именем my field в Ваших файлах, то просто используйте %my field% для того чтобы получить информацию из этого тэга.
Кроме того, точно такой же синтаксис используется для доступа к технической информации, например %bitrate% возвращает битрэйт файла, а %_ispaused% покажет Вам сотсояние текущей песни (пауза/проигрывание). Для того чтобы получить более полное описание функциональности Tagz прочтите Справка по функциям и полям, используемым в скриптах Foobar2000 (TAGZ).

Подстановки полей

Опять вернемся к нашему полю %artist% . Начиная с версии 0.9 foobar2000 это поле на самом деле является сокращенной формой для:

$if3($meta(artist),$meta(album artist),$meta(composer),$meta(performer))

Не надо пугаться сложности этого выражения. На самом деле оно говорит: Найти тэг artist. Если его нет, использовать тэг album artist. Если же и его нет, то попытаться использовать тэг composer, а затем performer.

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

Несомненно, использование подстановок делает процесс создания скриптов более удобным, но бывают случаи когда нам нужно получит доступ к не измененному, «чистому» значению поля, тому, которое на самом деле хранится в файле. И мы уже видели как это делается. Для того чтобы прочитать такое (неизмененное подстановкой) значение тэга artist, следует использовать:

$meta(artist)

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

Все еще малопонятно? ;-) Не расстраивайтесь, все станет ясней когда мы начнем разрабатывать настоящий скрипт. Думаю возврат к этой странице и ее повторное прочтение после этого будет весьма уместно.

Функции

Другой важной частью синтаксиса Tagz являются функции, используемые для вычисления огромного разнообразия выражений. Вы передаете некоторые данные в функцию, она их обрабатывает и возвращает результат. Посмотрим на примере:

$repeat('f',10)

Вызов любой функции начинается со знака $ за которым следует имя функции. Данные которые Вы передаете в функцию (называемые аргументами) помещаются в скобках после имени функции. Если аргументов несколько, то они разделяются запятыми. И запомните, не должно быть никаких пробелов в таком вызове, не после знака $, ни после имени функции, ни между аргументами, нигде.
Функция из примера повторяет букву f десять раз. Ниже, когда мы будем говорить о строках, вы поймете почему f указано в одинарных кавычках, а 10 - нет.

Запомните, если Вы вызываете функцию без аргументов, Вы все равно обязаны поставить скобки после имени функции. К примеру, существует функция $rgb(), которая сбрасывает значения цветов к значениям по умолчанию. Так вот, если Вы напишете просто $rgb то в результате получите ошибку

Контроль хода выполнения скрипта: функция ''$if()''

Если Вы когда-нибудь работали с программами обработки табличных данных (напр. Excel), то Вы наверняка сталкивались с оператором if. Этот оператор проверяет условие и, в зависимости от результата проверки, выполняет различные действия: Если условие выполняется, сделать то. Иначе сделать другое
В Tagz для описания данного оператора используется обычный синтаксис для функций.

$if(%title%,%title%,%filename%)

Здесь мы видим стандартный вызов функции с тремя аргументами. Foobar2000 пытается найти тэг title, если такой тэг найден, то выполняется команда стоящая после 1-й запятой, и выдается заголовок композиции (тэг title). Если же в файле нет такого тэга (title), то в этом случае результатом выражения будет имя файла (filename).
Выражения if могут быть настолько сложными, насколько это нужно Вам. Выполняемыми командами могут быть как простые вызовы соответствующих полей (как на примере выше), так и скрипты, состоящие из нескольких сотен строк.

Так же как и подстановки полей, синтаксис Tagz так же предоставляет нам некоторые возможности для того чтобы облегчить процедуру написания скриптов. Указанное выше выражение if может быть сокращено до выражения:

$if2(%title%,%filename%)

Которое означает то же самое. Существует и другое сокращение - Вы можете не указывать часть иначе.

$if(%title%,%title%)

Это выражение покажет тэг title, если таковой имеется, и не покажет ничего если тэга нет. Но и это не предел, можно сократить это выражение еще больше:

[%title%]

Просто поместите имя поля в квадратные скобки ([]). Но данная форма работает только с именами полей, но не с более сложными выражениями.

Контроль хода выполнения скрипта: функция ''$select()''

Другая функция, очень схожая с функцией if, называется $select(), результат ее работы зависит от вычисления числа (напомню что результат работы if зависит от условия).

$select(%tracknumber%,
%artist%,
%album%)

Значение первого аргумента (%tracknumber%) вычисляется (он обязательно должен иметь численное значение), и затем $select проверяет полученное значение, и поступает соответствующим образом. Если значение %tracknumber% равно 1, то выполняется первая из последующих команд (%artist%, показывающая исполнителя композиции). Если значение %tracknumber% равно 2, то выполняется вторая команда (%album%). И так далее. Функция $select() может содержать столько команд, сколько Вам угодно.

Комментирование кода

В Tagz любая строка, начинающаяся с //, является комментарием и полностью игнорируется в ходе выполнения скрипта. Эта строка может содержать все что Вам захочется, но обычно комментарии используются для объяснения работы сложных фрагментов кода, в которых с первого взгляда непонятно что именно делает скрипт. И, конечно же, они являются большим подспорьем если Вы заглядываете в Ваш скрипт раз в полгода :-)

$select(%tracknumber%,
%artist%,
// Это строка комментария
%album%)

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

%artist% // Это НЕ комментарий

Является неверным с точки зрения Tagz

Обработка строк

Это последний раздел введения, но может быть он является самым важным, особенно если Вы имеете некоторый опыт программирования. Основная причина того, что скрипты Tagz всегда выглядят запутанней, чем исходные коды написанные на настоящих языках программирования, это то каким образом Foobar2000 обрабатывает строки. Если вы введете текст, который является просто текстом, не функцией и не любым другим зарезервированным словом, то Fooobar2000 отобразит его без какой-либо обработки. Поэтому самая известная программа hello-world написанная на Tagz выглядит весьма скучно:

Hello, world!

По желанию вы можете заключать строки в одинарные кавычки.

'Hello, world!'

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

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

$if(%album tracks%,
  $select(%tracknumber%,
    %artist%,
    %album%,
    %date%
  ),
  $if2(%artist%,%filename%)
)
$if(%album tracks%,
$select(%tracknumber%,
%artist%,
%album%,
%date%
),
$if2(%artist%,%filename%)
)

Сразу видно какой из них легче читать. Мне сложно представить что кто-нибудь выберет второй вариант :-) Но к сожалению Вы не сможете использовать такие красивые отступы как в 1-м скрипте в Tagz, всему виной то что Foobar2000 расценивает пробелы не как отступы, но как обычные символы. Для первого трэка (tracknumber = 1) версия с отступами выдаст не просто имя исполнителя (%artist%), но имя исполнителя с шестью пробелами в начале. Не совсем то что мы ожидали, правда? А теперь подумайте откуда взялись эти лишние шесть пробелов.

Из этого мы должны сделать такой вывод: никогда не используйте отступы в скриптах Tagz, хотя это и выглядит некрасиво. И это на самом деле последний урок из введения. Сейчас все становится серьезно.

~~DISCUSSION~~

foobar2000/tagz/tutorial/tagz_intro.1171526093.txt.gz · Последние изменения: 2007/02/15 10:54 (внешнее изменение)