
    fq                     J   d dl mZmZmZ d dlZ ej
                  d      Zd dlZd dlZd dl	Z	d dl
Z
d dlmZ d dlmZ d dlmZ d dlmZmZmZmZ d dlmZmZmZ d d	lmZmZmZmZmZmZm Z m!Z!m"Z" d d
l#m$Z$ d dl%m&Z&m'Z'm(Z(m)Z)m*Z* d dl+m,Z,  e,       Z- G d d      Z. G d d      Z/y)    )divisionprint_functionunicode_literalsNLayoutLoaderSVG)minidom)
Exceptions)	KeyCommon)StickyBehavior	ImageSlotKeyPathKeyGeometry)
LayoutRoot	LayoutBoxLayoutPanel)		modifiersRecttoprettyxmlVersion	open_utf8permute_maskLABEL_MODIFIERSunicode_strXDGDirs)WordListPanel)RectKeyWordlistKeyBarKeyWordKeyInputlineKey)Configc                      e Zd ZdZ edd      Z edd      Z edd      Z edd      Z edd      Z	 edd      Z
 edd      ZeZ ee      Zd Zd Zd&d	Zd&d
Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$d Z%d Z&d Z'd Z(e)d         Z*e)d!        Z+e)d"        Z,e)d#        Z-e)d$        Z.e)d%        Z/y)'r   z2
    Keyboard layout loaded from an SVG file.
       r         c                     d | _         i | _        d | _        d| _        d | _        d| _        t        j                  dt        j                        | _	        y )N z([^\(]+) (?: \( ([^\)]*) \) )?)
_vk
_svg_cache_format_layout_filename_color_scheme_root_layout_dirrecompileVERBOSE_layout_regexselfs    9/usr/lib/python3/dist-packages/Onboard/LayoutLoaderSVG.py__init__zLayoutLoaderSVG.__init__[   sJ     "! "ZZ(I(*

4    c                    | j                  |      \  | _        | _        t        j	                  dj                  | j                                      | j                  |||t        j                  j                  |            }|rG|j                         D ])  }|j                  d|_        |j                  #d|_        + t        |      }|S )z Load layout root file. z-current system keyboard layout(variant): '{}'N)_get_system_keyboard_layout_system_layout_system_variant_loggerinfoformat_get_system_layout_string_loadospathdirname
iter_items	templateskeysym_rulesr   )r2   vklayout_filenamecolor_schemelayoutitems         r3   loadzLayoutLoaderSVG.loade   s     '+&F&Fr&J 	2T1DfT;;=>	@ BGGOOO<>))+ -~~-%)DN((0(,D%	-  'Fr5   Nc                 ^    || _         || _        || _        || _        | j	                  ||      S )z1 Load or include layout file at any depth level. )r'   r*   r+   r,   _load_layout)r2   rE   rF   rG   root_layout_dirparent_items         r3   r>   zLayoutLoaderSVG._load|   s4     /) /  +>>r5   c           	      2   i | _         d }	 t        |      }t        j                  |      j                  5 }| j                  }|j                  d      r,t        j                  |j                  d   j                        }|| _        t#               }|j%                  d       |r|j&                  |_        || j(                  k\  r| j+                  ||       |}nPt        j	                  t!        d|| j,                               | j/                  |      }	|	r|j1                  |	       |}d d d        |j3                          i | _         |S # t        $ r8}t        j	                  dj                  |t        |                   Y d }~y d }~ww xY w# 1 sw Y   fxY w)NzFailed to open '{}': {}r<   __root__zTLoading legacy layout, format '{}'. Please consider upgrading to current format '{}')r(   r   FileNotFoundErrorr:   warningr<   r   r   parsedocumentElementLAYOUT_FORMAT_LEGACYhasAttributer   from_string
attributesvaluer)   r   set_idfilenameLAYOUT_FORMAT_LAYOUT_TREE_parse_dom_nodeLAYOUT_FORMAT_parse_legacy_layout	set_itemsclose)
r2   rF   rN   rH   fexdomr<   rootitemss
             r3   rL   zLayoutLoaderSVG._load_layout   sh   	/*A ]]1-- 	" ..F)++CNN8,D,J,JKv!DL=DKK
#  + 4 4777$$S$/ )O"D$6$6!8 9 11#6NN5)!F5	"8 	
	K ! 	OO5#VO[_EG		" 	"s#   E	 C3F		F
.FF
Fc                    t               }|j                  D ]  }|j                  t        j                  j
                  k(  s,d}|j                  d      sd}nn|j                  d   j                  }||vrQ|j                  d      r>|j                  d   j                  }| j                  |      }|r|j                  |       nd}|s|j                  }|dk(  r| j                  ||       |dk(  r| j                  ||       |dk(  r| j                  ||       |dk(  r7| j                  ||      }	|j!                  |	       | j#                  ||	       D|dk(  r| j%                  |      }	n1|d	k(  r| j'                  |      }	n|d
k(  r| j)                  ||      }	nd}	|	s|j+                  |	       | j#                  ||	        y)z8 Recursively traverse the dom nodes of the layout tree. FidTrH   includekey_templatekeysym_ruleboxpanelkeyN)set
childNodesnodeTyper   NodeELEMENT_NODErV   rX   rY   _has_matching_layoutaddtagName_parse_include_parse_key_template_parse_keysym_rule_parse_sublayoutappend_sublayoutr]   
_parse_box_parse_panel
_parse_keyappend_item)
r2   dom_noderN   
loaded_idschildcan_loadrh   rH   tagrI   s
             r3   r]   zLayoutLoaderSVG._parse_dom_node   s   U
(( 5	>E~~!:!:: !))$/#H))$/55B+ --h7%*%5%5h%?%E%EF'+'@'@'HH  ( *r 2'+H --C i'++E;?.00D-//{C#44UKH#44T:,,UD9 %<#'??5#9D G^#'#4#4U#;D E\#'??5+#FD#'D'33D9 00=k5	>r5   c                    |j                  d      r|j                  d   j                  }t        j	                  |d      }t
        j                  dj                  |             t               j                  | j                  || j                  | j                  |      }|rg|j                  |j                         |j                  |j                          |j#                  |j$                         d |_        d |_        d |_        y y y )Nfilezlayout includezIncluding layout '{}')rV   rX   rY   configfind_layout_filenamer:   r;   r<   r   r>   r'   r+   r,   append_itemsrf   update_keysym_rulesrD   update_templatesrC   )r2   nodeparentr[   filepath	incl_roots         r3   rw   zLayoutLoaderSVG._parse_include   s    V$v.44H228=MNHLL077AB')//08040B0B040E0E06	8I
 ##IOO4**9+A+AB''	(;(;<"&	)-	&&*	#  %r5   c                 \   t        t        |j                  j                                     }|j	                  d      }|sTt        j                  dj                  t        t        t        |j                                     | j                              |j                  |t        f|i       y)z
        Templates are partially define layout items. Later non-template
        items inherit attributes of templates with matching id.
        rh   z;'id' attribute required for template '{} {}' in layout '{}'N)dictlistrX   rf   getr   LayoutFileErrorr<   r   strvaluesr*   r   r   )r2   r   r   rX   rh   s        r3   rx   z#LayoutLoaderSVG._parse_key_template   s    
 $t44678
^^D!,,!D!2!2!456--/0 0 	"g <=r5   c                     t        t        |j                  j                                     }|j	                  d      }|r:|d= |j                  d      rt        |d      }nd}|r|j                  ||i       yyy)z`
        Keysym rules link attributes like "label", "image"
        to certain keysyms.
        keysym0x   r   N)r   r   rX   rf   r   
startswithintr   )r2   r   r   rX   r   s        r3   ry   z"LayoutLoaderSVG._parse_keysym_rule  sy    
 $t44678
)8$  &VR **FZ+@A  r5   c                     d|v r|d   }	 t               |   } |       }|j                  d      }|||_        |j                  d      }|||_        |j                  d      }|||_        |j                  d      }|||_        |j                  d      }|
|dk(  |_        |j                  d      }|
|dk(  |_        |j                  d	      }|t        |      |_
        |j                  d
      }|
|dk(  |_        |j                  d      }|
|dk(  |_        |j                  d      }|r|j                         dk(  rd|_        |j                  d      }|t        |      |_        |S # t        $ r Y dw xY w)z- Parses attributes common to all LayoutItems classrh   grouplayerr[   visibletrue	sensitiveborderexpandunlatch_layer	scannablefalseFscan_priority)globalsKeyErrorr   rh   r   layer_idr[   r   r   floatr   r   r   lowerr   r   r   )r2   rX   
item_class
class_namerI   rY   s         r3   
_init_itemzLayoutLoaderSVG._init_item!  s    j #G,J$Yz2

 |t$}DGw'}DJw'}!DMz*}!DMy)} F?DL{+}"f_DNx(},DKx(}6/DK/}!&&D{+U[[]g-"DN/}!$UDe  s   E0 0	E=<E=c                     t        |j                  j                               }| j                  |t              }||_        |S N)r   rX   rf   r   r   sublayout_parent)r2   r   r   rX   rI   s        r3   rz   z LayoutLoaderSVG._parse_sublayout]  s6    $////12
z;7 &r5   c                    t        |j                  j                               }| j                  |t              }|j                  d      r/|j                  d   j                  j                         dk(  |_        |j                  d      r't        |j                  d   j                        |_
        |j                  d      r!|j                  d   j                  dk(  |_        |S )Norientation
horizontalspacingcompactr   )r   rX   rf   r   r   rV   rY   r   r   r   r   r   r2   r   rX   rI   s       r3   r|   zLayoutLoaderSVG._parse_boxc  s    $////12
z95]+.44::<L OY' !;!A!ABDLY'??95;;vEDLr5   c                     t        |j                  j                               }| j                  |t              }|j                  d      r!|j                  d   j                  dk(  |_        |S )Nr   r   )r   rX   rf   r   r   rV   rY   r   r   s       r3   r}   zLayoutLoaderSVG._parse_panelo  sW    $////12
z;7Y'??95;;vEDLr5   c                    d }|j                   d   j                  }|dk(  rt        }nt        }i }|j	                  d      rVt        j
                  |j                   d   j                        \  }}|j                  | j                  |t        |g             |j                  t        |j                   j                                      | j                  ||      }||_        | j                  ||       |j                         }	|	s?|j                  d      dk(  s)t        j!                  t#        d|j$                               |S | j'                  |	      }
|
r|j(                  |j$                  k7  r|
j                  |j(                        }n|
j                  |j$                        }|r\|j+                         \  }}|j-                  |j/                                |j1                  |j/                                ||_        |}|S t        j5                  dj7                  |j$                  |j(                               |S )Nrh   	inputliner   wsbuttonz+Ignoring key '{}'. No svg filename defined.z0Ignoring key '{}'. No svg object found for '{}'.)rX   rY   r   r   rV   parse_idupdatefind_templater   rf   r   r   	_init_keyget_filenamer   r:   rR   r)   rh   _get_svg_keyssvg_idextract_key_paramsset_initial_border_rectcopyset_border_rectgeometryr;   r<   )r2   r   r   resultrh   r   rX   theme_idrn   r[   	svg_nodessvg_noderr   s                 r3   r~   zLayoutLoaderSVG._parse_keyv  s   __T"((%J J 
T""++DOOD,A,G,GHLHbd002$GH 	$t44678 ooj*5
 	sJ' ##%>>'*j8 )D(+!0 10 ) **84I::'(}}SZZ8H  )}}SVV4H"*"="="?KAx//9''1#+CL F 	 LL "B"(&"<> r5   c                    |d   }|j                  d      }|j                  d      }|j                  |||       d|j                         v r2t        j	                  dj                  |j                                      |j                  d      }|r	 t        |   |_        |j                  d      }|r	 t        j                  |   |_        d
|v r!|d
   |_        t        j                  |_        nId|v rG|d   }t        j"                  |_        |d   dk(  rt%        |d      |_        nt%        |d      |_        nd|v r |d   |_        t        j&                  |_        nd|v r |d   |_        t        j(                  |_        nd|v r |d   |_        t        j*                  |_        nd|v r)t%        |d         |_        t        j,                  |_        ned|v r*|j.                  d d  |_        t        j0                  |_        n7|j                  rd |_        t        j2                  |_        nd |_        d |_        d|v r|d   }	nd}	d|v rE|j6                  si |_        |d   j9                  d      d   |j6                  t:        j<                  <   d|v r3|j6                  si |_        |d   |j6                  t:        j>                  <   | jA                  ||      }
tB        jD                  jF                  }|j                  |j.                        }|r|\  }}|rd|d d  i}
|r|d d  }	|
|_$        |	|_%        d|v r
|d   |_&        d|v r$|d   jO                         dk(  rd|_(        d|_)        d|v r|d   jO                         dk(  rd|_(        d |v r|d    jO                         dk(  rd|_)        | jT                  tV        jX                  k  r|j.                  d!k(  rd|_-        d"|v r|d"   jO                         dk(  rd|_-        d#|v rt]        |d#         |_/        d$|v rt]        |d$         |_0        d%|v r~|d%   jc                  d&d'      j9                  d(      }te        |d d)       D cg c]!  \  }}|rt]        |      n|jf                  |   # }}}||d d d)ti        |      z
  z  z  }|r||_3        d*|v r\|d*   jO                         }|d+k(  rd,|_5        nC|dk(  rd|_5        n6t        j                  d-j                  ||j.                              d|_5        | jT                  tV        jl                  k  r$|j.                  d.k(  rtn        jp                  |_9        |j                  d/      }|r	 to        jt                  |      |_9        d1|v r
|d1   |_;        d2|v r
|d2   |_<        d3|v rt]        |d3         |_=        | j|                  |_?        y # t        $ r,}|}t        j                  dj                  ||            d }~ww xY w# t        $ r,}|}t        j                  d	j                  ||            d }~ww xY wc c}}w # t        $ r,}|}t        j                  d0j                  ||            d }~ww xY w)4Nrh   r   r   _z,underscore in key id '{}', please use dashesmodifierz+Unrecognized modifier {} indefinition of {}actionz-Unrecognized key action {} indefinition of {}charr   r"   xr   
   keypress_namemacroscriptkeycodebuttonr   _defaultimage;r   image_active	key_styleshowr   F	show_faceshow_borderlayer0show_activelabel_x_alignlabel_y_alignlabel_margin r&   ,r#   stickyr   Tz5Invalid value '{}' for 'sticky' attribute of key '{}'CAPSsticky_behaviorz2Unrecognized sticky behavior {} indefinition of {}tooltippopup_idchamfer_size)@r   rZ   get_idr:   rR   r<   r   r   r   r   r   r	   actionsr   code	CHAR_TYPEtypeKEYSYM_TYPEr   KEYPRESS_NAME_TYPE
MACRO_TYPESCRIPT_TYPEKEYCODE_TYPErh   BUTTON_TYPELEGACY_MODIFIER_TYPEaction_typeimage_filenamessplitr   NORMALACTIVE_parse_key_labelsr   theme_settingskey_label_overrideslabelsr   styler   r   r   r)   r   LAYOUT_FORMAT_3_2r   r   r   r   replace	enumerater   lenr   LAYOUT_FORMAT_2_2r
   	LOCK_ONLYr   rW   r   r   r   r+   rG   )r2   rn   rX   full_idr   r   rY   rc   strerror
group_namer  label_overridesoverrideolabelogroupr   ir   marginr   s                       r3   r   zLayoutLoaderSVG._init_key  sp    T">>*-)

7Hf-#**,OOJ#VCJJL13 z*B(/ x(B&..u5
 Z!&)CH **CH#x(E ,,CHQx3uR=uR=
*!/2CH 33CH
"!'*CH ++CH#!(+CH ,,CH*$:i01CH --CH#vvayCH ,,CH\\CH 55CH CJ"CO j #G,J#J j &&b(;4>w4G4M4Mc4RST4UC	 0 01Z'&&b(;4>~4NC	 0 01 ''
C8 !//CC"&&svv.%NFFfQi!'J
	 *$";/CI Z&!'')W4 %"'*$+&,,.'9 %J&-(..0G;"' <</;;;vv!"'J&-(..0G;"'j( %j&A BCj( %j&A BCZ'/77B?EEcJF"+F2AJ"79!Q #$eAh)9)9!)<< 9F 9fRaj!c&k/22F#) z!)//1F!
7""
 00KVFCFF+- - CJ <</;;;vv&4&>&>#01B&4&@&@&G# 
"$Y/CK#%j1CLZ'$Z%?@C--s  B 00 2''-vh'@B BB  B 00 2''-vh'@B BBL98  B 00 2''-vh'@B BBsN   W
 5X &&X:+Y  
	W?'W::W?	X7'X22X7 	Y5	'Y00Y5c                 <   i }|j                   t        j                  k(  r|j                  dvr| j                  r| j
                  }t        j                  j                  dk(  r|D cg c]  }t        |       }}| j                  j                  |j                  |      }t        j                  j                  dk(  r|D cg c]  }|j                  d       }}t        ||      D ci c]  \  }}||
 }}}n|j                  j                         dk(  rd|d<   nd|d<   n|j                   t        j                  k(  r~t         j"                  j%                  t'        |j                        d      \  }	}
t)        d	|j                        }|	sd
|d<   |t+        d      z  }n|	j-                  dd      |d<   ||_        | j1                  |      }|r|}| j3                  |      }|j                   t        j                  k(  r| j                  r| j
                  }	 t        j                  j                  dk(  r|D cg c]  }t        |       }}| j                  j5                  |j                  |      }t9        |      D ]7  \  }}|j%                  |      }|s|j%                  d      }	|	.||   }|	||<   9 |j;                         D ci c]  \  }}||xr t+        |      xs d  c}}S c c}w c c}w c c}}w c c}w # t6        $ r g }Y w xY wc c}}w )N)BKSPr#   UTF-8SPCEz No X keyboard found, retrying...r   ?)NNz
Snippet {}z     --     z, unassignedz\n
label)r   r	   r   rh   r'   _label_modifier_maskssysversion_infomajorlonglabels_from_keycoder   decodezipupperr   r   snippetsr   r   r)   r   r  r   _parse_layout_labels_get_keysym_ruleskeysyms_from_keycodeAttributeErrorr	  rf   )r2   rX   rn   r  
vkmodmasksmvklabelsr   lr  textr   layout_labelsrD   	vkkeysymsr  r   masklabs                      r3   r  z!LayoutLoaderSVG._parse_key_labelsX  s    88y---vv!xx!77
##))Q.3=!>a$q'!>J!>8877*M##))Q.;CDa 1DHD,/
H,EFDAq!a%FF66<<>V+ BF1I #F1I XX--- //--c#((m7CEKE4lCHH5G*q	1^,,!MM%6q	!CK 11*="F --c288y---xx!77
#''--27A%B!d1g%B
%B!%!>!>sxx?I"KI "+9!5 1IAv!-!1!1&!9J! *w 7$}#-a=D+0F4L1 #),,.2T3 #.$. 2 	2m "?  EF@ &C & # "I#2s<   (K2K7,K<!L >L(L LL LLc                     i }d|v rD|d   |d<   d|v r|d   |d<   d|v r|d   |d<   d|v r|d   |d<   d	|v r|d	   |d
<   d|v r|d	   |d
<   |S )z, Deprecated label definitions up to v0.98.x r  r   	cap_labelr"   shift_labelr#   altgr_label   altgrNshift_label   _label )r2   rX   r  s      r3   r'  z$LayoutLoaderSVG._parse_layout_labels  s    j "7+F1Ij(&{3q	
*&}5q	
*(7s"j0()<=s:%()<=sr5   c                     | j                   j                  |      }| | j                  |      }|| j                   |<   |S r   )r(   r   _load_svg_keys)r2   r[   r   s      r3   r   zLayoutLoaderSVG._get_svg_keys  s@    OO''1	++H5I(1DOOH%r5   c                    t         j                  j                  | j                  |      }	 t	        |      5 }t        j                  |      j                  }| j                  |      }|D ci c]  }|j                  | }}d d d        |S c c}w # 1 sw Y   S xY w# t        j                  $ r+}t        j                  dj                  |      |      d }~ww xY w)Nzerror loading '{}'chained_exception)r?   r@   joinr,   r   r   rS   rT   
_parse_svgrh   r   r   r<   )r2   r[   svg_filesvg_domr   r   rc   s          r3   r>  zLayoutLoaderSVG._load_svg_keys  s    77<< 5 5x@	*8$ C!--1AA OOG4	8ABTWWt^B	BC  CC 	 )) 	*,,$++H5%'* *	*sF   B 5B,B BB BBB B C1&CCc           
         g }|j                   D ]  }|j                  t        j                  j                  k(  s,|j
                  }|dv rHt               }|j                  d   j                  }||_	        |dk(  rt        t        |j                  d   j                        t        |j                  d   j                        t        |j                  d   j                        t        |j                  d   j                              |_        nt|dk(  rT|j                  d	   j                  }	 t        j                  |      |_        |j                  j)                         |_        n|dk(  r| j+                  |      |_        |j/                  |       |j1                  | j+                  |              |S # t         $ r+}t#        j$                  d
j'                  |      |      d }~ww xY w)N)rectr@   grh   rG  r   ywidthheightr@   dz#while reading geometry with id '{}'r@  rH  )rp   rq   r   rr   rs   rv   SVGNoderX   rY   rh   r   r   boundsr   from_svg_pathr@   
ValueErrorr   r   r<   
get_boundsrC  childrenappendextend)	r2   r   r   r   r   r   rh   datarc   s	            r3   rC  zLayoutLoaderSVG._parse_svg  s   	__  	9E~~!:!::mm//&yH))$/55B"$HKf}#'e.>.>s.C.I.I(J(-e.>.>s.C.I.I(J(-e.>.>w.G.M.M(N(-e.>.>x.H.N.N(O$Q ! $//4::<,3,A,A$,GHM +3--*B*B*D,0OOE,B)$$X.  !78A 	9D   * <","<"<"G"N"Nr"R79#< <<s   .F99	G-&G((G-c                     |j                         D ]3  }|j                  }|s|D ]  }|j                  ||f      }||c c S  5 i S )zR
        Look for a template definition upwards from item until the root.
        )iter_to_global_rootrC   r   )r2   
scope_item	classinfoidsrI   rC   rh   matchs           r3   r   zLayoutLoaderSVG.find_template  sZ     224 	%DI %B%MM2y/:E =$%	% 	r5   c                     i }t        t        |j                                     D ]*  }|j                  |j	                  |j                         , |S )z~
        Collect and merge keysym_rule from the root to item.
        Rules in nested items overwrite their parents'.
        )reversedr   iter_to_rootrD   r   )r2   rX  rD   rI   s       r3   r(  z!LayoutLoaderSVG._get_keysym_rules  sS    
 T*"9"9";<= 	7D$$,##D$5$56	7 r5   c                 "   |r!|j                         }|j                         }nd}d}|sd}|d   j                  d      }|d   j                  d      }|dk\  r|t        |      k  r||   }nd}|dk\  r|t        |      k  r	||   }||fS d}||fS )z< get names of the currently active layout group and variant r   r&   )basepc105usr&   r&   r#   r   r$   )get_current_groupget_rules_namesr   r
  )r2   rE   r   nameslayoutsvariantsrH   variants           r3   r7   z+LayoutLoaderSVG._get_system_keyboard_layout   s     ((*E&&(EEE3E8>>#&8>>#&A:%#g,.U^FFA:%#h-/uoG w Gwr5   c                 `    | j                   }| j                  r|d| j                  z   dz   z  }|S )N())r8   r9   )r2   ss     r3   r=   z)LayoutLoaderSVG._get_system_layout_string  s5    t+++c11Ar5   c                    |j                  d      }| j                  }| j                  }|D ]W  }| j                  j	                  |j                               j                         \  }}||k(  sC|r|j                  |      sW y y)a  
        Check if one ot the given layout strings matches
        system keyboard layout and variant.

        Doctests:
        >>> l = LayoutLoaderSVG()
        >>> l._system_layout = "ch"
        >>> l._system_variant = "fr"
        >>> l._has_matching_layout("ch(x), us, de")
        False
        >>> l._has_matching_layout("abc, ch(fr)")
        True
        >>> l._system_variant = ""
        >>> l._has_matching_layout("ch(x), us, de")
        False
        >>> l._has_matching_layout("ch, us, de")
        True
        r   TF)r   r8   r9   r0   searchstripgroupsr   )r2   
layout_strrf  
sys_layoutsys_variantrY   rH   rh  s           r3   rt   z$LayoutLoaderSVG._has_matching_layout   s    & ""3'((
** 	E"0077FMMOOFG#{55g>		
 r5   c                    g }d}t        |j                  d            D ]?  \  }}t               }dj                  |      |_        |j
                  d   j                  |_        |j
                  d   j                  |_        g }|j                  d      D ]  }| j                  ||      }	|	s|	j                  dk(  r&|	j                  d       t        j                  |	_        |	j                  d	k(  r&|	j                  d
       t        j                  |	_        |j                  |	        |j                  |       |j                  d      rd}|j                  |       B t               }
d|
_        |
j                  |       i }|
j!                         D ]4  }	|	j#                         j$                  }|j'                  |d      dz   ||<   6 |rOt)        t+        t-        t+        |j/                               t+        |j1                                                 d   nd}g }d}|sdnd}t3        dd||z  d      }t5               }	i }d|d<   ||d<   d|d<   d|d<   d|d<   | j7                  |	|       |	j9                  |j;                                |j                  |	       t5               }	i }d|d<   ||d<   d|d<   d|d<   d|d<   | j7                  |	|       |	j9                  |j;                                |j                  |	       t=        |      dkD  rt        |      D ]  \  }}t5               }	i }dj                  |      |d<   ||d<   |j                  |d <   d|d<   | j7                  |	|       |	j9                  |j;                                |j                  |	        t?               }d|_         |j                  |       t?               }d|_!        d!|_"        |j                  |
|g       |gS )"NFpanezlayer {}rh   r[   rn   middleClickmiddleclicksecondaryClicksecondaryclickcolumnT
layer_arear   r"      __layer_buttons__gffffff?g      ?   hider   z	close.svgr   r   r   r   r   movezmove.svgzlayer{}r  r#   )#r	  getElementsByTagNamer   r<   r   rX   rY   rh   r[   r~   rZ   r	   r   r   rS  r`   	iter_keysget_border_rectwr   maxr   r$  r   keysr   r   r   r   r   r
  r   r   r   r   )r2   r   panesis_scanr  	pane_noderI   r  r   rn   r{  	histogramr  most_frequent_widthr   widenrG  rX   ru  layer_switch_columnrH   s                        r3   r_   z$LayoutLoaderSVG._parse_legacy_layoutA  s    %h&C&CF&KL 	LAy=D&--a0DM%006<<DG%00<BBDM D!66u= %oodD1vv.

=1#,#8#8vv!11

#34#,#8#8KK$% NN4  --h7LL9	< !]
$
U# 	'') 	3C##%''A$==A.2IaL	3 "+ "$s4	0@0@0B+CT)..JZE['\"]^_`a02 	
 #"Aq-5r:i
%
4$
7*
7%
8")
;sJ'DIIK(Ci
%
4$
7)
7%
8")
;sJ'DIIK(Cu:>$U+ 	!4i
'0'7'7':
4 ',
7#'+ww
7#'-
8$sJ/##DIIK0C 	! (k).&%%d+*&9:;xr5   c                    t         j                  j                  |       }t         j                  j                  |      \  }}t         j                  j	                  |      \  }}t
        j                  t        d| |             d }i }i }		 t        |       5 }
t        j                  |
      }|j                  }t        j                  }|j                  d      r,t        j                   |j"                  d   j$                        }||j"                  d<   |t        j&                  k  rt)        j*                  t        d|            t        j-                  |      D ]  }t        j/                  |      s|j                  d      s+|j"                  d   j$                  }|	j1                  |dt3        t5        |	            z         }||	|<   t        j7                  |||      }||j"                  d   _        |||<    	 d d d        |rgt9        j:                  t<        j?                                t        |d      5 }
tA        |      }tB        jD                  jF                  dk(  r|jI                  d	      }|
jK                  |       tM        |jO                               D ]  \  }}t         j                  j                  |      \  }}|s t         j                  jQ                  ||      }t         j                  j                  |      \  }}|s t         j                  jQ                  ||      }t
        j                  t        d
||             tS        jT                  ||        	 d d d        y y # 1 sw Y   uxY w# 1 sw Y   y xY w# tV        $ r+}t
        jY                  dt[        |      z          Y d }~y d }~wt(        j*                  $ r(}t
        jY                  t[        |             Y d }~y d }~ww xY w)Nzcopying layout '{}' to '{}'r<   rh   z4copy_layouts failed, unsupported layout format '{}'.r[   Layerr  r#   r  zcopying svg file '{}' to '{}'zcopy_layout failed: ).r?   r@   rA   r   splitextr:   r;   r)   r   r   rS   rT   r   rU   rV   r   rW   rX   rY   r\   r   r   _iter_dom_nodesis_layout_noder   r   r
  _replace_basenamer   assure_user_dir_existsr   get_user_layout_dirr   r  r  r   encodewriter   rf   rB  shutilcopyfileOSErrorerrorr   )src_filenamedst_filenamesrc_dirdst_dirname_extdst_basenameextdomdocsvg_filenamesfallback_layersrb   keyboard_noder<   r   r[   fallback_layer_namenew_filenamexmlsrcdstdirnamerc   s                          r3   copy_layoutzLayoutLoaderSVG.copy_layout  sc   ''//,/GGMM,7GG,,X6cW:)<9 	: ?	+<( !GA q) & 6 6 )== --h7#//0H0H0R0X0XY61=((.OEEE$44 V &() )
 !0 ? ? N G*99$?#00<+/??:+F+L+L
 7F6I6I(-4s3;O7P-P7R 3<O 9 0?/P/P%-|=P0R EQ
 ; A:Fh 7#G!!GF ..v/I/I/KL |S1 2Q%f-C''--2!jj1GGCL %))<)<)>$? 2S$&GGMM#$6	T""$'',,w"=C$&GGMM#$6	T""$'',,w"=CW-L%(#&/ 0S122 2	 G!G !GN2 2&  	+MM0%b/* + +)) 	+MM+b/**	+si   N
 CM14M1A7M1>>N
 <D*M>'N
 1M;6N
 >NN
 N
 
	O7!N99O7O22O7c                     t         j                  |       D ]  }t        j                  |        t        j                  |        y r   )r   get_layout_svg_filenamesr?   remove)r[   fns     r3   remove_layoutzLayoutLoaderSVG.remove_layout  s3    !::8D 	BIIbM	
		(r5   c                 |   g }d }t        |       5 }t        j                  |      j                  }d d d        |ri }t        j                  |      D ]H  }t        j                  |      s|j                  d      s+|j                  d   j                  }|||<   J t        j                  j                  |       \  }}g }t        |j                               D ]S  }t        j                  j                  |      \  }	}|j                  t        j                  j!                  ||             U |S # 1 sw Y   xY w)Nr[   )r   r   rS   rT   r   r  r  rV   rX   rY   r?   r@   r   r   r  rS  rB  )
r[   resultsr  rb   	filenamesr   r  
layout_dirr  r  s
             r3   r  z(LayoutLoaderSVG.get_layout_svg_filenames  s   x  	6A]]1%55F	6 I'77? +"11$7((4!__Z8>>(*	"	+  "ww}}X6JG9>>+, ?GGMM"-	Trww||J=>? #	6 	6s    D11D;c                     t         j                  j                  |       \  }}t         j                  j                  |      \  }}|r4|j	                  d      }|dk\  r	||dz   d }n|}dj                  |||      S y)a  
        Doctests:
        # Basename has to be replaced with new_basename.
        >>> test = LayoutLoaderSVG._replace_basename
        >>> test("/home/usr/.local/share/onboard/Base-Alpha.svg",
        ... "NewBase","Fallback")
        'NewBase-Alpha.svg'

        # Dashes in front are allowed, but the layer name must not have any.
        >>> test("/home/usr/.local/share/onboard/a-b-c-Alpha.svg",
        ... "d-e-f","g-h")
        'd-e-f-Alpha.svg'
        -r   r"   Nz{}-{}{}r&   )r?   r@   r   r  rfindr<   )	r[   new_basenamer  r  r  r  r  indexr   s	            r3   r  z!LayoutLoaderSVG._replace_basename  su     h/XGG$$X.	cJJsOEzU1WX+##L%==r5   c                     | j                   dv S )N)ri   rj   rk   rl   rm   rn   rH   )rv   )r   s    r3   r  zLayoutLoaderSVG.is_layout_node)  s     $E E 	Er5   c              #      K   |  | j                   D ]H  }|j                  t        j                  j                  k(  s+t
        j                  |      D ]  }|  J yw)z6 Recursive generator function to traverse aa dom tree N)rp   rq   r   rr   rs   r   r  )r   r   r   s      r3   r  zLayoutLoaderSVG._iter_dom_nodes.  sW      (( 	E~~!:!::+;;EB DJ	s
   ;A!Ar   )0__name__
__module____qualname____doc__r   rU   r\   LAYOUT_FORMAT_SCANNERr  LAYOUT_FORMAT_3_0LAYOUT_FORMAT_3_1r  r^   r   r   r  r4   rJ   r>   rL   r]   rw   rx   ry   r   rz   r|   r}   r~   r   r  r'  r   r>  rC  r   r(  r7   r=   rt   r_   staticmethodr  r  r  r  r  r  r<  r5   r3   r   r   8   s    !(1 !(1 !(1
 !(1 !(1 !(1 !(1 !2M )94.?+Z9>v+$>"B$:x
5ni.V@2D$$L
4BaF J+ J+Z  
  ,  2 E E  r5   c                   (    e Zd ZdZdZdZdZd Zd Zy)rM  z/
    Cache of SVG provided key attributes.
    Nc                     g | _         y r   )rR  r1   s    r3   r4   zSVGNode.__init__A  s	    r5   c                     | j                   r| j                   d d }n| g}|d   j                  }|D cg c]  }|j                  s|j                   }}|rt        j                  |      }||fS d }||fS c c}w )Nr#   r   )rR  rN  r@   r   
from_paths)r2   nodesrN  r   pathsr   s         r3   r   zSVGNode.extract_key_paramsD  s    ==MM"1%EFEq',:t		::"--e4H x Hx ;s   A6A6)	r  r  r  r  rh   rN  r@   r4   r   r<  r5   r3   rM  rM  9  s"     
BFD r5   rM  )0
__future__r   r   r   logging	getLoggerr:   r?   r-   r  r  xml.domr   Onboardr   r	   Onboard.KeyCommonr
   r   r   r   Onboard.Layoutr   r   r   Onboard.utilsr   r   r   r   r   r   r   r   r   Onboard.WordSuggestionsr   Onboard.KeyGtkr   r   r   r   r   Onboard.Configr    r   r   rM  r<  r5   r3   <module>r     s   , B A 
'

-
. 
 	 
   . -9 9 F F9 9 9 2: : "	~ ~B    r5   