index.cgi
author Tero Marttila <terom@fixme.fi>
Tue, 05 May 2009 17:15:27 +0300
changeset 3 ac063212bd67
parent 2 50d95ac19dfc
child 4 c5bd0b75b59c
permissions -rwxr-xr-x
implement params
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
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
     4
import wsgiref.handlers
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
1
71c7382994c4 rename logo.py -> index.cgi, and implement blurring
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
     6
from PIL import Image, ImageDraw, ImageFont, ImageEnhance
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
from cStringIO import StringIO
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
import random
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
3
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    11
class Defaults :
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    12
    # settings
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    13
    text = [
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    14
        "aalto",
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    15
        "unive",
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    16
        "rsity"
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    17
    ]
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
3
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    19
    chars = [ '"', '!', '?' ]
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
3
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    21
    line_colors = [
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    22
        "#0469af",
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    23
        "#fbc614",
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    24
        "#e1313b",
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    25
    ]
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    26
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    27
    font_name = 'helvetica'
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    28
    font_size = 30
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    29
    
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    30
    background_color = "#ffffff"
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    31
    line_spacing = -10
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    32
    sharpness = 0.6
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
fonts = {
3
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    35
        'dejavu-sans-bold':     "/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans-Bold.ttf",
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    36
        'helvetica':            "HELR65W.TTF",
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    37
    }
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
3
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    39
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    40
# enable debugging
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
    41
debug = True
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
def randomize (seq) :
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
    """
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
        Returns the given sequence in random order as a list
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
    """
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
    
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
    # copy
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
    l = list(seq)
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
    
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
    # rearrange
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
    random.shuffle(l)
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
    return l
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
def build_data (text, chars, line_colors) :
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
    """
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
        Returns a matrix of (text, color) tuples representing the data to render
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
        [ [ (str, str) ] ]
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
            text        - list of lines
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
            chars       - list of random chars to interpse
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
            line_colors - list of colors to draw the chars in
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
    """
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
    data = []
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
    
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
    for line, char, color in zip(text, chars, line_colors) :
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
        # pick position to place char
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
        pos = random.randint(1, len(line) - 1)
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
        
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
        # split into three parts
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
        data.append([
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
                (line[:pos], "#000000"),
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
                (char, color),
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
                (line[pos:], "#000000"),
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
            ])
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
    
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
    return data
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
def load_font (font_name, font_size) :
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
    """
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
        Load a font by name
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
    """
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
    
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
    # load font
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
    font_path = fonts[font_name]
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
    font = ImageFont.truetype(font_path, font_size)
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
    
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
    return font
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
def render_img (data, font, background_color="#ffffff", line_spacing=0) :
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
    """
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
        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
    96
    """
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
    img_width = img_height = 0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
    img_data = []
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
    
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
    # compute image width/height
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
    for segments in data :
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
        line_width = line_height = 0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
        
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
        # build a new list of segments with additional info
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
        line_segments = []
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
        
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
        for seg_text, seg_color in segments :
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
            # compute rendered text size
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
            seg_width, seg_height = font.getsize(seg_text)
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
            
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
            # update line_*
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
            line_width += seg_width
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
            line_height = max(line_height, seg_height)
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
            
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
            # build the new segments list
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
            line_segments.append((seg_text, seg_color, seg_width))
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
        
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
        # update img_*
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
        img_width = max(img_width, line_width)
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
        img_height += line_height
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
        img_data.append((line_segments, line_height))
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
    # calculate height needed for line spacing
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
    img_height += (len(img_data) - 1) * line_spacing
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   128
    # create image
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   129
    img = Image.new("RGB", (img_width, img_height), background_color)
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   130
    draw = ImageDraw.Draw(img)
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   131
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
    # draw text
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   133
    img_y = 0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
    for segments, line_height in img_data :
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   135
        img_x = 0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   136
        
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   137
        # draw each segment build above, incremeing along img_x
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
        for seg_text, seg_color, seg_width in segments :
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   139
            draw.text((img_x, img_y), seg_text, font=font, fill=seg_color)
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   140
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   141
            img_x += seg_width
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   142
        
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
        img_y += line_height + line_spacing
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   144
    
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   145
    return img
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   146
3
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   147
def effect_sharpness (img, factor) :
1
71c7382994c4 rename logo.py -> index.cgi, and implement blurring
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   148
    """
3
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   149
        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
   150
    """
71c7382994c4 rename logo.py -> index.cgi, and implement blurring
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   151
71c7382994c4 rename logo.py -> index.cgi, and implement blurring
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   152
    return ImageEnhance.Sharpness(img).enhance(factor)
71c7382994c4 rename logo.py -> index.cgi, and implement blurring
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   153
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   154
def build_png (img) :
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   155
    """
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   156
        Write the given PIL.Image as a string, returning the raw binary data
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   157
    """
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   158
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   159
    # render PNG output
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   160
    buf = StringIO()
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   161
    img.save(buf, "png")
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   162
    data = buf.getvalue()
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   163
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   164
    return data
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   165
3
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   166
def arg_bool (val) :
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   167
    if val.lower() in ('true', 't', '1', 'yes', 'y') :
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   168
        return True
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   169
    elif val.lower() in ('false', 'f', '0', 'no', 'n') :
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   170
        return False
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   171
    else :
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   172
        raise ValueError(val)
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   173
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   174
def arg_color (val) :
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   175
    if val.beginswith('#') :
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   176
        int(val[1:], 16)
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   177
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   178
        return val
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   179
    else :
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   180
        raise ValueError(val)
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   181
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   182
def handle_request (req) :
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   183
    # parse args
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   184
    if 'text' in req.args :
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   185
        text = req.args.getlist('text', unicode)
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   186
    else :
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   187
        text = Defaults.text
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   188
    
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   189
    if 'chars' in req.args :
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   190
        chars = req.args.getlist('chars', unicode)
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   191
    else :
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   192
        chars = Defaults.chars
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   193
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   194
    if 'colors' in req.args :
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   195
        colors = req.args.getlist('colors', arg_color)
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   196
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   197
    else :
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   198
        colors = Defaults.line_colors
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   199
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   200
    font_name = req.args.get('font', Defaults.font_name)
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   201
    font_size = req.args.get('font-size', Defaults.font_size, int)
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   202
    background_color = req.args.get('background-color', Defaults.background_color, arg_color)
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   203
    line_spacing = req.args.get('line-spacing', Defaults.line_spacing, int)
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   204
    sharpness = req.args.get('sharpness', Defaults.sharpness, float)
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   205
    
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   206
    # put the chars in random order by default
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   207
    if req.args.get('random_chars', True, arg_bool) :
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   208
        chars = randomize(chars)
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   209
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   210
    # load/prep resources
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   211
    data = build_data(text, chars, colors)
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   212
    font = load_font(font_name, font_size)
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   213
    
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   214
    # render the image
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   215
    img = render_img(data, font, background_color, line_spacing)
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   216
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   217
    img = effect_sharpness(img, sharpness)
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   218
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   219
    png_data = build_png(img)
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   220
    
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   221
    # build the response
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   222
    response = werkzeug.Response(png_data, mimetype='image/png')
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   223
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   224
    return response
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   225
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   226
@werkzeug.Request.application
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   227
def wsgi_application (request) :
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   228
    """
3
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   229
        Our werkzeug WSGI handler
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   230
    """
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   231
3
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   232
    try :
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   233
        # request -> response
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   234
        response = handle_request(request)
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   235
3
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   236
        return response
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   237
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   238
    except HTTPException, e :
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   239
        # return as HTTP response
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   240
        return e
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
def main () :
3
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   243
    handler = wsgiref.handlers.CGIHandler()
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   244
    app = wsgi_application
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   245
    
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   246
    if debug :
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   247
        # enable debugging
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   248
        app = werkzeug.DebuggedApplication(app, evalex=False)
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   249
3
ac063212bd67 implement params
Tero Marttila <terom@fixme.fi>
parents: 2
diff changeset
   250
    handler.run(app)
0
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   251
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   252
if __name__ == '__main__' :
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   253
    main()
44c5c8c2ac66 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   254