Mercurial > libervia-backend
comparison sat_frontends/tools/strings.py @ 2562:26edcf3a30eb
core, setup: huge cleaning:
- moved directories from src and frontends/src to sat and sat_frontends, which is the recommanded naming convention
- move twisted directory to root
- removed all hacks from setup.py, and added missing dependencies, it is now clean
- use https URL for website in setup.py
- removed "Environment :: X11 Applications :: GTK", as wix is deprecated and removed
- renamed sat.sh to sat and fixed its installation
- added python_requires to specify Python version needed
- replaced glib2reactor which use deprecated code by gtk3reactor
sat can now be installed directly from virtualenv without using --system-site-packages anymore \o/
author | Goffi <goffi@goffi.org> |
---|---|
date | Mon, 02 Apr 2018 19:44:50 +0200 |
parents | frontends/src/tools/strings.py@2c31ddf633e5 |
children | 56f94936df1e |
comparison
equal
deleted
inserted
replaced
2561:bd30dc3ffe5a | 2562:26edcf3a30eb |
---|---|
1 #!/usr/bin/env python2 | |
2 # -*- coding: utf-8 -*- | |
3 | |
4 # SAT helpers methods for plugins | |
5 # Copyright (C) 2013-2016 Adrien Cossa (souliane@mailoo.org) | |
6 | |
7 # This program is free software: you can redistribute it and/or modify | |
8 # it under the terms of the GNU Affero General Public License as published by | |
9 # the Free Software Foundation, either version 3 of the License, or | |
10 # (at your option) any later version. | |
11 | |
12 # This program is distributed in the hope that it will be useful, | |
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 # GNU Affero General Public License for more details. | |
16 | |
17 # You should have received a copy of the GNU Affero General Public License | |
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
19 | |
20 import re | |
21 | |
22 # Regexp from http://daringfireball.net/2010/07/improved_regex_for_matching_urls | |
23 RE_URL = re.compile(r"""(?i)\b((?:[a-z]{3,}://|(www|ftp)\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/|mailto:|xmpp:)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?]))""") | |
24 | |
25 | |
26 # TODO: merge this class with an other module or at least rename it (strings is not a good name) | |
27 | |
28 | |
29 def getURLParams(url): | |
30 """This comes from pyjamas.Location.makeUrlDict with a small change | |
31 to also parse full URLs, and parameters with no value specified | |
32 (in that case the default value "" is used). | |
33 @param url: any URL with or without parameters | |
34 @return: a dictionary of the parameters, if any was given, or {} | |
35 """ | |
36 dict_ = {} | |
37 if "/" in url: | |
38 # keep the part after the last "/" | |
39 url = url[url.rindex("/") + 1:] | |
40 if url.startswith("?"): | |
41 # remove the first "?" | |
42 url = url[1:] | |
43 pairs = url.split("&") | |
44 for pair in pairs: | |
45 if len(pair) < 3: | |
46 continue | |
47 kv = pair.split("=", 1) | |
48 dict_[kv[0]] = kv[1] if len(kv) > 1 else "" | |
49 return dict_ | |
50 | |
51 | |
52 def addURLToText(string, new_target=True): | |
53 """Check a text for what looks like an URL and make it clickable. | |
54 | |
55 @param string (unicode): text to process | |
56 @param new_target (bool): if True, make the link open in a new window | |
57 """ | |
58 # XXX: report any change to libervia.browser.strings.addURLToText | |
59 def repl(match): | |
60 url = match.group(0) | |
61 if not re.match(r"""[a-z]{3,}://|mailto:|xmpp:""", url): | |
62 url = "http://" + url | |
63 target = ' target="_blank"' if new_target else '' | |
64 return '<a href="%s"%s class="url">%s</a>' % (url, target, match.group(0)) | |
65 return RE_URL.sub(repl, string) | |
66 | |
67 | |
68 def addURLToImage(string): | |
69 """Check a XHTML text for what looks like an imageURL and make it clickable. | |
70 | |
71 @param string (unicode): text to process | |
72 """ | |
73 # XXX: report any change to libervia.browser.strings.addURLToImage | |
74 def repl(match): | |
75 url = match.group(1) | |
76 return '<a href="%s" target="_blank">%s</a>' % (url, match.group(0)) | |
77 pattern = r"""<img[^>]* src="([^"]+)"[^>]*>""" | |
78 return re.sub(pattern, repl, string) | |
79 | |
80 | |
81 def fixXHTMLLinks(xhtml): | |
82 """Add http:// if the scheme is missing and force opening in a new window. | |
83 | |
84 @param string (unicode): XHTML Content | |
85 """ | |
86 subs = [] | |
87 for match in re.finditer(r'<a( \w+="[^"]*")* ?/?>', xhtml): | |
88 tag = match.group(0) | |
89 url = re.search(r'href="([^"]*)"', tag) | |
90 if url and not url.group(1).startswith("#"): # skip internal anchor | |
91 if not re.search(r'target="([^"]*)"', tag): # no target | |
92 subs.append((tag, '<a target="_blank"%s' % tag[2:])) | |
93 if not re.match(r"^\w+://", url.group(1)): # no scheme | |
94 subs.append((url.group(0), 'href="http://%s"' % url.group(1))) | |
95 | |
96 for url, new_url in subs: | |
97 xhtml = xhtml.replace(url, new_url) | |
98 return xhtml | |
99 |