99 бутылок… Исполняют NSIS и Photoshop JavaScript

Сериал "99 бутылок пива" продолжается. Сегодня - 36 и 37-я серии, на сцене языки программирования инсталлятора фирмы Nullsoft и JavaScript for Adobe Photoshop.

36. Nullsoft (SuperPiMP|Scriptable) Install System. NSIS - настраиваемый инсталлятор от компании Nullsoft, позволяющий создать пакет для инсталляции и деинсталляции вашего собственного продукта. Выходной файл представляет собой обычную программу. Для сжатия данных NSIS может использовать алгоритмы Zip и Bzip2, так что весь код получается довольно компактным.

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

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

Все имена переменных начинаются с доллара, программист для своих собственных целей может использовать лишь двадцать переменных - $0..$9, $R0..$R9, переменные не типизированы, в строках выполняется интерполяция, в качестве ограничителей строк подходят любые кавычки. Ветвление выполняется командами сравнения, которые в качестве аргумента принимают три ссылки, по одной из которых происходит переход в зависимости от результата сравнения.

Операции с числами так же выглядят несколько неожиданно. Вообще, даже прочитав полностью документацию, без примеров достаточно просто оставить без внимания некоторые возможности, которые становятся очевидными при просмотре примеров. Так что будете писать инсталлятор для своего продукта - загляните ещё и в примеры.

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

Программа, выводящая песню о пиве (beer.nsi)


; Beer song.  Written by Evgeny Stepanischev
Name "Beer song"
Caption "Beer song"
OutFile "beer99.exe"
BrandingText "Beer song (Evgeny Stepanischev)"
ShowInstDetails show

!macro c
        StrCpy $2 ""
        Call PrintBeer
!macroend

Function PrintBeer
        IntCmp $1 0 no "" ""
        StrCpy $2 "$2$1"
        Goto +2
no:
        StrCpy $2 "$2No"
        StrCpy $2 "$2 bottle"
        IntCmp $1 1 nos "" ""
        StrCpy $2 "$2s"
nos:
        StrCpy $2 "$2 of beer"
FunctionEnd

Section ""
        StrCpy $1 99

loop:
        !insertmacro c
        StrCpy $2 "$2 on the wall, "
        Call PrintBeer
        DetailPrint "$2."
        DetailPrint "Take one and pass around,"
        IntOp $1 $1 - 1

        !insertmacro c
        DetailPrint "$2 on the wall."
        DetailPrint ""
        IntCmp $1 0 "" loop loop

        DetailPrint "No more bottles of beer..."
        DetailPrint "Go to the store and buy some more..."
        DetailPrint "99 bottles of beer."

SectionEnd



37. JavaScript for Adobe Photoshop (Photoshop 7.0 Scriptiong plug-in v.1.0.2a). В Adobe Photoshop с версии 7.0 появились полноценные скриптовые языки. Если верить руководству можно использовать три языка - JavaScript, VBScript и AppleScript.

Описывать JavaScript мне не интересно - базовые конструкции стандартные (включая блок "try"), добавлены лишь специфические объекты для управления всем тем, что есть в Photoshop, соответственно и объектная модель отличается от той, что принята, например, в браузерах.

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

Программа, выводящая песню о пиве (beer.js)


preferences.rulerUnits = Units.POINTS
preferences.typeUnits  = TypeUnits.POINTS

var docRef = documents.add(640, 480)
displayDialogs = DialogModes.NO

var textColor = new SolidColor
textColor.rgb.red = textColor.rgb.green = textColor.rgb.blue  = 0

var TextLayer = docRef.artLayers.add()
TextLayer.kind = LayerKind.TEXT;

TextLayer.textItem.font     = "Tahoma"
TextLayer.textItem.position = Array(10, 10)
TextLayer.textItem.size     = 12
TextLayer.textItem.color    = textColor

var content = ''

function WriteLn(str)
{
        content += '\r'+str
}

function PrintBeer(n)
{
        return (n ? n : 'No') + ' bottle' + (n-1 ? 's' : '') + ' of beer'
}

for (i = 99; i>0;)
{
        WriteLn (PrintBeer(i) + ' on the wall, '+PrintBeer(i)+'.')
        WriteLn ('Take one and pass around,')
        WriteLn (PrintBeer(--i) + ' on the wall.')
        WriteLn ('')
}

WriteLn ('No more bottles of beer...')
WriteLn ('Go to the store and buy some more...')
WriteLn ('99 bottles of beer.')

TextLayer.textItem.contents = content
docRef = textColor = TextLayer = null


11 октября 2002 16:02

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML: