This file is indexed.

/usr/share/pyshared/simpleparse/common/timezone_names.py is in python-simpleparse 2.1.0a1-6build1.

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
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
"""Common timezone names (civilian, military and combined)

These productions are a collection of common civilian and
military timezone names.  The list of names is by no means
exhaustive (nor definitive), but it gives most timezones
at least one named value (to make it possible to enter the
name), and it doesn't repeat any names (I hope ;) ).  You
have three major classes of names, civilian (EST, PST, GMT,
UTC), military single-character (A,B,C,D,E...) and military
phonetic spelling (Alpha, Bravo... Zulu).  The military
variants are combined into a single production, however.

	civilian_timezone_name -- the "familiar" timezones, most
		real-world data entry will want to use this as their
		"timezone" definition I'm guessing.
		
	military_timezone_name -- military timezones in the two
		formats outlined above.
		
	timezone_name -- combination of the two above into a
		single production.

Interpreter:

	TimeZoneNameInterpreter -- see below for details, by
		default takes the timezone name and converts to
		a second offset in West-negative format.  Note:
		this is the _opposite_ of the time module, but is
		the more commonly used format AFAIK.  Null matches
		will return a default TimeZone as specified.
"""
from simpleparse import objectgenerator, common
from simpleparse.common import phonetics
import time

c = {}

timezone_data = []
civilian_data = [
	# Basically this defines our recognised input locales,
	# it is by no means exhaustive, but it gives fairly
	# good coverage with minimal overlap
	('NZDT',46800),
	('IDLE',43200),
	('NZST',43200),
	('NZT',43200),
	('AESST',39600),
	('ACSST',37800),
	('CADT',37800),
	('SADT',37800),
	('AEST',36000),
	('EAST',36000),
	('GST',36000),
	('LIGT',36000),
	('ACST',34200),
	('CAST',34200),
	('SAT',34200),
	('AWSST',32400),
	('JST',32400),
	('KST',32400),
	('WDT',32400),
	('MT',30600),
	('AWST',28800),
	('CCT',28800),
	('WADT',28800),
	('WST',28800),
	('JT',27000),
	('WAST',25200),
	('IT',12600),
	('BT',10800),
	('EETDST',10800),
	('MSK', 10800),
	('CETDST',7200),
	('EET',7200),
	('FWT',7200),
	('IST',7200),
	('MEST',7200),
	('METDST',7200),
	('SST',7200),
	('BST',3600),
	('CET',3600),
	('DNT',3600),
	('DST',3600),
	('FST',3600),
	('MET',3600),
	('MEWT',3600),
	('MEZ',3600),
	('NOR',3600),
	('SET',3600),
	('SWT',3600),
	('WETDST',3600),
	('GMT',0),
	('UTC', 0),
	('WET',0),
	('WAT',-3600),
	('NDT',-5400),
	('AT', -7200),
	('ADT',-10800),
	('NFT',-9000),
	('NST',-9000),
	('AST',-14400),
	('EDT',-14400),
	('ZP4',-14400),
	('CDT',-18000),
	('EST',-18000),
	('ZP5',-18000),
	('CST',-21600),
	('MDT',-21600),
	('ZP6',-21600),
	('MST',-25200),
	('PDT',-25200),
	('PST',-28800),
	('YDT',-28800),
	('HDT',-32400),
	('YST',-32400),
	('AKST',-32400),
	
	('AHST',-36000),
	('HST',-36000),
	('CAT',-36000),
	('NT',-39600),
	('IDLW',-43200),
]
timezone_data = timezone_data + civilian_data
### add military timezones
##A-I then K-Z are used...
## z = 0
## a - i, k-m -> + values up to 12
## n-y - values up to -12
## what a totally messed up system!
## I've checked with a number of sites, they all seem to think
## it works this way... darned if I can figure out why they don't
## make N -12, o -11 etceteras so that z would come in order and you'd
## have a simple progression around the globe... sigh.
zulu_data = [
	('A', 3600), ('B', 7200), ('C', 10800), ('D', 14400), ('E', 18000),
	('F', 21600), ('G', 25200), ('H', 28800), ('I', 32400), ('K', 36000),
	('L', 39600), ('M', 43200),
	('N', -3600), ('O', -7200), ('P', -10800), ('Q', -14400), ('R', -18000),
	('S', -21600), ('T', -25200), ('U', -28800), ('V', -32400), ('W', -36000),
	('X', -39600), ('Y', -43200),
	('Z', 0),
]	
# now add these, plus the expanded versions to the dict above...
# note that we only allow capitalised versions of the military
# zones!
tztemp = []
for key, value in zulu_data:
	for item in phonetics._letters:
		if item[0] == key:
			tztemp.append( (item, value) )
# order is important here, want longer first
zulu_data = tztemp + zulu_data
del tztemp
# and call that done for now, folks...
timezone_data = timezone_data + zulu_data
# the rules are really big, but oh well...
def _build( data ):
	"""Build the name:time map and match rule for each dataset"""
	data = data[:]
	data.sort() # get shortest and least values first forcefully...
	# then reverse that, to get longest first...
	data.reverse()
	names = []
	mapping = {}
	for key,value in data:
		names.append( objectgenerator.Literal(value=key))
		mapping[key] = value
	rule = objectgenerator.FirstOfGroup(
		children = names
	)
	return mapping, rule
zulu_mapping, zulu_rule          = _build( zulu_data )
civilian_mapping, civilian_rule  = _build( civilian_data )
timezone_mapping, timezone_rule  = _build( timezone_data )

c[ "military_timezone_name" ] = zulu_rule
c[ "civilian_timezone_name" ] = civilian_rule
c[ "timezone_name" ] = timezone_rule

common.share(c)

import time
if time.daylight:
	LOCAL_ZONE = time.altzone
else:
	LOCAL_ZONE = time.timezone
# account for time module's different counting procedure...
LOCAL_ZONE = -LOCAL_ZONE

class TimeZoneNameInterpreter:
	"""Intepret a timezone specified as a military or civilian timezone name

	Return value is an offset from UTC given in seconds.
	If a null-match is passed uses the passed defaultZone.
	Returns values in seconds difference from UTC (negative
	West) divided by the passed "seconds" argument.
	"""
	def __init__( self, defaultZone=LOCAL_ZONE, seconds=1.0):
		"""
		defaultZone -- ofset in seconds to be returned if there
			is no value specified (null-match)
		seconds -- divisor applied to the value before returning,
			if you want hours, use 3600.0, if you want minutes,
			use 60.0, if you want days (why?), use 86400.0
		"""
		self.defaultZone = defaultZone
		self.seconds = seconds
	def __call__( self, (tag, left, right, children), buffer ):
		value = buffer[ left: right ]
		if value:
			try:
				return timezone_mapping[ value ]/self.seconds
			except KeyError:
				raise ValueError( "Unrecognised (but parsed!) TimeZone Name %s found at character position %s"%(value, left))
		else:
			return self.defaultZone/self.seconds