
    Csei#                         d Z ddlmZmZmZmZ ddlZddlmZ ddl	m
Z
mZ ddlmZ dZ G d d	e          Z G d
 de          Z G d de          Z G d de          Z G d de
          Z G d de          ZdS )a&  
Generates the Key Commands document from the User Guide.
Works as a Python Markdown Extension:
https://python-markdown.github.io/extensions/

Refer to user guide standards for more information on syntax rules:
https://github.com/nvaccess/nvda/blob/master/projectDocs/dev/userGuideStandards.md
    )autoEnumIntEnumStrEnumN)Iterator)	ExtensionMarkdown)Preprocessorz
c                   :    e Zd ZdZ e            Z e            ZdS )Sectionz&Sections must be nested in this order.N)__name__
__module____qualname____doc__r   HEADERBODY     ,C:\projects\nvda\user_docs\keyCommandsDoc.pyr   r      s*        --
$&&r   r   c                   8    e Zd ZdZdZdZdZdZdej	        fdZ
dS )	CommandtitlebeginInclude
endIncludesettingsettingsSectionreturnc                 <    t          j        d| j         d          S )Nz%kc:(z.*))recompilevalueselfs    r   t2tRegexzCommand.t2tRegex(   s     	,TZ,,,	-	--r   N)r   r   r   TITLEBEGIN_INCLUDEEND_INCLUDESETTINGSETTINGS_SECTIONr   Patternr$   r   r   r   r   r   !   sK        	%.rz . . . . . .r   r   c                       e Zd Z ej        d          Z ej        d          Z ej        d          Z ej        d          ZdS )Regexz0^<!-- KC:(?P<cmd>[^:\s]+)(?:: (?P<arg>.*))? -->$z^(?P<id>#+)(?P<txt>.*)$u   ^[^|]+?[:：]\s*(.+?)\s*$z
^(\|.*\|)$N)	r   r   r   r   r    COMMANDHEADINGSETTING_SINGLE_KEY	TABLE_ROWr   r   r   r,   r,   ,   sV        2:IJJ2:011 bj!=>>RZ&&r   r,   c                       e Zd ZdZdS )KeyCommandsErrorzjRaised due to an error encountered in the User Guide related to generation of the Key Commands document.
	N)r   r   r   r   r   r   r   r2   r2   3   s           r   r2   c                       e Zd ZdZdefdZdS )KeyCommandsExtension   mdc                 b    |j                             t          |          d| j                   d S )Nkey_commands)preprocessorsregisterKeyCommandsPreprocessorPRIORITY)r#   r6   s     r   extendMarkdownz#KeyCommandsExtension.extendMarkdown>   s.    3B77WWWWWr   N)r   r   r   r<   r	   r=   r   r   r   r4   r4   8   s=         Xh X X X X X Xr   r4   c                        e Zd Zdedz  f fdZd Zdee         dee         fdZdde	dz  d	edz  fd
Z
defdZdefdZd Zdej        fdZd Z xZS )r;   r6   Nc                 r    t                                          |           |                                  d S N)super__init__
initialize)r#   r6   	__class__s     r   rB   z KeyCommandsPreprocessor.__init__C   s1    ''2//r   c                     t          d          | _        g | _        t          j        | _        g | _        d| _        d| _        d | _	        d| _
        d| _        d| _        d S )Nr   Fr   )iter_ugLines_kcLinesr   r   _kcSect	_headings_kcLastHeadingLevel
_kcInclude_settingsHeaderRow_settingsNumLayouts_lineNum_skippedTitler"   s    r   rC   z"KeyCommandsPreprocessor.initializeG   sZ    !%b$-$-!.$,#%$."$$$/(,$"#$$-$r   linesr   c                 F   t          |          | _        | j        D ]}|                                }| xj        dz  c_        |                    d          r| j        sd| _        Jt          j        j        	                    |          }|r  | j
        di |                                 t          j        j        	                    |          }|r|                     |           | j        r| j                            |           | j                                        S )N   # Tr   )rG   rH   striprP   
startswithrQ   r,   r-   r!   match_command	groupdictr.   _headingrM   rI   appendcopy)r#   rR   linems       r   runzKeyCommandsPreprocessor.run[   s   u++$-m  d
**,,4==A== ood D$6 D}  &&1 DM""AKKMM"""}  &&1 MM!
o M					r   cmdargc                    |t           j        j        k    rg| j        t          j        k    rt          | j         d          | j        	                    d|z   t          dz  z              t          j        | _        d S | j        t          j        k    rt          | j         d          |t           j        j        k    r|                                  d| _        d S |t           j        j        k    r#d| _        | j        	                    d           d S |t           j        j        k    ro|                    dd	          | _        |                    d	                              d	          d
z
  | _        | j        d
k     rt          | j         d          d S |t           j        j        k    r|                                  d S t          | j         d|           )Nz!, title command is not valid hererU      z!, title must be the first commandTF z|||rT   zZ, settingsSection command must specify the header row for a table summarising the settingsz, Invalid command )r   r%   r!   rJ   r   r   r2   rP   rI   r\   LINE_ENDr   r&   _writeHeadingsrM   r'   r)   replacerN   rV   countrO   r(   _handleSetting)r#   ra   rb   s      r   rY   z KeyCommandsPreprocessor._commandv   s   GM
lW^##
dmNNN
O
OO=s
X\1222,4<	6|w~%%	T]MMM	N	NNG!'''4???
g!'''4?=
g&,,, ![[s334 "iinn22377!;4
""
 ! ! !   #" go### 
T]CCcCC	D	DDr   c                    t          | j                                                  }| xj        dz  c_        |sL	 t          | j                                                  }n# t          $ r |cY S w xY w| xj        dz  c_        |L|S )z6Seeks to the next non-empty line in the user guide.
		rT   )nextrH   rV   rP   StopIteration)r#   r^   s     r   _seekNonEmptyLinez)KeyCommandsPreprocessor._seekNonEmptyLine   s     
dm			"	"	$	$$--1-- $$&&DD
   KKK==A==   
+s   &A! !A0/A0c                 B    | j         t          | j                  dz
  k     S )NrT   )rL   lenrK   r"   s    r   _areHeadingsPendingz+KeyCommandsPreprocessor._areHeadingsPending   s    		!C$7$7!$;	;;r   c                     | j         dz   }t          | j        |d          |          D ]2\  }}| j                            |                    d                     3|| _         d S )NrT   r   )rL   	enumeraterK   rI   r\   group)r#   levelheadings      r   rh   z&KeyCommandsPreprocessor._writeHeadings   sj    

"Q
&%!$."8%@@ * *neW=a(())))"$r   r_   c                     t          |                    d                    dz
  }	 | j        |d = n# t          $ r Y nw xY w| j                            |           t          | j        |dz
            | _        d S )NidrT   )rq   ru   rK   
IndexErrorr\   minrL   )r#   r_   rv   s      r   r[   z KeyCommandsPreprocessor._heading   s    
aggdmm

q
 %~eff	   4. !9519EE$s   
2 
??c           	         | j         st          d| j        z            |                                 rw| j                            d           |                                  | j                            | j                    | j        dz   }| j                            dd|z  z              |                                 }t          j
        j                            |          }|st          | j         d          |                    d          }g }t          | j                  D ]}|                                 }t          j        j                            |          }|r*|                    |                    d                      nt          j        j                            |          st          | j         d	          	 |                    d                              d          d                                         |                               # t&          $ r t          | j         d
          w xY wdt)          |          cxk    r| j        k     r3n n0|d         fdt          | j        dz
            D             |dd <   t+          | j                                                  }| xj        dz  c_        |rt          | j         d           |                                 }| j                            d| dd                    |           d| d           | j        d                             d          s4t)          |          dz   }| j                            dd|z  z              d S d S )NzA%d, setting command cannot be used before settingsSection commandre   rd   rf   z---|z-, setting command must be followed by headingtxtrT   zG, setting command: There must be one table row for each keyboard layoutz4, setting command: Key entry not found in table row.r   c              3      K   | ]}V  d S r@   r   ).0_layoutkeys     r   	<genexpr>z9KeyCommandsPreprocessor._handleSetting.<locals>.<genexpr>   s#      FFwsFFFFFFr   z, setting command: The keyboard shortcuts must be followed by a blank line. Multiple keys must be included in a table. Erroneous key: z| z | z |)rN   r2   rP   rr   rI   r\   rh   rO   ro   r,   r.   r!   rX   ru   ranger/   r0   rV   splitrz   rq   rm   rH   joinrW   )	r#   numColsr^   r_   namekeysr   descr   s	           @r   rk   z&KeyCommandsPreprocessor._handleSetting   s   		  o	]`d`mm	n	nn	 0 ==/000%)7=fw../// 
			!	!$m%%!	
 [	T]YYY	Z	ZZ	
$
 $t/00  g

 
 
"
"4%++D111 KK

	EO!''-- 
 < < <  
**S//


$
$Q
'
-
-
/
/C 	KK  c c c
dmaaa
b
bbc
 #d))....d......	a3FFFF%(@1(D"E"EFFF48 
dm			"	"	$	$$--1--	 	}   
 
  
			!	!$-BDBBUZZ%5%5BB$BBBCCC	r		%	%c	*	* 0 YY]7=fw../////	0 0s   
A H  "I)NN)r   r   r   r	   rB   rC   liststrr`   r   rY   ro   boolrr   rh   r   Matchr[   rk   __classcell__)rD   s   @r   r;   r;   B   s5       4        (d3i DI    6&E &E4 &ES4Z &E &E &E &EP    <$ < < < <# # #Frx F F F FE0 E0 E0 E0 E0 E0 E0r   r;   )r   enumr   r   r   r   r   collections.abcr   markdownr   r	   markdown.preprocessorsr
   rg   r   r   r,   	Exceptionr2   r4   r;   r   r   r   <module>r      s    . - - - - - - - - - - - 				 $ $ $ $ $ $ ( ( ( ( ( ( ( ( / / / / / /     g   . . . . .g . . .' ' ' ' 'D ' ' '    y   
X X X X X9 X X XB0 B0 B0 B0 B0l B0 B0 B0 B0 B0r   