annotate frontends/src/tools/strings.py @ 1862:6d9c87bdc452

jp (base): added a CommandBase.start method which is called by run or connected, so subclasses can implement it (this is for simplicity sake, as it's not always clear if run or connected must be used)
author Goffi <goffi@goffi.org>
date Mon, 29 Feb 2016 16:52:51 +0100
parents 07390a9d1c09
children b43ee22eac98
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
690
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
1 #!/usr/bin/python
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
2 # -*- coding: utf-8 -*-
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
3
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
4 # SAT helpers methods for plugins
1766
d17772b0fe22 copyright update
Goffi <goffi@goffi.org>
parents: 1396
diff changeset
5 # Copyright (C) 2013-2016 Adrien Cossa (souliane@mailoo.org)
690
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
6
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
7 # This program is free software: you can redistribute it and/or modify
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
8 # it under the terms of the GNU Affero General Public License as published by
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
9 # the Free Software Foundation, either version 3 of the License, or
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
10 # (at your option) any later version.
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
11
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
12 # This program is distributed in the hope that it will be useful,
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
15 # GNU Affero General Public License for more details.
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
16
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
17 # You should have received a copy of the GNU Affero General Public License
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
19
769
8b6137f7b4e1 tools: addURLToText moved from libervia to sat_frontends/tools/strings
souliane <souliane@mailoo.org>
parents: 719
diff changeset
20 import re
1801
07390a9d1c09 tools (strings): add method fixXHTMLLinks to add a scheme if missing, and force opening in new tab
souliane <souliane@mailoo.org>
parents: 1790
diff changeset
21 from feed.atom import Content
769
8b6137f7b4e1 tools: addURLToText moved from libervia to sat_frontends/tools/strings
souliane <souliane@mailoo.org>
parents: 719
diff changeset
22
690
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
23
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
24 def getURLParams(url):
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
25 """This comes from pyjamas.Location.makeUrlDict with a small change
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
26 to also parse full URLs, and parameters with no value specified
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
27 (in that case the default value "" is used).
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
28 @param url: any URL with or without parameters
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
29 @return: a dictionary of the parameters, if any was given, or {}
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
30 """
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
31 dict_ = {}
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
32 if "/" in url:
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
33 # keep the part after the last "/"
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
34 url = url[url.rindex("/") + 1:]
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
35 if url.startswith("?"):
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
36 # remove the first "?"
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
37 url = url[1:]
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
38 pairs = url.split("&")
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
39 for pair in pairs:
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
40 if len(pair) < 3:
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
41 continue
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
42 kv = pair.split("=", 1)
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
43 dict_[kv[0]] = kv[1] if len(kv) > 1 else ""
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
44 return dict_
d8e7a58eaa00 misc: added a file for frontend's string operations:
souliane <souliane@mailoo.org>
parents:
diff changeset
45
769
8b6137f7b4e1 tools: addURLToText moved from libervia to sat_frontends/tools/strings
souliane <souliane@mailoo.org>
parents: 719
diff changeset
46
1790
bf7e468fe440 tools (strings): add a parameter "new_target" to addURLToText
souliane <souliane@mailoo.org>
parents: 1766
diff changeset
47 def addURLToText(string, new_target=True):
bf7e468fe440 tools (strings): add a parameter "new_target" to addURLToText
souliane <souliane@mailoo.org>
parents: 1766
diff changeset
48 """Check a text for what looks like an URL and make it clickable.
769
8b6137f7b4e1 tools: addURLToText moved from libervia to sat_frontends/tools/strings
souliane <souliane@mailoo.org>
parents: 719
diff changeset
49
1790
bf7e468fe440 tools (strings): add a parameter "new_target" to addURLToText
souliane <souliane@mailoo.org>
parents: 1766
diff changeset
50 @param string (unicode): text to process
bf7e468fe440 tools (strings): add a parameter "new_target" to addURLToText
souliane <souliane@mailoo.org>
parents: 1766
diff changeset
51 @param new_target (bool): if True, make the link open in a new window
bf7e468fe440 tools (strings): add a parameter "new_target" to addURLToText
souliane <souliane@mailoo.org>
parents: 1766
diff changeset
52 """
bf7e468fe440 tools (strings): add a parameter "new_target" to addURLToText
souliane <souliane@mailoo.org>
parents: 1766
diff changeset
53 # XXX: report any change to libervia.browser.strings.addURLToText
bf7e468fe440 tools (strings): add a parameter "new_target" to addURLToText
souliane <souliane@mailoo.org>
parents: 1766
diff changeset
54 # Regexp from http://daringfireball.net/2010/07/improved_regex_for_matching_urls
769
8b6137f7b4e1 tools: addURLToText moved from libervia to sat_frontends/tools/strings
souliane <souliane@mailoo.org>
parents: 719
diff changeset
55 def repl(match):
8b6137f7b4e1 tools: addURLToText moved from libervia to sat_frontends/tools/strings
souliane <souliane@mailoo.org>
parents: 719
diff changeset
56 url = match.group(0)
8b6137f7b4e1 tools: addURLToText moved from libervia to sat_frontends/tools/strings
souliane <souliane@mailoo.org>
parents: 719
diff changeset
57 if not re.match(r"""[a-z]{3,}://|mailto:|xmpp:""", url):
8b6137f7b4e1 tools: addURLToText moved from libervia to sat_frontends/tools/strings
souliane <souliane@mailoo.org>
parents: 719
diff changeset
58 url = "http://" + url
1790
bf7e468fe440 tools (strings): add a parameter "new_target" to addURLToText
souliane <souliane@mailoo.org>
parents: 1766
diff changeset
59 target = ' target="_blank"' if new_target else ''
bf7e468fe440 tools (strings): add a parameter "new_target" to addURLToText
souliane <souliane@mailoo.org>
parents: 1766
diff changeset
60 return '<a href="%s"%s class="url">%s</a>' % (url, target, match.group(0))
769
8b6137f7b4e1 tools: addURLToText moved from libervia to sat_frontends/tools/strings
souliane <souliane@mailoo.org>
parents: 719
diff changeset
61 pattern = 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`!()\[\]{};:'".,<>?]))"""
8b6137f7b4e1 tools: addURLToText moved from libervia to sat_frontends/tools/strings
souliane <souliane@mailoo.org>
parents: 719
diff changeset
62 return re.sub(pattern, repl, string)
842
429c6a0ef73d frontends (tools): addURLToImage makes an image clickable
souliane <souliane@mailoo.org>
parents: 811
diff changeset
63
429c6a0ef73d frontends (tools): addURLToImage makes an image clickable
souliane <souliane@mailoo.org>
parents: 811
diff changeset
64
429c6a0ef73d frontends (tools): addURLToImage makes an image clickable
souliane <souliane@mailoo.org>
parents: 811
diff changeset
65 def addURLToImage(string):
1790
bf7e468fe440 tools (strings): add a parameter "new_target" to addURLToText
souliane <souliane@mailoo.org>
parents: 1766
diff changeset
66 """Check a XHTML text for what looks like an imageURL and make it clickable.
bf7e468fe440 tools (strings): add a parameter "new_target" to addURLToText
souliane <souliane@mailoo.org>
parents: 1766
diff changeset
67
bf7e468fe440 tools (strings): add a parameter "new_target" to addURLToText
souliane <souliane@mailoo.org>
parents: 1766
diff changeset
68 @param string (unicode): text to process
bf7e468fe440 tools (strings): add a parameter "new_target" to addURLToText
souliane <souliane@mailoo.org>
parents: 1766
diff changeset
69 """
bf7e468fe440 tools (strings): add a parameter "new_target" to addURLToText
souliane <souliane@mailoo.org>
parents: 1766
diff changeset
70 # XXX: report any change to libervia.browser.strings.addURLToImage
842
429c6a0ef73d frontends (tools): addURLToImage makes an image clickable
souliane <souliane@mailoo.org>
parents: 811
diff changeset
71 def repl(match):
429c6a0ef73d frontends (tools): addURLToImage makes an image clickable
souliane <souliane@mailoo.org>
parents: 811
diff changeset
72 url = match.group(1)
429c6a0ef73d frontends (tools): addURLToImage makes an image clickable
souliane <souliane@mailoo.org>
parents: 811
diff changeset
73 return '<a href="%s" target="_blank">%s</a>' % (url, match.group(0))
429c6a0ef73d frontends (tools): addURLToImage makes an image clickable
souliane <souliane@mailoo.org>
parents: 811
diff changeset
74 pattern = r"""<img[^>]* src="([^"]+)"[^>]*>"""
429c6a0ef73d frontends (tools): addURLToImage makes an image clickable
souliane <souliane@mailoo.org>
parents: 811
diff changeset
75 return re.sub(pattern, repl, string)
1801
07390a9d1c09 tools (strings): add method fixXHTMLLinks to add a scheme if missing, and force opening in new tab
souliane <souliane@mailoo.org>
parents: 1790
diff changeset
76
07390a9d1c09 tools (strings): add method fixXHTMLLinks to add a scheme if missing, and force opening in new tab
souliane <souliane@mailoo.org>
parents: 1790
diff changeset
77
07390a9d1c09 tools (strings): add method fixXHTMLLinks to add a scheme if missing, and force opening in new tab
souliane <souliane@mailoo.org>
parents: 1790
diff changeset
78 def fixXHTMLLinks(xhtml):
07390a9d1c09 tools (strings): add method fixXHTMLLinks to add a scheme if missing, and force opening in new tab
souliane <souliane@mailoo.org>
parents: 1790
diff changeset
79 """Add http:// if the scheme is missing and force opening in a new window.
07390a9d1c09 tools (strings): add method fixXHTMLLinks to add a scheme if missing, and force opening in new tab
souliane <souliane@mailoo.org>
parents: 1790
diff changeset
80
07390a9d1c09 tools (strings): add method fixXHTMLLinks to add a scheme if missing, and force opening in new tab
souliane <souliane@mailoo.org>
parents: 1790
diff changeset
81 @param string (unicode): XHTML Content
07390a9d1c09 tools (strings): add method fixXHTMLLinks to add a scheme if missing, and force opening in new tab
souliane <souliane@mailoo.org>
parents: 1790
diff changeset
82 """
07390a9d1c09 tools (strings): add method fixXHTMLLinks to add a scheme if missing, and force opening in new tab
souliane <souliane@mailoo.org>
parents: 1790
diff changeset
83 subs = []
07390a9d1c09 tools (strings): add method fixXHTMLLinks to add a scheme if missing, and force opening in new tab
souliane <souliane@mailoo.org>
parents: 1790
diff changeset
84 for match in re.finditer(r'<a( \w+="[^"]*")* ?/?>', xhtml):
07390a9d1c09 tools (strings): add method fixXHTMLLinks to add a scheme if missing, and force opening in new tab
souliane <souliane@mailoo.org>
parents: 1790
diff changeset
85 tag = match.group(0)
07390a9d1c09 tools (strings): add method fixXHTMLLinks to add a scheme if missing, and force opening in new tab
souliane <souliane@mailoo.org>
parents: 1790
diff changeset
86 url = re.search(r'href="([^"]*)"', tag)
07390a9d1c09 tools (strings): add method fixXHTMLLinks to add a scheme if missing, and force opening in new tab
souliane <souliane@mailoo.org>
parents: 1790
diff changeset
87 if url:
07390a9d1c09 tools (strings): add method fixXHTMLLinks to add a scheme if missing, and force opening in new tab
souliane <souliane@mailoo.org>
parents: 1790
diff changeset
88 if not re.search(r'target="([^"]*)"', tag): # no target
07390a9d1c09 tools (strings): add method fixXHTMLLinks to add a scheme if missing, and force opening in new tab
souliane <souliane@mailoo.org>
parents: 1790
diff changeset
89 subs.append((tag, '<a target="_blank"%s' % tag[2:]))
07390a9d1c09 tools (strings): add method fixXHTMLLinks to add a scheme if missing, and force opening in new tab
souliane <souliane@mailoo.org>
parents: 1790
diff changeset
90 if not re.match(r"^\w+://", url.group(1)): # no scheme
07390a9d1c09 tools (strings): add method fixXHTMLLinks to add a scheme if missing, and force opening in new tab
souliane <souliane@mailoo.org>
parents: 1790
diff changeset
91 subs.append((url.group(0), 'href="http://%s"' % url.group(1)))
07390a9d1c09 tools (strings): add method fixXHTMLLinks to add a scheme if missing, and force opening in new tab
souliane <souliane@mailoo.org>
parents: 1790
diff changeset
92
07390a9d1c09 tools (strings): add method fixXHTMLLinks to add a scheme if missing, and force opening in new tab
souliane <souliane@mailoo.org>
parents: 1790
diff changeset
93 for url, new_url in subs:
07390a9d1c09 tools (strings): add method fixXHTMLLinks to add a scheme if missing, and force opening in new tab
souliane <souliane@mailoo.org>
parents: 1790
diff changeset
94 xhtml = xhtml.replace(url, new_url)
07390a9d1c09 tools (strings): add method fixXHTMLLinks to add a scheme if missing, and force opening in new tab
souliane <souliane@mailoo.org>
parents: 1790
diff changeset
95 return xhtml
07390a9d1c09 tools (strings): add method fixXHTMLLinks to add a scheme if missing, and force opening in new tab
souliane <souliane@mailoo.org>
parents: 1790
diff changeset
96