/usr/share/GvRng/worldMap.py is in gvrng 4.4-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 | # Copyright 2010 S. Zytkiewicz stas.zytkiewicz@gmail.com
# Copyright (C) 2001 Steve Howell
# You must read the file called INFO.txt before distributing this code.
# ---
# Worlds for Karel are defined with simple text files that we parse out
# in this module. See the worlds folder for examples.
from world import NORTH,SOUTH,EAST,WEST
from utils import trace_error
import types
import re,gettext
# Use this to be able to extract strings for translation by pygettext.py
try:
#print "current _", _
old_ = _
except Exception,info:
print >> sys.stderr, "in gvrparser locale switch:\n",info
_ = gettext.gettext
KEYWORDS = (
_('ROBOT'),
_('WALL'),
_('BEEPERS'),
_('SIZE'))
DIRECTIONS = (NORTH,SOUTH,EAST,WEST)
####################### Start I18N part #####################################
# Now we install a gettext file in the builtin namespace
# If this fails the bogus '_()' function is used and we end up with a english - english
# look-up table :-(
# A possible solution would be to test for locales but i think it won't matter much in speed.
_ = old_
#print _
# get a list with the translated strings
trans_commands, org_commands = [],[]
words = KEYWORDS
for i in words:
trans_commands.append(_(i))
org_commands.append(i) # this is the english one
# With this we build a look-up dictionary that is used in the Program class.
# The look-up dict: {'beweeg':'move','rechtsaf':turnright',....}
# the keys are the gettext strings and the vals are the original names.
lookup_dict = {}
for k,v in map(None,trans_commands,org_commands):
lookup_dict[k] = v
lookup_dir_dict = {_('N'):'N',_('S'):'S',_('E'):'E',_('W'):'W'}#
class WorldMapException(Exception):
def __init__(self, line, str):
self.line = line
self.str = str
def __str__(self): return self.str
def checkDirection(line, dir):
if dir not in lookup_dir_dict.values():
raise WorldMapException(line,
_("In line %d:\n%s is not a valid direction -- use N, S, E, or W")
% (line, dir))
def removeComment(line):
foundComment = False
for i in range(len(line)):
if line[i] == "#":
foundComment = True
break
if foundComment:
return line[:i]
else:
return line
def readWorld(lines, world):
definedRobot = 0
useGuido = False
linenumber = 0
worldSize = None
for line in lines:
linenumber += 1
try:
if re.search("\S", line) and not re.match("\s*#", line):
line = removeComment(line)
tokens = line.split()
tokens = [x.upper() for x in tokens]
keyword = tokens[0]
if lookup_dict.has_key(keyword):
keyword = lookup_dict[keyword]
if keyword == _('ROBOT') or keyword == 'ROBOT':
if len(tokens) < 4:
raise WorldMapException(linenumber,_('Robot direction argument missing'))
dir = tokens[3]
if lookup_dir_dict.has_key(dir):
dir = lookup_dir_dict[dir]
tokens[3] = dir
else:
print lookup_dir_dict.has_key(dir), lookup_dir_dict, dir
raise WorldMapException(linenumber, _('No valid direction given for the robot'))
if keyword ==_('WALL') or keyword == 'WALL':
tokens[0] = keyword
#print "wall",tokens
checkDirection(linenumber, dir)
#print "tokens",tokens
if len(tokens) < 3:
raise WorldMapException(linenumber,_('Too little %s arguments' % _('WALL')))
else:
if len(tokens) == 5:
try:
int(tokens[4])
except ValueError:
raise WorldMapException(linenumber, _('%s length argument must be an integer' % _('WALL')))
else:
if int(tokens[4]) < 1:
raise WorldMapException(linenumber,_('%s length argument must be greater than zero' % _('WALL')))
world.setWall(*tokens[1:])
elif keyword == _('ROBOT') or keyword == 'ROBOT':
if definedRobot:
raise WorldMapException(linenumber, _('You may only have one robot definition.'))
definedRobot = 1
tokens = [x.upper() for x in tokens]
if len(tokens) == 5:
x, y, dir, numBeepers = tokens[1:]
else:
x, y, dir = tokens[1:]
numBeepers = 0
robotX, robotY = int(x), int(y)
world.positionRobot(robotX, robotY, dir)
if numBeepers == "unlimited":
world.unlimitedBeepers = True
numBeepers = 0
world.setRobotBeepers(int(numBeepers))
elif keyword == _('BEEPERS') or keyword == 'BEEPERS':
x, y, numBeepers = tokens[1:]
world.setBeepers(int(x), int(y), int(numBeepers))
elif keyword == 'BDFL':
useGuido = True
elif keyword == _('SIZE') or keyword == 'SIZE':
if worldSize:
raise WorldMapException(linenumber,
_('You may only have one size statement'))
try:
avenues, streets = [int(coord) for coord in tokens[1:]]
except ValueError:
raise WorldMapException(linenumber,
_('Size statement should have 2 integers'))
if avenues < 7 or streets < 7:
raise WorldMapException(linenumber,
_('Size coordinates must be at least 7'))
worldSize = (avenues, streets)
else:
raise WorldMapException(linenumber,_("Cannot understand: %s") % line)
except (WorldMapException, Exception),e:
#trace_error()
info = _("Error: %s\n in line %s: %s\nCheck your world file for syntax errors") % (e, linenumber,line)
raise WorldMapException(linenumber, info)
if not definedRobot:
raise WorldMapException(linenumber, _("The world map seems to be missing information."))
world.useGuido = useGuido
return worldSize
|