]> git.phdru.name Git - phdru.name/phdru.name.git/blobdiff - reindex_blog.py
If there is only one entry for the day - redirect from day index to the entry.
[phdru.name/phdru.name.git] / reindex_blog.py
index 716605bf2a7a529e55ab5a35050ffbfb038595fc..b21f4f6d245d269e9d130f616a119f0993ed92d0 100755 (executable)
@@ -7,8 +7,8 @@ __date__ = "$Date$"[7:-2]
 __author__ = "Oleg BroytMann <phd@phd.pp.ru>"
 __copyright__ = "Copyright (C) 2006 PhiloSoft Design"
 
+
 import sys, os
-from glob import glob
 
 try:
    import cPickle as pickle
@@ -17,55 +17,64 @@ except ImportError:
 
 from Cheetah.Template import Template
 
+
+# Load old blog
+
 blog_filename = sys.argv[1]
 try:
    blog_file = open(blog_filename, "rb")
 except IOError:
-   blog = {}
+   old_blog = {}
 else:
-   blog = pickle.load(blog_file)
+   old_blog = pickle.load(blog_file)
    blog_file.close()
 
+
+# blog is a dictionary mapping (year, month, day) => (filename, title, lead)
+blog = {}
 years = {}
-months = sys.argv[2:]
-isdir = os.path.isdir
-
-if not months:
-   for year in os.listdir(os.curdir):
-      if isdir(year):
-         years[year] = {}
-         for month in os.listdir(year):
-            m = os.path.join(year, month)
-            if isdir(m):
-               months.append(m)
-
-days = []
-for month in months:
-   year, m = month.split(os.sep)
-   if year not in years:
-      years[year] = {}
-   years[year][m] = days_of_month = []
-   for day in os.listdir(month):
-         d = os.path.join(month, day)
-         if isdir(d):
-            days.append(d)
-            days_of_month.append(d)
-
-for day in days:
-   for tmpl in glob(os.path.join(day, "*.tmpl")):
-      template = Template(file=tmpl)
+
+# Walk the directory recursively
+for dirpath, dirs, files in os.walk(os.curdir):
+   for file in files:
+      # Ignore index.tmpl and *.html files; supose all other files are *.tmpl
+      if file == "index.tmpl" or file.endswith(".html"):
+         continue
+      fullpath = os.path.join(dirpath, file)
+      template = Template(file=fullpath)
       title_parts = template.Title.split()
       title = ' '.join(title_parts[6:])
       lead = getattr(template, "Lead", None)
 
       if title:
-         day_parts = day.split(os.sep)
-         blog[tuple(day_parts)] = (title, os.path.basename(tmpl), lead)
+         key = year, month, day = tuple(dirpath.split(os.sep)[1:])
+         if key in blog:
+            days = blog[key]
+         else:
+            days = blog[key] = []
+         days.append((file, title, lead))
 
-blog_file = open(blog_filename, "wb")
-pickle.dump(blog, blog_file, pickle.HIGHEST_PROTOCOL)
-blog_file.close()
+         if year in years:
+            months = years[year]
+         else:
+            months = years[year] = {}
+
+         if month in months:
+            days = months[month]
+         else:
+            days = months[month] = []
 
+         if day not in days: days.append(day)
+
+
+# Need to save the blog?
+if blog <> old_blog:
+   blog_file = open(blog_filename, "wb")
+   pickle.dump(blog, blog_file, pickle.HIGHEST_PROTOCOL)
+   blog_file.close()
+
+
+# Localized month names
 
 import locale
 locale.setlocale(locale.LC_ALL, '')
@@ -83,8 +92,16 @@ months_names_ru0 = ['', "
 ]
 
 
-def write_template(year, month, titles):
-   index_name = os.path.join(year, month, "index.tmpl")
+def write_template(level, year, month, day, titles):
+   path = []
+   if level >= 1:
+      path.append(year)
+   if level >= 2:
+      path.append(month)
+   if level == 3:
+      path.append(day)
+   path.append("index.tmpl")
+   index_name = os.path.join(*path)
    try:
       index_tmpl = open(index_name, 'r')
       old_text = index_tmpl.read()
@@ -92,14 +109,14 @@ def write_template(year, month, titles):
    except IOError:
       old_text = None
 
-   new_text = []
-   show_year = not year
-   show_month = not month
-
-   if show_year:
-      new_text.append("""\
+   new_text = ["""\
+## THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT.
 #extends phd_pp_ru
 #implements respond
+"""]
+
+   if level == 0:
+      new_text.append("""\
 #attr $Title = "Oleg BroytMann's blog"
 #attr $Description = "BroytMann Russian Blog Index Document"
 #attr $Copyright = %(cyear)s
@@ -108,11 +125,8 @@ def write_template(year, month, titles):
 <H1>Журнал</H1>
 """ % {"cyear": year or 2005})
 
-   elif show_month:
-
+   elif level == 1:
       new_text.append("""\
-#extends phd_pp_ru
-#implements respond
 #attr $Title = "Oleg BroytMann's blog: %(year)s"
 #attr $Description = "BroytMann Russian Blog %(year)s Index Document"
 #attr $Copyright = %(cyear)s
@@ -121,12 +135,9 @@ def write_template(year, month, titles):
 <H1>Журнал: %(year)s</H1>
 """ % {"year": year, "cyear": year or 2005})
 
-   else:
-
-      month = int(month)
+   elif level == 2:
+      imonth = int(month)
       new_text.append("""\
-#extends phd_pp_ru
-#implements respond
 #attr $Title = "Oleg BroytMann's blog: %(month_abbr_en)s %(year)s"
 #attr $Description = "BroytMann Russian Blog %(month_name_en)s %(year)s Index Document"
 #attr $Copyright = %(cyear)s
@@ -135,27 +146,50 @@ def write_template(year, month, titles):
 <H1>Журнал: %(month_name_ru0)s %(year)s</H1>
 """ % {
       "year": year, "cyear": year or 2005,
-      "month_abbr_en": months_abbrs_en[month], "month_name_en": months_names_en[month],
-      "month_name_ru0": months_names_ru0[month],
+      "month_abbr_en": months_abbrs_en[imonth], "month_name_en": months_names_en[imonth],
+      "month_name_ru0": months_names_ru0[imonth],
+   })
+
+   elif level == 3:
+      iday = int(day)
+      imonth = int(month)
+
+      if len(titles) == 1:
+         new_text.append("""\
+#attr $refresh = "0; URL=%s"
+""" % titles[0][3])
+
+      new_text.append("""\
+#attr $Title = "Oleg BroytMann's blog: %(day)d %(month_abbr_en)s %(year)s"
+#attr $Description = "BroytMann Russian Blog %(day)d %(month_name_en)s %(year)s Index Document"
+#attr $Copyright = %(cyear)s
+##
+#def body_html
+<H1>Журнал: %(day)d %(month_name_ru0)s %(year)s</H1>
+""" % {
+      "year": year, "cyear": year or 2005,
+      "month_abbr_en": months_abbrs_en[imonth], "month_name_en": months_names_en[imonth],
+      "month_name_ru0": months_names_ru0[imonth],
+      "day": iday
    })
 
    save_titles = titles[:]
    titles.reverse()
 
    save_day = None
-   for key, tmpl, title, lead in titles:
-      year, month, day = key
+   for year, month, day, filename, title, lead in titles:
       href = []
-      if show_year:
+      if level == 0:
          href.append(year)
-      if show_month:
+      if level <= 1:
          href.append(month)
-      href.append(day)
-      href.append(tmpl)
+      if level <= 2:
+         href.append(day)
+      href.append(filename)
       href = '/'.join(href)
       if day[0] == '0': day = day[1:]
       if save_day <> day:
-         if show_year:
+         if level == 0:
             new_text.append('\n<h2>%s %s %s</h2>' % (day, months_names_ru[int(month)], year))
          else:
             new_text.append('\n<h2>%s %s</h2>' % (day, months_names_ru[int(month)]))
@@ -170,10 +204,9 @@ def write_template(year, month, titles):
 </p>
 ''' % (lead, href, title))
 
-   if show_year:
+   if level == 0:
       years = {}
-      for key, tmpl, title, lead in save_titles:
-         year, month, day = key
+      for year, month, day, filename, title, lead in save_titles:
          years[year] = True
       first_year = True
       new_text.append('''
@@ -204,31 +237,25 @@ $phd_pp_ru.respond(self)
       index_tmpl.close()
 
 
-def translate(tmpl):
-   if tmpl == "index.tmpl": tmpl = ''
-   if tmpl.endswith(".tmpl"): tmpl = tmpl[:-len("tmpl")] + "html"
-   return tmpl
-
-
 all_titles = []
-for key in sorted(blog.keys()):
-   title, tmpl, lead = blog[key]
-   all_titles.append((key, translate(tmpl), title, lead))
-all_titles = all_titles[-20:]
-
 for year in sorted(years.keys()):
    year_titles = []
    months = years[year]
    for month in sorted(months.keys()):
       month_titles = []
       for day in sorted(months[month]):
-         day_parts = day.split(os.sep)
-         key = tuple(day_parts)
+         day_titles = []
+         key = year, month, day
          if key in blog:
-            title, tmpl, lead = blog[key]
-            tmpl = translate(tmpl)
-            year_titles.append((key, tmpl, title, lead))
-            month_titles.append((key, tmpl, title, lead))
-      write_template(year, month, month_titles)
-   write_template(year, '', year_titles)
-write_template('', '', all_titles)
+            for filename, title, lead in blog[key]:
+               if filename.endswith(".tmpl"):
+                  filename = filename[:-len("tmpl")] + "html"
+               value = (year, month, day, filename, title, lead)
+               all_titles.append(value)
+               year_titles.append(value)
+               month_titles.append(value)
+               day_titles.append(value)
+         write_template(3, year, month, day, day_titles)
+      write_template(2, year, month, day, month_titles)
+   write_template(1, year, month, day, year_titles)
+write_template(0, year, month, day, all_titles[-20:])