Engee 文档
Notebook

转换 .ngscript.jl

此示例实现了一个简单的转换实用程序。 .ngscript 到扩展名的文件 .jl 专为在Julia终端中直接执行而设计。

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

脚本本身读取笔记本的内容,以JSON格式呈现,处理两个主要类别的单元格:markdown类型单元格和代码类型单元格。 标记单元格被保存为注释,而代码单元格是按字面编写的,允许以后运行。 如果需要,也可以跳过markdown单元格。

In [ ]:
using JSON

考虑函数本身。 它采用输入文件的路径和可选参数。 skip_markdown,它决定在转换过程中是否跳过markdown类型单元格。
现在让我们继续讨论算法并逐行考虑它。

  1. 我们声明函数。
  2. 将相对路径转换为绝对路径。
  3. 我们通过将源文件的扩展名替换为输出文件的名称 .jl.
  4. 我们读取JSON文件的内容并将其解析为Julia结构。
  5. 打开输出文件进行录制。
  6. 循环遍历所有单元格。
  7. 如果发现单元格属于markdown类型。
  8. 如果设置了标记单元格跳过标志,则跳过处理.
  9. 跳过包含插入图像的标记单元格(![]).
  10. 我们以Julia注释的形式记录markdown单元格的内容(#=...=#
  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文件,省略了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语言的完整程序。

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