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
|
""" Captcha.Words
Utilities for managing word lists and finding random words
"""
#
# PyCAPTCHA Package
# Copyright (C) 2004 Micah Dowty <micah@navi.cx>
#
import random, os
import File
class WordList(object):
"""A class representing a word list read from disk lazily.
Blank lines and comment lines starting with '#' are ignored.
Any number of words per line may be used. The list can
optionally ingore words not within a given length range.
"""
def __init__(self, fileName, minLength=None, maxLength=None):
self.words = None
self.fileName = fileName
self.minLength = minLength
self.maxLength = maxLength
def read(self):
"""Read words from disk"""
f = open(os.path.join(File.dataDir, "words", self.fileName))
self.words = []
for line in f.xreadlines():
line = line.strip()
if not line:
continue
if line[0] == '#':
continue
for word in line.split():
if self.minLength is not None and len(word) < self.minLength:
continue
if self.maxLength is not None and len(word) > self.maxLength:
continue
self.words.append(word)
def pick(self):
"""Pick a random word from the list, reading it in if necessary"""
if self.words is None:
self.read()
return random.choice(self.words)
# Define several shared word lists that are read from disk on demand
basic_english = WordList("basic-english")
basic_english_restricted = WordList("basic-english", minLength=5, maxLength=8)
defaultWordList = basic_english_restricted
### The End ###
|