gpt4 book ai didi

node.js - 使用其他文件的内容预处理(填充、生成)文件

转载 作者:太空宇宙 更新时间:2023-11-04 02:15:14 25 4
gpt4 key购买 nike

我将使用一个代表性示例来解释我的问题。

假设我有这两个配置文件:

# product-conf.file
seo_title: general_title
seo_description: seo_description
seo_canonical: seo_canonical

product_id: general_id
title: general_title
intro: general_intro

.

# service-conf.file
seo_title: general_title
seo_description: seo_description
seo_canonical: seo_canonical

service_id: general_id
title: general_title
products: list_products

如您所见,前 3 行(配置字段)完全相同。我实际上对这些文件使用 YAML。我希望将代码片段放在可维护的文件中,并将它们包含在调用中。我需要一个预处理器来处理这些。像这样的东西:

# snippet-seo.file
seo_title: general_title
seo_description: seo_description
seo_canonical: seo_canonical

.

# product-conf-master.file

@include snippet-seo

product_id: general_id
title: general_title
intro: general_intro

.

# service-conf-master.file

@include snippet-seo

service_id: general_id
title: general_title
products: list_products

预处理器将读取 /masters/* 中的所有主文件,参与所有调用并将它们替换为 /snippets/ 中的适当代码片段,并将结果保存在 /

我正在使用 @ 进行调用,但我可以选择适合所选预处理器的任何其他格式。我使用这种方式是因为它与 SASS 指令 @extend@include 非常相似。

实现这一目标的最佳和最简单的方法是什么? Node 包将是我的第一选择。

最佳答案

如果您不一定需要预处理文件,您可以使用小型 YAML 处理程序来解决此问题(您也许可以使用一些基于 Node 的编程来完成此操作)。

import pathlib
import ruamel.yaml

yaml = ruamel.yaml.YAML()
master = pathlib.Path('master.file')
data = yaml.load(master))

common = data['common']
for file_name in data:
if file_name == 'common':
continue
data_out = ruamel.yaml.comments.CommentedMap()
# you can leave out the following two lines of code if you do a safe_load()
# but you will lose the ordering in your output file
for k, v in common.items():
data_out[k] = v
for k, v in data[file_name].items():
data_out[k] = v
with open(file_name, 'wb') as fp:
yaml.dump(data_out, stream=fp)

在文件master.file中给出以下输入:

# YAML master file
common: &COMMON
seo_title: general_title
seo_description: seo_description
seo_canonical: seo_canonical

product-conf.file:
<<: *COMMON
product_id: general_id
title: general_title
intro: general_intro

service-conf.file:
<<: *COMMON
service_id: general_id
title: general_title
products: list_products

运行该程序会产生两个文件,product-conf.file::

seo_title: general_title
seo_description: seo_description
seo_canonical: seo_canonical
product_id: general_id
title: general_title
intro: general_intro

service-conf.file:

seo_title: general_title
seo_description: seo_description
seo_canonical: seo_canonical
service_id: general_id
title: general_title
products: list_products

也可以将这三个部分放在单独的输入文件中,而不是将值放在组合文件中。

<小时/>

或者,如果您的真实输入文件不会包含 cpp 以特殊方式处理的任何内容,您可以执行以下操作:

cpp -P -include master.in -o service-conf.file service-conf.in

master.in:

seo_title: general_title
seo_description: seo_description
seo_canonical: seo_canonical

service-conf.in:

service_id: general_id
title: general_title
products: list_products

这给出了与前面的示例相同的service-conf.outproduct-conf.in 当然会以同样的方式工作。

cpp-P 选项会抑制调试输出注释,并且 -include 包含参数,就好像输入文件的第一行具有预处理器指令一样:

#include "master.in"

您还可以明确说明并省略命令行选项。

关于node.js - 使用其他文件的内容预处理(填充、生成)文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36066412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com