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.cCsh|D]^}t|ƒdvr |j|Žqt|ƒdks4Jdƒ‚|\}}||jvrRtd|ƒ‚|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éézInvalid register_palette usagez 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)r4Z
foregroundZ
backgroundÚmonorrr r0Ys
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_keyscCsš|jrt |¡Stj d¡}| d¡s.J|ƒ‚| dd¡\}}}}t|ƒ}t|ƒ}| 	||¡i|_
d|_tj
d|_|jdvs„J‚|jdkrªtjsªtj d	¡t d¡t tj tjd
¡¡}t|ƒtjkrätj d¡t d¡t ¡j}tj tjd|¡|_t |jd
d¡t tj |j!¡t "|jd
tj#tj$B¡|_%d|_&d|d|_'|jdk�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úwindow resize ú rrÚHTTP_X_URWID_METHOD)Ú	multipartÚpollingrAú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Ú
startswithÚ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 ÚstartrsV





ÿþþÿÿÿ
zScreen.startcCsL|js
dSz| ¡Wnty(Yn0t tjtj¡| ¡d|_dS)z0
        Restore settings and clean up.
        NF)r'Ú_close_connectionr1r^r_ÚSIG_DFLr`r(rrr Ústop­szScreen.stopcGsdSr+r©r)r:rrr Ú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)rmrp)r)Úfnrrr Úrun_wrapperÀsþzScreen.run_wrappercCsZ|jdkr6|j d¡|j ¡\}}| d¡| ¡|jdkrVtj d¡tj 	¡dS)Nú
polling childrÚZr@z

Z
--ZZ--
)
rOÚ
server_socketÚ
settimeoutÚacceptÚsendallÚcloserDrRrSÚflush)r)ZsockÚaddrrrr rnÌs


zScreen._close_connectioncGsF|js
dSz$t |jd¡t |jd¡Wnty@Yn0dS)NrCú.update)r\rMÚremover1rqrrr 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 rJá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|_| ¡|ks®J‚|jdurÄ|j\}	}
nd}	}
i}d}| ¡D�]\}
|d7}t|
ƒ}
g}t|
ƒ}||
k�r||	f}| |g¡|g||<|j |d¡}|du�rf||v�rP|}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|||ƒ¡�qn|d |¡dƒqÜ||_||_|jdk�r„tj d |¡¡tj ¡tj ¡|  ¡n:|jdk�rš| ¡n$|dƒtj d |¡¡tj ¡t t!¡dS)
z#Send a screen update to the client.rArurz
rNéÿÿÿÿéz<%d
)rrNÚ
z
--ZZ
)"rLrKrfrOÚappendr^rirwryÚsocketÚtimeoutrDrTrzr„ÚcursorZcontentÚlistÚtupleÚgetÚ	translateÚ_trans_tabler&rZ
calc_widthr/Ú	code_spanrWrRrSr|r{Ú_fork_childrj)r)ÚsizeÚrrƒr„ZsendqÚsendÚsr}ZcxÚcyZ
new_screenrkÚrowr2ÚsigZold_line_numbersZold_lineÚcolÚaÚcsÚrunÚfgÚbgr7Z	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.errrCrur~r†N)Ú	daemonizer\rMrarbrcrdrOr‰ÚAF_UNIXÚSOCK_STREAMZbindZlistenrxÚPOLL_CONNECTrw)r)r–rrr r’Os
ÿ

zScreen._fork_childcCsx|jdvsJ‚|jdkrTz|j ¡\}}| ¡WqjtjyPt d¡Yqj0ntj 	d¡tj 
¡t t
¡dS)N)r@rururz


--ZZ
)rOrwryr{r‰rŠrDrTrRrSr|r^rirj)r)r™Úframer–r}rrr rh^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-NrCr‡r…r=r>rTz
window resize)ÚselectrdÚerrorr:rMrFÚMAX_READr{rar\rbrcrHrerGrIrJrˆ)r)Zraw_keysr2ZresizedZireadyZoreadyZereadyÚeÚkeydataÚkeysÚkZign1Zign2rrkrrr Ú	get_inputrsJÿ
ÿ


zScreen.get_input)N)T)F)Ú__name__Ú
__module__Ú__qualname__r*ÚpropertyÚstartedr5r0r9r;rmrprrrtrnr`rJr r¡r’rhr§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)rMrNrrrr Ú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�rs~Uðþþüüðe
Jÿ