update intro
[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 slugify import slugify
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 = slugify(tag.text)
79         dir_rozdzial = 'content/import/%s' % rozdzial
80         if os.path.exists(dir_rozdzial):
81             for f in os.listdir(dir_rozdzial):
82                 if f.endswith('.html'):
83                     os.unlink('%s/%s' % (dir_rozdzial, f))
84         else:
85             os.makedirs(dir_rozdzial)
86         podrozdzial = None
87         podrozdzial_n = 0
88     elif tag.tag == 'h3':
89         tytul = tag.text
90         tytul = re.sub('^[0-9\. ]+', '', tytul).strip()
91         slug = slugify(tytul.split(':')[0])
92         if podrozdzial:
93             podrozdzial.close()
94         podrozdzial_n += 1
95         podrozdzial = open('%s/%s.html' % (dir_rozdzial, slug), 'w')
96         podrozdzial.write((u'''---
97 title: "%s"
98 section: %s
99 listable: true
100 extends: text.j2
101 default_block: main
102 order: %d
103 ---
104
105 ''' % (tytul, rozdzial, podrozdzial_n)).encode('utf-8'))
106     elif podrozdzial:
107         if tag.tag == 'h4':
108             tag.text = re.sub('^[0-9\. ]+', '', tag.text).strip()
109             tag.tag = 'h2'
110             slug = slugify(tag.text)
111             etree.SubElement(tag, "a", {'class': 'permalink',
112                 'id': slug, 'href': '#' + slug,
113                 'title': 'Link do tego miejsca'})
114         elif tag.tag == 'h5':
115             tag.text = re.sub('^[0-9\. ]+', '', tag.text).strip()
116             tag.tag = 'h3'
117         podrozdzial.write(etree.tostring(tag, encoding='utf-8'))
118
119 if podrozdzial:
120     podrozdzial.close()