File: text_width_check.py

package info (click to toggle)
frogatto-data 1.3.1%2Bdfsg-4
  • links: PTS, VCS
  • area: non-free
  • in suites: forky, sid, trixie
  • size: 254,428 kB
  • sloc: xml: 584; python: 396; perl: 249; sh: 126; ruby: 69; makefile: 21
file content (94 lines) | stat: -rwxr-xr-x 2,902 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os, sys, codecs
#usage: from frogatto's base folder, run:
#utils/text_width_check.py po/(desired file, with a "po" or "pot" extension) [optional:max width]
#e.g.:
#utils/text_width_check.py po/frogatto.pot 360
global MAXWIDTH
MAXWIDTH = 360

def main(catalog):
	if catalog.split('.')[-1] == "pot":
		check = "msgid"
		font = "dialog_font.cfg"
	elif catalog.split('.')[-1] == "po":
		check = "msgstr"
		#look for a specific dialog_font definition for that locale;
		#if unavailable, select the default one
		font = "dialog_font." + catalog.split('.')[0].split('/')[1] + ".cfg"
		if font not in os.listdir('data'):
			font = "dialog_font.cfg"
	else: return
	
	fontdata = codecs.open("../../data/" + font, encoding="utf-8").readlines()
	fontdata = [x.strip() for x in fontdata]
	charwidths = {}
	i = 0
	#default kerning for fonts
	kerning = 2
	while i < len(fontdata):
		if "kerning:" in fontdata[i]:
			kerning = int(fontdata[i].split(":")[1].replace(',',''))
		if "chars: \"" in fontdata[i]:
			chars = list(fontdata[i].split(":", 1)[1].replace(" \"", "",1).replace("\",", "",1))
		elif "width:" in fontdata[i]:
			for x in chars:
				charwidths[x]=int(fontdata[i].split(":")[1].replace(',',''))
		elif "rect:" in fontdata[i]:
			width = fontdata[i].replace('[','').replace(']','').split(':')[1].split(',')[:-1]
			width = int(width[2]) - int(width[0]) + 1
			for x in chars:
				charwidths[x]=width
		i += 1
	
	f = codecs.open(catalog, encoding="utf-8").readlines()
	#start from the first message line, i. e., the first with a #:
	l = [x[:2] for x in f].index("#:")
	msgline = 0
	while l < len(f):
		if "#:" in f[l] and "#:" not in f[l-1]:
			msgline = l
		if check in f[l]:
			linewidth = checkwidth(getmessage(f[l]), charwidths, kerning)
			if linewidth > MAXWIDTH:
				printline(f, msgline, linewidth)
			if len(getmessage(f[l])) == 0:
				l += 1
				while l < len(f) and '"' in f[l] and f[l][0] != "m":
					linewidth = checkwidth(getmessage(f[l]), charwidths, kerning)
					if linewidth > MAXWIDTH:
						printline(f, msgline, linewidth)
					l += 1
		l += 1
		
def printline(f, start, width):
	line = start
	sys.stdout.write((str(width) + " pixels:\n").encode("utf-8"))
	while len(f[line].strip()) > 0:
		sys.stdout.write((f[line].strip()+"\n").encode("utf-8"))
		line += 1
	sys.stdout.write("\n".encode("utf-8"))
	
def checkwidth(line, widths, kerning):
	result = 0
	for x in line:
		if x in widths.keys():
			result += widths[x] + kerning
	return result - kerning
			
def getmessage(line):
	if line[0] == "m":
		return line.replace('\\n','').replace('\r','').replace('\n','').split(' ',1)[1][1:-1]
	else:
		return line.replace('\\n','').replace('\r','').replace('\n','')[1:-1]
	
if __name__ == "__main__":
	if len(sys.argv) == 2:
		main(sys.argv[1])
	elif len(sys.argv) == 3:
		MAXWIDTH = int(sys.argv[2])
		main(sys.argv[1])
	else:
		pass