Engee 文档
Notebook

.ngscript 转换为.jl

本例实现了一个简单实用程序,可将.ngscript 转换为扩展名为.jl 的文件,供在 Julia 终端直接执行。

脚本的主要任务是提取笔记本单元格的内容(包括 markdown 文本和可执行代码),并将其保存为可读格式。

脚本本身读取以 JSON 格式表示的笔记本内容,处理两大类单元格:markdown 单元格和代码单元格。标记单元格以注释的形式保存,而代码单元格则以字面形式写入,以便日后运行。如有必要,还可以跳过标记单元格。

In [ ]:
using JSON

让我们来看看函数本身。它接收输入文件的路径和一个可选参数skip_markdown ,该参数决定在转换过程中是否跳过标记符单元格。 现在让我们逐行查看算法。

  1. 声明一个函数。 2.2. 将相对路径转换为绝对路径。 3.用.jl 替换源文件扩展名,形成输出文件名。 4.4. 读取 JSON 格式文件的内容,并将其解析为 Julia 结构。 5.打开输出文件以便写入。 6.循环浏览所有单元格 7.如果发现某个单元格的类型是 markdown,则将其删除。 8.如果设置了标记单元格跳过标志,则跳过处理。 9.跳过包含插入图片的 markdown 单元 (![])。 10.将标记符单元格的内容写成 Julia 注释 (#=...=#)。
  2. 如果单元格是代码且包含非零行数,则跳过处理。 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 文件。

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 程序。

由于其简单性和灵活性,该脚本提高了软件开发效率,简化了编程环境之间的迁移。