masenf.com-rst: Converting masenf.com into a 'static' site 2012-07-07 Using dynamic pages is slow and breakable. Using static pages is fast and portable. Storing content in text files vs. SQLite databases allows the data to last and be efficiently archived and used. From now on, all content on masenf.com will be stored either as reStructuredText or HTML5/JS Folder Hierarchy: - / contains Makefile and deploy scripts | --- /template should contain HTML templates for building pages | --- /blog restructured text posts --- /page rest or html pages --- /asset images, etc copied to the output root --- /component python modules which generate certain page content Templates --------- Templates are the building blocks that create the site. Each template should begin with a metadata header which looks like an HTML comment block and contains ReST-like directives. Here the template and component dependencies are listed for the generation engine. For instance, if a template like blog.tmpl.html is to be inserted into a parent template such as page.tmpl.html in the placeholder '{content}': :provide page.tmpl.html content If a template has a placeholder for content from a python component, it can be included as well. If we are trying to fill '{nav}' with the output from the nav module we can use a directive like this: :require component:nav In the page, the {nav} tag will be replaced by the output of the module. To indicate that a template should be used as the destination for ReST/HTML output, use the :generate directive. If we want all ReST files in the /blog folder to be rendered in post-full.tmpl.html and replaced by the '{post}' tag, we can use this: :generate blog post Blogs and Pages --------------- Blogs and pages contain metadata to assist in their organization and processing. The most common metadata will be the author, subject, permalink, and tags. Other metadata may include script dependencies and other directives. In ReST, the metadata can be inserted directly at the top of the file, for HTML pages, the metadata should be inserted at the top of the file in an HTML comment. :author masen :title Yes, another backend redesign :published 2012-07-07 1515 :tag technical :tag short Compilation Process ------------------- These steps are taken in order to generate the pages. Phase I: Collect information 1. Scan template directory (read in all template metadata 2. Scan referenced generate folders for all post metadata Phase II: Generate content 3. Generate pages in all 'generate' folders 4. Generate any templates with :output directives 5. Copy asset folder to output root Components ---------- Components are python modules which inherit from the WebComponent class. The primary method that needs to be overwritten is 'render' which is called each time the output is generated. Each component retains a static, immutable data structure with reference to all known pages as well as a pointer to the page requesting this component WebComponent.pages is a tuple of dictionaries. Each dictionary contains the key-value pairs taken from the directives described above. and WebComponent.current which is a dictionary of the component being rendered right now. It is recommended to use memoization or some other technique to cache the results of calculations which do not change as the render method in the component may be called many times.