grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026a BjŒjèzã@s:ddlmZmZddlZddlZddlZddlZddlZddlZddl Z ddl m Z dZ dZ dZdZdZd Zd Zd d d ddddddddddddddœZdd dd„ed d!ƒDƒ¡Zd"Zd#d$ed%d&e d'gZGd(d)„d)ƒZd>d+d,„Zd-d.„Zd/d0„Zd1d2„ZGd3d4„d4ƒZeƒad?d8d9„Z Gd:d;„d;ƒZ!d k ){ text.replaceChild(ln, text.childNodes[k]); }else{ text.appendChild(ln); } k = k+1; ln = document.createElement('span'); }else if( f.charAt(0) == "<" ){ line_number = parseInt(f.substr(1)); if( line_number == k ){ k = k +1; continue; } var clone = last_screen[line_number].cloneNode(true); if( text.childNodes.length > k ){ text.replaceChild(clone, text.childNodes[k]); }else{ text.appendChild(clone); } k = k+1; }else{ var span=make_span(f.substr(2),f.charAt(0),f.charAt(1)); ln.appendChild( span ); } } for( var i=k; i < text.childNodes.length; i++ ){ text.removeChild(last_screen[i]); } if(update_method=="polling"){ poll_again(); } } function poll_again(){ if(conn.status == 200){ setTimeout("do_poll();",poll_again_delay); } } function load_web_display(){ if( document.documentURI ){ document_location = document.documentURI; }else{ document_location = document.location; } document.onkeypress = body_keypress; document.onkeydown = body_keydown; document.onresize = body_resize; body_resize(); send_queue_out = send_queue_in; // don't queue the first resize set_status("Connecting"); setup_connection(); setTimeout("check_fontsize();",check_font_delay); } function set_status( status ){ var s = document.getElementById('status'); var t = document.createTextNode(status); s.replaceChild(t, s.firstChild); } function make_span(s, fg, bg){ d = document.createElement('span'); d.style.backgroundColor = colours[bg]; d.style.color = colours[fg]; d.appendChild(document.createTextNode(s)); return d; } function body_keydown(e){ if (conn == null){ return; } if (!e) var e = window.event; if (e.keyCode) code = e.keyCode; else if (e.which) code = e.which; var mod = ""; var key; if( e.ctrlKey ){ mod = "ctrl " + mod; } if( e.altKey || e.metaKey ){ mod = "meta " + mod; } if( e.shiftKey && e.charCode == 0 ){ mod = "shift " + mod; } key = keycodes[code]; if( key != undefined ){ lastkeydown = key; send_key( mod + key ); stop_key_event(e); return false; } } function body_keypress(e){ if (conn == null){ return; } if (!e) var e = window.event; if (e.keyCode) code = e.keyCode; else if (e.which) code = e.which; var mod = ""; var key; if( e.ctrlKey ){ mod = "ctrl " + mod; } if( e.altKey || e.metaKey ){ mod = "meta " + mod; } if( e.shiftKey && e.charCode == 0 ){ mod = "shift " + mod; } if( e.charCode != null && e.charCode != 0 ){ key = String.fromCharCode(e.charCode); }else if( e.charCode == null ){ key = String.fromCharCode(code); }else{ key = keycodes[code]; if( key == undefined || lastkeydown == key ){ lastkeydown = null; stop_key_event(e); return false; } } send_key( mod + key ); stop_key_event(e); return false; } function stop_key_event(e){ e.cancelBubble = true; if( e.stopPropagation ){ e.stopPropagation(); } if( e.preventDefault ){ e.preventDefault(); } } function send_key( key ){ if( (send_queue_in+1)%send_queue_max == send_queue_out ){ // buffer overrun return; } send_queue[send_queue_in] = key; send_queue_in = (send_queue_in+1)%send_queue_max; if( urwid_id != null ){ if (send_conn == undefined || send_conn.ready_state != 4 ){ send_more(); return; } do_send(); } } function do_send() { if( ! urwid_id ){ return; } if( ! update_method ){ return; } // connection closed if( send_queue_in == send_queue_out ){ return; } if( sending ){ //var queue_delta = send_queue_in - send_queue_out; //if( queue_delta < 0 ){ queue_delta += send_queue_max; } //set_status("Sending (queued "+queue_delta+")"); return; } try{ sending = true; //set_status("starting send"); if( send_conn == null ){ if (window.XMLHttpRequest) { send_conn = new XMLHttpRequest(); } else if (window.ActiveXObject) { send_conn = new ActiveXObject("Microsoft.XMLHTTP"); } }else if( send_conn.status != 200) { alert("Error from server: "+send_conn.statusText); return; }else if(send_conn.readyState != 4 ){ alert("not ready on send connection"); return; } } catch(e) { alert(e); sending = false; return; } send_conn.open("POST", document_location, true); send_conn.onreadystatechange = send_handle_recv; send_conn.setRequestHeader("Content-type","text/plain"); send_conn.setRequestHeader("X-Urwid-ID",urwid_id); var tmp_send_queue_in = send_queue_in; var out = null; if( send_queue_out > tmp_send_queue_in ){ out = send_queue.slice(send_queue_out).join("\n") if( tmp_send_queue_in > 0 ){ out += "\n" + send_queue.slice(0,tmp_send_queue_in).join("\n"); } }else{ out = send_queue.slice(send_queue_out, tmp_send_queue_in).join("\n"); } send_queue_out = tmp_send_queue_in; //set_status("Sending"); send_conn.send( out +"\n" ); } function send_handle_recv() { if( send_conn.readyState != 4) { return; } if( send_conn.status == 404) { set_status("Connection Closed"); update_method = null; return; } if( send_conn.status != 200) { alert("Error from server: "+send_conn.statusText); return; } sending = false; if( send_queue_out != send_queue_in ){ send_more(); } } function send_more(){ setTimeout("do_send();",send_more_delay); } function check_fontsize(){ body_resize() setTimeout("check_fontsize();",check_font_delay); } function body_resize(){ var t = document.getElementById('testchar'); var t2 = document.getElementById('testchar2'); var text = document.getElementById('text'); var window_width; var window_height; if (window.innerHeight) { window_width = window.innerWidth; window_height = window.innerHeight; }else{ window_width = document.documentElement.clientWidth; window_height = document.documentElement.clientHeight; //var z = "CI:"; for(var i in bod){z = z + " " + i;} alert(z); } char_width = t.offsetLeft / 44; var avail_width = window_width-18; var avail_width_mod = avail_width % char_width; var x_size = (avail_width - avail_width_mod)/char_width; char_height = t2.offsetTop - t.offsetTop; var avail_height = window_height-text.offsetTop-10; var avail_height_mod = avail_height % char_height; var y_size = (avail_height - avail_height_mod)/char_height; text.style.width = x_size*char_width+"px"; text.style.height = y_size*char_height+"px"; if( screen_x != x_size || screen_y != y_size ){ send_key("window resize "+x_size+" "+y_size); } screen_x = x_size; screen_y = y_size; } é<ééÈédii@Ú0Ú1Ú2Ú3Ú4Ú5Ú6Ú7Ú8Ú9ÚAÚBÚCÚDÚEÚF)Úblackzdark redz dark greenZbrownz dark bluez dark magentaz dark cyanú light grayz dark grayz light redz light greenZyellowz light bluez light magentaz light cyanZwhitez ????????????????????????????????ÚcCsg|] }t|ƒ‘qS©)Úchr)Ú.0Úxrrú7/usr/lib64/python3.9/site-packages/urwid/web_display.pyÚ ór!é éah body { margin: 8px 8px 8px 8px; border: 0; color: black; background-color: silver; font-family: fixed; overflow: hidden; } form { margin: 0 0 8px 0; } #text { position: relative; background-color: silver; width: 100%; height: 100%; margin: 3px 0 0 0; border: 1px solid #999; } #page { position: relative; width: 100%;height: 100%;} z‘ Urwid Web Display - z!

The quick brown fox jumps over the lazy dog.X
Y
Urwid Web Display - z[ - Status: Set up



c@s®eZdZdd„Zedd„ƒZdd„Zd*dd	„Zd+dd„Zd
d„Z	dd„Z
dd„Zdd„Zdd„Z
dd„Zdd„Zdd„Zdd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zd,d(d)„ZdS)-ÚScreencCsi|_d|_d|_dS)NTF)ÚpaletteZ	has_colorÚ_started©Úselfrrr Ú__init__?szScreen.__init__cCs|jS©N)r'r(rrr ÚDr"zScreen.cCsT|D]J}t|ƒdvr |j|Žq|\}}||jvr>td|ƒ‚|j||j|<qdS)zÛRegister a list of palette entries.

        l -- list of (name, foreground, background) or
             (name, same_as_other_name) palette entries.

        calls self.register_palette_entry for each item in l
        )réz palette entry '%s' doesn't existN)ÚlenÚregister_palette_entryr&Ú	Exception)r)ÚlÚitemÚnameZ	like_namerrr Úregister_paletteFs	

zScreen.register_paletteNcCs,|dkrd}|dkrd}|||f|j|<dS)aRegister a single palette entry.

        name -- new entry/attribute name
        foreground -- foreground colour
        background -- background colour
        mono -- monochrome terminal attribute

        See curses_display.register_palette_entry for more info.
        ÚdefaultrrN)r&)r)r3Z
foregroundZ
backgroundÚmonorrr r/Ys
zScreen.register_palette_entryTcCsdS)zNot yet implementedNr)r)Úenablerrr Úset_mouse_trackingjszScreen.set_mouse_trackingcOsdS)zDo nothing.Nr)r)ÚargsZvargsrrr Útty_signal_keysnszScreen.tty_signal_keyscCsz|jrt |¡Stj d¡}| dd¡\}}}}t|ƒ}t|ƒ}| ||¡i|_	d|_
tjd|_
|j
dkrŠtjsŠtj d¡t d¡t tj tjd¡¡}t|ƒtjkrÄtj d	¡t d¡t ¡j}tj tjd
|¡|_t |jdd¡t tj|j ¡t !|jdtj"tj#B¡|_$d
|_%d|d|_&|j
dk�rPd|d|_&t tj'|j(¡t )t*¡d|_t |¡S)zÿ
        This function reads the initial screen size, generates a
        unique id and handles cleanup when fn exits.

        web_display.set_preferences(..) must be called before calling
        this function for the preferences to take effect
        é2ú rrÚHTTP_X_URWID_METHODÚpollingúStatus: 403 Forbidden

z	urwid*.inzStatus: 503 Sever Busy

Zurwid_ú.ini€rzAContent-type: multipart/x-mixed-replace;boundary=ZZ
X-Urwid-ID: z


--ZZ
z&Content-type: text/plain
X-Urwid-ID: z


T)+r'rZStoppingContextÚsysÚstdinÚreadÚsplitÚintÚ_set_screen_sizeÚlast_screenÚlast_screen_widthÚosÚenvironÚ
update_methodÚ_prefsÚ
allow_pollingÚstdoutÚwriteÚexitÚglobÚpathÚjoinÚpipe_dirr.Úmax_clientsÚuuidZuuid4ÚhexÚ	pipe_nameÚmkfifoÚsignalÚSIGTERMÚ
_cleanup_pipeÚopenÚ
O_NONBLOCKÚO_RDONLYÚinput_fdÚ
input_tailÚcontent_headÚSIGALRMÚ
_handle_alarmÚalarmÚALARM_DELAY)r)Zclient_initZignore1Zignore2rÚyZclientsÚurwid_idrrr ÚstartrsR





ÿþþÿÿÿ
zScreen.startcCsL|js
dSz| ¡Wnty(Yn0t tjtj¡| ¡d|_dS)z0
        Restore settings and clean up.
        NF)r'Ú_close_connectionr0rZr[ÚSIG_DFLr\r(rrr Ústop­szScreen.stopcGsdSr+r©r)r9rrr Úset_input_timeouts½szScreen.set_input_timeoutscCs(z| ¡|ƒW| ¡S| ¡0dS)zb
        Run the application main loop, calling start() first
        and stop() on exit.
        N)rirl)r)Úfnrrr Úrun_wrapperÀsþzScreen.run_wrappercCsZ|jdkr6|j d¡|j ¡\}}| d¡| ¡|jdkrVtj d¡tj 	¡dS)Nú
polling childrÚZZ	multipartz

Z
--ZZ--
)
rKÚ
server_socketÚ
settimeoutÚacceptÚsendallÚcloserArNrOÚflush)r)ZsockÚaddrrrr rjÌs


zScreen._close_connectioncGsF|js
dSz$t |jd¡t |jd¡Wnty@Yn0dS)Nr@ú.update)rXrIÚremover0rmrrr r\Øs
zScreen._cleanup_pipecCs&|tkrt}|tkrt}||f|_dS)z&Set the screen size (within max size).N)ÚMAX_COLSÚMAX_ROWSÚscreen_size)r)ÚcolsÚrowsrrr rFás
zScreen._set_screen_sizec
Cs¼|\}}||jkri|_|jg}|jdkr2|j}nl|jdkr€t d¡z|j ¡\}}Wnt	j
yvt d¡Yn0|j
}nt d¡|j}|dƒd|_|jdur´|j\}	}
nd}	}
i}d}| ¡D�]\}
|d7}t|
ƒ}
g}t|
ƒ}||
k�r||	f}| |g¡|g||<|j |d¡}|du�rV||v�r@|}n|d}|d	|ƒqÌd}|
D]¸\}}}| t¡}|du�rˆd
\}}}n|j|\}}}||
k�r||	k�rt |dt|ƒ¡}|||	k�ræ| t||||	|ƒ¡n| t|||ƒ¡||7}n| t|||ƒ¡�q^|d |¡dƒqÌ||_||_|jdk�rttj d |¡¡tj ¡tj ¡| ¡n:|jdk�rŠ| ¡n$|dƒtj d |¡¡tj ¡t t ¡dS)
z#Send a screen update to the client.r>rqrz
rNéÿÿÿÿéz<%d
)rrNÚ
z
--ZZ
)!rHrGrbrKÚappendrZrersruÚsocketÚtimeoutrArPrvÚcursorZcontentÚlistÚtupleÚgetÚ	translateÚ_trans_tabler&rZ
calc_widthr.Ú	code_spanrSrNrOrxrwÚ_fork_childrf)r)ÚsizeÚrrr€ZsendqÚsendÚsryZcxÚcyZ
new_screenrgÚrowr1ÚsigZold_line_numbersZold_lineÚcolÚaÚcsÚrunÚfgÚbgr6Z	run_widthrrr Údraw_screenês†









ÿÿ





zScreen.draw_screencCsdS)z�
        Force the screen to be completely repainted on the next
        call to draw_screen().

        (does nothing for web_display)
        Nrr(rrr ÚclearEszScreen.clearcCsnt|jdƒt |jdtjtjB¡|_d|_t tj	tj
¡}| |jd¡| d¡| 
t¡||_dS)zw
        Fork a child to run CGI disconnected for polling update method.
        Force parent process to exit.
        z.errr@rqrzr‚N)Ú	daemonizerXrIr]r^r_r`rKr…ÚAF_UNIXÚSOCK_STREAMZbindZlistenrtÚPOLL_CONNECTrs)r)r’rrr rŽOs
ÿ

zScreen._fork_childcCsj|jdkrFz|j ¡\}}| ¡Wq\tjyBt d¡Yq\0ntj 	d¡tj 
¡t t
¡dS)Nrqrz


--ZZ
)rKrsrurwr…r†rArPrNrOrxrZrerf)r)r•Úframer’ryrrr rd^s

zScreen._handle_alarmcCs|jS)zReturn the screen size.)r~r(rrr Ú
get_cols_rowsnszScreen.get_cols_rowsFc
Csxg}d}zt |jgggd¡\}}}Wn^tjy„}zD|jddkrn|r^ggfWYd}~SgWYd}~S‚WYd}~n
d}~00|sš|r–ggfSgSt |jt¡}t |j¡t |j	dtj
tjB¡|_| d¡}	|j
|	d|	d<|	d|_
|	dd…D]R}
|
 d	¡�rH|
 d
d¡\}}}
}t|
ƒ}
t|ƒ}| |
|¡d}n
| |
¡�q|�rf| d
¡|�rt|gfS|S)zReturn pending input as a list.Fgà?rr-Nr@rƒr�zwindow resize r<rTz
window resize)Úselectr`Úerrorr9rIrCÚMAX_READrwr]rXr^r_rDraÚ
startswithrErFr„)r)Zraw_keysr1ZresizedZireadyZoreadyZereadyÚeÚkeydataÚkeysÚkZign1Zign2rrgrrr Ú	get_inputrsJÿ
ÿ


zScreen.get_input)N)T)F)Ú__name__Ú
__module__Ú__qualname__r*ÚpropertyÚstartedr4r/r8r:rirlrnrprjr\rFrœr�rŽrdr£r¬rrrr r%>s(ÿ

;		[
r%r�c	Csžt|}t|}|dkrŠt |dt|ƒ|¡\}}t ||t|ƒ¡}|||d|…d|||||…d||||d…dS|||dSdS)Nrrƒ)Ú
_code_coloursrZ
calc_text_posr.Zmove_next_char)	r’ršr›r‡Zcode_fgZcode_bgZc_offZ_ignZc2_offrrr r�¡s.ÿÿ
ÿÿþþ
þþr�cCs(| dd¡}| dd¡}| dd¡}|S)z;Escape text so that it will be displayed safely within HTMLú&z&úz>)Úreplace)Útextrrr Úhtml_escape°sr¸cCs
dtjvS)z3
    Return True if this is a CGI web request.
    ÚREQUEST_METHOD)rIrJrrrr Úis_web_request¸srºcCs¾tƒs
dStjddkr8tj dttjƒ 	t
¡¡dStjddkrJdSdtjvrXdStjd}t|ƒdkr~tj d	¡dS|D]}|d
vr‚tj d¡dSq‚tj dd
¡dk�rÚurwidrzzContent-type: text/plain

zStatus: 404 Not Found

r@Úascii)rºrIrJrArNrOr¸rLÚapp_namerSÚ
_html_pager.rŠr…rŸr ZconnectrRrTZrecvÚBUF_SZr¥r]ÚO_WRONLYÚOSErrorrBrCr¦Úencoderw)rhÚcr’ÚdataÚfdr©rrr Úhandle_short_request¾s^ÿ


ÿ
ÿÿ
rÈc@seZdZdZdZdZdZdS)Ú_PreferenceszUnnamed Applicationú/tmpTr»N)r­r®r¯r¿rTrMrUrrrr rÉsrÉrÊTr»cCs|t_|t_|t_|t_dS)aÝ
    Set web_display preferences.

    app_name -- application name to appear in html interface
    pipe_dir -- directory for input pipes, daemon update sockets
                and daemon error logs
    allow_polling -- allow creation of daemon processes for
                     browsers without multipart support
    max_clients -- maximum concurrent client connections. This
               pool is shared by all urwid applications
               using the same pipe_dir
    N)rLr¿rTrMrU)r¿rTrMrUrrr Úset_preferencessrËc@seZdZdd„Zdd„ZdS)ÚErrorLogcCs
||_dSr+)Úerrfile)r)rÍrrr r*&szErrorLog.__init__cCst|jdƒ |¡dS)Nr—)r]rÍrO)r)Úerrrrr rO(szErrorLog.writeN)r­r®r¯r*rOrrrr rÌ%srÌc	Cs°t ¡}|rt d¡t ¡t tjtj¡t d¡t ¡}|rNt d¡t d¡t	ddƒD]&}zt 
|¡Wqbty†Yqb0qbtddƒt
_tddƒt
_t|ƒt
_dS)z-
    Detach process and become a daemon.
    rú/r»z	/dev/nullr�ÚwN)rIÚforkÚ_exitÚsetsidrZÚSIGHUPÚSIG_IGNÚumaskÚchdirÚrangerwrÃr]rArBrNrÌÚstderr)rÍÚpidrÇrrr rž,s$



rž)r�)rÊTr»)#Z
__future__rrrIrArZr¤r…rVrQr½rZ_js_coderfr¡r|r}r¦rÁr²rSrØrŒZ
_css_stylerÀr%r�r¸rºrÈrÉrLrËrÌržrrrr Ús~Uðþþüüðe
Jÿ