add command to convert wl2 to wl1
[redakcja.git] / apps / catalogue / xml_tools.py
index 75cb2d8..7be05fd 100644 (file)
@@ -135,3 +135,68 @@ def split_xml(text):
         ch[1] = add_trim_end(ch[1])
 
     return chunks
+
+
+def wl2_to_wl1(wl2_xml, slug):
+    from lxml import etree
+    import re
+    from StringIO import StringIO
+    from urllib import unquote
+    import os.path
+    from django.conf import settings
+    from fnpdjango.utils.text.slughifi import slughifi
+    from librarian import ParseError, DCNS
+
+    def _register_function(f):
+        """ Register extension function with lxml """
+        ns = etree.FunctionNamespace('http://wolnelektury.pl/functions')
+        ns[f.__name__] = f
+        return f
+
+    @_register_function
+    def slugify(context, text):
+        """Remove unneeded whitespace from beginning and end"""
+        if isinstance(text, list):
+            text = ''.join(text)
+        return slughifi(text)
+
+    @_register_function
+    def rmext(context, text):
+        if isinstance(text, list):
+            text = ''.join(text)
+        text = unquote(text)
+        if '.' in text:
+            name, ext = text.rsplit('.', 1)
+            if ext.lower() in ('doc', 'docx', 'odt', 'pdf', 'jpg', 'jpeg'):
+                text = name
+        return text
+
+    t = etree.parse(os.path.join(settings.PROJECT_ROOT, 'xslt/wl2to1.xslt'))
+    ft = wl2_xml.replace(' ', ' ')
+    f2 = StringIO(ft)
+    i1 = etree.parse(f2)
+
+    for sect in i1.findall('//section'):
+        if sect[0].text and sect[0].text.strip() == u'Przebieg zajęć':
+            # Prostujemy.
+            first = sect.find('section')
+            subs = first.findall('.//section')
+            for sub in subs:
+                sect.append(sub)
+            break
+    else:
+        dc_type = i1.findall('//dc:type', namespaces={'dc': DCNS.uri})
+        if dc_type and dc_type[0] in ('course', 'synthetic'):
+            raise ParseError('Brak przebiegu')
+
+    i1.getroot().attrib['redslug'] = slug
+    i1.getroot().attrib['wlslug'] = slug  # THIS!
+    w1t = i1.xslt(t)
+    for h in w1t.findall('//aktywnosc/opis'):
+        if len(h) == 0:
+            raise ParseError('Pusty element aktywnosc/opis')
+        # FIXME assumption that every lesson has at most 9 parts
+        if not h[0].text or not re.match(r'\d\.\s', h[0].text):
+            raise ParseError('Niepoprawny nagłówek (aktywnosc/opis): %s' % repr(h[0].text))
+        h[0].text = h[0].text[3:]
+    return etree.tostring(w1t, encoding='utf-8')
\ No newline at end of file