def merge(request, pageTree, removePanelLinks=False, removeLayoutLink=True): """Perform panel merging for the given page. Returns None if the page has no layout. """ # Find layout node layoutHref = utils.xpath1(utils.layoutXPath, pageTree) if layoutHref is None: return None # Resolve layout tree baseURL = request.getURL() if request.getVirtualRoot(): # plone.subrequest deals with VHM requests baseURL = '' layoutHref = parse.urljoin(baseURL, layoutHref) # noqa: turn the link absolute # Pass special ajax_load parameter forward to allow layout indirection # views to select, for example, default AJAX layout instead of full layout. if request.form.get('ajax_load'): parts = list(parse.urlparse(layoutHref)) query = parse.parse_qs(parts[4]) query['ajax_load'] = request.form.get('ajax_load') parts[4] = parse.urlencode(query) layoutHref = parse.urlunparse(parts) layoutTree = utils.resolve(layoutHref) if layoutTree is None: return None # Map page panels onto the layout pagePanels = dict( (node.attrib['data-panel'], node) for node in utils.panelXPath(pageTree) ) layoutPanels = dict( (node.attrib['data-panel'], node) for node in utils.panelXPath(layoutTree) ) # Site layout should always have element with data-panel="content" # Note: This could be more generic, but that would empower editors too much if 'content' in pagePanels and 'content' not in layoutPanels: for node in layoutTree.xpath('//*[@id="content"]'): node.attrib['data-panel'] = 'content' layoutPanels['content'] = node break for panelId, layoutPanelNode in layoutPanels.items(): pagePanelNode = pagePanels.get(panelId, None) if pagePanelNode is not None: utils.replace_content(layoutPanelNode, pagePanelNode) if removePanelLinks: del layoutPanelNode.attrib['data-panel'] if removeLayoutLink: del pageTree.getroot().attrib[utils.layoutAttrib] return layoutTree
def merge(request, pageTree, removePanelLinks=False, removeLayoutLink=True): """Perform panel merging for the given page. Returns None if the page has no layout. """ # Find layout node layoutHref = utils.xpath1(utils.layoutXPath, pageTree) if layoutHref is None: return None # Resolve layout tree baseURL = request.getURL() if request.getVirtualRoot(): # plone.subrequest deals with VHM requests baseURL = '' layoutHref = urljoin(baseURL, layoutHref) # turn the link absolute if request.form.get('ajax_load'): parts = list(urlparse(layoutHref)) query = parse_qs(parts[4]) query['ajax_load'] = request.form.get('ajax_load') parts[4] = urlencode(query) layoutHref = urlunparse(parts) layoutTree = utils.resolve(layoutHref) if layoutTree is None: return None # Map page panels onto the layout pagePanels = dict((node.attrib['data-panel'], node) for node in utils.panelXPath(pageTree)) layoutPanels = dict((node.attrib['data-panel'], node) for node in utils.panelXPath(layoutTree)) # Site layout should always have element with data-panel="content" # Note: This could be more generic, but that would empower editors too much if 'content' in pagePanels and 'content' not in layoutPanels: for node in layoutTree.xpath('//*[@id="content"]'): node.attrib['data-panel'] = 'content' layoutPanels['content'] = node break for panelId, layoutPanelNode in layoutPanels.items(): pagePanelNode = pagePanels.get(panelId, None) if pagePanelNode is not None: utils.replace_content(layoutPanelNode, pagePanelNode) if removePanelLinks: del layoutPanelNode.attrib['data-panel'] if removeLayoutLink: del pageTree.getroot().attrib[utils.layoutAttrib] return layoutTree
def renderTiles(request, tree): """Find all tiles in the given response, contained in the lxml element tree `tree`, and insert them into the ouput. Assumes panel merging has already happened. """ # Optionally enable ESI rendering in tiles that support this if not request.getHeader(ESI_HEADER): registry = queryUtility(IRegistry) if registry is not None: if registry.forInterface(IBlocksSettings).esi: request.environ[ESI_HEADER_KEY] = 'true' root = tree.getroot() headNode = root.find('head') baseURL = request.getURL() if request.getVirtualRoot(): # plone.subrequest deals with VHM requests baseURL = '' for tileNode in utils.headTileXPath(tree): tileHref = tileNode.attrib[utils.tileAttrib] if not tileHref.startswith('/'): tileHref = urljoin(baseURL, tileHref) try: tileTree = utils.resolve(tileHref) except NotFound: continue if tileTree is not None: tileRoot = tileTree.getroot() utils.replace_content(tileNode, tileRoot.find('head')) for tileNode in utils.bodyTileXPath(tree): tileHref = tileNode.attrib[utils.tileAttrib] if not tileHref.startswith('/'): tileHref = urljoin(baseURL, tileHref) try: tileTree = utils.resolve(tileHref) except NotFound: continue if tileTree is not None: tileRoot = tileTree.getroot() tileHead = tileRoot.find('head') if tileHead is not None: for tileHeadChild in tileHead: headNode.append(tileHeadChild) utils.replace_with_children(tileNode, tileRoot.find('body')) return tree
def renderTiles(request, tree): """Find all tiles in the given response, contained in the lxml element tree `tree`, and insert them into the ouput. Assumes panel merging has already happened. """ # Optionally enable ESI rendering in tiles that support this if not request.getHeader(ESI_HEADER): registry = queryUtility(IRegistry) if registry is not None: if registry.forInterface(IBlocksSettings).esi: request.environ[ESI_HEADER_KEY] = 'true' root = tree.getroot() headNode = root.find('head') baseURL = request.getURL() if request.getVirtualRoot(): # plone.subrequest deals with VHM requests baseURL = '' for tileNode in utils.headTileXPath(tree): tileHref = tileNode.attrib[utils.tileAttrib] if not tileHref.startswith('/'): tileHref = urljoin(baseURL, tileHref) try: tileTree = utils.resolve(tileHref) except NotFound: continue if tileTree is not None: tileRoot = tileTree.getroot() utils.replace_content(tileNode, tileRoot.find('head')) for tileNode in utils.bodyTileXPath(tree): tileHref = tileNode.attrib[utils.tileAttrib] if not tileHref.startswith('/'): tileHref = urljoin(baseURL, tileHref) try: tileTree = utils.resolve(tileHref) except NotFound: continue if tileTree is not None: tileRoot = tileTree.getroot() tileHead = tileRoot.find('head') if tileHead is not None: for tileHeadChild in tileHead: headNode.append(tileHeadChild) utils.replace_content(tileNode, tileRoot.find('body')) return tree
def merge(request, pageTree, removePanelLinks=False, removeLayoutLink=True): """Perform panel merging for the given page. Returns None if the page has no layout. """ # Find layout node layoutHref = utils.xpath1(utils.layoutXPath, pageTree) if layoutHref is None: return None # Resolve layout tree baseURL = request.getURL() if request.getVirtualRoot(): # plone.subrequest deals with VHM requests baseURL = '' layoutHref = urljoin(baseURL, layoutHref) # turn the link absolute layoutTree = utils.resolve(layoutHref) if layoutTree is None: return None # Map page panels onto the layout pagePanels = dict( (node.attrib['data-panel'], node) for node in utils.panelXPath(pageTree) ) for layoutPanelNode in utils.panelXPath(layoutTree): panelId = layoutPanelNode.attrib['data-panel'] pagePanelNode = pagePanels.get(panelId, None) if pagePanelNode is not None: utils.replace_content(layoutPanelNode, pagePanelNode) if removePanelLinks: del layoutPanelNode.attrib['data-panel'] if removeLayoutLink: del pageTree.getroot().attrib[utils.layoutAttrib] return layoutTree
def merge(request, pageTree, removePanelLinks=False, removeLayoutLink=True): """Perform panel merging for the given page. Returns None if the page has no layout. """ # Find layout node layoutHref = utils.xpath1(utils.layoutXPath, pageTree) if layoutHref is None: return None # Resolve layout tree baseURL = request.getURL() layoutHref = urljoin(baseURL, layoutHref) # turn the link absolute layoutTree = utils.resolve(layoutHref) if layoutTree is None: return None # Map page panels onto the layout pagePanels = dict( (node.attrib['data-panel'], node) for node in utils.panelXPath(pageTree) ) for layoutPanelNode in utils.panelXPath(layoutTree): panelId = layoutPanelNode.attrib['data-panel'] pagePanelNode = pagePanels.get(panelId, None) if pagePanelNode is not None: utils.replace_content(layoutPanelNode, pagePanelNode) if removePanelLinks: del layoutPanelNode.attrib['data-panel'] if removeLayoutLink: del pageTree.getroot().attrib[utils.layoutAttrib] return layoutTree