
    iY                         d Z ddlZddlZddlZddlmZmZ ddlmZ  ee      Z	dde
dz  de
fdZde
de
fd	Zd
e
de
fdZde
fdZd
e
de
fdZy)z/
Helper functions for the Deep Analysis Agent.
    N)datetimedate)
get_loggerbase_dirreturnc                 N   | #t         j                  j                  t              } 	 t         j                  j	                  | d      }t        |d      5 }|j                         cddd       S # 1 sw Y   yxY w# t        $ r"}t        j                  d|        Y d}~yd}~ww xY w)z|
    Load the analytical schema markdown from file.
    If base_dir is None, uses the directory containing this module.
    Nzanalytical_schema.mdrz$Error loading analytical_schema.md: zCSTRICT SCHEMA: (Schema file not found. Fallback to default schema.))
ospathdirname__file__joinopenread	Exceptionloggererror)r   schema_pathfes       D/var/www/html/userprofiledev.eatanceapp.com/deep_analysis/helpers.pyload_analytical_schemar      s    
 77??8,Uggll8-CD+s#q668 $## U;A3?@TUs5   ,A9 A-#	A9 -A62A9 6A9 9	B$BB$textc                     | syt        j                  dd|       }dj                  |j                               }|j	                         S )z4Remove HTML tags from text and normalize whitespace. z<[^>]+> )resubr   splitstrip)r   ss     r   _strip_innerr"      s:    
z2t$AA779    contentc                 0   | r&t        j                  d| t         j                        s| S t        j                  dd | t         j                  t         j                  z        } t        j                  dd | t         j                  t         j                  z        } t        j                  dd | t         j                  t         j                  z        } t        j                  d	d
 | t         j                  t         j                  z        } t        j                  dd | t         j                  t         j                  z        } t        j                  dd| t         j                        } t        j                  dd| t         j                        } | S )u   
    Convert simple HTML (h1–h3, ul/ol/li, p) to Markdown. No heavy dependencies.
    Matches tags case-insensitively and allows attributes (e.g. ``<p class="...">``).
    z<\s*(h[1-3]|p|ul|ol|li)\b)flagsz<h1\b[^>]*>(.*?)</h1>c                 B    dt        | j                  d            z   dz   S )Nz#    

r"   groupms    r   <lambda>z#_html_to_markdown.<locals>.<lambda>4   s    $aggaj11F:r#   z<h2\b[^>]*>(.*?)</h2>c                 B    dt        | j                  d            z   dz   S )Nz## r(   r)   r*   r,   s    r   r.   z#_html_to_markdown.<locals>.<lambda>:   s    %,qwwqz22V;r#   z<h3\b[^>]*>(.*?)</h3>c                 B    dt        | j                  d            z   dz   S )Nz### r(   r)   r*   r,   s    r   r.   z#_html_to_markdown.<locals>.<lambda>@   s    &<
33f<r#   z<p\b[^>]*>(.*?)</p>c                 <    t        | j                  d            dz   S )Nr(   r)   r*   r,   s    r   r.   z#_html_to_markdown.<locals>.<lambda>G   s    ,qwwqz*V3r#   z<li\b[^>]*>(.*?)</li>c                 B    dt        | j                  d            z   dz   S )Nz- r(   
r*   r,   s    r   r.   z#_html_to_markdown.<locals>.<lambda>N   s    $aggaj11D8r#   z</?ul\b[^>]*>r3   z</?ol\b[^>]*>)r   search
IGNORECASEr   DOTALL)r$   s    r   _html_to_markdownr7   (   s(   
 "))$gR]] ff :ii"--'	G ff ;ii"--'	G ff <ii"--'	G ff3ii"--'	G ff 8ii"--'	G ff%tWBMMJGff%tWBMMJGNr#   c                 8    d }t        j                  | |d      S )zGJSON-serialize query result for LLM consumption; handles datetime/date.c                 d    t        | t        t        f      r| j                         S t	        |       S N)
isinstancer   r   	isoformatstr)objs    r   defaultz%serialize_sql_result.<locals>.defaultZ   s&    cHd+,==?"3xr#      )r?   indent)jsondumps)resultr?   s     r   serialize_sql_resultrE   X   s     ::fga88r#   c                    | t        | t              sy| j                         } | syt        d      D ]O  }| }| j	                  dd      j	                  dd      } | j	                  dd      j	                  dd      } | |k(  sO n | j	                  d	d      j	                  dd      } t        d
      D ]O  }| }| j	                  dd      j	                  dd      } | j	                  dd      j	                  dd      } | |k(  sO n t        d
      D ]  }| }| j	                  dd      j	                  dd      } | j	                  dd      j	                  dd      } | j	                  dd      j	                  dd      } | j	                  dd      j	                  dd      } | j	                  dd      j	                  dd      } | j	                  d d!      j	                  d"d!      } | j	                  d#d$      j	                  d%d$      } | j	                  d&d'      j	                  d(d'      } | |k(  s n d)| v r| j	                  d)d*      } d)| v r| j	                  d+d,      } | j	                  dd      j	                  dd      j	                  dd      } | j	                  d	d      j	                  dd      } t        |       } d-| v r| j	                  d-d.      } d-| v r| j                         S )/a  
    Fix LLM output so Markdown renders correctly: literal escape sequences
    (e.g. \n, \", \#) are turned into real characters. Handles multiple levels
    of escaping. Uses only str.replace (no regex) for speed.
    Always returns a string (never None).
    r      z\\nr3   z\\rz\nz\rz
   z\\""z\\''z\"z\'z\\##z\#z\\__z\_z\\**z\*z\\--z\-z\\[[z\[z\\]]z\]z\\((z\(z\\))z\)z\\\z\t	z


r)   )r;   r=   r    rangereplacer7   )r$   rM   prevs      r   normalize_markdown_outputrY   a   s    j#6mmoG 1X//'4088$G//%.66udCd?  oofd+33D$?G 1X//'3/77E//%-55eSAd?  1X//'3/77sC//'3/77sC//'3/77sC//'3/77sC//'3/77sC//'3/77sC//'3/77sC//'3/77sCd?  G
//&$/ G
 ooeT*G ooeT*225$?GGsSGoofd+33D$?G  (G g
//(F3 g
 ==?r#   r:   )__doc__r
   r   rB   r   r   core.logger_configr   __name__r   r=   r   r"   r7   rE   rY    r#   r   <module>r^      s    
 	  # )	H	US4Z U3 U s s -s -s -`9C 9>s >s >r#   