diff --git a/LICENSE b/LICENSE index 9a0f344..a173754 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2018 Cas Rusnov +Copyright (c) 2018,2019 Cas Rusnov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/READMES/METADATA.md b/READMES/METADATA.md index 5f8c97c..6cee143 100755 --- a/READMES/METADATA.md +++ b/READMES/METADATA.md @@ -15,6 +15,8 @@ On-disk meatdata is stored as a file along side the non-metadata file with the e All files define the following keys by default: +relpath +: The relative path to the root of the site, useful for prepending to image `src=` and other resource paths such as CSS files and fonts in order to maintain locally viewable output. file_name : The local path of the file file_path @@ -60,6 +62,14 @@ author_email site_root : The full URL for the root of this web site used for links and whatnot, with ending slash. +Special Keys that can be defined, these change the processing in predictable ways: + +type +: Define that the file that this metadata is applied to as a specific type from the type mapping table. Useful values are `passthrough` and `templatable` with obvious outcomes. +wildcard_metadata +: Define a dictionary of file globs (patterns which match files such as `*.txt`), with the value being a dictionary of additional metadata to apply to the matched files. This is generally +defined at the top level of the project to make certain file patterns treated as special without having to give them their own metadata. + ## CACHING STRATEGY ## diff --git a/TODO.md b/TODO.md index bd5221a..9c3132e 100644 --- a/TODO.md +++ b/TODO.md @@ -2,6 +2,7 @@ * 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) +* Project global defines, parameters. # Maybe # diff --git a/demo/.meta b/demo/.meta deleted file mode 100755 index 77f863c..0000000 --- a/demo/.meta +++ /dev/null @@ -1,7 +0,0 @@ -{ -"site_root":"https://example.com", -"title":"Test Metadata", -"author": "Test User", -"author_email": "test_user@example.com", -"uuid_oid_root": "pixywerk-demo" -} diff --git a/demo/atom.xml.meta b/demo/atom.xml.meta deleted file mode 100644 index dee5897..0000000 --- a/demo/atom.xml.meta +++ /dev/null @@ -1,5 +0,0 @@ -{ -"type": "templatable", -"title": "Test RSS Feed", -"subtitle": "Some Subtitle" -} \ No newline at end of file diff --git a/demo/bar/baz/quux/quuux b/demo/bar/baz/quux/quuux deleted file mode 100755 index e69de29..0000000 diff --git a/demo/blog_posts/anotherpost.cont b/demo/blog_posts/anotherpost.cont deleted file mode 100644 index cbd4708..0000000 --- a/demo/blog_posts/anotherpost.cont +++ /dev/null @@ -1,5 +0,0 @@ -Some more post - - -la la la - diff --git a/demo/blog_posts/anotherpost.cont.meta b/demo/blog_posts/anotherpost.cont.meta deleted file mode 100644 index b9a84d5..0000000 --- a/demo/blog_posts/anotherpost.cont.meta +++ /dev/null @@ -1,4 +0,0 @@ -{ -"title":"Another Post(tm)", -"summary":"Yet another post" -} diff --git a/demo/blog_posts/test.cont b/demo/blog_posts/test.cont deleted file mode 100644 index 637d210..0000000 --- a/demo/blog_posts/test.cont +++ /dev/null @@ -1 +0,0 @@ -Some content. diff --git a/demo/blog_posts/test.cont.meta b/demo/blog_posts/test.cont.meta deleted file mode 100644 index 2bc3818..0000000 --- a/demo/blog_posts/test.cont.meta +++ /dev/null @@ -1,4 +0,0 @@ -{ -"title":"Test.cont", -"summary":"Some empty test content" -} diff --git a/demo/foo.cont b/demo/foo.cont deleted file mode 100755 index 28a04cb..0000000 --- a/demo/foo.cont +++ /dev/null @@ -1 +0,0 @@ -yo fresh \ No newline at end of file diff --git a/demo/foo.cont.meta b/demo/foo.cont.meta deleted file mode 100755 index 59f3331..0000000 --- a/demo/foo.cont.meta +++ /dev/null @@ -1,5 +0,0 @@ -{ -"foo":"bar", -"title":"A title", -"summary":"Just a post." -} diff --git a/demo/index.cont b/demo/index.cont deleted file mode 100644 index 0c9ab9e..0000000 --- a/demo/index.cont +++ /dev/null @@ -1,19 +0,0 @@ -

Index of all content

-{% for f in get_file_list('*', sort_order='file_name') %} -{{get_file_name(f['file_name'])}} -{% endfor %} - -

Including foo.cont.meta: -

-{{ get_file_content('foo.cont.meta') }}
-
-

- -

Metadata

- - -{% set metadata = get_file_metadata('foo.cont') %} -{% for k in metadata.keys() %} - -{% endfor %} -
keyvalue
{{k}}{{metadata[k]}}
diff --git a/demo/mapping.json b/demo/mapping.json deleted file mode 100755 index e69de29..0000000 diff --git a/demo/passthrough.md b/demo/passthrough.md deleted file mode 100644 index 373643d..0000000 --- a/demo/passthrough.md +++ /dev/null @@ -1,9 +0,0 @@ -# README # - -This is a test of the emergency compiled HTML system. This is only a *test*. - -[Foo!](foo.html) - -{% for i in range(100) %} -* {{ i }} -{% endfor %} diff --git a/demo/passthrough.md.meta b/demo/passthrough.md.meta deleted file mode 100644 index d35f55b..0000000 --- a/demo/passthrough.md.meta +++ /dev/null @@ -1,3 +0,0 @@ -{ -"pragma":["no-proc"] -} diff --git a/demo/readme.md b/demo/readme.md deleted file mode 100644 index 373643d..0000000 --- a/demo/readme.md +++ /dev/null @@ -1,9 +0,0 @@ -# README # - -This is a test of the emergency compiled HTML system. This is only a *test*. - -[Foo!](foo.html) - -{% for i in range(100) %} -* {{ i }} -{% endfor %} diff --git a/demo/readme.md.meta b/demo/readme.md.meta deleted file mode 100644 index a266664..0000000 --- a/demo/readme.md.meta +++ /dev/null @@ -1,3 +0,0 @@ -{ -"title":"Yo, markdown" -} \ No newline at end of file diff --git a/demo/templates/debug.jinja2 b/demo/templates/debug.jinja2 deleted file mode 100755 index bcc22fb..0000000 --- a/demo/templates/debug.jinja2 +++ /dev/null @@ -1,32 +0,0 @@ - - -Debug for {{path}} - - - -

{{path}}

-

Content

-
-{{content}} -
- -

Environment

- - -{% for k in environ.keys() %} - -{% endfor %} -
keyvalue
{{k}}{{environ[k]}}
- -

Metadata

- - -{% for k in metadata.keys() %} - -{% endfor %} -
keyvalue
{{k}}{{metadata[k]}}
- diff --git a/demo/templates/default-fs.jinja2 b/demo/templates/default-fs.jinja2 deleted file mode 100755 index 09b2c85..0000000 --- a/demo/templates/default-fs.jinja2 +++ /dev/null @@ -1,6 +0,0 @@ - - -{% for f in files.keys() %} - -{% endfor %} -
filetypesizelast change
{{f}}{{files[f].type}}{{files[f].size}}{{files[f].ctime | date}}
diff --git a/demo/templates/default.jinja2 b/demo/templates/default.jinja2 deleted file mode 100755 index 64e5dcc..0000000 --- a/demo/templates/default.jinja2 +++ /dev/null @@ -1,13 +0,0 @@ - - -{{metadata.title}} - - - -{{content}} - - diff --git a/examples/pixywerk.com/Makefile b/examples/pixywerk.com/Makefile index 1816135..00f4b90 100644 --- a/examples/pixywerk.com/Makefile +++ b/examples/pixywerk.com/Makefile @@ -1,2 +1,2 @@ -build: src/templates/* src/* src/images/* src/posts/* +build: src/templates/* src/* src/images/* python -mpixywerk2 src publish diff --git a/examples/pixywerk.com/foo b/examples/pixywerk.com/foo deleted file mode 100644 index e69de29..0000000 diff --git a/examples/pixywerk.com/publish/2019-04-15.html b/examples/pixywerk.com/publish/2019-04-15.html new file mode 100644 index 0000000..de142ce --- /dev/null +++ b/examples/pixywerk.com/publish/2019-04-15.html @@ -0,0 +1,31 @@ + + + Pixywerk2 My first post + + + +
+

Pixywerk2 My first post

+
+ + +

This is an example post!

+

yo fresh

+

There are many posts like it but this one is mine.

+
+ + +
+ + \ No newline at end of file diff --git a/examples/pixywerk.com/publish/atom.xml b/examples/pixywerk.com/publish/atom.xml new file mode 100644 index 0000000..ccb139c --- /dev/null +++ b/examples/pixywerk.com/publish/atom.xml @@ -0,0 +1,14 @@ + + + + + Pixywerk2 RSS Feed + Website Compiler + + + urn:uuid:2cbb1961-b1ca-3b73-a6ce-d2e2feae9ab4 + 2019-05-20T06:32:27.357672+00:00 + + + + \ No newline at end of file diff --git a/examples/pixywerk.com/publish/css/fonts/Bungee-Regular.woff b/examples/pixywerk.com/publish/css/fonts/Bungee-Regular.woff new file mode 100644 index 0000000..212d125 Binary files /dev/null and b/examples/pixywerk.com/publish/css/fonts/Bungee-Regular.woff differ diff --git a/examples/pixywerk.com/publish/css/fonts/Bungee-Regular.woff2 b/examples/pixywerk.com/publish/css/fonts/Bungee-Regular.woff2 new file mode 100644 index 0000000..f72871a Binary files /dev/null and b/examples/pixywerk.com/publish/css/fonts/Bungee-Regular.woff2 differ diff --git a/examples/pixywerk.com/publish/css/fonts/ExpletusSans-Bold.ttf b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-Bold.ttf new file mode 100644 index 0000000..ccc42da Binary files /dev/null and b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-Bold.ttf differ diff --git a/examples/pixywerk.com/publish/css/fonts/ExpletusSans-Bold.woff b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-Bold.woff new file mode 100644 index 0000000..0ce5c9d Binary files /dev/null and b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-Bold.woff differ diff --git a/examples/pixywerk.com/publish/css/fonts/ExpletusSans-Bold.woff2 b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-Bold.woff2 new file mode 100644 index 0000000..6bc2f53 Binary files /dev/null and b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-Bold.woff2 differ diff --git a/examples/pixywerk.com/publish/css/fonts/ExpletusSans-BoldItalic.ttf b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-BoldItalic.ttf new file mode 100644 index 0000000..218a299 Binary files /dev/null and b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-BoldItalic.ttf differ diff --git a/examples/pixywerk.com/publish/css/fonts/ExpletusSans-BoldItalic.woff b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-BoldItalic.woff new file mode 100644 index 0000000..8d1895c Binary files /dev/null and b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-BoldItalic.woff differ diff --git a/examples/pixywerk.com/publish/css/fonts/ExpletusSans-BoldItalic.woff2 b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-BoldItalic.woff2 new file mode 100644 index 0000000..1f14509 Binary files /dev/null and b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-BoldItalic.woff2 differ diff --git a/examples/pixywerk.com/publish/css/fonts/ExpletusSans-Italic.ttf b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-Italic.ttf new file mode 100644 index 0000000..a489cb5 Binary files /dev/null and b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-Italic.ttf differ diff --git a/examples/pixywerk.com/publish/css/fonts/ExpletusSans-Italic.woff b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-Italic.woff new file mode 100644 index 0000000..35b5def Binary files /dev/null and b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-Italic.woff differ diff --git a/examples/pixywerk.com/publish/css/fonts/ExpletusSans-Italic.woff2 b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-Italic.woff2 new file mode 100644 index 0000000..f480e5a Binary files /dev/null and b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-Italic.woff2 differ diff --git a/examples/pixywerk.com/publish/css/fonts/ExpletusSans-Medium.ttf b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-Medium.ttf new file mode 100644 index 0000000..e7def69 Binary files /dev/null and b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-Medium.ttf differ diff --git a/examples/pixywerk.com/publish/css/fonts/ExpletusSans-Medium.woff b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-Medium.woff new file mode 100644 index 0000000..97f82b6 Binary files /dev/null and b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-Medium.woff differ diff --git a/examples/pixywerk.com/publish/css/fonts/ExpletusSans-Medium.woff2 b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-Medium.woff2 new file mode 100644 index 0000000..5ce3add Binary files /dev/null and b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-Medium.woff2 differ diff --git a/examples/pixywerk.com/publish/css/fonts/ExpletusSans-MediumItalic.ttf b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-MediumItalic.ttf new file mode 100644 index 0000000..539e0d8 Binary files /dev/null and b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-MediumItalic.ttf differ diff --git a/examples/pixywerk.com/publish/css/fonts/ExpletusSans-MediumItalic.woff b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-MediumItalic.woff new file mode 100644 index 0000000..805c21c Binary files /dev/null and b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-MediumItalic.woff differ diff --git a/examples/pixywerk.com/publish/css/fonts/ExpletusSans-MediumItalic.woff2 b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-MediumItalic.woff2 new file mode 100644 index 0000000..b0ddf22 Binary files /dev/null and b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-MediumItalic.woff2 differ diff --git a/examples/pixywerk.com/publish/css/fonts/ExpletusSans-Regular.ttf b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-Regular.ttf new file mode 100644 index 0000000..8b028b7 Binary files /dev/null and b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-Regular.ttf differ diff --git a/examples/pixywerk.com/publish/css/fonts/ExpletusSans-Regular.woff b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-Regular.woff new file mode 100644 index 0000000..498a409 Binary files /dev/null and b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-Regular.woff differ diff --git a/examples/pixywerk.com/publish/css/fonts/ExpletusSans-Regular.woff2 b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-Regular.woff2 new file mode 100644 index 0000000..3c3bd08 Binary files /dev/null and b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-Regular.woff2 differ diff --git a/examples/pixywerk.com/publish/css/fonts/ExpletusSans-SemiBold.ttf b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-SemiBold.ttf new file mode 100644 index 0000000..0765fe5 Binary files /dev/null and b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-SemiBold.ttf differ diff --git a/examples/pixywerk.com/publish/css/fonts/ExpletusSans-SemiBold.woff b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-SemiBold.woff new file mode 100644 index 0000000..2eea274 Binary files /dev/null and b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-SemiBold.woff differ diff --git a/examples/pixywerk.com/publish/css/fonts/ExpletusSans-SemiBold.woff2 b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-SemiBold.woff2 new file mode 100644 index 0000000..a846207 Binary files /dev/null and b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-SemiBold.woff2 differ diff --git a/examples/pixywerk.com/publish/css/fonts/ExpletusSans-SemiBoldItalic.ttf b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-SemiBoldItalic.ttf new file mode 100644 index 0000000..e5828bc Binary files /dev/null and b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-SemiBoldItalic.ttf differ diff --git a/examples/pixywerk.com/publish/css/fonts/ExpletusSans-SemiBoldItalic.woff b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-SemiBoldItalic.woff new file mode 100644 index 0000000..e8ce5fa Binary files /dev/null and b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-SemiBoldItalic.woff differ diff --git a/examples/pixywerk.com/publish/css/fonts/ExpletusSans-SemiBoldItalic.woff2 b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-SemiBoldItalic.woff2 new file mode 100644 index 0000000..b343c83 Binary files /dev/null and b/examples/pixywerk.com/publish/css/fonts/ExpletusSans-SemiBoldItalic.woff2 differ diff --git a/examples/pixywerk.com/publish/css/fonts/Teko-Bold.woff b/examples/pixywerk.com/publish/css/fonts/Teko-Bold.woff new file mode 100644 index 0000000..1e4d639 Binary files /dev/null and b/examples/pixywerk.com/publish/css/fonts/Teko-Bold.woff differ diff --git a/examples/pixywerk.com/publish/css/fonts/Teko-Bold.woff2 b/examples/pixywerk.com/publish/css/fonts/Teko-Bold.woff2 new file mode 100644 index 0000000..01de66f Binary files /dev/null and b/examples/pixywerk.com/publish/css/fonts/Teko-Bold.woff2 differ diff --git a/examples/pixywerk.com/publish/css/fonts/Teko-Light.woff b/examples/pixywerk.com/publish/css/fonts/Teko-Light.woff new file mode 100644 index 0000000..ab9a063 Binary files /dev/null and b/examples/pixywerk.com/publish/css/fonts/Teko-Light.woff differ diff --git a/examples/pixywerk.com/publish/css/fonts/Teko-Light.woff2 b/examples/pixywerk.com/publish/css/fonts/Teko-Light.woff2 new file mode 100644 index 0000000..3828576 Binary files /dev/null and b/examples/pixywerk.com/publish/css/fonts/Teko-Light.woff2 differ diff --git a/examples/pixywerk.com/publish/css/fonts/Teko-Medium.woff b/examples/pixywerk.com/publish/css/fonts/Teko-Medium.woff new file mode 100644 index 0000000..bec7247 Binary files /dev/null and b/examples/pixywerk.com/publish/css/fonts/Teko-Medium.woff differ diff --git a/examples/pixywerk.com/publish/css/fonts/Teko-Medium.woff2 b/examples/pixywerk.com/publish/css/fonts/Teko-Medium.woff2 new file mode 100644 index 0000000..790f01a Binary files /dev/null and b/examples/pixywerk.com/publish/css/fonts/Teko-Medium.woff2 differ diff --git a/examples/pixywerk.com/publish/css/fonts/Teko-Regular.woff b/examples/pixywerk.com/publish/css/fonts/Teko-Regular.woff new file mode 100644 index 0000000..61a1901 Binary files /dev/null and b/examples/pixywerk.com/publish/css/fonts/Teko-Regular.woff differ diff --git a/examples/pixywerk.com/publish/css/fonts/Teko-Regular.woff2 b/examples/pixywerk.com/publish/css/fonts/Teko-Regular.woff2 new file mode 100644 index 0000000..01ebcdf Binary files /dev/null and b/examples/pixywerk.com/publish/css/fonts/Teko-Regular.woff2 differ diff --git a/examples/pixywerk.com/publish/css/fonts/Teko-SemiBold.woff b/examples/pixywerk.com/publish/css/fonts/Teko-SemiBold.woff new file mode 100644 index 0000000..41ee7d7 Binary files /dev/null and b/examples/pixywerk.com/publish/css/fonts/Teko-SemiBold.woff differ diff --git a/examples/pixywerk.com/publish/css/fonts/Teko-SemiBold.woff2 b/examples/pixywerk.com/publish/css/fonts/Teko-SemiBold.woff2 new file mode 100644 index 0000000..8a9db8d Binary files /dev/null and b/examples/pixywerk.com/publish/css/fonts/Teko-SemiBold.woff2 differ diff --git a/examples/pixywerk.com/publish/css/icono.min.css b/examples/pixywerk.com/publish/css/icono.min.css new file mode 100644 index 0000000..1a251cb --- /dev/null +++ b/examples/pixywerk.com/publish/css/icono.min.css @@ -0,0 +1 @@ +.icono-areaChart,.icono-barChart,.icono-book,.icono-book:after,.icono-book:before,.icono-bookmarkEmpty,.icono-bookmarkEmpty:before,.icono-camera,.icono-chain:after,.icono-chain:before,.icono-clock,.icono-commentEmpty,.icono-creditCard,.icono-crop,.icono-crop:before,.icono-display,.icono-document,.icono-eye,.icono-file,.icono-flag:after,.icono-flag:before,.icono-folder,.icono-forbidden,.icono-frown,.icono-frown:after,.icono-headphone,.icono-heart,.icono-heart:after,.icono-heart:before,.icono-home,.icono-home:after,.icono-home:before,.icono-imac,.icono-imacBold,.icono-image,.icono-infinity:after,.icono-infinity:before,.icono-iphone,.icono-iphoneBold,.icono-keyboard,.icono-macbook:before,.icono-macbookBold:before,.icono-mail,.icono-mail:before,.icono-market,.icono-market:after,.icono-meh,.icono-meh:after,.icono-microphone,.icono-microphone:before,.icono-mouse,.icono-mouse:before,.icono-nexus,.icono-paperClip,.icono-paperClip:after,.icono-paperClip:before,.icono-piano,.icono-pin,.icono-pin:before,.icono-power,.icono-rename,.icono-ruler,.icono-search,.icono-signIn,.icono-signIn:before,.icono-signOut,.icono-signOut:before,.icono-smile,.icono-smile:after,.icono-stroke,.icono-sync,.icono-tag,.icono-tag:after,.icono-terminal,.icono-trash,.icono-user,.icono-user:before,.icono-video,.icono-volumeHigh:after,.icono-volumeHigh:before,.icono-volumeLow:before,.icono-volumeMedium:before,.icono-youtube,.icono-youtube:before,[class*=icono-check][class*=Circle],[class*=icono-][class*=Circle],[class*=icono-][class*=Square]{border:2px solid}.icono-chain:after,.icono-chain:before,.icono-downArrow:before,.icono-dropper:before,.icono-flickr:after,.icono-flickr:before,.icono-indent:before,.icono-leftArrow:before,.icono-list:before,.icono-outdent:before,.icono-paperClip:before,.icono-rename:before,.icono-rightArrow:before,.icono-upArrow:before,.icono-video:before,.icono-volumeDecrease:after,.icono-volumeDecrease:before,.icono-volumeHigh:after,.icono-volumeHigh:before,.icono-volumeIncrease:after,.icono-volumeIncrease:before,.icono-volumeLow:before,.icono-volumeMedium:before,.icono-volumeMute:after,.icono-volumeMute:before,.stickCenterV{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.icono-cup:after,.icono-display:after,.icono-display:before,.icono-imac:after,.icono-imacBold:after,.icono-imacBold:before,.icono-iphone:after,.icono-iphone:before,.icono-macbook:before,.icono-macbookBold:before,.icono-market:after,.icono-microphone:after,.icono-microphone:before,.icono-mouse:after,.icono-mouse:before,.icono-search:before,.icono-sitemap:after,.icono-sitemap:before,.icono-tag:after,.icono-textAlignCenter[class*=icono-textAlign]:after,.icono-textAlignCenter[class*=icono-textAlign]:before,.icono-trash:before,.icono-user:before,.stickCenterH,[class*=icono-exclamation]:after{position:absolute;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.icono-camera:before,.icono-clock:after,.icono-clock:before,.icono-document:after,.icono-eye:before,.icono-forbidden:before,.icono-gear:before,.icono-gplus:after,.icono-instagram:before,.icono-keyboard:before,.icono-pin:before,.icono-video:after,.icono-youtube:after,.stickCenter,[class*=icono-check]:before,[class*=icono-plus]:after,[class*=icono-plus]:before,[class*=icono-cross]:after,[class*=icono-cross]:before{position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.spin[class*=spin]{-webkit-animation:loading-spinner 2s infinite linear;animation:loading-spinner 2s infinite linear}@-webkit-keyframes loading-spinner{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes loading-spinner{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.icono-icono{width:13px;height:4px;box-shadow:inset 0 0 0 32px,0 16px,17px -18px;-webkit-transform:skew(0,30deg);transform:skew(0,30deg);margin:11px 19px 19px 2px}.icono-icono:before{position:absolute;width:13px;height:4px;box-shadow:inset 0 0 0 32px,0 16px,-17px -17px;right:-17px;top:-10px;-webkit-transform:skew(0,-48deg);transform:skew(0,-48deg)}.icono-icono:after{position:absolute;width:22px;height:15px;left:0;top:-5px;border:4px solid;border-top-color:transparent;border-bottom:none;-webkit-transform:skew(0,-30deg) scaleY(.6);transform:skew(0,-30deg) scaleY(.6)}.icono-home{width:22px;height:16px;border-top:none;margin:15px 6px 3px}.icono-home:before{width:18px;height:18px;-webkit-transform:rotate(45deg);transform:rotate(45deg);position:absolute;left:-2px;top:-7px;border-right-color:transparent;border-bottom-color:transparent}.icono-home:after{width:6px;height:10px;bottom:0;position:absolute;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);border-width:1px;border-bottom:none}.icono-mail{width:28px;height:18px;overflow:hidden;margin:8px 3px}.icono-mail:before{position:absolute;width:25px;height:25px;-webkit-transform:rotate(50deg) skew(-10deg,-20deg);transform:rotate(50deg) skew(-10deg,-20deg);top:-20px;left:-3px}.icono-rss{width:22px;height:22px;overflow:hidden;margin:6px}.icono-rss:after,.icono-rss:before{position:absolute;border-radius:50%}.icono-rss:before{width:6px;height:6px;box-shadow:0 0 32px inset;left:0;bottom:0}.icono-rss:after{width:27px;height:27px;right:15%;top:15%;border:4px solid transparent;box-shadow:inset 0 0 0 2px,0 0 0 2px}.icono-file:before,.icono-heart,.icono-power{border-top-color:transparent}.icono-file:before,.icono-heart:before,.icono-reset:before,.icono-sync,.icono-sync:after,.icono-sync:before{border-right-color:transparent}.icono-document:before,.icono-heart:after,.icono-reset:before{border-bottom-color:transparent}.icono-bars,.icono-hamburger{width:20px;height:2px;box-shadow:inset 0 0 0 32px,0 -6px,0 6px;margin:16px 7px}.icono-power:before,[class*=icono-check]:after,[class*=icono-check]:before,[class*=icono-plus]:after,[class*=icono-plus]:before,[class*=icono-cross]:after,[class*=icono-cross]:before{box-shadow:inset 0 0 0 32px}[class*=icono-plus],[class*=icono-cross]{width:30px;height:30px;margin:2px}[class*=icono-check]:before,[class*=icono-plus]:before,[class*=icono-cross]:before{width:20px;height:2px}[class*=icono-plus]:after,[class*=icono-cross]:after{height:20px;width:2px}[class*=Circle][class*=icono-check]:before,[class*=icono-plus][class*=Circle]:before,[class*=icono-cross][class*=Circle]:before{width:18px}[class*=icono-plus][class*=Circle]:after,[class*=icono-cross][class*=Circle]:after{height:18px}.icono-cross,.icono-crossCircle{-webkit-transform:rotate(45deg);transform:rotate(45deg)}[class*=icono-check]{width:28px;height:28px;margin:3px 0 3px 6px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}[class*=icono-check]:after{position:absolute;height:12px;width:2px;left:4px;bottom:14px}[class*=icono-check][class*=Circle]{border-radius:50%;width:30px;height:30px;margin:2px}[class*=icono-check][class*=Circle]:before{width:14px;top:15px;left:14px}[class*=icono-check][class*=Circle]:after{height:8px;left:7px;bottom:10px}.icono-power{width:22px;height:22px;border-radius:50%;margin:6px}.icono-power:before{position:absolute;top:-15%;left:8px;width:2px;height:60%}.icono-heart{width:20px;height:20px;border-left-color:transparent;-webkit-transform:rotate(45deg);transform:rotate(45deg);border-radius:4px 0;margin:9px 7px 5px}.icono-heart:after,.icono-heart:before{position:absolute}.icono-heart:before{width:8px;height:14px;left:-10px;bottom:-2px;border-radius:20px 0 0 20px}.icono-heart:after{width:14px;height:8px;right:-2px;top:-10px;border-radius:20px 20px 0 0}.icono-infinity{width:32px;height:16px;margin:9px 1px}.icono-infinity:after,.icono-infinity:before{width:10px;height:10px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.icono-infinity:before{left:0;border-radius:32px 0 32px 32px}.icono-infinity:after{right:1px;border-radius:32px 32px 32px 0}.icono-flag{width:22px;height:25px;border-left:3px solid;margin:5px 6px 4px}.icono-flag:after,.icono-flag:before{position:absolute;width:9px;height:8px}.icono-flag:before{left:-2px;top:1px;border-radius:0 2px 0 0;border-right-width:3px}.icono-flag:after{width:5px;left:9px;top:4px;border-left-width:3px;border-radius:2px 2px 0}.icono-file{width:26px;height:32px;border-radius:0 12px 0 0;margin:1px 4px}.icono-file:before{position:absolute;top:-2px;right:-2px;border-style:solid;width:0;height:0;border-width:5px}.icono-document{width:26px;height:32px;border-radius:0 0 0 10px;margin:1px 4px}.icono-document:before{position:absolute;width:0;height:0;left:-3px;bottom:-3px;border-width:5px;border-style:solid;border-left-color:transparent}.icono-folder:after,.icono-folder:before{left:-12px;position:absolute;border-style:solid}.icono-document:after{width:13px;height:2px;box-shadow:inset 0 0 0 32px,0 -5px 0 0,0 5px 0 0}.icono-folder{width:18px;height:22px;border-left-width:0;border-radius:0 3px 3px 0;margin:8px 2px 4px 14px}.icono-folder:before{width:12px;height:20px;bottom:-2px;border-width:0 0 2px 2px;border-radius:0 0 0 3px}.icono-folder:after{width:10px;height:5px;top:-7px;border-width:2px 2px 0;border-radius:3px 3px 0 0}.icono-pin{width:26px;height:26px;border-radius:50% 50% 50% 0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);margin:1px 4px 7px}.icono-pin:before{position:absolute;width:6px;height:6px;border-radius:50%}.icono-frown,.icono-meh,.icono-smile{border-radius:50%;height:30px;width:30px;margin:2px}.icono-frown:before,.icono-meh:before,.icono-smile:before{border-radius:50%;box-shadow:8px 0 0 0,0 0 0 2px inset;height:4px;width:4px;left:7px;position:absolute;top:27%}.icono-frown:after,.icono-meh:after,.icono-smile:after{border-radius:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);border-top-color:transparent;border-left-color:transparent;border-right-color:transparent;height:16px;left:50%;position:absolute;top:6%;width:16px}.icono-eye{border-radius:80% 20%;-webkit-transform:rotate(45deg);transform:rotate(45deg);border-width:2px 1px 1px 2px;height:28px;width:28px;margin:3px}.icono-eye:before{border-radius:50%;box-shadow:0 -3px 0 3px inset;height:11px;width:11px}.icono-sliders{height:30px;width:30px;margin:2px}.icono-sliders:after,.icono-sliders:before{-webkit-transform:translateX(-50%);transform:translateX(-50%);left:50%;position:absolute}.icono-sliders:before{width:8px;height:7px;border-radius:2px;top:67%;box-shadow:inset 0 0 0 32px,10px -10px,-10px -14px}.icono-sliders:after{position:absolute;width:2px;height:100%;box-shadow:inset 0 0 0 32px,10px 0,-10px 0}.icono-share{height:9px;width:9px;border-radius:50%;box-shadow:inset 0 0 0 32px,22px -11px 0 0,22px 11px 0 0;margin:12px 24px 13px 1px}.icono-reset,.icono-sync{border-radius:50%;margin:4px;border-left-color:transparent}.icono-share:after,.icono-share:before{position:absolute;width:24px;height:2px;box-shadow:inset 0 0 0 32px;left:0}.icono-share:before{top:-2px;-webkit-transform:rotate(-25deg);transform:rotate(-25deg)}.icono-share:after{top:9px;-webkit-transform:rotate(25deg);transform:rotate(25deg)}.icono-sync{width:26px;height:26px}.icono-sync:after,.icono-sync:before{position:absolute;width:0;height:0;border-width:6px;border-style:solid;border-bottom-color:transparent;border-left-color:transparent}.icono-sync:before{-webkit-transform:rotate(-45deg);transform:rotate(-45deg);right:-7px;top:0}.icono-sync:after{-webkit-transform:rotate(135deg);transform:rotate(135deg);left:-7px;bottom:0}.icono-reset{width:26px;height:26px;border-width:2px;border-style:solid}.icono-reset:before{position:absolute;width:0;height:0;left:-7px;bottom:0;border-width:6px;border-style:solid;border-left-color:transparent;-webkit-transform:rotate(135deg);transform:rotate(135deg)}.icono-gear{width:32px;height:32px;border:3px dotted;border-radius:50%;margin:1px}.icono-gear:before{width:22px;height:22px;box-shadow:0 0 0 3px,0 0 0 2px inset;border-radius:50%;border:6px solid transparent;box-sizing:border-box}.icono-signIn:before,.icono-signOut:before{position:absolute;top:7px;border-bottom:none;-webkit-transform:rotate(45deg)}.icono-signIn{width:18px;height:32px;border-left:none;border-radius:0 3px 3px 0;margin:1px 8px}.icono-signIn:before{width:11px;height:11px;left:-10px;border-left:none;transform:rotate(45deg);border-radius:0 4px 0 0}.icono-signOut{width:18px;height:32px;border-right:none;border-radius:3px 0 0 3px;margin:1px 8px}.icono-signOut:before{width:11px;height:11px;right:-2px;border-left:none;transform:rotate(45deg);border-radius:0 4px 0 0}.icono-support{width:26px;height:26px;border:5px solid transparent;box-shadow:0 0 0 2px inset,0 0 0 2px;border-radius:50%;margin:4px}.icono-dropper,.icono-youtube:after,.icono-youtube:before{border-top-color:transparent;border-bottom-color:transparent}.icono-support:after,.icono-support:before{width:7px;height:7px;top:-3px;box-shadow:inset 0 0 0 32px,21px 0 0 0;position:absolute}.icono-support:before{left:-3px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.icono-support:after{right:-3px;-webkit-transform:rotate(135deg);transform:rotate(135deg)}.icono-dropper{width:40px;height:14px;border-width:3px;border-style:solid;border-right:none;border-left-color:transparent;box-shadow:-9px 0 0 2px inset,0 0 0 2px inset;border-radius:50% 6px 6px 50%;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);margin:12px -2px 8px -4px}.icono-rename:before,.icono-youtube{border-right-color:transparent;border-left-color:transparent}.icono-dropper:before{width:4px;height:14px;right:10px;box-shadow:inset 0 0 0 32px}.icono-tiles{width:4px;height:4px;box-shadow:0 -8px 0,-8px -8px 0,8px -8px 0,0 0 0 32px inset,-8px 0 0,8px 0 0,0 8px 0,-8px 8px 0,8px 8px 0;margin:15px}.icono-list,.icono-list:before{height:4px;box-shadow:inset 0 0 0 32px,0 -8px 0 0,0 8px 0 0}.icono-list{width:4px;margin:15px 26px 15px 4px}.icono-list:before{width:18px;left:8px}.icono-chain{width:16px;height:2px;box-shadow:inset 0 0 0 32px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);margin:16px 9px}.icono-chain:after,.icono-chain:before{width:12px;height:8px;border-radius:4px}.icono-chain:before{right:-10px}.icono-chain:after{left:-10px}.icono-youtube{border-radius:10px;width:32px;height:22px;margin:6px 1px}.icono-youtube:before{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:6px/3px}.icono-youtube:after{width:0;height:0;border-width:4px 0 4px 8px;border-style:solid}.icono-rename{width:26px;height:10px;border-color:transparent;border-width:3px;box-shadow:0 0 0 1px,11px 0 0 0 inset;margin:12px 4px}.icono-rename:before{width:1px;height:18px;left:9px;border-width:2px 4px;border-style:solid;box-shadow:0 0 0 1px inset}.icono-search{width:22px;height:22px;border-radius:50%;-webkit-transform:rotate(45deg);transform:rotate(45deg);margin:4px 4px 8px 8px}.icono-search:before{width:4px;height:11px;box-shadow:inset 0 0 0 32px;top:19px;border-radius:0 0 1px 1px}.icono-book,.icono-book:before{border-top:none;border-radius:0 0 0 6px}.icono-book{width:26px;height:22px;margin:10px 4px 2px}.icono-book:after,.icono-book:before{width:24px;left:-2px;position:absolute;box-sizing:border-box}.icono-book:before{height:7px;border-right:none;top:-5px}.icono-book:after{height:8px;top:-8px;border-bottom:none;border-radius:6px 0 0}.icono-forbidden{width:28px;height:28px;border-width:3px;border-radius:50%;margin:3px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.icono-forbidden:before{width:24px;height:4px;box-shadow:inset 0 0 0 32px}.icono-trash{width:22px;height:22px;border-radius:0 0 3px 3px;border-top:none;margin:9px 6px 3px}.icono-trash:before{width:8px;height:2px;top:-6px;box-shadow:inset 0 0 0 32px,-10px 2px 0 0,-6px 2px 0 0,0 2px 0 0,6px 2px 0 0,10px 2px 0 0}.icono-keyboard{width:32px;height:22px;border-radius:3px;margin:6px 1px}.icono-keyboard:before{width:2px;height:2px;box-shadow:-2px -4px 0,-6px -4px 0,-10px -4px 0,2px -4px 0,6px -4px 0,8px -4px 0,10px -4px 0,-4px 0 0,-8px 0 0,-10px 0 0,inset 0 0 0 32px,4px 0 0,8px 0 0,10px 0 0,4px 4px 0,2px 4px 0,0 4px 0,-2px 4px 0,-6px 4px 0,-10px 4px 0,6px 4px 0,10px 4px 0}.icono-mouse{width:23px;height:32px;border-radius:11px 11px 12px 12px;margin:1px 5px 1px 6px}.icono-mouse:before{width:1px;height:6px;border-radius:2px;border-color:transparent;border-width:1px;top:5px;box-shadow:0 0 0 1px,0 0 0 2px inset}.icono-mouse:after{width:1px;height:4px;top:0;box-shadow:inset 0 0 0 32px,0 13px 0 0}.icono-user{width:32px;height:14px;border-radius:64px 64px 0 0/64px;margin:18px 1px 2px}.icono-user:before{width:12px;height:12px;top:-20px;border-radius:50%}.icono-crop{width:21px;height:21px;border-left:none;border-bottom:none;margin:9px 9px 4px 4px}.icono-crop:before{position:absolute;width:21px;height:21px;top:-7px;right:-7px;border-top:none;border-right:none;box-sizing:border-box}.icono-imac,.icono-iphone,.icono-macbook:before{border-color:transparent}.icono-crop:after{width:27px;height:1px;position:absolute;top:0;right:0;bottom:12px;left:2px;margin:auto;box-shadow:inset 0 0 0 32px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.icono-image:before,.icono-tag{-webkit-transform:rotate(45deg)}.icono-display{width:26px;height:22px;margin:4px 4px 8px}.icono-display:before{width:4px;height:3px;bottom:-5px;box-shadow:inset 0 0 0 32px}.icono-display:after{width:14px;height:2px;bottom:-6px;box-shadow:inset 0 0 0 32px}.icono-imac{width:28px;height:24px;border-width:2px 2px 6px;border-radius:3px;box-shadow:0 0 0 1px,0 0 0 1px inset;margin:3px 3px 7px}.icono-imac:after,.icono-imac:before,.icono-imacBold:after,.icono-imacBold:before{box-shadow:inset 0 0 0 32px}.icono-imac:before{position:absolute;height:4px;right:-3px;left:-3px;bottom:-6px;border-radius:0 0 3px 3px}.icono-imac:after{width:9px;height:7px;bottom:-12px;border-radius:32px 32px 0 0/64px}.icono-imacBold{width:28px;height:22px;border-radius:4px;margin:4px 3px 8px}.icono-imacBold:before{width:9px;height:7px;bottom:-6px;border-radius:32px 32px 0 0/64px}.icono-imacBold:after{width:24px;height:3px;bottom:0}.icono-iphone{width:19px;height:31px;border-radius:3px;border-width:5px 1px;box-shadow:0 0 0 1px,0 0 0 1px inset;margin:2px 8px 1px 7px}.icono-iphone:after,.icono-iphone:before,.icono-macbook{box-shadow:inset 0 0 0 32px}.icono-iphone:before{width:3px;height:1px;top:-3px}.icono-iphone:after{width:3px;height:3px;bottom:-4px;border-radius:50%}.icono-iphoneBold{width:20px;height:32px;margin:1px 7px;border-radius:4px;border-width:5px 2px}.icono-macbook{width:32px;height:2px;border-radius:0 0 32px 32px/3px;margin:25px 1px 7px}.icono-macbook:before{width:20px;height:14px;bottom:2px;border-width:3px 1px 1px;border-radius:3px 3px 0 0;box-shadow:0 0 0 1px,0 0 0 1px inset}.icono-macbookBold{width:32px;height:2px;box-shadow:inset 0 0 0 32px;margin:25px 1px 7px}.icono-macbookBold:before{width:20px;height:14px;bottom:2px;border-width:3px 2px 1px;border-radius:3px 3px 0 0}.icono-image{width:30px;height:26px;border-radius:3px;overflow:hidden;margin:4px 2px}.icono-image:before{position:absolute;width:20px;height:20px;left:-2px;top:14px;transform:rotate(45deg);box-shadow:inset 0 0 0 32px,10px -6px 0 0}.icono-image:after{position:absolute;width:4px;height:4px;border-radius:50%;box-shadow:inset 0 0 0 32px;top:5px;right:5px}.icono-headphone{width:30px;height:27px;border-bottom-color:transparent;border-radius:32px/32px 32px 16px 16px;margin:2px 2px 5px}.icono-headphone:before{position:absolute;width:4px;height:12px;left:1px;bottom:-4px;border-radius:5px;box-shadow:inset 0 0 0 32px,20px 0 0 0}.icono-music{width:18px;height:6px;-webkit-transform:skewY(-15deg);transform:skewY(-15deg);box-shadow:inset 0 0 0 32px;border-radius:2px 2px 0 0;margin:4px 5px 24px 11px}.icono-music:after,.icono-music:before{box-shadow:inset 0 0 0 32px,16px 0 0 0;position:absolute}.icono-music:before{width:2px;height:16px;left:0;top:4px}.icono-music:after{width:10px;height:8px;left:-8px;top:17px;border-radius:50%}.icono-video{width:20px;height:20px;margin:7px}.icono-video:before{width:3px;height:3px;left:-8px;box-shadow:inset 0 0 0 32px,0 -8px 0 0,0 8px 0 0,29px 0 0 0,29px -8px 0 0,29px 8px 0 0}.icono-video:after{width:0;height:0;border-width:4px 0 4px 6px;border-style:solid;border-top-color:transparent;border-bottom-color:transparent}.icono-nexus{width:21px;height:32px;border-width:3px 1px;border-radius:16px/3px;margin:1px 7px 1px 6px}.icono-microphone{width:22px;height:15px;border-width:0 2px 2px;border-radius:20px/0 0 20px 20px;margin:12px 6px 7px}.icono-microphone:before{width:10px;height:18px;top:-11px;border-radius:20px}.icono-microphone:after{width:2px;height:2px;bottom:-4px;box-shadow:inset 0 0 0 32px,0 2px,0 4px,-2px 4px,-4px 4px,-6px 4px,2px 4px,4px 4px,6px 4px}.icono-asterisk,.icono-asterisk:after,.icono-asterisk:before{width:4px;height:20px;box-shadow:inset 0 0 0 32px;border-radius:1px;margin:7px 15px}.icono-paperClip,.icono-paperClip:before{border-radius:0 16px 16px 0;border-left:none}.icono-asterisk:after,.icono-asterisk:before{position:absolute;margin:0;left:0;top:0}.icono-asterisk:before{-webkit-transform:rotate(-58deg);transform:rotate(-58deg)}.icono-asterisk:after{-webkit-transform:rotate(58deg);transform:rotate(58deg)}.icono-terminal{width:28px;height:24px;margin:5px 3px}.icono-terminal:before{width:5px;height:5px;position:absolute;top:50%;-webkit-transform:translateY(-50%) rotate(45deg);transform:translateY(-50%) rotate(45deg);left:3px;border-width:2px 2px 0 0;border-style:solid}.icono-terminal:after{position:absolute;width:5px;height:0;border-bottom:2px solid;right:6px;bottom:4px}.icono-paperClip{width:24px;height:18px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);margin:5px 0 11px 10px}.icono-paperClip:before{width:18px;height:6px;right:2px}.icono-paperClip:after{position:absolute;width:12px;height:10px;left:-12px;top:-2px;border-right:none;border-radius:16px 0 0 16px}.icono-market{width:32px;height:12px;border-top:none;margin:19px 1px 3px}.icono-market:before{width:6px;height:13px;position:absolute;top:-15px;left:-5px;border-radius:0 0 10px 10px;border-left:none;box-shadow:inset 0 0 0 32px,8px 0 0,16px 0 0,24px 0 0,32px 0 0}.icono-market:after{width:6px;height:6px;bottom:-2px}.icono-clock{width:26px;height:26px;border-radius:50%;margin:4px}.icono-clock:after,.icono-clock:before{top:35%;box-shadow:inset 0 0 0 32px;border-radius:2px}.icono-clock:before{width:2px;height:9px}.icono-clock:after{width:6px;height:2px;-webkit-transform-origin:left center;transform-origin:left center;-webkit-transform:rotate(45deg) translate(1px,2px);transform:rotate(45deg) translate(1px,2px)}[class*=icono-textAlign]{width:28px;height:22px;margin:6px 3px}[class*=icono-textAlign]:after,[class*=icono-textAlign]:before{position:absolute;height:2px;box-shadow:inset 0 0 0 32px,0 8px 0 0,0 16px 0 0;right:0}[class*=icono-textAlign]:before{width:28px;top:0}[class*=icono-textAlign]:after{width:18px;top:4px}[class*=icono-textAlign].icono-textAlignLeft:after,[class*=icono-textAlign].icono-textAlignLeft:before{left:0}[class*=icono-exclamation]{overflow:visible;width:30px;border-bottom:2px solid;border-radius:0 0 4px 4px;margin:26px 2px 6px}[class*=icono-exclamation]:before{position:absolute;width:26px;height:26px;left:1px;top:-14px;border-width:2px 0 0 2px;border-style:solid;border-radius:4px 0;-webkit-transform:rotate(45deg) skew(12deg,12deg);transform:rotate(45deg) skew(12deg,12deg)}[class*=icono-exclamation]:after{width:4px;height:3px;top:-14px;box-shadow:inset 0 0 0 32px,0 3px,0 8px}[class*=icono-exclamation][class*=Circle]{height:30px;margin:2px}[class*=icono-exclamation][class*=Circle]:before{display:none}[class*=icono-exclamation][class*=Circle]:after{box-shadow:inset 0 0 0 32px,0 3px,0 5px,0 10px;top:6px}.icono-frown:after{-webkit-transform:translateX(-50%) rotate(180deg);transform:translateX(-50%) rotate(180deg);-webkit-transform-origin:center 85%;transform-origin:center 85%}.icono-meh:after{top:0;width:12px;border-left-width:0;border-right-width:0;border-radius:0}.icono-indent,.icono-outdent{width:20px;height:16px;border-width:4px 0 4px 8px;border-style:solid;border-color:transparent;box-shadow:0 -2px,0 2px,inset 0 2px,inset 0 -2px;margin:9px 7px}.icono-indent:before,.icono-outdent:before{left:-8px;border:5px solid;border-top-color:transparent;border-bottom-color:transparent;border-right-width:0}.icono-outdent:before{border-left-width:0;border-right-width:5px}.icono-locationArrow{width:32px;height:32px;margin:1px}.icono-locationArrow:before{position:absolute;left:7px;top:16px;border-width:6px 0 6px 6px;border-style:solid;border-left-color:transparent;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.icono-locationArrow:after{position:absolute;top:10px;left:2px;border-width:10px;border-style:solid;border-bottom-color:transparent;border-left-color:transparent;-webkit-transform:skew(-30deg,-30deg);transform:skew(-30deg,-30deg)}.icono-comment:before,.icono-commentEmpty:before{-webkit-transform:rotate(-45deg);position:absolute}.icono-commentEmpty{width:30px;height:22px;border-radius:4px 4px 7px 7px;border-bottom-color:transparent;margin:5px 2px 7px}.icono-commentEmpty:before{width:6px;height:6px;border-width:0 0 2px 2px;border-style:solid;transform:rotate(-45deg);bottom:-4px;left:6px}.icono-commentEmpty:after{position:absolute;width:8px;height:2px;border-width:0 12px 0 6px;border-style:solid;bottom:0;left:0}.icono-comment{width:30px;height:20px;box-shadow:inset 0 0 0 32px;border-radius:4px;margin:5px 2px 9px}.icono-comment:before{width:8px;height:8px;box-shadow:inset 0 0 0 32px;transform:rotate(-45deg);bottom:-4px;left:6px}.icono-areaChart,.icono-barChart{width:30px;height:22px;margin:4px 0 8px 4px;overflow:hidden}.icono-areaChart{border-top-width:0;border-right-width:0;border-color:transparent;box-shadow:-2px 2px}.icono-areaChart:before{position:absolute;left:0;bottom:7px;border:6px solid transparent;border-bottom-color:currentColor;box-shadow:0 7px}.icono-areaChart:after{position:absolute;left:11px;bottom:4px;border-width:0 6px 13px;border-style:solid;border-color:transparent transparent currentColor;box-shadow:0 4px}.icono-barChart{border-top-width:0;border-right-width:0;border-color:transparent;box-shadow:-2px 2px}.icono-barChart:before{position:absolute;left:0;bottom:0;width:4px;height:15px;box-shadow:inset 0 -8px 0 0,6px 0,12px 7px,18px 5px}.icono-pieChart{width:0;height:0;border:15px solid;border-right-color:transparent;border-radius:50%;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);margin:2px}.icono-pieChart:before{position:absolute;width:0;height:0;left:-11px;top:-14px;border:14px solid;border-left-color:transparent;border-bottom-color:transparent;border-top-color:transparent;border-radius:50%}.icono-bookmark{width:0;height:0;border:9px solid;border-bottom-color:transparent;box-shadow:0 -4px;border-radius:3px 3px 0 0;margin:10px 8px 6px}.icono-bookmarkEmpty{width:18px;height:22px;border-bottom:none;border-radius:3px 3px 2px 2px;overflow:hidden;margin:6px 8px}.icono-bookmarkEmpty:before{position:absolute;width:12px;height:12px;bottom:0;left:0;border-right:none;border-bottom:none;-webkit-transform:rotate(45deg) translate(35%,35%);transform:rotate(45deg) translate(35%,35%)}.icono-filter{width:0;height:0;border:10px solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent;padding:3px;box-shadow:inset 0 7px;margin:9px 4px}.icono-volume,.icono-volumeDecrease,.icono-volumeHigh,.icono-volumeIncrease,.icono-volumeLow,.icono-volumeMedium,.icono-volumeMute{width:0;height:0;border:7px solid;border-left:none;border-top-color:transparent;border-bottom-color:transparent;padding:6px 3px;box-shadow:inset 4px 0;margin:4px 10px 4px 11px}.icono-volumeHigh,.icono-volumeLow,.icono-volumeMedium{margin:4px 14px 4px 7px}.icono-volumeHigh:after,.icono-volumeHigh:before,.icono-volumeLow:before,.icono-volumeMedium:before{width:15px;height:15px;position:absolute;border-radius:50%;border-top-color:transparent;border-bottom-color:transparent;border-left-color:transparent;left:2px}.icono-volumeHigh,.icono-volumeMedium{margin:4px 16px 4px 5px}.icono-volumeHigh:before,.icono-volumeMedium:before{border-style:double;border-width:6px;left:-2px}.icono-volumeHigh{margin:4px 18px 4px 3px}.icono-volumeHigh:after{width:32px;height:32px;left:-7px}.icono-volumeDecrease,.icono-volumeIncrease,.icono-volumeMute{margin:4px 16px 4px 5px}.icono-volumeDecrease:after,.icono-volumeDecrease:before,.icono-volumeIncrease:after,.icono-volumeIncrease:before,.icono-volumeMute:after,.icono-volumeMute:before{box-shadow:inset 0 0 0 32px}.icono-volumeDecrease:before,.icono-volumeIncrease:before,.icono-volumeMute:before{width:10px;height:2px;left:17px}.icono-volumeIncrease:after,.icono-volumeMute:after{height:10px;width:2px;left:21px}.icono-volumeMute:after,.icono-volumeMute:before{-webkit-transform:translateY(-50%) rotate(45deg);transform:translateY(-50%) rotate(45deg)}.icono-tag{width:18px;height:24px;border-radius:6px 6px 4px 4px;border-top:none;transform:rotate(45deg);margin:5px 8px}.icono-tag:before{position:absolute;top:-4px;left:1px;width:10px;height:10px;border-width:2px 0 0 2px;border-style:solid;-webkit-transform:rotate(45deg);transform:rotate(45deg);border-radius:5px 0 0}.icono-tag:after{top:1px;width:3px;height:3px;border-radius:50%}.icono-calendar{width:32px;height:28px;border-width:4px 2px 2px;border-style:solid;border-radius:4px;margin:5px 1px 1px}.icono-calendar:before{position:absolute;width:4px;height:4px;top:3px;left:3px;box-shadow:inset 0 0 0 32px,6px 0,12px 0,18px 0,0 6px,6px 6px,12px 6px,18px 6px,0 12px,6px 12px,12px 12px,18px 12px}.icono-calendar:after{position:absolute;width:4px;height:8px;box-shadow:inset 0 0 0 32px,16px 0;border-radius:4px;top:-8px;left:4px}.icono-camera{width:32px;height:24px;border-radius:4px;margin:5px 1px}.icono-camera:before{width:10px;height:10px;border:1px solid transparent;box-shadow:inset 0 0 0 1px,0 0 0 2px;border-radius:50%}.icono-camera:after{position:absolute;width:4px;height:2px;right:2px;top:2px;box-shadow:inset 0 0 0 32px}.icono-piano{width:31px;height:22px;margin:6px 1px}.icono-piano:before{position:absolute;left:4px;top:0;width:1px;height:100%;box-shadow:-1px 0,3px 0,7px 0,11px 0,15px 0,19px 0}.icono-piano:after{position:absolute;width:3px;height:13px;left:4px;top:0;box-shadow:inset 1px 0,inset -1px 0,-2px 0,2px 0,10px 0,14px 0,18px 0}.icono-ruler{width:27px;height:12px;margin:11px 4px 11px 3px}.icono-ruler:before{position:absolute;width:1px;height:4px;box-shadow:inset 0 0 0 32px,6px 0,12px 0;left:5px;top:0}.icono-ruler:after{position:absolute;width:1px;height:2px;box-shadow:inset 0 0 0 32px,2px 0,6px 0,8px 0,12px 0,14px 0,18px 0,20px 0;left:1px;top:0}.icono-facebook{width:9px;height:26px;box-shadow:inset 2px 4px 0 0;border-left:3px solid;border-radius:5px 0 0;margin:4px 11px 4px 14px}.icono-facebook:before{position:absolute;top:9px;left:-6px;width:11px;height:0;border-top:4px solid;border-right:1px solid transparent}.icono-twitter{width:14px;height:23px;border-radius:0 0 0 8px;box-shadow:-6px 2px 0 0;margin:4px 7px 7px 13px}.icono-twitter:before{position:absolute;bottom:-2px;left:-6px;width:17px;height:6px;border-radius:0 0 0 8px;box-shadow:inset 4px -6px,0 -11px}.icono-twitter:after{position:absolute;width:6px;height:6px;box-shadow:inset 0 0 0 32px,13px 8px,13px 19px;border-radius:50%;left:-6px}.icono-gplus{width:10px;height:2px;box-shadow:inset 0 0 0 32px;margin:14px 4px 18px 20px}.icono-gplus:before{position:absolute;top:-5px;right:10px;content:"g"!important;font-family:georgia;font-size:32px;text-indent:0;line-height:0}.icono-gplus:after{width:2px;height:10px;box-shadow:inset 0 0 0 32px}.icono-linkedIn{width:5px;height:16px;box-shadow:inset 0 0 0 32px,8px 0;margin:12px 24px 6px 5px}.icono-linkedIn:before{position:absolute;width:5px;height:5px;box-shadow:inset 0 0 0 32px;top:-7px;left:0;border-radius:50%}.icono-linkedIn:after{position:absolute;width:12px;height:16px;border-right:1px solid;left:11px;bottom:0;border-radius:8px 5px 0 0/11px 5px 0 0;box-shadow:inset -4px 4px}.icono-instagram{width:26px;height:26px;box-shadow:inset 0 0 0 2px;border-radius:4px;margin:4px}.icono-instagram:before{width:10px;height:10px;border-radius:50%;box-shadow:0 0 0 3px}.icono-instagram:after{position:absolute;width:5px;height:5px;border-radius:1px;right:3px;top:3px;box-shadow:0 0 0 2px,1px 1px 0 2px,-5px -1px 0 1px,-10px -1px 0 1px,-16px 1px 0 2px}.icono-flickr{width:24px;height:24px;overflow:hidden;border-radius:4px;margin:5px}.icono-flickr:after,.icono-flickr:before{width:7px;height:7px;border-radius:50%}.icono-flickr:before{left:4px;box-shadow:0 0 0 1px,0 -10px 0 6px,0 10px 0 6px,-4px 0 0 3px}.icono-flickr:after{right:4px;box-shadow:0 0 0 1px,0 -10px 0 6px,0 10px 0 6px,4px 0 0 3px}.icono-delicious{width:24px;height:24px;overflow:hidden;border-radius:4px;box-shadow:inset 0 0 0 2px;margin:5px}.icono-delicious:before{position:absolute;width:12px;height:12px;box-shadow:inset 0 0 0 32px,12px -12px 0 0;left:0;bottom:0}.icono-codepen{width:2px;height:10px;box-shadow:inset 0 0 0 32px,0 15px,-11px 7px,11px 7px;margin:4px 16px 20px}.icono-codepen:after,.icono-codepen:before{top:3px;width:11px;height:4px;position:absolute}.icono-codepen:before{right:2px;-webkit-transform:skew(0,-35deg) scaleY(.6);transform:skew(0,-35deg) scaleY(.6);box-shadow:inset 0 0 0 32px,0 13px,11px 26px,12px 39px}.icono-codepen:after{left:2px;-webkit-transform:skew(0,35deg) scaleY(.6);transform:skew(0,35deg) scaleY(.6);box-shadow:inset 0 0 0 32px,0 13px,-11px 26px,-12px 39px}.icono-blogger{width:24px;height:14px;border-radius:0 0 7px 7px;margin:14px 5px 6px}.icono-blogger,.icono-blogger:before{border-width:6px;border-style:solid}.icono-blogger:before{position:absolute;width:8px;height:2px;left:-6px;top:-15px;border-radius:6px 6px 0 0}.icono-disqus{width:31px;height:31px;box-shadow:inset 0 0 0 32px;border-radius:50%;margin:1px 1px 2px 2px}.icono-disqus:before{position:absolute;width:0;height:0;border:5px solid transparent;border-top:10px solid;-webkit-transform:rotate(50deg);transform:rotate(50deg);left:-5px;top:20px}.icono-dribbble{width:26px;height:26px;border-radius:50%;box-shadow:inset 0 0 0 2px;overflow:hidden;position:relative;background-image:radial-gradient(50% 100%,transparent 0,transparent 9px,currentColor 10px,currentColor 11px,transparent 12px);background-repeat:no-repeat;background-position:-8px center;-webkit-transform:rotate(-25deg);transform:rotate(-25deg);margin:4px}.icono-dribbble:after,.icono-dribbble:before{position:absolute;border-radius:50%;border:2px solid;width:40px;height:30px}.icono-dribbble:after{top:14px;left:-7px;width:32px}.icono-dribbble:before{left:-6px;top:-23px}.icono-creditCard{width:32px;height:24px;border-radius:3px;margin:5px 1px}.icono-creditCard:before{position:absolute;top:4px;width:100%;height:6px;box-shadow:inset 0 0 0 32px}.icono-creditCard:after{left:3px;bottom:3px;position:absolute;width:4px;height:2px;box-shadow:inset 0 0 0 32px,6px 0}.icono-cup{width:22px;height:16px;box-shadow:inset 0 0 0 32px;border-radius:0 0 5px 5px;margin:6px 6px 12px}.icono-cup:before{position:absolute;right:-3px;top:4px;width:5px;height:5px;border-radius:50%;box-shadow:0 0 0 2px}.icono-cup:after{bottom:-5px;width:26px;height:3px;border-radius:0 0 3px 3px;box-shadow:inset 0 0 0 32px}.icono-play{width:0;height:0;border-width:10px 0 10px 16px;border-style:solid;border-top-color:transparent;border-bottom-color:transparent;margin:7px 9px}.icono-pause{width:6px;height:20px;margin:7px 20px 7px 8px;box-shadow:inset 0 0 0 32px,12px 0 0 0}.icono-stop{width:0;height:0;border:10px solid;margin:7px}.icono-rewind{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.icono-forward,.icono-rewind{width:0;height:0;border:10px solid transparent;border-left:10px solid;margin:7px}.icono-forward:before,.icono-rewind:before{position:absolute;left:0;top:-10px;width:0;height:0;border:10px solid transparent;border-left:10px solid}.icono-next,.icono-previous{width:0;height:0;border:10px solid transparent;border-left:10px solid;border-right:none;margin:7px 14px 7px 10px;box-shadow:4px 0}.icono-previous{-webkit-transform:rotate(180deg);transform:rotate(180deg);margin:7px 10px 7px 14px}.icono-caretDown,.icono-caretDownCircle,.icono-caretDownSquare,.icono-caretLeft,.icono-caretLeftCircle,.icono-caretLeftSquare,.icono-caretRight,.icono-caretRightCircle,.icono-caretRightSquare,.icono-caretUp,.icono-caretUpCircle,.icono-caretUpSquare{width:12px;height:20px;margin:7px 11px}.icono-caretDown:after,.icono-caretDown:before,.icono-caretDownCircle:after,.icono-caretDownCircle:before,.icono-caretDownSquare:after,.icono-caretDownSquare:before,.icono-caretLeft:after,.icono-caretLeft:before,.icono-caretLeftCircle:after,.icono-caretLeftCircle:before,.icono-caretLeftSquare:after,.icono-caretLeftSquare:before,.icono-caretRight:after,.icono-caretRight:before,.icono-caretRightCircle:after,.icono-caretRightCircle:before,.icono-caretRightSquare:after,.icono-caretRightSquare:before,.icono-caretUp:after,.icono-caretUp:before,.icono-caretUpCircle:after,.icono-caretUpCircle:before,.icono-caretUpSquare:after,.icono-caretUpSquare:before{width:14px;height:2px;position:absolute;top:0;bottom:0;margin:auto 0;right:2px;box-shadow:inset 0 0 0 32px;-webkit-transform-origin:right;transform-origin:right}.icono-caretDown:before,.icono-caretDownCircle:before,.icono-caretDownSquare:before,.icono-caretLeft:before,.icono-caretLeftCircle:before,.icono-caretLeftSquare:before,.icono-caretRight:before,.icono-caretRightCircle:before,.icono-caretRightSquare:before,.icono-caretUp:before,.icono-caretUpCircle:before,.icono-caretUpSquare:before{-webkit-transform:rotate(45deg);transform:rotate(45deg)}.icono-caretDown:after,.icono-caretDownCircle:after,.icono-caretDownSquare:after,.icono-caretLeft:after,.icono-caretLeftCircle:after,.icono-caretLeftSquare:after,.icono-caretRight:after,.icono-caretRightCircle:after,.icono-caretRightSquare:after,.icono-caretUp:after,.icono-caretUpCircle:after,.icono-caretUpSquare:after{-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.icono-caretLeft,.icono-caretLeftCircle,.icono-caretLeftSquare{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.icono-caretUp,.icono-caretUpCircle,.icono-caretUpSquare{-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.icono-caretDown,.icono-caretDownCircle,.icono-caretDownSquare{-webkit-transform:rotate(90deg);transform:rotate(90deg)}[class*=icono-caret][class*=Circle]:after,[class*=icono-caret][class*=Circle]:before,[class*=icono-caret][class*=Square]:after,[class*=icono-caret][class*=Square]:before{width:11px;right:8px}.icono-downArrow,.icono-leftArrow,.icono-rightArrow,.icono-upArrow{width:16px;height:4px;margin:15px 9px;box-shadow:inset 0 0 0 2px;-webkit-transform:translateX(-3px);transform:translateX(-3px)}.icono-moon,.icono-sun{width:22px;height:22px;margin:6px}.icono-downArrow:before,.icono-leftArrow:before,.icono-rightArrow:before,.icono-upArrow:before{border-style:solid;border-width:8px 0 8px 8px;border-color:transparent;border-left-color:inherit;left:100%;right:auto}.icono-leftArrow{-webkit-transform:translateX(3px) rotate(180deg);transform:translateX(3px) rotate(180deg)}.icono-upArrow{-webkit-transform:translateY(3px) rotate(-90deg);transform:translateY(3px) rotate(-90deg)}.icono-downArrow{-webkit-transform:translateY(-3px) rotate(90deg);transform:translateY(-3px) rotate(90deg)}.icono-sun{border:2px solid;border-radius:50%;box-shadow:-15px 0 0 -9px,15px 0 0 -9px,0 -15px 0 -9px,0 15px 0 -9px,11px 11px 0 -9px,-11px -11px 0 -9px,11px -11px 0 -9px,-11px 11px 0 -9px}.icono-moon{border-radius:50%;overflow:hidden}.icono-moon:before{position:absolute;width:20px;height:20px;top:-2px;left:6px;border-radius:50%;box-shadow:0 0 0 32px}.icono-cart{width:22px;height:0;border-width:14px 6px 0 2px;border-style:solid;border-right-color:transparent;border-left-color:transparent;margin:9px 3px 11px 9px}.icono-cart:before{position:absolute;width:4px;height:4px;border-radius:50%;box-shadow:inset 0 0 0 32px,13px 0,-4px -20px 0 1px;top:2px;left:-3px}.icono-sitemap{width:24px;height:2px;box-shadow:0 -5px;margin:21px 5px 11px}.icono-sitemap:before{width:6px;height:6px;border-radius:2px;box-shadow:inset 0 0 0 32px,11px 0,-11px 0,0 -14px 0 1px}.icono-sitemap:after{width:2px;height:10px;box-shadow:0 -7px,11px -5px,-11px -5px}.icono-circle{width:22px;height:22px;border:2px solid;border-radius:50%;margin:6px}.icono-ellipsis{width:4px;height:4px;box-shadow:0 -8px 0,0 0 0 32px inset,0 8px 0;margin:15px}.icono-spinner{width:22px;height:22px;border-radius:50%;box-shadow:-16px 0 0 -9px,-11px -11px 0 -9px,0 -16px 0 -9px,11px -11px 0 -8px,16px 0 0 -7px,11px 11px 0 -7px,0 16px 0 -7px,-11px 11px 0 -7px;margin:7px}.icono-bluetooth{width:3px;height:26px;box-shadow:inset 0 0 0 32px;margin:4px 15px 4px 16px}.icono-bluetooth:after,.icono-bluetooth:before{position:absolute;width:18px;height:8px;border-width:3px 3px 3px 0;border-style:solid;border-top-color:transparent;top:2px;left:-13px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.icono-bluetooth:after{top:10px;-webkit-transform:rotate(45deg) rotateX(180deg);transform:rotate(45deg) rotateX(180deg)}[class*=icono-]{display:inline-block;vertical-align:middle;position:relative;font-style:normal;color:currentColor;text-align:left;text-indent:-9999px;direction:ltr}[class*=icono-]:after,[class*=icono-]:before{content:'';pointer-events:none}[class*=icono-][class*=Circle]{border-radius:50%;width:30px;height:30px;margin:2px}[class*=icono-][class*=Square]{border-radius:4px;width:30px;height:30px;margin:2px}[class*=icono-],[class*=icono-] *{box-sizing:border-box} \ No newline at end of file diff --git a/examples/pixywerk.com/publish/css/main.css b/examples/pixywerk.com/publish/css/main.css index cd7f0d6..05b7f22 100644 --- a/examples/pixywerk.com/publish/css/main.css +++ b/examples/pixywerk.com/publish/css/main.css @@ -1,3 +1,344 @@ +@font-face { + font-family: 'Expletus Sans'; + src: url('fonts/ExpletusSans-Bold.woff2') format('woff2'), + url('fonts/ExpletusSans-Bold.woff') format('woff'); + font-style: regular; + font-weight: 700; +} -body { margin: 10% 10% 0 10% } \ No newline at end of file +@font-face { + font-family: 'Expletus Sans'; + src: url('fonts/ExpletusSans-BoldItalic.woff2') format('woff2'), + url('fonts/ExpletusSans-BoldItalic.woff') format('woff'); + font-style: italic; + font-weight: 700; +} + + +@font-face { + font-family: 'Expletus Sans'; + src: url('fonts/ExpletusSans-Italic.woff2') format('woff2'), + url('fonts/ExpletusSans-Italic.woff') format('woff'); + font-style: italic; + font-weight: 400; +} + + +@font-face { + font-family: 'Expletus Sans'; + src: url('fonts/ExpletusSans-Medium.woff2') format('woff2'), + url('fonts/ExpletusSans-Medium.woff') format('woff'); + font-style: regular; + font-weight: 500; +} + + +@font-face { + font-family: 'Expletus Sans'; + src: url('fonts/ExpletusSans-MediumItalic.woff2') format('woff2'), + url('fonts/ExpletusSans-MediumItalic.woff') format('woff'); + font-style: italic; + font-weight: 500; +} + + +@font-face { + font-family: 'Expletus Sans'; + src: url('fonts/ExpletusSans-Regular.woff2') format('woff2'), + url('fonts/ExpletusSans-Regular.woff') format('woff'); + font-style: regular; + font-weight: 400; +} + + +@font-face { + font-family: 'Expletus Sans'; + src: url('fonts/ExpletusSans-SemiBold.woff2') format('woff2'), + url('fonts/ExpletusSans-SemiBold.woff') format('woff'); + font-style: regular; + font-weight: 600; +} + + +@font-face { + font-family: 'Expletus Sans'; + src: url('fonts/ExpletusSans-SemiBoldItalic.woff2') format('woff2'), + url('fonts/ExpletusSans-SemiBoldItalic.woff') format('woff'); + font-style: italic; + font-weight: 600; +} + +@font-face { + font-family: 'Teko'; + src: url('fonts/Teko-Bold.woff2') format('woff2'), + url('fonts/Teko-Bold.woff') format('woff'); + font-style: regular; + font-weight: 700; +} + + +@font-face { + font-family: 'Teko Light'; + src: url('fonts/Teko-Light.woff2') format('woff2'), + url('fonts/Teko-Light.woff') format('woff'); + font-style: regular; + font-weight: 300; +} + + +@font-face { + font-family: 'Teko Medium'; + src: url('fonts/Teko-Medium.woff2') format('woff2'), + url('fonts/Teko-Medium.woff') format('woff'); + font-style: regular; + font-weight: 500; +} + + +@font-face { + font-family: 'Teko'; + src: url('fonts/Teko-Regular.woff2') format('woff2'), + url('fonts/Teko-Regular.woff') format('woff'); + font-style: regular; + font-weight: 400; +} + + +@font-face { + font-family: 'Teko SemiBold'; + src: url('fonts/Teko-SemiBold.woff2') format('woff2'), + url('fonts/Teko-SemiBold.woff') format('woff'); + font-style: regular; + font-weight: 600; +} + +body { margin: 0; font-family: Teko; font-size: 24pt; } +h1, h2, h3, h4 { font-family: 'Expletus Sans'; font-weight: 700 } +h1 { font-size: 150%; border-bottom: solid 1px black; } +h2 { font-size: 125%; } +h3 { font-size: 115%; } +h4 { font-size: 100%; } + +.container { + height: 100%; + width: 100%; + display: grid; + grid-template-columns: 220px auto auto; + grid-template-rows: auto auto auto auto; +} + +header { + border: 0; + padding-left: 20px; + height: 60px; + grid-column: 1 / 4; + background: black; + color: white; +} + +header h1 { font-size: 18pt; border: none} + +nav { + grid-row: 2 / 5; + grid-column: 1; +} + +nav ul { + padding: 0; +} + +nav ul li { + list-style-type: none; + padding: 1px 20px 1px 20px; +} + +nav ul li:hover { + background: black; + color: white; +} + +nav ul li:hover img { + filter: invert(1); +} + +nav ul li a { + color: black; + text-decoration: none; +} + +nav ul li:hover a:hover { + color: white; + text-decoration: underline; +} + +nav ul li a:visited { + color: inherit; +} + +article { + grid-row: 2 / 5; + grid-column: 2 / 4; + margin: 0 20px 0 20px; +} + +footer { + font-size: 12pt; + grid-column: 1 / 4; + grid-row: 5; + background: black; + color: white; + padding-top: 10px; + padding-left: 20px; +} + +.post div.featured { + max-height: 250px; + max-width: 100%; + overflow: hidden; + position: relative; + padding: 0; +} + +.post div.featured img.featured { + max-width: initial; + width: 100%; +} + +.post div.featured h1 { + position: absolute; + bottom: 0px; + left: 0; + color: white; + border: 0; + padding: 10px 30px 10px 30px; + background: rgba(0,0,0,0.5); + margin-top: 0.5em; + margin-bottom: 0.5em; + font-variant: small-caps; +} + +.post div.byline { + margin-left: 30px; + font-size: 0.75em; + line-height: 0.75em; +} + +.post div.article { + margin-left: 30Px; +} + +.post div.article p { + margin-top: 0.5em; + margin-bottom: 0.5em; +} + +.postgrid { + display: grid; + grid-template-columns: minmax(300px, 33%) minmax(300px, 33%) minmax(300px, 33%); + margin-bottom: 30px; + column-gap: 10px; + row-gap: 10px; +} + +.postgrid-item { + height: 200px; + max-height: 200px; + max-width: 100%; + overflow: hidden; + position: relative; +} + +.postgrid-item a img.featured { + max-width: 100%; +} + + +.postgrid-item a div { + position: absolute; + left: 0; + bottom: 0; + color: white; + border: 0; + padding: 10px 30px 10px 30px; + background: rgba(0,0,0,0.5); + margin-top: 0.5em; + margin-bottom: 0.5em; + font-variant: small-caps; +} + +.hll { background-color: #ffffcc } +.c { color: #008800; font-style: italic } /* Comment */ +.err { border: 1px solid #FF0000 } /* Error */ +.k { color: #AA22FF; font-weight: bold } /* Keyword */ +.o { color: #666666 } /* Operator */ +.ch { color: #008800; font-style: italic } /* Comment.Hashbang */ +.cm { color: #008800; font-style: italic } /* Comment.Multiline */ +.cp { color: #008800 } /* Comment.Preproc */ +.cpf { color: #008800; font-style: italic } /* Comment.PreprocFile */ +.c1 { color: #008800; font-style: italic } /* Comment.Single */ +.cs { color: #008800; font-weight: bold } /* Comment.Special */ +.gd { color: #A00000 } /* Generic.Deleted */ +.ge { font-style: italic } /* Generic.Emph */ +.gr { color: #FF0000 } /* Generic.Error */ +.gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.gi { color: #00A000 } /* Generic.Inserted */ +.go { color: #888888 } /* Generic.Output */ +.gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.gs { font-weight: bold } /* Generic.Strong */ +.gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.gt { color: #0044DD } /* Generic.Traceback */ +.kc { color: #AA22FF; font-weight: bold } /* Keyword.Constant */ +.kd { color: #AA22FF; font-weight: bold } /* Keyword.Declaration */ +.kn { color: #AA22FF; font-weight: bold } /* Keyword.Namespace */ +.kp { color: #AA22FF } /* Keyword.Pseudo */ +.kr { color: #AA22FF; font-weight: bold } /* Keyword.Reserved */ +.kt { color: #00BB00; font-weight: bold } /* Keyword.Type */ +.m { color: #666666 } /* Literal.Number */ +.s { color: #BB4444 } /* Literal.String */ +.na { color: #BB4444 } /* Name.Attribute */ +.nb { color: #AA22FF } /* Name.Builtin */ +.nc { color: #0000FF } /* Name.Class */ +.no { color: #880000 } /* Name.Constant */ +.nd { color: #AA22FF } /* Name.Decorator */ +.ni { color: #999999; font-weight: bold } /* Name.Entity */ +.ne { color: #D2413A; font-weight: bold } /* Name.Exception */ +.nf { color: #00A000 } /* Name.Function */ +.nl { color: #A0A000 } /* Name.Label */ +.nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.nt { color: #008000; font-weight: bold } /* Name.Tag */ +.nv { color: #B8860B } /* Name.Variable */ +.ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.w { color: #bbbbbb } /* Text.Whitespace */ +.mb { color: #666666 } /* Literal.Number.Bin */ +.mf { color: #666666 } /* Literal.Number.Float */ +.mh { color: #666666 } /* Literal.Number.Hex */ +.mi { color: #666666 } /* Literal.Number.Integer */ +.mo { color: #666666 } /* Literal.Number.Oct */ +.sa { color: #BB4444 } /* Literal.String.Affix */ +.sb { color: #BB4444 } /* Literal.String.Backtick */ +.sc { color: #BB4444 } /* Literal.String.Char */ +.dl { color: #BB4444 } /* Literal.String.Delimiter */ +.sd { color: #BB4444; font-style: italic } /* Literal.String.Doc */ +.s2 { color: #BB4444 } /* Literal.String.Double */ +.se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */ +.sh { color: #BB4444 } /* Literal.String.Heredoc */ +.si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */ +.sx { color: #008000 } /* Literal.String.Other */ +.sr { color: #BB6688 } /* Literal.String.Regex */ +.s1 { color: #BB4444 } /* Literal.String.Single */ +.ss { color: #B8860B } /* Literal.String.Symbol */ +.bp { color: #AA22FF } /* Name.Builtin.Pseudo */ +.fm { color: #00A000 } /* Name.Function.Magic */ +.vc { color: #B8860B } /* Name.Variable.Class */ +.vg { color: #B8860B } /* Name.Variable.Global */ +.vi { color: #B8860B } /* Name.Variable.Instance */ +.vm { color: #B8860B } /* Name.Variable.Magic */ +.il { color: #666666 } /* Literal.Number.Integer.Long */ + +div.code { + font-size: 0.5em; + border: 1px black solid; + padding: 1em; + margin: 0 1em 0 1em; +} \ No newline at end of file diff --git a/examples/pixywerk.com/publish/images/2019-05-16.png b/examples/pixywerk.com/publish/images/2019-05-16.png new file mode 100644 index 0000000..6426b16 Binary files /dev/null and b/examples/pixywerk.com/publish/images/2019-05-16.png differ diff --git a/examples/pixywerk.com/publish/images/2019-05-19.png b/examples/pixywerk.com/publish/images/2019-05-19.png new file mode 100644 index 0000000..a687d30 Binary files /dev/null and b/examples/pixywerk.com/publish/images/2019-05-19.png differ diff --git a/examples/pixywerk.com/publish/images/link-box-variant.svg b/examples/pixywerk.com/publish/images/link-box-variant.svg new file mode 100644 index 0000000..5ebfc89 --- /dev/null +++ b/examples/pixywerk.com/publish/images/link-box-variant.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/pixywerk.com/publish/images/pipe-leak.svg b/examples/pixywerk.com/publish/images/pipe-leak.svg new file mode 100644 index 0000000..c6b63ff --- /dev/null +++ b/examples/pixywerk.com/publish/images/pipe-leak.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/pixywerk.com/publish/index.html b/examples/pixywerk.com/publish/index.html index d6f20b2..bce2a72 100644 --- a/examples/pixywerk.com/publish/index.html +++ b/examples/pixywerk.com/publish/index.html @@ -1,13 +1,56 @@ - - + Pixywerk2 Home + -

This is my index!!

+
+ +

Pixywerk2 Home

+ + +
+

Pixywerk 2

+

Pixywerk 2 is a simple static website compiler. It is primarily oriented around applying a tree-oriented metadata to each file, and complicated operations within the page templates.

+

Latest blog posts

+
-for i in posts[:5]: +
-get metadata, fill in post image/text summary with link + + +
Code Test Post
+
+ + + + + +
+
+ + + + + + + +
\ No newline at end of file diff --git a/examples/pixywerk.com/publish/post-2019-04-15.html b/examples/pixywerk.com/publish/post-2019-04-15.html new file mode 100644 index 0000000..8afb98d --- /dev/null +++ b/examples/pixywerk.com/publish/post-2019-04-15.html @@ -0,0 +1,44 @@ + + + Pixywerk2 My first post + + + +
+ +

+ Pixywerk +

+ + +
+ + +
+

This is an example post!

+

yo fresh

+

There are many posts like it but this one is mine.

+
+
+ + + + + +
+ + \ No newline at end of file diff --git a/examples/pixywerk.com/publish/post-2019-05-16.another-post.html b/examples/pixywerk.com/publish/post-2019-05-16.another-post.html new file mode 100644 index 0000000..7c615ec --- /dev/null +++ b/examples/pixywerk.com/publish/post-2019-05-16.another-post.html @@ -0,0 +1,43 @@ + + + Pixywerk2 Another example post! + + + +
+ +

+ Pixywerk +

+ + +
+ + +
+

Greetings humans!

+

This is yet another example post! halelujah!

+
+
+ + + + + +
+ + \ No newline at end of file diff --git a/examples/pixywerk.com/publish/posts/2019-04-15.html b/examples/pixywerk.com/publish/posts/2019-04-15.html index af953b3..bc6174e 100644 --- a/examples/pixywerk.com/publish/posts/2019-04-15.html +++ b/examples/pixywerk.com/publish/posts/2019-04-15.html @@ -1,10 +1,13 @@ - My first post + Pixywerk2 My first post - +
+

Pixywerk2 My first post

+
+
+ + +
\ No newline at end of file diff --git a/examples/pixywerk.com/publish/posts/post-2019-04-15.html b/examples/pixywerk.com/publish/posts/post-2019-04-15.html new file mode 100644 index 0000000..b4349d8 --- /dev/null +++ b/examples/pixywerk.com/publish/posts/post-2019-04-15.html @@ -0,0 +1,46 @@ + + + Pixywerk2 My first post + + + +
+ +

+ Pixywerk +

+ + +
+ + +
+

This is an example post!

+

yo fresh

+

There are many posts like it but this one is mine.

+
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/examples/pixywerk.com/publish/posts/post-2019-05-16.another-post.html b/examples/pixywerk.com/publish/posts/post-2019-05-16.another-post.html new file mode 100644 index 0000000..0091fb1 --- /dev/null +++ b/examples/pixywerk.com/publish/posts/post-2019-05-16.another-post.html @@ -0,0 +1,45 @@ + + + Pixywerk2 Another example post! + + + +
+ +

+ Pixywerk +

+ + +
+ + +
+

Greetings humans!

+

This is yet another example post! halelujah!

+
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/examples/pixywerk.com/publish/posts/post-2019-05-19.html b/examples/pixywerk.com/publish/posts/post-2019-05-19.html new file mode 100644 index 0000000..79b0af6 --- /dev/null +++ b/examples/pixywerk.com/publish/posts/post-2019-05-19.html @@ -0,0 +1,111 @@ + + + Pixywerk2 Code Test Post + + + +
+ +

+ Pixywerk +

+ + +
+ + +
+ +

This is a code test post! Let's format some code!!

+ + +
+Some python code: +
"""Package configuration."""
+from setuptools import find_packages, setup
+
+LONG_DESCRIPTION = """Pixywerk 2 is a filesystem based static site generator."""
+
+INSTALL_REQUIRES = ["yaml-1.3", "markdown", "jstyleson", "jinja2", "pygments"]
+
+# Extra dependencies
+EXTRAS_REQUIRE = {
+    # Test dependencies
+    "tests": [
+        "black",
+        "bandit>=1.1.0",
+        "flake8>=3.2.1",
+        "mypy>=0.470",
+        "prospector[with_everything]>=0.12.4",
+        "pytest-cov>=1.8.0",
+        "pytest-xdist>=1.15.0",
+        "pytest>=3.0.3",
+        "sphinx_rtd_theme>=0.1.6",
+        "sphinx-argparse>=0.1.15",
+        "Sphinx>=1.4.9",
+    ]
+}
+
+SETUP_REQUIRES = ["pytest-runner>=2.7.1", "setuptools_scm>=1.15.0"]
+setup(
+    author="Cassowary Rusnov",
+    author_email="rusnovn@gmail.com",
+    classifiers=[
+        "Development Status :: 1 - Pre-alpha",
+        "Environment :: Console",
+        "License :: OSI Approved :: MIT",
+        "Operating System :: POSIX :: Linux",
+        "Programming Language :: Python :: 3.6",
+        "Programming Language :: Python :: 3.7",
+        "Programming Language :: Python :: 3 :: Only",
+        "Topic :: Software Development :: Libraries :: Python Modules",
+    ],
+    description="A filesystem-based website generator / CMS",
+    # entry_points={
+    #    'console_scripts': [
+    #        'cookbook = spicerack.cookbook:main',
+    #    ],
+    # },
+    include_package_data=True,
+    extras_require=EXTRAS_REQUIRE,
+    install_requires=INSTALL_REQUIRES,
+    keywords=["cms", "website", "compiler"],
+    license="MIT",
+    long_description=LONG_DESCRIPTION,
+    name="pixywerk2",
+    packages=find_packages(exclude=["*.tests", "*.tests.*"]),
+    platforms=["GNU/Linux"],
+    setup_requires=SETUP_REQUIRES,
+    use_scm_version=True,
+    url="https://git.antpanethon.com/cas/pixywerk2",
+    zip_safe=False,
+)
+
+ +
+
+
+ + + + + + + +
+ + \ No newline at end of file diff --git a/examples/pixywerk.com/publish/setup.py b/examples/pixywerk.com/publish/setup.py new file mode 100644 index 0000000..9e41013 --- /dev/null +++ b/examples/pixywerk.com/publish/setup.py @@ -0,0 +1,59 @@ +"""Package configuration.""" +from setuptools import find_packages, setup + +LONG_DESCRIPTION = """Pixywerk 2 is a filesystem based static site generator.""" + +INSTALL_REQUIRES = ["yaml-1.3", "markdown", "jstyleson", "jinja2", "pygments"] + +# Extra dependencies +EXTRAS_REQUIRE = { + # Test dependencies + "tests": [ + "black", + "bandit>=1.1.0", + "flake8>=3.2.1", + "mypy>=0.470", + "prospector[with_everything]>=0.12.4", + "pytest-cov>=1.8.0", + "pytest-xdist>=1.15.0", + "pytest>=3.0.3", + "sphinx_rtd_theme>=0.1.6", + "sphinx-argparse>=0.1.15", + "Sphinx>=1.4.9", + ] +} + +SETUP_REQUIRES = ["pytest-runner>=2.7.1", "setuptools_scm>=1.15.0"] +setup( + author="Cassowary Rusnov", + author_email="rusnovn@gmail.com", + classifiers=[ + "Development Status :: 1 - Pre-alpha", + "Environment :: Console", + "License :: OSI Approved :: MIT", + "Operating System :: POSIX :: Linux", + "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3 :: Only", + "Topic :: Software Development :: Libraries :: Python Modules", + ], + description="A filesystem-based website generator / CMS", + # entry_points={ + # 'console_scripts': [ + # 'cookbook = spicerack.cookbook:main', + # ], + # }, + include_package_data=True, + extras_require=EXTRAS_REQUIRE, + install_requires=INSTALL_REQUIRES, + keywords=["cms", "website", "compiler"], + license="MIT", + long_description=LONG_DESCRIPTION, + name="pixywerk2", + packages=find_packages(exclude=["*.tests", "*.tests.*"]), + platforms=["GNU/Linux"], + setup_requires=SETUP_REQUIRES, + use_scm_version=True, + url="https://git.antpanethon.com/cas/pixywerk2", + zip_safe=False, +) diff --git a/examples/pixywerk.com/publish/templates/default.jinja2 b/examples/pixywerk.com/publish/templates/default.jinja2 index 1d7e899..b4c4fc0 100644 --- a/examples/pixywerk.com/publish/templates/default.jinja2 +++ b/examples/pixywerk.com/publish/templates/default.jinja2 @@ -1,9 +1,30 @@ - {{ metadata.title }} - + Pixywerk2 {{ metadata.title }} + - {{ content }} +
+ {% block header %} +

{% block headertitle %}Pixywerk2 {{ metadata.title }}{% endblock %}

+ {% endblock %} + {% block content %} +
+ {{ content }} +
+ {% endblock %} + {% block nav %} + + {% endblock %} + {% block footer %} + + {% endblock %} +
diff --git a/examples/pixywerk.com/publish/templates/post.jinja2 b/examples/pixywerk.com/publish/templates/post.jinja2 new file mode 100644 index 0000000..936cf10 --- /dev/null +++ b/examples/pixywerk.com/publish/templates/post.jinja2 @@ -0,0 +1,23 @@ +{% extends "default.jinja2" %} +{% block headertitle %} + Pixywerk +{% endblock %} +{% block content %} +
+ +
+

Author: {{ metadata.author }}
+ Published: {{ get_time_iso8601(metadata.stat.ctime) }} + {% if metadata.stat.mtime-metadata.stat.ctime > 512 %} + Updated: {{ get_time_iso8601(metadata.stat.mtime) }} + {% endif %} +

+
+
+ {{content}} +
+
+{% endblock %} diff --git a/examples/pixywerk.com/publish/test/test.html b/examples/pixywerk.com/publish/test/test.html new file mode 100644 index 0000000..88ee1b2 --- /dev/null +++ b/examples/pixywerk.com/publish/test/test.html @@ -0,0 +1,31 @@ + + + Pixywerk2 + + + +
+ +

Pixywerk2

+ + +
+ test test/test.thtml + +
+ + + + + + + +
+ + \ No newline at end of file diff --git a/examples/pixywerk.com/src/.meta b/examples/pixywerk.com/src/.meta index 1836c12..8a4d473 100644 --- a/examples/pixywerk.com/src/.meta +++ b/examples/pixywerk.com/src/.meta @@ -1,6 +1,7 @@ { -"author": "Cas Rusnov", -"author_email": "rusnovn@gmail.com", -"uuid-oid-root": "pixywerk.com/", -"site_root": "https://pixywerk.com/" -} \ No newline at end of file + "author": "Cas Rusnov", + "author_email": "pixywerk2@gmail.com", + "uuid-oid-root": "pixywerk.com/", + "site_root": "https://pixywerk.com/", + "subtitle": "Website Compiler" +} diff --git a/demo/atom.xml b/examples/pixywerk.com/src/atom.xml similarity index 92% rename from demo/atom.xml rename to examples/pixywerk.com/src/atom.xml index 43512f7..74a4da0 100644 --- a/demo/atom.xml +++ b/examples/pixywerk.com/src/atom.xml @@ -9,7 +9,7 @@ urn:uuid:{{ metadata.uuid }} {{ get_time_iso8601(metadata['build-time']) }} - {% set posts = get_file_list('blog_posts/*.cont') %} + {% set posts = get_file_list('post-*.thtml', sort_order='file_name', reverse=True) %} {% for post in posts %} {% set post_meta = get_file_metadata(post['file_path']) %} diff --git a/examples/pixywerk.com/src/atom.xml.meta b/examples/pixywerk.com/src/atom.xml.meta new file mode 100644 index 0000000..af97ddc --- /dev/null +++ b/examples/pixywerk.com/src/atom.xml.meta @@ -0,0 +1,4 @@ +{ +"type": "templatable", +"title": "Pixywerk2 RSS Feed" +} diff --git a/examples/pixywerk.com/src/css/fonts/ExpletusSans-Bold.ttf b/examples/pixywerk.com/src/css/fonts/ExpletusSans-Bold.ttf new file mode 100644 index 0000000..ccc42da Binary files /dev/null and b/examples/pixywerk.com/src/css/fonts/ExpletusSans-Bold.ttf differ diff --git a/examples/pixywerk.com/src/css/fonts/ExpletusSans-Bold.woff b/examples/pixywerk.com/src/css/fonts/ExpletusSans-Bold.woff new file mode 100644 index 0000000..0ce5c9d Binary files /dev/null and b/examples/pixywerk.com/src/css/fonts/ExpletusSans-Bold.woff differ diff --git a/examples/pixywerk.com/src/css/fonts/ExpletusSans-Bold.woff2 b/examples/pixywerk.com/src/css/fonts/ExpletusSans-Bold.woff2 new file mode 100644 index 0000000..6bc2f53 Binary files /dev/null and b/examples/pixywerk.com/src/css/fonts/ExpletusSans-Bold.woff2 differ diff --git a/examples/pixywerk.com/src/css/fonts/ExpletusSans-BoldItalic.ttf b/examples/pixywerk.com/src/css/fonts/ExpletusSans-BoldItalic.ttf new file mode 100644 index 0000000..218a299 Binary files /dev/null and b/examples/pixywerk.com/src/css/fonts/ExpletusSans-BoldItalic.ttf differ diff --git a/examples/pixywerk.com/src/css/fonts/ExpletusSans-BoldItalic.woff b/examples/pixywerk.com/src/css/fonts/ExpletusSans-BoldItalic.woff new file mode 100644 index 0000000..8d1895c Binary files /dev/null and b/examples/pixywerk.com/src/css/fonts/ExpletusSans-BoldItalic.woff differ diff --git a/examples/pixywerk.com/src/css/fonts/ExpletusSans-BoldItalic.woff2 b/examples/pixywerk.com/src/css/fonts/ExpletusSans-BoldItalic.woff2 new file mode 100644 index 0000000..1f14509 Binary files /dev/null and b/examples/pixywerk.com/src/css/fonts/ExpletusSans-BoldItalic.woff2 differ diff --git a/examples/pixywerk.com/src/css/fonts/ExpletusSans-Italic.ttf b/examples/pixywerk.com/src/css/fonts/ExpletusSans-Italic.ttf new file mode 100644 index 0000000..a489cb5 Binary files /dev/null and b/examples/pixywerk.com/src/css/fonts/ExpletusSans-Italic.ttf differ diff --git a/examples/pixywerk.com/src/css/fonts/ExpletusSans-Italic.woff b/examples/pixywerk.com/src/css/fonts/ExpletusSans-Italic.woff new file mode 100644 index 0000000..35b5def Binary files /dev/null and b/examples/pixywerk.com/src/css/fonts/ExpletusSans-Italic.woff differ diff --git a/examples/pixywerk.com/src/css/fonts/ExpletusSans-Italic.woff2 b/examples/pixywerk.com/src/css/fonts/ExpletusSans-Italic.woff2 new file mode 100644 index 0000000..f480e5a Binary files /dev/null and b/examples/pixywerk.com/src/css/fonts/ExpletusSans-Italic.woff2 differ diff --git a/examples/pixywerk.com/src/css/fonts/ExpletusSans-Medium.ttf b/examples/pixywerk.com/src/css/fonts/ExpletusSans-Medium.ttf new file mode 100644 index 0000000..e7def69 Binary files /dev/null and b/examples/pixywerk.com/src/css/fonts/ExpletusSans-Medium.ttf differ diff --git a/examples/pixywerk.com/src/css/fonts/ExpletusSans-Medium.woff b/examples/pixywerk.com/src/css/fonts/ExpletusSans-Medium.woff new file mode 100644 index 0000000..97f82b6 Binary files /dev/null and b/examples/pixywerk.com/src/css/fonts/ExpletusSans-Medium.woff differ diff --git a/examples/pixywerk.com/src/css/fonts/ExpletusSans-Medium.woff2 b/examples/pixywerk.com/src/css/fonts/ExpletusSans-Medium.woff2 new file mode 100644 index 0000000..5ce3add Binary files /dev/null and b/examples/pixywerk.com/src/css/fonts/ExpletusSans-Medium.woff2 differ diff --git a/examples/pixywerk.com/src/css/fonts/ExpletusSans-MediumItalic.ttf b/examples/pixywerk.com/src/css/fonts/ExpletusSans-MediumItalic.ttf new file mode 100644 index 0000000..539e0d8 Binary files /dev/null and b/examples/pixywerk.com/src/css/fonts/ExpletusSans-MediumItalic.ttf differ diff --git a/examples/pixywerk.com/src/css/fonts/ExpletusSans-MediumItalic.woff b/examples/pixywerk.com/src/css/fonts/ExpletusSans-MediumItalic.woff new file mode 100644 index 0000000..805c21c Binary files /dev/null and b/examples/pixywerk.com/src/css/fonts/ExpletusSans-MediumItalic.woff differ diff --git a/examples/pixywerk.com/src/css/fonts/ExpletusSans-MediumItalic.woff2 b/examples/pixywerk.com/src/css/fonts/ExpletusSans-MediumItalic.woff2 new file mode 100644 index 0000000..b0ddf22 Binary files /dev/null and b/examples/pixywerk.com/src/css/fonts/ExpletusSans-MediumItalic.woff2 differ diff --git a/examples/pixywerk.com/src/css/fonts/ExpletusSans-Regular.ttf b/examples/pixywerk.com/src/css/fonts/ExpletusSans-Regular.ttf new file mode 100644 index 0000000..8b028b7 Binary files /dev/null and b/examples/pixywerk.com/src/css/fonts/ExpletusSans-Regular.ttf differ diff --git a/examples/pixywerk.com/src/css/fonts/ExpletusSans-Regular.woff b/examples/pixywerk.com/src/css/fonts/ExpletusSans-Regular.woff new file mode 100644 index 0000000..498a409 Binary files /dev/null and b/examples/pixywerk.com/src/css/fonts/ExpletusSans-Regular.woff differ diff --git a/examples/pixywerk.com/src/css/fonts/ExpletusSans-Regular.woff2 b/examples/pixywerk.com/src/css/fonts/ExpletusSans-Regular.woff2 new file mode 100644 index 0000000..3c3bd08 Binary files /dev/null and b/examples/pixywerk.com/src/css/fonts/ExpletusSans-Regular.woff2 differ diff --git a/examples/pixywerk.com/src/css/fonts/ExpletusSans-SemiBold.ttf b/examples/pixywerk.com/src/css/fonts/ExpletusSans-SemiBold.ttf new file mode 100644 index 0000000..0765fe5 Binary files /dev/null and b/examples/pixywerk.com/src/css/fonts/ExpletusSans-SemiBold.ttf differ diff --git a/examples/pixywerk.com/src/css/fonts/ExpletusSans-SemiBold.woff b/examples/pixywerk.com/src/css/fonts/ExpletusSans-SemiBold.woff new file mode 100644 index 0000000..2eea274 Binary files /dev/null and b/examples/pixywerk.com/src/css/fonts/ExpletusSans-SemiBold.woff differ diff --git a/examples/pixywerk.com/src/css/fonts/ExpletusSans-SemiBold.woff2 b/examples/pixywerk.com/src/css/fonts/ExpletusSans-SemiBold.woff2 new file mode 100644 index 0000000..a846207 Binary files /dev/null and b/examples/pixywerk.com/src/css/fonts/ExpletusSans-SemiBold.woff2 differ diff --git a/examples/pixywerk.com/src/css/fonts/ExpletusSans-SemiBoldItalic.ttf b/examples/pixywerk.com/src/css/fonts/ExpletusSans-SemiBoldItalic.ttf new file mode 100644 index 0000000..e5828bc Binary files /dev/null and b/examples/pixywerk.com/src/css/fonts/ExpletusSans-SemiBoldItalic.ttf differ diff --git a/examples/pixywerk.com/src/css/fonts/ExpletusSans-SemiBoldItalic.woff b/examples/pixywerk.com/src/css/fonts/ExpletusSans-SemiBoldItalic.woff new file mode 100644 index 0000000..e8ce5fa Binary files /dev/null and b/examples/pixywerk.com/src/css/fonts/ExpletusSans-SemiBoldItalic.woff differ diff --git a/examples/pixywerk.com/src/css/fonts/ExpletusSans-SemiBoldItalic.woff2 b/examples/pixywerk.com/src/css/fonts/ExpletusSans-SemiBoldItalic.woff2 new file mode 100644 index 0000000..b343c83 Binary files /dev/null and b/examples/pixywerk.com/src/css/fonts/ExpletusSans-SemiBoldItalic.woff2 differ diff --git a/examples/pixywerk.com/src/css/fonts/Teko-Bold.woff b/examples/pixywerk.com/src/css/fonts/Teko-Bold.woff new file mode 100644 index 0000000..1e4d639 Binary files /dev/null and b/examples/pixywerk.com/src/css/fonts/Teko-Bold.woff differ diff --git a/examples/pixywerk.com/src/css/fonts/Teko-Bold.woff2 b/examples/pixywerk.com/src/css/fonts/Teko-Bold.woff2 new file mode 100644 index 0000000..01de66f Binary files /dev/null and b/examples/pixywerk.com/src/css/fonts/Teko-Bold.woff2 differ diff --git a/examples/pixywerk.com/src/css/fonts/Teko-Light.woff b/examples/pixywerk.com/src/css/fonts/Teko-Light.woff new file mode 100644 index 0000000..ab9a063 Binary files /dev/null and b/examples/pixywerk.com/src/css/fonts/Teko-Light.woff differ diff --git a/examples/pixywerk.com/src/css/fonts/Teko-Light.woff2 b/examples/pixywerk.com/src/css/fonts/Teko-Light.woff2 new file mode 100644 index 0000000..3828576 Binary files /dev/null and b/examples/pixywerk.com/src/css/fonts/Teko-Light.woff2 differ diff --git a/examples/pixywerk.com/src/css/fonts/Teko-Medium.woff b/examples/pixywerk.com/src/css/fonts/Teko-Medium.woff new file mode 100644 index 0000000..bec7247 Binary files /dev/null and b/examples/pixywerk.com/src/css/fonts/Teko-Medium.woff differ diff --git a/examples/pixywerk.com/src/css/fonts/Teko-Medium.woff2 b/examples/pixywerk.com/src/css/fonts/Teko-Medium.woff2 new file mode 100644 index 0000000..790f01a Binary files /dev/null and b/examples/pixywerk.com/src/css/fonts/Teko-Medium.woff2 differ diff --git a/examples/pixywerk.com/src/css/fonts/Teko-Regular.woff b/examples/pixywerk.com/src/css/fonts/Teko-Regular.woff new file mode 100644 index 0000000..61a1901 Binary files /dev/null and b/examples/pixywerk.com/src/css/fonts/Teko-Regular.woff differ diff --git a/examples/pixywerk.com/src/css/fonts/Teko-Regular.woff2 b/examples/pixywerk.com/src/css/fonts/Teko-Regular.woff2 new file mode 100644 index 0000000..01ebcdf Binary files /dev/null and b/examples/pixywerk.com/src/css/fonts/Teko-Regular.woff2 differ diff --git a/examples/pixywerk.com/src/css/fonts/Teko-SemiBold.woff b/examples/pixywerk.com/src/css/fonts/Teko-SemiBold.woff new file mode 100644 index 0000000..41ee7d7 Binary files /dev/null and b/examples/pixywerk.com/src/css/fonts/Teko-SemiBold.woff differ diff --git a/examples/pixywerk.com/src/css/fonts/Teko-SemiBold.woff2 b/examples/pixywerk.com/src/css/fonts/Teko-SemiBold.woff2 new file mode 100644 index 0000000..8a9db8d Binary files /dev/null and b/examples/pixywerk.com/src/css/fonts/Teko-SemiBold.woff2 differ diff --git a/examples/pixywerk.com/src/css/main.css b/examples/pixywerk.com/src/css/main.css index cd7f0d6..52c4814 100644 --- a/examples/pixywerk.com/src/css/main.css +++ b/examples/pixywerk.com/src/css/main.css @@ -1,3 +1,277 @@ +@font-face { + font-family: 'Expletus Sans'; + src: url('fonts/ExpletusSans-Bold.woff2') format('woff2'), + url('fonts/ExpletusSans-Bold.woff') format('woff'); + font-style: regular; + font-weight: 700; +} -body { margin: 10% 10% 0 10% } \ No newline at end of file +@font-face { + font-family: 'Expletus Sans'; + src: url('fonts/ExpletusSans-BoldItalic.woff2') format('woff2'), + url('fonts/ExpletusSans-BoldItalic.woff') format('woff'); + font-style: italic; + font-weight: 700; +} + + +@font-face { + font-family: 'Expletus Sans'; + src: url('fonts/ExpletusSans-Italic.woff2') format('woff2'), + url('fonts/ExpletusSans-Italic.woff') format('woff'); + font-style: italic; + font-weight: 400; +} + + +@font-face { + font-family: 'Expletus Sans'; + src: url('fonts/ExpletusSans-Medium.woff2') format('woff2'), + url('fonts/ExpletusSans-Medium.woff') format('woff'); + font-style: regular; + font-weight: 500; +} + + +@font-face { + font-family: 'Expletus Sans'; + src: url('fonts/ExpletusSans-MediumItalic.woff2') format('woff2'), + url('fonts/ExpletusSans-MediumItalic.woff') format('woff'); + font-style: italic; + font-weight: 500; +} + + +@font-face { + font-family: 'Expletus Sans'; + src: url('fonts/ExpletusSans-Regular.woff2') format('woff2'), + url('fonts/ExpletusSans-Regular.woff') format('woff'); + font-style: regular; + font-weight: 400; +} + + +@font-face { + font-family: 'Expletus Sans'; + src: url('fonts/ExpletusSans-SemiBold.woff2') format('woff2'), + url('fonts/ExpletusSans-SemiBold.woff') format('woff'); + font-style: regular; + font-weight: 600; +} + + +@font-face { + font-family: 'Expletus Sans'; + src: url('fonts/ExpletusSans-SemiBoldItalic.woff2') format('woff2'), + url('fonts/ExpletusSans-SemiBoldItalic.woff') format('woff'); + font-style: italic; + font-weight: 600; +} + +@font-face { + font-family: 'Teko'; + src: url('fonts/Teko-Bold.woff2') format('woff2'), + url('fonts/Teko-Bold.woff') format('woff'); + font-style: regular; + font-weight: 700; +} + + +@font-face { + font-family: 'Teko Light'; + src: url('fonts/Teko-Light.woff2') format('woff2'), + url('fonts/Teko-Light.woff') format('woff'); + font-style: regular; + font-weight: 300; +} + + +@font-face { + font-family: 'Teko Medium'; + src: url('fonts/Teko-Medium.woff2') format('woff2'), + url('fonts/Teko-Medium.woff') format('woff'); + font-style: regular; + font-weight: 500; +} + + +@font-face { + font-family: 'Teko'; + src: url('fonts/Teko-Regular.woff2') format('woff2'), + url('fonts/Teko-Regular.woff') format('woff'); + font-style: regular; + font-weight: 400; +} + + +@font-face { + font-family: 'Teko SemiBold'; + src: url('fonts/Teko-SemiBold.woff2') format('woff2'), + url('fonts/Teko-SemiBold.woff') format('woff'); + font-style: regular; + font-weight: 600; +} + +body { margin: 0; font-family: Teko; font-size: 24pt; } +h1, h2, h3, h4 { font-family: 'Expletus Sans'; font-weight: 700 } +h1 { font-size: 150%; border-bottom: solid 1px black; } +h2 { font-size: 125%; } +h3 { font-size: 115%; } +h4 { font-size: 100%; } + +.container { + height: 100%; + width: 100%; + display: grid; + grid-template-columns: 220px auto auto; + grid-template-rows: auto auto auto auto; +} + +header { + border: 0; + padding-left: 20px; + height: 60px; + grid-column: 1 / 4; + background: black; + color: white; +} + +header h1 { font-size: 18pt; border: none} + +nav { + grid-row: 2 / 5; + grid-column: 1; +} + +nav ul { + padding: 0; +} + +nav ul li { + list-style-type: none; + padding: 1px 20px 1px 20px; +} + +nav ul li:hover { + background: black; + color: white; +} + +nav ul li:hover img { + filter: invert(1); +} + +nav ul li a { + color: black; + text-decoration: none; +} + +nav ul li:hover a:hover { + color: white; + text-decoration: underline; +} + +nav ul li a:visited { + color: inherit; +} + +article { + grid-row: 2 / 5; + grid-column: 2 / 4; + margin: 0 20px 0 20px; +} + +footer { + font-size: 12pt; + grid-column: 1 / 4; + grid-row: 5; + background: black; + color: white; + padding-top: 10px; + padding-left: 20px; +} + +.post div.featured { + max-height: 250px; + max-width: 100%; + overflow: hidden; + position: relative; + padding: 0; +} + +.post div.featured img.featured { + max-width: initial; + width: 100%; +} + +.post div.featured h1 { + position: absolute; + bottom: 0px; + left: 0; + color: white; + border: 0; + padding: 10px 30px 10px 30px; + background: rgba(0,0,0,0.5); + margin-top: 0.5em; + margin-bottom: 0.5em; + font-variant: small-caps; +} + +.post div.byline { + margin-left: 30px; + font-size: 0.75em; + line-height: 0.75em; +} + +.post div.article { + margin-left: 30Px; +} + +.post div.article p { + margin-top: 0.5em; + margin-bottom: 0.5em; +} + +.postgrid { + display: grid; + grid-template-columns: minmax(300px, 33%) minmax(300px, 33%) minmax(300px, 33%); + margin-bottom: 30px; + column-gap: 10px; + row-gap: 10px; +} + +.postgrid-item { + height: 200px; + max-height: 200px; + max-width: 100%; + overflow: hidden; + position: relative; +} + +.postgrid-item a img.featured { + max-width: 100%; +} + + +.postgrid-item a div { + position: absolute; + left: 0; + bottom: 0; + color: white; + border: 0; + padding: 10px 30px 10px 30px; + background: rgba(0,0,0,0.5); + margin-top: 0.5em; + margin-bottom: 0.5em; + font-variant: small-caps; +} + +{{ pygments_get_css('emacs') }} + +div.code { + font-size: 0.5em; + border: 1px black solid; + padding: 1em; + margin: 0 1em 0 1em; +} diff --git a/examples/pixywerk.com/src/css/main.css.meta b/examples/pixywerk.com/src/css/main.css.meta new file mode 100644 index 0000000..127797c --- /dev/null +++ b/examples/pixywerk.com/src/css/main.css.meta @@ -0,0 +1,3 @@ +{ + "type": "templatable" +} diff --git a/examples/pixywerk.com/src/images/2019-05-16.png b/examples/pixywerk.com/src/images/2019-05-16.png new file mode 100755 index 0000000..6426b16 Binary files /dev/null and b/examples/pixywerk.com/src/images/2019-05-16.png differ diff --git a/examples/pixywerk.com/src/images/2019-05-19.png b/examples/pixywerk.com/src/images/2019-05-19.png new file mode 100755 index 0000000..a687d30 Binary files /dev/null and b/examples/pixywerk.com/src/images/2019-05-19.png differ diff --git a/examples/pixywerk.com/src/images/link-box-variant.svg b/examples/pixywerk.com/src/images/link-box-variant.svg new file mode 100644 index 0000000..5ebfc89 --- /dev/null +++ b/examples/pixywerk.com/src/images/link-box-variant.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/pixywerk.com/src/images/pipe-leak.svg b/examples/pixywerk.com/src/images/pipe-leak.svg new file mode 100644 index 0000000..c6b63ff --- /dev/null +++ b/examples/pixywerk.com/src/images/pipe-leak.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/pixywerk.com/src/index.thtml b/examples/pixywerk.com/src/index.thtml index b65db2c..83ff765 100644 --- a/examples/pixywerk.com/src/index.thtml +++ b/examples/pixywerk.com/src/index.thtml @@ -1,5 +1,13 @@ -

This is my index!!

- -for i in posts[:5]: - -get metadata, fill in post image/text summary with link +

Pixywerk 2

+

Pixywerk 2 is a simple static website compiler. It is primarily oriented around applying a tree-oriented metadata to each file, and complicated operations within the page templates.

+

Latest blog posts

+
+{% for f in get_file_list('posts/*', sort_order='file_name', reverse=True) %} +
+{% set metadata = get_file_metadata("posts/"+f['file_name']) %} + + +
{{metadata.title}}
+
+{% endfor %} +
\ No newline at end of file diff --git a/examples/pixywerk.com/src/index.thtml.meta b/examples/pixywerk.com/src/index.thtml.meta new file mode 100644 index 0000000..ca46a87 --- /dev/null +++ b/examples/pixywerk.com/src/index.thtml.meta @@ -0,0 +1,3 @@ +{ + "title": "Home" +} diff --git a/examples/pixywerk.com/src/posts/.meta b/examples/pixywerk.com/src/posts/.meta new file mode 100644 index 0000000..3ddfb5a --- /dev/null +++ b/examples/pixywerk.com/src/posts/.meta @@ -0,0 +1,3 @@ +{ + "template": "post.jinja2" +} diff --git a/examples/pixywerk.com/src/posts/2019-04-15.thtml b/examples/pixywerk.com/src/posts/2019-04-15.thtml deleted file mode 100644 index d959916..0000000 --- a/examples/pixywerk.com/src/posts/2019-04-15.thtml +++ /dev/null @@ -1,12 +0,0 @@ - -
-

Author: {{ metadata.author }}

-

Published: {{ get_time_iso8601(metadata.stat.ctime) }} - {% if metadata.stat.mtime-metadata.stat.ctime > 512 %} - Updated: {{ get_time_iso8601(metadata.stat.mtime) }} - {% endif %} -

-
-

This is an example post!

-

yo fresh

-

There are many posts like it but this one is mine.

diff --git a/examples/pixywerk.com/src/posts/2019-04-15.thtml.meta b/examples/pixywerk.com/src/posts/2019-04-15.thtml.meta deleted file mode 100644 index ebe5666..0000000 --- a/examples/pixywerk.com/src/posts/2019-04-15.thtml.meta +++ /dev/null @@ -1,4 +0,0 @@ -{ -"title":"My first post", -"featured":"../images/20190415-0.jpg" -} diff --git a/examples/pixywerk.com/src/posts/post-2019-04-15.thtml b/examples/pixywerk.com/src/posts/post-2019-04-15.thtml new file mode 100644 index 0000000..7b3adec --- /dev/null +++ b/examples/pixywerk.com/src/posts/post-2019-04-15.thtml @@ -0,0 +1,3 @@ +

This is an example post!

+

yo fresh

+

There are many posts like it but this one is mine.

diff --git a/examples/pixywerk.com/src/posts/post-2019-04-15.thtml.meta b/examples/pixywerk.com/src/posts/post-2019-04-15.thtml.meta new file mode 100644 index 0000000..10ccc6f --- /dev/null +++ b/examples/pixywerk.com/src/posts/post-2019-04-15.thtml.meta @@ -0,0 +1,4 @@ +{ + "title":"My first post", + "featured":"images/20190415-0.jpg" +} diff --git a/examples/pixywerk.com/src/posts/post-2019-05-16.another-post.thtml b/examples/pixywerk.com/src/posts/post-2019-05-16.another-post.thtml new file mode 100644 index 0000000..1c27a04 --- /dev/null +++ b/examples/pixywerk.com/src/posts/post-2019-05-16.another-post.thtml @@ -0,0 +1,2 @@ +

Greetings humans!

+

This is yet another example post! halelujah!

diff --git a/examples/pixywerk.com/src/posts/post-2019-05-16.another-post.thtml.meta b/examples/pixywerk.com/src/posts/post-2019-05-16.another-post.thtml.meta new file mode 100644 index 0000000..b5ddf20 --- /dev/null +++ b/examples/pixywerk.com/src/posts/post-2019-05-16.another-post.thtml.meta @@ -0,0 +1,4 @@ +{ +"title": "Another example post!", +"featured": "images/2019-05-16.png" +} diff --git a/examples/pixywerk.com/src/posts/post-2019-05-19.thtml b/examples/pixywerk.com/src/posts/post-2019-05-19.thtml new file mode 100644 index 0000000..128a075 --- /dev/null +++ b/examples/pixywerk.com/src/posts/post-2019-05-19.thtml @@ -0,0 +1,8 @@ + +

This is a code test post! Let's format some code!!

+ + +
+Some python code: +{{ pygments_markup_contents_html(get_raw("setup.py"), "Python", "emacs") }} +
diff --git a/examples/pixywerk.com/src/posts/post-2019-05-19.thtml.meta b/examples/pixywerk.com/src/posts/post-2019-05-19.thtml.meta new file mode 100644 index 0000000..30a33c1 --- /dev/null +++ b/examples/pixywerk.com/src/posts/post-2019-05-19.thtml.meta @@ -0,0 +1,4 @@ +{ +"title": "Code Test Post", +"featured": "images/2019-05-19.png" +} diff --git a/examples/pixywerk.com/src/setup.py b/examples/pixywerk.com/src/setup.py new file mode 100644 index 0000000..9e41013 --- /dev/null +++ b/examples/pixywerk.com/src/setup.py @@ -0,0 +1,59 @@ +"""Package configuration.""" +from setuptools import find_packages, setup + +LONG_DESCRIPTION = """Pixywerk 2 is a filesystem based static site generator.""" + +INSTALL_REQUIRES = ["yaml-1.3", "markdown", "jstyleson", "jinja2", "pygments"] + +# Extra dependencies +EXTRAS_REQUIRE = { + # Test dependencies + "tests": [ + "black", + "bandit>=1.1.0", + "flake8>=3.2.1", + "mypy>=0.470", + "prospector[with_everything]>=0.12.4", + "pytest-cov>=1.8.0", + "pytest-xdist>=1.15.0", + "pytest>=3.0.3", + "sphinx_rtd_theme>=0.1.6", + "sphinx-argparse>=0.1.15", + "Sphinx>=1.4.9", + ] +} + +SETUP_REQUIRES = ["pytest-runner>=2.7.1", "setuptools_scm>=1.15.0"] +setup( + author="Cassowary Rusnov", + author_email="rusnovn@gmail.com", + classifiers=[ + "Development Status :: 1 - Pre-alpha", + "Environment :: Console", + "License :: OSI Approved :: MIT", + "Operating System :: POSIX :: Linux", + "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3 :: Only", + "Topic :: Software Development :: Libraries :: Python Modules", + ], + description="A filesystem-based website generator / CMS", + # entry_points={ + # 'console_scripts': [ + # 'cookbook = spicerack.cookbook:main', + # ], + # }, + include_package_data=True, + extras_require=EXTRAS_REQUIRE, + install_requires=INSTALL_REQUIRES, + keywords=["cms", "website", "compiler"], + license="MIT", + long_description=LONG_DESCRIPTION, + name="pixywerk2", + packages=find_packages(exclude=["*.tests", "*.tests.*"]), + platforms=["GNU/Linux"], + setup_requires=SETUP_REQUIRES, + use_scm_version=True, + url="https://git.antpanethon.com/cas/pixywerk2", + zip_safe=False, +) diff --git a/examples/pixywerk.com/src/templates/default.jinja2 b/examples/pixywerk.com/src/templates/default.jinja2 index 1d7e899..b4c4fc0 100644 --- a/examples/pixywerk.com/src/templates/default.jinja2 +++ b/examples/pixywerk.com/src/templates/default.jinja2 @@ -1,9 +1,30 @@ - {{ metadata.title }} - + Pixywerk2 {{ metadata.title }} + - {{ content }} +
+ {% block header %} +

{% block headertitle %}Pixywerk2 {{ metadata.title }}{% endblock %}

+ {% endblock %} + {% block content %} +
+ {{ content }} +
+ {% endblock %} + {% block nav %} + + {% endblock %} + {% block footer %} + + {% endblock %} +
diff --git a/examples/pixywerk.com/src/templates/post.jinja2 b/examples/pixywerk.com/src/templates/post.jinja2 new file mode 100644 index 0000000..1bb8d42 --- /dev/null +++ b/examples/pixywerk.com/src/templates/post.jinja2 @@ -0,0 +1,23 @@ +{% extends "default.jinja2" %} +{% block headertitle %} + Pixywerk +{% endblock %} +{% block content %} +
+ + +
+ {{content}} +
+
+{% endblock %} diff --git a/examples/pixywerk.com/src/test/test.thtml b/examples/pixywerk.com/src/test/test.thtml new file mode 100644 index 0000000..c7eea45 --- /dev/null +++ b/examples/pixywerk.com/src/test/test.thtml @@ -0,0 +1,2 @@ +{{metadata.dir}} {{metadata.file_path}} {{metadata.os_path}} + diff --git a/importwp.py b/importwp.py new file mode 100644 index 0000000..64819e1 --- /dev/null +++ b/importwp.py @@ -0,0 +1,162 @@ +"""Convert a Wordpress XML dump into to a (mostly working) pixywerk2 tree.""" + +import argparse +import datetime +import json +import os +import sys +from urllib.parse import urlparse +from xml.etree.ElementTree import ElementTree + +import requests + +FILE_PATTERN = "{postdate}-{postname}.thtml" + + +def parse_args(args): + parser = argparse.ArgumentParser("importwp.py") + + parser.add_argument("input", help="The input file.") + parser.add_argument("out_dir", help="Output root directory.", default='.') + parser.add_argument("--fetch-attachments", help="Fetch all attachments referred to in file.", action="store_true", dest='fetch_attachments') + parser.add_argument("--attachment-dir", help="Subdirectory to place attachments in.", default="attachments", dest='attachment_dir') + parser.add_argument("--post-dir", help="Subdirectory to place posts in.", default="posts", dest='post_dir') + parser.add_argument("--page-dir", help="Subdirectory to place pages in.", default="", dest='page_dir') + + result = parser.parse_args(args) + result.post_dir = os.path.join(result.out_dir, result.post_dir) + result.page_dir = os.path.join(result.out_dir, result.page_dir) + result.attachment_dir = os.path.join(result.out_dir, result.attachment_dir) + + return result + + +def parse_input(xmlpath): + tree = ElementTree() + + tree_root = tree.parse(source=xmlpath) + posts = {} + attachments = {} + pages = {} + + for node in tree_root.find("channel"): + if node.tag == "item": + post_type = node.find("{http://wordpress.org/export/1.2/}post_type") + if post_type is not None: + status = node.find("{http://wordpress.org/export/1.2/}status") + if status is not None and status.text == "draft": + continue + content = node.find("{http://purl.org/rss/1.0/modules/content/}encoded") + title = node.find("title") + pubdate = node.find("pubDate") + description = node.find("description") + post_name = node.find("{http://wordpress.org/export/1.2/}post_name") + categories = node.findall("category") + post_id = node.find("{http://wordpress.org/export/1.2/}post_id") + post_parent = node.find("{http://wordpress.org/export/1.2/}post_parent") + if post_type.text == "post": + # found a post! + posts[post_id.text] = {'content':content, + 'title':title, + 'pubdate':pubdate, + 'description':description, + 'post_name':post_name, + 'categories':categories, + 'post_parent':post_parent} + elif post_type.text == "attachment": + # attachment + att_url = node.find("{http://wordpress.org/export/1.2/}attachment_url") + + attachments[post_id.text] = {'content':content, + 'title':title, + 'pubdate':pubdate, + 'description':description, + 'post_name':post_name, + 'categories':categories, + 'post_parent':post_parent, + 'att_url':att_url,} + elif post_type.text == "page": + pages[post_id.text] = {'content':content, + 'title':title, + 'pubdate':pubdate, + 'description':description, + 'post_name':post_name, + 'categories':categories, + 'post_parent':post_parent} + + return posts, attachments, pages + +def fetch_attachment(attch, outdir): + url = attch['att_url'].text + p = urlparse(url) + filename = os.path.join(outdir, os.path.split(p.path)[-1]) + print("fetching attachment",url,"->",filename) + r = requests.get(url) + with open(filename, 'wb') as outf: + outf.write(r.content) + +def save_cont(post, outdir): + dt = datetime.datetime.strptime(post['pubdate'].text, "%a, %d %b %Y %H:%M:%S %z") + postdate = dt.strftime("%Y-%m-%d-%H%M%S") + filename = FILE_PATTERN.format(postdate=postdate, postname=post['post_name'].text) + print(post['title'].text, "->", filename) + with open(os.path.join(outdir, filename), "w") as outf: + outf.write(post['content'].text) + # handle attachments + + tags = [] + category = "" + for tg in post['categories']: + if "domain" in tg.attrib and tg.attrib["domain"] == "category": + category = tg.text + else: + tags.append(tg.text) + + with open(os.path.join(outdir, filename + ".meta"), "w") as outf: + metadata = { + "title": post['title'].text, + "description": post['description'].text, + "post_time": dt.timestamp(), + "featured": "", + "tags": tags, + "category": category, + } + json.dump(metadata, outf) + + +def main(): + args = parse_args(sys.argv[1:]) + try: + os.mkdir(args.out_dir) + except FileExistsError: + pass + + try: + os.mkdir(args.page_dir) + except FileExistsError: + pass + + try: + os.mkdir(args.post_dir) + except FileExistsError: + pass + + if args.fetch_attachments: + try: + os.mkdir(args.attachment_dir) + except FileExistsError: + pass + + posts, attachments, pages = parse_input(args.input) + + if args.fetch_attachments: + [fetch_attachment(post, args.attachment_dir) for post in attachments.values()] + + [save_cont(post, args.post_dir) for post in posts.values()] + [save_cont(page, args.page_dir) for page in pages.values()] + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/pixywerk2/__main__.py b/pixywerk2/__main__.py index 062b331..9f1772a 100644 --- a/pixywerk2/__main__.py +++ b/pixywerk2/__main__.py @@ -17,8 +17,8 @@ from typing import Dict, List, cast from .processchain import ProcessorChains from .processors.processors import PassthroughException 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, file_raw +from .pygments import pygments_get_css, pygments_markup_contents_html logger = logging.getLogger() @@ -79,18 +79,22 @@ def main() -> int: "summary": "", "description": "", "author": "", - "author_email": "" + "author_email": "", } meta_tree = MetaTree(args.root, default_metadata) file_list_cache = cast(Dict, {}) file_cont_cache = cast(Dict, {}) file_name_cache = cast(Dict, {}) + file_raw_cache = cast(Dict, {}) default_metadata["globals"] = { "get_file_list": file_list(args.root, file_list_cache), "get_file_name": file_name(args.root, meta_tree, process_chains, file_name_cache), "get_file_content": file_content(args.root, meta_tree, process_chains, file_cont_cache), + "get_raw": file_raw(args.root, file_raw_cache), "get_file_metadata": file_metadata(meta_tree), "get_time_iso8601": time_iso8601("UTC"), + "pygments_get_css": pygments_get_css, + "pygments_markup_contents_html": pygments_markup_contents_html, } for root, _, files in os.walk(args.root): diff --git a/pixywerk2/metadata.py b/pixywerk2/metadata.py index 8440866..9e45851 100644 --- a/pixywerk2/metadata.py +++ b/pixywerk2/metadata.py @@ -1,5 +1,6 @@ """Constructs a tree-like object containing the metadata for a given path, and caches said metadata.""" +import fnmatch import logging import mimetypes import os @@ -108,11 +109,15 @@ m load .meta (JSON formatted dictionary) for that level, and # iterate path components from root to target path comps = [self._root] + rel_path.split("/") fullpath = "" + ospath = os.path.join(self._root, rel_path) for pth in comps: fullpath = os.path.join(fullpath, pth) st = os.stat(fullpath) - cachekey = fullpath + ".meta" + if os.path.isdir(fullpath): + cachekey = os.path.join(fullpath, ".meta") + else: + cachekey = fullpath + ".meta" meta = cast(Dict, {}) try: st_meta = os.stat(cachekey) @@ -126,16 +131,20 @@ m load .meta (JSON formatted dictionary) for that level, and meta = jstyleson.load(open(cachekey, "r")) self._cache.put(cachekey, meta, st_meta.st_mtime) + if fullpath == ospath and "wildcard_metadata" in metablob: + for wild in metablob["wildcard_metadata"]: + if fnmatch.fnmatch(pth, wild[0]): + metablob.update(wild[1]) + metablob.update(meta) # return final dict metablob["dir"], metablob["file_name"] = os.path.split(rel_path) metablob["file_path"] = rel_path - metablob["uuid"] = uuid.uuid3( - uuid.NAMESPACE_OID, metablob["uuid-oid-root"] + os.path.join(self._root, rel_path) - ) + metablob["relpath"] = os.path.relpath("/", "/" + metablob["dir"]) + metablob["uuid"] = uuid.uuid3(uuid.NAMESPACE_OID, metablob["uuid-oid-root"] + ospath) metablob["os-path"], _ = os.path.split(fullpath) - metablob["guessed-type"] = guess_mime(os.path.join(self._root, rel_path)) + metablob["guessed-type"] = guess_mime(ospath) if "mime-type" not in metablob: metablob["mime-type"] = metablob["guessed-type"] metablob["stat"] = {} diff --git a/pixywerk2/pygments.py b/pixywerk2/pygments.py new file mode 100644 index 0000000..c96de3b --- /dev/null +++ b/pixywerk2/pygments.py @@ -0,0 +1,36 @@ +"""Map Pygments into the Template API for inclusion in outputs.""" +from typing import Optional + +import pygments +import pygments.formatters +import pygments.lexers +import pygments.util +import pygments.styles + + + +def pygments_markup_contents_html(input_text: str, file_type: str, style: Optional[str]=None) -> str: + """Format input string with Pygments and return HTML.""" + + if style is None: + style = 'default' + style = pygments.styles.get_style_by_name(style) + formatter = pygments.formatters.get_formatter_by_name('html', style=style) + try: + lexer = pygments.lexers.get_lexer_for_filename(file_type) + except pygments.util.ClassNotFound: + try: + lexer = pygments.lexers.get_lexer_by_name(file_type) + except pygments.util.ClassNotFound: + lexer = pygments.lexers.get_lexer_by_mimetype(file_type) + + return pygments.highlight(input_text, lexer, formatter) + +def pygments_get_css(style: Optional[str]=None) -> str: + """Return the CSS styles associated with a particular style definition.""" + + if style is None: + style = 'default' + style = pygments.styles.get_style_by_name(style) + formatter = pygments.formatters.get_formatter_by_name('html', style=style) + return formatter.get_style_defs() diff --git a/pixywerk2/template_tools.py b/pixywerk2/template_tools.py index 56c71f2..47e5c79 100644 --- a/pixywerk2/template_tools.py +++ b/pixywerk2/template_tools.py @@ -51,6 +51,14 @@ def file_name(root: str, metatree: MetaTree, processor_chains: ProcessorChains, return get_file_name +def file_raw(root: str, contcache: Dict) -> Callable: + def get_raw(file_name: str) -> str: + if file_name in contcache: + return contcache[file_name] + with open(os.path.join(root, file_name), 'r', encoding="utf-8") as f: + return f.read() + + return get_raw def file_content(root: str, metatree: MetaTree, processor_chains: ProcessorChains, contcache: Dict) -> Callable: def get_file_content(file_name: str) -> Iterable: @@ -59,7 +67,7 @@ def file_content(root: str, metatree: MetaTree, processor_chains: ProcessorChain metadata = metatree.get_metadata(file_name) chain = processor_chains.get_chain_for_filename(os.path.join(root, file_name), ctx=metadata) contcache[file_name] = chain.output - return chain.output + return unicode(chain.output) return get_file_content diff --git a/setup.py b/setup.py index fa63b07..9e41013 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ from setuptools import find_packages, setup LONG_DESCRIPTION = """Pixywerk 2 is a filesystem based static site generator.""" -INSTALL_REQUIRES = ["yaml-1.3", "markdown", "jstyleson", "jinja2"] +INSTALL_REQUIRES = ["yaml-1.3", "markdown", "jstyleson", "jinja2", "pygments"] # Extra dependencies EXTRAS_REQUIRE = {