comparison piecrust/sources/posts.py @ 577:ff404adfcf45

sources: Add method to get a page factory from a path.
author Ludovic Chabant <ludovic@chabant.com>
date Wed, 30 Dec 2015 14:45:57 -0800
parents 0c74a6c4533d
children 58ebf50235a5
comparison
equal deleted inserted replaced
576:0c74a6c4533d 577:ff404adfcf45
8 PageSource, InvalidFileSystemEndpointError, PageFactory, 8 PageSource, InvalidFileSystemEndpointError, PageFactory,
9 MODE_CREATING, MODE_PARSING) 9 MODE_CREATING, MODE_PARSING)
10 from piecrust.sources.interfaces import ( 10 from piecrust.sources.interfaces import (
11 IPreparingSource, IInteractiveSource, InteractiveField) 11 IPreparingSource, IInteractiveSource, InteractiveField)
12 from piecrust.sources.mixins import SimplePaginationSourceMixin 12 from piecrust.sources.mixins import SimplePaginationSourceMixin
13 from piecrust.uriutil import multi_replace
13 14
14 15
15 logger = logging.getLogger(__name__) 16 logger = logging.getLogger(__name__)
16 17
17 18
32 33
33 def resolveRef(self, ref_path): 34 def resolveRef(self, ref_path):
34 path = os.path.normpath(os.path.join(self.fs_endpoint_path, ref_path)) 35 path = os.path.normpath(os.path.join(self.fs_endpoint_path, ref_path))
35 metadata = self._parseMetadataFromPath(ref_path) 36 metadata = self._parseMetadataFromPath(ref_path)
36 return path, metadata 37 return path, metadata
38
39 def buildPageFactory(self, path):
40 if not path.startswith(self.fs_endpoint_path):
41 raise Exception("Page path '%s' isn't inside '%s'." % (
42 path, self.fs_endpoint_path))
43 rel_path = path[len(self.fs_endpoint_path):].lstrip('\\/')
44 pat = self.PATH_FORMAT % {
45 'year': 'YEAR',
46 'month': 'MONTH',
47 'day': 'DAY',
48 'slug': 'SLUG',
49 'ext': 'EXT'}
50 pat = re.escape(pat)
51 pat = multi_replace(pat, {
52 'YEAR': '(\d{4})',
53 'MONTH': '(\d{2})',
54 'DAY': '(\d{2})',
55 'SLUG': '(.*)',
56 'EXT': '(.*)'})
57 m = re.match(pat, rel_path)
58 if m is None:
59 raise Exception("'%s' isn't a proper %s page path." % (
60 rel_path, self.SOURCE_NAME))
61 return self._makeFactory(
62 rel_path,
63 m.group(4),
64 int(m.group(1)),
65 int(m.group(2)),
66 int(m.group(3)))
67
37 68
38 def findPageFactory(self, metadata, mode): 69 def findPageFactory(self, metadata, mode):
39 year = metadata.get('year') 70 year = metadata.get('year')
40 month = metadata.get('month') 71 month = metadata.get('month')
41 day = metadata.get('day') 72 day = metadata.get('day')