在 Julia 中从模板创建脚本
Creating Scripts from a Template in Julia
我有一个文本文件 - 这是一个模板,我想将其更改并另存为另一个文件(在本例中为 markdown 文件,但这并不重要):
my_test.txt:
---
title: My report
---
$my_var
如您所见,有一个占位符 $my_var
- 我想将文件作为字符串读入,然后将其放入变量 my_var
的值。我该怎么做?
我已经尝试过一些解决方法:
using Chain
my_var = "some string"
@chain begin
read("my_test.txt", String) # read the text file as a string
"\"\"\"" * _ * "\"\"\"" # wrap the string with triple quotes
Meta.parse # parse...
eval # ...and eval
write_to_file("reports/jmd_files/org_$(org_id).jmd") # write it to a markdown file
end
虽然它不起作用。我尝试了很多变体,但我要么收到一条错误消息 my_var does not exist
,要么插入的值是 nothing
(这不是它应该是的值。
所以,这看起来确实与执行环境有关,但我无法弄清楚问题所在。
它不应该很重要,但只是为了确定 - 最终希望它 运行 在循环中或在(待广播的)函数中。因此,对单个示例进行硬编码并不是真正的解决方案。
实际上不是您问题的答案,但是..您确定要这样做吗?您所描述的内容看起来像是在创建一个动态文档,但是已经有很多包可以做到这一点。
例如,Documenter.jl and Weave.jl 都采用嵌入了 Julia 脚本的 markdown 文档,并设计为 运行 文档并将其编译为 HTML 或显示脚本或其输出(您选择)的 PDF 页面。
我更喜欢更进一步,我从一个(有效的)Julia 脚本开始,其中 markdown 结构嵌入了一个额外的注释层(例如 # ## This would be an H2 header
),然后使用 Literate.jl
进行转换它带有嵌入式 Julia 和 Documenter.jl
的降价,以创建一个可导航的网站。
这些软件包有很多选项,可以轻松地与 CI 集成,例如 GitHub 操作。
您似乎正在寻找像 Mustache.jl 这样的文本模板引擎。例如:
using Mustache
function createscript()
vars = Dict("my_var" => "some string")
# Doesn't have to be a Dict - see the docs for other
# options eg. a module name can be passed
# to grab variables from it
open("data/rendered.jmd", "w") do out
render(out, read("data/reporttemplate.mustache", String), vars)
end
end
与 reporttemplate.mustache
包含:
---
title: My report
---
{{my_var}}
使用 text-templating 引擎比 eval
更安全且更不容易出错。
我有一个文本文件 - 这是一个模板,我想将其更改并另存为另一个文件(在本例中为 markdown 文件,但这并不重要):
my_test.txt:
---
title: My report
---
$my_var
如您所见,有一个占位符 $my_var
- 我想将文件作为字符串读入,然后将其放入变量 my_var
的值。我该怎么做?
我已经尝试过一些解决方法:
using Chain
my_var = "some string"
@chain begin
read("my_test.txt", String) # read the text file as a string
"\"\"\"" * _ * "\"\"\"" # wrap the string with triple quotes
Meta.parse # parse...
eval # ...and eval
write_to_file("reports/jmd_files/org_$(org_id).jmd") # write it to a markdown file
end
虽然它不起作用。我尝试了很多变体,但我要么收到一条错误消息 my_var does not exist
,要么插入的值是 nothing
(这不是它应该是的值。
所以,这看起来确实与执行环境有关,但我无法弄清楚问题所在。
它不应该很重要,但只是为了确定 - 最终希望它 运行 在循环中或在(待广播的)函数中。因此,对单个示例进行硬编码并不是真正的解决方案。
实际上不是您问题的答案,但是..您确定要这样做吗?您所描述的内容看起来像是在创建一个动态文档,但是已经有很多包可以做到这一点。 例如,Documenter.jl and Weave.jl 都采用嵌入了 Julia 脚本的 markdown 文档,并设计为 运行 文档并将其编译为 HTML 或显示脚本或其输出(您选择)的 PDF 页面。
我更喜欢更进一步,我从一个(有效的)Julia 脚本开始,其中 markdown 结构嵌入了一个额外的注释层(例如 # ## This would be an H2 header
),然后使用 Literate.jl
进行转换它带有嵌入式 Julia 和 Documenter.jl
的降价,以创建一个可导航的网站。
这些软件包有很多选项,可以轻松地与 CI 集成,例如 GitHub 操作。
您似乎正在寻找像 Mustache.jl 这样的文本模板引擎。例如:
using Mustache
function createscript()
vars = Dict("my_var" => "some string")
# Doesn't have to be a Dict - see the docs for other
# options eg. a module name can be passed
# to grab variables from it
open("data/rendered.jmd", "w") do out
render(out, read("data/reporttemplate.mustache", String), vars)
end
end
与 reporttemplate.mustache
包含:
---
title: My report
---
{{my_var}}
使用 text-templating 引擎比 eval
更安全且更不容易出错。