~facundo/encuentro/trunk

« back to all changes in this revision

Viewing changes to server/helpers.py

  • Committer: Facundo Batista
  • Date: 2017-06-23 00:35:18 UTC
  • mto: This revision was merged to the branch mainline in revision 296.
  • Revision ID: facundo@taniquetil.com.ar-20170623003518-sv60l0eib3rjx882
Huge renewal refactor.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# -*- coding: utf8 -*-
2
 
 
3
 
# Copyright 2012-2014 Facundo Batista
 
1
# Copyright 2012-2017 Facundo Batista
4
2
#
5
3
# This program is free software: you can redistribute it and/or modify it
6
4
# under the terms of the GNU General Public License version 3, as published
18
16
 
19
17
"""A couple of helpers for server stuff."""
20
18
 
21
 
from __future__ import unicode_literals
22
 
 
23
19
import bz2
24
20
import pickle
25
21
import cgi
28
24
import re
29
25
import time
30
26
 
31
 
try:
32
 
    import urlparse as parse
33
 
    from urllib2 import HTTPError
34
 
except ImportError:
35
 
    from urllib import parse
36
 
    from urllib.error import HTTPError
 
27
from urllib import parse
 
28
from urllib.error import HTTPError
 
29
 
 
30
 
 
31
UNIQUE_ID_SEPARATOR = '--'
37
32
 
38
33
 
39
34
def save_file(basename, data):
51
46
 
52
47
 
53
48
def _weird_utf8_fixing(byteseq):
54
 
    """Clean non-utf8 elements and decode."""
 
49
    """Clean non-utf8 elements and decode.
 
50
 
 
51
    Receive bytes, return unicode.
 
52
    """
55
53
    tmp = []
56
54
    consume = 0
57
55
    for i, c in enumerate(byteseq):
58
56
        if consume:
59
57
            consume -= 1
60
58
            continue
61
 
        ord_c = ord(c)
62
 
        if ord_c <= 127:  # 0... ....
 
59
        if c <= 127:  # 0... ....
63
60
            tmp.append(c)
64
 
        elif 192 <= ord_c <= 223:  # 110. ....
 
61
        elif 192 <= c <= 223:  # 110. ....
65
62
            n = byteseq[i + 1]
66
 
            if 128 <= ord(n) <= 191:
 
63
            if 128 <= n <= 191:
67
64
                # second byte ok
68
65
                tmp.append(c)
69
66
                tmp.append(n)
70
67
                consume = 1
71
68
        else:
72
69
            ValueError("Unsupported fixing sequence.")
73
 
    result = b"".join(tmp).decode("utf8")
 
70
    result = bytes(tmp).decode("utf8")
74
71
    return result
75
72
 
76
73
 
78
75
    """Sanitize html."""
79
76
    # try to decode in utf8, otherwise try in cp1252
80
77
    try:
81
 
        html.decode("utf8")
 
78
        html = html.decode("utf8")
82
79
    except UnicodeDecodeError:
83
80
        try:
84
81
            html = html.decode("cp1252")
86
83
            html = _weird_utf8_fixing(html)
87
84
 
88
85
    # remove script stuff
89
 
    html = re.sub(b"<script.*?</script>", b"", html, flags=re.S)
 
86
    html = re.sub("<script.*?</script>", "", html, flags=re.S)
90
87
    return html
91
88
 
92
89
 
172
169
 
173
170
    text = "%02d. %s" % (number, rest.strip())
174
171
    return text
 
172
 
 
173
 
 
174
def get_unique_id(prev_id, all_ids):
 
175
    """Fake an ID using a separator and a number for it to be unique."""
 
176
    if UNIQUE_ID_SEPARATOR in prev_id:
 
177
        p1, p2 = prev_id.split(UNIQUE_ID_SEPARATOR)
 
178
        base_id = p1
 
179
        prev_number = int(p2)
 
180
    else:
 
181
        prev_number = 0
 
182
        base_id = prev_id
 
183
 
 
184
    while prev_id in all_ids:
 
185
        prev_number += 1
 
186
        prev_id = base_id + UNIQUE_ID_SEPARATOR + str(prev_number)
 
187
    return prev_id