Добавлен скрипт генерации статического сайта generate-static-site [closes #36]
parent
467a5698f4
commit
6e212f6d08
|
@ -0,0 +1,86 @@
|
||||||
|
import os
|
||||||
|
from distutils.dir_util import copy_tree
|
||||||
|
from pathlib import Path, PurePath
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
from pyramid.paster import bootstrap
|
||||||
|
from pyramid.scripts.common import parse_vars
|
||||||
|
from pyramid.path import AssetResolver
|
||||||
|
from pyramid.request import Request
|
||||||
|
|
||||||
|
from flatfilecms.models import Folder, Document
|
||||||
|
|
||||||
|
|
||||||
|
class Renderer:
|
||||||
|
def __init__(self, b, dest):
|
||||||
|
self.app = b["app"]
|
||||||
|
self.root = b["root"]
|
||||||
|
self.request = b["request"]
|
||||||
|
self.dest = dest
|
||||||
|
|
||||||
|
def render_folder(self, folder=None, path=PurePath("")):
|
||||||
|
if folder is None:
|
||||||
|
folder = self.root
|
||||||
|
for k, v in folder.items():
|
||||||
|
new_path = path / k
|
||||||
|
if isinstance(v, Folder):
|
||||||
|
(self.dest / new_path).mkdir(exist_ok=True)
|
||||||
|
self.render_folder(v, new_path)
|
||||||
|
elif isinstance(v, Document):
|
||||||
|
url = str(path / k)
|
||||||
|
if k == "index":
|
||||||
|
new_path = new_path.with_suffix(".html")
|
||||||
|
url = str(path) if path != PurePath("") else "/"
|
||||||
|
elif len(new_path.suffix) == 0:
|
||||||
|
(self.dest / new_path).mkdir(exist_ok=True)
|
||||||
|
new_path = new_path / "index.html"
|
||||||
|
print("Generating {}".format(url))
|
||||||
|
with (self.dest / new_path).open("wb") as f:
|
||||||
|
request = Request.blank(url)
|
||||||
|
f.write(request.get_response(self.app).body)
|
||||||
|
|
||||||
|
|
||||||
|
def WritableDirectory(value):
|
||||||
|
p = Path(value)
|
||||||
|
if not p.exists():
|
||||||
|
p.mkdir()
|
||||||
|
return p
|
||||||
|
if not p.is_dir():
|
||||||
|
raise argparse.ArgumentTypeError("{0} is not a directory".format(p))
|
||||||
|
if os.access(p, os.W_OK):
|
||||||
|
return p
|
||||||
|
else:
|
||||||
|
raise argparse.ArgumentTypeError("{0} is not a writable directory".format(p))
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
parser = argparse.ArgumentParser(description="Generate static pages.")
|
||||||
|
parser.add_argument(
|
||||||
|
"-c",
|
||||||
|
"--config",
|
||||||
|
help="use configuration file " "like production.ini or development.ini",
|
||||||
|
required=True,
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"path", help="where to store generated files", type=WritableDirectory
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-o",
|
||||||
|
"--options",
|
||||||
|
nargs="*",
|
||||||
|
default={},
|
||||||
|
type=parse_vars,
|
||||||
|
help="additional options in form OPTION=VALUE",
|
||||||
|
)
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
b = bootstrap(args.config, **args.options)
|
||||||
|
|
||||||
|
introspector = b["registry"].introspector
|
||||||
|
a = AssetResolver()
|
||||||
|
for v in introspector.get_category("static views"):
|
||||||
|
print("Copying static dir {}".format(v["introspectable"]["name"]))
|
||||||
|
p = a.resolve(v["introspectable"]["spec"]).abspath()
|
||||||
|
copy_tree(str(p), str(args.path / v["introspectable"]["name"]))
|
||||||
|
r = Renderer(b, args.path)
|
||||||
|
r.render_folder()
|
Reference in New Issue