Package groovy.markdown
Class MarkdownSlurper
java.lang.Object
groovy.markdown.MarkdownSlurper
Parses CommonMark Markdown into a
MarkdownDocument backed by nested lists and maps.
Usage:
def doc = new groovy.markdown.MarkdownSlurper().parseText('# Hello')
assert doc.headings[0].text == 'Hello'
GFM-style tables are supported via an optional extension. Call
enableTables(true) after adding
org.commonmark:commonmark-ext-gfm-tables to the runtime classpath.
Untrusted input
Prefer parsing Markdown from trusted sources. Like the siblingJsonSlurper and
XmlSlurper, this is a convenience parser, not a security boundary, and the safest
posture is not to feed it attacker-controlled input. If you must, bound the input by size
yourself before parsing and treat the parsed result defensively.
As a backstop for that case, a small but deeply nested document — which could otherwise
drive a recursive parse into a StackOverflowError — is reported as a
MarkdownRuntimeException rather than a raw Error. There are two independent
vectors, on opposite sides of the CommonMark boundary, and both are covered:
- Block/container nesting (e.g.
'>' * 50000). CommonMark parses blocks iteratively and returns a very deep tree; the overflow would happen in this slurper's own recursive walk.maxNestingDepthbounds this at parse time (via CommonMark'smaxOpenBlockParsers) and rejects any document nested deeper than the limit. - Inline emphasis nesting (e.g.
('*' * 50000) + 'a' + ('*' * 50000)). This overflows inside CommonMark's own inline processing, before control returns here; CommonMark 0.29.0 has no inline-nesting cap, so it is caught and reported as aMarkdownRuntimeException.
- Since:
- 6.0.0
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final intDefault maximum nesting depth of block/inline elements accepted before aMarkdownRuntimeExceptionis thrown. -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionenableTables(boolean enable) Enable GFM-style tables.intReturns the maximum block/container nesting depth the parser will accept.Parses Markdown content from a file.parse(InputStream stream) Parses Markdown content from an input stream.Parses Markdown content from a reader.Parses Markdown content from a path.Parses Markdown text into aMarkdownDocument.voidsetMaxNestingDepth(int maxNestingDepth) Sets the maximum block/container nesting depth.
-
Field Details
-
DEFAULT_MAX_NESTING_DEPTH
public static final int DEFAULT_MAX_NESTING_DEPTHDefault maximum nesting depth of block/inline elements accepted before aMarkdownRuntimeExceptionis thrown. Matches the default nesting cap of the siblingJsonSlurper.- See Also:
-
-
Constructor Details
-
MarkdownSlurper
public MarkdownSlurper()
-
-
Method Details
-
getMaxNestingDepth
public int getMaxNestingDepth()Returns the maximum block/container nesting depth the parser will accept.- Returns:
- the maximum nesting depth, or a value
<= 0when the limit is disabled
-
setMaxNestingDepth
public void setMaxNestingDepth(int maxNestingDepth) Sets the maximum block/container nesting depth. Over-limit nesting is bounded at parse time (via CommonMark'smaxOpenBlockParsers) and rejected with aMarkdownRuntimeException. A value of0or less disables the limit; deeply nested inline emphasis is still caught and reported regardless.- Parameters:
maxNestingDepth- maximum number of nested block elements to allow
-
enableTables
Enable GFM-style tables. Requirescommonmark-ext-gfm-tableson the classpath.- Parameters:
enable- whether to enable table parsing- Returns:
- this slurper for chaining
- Throws:
MarkdownRuntimeException- ifenableis true but the extension jar is missing
-
parseText
Parses Markdown text into aMarkdownDocument.- Parameters:
md- the Markdown text to parse- Returns:
- the parsed document, or an empty document when the input is null or empty
-
parse
Parses Markdown content from a reader.- Parameters:
reader- the reader supplying Markdown content- Returns:
- the parsed document
-
parse
Parses Markdown content from an input stream. The caller remains responsible for closing the stream.- Parameters:
stream- the input stream supplying Markdown content- Returns:
- the parsed document
-
parse
Parses Markdown content from a file.- Parameters:
file- the file to read- Returns:
- the parsed document
- Throws:
IOException- if the file cannot be read
-
parse
Parses Markdown content from a path.- Parameters:
path- the path to read- Returns:
- the parsed document
- Throws:
IOException- if the path cannot be read
-