1
2
3 __all__ = [
4 'has_extension',
5 'is_package_dir',
6 'is_package_file',
7 'munge_pkg_info',
8 'txt2html',
9 ]
10
11 import os
12 import re
13 import string
14
15 import cherrypy as cp
16 import turbogears as tg
17
18 from eggbasket.odict import OrderedDict
19
20 try:
21 from eggbasket.rest import HTML
22 tg.config.update({'has_docutils': True})
23 except ImportError:
24 tg.config.update({'has_docutils': False,
25 'eggbasket.pkg_desc_format': 'plain'})
26
27
28 _email_rx = re.compile(r'([-\w.+]+@[\w.]+?\.\w+)')
30 """Turn HTTP URLs and emails adresses into HTML link elements."""
31 if _email_rx.search(s):
32 return dict(value=s,
33 html=_email_rx.sub(r'<a href="mailto:\1">\1</a>', s))
34 if s.startswith('http://'):
35 return dict(value=s, html='<a href="%s">%s</a>' % (s,s))
36 return s
37
39 """Set value for info[urlfield] to URL of package info['Name']."""
40 try:
41 package = info['Name']
42 except KeyError:
43 raise ValueError('Package name must be present in package info.')
44 else:
45 info[urlfield] = _make_link(get_base_url() +
46 tg.url('/package/%s' % package))
47
52
54 """Return base URL of application.
55
56 Tries to account for 'Host' header and reverse proxing.
57
58 """
59 base_url = tg.config.get('base_url_filter.base_url')
60 if not base_url:
61 host = cp.request.headers.get('X-Forwarded-For',
62 cp.request.headers['Host'])
63 if host:
64 base_url = '%s://%s' % (cp.request.scheme, host)
65 else:
66 base_url = cp.request.base
67 return base_url
68
70 """Return True if filename has one of the given extensions, False otherwise.
71 """
72 if not case_sensitive:
73 filename = filename.lower()
74 for extension in extensions:
75 if not case_sensitive:
76 extension = extension.lower()
77 if filename.endswith(extension):
78 return True
79 return False
80
82 """Returns True if path is a directory containing at least one package file.
83 """
84 if os.path.isdir(path):
85 for filename in os.listdir(path):
86 if is_package_file(filename):
87 return True
88 return False
89
91 """Return True if filename ends in one of the known package file extension.
92 """
93 known_extensions = tg.config.get('eggbasket.package_extensions', [])
94 return has_extension(filename, known_extensions)
95
97 """Rewrite package info data for display on meta data view page.
98
99 Turns URLs into links and optionall rewrites hoemapge/download URLs.
100
101 """
102 new_info = OrderedDict()
103 ordered_fields = tg.config.get('eggbasket.pkg_info.sort_order', [])
104 extra_fields = sorted(list(set(pkg_info.keys()).difference(ordered_fields)))
105 for fieldnames in (ordered_fields, extra_fields):
106 for key in fieldnames:
107 if key in pkg_info:
108 value = pkg_info[key]
109 if not isinstance(value, list):
110 value = _make_link(value)
111 new_info[_xform_fieldname(key)] = value
112 if tg.config.get('eggbasket.rewrite_download_url', False):
113 _rewrite_url('Download Url', new_info)
114 if tg.config.get('eggbasket.rewrite_homepage_url', False):
115 _rewrite_url('Home Page', new_info)
116 return new_info
117
119 """Try to convert text into HTML with docutils.
120
121 If conversion fails using docutils is is turned off by the configuration,
122 return text unaltered.
123
124 """
125 if tg.config.get('has_docutils', False) and use_docutils:
126 try:
127 text = HTML(text, report_level=0, initial_header_level=2)
128 except: pass
129 return text
130