# -*- coding: utf-8 -*-
#Copyright (c) 2009, Walter Bender
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
import os
from gettext import gettext as _
from constants import *
from math import sin, cos, pi
RED_STROKE = "#FF6040"
RED_FILL = "#FFC4B8"
BLUE_STROKE = "#0060C8"
BLUE_FILL = "#ACC8E4"
GREEN_STROKE = "#00B418"
GREEN_FILL = "#AFE8A8"
color_pairs = ([RED_STROKE,RED_FILL],
[GREEN_STROKE,GREEN_FILL],
[BLUE_STROKE,BLUE_FILL])
fill_styles = ["solid","none","gradient"]
card_types = ["X","O","C"]
roman_numerals = {5:'V',7:'VII',10:'X',11:'XI',14:'XIV',15:'XV',\
21:'XXI',22:'XXII',33:'XXXIII'}
number_names = {5:_('five'),7:_('seven'),11:_('eleven'),10:_('ten'),\
14:_('fourteen'),15:_('fifteen'),22:_('twenty two'),\
21:_('twenty one'),33:_('thirty three')}
number_products = {5:'1×5',7:'1×7',11:'1×11',10:'2×5',\
14:'2×7',15:'3×5',22:'2×11',\
21:'3×7',33:'3×11'}
chinese_numerals = {5:'五',7:'七',10:'十',11:'十一',14:'十四',15:'十五',\
21:'廿一',22:'廿二',33:'卅三'}
word_lists = [[_('mouse'),_('cat'),_('dog')],\
[_('cheese'),_('apple'),_('bread')],\
[_('moon'),_('sun'),_('earth')]]
word_styles = ["font-weight:bold;","","font-style:italic;"]
#
# SVG generators
#
def svg_rect(f,w,h,rx,ry,x,y,stroke,fill,stroke_width):
f.write(" \n")
def svg_circle(f,cx,cy,r,stroke,fill,stroke_width):
f.write(" \n")
def svg_line(f,x1,y1,x2,y2,stroke,fill,stroke_width):
f.write("\n")
def svg_text(f,x,y,size,stroke,font,style,string):
f.write(" \n")
f.write(" "+string+"\n")
f.write(" \n")
def svg_check(f, x, style, stroke, fill):
f.write("\n")
elif style == "gradient":
f.write(" style=\"fill:"+fill+";stroke:"+stroke+\
";stroke-width:1.8;\" />\n")
else:
f.write(" style=\"fill:"+stroke+";stroke:"+stroke+\
";stroke-width:1.8;\" />\n")
def svg_cross(f, x, style, stroke, fill):
f.write("\n")
elif style == "gradient":
f.write(" style=\"fill:"+fill+";stroke:"+stroke+\
";stroke-width:1.8;\" />\n")
else:
f.write(" style=\"fill:"+stroke+";stroke:"+stroke+\
";stroke-width:1.8;\" />\n")
def background(f,stroke,fill,width):
svg_rect(f,124.5,74.5,11,9,0.25,0.25,stroke,fill,width)
def header(f,stroke,fill,width):
f.write("\n")
f.write("\n")
f.write("\n")
#
# Card pattern generators
#
def line_of_dots(f, n, x, y, stroke):
f.write("\n")
if n%5 == 0:
cx = 37.5
elif n%7 == 0:
cx = 27.5
else:
cx = 7.5
cy = 5
for i in range(n):
svg_circle(f,cx,cy,3,stroke,stroke,2)
cx += 10
f.write("\n")
def hash(f, n, x, y, stroke):
f.write("\n")
if n%5 == 0:
cx = 42.5
elif n%7 == 0:
cx = 32.5
else:
cx = 22.5
cy = 5
x1 = 7.5+cx
x2 = cx
for i in range(n):
if (i+1)%5==0:
svg_line(f,x1-40,7.5,x2,7.5,stroke,"none",1.8)
else:
svg_line(f,x1,0,x2,15,stroke,"none",1.8)
x1 += 7.5
x2 += 7.5
f.write("\n")
def dots_in_a_line(f, t, n, stroke):
if n%3 == 0:
y = 12.5
nn = n/3
elif n%2 == 0:
y = 22.5
nn = n/2
else:
y = 32.5
nn = n
if n%5 == 0:
n/=5
elif n%7 == 0:
n/=7
else:
n/=11
for i in range(n):
line_of_dots(f, nn, 5, y, stroke)
y += 20
def circle_of_dots(f, n, x, y, stroke):
f.write("\n")
j = n
ox = 0
oy = 32.5
if j == 5:
r = 9
elif j == 7:
r = 13
else:
r = 17
da = pi*2/j
a = 0
x = ox+sin(a)*r
y = oy+cos(a)*r
for i in range(n):
svg_circle(f,x,y,3,stroke,stroke,2)
a += da
x = ox+sin(a)*r
y = oy+cos(a)*r
f.write("\n")
def points_in_a_star(f, t, n, stroke):
if n%3 == 0:
x = 25
nn = n/3
elif n%2 == 0:
x = 37.5
nn = n/2
else:
x = 62.5
nn = n
if n%5 == 0:
n/=5
y = 15
elif n%7 == 0:
n/=7
y = 15
else:
n/=11
y = 15
for i in range(n):
if n == 3:
if i == 0:
y+=12
elif i == 1:
y-=24
else:
y+=24
star(f, nn, x, y, stroke)
if n == 2:
x += 50
else:
x += 37.5
def dots_in_a_circle(f, t, n, stroke):
if n%3 == 0:
x = 25
nn = n/3
elif n%2 == 0:
x = 37.5
nn = n/2
else:
x = 62.5
nn = n
if n%5 == 0:
n/=5
y = 5
elif n%7 == 0:
n/=7
y = 5
else:
n/=11
y = 5
for i in range(n):
if n == 3:
if i == 0:
y+=12
elif i == 1:
y-=24
else:
y+=24
circle_of_dots(f, nn, x, y, stroke)
if n == 2:
x += 50
else:
x += 37.5
def die(f, n, x, y, stroke):
f.write("\n")
svg_rect(f,25,25,2,2,0,0,stroke,"none",1.5)
if n in [2,3,4,5,6]:
svg_circle(f,6,6,1.5,stroke,stroke,2)
svg_circle(f,19,19,1.5,stroke,stroke,2)
if n in [1,3,5]:
svg_circle(f,12.5,12.5,1.5,stroke,stroke,2)
if n in [4,5,6]:
svg_circle(f,19,6,1.5,stroke,stroke,2)
svg_circle(f,6,19,1.5,stroke,stroke,2)
if n in [6]:
svg_circle(f,6,12.5,1.5,stroke,stroke,2)
svg_circle(f,19,12.5,1.5,stroke,stroke,2)
f.write("\n")
def number_hash(f, t, n, stroke):
if n%3 == 0:
y = 12.5
nn = n/3
elif n%2 == 0:
y = 22.5
nn = n/2
else:
y = 32.5
nn = n
if n%5 == 0:
n/=5
elif n%7 == 0:
n/=7
else:
n/=11
for i in range(n):
hash(f, nn, 5, y, stroke)
y += 20
def dice(f, t, n, stroke):
if n == 5:
die(f, 5, 50, 25, stroke)
elif n == 10:
die(f, 5, 30, 25, stroke)
die(f, 5, 70, 25, stroke)
elif n == 15:
die(f, 5, 15, 25, stroke)
die(f, 5, 50, 25, stroke)
die(f, 5, 85, 25, stroke)
elif n == 7:
die(f, 3, 50, 10, stroke)
die(f, 4, 50, 40, stroke)
elif n == 14:
die(f, 4, 30, 10, stroke)
die(f, 3, 70, 10, stroke)
die(f, 3, 30, 40, stroke)
die(f, 4, 70, 40, stroke)
elif n == 21:
die(f, 3, 15, 10, stroke)
die(f, 4, 50, 10, stroke)
die(f, 3, 85, 10, stroke)
die(f, 4, 15, 40, stroke)
die(f, 3, 50, 40, stroke)
die(f, 4, 85, 40, stroke)
elif n == 11:
die(f, 5, 50, 10, stroke)
die(f, 6, 50, 40, stroke)
elif n == 22:
die(f, 6, 30, 10, stroke)
die(f, 5, 70, 10, stroke)
die(f, 5, 30, 40, stroke)
die(f, 6, 70, 40, stroke)
elif n == 33:
die(f, 5, 15, 10, stroke)
die(f, 6, 50, 10, stroke)
die(f, 5, 85, 10, stroke)
die(f, 6, 15, 40, stroke)
die(f, 5, 50, 40, stroke)
die(f, 6, 85, 40, stroke)
def star(f, n, x, y, stroke):
turntable = {5:3,7:3,11:5}
f.write("\n")
turns = turntable[n]
x1 = 0
y1 = 0
a = 0
for i in range(n*turns):
x2 = x1+sin(a)*40
y2 = y1+cos(a)*40
svg_line(f,x1,y1,x2,y2,stroke,stroke,1.8)
x1 = x2
y1 = y2
a += turns*2*pi/n
f.write("\n")
def circle(f, x, style, stroke, fill):
if style == "none":
svg_circle(f,x+17,38,16,stroke,"#FFFFFF",1.8)
elif style == "gradient":
svg_circle(f,x+17,38,16,stroke,fill,1.8)
else:
svg_circle(f,x+17,38,16,stroke,stroke,1.8)
svg_circle(f,x+17,38,8,stroke,fill,1.8)
def check_card(f, n, style, stroke, fill):
if n == 1:
svg_check(f, 45.5, style, stroke, fill)
elif n == 2:
svg_check(f, 25.5, style, stroke, fill)
svg_check(f, 65.5, style, stroke, fill)
else:
svg_check(f, 5.5, style, stroke, fill)
svg_check(f, 45.5, style, stroke, fill)
svg_check(f, 85.5, style, stroke, fill)
def cross_card(f, n, style, stroke, fill):
if n == 1:
svg_cross(f, 45.5, style, stroke, fill)
elif n == 2:
svg_cross(f, 25.5, style, stroke, fill)
svg_cross(f, 65.5, style, stroke, fill)
else:
svg_cross(f, 5.5, style, stroke, fill)
svg_cross(f, 45.5, style, stroke, fill)
svg_cross(f, 85.5, style, stroke, fill)
def circle_card(f, n, style, stroke, fill):
if n == 1:
circle(f, 45.5, style, stroke, fill)
elif n == 2:
circle(f, 25.5, style, stroke, fill)
circle(f, 65.5, style, stroke, fill)
else:
circle(f, 5.5, style, stroke, fill)
circle(f, 45.5, style, stroke, fill)
circle(f, 85.5, style, stroke, fill)
def number_arabic(f, t, n, stroke):
x = 63.5
string = str(n)
svg_text(f,x,55,48,stroke,"DejaVu","",string)
def number_roman(f, t, n, stroke):
x = 63.5
string = roman_numerals[n]
svg_text(f,x,53,32,stroke,"DejaVu Serif","",string)
def number_chinese(f, t, n, stroke):
x = 63.5
string = chinese_numerals[n]
svg_text(f,x,55,48,stroke,"DejaVu","",string)
def number_product(f, t, n, stroke):
x = 63.5
string = number_products[n]
svg_text(f,x,53,36,stroke,"DejaVu","",string)
def number_word(f, t, n, stroke):
x = 63.5
strings = number_names[n].split(' ')
if len(strings) == 1:
svg_text(f,x,48,26,stroke,"DejaVu Serif","",strings[0])
else:
svg_text(f,x,35,26,stroke,"DejaVu Serif","",strings[0])
svg_text(f,x,63,26,stroke,"DejaVu Serif","",strings[1])
def number_card(f, t, n, stroke, methodX, methodO, methodC):
if t == 'X':
methodX(f, t, n, stroke)
elif t == 'O':
methodO(f, t, n, stroke)
else:
methodC(f, t, n, stroke)
def word_card(f, t, c, n, s):
svg_text(f,63.5,45.5,30,c[0],"DejaVu",s,word_lists[card_types.index(t)][n])
def pattern_card(f, t, c, n, s):
pattern_styles = [cross_card, circle_card, check_card]
pattern_styles[card_types.index(t)](f,n,s,c[0],c[1])
def open_file(datapath, filename):
return file(os.path.join(datapath, filename), "w")
def close_file(f):
f.close()
def generator(datapath,numberO=PRODUCT,numberC=HASH):
generate_pattern_cards(datapath)
generate_number_cards(datapath,numberO,numberC)
generate_word_cards(datapath)
def generate_pattern_cards(datapath):
i = 0
for t in card_types:
for c in color_pairs:
for n in range(1,4):
for s in fill_styles:
filename = "pattern-%d.svg" % (i)
f = open_file(datapath, filename)
header(f,"#000000",c[1],"0.5")
pattern_card(f,t,c,n,s)
footer(f)
close_file(f)
i += 1
def generate_number_cards(datapath,numberO,numberC):
methodO = [number_roman, number_product, number_chinese, number_word]
methodC = [dots_in_a_line, dots_in_a_circle, points_in_a_star,\
number_hash, dice]
methodX = number_arabic
i = 0
for t in card_types:
for c in color_pairs:
for n in range(1,4):
for s in [5,7,11]:
filename = "number-%d.svg" % (i)
f = open_file(datapath, filename)
header(f,"#000000",c[1],"0.5")
number_card(f,t,n*s,c[0],
methodX,methodO[numberO],methodC[numberC])
footer(f)
close_file(f)
i += 1
def generate_word_cards(datapath):
i = 0
for t in card_types:
for c in color_pairs:
for n in range(0,3):
for s in word_styles:
filename = "word-%d.svg" % (i)
f = open_file(datapath, filename)
header(f,"#000000",c[1],"0.5")
word_card(f,t,c,n,s)
footer(f)
close_file(f)
i += 1
f = open_file(datapath, "match.svg")
header(f,"#A0A0A0","#F0F0F0","3.0")
footer(f)
close_file(f)
f = open_file(datapath, "selected.svg")
header(f,"#000000","none","3.0")
footer(f)
close_file(f)
def main():
return 0
if __name__ == "__main__":
if not os.path.exists(os.path.join(os.path.abspath('.'), 'images')):
os.mkdir(os.path.join(os.path.abspath('.'), 'images'))
generator(os.path.join(os.path.abspath('.'), 'images'))
main()