
    nj                    b   S r SSKJr  SSKrSSKrSSKrSSKrSSKJr  SSK	J
r
  Sr\R                  " S\-   S-   \-   S	-   5      r\R                  " S
5      rSSSSS.r\ " S S5      5       rSS jrSS jrSS jrS rS rSS jr\S:X  a#  \R0                  " \" \R2                  5      5        gg)u  Вырезка секции одного дня из недельного плана канала.

Читает файл, который пишет воскресная планёрка, и достаёт из него день
по дате. Формат заголовка дня жёстко зафиксирован в prompt.md — это
контракт, а не соглашение: по нему режет парсер.
    )annotationsN)	dataclass)Pathu	   [—–-]u    ^##\s+(?P<wd>[А-Яа-я]{2})\s+z$\s+(?P<date>\d{4}-\d{2}-\d{2})(?:\s+z\s+(?P<rubric>.+?))?\s*$z+^\*\*(?P<name>[^:*]+):\*\*\s*(?P<value>.*)$tgthreadsighook)   ТГThreadsIGu   Хукc                  x    \ rS rSr% SrS\S'   SrS\S'   SrS\S'   SrS\S'   Sr	S\S'   Sr
S\S	'   SrS\S
'   Srg)DayPlan    strweekdaydaterubricr   r   r   r	    N)__name__
__module____qualname____firstlineno__r   __annotations__r   r   r   r   r   r	   __static_attributes__r       &/home/rasp/content-planner/dayblock.pyr   r      sD    GSD#NFCBLGSBLD#Nr   r   c                   U R                  5       nSn[        U5       H|  u  pE[        R                  U5      nU(       d  M#  UR	                  S5      U:X  d  M:  Un[        UR	                  S5      UUR	                  S5      =(       d    SR                  5       S9n  O   Uc  g[        5       nX#S-   S  H  n[        R                  U5      (       d  UR                  S5      (       a    W$ [        R                  U5      n	U	(       d  MT  [        R                  U	R	                  S	5      R                  5       5      n
U
(       d  M  X;  d  M  UR                  U
5        [        WXR	                  S
5      R                  5       5        M     W$ )um   Вернуть DayPlan для даты target или None, если такого дня в файле нет.Nr   wdr   r   )r   r   r      z## namevalue)
splitlines	enumerateDAY_REmatchgroupr   stripset
startswithFIELD_RE	FIELD_MAPgetaddsetattr)texttargetlinesstartilinemdayseenfmattrs              r   	parse_dayr;   )   s=   OOEEU#LL1F*E)/R668C
  $ } 5Daij!<<!7!7 J ^^D!}}RXXf-33564D$HHTNCxx06689 " Jr   c                   SR                  U R                  5      nU R                  (       a  USR                  U R                  5      -  nU/nSU R                  4SU R                  4SU R
                  44 H2  u  p4UR                  SR                  US-   U=(       d    S5      5        M4     U R                  (       a+  UR                  S	R                  S
U R                  5      5        SR                  U5      $ )u   Собрать текст блока для утреннего сообщения.

Тот же формат отдаёт фаза 2 с Claude: tasks-bot не должен различать,
какая из фаз успела отработать.
u   ✍️ Сегодня, {}u    — {}r
   r   r   z{:<8} {}:u   —u   {:<8} 🎬 хук: {}r   
)	formatr   r   r   r   r   appendr	   join)r7   headr2   labelr"   s        r   render_blockrD   L   s     '--ckk:D
zz	  ,,FE #&&)Is{{+CdCFF^TZ&&us{ENUCD U
xx,33BAB99Ur   c                   [        U 5      n U R                  SSS9  U SR                  U5      -  nSR                  X5      n[        R                  " [        U 5      SSS9u  pV [        R                  " USS	S
9 nUR                  U5        SSS5        [        R                  " U[        U5      5        U$ ! , (       d  f       N0= f! [         a    [        U5      R                  SS9  e f = f)u]   Записать блок атомарно: tasks-bot читает этот файл в 9:00.T)parentsexist_okzmorning-{}.mdzdate: {}

{}z	.morning-z.tmp)dirprefixsuffixwutf-8encodingN)
missing_ok)r   mkdirr?   tempfilemkstempr   osfdopenwritereplace	Exceptionunlink)out_dirr1   blockpathpayloadfdtmpfhs           r   write_blockr`   ^   s    7mGMM$M._++F33D%%f4G3w<FSGBYYr31RHHW 2


3D	" K 21  S	D)s$   #C 9B5(C 5
C?C $C*c                   U c  Uc  gU b  U OUnSnU b  U R                   (       a  U R                   nOUb  UR                   n[        UR                  UR                  UU b  U R                  OSS9nUb5  UR
                  Ul        UR                  Ul        UR                  Ul        U$ U b3  U R
                  Ul        U R                  Ul        U R                  Ul        U$ )u<  Склеить блок дня из двух недельных планов.

Телеграмный план владеет полем ТГ и рубрикой дня, инста-тредсовый —
полями Threads, IG и Хук. Любого из файлов может не быть: воскресный
прогон мог упасть, субботний — ещё не отработать. Тогда блок собирается
из того, что есть: половина дня полезнее, чем «темы на сегодня нет».
Nr   )r   r   r   r   )r   r   r   r   r   r   r   r	   )tg_day	insta_daybaser   mergeds        r   
merge_daysrf   p   s     ~)+'6YDFfmm		!!YY*699	F "**LL	nn M 
	
  II	kkMr   c                   U (       d  g [        U 5      R                  SS9n[        X!5      nUc'  [        SR	                  X5      [
        R                  S9  U$ ! [         a*    [        SR	                  U 5      [
        R                  S9   g[         a*    [        SR	                  U 5      [
        R                  S9   g[         a1  n[        SR	                  X5      [
        R                  S9   SnAgSnAff = f)	uU  DayPlan из файла или None: файла нет, он битый или дня в нём нет.

Ошибки печатаются в stderr и не роняют вызов — решение о том, хватает ли
собранного на блок дня, принимает main() по обоим файлам сразу.
NrL   rM   u*   файл недели {} не найденfileuB   файл {} не может быть прочитан как UTF-8u+   ошибка чтения файла {}: {}u   дня {} нет в {})
r   	read_textFileNotFoundErrorprintr?   sysstderrUnicodeDecodeErrorrW   r;   )r[   r1   r0   er7   s        r   	_read_dayrq      s     
Dz##W#5 D
!C
{&--f;#**MJ  :AA$GcjjY RYYZ^_fifpfpq ;BB4KRUR\R\]s#   A 1C80C8>	C8'C33C8c                n   [        U 5      S;  a  [        S[        R                  S9  gU S   U S   U S   p2n[        U 5      S:X  a  U S   OS n[	        [        X5      [        XB5      5      nUc(  [        S	R                  U5      [        R                  S9  g[        X2[        U5      5      n[        U5        g
)N)      zDusage: dayblock.py <weekly_file> <YYYY-MM-DD> <out_dir> [insta_file]rh      r       rt   rs   u5   дня {} нет ни в одном из плановr   )	lenrl   rm   rn   rf   rq   r?   r`   rD   )argvweeklyr1   rY   instar7   r[   s          r   mainr{      s    
4yR	
 "1gtAwQGF4yA~DG4E
Yv.	%0H
IC
{ELLVT[^[e[efwS(9:D	$Kr   __main__)r0   r   r1   r   )r7   r   returnr   )r1   r   rZ   r   r}   r   )r}   int)__doc__
__future__r   rS   rerm   rQ   dataclassesr   pathlibr   DASHcompiler%   r+   r,   r   r;   rD   r`   rf   rq   r{   r   exitrx   r   r   r   <module>r      s    # 	 	 
  !  	'$. 2 23
 ::DEitvN	    F$$$N2& zHHT#((^ r   