source: products/qPloneResolveUID/tags/0.2.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.3 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            clean_uid, uid  = ruid.split('/')[1], '/'.join(ruid.split('/')[1:])
47            try:
48                obj = rc.lookupObject(clean_uid)
49                ruid_url[ruid] = uid.replace(clean_uid, pu.getRelativeUrl(obj))
50            except:
51                ruid_url[ruid] = ruid
52        return ruid_url           
53   
54    def convert(self, orig, data, **kwargs):
55        text = orig
56        tags_ruid, unique_ruid = self.find_ruid(text)
57        if unique_ruid:
58            ruid_url = self.mapRUID_URL(unique_ruid, kwargs['context'])
59            for tag_ruid in tags_ruid:
60                tag, ruid = tag_ruid.items()[0]
61                text = text.replace(tag, tag.replace(ruid, ruid_url[ruid]))
62       
63        data.setData(text)
64        return data
65
66
67def register():
68    return ruid_to_url()
69   
Note: See TracBrowser for help on using the repository browser.