Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ignore nested snippet sections #2003

Merged
merged 1 commit into from
Apr 4, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions docs/src/markdown/about/changelog.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Changelog

## 9.11

- **NEW**: Snippets: Ignore nested snippet section syntax when including a section.

## 9.10

- **NEW**: Blocks: Add new experimental general purpose blocks that provide a framework for creating fenced block
Expand Down
26 changes: 22 additions & 4 deletions pymdownx/snippets.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,10 +66,11 @@ class SnippetPreprocessor(Preprocessor):

RE_SNIPPET_SECTION = re.compile(
r'''(?xi)
^.*?
^(?P<pre>.*?)
(?P<escape>;*)
(?P<inline_marker>-{1,}8<-{1,}[ \t]+)
\[[ \t]*(?P<type>start|end)[ \t]*:[ \t]*(?P<name>[a-z][-_0-9a-z]*)[ \t]*\]
.*?$
(?P<section>\[[ \t]*(?P<type>start|end)[ \t]*:[ \t]*(?P<name>[a-z][-_0-9a-z]*)[ \t]*\])
(?P<post>.*?)$
'''
)

Expand Down Expand Up @@ -103,14 +104,27 @@ def extract_section(self, section, lines):

# Found a snippet section marker with our specified name
m = self.RE_SNIPPET_SECTION.match(l)
if m is not None and m.group('name') == section:

# Handle escaped line
if m and start and m.group('escape'):
l = (
m.group('pre') + m.group('escape').replace(';', '', 1) + m.group('inline_marker') +
m.group('section') + m.group('post')
)

# Found a section we are looking for.
elif m is not None and m.group('name') == section:

# We found the start
if not start and m.group('type') == 'start':
start = True
found = True
continue

# Ignore duplicate start
elif start and m.group('type') == 'start':
continue

# We found the end
elif start and m.group('type') == 'end':
start = False
Expand All @@ -120,6 +134,10 @@ def extract_section(self, section, lines):
else:
break

# Found a section we don't care about, so ignore it.
elif m and start:
continue

# We are currently in a section, so append the line
if start:
new_lines.append(l)
Expand Down
29 changes: 29 additions & 0 deletions tests/test_extensions/_snippets/section_nested.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/* --8<-- [start: css-section] */
div {
color: red;
/* --8<-- [start: css-section2] */
background-color: white;
padding: 16px
/* --8<-- [end: css-section2] */
}
/* --8<-- [end: css-section] */


/* --8<-- [start: css-section3] */
div {
color: red;
/* ;--8<-- [start: css-section4] */
background-color: white;
padding: 16px
/* ;--8<-- [end: css-section4] */
}
/* --8<-- [end: css-section3] */

/* --8<-- [start: css-section5] */
div {
color: red;
/* --8<-- [start: css-section5] */
background-color: white;
padding: 16px
}
/* --8<-- [end: css-section5] */
62 changes: 62 additions & 0 deletions tests/test_extensions/test_snippets.py
Original file line number Diff line number Diff line change
Expand Up @@ -332,6 +332,68 @@ def test_section_inline_min(self):
True
)

def test_section_inline_ignore_other_section(self):
"""Test nested sections."""

self.check_markdown(
R'''
```
-8<- "section_nested.txt:css-section"
```
''',
'''
<div class="highlight"><pre><span></span><code>div {
color: red;
background-color: white;
padding: 16px
}
</code></pre></div>
''',
True
)

def test_section_inline_escaped_other_section(self):
"""Test nested escaped sections."""

self.check_markdown(
R'''
```
-8<- "section_nested.txt:css-section3"
```
''',
'''
<div class="highlight"><pre><span></span><code>div {
color: red;
/* --8&lt;-- [start: css-section4] */
background-color: white;
padding: 16px
/* --8&lt;-- [end: css-section4] */
}
</code></pre></div>
''',
True
)

def test_section_ignore_double_start_section(self):
"""Test nested sections."""

self.check_markdown(
R'''
```
-8<- "section_nested.txt:css-section5"
```
''',
'''
<div class="highlight"><pre><span></span><code>div {
color: red;
background-color: white;
padding: 16px
}
</code></pre></div>
''',
True
)

def test_section_block(self):
"""Test section partial in block snippet."""

Expand Down