
    *j                    2   d dl mZ d dlZd dlZd dlZd dlZd dl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 d dlmZmZ d dlmZ d dlmZ d dlmZmZmZ h d	Z ej        d
          Z ej        d          Z ej        d          Z ed          Z ed           G d d                      Z  ed           G d d                      Z! ed           G d d                      Z" ed           G d d                      Z# ed           G d d                      Z$ ed           G d d                      Z% G d d          Z&dyd!Z'dzd#Z(d{d&Z)d|d(Z*d}d+Z+d~d/Z,dd1Z-dd6Z.dd9Z/dd=Z0dd@Z1ddCZ2ddFZ3ddHZ4dddLZ5ddMZ6ddOZ7ddQZ8ddSZ9dddYZ:dd[Z;	 ddd]Z<dd^Z=dd`Z>ddbZ?ddcZ@dddZAdddgZB G dh die          ZC G dj dke          ZDddmZEddoZFddtZGddvZHddwZIeJdxk    r eK eI                      dS )    )annotationsN)	dataclassfield)
HTTPStatus)BaseHTTPRequestHandlerThreadingHTTPServer)Path)Any)parse_qs	urlencodeurlparse>   .bmp.gif.jpg.png.tif.jpeg.tiff.webpz+(?i)\bBJ(?:[- _][IVXLCDM]+)?[- _]?(\d{1,4})z(\d+)\s*([vV])?z(?i)\s+copy$zD:\manuscrise bolyai ianosT)slotsc                  $    e Zd ZU ded<   ded<   dS )RootSpecstrlabelr	   pathN__name__
__module____qualname____annotations__     ms_bj_browser\server.pyr   r   %   s"         JJJJJJJJr"   r   c                      e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   d	ed
<   ded<   ded<   edd            Zedd            ZdS )
ImageEntryr	   absolute_pathr   archive_labelrelative_path
folder_keyfolder_namefilename
int | Nonemanuscript_number
page_labeltuple[int, int, str]sort_keyreturnc                4    dt          d| j        i           S )Nz/image?r   )r   resource_keyselfs    r#   	image_urlzImageEntry.image_url7   s     AFD,=#>??AAAr"   c                6    t          | j        | j                  S N)build_resource_keyr'   r(   r4   s    r#   r3   zImageEntry.resource_key;   s    !$"4d6HIIIr"   Nr1   r   )r   r   r   r    propertyr6   r3   r!   r"   r#   r%   r%   +   s         OOOMMM!!!!OOO""""B B B XB J J J XJ J Jr"   r%   c                  T   e Zd ZU ded<   ded<   ded<   ded<   ded<    ee          Zd	ed
<    ee          Zded<    ee          Z	d	ed<   dZ
ded<   dZded<   edd            Zedd            Zedd            Zedd            Zedd            Zedd            ZdS ) FolderRecordr   keynamer'   r	   r&   r(   default_factorylist[ImageEntry]imageszdict[int, list[ImageEntry]]images_by_manuscriptunmatched_images display_titlenotesr1   	list[int]c                *    t          | j                  S r8   )sortedrD   r4   s    r#   manuscriptszFolderRecord.manuscriptsM   s    d/000r"   intc                *    t          | j                  S r8   )lenrC   r4   s    r#   image_countzFolderRecord.image_countQ   s    4;r"   c                *    t          | j                  S r8   )rO   rE   r4   s    r#   unmatched_countzFolderRecord.unmatched_countU   s    4()))r"   r,   c                (    | j         }|r|d         nd S Nr   rL   r5   valuess     r#   first_manuscriptzFolderRecord.first_manuscriptY   s    !",vayy,r"   c                (    | j         }|r|d         nd S )NrU   rV   s     r#   last_manuscriptzFolderRecord.last_manuscript^   s    !#-vbzz-r"   c                    | j         p| j        S r8   )rG   r?   r4   s    r#   effective_titlezFolderRecord.effective_titlec   s    !.TY.r"   N)r1   rI   r1   rM   )r1   r,   r:   )r   r   r   r    r   listrC   dictrD   rE   rG   rH   r;   rL   rP   rR   rX   r[   r]   r!   r"   r#   r=   r=   @   s        HHHIII$uT:::F::::8=d8S8S8SSSSS).t)D)D)DDDDDMEOOOO1 1 1 X1       X  * * * X* - - - X- . . . X. / / / X/ / /r"   r=   c                      e Zd ZU ded<    ee          Zded<    ee          Zded<   dZ	d	ed
<   dZ
d	ed<    ee          Zded<   edd            ZdS )ManuscriptRecordrM   numberr@   rB   rC   zset[str]foldersrF   r   titlerH   	list[str]
categoriesr1   c                $    | j         p	d| j         S )NManuscris BJ-)re   rc   r4   s    r#   r]   z ManuscriptRecord.effective_titleq   s    z::T[:::r"   Nr:   )r   r   r   r    r   r_   rC   setrd   re   rH   rg   r;   r]   r!   r"   r#   rb   rb   h   s         KKK$uT:::F::::c222G2222EOOOOEOOOO!E$777J7777; ; ; X; ; ;r"   rb   c                  T    e Zd ZU ded<    ee          Zded<   ed
d            Zd	S )CategoryRecordr   r?   r@   rI   rL   r1   rM   c                *    t          | j                  S r8   )rO   rL   r4   s    r#   countzCategoryRecord.count{   s    4#$$$r"   Nr^   )	r   r   r   r    r   r_   rL   r;   rn   r!   r"   r#   rl   rl   v   s[         III"U4888K8888% % % X% % %r"   rl   c                  `    e Zd ZU ded<   ded<   ded<   ded<   d	ed
<   ded<   ded<   ded<   dS )IndexSnapshotr	   rootlist[RootSpec]rootszdict[str, FolderRecord]rd   zdict[int, ManuscriptRecord]rL   zdict[str, CategoryRecord]rg   rM   total_imagesrE   r   
scanned_atNr   r!   r"   r#   rp   rp      sj         JJJ$$$$,,,,))))OOOOOr"   rp   c                      e Zd Zd+dZd,dZd-d	Zd.dZd/dZd0dZd1dZ	d2dZ
	 d3d4d Zd5d!Zd6d#Zed7d&            Zd8d(Zed9d)            Zd*S ):LibraryIndexrq   r	   metadata_pathc                    |                                 | _        || _        t          j                    | _        d | _        i | _        |                                  d S r8   )	resolverq   rx   	threadingRLock_lock	_snapshot_roots_by_labelrefresh)r5   rq   rx   s      r#   __init__zLibraryIndex.__init__   sH    LLNN	*_&&
/302r"   r1   Nonec                
   | j         5  |                                 }i }i }t          |                    dg                     }d}d}t	          | j                  }d |D             | _        |D ]}t          d |j        	                                D             d           D ]}	t          |j        |	j                  }
t          |
|	j        |j        |	t          |	                    |j                            |d                             |
i                               dd	          |d                             |
i                               d
d	                    }t          |	                    d          d           D ]1}|                                s|j                                        t(          vr9t+          ||
|	j        |          }|j                            |           |dz  }|j         |j                            |           |dz  }|j                            |j        g           }|                    |           |                    |j        t9          |j                            }|j                            |           |j                            |j                   3|j                             d            |j                             d            |j        !                                D ]}|                     d            |||j        <   |"                                D ]\  }}|j                             d            |d                             t          |          i           }|                    dd	          |_#        |                    d
d	          |_$        t          |                    dg                     |_%        tM          ||j%                  }d |D             }|!                                D ]L}|j%        D ]B}|                    |tO          |                    j(                            |j)                   CM|!                                D ]}|j(                                          tU          | j        ||tW          t          |"                                                    tW          t          |"                                d                     ||| ,                                          | _-        d d d            d S # 1 swxY w Y   d S )Nrg   r   c                (    i | ]}|j         |j        S r!   )r   r   ).0specs     r#   
<dictcomp>z(LibraryIndex.refresh.<locals>.<dictcomp>   s    #L#L#LdDJ	#L#L#Lr"   c                :    g | ]}|                                 |S r!   )is_dir)r   items     r#   
<listcomp>z(LibraryIndex.refresh.<locals>.<listcomp>   s%    PPPd$++--PTPPPr"   c                4    | j                                         S r8   )r?   lowerr   s    r#   <lambda>z&LibraryIndex.refresh.<locals>.<lambda>   s    TY__%6%6 r"   r>   rd   rG   rF   rH   )r>   r?   r'   r&   r(   rG   rH   *c                D    t          |                                           S r8   )r   r   r   s    r#   r   z&LibraryIndex.refresh.<locals>.<lambda>   s    TARAR r"      c                &    | j         pdg| j        R S N ʚ;)r-   r0   r   s    r#   r   z&LibraryIndex.refresh.<locals>.<lambda>   s    $*@*IE)ZDM)Z)Z r"   c                4    | j                                         S r8   )r+   r   r   s    r#   r   z&LibraryIndex.refresh.<locals>.<lambda>   s    $-BUBUBWBW r"   c                    | j         S r8   )r0   r   s    r#   r   z&LibraryIndex.refresh.<locals>.<lambda>   s    DM r"   c                    | j         pd| j                                        | j                                        | j        fS r   )r-   r*   r   r'   r0   r   s    r#   r   z&LibraryIndex.refresh.<locals>.<lambda>   s=    .7%(..00*0022	& r"   rL   re   c                .    i | ]}|t          |          S r!   )rl   )r   categorys     r#   r   z(LibraryIndex.refresh.<locals>.<dictcomp>   s/          7?.22     r"   c                6    | d                                          S rT   )casefoldr   s    r#   r   z&LibraryIndex.refresh.<locals>.<lambda>   s    d1gFVFVFXFX r"   )rq   rs   rd   rL   rg   rt   rE   ru   ).r}   _load_metadatanormalize_categoriesgetdiscover_rootsrq   r   rK   r   iterdirbuild_folder_keyr   r?   r=   r   relative_torglobis_filesuffixr   IMAGE_EXTENSIONSbuild_image_entryrC   appendr-   rE   rD   
setdefaultrb   rd   addr>   sortrW   itemsre   rH   rg   merge_categoriesrl   rL   rc   rp   r`   _format_timestampr~   )r5   metadatard   rL   rg   rt   rE   rs   	root_specfolder_pathr)   folderr   entrybucket
manuscriptr   rc   metacategory_recordsr   records                         r#   r   zLibraryIndex.refresh   s   Z j	 j	**,,H/1G79K-hll<.L.LMMJL "49--E#L#Le#L#L#LD " 81 81	#)PPin&<&<&>&>PPP66$ $ $ 71 71K "2)/;CS!T!TJ)&(-&/o&1&)+*A*A).*Q*Q&R&R&.y&9&=&=j"&M&M&Q&Q+R' ' 'y155j"EEII#R   F !'#))#..4R4R! ! ! ; ;  $||~~ %$;,,..6FFF$ 1%z;3CT! ! ,,U333$) 2:"3::5AAA,1,$!'!<!G!G!3R" " e,,,%0%;%;!35EeF]5^5^& &
 #)00777"*..vz::::M&&ZZ '    +005W5W0XXX!'!<!C!C!E!E C C

'A'A
BBBB*0GFJ''o71r '2&7&7&9&9 Q Q"
!&&  '     .223v;;CC#'88GR#8#8
 #'88GR#8#8
 (<TXXlTV=W=W(X(X
%-j*:OPP

   CM      *0022 < <
 * 5 < <H$// .":": !&&):";";";";< +1133 * *"''))))*Y (9(9(;(;!<!<==+11339X9XYYY  *!11133  DNj	 j	 j	 j	 j	 j	 j	 j	 j	 j	 j	 j	 j	 j	 j	 j	 j	 j	s   T)T>>UUrp   c                ~    | j         5  | j        t          d          | j        cd d d            S # 1 swxY w Y   d S )NzIndexul nu a fost initializat.)r}   r~   RuntimeErrorr4   s    r#   get_snapshotzLibraryIndex.get_snapshot  s    Z 	" 	"~%"#CDDD>	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"s   266r>   r   FolderRecord | Nonec                Z    |                                  j                            |          S r8   )r   rd   r   )r5   r>   s     r#   
get_folderzLibraryIndex.get_folder  s%      ""*..s333r"   rc   rM   ManuscriptRecord | Nonec                Z    |                                  j                            |          S r8   )r   rL   r   )r5   rc   s     r#   get_manuscriptzLibraryIndex.get_manuscript  s%      "".226:::r"   r3   Path | Nonec                   t          |          \  }}|r	|| j        vrd S | j        |         |z                                  }	 |                    | j        |                    n# t          $ r Y d S w xY w|                                r|nd S r8   )parse_resource_keyr   rz   r   
ValueErrorr   )r5   r3   r'   r(   	candidates        r#   resolve_relative_pathz"LibraryIndex.resolve_relative_path  s    '9,'G'G$} 	T5I I I4)-8=HQQSS		!!$"6}"EFFFF 	 	 	44	%--//9yyT9s    A$ $
A21A2r?   list[FolderRecord]c                    |                                  }t          fd|j                                        D             d           S )Nc                *    g | ]}|j         k    |S r!   )r?   )r   r   r?   s     r#   r   z5LibraryIndex.find_folders_by_name.<locals>.<listcomp>  s%    SSSv{d?R?RV?R?R?Rr"   c                f    | j                                         | j                                        fS r8   )r'   r   r?   r   s    r#   r   z3LibraryIndex.find_folders_by_name.<locals>.<lambda>  s(     4 : : < <fk>O>O>Q>QR r"   r   )r   rK   rd   rW   )r5   r?   snapshots    ` r#   find_folders_by_namez!LibraryIndex.find_folders_by_name  sW    $$&&SSSS("2"9"9";";SSSRR
 
 
 	
r"   rG   rH   boolc                   | j         5  |                                 }|                                |                                d}|d         s|d         r||d         |<   n|d                             |d            |                     |           |                                  	 d d d            dS # 1 swxY w Y   d S )N)rG   rH   rG   rH   rd   T)r}   r   strippop_write_metadatar   )r5   r>   rG   rH   r   payloads         r#   save_folder_metadataz!LibraryIndex.save_folder_metadata   s   Z 	 	**,,H!.!4!4!6!6 G ' 377+; 3+2#C((#''T222  ***LLNNN	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   B B55B9<B9rF   re   categories_rawr
   c                \   | j         5  |                                 }t          |          }|                                |                                |d}|d         s|d         s|d         r||d         t	          |          <   n)|d                             t	          |          d            t          |                    dg           |                     |                    |d<   | 	                    |           | 
                                 	 d d d            dS # 1 swxY w Y   d S )N)re   rH   rg   re   rH   rg   rL   T)r}   r   r   r   r   r   r   r   _categories_used_in_metadatar   r   )r5   rc   re   rH   r   r   rg   r   s           r#   save_manuscript_metadataz%LibraryIndex.save_manuscript_metadata/  so    Z 	 	**,,H-n==J( G
 w ?77#3 ?w|7L ?7>'F44'++CKK>>>%5\2..11(;;& &H\"   ***LLNNN%	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   DD!!D%(D%c                (   | j         5  |                                 }t          t          |          |                     |                    |d<   |                     |           |                                  	 d d d            dS # 1 swxY w Y   d S )Nrg   T)r}   r   r   r   r   r   r   )r5   r   r   s      r#   save_categorieszLibraryIndex.save_categoriesJ  s    Z 	 	**,,H%5$^4411(;;& &H\"   ***LLNNN	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   A2BBBdict[str, Any]c                   | j                                         si i g dS 	 t          j        | j                             d                    }n# t          j        $ r	 i i g dcY S w xY wt          |t                    si i g dS t          |                    di                     t          |                    di                     t          |                    dg                     dS )N)rd   rL   rg   utf-8encodingrd   rL   rg   )
rx   existsjsonloads	read_textJSONDecodeError
isinstancer`   r   r   )r5   datas     r#   r   zLibraryIndex._load_metadataU  s
   !((** 	H!"BGGG	H:d0::G:LLMMDD# 	H 	H 	H!"BGGGGG	H$%% 	H!"BGGGDHHY3344 ; ;<<.txxb/I/IJJ
 
 	
s   -A A'&A'r   rf   c                   g }|                      di           }t          |t                    s|S |                                D ];}t          |t                    r$t	          ||                     dg                     }<|S )NrL   rg   )r   r   r`   rW   r   )r   rg   rL   r   s       r#   r   z)LibraryIndex._categories_used_in_metadatad  s     "
ll="55+t,, 	&&(( 	V 	VD$%% V-j$((<QS:T:TUU
r"   r   c                    | j         j                            dd           | j                             t	          j        |dd          d           d S )NT)parentsexist_okF   )ensure_asciiindentr   r   )rx   parentmkdir
write_textr   dumps)r5   r   s     r#   r   zLibraryIndex._write_metadatao  sb    !''t'DDD%%JwU1=== 	& 	
 	
 	
 	
 	
r"   c                 \    ddl m }  |                                                     d          S )Nr   datetimez%Y-%m-%d %H:%M:%S)r   nowstrftimer   s    r#   r   zLibraryIndex._format_timestampv  s1    %%%%%%||~~&&':;;;r"   N)rq   r	   rx   r	   r1   r   )r1   rp   )r>   r   r1   r   )rc   rM   r1   r   )r3   r   r1   r   )r?   r   r1   r   )r>   r   rG   r   rH   r   r1   r   rF   )
rc   rM   re   r   rH   r   r   r
   r1   r   )r   r
   r1   r   )r1   r   )r   r   r1   rf   )r   r   r1   r   r:   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   staticmethodr   r   r   r!   r"   r#   rw   rw      sS          k k k kZ" " " "4 4 4 4; ; ; ;	: 	: 	: 	:
 
 
 
   ( !    6	 	 	 	
 
 
 
    \
 
 
 
 < < < \< < <r"   rw   r+   r   r1   c                    t          |           j        }t                              d|                                          S )NrF   )r	   stemCOPY_SUFFIX_REsubr   )r+   bases     r#   clean_base_namer  }  s2    >>Db$''--///r"   r   c                    |                      d          }t          |          dk    rd                    |dd                    n| S )N-r   )splitrO   join)r   partss     r#   archive_short_labelr	    s@    KKE#&u::??388E"##J=r"   r'   r*   c                    |  d| S )N::r!   )r'   r*   s     r#   r   r     s    ,,{,,,r"   r(   c                <    |                     dd          }|  d| S )N\/r  )replace)r'   r(   
normalizeds      r#   r9   r9     s+    &&tS11J++z+++r"   r3   tuple[str | None, str]c                    d| vrd | fS |                      dd          \  }}||                    dt          j                  fS )Nr  r   r  )r  r  ossep)r3   r'   r(   s      r#   r   r     sO    <\!!#/#5#5dA#>#> M=-//RV<<<<r"   	base_pathr	   rr   c                .   |                                  } g }t          |                     d                    D ]C}|dz  }|                                r(|                    t          |j        |                     D|r|S | j        dk    r/|                                 rt          | j        j        |           gS | dz                                  rt          | j        | dz            gS |                                 rt          | j        |           gS g S )NzMS_BJ-20260520T083533Z-*MS_BJ)rz   rK   globr   r   r   r?   r   )r  matchesr   rq   s       r#   r   r     s   !!##IGINN+EFFGG ; ;	7";;== 	;NN8IND99::: ~  Y%5%5%7%7 ).	::;;G##%% ?W)<==>> 53344Ir"   'tuple[int | None, re.Match[str] | None]c                    t                               t          |                     }|sdS t          |                    d                    |fS )N)NNr   )MANUSCRIPT_REsearchr  rM   group)r+   matchs     r#   extract_manuscript_numberr     sG      !:!:;;E zu{{1~~%%r"   r-   r,   r  re.Match[str] | Nonec                ^   t          |           }||dS ||                                d          }t          j        d| dd|          }g }t                              |          D ]1\  }}t          |           |rdnd }|                    |           2d                    |          S )NrF   z(?i)\bz[_-]v, )	r  endrer   PAGE_REfindallrM   r   r  )	r+   r-   r  r  tailtokenspage_numberversotokens	            r#   extract_page_labelr.    s    8$$D EMr		D63-333R>>DF%ood33  U{##;E%9SSr;;e99Vr"   r.   r/   c                   t                               |          }|sdd|                                 fS t          |                    d                    }|                    d          rdnd}|||                                 fS )Nr   r   r   r   )r'  r  r   rM   r  )r+   r.   r  r+  
verso_ranks        r#   page_sort_keyr1    sx    NN:&&E ,q(..**++ekk!nn%%Kkk!nn+!JX^^%5%566r"   r   r)   r   c                   t          |j                  \  }}t          |j        ||          }t          || j        t          |                    | j                            |||j        ||t          |j        |          	  	        S )N)	r&   r'   r(   r)   r*   r+   r-   r.   r0   )	r   r?   r.  r%   r   r   r   r   r1  )r   r)   r*   r   r-   r  r   s          r#   r   r     s      9CCuty*;UCCEo$**9>::;;+ty%00
 
 
 
r"   numbersrI   c                    | sdS t          |           dk    rd                    d | D                       S d| d          d| d          d	t          |            d
S )Nzfara manuscrise detectate   r$  c              3      K   | ]	}d | V  
dS )BJ-Nr!   r   rc   s     r#   	<genexpr>z+compact_manuscript_label.<locals>.<genexpr>  s(      >>Fv>>>>>>r"   r7  r   z ... BJ-rZ    (z detectate))rO   r  )r3  s    r#   compact_manuscript_labelr;    sq     +**
7||qyy>>g>>>>>>MMMWR[MMCLLMMMMr"   valuer
   c                r    t          j        ddt          | pd                                        d          S )Nz\s+ rF   z 	
,;)r&  r   r   r   r<  s    r#   normalize_category_namer@    s0    6&#s5;B//0066{CCCr"   rawrf   c                h   g }t          | t                    rt          j        d|           }nt          | t          t
          t          f          rf| D ]b}t          |t                    r)|                    t          j        d|                     @|                    t          |                     cn| rt          |           g}g }t                      }|D ]W}t          |          }|s|
                                }||v r-|                    |           |                    |           X|S )Nz[\n,;]+)r   r   r&  r  r_   tuplerj   extendr   r@  r   r   )rA  r   r   resultseenr  r>   s          r#   r   r     s9   E#s 	S))	C$s+	,	,  	( 	(D$$$ (RXj$778888SYY''''		(
 
 S
FUUD " ",T22
 	!!##$;;j!!!!Mr"   groupsc                     g }t                      }| D ]W}t          |          D ]E}|                                }||v r|                    |           |                    |           FX|S r8   )rj   r   r   r   r   )rG  mergedrF  r  r   r>   s         r#   r   r     s    FUUD    (// 	  	 D--//Cd{{HHSMMMMM$	  Mr"   rg   linkedr   c           	        | sdS g }| D ]c}|r9|                     dt          d|i           dt          |           d           =|                     dt          |           d           dd                    |          S )	Nz)<span class='muted'>fara categorie</span>z<a class='badge-link' href='/?r   '></a>z<span class='badge-chip'>z</span>rF   )r   r   escaper  )rg   rJ  badgesr   s       r#   render_category_badgesrP    s     ;::F Q Q 	QMMlJ;Q1R1RllV\]eVfVflll    MMOfX6F6FOOOPPPP776??r"   c                P    t          j        | dnt          |           d          S )NrF   T)quote)htmlrN  r   r?  s    r#   rN  rN    s%    ;U]rrE

$GGGGr"   textc                &   |                                  sdS g }|                                                                  D ]>}|                                 }|r&|                    dt          |           d           ?d                    |          S )Nz.<p class='muted'>Nu exista notite salvate.</p>z<p>z</p>rF   )r   
splitlinesr   rN  r  )rT  
paragraphsblocks      r#   paragraphizerY  "  s    ::<< @??J((** 9 9 	97F5MM77788877:r"   statusc           	     p    ddddddddd	}|                     |           }|sd
S dt          |           dS )NzIndexul a fost reimprospatat.z(Modificarile folderului au fost salvate.z+Modificarile manuscrisului au fost salvate.z"Lista de categorii a fost salvata.z&Folderul a fost trimis catre Explorer.zFolderul cerut nu exista.zManuscrisul cerut nu exista.!Imaginea ceruta nu a fost gasita.)	refreshedfolder-savedmanuscript-savedcategories-savedfolder-openedinvalid-folderinvalid-manuscriptzinvalid-imagerF   z<div class='flash'>z</div>)r   rN  )rZ  mappingmessages      r#   build_status_messagerf  -  s]    4BI@A5<<	 	G kk&!!G r88888r"   activec                    g d}g }|D ]<\  }}}|| k    rdnd}|                     d| d| dt          |           d           =d                    |          S )	N))rL   r  
Manuscrise)rd   /foldersFoldere)rg   /categories	Categorii)	unmatched
/unmatchedNeclareznav-link activeznav-linkz
<a class='z' href='rL  rM  rF   )r   rN  r  )rg  r   linksr>   hrefr   
class_names          r#   navrt  >  s      E E! S ST5*---&&Z
Q*QQdQQfUmmQQQRRRR775>>r"   rF   re   content
extra_headbytesc           	     ~    dt          |            d| dt          |           d| d	}|                    d          S )Nz<!doctype html>
<html lang="ro">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>z></title>
  <link rel="stylesheet" href="/static/style.css">
  a9  
</head>
<body>
  <div class="page-shell">
    <header class="topbar">
      <div class="brand">
        <div class="brand-mark">BJ</div>
        <div>
          <h1>Arhiva manuscriselor</h1>
          <p>Index local, ordonat dupa numarul manuscrisului</p>
        </div>
      </div>
      <nav class="main-nav">z</nav>
    </header>
    <main>a  </main>
  </div>
  <script>
    document.querySelectorAll('[data-filter-input]').forEach((input) => {
      const targetId = input.getAttribute('data-filter-input');
      const target = document.getElementById(targetId);
      if (!target) return;
      const items = [...target.querySelectorAll('[data-search]')];
      input.addEventListener('input', () => {
        const query = input.value.trim().toLowerCase();
        items.forEach((item) => {
          const haystack = item.getAttribute('data-search') || '';
          item.style.display = !query || haystack.includes(query) ? '' : 'none';
        });
      });
    });
  </script>
</body>
</html>
r   )rN  rt  encode)re   rg  ru  rv  documents        r#   layoutr{  L  sk    (
 --( ( ( (& ![['( (* +( ( (HR ??7###r"   r   c                :   t          | j                  }t          | j                  }t          | j                  }dt	          | j        j                   dt	          | j                   dt          | j                   d| d| d| d| j	         d| j
         d	S )
Nzc
<section class="hero">
  <div class="hero-copy">
    <p class="eyebrow">Baza de lucru</p>
    <h2>z</h2>
    <p>Scanare facuta la z. Interfata combina toate pachetele detectate si afiseaza manuscrisele in ordine, folderele sursa si fisierele neclare separat.</p>
  </div>
  <div class="hero-stats">
    <div class="stat"><span>z@</span><small>pachete</small></div>
    <div class="stat"><span>zC</span><small>manuscrise</small></div>
    <div class="stat"><span>zB</span><small>categorii</small></div>
    <div class="stat"><span>z@</span><small>foldere</small></div>
    <div class="stat"><span>z@</span><small>imagini</small></div>
    <div class="stat"><span>z8</span><small>neclare</small></div>
  </div>
</section>
)rO   rd   rL   rg   rN  rq   r?   ru   rs   rt   rE   )r   folder_countmanuscript_countcategory_counts       r#   render_summaryr  y  s    x'((L8/00,--N 
"	#	#	 
 !!455  !00  .  ,  *  &2  &6   r"   selected_categoryc                   r| j         vrdg }fd| j                                        D             }dg}| j         D ]E}|k    rdnd}|                    dt	          |           d| dt	          |           d           Frd	t	                     d
nd}|D ]}	g }
g }t          |	j                  D ]}| j        |         }|j         dt          |j	                   }|                    |           |
                    dt          d|j        i           dt	          |           d           t	          |	j        d d         t          |	j                  dk    rdndz             }t          |	j                   }d                    t!          |	j                  |	j        |	j        d                    |          d                    |	j                   g                                          }|                    dt	          |           dt          d|	j        i           d|	j         dt	          |	j        pd           d| dt          |	j                   dt          |	j                   dd                    |
          pd d|pd d           dt+          |           dt-          |            d| dd                    |           d d                    |          pd! d"}t/          d#d$|          S )%NrF   c                *    g | ]}r	|j         v |S r!   )rg   )r   r   r  s     r#   r   z+render_manuscripts_page.<locals>.<listcomp>  s;         %69N$N$N 	$N$N$Nr"   z+<option value=''>Toate categoriile</option>z	 selectedz<option value=''>z	</option>z'<p class='muted'>Filtru activ: <strong>z</strong></p>zN<p class='muted'>Poti combina cautarea libera cu filtrarea dupa categorii.</p> | z#<a class='mini-link' href='/folder?r>   rL  rM  Z   ...r>  
<tr data-search="z2">
  <td><a class="strong-link" href="/manuscript?rc   ">BJ-</a></td>
  <td>z
fara titlu</td>
  <td><span class="muted">-</span></td>
</tr>

z
<section class="panel">
  <div class="panel-head">
    <div>
      <p class="eyebrow">Navigare principala</p>
      <h3>Lista manuscriselor</h3>
      a  
    </div>
    <form method="post" action="/refresh">
      <input type="hidden" name="next" value="/">
      <button class="button button-secondary" type="submit">Refresh index</button>
    </form>
  </div>
  <div class="toolbar">
    <input class="search-input" data-filter-input="manuscripts-table" type="search" placeholder="Cauta dupa numar, folder, titlu sau notite">
    <form class="toolbar-form" method="get" action="/">
      <select class="select-input" name="category">
        a  
      </select>
      <button class="button button-secondary" type="submit">Filtreaza</button>
    </form>
    <a class="button button-link" href="/folders">Vezi folderele</a>
    <a class="button button-link" href="/categories">Gestioneaza categoriile</a>
    <a class="button button-link" href="/unmatched">Vezi cazurile neclare</a>
  </div>
  <div class="table-wrap">
    <table id="manuscripts-table" class="data-table">
      <thead>
        <tr>
          <th>Manuscris</th>
          <th>Titlu</th>
          <th>Categorii</th>
          <th>Imagini</th>
          <th>Foldere</th>
          <th>Sursa</th>
          <th>Notite</th>
        </tr>
      </thead>
      <tbody>
        zQ<tr><td colspan="7">Nu au fost gasite manuscrise pentru filtrul curent.</td></tr>1
      </tbody>
    </table>
  </div>
</section>
zArhiva manuscriselorrL   )rg   rL   rW   r   rN  rK   rd   r?   r	  r'   r   r>   rH   rO   rP  r  r   rc   re   r   rC   rf  r  r{  )r   rZ  r  rowsrL   category_optionsr   selectedselected_hintr   folder_linksfolder_search_bitsr>   r   r   rH   category_badgessearch_blobru  s     `                r#   render_manuscripts_pager    s     .h6IIID   ".5577  K
 FF' 
 
"*.?"?"?;;RWfX..WWWWF8<L<LWWW	
 	
 	
 	

 	^Z&9J2K2KZZZZ] 
 " !
 !

*,-- 	 	C%c*F{RR':6;O'P'PRRE%%e,,,ki
@S6T6TkkX^_dXeXekkk    z',Z=M9N9NQS9S9SY[\]]01FGGhhJ%&&  +,,.//
 
 %'' 	 	
%%
 
098ZEV:W0X0X
 
_i_p
 
 j.,//
 
 	
 

 :
 
 :
 
 xx?!?
 
 ..
 
 
	
 	
 	
 	
.f. .. . . .& 
!	"	"'. .R 
	mmS. . .G^ (-AAAr"   c                   t          | j                                        d           }g }|D ]e}|j        rd|j         dnd}t	          t          |j                            }t	          |j        d d         t          |j                  dk    rdndz             }|	                    d	t	          |j
         d
|j         d
|j         d
|j         d
d
                    d |j        D                        	                                           dt          d|j        i           dt	          |j
                   dt	          t#          |j                             dt	          |j        pd           d| d|j         d| d|pd d           gdt'          |           dt)          |            dd                    |          pd d}t+          dd|          S )Nc                Z    | j         dnd| j         pd| j                                        fS )Nr   r   r   )rX   r?   r   r   s    r#   r   z%render_folders_page.<locals>.<lambda>  s4    (4AA!#,uK
 r"   r   z<span class='warning-chip'>z neclare</span>z"<span class='ok-chip'>curat</span>r  r  rF   r  r>  c              3  4   K   | ]}t          |          V  d S r8   r   )r   ns     r#   r9  z&render_folders_page.<locals>.<genexpr>  sM        pT  pT{|pstupvpv  pT  pT  pT  pT  pT  pTr"   z.">
  <td><a class="strong-link" href="/folder?r>   ">r  r  r  r  r  r  a  
<section class="panel">
  <div class="panel-head">
    <div>
      <p class="eyebrow">Structura de foldere</p>
      <h3>Foldere sursa</h3>
    </div>
    <form method="post" action="/refresh">
      <input type="hidden" name="next" value="/folders">
      <button class="button button-secondary" type="submit">Refresh index</button>
    </form>
  </div>
  <div class="toolbar">
    <input class="search-input" data-filter-input="folders-table" type="search" placeholder="Cauta dupa nume, titlu, numere sau notite">
    <a class="button button-link" href="/">Inapoi la manuscrise</a>
  </div>
  <div class="table-wrap">
    <table id="folders-table" class="data-table">
      <thead>
        <tr>
          <th>Folder</th>
          <th>Arhiva</th>
          <th>Titlu afisat</th>
          <th>Manuscrise detectate</th>
          <th>Imagini</th>
          <th>Status</th>
          <th>Notite</th>
        </tr>
      </thead>
      <tbody>
        z0<tr><td colspan="7">Nu exista foldere.</td></tr>r  zFoldere manuscriserd   )rK   rd   rW   rR   rN  r;  rL   rH   rO   r   r?   r'   rG   r  r   r   r>   r	  rP   rf  r  r{  )	r   rZ  ordered_foldersr  r   issuespreviewrH   ru  s	            r#   render_folders_pager    s   !!
 
  O D! 
 
 %6Q&*@QQQQ5 	
 1&2DEEFFv|CRC(S5F5F5K5KEEQSTUU
FK  V  V&*>  V  VAU  V  VX^Xd  V  Vgjgogo  pT  pT  AG  AS  pT  pT  pT  hT  hT  V  V  \  \  ^  ^  _  _
 
,5ufj6I,J,J
 
NTU[U`NaNa
 
 !&"67788
 
 f")c**	
 

 
 
 
 
 
 
 ..
 
 
	
 	
 	
 	
%f% %% %@ 
	LLA% % %GL &	7;;;r"   r   c                   d                     d | j        D                       pd}g }| j        D ]j}| j        |         }|                    dt	          d|i           d| dt          |           dd                     d	 |D                        d
	           kd}| j        r0d| j         dd                     d | j        D                        d
}d                     g dt          |           dt          | j
                   dt          | j                   dt          t          | j                             dt          t          | j                             d| dt          | j                   dt	          d| j        i           d| j         dt          | j                   dt          | j                   dt	          d| j        i           dt          | j                   dt          | j                   dd                     |           d| d          }t'          d| j         d|          S ) NrF   c              3  F   K   | ]}d t          d|i           d| dV  dS z(<a class='badge-link' href='/manuscript?rc   z'>BJ-rM  Nr   r8  s     r#   r9  z%render_folder_page.<locals>.<genexpr>F  sX           	d9h=O3P3PccW]ccc           r"   z;<span class='muted'>Nu au fost detectate manuscrise.</span>z
<section class="panel manuscript-group">
  <div class="panel-head compact">
    <div>
      <p class="eyebrow">Manuscris din folder</p>
      <h3><a class="strong-link" href="/manuscript?rc   r  2</a></h3>
    </div>
    <span class="count-chip">8 imagini</span>
  </div>
  <div class="image-grid">
    c              3  8   K   | ]}t          |d           V  dS F)show_folderNrender_image_cardr   images     r#   r9  z%render_folder_page.<locals>.<genexpr>Y  0      MMUu%888MMMMMMr"   
  </div>
</section>
z
<section class="panel">
  <div class="panel-head compact">
    <div>
      <p class="eyebrow">Necesita verificare</p>
      <h3>Imagini neclare</h3>
    </div>
    <span class="warning-chip">z8 fisiere</span>
  </div>
  <div class="image-grid">
    c              3  8   K   | ]}t          |d           V  dS r  r  r  s     r#   r9  z%render_folder_page.<locals>.<genexpr>k  0      ^^Uu%888^^^^^^r"   r  zn
<section class="hero detail-hero">
  <div class="hero-copy">
    <p class="eyebrow">Folder sursa</p>
    <h2>z)</h2>
    <p class="detail-path">Arhiva: r:  z!)</p>
    <p class="detail-path"> </p>
    <div class="badge-row">a  </div>
  </div>
  <div class="hero-actions">
    <a class="button button-link" href="/folders">Inapoi la foldere</a>
    <a class="button button-link" href="/">Inapoi la manuscrise</a>
    <form method="post" action="/folder/open">
      <input type="hidden" name="key" value="z9">
      <input type="hidden" name="next" value="/folder?r>   aM  ">
      <button class="button button-secondary" type="submit">Deschide in Explorer</button>
    </form>
  </div>
</section>
<section class="panel">
  <div class="panel-head">
    <div>
      <p class="eyebrow">Editare locala</p>
      <h3>Descriere folder</h3>
    </div>
    <div class="panel-meta">
      <span class="count-chip">/ imagini</span>
      <span class="count-chip">z manuscrise</span>
    </div>
  </div>
  <form class="edit-form" method="post" action="/folder/edit">
    <input type="hidden" name="key" value="z7">
    <input type="hidden" name="next" value="/folder?zd">
    <label>
      <span>Titlu afisat</span>
      <input type="text" name="display_title" value="z" placeholder="Ex: Studii geometrice, caiet mixt">
    </label>
    <label>
      <span>Notite</span>
      <textarea name="notes" rows="4" placeholder="Noteaza aici ce contine folderul, exceptii sau observatii.">zi</textarea>
    </label>
    <button class="button" type="submit">Salveaza</button>
  </form>
</section>
zFolder rd   )r  rL   rD   r   r   rO   rE   rR   rf  rN  r]   r'   r	  r   r&   r>   rP   rG   rH   r{  r?   )	r   r   rZ  manuscript_badgesrG  rc   rC   rn  ru  s	            r#   render_folder_pager  E  s       (        G 
G 
 F$ 
 
,V4
 5>x>P4Q4Q 
 Y_  "&kk  WWMMfMMMMM  	
 	
 	
 	
" I  !' 6  WW^^fF]^^^^^  	/ / / / / /f/ / / /
 
&	'	'/ / / / %+6+?$@$@/ / / / EKK^_e_sKtKtDuDu/ / / / #3v';#<#<==/ / / / ./ / / / /5VZ.@.@/ / / / 8A%AT7U7U/ / / /6 !' 27/ / / /8 !$F$6 7 79/ / / /@ -36:,>,>A/ / / /B 6?vz?R5S5SC/ / / /H 7=V=Q6R6RI/ / / /P qww}  xD  qE  qEQ/ / / /Z [/ / / /\ ]/ / / / / /G` )FK))9g>>>r"   r   c                @   i }| j         D ]0}|                    |j        g                               |           1g }t	          |          D ]}j        |         }||         }|j         dt          |j                   }	|                    dt          d|j
        i           dt          |	           dt          |           dd                    d |D                        d		           d                    g d
t          |           d| j         dt          | j        pd           dt#          | j                   dd                    fdt	          | j                  D                        dt          | j                    dt          | j                   d| j         dt          d| j        i           dt          | j                   dt          d                    | j                             dt#          t'          j                  d           dt          | j                   dt+          | j                   dd                    |           d
          }
t-          d| j         d |
          S )!Nr  z
<section class="panel manuscript-group">
  <div class="panel-head compact">
    <div>
      <p class="eyebrow">Sursa</p>
      <h3><a class="strong-link" href="/folder?r>   r  r  r  rF   c              3  8   K   | ]}t          |d           V  dS r  r  r  s     r#   r9  z)render_manuscript_page.<locals>.<genexpr>  r  r"   r  r  zn
<section class="hero detail-hero">
  <div class="hero-copy">
    <p class="eyebrow">Manuscris</p>
    <h2>BJ-z</h2>
    <p>zFara titlu salvat inca.r  z)</div>
    <div class="badge-row">
      c              3     K   | ]\}d t          d|i           dt          j        |         j        dz   t	          j        |         j                  z              dV  ]dS )z$<a class='badge-link' href='/folder?r>   rL  r  rM  N)r   rN  rd   r?   r	  r'   )r   r>   r   s     r#   r9  z)render_manuscript_page.<locals>.<genexpr>  s        d  d  BE  }i6M6M  }  }QWX`XhilXmXruzXz  ~Q  RZ  Rb  cf  Rg  Ru  ~v  ~v  Yv  Rw  Rw  }  }  }  d  d  d  d  d  dr"   a  
    </div>
  </div>
  <div class="hero-actions">
    <a class="button button-link" href="/">Inapoi la manuscrise</a>
    <a class="button button-link" href="/categories">Categorii</a>
    <a class="button button-link" href="/folders">Vezi folderele</a>
  </div>
</section>
<section class="panel">
  <div class="panel-head">
    <div>
      <p class="eyebrow">Editare locala</p>
      <h3>Descriere manuscris</h3>
    </div>
    <div class="panel-meta">
      <span class="count-chip">r  z foldere</span>
    </div>
  </div>
  <form class="edit-form" method="post" action="/manuscript/edit">
    <input type="hidden" name="number" value="z;">
    <input type="hidden" name="next" value="/manuscript?rc   zU">
    <label>
      <span>Titlu</span>
      <input type="text" name="title" value="z" placeholder="Ex: Caiet despre analiza, note de lucru, schite">
    </label>
    <label>
      <span>Categorii</span>
      <input type="text" name="categories" value="r$  zs" placeholder="Ex: filosofie, matematica, fragmente">
    </label>
    <p class="form-hint">Categorii disponibile: F)rJ  z</p>
    <label>
      <span>Notite</span>
      <textarea name="notes" rows="4" placeholder="Completeaza aici identificarea manuscrisului.">zy</textarea>
    </label>
    <button class="button" type="submit">Salveaza</button>
  </form>
  <div class="notes-block">z</div>
</section>
ri   rL   )rC   r   r)   r   rK   rd   r?   r	  r'   r   r>   rN  rO   r  rf  rc   re   rP  rg   r_   rH   rY  r{  )r   r   rZ  groupedr  folder_sectionsr)   r   rC   r   ru  s    `         r#   render_manuscript_pager    s   +-G" ? ?5+R0077>>>>OWoo 
 

!*-$;NN#6v7K#L#LNN
 1:5&*:M0N0N 
 SYY^R_R_  "&kk  WWMMfMMMMM  	
 	
 	
 	
"2 2 2 2 2 2f2 2 2 2
 2 2 2 2 	z<#<==2 2 2 2 3:3HII2 2 2 2 
ww  d  d  d  d  IO  PZ  Pb  Ic  Ic  d  d  d  d  d2 2 2 22 !$J$5 6 632 2 2 24 !$J$6 7 752 2 2 2< 0:/@=2 2 2 2> :CHjN_C`9a9a?2 2 2 2D /5Z5E.F.FE2 2 2 2L 4:$))JDY:Z:Z3[3[M2 2 2 2P 2HXM`HaHajo1p1p1pQ2 2 2 2V djjtjzc{c{W2 2 2 2^ ))9::_2 2 2 2b c2 2 2 2 2 2Gf 5*"355}gNNNr"   c                   g }| j                                         D ]}d                    d |j        d d         D                       pd}|                    dt          |j         dd                    d |j        D                                                                   dt          d|j        i           d	t          |j                   d
|j	         d| d           d                    | j                   }dt          |           dt          |            dt          |           dd                    |          pd d	}t          dd|          S )Nr>  c              3  F   K   | ]}d t          d|i           d| dV  dS r  r  r8  s     r#   r9  z)render_categories_page.<locals>.<genexpr>  sX       
 
 hy(FAS7T7Tgg[aggg
 
 
 
 
 
r"      z*<span class='muted'>nefolosita inca</span>r  c              3  4   K   | ]}t          |          V  d S r8   r  r8  s     r#   r9  z)render_categories_page.<locals>.<genexpr>  s(      4d4dVS[[4d4d4d4d4d4dr"   z(">
  <td><a class="strong-link" href="/?r   r  r  r  r  r  ay  
<section class="panel">
  <div class="panel-head">
    <div>
      <p class="eyebrow">Administrare</p>
      <h3>Lista de categorii</h3>
    </div>
    <a class="button button-link" href="/">Inapoi la manuscrise</a>
  </div>
  <p class="muted">Pune cate o categorie pe linie separata. Categoriile deja folosite de manuscrise raman pastrate automat.</p>
  <form class="edit-form" method="post" action="/categories/save">
    <input type="hidden" name="next" value="/categories">
    <label>
      <span>Categorii disponibile</span>
      <textarea name="categories" rows="10" placeholder="Ex: filosofie&#10;matematica&#10;fragmente">a  </textarea>
    </label>
    <button class="button" type="submit">Salveaza categoriile</button>
  </form>
</section>
<section class="panel">
  <div class="panel-head">
    <div>
      <p class="eyebrow">Triere</p>
      <h3>Categorii existente</h3>
    </div>
  </div>
  <div class="toolbar">
    <input class="search-input" data-filter-input="categories-table" type="search" placeholder="Cauta dupa categorie sau numar de manuscris">
  </div>
  <div class="table-wrap">
    <table id="categories-table" class="data-table">
      <thead>
        <tr>
          <th>Categorie</th>
          <th>Manuscrise</th>
          <th>Exemple</th>
        </tr>
      </thead>
      <tbody>
        rF   z?<tr><td colspan="3">Nu exista categorii salvate inca.</td></tr>r  zCategorii manuscriserg   )rg   rW   r  rL   r   rN  r?   r   r   rn   rf  r  r{  )r   rZ  r  r   r  textarea_valueru  s          r#   render_categories_pager    s   D'..00 
 
(( 
 
".ss3
 
 
 
 
 : : 	 	HMffCHH4d4dxOc4d4d4d,d,dffllnnoo &/X]0K&L&L PVW_WdPePe  ~  	  	
 	
 	
 	
 YYx233N.f. .. .  gmm{f|f|!. .R 
	[[S. . .G^ (,@@@r"   c                   g }| j                                         D ]}|j        s
|                    dt	          d|j        i           dt          |j        dz   t          |j	                  z              d|j
         dd                    d |j        D                        d		           |s|                    d
           dt          |           dt          |            dd                    |           d}t          dd|          S )Nz
<section class="panel">
  <div class="panel-head compact">
    <div>
      <p class="eyebrow">Folder cu ambiguitati</p>
      <h3><a class="strong-link" href="/folder?r>   r  r  z4</a></h3>
    </div>
    <span class="warning-chip">z8 neclare</span>
  </div>
  <div class="image-grid">
    rF   c              3  8   K   | ]}t          |d           V  dS r  r  r  s     r#   r9  z(render_unmatched_page.<locals>.<genexpr>H  r  r"   r  a  
<section class="panel">
  <div class="panel-head compact">
    <div>
      <p class="eyebrow">Curatare</p>
      <h3>Nu exista imagini neclare</h3>
    </div>
  </div>
  <p class="muted">Toate imaginile au fost asociate unui manuscris pe baza numelui fisierului.</p>
</section>
r  a  
<section class="panel">
  <div class="panel-head">
    <div>
      <p class="eyebrow">Verificare manuala</p>
      <h3>Imagini care nu au putut fi identificate automat</h3>
    </div>
    <a class="button button-link" href="/folders">Vezi folderele</a>
  </div>
  <p class="muted">Aici apar fisiere precum imagini `DSC...` sau alte nume care nu includ explicit numarul manuscrisului.</p>
</section>
zImagini neclarern  )rd   rW   rE   r   r   r>   rN  r?   r	  r'   rR   r  rf  r  r{  )r   rZ  sectionsr   ru  s        r#   render_unmatched_pager  8  s   H"))++ 
 
& 	
 1:5&*:M0N0N 
 SYY_YdglYl  pC  DJ  DX  pY  pY  ZY  SZ  SZ  !' 6  WW^^fF]^^^^^  	
 	
 	
 	
"  

	
 	
 	
f     G #[':::r"   r  r  c                   |rGdt          d| j        i           dt          | j        dz   t	          | j                  z              dnd}| j        pd}| j        
d| j         nd	}d
| j         d| j         dt          | j	                   dt          | j	                   dt          |           dt          |           d| dS )Nz'<p class='image-meta'><a href='/folder?r>   rL  r  z</a></p>rF   zpagina neidentificatar7  neclarz<
<article class="image-card">
  <a class="image-link" href="zA" target="_blank" rel="noreferrer">
    <img loading="lazy" src="z" alt="z@">
  </a>
  <div class="image-copy">
    <p class="image-title">z</p>
    <p class="image-meta">z	</p>
    z
  </div>
</article>
)
r   r)   rN  r*   r	  r'   r.   r-   r6   r+   )r  r  folder_metar   r   s        r#   r  r  o  se    	  	q)UEDT<U2V2V  	q  	qZ`afaruzaz  ~Q  RW  Re  ~f  ~f  bf  [g  [g  	q  	q  	q  	q 
 7 7E+0+B+N'e%'''T\ $  $o  7=U^6L6L  #5>22  "*--  39--     r"   c                  x    e Zd ZdZedd            ZddZddZddZddZ	e
j        fd dZd!dZd"dZd#dZdS )$ManuscriptRequestHandlerzMSBJBrowser/1.0r1   'ManuscriptBrowserServer'c                    | j         S r8   )serverr4   s    r#   appzManuscriptRequestHandler.app  s
    {r"   r   c                   t          | j                  }t          |j                  }|                    ddg          d         }t          |                    ddg          d                   }|j        dk    rB|                     t          | j        j	        
                                ||                     d S |j        dk    rA|                     t          | j        j	        
                                |                     d S |j        dk    rA|                     t          | j        j	        
                                |                     d S |j        dk    r|                    d	dg          d         }|r| j        j	                            |          nd }|st|                    d
dg          d         rW| j        j	                            |                    d
dg          d                   }t          |          dk    r|d         nd }|s|                     d           d S |                     t#          || j        j	        
                                |                     d S |j        dk    r|                    ddg          d         }|                                s|                     d           d S | j        j	                            t)          |                    }	|	s|                     d           d S |                     t+          |	| j        j	        
                                |                     d S |j        dk    rA|                     t-          | j        j	        
                                |                     d S |j        dk    rw|                    ddg          d         }
| j        j	                            |
          }|s"|                     t2          j        d           d S |                     |           d S |j        dk    r"|                     | j        j        d           d S |                     t2          j        d           d S )NrZ  rF   r   r   r  rj  rl  z/folderr>   r?   r   z/folders?status=invalid-folderz/manuscriptrc   z/?status=invalid-manuscriptro  z/imager   r\  z/static/style.cssztext/css; charset=utf-8zRuta necunoscuta.)r   r   r   queryr   r@  
_send_htmlr  r  indexr   r  r  r   r   rO   	_redirectr  isdigitr   rM   r  r  r   
send_errorr   	NOT_FOUND
_send_file_send_static
style_path)r5   parsedparamsrZ  r  r>   r   r  
raw_numberr   r(   r   s               r#   do_GETzManuscriptRequestHandler.do_GET  s   $)$$&,''Hrd++A.3FJJzB44P4PQR4STT;#OO'HN//116;L   
 F;*$$OO/0K0K0M0MvVVWWWF;-''OO248>3N3N3P3PRXYYZZZF;)##**URD))!,C7:DTX^..s333F Cfjj"66q9 C(.==fjjRTQU>V>VWX>YZZ'*7||q'8'8d ?@@@OO.vtx~7R7R7T7TV\]]^^^F;-''Hrd33A6J%%'' <===66s:GGJ <===OO&z48>3N3N3P3PRXYY   F;,&&OO1$(.2M2M2O2OQWXXYYYF;("""JJvt44Q7M8>77FFD 
 46YZZZOOD!!!F;---dh13LMMMF
,.ABBBBBr"   c           	     4   t          | j                  }|                                 }t          |                    ddg          d                   }|j        dk    rC| j        j                                         |                     t          |d                     d S |j        dk    r|                    ddg          d         }| j        j        
                    |          }|s%|                     t          d	d
                     d S | j        j                            ||                    ddg          d         |                    ddg          d                    |                     t          |d                     d S |j        dk    r'|                    ddg          d         }|                                r,| j        j                            t          |                    s%|                     t          dd                     d S | j        j                            t          |          |                    ddg          d         |                    ddg          d         |                    ddg          d                    |                     t          |d                     d S |j        dk    ra| j        j                            |                    ddg          d                    |                     t          |pdd                     d S |j        dk    r|                    ddg          d         }| j        j        
                    |          }|s%|                     t          d	d
                     d S t#          t$          d          r&t%          j        t)          |j                             |                     t          |d                     d S |                     t.          j        d           d S )Nnextr  r   z/refreshr]  z/folder/editr>   rF   rj  rb  rG   rH   r^  z/manuscript/editrc   rc  re   rg   r_  z/categories/saverl  r`  z/folder/open	startfilera  zActiune necunoscuta.)r   r   
_read_formnormalize_next_urlr   r  r  r   r  
add_statusr   r   r  r   rM   r   r   hasattrr  r  r   r&   r  r   r  )r5   r  formnext_urlr>   r   r  s          r#   do_POSTz ManuscriptRequestHandler.do_POST  s   $)$$  %dhhvu&=&=a&@AA;*$$HN""$$$NN:h<<===F;.((((52$''*CX^..s33F z*6FGGHHHHN//2$//22$''*  
 NN:h??@@@F;,,,(RD11!4J%%'' tx~/L/LSQ[__/]/] z#/CDDEEEHN33J2$''*2$''*t,,Q/	   NN:h0BCCDDDF;,,,HN**488L2$+G+G+JKKKNN:h&?-ASTTUUUF;.((((52$''*CX^..s33F z*6FGGHHHr;'' 8S!566777NN:h@@AAAF
,.DEEEEEr"   formatr   argsr
   c                    t           j                            |                                 d|                                 d||z  d           d S )Nz - - [z] r  )sysstderrwriteaddress_stringlog_date_time_string)r5   r  r  s      r#   log_messagez$ManuscriptRequestHandler.log_message  s_    
""$$$$d&?&?&A&A&A&A6D===R	
 	
 	
 	
 	
r"   dict[str, list[str]]c                    t          | j                            dd                    }| j                            |                              dd          }t          |d          S )NContent-Length0r   r  )errorsT)keep_blank_values)rM   headersr   rfilereaddecoder   )r5   content_lengthrA  s      r#   r  z#ManuscriptRequestHandler._read_form  s[    T\--.>DDEEjoon--44WY4OOt4444r"   r   rw  rZ  r   c                   |                      |           |                     dd           |                     dt          t          |                               |                                  | j                            |           d S )NContent-Typeztext/html; charset=utf-8r  )send_responsesend_headerr   rO   end_headerswfiler  )r5   r   rZ  s      r#   r  z#ManuscriptRequestHandler._send_html  s    6""")CDDD)3s7||+<+<===
!!!!!r"   r   r	   content_typec                T   |                                 }|                     t          j                   |                     d|           |                     dt          t          |                               |                                  | j        	                    |           d S )Nr   r  )

read_bytesr  r   OKr  r   rO   r  r  r  )r5   r   r  r   s       r#   r  z%ManuscriptRequestHandler._send_static  s    //##:=)))666)3s7||+<+<===
!!!!!r"   c                   t          j        |j                  \  }}|                     t          j                   |                     d|pd           |                     dt          |                                j	                             | 
                                 |                    d          5 }	 |                    d          }|sn| j                            |           3	 d d d            d S # 1 swxY w Y   d S )Nr   zapplication/octet-streamr  rbTi   )	mimetypes
guess_typer?   r  r   r  r  r   statst_sizer  openr  r  r  )r5   r   r  _sourcechunks         r#   r  z#ManuscriptRequestHandler._send_file  s8   #.ty99a:=))))S9STTT)3tyy{{/B+C+CDDDYYt__ 	((I.. 
  '''	( 		( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(s   75C::C>C>targetc                    |                      t          j                   |                     d|           |                                  d S )NLocation)r  r   	SEE_OTHERr  r  )r5   r  s     r#   r  z"ManuscriptRequestHandler._redirect)  sG    :/000V,,,r"   N)r1   r  r   )r  r   r  r
   r1   r   )r1   r  )r   rw  rZ  r   r1   r   )r   r	   r  r   r1   r   )r   r	   r1   r   )r  r   r1   r   )r   r   r   server_versionr;   r  r  r  r  r  r   r  r  r  r  r  r!   r"   r#   r  r    s        &N   X:C :C :C :Cx6F 6F 6F 6Fp
 
 
 
5 5 5 5
 ?Im " " " " "" " " "( ( ( (     r"   r  c                  $     e Zd ZdZd	 fdZ xZS )
ManuscriptBrowserServerTserver_addresstuple[str, int]r  rw   r  r	   c                r    || _         || _        t                                          |t                     d S r8   )r  r  superr   r  )r5   r  r  r  	__class__s       r#   r   z ManuscriptBrowserServer.__init__2  s4     
$)ABBBBBr"   )r  r  r  rw   r  r	   )r   r   r   allow_reuse_addressr   __classcell__)r  s   @r#   r  r  /  sM        C C C C C C C C C Cr"   r  urlc                    t          |           }t          |j                  }|g|d<   t          |d          }|                    |                                          S )NrZ  T)doseq)r  )r   r   r  r   _replacegeturl)r!  rZ  r  r  encodeds        r#   r  r  =  sY    c]]FV\""EhE(OT***G???))00222r"   r  c                4    |                      d          sdS | S )Nr  )
startswith)r  s    r#   r  r  E  s"    s## sOr"   hostportrM   rq   c                    t          t                                                    j        }|dz  dz  }|dz  dz  }t	          ||          }t          | |f||          S )Nr   zmetadata.jsonstaticz	style.css)r	   __file__rz   r   rw   r  )r)  r*  rq   app_dirrx   r  r  s          r#   build_serverr/  K  s_    8nn$$&&-Gf$6M8#k1J}--E"D$<
CCCr"   argparse.Namespacec                    t          j        d          } |                     ddd           |                     dt          dd	
           |                     dt          t
          d
           |                                 S )Nz0Server local pentru arhiva manuscriselor Bolyai.)descriptionz--hostz0.0.0.0zAdresa de ascultare.)defaulthelpz--porti@  zPortul HTTP.)typer3  r4  z--rootzJDirectorul de baza. Daca contine pachete MS_BJ-..., le indexeaza pe toate.)argparseArgumentParseradd_argumentrM   r	   DEFAULT_ROOT
parse_args)parsers    r#   r:  r:  S  s    $F  F ):PQQQ
sD~NNN
Y	     r"   c                    t                      } | j                                        }|                                r|                                s t          d| t          j                   dS t          |          s t          d| t          j                   dS t          | j
        | j        |          }t          d| j
         d| j                    t          d|            	 |                                 n# t          $ r t          d           Y nw xY w|                                 n# |                                 w xY wd	S )
NzDirector invalid: )filer   z-Nu am gasit directoare sursa indexabile sub: zServer pornit pe http://:zIndexare din: z
Server oprit.r   )r:  rq   rz   r   r   printr  r  r   r/  r)  r*  serve_foreverKeyboardInterruptserver_close)r  rq   r  s      r#   mainrC  b  s`   <<D9D;;==  )4))
;;;;q$ DdDD3:VVVVq$)TY55F	
<TY
<
<
<
<===	
!4
!
!""" ! ! !     ! 	1s*   ,D  D5 DD5 DD5 5E__main__)r+   r   r1   r   )r   r   r1   r   )r'   r   r*   r   r1   r   )r'   r   r(   r   r1   r   )r3   r   r1   r  )r  r	   r1   rr   )r+   r   r1   r  )r+   r   r-   r,   r  r!  r1   r   )r+   r   r.   r   r1   r/   )
r   r   r)   r   r*   r   r   r	   r1   r%   )r3  rI   r1   r   )r<  r
   r1   r   )rA  r
   r1   rf   )rG  r
   r1   rf   )T)rg   rf   rJ  r   r1   r   )rT  r   r1   r   )rZ  r   r1   r   )rg  r   r1   r   r   )
re   r   rg  r   ru  r   rv  r   r1   rw  )r   rp   r1   r   )r   rp   rZ  r   r  r   r1   rw  )r   rp   rZ  r   r1   rw  )r   r=   r   rp   rZ  r   r1   rw  )r   rb   r   rp   rZ  r   r1   rw  )r  r%   r  r   r1   r   )r!  r   rZ  r   r1   r   )r  r   r1   r   )r)  r   r*  rM   rq   r	   r1   r  )r1   r0  r^   )L
__future__r   r6  rS  r   r  r  r&  r  r{   dataclassesr   r   httpr   http.serverr   r   pathlibr	   typingr
   urllib.parser   r   r   r   compiler  r'  r   r9  r   r%   r=   rb   rl   rp   rw   r  r	  r   r9   r   r   r   r.  r1  r   r;  r@  r   r   rP  rN  rY  rf  rt  r{  r  r  r  r  r  r  r  r  r  r  r  r  r/  r:  rC  r   
SystemExitr!   r"   r#   <module>rN     s   " " " " " "        				 				 



     ( ( ( ( ( ( ( (       C C C C C C C C             6 6 6 6 6 6 6 6 6 6	 	 	  
IJJ
"*'
(
(O,,t! 
        
 J J J J J J J J( $/ $/ $/ $/ $/ $/ $/ $/N 
; 
; 
; 
; 
; 
; 
; 
; % % % % % % % %        n< n< n< n< n< n< n< n<b0 0 0 0
> > > >
- - - -, , , ,
= = = =   $& & & &   7 7 7 7   *N N N ND D D D   6
 
 
 
    H H H H   9 9 9 9"   *$ *$ *$ *$ *$Z   0 DFiB iB iB iB iBXF< F< F< F<R[? [? [? [?|NO NO NO NObAA AA AA AAH4; 4; 4; 4;n    0e e e e e5 e e ePC C C C C1 C C C3 3 3 3   D D D D      , z
*TTVV

 r"   