]> git.phdru.name Git - phdru.name/phdru.name.git/blob - reindex_blog.py
Scripts to (re)build phd.pp.ru site.
[phdru.name/phdru.name.git] / reindex_blog.py
1 #! /usr/local/bin/python -O
2 # -*- coding: koi8-r -*-
3
4 import sys, os
5 from glob import glob
6
7 try:
8    import cPickle as pickle
9 except ImportError:
10    import pickle
11
12 from Cheetah.Template import Template
13
14 blog_filename = sys.argv[1]
15 try:
16    blog_file = open(blog_filename, "rb")
17 except IOError:
18    blog = {}
19 else:
20    blog = pickle.load(blog_file)
21    blog_file.close()
22
23 years = {}
24 months = sys.argv[2:]
25 isdir = os.path.isdir
26
27 if not months:
28    for year in os.listdir(os.curdir):
29       if isdir(year):
30          years[year] = {}
31          for month in os.listdir(year):
32             m = os.path.join(year, month)
33             if isdir(m):
34                months.append(m)
35
36 days = []
37 for month in months:
38    year, m = month.split(os.sep)
39    if month not in years:
40       years[year] = {}
41    years[year][m] = days_of_month = []
42    for day in os.listdir(month):
43          d = os.path.join(month, day)
44          if isdir(d):
45             days.append(d)
46             days_of_month.append(d)
47
48 for day in days:
49    for tmpl in glob(os.path.join(day, "*.tmpl")):
50       template = Template(file=tmpl)
51       title_parts = template.Title.split()
52       title = ' '.join(title_parts[6:])
53       lead = getattr(template, "Lead", None)
54
55       if title:
56          day_parts = day.split(os.sep)
57          blog[tuple(day_parts)] = (title, os.path.basename(tmpl), lead)
58
59 blog_file = open(blog_filename, "wb")
60 pickle.dump(blog, blog_file, pickle.HIGHEST_PROTOCOL)
61 blog_file.close()
62
63
64 import locale
65 locale.setlocale(locale.LC_ALL, '')
66 from calendar import _localized_day, _localized_month
67
68 locale.setlocale(locale.LC_TIME, 'C')
69 months_names_en = list(_localized_month('%B'))
70 months_abbrs_en = list(_localized_month('%b'))
71
72 locale.setlocale(locale.LC_TIME, '')
73 months_names_ru = [month.lower() for month in _localized_month('%B')]
74
75 months_names_ru0 = ['', "январь", "февраль", "март", "апрель", "май", "июнь",
76    "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь"
77 ]
78
79
80 def write_template(show_year, show_month, year, month, titles, cut=None, show_years=False):
81    index_tmpl = open(os.path.join(year, month, "index.tmpl"), 'w')
82    if show_year:
83       index_tmpl.write("""\
84 #extends phd_pp_ru
85 #implements respond
86 #attr $Title = "Oleg BroytMann's blog"
87 #attr $Description = "BroytMann Russian Blog Index Document"
88 #attr $Copyright = %(cyear)s
89 ##
90 #def body_html
91 <H1>Журнал</H1>
92 """ % {"cyear": year or 2005})
93
94    elif show_month:
95
96       index_tmpl.write("""\
97 #extends phd_pp_ru
98 #implements respond
99 #attr $Title = "Oleg BroytMann's blog: %(year)s"
100 #attr $Description = "BroytMann Russian Blog %(year)s Index Document"
101 #attr $Copyright = %(cyear)s
102 ##
103 #def body_html
104 <H1>Журнал: %(year)s</H1>
105 """ % {"year": year, "cyear": year or 2005})
106
107    else:
108
109       month = int(month)
110       index_tmpl.write("""\
111 #extends phd_pp_ru
112 #implements respond
113 #attr $Title = "Oleg BroytMann's blog: %(month_abbr_en)s %(year)s"
114 #attr $Description = "BroytMann Russian Blog %(month_name_en)s %(year)s Index Document"
115 #attr $Copyright = %(cyear)s
116 ##
117 #def body_html
118 <H1>Журнал: %(month_name_ru0)s %(year)s</H1>
119 """ % {
120       "year": year, "cyear": year or 2005,
121       "month_abbr_en": months_abbrs_en[month], "month_name_en": months_names_en[month],
122       "month_name_ru0": months_names_ru0[month],
123    })
124
125    save_titles = titles[:]
126    titles.reverse()
127    if cut:
128       titles = titles[:cut]
129
130    save_day = None
131    for key, tmpl, title, lead in titles:
132       year, month, day = key
133       href = []
134       if show_year:
135          href.append(year)
136       if show_month:
137          href.append(month)
138       href.append(day)
139       href.append(tmpl)
140       href = '/'.join(href)
141       if day[0] == '0': day = day[1:]
142       if save_day <> day:
143          if show_year:
144             index_tmpl.write('\n<h2>%s %s %s</h2>' % (day, months_names_ru[int(month)], year))
145          else:
146             index_tmpl.write('\n<h2>%s %s</h2>' % (day, months_names_ru[int(month)]))
147          save_day = day
148       if lead:
149          lead = lead + ' '
150       else:
151          lead = ''
152       index_tmpl.write('''
153 <p class="head">
154    %s<a href="%s">%s</a>.
155 </p>
156 ''' % (lead, href, title))
157
158    if show_years:
159       years = {}
160       for key, tmpl, title, lead in save_titles:
161          year, month, day = key
162          years[year] = True
163       first_year = True
164       index_tmpl.write('''
165 <hr>
166
167 <p class="years">
168 ''')
169       for year in sorted(years.keys()):
170          if first_year:
171             first_year = False
172          else:
173             index_tmpl.write(' - ')
174          index_tmpl.write('<a href="%s/">%s</a>' % (year, year))
175       index_tmpl.write('''
176 </p>
177 ''')
178
179    index_tmpl.write("""\
180 #end def
181 $phd_pp_ru.respond(self)
182 """)
183    index_tmpl.close()
184
185
186 def translate(tmpl):
187    if tmpl == "index.tmpl": tmpl = ''
188    if tmpl.endswith(".tmpl"): tmpl = tmpl[:-len("tmpl")] + "html"
189    return tmpl
190
191
192 all_titles = []
193 for key in sorted(blog.keys()):
194    title, tmpl, lead = blog[key]
195    all_titles.append((key, translate(tmpl), title, lead))
196
197 for year in sorted(years.keys()):
198    year_titles = []
199    months = years[year]
200    for month in sorted(months.keys()):
201       month_titles = []
202       for day in sorted(months[month]):
203          day_parts = day.split(os.sep)
204          key = tuple(day_parts)
205          if key in blog:
206             title, tmpl, lead = blog[key]
207             tmpl = translate(tmpl)
208             year_titles.append((key, tmpl, title, lead))
209             month_titles.append((key, tmpl, title, lead))
210       write_template(False, False, year, month, month_titles)
211    write_template(False, True, year, '', year_titles)
212 write_template(True, True, '', '', all_titles, 5, True)