Эта глава самая важная, поскольку здесь мы встречаемся со всеми остальными актерами клип-сценариев – переменными, функциями и метками. Это главные действующие лица, их присутствие на сцене позволяет клипу жить отдельной от нас, собственной своей жизнью, самостоятельно решая разные задачи. С их помощью клип сам распознаёт, сам назначает, сам изменяет, сам повторяет и сам выбирает. Не правда ли, вполне достаточно, чтобы назвать это искусственным интеллектом? :-) Итак, клип... САМ РАСПОЗНАЁТ $функции$ Программный язык NoteTab-а – это в прямом смысле язык – английский, – поэтому им легко пользоваться, если вы знаете минимальный набор английских слов. Например, понять, какие функции за что отвечают в клипах, очень легко. Функции обозначаются значками $$. Самые распространенные $функции$ начинаются со слов: Get – это простые $функции$, которые дают возможность всего-навсего «получить», актуализировать нужные значения. Например, функция ^$GetParagraph$ актуализирует в «электронном сознании» клипа содержание текстового абзаца, на котором стоит курсор в редакторе. Для чего это нужно? Вставив ^$GetParagraph$ в соответствующую команду клипа, можно редактировать этот абзац, выяснить его размер, запомнить и вставить в другое место текста, произвести в нем поиск слов, заменить какие-то слова на другие слова, «загнать» содержание в %переменную%, чтобы запомнить его и позже произвести с ним различные действия, и т.д. и т.п. Чтобы реально «пощупать», что это такое, давайте создадим простейший клип с использованием этой $функции$. В планшете Библиотеки создайте пустой клип (в контекстном меню: Add New Clip...) и скопируйте туда команду: Большинство $функций$ можно использовать с опциями (уточнениями), которые выставляются в круглых скобках внутри $функций$. Например, ^$GetParagraph(17)$ выдаст содержание 17-го от начала документа абзаца. ^$GetParagraph(+17)$ - содержание абзаца, который по счету идет 17-м после текущего абзаца, где стоит курсор. Соответственно, ^$GetParagraph(-17)$ – 17-й, если отсчитывать абзацы назад от текущего абзаца. Интересно, что на место опций внутрь $функций$ можно вставлять другие $функции$, и тогда получается этакая логическая «матрёшка». Например, нам нужно вставить в текст название текущего документа – просто название, без указания файлового пути и расширения. У нас есть функция ^$GetDocName$, которая показывает целиком и путь, и имя, и расширение файла. Чтобы получить только имя, вставляем эту функцию в функцию ^$GetName(ПутьИмяФайла)$ и получаем: ^$GetName(^$GetDocName$)$. Такие «матрёшки» можно составлять из трех и более $функций$, но это уже для опытных пользователей. Is – это, так сказать «вопросительные» $функции$. Скажем, ^$IsCtrlKeyDown$ переводится так: «Is ctrl key pressed down?» (Клавиша Ctrl нажата?). Если во время выполнения клипа вы нажмете Ctrl, то значение ^$IsCtrlKeyDown$ будет 1; если клавиша не будет нажата – 0. То есть эта $функция$ распознает: «да» или «нет». С помощью этой $функции$, вставленной в тестовую команду (о ней речь в следующей главе), можно нажатием клавиши Ctrl менять ход выполнения клипа, переключая его на другое запрограммированное действие. Или, используя иные клавиши (^$IsShiftKeyDown$, ^$IsAltKeyDown$), переключать на иные действия. Эти вопросительные $функции$ также могут иметь свои опции. Например, в ^$IsAlpha("СтрокиТекста")$ можно вставить какой-нибудь текст и узнать, содержит ли он одни только буквы (ответ: 1), или буквы с символами (ответ: 0). Надеюсь, Вы уже сориентировались и с легкостью расшифруете такую, например, матрёшку: ^$IsAlpha("^$GetParagraph$")$. Str – эти $функции$ имеют дело непосредственно с текстом. Скажем, ^$StrCopy("СтрокиТекста";Индекс;Сумма)$ актуализирует кусочек текста указанного размера, начиная с указанного места (числа символов от начала текста). Пример: ^$StrCopy("Здесь море шумит";6;5)$ -> море. С помощью этой и других $функций$ Str... можно почти моментально находить нужные фрагменты текста в огромном множестве документов – не только тех, что открыты в NoteTab-е, но и вообще на диске компьютера. Обычно это делается так: с помощью $функций$ типа ^$StrPos... определяется начало и конец нужного фрагмента (по контексту или ключевому слову), а затем из целого текста выделяется фрагмент с помощью ^$StrCopy... или ^$StrDelete... Без этих $функций$ я не смог бы, например, встроить в NoteTab «Словарь Даля». Эти функции, как Вы заметили, могут не только находить нужный текст, но и преобразовывать его. Наглядный пример: ^$StrReplace("е";"у";"Щека в реке";True;False)$ -> Щука в руке Как можно догадаться, опция, куда вписана «е» – это изменяемая буква, «у» – на неё меняется. Опция True – «да, различать строчные и прописные буквы», False – «нет, не целое слово». Различных $функций$ очень много, они охватывают практически всё, что можно делать с текстом. Разумеется, запомнить их трудно, лично сам я постоянно обращаюсь к справочнику Программирование клипов.otl, чтобы скопировать их в свои клипы. САМ НАЗНАЧАЕТ %переменные% Итак, сначала ответим на вопрос предыдущей главы. Как сделать, чтобы Клип зажил самостоятельной жизнью – не только сам создавал определенные текстовые документы, но и сохранял их на диске, давал им разные имена по своему усмотрению, и т.д.? Используем поначалу самое простое решение: назначим сами имя для первого сохраняемого файла, а затем используем «присадку», которая будет добавляться в каждое последующее имя, изменяя его. Для этого надо уметь назначать и изменять переменные. Вот пример назначения переменной: ^!Set %Цитата1%="Я из лесу вышел, был сильный мороз" Теперь в любом месте клип-инструкции мы можем вставить переменную ^%Цитата1%, и она сделает свое дело: или добавит этот текст цитаты к какому-либо другому тексту, или будет подвергнута редактированию, или будет использована по другому назначению. Как вы, наверное, заметили, название переменной пишется одним словом. При назначении переменной командный знак «^» перед «процентными» скобками не ставится. Одновременно можно назначить любое количество переменных, разделяя их точкой с запятой, только бы они не совпадали: ^!Set %НекоеЧисло%=7; %ДомашнЖивотн%=корова; %обращ%="Дорогой товарищ"; %врм%="7 апреля 2008 года"; %ВесьТекстДокумента%=^$GetText$; %ИмяТекущДокумента%=^$GetIndexDocName(^$GetDocIndex$)$ Но нам пока нужно назначить одну переменную – для имени файла. Назовем переменную, например, «ПервИмя», а содержание её – «1»: ^!Set %ПервИмя%=1 Теперь команда сохранить файл может выглядеть так: ^!Save As C:\Windows\Рабочий стол\Цитаты\Док^%ПервИмя%.txt – и файл она сохранит под именем Док1.txt Интересно, что клип может совершенно самостоятельно придумать имя для файла, о каком вы даже и не догадываетесь. Для этого используется так называемый «генератор случайных чисел», выдающий совершенно произвольные значения, – ^$StrRandom(Размер[;КакиеБуквыЦифры])$: ^!Save As C:\Windows\Рабочий стол\Цитаты\^$StrRandom(7;А..Я)$.txt В скобках обозначено количество знаков в предполагаемом имени и из каких символов оно должно состоять, в данном случае – из букв от А до Я в верхнем регистре. При каждом запуске этой команды имя будет разное: АЩИУЪПЛ.txt, ИКЩМОЩЮ.txt, ВЛЦВПИЛ.txt, ШЦЦБЩАИ.txt, и т.д. Эта команда случайной генерации весьма удобна для создания оригинальных паролей, когда вы пользуетесь функциями шифровки и дешифровки текста - ^$StrEncrypt("Текст";[пароль])$ и ^$StrDecrypt("Текст";[пароль])$. САМ ИЗМЕНЯЕТ ^!Inc и ^!Dec Команда ^!Inc увеличивает на указанное число единиц цифровое содержание %Переменной%, а ^!Dec, наоборот, уменьшает. Например, если ^%ИмяПеременной% содержит значение 7, и вы запускаете команду ^!Inc %ИмяПеременной% 1 то новое значение %ИмяПеременной% будет 8. Эту команду я применяю, например, когда большие массивы текстовых файлов с помощью клипа перевожу в веб-страницы – клип сам преобразовывает каждый документ и сам же назначает ему новое имя путём увеличения номера в названии документа. Но, давайте, напишем сами простенький клип, который может нам пригодится. Предположим, у нас есть тексты, откуда нам нужно скопировать фрагменты, сохранив их каждый в отдельный файл на флэшку в папку, скажем, «Персоналии». Пишем: ^!IfEmpty %НомерИмя% Метка2 чтобы зрительно представить, Перед нами готовый клип, который вполне может пригодиться в работе. Рассмотрим в нём пока три командные строчки, самые главные: САМ ПОВТОРЯЕТ :метки Иногда бывает необходимо изменить линейную последовательность исполнения команд в клипе: вернуться назад к той или иной команде, чтобы ее повторить, или «перепрыгнуть» вперед, минуя какой-то фрагмент инструкции, к определенной команде. Это можно сделать, используя метки. Метки обозначаются двоеточием «:», после которого следует имя метки. Имя должно писаться одним словом, без пробелов. Например: :НачалоКлипа В инструкции клипа может быть множество меток для разных целей. Если какая-то команда отсылает к метке, то эта метка обязательно должна присутствовать в инструкции, в противном случае клип не станет работать, о чем сообщит табло «Clip sintax error: ... label not found». По-английски «метка» – label. Синтакс языка клипов поддерживает четыре предустановленные метки: NEXT (перейти к следующей строке инструкции), SKIP (пропустить следующую строку инструкции), END (заканчить действие текущего клипа), EXIT (заканчить действие и текущего клипа, и первоначального, если из него был запущен). Что значит «предустановленные»? Лишь то, что эти метки не обязательно помещать в тело клипа, хотя отсылать к ним можно. Например, если команда ^!IfError отсылает к метке END (^!IfError END), то понятно, что здесь идет отсыл в самый конец инструкции клипа (END по-английски – «конец»), где уже нет никаких команд к исполнению. Конечно, можно поставить в конец метку :END и она будет действовать, но это не обязательно, поскольку она уже «предустановлена». Выше мы уже рассматривали клип с двумя обычными метками и с меткой END. Логика его проста, см. комментарии после команд: ^!IfEmpty %НомерИмя% Метка2 С помощью меток и отсылок к ним можно «зациклить» клип, чтобы тот много раз повторял одну и то же, например: :Начало Этот клип вставит (insert) в текст символ §, затем нажмёт на клавиатуре (keyboard) клавишу со стрелкой «вниз» (down), затем пренаправит (go to) выполнение клипа к метке Начало – и далее «сказка про белого бычка» повторится с самого начала. Реально это будет выглядеть так: вставится §, курсор перескочит на одну строчку вниз, снова вставится §, и так до бесконечности, пока размер вашего документа не превысит ограничения текстового редактора или памяти компьютера. Понятно, что такой клип нам не нужен. Рассмотрим другой клип, который может пригодиться в жизни. Предположим, у нас есть научная книга в электронном виде, которую читать нам недосуг и в которой нас интересует всего лишь контекст, связанный с неким ученым Ивановым – упоминания о нем, его цитаты и др. Не беда – NoteTab позволяет буквально за несколько секунд выдернуть из огромной книги все абзацы, в которых фигурирует слово «Иванов», и поместить их в отдельный документ – и уже по этой выборке-репрезентации можно будет сориентироваться, что читать в книге, а что пропустить. Для этого нужно написать следующий клип: :Начали В клипе всего шесть строк: 1) метка :Начали; 2) находим в тексте слово Иванов, автоматически курсор ставится после этого слова; 3) устанавливаем переменную ^%абзац%, содержанием которой становится абзац (paragraph), в котором стоит курсор. Добавляем в файл на диске ВЫБОРКА.txt содержание этой переменной (абзаца) со строчным пробелом (^%NL% ^%NL%). Переводим (jump) курсор в конец строки (line_end), чтобы следующий поиск начался уже после найденного. Переходим к метке :Начали, чтобы повторить поиск следующего абзаца... Этот клип вполне рабочий, хотя нуждается в совершенствовании. Поработав с ним, мы увидим, что каждый раз создавать отдельный документ не имеет смысла, ведь нам нужно только просмотреть контекст, а не хранить его на диске. Поэтому лучше создать временный документ – ^!AppendToFile "C:\WINDOWS\TEMP\ВЫБОРКА.txt" ^%абзац%^%NL%^%NL%; затем, когда выборка завершена, поместить содержание этого документа в переменную – ^!Set %info%=^$GetFileText(C:\WINDOWS\TEMP\ВЫБОРКА.txt)$; и просмотреть содержание этой переменной в info-окошке – ^!Info [L] ^%info%, не забыв стереть уже не нужный временный документ – ^!DeleteFile C:\WINDOWS\TEMP\ВЫБОРКА.txt. Хотя для солидной репрезентации лучше все-таки, чтобы избранные абзацы помещались в отдельный документ (сохранять его надо в папку, где находится сама книга). Тогда в двух документах, в книге и выборке, параллельные абзацы можно будет соединить перекрёстными гиперссылками. Этак просматриваете выборку-репрезентацию, бац, интересное что-то пишут – нажимаете на Ctrl и одновременно кликаете по гиперссылке (или жмете Ctrl+Н), перед вами в другом окне открывается тот же абзац в книге, читаете полный контекст, опять жмёте на гиперссылку – и продолжаете дальше просматривать репрезентацию книги. Позже, поработав с репрезентацией, можно одним кликом стереть в книге все ссылки. Или сохранить их на будущее, поскольку гиперессылка в выборке всегда найдет эту книгу на диске, откроет в окне редактора и поставит курсор на нужный абзац. Гиперссылка на избранное место в другом документе выглядят так: [НазваниеДокумента.txt::ИмяГиперссылки], то есть в квадратные скобки вставляются имя документа с расширением (или полный адрес документа) и имя самой гиперссылки, разделенные двойным двоеточием. Удерживая Ctrl и кликнув между квадратными скобками, вы обнаружите, что курсор перенесся в НазваниеДокумента.txt и стоит на слове ИмяГиперссылки. Пример: в абзац книги клип вставляет [Выборка о ТВ.txt::§1], а в выборку – [История открытия телевидения.txt::§1], – теперь абзацы прочно связаны значком §1, можно перескакивать с одного §1 на другой. Лучше всего, чтобы в именах гиперссылок присутствовала цифра – порядковый номер гиперссылки, который бы в клипе увеличивался на единицу с помощью ^!Inc. А с помощью ^$IsCtrlKeyDown$ можно сделать так, что при запуске клипа с нажатым Ctrl репрезентация будет показана быстрым способом – в окошке Info, а без Ctrl – в отдельном документе с гиперссылками. Еще можно в выборке подсветить красным цветом ключевые слова, чтобы быстрее сориентироваться в контексте (о выделении цветом в NoteTabPro мы говорили в 5-й главе). Также имеет смысл расширить воможности поиска, чтобы репрезантацию можно было составлять не по одному, а по нескольким ключевым словам - их можно вводить в поисковое окошко через пробел. Так что совершенствованию нет предела... Впрочем, о самом главном усовершенствовании я еще не сказал. Чего не хватает этому зацикленному клипу, так это – «тормозов», т.е. чтобы он сам вовремя остановил свое бесконечное повторение. Остановиться клип должен в тот момент, когда все абзацы со словом «Иванов» уже найдены и скопированы в файл. Как это сделать? С помощью команды ^!IfError End (если ошибка, то перейти к концу). Её нужно поставить сразу после команды ^!Find Иванов. Таким образом, в тот самый момент, когда поиск (а он осуществляется вниз, по направлению к концу документа) впереди уже не увидит слова «Иванов», возникнет ошибка поиска, и команда ^!IfError прекратит выполнение клипа. Для разных «повторяющихся» клипов приходится придумывать свои стопоры. Например, если ваш клип использует команду ^!Document NEXT (переход к следующему справа окошку, открытому в NoteTab-е), то, поработав последовательно со всеми открытыми документами, клип упрётся в последний документ и начнет «ругаться». Чтобы вовремя, до «ругани», клип остановился, нужно использовать функции ^$GetDocCount$ (показывает количество открытых в редакторе документов) и ^$GetDocIndex$ (сообщает номер очередности текущего документа). Пишем: ^!If ^$GetDocIndex$ = ^$GetDocCount$ End То есть: если $номер очередности текущего документа$ равен $количеству всех открытых документов$, то переходим к метке End – «конец фильма». САМ ВЫБИРАЕТ (тест-команды) Вообще-то, можно уже не объяснять, что такое «тест-команда» – мы ведь только что её использовали в предыдущем примере (^!If...), и всем должно быть ясно, для чего она. Ясно-то ясно, да не могу удержаться, чтобы не пропеть гимн этому ^!If..., этому коротенькому слову «ЕСЛИ...», которое порождает МЫСЛЬ в любой среде, даже в железе вашего компьютера. Ему посвящаю следующую главу. | *)Форум: | ||||||
| |||||||