fix
[static.git] / parse.py
1 #!/usr/bin/env python
2 from __future__ import unicode_literals
3 import json
4 import os
5 import re
6 from urllib import unquote
7 from urllib2 import urlopen
8 from lxml.html import etree
9 from fnpdjango.utils.text.slughifi import slughifi
10
11
12 fin = urlopen('http://ofop.redakcja.wolnelektury.pl/documents/book/kurs-ip-dla-uniwersytetow/html')
13 parser = etree.HTMLParser()
14 tree = etree.parse(fin, parser)
15
16 root = tree.xpath("//div[@id='book-text']")[0]
17 rozdzial = None
18 podrozdzial = None
19 podrozdzial_n = 0
20
21 def remove_tag(tag):
22     parent = tag.getparent()
23     if tag.tail:
24         prev = tag.getprevious()
25         if prev is not None:
26             prev.tail = (prev.tail or '') + tag.tail
27         else:
28             parent.text = (parent.text or '') + tag.tail
29     parent.remove(tag)
30
31
32 def spojniki(text):
33     return re.sub(r'(\s|^)(\w)\s+', r'\1\2\u00a0', text)
34
35 for tag in root.iter():
36     if tag.text:
37         tag.text = spojniki(tag.text)
38     if tag.tail:
39         tag.tail = spojniki(tag.tail)
40
41 for ilustr in root.findall('.//img'):
42     if not ilustr.attrib['src'].endswith(('.png', '.jpg')):
43         ilustr.attrib['src'] = ilustr.attrib['src'].rsplit('.', 1)[0] + '.jpg'
44     ilustr.attrib['src'] = "{{ media_url('/ilustr/" + unquote(ilustr.attrib['src']) + "') }}"
45 for target in root.findall(".//a[@class='target']"):
46     remove_tag(target)
47 for target in root.findall(".//a[@class='anchor']"):
48     remove_tag(target)
49 for target in root.findall(".//a"):
50     if target.attrib.get('class', '').startswith('sec'):
51         remove_tag(target)
52
53 for target in root.findall(".//punkt"):
54     if target.getparent().tag not in ('ol', 'ul'):
55         print etree.tostring(target)
56 for target in root.findall(".//ol/*"):
57     if target.tag != 'li':
58         print etree.tostring(target)
59 for target in root.findall(".//ul/*"):
60     if target.tag != 'li':
61         print etree.tostring(target)
62 for target in root.findall(".//table/*"):
63     if target.tag != 'tr':
64         print etree.tostring(target)
65 for target in root.findall(".//tr"):
66     if target.getparent().tag != 'table':
67         print etree.tostring(target)
68 for target in root.findall(".//tr/*"):
69     if target.tag != 'td':
70         print etree.tostring(target)
71 for target in root.findall(".//td"):
72     if target.getparent().tag != 'tr':
73         print etree.tostring(target)
74
75 for tag in root:
76     if tag.tag == 'h2':
77         print etree.tostring(tag)
78         rozdzial = slughifi(tag.text)
79         for f in os.listdir('content/import/%s' % rozdzial):
80             if f.endswith('.html'):
81                     os.unlink('content/import/%s/%s' % (rozdzial, f))
82         podrozdzial = None
83         podrozdzial_n = 0
84     elif tag.tag == 'h3':
85         tytul = tag.text
86         tytul = re.sub('^[0-9\. ]+', '', tytul).strip()
87         slug = slughifi(tytul.split(':')[0])
88         if podrozdzial:
89             podrozdzial.close()
90         podrozdzial_n += 1
91         podrozdzial = open('content/import/%s/%s.html' % (rozdzial, slug), 'w')
92         podrozdzial.write((u'''---
93 title: "%s"
94 order: %d
95 ---
96
97 ''' % (tytul, podrozdzial_n)).encode('utf-8'))
98     elif podrozdzial:
99         if tag.tag == 'h4':
100             tag.text = re.sub('^[0-9\. ]+', '', tag.text).strip()
101             tag.tag = 'h2'
102             slug = slughifi(tag.text)
103             etree.SubElement(tag, "a", {'class': 'permalink',
104                 'id': slug, 'href': '#' + slug,
105                 'title': 'Link do tego miejsca'})
106         elif tag.tag == 'h5':
107             tag.text = re.sub('^[0-9\. ]+', '', tag.text).strip()
108             tag.tag = 'h3'
109         podrozdzial.write(etree.tostring(tag, encoding='utf-8'))
110
111 if podrozdzial:
112     podrozdzial.close()