16
16
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
20
from genshi.core import START
20
from genshi.template import TemplateLoader, MarkupTemplate, TextTemplate,\
21
from genshi.template import TemplateLoader, MarkupTemplate, NewTextTemplate
22
from genshi.template import TemplateNotFound
22
23
from genshi.template.eval import UndefinedError
23
24
from genshi.input import XMLParser
29
DEFAULT_TEMPLATE = 'default'
30
DEFAULT_THEME = 'default'
31
USER_THEME_DIR = os.path.expanduser(os.path.join('~', '.lazygal', 'themes'))
32
THEME_SHARED_FILE_PREFIX = 'SHARED_'
32
35
class LazygalTemplate(object):
97
100
tag, attrib = data
98
101
if tag.namespace == 'http://www.w3.org/2001/XInclude'\
99
and tag.localname == 'include':
102
and tag.localname == 'include':
100
103
subtpl_ident = attrib.get('href')
102
105
subtpl = self.loader.load(subtpl_ident)
117
120
return subtemplates
120
class PlainTemplate(LazygalTemplate, TextTemplate):
123
class PlainTemplate(LazygalTemplate):
122
125
serialization_method = 'text'
123
genshi_tpl_class = TextTemplate
126
genshi_tpl_class = NewTextTemplate
126
129
class TplFactory(object):
129
'.thtml' : XmlTemplate,
130
'.tcss' : PlainTemplate,
132
'.thtml': XmlTemplate,
133
'.tcss' : PlainTemplate,
134
'.tjs' : PlainTemplate,
133
137
def __init__(self, default_tpl_dir, tpl_dir):
135
139
# a template variable is defined, or the empty string, thus defined()
136
140
# will only work for the 'whether it is defined' part of the test.
137
141
self.loader = TemplateLoader([tpl_dir, default_tpl_dir],
138
variable_lookup='lenient')
142
variable_lookup='lenient')
140
144
def is_known_template_type(self, file):
141
145
filename, ext = os.path.splitext(os.path.basename(file))
151
155
raise ValueError(_('Unknown template type for %s' % tpl_ident))
160
def __init__(self, themes_dir, name):
163
# First try user directory
164
self.tpl_dir = os.path.join(USER_THEME_DIR, self.name)
165
if not os.path.exists(self.tpl_dir):
166
# Fallback to system themes
167
self.tpl_dir = os.path.join(themes_dir, self.name)
168
if not os.path.exists(self.tpl_dir):
169
raise ValueError(_('Theme %s not found') % self.name)
171
self.tpl_loader = TplFactory(os.path.join(themes_dir, DEFAULT_THEME),
174
# Load styles templates
175
for style in self.get_avail_styles():
176
style_filename = style['filename']
178
self.tpl_loader.load(style_filename)
180
# Not a known emplate ext, ignore
183
# find out theme kind
185
self.tpl_loader.load('dynindex.thtml')
186
except TemplateNotFound:
189
self.kind = 'dynamic'
191
def get_avail_styles(self, default_style=None):
192
style_files_mask = os.path.join(self.tpl_dir,
193
THEME_SHARED_FILE_PREFIX + '*' + 'css')
195
for style_tpl_file in glob.glob(style_files_mask):
197
tpl_filename = os.path.basename(style_tpl_file).split('.')[0]
198
style['filename'] = tpl_filename[len(THEME_SHARED_FILE_PREFIX):]
199
style['name'] = style['filename'].replace('_', ' ')
200
if default_style is not None:
201
if style['filename'] == default_style:
202
style['rel'] = 'stylesheet'
204
style['rel'] = 'alternate stylesheet'
154
209
# vim: ts=4 sw=4 expandtab