source: products/qPloneSkinDump/branches/multipleslots/generatingTemplate.py @ 1591

Last change on this file since 1591 was 1, checked in by myroslav, 18 years ago

Building directory structure

File size: 3.1 KB
Line 
1from Products.CMFCore.utils import getToolByName
2from AccessControl import ModuleSecurityInfo
3import re
4
5security = ModuleSecurityInfo('Products.qPloneSkinDump.generatingTemplate')
6
7tags = {'default'   : '<td id="portal-columns-%s" colspan="3">\n%s\n</td>',
8        'tableless' : '<div id="portal-columns-%s">\n%s\n</div>'}
9div = '<div metal:use-macro="%s">Some content from macro</div>'
10span = '<span tal:replace="structure python:path(\'%s\')" />'
11pattern = re.compile(r"<([^< ]*)[^<]*extract_portlets\('(.*?)'\).*?>", re.DOTALL)
12
13p_sheet_id = 'generation_properties'
14p_id = 'subfolder_name'
15
16security.declarePublic('generate')
17def generate(context, skin_name, layer_name, subfolder_name):
18    # add property sheet on plone site object which will store subfolder name with generated main_template.pt
19    pp = getToolByName(context, 'portal_properties')
20    if not p_sheet_id in pp.objectIds():
21        pp.addPropertySheet(id=p_sheet_id, title=p_sheet_id)
22    else:
23        pp.manage_delObjects(ids=[p_sheet_id])
24        pp.addPropertySheet(id=p_sheet_id, title=p_sheet_id)
25    p_sheet = pp[p_sheet_id]
26    if p_sheet.hasProperty(p_id):
27        p_sheet._updateProperty(p_id, subfolder_name)
28    else:
29        p_sheet._setProperty(p_id, subfolder_name, 'string')
30    ps = getToolByName(context, 'portal_skins')
31    # get the most specific main_template, which is contained in current skin's layers
32    paths = ps.getSkinPath(skin_name).split(',')
33    for path in paths:
34        if 'main_template' in ps[path].objectIds():
35            break
36    mt = ps[path].main_template.document_src()
37    # find all slots which must be expand
38    finded_slots = pattern.findall(mt)
39    for tag, slot_name in finded_slots:
40        # now we'll use qMultipleSlots product's extract_portlets function and create replacement string
41        slots = context.extract_portlets(slot_name)
42        replacement = []
43        for k, v in slots:
44            if v: replacement.append(div % k)
45            else: replacement.append(span % k)
46        replacement = '\n'.join(replacement)
47        # next find the part of main_template which will be replaced
48        m = pattern.search(mt)
49        closing_tag = "</%s>" % tag
50        start = m.start()
51        end = mt[start:].find(closing_tag) + start + len(closing_tag)
52        string_to_replace = mt[start:end]
53        # next is needed for placing replacement in <div> or <td> tags
54        if slot_name.startswith('columns'):
55            outer_tag = '</div>' in string_to_replace and tags['tableless'] or tags['default']
56            replacement = replacement and outer_tag % (slot_name.split('_')[1], replacement)
57        mt = mt.replace(string_to_replace, replacement)
58    # create template object in portal_skins
59    ps[layer_name].manage_addFolder(id=subfolder_name)
60    subfolder = getattr(ps[layer_name], subfolder_name)
61    subfolder.manage_addProduct['PageTemplates'].manage_addPageTemplate(id='main_template', text=mt)
62
63security.declarePublic('available')
64def available(context):
65    ps = getToolByName(context, 'portal_skins')
66    skin_name = context.getCurrentSkinName()
67    paths = ps.getSkinPath(skin_name).split(',')
68    return 'qmultipleslots' in paths
69
70security.apply(globals())
Note: See TracBrowser for help on using the repository browser.