def build(config_file): begin = time.time() if not os.path.exists(config_file): answer = raw_input('This is not a Felix Felicis repo, ' 'would you like to create one?(Y/n) ') if answer.lower() == 'n': sys.exit(1) return return create() init_config(config_file) init_post() logger.info('Starting readers') for reader in ns.readers.values(): if reader: import_module(reader)().start() logger.info('Starting writers') for writer in ns.writers.values(): if writer: import_module(writer)().start() logger.info('Running writers') for writer in ns.writers.values(): if writer: import_module(writer)().run() for error in ns.storage.errors: logger.error('Invalid Post: %s' % error) end = time.time() logger.info('Total time: %s' % (end - begin)) return
def read(self): f = open(self.filepath) logger.info('read ' + self.filepath) content = f.read() f.close() meta_regex = re.compile( r"^\s*(?:-|=){3,}\s*\n((?:.|\n)+?)\n\s*(?:-|=){3,}\s*\n*", re.MULTILINE) match = re.match(meta_regex, content) if not match: logger.error("No metadata in: %s" % self.filepath) return None meta = match.group(1) meta = re.sub(r'\r\n|\r|\n', '\n', meta) dct = {} k = v = None for meta in meta.split('\n'): meta = meta.replace('\t', ' ') if meta.startswith(' ') and k: dct[k] = dct[k] + '\n' + meta.lstrip() if ':' in meta and not meta.startswith(' '): index = meta.find(':') k, v = meta[:index], meta[index + 1:] k, v = k.rstrip(), v.lstrip() dct[k] = to_unicode(v) text = to_unicode(content[match.end():]) dct['content'] = markdown(text) return dct
def _parse_datetime(sef, value): supported_formats = [ '%a %b %d %H:%M:%S %Y', '%Y-%m-%d %H:%M:%S', '%Y-%m-%d %H:%M', '%Y-%m-%dT%H:%M', '%Y%m%d %H:%M:%S', '%Y%m%d %H:%M', '%Y-%m-%d', '%Y%m%d', ] for format in supported_formats: try: return datetime.strptime(value, format) except ValueError: pass logger.error('Unrecognized date/time: %r' % value) raise ValueError('Unrecognized date/time: %r' % value)
def render(self): try: post = self.parse_post() except Exception as e: logger.error(e) ns.storage.errors.append(self.filepath) return None if not post or not post.get('date', None): ns.storage.errors.append(self.filepath) return None if not post.get('author', None): post.author = ns.context.get('author', 'admin') try: post.date = self._parse_datetime(post.get('date')) except ValueError as e: ns.storage.errors.append(self.filepath) return None for key in post.keys(): if '_date' in key or '_time' in key: try: post[key] = self._parse_datetime(post[key]) except ValueError as e: ns.storage.errors.append(self.filepath) return None if post.get('public', 'true') == 'false': post.public = False else: post.public = True post.destination = self.get_resource_destination() post.slug = self.get_resource_slug() post.filepath = self.filepath return post