# -*- coding: iso-8859-1 -*-
-import sys, os, optparse, fnmatch, stat, re, time, types
+import sys, os, optparse, fnmatch, stat, re, time, codecs
from config import Holder
Holder.__init__(self, **kw)
files[kw["rel_path"]] = self
self.render = None
+ self.contents = None
mtime = os.stat(self.path)[stat.ST_MTIME]
self.mtime = mtime
self.ctime = mtime
#print self.keys()
reKeywords = re.compile(r'(\S+)\s*:\s*(.*)')
- #reIsoDate = re.compile(r'(\d\d\d\d)-(\d\d)-(\d\d)')
-
- def read_keywords(self, terminate_line=""):
- """Opens the file and reads "key: value" pairs on the top of it. Returns
- the open file handle for further processing by some plugins/read_*.py code."""
- f = open(self.path)
- while True:
- s = f.readline().strip()
- if s==terminate_line:
- break
- m = self.reKeywords.match(s)
- if not m:
- warning("%s: wrong 'key: value' line '%s'" % (self.rel_path, s))
- break
- key = m.group(1).lower()
- val = m.group(2)
-
- if key == "mtime":
- val = iso_to_time(val)
-
- if key == "ctime":
- val = iso_to_time(val)
-
- if key == "title":
- if not self.has_key("linktitle"):
- self["linktitle"] = val
-
- #print self.rel_path, key, val
- self[key] = val
- return f
+
+ def read(self, terminate_line=""):
+ f = codecs.open(self.path, "r", self.input_encoding)
+
+ # Read keywords
+ read_keywords = True
+ txt = []
+ for s in f.readlines():
+ if read_keywords:
+ s = s.strip()
+ #print "kwd:", s
+ if s == terminate_line:
+ read_keywords = False
+ continue
+
+ m = self.reKeywords.match(s)
+ if not m:
+ warning("%s: wrong 'key: value' line '%s'" % (self.rel_path, s))
+ break
+ key = m.group(1).lower()
+ val = m.group(2)
+
+ if key == "mtime":
+ val = iso_to_time(val)
+
+ if key == "ctime":
+ val = iso_to_time(val)
+
+ if key == "title":
+ if not self.has_key("linktitle"):
+ self["linktitle"] = val
+
+ #print self.rel_path, key, val
+ self[key] = val
+
+ continue
+ #print "txt:", s.rstrip().encode("iso-8859-1")
+ txt.append(s)
+
+ # Warn about a bogus time entries
+ if self.mtime < self.ctime:
+ log('%s: modification time cannot be before creation time' % self.rel_path)
+ self.ctime = self.mtime
+
+ # Warn about long titles / long linktitles
+ if len(self.linktitle) > 20:
+ log('%s: define a shorter linktitle' % self.rel_path)
+
+ self.contents = "".join(txt)
_get_file_for_cache = {}
def get_link_from(source, dest):
#print "get_link_from", source, dest
- source = get_file_for(source)
+ #print source
+ if not isinstance(source, File):
+ source = get_file_for(source)
if not source:
+ print "NO SOURCE"
return "."
- dest = get_file_for(dest)
+ if not isinstance(dest, File):
+ dest = get_file_for(dest)
if not dest:
+ print "NO DEST"
return "."
rel_path = relpath(directories[source.direc].abs_path, directories[dest.direc].abs_path)
try:
# 5... Debug
#
def log(s, level=4):
- if level>4:
+ if level > 4:
indent = " " * (level-4)
else:
indent = ""
def load_plugins():
"""Loads all plugins in the plugins directory."""
sys.path.append(os.path.join(get_program_directory(), "plugins"))
+ if cfg.has_key("plugin_dirs"):
+ for s in cfg.plugin_dirs:
+ sys.path.append(s)
for s in cfg.plugins:
#print "import:", s
- #try:
- exec "import %s" % s
- #except:
- # print "Could not import plugin '%s'" % s
- # sys.exit(1)
+ try:
+ exec "import %s" % s
+ except:
+ print "Could not import plugin '%s'" % s
+ sys.exit(1)
def set_hook(name, last=False):
try:
t = time.strptime(val, "%Y-%m-%d")
except ValueError:
- warning("%s: wrong ISO format in '%s'" % (self.rel_path, s))
+ warning("wrong ISO format in '%s'" % val)
return int(time.mktime(t))
@set_function("format_date")
def format_date(timestamp):
return time.strftime(cfg.date_format, time.localtime(timestamp))
+@set_function("get_time")
+def get_time():
+ return format_date(time.time())
+
@set_function("get_current_file")
def get_current_file():
return current_file
direc.inheritFrom(cfg)
if not rel_path: rel_path = "."
- log("reading directory %s" % rel_path, level=4)
+ log("reading directory %s" % rel_path, level=5)
for s in os.listdir(dirpath):
full_path = os.path.join(dirpath, s)
if ok:
#print "FILE", s
rel_path = relpath(cfg.in_dir, full_path)
+ # Allow paths to be specified in exclude_files:
+ for e in cfg.exclude_files:
+ if fnmatch.fnmatch(rel_path, e):
+ log("ignoring file %s" % rel_path, level=7)
+ ok = False
+ break
+ if ok:
log("reading file %s" % rel_path, level=5)
file = File(
path = full_path,
kw["file"] = file
f = macros[name]
s = f(kw)
- if type(s) == types.UnicodeType:
+ if isinstance(s, unicode):
s = s.encode("utf-8")
return s
else:
for s in files:
file = files[s]
- try:
- # Just check if the file has contents
- contents = file.contents
- except:
+ if not file.has_key("contents"):
continue
+# try:
+# # Just check if the file has contents
+# contents = file.contents
+# except:
+# continue
direc = directories[file.direc]