2017-03-07 9 views
0

私は、YAMLファイルをconfigフォルダに入れ、テンプレートフォルダにテンプレートをたくさん入れています。私が持っているユースケースは、yamlの設定とテンプレートに基づいてテキストファイルを生成することです。私はこの問題を解決するためにpythonの魅惑的なエンジンを使用できるかどうかを見たいと思っています。テンプレートエンジンを使用してコードを生成する(テキスト)

テンプレートエンジンは、Web開発コンテキストで使用されています。私が持っているユースケースは非常によく似ています(しかし同じではありません)。私はテキストを生成したい。ウェブページに表示する必要はありません。代わりに、テキストファイルだけを生成する必要があります。

例 入力: configフォルダ:設定/ yaml1、設定/ yaml2、設定/ yaml3 .. テンプレート:テンプレート/ template1を、テンプレート/ template2、template3。

出力

scripts/script1, script2, script3 

スクリプトの数=テンプレート

の数のテンプレートの2種類

YAML1: 
    Titles:4 
    SubTitles:10 
Template1: 
Number of Titles {Titles} where as Number of Subtitles is {SubTitles} 

その他の直接的な/直接置換例である

つがあります。テンプレートはネストされたテンプレートです。基本的に、テンプレートは、YAML例に基づいてループさせる必要があります:

YAML2: 
     Book: "The Choice of using Choice" 
      Author: "Unknown1" 
     Book: "Chasing Choices" 
      Author:"Known2" 

Template2 
Here are all the Books with Author Info 
The author of the {Book} is {Author} 

の予想される出力は、字幕の数が10 ザ・選択肢の著者であるとして、タイトル4の

番号を持つ単一のテキストファイルです選択肢を使用するのは不明です。 追跡選択の著者は知られています。

誰かが私を正しい方向に投稿できますか?

答えて

0

これは、正規表現と検索/置換で行うことができます。文字列ではなく関数をre.sub関数に渡すことができます。もちろん、それは有効なYAMLを持つに依存しています:

 
YAML1: 
    Titles: 4 
    # ^need space here 
    SubTitles: 10 
Template1: 
    Number of Titles {Titles} where as Number of Subtitles is {SubTitles} 
    # Need indentation here 

Pythonのコードは次のようになります。

import re 
import yaml 

# Match either {var}, {{, or }} 
TEMPLATE_CODE = re.compile(r'\{(\w+)\}|\{\{|\}\}') 

def expand(tmpl, namespace): 
    print(namespace) 
    def repl(m): 
     name = m.group(1) 
     if name: 
      # Matched {var} 
      return str(namespace[name]) 
     # matched {{ or }} 
     return m.group(0)[0] 
    return TEMPLATE_CODE.sub(repl, tmpl) 

def expand_file(path): 
    with open(path) as fp: 
     data = yaml.safe_load(fp) 
    print(expand(data['Template1'], data['YAML1'])) 

そして、ここでは出力です:

 
Number of Titles 4 where as Number of Subtitles is 10 

もちろん、ありますが、適切なテンプレートエンジンを使うなど、これをもっと複雑にする方法はたくさんあります。

+0

私は特に、チーターのような魅力的なエンジンを使用するような、よりシンプルなソリューションを探しています。私は誰かが正しい方向に私を向けることができるかどうか疑問に思っていた。 – pmv

+0

@pmv:これは間違った方向になったのはなぜですか?あなたが使用したいテンプレートエンジン(Cheetah)を既に知っているならば、それだけを進めて使用するのはなぜですか? –

+0

私は問題を解決する手段としてテンプレートエンジンを使用することを考えています。私は具体的に擬似コードを探しています – pmv

関連する問題