Документация Engee
Notebook

Конвертация .ngscript в .jl

В этом примере реализована простая утилита для преобразования .ngscript в файлы с расширением .jl, предназначенные для прямого исполнения в терминале Julia.

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

Сам скрипт читает содержимое ноутбука, представленное в формате JSON, обрабатывая две основных категории ячеек: ячейки типа markdown и ячейки типа code. Ячейки markdown сохраняются в виде комментариев, тогда как ячейки с кодом записываются буквально, обеспечивая возможность последующего запуска. Также имеется возможность пропустить ячейки markdown, если это необходимо.

In [ ]:
using JSON

Рассмотрим саму функцию. Она принимает путь к входному файлу и необязательный аргумент skip_markdown, определяющий, пропускать ли ячейки типа markdown при конвертации. Теперь перейдём к алгоритму и рассмотрим его построчно.

  1. Объявляем функцию.
  2. Преобразуем относительный путь к абсолютному.
  3. Формируем имя выходного файла путем замены расширения исходного файла на .jl.
  4. Читаем содержимое файла формата JSON и парсим его в структуру Julia.
  5. Открываем выходной файл для записи.
  6. Цикл перебора всех ячеек.
  7. Если обнаруживается, что ячейка относится к типу markdown.
  8. Пропускаем обработку, если задан флаг пропуска markdown-ячеек.
  9. Пропускаем ячейки markdown, содержащие вставленные изображения (![]).
  10. Записываем содержимое markdown-ячейки в виде комментария Julia (#=...=#).
  11. Если ячейка является кодом и содержит ненулевое количество строк.
  12. Записываем строки кода непосредственно в файл, сохраняя их порядок.
  13. Конец.
In [ ]:
function script2jl(input_path::String; skip_markdown=false)
    input_file = abspath(input_path)
    output_file = replace(input_file, r"\.\w+$" => ".jl")
    notebook = JSON.parsefile(input_file)
    open(output_file, "w") do f
        for cell in notebook["cells"]
            if cell["cell_type"] == "markdown"
                skip_markdown && continue
                any(startswith(l, "![") for l in cell["source"]) && continue
                println(f, "#= ", join(cell["source"]), " =#\n")
            elseif cell["cell_type"] == "code" && !isempty(cell["source"])
                println(f, join(cell["source"]), "\n")
            end
        end
    end
    println("Конвертация ngscript в jl завершена.")
end
Out[0]:
script2jl (generic function with 1 method)

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

Конвертирование файла script2jl.ngscript с указанием абсолютного пути без пропуска ячейки markdown.

In [ ]:
@time script2jl("$(@__DIR__)/script2jl.ngscript")
Конвертация ngscript в jl завершена.
  0.069372 seconds (14.57 k allocations: 1.258 MiB, 95.24% compilation time)

Конвертирование файла script2jl.ngscript c пропуском ячейки markdown.

In [ ]:
@time script2jl("script2jl.ngscript", skip_markdown=true)
Конвертация ngscript в jl завершена.
  0.002050 seconds (740 allocations: 345.977 KiB)

Вывод

По результатам выполнения этого примера мы получили код в формате .jl который можно подключить к любому проекту через команду include("$(@__DIR__)/script2jl.jl"). image.png

Данный инструмент полезен разработчикам, использующим .ngscript для экспериментов и прототипирования. Он позволяет легко переносить рабочий код в полноценные программы на языке Julia.

Благодаря своей простоте и гибкости скрипт повышает эффективность разработки ПО и упрощает миграцию между средами программирования.