§
    èâj”  ã                   óÔ   — d 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 dZdZ	de
de
fd„Zd	e
de
fd
„Zdd	e
dedefd„Zddedefd„Zd„ Zedk    r ej         e¦   «         ¦  «         dS dS )uA  am é¡µé�¢è¡¨æ ¼åˆ†é¡µæ³¨å…¥ï¼ˆé›¶ä¾�èµ–ã€�å¹‚ç­‰ã€�çº¯å‰�ç«¯ï¼‰ã€‚

am (answer-me-with-html) æ²¡æœ‰åˆ†é¡µç»„ä»¶ã€‚LXXG ç›˜å�Žé€‰è‚¡ç½‘é¡µçš„ â‘£ è§‚å¯Ÿæ¡£(281 è¡Œ) +
â‘¤ äº”æ—¥è·Ÿè¸ª(974 è¡Œ) æŠŠé¡µé�¢æ‹‰åˆ°ä¸¤ä¸‡åƒ�ç´ é‡�çº§ã€‚æœ¬æ¨¡å�—åœ¨ am æ¸²æŸ“å®Œæˆ�å�Žå�šä¸€æ¬¡å¢žå¼ºï¼š

  Â· è¡Œæ•° >= min_rows çš„è¡¨æ ¼è‡ªåŠ¨åˆ‡æˆ�æ¯�é¡µ page_size è¡Œ
  Â· è¡¨æ ¼ä¸Šæ–¹æ�’å…¥æŽ§åˆ¶æ�¡ï¼šä¸Šä¸€é¡µ / é¡µç �è·³è½¬ / ä¸‹ä¸€é¡µ / æ¯�é¡µè¡Œæ•°(å�«"å…¨éƒ¨è¡Œ")
  Â· æ‰“å�°æ—¶è‡ªåŠ¨å±•å¼€å…¨éƒ¨è¡Œï¼ˆ@media print è¦†ç›–å†…è�” display:noneï¼‰
  Â· æ‰€æœ‰è¡Œä»�ç•™åœ¨é¡µé�¢ DOM é‡Œï¼Œå�ªéš�è—�é�žå½“å‰�é¡µ â†’ ä¸�è¿�å��"ç½‘é¡µç‰ˆå¿…é¡»å…¨åˆ—"

CSPï¼šam é¡µé�¢ç”¨ sha256 ç™½å��å�•é”�æ­» script-srcï¼Œæ³¨å…¥çš„è„šæœ¬å¿…é¡»æŠŠè‡ªèº« hash å†™è¿›
<meta http-equiv="Content-Security-Policy">ï¼Œå�¦åˆ™è¢«æµ�è§ˆå™¨ç›´æŽ¥æ‹¦æŽ‰ã€‚

ç”¨æ³•:
    python3 am_paginate.py <page.html> [--page-size 50] [--min-rows 26]
    from am_paginate import paginate_file
    info = paginate_file('/root/web_reports/lxxg_daily_20261028.html')
    # -> {'injected': True, 'removed_old': False, 'tables_eligible': 2, 'page_size': 50}
é    N)ÚPathz<script data-am-paginate="v1">u±  (function(){
  var MIN=__MIN_ROWS__, FIRST=__PAGE_SIZE__;
  var SIZES=[[50,'æ¯�é¡µ 50 è¡Œ'],[100,'æ¯�é¡µ 100 è¡Œ'],[200,'æ¯�é¡µ 200 è¡Œ'],[0,'å…¨éƒ¨è¡Œ']];
  var st=document.createElement('style');
  st.textContent='.am-pager{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:8px 2px;font-size:12px;color:var(--ink-2);font-family:var(--font-sans)}'
   +'.am-pager button,.am-pager select{font:inherit;font-size:12px;color:var(--ink);background:var(--paper);border:1px solid var(--line);border-radius:var(--radius);padding:3px 10px;cursor:pointer}'
   +'.am-pager button:disabled{opacity:.4;cursor:default}'
   +'.am-pager .am-pager-info{margin-left:auto;color:var(--ink-3)}'
   +'@media print{.am-pager{display:none}.am-paged-table tbody tr{display:table-row!important}}';
  document.head.appendChild(st);
  function mk(tag,cls,txt){var e=document.createElement(tag);if(cls)e.className=cls;if(txt!=null)e.textContent=txt;return e;}
  function initTable(t){
    var tb=t.tBodies[0];
    if(!tb) return 0;
    var rows=[]; for(var j=0;j<tb.rows.length;j++) rows.push(tb.rows[j]);
    if(rows.length<MIN) return 0;
    t.classList.add('am-paged-table');
    var size=FIRST, page=1, total=rows.length;
    var pages=function(){return size?Math.ceil(total/size):1;};
    var bar=mk('div','am-pager');
    var prev=mk('button',null,'â€¹ ä¸Šä¸€é¡µ'); prev.type='button';
    var next=mk('button',null,'ä¸‹ä¸€é¡µ â€º'); next.type='button';
    var pick=document.createElement('select');
    var siz=document.createElement('select');
    var info=mk('span','am-pager-info');
    for(var s=0;s<SIZES.length;s++){
      var op=document.createElement('option');
      op.value=String(SIZES[s][0]); op.textContent=SIZES[s][1];
      if(SIZES[s][0]===FIRST) op.selected=true;
      siz.appendChild(op);
    }
    function render(){
      var p=pages(); if(page>p)page=p; if(page<1)page=1;
      var from=size?(page-1)*size:0, to=size?Math.min(from+size,total):total;
      for(var k=0;k<total;k++) rows[k].style.display=(k>=from&&k<to)?'':'none';
      while(pick.firstChild) pick.removeChild(pick.firstChild);
      for(var q=1;q<=p;q++){
        var op2=document.createElement('option');
        op2.value=String(q); op2.textContent='ç¬¬ '+q+'/'+p+' é¡µ';
        if(q===page) op2.selected=true;
        pick.appendChild(op2);
      }
      pick.style.display=p>1?'':'none';
      info.textContent='å…± '+total+' è¡Œ Â· æ˜¾ç¤º '+(from+1)+'â€“'+to+(size?(' Â· æ¯�é¡µ '+size+' è¡Œ'):' Â· å…¨éƒ¨');
      prev.disabled=(page<=1); next.disabled=(page>=p);
    }
    prev.onclick=function(){page=page-1;render();};
    next.onclick=function(){page=page+1;render();};
    pick.onchange=function(){page=parseInt(pick.value,10)||1;render();};
    siz.onchange=function(){var v=parseInt(siz.value,10); size=v>0?v:0; page=1; render();};
    bar.appendChild(prev); bar.appendChild(pick); bar.appendChild(next); bar.appendChild(siz); bar.appendChild(info);
    var wrap=t.parentNode;
    wrap.parentNode.insertBefore(bar,wrap);
    render();
    return 1;
  }
  var tables=document.querySelectorAll('table'),used=0;
  for(var i=0;i<tables.length;i++) used+=initTable(tables[i]);
  document.documentElement.setAttribute('data-am-paginated',String(used));
})();
ÚtextÚreturnc                 óÈ   — t          j        |                      d¦  «        ¦  «                             ¦   «         }dt	          j        |¦  «                             d¦  «        z   S )Núutf-8zsha256-Úascii)ÚhashlibÚsha256ÚencodeÚdigestÚbase64Ú	b64encodeÚdecode)r   r   s     ú /root/web_reports/am_paginate.pyÚ_hashr   \   sM   € ÝŒ^˜DŸKšK¨Ñ0Ô0Ñ1Ô1×8Ò8Ñ:Ô:€FØ•vÔ'¨Ñ/Ô/×6Ò6°wÑ?Ô?Ñ?Ð?ó    Úhtmlc                 ót   — |D ]4}|                       d|› d�d¦  «                              d|› d�d¦  «        } Œ5| S )Nú 'ú'Ú )Úreplace)r   ÚhashesÚhs      r   Ú
_csp_stripr   a   sM   € Øð Að AˆØ�|Š|˜I ˜I˜I˜I rÑ*Ô*×2Ò2°8°q°8°8°8¸RÑ@Ô@ˆˆØ€Kr   é2   é   Ú	page_sizeÚmin_rowsc                 óÞ  ‡— ddd|dœ}t          j        t          j        t          ¦  «        dz   | t           j        ¦  «        }|rq|                     d¦  «        }| d|                     ¦   «         …         | |                     ¦   «         d…         z   } t          | t          |¦  «        g¦  «        } d|d<   t                               d	t          t          |¦  «        ¦  «        ¦  «                             d
t          t          |¦  «        ¦  «        ¦  «        }t          t          j        d| t           j        ¦  «        ¦  «        |d<   d| vrt!          d¦  «        ‚|                      dt          |z   dz   d¦  «        } t          |¦  «        Št          j        d¦  «        }|                     | ¦  «        r|                     ˆfd„| d¬¦  «        } nt!          d¦  «        ‚d|d<   ‰|d<   | |fS )u[   è¿”å›ž (æ–° html, info)ã€‚å¹‚ç­‰ï¼šé‡�å¤�è°ƒç”¨å�ªä¿�ç•™ä¸€ä»½æ³¨å…¥è„šæœ¬ä¸Žä¸€ä¸ª hashã€‚Fr   )ÚinjectedÚremoved_oldÚtables_eligibler   z(.*?)</script>é   NTr"   Ú__MIN_ROWS__Ú__PAGE_SIZE__z"<tbody>(?:(?!</tbody>).)*?</tbody>r#   z</body>zpage has no </body>z</script>
</body>zO(<meta http-equiv="Content-Security-Policy" content="[^"]*?script-src )([^;"]*)c                 óŒ   •— |                       d¦  «        |                       d¦  «                             ¦   «         z   d‰› d�z   S )Nr$   é   r   r   )ÚgroupÚrstrip)Úmr   s    €r   ú<lambda>zpaginate_html.<locals>.<lambda>ƒ   s9   ø€  A§G¢G¨A¡J¤J°·²¸±´×1BÒ1BÑ1DÔ1DÑ$DÀyÈAÀyÀyÀyÑ$P€ r   )Úcountz/no Content-Security-Policy meta with script-srcr!   Úscript_hash)ÚreÚsearchÚescapeÚMARKÚSr)   ÚstartÚendr   r   ÚSCRIPT_TMPLr   ÚstrÚintÚlenÚfindallÚ
ValueErrorÚcompileÚsub)	r   r   r   ÚinfoÚm_oldÚ
old_scriptÚscriptÚcsp_rer   s	           @r   Úpaginate_htmlrC   g   sÔ  ø€ à¨eÈÐXaÐbÐb€Dõ ŒI•b”i¥‘o”oÐ(9Ñ9¸4ÅÄÑFÔF€EØð #Ø—[’[ ‘^”^ˆ
Ø�N�U—[’[‘]”]�NÔ# d¨5¯9ª9©;¬;¨<¨<Ô&8Ñ8ˆÝ˜$¥ zÑ!2Ô!2Ð 3Ñ4Ô4ˆØ"ˆˆ]Ñå× Ò  µµS¸±]´]Ñ1CÔ1CÑDÔD×LÒLØ��S ™^œ^Ñ,Ô,ñ.ô .€Fõ "¥"¤*Ø-¨tµR´Tñ#;ô #;ñ <ô <€DÐ	Ñð ˜ÐÐÝÐ.Ñ/Ô/Ð/à�<Š<˜	¥4¨&¡=Ð3GÑ#GÈÑKÔK€Dõ 	ˆf‰Œ€AÝŒZÐjÑkÔk€FØ‡}‚}�TÑÔð LØ�zŠzÐPÐPÐPÐPÐRVÐ^_ˆzÑ`Ô`ˆˆåÐJÑKÔKÐKà€DˆÑØ€DˆÑØ�ˆ:Ðr   c                 ó´   — t          | ¦  «        }|                     d¬¦  «        }t          |||¬¦  «        \  }}||k    r|                     |d¬¦  «         |S )Nr   )Úencoding©r   r   )r   Ú	read_textrC   Ú
write_text)Úpathr   r   Úpr   Únewr>   s          r   Úpaginate_filerL   Œ   s\   € ÝˆT‰
Œ
€AØ�;Š; ˆ;Ñ(Ô(€DÝ˜d¨iÀ(ÐKÑKÔK�I€CˆØ
ˆd‚{€{Ø	�Š�S 7ˆÑ+Ô+Ð+Ø€Kr   c                  óê  — t          j        d¬¦  «        } |                      d¦  «         |                      dt          d¬¦  «         |                      dt          dd	¬
¦  «         |                      ¦   «         }t          |j        |j        |j        ¬¦  «        }t          d|d         › d|d         › d|d         › d|d         › �¦  «         t          d| 
                    d¦  «        › �¦  «         dS )Nu+   ç»™ am é¡µé�¢æ³¨å…¥è¡¨æ ¼åˆ†é¡µï¼ˆå¹‚ç­‰ï¼‰)ÚdescriptionÚpagez--page-sizer   )ÚtypeÚdefaultz
--min-rowsr   u$   è¡Œæ•°ä½ŽäºŽæ­¤å€¼çš„è¡¨æ ¼ä¸�åˆ†é¡µ)rP   rQ   ÚhelprF   z	injected=r!   z removed_old=r"   z tbody_blocks=r#   z page_size=r   zhash=r.   r   )ÚargparseÚArgumentParserÚadd_argumentr8   Ú
parse_argsrL   rO   r   r   ÚprintÚget)ÚapÚar>   s      r   Úmainr[   •   s  € Ý	Ô	 Ð-ZÐ	[Ñ	[Ô	[€BØ‡O‚O�FÑÔÐØ‡O‚O�M­°R€OÑ8Ô8Ð8Ø‡O‚O�L¥s°BÐ=c€OÑdÔdÐdØ
�Š‰Œ€AÝ˜œ¨1¬;ÀÄÐLÑLÔL€DÝ	ð R�d˜:Ô&ð Rð R°T¸-Ô5Hð Rð RØÐ0Ô1ðRð RØ>BÀ;Ô>OðRð Rñ Sô Sð Så	Ð
+�$—(’(˜=Ñ)Ô)Ð
+Ð
+Ñ,Ô,Ð,Øˆ1r   Ú__main__)r   r   )Ú__doc__rS   r   r	   r/   ÚsysÚpathlibr   r2   r6   r7   r   r   r8   rC   rL   r[   Ú__name__Úexit© r   r   ú<module>rc      s?  ððð ð& €€€Ø €€€Ø €€€Ø 	€	€	€	Ø 
€
€
€
Ø Ð Ð Ð Ð Ð à'€ð<€ð~@�ð @˜ð @ð @ð @ð @ð
�Sð  Sð ð ð ð ð"ð "˜ð "¨ð "¸Cð "ð "ð "ð "ðJð  3ð °sð ð ð ð ð
ð 
ð 
ð ˆzÒÐØ€C„HˆTˆT‰VŒVÑÔÐÐÐð Ðr   