Давайте рассмотрим применение TextPipe на практике. Сам я применяю ее достаточно часто.

Когда в сохраненных HTML страницах надо собрать информацию - сделать это с помощью TextPipe очень удобно. При этом я не обрабатываю файлы, а просто загружаю их в Trial (пробную) вкладку. Т.е. обрабатываю реальную информацию. Получаю результат для работы, при необходимости сохраняю его, а вот фильтр могу и не сохранить, если задача простая.

Итак. Для своего сайта я купил скрипт слайдшоу. Сам скрипт я описывать не буду, чтобы не отвлекаться. Смотрите сами. Скриншот в начале статьи.

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

  1. автоматической генерации файла на заданное количество фотографий,
  2. перевода текста описания на русский язык,
  3. добавления в описание номера фотографии.

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

Информация о том, как показывать фотографии и какое описание при этом выводить реализовано в XML файле. Для каждого слайдшоу требуется его редактирование. Это обусловлено количеством фотографий и их описанием.
Затратив время на редактирование этого файла, я подумал - а почему бы его не генерировать автоматически с нужными мне параметрами?

О файле. Он имеет текстовый XML формат, соответственно его можно обработать в текстовом редакторе. Кроме того, он написан в кодировке UTF-8. А вот с этим надо быть внимательным, т.к. при отображении информации могут появиться неправильные символы из-за сбоя с кодировкой. Файл имеет постоянную заголовочную часть, некоторое количество тэгов <image> соответствующее количеству показываемых фотографий и небольшой завершающий текст. Каждый тэг <image> отображается на 6 строк. Например:

<image>
<thumb_path>load/thumbs/00001.jpg</thumb_path>
<image_path>load/images/00001.jpg</image_path>
<mobile_image_path>load/images_mobile/00001.jpg</mobile_image_path>
<text><![CDATA[<p class=”modernSkinHeaderDesc”>Заголовок для фотографии</p><div class=”modernSkinImageMainText”><p class=”simpleSkinTextWithBottomMargins”>00001. Описание фотографии</p></div>]]></text>
</image> Оригинальный текст был на английском. Здесь я привел уже переведенный на русский язык вариант. Имеет смысл генерировать сразу его.

Пример дан для первой фотографии. Соответственно: load/thumbs/00001.jpg - путь, где находится превью фотографии; load/images/00001.jpg - путь, где находится сама фотография; load/images_mobile/00001.jpg - путь, где находится мобильная версия фотографии. Цифры с номерами, как в этом примере 00001, требуется генерировать по ходу на четырех строках.

Начинаем. Я буду использовать нумерацию строк на скриншоте.

  1. Стандартный ввод - без изменений
  2. Служебная строка - без изменений
  3. Как я писал в ранних статьях TextPipe использует VBScript - урезанный вариант Visual Basic

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

Были объявлены две переменные. i - отвечает за цикл. limit - задает число повторов тэга image и фактически равно количеству фотографий, которые будут в слайдшоу.
dim i
dim limit
Задаем количество фотографий. В нашем примере - 400.
limit = 400
Открываем цикл по i с шагом 1 до того момента, когда будет достигнуто значение limit.
Цикл начинается с For i = 1 To limit
и заканчивается Next
Я предположил, что число фотографий не превысит 999. Думаю - этого достаточно. И написал 4 условных оператора, каждый под определенное количество цифр.
If a <10 Then
processLine = line & “<image>” и т.д.
ElseIf a < 100 Then
processLine = line & “<image>” и т.д.
ElseIf a < 1000 Then
processLine = line & “<image>” line & “<image>” и т.д.
End If

Анализируется параметр a который является выводимым номером в скрипте. В принципе можно было бы сделать цикл по a убрав переменную i. Почему 3 условных оператора? Потому что первое условие выполняется для a от 1 до 9, второе - от 10 до 99 и третье - от 100 до 999. В каждом условии в контексте выводится параметр a, но т.к. его значение может меняться от 1 до 999, то это влияет на количество ведущих нулей. Мы полагаем, что наши изображения нумеруются от 00001 до 00999.

Обращаем внимание на следующее. Мы с ходу формируем тэг image состоящий из шести строк. Поэтому выводимая строка получается достаточно длинная.
processLine = line & “<image>” & EOL & и т.д. Символы & отвечают за конкатенацию символов.

Например, line - пустое значение, “<image>” означает, что на строке выводится просто <image> без кавычек, & EOL означает переход на следующую строку.

Т.е. line & “<image>” & EOL выведет слово или тэг <image>, после чего формирование строки будет продолжено с новой строки.

Следует обратить внимание также на то, что в выводимой строке используются кавычки “. Чтобы они таковыми понимались требуется их удваивать””. Например, p class=””modernSkinHeaderDesc””>.

Ниже - выводимая строка для изображений от 1 до 9, т.е. 00001.jpg - 00009.jpg.

If a <10 Then 
processLine = line & “<image>” & EOL & “<thumb_path>load/thumbs/0000” & a & “.jpg</thumb_path>”& EOL & “<image_path>load/images/0000” & a & “.jpg</image_path>”& EOL & “<mobile_image_path>load/images_mobile/0000” & a & “.jpg</mobile_image_path>”& EOL & “<text><![CDATA[<p class=””modernSkinHeaderDesc””>Заголовок для фотографии</p><div class=””modernSkinImageMainText””><p class=””simpleSkinTextWithBottomMargins””>0000” & a & “. Описание фотографии</p></div>]]></text>”& EOL & EOL & “</image>”& EOL
tri

4. Возвращаемся к скриншоту. 4 - это комментарий. Бывает полезно добавить несколько слов себе на память.
5. Добавляем большой кусок необходимого кода в начало полученного текста
6. и небольшой кусочек - в конец получаемого кода.
7. Ну и последнее - конвертируем слова написанные на русском языке в кодировку UTF-8, чтобы текст корректно отображался в браузере. Все.
8. Эта строка показывает, куда выводить материал - задаем здесь имя файла и его расширение. Последний скриншот - рабочая область. Единственный символ - переход на следующую строку.
Все !

Полный текст программы

'This example script keeps a line counter that
'does not reset for each file

'Our line counter
dim a
dim i
dim limit

'Called for every line in the file
'EOL contains the end of line characters (Unix, DOS or Mac) that must be
'appended to each line
function processLine(line, EOL)

limit = 80
For i = 1 To limit

a = a + 1
'add the count to the end of each line If a <10 Then
processLine = line & "<image>" & EOL & "<thumb_path>load/thumbs/0000" & a & ".jpg</thumb_path>"& EOL & "<image_path>load/images/0000" & a & ".jpg</image_path>"& EOL & "<mobile_image_path>load/images_mobile/0000" & a & ".jpg</mobile_image_path>"& EOL & "<text><![CDATA[<p class=""modernSkinHeaderDesc"">Заголовок для фотографии</p><div class=""modernSkinImageMainText""><p class=""simpleSkinTextWithBottomMargins"">0000" & a & ". Описание фотографии</p></div>]]></text>"& EOL & EOL & "</image>"& EOL
ElseIf a < 100 Then
processLine = line & "<image>" & EOL & "<thumb_path>load/thumbs/000" & a & ".jpg</thumb_path>"& EOL & "<image_path>load/images/000" & a & ".jpg</image_path>"& EOL & "<mobile_image_path>load/images_mobile/000" & a & ".jpg</mobile_image_path>"& EOL & "<text><![CDATA[<p class=""modernSkinHeaderDesc"">Заголовок для фотографии</p><div class=""modernSkinImageMainText""><p class=""simpleSkinTextWithBottomMargins"">000" & a & ". Описание фотографии</p></div>]]></text>"& EOL & EOL & "</image>"& EOL
ElseIf a < 1000 Then
processLine = line & "<image>" & EOL & "<thumb_path>load/thumbs/00" & a & ".jpg</thumb_path>"& EOL & "<image_path>load/images/00" & a & ".jpg</image_path>"& EOL & "<mobile_image_path>load/images_mobile/00" & a & ".jpg</mobile_image_path>"& EOL & "<text><![CDATA[<p class=""modernSkinHeaderDesc"">Заголовок для фотографии</p><div class=""modernSkinImageMainText""><p class=""simpleSkinTextWithBottomMargins"">000" & a & ". Описание фотографии</p></div>]]></text>"& EOL & EOL & "</image>"& EOL
End If line = processLine Next

end function

'Called at the start of a processing job -
'perform one-time initialisation here
sub startJob()
a = 0
end sub

'Called at the end of a processing job -
'destroy any declared objects here
sub endJob()
'do nothing
end sub

'Called before each file is opened -
'perform per-file initialisation here
function startFile()
startFile = ""
end function

'Called before each file is closed -
'flush all pending file output here
function endFile()
endFile = ""
end function