
    `gjU                    $    d Z ddlmZ ddlZddZy)u   Shared Signal formatting helpers.

Keep markdown → Signal native formatting conversion in one place so both the
live Signal adapter and standalone send paths emit the same bodyRanges.
    )annotationsNc           
     <	  #$% dd}dd}t        j                  dd|       } | j                         }  ||       } g }t        j                  dt         j                        }|j                  |       x}r|j                  d      j                  d      }|j                         }| d|j                          |z   | |j                         d z   } |j                  |t        |      d	f       |j                  |       x}rt        j                  d
t         j                        }d}	d}
|j                  |       D ]  }|	| |
|j                          z  }	|j                         }
| j                  d|j                               }|dk(  rt        |       }| |j                         | }t        |	      }|	|z  }	|j                  |t        |      df       |}
 |	| |
d z  }	|	} t        j                  dt         j                        dft        j                  dt         j                        dft        j                  dt         j                        dft        j                  d      d	ft        j                  d      dft        j                  d      dfg}g }g }|D ]  \  }}|j                  |       D ]  }|j                         |j                         c$#t        #$fd|D              r:|j                  $#|j                  d      |j                  d      |f       |j                  $#f         |j!                          g %|D ]?  \  $#}}}|$kD  r%j                  $|$z
  f       #|kD  s*%j                  |#|z
  f       A %j!                          d%fd}g }|D ]6  \  }}} ||      } |||z         }||kD  s |j                  |||z
  |f       8 d}d}
g }|D ]D  \  $#}}}|| |
$ z  }t        |      }| || }||z  }|j                  |t        |      |f       #}
F || |
d z  }|} ||z   }g }t#        |      D ]O  \  }}} |dk  s||z   t        |       kD  r || d|       }! || |||z          }"|j                  |! d|" d|         Q | |fS )a  Convert markdown to plain text + Signal textStyles list.

    Signal doesn't render markdown. Instead it uses ``bodyRanges`` (exposed by
    signal-cli as ``textStyle`` / ``textStyles`` params) with the format
    ``start:length:STYLE``.

    Positions are measured in UTF-16 code units because that's what the Signal
    protocol uses.

    Supported styles: BOLD, ITALIC, STRIKETHROUGH, MONOSPACE.
    c                <    t        | j                  d            dz  S )z#Length of *s* in UTF-16 code units.z	utf-16-le   )lenencode)ss    R/root/.hermes/venv/lib/python3.12/site-packages/gateway/platforms/signal_format.py
_utf16_lenz&markdown_to_signal.<locals>._utf16_len   s    188K()Q..    c                    t        j                  d| t         j                        }t        |      D ](  \  }}|dz  dk(  rt        j                  dd|      ||<   * dj                  |      S )aD  Replace Markdown bullet markers with plain Unicode bullets.

        Signal does not render Markdown list syntax, so ``- item`` and
        ``* item`` otherwise arrive as literal Markdown markers. Preserve
        fenced code blocks byte-for-byte; list-looking lines inside code are
        code, not prose bullets.
        z(```.*?```))flagsr      z(?m)^([ \t]{0,3})[-*+]\s+u   \1•  )resplitDOTALL	enumeratesubjoin)sourcepartsidxparts       r
   _normalize_bullet_markersz5markdown_to_signal.<locals>._normalize_bullet_markers   si     ryyA"5) 	OICQw!| <iNE#J	O wwu~r   z\n{3,}z

z```[a-zA-Z0-9_+-]*\n?(.*?)```r   
N	MONOSPACEz
^#{1,6}\s+r   r   BOLDz\*\*(.+?)\*\*z	__(.+?)__z	~~(.+?)~~STRIKETHROUGHz`(.+?)`z%(?<!\*)\*(?!\*| )(.+?)(?<!\*)\*(?!\*)ITALICz(?<!\w)_(?!_)(.+?)(?<!_)_(?!\w)c              3  <   K   | ]  \  }}|k  xr |kD    y w)N ).0osoememss      r
   	<genexpr>z%markdown_to_signal.<locals>.<genexpr>X   s%     Bvr2rBw*27*Bs   c                `    d}D ]"  \  }}|| k  r|t        || |z
        z  } | |z
  S  | |z
  S )Nr   )min)posshift
remove_pos
remove_lenremovalss       r
   _adjustz#markdown_to_signal.<locals>._adjuste   sS    &. 	"J
CZz)9::U{	
 U{r   :)r	   strreturnint)r   r3   r4   r3   )r,   r5   r4   r5   )r   r   stripcompiler   searchgrouprstripstartendappendr   	MULTILINEfinditerfindanysortsorted)&textr   r   styles
code_blockmatchinnerr;   headingnew_textlast_endeolheading_textpatternsall_matchesoccupiedpatternstyleg1sg1e_r1   adjusted_priorlength	new_startnew_endresultinline_stylesr,   style_stringscp_startcp_len
style_type	u16_startu16_lenr'   r(   r0   s&                                      @@@r
   markdown_to_signalrb      s   / 66)VT*D::<D$T*D)+F<biiHJ$$T*
*%
*A%%d+Oekkm$u,tEIIKM/BBuc%j+67	 $$T*
*%
* jj5GHH!!$' 
DEKKM2299;iieiik*"9d)CEIIK#.HL uc,/89
 XYHD 
$bii	0&9	L"))	,f5	L"))	,o>	J	-	<	=xH	6	7BH 9;K&(H" *%%d+ 	*E[[]EIIKFBBBB""BEKKNEIIaL%#PQR)		** &(H* -BS!8OORrN+8OOS"s(O,	-
 MMO 24N & KvuEN	%&.)Y!!9g	.A5"IJ	K FH02M#. BS%$x##&kS%c3u:u56 d89oFDm+F!M(.v D$&*a<8f,s4y8tIX/	T(X->?@	{!G9Aj\BCD r   )rD   r3   r4   ztuple[str, list[str]])__doc__
__future__r   r   rb   r#   r   r
   <module>re      s    # 	@r   