Mercurial > repos > shellac > guppy_basecaller
diff env/lib/python3.7/site-packages/gxformat2/markdown_parse.py @ 5:9b1c78e6ba9c draft default tip
"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
author | shellac |
---|---|
date | Mon, 01 Jun 2020 08:59:25 -0400 |
parents | 79f47841a781 |
children |
line wrap: on
line diff
--- a/env/lib/python3.7/site-packages/gxformat2/markdown_parse.py Thu May 14 16:47:39 2020 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,117 +0,0 @@ -"""Utilities for parsing "Galaxy Flavored Markdown". - -See markdown_util.py for loading objects and interacting with the rest of Galaxy. -This file is meant to be relatively self contained and just used to "parse" and validate -Galaxy Markdown. Keeping things isolated to allow re-use of these utilities in other -projects (e.g. gxformat2). -""" -import re - -BLOCK_FENCE_START = re.compile(r'```.*') -BLOCK_FENCE_END = re.compile(r'```[\s]*') -GALAXY_FLAVORED_MARKDOWN_CONTAINER_LINE_PATTERN = re.compile( - r"```\s*galaxy\s*" -) -VALID_CONTAINER_END_PATTERN = re.compile(r"^```\s*$") -GALAXY_FLAVORED_MARKDOWN_CONTAINERS = [ - "history_dataset_display", - "history_dataset_collection_display", - "history_dataset_as_image", - "history_dataset_peek", - "history_dataset_info", - "workflow_display", - "job_metrics", - "job_parameters", - "tool_stderr", - "tool_stdout", -] -INVOCATION_SECTIONS = [ - "invocation_inputs", - "invocation_outputs", -] -ALL_CONTAINER_TYPES = GALAXY_FLAVORED_MARKDOWN_CONTAINERS + INVOCATION_SECTIONS -GALAXY_FLAVORED_MARKDOWN_CONTAINER_REGEX = "(%s)" % "|".join(ALL_CONTAINER_TYPES) - -ARG_VAL_REGEX = r'''[\w_\-]+|\"[^\"]+\"|\'[^\']+\'''' -FUNCTION_ARG = r'\s*\w+\s*=\s*(?:%s)\s*' % ARG_VAL_REGEX -FUNCTION_CALL_LINE_TEMPLATE = r'\s*%s\s*\((?:' + FUNCTION_ARG + r')?\)\s*' -GALAXY_MARKDOWN_FUNCTION_CALL_LINE = re.compile(FUNCTION_CALL_LINE_TEMPLATE % GALAXY_FLAVORED_MARKDOWN_CONTAINER_REGEX) -WHITE_SPACE_ONLY_PATTERN = re.compile(r"^[\s]+$") - - -def validate_galaxy_markdown(galaxy_markdown, internal=True): - """Validate the supplied markdown and throw an ValueError with reason if invalid.""" - expecting_container_close_for = None - last_line_no = 0 - function_calls = 0 - for (line, fenced, open_fence, line_no) in _split_markdown_lines(galaxy_markdown): - last_line_no = line_no - - def invalid_line(template, **kwd): - if "line" in kwd: - kwd["line"] = line.rstrip("\r\n") - raise ValueError("Invalid line %d: %s" % (line_no + 1, template.format(**kwd))) - - expecting_container_close = expecting_container_close_for is not None - if not fenced and expecting_container_close: - invalid_line("[{line}] is not expected close line for [{expected_for}]", line=line, expected_for=expecting_container_close_for) - continue - elif not fenced: - continue - elif fenced and expecting_container_close and BLOCK_FENCE_END.match(line): - # reset - expecting_container_close_for = None - function_calls = 0 - elif open_fence and GALAXY_FLAVORED_MARKDOWN_CONTAINER_LINE_PATTERN.match(line): - if expecting_container_close: - if not VALID_CONTAINER_END_PATTERN.match(line): - invalid_line("Invalid command close line [{line}] for [{expected_for}]", line=line, expected_for=expecting_container_close_for) - # else closing container and we're done - expecting_container_close_for = None - function_calls = 0 - continue - - expecting_container_close_for = line - continue - elif fenced and line and expecting_container_close_for: - if GALAXY_MARKDOWN_FUNCTION_CALL_LINE.match(line): - function_calls += 1 - if function_calls > 1: - invalid_line("Only one Galaxy directive is allowed per fenced Galaxy block (```galaxy)") - continue - else: - invalid_line("Invalid embedded Galaxy markup line [{line}]", line=line) - - # Markdown unrelated to Galaxy object containers. - continue - - if expecting_container_close_for: - template = "Invalid line %d: %s" - msg = template % (last_line_no, "close of block for [{expected_for}] expected".format(expected_for=expecting_container_close_for)) - raise ValueError(msg) - - -def _split_markdown_lines(markdown): - """Yield lines of a markdown document line-by-line keeping track of fencing. - - 'Fenced' lines are code-like block (e.g. between ```) that shouldn't contain - Markdown markup. - """ - block_fenced = False - indent_fenced = False - for line_number, line in enumerate(markdown.splitlines(True)): - open_fence_this_iteration = False - indent_fenced = line.startswith(" ") or (indent_fenced and WHITE_SPACE_ONLY_PATTERN.match(line)) - if not block_fenced: - if BLOCK_FENCE_START.match(line): - open_fence_this_iteration = True - block_fenced = True - yield (line, block_fenced or indent_fenced, open_fence_this_iteration, line_number) - if not open_fence_this_iteration and BLOCK_FENCE_END.match(line): - block_fenced = False - - -__all__ = ( - 'validate_galaxy_markdown', - 'GALAXY_MARKDOWN_FUNCTION_CALL_LINE', -)