#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+#
+# This file incorporates work covered by the following copyright and
+# permission notice:
+#
+# The MIT License (http://www.opensource.org/licenses/mit-license.php)
+#
+# Copyright (c) 2003-2011 by the Pyblosxom team (see AUTHORS file).
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
"""
This module implements the plugin api bits.
return self.template_hooks.get(hook_name, [])
+###########################
+## Borrowed from pyblosxom!
+###########################
+
+def run_callback(chain, input,
+ mappingfunc=lambda x, y: x,
+ donefunc=lambda x: 0,
+ defaultfunc=None):
+ """
+ Executes a callback chain on a given piece of data. passed in is
+ a dict of name/value pairs. Consult the documentation for the
+ specific callback chain you're executing.
+
+ Callback chains should conform to their documented behavior. This
+ function allows us to do transforms on data, handling data, and
+ also callbacks.
+
+ The difference in behavior is affected by the mappingfunc passed
+ in which converts the output of a given function in the chain to
+ the input for the next function.
+
+ If this is confusing, read through the code for this function.
+
+ Returns the transformed input dict.
+
+ :param chain: the name of the callback chain to run
+
+ :param input: dict with name/value pairs that gets passed as the
+ args dict to all callback functions
+
+ :param mappingfunc: the function that maps output arguments to
+ input arguments for the next iteration. It
+ must take two arguments: the original dict and
+ the return from the previous function. It
+ defaults to returning the original dict.
+
+ :param donefunc: this function tests whether we're done doing what
+ we're doing. This function takes as input the
+ output of the most recent iteration. If this
+ function returns True then we'll drop out of the
+ loop. For example, if you wanted a callback to
+ stop running when one of the registered functions
+ returned a 1, then you would pass in:
+ ``donefunc=lambda x: x`` .
+
+ :param defaultfunc: if this is set and we finish going through all
+ the functions in the chain and none of them
+ have returned something that satisfies the
+ donefunc, then we'll execute the defaultfunc
+ with the latest version of the input dict.
+
+ :returns: varies
+ """
+ chain = PluginManager.get_hook_callables(chain)
+
+ output = None
+
+ for func in chain:
+ # we call the function with the input dict it returns an
+ # output.
+ output = func(input)
+
+ # we fun the output through our donefunc to see if we should
+ # stop iterating through the loop. if the donefunc returns
+ # something true, then we're all done; otherwise we continue.
+ if donefunc(output):
+ break
+
+ # we pass the input we just used and the output we just got
+ # into the mappingfunc which will give us the input for the
+ # next iteration. in most cases, this consists of either
+ # returning the old input or the old output--depending on
+ # whether we're transforming the data through the chain or
+ # not.
+ input = mappingfunc(input, output)
+
+ # if we have a defaultfunc and we haven't satisfied the donefunc
+ # conditions, then we return whatever the defaultfunc returns when
+ # given the current version of the input.
+ if callable(defaultfunc) and not donefunc(output):
+ return defaultfunc(input)
+
+ # we didn't call the defaultfunc--so we return the most recent
+ # output.
+ return output
+
+
def register_routes(routes):
"""Registers one or more routes