Modified:
/trunk/rig3serv/src/rig/site/site_default.py
/trunk/rig3serv/src/rig/source_item.py
/trunk/rig3serv/src/rig/source_reader.py
=======================================
--- /trunk/rig3serv/src/rig/site/site_default.py Sun Apr 4 23:37:44 2010
+++ /trunk/rig3serv/src/rig/site/site_default.py Sat Aug 28 00:01:31 2010
@@ -670,6 +670,8 @@
If the source item is not suitable (i.e. generates no data),
the method must return None and the caller must be prepared to
ignore it.
+ This basically converts a SourceItem into a SiteItem.
+
Arguments:
- source_item: An instance of SourceItem.
"""
=======================================
--- /trunk/rig3serv/src/rig/source_item.py Mon Oct 26 21:47:21 2009
+++ /trunk/rig3serv/src/rig/source_item.py Sat Aug 28 00:01:31 2010
@@ -180,7 +180,7 @@
"""
Represents a file item from a SourceFileReader.
- Paremeters:
+ Parameters:
- date (datetime): Date of the file
- rel_file (RelFile): absolute+relative source file
- source_settings (not optional)
@@ -228,10 +228,61 @@
return self.rel_file.rel_curr
-# TODO: SourceBlog
-# - content: the data of the file
-# - rel_filename: filename of the generated file relative to the site's
-# dest_dir.
+#------------------------
+class SourceContent(SourceItem):
+ """
+ Represents a file item from a SourceFileReader.
+
+ Parameters:
+ - date (datetime): Date of the file
+ - rel_file (RelFile): absolute+relative source file
+ - source_settings (not optional)
+ """
+ def __init__(self, date, title, content, tags, source_settings):
+ super(SourceContent, self).__init__(date, source_settings)
+ self.tags = tags
+ self.title = title
+ self.content = content
+
+ def __eq__(self, rhs):
+ if not super(SourceContent, self).__eq__(rhs):
+ return False
+ return (isinstance(rhs, SourceContent) and
+ self.tags == rhs.tags and
+ self.title == rhs.title and
+ self.content == rhs.content)
+
+ def RigHash(self, md=None):
+ """
+ Computes a hash that depends on the real path of the file (like
+ ContentHash) but *also* depends on the items date, source settings
+ and categories.
+ """
+ md = super(SourceContent, self).RigHash(md)
+ md = self.ContentHash(md)
+ return md
+
+ def ContentHash(self, md=None):
+ """
+ Computes a hash that only depends on the real path of the file.
+ """
+ md = super(SourceContent, self).ContentHash(md)
+ md = self.UpdateHash(md, self.rel_file.realpath())
+ return md
+
+ def __repr__(self):
+ return "<%s (%s) %s, %s, %s>" % (self.__class__.__name__,
+ self.date,
+ self.rel_file,
+ self.categories,
+ self.source_settings)
+
+ def PrettyRepr(self):
+ """
+ Returns a "pretty representation" of the item as a string,
+ suitable for Log.Info, namely the file relative path.
+ """
+ return self.rel_file.rel_curr
=======================================
--- /trunk/rig3serv/src/rig/source_reader.py Wed Sep 2 21:57:04 2009
+++ /trunk/rig3serv/src/rig/source_reader.py Sat Aug 28 00:01:31 2010
@@ -28,8 +28,9 @@
import re
from datetime import datetime
-from rig.source_item import SourceDir, SourceFile
+from rig.source_item import SourceDir, SourceFile, SourceContent
from rig.parser.dir_parser import DirParser, RelFile, PathTimestamp
+from rig.parser.izu_parser import IzuParser
#------------------------
@@ -151,15 +152,69 @@
# Not a directory entry, so check individual files to see
if they
# qualify as individual entries
for f in all_files:
- if file_pattern.search(f):
- rel_file = RelFile(source_dir.abs_base,
-
os.path.join(source_dir.rel_curr, f))
+ if not file_pattern.search(f):
+ continue
+ rel_file = RelFile(source_dir.abs_base,
+ os.path.join(source_dir.rel_curr,
f))
+ if f.endswith(".old.izu"):
+ self._ParseOldIzu(rel_file.abs_path, items)
+ else:
date =
datetime.fromtimestamp(self._FileTimeStamp(rel_file.abs_path))
item = SourceFile(date, rel_file,
self._source_settings)
items.append(item)
return items
+
+ OLD_IZU_HEADER =
re.compile(r"^\[s:(?P<year>\d{4})(?P<month>\d{2})(?P<day>\d{2}):(?P<title>[^\]]*).*$")
+
+ def _ParseOldIzu(self, abs_path, items):
+ """
+ """
+ f = file(abs_path)
+
+ SEP = "----"
+
+ # First line must have some izu tags
+ line = None
+ tags = None
+ while line != SEP:
+ line = f.readline()
+ if not tags and line:
+ tags = IzuParser(self._log, None,
None).ParseFirstLine(line)
+
+ content = None
+ date = None
+ title = None
+ for line in f.readlines():
+ if line.startswith("[s:"):
+ # Flush content
+ item = SourceContent(date, title, content, tags,
self._source_settings)
+ items.append(item)
+
+ content = ""
+ date = None
+ title = None
+
+ m = self.OLD_IZU_HEADER.match(line)
+ if m:
+ date = datetime.datetime(
+ int(m.groups("year")),
+ int(m.groups("month")),
+ int(m.groups("day")))
+ title = m.groups("title")
+
+ elif date and title:
+ content += line
+
+ if content:
+ # Flush content
+ item = SourceContent(date, title, content)
+ items.append(item)
+
+ f.close()
+
+
# Utilities, overridable for unit tests
def _DirTimeStamp(self, dir):
@@ -197,7 +252,7 @@
the specified DIR_PATTERN regexp *and* must contain one or more of the
files
specified by the VALID_FILES regexp.
- @deprecated
+ @deprecated use SourceBlogReader instead
"""
DIR_PATTERN = re.compile(r"^(\d{4}[-]?\d{2}(?:[-]?\d{2})?)[ _-]
*(?P<name>.*) *$")
@@ -306,7 +361,7 @@
Only files which name match the specified FILE_PATTERN regexp are
considered valid.
- @deprecated
+ @deprecated use SourceBlogReader instead
"""
FILE_PATTERN = re.compile(r"^(\d{4}[-]?\d{2}(?:[-]?\d{2})?)[ _-]
*(?P<name>.*) *\.(?P<ext>izu|html)$")