#
# The high-throughput toolkit (httk)
# Copyright (C) 2012-2018 Rickard Armiento
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import os, errno
[docs]class UnquotedStr(object):
def __init__(self,val):
self.val = val
def __str__(self):
return str(self.val)
def __repr__(self):
return str(self.val)
[docs]def setup_template_helpers(global_data):
def first_value(*vals):
for val in vals:
if val:
return val
#def getitem(a,i):
#try:
# return global_data[a][i]
#except TypeError:
# return global_data[a][int(i)]
# try:
# return a[i]
# except TypeError:
# return a[int(i)]
global_data['first_value'] = first_value
# global_data['getitem'] = getitem
[docs]def identify(topdir, relative_url, ext_to_class_mapper, allow_urls_without_ext=True):
relative_url_base, __dummy, url_ext = relative_url.partition(os.extsep)
if relative_url_base != '' and (url_ext == '' and not allow_urls_without_ext):
raise IOError(errno.ENOENT, os.strerror(errno.ENOENT), relative_url)
if relative_url_base == '':
relative_url_base = 'index'
# Identify file name for regular content
absolute_filename = ''
for ext in ext_to_class_mapper:
relative_filename = relative_url_base+"."+ext
absolute_filename = os.path.join(topdir, relative_filename)
if os.path.exists(absolute_filename):
break
else:
#print("Identify failed:",relative_url,relative_url_base,os.path.join(topdir,relative_url), "extensions examined:", [ext for ext in ext_to_class_mapper])
raise IOError(errno.ENOENT, os.strerror(errno.ENOENT), os.path.join(topdir,relative_url))
return {'relative_url_base':relative_url_base,'url_ext':url_ext,'absolute_filename':absolute_filename,'relative_filename':relative_filename,'class':ext_to_class_mapper[ext]}
[docs]def read_config(srcdir, renderers, default_global_data = None, override_global_data = None, config = "config"):
# Set defaults
global_data = {'_content_subdir': 'content', '_static_subdir':'static', '_subcontent_subdir':'subcontent',
'_functions_subdir': '_functions', '_template_subdir': 'templates',
'_use_urls_without_ext':True, '_allow_urls_without_ext':True, '_page_memcache_limit':1000}
if default_global_data is not None:
global_data.update(default_global_data)
# Read global config
try:
config_info = identify(srcdir, config, renderers, allow_urls_without_ext=True)
except IOError:
if config is None:
print("Warning: no site configuration provided, and no file exists in "+str(srcdir)+"/config.(something)")
else:
print("Could not find site configuration at "+str(srcdir)+"/"+str(config)+".(something)")
else:
configdata = config_info['class'](srcdir, config_info['relative_filename'], global_data).metadata()
global_data.update(configdata)
# Setup helper functions for templates to use
setup_template_helpers(global_data)
if override_global_data is not None:
global_data.update(override_global_data)
# Fix types of some settings (these must be set, as they are set in the defaults above)
global_data['_use_urls_without_ext'] = global_data['_use_urls_without_ext'] in ['yes', 'true', 'y', True]
global_data['_allow_urls_without_ext'] = global_data['_allow_urls_without_ext'] in ['yes', 'true', 'y', True]
global_data['_page_memcache_limit'] = int(global_data['_page_memcache_limit'])
return global_data
[docs]def setup(renderers, template_engines, function_handlers):
if renderers is None:
from httk.httkweb.render_httk import RenderHttk
from httk.httkweb.render_rst import RenderRst
renderers = {'httkweb': RenderHttk, 'rst': RenderRst}
if template_engines is None:
from httk.httkweb.templateengine_httk import TemplateEngineHttk
from httk.httkweb.templateengine_templator import TemplateEngineTemplator
template_engines = {'httkweb.html': TemplateEngineHttk, 'templator.html': TemplateEngineTemplator}
if function_handlers is None:
from httk.httkweb.functionhandler_httk import FunctionHandlerHttk
function_handlers = {'py': FunctionHandlerHttk}
return {'renderers':renderers, 'template_engines':template_engines, 'function_handlers':function_handlers}