from Products.CMFCore.utils import getToolByName
from AccessControl import ModuleSecurityInfo
import re
security = ModuleSecurityInfo('Products.qPloneSkinDump.generatingTemplate')
tags = {'default' : '
\n%s\n | ',
'tableless' : '\n%s\n
'}
div = 'Some content from macro
'
span = ''
pattern = re.compile(r"<([^< ]*)[^<]*extract_portlets\('(.*?)'\).*?>", re.DOTALL)
p_sheet_id = 'generation_properties'
p_id = 'subfolder_name'
security.declarePublic('generate')
def generate(context, skin_name, layer_name, subfolder_name):
# add property sheet on plone site object which will store subfolder name with generated main_template.pt
pp = getToolByName(context, 'portal_properties')
if not p_sheet_id in pp.objectIds():
pp.addPropertySheet(id=p_sheet_id, title=p_sheet_id)
else:
pp.manage_delObjects(ids=[p_sheet_id])
pp.addPropertySheet(id=p_sheet_id, title=p_sheet_id)
p_sheet = pp[p_sheet_id]
if p_sheet.hasProperty(p_id):
p_sheet._updateProperty(p_id, subfolder_name)
else:
p_sheet._setProperty(p_id, subfolder_name, 'string')
ps = getToolByName(context, 'portal_skins')
# get the most specific main_template, which is contained in current skin's layers
paths = ps.getSkinPath(skin_name).split(',')
for path in paths:
if 'main_template' in ps[path].objectIds():
break
mt = ps[path].main_template.document_src()
# find all slots which must be expand
finded_slots = pattern.findall(mt)
for tag, slot_name in finded_slots:
# now we'll use qMultipleSlots product's extract_portlets function and create replacement string
slots = context.extract_portlets(slot_name)
replacement = []
for k, v in slots:
if v: replacement.append(div % k)
else: replacement.append(span % k)
replacement = '\n'.join(replacement)
# next find the part of main_template which will be replaced
m = pattern.search(mt)
closing_tag = "%s>" % tag
start = m.start()
end = mt[start:].find(closing_tag) + start + len(closing_tag)
string_to_replace = mt[start:end]
# next is needed for placing replacement in or
tags
if slot_name.startswith('columns'):
outer_tag = '' in string_to_replace and tags['tableless'] or tags['default']
replacement = replacement and outer_tag % (slot_name.split('_')[1], replacement)
mt = mt.replace(string_to_replace, replacement)
# create template object in portal_skins
ps[layer_name].manage_addFolder(id=subfolder_name)
subfolder = getattr(ps[layer_name], subfolder_name)
subfolder.manage_addProduct['PageTemplates'].manage_addPageTemplate(id='main_template', text=mt)
security.declarePublic('available')
def available(context):
ps = getToolByName(context, 'portal_skins')
skin_name = context.getCurrentSkinName()
paths = ps.getSkinPath(skin_name).split(',')
return 'qmultipleslots' in paths
security.apply(globals()) |