index.py
author Tero Marttila <terom@fixme.fi>
Tue, 05 May 2009 19:39:44 +0300
changeset 15 707ddd7a7912
parent 13 a0cb32f3de3d
child 16 9234f5ae765b
permissions -rwxr-xr-x
fix if fewer text than chars
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
#!/usr/bin/python2.5
3
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
     2
import werkzeug
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
     3
from werkzeug.exceptions import HTTPException
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
1
71c7382994c4 rename logo.py -> index.cgi, and implement blurring
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
     5
from PIL import Image, ImageDraw, ImageFont, ImageEnhance
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
from cStringIO import StringIO
13
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
     7
import random, itertools, time, os.path
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
5
6d0e03f2fef4 replace zip with itertools.izip_longest
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
     9
if not hasattr(itertools, 'izip_longest') :
6d0e03f2fef4 replace zip with itertools.izip_longest
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    10
  
6d0e03f2fef4 replace zip with itertools.izip_longest
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    11
    def izip_longest(*args, **kwds):
6d0e03f2fef4 replace zip with itertools.izip_longest
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    12
        # izip_longest('ABCD', 'xy', fillvalue='-') --> Ax By C- D-
6d0e03f2fef4 replace zip with itertools.izip_longest
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    13
        fillvalue = kwds.get('fillvalue')
6d0e03f2fef4 replace zip with itertools.izip_longest
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    14
        def sentinel(counter = ([fillvalue]*(len(args)-1)).pop):
6d0e03f2fef4 replace zip with itertools.izip_longest
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    15
            yield counter()         # yields the fillvalue, or raises IndexError
6d0e03f2fef4 replace zip with itertools.izip_longest
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    16
        fillers = itertools.repeat(fillvalue)
6d0e03f2fef4 replace zip with itertools.izip_longest
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    17
        iters = [itertools.chain(it, sentinel(), fillers) for it in args]
6d0e03f2fef4 replace zip with itertools.izip_longest
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    18
        try:
6d0e03f2fef4 replace zip with itertools.izip_longest
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    19
            for tup in itertools.izip(*iters):
6d0e03f2fef4 replace zip with itertools.izip_longest
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    20
                yield tup
6d0e03f2fef4 replace zip with itertools.izip_longest
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    21
        except IndexError:
6d0e03f2fef4 replace zip with itertools.izip_longest
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    22
            pass
6d0e03f2fef4 replace zip with itertools.izip_longest
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    23
    
6d0e03f2fef4 replace zip with itertools.izip_longest
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    24
    itertools.izip_longest = izip_longest 
6d0e03f2fef4 replace zip with itertools.izip_longest
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    25
    
3
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    26
class Defaults :
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    27
    # settings
8
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    28
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    29
    text_lang = 'en'
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
7
9a6ac93e7446 implement image-format
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    31
    chars = [ u'"', u'!', u'?' ]
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
8
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    33
    colors = [
3
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    34
        "#0469af",
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    35
        "#fbc614",
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    36
        "#e1313b",
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    37
    ]
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    38
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    39
    font_name = 'helvetica'
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    40
    font_size = 30
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    41
    
8
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    42
    bg_color = "#ffffff"
3
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    43
    line_spacing = -10
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    44
    sharpness = 0.6
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
7
9a6ac93e7446 implement image-format
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    46
    img_format = 'png'
9a6ac93e7446 implement image-format
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    47
8
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    48
TEXT_BY_LANG = dict(
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    49
    en = [
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    50
        u"aalto",
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    51
        u"unive",
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    52
        u"rsity"
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    53
    ],
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    54
    fi = [
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    55
        u"aalto",
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    56
        u"yliop",
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    57
        u"isto"
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    58
    ],
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    59
    se = [
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    60
        u"aalto",
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    61
        u"univer",
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    62
        u"sitetet",
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    63
    ],
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    64
)
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    65
13
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    66
STATIC_PATH = "static"
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    67
8
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    68
FONTS = {
3
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    69
        'dejavu-sans-bold':     "/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans-Bold.ttf",
13
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    70
        'helvetica':            "fonts/HELR65W.TTF",
3
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    71
    }
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
8
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    73
IMAGE_FORMATS = {
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    74
    'jpeg': 'jpeg',
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    75
    'jpg':  'jpeg',
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    76
    'png':  'png',
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    77
    'bmp':  'bmp'
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    78
}
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    79
6
f61000aa264b limit max font size
Tero Marttila <terom@fixme.fi>
parents: 5
diff changeset
    80
FONT_SIZE_MAX = 1024
13
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    81
IMG_SIZE_MAX  = 1024
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    82
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    83
TILE_SIZE = (100, 100)
3
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    84
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    85
# enable debugging
6
f61000aa264b limit max font size
Tero Marttila <terom@fixme.fi>
parents: 5
diff changeset
    86
DEBUG = True
f61000aa264b limit max font size
Tero Marttila <terom@fixme.fi>
parents: 5
diff changeset
    87
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
def randomize (seq) :
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
    """
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
        Returns the given sequence in random order as a list
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
    """
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
    
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
    # copy
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
    l = list(seq)
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
    
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
    # rearrange
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
    random.shuffle(l)
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
    return l
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
11
0f070e9daa71 implement random-text-char
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   102
def randomize_str_char (str) :
0f070e9daa71 implement random-text-char
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   103
    """
0f070e9daa71 implement random-text-char
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   104
        Randomize the given string by moving one char around
0f070e9daa71 implement random-text-char
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   105
    """
0f070e9daa71 implement random-text-char
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   106
0f070e9daa71 implement random-text-char
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   107
    l = list(str)
0f070e9daa71 implement random-text-char
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   108
0f070e9daa71 implement random-text-char
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   109
    c = l.pop(random.randint(0, len(l) - 1))
0f070e9daa71 implement random-text-char
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   110
    l.insert(random.randint(0, len(l)), c)
0f070e9daa71 implement random-text-char
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   111
0f070e9daa71 implement random-text-char
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   112
    return ''.join(l)
0f070e9daa71 implement random-text-char
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   113
0f070e9daa71 implement random-text-char
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   114
def build_data (text, chars, line_colors, random_chars=True, random_text=False, random_text_char=False) :
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
    """
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
        Returns a matrix of (text, color) tuples representing the data to render
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
        [ [ (str, str) ] ]
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
            text        - list of lines
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
            chars       - list of random chars to interpse
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
            line_colors - list of colors to draw the chars in
11
0f070e9daa71 implement random-text-char
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   123
            random_chars        - randomize the lines the chars go in
0f070e9daa71 implement random-text-char
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   124
            random_text         - randomize the chars in each line
0f070e9daa71 implement random-text-char
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   125
            random_text_char    - randomize each line by moving one char around
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
    """
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   128
    data = []
9
efb80785ca9b add random-text
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   129
efb80785ca9b add random-text
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   130
    if random_chars :
efb80785ca9b add random-text
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   131
        chars = randomize(chars)
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
    
5
6d0e03f2fef4 replace zip with itertools.izip_longest
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   133
    for line, char, color in itertools.izip_longest(text, chars, line_colors, fillvalue=None) :
15
707ddd7a7912 fix if fewer text than chars
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   134
        if not line :
707ddd7a7912 fix if fewer text than chars
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   135
            continue
707ddd7a7912 fix if fewer text than chars
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   136
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   137
        # pick position to place char
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
        pos = random.randint(1, len(line) - 1)
5
6d0e03f2fef4 replace zip with itertools.izip_longest
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   139
6d0e03f2fef4 replace zip with itertools.izip_longest
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   140
        if not color :
6d0e03f2fef4 replace zip with itertools.izip_longest
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   141
            color = "#000000"
9
efb80785ca9b add random-text
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   142
efb80785ca9b add random-text
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   143
        if random_text :
efb80785ca9b add random-text
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   144
            line = ''.join(randomize(line))
11
0f070e9daa71 implement random-text-char
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   145
0f070e9daa71 implement random-text-char
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   146
        if random_text_char :
0f070e9daa71 implement random-text-char
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   147
            line = randomize_str_char(line)
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   148
        
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   149
        # split into three parts
5
6d0e03f2fef4 replace zip with itertools.izip_longest
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   150
        if char :
6d0e03f2fef4 replace zip with itertools.izip_longest
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   151
            data.append([
6d0e03f2fef4 replace zip with itertools.izip_longest
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   152
                    (line[:pos], "#000000"),
6d0e03f2fef4 replace zip with itertools.izip_longest
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   153
                    (char, color),
6d0e03f2fef4 replace zip with itertools.izip_longest
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   154
                    (line[pos:], "#000000"),
6d0e03f2fef4 replace zip with itertools.izip_longest
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   155
                ])
6d0e03f2fef4 replace zip with itertools.izip_longest
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   156
        else :
6d0e03f2fef4 replace zip with itertools.izip_longest
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   157
            data.append([
6d0e03f2fef4 replace zip with itertools.izip_longest
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   158
                    (line, "#000000"),
6d0e03f2fef4 replace zip with itertools.izip_longest
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   159
                ])
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   160
    
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   161
    return data
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   162
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   163
def load_font (font_name, font_size) :
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   164
    """
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   165
        Load a font by name
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   166
    """
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   167
    
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   168
    # load font
8
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   169
    font_path = FONTS[font_name]
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   170
    font = ImageFont.truetype(font_path, font_size)
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   171
    
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   172
    return font
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   173
13
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   174
def render_img (data, font, background_color="#ffffff", line_spacing=0, img_size=None) :
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   175
    """
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   176
        Render the data (as from build_data) as an image, using the given PIL.ImageFont, and return the PIL Image object
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   177
    """
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   178
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   179
    img_width = img_height = 0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   180
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   181
    img_data = []
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   182
    
13
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   183
    # compute image/segment width/height
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   184
    for segments in data :
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   185
        line_width = line_height = 0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   186
        
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   187
        # build a new list of segments with additional info
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   188
        line_segments = []
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   189
        
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   190
        for seg_text, seg_color in segments :
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   191
            # compute rendered text size
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   192
            seg_width, seg_height = font.getsize(seg_text)
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   193
            
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   194
            # update line_*
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   195
            line_width += seg_width
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   196
            line_height = max(line_height, seg_height)
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   197
            
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   198
            # build the new segments list
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   199
            line_segments.append((seg_text, seg_color, seg_width))
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   200
        
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   201
        # update img_*
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   202
        img_width = max(img_width, line_width)
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   203
        img_height += line_height
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   204
        img_data.append((line_segments, line_height))
13
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   205
    
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   206
    if img_size :
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   207
        # override size
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   208
        img_width, img_height = img_size
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   209
13
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   210
    else :
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   211
        # calculate height needed for line spacing
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   212
        img_height += (len(img_data) - 1) * line_spacing
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   213
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   214
    # create image
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   215
    img = Image.new("RGB", (img_width, img_height), background_color)
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   216
    draw = ImageDraw.Draw(img)
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   217
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   218
    # draw text
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   219
    img_y = 0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   220
    for segments, line_height in img_data :
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   221
        img_x = 0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   222
        
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   223
        # draw each segment build above, incremeing along img_x
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   224
        for seg_text, seg_color, seg_width in segments :
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   225
            draw.text((img_x, img_y), seg_text, font=font, fill=seg_color)
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   226
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   227
            img_x += seg_width
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   228
        
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   229
        img_y += line_height + line_spacing
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   230
    
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   231
    return img
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   232
3
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   233
def effect_sharpness (img, factor) :
1
71c7382994c4 rename logo.py -> index.cgi, and implement blurring
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   234
    """
3
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   235
        Sharpen the image by the given factor
1
71c7382994c4 rename logo.py -> index.cgi, and implement blurring
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   236
    """
71c7382994c4 rename logo.py -> index.cgi, and implement blurring
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   237
71c7382994c4 rename logo.py -> index.cgi, and implement blurring
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   238
    return ImageEnhance.Sharpness(img).enhance(factor)
71c7382994c4 rename logo.py -> index.cgi, and implement blurring
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   239
7
9a6ac93e7446 implement image-format
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   240
def build_img (img, format='png') :
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   241
    """
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   242
        Write the given PIL.Image as a string, returning the raw binary data
7
9a6ac93e7446 implement image-format
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   243
9a6ac93e7446 implement image-format
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   244
        Format should be one of the PIL-supported image foarts
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   245
    """
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   246
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   247
    # render PNG output
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   248
    buf = StringIO()
7
9a6ac93e7446 implement image-format
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
   249
    img.save(buf, format)
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   250
    data = buf.getvalue()
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   251
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   252
    return data
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   253
3
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   254
def arg_bool (val) :
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   255
    if val.lower() in ('true', 't', '1', 'yes', 'y') :
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   256
        return True
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   257
    elif val.lower() in ('false', 'f', '0', 'no', 'n') :
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   258
        return False
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   259
    else :
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   260
        raise ValueError(val)
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   261
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   262
def arg_color (val) :
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   263
    if val.beginswith('#') :
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   264
        int(val[1:], 16)
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   265
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   266
        return val
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   267
    else :
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   268
        raise ValueError(val)
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   269
8
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   270
class Option (object) :
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   271
    def __init__ (self, name, is_list, type, default, range) :
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   272
        self.name = name
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   273
        self.is_list = is_list
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   274
        self.type = type
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   275
        self.default = default
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   276
        self.range = range
3
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   277
8
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   278
    def parse (self, args) :
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   279
        if self.is_list :
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   280
            if self.name in args :
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   281
                return args.getlist(self.name, self.type)
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   282
            else :
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   283
                return self.default
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   284
        else :
10
6add80d3993b enable arg_bools by just giving an empty opt
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   285
            if self.type == arg_bool and not self.default and self.name in args :
6add80d3993b enable arg_bools by just giving an empty opt
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   286
                return True
6add80d3993b enable arg_bools by just giving an empty opt
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   287
6add80d3993b enable arg_bools by just giving an empty opt
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   288
            else :
6add80d3993b enable arg_bools by just giving an empty opt
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
   289
                return args.get(self.name, self.default, self.type)
3
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   290
8
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   291
class Options (object) :
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   292
    def __init__ (self, *options) :
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   293
        self.options = options
6
f61000aa264b limit max font size
Tero Marttila <terom@fixme.fi>
parents: 5
diff changeset
   294
8
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   295
    def parse (self, args) :
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   296
        return dict((opt.name, opt.parse(args)) for opt in self.options)
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   297
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   298
OPTIONS = Options(
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   299
    Option('lang',          False,  str,        Defaults.text_lang,     TEXT_BY_LANG.keys()),
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   300
    Option('text',          True,   unicode,    None,                   None),
9
efb80785ca9b add random-text
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   301
    Option('random-text',   False,  arg_bool,   False,                  None),
11
0f070e9daa71 implement random-text-char
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
   302
    Option('random-text-char', False, arg_bool, False,                  None),
8
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   303
    Option('chars',         True,   unicode,    Defaults.chars,         None),
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   304
    Option('random-chars',  False,  arg_bool,   True,                   None),
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   305
    Option('colors',        True,   arg_color,  Defaults.colors,        None),
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   306
    Option('font',          False,  str,        Defaults.font_name,     FONTS.keys()),
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   307
    Option('font-size',     False,  int,        Defaults.font_size,     None),
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   308
    Option('bg-color',      False,  arg_color,  Defaults.bg_color,      None),
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   309
    Option('line-spacing',  False,  int,        Defaults.line_spacing,  None),
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   310
    Option('sharpness',     False,  float,      Defaults.sharpness,     None),
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   311
    Option('image-format',  False,  str,        Defaults.img_format,    IMAGE_FORMATS.keys()),
12
aa6b83c94528 implement ?seed
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   312
    Option('seed',          False,  int,        None,                   None),
13
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   313
    Option('img_width',     False,  int,        None,                   None),
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   314
    Option('img_height',    False,  int,        None,                   None),
8
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   315
)
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   316
13
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   317
def handle_generic (req, img_size=None) :
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   318
    # parse options
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   319
    opts = OPTIONS.parse(req.args)
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   320
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   321
    # postprocess
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   322
    if opts['text'] is None :
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   323
        opts['text'] = TEXT_BY_LANG[opts['lang']]
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   324
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   325
    if opts['font-size'] > FONT_SIZE_MAX :
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   326
        raise ValueError(opts['font-size'])
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   327
    
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   328
    if opts['seed'] is None :
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   329
        opts['seed'] = time.time()
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   330
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   331
    if opts['img_width'] and opts['img_height'] :
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   332
        img_size = (opts['img_width'], opts['img_height'])
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   333
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   334
        if opts['img_width'] > IMG_SIZE_MAX or opts['img_height'] > IMG_SIZE_MAX :
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   335
            raise ValueError(img_size)
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   336
    
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   337
    # load/prep resources
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   338
    random.seed(opts['seed'])
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   339
    data = build_data(opts['text'], opts['chars'], opts['colors'], opts['random-chars'], opts['random-text'], opts['random-text-char'])
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   340
    font = load_font(opts['font'], opts['font-size'])
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   341
    
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   342
    # render the image
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   343
    img = render_img(data, font, opts['bg-color'], opts['line-spacing'], img_size)
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   344
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   345
    img = effect_sharpness(img, opts['sharpness'])
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   346
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   347
    png_data = build_img(img, opts['image-format'])
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   348
    
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   349
    # build the response
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   350
    response = werkzeug.Response(png_data, mimetype='image/%s' % opts['image-format'])
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   351
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   352
    return response
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   353
8
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   354
def handle_help (req) :
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   355
    return werkzeug.Response('\n'.join(
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   356
        "%-15s %4s  %-10s %-20s %s" % data for data in [
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   357
            ("name", "", "type", "default", "range"),
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   358
            ("", "", "", "", ""),
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   359
        ] + [(
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   360
            opt.name, 
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   361
            'list' if opt.is_list else 'item', 
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   362
            opt.type.__name__, 
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   363
            repr(opt.default), 
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   364
            opt.range if opt.range else ""
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   365
        ) for opt in OPTIONS.options]
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   366
    ), mimetype='text/plain')
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   367
13
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   368
def handle_logo (req) :
8
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   369
    if 'help' in req.args :
44d5ead35f4b implement Options/?help
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
   370
        return handle_help(req)
12
aa6b83c94528 implement ?seed
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   371
    
13
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   372
    return handle_generic(req)
3
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   373
13
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   374
def handle_tile (req) :
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   375
    return handle_generic(req, img_size=TILE_SIZE)
3
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   376
13
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   377
def handle_request (req) :
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   378
    if req.path == '/' or req.path.startswith('/logo.') :
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   379
        return handle_logo(req)
3
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   380
    
13
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   381
    elif req.path == '/tile' :
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   382
        return handle_tile(req)
3
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   383
13
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   384
    else :
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   385
        raise ValueError(req)
3
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   386
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   387
@werkzeug.Request.application
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   388
def wsgi_application (request) :
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   389
    """
3
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   390
        Our werkzeug WSGI handler
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   391
    """
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   392
3
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   393
    try :
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   394
        # request -> response
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   395
        response = handle_request(request)
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   396
3
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   397
        return response
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   398
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   399
    except HTTPException, e :
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   400
        # return as HTTP response
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   401
        return e
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   402
13
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   403
def build_app () :
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   404
    """
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   405
        Build and return a WSGI application
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   406
    """
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   407
3
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   408
    app = wsgi_application
13
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   409
 
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   410
    # add other middleware
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   411
    app = werkzeug.SharedDataMiddleware(app, {
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   412
        '/static': STATIC_PATH,
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   413
    })
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   414
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   415
   
6
f61000aa264b limit max font size
Tero Marttila <terom@fixme.fi>
parents: 5
diff changeset
   416
    if DEBUG :
3
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   417
        # enable debugging
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   418
        app = werkzeug.DebuggedApplication(app, evalex=False)
13
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   419
    
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   420
    return app
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   421
13
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   422
def main_cgi (app) :
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   423
    import wsgiref.handlers
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   424
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   425
    handler = wsgiref.handlers.CGIHandler()
3
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   426
    handler.run(app)
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   427
13
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   428
def main_fastcgi (app) :
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   429
    import flup.server.fcgi
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   430
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   431
    server = flup.server.fcgi.WSGIServer(app,
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   432
        multithreaded   = False,
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   433
        multiprocess    = False,
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   434
        multiplexed     = False,
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   435
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   436
        bindAddress     = None,
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   437
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   438
        umask           = None,
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   439
        debug           = True,
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   440
    )
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   441
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   442
    server.run()
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   443
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   444
def main () :
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   445
    from sys import argv
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   446
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   447
    # get our file extension
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   448
    root, ext = os.path.splitext(argv[0])
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   449
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   450
    # get our handler
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   451
    handler = {
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   452
        '.cgi':     main_cgi,
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   453
        '.fcgi':    main_fastcgi,
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   454
    }[ext]
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   455
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   456
    # get our app
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   457
    app = build_app()
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   458
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   459
    # run
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   460
    handler(app)
a0cb32f3de3d add silly crap (FastCGI, tiles.*)
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   461
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   462
if __name__ == '__main__' :
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   463
    main()
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   464