markdown-flow 0.4.2.dev2__tar.gz → 0.4.2.dev4__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.dev2 → markdown_flow-0.4.2.dev4}/PKG-INFO +1 -1
  2. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow/__init__.py +1 -1
  3. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow/parser/document_context.py +7 -3
  4. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow/parser/output.py +12 -4
  5. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow.egg-info/PKG-INFO +1 -1
  6. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/LICENSE +0 -0
  7. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/README.md +0 -0
  8. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow/constants.py +0 -0
  9. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow/constants_system_prompt.py +0 -0
  10. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow/core.py +0 -0
  11. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow/enums.py +0 -0
  12. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow/escaping.py +0 -0
  13. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow/exceptions.py +0 -0
  14. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow/formatter/__init__.py +0 -0
  15. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow/formatter/classifier.py +0 -0
  16. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow/formatter/format.py +0 -0
  17. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow/formatter/patterns.py +0 -0
  18. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow/formatter/sanitize.py +0 -0
  19. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow/formatter/stream.py +0 -0
  20. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow/formatter/types.py +0 -0
  21. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow/higher_priority_prompt.md +0 -0
  22. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow/llm.py +0 -0
  23. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow/models.py +0 -0
  24. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow/parser/__init__.py +0 -0
  25. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow/parser/code_fence_utils.py +0 -0
  26. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow/parser/document_blocks.py +0 -0
  27. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow/parser/html_comment_utils.py +0 -0
  28. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow/parser/interaction.py +0 -0
  29. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow/parser/json_parser.py +0 -0
  30. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow/parser/preprocessor.py +0 -0
  31. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow/parser/validation.py +0 -0
  32. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow/parser/variable.py +0 -0
  33. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow/providers/__init__.py +0 -0
  34. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow/providers/config.py +0 -0
  35. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow/providers/openai.py +0 -0
  36. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow/system_prompt.md +0 -0
  37. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow/tag_filter.py +0 -0
  38. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow/variable_names.py +0 -0
  39. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow.egg-info/SOURCES.txt +0 -0
  40. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow.egg-info/dependency_links.txt +0 -0
  41. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/markdown_flow.egg-info/top_level.txt +0 -0
  42. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/pyproject.toml +0 -0
  43. {markdown_flow-0.4.2.dev2 → markdown_flow-0.4.2.dev4}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: markdown-flow
3
- Version: 0.4.2.dev2
3
+ Version: 0.4.2.dev4
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.dev2"
121
+ __version__ = "0.4.2.dev4"
@@ -410,7 +410,8 @@ def _document_units(text: str) -> Iterator[tuple[int, int, bool]]:
410
410
  continue
411
411
  if text.startswith("?[", at):
412
412
  limit, closed = reader.blocks.interaction_limit(at + 2, lambda position: marker.end if (marker := read_variable_marker(text, position)) is not None else None)
413
- interaction_until = limit if closed else limit - 1
413
+ if not (closed and text[limit + 1 : limit + 2] == "("):
414
+ interaction_until = limit if closed else limit - 1
414
415
  if text.startswith("{{", at):
415
416
  marker = read_variable_marker(text, at)
416
417
  end = marker.end if marker is not None else len(text)
@@ -459,8 +460,11 @@ def find_document_interaction_spans(text: str) -> Iterator[tuple[int, int]]:
459
460
  if not closed:
460
461
  at = end
461
462
  continue
462
- if text[end + 1 : end + 2] != "(":
463
- yield at, end + 1
463
+ if text[end + 1 : end + 2] == "(":
464
+ # Replay the native label instead of losing its resource state.
465
+ at += 1
466
+ continue
467
+ yield at, end + 1
464
468
  at = end + 1
465
469
  else:
466
470
  at += 1
@@ -31,6 +31,7 @@ def is_preserved_content_block(content: str) -> bool:
31
31
  Returns:
32
32
  True if content is fully wrapped by preserved markers
33
33
  """
34
+ content, _, _ = _protect_variable_names(content)
34
35
  content = content.strip()
35
36
  if not content:
36
37
  return False
@@ -104,6 +105,14 @@ def _protect_variable_names(content: str) -> tuple[str, dict[str, str], str]:
104
105
  return "".join(pieces), markers, prefix
105
106
 
106
107
 
108
+ def _restore_variable_names(content: str, markers: dict[str, str], prefix: str) -> str:
109
+ """Restore protected marker source once after output syntax processing."""
110
+ if not markers:
111
+ return content
112
+ token_pattern = re.compile(re.escape(prefix) + r"[0-9]+\x00")
113
+ return token_pattern.sub(lambda match: markers[match.group()], content)
114
+
115
+
107
116
  def process_output_instructions(content: str) -> tuple[str, bool]:
108
117
  """
109
118
  Process output instruction markers, converting === and !=== formats to XML format.
@@ -231,9 +240,7 @@ def process_output_instructions(content: str) -> tuple[str, bool]:
231
240
 
232
241
  # Assemble final content
233
242
  processed_content = "\n".join(result_lines)
234
- if variable_markers:
235
- token_pattern = re.compile(re.escape(variable_prefix) + r"[0-9]+\x00")
236
- processed_content = token_pattern.sub(lambda match: variable_markers[match.group()], processed_content)
243
+ processed_content = _restore_variable_names(processed_content, variable_markers, variable_prefix)
237
244
 
238
245
  # Return both processed content and whether it contains preserved content
239
246
  return processed_content, has_output_instruction
@@ -251,6 +258,7 @@ def extract_preserved_content(content: str) -> str:
251
258
  Returns:
252
259
  Actual content with === and !=== markers removed
253
260
  """
261
+ content, variable_markers, variable_prefix = _protect_variable_names(content)
254
262
  content = content.strip()
255
263
  if not content:
256
264
  return ""
@@ -275,4 +283,4 @@ def extract_preserved_content(content: str) -> str:
275
283
  # Normal content line, keep
276
284
  result_lines.append(line)
277
285
 
278
- return "\n".join(result_lines)
286
+ return _restore_variable_names("\n".join(result_lines), variable_markers, variable_prefix)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: markdown-flow
3
- Version: 0.4.2.dev2
3
+ Version: 0.4.2.dev4
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