Управление маршрутами

📌 Общие сведения 📌 Схема работы 📌 Практические примеры

Справка по языку DocuScript

DSL для автоматизации обработки .docx-файлов


📌 Общие принципы

🔧 Команды языка DocuScript

return $var1, $var2, ...

Завершает выполнение и возвращает переменные.

return $s_route_number, $s_route_rasp_forward
  • $s_route_number — номер маршрута ("104", "1A", "Туда - Сюда")
  • $s_route_name — буквенное наименование: как правило, список конечных пунктов
  • $s_contract_start — дата начала, поддерживаются различные числово-буквенные форматы даты
  • $s_contract_finish — дата окончания контракта
  • $s_route_rasp_forward — расписание от A до Б
  • $s_route_rasp_backward — расписание в обратном направлении

Переменные, отмеченные жирным - обязательны к возврату

Возможен возврат массивов - смотрите дополнительный раздел о возврате в конце этой справки

Под расписанием подразумевается любой спаршенный текст из документа

Устанавливает: $b_finish = True

set $var = значение

Присваивает значение переменной. Поддерживает типы, выражения и конкатенацию.

set $n_count = 5
set $s_name = "Иван"
set $s_greeting = "Привет, " + $s_name + "!"

🔍 find("текст", $n_start)

Ищет параграф, содержащий текст. Возвращает индекс или -1.

$n_index = find("Раздел 1")
$n_next = find("Далее", $n_index)

🔍 find_r("текст", $n_start)

Версия для тех, кто знаком с регулярными выражениями. Может захватывать и возвращать одну группу. В отличие от команды find, find_r возвращает текст.

Номер строки возвращается неявно в переменной $n_last_found.

$n_index = find("Раздел 1")
$s_route_name = find("Маршрут.*«([^«])»[^»]*$", $n_index)

🔎 find_between("start", "end", $n_start)

Извлекает текст между подстроками в одном параграфе.

$s_name = find_between("Имя: ", ", возраст", $n_pos)

("start" и/или "end" могут быть пустыми, тогда это означает поиск с начала или до конца заданной строки)

🗃️ find_all_tables($n_from, $n_to)

Находит все таблицы между параграфами.

$t_tables = find_all_tables($n_start, $n_end)

🗃️ next_table($n_start)

Возвращает первую таблицу после указанного параграфа.

$t_table = next_table($n_header)

🔤 enter_table $t_table

Активирует таблицу для навигации и чтения.

enter_table $t_data

🔍 seek_cell("текст")

Ищет ячейку с текстом в активной таблице.

seek_cell("Сумма")

➡️ move_right

Перемещает курсор вправо на одну ячейку.

⬇️ move_down

Перемещает курсор вниз на одну ячейку.

📍 move_to_column $n_col

Перемещает курсор в указанный столбец текущей строки.

move_to_column 2

📍 move_to_cell($n_row, $n_col)

Перемещает курсор в конкретную ячейку.

move_to_cell(1, 0)

📖 $s_var = read_cell

Считывает текст из текущей ячейки.

$s_value = read_cell

add_to_array $a_array, значение

Добавляет элемент или массив в существующий массив.

add_to_array $a_list, "новый"
add_to_array $a_list, $a_other

🔗 $s_result = join $a_array with "разделитель"

Объединяет элементы массива в строку.

$s_names = join $a_names with ", "

🖨️ print "текст"

Выводит текст в консоль (для отладки).

print "Обработка завершена"

🔁 Управляющие конструкции

Общее замечание - условие управляющих конструкций if и while - булева переменная (нельзя написать иное выражение или функцию)

if $b_res then ... end

if $b_found then
  print "Найдено!"
  set $n_status = 1
end

while $b_res do ... end

set $n_i = 0
while $n_i < 3 do
  print "Итерация: " + $n_i
  set $n_i = $n_i + 1
end
во избежание зацикливания введено ограничение по числу итераций. Бесконечный цикл завершается ошибкой.

foreach_table $t_item in $t_list do ... end

foreach_table $t_tbl in $t_all do
  enter_table $t_tbl
  seek_cell("Итого")
  move_down
  set $s_total = read_cell
end

🧪 Переменные состояния

🧪 Команды предварительной обработки


🧰 Дополнительные сведения о команде возрата

Если ваш скрипт завершился НЕ командой возрата - это трактуется как ошибка.

Бывает, что в документе содержатся сведения о нескольких маршрутах. Тогда предусмотрены альтернативные формы переменных возврата:

Команд возврата в скрипте может быть несколько.

После команды возрата последующие команды не выполняются.


🧪 Пример полного скрипта

# Извлекаем данные из строки вида
# Маршрут № 56 «ул. Пригородная (кольцевой)»
$n_route_marker = find("Маршрут № ")
$s_route_name = find_between("«", "»", $n_route_marker)
$s_route_number = find_between("Маршрут № ", " «", $n_route_marker)

$s_contract_start = find_between("Начало выполнения работ –  ", "")
$s_contract_finish = find_between("Окончание выполнения работ – ", " года.")

$n_sched_marker_start = find("7.  Сводное расписание отправления транспортных средств из остановочных пунктов ")
$n_sched_marker_finish = find("8. Количество рейсов и пробег транспортных средств.")


$t_tables = find_all_tables($n_sched_marker_start, $n_sched_marker_finish)

add_to_array $a_forward, "Рабочие дни"
foreach_table $t_current in $t_tables do
    enter_table $t_current
	move_to_cell(3,1)
    $s_val = read_cell
    add_to_array $a_forward, $s_val
end

add_to_array $a_forward, "\nВыходные дни"
foreach_table $t_current in $t_tables do
    enter_table $t_current
	move_to_cell(3,2)
    $s_val = read_cell
    add_to_array $a_forward, $s_val
end

$s_route_rasp_forward = join $a_forward
return $s_route_name, $s_route_number, $s_contract_start, $s_contract_finish, $s_route_rasp_forward

✅ Вместо заключения

Если вы хотите добавить новую полезную команду или считаете, что некоторые команды ведут себя нелогично - обращайтесь к автору.