source: products/qPloneResolveUID/tags/0.2/transforms/ruid_to_url.py @ 458

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

Building directory structure

File size: 2.2 KB
Line 
1# Author: Melnychuk Taras
2# Contact: fenix@quintagroup.com
3# Date: $Date: 2006-08-11
4# Copyright: quintagroup.com
5
6import re
7from Products.CMFCore.utils import getToolByName
8from Products.PortalTransforms.interfaces import itransform
9
10import string
11letters = string.letters
12_ABSOLUTE_REL_URL=r'(?P<url>(?P<protocol>http|https|ftp|mailto|file|about[:/]+?)?[%s0-9_\@\.\,\?\!\/\:\;\-\#\~\=\&\%%\+\\]+)' % letters
13
14
15class ruid_to_url:
16    """Transform which replaces resolve uid into urls"""
17   
18    __implements__ = itransform
19   
20    __name__ = "ruid_to_url"
21    inputs  = ('text/html',)
22    output = 'text/html'
23   
24    def __init__(self, name=None):
25        if name:
26            self.__name__ = name
27        self.ruid_regexp = re.compile("(?P<tag>\<(?P<tag_name>a|img)[^>]*(?P<url_attr>href|src)\s*=\s*[\'|\"]?%s[\'|\"]?[\s|\>|\/])" \
28                      % _ABSOLUTE_REL_URL,re.I|re.S)
29
30    def name(self):
31        return self.__name__
32
33    def find_ruid(self, data):
34        tags_url = [{m.group('tag'):m.group('url').replace('\\','/')}\
35                      for m in self.ruid_regexp.finditer(data)]
36        tags_ruid =  [tu for tu in tags_url if tu.values()[0].startswith('resolveuid')]
37        unique_ruid = []
38        [unique_ruid.append(tu.values()[0]) for tu in tags_ruid if tu.values()[0] not in unique_ruid]
39        return tags_ruid, unique_ruid
40
41    def mapRUID_URL(self, unique_ruid, portal):
42        ruid_url = {}
43        rc = getToolByName(portal, 'reference_catalog')
44        pu = getToolByName(portal, 'portal_url')
45        for ruid in unique_ruid:
46            try:
47                obj = rc.lookupObject(ruid.replace('resolveuid/', ''))
48                ruid_url[ruid] = pu.getRelativeUrl(obj)
49            except:
50                ruid_url[ruid] = ruid
51        return ruid_url           
52   
53    def convert(self, orig, data, **kwargs):
54        text = orig
55        tags_ruid, unique_ruid = self.find_ruid(text)
56        if unique_ruid:
57            ruid_url = self.mapRUID_URL(unique_ruid, kwargs['context'])
58            for tag_ruid in tags_ruid:
59                tag, ruid = tag_ruid.items()[0]
60                text = text.replace(tag, tag.replace(ruid, ruid_url[ruid]))
61       
62        data.setData(text)
63        return data
64
65
66def register():
67    return ruid_to_url()
68   
Note: See TracBrowser for help on using the repository browser.