commit ed7fc0d860321212a38f6fa8db14af5a5d34d2a6 Author: Jonathan Harker Date: Sat Mar 29 14:47:41 2014 +1300 Initial commit. diff --git a/conf.py b/conf.py new file mode 100644 index 0000000..4dd9b53 --- /dev/null +++ b/conf.py @@ -0,0 +1,715 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals +import time + +#!! This is the configuration of Nikola. !!# +#!! You should edit it to your liking. !!# + + +# Data about this site +BLOG_AUTHOR = "Jonathan Harker" +BLOG_TITLE = "Pukerua Bay Community Garden" +# This is the main URL for your site. It will be used +# in a prominent link +SITE_URL = "http://gardens.pukeruabay.org.nz/" +# This is the URL where nikola's output will be deployed. +# If not set, defaults to SITE_URL +# BASE_URL = "http://getnikola.com/" +BLOG_EMAIL = "jonathan@harker.kiwi.nz" +BLOG_DESCRIPTION = "The Pukerua Bay community garden and food forest project." + +# Nikola is multilingual! +# +# Currently supported languages are: +# bg Bulgarian +# ca Catalan +# cs Czech [ALTERNATIVELY cz] +# de German +# el Greek [NOT gr!] +# en English +# eo Esperanto +# es Spanish +# et Estonian +# eu Basque +# fa Persian +# fi Finnish +# fr French +# hi Hindi +# hr Croatian +# it Italian +# ja Japanese [NOT jp!] +# nb Norwegian Bokmål +# nl Dutch +# pt_br Portuguese (Brasil) +# pl Polish +# ru Russian +# sl Slovenian [NOT sl_si!] +# tr Turkish (Turkey) [NOT tr_tr!] +# ur Urdu +# zh_cn Chinese (Simplified) +# +# If you want to use Nikola with a non-supported language you have to provide +# a module containing the necessary translations +# (cf. the modules at nikola/data/themes/base/messages/). +# If a specific post is not translated to a language, then the version +# in the default language will be shown instead. + +# What is the default language? +DEFAULT_LANG = "en" + +# What other languages do you have? +# The format is {"translationcode" : "path/to/translation" } +# the path will be used as a prefix for the generated pages location +TRANSLATIONS = { + DEFAULT_LANG: "", + # Example for another language: + # "es": "./es", +} + +# What will translated input files be named like? + +# If you have a page something.rst, then something.rst.pl will be considered +# its Polish translation. +# (in the above example: path == "something", lang == "pl", ext == "rst") +# this pattern is also used for metadata: +# something.meta -> something.meta.pl + +TRANSLATIONS_PATTERN = "{path}.{ext}.{lang}" + +# If you don't want your Polish files to be considered Perl code, use this: +# TRANSLATIONS_PATTERN = "{path}.{lang}.{ext}" +# Note that this pattern will become the default in v7.0.0. + +# Links for the sidebar / navigation bar. +# You should provide a key-value pair for each used language. +NAVIGATION_LINKS = { + DEFAULT_LANG: ( + ('/archive.html', 'Archives'), + ('/categories/index.html', 'Tags'), + ('/rss.xml', 'RSS'), + ), +} + +# Below this point, everything is optional + +# While nikola can select a sensible locale for each language, +# sometimes explicit control can come handy. +# In this file we express locales in the string form that +# python's locales will accept in your OS, by example +# "en_US.utf8" in unix-like OS, "English_United States" in Windows. +# LOCALES = dict mapping language --> explicit locale for the languages +# in TRANSLATIONS. You can ommit one or more keys. +# LOCALE_FALLBACK = locale to use when an explicit locale is unavailable +# LOCALE_DEFAULT = locale to use for languages not mentioned in LOCALES; if +# not set the default Nikola mapping is used. + +# POSTS and PAGES contains (wildcard, destination, template) tuples. +# +# The wildcard is used to generate a list of reSt source files +# (whatever/thing.txt). +# +# That fragment could have an associated metadata file (whatever/thing.meta), +# and optionally translated files (example for spanish, with code "es"): +# whatever/thing.txt.es and whatever/thing.meta.es +# +# This assumes you use the default TRANSLATIONS_PATTERN. +# +# From those files, a set of HTML fragment files will be generated: +# cache/whatever/thing.html (and maybe cache/whatever/thing.html.es) +# +# These files are combinated with the template to produce rendered +# pages, which will be placed at +# output / TRANSLATIONS[lang] / destination / pagename.html +# +# where "pagename" is the "slug" specified in the metadata file. +# +# The difference between POSTS and PAGES is that POSTS are added +# to feeds and are considered part of a blog, while PAGES are +# just independent HTML pages. +# + +POSTS = ( +("posts/*.rst", "posts", "post.tmpl"), +("posts/*.txt", "posts", "post.tmpl"), +) +PAGES = ( +("stories/*.rst", "stories", "story.tmpl"), +("stories/*.txt", "stories", "story.tmpl"), +) + +# One or more folders containing files to be copied as-is into the output. +# The format is a dictionary of "source" "relative destination". +# Default is: +# FILES_FOLDERS = {'files': '' } +# Which means copy 'files' into 'output' + +# A mapping of languages to file-extensions that represent that language. +# Feel free to add or delete extensions to any list, but don't add any new +# compilers unless you write the interface for it yourself. +# +# 'rest' is reStructuredText +# 'markdown' is MarkDown +# 'html' assumes the file is html and just copies it +COMPILERS = { +"rest": ('.rst', '.txt'), +"markdown": ('.md', '.mdown', '.markdown'), +"textile": ('.textile',), +"txt2tags": ('.t2t',), +"bbcode": ('.bb',), +"wiki": ('.wiki',), +"ipynb": ('.ipynb',), +"html": ('.html', '.htm'), +# PHP files are rendered the usual way (i.e. with the full templates). +# The resulting files have .php extensions, making it possible to run +# them without reconfiguring your server to recognize them. +"php": ('.php',), +# Pandoc detects the input from the source filename +# but is disabled by default as it would conflict +# with many of the others. +# "pandoc": ('.rst', '.md', '.txt'), +} + +# Create by default posts in one file format? +# Set to False for two-file posts, with separate metadata. +# ONE_FILE_POSTS = True + +# If this is set to True, then posts that are not translated to a language +# LANG will not be visible at all in the pages in that language. +# If set to False, the DEFAULT_LANG version will be displayed for +# untranslated posts. +# HIDE_UNTRANSLATED_POSTS = False + +# Paths for different autogenerated bits. These are combined with the +# translation paths. + +# Final locations are: +# output / TRANSLATION[lang] / TAG_PATH / index.html (list of tags) +# output / TRANSLATION[lang] / TAG_PATH / tag.html (list of posts for a tag) +# output / TRANSLATION[lang] / TAG_PATH / tag.xml (RSS feed for a tag) +# TAG_PATH = "categories" + +# If TAG_PAGES_ARE_INDEXES is set to True, each tag's page will contain +# the posts themselves. If set to False, it will be just a list of links. +# TAG_PAGES_ARE_INDEXES = True + +# Final location for the main blog page and sibling paginated pages is +# output / TRANSLATION[lang] / INDEX_PATH / index-*.html +# INDEX_PATH = "" + +# Create per-month archives instead of per-year +# CREATE_MONTHLY_ARCHIVE = False +# Create one large archive instead of per-year +# CREATE_SINGLE_ARCHIVE = False +# Final locations for the archives are: +# output / TRANSLATION[lang] / ARCHIVE_PATH / ARCHIVE_FILENAME +# output / TRANSLATION[lang] / ARCHIVE_PATH / YEAR / index.html +# output / TRANSLATION[lang] / ARCHIVE_PATH / YEAR / MONTH / index.html +# ARCHIVE_PATH = "" +# ARCHIVE_FILENAME = "archive.html" + +# URLs to other posts/pages can take 3 forms: +# rel_path: a relative URL to the current page/post (default) +# full_path: a URL with the full path from the root +# absolute: a complete URL (that includes the SITE_URL) +# URL_TYPE = 'rel_path' + +# Final location for the blog main RSS feed is: +# output / TRANSLATION[lang] / RSS_PATH / rss.xml +# RSS_PATH = "" + +# Number of posts in RSS feeds +# FEED_LENGTH = 10 + +# Slug the Tag URL easier for users to type, special characters are +# often removed or replaced as well. +# SLUG_TAG_PATH = True + +# A list of redirection tuples, [("foo/from.html", "/bar/to.html")]. +# +# A HTML file will be created in output/foo/from.html that redirects +# to the "/bar/to.html" URL. notice that the "from" side MUST be a +# relative URL. +# +# If you don't need any of these, just set to [] +# REDIRECTIONS = [] + +# Commands to execute to deploy. Can be anything, for example, +# you may use rsync: +# "rsync -rav --delete output/ joe@my.site:/srv/www/site" +# And then do a backup, or run `nikola ping` from the `ping` +# plugin (`nikola install_plugin ping`). +# To do manual deployment, set it to [] +DEPLOY_COMMANDS = ['rsync -avz --delete output/* tauceti.openblue.co.nz:sites/pukeruabay/gardens/www/'] + +# Where the output site should be located +# If you don't use an absolute path, it will be considered as relative +# to the location of conf.py +# OUTPUT_FOLDER = 'output' + +# where the "cache" of partial generated content should be located +# default: 'cache' +# CACHE_FOLDER = 'cache' + +# Filters to apply to the output. +# A directory where the keys are either: a file extensions, or +# a tuple of file extensions. +# +# And the value is a list of commands to be applied in order. +# +# Each command must be either: +# +# A string containing a '%s' which will +# be replaced with a filename. The command *must* produce output +# in place. +# +# Or: +# +# A python callable, which will be called with the filename as +# argument. +# +# By default, there are no filters. +# +# Many filters are shipped with Nikola. A list is available in the manual: +# +# FILTERS = { +# ".jpg": ["jpegoptim --strip-all -m75 -v %s"], +# } + +# Expert setting! Create a gzipped copy of each generated file. Cheap server- +# side optimization for very high traffic sites or low memory servers. +# GZIP_FILES = False +# File extensions that will be compressed +# GZIP_EXTENSIONS = ('.txt', '.htm', '.html', '.css', '.js', '.json', '.xml') +# Use an external gzip command? None means no. +# Example: GZIP_COMMAND = "pigz -k {filename}" +# GZIP_COMMAND = None +# Make sure the server does not return a "Accept-Ranges: bytes" header for +# files compressed by this option! OR make sure that a ranged request does not +# return partial content of another representation for these resources. Do not +# use this feature if you do not understand what this means. + +# Compiler to process LESS files. +# LESS_COMPILER = 'lessc' + +# A list of options to pass to the LESS compiler. +# Final command is: LESS_COMPILER LESS_OPTIONS file.less +# LESS_OPTIONS = [] + +# Compiler to process Sass files. +# SASS_COMPILER = 'sass' + +# A list of options to pass to the Sass compiler. +# Final command is: SASS_COMPILER SASS_OPTIONS file.s(a|c)ss +# SASS_OPTIONS = [] + +# ############################################################################# +# Image Gallery Options +# ############################################################################# + +# Galleries are folders in galleries/ +# Final location of galleries will be output / GALLERY_PATH / gallery_name +GALLERY_PATH = "galleries" +THUMBNAIL_SIZE = 180 +MAX_IMAGE_SIZE = 1280 +USE_FILENAME_AS_TITLE = True +EXTRA_IMAGE_EXTENSIONS = [] +# +# If set to False, it will sort by filename instead. Defaults to True +GALLERY_SORT_BY_DATE = True + +# ############################################################################# +# HTML fragments and diverse things that are used by the templates +# ############################################################################# + +# Data about post-per-page indexes. +# INDEXES_PAGES defaults to 'old posts, page %d' or 'page %d' (translated), +# depending on the value of INDEXES_PAGES_MAIN. +# INDEXES_TITLE = "" # If this is empty, defaults to BLOG_TITLE +# INDEXES_PAGES = "" # If this is empty, defaults to '[old posts,] page %d' (see above) +# INDEXES_PAGES_MAIN = False # If True, INDEXES_PAGES is also displayed on + # the main (the newest) index page (index.html) + +# Name of the theme to use. +THEME = "bootstrap3" + +# Color scheme to be used for code blocks. If your theme provides +# "assets/css/code.css" this is ignored. +# Can be any of autumn borland bw colorful default emacs friendly fruity manni +# monokai murphy native pastie perldoc rrt tango trac vim vs +# CODE_COLOR_SCHEME = 'default' + +# If you use 'site-reveal' theme you can select several subthemes +# THEME_REVEAL_CONFIG_SUBTHEME = 'sky' +# You can also use: beige/serif/simple/night/default + +# Again, if you use 'site-reveal' theme you can select several transitions +# between the slides +# THEME_REVEAL_CONFIG_TRANSITION = 'cube' +# You can also use: page/concave/linear/none/default + +# date format used to display post dates. +# (str used by datetime.datetime.strftime) +# DATE_FORMAT = '%Y-%m-%d %H:%M' + +# FAVICONS contains (name, file, size) tuples. +# Used for create favicon link like this: +# +# For creating favicons, take a look at: +# http://www.netmagazine.com/features/create-perfect-favicon +# FAVICONS = { +# ("icon", "/favicon.ico", "16x16"), +# ("icon", "/icon_128x128.png", "128x128"), +# } + +# Show only teasers in the index pages? Defaults to False. +# INDEX_TEASERS = False + +# A HTML fragment with the Read more... link. +# The following tags exist and are replaced for you: +# {link} A link to the full post page. +# {read_more} The string “Read more” in the current language. +# {{ A literal { (U+007B LEFT CURLY BRACKET) +# }} A literal } (U+007D RIGHT CURLY BRACKET) +# READ_MORE_LINK = '

{read_more}…

' + +# A HTML fragment describing the license, for the sidebar. +LICENSE = "" +# I recommend using the Creative Commons' wizard: +# http://creativecommons.org/choose/ +# LICENSE = """ +# +# Creative Commons License BY-NC-SA""" + +# A small copyright notice for the page footer (in HTML). +CONTENT_FOOTER = 'Contents © {date} {author} - Powered by Nikola {license}' +CONTENT_FOOTER = CONTENT_FOOTER.format(email=BLOG_EMAIL, + author=BLOG_AUTHOR, + date=time.gmtime().tm_year, + license=LICENSE) + +# To use comments, you can choose between different third party comment +# systems, one of "disqus", "livefyre", "intensedebate", "moot", +# "googleplus", "facebook" or "isso" +COMMENT_SYSTEM = "disqus" +# And you also need to add your COMMENT_SYSTEM_ID which +# depends on what comment system you use. The default is +# "nikolademo" which is a test account for Disqus. More information +# is in the manual. +COMMENT_SYSTEM_ID = "pukeruabaygardens" + +# Enable annotations using annotateit.org? +# If set to False, you can still enable them for individual posts and pages +# setting the "annotations" metadata. +# If set to True, you can disable them for individual posts and pages using +# the "noannotations" metadata. +# ANNOTATIONS = False + +# Create index.html for story folders? +# STORY_INDEX = False +# Enable comments on story pages? +# COMMENTS_IN_STORIES = False +# Enable comments on picture gallery pages? +# COMMENTS_IN_GALLERIES = False + +# What file should be used for directory indexes? +# Defaults to index.html +# Common other alternatives: default.html for IIS, index.php +# INDEX_FILE = "index.html" + +# If a link ends in /index.html, drop the index.html part. +# http://mysite/foo/bar/index.html => http://mysite/foo/bar/ +# (Uses the INDEX_FILE setting, so if that is, say, default.html, +# it will instead /foo/default.html => /foo) +# (Note: This was briefly STRIP_INDEX_HTML in v 5.4.3 and 5.4.4) +# Default = False +# STRIP_INDEXES = False + +# Should the sitemap list directories which only include other directories +# and no files. +# Default to True +# If this is False +# e.g. /2012 includes only /01, /02, /03, /04, ...: don't add it to the sitemap +# if /2012 includes any files (including index.html)... add it to the sitemap +# SITEMAP_INCLUDE_FILELESS_DIRS = True + +# Instead of putting files in .html, put them in +# /index.html. Also enables STRIP_INDEXES +# This can be disabled on a per-page/post basis by adding +# .. pretty_url: False +# to the metadata +# PRETTY_URLS = False + +# If True, publish future dated posts right away instead of scheduling them. +# Defaults to False. +# FUTURE_IS_NOW = False + +# If True, future dated posts are allowed in deployed output +# Only the individual posts are published/deployed; not in indexes/sitemap +# Generally, you want FUTURE_IS_NOW and DEPLOY_FUTURE to be the same value. +# DEPLOY_FUTURE = False +# If False, draft posts will not be deployed +# DEPLOY_DRAFTS = True + +# Allows scheduling of posts using the rule specified here (new_post -s) +# Specify an iCal Recurrence Rule: http://www.kanzaki.com/docs/ical/rrule.html +# SCHEDULE_RULE = '' +# If True, use the scheduling rule to all posts by default +# SCHEDULE_ALL = False +# If True, schedules post to today if possible, even if scheduled hour is over +# SCHEDULE_FORCE_TODAY = False + +# Do you want a add a Mathjax config file? +# MATHJAX_CONFIG = "" + +# If you are using the compile-ipynb plugin, just add this one: +#MATHJAX_CONFIG = """ +# +#""" + +# Do you want to customize the nbconversion of your IPython notebook? +# IPYNB_CONFIG = {} +# With the following example configuracion you can use a custom jinja template +# called `toggle.tpl` which has to be located in your site/blog main folder: +# IPYNB_CONFIG = {'Exporter':{'template_file': 'toggle'}} + +# What MarkDown extensions to enable? +# You will also get gist, nikola and podcast because those are +# done in the code, hope you don't mind ;-) +# MARKDOWN_EXTENSIONS = ['fenced_code', 'codehilite'] + +# Social buttons. This is sample code for AddThis (which was the default for a +# long time). Insert anything you want here, or even make it empty. +# SOCIAL_BUTTONS_CODE = """ +# +#
+# Share +#
  • +#
  • +#
  • +#
  • +#
+#
+# +# +# """ + +# Hide link to source for the posts? +HIDE_SOURCELINK = True +# Copy the source files for your pages? +# Setting it to False implies HIDE_SOURCELINK = True +COPY_SOURCES = False + +# Modify the number of Post per Index Page +# Defaults to 10 +# INDEX_DISPLAY_POST_COUNT = 10 + +# RSS_LINK is a HTML fragment to link the RSS or Atom feeds. If set to None, +# the base.tmpl will use the feed Nikola generates. However, you may want to +# change it for a feedburner feed or something else. +# RSS_LINK = None + +# Show only teasers in the RSS feed? Default to True +# RSS_TEASERS = True + +# A search form to search this site, for the sidebar. You can use a google +# custom search (http://www.google.com/cse/) +# Or a duckduckgo search: https://duckduckgo.com/search_box.html +# Default is no search form. +# SEARCH_FORM = "" +# +# This search form works for any site and looks good in the "site" theme where +# it appears on the navigation bar: +# +#SEARCH_FORM = """ +# +# +# +#""" % SITE_URL +# +# If you prefer a google search form, here's an example that should just work: +#SEARCH_FORM = """ +# +# +# +#""" % SITE_URL + +# Also, there is a local search plugin you can use, based on Tipue, but it requires setting several +# options: + +# SEARCH_FORM = """ +# +# +# """ +# +# BODY_END = """ +# +# +# +# """ + +# EXTRA_HEAD_DATA = """ +# +#
+# """ +# ENABLED_EXTRAS = ['local_search'] +# + + +# Use content distribution networks for jquery and twitter-bootstrap css and js +# If this is True, jquery is served from the Google CDN and twitter-bootstrap +# is served from the NetDNA CDN +# Set this to False if you want to host your site without requiring access to +# external resources. +# USE_CDN = False + +# Extra things you want in the pages HEAD tag. This will be added right +# before +# EXTRA_HEAD_DATA = "" +# Google Analytics or whatever else you use. Added to the bottom of +# in the default template (base.tmpl). +# BODY_END = "" + +# The possibility to extract metadata from the filename by using a +# regular expression. +# To make it work you need to name parts of your regular expression. +# The following names will be used to extract metadata: +# - title +# - slug +# - date +# - tags +# - link +# - description +# +# An example re is the following: +# '(?P\d{4}-\d{2}-\d{2})-(?P.*)-(?P.*)\.md' +# FILE_METADATA_REGEXP = None + +# Additional metadata that is added to a post when creating a new_post +# ADDITIONAL_METADATA = {} + +# Nikola supports Twitter Card summaries / Open Graph. +# Twitter cards make it possible for you to attach media to Tweets +# that link to your content. +# +# IMPORTANT: +# Please note, that you need to opt-in for using Twitter Cards! +# To do this please visit +# https://dev.twitter.com/form/participate-twitter-cards +# +# Uncomment and modify to following lines to match your accounts. +# Specifying the id for either 'site' or 'creator' will be preferred +# over the cleartext username. Specifying an ID is not necessary. +# Displaying images is currently not supported. +# TWITTER_CARD = { +# # 'use_twitter_cards': True, # enable Twitter Cards / Open Graph +# # 'site': '@website', # twitter nick for the website +# # 'site:id': 123456, # Same as site, but the website's Twitter user ID +# # instead. +# # 'creator': '@username', # Username for the content creator / author. +# # 'creator:id': 654321, # Same as creator, but the Twitter user's ID. +# } + + +# Post's dates are considered in UTC by default, if you want to use +# another time zone, please set TIMEZONE to match. Check the available +# list from Wikipedia: +# http://en.wikipedia.org/wiki/List_of_tz_database_time_zones +# (eg. 'Europe/Zurich') +# Also, if you want to use a different time zone in some of your posts, +# you can use W3C-DTF Format (ex. 2012-03-30T23:00:00+02:00) +# +TIMEZONE = 'Pacific/Auckland' + +# If webassets is installed, bundle JS and CSS to make site loading faster +# USE_BUNDLES = True + +# Plugins you don't want to use. Be careful :-) +# DISABLED_PLUGINS = ["render_galleries"] + +# Add the absolute paths to directories containing plugins to use them. +# For example, the `plugins` directory of your clone of the Nikola plugins +# repository. +# EXTRA_PLUGINS_DIRS = [] + +# Experimental plugins - use at your own risk. +# They probably need some manual adjustments - please see their respective +# readme. +# ENABLED_EXTRAS = [ +# 'planetoid', +# 'ipynb', +# 'local_search', +# 'render_mustache', +# ] + +# List of regular expressions, links matching them will always be considered +# valid by "nikola check -l" +# LINK_CHECK_WHITELIST = [] + +# If set to True, enable optional hyphenation in your posts (requires pyphen) +# HYPHENATE = False + +# The <hN> tags in HTML generated by certain compilers (reST/Markdown) +# will be demoted by that much (1 → h1 will become h2 and so on) +# This was a hidden feature of the Markdown and reST compilers in the +# past. Useful especially if your post titles are in <h1> tags too, for +# example. +# (defaults to 1.) +# DEMOTE_HEADERS = 1 + +# You can configure the logging handlers installed as plugins or change the +# log level of the default stdout handler. +LOGGING_HANDLERS = { + 'stderr': {'loglevel': 'WARNING', 'bubble': True}, + #'smtp': { + # 'from_addr': 'test-errors@example.com', + # 'recipients': ('test@example.com'), + # 'credentials':('testusername', 'password'), + # 'server_addr': ('127.0.0.1', 25), + # 'secure': (), + # 'level': 'DEBUG', + # 'bubble': True + #} +} + +# Templates will use those filters, along with the defaults. +# Consult your engine's documentation on filters if you need help defining +# those. +# TEMPLATE_FILTERS = {} + +# Put in global_context things you want available on all your templates. +# It can be anything, data, functions, modules, etc. +GLOBAL_CONTEXT = {} diff --git a/images/communitygarden-map.png b/images/communitygarden-map.png new file mode 100644 index 0000000..ddaa95a Binary files /dev/null and b/images/communitygarden-map.png differ diff --git a/plugins/microdata/README.md b/plugins/microdata/README.md new file mode 100644 index 0000000..7396a3b --- /dev/null +++ b/plugins/microdata/README.md @@ -0,0 +1,50 @@ +This plugin adds microdata semantic markups in reStructuredText for Nikola static blog generator. The original author is Axel Haustant (noirbizarre). This code is fork from https://github.com/noirbizarre/pelican-microdata. The standalone package will be at https://github.com/ivanteoh/nikola-microdata + +Currently supported in general: + +* `itemscope` +* `itemprop` + +### Usage + +```ReST + + .. itemscope:: <Schema type> + :tag: element type (default: div) + + Nested content + + + :itemprop:`Displayed test <itemprop name>` +``` + +### Examples + +This reStructuredText document: + +```ReST + + .. itemscope: Person + :tag: p + + My name is :itemprop:`Bob Smith <name>` + but people call me :itemprop:`Smithy <nickanme>`. + Here is my home page: + :itemprop:`www.exemple.com <url:http://www.example.com>` + I live in Albuquerque, NM and work as an :itemprop:`engineer <title>` + at :itemprop:`ACME Corp <affiliation>`. +``` + +will result in: + +```html + + <p itemscope itemtype="http://data-vocabulary.org/Person"> + My name is <span itemprop="name">Bob Smith</span> + but people call me <span itemprop="nickname">Smithy</span>. + Here is my home page: + <a href="http://www.example.com" itemprop="url">www.example.com</a> + I live in Albuquerque, NM and work as an <span itemprop="title">engineer</span> + at <span itemprop="affiliation">ACME Corp</span>. + </p> +``` diff --git a/plugins/microdata/microdata.plugin b/plugins/microdata/microdata.plugin new file mode 100644 index 0000000..1eef288 --- /dev/null +++ b/plugins/microdata/microdata.plugin @@ -0,0 +1,13 @@ +[Core] +Name = rest_microdata +Module = microdata +Tests = test_microdata + +[Nikola] +MinVersion = 6.3.0 + +[Documentation] +Author = Axel Haustant, Ivan Teoh +Version = 0.1 +Website = http://plugins.getnikola.com/#microdata +Description = Microdata semantic markups support for Nikola static blog generator. diff --git a/plugins/microdata/microdata.py b/plugins/microdata/microdata.py new file mode 100644 index 0000000..e9f3d24 --- /dev/null +++ b/plugins/microdata/microdata.py @@ -0,0 +1,188 @@ +# -*- coding: utf-8 -*- + +# Copyright © 2013-2014 Axel Haustant, Ivan Teoh and others. + +# pelican-microdata is LGPL-licensed. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +from __future__ import unicode_literals + +import re + +from docutils import nodes +from docutils.parsers.rst import directives, Directive, roles +from nikola.plugin_categories import RestExtension +from nikola.plugins.compile.rest import add_node + +RE_ROLE = re.compile(r'(?P<value>.+?)?\s*\<(?P<name>.+)\>') + + +class Plugin(RestExtension): + + name = "rest_microdata" + + def set_site(self, site): + self.site = site + directives.register_directive('itemscope', ItemScopeDirective) + directives.register_directive('itempropblock', ItemPropDirective) + roles.register_canonical_role('itemprop', itemprop_role) + + add_node(ItemProp, visit_ItemProp, depart_ItemProp) + add_node(ItemPropBlock, visit_ItemPropBlock, depart_ItemPropBlock) + add_node(ItemScope, visit_ItemScope, depart_ItemScope) + + return super(Plugin, self).set_site(site) + + +class ItemProp(nodes.Inline, nodes.TextElement): + pass + + +def itemprop_role(role, rawtext, text, lineno, inliner, options={}, content=[]): + match = RE_ROLE.match(text) + if not match or not match.group('name'): + raise ValueError('%s does not match expected itemprop format: :itemprop:`value <name>`') + value = '' + if match.group('value'): + value = match.group('value') + name = match.group('name') + info = '' + tag = 'span' + if ':' in name: + # depreciated, use | for nikola + name, info = name.split(':', 1) + elif '|' in name: + names = name.split('|', 2) + name = names[0] + if len(names) > 1: + info = names[1] + if len(names) > 2: + tag = names[2] + return [ItemProp(value, value, name=name, info=info, tag=tag)], [] + + +class ItemPropBlock(nodes.Element): + def __init__(self, tagname, itemprop, classes=None): + kwargs = { + 'itemprop': itemprop, + } + if classes: + kwargs['class'] = classes + super(ItemPropBlock, self).__init__('', **kwargs) + self.tagname = tagname + + +class ItemPropDirective(Directive): + required_arguments = 1 + has_content = True + option_spec = { + 'tag': directives.unchanged, + 'class': directives.unchanged, + } + + def run(self): + # Raise an error if the directive does not have contents. + self.assert_has_content() + itemprop = self.arguments[0] + tag = self.options.get('tag', 'div') + classes = self.options.get('class', None) + node = ItemPropBlock(tag, itemprop, classes) + self.add_name(node) + self.state.nested_parse(self.content, self.content_offset, node) + return [node] + + +class ItemScope(nodes.Element): + def __init__(self, tagname, itemtype, itemprop=None, compact=False, classes=None): + kwargs = { + 'itemscope': None, + 'itemtype': "http://data-vocabulary.org/%s" % itemtype, + } + if itemprop: + kwargs['itemprop'] = itemprop + if classes: + kwargs['class'] = classes + super(ItemScope, self).__init__('', **kwargs) + self.tagname = tagname + self.compact = tagname == 'p' or compact + + +class ItemScopeDirective(Directive): + required_arguments = 1 + has_content = True + option_spec = { + 'tag': directives.unchanged, + 'itemprop': directives.unchanged, + 'compact': directives.unchanged, + 'class': directives.unchanged, + } + + def run(self): + # Raise an error if the directive does not have contents. + self.assert_has_content() + itemtype = self.arguments[0] + tag = self.options.get('tag', 'div') + itemprop = self.options.get('itemprop', None) + compact = 'compact' in self.options + classes = self.options.get('class', None) + node = ItemScope(tag, itemtype, itemprop, compact, classes) + self.add_name(node) + self.state.nested_parse(self.content, self.content_offset, node) + return [node] + + +def visit_ItemProp(self, node): + if not node['tag']: + node['tag'] = 'span' + + if node['name'] == 'url': + node['tag'] = 'a' + self.body.append(self.starttag(node, node['tag'], '', itemprop=node['name'], href=node['info'])) + elif node['tag'] == 'img': + self.body.append(self.emptytag(node, node['tag'], '', itemprop=node['name'], src=node['info'])) + elif node['tag'] == 'time': + # TODO: auto convert the time + self.body.append(self.starttag(node, node['tag'], '', itemprop=node['name'], datetime=node['info'])) + elif node['tag'] == 'meta': + # TODO: auto convert the time + self.body.append(self.emptytag(node, node['tag'], '', itemprop=node['name'], content=node['info'])) + else: + self.body.append(self.starttag(node, node['tag'], '', itemprop=node['name'])) + + +def depart_ItemProp(self, node): + end_tag = '</' + node['tag'] + '>' + if node['tag'] == 'img' or node['tag'] == 'meta': + return + self.body.append(end_tag) + + +def visit_ItemPropBlock(self, node): + self.body.append(node.starttag()) + + +def depart_ItemPropBlock(self, node): + self.body.append(node.endtag()) + + +def visit_ItemScope(self, node): + self.context.append(self.compact_simple) + self.compact_simple = node.compact + self.body.append(node.starttag()) + + +def depart_ItemScope(self, node): + self.compact_simple = self.context.pop() + self.body.append(node.endtag()) diff --git a/plugins/microdata/microdata.pyc b/plugins/microdata/microdata.pyc new file mode 100644 index 0000000..5e20a8c Binary files /dev/null and b/plugins/microdata/microdata.pyc differ diff --git a/posts/pukerua-bay-school-gala.rst b/posts/pukerua-bay-school-gala.rst new file mode 100644 index 0000000..88a1a5f --- /dev/null +++ b/posts/pukerua-bay-school-gala.rst @@ -0,0 +1,88 @@ +.. title: Pukerua Bay Community Garden Food Forest Project +.. slug: pukerua-bay-community-garden +.. date: 2014/03/29 01:45:23 +.. tags: +.. link: +.. description: +.. type: restructuredText + +.. image:: /assets/images/communitygarden-map.png + :align: right + :alt: Map of the proposed community garden site in the Muri Reserve. + +Hi folks! If you're reading this, you've either searched for it on Google, +or got here from the URL on the brochure at the School Gala. Either way - +welcome to the website! I'd like to use this as a hub for lively discussions, +organising events, planning sessions and working bees, and sharing of ideas +and hopes and goals. + + This site will change once we get started. I will gather the ideas + from the gala day and put them up here, and reorganise things into + categories as we go. + +Proposed garden site in Muri Reserve +------------------------------------ + +The Pukerua Bay Residents' Association have decided on +a location for the community garden, in the Muri Reserve behind the closed Muri +train station, as indicated on the map. There is a +`Google map with more details here <http://goo.gl/Odu8Wx>`_. + +The idea of a community garden in Pukerua Bay has been around for a while, but +has gathered steam over the last couple of years. I'd like to really help us +get it off the ground by gathering a quorum of interested and willing folks, +to plan the next steps. + +Inspirational videos +-------------------- + +Martin Crawford of the Agroforestry Research Centre in Devon UK, shows us +around his forest garden project, and explains some of the science and practical +principles behind it: + +.. youtube:: b_fhAch5qiY + :height: 315 + :width: 560 + +And in New Zealand, Robert and Robyn Guyton show us around their two acre +food forest in Riverton, Southland: + +.. youtube:: L74WkW1rWKU + :height: 315 + :width: 560 + +Planning +-------- + +There are several things that we will need to plan: + +- Site assessments of micro-climate, shelter, layout. +- Ground slope and consideration of constructing swales for water retention. +- Ground clearance and re-seeding groundcover. +- Access to the site for larger equipment. +- Orchard planning and plant selection. +- Layout and construction of raised beds. Do we want to share the beds, or + lease individual allotment space, or both? +- Get a compost system started. +- Plant and mulch the orchard trees. +- Get local beekeepers on board and find a safe spot for some beehives. +- Potential space for chicken coops. + +Contact us! +----------- + +To get in contact, come along to the next `Residents' Association meeting <http://pukeruabay.org.nz/>`_ +or email `Jonathan <mailto:jonathan@harker.kiwi.nz>`_. I will set up an email list from +people who registered interest at the gala day. + +Links +----- + +- The excellent *Manual for creating a community food forest on public land* + by Andy Cambeis of the Hawea Flat Food Forest Trust. The manual is very + thorough, Creative-Commons licensed and available + `online <https://docs.google.com/document/d/1TGhzTV_PdZAkRpxQgKmtzDHg0lcLzat7WXMm5-dvaHg/edit>`_. +- Tim and the resources on his site, `Pig in the mud <http://piginthemud.com>`_. Tim helps to run + a Wellington community garden at the top of Majoribanks Street. +- The national `Permaculture Hui 2014 <http://permaculturehui2014.org.nz/>`_ is on 25-27 April in + Island Bay and should be very educational.