Методы для работы с регистром

Normalize

Команда normalize используется для манипуляции с данными находящимися в регистре.

Обратите внимание!
Команда normalize работает только с регистром.
На вход она получает данные из регистра, и по окончанию работы она возвращает результат в регистр. Некоторые режимы требуют на вход дополнительные аргументы, например replace_substring требует на вход список из регулярных выражений для поиска и значений для замены.

Пример записи команды:

          - normalize:
    # ВКЛЮЧАЕТЕ НУЖНЫЙ ВАМ РЕЖИМ
    routine: replace_substring
    # ПЕРЕДАЕТЕ ДОПОЛНИТЕЛЬНЫЕ АРГУМЕНТЫ, ЕСЛИ ОНИ ТРЕБУЮТСЯ
    args:
        - ^\s+|\s+$: ''
          

Поддерживаются следующие режимы (routine):

Режим Описание
replace_substring Ищет в регистре все вхождения искомой подстроки и меняет их на заданную. Искомая подстрока может быть задана в виде регулярного выражения. Формат передачи пары: подстрока_которую_меняем: подстрока_на_которую_меняем. Пары передаются в параметре args. Можно передавать больше одной пары, поиск и замена в этом случае будет происходить последовательно.
replace_matched Ищет в регистре хотя бы одно вхождение искомой подстроки и если она найдена - меняет все значение регистра на заданное. Искомая подстрока может быть задана в виде регулярного выражения. Формат передачи пары: подстрока_которую_ищем: текст_который_пишем_в_регистр. Пары передаются в параметре args. Можно передавать больше одной пары, поиск в этом случае будет происходить последовательно до первого соответствия. Если соответствие не найдено, регистр остается неизмененным.
increment Увеличивает значение регистра на 1, в регистре должно быть целочисленное значение.
decrement Уменьшает значение регистра на 1, в регистре должно быть целочисленное значение.
capitalize Меняет первую букву каждого слова содержимого регистра на заглавную. Исключение составляют короткие соединительные слова (or, and, of и т.д.).
upper_first Меняет первую букву содержимого регистра на заглавную.
upper Меняет все буквы содержимого регистра на заглавные.
lower Меняет все буквы содержимого регистра на строчные.
url Нормализует URL, если он относительный и делает его абсолютным.
escape_html Преобразует ряд символов, недопустимых в HTML в HTML-сущности.
unescape_html Преобразует все HTML-сущности в регистре в соответсвующие им символы.
urlencode Кодирует содержимое регистра для использования в качестве параметра для GET запроса в URL.
urldecode Декодирует содержимое регистра. Операция, обратная предыдущему режиму.
json2xml Трансформирует данные из регистра формата JSON в формат XML.
transit2xml Трансформирует данные из регистра формата Transit+JSON в формат XML. Работает аналогично предыдущему режиму.
base64 Кодирует содержимое регистра в Base64.
base64_decode Декодирует содержимое регистра из Base64.
base64gzip_decode Декодирует содержимое регистра, если оно в формате Base64GZIP.
base64zip_decode Декодирует содержимое регистра, если оно в формате Base64ZIP.
base64deflate_decode Декодирует содержимое регистра, если оно в формате Base64Deflate.
base64zlib_decode Декодирует содержимое регистра, если оно в формате Base64ZLIB.
md5 Считает сумму MD5 содержимого регистра.
signature Делает цифровую подпись для содержимого регистра, используя заданный алгоритм и шифр, а также кодирует, используя заданную кодировку.
date_format Манипулирует датой и временем.

Рассмотрим режимы более подробно и в качестве примера возьмем следующий фрагмент HTML кода:

          <div class="container">
    <ul class="list">
        <li class="item" id="li1">Text and text</li>
        <li class="item" id="li2">text and text</li>
        <li class="item" id="li3">01/21/2017</li>
        <script>
          var items = {"items":[{"item": {"somefield1": "text", "somefield2": "another text"}}]};
        </script>
    </ul>
    <a href="sandbox.html">Link</a>
</div>
          

Режимы replace_substring и replace_matched работают следующим образом:

              # НАЙДЕМ ПЕРВЫЙ `li`
- find:
    path: "li#li1"
    do:
    # КОМАНДОЙ `parse` ЗАПОЛНИМ РЕГИСТР ТЕКСТОМ, В РЕГИСТРЕ БУДЕТ "Text and text"
    - parse

    # ТЕПЕРЬ ИЗМЕНИМ ДАННЫЕ
    - normalize:
        routine: replace_substring
        args:
            # ПЕРВЫМ ДЕЛОМ ЗАМЕНИМ СЛОВО "text" НА "some another text"
            - text: 'some another text'
            # ПОСЛЕ ЭТОЙ ОПЕРАЦИИ В РЕГИСТРЕ НАХОДИТСЯ "Text and some another text"

            # ТЕПЕРЬ ЗАМЕНИМ СЛОВО "and" НА "or"
            - and: or
            # ПОСЛЕ ЭТОЙ ОПЕРАЦИИ В РЕГИСТРЕ НАХОДИТСЯ "Text or some another text"

            # И НАКОНЕЦ ЗАМЕНИМ СЛОВО "another" НА "other"
            - another: other

    # В РЕГИСТРЕ ТЕПЕРЬ НАХОДИТСЯ "Text or some other text"
              
              # ОБРАТИТЕ ВНИМЕНИЕ!
# `replace_matched`, В ОТЛИЧИИ ОТ `replace_substring`, РАБОТАЕТ ДО ПЕРВОГО СОВПАДЕНИЯ

# НАЙДЕМ ПЕРВЫЙ `li`
- find:
    path: "li#li1"
    do:
    # ЗАПОЛНИМ РЕГИСТР ТЕКСТОМ
    - parse

    # ИЗМЕНИМ ДАННЫЕ
    - normalize:
        routine: replace_matched
        args:
            # ПЕРВЫМ ДЕЛОМ ЗАМЕНИМ ЗНАЧЕНИЕ РЕГИСТРА НА УКАЗАННОЕ "some another text"
            # ЕСЛИ В СОДЕРЖИМОМ РЕГИСТРА ПРИСУТСТВУЕТ СЛОВО "text"
            - text: 'some another text'
            # ПОСЛЕ ЭТОЙ ОПЕРАЦИИ В РЕГИСТРЕ НАХОДИТСЯ "some another text"

            # ВНИМАНИЕ! ВЫПОЛНЕНИЕ ПРЕКРАЩАЕТСЯ ТАК КАК ПРОИЗОШЛО СОВПАДЕНИЕ
            # ПО ПЕРВОМУ АРГУМЕНТУ, НИЖЕ ИДУЩИЕ АРГУМЕНТЫ БУДУТ ПРОИГНОРИРОВАНЫ
            - and: or
            - another: other

    # В РЕГИСТРЕ ТЕПЕРЬ НАХОДИТСЯ "some another text"
              

Примеры работы режимов increment, decrement, capitalize, upper_first, upper и lower:

              # ДЛЯ ЭТОГО РЕЖИМА ДОПУСТИМЫ ТОЛЬКО ЦЕЛОЧИСЛЕННЫЕ ЗНАЧЕНИЯ (1,2,158,203040523421 И Т.Д) В РЕГИСТРЕ
# НАЙДЕМ ПЕРВЫЙ `li`
- find:
    path: "li#li1"
    do:
    # ЗАПОЛНИМ РЕГИСТР ЦИФРОЙ АТРИБУТА `id`
    - parse:
        attr: id
        filter: (\d+)
    # В РЕГИСТРЕ ТЕПЕРЬ НАХОДИТСЯ "1"

    # ИЗМЕНИМ ДАННЫЕ
    - normalize:
        routine: increment

    # В РЕГИСТРЕ ТЕПЕРЬ НАХОДИТСЯ "2"
              
              # ДЛЯ ЭТОГО РЕЖИМА ДОПУСТИМЫ ТОЛЬКО ЦЕЛОЧИСЛЕННЫЕ ЗНАЧЕНИЯ (1,2,158,203040523421 И Т.Д) В РЕГИСТРЕ
# НАЙДЕМ ВТОРОЙ `li`
- find:
    path: "li#li2"
    do:
    # ЗАПОЛНИМ РЕГИСТР ЦИФРОЙ АТРИБУТА `id`
    - parse:
        attr: id
        filter: (\d+)
    # В РЕГИСТРЕ ТЕПЕРЬ НАХОДИТСЯ "2"

    # ИЗМЕНИМ ДАННЫЕ
    - normalize:
        routine: decrement

    # В РЕГИСТРЕ ТЕПЕРЬ НАХОДИТСЯ "1"
              
              # ЗАМЕНИМ ВСЕ ПЕРВЫЕ БУКВЫ ВСЕХ СЛОВ (КРОМЕ СОЕДИНИТЕЛЬНЫХ) В ПРЕДЛОЖЕНИИ НА ЗАГЛАВНЫЕ
# НАЙДЕМ ПЕРВЫЙ `li`
- find:
    path: "li#li1"
    do:
    # ЗАПОЛНИМ РЕГИСТР ТЕКСТОВЫМ СОДЕРЖИМЫМ БЛОКА
    - parse
    # В РЕГИСТРЕ ТЕПЕРЬ НАХОДИТСЯ "Text and text"

    # ИЗМЕНИМ ДАННЫЕ
    - normalize:
        routine: capitalize

    # В РЕГИСТРЕ ТЕПЕРЬ НАХОДИТСЯ "Text and Text"
              
              # ЗАМЕНИМ ТОЛЬКО ПЕРВУЮ БУКВУ В ТЕКСТЕ НА ЗАГЛАВНУЮ
# НАЙДЕМ ВТОРОЙ `li`
- find:
    path: "li#li2"
    do:
    # ЗАПОЛНИМ РЕГИСТР ТЕКСТОВЫМ СОДЕРЖИМЫМ БЛОКА
    - parse
    # В РЕГИСТРЕ ТЕПЕРЬ НАХОДИТСЯ "text and text"

    # ИЗМЕНИМ ДАННЫЕ
    - normalize:
        routine: upper_first

    # В РЕГИСТРЕ ТЕПЕРЬ НАХОДИТСЯ "Text and text"
              
              # ЗАМЕНИМ ВСЕ БУКВЫ В ТЕКСТЕ НА ЗАГЛАВНЫЕ
# НАЙДЕМ ВТОРОЙ `li`
- find:
    path: "li#li2"
    do:
    # ЗАПОЛНИМ РЕГИСТР ТЕКСТОВЫМ СОДЕРЖИМЫМ БЛОКА
    - parse
    # В РЕГИСТРЕ ТЕПЕРЬ НАХОДИТСЯ "text and text"

    # ИЗМЕНИМ ДАННЫЕ
    - normalize:
        routine: upper

    # В РЕГИСТРЕ ТЕПЕРЬ НАХОДИТСЯ "TEXT AND TEXT"
              
              # ЗАМЕНИМ ВСЕ БУКВЫ В ТЕКСТЕ НА СТРОЧНЫЕ
# НАЙДЕМ ПЕРВЫЙ `li`
- find:
    path: "li#li1"
    do:
    # ЗАПОЛНИМ РЕГИСТР ТЕКСТОВЫМ СОДЕРЖИМЫМ БЛОКА
    - parse
    # В РЕГИСТРЕ ТЕПЕРЬ НАХОДИТСЯ "Text and text"

    # ИЗМЕНИМ ДАННЫЕ
    - normalize:
        routine: lower

    # В РЕГИСТРЕ ТЕПЕРЬ НАХОДИТСЯ "text and text"
              

Режимы url, escape_html и unescape_html:

              # ПРИВЕДЕНИЕ ОТНОСИТЕЛЬНЫХ ССЫЛОК К АБСОЛЮТНОМУ ВИДУ
# НАЙДЕМ `a`
- find:
    path: a
    do:
    # ЗАПОЛНИМ РЕГИСТР ЗНАЧЕНИЕМ АТРИБУТА `href`
    - parse:
        attr: href
    # В РЕГИСТРЕ ТЕПЕРЬ НАХОДИТСЯ: sandbox.html

    # ИЗМЕНИМ ДАННЫЕ
    - normalize:
        routine: url

    # В РЕГИСТРЕ ТЕПЕРЬ НАХОДИТСЯ: https://www.diggernaut.com/sandbox.html
              
              # ЗАМЕНИМ <, >, " И Т.П. НА HTML entities
# НАЙДЕМ ПЕРВЫЙ `li`
- find:
    path: "li#li1"
    do:
    # ЗАПОЛНИМ РЕГИСТР СОДЕРЖИМЫМ 
    - parse:
        format: html
    # В РЕГИСТРЕ ТЕПЕРЬ НАХОДИТСЯ: <li class="item" id="1">Text and text</li>

    # ИЗМЕНИМ ДАННЫЕ
    - normalize:
        routine: escape_html

    # В РЕГИСТРЕ ТЕПЕРЬ НАХОДИТСЯ: 
                
              # ЗАМЕНИМ  HTML entities НА <, >, " И Т.П.
# НАЙДЕМ ПЕРВЫЙ `li`
- find:
    path: "li#li1"
    do:
    # ЗАПОЛНИМ РЕГИСТР СОДЕРЖИМЫМ 
    - register_set:

    # ИЗМЕНИМ ДАННЫЕ
    - normalize:
        routine: unescape_html

    # В РЕГИСТРЕ ТЕПЕРЬ НАХОДИТСЯ: <li class="item" id="1">Text and text</li>
              

Режим json2xml:

              # ПРЕОБРАЗОВАНИЕ JSON ДОКУМЕНТА В XML БЛОК ДЛЯ ДАЛЬНЕЙШЕЙ РАБОТЫ С НИМ СТАНДАРТНЫМИ СРЕДСТВАМИ
# НАЙДЕМ ПЕРВЫЙ `script`
- find:
    path: script
    slice: 0
    do:
    # ЗАПОЛНИМ РЕГИСТР ТЕКСТОВЫМ СОДЕРЖИМЫМ 
    - parse
    # В РЕГИСТРЕ ТЕПЕРЬ НАХОДИТСЯ: var items = {"items":[{"item": {"somefield1": "text", "somefield2": "another text"}}]};

    # УДАЛИМ ЛИШНЕЕ
    - normalize:
        routine: replace_substring
        args:
            - \s*var\s*items\s*=\s*: ''
            - \s*;\s*$: '' 
    # В РЕГИСТРЕ ТЕПЕРЬ НАХОДИТСЯ JSON: {"items":[{"item": {"somefield1": "text", "somefield2": "another text"}}]}

    # ПРЕОБРАЗУЕМ ЕГО В XML
    - normalize:
        routine: json2xml
    # В РЕГИСТРЕ ТЕПЕРЬ НАХОДИТСЯ:
    # <body_safe>
    #   <items>
    #     <item>
    #       <somefield1>text</somefield1>
    #       <somefield2>another text</somefield2>
    #     </item>
    #   </items>
    # </body_safe>

    # РАСПАРСИМ ЭТОТ КОНТЕНТ, ПРЕОБРАЗУЕМ ЕГО В БЛОК И ПЕРЕЙДЕМ В НЕГО
    - to_block

    # ТЕПЕРЬ МЫ НАХОДИМСЯ В НОВОМ БЛОКЕ, И МОЖЕМ ХОДИТЬ ПО ЕГО DOM СТРУКТУРЕ
    - find:
        path: item > somefield1
        do:
        - parse
        # В РЕГИСТРЕ ТЕПЕРЬ НАХОДИТСЯ "text"
              

В данном примере мы применяем команду to_block, которая создает новый блок из содержимого регистра. Более подробно с этой командой вы можете ознакомиться в разделе создание нового блока.

Для работы normalize в режиме date_format, необходимы дополнительные аргументы:

Аргумент Описание
format_in Темплейт для входных данных (значения в регистре). В таблице ниже приведены все теги, которые вы можете использовать в темплейте.
format_out Темплейт для выходных данных (как модифицированные данные будут записаны в регистр). В таблице ниже приведены все теги, которые вы можете использовать в темплейте.
add_years Добавляет заданное количество лет к значению в регистре. Задавать можно как положительное, так и отрицательное целочисленное значение.
add_months Добавляет заданное количество месяцев к значению в регистре. Задавать можно как положительное, так и отрицательное целочисленное значение.
add_days Добавляет заданное количество дней к значению в регистре. Задавать можно как положительное, так и отрицательное целочисленное значение.
add_hours Добавляет заданное количество часов к значению в регистре. Задавать можно как положительное, так и отрицательное целочисленное значение.
add_minutes Добавляет заданное количество минут к значению в регистре. Задавать можно как положительное, так и отрицательное целочисленное значение.
add_seconds Добавляет заданное количество секунд к значению в регистре. Задавать можно как положительное, так и отрицательное целочисленное значение.
timezone Переводит дату и время в заданный часовой пояс (TZ). Например: America/New_York

В таблице ниже, представлены все возможные тегами, которые могут быть использованы в темплейтах (format_in, format_out) и примеры их использования:

Тег Описание Темплейт Значение
%a аббревиатура дня недели, например Mon или Fri %a, %d %B Fri, 20 February
%A день недели в полном написании, например Monday или Friday %A, %d %B Friday, 20 February
%b аббревиатура месяца, например Feb или Sep %A, %d %b Friday, 20 Jun
%B полное наименование месяца, например February или September %A, %d %B Friday, 20 June
%C номер столетия, принимает значения от 00 до 99 %С/%y 20/17
%d день месяца, принимает значения от 01 до 31 %Y-%m-%d 2017-10-01
%-d день месяца, принимает значения от 1 до 31 %Y-%m-%-d 2017-10-1
%_d день месяца, принимает значения от 1 или 01 до 31 %Y-%m-%_d 2017-10-01 или 2017-10-1
%D предустановленый темплейт, аналогичен темплейту %m/%d/%y %D 05/08/17
%e день месяца, принимает значения от 1 до 31 %e %B 5 January
%F предустановленый темплейт, аналогичен темплейту %Y-%m-%d %F 2017-10-01
%g двухзначный номер года в соответствии со стандартом ISO-8601:1988 %g 17
%G четырехзначный номер года в соответствии со стандартом ISO-8601:1988 %G 2017
%h то же что и %b% %A, %d %h Friday, 20 Jun
%H час в 24-часовой системе, принимает значения от 00 до 23 %H:%M:%S 08:35:26
%I час в 12-часовой системе, принимает значения от 01 до 12 %I:%M:%S 08:35:26
%-I час в 12-часовой системе, принимает значения от 1 до 12 %-I:%M:%S 8:35:26
%_I час в 12-часовой системе, принимает значения от 1 или 01 до 12 %-I:%M:%S 8:35:26 или 08:35:26
%j порядковый день в году, принимает значения от 1 до 366 Сегодня %j день в году Сегодня 183 день в году
%k час в 24-часовой системе, принимает значения от 0 до 23 %k часов %M минут 8 часов 35 минут
%l час в 12-часовой системе, принимает значения от 1 до 12 %l часов %M минут 8 часов 35 минут
%m порядковый номер месяца, принимает значения от 01 до 12 %Y-%m-%d 2017-10-01
%-m порядковый номер месяца, принимает значения от 1 до 12 %Y-%-m-%d 2017-1-01
%_m порядковый номер месяца, принимает значения от 1 или 01 до 12 %Y-%_m-%d 2017-1-01 или 2017-01-01
%l минуты, принимает значения от 00 до 59 %l часов %M минут 8 часов 35 минут
%n символ переноса строки %Y%n%m 2017\n10
%p значение AM или PM в зависимости от времени, используется при указании времени в 12-часовом формате %I%p 8AM
%P значение am или pm в зависимости от времени, используется при указании времени в 12-часовом формате %I%P 8am
%r то же что и %I:%M:%S %p %r 04:12:37 PM
%R то же что и %H:%M %R 22:35
%s временная метка Unix, выражает количество секунд прошедших с начала эпохи (1 января 1970) %s 1506867213
%S секунды, принимает значения от 00 до 59 %H:%M:%S 08:35:26
%t символ табуляции %Y%t%m 2017\t10
%T то же что и %H:%M:%S %T 08:35:26
%u порядковый номер дня недели от 1 (понедельник) до 7 (воскресенье) Сегодня %u день недели Сегодня 5 день недели
%U номер недели в году, в случае когда неделя начинается с вокресенья, принимает значения от 00 до 53 Шла %U неделя Шла 23 неделя
%V номер недели в году по ISO стандарту, в случае когда неделя начинается с понедельника, принимает значения от 01 до 53. Если в неделе, в которой находится 1 января, содержится 4 и более дней из нового года, эта неделя считается первой неделей нового года, в противном случае - последней неделей прошедшего года. Шла %U неделя Шла 23 неделя
%V номер недели в году по ISO стандарту, в случае когда неделя начинается с понедельника, принимает значения от 01 до 53. Если в неделе, в которой находится 1 января, содержится 4 и более дней из нового года, эта неделя считается первой неделей нового года, в противном случае - последней неделей прошедшего года. Шла %U неделя Шла 23 неделя
%w порядковый номер дня недели от 0 (воскресенье) до 6 (суббота) Сегодня %w день недели Сегодня 5 день недели
%W номер недели в году, в случае когда неделя начинается с понедельника, принимает значения от 00 до 53 Шла %W неделя Шла 23 неделя
%y Двухзначный порядковый номер года %m/%d/%y 10/01/17
%Y Четырехзначный порядковый номер года %Y-%m-%d 2017-10-01
%z поправка ко времени относительно времени UTC. Выводится в формате +HHMM или -HHMM, где + означает восточнее GMT, - - западнее, HH - количество часов, MM - количество минут. %z +0300
%Z аббревиатура временной зоны %Z MSK
%+ то же что и %a %b %e %H:%M:%S %Z %Y %+ Mon Sep 20 13:24:55 MSK 2017
%% символ % %Y%%%m 2017%10

Пример использования:

              # ПРЕОБРАЗОВАНИЕ ДАТ
# НАЙДЕМ ТРЕТИЙ `li`
- find:
    path: 'li#li3'
    do:
    # ЗАПОЛНИМ РЕГИСТР ТЕКСТОВЫМ СОДЕРЖИМЫМ БЛОКА
    - parse
    # В РЕГИСТРЕ ТЕПЕРЬ НАХОДИТСЯ: 01/21/2017

    # ПРЕОБРАЗУЕМ ДАТУ В unix time
    - normalize:
        routine: date_format
        args:
            format_in: "%m/%d/%Y"
            format_out: "%s"
    # В РЕГИСТРЕ ТЕПЕРЬ НАХОДИТСЯ: 1484956800

    # -----------------------------------------------------
    # СНОВА ЗАПОЛНИМ РЕГИСТР ТЕКСТОВЫМ СОДЕРЖИМЫМ БЛОКА
    - parse
    # В РЕГИСТРЕ СНОВА ПЕРВОНАЧАЛЬНОЕ ЗНАЧЕНИЕ: 01/21/2017

    # ДОБАВИМ ДАТЕ ДВА ГОДА
    - normalize:
        routine: date_format
        args:
            format_in: "%m/%d/%Y"
            add_years: 2
            format_out: "%m/%d/%Y"
    # В РЕГИСТРЕ ТЕПЕРЬ НАХОДИТСЯ: 01/21/2019

    # -----------------------------------------------------
    # СНОВА ВОЗЬМЕМ ПЕРВОНАЧАЛЬНОЕ ЗНАЧЕНИЕ
    - parse

    # ВЫЧТЕМ ОДИН ГОД, И ИЗМЕНИМ ФОРМАТ
    - normalize:
        routine: date_format
        args:
            format_in: "%m/%d/%Y"
            add_years: -1
            format_out: "%B,%d %Y"
    # В РЕГИСТРЕ ТЕПЕРЬ НАХОДИТСЯ: January,21 2016

    # -----------------------------------------------------
    # ТЕПЕРЬ ЗАПИШЕМ В РЕГИСТР СОБСТВЕННОЕ ЗНАЧЕНИЕ
    - register_set: '01/21/2017 00:00:00 +0400 UTC'

    # И ПРЕОБРАЗУЕМ ЕГО ПОД НУЖНУЮ НАМ ВРЕМЕННУЮ ЗОНУ: America/New_York
    - normalize:
        routine: date_format
        args:
            format_in: "%m/%d/%Y %T %z %Z"
            timezone: 'America/New_York'
            format_out: "%m/%d/%Y %T %z %Z"
    # В РЕГИСТРЕ ТЕПЕРЬ НАХОДИТСЯ: 01/20/2017 19:00:00 -0500 EST

    # -----------------------------------------------------
    # ДЛЯ АРГУМЕНТА add_* ДОСТУПНЫ СЛЕДУЮЩИЕ ВАРИАНТЫ:
    # add_years   - ГОДЫ
    # add_months  - МЕСЯЦЫ
    # add_days    - ДНИ
    # add_hours   - ЧАСЫ
    # add_minutes - МИНУТЫ
    # add_seconds - СЕКУНДЫ
    # ТАК ЖЕ ЭТИ АРГУМЕНТЫ МОЖНО ПРИМЕНЯТЬ ВМЕСТЕ
    - register_set: '01/21/2017 00:00:00 +0400 UTC'
    - normalize:
        routine: date_format
        args:
            format_in: "%m/%d/%Y %T %z %Z"
            add_years: 10
            add_months: 5
            add_days: 1
            add_hours: 6
            add_minutes: 15
            add_seconds: 50
            format_out: "%m/%d/%Y %T %z %Z"
    # В РЕГИСТРЕ ТЕПЕРЬ НАХОДИТСЯ: 06/22/2027 06:15:50 +0000 UTC
                

Для работы normalize в режиме signature, необходимы дополнительные аргументы:

Аргумент Описание
algo Используемый алгоритм. В настоящий момент поддерживается только HMAC.
cypher Используемый шифр. В настоящий момент поддерживается только SHA256.
encode Используемая кодировка. В настоящий момент поддерживается только Base64.
secret Секретный ключ.

Пример использования:

              # СОЗДАНИЕ ПОДПИСИ
# НАЙДЕМ ПЕРВЫЙ `li`
- find:
    path: 'li#li1'
    do:
    # ЗАПОЛНИМ РЕГИСТР ТЕКСТОВЫМ СОДЕРЖИМЫМ БЛОКА
    - parse

    # В РЕГИСТРЕ "Text and text"
    - normalize:
        routine: signature
        args:
            algo: HMAC
            cypher: SHA256
            encode: Base64
            secret: A6A7A8A9

    # В РЕГИСТРЕ ТЕПЕРЬ НАХОДИТСЯ: eQZxtV7Ae/wu3Enx8C2po9L7j3cefePEwoFZiTmkb7M=
              

Режимы base64, md5:

              # НАЙДЕМ ПЕРВЫЙ `li`
- find:
    path: 'li#li1'
    do:
    # ЗАПОЛНИМ РЕГИСТР ТЕКСТОВЫМ СОДЕРЖИМЫМ БЛОКА
    - parse
    # В РЕГИСТРЕ "Text and text"

    - normalize:
        routine: base64
    # В РЕГИСТРЕ ТЕПЕРЬ НАХОДИТСЯ: VGV4dCBhbmQgdGV4dA==
              
              # НАЙДЕМ ПЕРВЫЙ `li`
- find:
    path: 'li#li1'
    do:
    # ЗАПОЛНИМ РЕГИСТР ТЕКСТОВЫМ СОДЕРЖИМЫМ БЛОКА
    - parse
    # В РЕГИСТРЕ "Text and text"

    - normalize:
        routine: md5
    # В РЕГИСТРЕ ТЕПЕРЬ НАХОДИТСЯ: be8bde1051516b04402f02e00b4687b7
              

Режим base64zlib_decode:

              # УСТАНОВИМ ЗНАЧЕНИЕ РЕГИСТРА В ФОРМАТЕ BASE64 ZLIB
# ЗДЕСЬ МЫ ИМЕЕМ ЗАКОДИРОВАННОЕ ЗНАЧЕНИЕ ДЛЯ СТРОКИ: some text
- register_set: eJwrzs9NVShJrSgBABHoA5o=

# ДЕКОДИРУЕМ ЗНАЧЕНИЕ
- normalize:
    routine: Base64ZLIBDecode

# В РЕГИСТРЕ ТЕПЕРЬ НАХОДИТСЯ: some text
              

В следующем разделе мы расскажем как работать с переменными, аргументами и объектами.