c0b3285c4a
I need to redesign TextGenerator a bit, I kinda hacked it to do two things and it's not the most elegant.
51 lines
No EOL
1.7 KiB
Python
51 lines
No EOL
1.7 KiB
Python
import re
|
|
import random
|
|
|
|
TEMPLATE_RE = re.compile(r"\{(.+?)\}")
|
|
|
|
|
|
class TextGenerator(object):
|
|
def __init__(self, templates, parts, default_templates=None, variables=None):
|
|
self.templates = templates
|
|
self.default_templates = default_templates
|
|
self.parts = parts
|
|
self.variables = variables
|
|
|
|
def generate_string(self, template=None):
|
|
"""
|
|
Generates one string using the specified templates.
|
|
If no templates are specified, use a random template from the default_templates list.
|
|
"""
|
|
# this is bad
|
|
if self.default_templates:
|
|
text = self.templates[template or random.choice(self.default_templates)]
|
|
else:
|
|
text = random.choice(self.templates)
|
|
|
|
# replace static variables in the template with provided values
|
|
if self.variables:
|
|
for key, value in self.variables.items():
|
|
text = text.replace("{%s}" % key, value)
|
|
|
|
# get a list of all text parts we need
|
|
required_parts = TEMPLATE_RE.findall(text)
|
|
|
|
for required_part in required_parts:
|
|
ppart = self.parts[required_part]
|
|
# check if the part is a single string or a list
|
|
if not isinstance(ppart, basestring):
|
|
part = random.choice(self.parts[required_part])
|
|
else:
|
|
part = self.parts[required_part]
|
|
text = text.replace("{%s}" % required_part, part)
|
|
|
|
return text
|
|
|
|
def generate_strings(self, amount, template=None):
|
|
strings = []
|
|
for i in xrange(amount):
|
|
strings.append(self.generate_string())
|
|
return strings
|
|
|
|
def get_template(self, template):
|
|
return self.templates[template] |