markdown-flow 0.4.2.dev1__tar.gz → 0.4.2.dev2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/PKG-INFO +1 -1
  2. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow/__init__.py +1 -1
  3. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow/parser/document_blocks.py +22 -7
  4. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow.egg-info/PKG-INFO +1 -1
  5. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/LICENSE +0 -0
  6. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/README.md +0 -0
  7. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow/constants.py +0 -0
  8. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow/constants_system_prompt.py +0 -0
  9. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow/core.py +0 -0
  10. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow/enums.py +0 -0
  11. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow/escaping.py +0 -0
  12. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow/exceptions.py +0 -0
  13. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow/formatter/__init__.py +0 -0
  14. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow/formatter/classifier.py +0 -0
  15. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow/formatter/format.py +0 -0
  16. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow/formatter/patterns.py +0 -0
  17. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow/formatter/sanitize.py +0 -0
  18. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow/formatter/stream.py +0 -0
  19. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow/formatter/types.py +0 -0
  20. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow/higher_priority_prompt.md +0 -0
  21. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow/llm.py +0 -0
  22. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow/models.py +0 -0
  23. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow/parser/__init__.py +0 -0
  24. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow/parser/code_fence_utils.py +0 -0
  25. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow/parser/document_context.py +0 -0
  26. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow/parser/html_comment_utils.py +0 -0
  27. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow/parser/interaction.py +0 -0
  28. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow/parser/json_parser.py +0 -0
  29. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow/parser/output.py +0 -0
  30. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow/parser/preprocessor.py +0 -0
  31. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow/parser/validation.py +0 -0
  32. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow/parser/variable.py +0 -0
  33. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow/providers/__init__.py +0 -0
  34. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow/providers/config.py +0 -0
  35. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow/providers/openai.py +0 -0
  36. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow/system_prompt.md +0 -0
  37. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow/tag_filter.py +0 -0
  38. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow/variable_names.py +0 -0
  39. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow.egg-info/SOURCES.txt +0 -0
  40. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow.egg-info/dependency_links.txt +0 -0
  41. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/markdown_flow.egg-info/top_level.txt +0 -0
  42. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/pyproject.toml +0 -0
  43. {markdown_flow-0.4.2.dev1 → markdown_flow-0.4.2.dev2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: markdown-flow
3
- Version: 0.4.2.dev1
3
+ Version: 0.4.2.dev2
4
4
  Summary: An agent library designed to parse and process MarkdownFlow documents
5
5
  Project-URL: Homepage, https://github.com/ai-shifu/markdown-flow-agent-py
6
6
  Project-URL: Bug Tracker, https://github.com/ai-shifu/markdown-flow-agent-py/issues
@@ -118,4 +118,4 @@ __all__ = [
118
118
  "format_variable_assignment",
119
119
  ]
120
120
 
121
- __version__ = "0.4.2.dev1"
121
+ __version__ = "0.4.2.dev2"
@@ -345,6 +345,7 @@ class DocumentBlocks:
345
345
  self.text = text
346
346
  self.html_pattern = html
347
347
  self._html_token_ends: dict[tuple[int, bool], int | None] = {}
348
+ self._container_ends: dict[tuple[int, bool], int] = {}
348
349
  self._html_last_ends: dict[str, int] | None = None
349
350
  self.lines = physical_lines(text)
350
351
  self.closed_fence_lines: set[int] = set()
@@ -414,15 +415,29 @@ class DocumentBlocks:
414
415
  steps = self.container_steps[index]
415
416
  if not steps:
416
417
  return len(self.text)
417
- for line in self.lines[index + 1 :]:
418
+ key = (index, final)
419
+ if key in self._container_ends:
420
+ return self._container_ends[key]
421
+ covered = [index]
422
+ end = len(self.text)
423
+ for following in range(index + 1, len(self.lines)):
424
+ line = self.lines[following]
418
425
  value = self.text[line.start : line.content_end]
419
426
  if container_content_start(value, steps) is None and value.strip(" \t"):
420
- if container_content_start(value, steps, partial=True) == len(value):
421
- continue
422
- if not final and line.end == line.content_end == len(self.text) and container_content_start(value, steps, partial=True) is not None:
423
- continue
424
- return line.start
425
- return len(self.text)
427
+ partial = container_content_start(value, steps, partial=True)
428
+ if not (partial == len(value) or not final and line.end == line.content_end == len(self.text) and partial is not None):
429
+ end = line.start
430
+ break
431
+ if self.container_steps[following] == steps:
432
+ following_key = (following, final)
433
+ if following_key in self._container_ends:
434
+ # The cached query excludes its own line, which was checked above.
435
+ end = self._container_ends[following_key]
436
+ break
437
+ covered.append(following)
438
+ for following in covered:
439
+ self._container_ends[(following, final)] = end
440
+ return end
426
441
 
427
442
  def fence(self, start: int, *, final: bool = True) -> BlockSpan | None:
428
443
  """Read plain or quote/list-contained fenced code."""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: markdown-flow
3
- Version: 0.4.2.dev1
3
+ Version: 0.4.2.dev2
4
4
  Summary: An agent library designed to parse and process MarkdownFlow documents
5
5
  Project-URL: Homepage, https://github.com/ai-shifu/markdown-flow-agent-py
6
6
  Project-URL: Bug Tracker, https://github.com/ai-shifu/markdown-flow-agent-py/issues