# HG changeset patch # User Thierry Florac # Date 1530687833 -7200 # Node ID 73ced18171957f1c7e6882496ff81d1fea98d607 # Parent 2ef3bacda7425e3decbce56933e0d93e4a2819d5 Added "oid_to_href" HTML renderer to convert "oid://" internal links to URLs diff -r 2ef3bacda742 -r 73ced1817195 src/pyams_content/features/html/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_content/features/html/__init__.py Wed Jul 04 09:03:53 2018 +0200 @@ -0,0 +1,53 @@ +# +# Copyright (c) 2008-2018 Thierry Florac +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# + +__docformat__ = 'restructuredtext' + + +# import standard library +from pyquery import PyQuery + +# import interfaces +from pyams_sequence.interfaces import ISequentialIntIds +from pyams_utils.interfaces.text import IHTMLRenderer +from pyams_utils.interfaces.url import DISPLAY_CONTEXT +from pyams_workflow.interfaces import IWorkflowPublicationInfo +from pyramid.interfaces import IRequest + +# import packages +from pyams_sequence.utility import get_reference_target +from pyams_utils.adapter import adapter_config, ContextRequestAdapter +from pyams_utils.registry import get_utility +from pyams_utils.url import relative_url + + +@adapter_config(name='oid_to_href', context=(str, IRequest), provides=IHTMLRenderer) +class OIDHTMLRenderer(ContextRequestAdapter): + """An HTML renderer converting all "oid://" URLs to internal relative links""" + + def render(self): + context = self.request.annotations.get(DISPLAY_CONTEXT, self.request.context) + html = PyQuery('
{0}
'.format(self.context)) + sequence = get_utility(ISequentialIntIds) + for link in html('a[href]'): + href = link.attrib['href'] + if href.startswith('oid://'): + oid = sequence.get_full_oid(href.split('//', 1)[1]) + target = get_reference_target(oid) + if target is not None: + publication_info = IWorkflowPublicationInfo(target, None) + if (publication_info is not None) and publication_info.is_visible(self.request): + link.attrib['href'] = relative_url(target, self.request, context) + continue + # invalid link => remove href! + del link.attrib['href'] + return html.html()