diff --git a/picard/script.py b/picard/script.py index 03352ebb3..ab28189a0 100644 --- a/picard/script.py +++ b/picard/script.py @@ -174,6 +174,23 @@ class FunctionRegistryItem: return '' +class ScriptFunctionDocError(Exception): + pass + + +def script_function_documentation(name, fmt): + functions = dict(ScriptParser._function_registry) + if name not in functions: + raise ScriptFunctionDocError("no such function: %s (known functions: %r)" % (name, [name for name in functions])) + + if fmt == 'html': + return functions[name].htmldoc() + elif fmt == 'markdown': + return functions[name].markdowndoc() + else: + raise ScriptFunctionDocError("no such documentation format: %s (known formats: html, markdown)" % fmt) + + Bound = namedtuple("Bound", ["lower", "upper"]) diff --git a/test/test_script.py b/test/test_script.py index fd003710e..0d4074db5 100644 --- a/test/test_script.py +++ b/test/test_script.py @@ -46,12 +46,14 @@ from picard.script import ( ScriptError, ScriptExpression, ScriptFunction, + ScriptFunctionDocError, ScriptParser, ScriptRuntimeError, ScriptSyntaxError, ScriptUnknownFunction, register_script_function, script_function, + script_function_documentation, ) @@ -174,6 +176,23 @@ class ScriptParserTest(PicardTestCase): return arg.eval(parser) self.assertScriptResultEquals("$somefunc($title(x))", "X") + def test_script_function_documentation(self): + # test decorator documentation + markdown = '`$somefunc()`' + @script_function(documentation=markdown) + def func_somefunc(parser): + return "x" + doc = script_function_documentation('somefunc', 'markdown') + self.assertEqual(doc, markdown) + doc = script_function_documentation('somefunc', 'html') + self.assertEqual(doc, '
$somefunc()