2011-11-24 3 views
22

में सभी चरों की सूची कैसे प्राप्त करें I टेम्पलेट में सभी चर और ब्लॉक की सूची प्राप्त करने का प्रयास कर रहा हूं। मैं चर खोजने के लिए अपना खुद का पार्सर नहीं बनाना चाहता हूं। मैंने निम्नलिखित स्निपेट का उपयोग करने की कोशिश की।जिन्जा 2 टेम्पलेट्स

from jinja2 import Environment, PackageLoader 
env = Environment(loader=PackageLoader('gummi', 'templates')) 
template = env.get_template('chat.html') 

template.blocks dict जहां कुंजी ब्लॉक कर रहे हैं, मैं ब्लॉक के अंदर सभी चर कैसे मिल सकता है?

उत्तर

38

के बाद से कोई भी सवाल का जवाब दे गया है और मैं इस सवाल का जवाब

from jinja2 import Environment, PackageLoader, meta 
env = Environment(loader=PackageLoader('gummi', 'templates')) 
template_source = env.loader.get_source(env, 'page_content.html')[0] 
parsed_content = env.parse(template_source) 
meta.find_undeclared_variables(parsed_content) 

इस के बाद से इस रन टाइम पर निष्पादित नहीं है अघोषित चर की सूची निकलेगा पाया, यह सब चर की सूची निकलेगा।

नोट: यह include और extends का उपयोग करके HTML फ़ाइलों को उत्पन्न करेगा।

+0

+1 - उत्तर पोस्ट के लिए धन्यवाद! –

+1

आपका स्वागत है :), मैंने सोचा कि उत्तर किसी की मदद कर सकता है। – Kracekumar

+5

दुर्भाग्यवश वर्रों के गुणों को नहीं उठाता है (यानी {{something.nested}} सेट (['कुछ'] प्रदान करता है) – Bemis

4

मेरी पेलिकन थीम के लिए, मैंने अपने टेम्पलेट फ़ाइलों में सभी जिंज चर का विश्लेषण करने के लिए एक टूल बनाया है।

मैं अपने कोड का हिस्सा

यह स्क्रिप्ट उत्पन्न सभी चर से एक नमूना विन्यास टेम्पलेट फ़ाइलों में मौजूद है और मेरी आधिकारिक pelicanconf.py

समारोह है कि टेम्पलेट फ़ाइल से सभी चर निकालने से एक चर मिल

def get_variables(filename): 
    env = Environment(loader=FileSystemLoader('templates')) 
    template_source = env.loader.get_source(env, filename)[0] 
    parsed_content = env.parse(template_source) 

पूरा स्क्रिप्ट

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
# 
# use: 
# generate_pelicanconf-sample.py my_official_blog/pelicanconf.py 

import sys 
import imp 
import os 

from jinja2 import Environment, FileSystemLoader, meta 


# Search all template files 
def list_html_templates(): 
    dirList = os.listdir('templates') 

    return dirList 


# get all variable in template file 
def get_variables(filename): 
    env = Environment(loader=FileSystemLoader('templates')) 
    template_source = env.loader.get_source(env, filename)[0] 
    parsed_content = env.parse(template_source) 

    return meta.find_undeclared_variables(parsed_content) 


# Check if the pelicanconf.py is in param 
if len(sys.argv) != 2: 
    print("Please indicate the pelicanconf.py file") 
    sys.exit() 

# Get all vars from templates files 
all_vars = set() 
files = list_html_templates() 
for fname in files: 
    variables = get_variables(fname) 
    for var in variables: 
     if var.isupper(): 
      all_vars.add(var) 

m = imp.load_source('pelicanconf', sys.argv[1]) 

# Show pelicanconf.py vars content 
for var in all_vars: 
    varname = 'm.%s' % var 
    if var in m.__dict__: 
     print ("%s = %s" % (var, repr(m.__dict__[var]))) 


    return meta.find_undeclared_variables(parsed_content) 

इस कार्यक्रम

LINKS = ((u'Home', u'/'), (u'archives', u'/archives.html'), (u'tags', u'/tags.html'), (u'A propos', u'http://bruno.adele.im')) 
SITESUBTITLE = u'Une famille compl\xe8tement 633<' 
DEFAULT_LANG = u'fr' 
SITEURL = u'http://blog.jesuislibre.org' 
AUTHOR = u'Bruno Adel\xe9' 
SITENAME = u'Famille de geeks' 
SOCIAL = ((u'adele', u'http://adele.im'), (u'feed', u'http://feeds.feedburner.com/FamilleDeGeek'), (u'twitter', u'http://twitter.com/jesuislibre.org'), (u'google+', u'https://plus.google.com/100723270029692582967'), (u'blog', u'http://blog.jesuislibre.org'), (u'facebook', u'http://www.facebook.com/bruno.adele'), (u'flickr', u'http://www.flickr.com/photos/b_adele'), (u'linkedin', u'http://fr.linkedin.com/in/brunoadele')) 
FEED_DOMAIN = u'http://blog.jesuislibre.org' 
FEED_ALL_ATOM = u'feed.atom' 
DISQUS_SITENAME = u'blogdejesuislibreorg' 
DEFAULT_PAGINATION = 10 
GITHUB_BLOG_SITE = u'https://github.com/badele/blog.jesuislibre.org' 

इस स्क्रिप्ट का अधिक विस्तार के लिए की नमूना परिणाम देख https://github.com/badele/pelican-theme-jesuislibre

6

मैं एक ही जरूरत थी और मैं एक उपकरण jinja2schema बुलाया लिखा है। यह Jinja2 टेम्पलेट्स से अवरुद्ध प्रकारों के लिए एक ह्युरिस्टिक एल्गोरिदम प्रदान करता है और घोंसले वाले सभी टेम्पलेट चर की सूची प्राप्त करने के लिए भी इसका उपयोग किया जा सकता है।

यहाँ कर रही की एक छोटी सी उदाहरण है:

>>> import jinja2 
>>> import jinja2schema 
>>> 
>>> template = ''' 
... {{ x }} 
... {% for y in ys %} 
...  {{ y.nested_field_1 }} 
...  {{ y.nested_field_2 }} 
... {% endfor %} 
... ''' 
>>> variables = jinja2schema.infer(template) 
>>> 
>>> variables 
{'x': <scalar>, 
'ys': [{'nested_field_1': <scalar>, 'nested_field_2': <scalar>}]} 
>>> 
>>> variables.keys() 
['x', 'ys'] 
>>> variables['ys'].item.keys() 
['nested_field_2', 'nested_field_1'] 
1

के लिए समाधान: https://gist.github.com/sxslex/822bd2405885294747b86aac187f1aa8

def template(html, **params): 
    import jinja2 
    env = jinja2.Environment(loader=FileSystemLoader('')) 

    def tojson(s):          
     import json 
     return json.dumps(s) 
    env.filters['tojson'] = tojson 
    template = env.from_string(html) 
    return template.render(context=params, **params) 

print(template('{{ context|tojson }}', name='slex', value=39)) 
+0

github लिंक काम नहीं कर रहा है – HDJEMAI