Конвертация .ngscript
в .jl
¶
В этом примере реализована простая утилита для преобразования .ngscript
в файлы с расширением .jl
, предназначенные для прямого исполнения в терминале Julia.
Основная задача скрипта заключается в извлечении содержимого ячеек ноутбука (включая как markdown-текст, так и исполняемый код) и сохранении его в удобочитаемом формате.
Сам скрипт читает содержимое ноутбука, представленное в формате JSON, обрабатывая две основных категории ячеек: ячейки типа markdown и ячейки типа code. Ячейки markdown сохраняются в виде комментариев, тогда как ячейки с кодом записываются буквально, обеспечивая возможность последующего запуска. Также имеется возможность пропустить ячейки markdown, если это необходимо.
using JSON
Рассмотрим саму функцию. Она принимает путь к входному файлу и необязательный аргумент skip_markdown
, определяющий, пропускать ли ячейки типа markdown при конвертации.
Теперь перейдём к алгоритму и рассмотрим его построчно.
- Объявляем функцию.
- Преобразуем относительный путь к абсолютному.
- Формируем имя выходного файла путем замены расширения исходного файла на
.jl
. - Читаем содержимое файла формата JSON и парсим его в структуру Julia.
- Открываем выходной файл для записи.
- Цикл перебора всех ячеек.
- Если обнаруживается, что ячейка относится к типу markdown.
- Пропускаем обработку, если задан флаг пропуска markdown-ячеек.
- Пропускаем ячейки markdown, содержащие вставленные изображения (
![]
). - Записываем содержимое markdown-ячейки в виде комментария Julia (
#=...=#
). - Если ячейка является кодом и содержит ненулевое количество строк.
- Записываем строки кода непосредственно в файл, сохраняя их порядок.
- Конец.
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
Примеры использования¶
Конвертирование файла script2jl.ngscript с указанием абсолютного пути без пропуска ячейки markdown.
@time script2jl("$(@__DIR__)/script2jl.ngscript")
Конвертирование файла script2jl.ngscript c пропуском ячейки markdown.
@time script2jl("script2jl.ngscript", skip_markdown=true)
Вывод¶
По результатам выполнения этого примера мы получили код в формате .jl
который можно подключить к любому проекту через команду include("$(@__DIR__)/script2jl.jl")
.
Данный инструмент полезен разработчикам, использующим .ngscript
для экспериментов и прототипирования. Он позволяет легко переносить рабочий код в полноценные программы на языке Julia.
Благодаря своей простоте и гибкости скрипт повышает эффективность разработки ПО и упрощает миграцию между средами программирования.