2013-06-03 22:57:55 +03:00
|
|
|
import random
|
|
|
|
import sys
|
|
|
|
|
|
|
|
class Section:
|
|
|
|
def __init__(self, name, text):
|
|
|
|
self.name = name
|
|
|
|
self.text = text
|
|
|
|
|
|
|
|
def __repr__(self):
|
|
|
|
return "Section(%s, %s)" % (repr(self.name), repr(self.text))
|
|
|
|
|
|
|
|
def format(self, references):
|
|
|
|
return self.text % references
|
|
|
|
|
|
|
|
class ShuffledSections:
|
|
|
|
def __init__(self, as_list, from_nr, to_nr, from_name):
|
|
|
|
self.as_list = as_list
|
|
|
|
self.from_nr = from_nr
|
|
|
|
self.to_nr = to_nr
|
|
|
|
self.from_name = from_name
|
|
|
|
self.name_to_nr = {}
|
|
|
|
for n in from_name:
|
|
|
|
self.name_to_nr[n] = to_nr[from_name[n]]
|
|
|
|
|
|
|
|
class Book:
|
|
|
|
def __init__(self):
|
|
|
|
self.sections = []
|
2013-06-04 00:46:11 +03:00
|
|
|
self.from_name = {}
|
2013-06-03 22:57:55 +03:00
|
|
|
self.nr_sections = {}
|
|
|
|
self.max = 0
|
|
|
|
|
2013-06-04 00:46:11 +03:00
|
|
|
def add(self, section):
|
2013-06-04 23:32:51 +03:00
|
|
|
if section.name in self.from_name:
|
|
|
|
raise Exception('Duplicate section names (%s) not allowed.' %
|
|
|
|
section.name)
|
2013-06-03 22:57:55 +03:00
|
|
|
self.sections.append(section)
|
2013-06-04 00:46:11 +03:00
|
|
|
self.from_name[section.name] = section
|
2013-06-03 22:57:55 +03:00
|
|
|
if len(self.sections) > self.max:
|
|
|
|
self.max = len(self.sections)
|
2013-06-04 00:46:11 +03:00
|
|
|
|
|
|
|
def force_section_nr(self, name, nr):
|
|
|
|
self.nr_sections[nr] = name
|
|
|
|
if nr > self.max:
|
|
|
|
self.max = nr
|
2013-06-03 22:57:55 +03:00
|
|
|
|
|
|
|
def shuffle(self):
|
|
|
|
as_list = [None]
|
|
|
|
from_nr = {}
|
|
|
|
to_nr = {}
|
|
|
|
shuffled = self.sections[:]
|
|
|
|
for p in self.nr_sections.values():
|
2013-06-04 00:46:11 +03:00
|
|
|
shuffled.remove(self.from_name[p])
|
2013-06-03 22:57:55 +03:00
|
|
|
random.shuffle(shuffled)
|
|
|
|
for nr in range(1, self.max + 1):
|
|
|
|
if self.nr_sections.has_key(nr):
|
2013-06-04 00:46:11 +03:00
|
|
|
section = self.from_name[self.nr_sections[nr]]
|
2013-06-03 22:57:55 +03:00
|
|
|
elif len(shuffled):
|
|
|
|
section = shuffled.pop()
|
|
|
|
else:
|
|
|
|
section = None
|
|
|
|
as_list.append(section)
|
|
|
|
from_nr[nr] = section
|
|
|
|
if section:
|
|
|
|
to_nr[section] = nr
|
2013-06-04 00:46:11 +03:00
|
|
|
return ShuffledSections(as_list, from_nr, to_nr, self.from_name.copy())
|