2017-03-07 3 views
0

J'ai un tas de fichiers YAML dans un dossier de configuration et un tas de modèles dans un dossier de modèles. Le cas d'utilisation que j'ai est de générer un fichier texte basé sur la configuration yaml et les templates. Je veux voir si les moteurs tentants python peuvent être utilisés pour résoudre ce problème. Je vois que les moteurs de gabarits sont utilisés dans un contexte de développement Web. Le cas d'utilisation que j'ai est très similaire (mais pas le même). Je veux générer du texte. Il n'a pas besoin d'être affiché sur une page Web. Au lieu de cela, il devrait générer juste un fichier texte.en utilisant le moteur de template pour générer du code (texte)

Exemple Entrées: dossier config: config/yaml1, config/yaml2, config/yaml3 .. modèle: template/template1, modèle/template2, template3.

Sortie

scripts/script1, script2, script3 

Le nombre de scripts = nombre de modèles

Il existe 2 types de modèles

Celui qui est la substitution directe/directe Exemple

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

Autre Le modèle est imbriqué. Fondamentalement, le modèle doit être mis en boucle basé sur YAML Exemple:

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} 

sortie prévue est un fichier texte qui a

Nombre de titres 4 où que le nombre de sous-titres est 10 L'auteur du The Choice d'utiliser Choice is Unknown1 L'auteur des Chasing Choices est connu2

Quelqu'un peut-il me poster dans la bonne direction?

Répondre

0

Vous pouvez le faire avec des expressions régulières et rechercher/remplacer. Vous pouvez passer une fonction à la place d'une chaîne à la fonction re.sub. Bien sûr, il repose sur la mise YAML valide:

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

Le code python devrait ressembler à ceci:

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'])) 

Et voici la sortie:

 
Number of Titles 4 where as Number of Subtitles is 10 

Il y a, bien sûr, beaucoup de façons de rendre cela plus compliqué, comme l'utilisation d'un moteur de template approprié.

+0

Je suis spécifiquement à la recherche d'une solution plus simple comme l'utilisation de moteur tentant comme le guépard. Je me demandais si quelqu'un peut me diriger dans la bonne direction – pmv

+0

@pmv: Pourquoi est-ce la mauvaise direction? Si vous savez déjà quel moteur de gabarit vous voulez utiliser (guépard), alors pourquoi ne pas aller de l'avant et l'utiliser? –

+0

Je pense utiliser le moteur de gabarit comme moyen de résoudre le problème. Je cherche spécifiquement un pseudo code – pmv