Documentation additions. Fixes to compilation. Made true passthrough which works.
This commit is contained in:
parent
1093636728
commit
3922b13fb1
|
@ -0,0 +1 @@
|
||||||
|
include pixywerk2/defaults/*.yaml
|
|
@ -0,0 +1,69 @@
|
||||||
|
# Project Layout #
|
||||||
|
|
||||||
|
It is recommended that in general your project for PixyWerk2 site be layed out like:
|
||||||
|
```
|
||||||
|
project_top/
|
||||||
|
Makefile - Convenient for building your site
|
||||||
|
src/ - All "source" pages are contained in here.
|
||||||
|
.meta - Top-level default metadata is set here
|
||||||
|
templates/ - Templates go in here
|
||||||
|
default.jinja2 - Default template that will be used if none are specified
|
||||||
|
publish/ - The path the build process will create, where the post-processed files go.
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## Makefile ##
|
||||||
|
|
||||||
|
Makefile is suggested, but not essential, for encapsulating your build commands to produce your
|
||||||
|
site. Something as simple as:
|
||||||
|
|
||||||
|
```
|
||||||
|
build: src/templates/* src/*
|
||||||
|
python -mpixywerk2 src publish
|
||||||
|
```
|
||||||
|
|
||||||
|
## src/ ##
|
||||||
|
|
||||||
|
This is the top level path that all of your templates, page fragments, images, etc. will be stored. This is basically the "source code" for your site.
|
||||||
|
|
||||||
|
## src/.meta ##
|
||||||
|
|
||||||
|
This is the top level metadata that is used as the default for all subsidiary metadata. It is in JSON format (with JS style comments). See <METADATA.md> for more information.
|
||||||
|
|
||||||
|
Example .meta file:
|
||||||
|
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"title": "My Website", // this is the default title applied if none are specified
|
||||||
|
"author": "Super Web Dude",
|
||||||
|
"site_root": "http://example.com",
|
||||||
|
"uuid-oid-root": "example.com-", // this is used to generate UUIDs
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## src/templates/ ##
|
||||||
|
|
||||||
|
Templates are all stored here, as this is the search path for Jinja.
|
||||||
|
|
||||||
|
## templates/default.jinja2 ##
|
||||||
|
|
||||||
|
If a page specifies a `template` metadata key, the named template is used, however, if not this template is used. Generally speaking this is a complete HTML file, with the `{{ content }}` template string placed where the content of subsidiary pages will be embedded.
|
||||||
|
|
||||||
|
A simple default.jinja2 example:
|
||||||
|
|
||||||
|
```
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>{{ title }}</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
{{content}}
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## publish/ ##
|
||||||
|
|
||||||
|
This is arbitrary, and will be created by pixywerk at build time, but it will be the root path that should be published to your web server.
|
2
TODO.md
2
TODO.md
|
@ -1,6 +1,6 @@
|
||||||
# TODO #
|
# TODO #
|
||||||
|
|
||||||
* Pygments pretty printing of source code et al. including exposing that to the template API.
|
* Pygments pretty printing of source code et al. including exposing that to the template API (`pygment_format(get_file_content('whatever.py'))`).
|
||||||
* Smart CSS things (fill in the processors)
|
* Smart CSS things (fill in the processors)
|
||||||
|
|
||||||
# Maybe #
|
# Maybe #
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
build: src/templates/* src/* src/images/* src/posts/*
|
||||||
|
python -mpixywerk2 src publish
|
|
@ -0,0 +1,4 @@
|
||||||
|
# Pixywerk.com Example #
|
||||||
|
|
||||||
|
This is an example blog system with the features most blogs would have (posts, tag cloud, atom/rss feeds,
|
||||||
|
index with images).
|
|
@ -0,0 +1,3 @@
|
||||||
|
|
||||||
|
|
||||||
|
body { margin: 10% 10% 0 10% }
|
Binary file not shown.
After Width: | Height: | Size: 72 KiB |
|
@ -0,0 +1,13 @@
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title></title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="css/main.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<p>This is my index!!</p>
|
||||||
|
|
||||||
|
for i in posts[:5]:
|
||||||
|
|
||||||
|
get metadata, fill in post image/text summary with link
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,18 @@
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>My first post</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="css/main.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<img src="../images/20190415-0.jpg" class="featured">
|
||||||
|
<div class="byline">
|
||||||
|
<p>Author: Cas Rusnov</p>
|
||||||
|
<p>Published: 2019-04-16T01:42:27.156392+00:00
|
||||||
|
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<p>This is an example post!</p>
|
||||||
|
<p>yo fresh</p>
|
||||||
|
<p>There are many posts like it but this one is mine.</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,9 @@
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>{{ metadata.title }}</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="css/main.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
{{ content }}
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"author": "Cas Rusnov",
|
||||||
|
"author_email": "rusnovn@gmail.com",
|
||||||
|
"uuid-oid-root": "pixywerk.com/",
|
||||||
|
"site_root": "https://pixywerk.com/"
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
|
||||||
|
|
||||||
|
body { margin: 10% 10% 0 10% }
|
Binary file not shown.
After Width: | Height: | Size: 72 KiB |
|
@ -0,0 +1,5 @@
|
||||||
|
<p>This is my index!!</p>
|
||||||
|
|
||||||
|
for i in posts[:5]:
|
||||||
|
|
||||||
|
get metadata, fill in post image/text summary with link
|
|
@ -0,0 +1,12 @@
|
||||||
|
<img src="{{ metadata.featured }}" class="featured">
|
||||||
|
<div class="byline">
|
||||||
|
<p>Author: {{ metadata.author }}</p>
|
||||||
|
<p>Published: {{ get_time_iso8601(metadata.stat.ctime) }}
|
||||||
|
{% if metadata.stat.mtime-metadata.stat.ctime > 512 %}
|
||||||
|
Updated: {{ get_time_iso8601(metadata.stat.mtime) }}
|
||||||
|
{% endif %}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<p>This is an example post!</p>
|
||||||
|
<p>yo fresh</p>
|
||||||
|
<p>There are many posts like it but this one is mine.</p>
|
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"title":"My first post",
|
||||||
|
"featured":"../images/20190415-0.jpg"
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>{{ metadata.title }}</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="css/main.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
{{ content }}
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -8,12 +8,14 @@
|
||||||
import argparse
|
import argparse
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
|
import shutil
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from typing import Dict, List, cast
|
from typing import Dict, List, cast
|
||||||
|
|
||||||
from .processchain import ProcessorChains
|
from .processchain import ProcessorChains
|
||||||
|
from .processors.processors import PassthroughException
|
||||||
from .metadata import MetaTree
|
from .metadata import MetaTree
|
||||||
from .template_tools import file_list, file_name, file_content, file_metadata, time_iso8601
|
from .template_tools import file_list, file_name, file_content, file_metadata, time_iso8601
|
||||||
|
|
||||||
|
@ -73,8 +75,11 @@ def main() -> int:
|
||||||
"dir-template": "default-dir.jinja2",
|
"dir-template": "default-dir.jinja2",
|
||||||
"filters": {},
|
"filters": {},
|
||||||
"build-time": time.time(),
|
"build-time": time.time(),
|
||||||
"build-datetime": time.ctime(),
|
|
||||||
"uuid-oid-root": "pixywerk",
|
"uuid-oid-root": "pixywerk",
|
||||||
|
"summary": "",
|
||||||
|
"description": "",
|
||||||
|
"author": "",
|
||||||
|
"author_email": ""
|
||||||
}
|
}
|
||||||
meta_tree = MetaTree(args.root, default_metadata)
|
meta_tree = MetaTree(args.root, default_metadata)
|
||||||
file_list_cache = cast(Dict, {})
|
file_list_cache = cast(Dict, {})
|
||||||
|
@ -109,9 +114,13 @@ def main() -> int:
|
||||||
chain = process_chains.get_chain_for_filename(os.path.join(root, f), ctx=metadata)
|
chain = process_chains.get_chain_for_filename(os.path.join(root, f), ctx=metadata)
|
||||||
print("process {} -> {}".format(os.path.join(root, f), os.path.join(target_dir, chain.output_filename)))
|
print("process {} -> {}".format(os.path.join(root, f), os.path.join(target_dir, chain.output_filename)))
|
||||||
if not args.dry_run:
|
if not args.dry_run:
|
||||||
with open(os.path.join(target_dir, chain.output_filename), "w") as outfile:
|
try:
|
||||||
for line in chain.output:
|
with open(os.path.join(target_dir, chain.output_filename), "w") as outfile:
|
||||||
outfile.write(line)
|
for line in chain.output:
|
||||||
|
outfile.write(line)
|
||||||
|
except PassthroughException:
|
||||||
|
shutil.copyfile(os.path.join(root, f), os.path.join(target_dir, chain.output_filename))
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
|
||||||
from .processors import Processor
|
from .processors import Processor, PassthroughException
|
||||||
from ..utils import guess_mime
|
from ..utils import guess_mime
|
||||||
from typing import Iterable, Optional, Dict, cast
|
from typing import Iterable, Optional, Dict, cast
|
||||||
|
|
||||||
|
@ -49,7 +49,7 @@ class PassThrough(Processor):
|
||||||
Returns:
|
Returns:
|
||||||
iterable: The post-processed output stream
|
iterable: The post-processed output stream
|
||||||
"""
|
"""
|
||||||
return input_file
|
raise PassthroughException("passthrough")
|
||||||
|
|
||||||
def extension(self, oldname: str, ctx: Optional[Dict] = None) -> str:
|
def extension(self, oldname: str, ctx: Optional[Dict] = None) -> str:
|
||||||
"""Return the mimetype of the post-processed file.
|
"""Return the mimetype of the post-processed file.
|
||||||
|
|
|
@ -3,6 +3,10 @@ import abc
|
||||||
from typing import Iterable, Optional, Dict
|
from typing import Iterable, Optional, Dict
|
||||||
|
|
||||||
|
|
||||||
|
class PassthroughException(Exception):
|
||||||
|
"""Raised when the processor would like the file to pass through unchanged."""
|
||||||
|
|
||||||
|
|
||||||
class ProcessorException(Exception): # pragma: no cover
|
class ProcessorException(Exception): # pragma: no cover
|
||||||
"""A base exception class to be used by processor objects."""
|
"""A base exception class to be used by processor objects."""
|
||||||
|
|
||||||
|
|
5
setup.py
5
setup.py
|
@ -43,12 +43,13 @@ setup(
|
||||||
# 'cookbook = spicerack.cookbook:main',
|
# 'cookbook = spicerack.cookbook:main',
|
||||||
# ],
|
# ],
|
||||||
# },
|
# },
|
||||||
|
include_package_data=True,
|
||||||
extras_require=EXTRAS_REQUIRE,
|
extras_require=EXTRAS_REQUIRE,
|
||||||
install_requires=INSTALL_REQUIRES,
|
install_requires=INSTALL_REQUIRES,
|
||||||
keywords=["cms", "website", "compiler"]
|
keywords=["cms", "website", "compiler"],
|
||||||
license="MIT",
|
license="MIT",
|
||||||
long_description=LONG_DESCRIPTION,
|
long_description=LONG_DESCRIPTION,
|
||||||
name="pixywerk2", # Must be the same used for __version__ in __init__.py
|
name="pixywerk2",
|
||||||
packages=find_packages(exclude=["*.tests", "*.tests.*"]),
|
packages=find_packages(exclude=["*.tests", "*.tests.*"]),
|
||||||
platforms=["GNU/Linux"],
|
platforms=["GNU/Linux"],
|
||||||
setup_requires=SETUP_REQUIRES,
|
setup_requires=SETUP_REQUIRES,
|
||||||
|
|
Loading…
Reference in New Issue