diff --git a/hyde/engine.py b/hyde/engine.py index f29411d..0026ec8 100644 --- a/hyde/engine.py +++ b/hyde/engine.py @@ -70,36 +70,13 @@ class Engine(Application): The generate command. Generates the site at the given deployment directory. """ sitepath = Folder(args.sitepath) - logger.info("Generating site at [%s]" % sitepath) - # Read the configuration config_file = sitepath.child(args.config) logger.info("Reading site configuration from [%s]", config_file) conf = {} with open(config_file) as stream: conf = yaml.load(stream) site = Site(sitepath, Config(sitepath, conf)) - # TODO: Find the appropriate template environment - from hyde.ext.templates.jinja import Jinja2Template - template = Jinja2Template(sitepath) - logger.info("Using [%s] as the template", template) - # Configure the environment - logger.info("Configuring Template environment") - template.configure(site.config) - # Prepare site info - logger.info("Analyzing site contents") - site.build() - context = dict(site=site) - # Generate site one file at a time - logger.info("Generating site to [%s]" % site.config.deploy_root_path) - for page in site.content.walk_resources(): - logger.info("Processing [%s]", page) - target = File(page.source_file.get_mirror(site.config.deploy_root_path, site.content.source_folder)) - target.parent.make() - if page.source_file.is_text: - logger.info("Rendering [%s]", page) - context.update(page=page) - text = template.render(page.source_file.read_all(), context) - target.write(text) - else: - logger.info("Copying binary file [%s]", page) - page.source_file.copy_to(target) \ No newline at end of file + + from hyde.generator import Generator + gen = Generator(site) + gen.generate_all() \ No newline at end of file diff --git a/hyde/generator.py b/hyde/generator.py index bacee29..6cf0908 100644 --- a/hyde/generator.py +++ b/hyde/generator.py @@ -1,6 +1,18 @@ """ The generator class and related utility functions. """ +from hyde.exceptions import HydeException +from hyde.fs import File +from hyde.template import Template + +from contextlib import contextmanager + +import logging +from logging import NullHandler + +logger = logging.getLogger('hyde.engine') +logger.addHandler(NullHandler()) + class Generator(object): """ @@ -10,25 +22,126 @@ class Generator(object): def __init__(self, site): super(Generator, self).__init__() self.site = site + self.__context__ = dict(site=site) + self.template = None + + @contextmanager + def context_for_resource(self, resource): + """ + Context manager that intializes the context for a given + resource and rolls it back after the resource is processed. + """ + # TODO: update metadata and other resource + # specific properties here. + self.__context__.update(resource=resource) + yield self.__context__ + self.__context__.update(resource=None) + + def initialize_template_if_needed(self): + """ + Loads and configures the template environement from the site + configuration if its not done already. + """ + if not self.template: + logger.info("Generating site at [%s]" % self.site.sitepath) + self.template = Template.find_template(self.site) + logger.info("Using [%s] as the template", self.template) + + logger.info("Configuring the template environment") + self.template.configure(self.site.config) + + + def rebuild_if_needed(self): + """ + Checks if the site requries a rebuild and builds if + necessary. + """ + #TODO: Perhaps this is better suited in Site + if not len(self.site.content.child_nodes): + logger.info("Reading site contents") + self.site.build() def generate_all(self): """ Generates the entire website """ - pass + logger.info("Reading site contents") + self.initialize_template_if_needed() + self.rebuild_if_needed() - def generate_node(self, node=None): + logger.info("Generating site to [%s]" % + self.site.config.deploy_root_path) + self.__generate_node__(self.site.content) + + def generate_node_at_path(self, node_path=None): """ - Generates a single node. If node is non-existent or empty + Generates a single node. If node_path is non-existent or empty, generates the entire site. """ - pass + self.initialize_template_if_needed() + self.rebuild_if_needed() + node = None + if node_path: + node = self.site.content.node_from_path(node_path) + self.generate_node(node) - def generate_resource(self, resource=None): + def generate_node(self, node=None): + """ + Generates the given node. If node is invalid, empty or + non-existent, generates the entire website. """ - Generates a single resource. If resource is non-existent or empty + self.initialize_template_if_needed() + self.rebuild_if_needed() + if not node: + return self.generate_all() + try: + self.__generate_node__(node) + except HydeException: + self.generate_all() + + def generate_resource_at_path(self, resource_path=None): + """ + Generates a single resource. If resource_path is non-existent or empty, generats the entire website. """ - pass + self.initialize_template_if_needed() + self.rebuild_if_needed() + resource = None + if resource_path: + resource = self.site.content.resource_from_path(resource_path) + return self.generate_resource(resource) + + def generate_resource(self, resource=None): + """ + Generates the given resource. If resource is invalid, empty or + non-existent, generates the entire website. + """ + self.initialize_template_if_needed() + self.rebuild_if_needed() + if not resource: + return self.generate_all() + try: + self.__generate_resource__(resource) + except HydeException: + self.generate_all() + def __generate_node__(self, node): + logger.info("Generating [%s]", node) + for resource in node.walk_resources(): + self.__generate_resource__(resource) + def __generate_resource__(self, resource): + logger.info("Processing [%s]", resource) + with self.context_for_resource(resource) as context: + target = File(resource.source_file.get_mirror( + self.site.config.deploy_root_path, + self.site.content.source_folder)) + target.parent.make() + if resource.source_file.is_text: + logger.info("Rendering [%s]", resource) + text = self.template.render(resource.source_file.read_all(), + context) + target.write(text) + else: + logger.info("Copying binary file [%s]", resource) + resource.source_file.copy_to(target) diff --git a/hyde/layouts/basic/layout/base.html b/hyde/layouts/basic/layout/base.html index c568763..9775224 100644 --- a/hyde/layouts/basic/layout/base.html +++ b/hyde/layouts/basic/layout/base.html @@ -9,7 +9,7 @@
{% block starthead %}{% endblock starthead %} - + @@ -20,9 +20,9 @@ -