将.ngscript
转换为.jl
¶
本例实现了一个简单实用程序,可将.ngscript
转换为扩展名为.jl
的文件,供在 Julia 终端直接执行。
脚本的主要任务是提取笔记本单元格的内容(包括 markdown 文本和可执行代码),并将其保存为可读格式。
脚本本身读取以 JSON 格式表示的笔记本内容,处理两大类单元格:markdown 单元格和代码单元格。标记单元格以注释的形式保存,而代码单元格则以字面形式写入,以便日后运行。如有必要,还可以跳过标记单元格。
In [ ]:
using JSON
让我们来看看函数本身。它接收输入文件的路径和一个可选参数skip_markdown
,该参数决定在转换过程中是否跳过标记符单元格。
现在让我们逐行查看算法。
- 声明一个函数。
2.2. 将相对路径转换为绝对路径。
3.用
.jl
替换源文件扩展名,形成输出文件名。 4.4. 读取 JSON 格式文件的内容,并将其解析为 Julia 结构。 5.打开输出文件以便写入。 6.循环浏览所有单元格 7.如果发现某个单元格的类型是 markdown,则将其删除。 8.如果设置了标记单元格跳过标志,则跳过处理。 9.跳过包含插入图片的 markdown 单元 (![]
)。 10.将标记符单元格的内容写成 Julia 注释 (#=...=#
)。 - 如果单元格是代码且包含非零行数,则跳过处理。 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.ngscript 文件,不跳过 markdown 单元。
In [ ]:
@time script2jl("$(@__DIR__)/script2jl.ngscript")
转换缺少标记符单元格的 script2jl.ngscript 文件。
In [ ]:
@time script2jl("script2jl.ngscript", skip_markdown=true)
结论¶
执行此示例后,我们得到了.jl
格式的代码,可以通过include("$(@__DIR__)/script2jl.jl")
命令将其附加到任何项目中。
对于使用.ngscript
进行实验和原型开发的开发人员来说,该工具非常有用。通过它,您可以轻松地将工作代码转换为成熟的 Julia 程序。
由于其简单性和灵活性,该脚本提高了软件开发效率,简化了编程环境之间的迁移。