From 8dc229956e414b1df71ea3b4890380ad9fc3c0fe Mon Sep 17 00:00:00 2001 From: "Mohammed S. Yaseen" <51242349+mohasarc@users.noreply.github.com> Date: Sun, 25 Jan 2026 06:19:18 +0000 Subject: [PATCH 1/5] optimize string concatenation using lists --- .../directive.py | 17 ++++++----- src/mkdocs_include_markdown_plugin/event.py | 13 +++++---- src/mkdocs_include_markdown_plugin/process.py | 29 +++++++++---------- 3 files changed, 30 insertions(+), 29 deletions(-) diff --git a/src/mkdocs_include_markdown_plugin/directive.py b/src/mkdocs_include_markdown_plugin/directive.py index a77505e..1ff950b 100644 --- a/src/mkdocs_include_markdown_plugin/directive.py +++ b/src/mkdocs_include_markdown_plugin/directive.py @@ -140,7 +140,7 @@ def _maybe_arguments_iter(arguments_string: str) -> Iterable[str]: inside_string = False escaping = False opening_argument = False # whether we are at the beginning of an argument - current_value = '' + current_value = [] for c in arguments_string: if inside_string: @@ -153,24 +153,25 @@ def _maybe_arguments_iter(arguments_string: str) -> Iterable[str]: else: escaping = False elif c == '=': + current_value_str = "".join(current_value) new_current_value = '' - for ch in reversed(current_value): + for ch in reversed(current_value_str): if ch in string.whitespace: - current_value = new_current_value[::-1] + current_value_str = new_current_value[::-1] break new_current_value += ch - yield current_value - current_value = '' + yield current_value_str + current_value = [] opening_argument = True elif opening_argument: opening_argument = False if c in ('"', "'"): current_string_opening = c inside_string = True - current_value += c - current_value += c + current_value.append(c) + current_value.append(c) else: - current_value += c + current_value.append(c) def warn_invalid_directive_arguments( diff --git a/src/mkdocs_include_markdown_plugin/event.py b/src/mkdocs_include_markdown_plugin/event.py index 79204fb..1f85b5b 100644 --- a/src/mkdocs_include_markdown_plugin/event.py +++ b/src/mkdocs_include_markdown_plugin/event.py @@ -545,7 +545,7 @@ def found_include_markdown_tag( # noqa: PLR0912, PLR0915 # but they have been specified, so the warning(s) must be raised expected_but_any_found = [start is not None, end is not None] - text_to_include = '' + text_to_include_parts = [] for file_path in file_paths_to_include: if process.is_url(filename): new_text_to_include = process.read_url( @@ -621,11 +621,10 @@ def found_include_markdown_tag( # noqa: PLR0912, PLR0915 new_text_to_include ): lines = new_text_to_include.splitlines(keepends=True) - new_text_to_include = lines[0] + indented_lines = [lines[0]] for i in range(1, len(lines)): - new_text_to_include += ( - filled_includer_indent + lines[i] - ) + indented_lines.append(filled_includer_indent + lines[i]) + new_text_to_include = "".join(indented_lines) if offset: new_text_to_include = process.increase_headings_offset( @@ -633,7 +632,9 @@ def found_include_markdown_tag( # noqa: PLR0912, PLR0915 offset=offset + cumulative_heading_offset, ) - text_to_include += new_text_to_include + text_to_include_parts.append(new_text_to_include) + + text_to_include = "".join(text_to_include_parts) # warn if expected start or ends haven't been found in included content for i, delimiter_name in enumerate(['start', 'end']): diff --git a/src/mkdocs_include_markdown_plugin/process.py b/src/mkdocs_include_markdown_plugin/process.py index df502cc..12e8e3a 100644 --- a/src/mkdocs_include_markdown_plugin/process.py +++ b/src/mkdocs_include_markdown_plugin/process.py @@ -174,10 +174,11 @@ def transform_p_by_p_skipping_codeblocks( # noqa: PLR0912, PLR0915 _maybe_icodeblock_lines: list[str] = [] _previous_line_was_empty = False - lines, current_paragraph = ([], '') + lines = [] + current_paragraph_lines = [] def process_current_paragraph() -> None: - lines.extend(func(current_paragraph).splitlines(keepends=True)) + lines.extend(func("".join(current_paragraph_lines)).splitlines(keepends=True)) # The next implementation takes into account that indented code # blocks must be surrounded by newlines as per the CommonMark @@ -191,25 +192,24 @@ def process_current_paragraph() -> None: if lstripped_line.startswith(('```', '~~~')): _current_fcodeblock_delimiter = lstripped_line[:3] process_current_paragraph() - current_paragraph = '' + current_paragraph_lines = [] lines.append(line) elif line.startswith(' '): if not lstripped_line or _maybe_icodeblock_lines: # maybe enter indented codeblock _maybe_icodeblock_lines.append(line) else: - current_paragraph += line + current_paragraph_lines.append(line) elif _maybe_icodeblock_lines: process_current_paragraph() - current_paragraph = '' + current_paragraph_lines = [] if not _previous_line_was_empty: # wasn't an indented code block - for line_ in _maybe_icodeblock_lines: - current_paragraph += line_ + current_paragraph_lines.extend(_maybe_icodeblock_lines) _maybe_icodeblock_lines = [] - current_paragraph += line + current_paragraph_lines.append(line) process_current_paragraph() - current_paragraph = '' + current_paragraph_lines = [] else: # exit indented codeblock for line_ in _maybe_icodeblock_lines: @@ -217,7 +217,7 @@ def process_current_paragraph() -> None: _maybe_icodeblock_lines = [] lines.append(line) else: - current_paragraph += line + current_paragraph_lines.append(line) _previous_line_was_empty = not lstripped_line else: lines.append(line) @@ -230,14 +230,13 @@ def process_current_paragraph() -> None: if not _previous_line_was_empty: # at EOF process_current_paragraph() - current_paragraph = '' - for line_ in _maybe_icodeblock_lines: - current_paragraph += line_ + current_paragraph_lines = [] + current_paragraph_lines.extend(_maybe_icodeblock_lines) process_current_paragraph() - current_paragraph = '' + current_paragraph_lines = [] else: process_current_paragraph() - current_paragraph = '' + current_paragraph_lines = [] for line_ in _maybe_icodeblock_lines: lines.append(line_) else: From 1fd2b786bf5c41263fadcc3cb2cbc14c22575567 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Mond=C3=A9jar=20Rubio?= Date: Sun, 25 Jan 2026 15:32:23 +0100 Subject: [PATCH 2/5] Add types --- src/mkdocs_include_markdown_plugin/directive.py | 2 +- src/mkdocs_include_markdown_plugin/process.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mkdocs_include_markdown_plugin/directive.py b/src/mkdocs_include_markdown_plugin/directive.py index 1ff950b..2b41bee 100644 --- a/src/mkdocs_include_markdown_plugin/directive.py +++ b/src/mkdocs_include_markdown_plugin/directive.py @@ -140,7 +140,7 @@ def _maybe_arguments_iter(arguments_string: str) -> Iterable[str]: inside_string = False escaping = False opening_argument = False # whether we are at the beginning of an argument - current_value = [] + current_value: list[str] = [] for c in arguments_string: if inside_string: diff --git a/src/mkdocs_include_markdown_plugin/process.py b/src/mkdocs_include_markdown_plugin/process.py index 12e8e3a..cd188c5 100644 --- a/src/mkdocs_include_markdown_plugin/process.py +++ b/src/mkdocs_include_markdown_plugin/process.py @@ -175,7 +175,7 @@ def transform_p_by_p_skipping_codeblocks( # noqa: PLR0912, PLR0915 _previous_line_was_empty = False lines = [] - current_paragraph_lines = [] + current_paragraph_lines: list[str] = [] def process_current_paragraph() -> None: lines.extend(func("".join(current_paragraph_lines)).splitlines(keepends=True)) From 2fcef787e0516e49376e58ea143ac23a9158de0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Mond=C3=A9jar=20Rubio?= Date: Sun, 25 Jan 2026 15:35:31 +0100 Subject: [PATCH 3/5] Bump version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index b8dc17c..c52c512 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "mkdocs-include-markdown-plugin" -version = "7.2.0" +version = "7.2.1" description = "Mkdocs Markdown includer plugin." readme = "README.md" license = "Apache-2.0" From 8de0f60dca2403b3b0abf5aad74b272a96749fbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Mond=C3=A9jar=20Rubio?= Date: Sun, 25 Jan 2026 15:37:03 +0100 Subject: [PATCH 4/5] Format --- src/mkdocs_include_markdown_plugin/directive.py | 2 +- src/mkdocs_include_markdown_plugin/event.py | 4 ++-- src/mkdocs_include_markdown_plugin/process.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mkdocs_include_markdown_plugin/directive.py b/src/mkdocs_include_markdown_plugin/directive.py index 2b41bee..781efaf 100644 --- a/src/mkdocs_include_markdown_plugin/directive.py +++ b/src/mkdocs_include_markdown_plugin/directive.py @@ -153,7 +153,7 @@ def _maybe_arguments_iter(arguments_string: str) -> Iterable[str]: else: escaping = False elif c == '=': - current_value_str = "".join(current_value) + current_value_str = ''.join(current_value) new_current_value = '' for ch in reversed(current_value_str): if ch in string.whitespace: diff --git a/src/mkdocs_include_markdown_plugin/event.py b/src/mkdocs_include_markdown_plugin/event.py index 1f85b5b..f6d6114 100644 --- a/src/mkdocs_include_markdown_plugin/event.py +++ b/src/mkdocs_include_markdown_plugin/event.py @@ -624,7 +624,7 @@ def found_include_markdown_tag( # noqa: PLR0912, PLR0915 indented_lines = [lines[0]] for i in range(1, len(lines)): indented_lines.append(filled_includer_indent + lines[i]) - new_text_to_include = "".join(indented_lines) + new_text_to_include = ''.join(indented_lines) if offset: new_text_to_include = process.increase_headings_offset( @@ -634,7 +634,7 @@ def found_include_markdown_tag( # noqa: PLR0912, PLR0915 text_to_include_parts.append(new_text_to_include) - text_to_include = "".join(text_to_include_parts) + text_to_include = ''.join(text_to_include_parts) # warn if expected start or ends haven't been found in included content for i, delimiter_name in enumerate(['start', 'end']): diff --git a/src/mkdocs_include_markdown_plugin/process.py b/src/mkdocs_include_markdown_plugin/process.py index cd188c5..02f1567 100644 --- a/src/mkdocs_include_markdown_plugin/process.py +++ b/src/mkdocs_include_markdown_plugin/process.py @@ -178,7 +178,7 @@ def transform_p_by_p_skipping_codeblocks( # noqa: PLR0912, PLR0915 current_paragraph_lines: list[str] = [] def process_current_paragraph() -> None: - lines.extend(func("".join(current_paragraph_lines)).splitlines(keepends=True)) + lines.extend(func(''.join(current_paragraph_lines)).splitlines(keepends=True)) # The next implementation takes into account that indented code # blocks must be surrounded by newlines as per the CommonMark From b0656db9f55afec06af9307d94279a2ff3ed2f4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Mond=C3=A9jar=20Rubio?= Date: Sun, 25 Jan 2026 15:42:37 +0100 Subject: [PATCH 5/5] Format --- src/mkdocs_include_markdown_plugin/process.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mkdocs_include_markdown_plugin/process.py b/src/mkdocs_include_markdown_plugin/process.py index 02f1567..e9f2c77 100644 --- a/src/mkdocs_include_markdown_plugin/process.py +++ b/src/mkdocs_include_markdown_plugin/process.py @@ -178,7 +178,8 @@ def transform_p_by_p_skipping_codeblocks( # noqa: PLR0912, PLR0915 current_paragraph_lines: list[str] = [] def process_current_paragraph() -> None: - lines.extend(func(''.join(current_paragraph_lines)).splitlines(keepends=True)) + lines.extend(func(''.join(current_paragraph_lines), + ).splitlines(keepends=True)) # The next implementation takes into account that indented code # blocks must be surrounded by newlines as per the CommonMark