]> git.phdru.name Git - phdru.name/phdru.name.git/blobdiff - reindex_blog.py
Allow a few blog entries for one day.
[phdru.name/phdru.name.git] / reindex_blog.py
index 43c4f8b4342389643585f4958d655b8f718e4798..c4d9be3358e6904ef9256879b0174efb9fcf729c 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,56 +17,65 @@ 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 month 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))
+
+         if year in years:
+            months = years[year]
+         else:
+            months = years[year] = {}
+
+         if month in months:
+            days = months[month]
+         else:
+            days = months[month] = []
 
-blog_file = open(blog_filename, "wb")
-pickle.dump(blog, blog_file, pickle.HIGHEST_PROTOCOL)
-blog_file.close()
+         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, '')
 from calendar import _localized_day, _localized_month
@@ -83,8 +92,8 @@ months_names_ru0 = ['', "
 ]
 
 
-def write_template(year, month, titles):
-   index_name = os.path.join(year, month, "index.tmpl")
+def write_template(year, month, day, titles):
+   index_name = os.path.join(year, month, day, "index.tmpl")
    try:
       index_tmpl = open(index_name, 'r')
       old_text = index_tmpl.read()
@@ -95,11 +104,16 @@ def write_template(year, month, titles):
    new_text = []
    show_year = not year
    show_month = not month
+   show_day = not day
 
-   if show_year:
-      new_text.append("""\
+   new_text.append("""\
+## THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT.
 #extends phd_pp_ru
 #implements respond
+""")
+
+   if show_year:
+      new_text.append("""\
 #attr $Title = "Oleg BroytMann's blog"
 #attr $Description = "BroytMann Russian Blog Index Document"
 #attr $Copyright = %(cyear)s
@@ -111,8 +125,6 @@ def write_template(year, month, titles):
    elif show_month:
 
       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 +133,10 @@ def write_template(year, month, titles):
 <H1>Журнал: %(year)s</H1>
 """ % {"year": year, "cyear": year or 2005})
 
-   else:
+   elif show_day:
 
       month = 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
@@ -139,6 +149,25 @@ def write_template(year, month, titles):
       "month_name_ru0": months_names_ru0[month],
    })
 
+   else:
+
+      day = int(day)
+      month = int(month)
+
+      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[month], "month_name_en": months_names_en[month],
+      "month_name_ru0": months_names_ru0[month],
+      "day": day
+   })
+
    save_titles = titles[:]
    titles.reverse()
 
@@ -150,7 +179,8 @@ def write_template(year, month, titles):
          href.append(year)
       if show_month:
          href.append(month)
-      href.append(day)
+      if show_day:
+         href.append(day)
       href.append(tmpl)
       href = '/'.join(href)
       if day[0] == '0': day = day[1:]
@@ -200,35 +230,27 @@ $phd_pp_ru.respond(self)
    if old_text <> new_text:
       print "Writing", index_name
       index_tmpl = open(index_name, 'w')
-      index_tmpl.write(new_test)
+      index_tmpl.write(new_text)
       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 tmpl, title, lead in blog[key]:
+               if tmpl.endswith(".tmpl"): tmpl = tmpl[:-len("tmpl")] + "html"
+               all_titles.append((key, tmpl, title, lead))
+               year_titles.append((key, tmpl, title, lead))
+               month_titles.append((key, tmpl, title, lead))
+               day_titles.append((key, tmpl, title, lead))
+         write_template(year, month, day, day_titles)
+      write_template(year, month, '', month_titles)
+   write_template(year, '', '', year_titles)
+write_template('', '', '', all_titles[-20:])