| 2825 | if (r->md_pending == AGENT_MD_PENDING_STAR) { |
| 2826 | c = '*'; |
| 2827 | } else if (r->md_pending == AGENT_MD_PENDING_BACKTICK) { |
| 2828 | c = '`'; |
| 2829 | } else { |
| 2830 | return; |
| 2831 | } |
| 2832 | size_t count = r->md_pending_len; |
| 2833 | renderer_markdown_clear_pending(r); |
| 2834 | if (r->md_code_block) { |
| 2835 | if (c == '`') renderer_code_emit_backtick_literals(r, count); |
| 2836 | else for (size_t i = 0; i < count; i++) renderer_code_byte(r, c); |
| 2837 | return; |
| 2838 | } |
| 2839 | for (size_t i = 0; i < count; i++) renderer_write_char_raw(r, c); |
| 2840 | } |
| 2841 | |
| 2842 | static void renderer_markdown_commit_backticks(agent_token_renderer *r) { |
| 2843 | size_t count = r->md_pending_len; |
| 2844 | renderer_markdown_clear_pending(r); |
| 2845 | if (count >= 3) { |
| 2846 | for (size_t i = 0; i < count; i++) renderer_write_plain_byte(r, '`'); |
| 2847 | if (r->md_code_block) renderer_code_end(r); |
| 2848 | else renderer_code_begin(r); |
| 2849 | return; |
| 2850 | } |
| 2851 | if (r->md_code_block) { |
| 2852 | renderer_code_emit_backtick_literals(r, count); |
| 2853 | return; |
| 2854 | } |
| 2855 | /* Support both `code` and ``code``. The latter is uncommon in model |
| 2856 | * replies, but accepting it costs nothing and avoids leaking delimiters. */ |
| 2857 | r->md_inline_code = !r->md_inline_code; |
| 2858 | } |
| 2859 | |
| 2860 | static bool renderer_space_byte(char c) { |
| 2861 | return c == ' ' || c == '\t' || c == '\r' || c == '\n'; |
| 2862 | } |
| 2863 |
no test coverage detected