# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
#
from lxml import etree
-from librarian import IOFile, RDFNS, DCNS, Format
+from librarian import IOFile, Format
from xmlutils import Xmill, tag, tagged, ifoption, tag_open_close
from librarian import functions
import re
IMAGE_THUMB_WIDTH = 300
+
class EduModule(Xmill):
def __init__(self, options=None):
super(EduModule, self).__init__(options)
opis = ''
n = element.xpath('wskazowki')
- if n: wskazowki = submill.generate(n[0])
-
- else: wskazowki = ''
+ if n:
+ wskazowki = submill.generate(n[0])
+ else:
+ wskazowki = ''
n = element.xpath('pomoce')
- if n: pomoce = submill.generate(n[0])
- else: pomoce = ''
+ if n:
+ pomoce = submill.generate(n[0])
+ else:
+ pomoce = ''
forma = ''.join(element.xpath('forma/text()'))
get_forma_url = self.options['urlmapper'].get_forma_url
counter = self.activity_counter
- if element.getnext().tag == 'aktywnosc' or self.activity_last.getnext() == element:
- counter_html = """<span class="act_counter">%(counter)d.</span>""" % locals()
+ if element.getnext().tag == 'aktywnosc' or (self.activity_last and self.activity_last.getnext() == element):
+ counter_html = """<span class="act_counter">%(counter)d.</span>""" % {'counter': counter}
else:
counter_html = ''
self.activity_last = element
- return u"""
+ return (
+ u"""
<div class="activity">
- <div class="text">
- %(counter_html)s
- %(opis)s""" % locals(), \
-u"""%(wskazowki)s
- </div>
- <aside class="info">
- %(czas)s
- %(forma)s
- %(pomoce)s
- </aside>
- <div class="clearboth"></div>
+ <div class="text">
+ %(counter_html)s
+ %(opis)s""" % {'counter_html': counter_html, 'opis': opis},
+ u"""%(wskazowki)s
+ </div>
+ <aside class="info">
+ %(czas)s
+ %(forma)s
+ %(pomoce)s
+ </aside>
+ <div class="clearboth"></div>
</div>
-""" % locals()
+""" % {'wskazowki': wskazowki, 'czas': czas, 'forma': forma, 'pomoce': pomoce})
handle_opis = ifoption(sub_gen=True)(tag('div', 'description'))
handle_wskazowki = ifoption(sub_gen=True)(tag('div', ('hints', 'teacher')))
return handler.generate(element)
# Lists
- def handle_lista(self, element, attrs={}):
+ def handle_lista(self, element, attrs=None):
+ if attrs is None:
+ attrs = {}
ltype = element.attrib.get('typ', 'punkt')
if not element.findall("punkt"):
if ltype == 'czytelnia':
surl = 'http://edukacjamedialna.edu.pl/lekcje/slowniczek/'
sxml = etree.fromstring(self.options['provider'].by_uri(surl).get_string())
- self.options = {'slowniczek': True, 'slowniczek_xml': sxml }
+ self.options = {'slowniczek': True, 'slowniczek_xml': sxml}
pre, post = '<div class="slowniczek">', '</div>'
if not self.options['wldoc'].book_info.url.slug.startswith('slowniczek'):
post += u'<p class="see-more"><a href="%s">Zobacz cały słowniczek.</a></p>' % surl
return pre, post
- listtag = {'num': 'ol',
- 'punkt': 'ul',
- 'alfa': 'ul',
- 'czytelnia': 'ul'}[ltype]
+ listtag = {
+ 'num': 'ol',
+ 'punkt': 'ul',
+ 'alfa': 'ul',
+ 'czytelnia': 'ul'}[ltype]
classes = attrs.get('class', '')
- if classes: del attrs['class']
+ if classes:
+ del attrs['class']
attrs_s = ' '.join(['%s="%s"' % kv for kv in attrs.items()])
- if attrs_s: attrs_s = ' ' + attrs_s
+ if attrs_s:
+ attrs_s = ' ' + attrs_s
return '<%s class="lista %s %s"%s>' % (listtag, ltype, classes, attrs_s), '</%s>' % listtag
# let's pull definiens from another document
if self.options['slowniczek_xml'] is not None and (nxt is None or nxt.tag != 'definiens'):
sxml = self.options['slowniczek_xml']
- defloc = sxml.xpath("//definiendum[text()='%s']" % element.text)
+ if "'" in (element.text or ''):
+ defloc = sxml.xpath("//definiendum[text()=\"%s\"]" % (element.text or '').strip())
+ else:
+ defloc = sxml.xpath("//definiendum[text()='%s']" % (element.text or '').strip())
if defloc:
definiens = defloc[0].getnext()
if definiens.tag == 'definiens':
def handle_tabela(self, element):
has_frames = int(element.attrib.get("ramki", "0"))
- if has_frames: frames_c = "framed"
- else: frames_c = ""
+ frames_c = "framed" if has_frames else ""
return u"""<table class="%s">""" % frames_c, u"</table>"
def handle_wiersz(self, element):
elif 'material' in element.attrib:
material_err = u' [BRAKUJĄCY MATERIAŁ]'
slug = element.attrib['material']
- make_url = lambda f: self.options['urlmapper'] \
- .url_for_material(slug, f)
- if 'format' in element.attrib:
- formats = re.split(r"[, ]+",
- element.attrib['format'])
- else:
- formats = [None]
+ def make_url(f):
+ return self.options['urlmapper'].url_for_material(slug, f)
formats = self.options['urlmapper'].materials(slug)
url = self.options['urlmapper'].url_for_image(slug, ext)
thumb_url = self.options['urlmapper'].url_for_image(slug, ext, IMAGE_THUMB_WIDTH)
e = etree.Element("a", attrib={"href": url, "class": "image"})
- e.append(etree.Element("img", attrib={"src": thumb_url, "alt": alt,
- "width": str(IMAGE_THUMB_WIDTH)}))
+ e.append(etree.Element("img", attrib={
+ "src": thumb_url,
+ "alt": alt,
+ "width": str(IMAGE_THUMB_WIDTH)}))
return etree.tostring(e, encoding=unicode), u""
def handle_video(self, element):
class Exercise(EduModule):
INSTRUCTION = ""
+
def __init__(self, *args, **kw):
self.question_counter = 0
super(Exercise, self).__init__(*args, **kw)
self.instruction_printed = False
+ self.piece_counter = None
@tagged('div', 'description')
def handle_opis(self, element):
# Add a single <pytanie> tag if it's not there
if not element.xpath(".//pytanie"):
qpre, qpost = self.handle_pytanie(element)
- pre = pre + qpre
+ pre += qpre
post = qpost + post
return pre, post
self.question_counter += 1
self.piece_counter = 0
solution = element.attrib.get('rozw', None)
- if solution: solution_s = ' data-solution="%s"' % solution
- else: solution_s = ''
+ solution_s = ' data-solution="%s"' % solution if solution else ''
handles = element.attrib.get('uchwyty', None)
if handles:
self.options = {'handles': handles}
minimum = element.attrib.get('min', None)
- if minimum: minimum_s = ' data-minimum="%d"' % int(minimum)
- else: minimum_s = ''
+ minimum_s = ' data-minimum="%d"' % int(minimum) if minimum else ''
return '<div class="question%s" data-no="%d" %s>' %\
(add_class, self.question_counter, solution_s + minimum_s), \
return ""
-
class Wybor(Exercise):
def handle_cwiczenie(self, element):
pre, post = super(Wybor, self).handle_cwiczenie(element)
break
choices = p.xpath(".//*[@nazwa]")
uniq = set()
- for n in choices: uniq.add(n.attrib.get('nazwa', ''))
+ for n in choices:
+ uniq.add(n.attrib.get('nazwa', ''))
if len(choices) != len(uniq):
is_single_choice = False
break
class Luki(Exercise):
INSTRUCTION = u"Przeciągnij odpowiedzi i upuść w wybranym polu."
+
def find_pieces(self, question):
return question.xpath(".//luka")
if self.options['subject']:
self.piece_counter += 1
if self.options['handles']:
- return '<li><span data-solution="%s" data-no="%s" class="question-piece draggable handle add-li">%s</span>' % (element.attrib.get('rozw', ''), self.piece_counter, self.piece_counter), '</li>'
+ return (
+ '<li><span data-solution="%s" data-no="%s" '
+ 'class="question-piece draggable handle add-li">%s</span>' % (
+ element.attrib.get('rozw', ''),
+ self.piece_counter,
+ self.piece_counter),
+ '</li>')
else:
extra_class = ""
if self.options['short']:
extra_class += ' short'
- return '<li data-solution="%s" data-no="%s" class="question-piece draggable%s">' % (element.attrib.get('rozw', ''), self.piece_counter, extra_class), '</li>'
+ return '<li data-solution="%s" data-no="%s" class="question-piece draggable%s">' % (
+ element.attrib.get('rozw', ''),
+ self.piece_counter, extra_class), '</li>'
elif self.options['predicate']:
if self.options['min']:
placeholders = u'<li class="placeholder"></li>' * self.options['min']
else:
placeholders = u'<li class="placeholder multiple"></li>'
- return '<li data-predicate="%s">' % element.attrib.get('nazwa', ''), '<ul class="subjects">' + placeholders + '</ul></li>'
+ return (
+ '<li data-predicate="%s">' % element.attrib.get('nazwa', ''),
+ '<ul class="subjects">' + placeholders + '</ul></li>')
else:
return super(Przyporzadkuj, self).handle_punkt(element)
def __init__(self, wldoc, **kwargs):
super(EduModuleFormat, self).__init__(wldoc, **kwargs)
+ self.materials_by_slug = None
def build(self):
# Sort materials by slug.
def materials(self, slug):
"""Returns a list of pairs: (ext, iofile)."""
- order = dict(reversed(k) for k in enumerate(self.PRIMARY_MATERIAL_FORMATS))
+ order = {pmf: i for (i, pmf) in enumerate(self.PRIMARY_MATERIAL_FORMATS)}
mats = self.materials_by_slug.get(slug, {}).items()
if not mats:
- print "!! Material missing: '%s'" % slug
+ print ("!! Material missing: '%s'" % slug).encode('utf-8')
return sorted(mats, key=lambda (x, y): order.get(x, x))
def url_for_material(self, slug, fmt):
return "%s.%s" % (slug, fmt)
+ # WTF: tutaj był błąd, ale nikomu to nie przeszkadzało?
def url_for_image(self, slug, fmt, width=None):
- return self.url_for_material(self, slug, fmt)
+ return self.url_for_material(slug, fmt)
def text_to_anchor(self, text):
return re.sub(r" +", " ", text)