Skip to content
Snippets Groups Projects
Commit f41d84be authored by Anton Akhmerov's avatar Anton Akhmerov
Browse files

remove pyrtek

parent b4d93f7c
No related branches found
No related tags found
1 merge request!2Switch to Nikola website generator
import os
import yaml
from mako.lookup import TemplateLookup
import pyrtek, pyrtek.rst, pyrtek.mako
mako_filter = pyrtek.mako.Filter(TemplateLookup(['../templates']))
rst_filter = pyrtek.rst.Filter()
filters = {'mako': mako_filter,
'rst': rst_filter,
'default': pyrtek.chain_filters(rst_filter, mako_filter)}
default_meta = {'__filter__': 'default',
'__template__': 'default.mako'}
# rexp, repl, priority, func
rules = [(r'(.*)\.txt$', r'\1.html', 0,
lambda s, d: pyrtek.Text(s, d, filters, default_meta))]
def main():
# Load catalog, if it exists.
try:
with open('catalog.yaml') as f:
catalog = yaml.load(f)
except IOError:
catalog = {}
# The following block of code is executed inside the content directory.
saved_cwd = os.getcwd();
os.chdir('content')
try:
catalog = pyrtek.build(pyrtek.expand_rules(rules), catalog)
finally:
os.chdir(saved_cwd)
# Save catalog.
with open('catalog.yaml', 'w') as f:
yaml.dump(catalog, f)
if __name__ == '__main__':
main()
my_figure_drafts/bilayer.png

110 KiB

import os, os.path
import re
import abc
import logging
import yaml
log = logging.getLogger(__name__)
class Item(object):
__metaclass__ = abc.ABCMeta
@abc.abstractproperty
def name(self):
pass
def isuptodate(self, oldmeta, catalog):
return False
def render(self, catalog):
"""Render the item, return re-generated metadata."""
pass
class Text(Item):
def __init__(self, source, dest, filters, default_meta={}):
self.source = source
self.dest = dest
self.filters = filters
self.default_meta = default_meta
def __repr__(self):
return '<{0}({1}, {2}, ...)>'.format(
self.__class__.__name__, self.source, self.dest)
@property
def name(self):
return self.dest
def render(self, catalog):
meta = self.default_meta.copy()
# Initialize data and metadata from source file.
with open(self.source) as f:
data = f.read().decode('utf-8')
if data.startswith('---\n'):
meta_yaml, data = data.split('\n---\n', 1)
meta.update(yaml.safe_load(meta_yaml[4:]))
# Appply filter.
try:
filter_name = meta['__filter__']
except KeyError:
log.error('{0}: No __filter__ defined.'.format(self.source))
else:
try:
filter = self.filters[filter_name]
except KeyError:
log.error('{0}: No filter {0}.'.format(filter_name))
else:
data, meta = filter(data, meta, self.dest, catalog)
# Write filtered data to destination file.
with open(self.dest, 'w') as f:
f.write(data.encode('utf-8'))
return meta
def build(items, old_catalog={}):
catalog = {}
for item in items:
name = item.name
meta = old_catalog.get(name)
if meta is None or not item.isuptodate(meta, catalog):
meta = item.render(catalog)
if name in catalog:
log.warning('{0} already present.'.format(name))
catalog[name] = meta
return catalog
def chain_filters(*filters):
def chained(data, meta, name, catalog):
for filter in filters:
data, meta = filter(data, meta, name, catalog)
return data, meta
return chained
def expand_rules(rules):
rules = [(rexp if hasattr(rexp, 'match') else re.compile(rexp),
repl, priority, func)
for rexp, repl, priority, func in rules]
priority_item_seq = []
for root, dirs, files in os.walk('.'):
for file in files:
# For security, do not follow symlinks.
source = os.path.join(root, file)
if os.path.islink(os.path.join(root, file)):
log.warn('Ignoring symlink: {0}'.format(source))
continue
for rexp, repl, priority, func in rules:
if not rexp.match(source):
continue
dest = rexp.sub(repl, source)
priority_item_seq.append((priority, func(source, dest)))
priority_item_seq.sort(key=lambda p_i: p_i[0])
return [i for p, i in priority_item_seq]
import logging
log = logging.getLogger(__name__)
class Filter(object):
def __init__(self, lookup):
self.lookup = lookup
def __call__(self, data, meta, name, catalog):
try:
template_name = meta['__template__']
except KeyError:
log.error('{0}: No __template__ defined.'.format(name))
return None, meta
# TODO: surround with try-block
template = self.lookup.get_template(template_name)
data = template.render(body=data, name=name, meta=meta, catalog=catalog)
return data, meta
import logging
import docutils.core, docutils.nodes, docutils.io, docutils as du
log = logging.getLogger(__name__)
class Filter(object):
def __call__(self, data, meta, name, catalog):
doctree = du.core.publish_doctree(data)
parts = du.core.publish_parts(
doctree, reader_name='doctree', source_class=du.io.DocTreeInput,
writer_name='html', settings_overrides={'initial_header_level': 2})
data = parts['html_body']
meta.setdefault('title', parts['title'])
meta.setdefault('subtitle', parts['subtitle'])
return data, meta
# Taken from
# http://www.linuxjournal.com/content/tech-tip-really-simple-http-server-python
import os
import BaseHTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler
HandlerClass = SimpleHTTPRequestHandler
ServerClass = BaseHTTPServer.HTTPServer
Protocol = "HTTP/1.0"
server_address = ('127.0.0.1', 8000)
HandlerClass.protocol_version = Protocol
httpd = ServerClass(server_address, HandlerClass)
sa = httpd.socket.getsockname()
print "Serving HTTP on", sa[0], "port", sa[1], "..."
os.chdir('content')
httpd.serve_forever()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment