diff --git a/Contributing.rst b/Contributing.rst index 8e5b0e5..3f09c17 100644 --- a/Contributing.rst +++ b/Contributing.rst @@ -3,7 +3,7 @@ Contributing a plugin Details of how to write a plugin is explained in the official Pelican `docs`_. -If you want to contribute, please fork this repository and issue your pull +If you want to contribute, please fork this repository and issue your pull request. Make sure that your plugin follows the structure below:: my_plugin @@ -11,7 +11,7 @@ request. Make sure that your plugin follows the structure below:: ├── my_plugin.py ├── test_my_plugin.py └── Readme.rst / Readme.md - + ``my_plugin.py`` is the actual plugin implementation. Include a brief explanation of what the plugin does as a module docstring. Leave any further @@ -19,12 +19,13 @@ explanations and usage details to ``Readme`` file. ``__init__.py`` should contain a single line with ``from .my_plugin import *``. -Place tests for your plugin in the same folder with name ``test_my_plugin.py``. +Place tests for your plugin in the same folder with name ``test_my_plugin.py``. You can use ``test_data`` main folder, if you need content or templates in your tests. -**Note:** Plugins in the repository are licensed with *GNU AFFERO GENERAL PUBLIC LICENSE -Version 3*. By submitting a pull request, you accept to release your -contribution under same license. Please refer to the ``LICENSE`` file for -full text of the license. +**Note:** Each plugin can contain a LICENSE file stating the license it's +released under. If there is an absence of LICENSE then it defaults to the +*GNU AFFERO GENERAL PUBLIC LICENSE Version 3*. + +Please refer to the ``LICENSE`` file for the full text of the license. .. _docs: http://docs.getpelican.com/en/latest/plugins.html#how-to-create-plugins diff --git a/LICENSE b/LICENSE index dba13ed..ba67bd0 100644 --- a/LICENSE +++ b/LICENSE @@ -1,3 +1,7 @@ +Unless the folder itself contains a LICENSE stating otherwise, all the files +distributed here are released under the GNU AFFERO GENERAL PUBLIC LICENSE. + + GNU AFFERO GENERAL PUBLIC LICENSE Version 3, 19 November 2007 diff --git a/code_include/README.rst b/code_include/README.rst new file mode 100644 index 0000000..b7e08ec --- /dev/null +++ b/code_include/README.rst @@ -0,0 +1,69 @@ +Include Pygments highlighted code with reStructuredText +======================================================= + +:author: Colin Dunklau + +Use this plugin to make writing coding tutorials easier! You can +maintain the example source files separately from the actual article. + +Based heavily on ``docutils.parsers.rst.directives.Include``. Include +a file and output as a code block formatted with pelican's Pygments +directive. + +Note that this is broken with the Docutils 0.10 release, there's a +circular import. It was fixed in trunk: +http://sourceforge.net/p/docutils/bugs/214/ + +Directives +---------- + +.. code:: rst + + .. code-include:: incfile.py + :lexer: string, name of the Pygments lexer to use, default 'text' + :encoding: string, encoding with which to open the file + :tab-width: integer, hard tabs are replaced with `tab-width` spaces + :start-line: integer, starting line to begin reading include file + :end-line: integer, last line from include file to display + +``start-line``, and ``end-line`` have the same meaning as in the +docutils ``include`` directive, that is, they index from zero. + +Example +------- + +./incfile.py: + +.. code:: python + + # These two comment lines will not + # be included in the output + import random + + insults = ['I fart in your general direction', + 'your mother was a hampster', + 'your father smelt of elderberries'] + + def insult(): + print random.choice(insults) + # This comment line will be included + # ...but this one won't + +./yourfile.rst: + +.. code:: rst + + How to Insult the English + ========================= + + :author: Pierre Devereaux + + A function to help insult those silly English knnnnnnniggets: + + .. code-include:: incfile.py + :lexer: python + :encoding: utf-8 + :tab-width: 4 + :start-line: 3 + :end-line: 11 + diff --git a/code_include/__init__.py b/code_include/__init__.py new file mode 100644 index 0000000..019171c --- /dev/null +++ b/code_include/__init__.py @@ -0,0 +1 @@ +from code_include import * diff --git a/code_include/code_include.py b/code_include/code_include.py new file mode 100644 index 0000000..b87c8dd --- /dev/null +++ b/code_include/code_include.py @@ -0,0 +1,87 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +import os.path + +from docutils import io, nodes, statemachine, utils +from docutils.utils.error_reporting import SafeString, ErrorString +from docutils.parsers.rst import directives, Directive + +from pelican.rstdirectives import Pygments + + +class CodeInclude(Directive): + required_arguments = 1 + optional_arguments = 0 + final_argument_whitespace = True + option_spec = {'lexer': directives.unchanged, + 'encoding': directives.encoding, + 'tab-width': int, + 'start-line': int, + 'end-line': int} + + def run(self): + """Include a file as part of the content of this reST file.""" + if not self.state.document.settings.file_insertion_enabled: + raise self.warning('"%s" directive disabled.' % self.name) + source = self.state_machine.input_lines.source( + self.lineno - self.state_machine.input_offset - 1) + source_dir = os.path.dirname(os.path.abspath(source)) + + path = directives.path(self.arguments[0]) + path = os.path.normpath(os.path.join(source_dir, path)) + path = utils.relative_path(None, path) + path = nodes.reprunicode(path) + + encoding = self.options.get( + 'encoding', self.state.document.settings.input_encoding) + e_handler = self.state.document.settings.input_encoding_error_handler + tab_width = self.options.get( + 'tab-width', self.state.document.settings.tab_width) + + try: + self.state.document.settings.record_dependencies.add(path) + include_file = io.FileInput(source_path=path, + encoding=encoding, + error_handler=e_handler) + except UnicodeEncodeError as error: + raise self.severe('Problems with "%s" directive path:\n' + 'Cannot encode input file path "%s" ' + '(wrong locale?).' % + (self.name, SafeString(path))) + except IOError as error: + raise self.severe('Problems with "%s" directive path:\n%s.' % + (self.name, ErrorString(error))) + startline = self.options.get('start-line', None) + endline = self.options.get('end-line', None) + try: + if startline or (endline is not None): + lines = include_file.readlines() + rawtext = ''.join(lines[startline:endline]) + else: + rawtext = include_file.read() + except UnicodeError as error: + raise self.severe('Problem with "%s" directive:\n%s' % + (self.name, ErrorString(error))) + + include_lines = statemachine.string2lines(rawtext, tab_width, + convert_whitespace=True) + + # default lexer to 'text' + lexer = self.options.get('lexer', 'text') + + self.options['source'] = path + codeblock = Pygments(self.name, + [lexer], # arguments + {}, # no options for this directive + include_lines, # content + self.lineno, + self.content_offset, + self.block_text, + self.state, + self.state_machine) + return codeblock.run() + + +def register(): + directives.register_directive('code-include', CodeInclude) diff --git a/disqus_static/README.rst b/disqus_static/README.rst new file mode 100644 index 0000000..4e96548 --- /dev/null +++ b/disqus_static/README.rst @@ -0,0 +1,60 @@ +Disqus static comment plugin for Pelican +==================================== + +This plugin adds a disqus_comments property to all articles. +Comments are fetched at generation time using disqus API. + +Installation +------------ +Because we use disqus API to retrieve the comments you need to create an application at +http://disqus.com/api/applications/ which will provide you with a secret and public keys for the API. + +We use disqus-python package for communication with disqus API: +``pip install disqus-python`` + +Put ``disqus_static.py`` plugin in ``plugins`` folder in pelican installation +and use the following in your settings:: + + PLUGINS = [u"pelican.plugins.disqus_static"] + + DISQUS_SITENAME = u'YOUR_SITENAME' + DISQUS_SECRET_KEY = u'YOUR_SECRET_KEY' + DISQUS_PUBLIC_KEY = u'YOUR_PUBLIC_KEY' + +Usage +----- + +.. code-block:: html+jinja + + {% if article.disqus_comments %} +