转换 .ngscript 在 .jl
此示例实现了一个简单的转换实用程序。 .ngscript 到扩展名的文件 .jl 专为在Julia终端中直接执行而设计。
该脚本的主要任务是提取笔记本电脑单元格的内容(包括markdown文本和可执行代码)并将其保存为可读格式。
脚本本身读取笔记本的内容,以JSON格式呈现,处理两个主要类别的单元格:markdown类型单元格和代码类型单元格。 标记单元格被保存为注释,而代码单元格是按字面编写的,允许以后运行。 如果需要,也可以跳过markdown单元格。
In [ ]:
using JSON
考虑函数本身。 它采用输入文件的路径和可选参数。 skip_markdown,它决定在转换过程中是否跳过markdown类型单元格。
现在让我们继续讨论算法并逐行考虑它。
- 我们声明函数。
- 将相对路径转换为绝对路径。
- 我们通过将源文件的扩展名替换为输出文件的名称
.jl. - 我们读取JSON文件的内容并将其解析为Julia结构。
- 打开输出文件进行录制。
- 循环遍历所有单元格。
- 如果发现单元格属于markdown类型。
- 如果设置了标记单元格跳过标志,则跳过处理.
- 跳过包含插入图像的标记单元格(
![]). - 我们以Julia注释的形式记录markdown单元格的内容(
#=...=# - 如果单元格是代码并且包含非零行数。
- 将代码行直接写入文件,保留它们的顺序。
- 结束。
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。具有绝对路径的ngscript文件,而不跳过markdown单元格。
In [ ]:
@time script2jl("$(@__DIR__)/script2jl.ngscript")
转换一个script2jl。ngscript文件,省略了markdown单元格。
In [ ]:
@time script2jl("script2jl.ngscript", skip_markdown=true)
结论
根据这个例子的结果,我们收到了格式的代码 .jl 它可以通过命令连接到任何项目 include("$(@__DIR__)/script2jl.jl").

此工具对于使用以下功能的开发人员非常有用 .ngscript 用于实验和原型设计。 它允许您轻松地将工作代码转换为Julia语言的完整程序。
由于其简单性和灵活性,该脚本提高了软件开发的效率,并简化了编程环境之间的迁移。