ó
    uT¸jr  ã                   óÜ  • S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK	J
r
Jr  \R                  R                  \R                  R                  \5      5      r\R                  R                  \5      r\R                  R%                  \S5      r\R                  R%                  \S5      r\R                  R%                  \S5      r\R,                  " 5       rSrSr\R4                  " S	5      rS
 rS rS r " S S\
5      r\ S:X  a^  S\ S3r!\"" S\! S35        \RF                  RI                  S5      (       d  \RJ                  " \!5        \" S\4\5      RM                  5         gg)a  Local server for the manuscript review page.

Serves writing/ (the review page) and stores review comments per version in comments/v<N>.json,
so the page saves automatically without any file picker.
Run: python review_server.py   (or double-click open_review.cmd)
é    N)ÚSimpleHTTPRequestHandlerÚThreadingHTTPServerÚcommentszmanuscript2_journal_versions.jszmanuscript2_journal_draft.jsonzwindow.MANUSCRIPT_VERSIONS = i="  z^/api/comments/(\d+)$c                  ó   • [        [        SS9 n U R                  5       R                  SS5      u  pS S S 5        [        R
                  " W[        [        5      S  R                  5       R                  S5      5      W4$ ! , (       d  f       NS= f)Núutf-8©ÚencodingÚ
é   Ú;)	ÚopenÚVERSIONSÚreadÚsplitÚjsonÚloadsÚlenÚHEADÚrstrip)ÚfÚfirstÚrests      Ú|C:\Users\Victus\Desktop\folder_working\a purdue\aa reasearch\Gaurav Setup\ColumnSetup_gaurav\writing\.agent\review_server.pyÚread_versionsr      sg   € Ü	Œh Ò	)¨QØ—f‘f“h—n‘n T¨1Ó-‰ˆ÷ 
*ä�:Š:�eœC¤›I˜JÐ'×.Ñ.Ó0×7Ñ7¸Ó<Ó=¸tÐCÐC÷ 
*Õ	)ús   �#A?Á?
Bc                 óz  • [         R                  " [        R                  R	                  U 5      SS9u  p# [        R
                  " USSS9 nUR                  U5        UR                  5         [        R                  " UR                  5       5        S S S 5        [        R                  " X05        [        R                  R                  U5      (       a  [        R                  " U5        g g ! , (       d  f       N`= f! [        R                  R                  U5      (       a  [        R                  " U5        f f = f)Nz.tmp)ÚdirÚsuffixÚwr   r   )ÚtempfileÚmkstempÚosÚpathÚdirnameÚfdopenÚwriteÚflushÚfsyncÚfilenoÚreplaceÚexistsÚunlink)r"   ÚtextÚfdÚ	temporaryr   s        r   Úatomic_writer/   "   sÇ   € Ü×$Ò$¬¯©¯©¸Ó)>ÀvÑN�M€Bð!Ü�YŠY�r˜3¨Ò1°QØ�G‰G�DŒMØ�G‰GŒIÜ�HŠH�Q—X‘X“ZÔ ÷ 2ô 	�
Š
�9Ô#ä�7‰7�>‰>˜)×$Ñ$Ü�IŠI�iÕ ð %÷ 2Õ1ûô �7‰7�>‰>˜)×$Ñ$Ü�IŠI�iÕ ð %ús$   ¶C= ÁAC,ÂC= Ã,
C:Ã6C= Ã==D:c                 ó
  ^• U S   n[         R                  R                  [        5      (       ab  [	        [        SS9 n[
        R                  " U5      mS S S 5        [        U4S jU  5       S 5      nU(       a  TS   US   :X  a  US   US   S.mOUS   US   S.m[        R                  " [
        R                  " US   TS   TS   /5      R                  S5      5      R                  5       TS	'   T$ ! , (       d  f       N¦= f)
Néÿÿÿÿr   r   c              3   óB   >#   • U  H  oS    TS   :X  d  M  Uv •  M     g7f)ÚvÚbaseN© )Ú.0r3   Údrafts     €r   Ú	<genexpr>Úread_draft.<locals>.<genexpr>5   s    øé € ÐD¢˜1¨c©F°e¸F±mÑ,C—Q‘Q¢ùs   ƒ–	Úhtmlr3   ©r4   r:   r4   Úrevision)r!   r"   r*   ÚDRAFTr   r   ÚloadÚnextÚhashlibÚsha256ÚdumpsÚencodeÚ	hexdigest)ÚversionsÚlatestr   r4   r7   s       @r   Ú
read_draftrG   /   sß   ø€ Ø�b‰\€FÜ	‡w�w‡~�~”e×ÑÜ”% 'Ò*¨aÜ—I’I˜a“LˆE÷ +ô ÔD¡ÓDÀdÓKˆÞ�E˜&‘M T¨&¡\Ó1Ø# C™[°&¸±.ÑAˆEøà ™¨f°V©nÑ=ˆÜŸšÜ�
Š
�F˜3‘K  v¡°°f±Ð>Ó?×FÑFÀwÓOóç�iƒkð 
ˆ*Ñð €L÷ +Õ*ús   ½C4Ã4
Dc                   ób   ^ • \ rS rSrU 4S jrU 4S jrSS jrU 4S jrS rS r	S r
S	 rS
rU =r$ )ÚHandleré@   c                 ó2   >• [         TU ]  " US[        0UD6  g )NÚ	directory)ÚsuperÚ__init__ÚROOT)ÚselfÚargsÚkwargsÚ	__class__s      €r   rN   ÚHandler.__init__A   s   ø€ Ü‰Ò˜$Ð9¬$Ð9°&Ó9ó    c                 óF   >• U R                  SS5        [        TU ]	  5         g )NzCache-Controlzno-store)Úsend_headerrM   Úend_headers)rP   rS   s    €r   rX   ÚHandler.end_headersD   s   ø€ Ø×Ñ˜¨*Ô5Ü‰ÑÕrU   c                 ó2  • [         R                  " USSS9R                  S5      nU R                  U5        U R	                  SS5        U R	                  S[        [        U5      5      5        U R                  5         U R                  R                  U5        g )NFé   ©Úensure_asciiÚindentr   zContent-Typezapplication/json; charset=utf-8úContent-Length)
r   rB   rC   Úsend_responserW   Ústrr   rX   Úwfiler%   )rP   ÚdataÚstatusÚbodys       r   Ú	send_jsonÚHandler.send_jsonH   su   € Ü�zŠz˜$¨U¸1Ñ=×DÑDÀWÓMˆØ×Ñ˜6Ô"Ø×Ñ˜Ð)JÔKØ×ÑÐ)¬3¬s°4«y«>Ô:Ø×ÑÔØ�
‰
×Ñ˜ÕrU   c                 óf  >• U R                   S:X  a  U R                  SS05      $ U R                   S:X  a6  [           [        5       u  pU R                  [	        U5      5      sS S S 5        $ [
        R                  U R                   5      nU(       d  [        TU ]!  5       $ [        R                   R                  [        SUS    S35      n[        R                   R                  U5      (       a  [        R                  " [        USS	95      OS
/ 0nU R                  U5        g ! , (       d  f       NÅ= f)Nz	/api/pingÚokTú
/api/draftr3   r   ú.jsonr   r   r   )r"   rf   Ú
WRITE_LOCKr   rG   ÚROUTEÚmatchrM   Údo_GETr!   ÚjoinÚCOMMENTSr*   r   r>   r   )rP   rE   Ú_Úmr"   rc   rS   s         €r   ro   ÚHandler.do_GETP   sÚ   ø€ Ø�9‰9˜Ó#Ø—>‘> 4¨ ,Ó/Ð/Ø�9‰9˜Ó$ÞÜ+›o‘�Ø—~‘~¤j°Ó&:Ó;÷ ‘ô �K‰K˜Ÿ	™	Ó"ˆÞÜ‘7‘>Ó#Ð#Ü�w‰w�|‰|œH¨¨!¨A©$¨¨u oÓ6ˆÜ:<¿'¹'¿.¹.È×:NÑ:NŒt�yŠyœ˜d¨WÑ5Ô6ÐU_ÐacÐTdˆØ�‰�tÕ÷ •ús   »&D"Ä"
D0c                 óF  •  [         R                  " U R                  R                  [	        U R
                  S   5      5      5      nU R                  S;   a"   [           U R                  U5      sS S S 5        $ [        R                  U R                  5      nU(       d  U R                  SS0S	5      $ [        R                   " ["        S
S9  [%        [        R                  R'                  ["        SUS    S35      SSS9 n[         R(                  " XSSS9  S S S 5        U R                  SS
05        g ! [        [        4 a    U R                  SS0S5      s $ f = f! , (       d  f       Nò= f! [         a    U R                  SS0S5      s $ f = f! , (       d  f       N�= f)Nr_   ÚerrorzInvalid requesté�  )rj   ú/api/versionsú/api/restorez@Could not save to disk. Your paragraph is still open; try again.iô  ú	not foundé”  T)Úexist_okr3   r   rk   r   r   r   Fr[   r\   ri   )r   r   Úrfiler   ÚintÚheadersÚ
ValueErrorÚ	TypeErrorrf   r"   rl   Úsave_manuscriptÚOSErrorrm   rn   r!   Úmakedirsrq   r   rp   Údump)rP   rc   rs   r   s       r   Údo_PUTÚHandler.do_PUT^   sS  € ð	EÜ—:’:˜dŸj™jŸo™o¬c°$·,±,Ð?OÑ2PÓ.QÓRÓSˆDð �9‰9ÐGÓGðzÞØ×/Ñ/°Ó5÷  ‘Zô �K‰K˜Ÿ	™	Ó"ˆÞØ—>‘> 7¨KÐ"8¸#Ó>Ð>Ü
�Š”H tÒ,Ü”"—'‘'—,‘,œx¨1¨Q¨q©T¨F°%¨Ó9¸3ÈÒQÐUVÜ�IŠI�d¨E¸!Ò<÷ Rà�‰˜˜d�|Õ$øô œIÐ&ó 	EØ—>‘> 7Ð,=Ð">ÀÓDÒDð	Eú÷  •Zûäó zØ—~‘~ wÐ0rÐ&sÐuxÓyÒyðzú÷ RÕQúsN   ‚AD3 ÁE. ÁEÁ/	E. Ä FÄ3$EÅEÅ
E+Å'E. Å+E. Å.FÆFÆ
F c           
      óT  • [         R                  " SU R                  5      nU(       d  U R                  SS0S5      $ [           [        5       u  p#[        U5      S:  a  U R                  SS0S5      sS S S 5        $ U Vs/ s H  oDS   [        US	   5      :w  d  M  UPM     nn[        U5      [        U5      :X  a  U R                  SS
0S5      sS S S 5        $ [        [        [        [        R                  " USS9-   S-   U-   5        [        R                  R                  [        SUS	    S35      n[        R                  R!                  U5      (       a  [        R"                  " U5        U R                  [%        U5      US.5        S S S 5        g s  snf ! , (       d  f       g = f)Nz^/api/versions/(\d+)$rv   rz   r{   r[   z"The only version cannot be deletedrw   r3   r   úVersion not foundF©r]   ú;
rk   ©r7   rE   )Úrern   r"   rf   rl   r   r   r~   r/   r   r   r   rB   r!   rp   rq   r*   ÚremoverG   )rP   rs   rE   r   r3   Úkeptr   s          r   Ú	do_DELETEÚHandler.do_DELETEq   sH  € Ü�HŠHÐ-¨t¯y©yÓ9ˆÞØ—>‘> 7¨KÐ"8¸#Ó>Ð>ÞÜ*›_‰NˆHÜ�8‹}˜qÓ Ø—~‘~ wÐ0TÐ&UÐWZÓ[÷ ‰Zñ  (Ó?šx˜!¨S©6´S¸¸1¹³YÑ+>—A™xˆDÐ?Ü�4‹yœC ›MÓ)Ø—~‘~ wÐ0CÐ&DÀcÓJ÷ ‰Zô œ¤4¬$¯*ª*°TÈÑ*NÑ#NÐQVÑ#VÐY]Ñ#]Ô^Ü—w‘w—|‘|¤H°°!°A±$°°u¨oÓ>ˆHÜ�w‰w�~‰~˜h×'Ñ'Ü—	’	˜(Ô#à�N‰N¤Z°Ó%5À4ÑHÔI÷ ˆZùò @÷	 �Zús1   Á/FÁ<FÂ FÂFÂ"-FÃB2FÆFÆ
F'c                 óÊ  ^^^• [        5       u  mm[        T5      nTR                  S5      US   :w  a  U R                  SS0S5      $ UU4S jnU R                  S:X  aT  [        U4S jT 5       S 5      nUc  U R                  SS0S	5      $ US
   TS   S
   :w  a  U" US
   SUS    35        US
   nOhTR                  S
5      n[        U[        5      (       a  UR                  5       (       d  U R                  SS0S5      $ U R                  S:X  a	  U" US5        [        [        [        R                  " TS   S   US.SS95        U R                  [        T5      TS.5        g )Nr<   rv   zTThe manuscript changed in another window. Copy your open paragraph before reloading.i™  c           	      óü   >• TR                  TS   S   S-   [        R                  R                  5       R                  S5      USU S.5        [	        [
        [        [        R                  " TSS9-   S	-   T-   5        g )
Nr1   r3   r   z%Y-%m-%d %H:%MÚuser)r3   ÚdateÚnoteÚauthorr:   FrŠ   r‹   )	ÚappendÚdatetimeÚnowÚstrftimer/   r   r   r   rB   )r:   r–   r   rE   s     €€r   Úappend_versionÚ/Handler.save_manuscript.<locals>.append_version‰   ss   ø€ Ø�O‰O (¨2¡,¨sÑ"3°aÑ"7Ü%-×%6Ñ%6×%:Ñ%:Ó%<×%EÑ%EÐFVÓ%WØ%)°VÀTñKô Lô œ¤4¬$¯*ª*°XÈEÑ*RÑ#RÐUZÑ#ZÐ]aÑ#aÕbrU   ry   c              3   óZ   >#   • U  H   oS    TR                  S 5      :X  d  M  Uv •  M"     g7f)r3   N)Úget)r6   r3   rc   s     €r   r8   Ú*Handler.save_manuscript.<locals>.<genexpr>�   s$   øé € ÐJ¢h °C±&¸D¿H¹HÀS»MÑ2IŸ1™1¢hùs   ƒ+¢	+r‰   r{   r:   r1   z#Recovery copy before reverting to vr3   zThe manuscript cannot be emptyrw   rx   zSaved from the review pager;   FrŠ   rŒ   )r   rG   rŸ   rf   r"   r?   Ú
isinstancera   Ústripr/   r=   r   rB   )rP   rc   r7   rœ   Úsourcer:   r   rE   s    `    @@r   r‚   ÚHandler.save_manuscriptƒ   sb  ú€ Ü&›‰ˆ�$Ü˜8Ó$ˆØ�8‰8�JÓ 5¨Ñ#4Ó4Ø—>‘> 7ð  -Cð  #Dð  FIó  Jð  Jö	cð �9‰9˜Ó&ÜÔJ¡hÓJÈDÓQˆFØ‰~Ø—~‘~ wÐ0CÐ&DÀcÓJÐJØ�V‰} ¨¡¨VÑ 4Ó4Ù˜u V™}Ð0SÐTZÐ[^ÑT_ÐS`Ð.aÔbØ˜&‘>‰Dà—8‘8˜FÓ#ˆDÜ˜d¤C×(Ñ(°·
±
·±Ø—~‘~ wÐ0PÐ&QÐSVÓWÐWØ�y‰y˜OÓ+Ù˜tÐ%AÔBÜ”UœDŸJšJ°¸±¸SÑ0AÈ4Ñ'PÐ_dÑeÔfØ�‰¤¨HÓ!5À8ÑLÕMrU   c                 ó   • g )Nr5   )rP   rQ   s     r   Úlog_messageÚHandler.log_messageŸ   s   € ØrU   r5   )éÈ   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__rN   rX   rf   ro   r†   r�   r‚   r¦   Ú__static_attributes__Ú__classcell__)rS   s   @r   rI   rI   @   s2   ø† õ:õôõò%ò&Jò$N÷8ð rU   rI   Ú__main__zhttp://127.0.0.1:z/manuscript2_journal.htmlzReview page: z  (Ctrl+C to stop)ÚREVIEW_NO_BROWSERz	127.0.0.1)'Ú__doc__r™   r@   r   r!   r�   r   Ú	threadingÚ
webbrowserÚhttp.serverr   r   r"   r#   ÚabspathÚ__file__ÚHERErO   rp   rq   r   r=   ÚRLockrl   r   ÚPORTÚcompilerm   r   r/   rG   rI   r©   ÚurlÚprintÚenvironrŸ   r   Úserve_foreverr5   rU   r   Ú<module>r¿      sC  ðñó Û Û Û 	Û 	Û Û Û ß Eà	‡w�w‡��r—w‘w—‘ xÓ0Ó1€Ø	‡w�w‡��tÓ€Ø�7‰7�<‰<˜˜jÓ)€Ø�7‰7�<‰<˜Ð?Ó@€Ø
�‰�‰�TÐ;Ó<€Ø�_Š_Ó€
Ø&€Ø€Ø
�
Š
Ð+Ó,€òDò
!òô"`Ð&ô `ðF ˆzÓØ˜d˜VÐ#<Ð
=€CÙ	ˆM˜#˜Ð0Ð
1Ô2Ø�:‰:�>‰>Ð-×.Ñ.Ø�Š˜ÔÙ˜ dÐ+¨WÓ5×CÑCÕEð rU   