+ exercise_handlers = {
+ 'wybor': Wybor,
+ 'uporzadkuj': Uporzadkuj,
+ 'luki': Luki,
+ 'zastap': Zastap,
+ 'przyporzadkuj': Przyporzadkuj,
+ 'prawdafalsz': PrawdaFalsz
+ }
+
+ typ = element.attrib['typ']
+ self.exercise_counter += 1
+ self.options = {'exercise_counter': self.exercise_counter}
+ handler = exercise_handlers[typ](self.options)
+ return handler.generate(element)
+
+ # Lists
+ 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':
+ return '<p>W przygotowaniu.</p>'
+ else:
+ return None
+ if ltype == 'slowniczek':
+ surl = element.attrib.get('src', None)
+ if surl is None:
+ # print '** missing src on <slowniczek>, setting default'
+ 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}
+ 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]
+
+ classes = attrs.get('class', '')
+ if classes:
+ del attrs['class']
+
+ attrs_s = ' '.join(['%s="%s"' % kv for kv in attrs.items()])
+ if attrs_s:
+ attrs_s = ' ' + attrs_s
+
+ return '<%s class="lista %s %s"%s>' % (listtag, ltype, classes, attrs_s), '</%s>' % listtag
+
+ def handle_punkt(self, element):
+ if self.options['slowniczek']:
+ return '<dl>', '</dl>'
+ else:
+ return '<li>', '</li>'
+
+ def handle_definiendum(self, element):
+ nxt = element.getnext()
+ definiens_s = ''
+
+ if not element.text:
+ print "!! Empty <definiendum/>"
+ return None
+
+ # 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']
+ 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':
+ subgen = EduModule(self.options)
+ definiens_s = subgen.generate(definiens)
+ else:
+ print ("!! Missing definiendum in source: '%s'" % element.text).encode('utf-8')
+
+ return u"<dt id='%s'>" % self.naglowek_to_anchor(element), u"</dt>" + definiens_s
+
+ def handle_definiens(self, element):
+ return u"<dd>", u"</dd>"
+
+ def handle_podpis(self, element):
+ return u"""<div class="caption">""", u"</div>"
+
+ def handle_tabela(self, element):
+ has_frames = int(element.attrib.get("ramki", "0"))
+ frames_c = "framed" if has_frames else ""
+ return u"""<table class="%s">""" % frames_c, u"</table>"
+
+ def handle_wiersz(self, element):
+ return u"<tr>", u"</tr>"
+
+ def handle_kol(self, element):
+ return u"<td>", u"</td>"
+
+ def handle_rdf__RDF(self, _):
+ # ustal w opcjach rzeczy :D
+ return
+
+ def handle_link(self, element):
+ if 'url' in element.attrib:
+ return tag('a', href=element.attrib['url'])(self, element)
+ elif 'material' in element.attrib:
+ material_err = u' [BRAKUJĄCY MATERIAŁ]'
+ slug = element.attrib['material']
+
+ def make_url(f):
+ return self.options['urlmapper'].url_for_material(slug, f)
+
+ formats = self.options['urlmapper'].materials(slug)
+
+ try:
+ def_href = make_url(formats[0][0])
+ def_err = u""
+ except (IndexError, self.options['urlmapper'].MaterialNotFound):
+ def_err = material_err
+ def_href = u""
+ fmt_links = []
+ for f in formats[1:]:
+ try:
+ fmt_links.append(u'<a href="%s">%s</a>' % (make_url(f[0]), f[0].upper()))
+ except self.options['urlmapper'].MaterialNotFound:
+ fmt_links.append(u'<a>%s%s</a>' % (f[0].upper(), material_err))
+ more_links = u' (%s)' % u', '.join(fmt_links) if fmt_links else u''
+
+ return u"<a href='%s'>" % def_href, u'%s</a>%s' % (def_err, more_links)
+
+ def handle_obraz(self, element):
+ name = element.attrib.get('nazwa', '').strip()
+ if not name:
+ print '!! <obraz> missing "nazwa"'
+ return
+ alt = element.attrib.get('alt', '')
+ if not alt:
+ print '** <obraz> missing "alt"'
+ slug, ext = name.rsplit('.', 1)
+ 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)}))
+ return etree.tostring(e, encoding=unicode), u""
+
+ def handle_video(self, element):
+ url = element.attrib.get('url')
+ if not url:
+ print '!! <video> missing url'
+ return
+ m = re.match(r'(?:https?://)?(?:www.)?youtube.com/watch\?(?:.*&)?v=([^&]+)(?:$|&)', url)
+ if not m:
+ print '!! unknown <video> url scheme:', url
+ return
+ return """<iframe width="630" height="384" src="http://www.youtube.com/embed/%s"
+ frameborder="0" allowfullscreen></iframe>""" % m.group(1), ""
+
+
+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):
+ return "", self.get_instruction()
+
+ def handle_rozw_kom(self, element):
+ return u"""<div style="display:none" class="comment">""", u"""</div>"""
+
+ def extra_attributes(self):
+ return {}
+
+ def handle_cwiczenie(self, element):
+ self.options = {'exercise': element.attrib['typ']}