³ņ ŃÆ.Fc@s dZdefd„ƒYZdS(sł This module documents a class that creates an object that processes templates. @author: Lateef Alabi-Oki @organization: The Scribes Project @copyright: Copyright Ā© 2007 Lateef Alabi-Oki @license: GNU GPLv2 or Later @contact: mystilleef@gmail.com tTemplateProcessorcBsŻeZdZd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z d „Z d „Z d „Zd „Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Zd„ZRS(sŖ This class creates an object that inserts templates with placeholders into the text editor's buffer and provides mechanisms for navigating between the placeholders. cCsY|i|||ƒddkl}|iiƒ||i|ƒ|id|iƒ|_|io|i ƒnddk l }l }|i oØ|iƒ|iiƒ|iƒ|iƒ|id|iƒ|_|iid|iƒ|_|iid|iƒ|_ddkl}|iii|dƒ|_n|iiƒ||i|ƒd S( s“ Initialize object. @param self: Reference to the TemplateProcessor instance. @type self: A TemplateProcessor object. @param manager: Reference to the TemplateManager instance. @type manager: A TemplateManager object. @param editor: Reference to the text editor. @type editor: An Editor object. @param template: A string representing a template. @type template: A String object. i’’’’(t insert_stringtdestroy(t timeout_addtidle_adds cursor-moveds insert-text(tmsg0001tinfoN(t#_TemplateProcessor__init_attributestutilsRt textbuffertbegin_user_actiontconnectt_TemplateProcessor__destroy_cbt_TemplateProcessor__signal_id_1t(_TemplateProcessor__special_placeholderst/_TemplateProcessor__expand_special_placeholderstgobjectRRt _TemplateProcessor__placeholderst-_TemplateProcessor__mark_and_tag_placeholderstend_user_actiont._TemplateProcessor__determine_last_placeholdert,_TemplateProcessor__select_first_placeholdert#_TemplateProcessor__cursor_moved_cbt_TemplateProcessor__signal_id_2t"_TemplateProcessor__insert_text_cbt_TemplateProcessor__signal_id_3t connect_aftert(_TemplateProcessor__insert_text_after_cbt_TemplateProcessor__signal_id_4ti18nRt_TemplateProcessor__editortfeedbacktset_modal_messaget_TemplateProcessor__status_id(tselftmanagerteditorttemplateRRRR((splugins/Templates/Processor.pyt__init__'s(        cCs!||_||_||_|iƒ}|i|dƒ|_|i|dƒ|_ddkl}l }||ƒ|_ ||ƒ|_ |i ƒ|_ |iƒ|_|iƒ|_|iƒ|_|iƒ|_h|_h|_d|_d|_d|_|_|_d|_d|_dS(s“ Initialize object. @param self: Reference to the TemplateProcessor instance. @type self: A TemplateProcessor object. @param manager: Reference to the TemplateManager instance. @type manager: A TemplateManager object. @param editor: Reference to the text editor. @type editor: An Editor object. @param template: A string representing a template. @type template: A String object. tlefttrighti’’’’(tget_placeholderstget_special_placeholdersiN( t_TemplateProcessor__managerRt_TemplateProcessor__templatetget_cursor_positiontmarkt'_TemplateProcessor__start_template_markt%_TemplateProcessor__end_template_markRR)R*RRt/_TemplateProcessor__create_pre_modification_tagt2_TemplateProcessor__pre_modification_highlight_tagt0_TemplateProcessor__create_post_modification_tagt3_TemplateProcessor__post_modification_highlight_tagt+_TemplateProcessor__create_modification_tagt._TemplateProcessor__modification_highlight_tagt&_TemplateProcessor__create_special_tagt)_TemplateProcessor__special_highlight_tagt._TemplateProcessor__get_duplicate_placeholderst_TemplateProcessor__mirror_listt%_TemplateProcessor__mirror_dictionaryt*_TemplateProcessor__placeholder_dictionaryt_TemplateProcessor__indextNonet_TemplateProcessor__last_indexR RRRR!(R"R#R$R%titeratorR)R*((splugins/Templates/Processor.pyt__init_attributesNs,          c CsN|i|i\}}}|o'| o|o|i|iƒdSn|iii|ƒ}|iii|ƒ}|iii|i||ƒ|iii|i ||ƒ|iii |i ||ƒddk l }||iiƒ||fƒo|iƒnddkl}|iƒ|_|ioŌ|i|i\}}}|oR|oK|oD|iii|ƒ}|iii|ƒ}|iii||ƒn)|iii|ƒ}|iii|ƒ||iiƒddkl} |iii| dƒnL|iii|iƒ}|iii|ƒ||iiƒ|i|iƒdS(sš Jump to the next placeholder in the template. @param self: Reference to the TemplateProcessor instance. @type self: A TemplateProcessor object. Ni’’’’(tcontains(tmove_view_to_cursor(tmsg0003tyes(R<R=R R+RR tget_iter_at_markt remove_tagR2R6t apply_tagR4toperatorRBR;tkeyst"_TemplateProcessor__update_mirrorstSCRIBES.cursorRCt(_TemplateProcessor__calculate_next_indext select_ranget place_cursorttextviewRRDRtupdate_status_messageR0( R"t begin_marktend_marktvaluetbegintendRBRCR@RD((splugins/Templates/Processor.pytnext…s< c Cs|i|i\}}}|oĘ|oæddkl}||iiƒ||fƒo|iƒn|iii |ƒ}|iii |ƒ}|iii |i ||ƒ|iii |i ||ƒ|iii |i||ƒn|iƒ|_ddkl}||idƒodSn|i|i\}}}|oR|oK|oD|iii |ƒ}|iii |ƒ}|iii||ƒn)|iii |ƒ}|iii|ƒddkl} | |iiƒddkl} |iii| dƒdS(sš Move to the previous placeholder if possible. @param self: Reference to the TemplateProcessor instance. @type self: A TemplateProcessor object. i’’’’(RB(tis_N(RC(tmsg0004RE(R<R=RIRBR;RJRKRR RFRGR2R6RHR4t,_TemplateProcessor__calculate_previous_indexRXR>RNRORLRCRPRRYRRQ( R"RRRSRTRBRURVRXR@RCRY((splugins/Templates/Processor.pytpreviousµs2 cCsaddkl}g}|iD]6}||ii|ƒdƒo||idƒqq~}|S(Ni’’’’(tgtis${}(RIR\Rtcounttstrip(R"R\t_[1]t placeholdertmirrors((splugins/Templates/Processor.pyt__get_duplicate_placeholdersŚsMc Cs |iii|iƒ}ddkl}ddkl}xĖ|iD]Ą}|iii|i ƒ}|i |||ƒ\}}|iii |ƒ|iii ||ƒ||ƒ}|ii ƒ} |ii| ƒ} |iii| ||iƒ|iii| ƒ}qBWdS(sŃ Replace special placeholders in the text editor's buffer with their determined value and tag them. @param self: Reference to the TemplateProcessor instance. @type self: A TemplateProcessor object. i’’’’(tTEXT_SEARCH_VISIBLE_ONLY(treplace_special_placeholderN(RR RFR/tgtkRcRRdRR0tforward_searchROtdeleteR-R.tinsert_with_tagsR8( R"tstart_positionRcRdR`t end_positionRURVtnew_placeholdertcursor_positionR.((splugins/Templates/Processor.pyt__expand_special_placeholdersßs    csIddkl}l‰l‰ˆi}|i}ˆio+‡‡‡fd†}t|ˆiƒ}n ˆi}|i ˆi ƒ}ddk l }d}g} xØ|D] } |i ˆi ƒ} |i| || ƒ\} } |i| ƒ|i| | ƒ|iƒ}| idƒ} || dƒo6|id |tƒ}|itƒ|fˆids(Rcis${}tcursort iN(RIRnRBRoRR RtfilterRRFR/ReRcR0RfRORgR-R^t create_markR>tFalset set_visibletTrueR<R:R;tappendRhR2(R"RnR$R tis_not_specialt placeholdersRiRcR]t mirror_listR`RjRURVRltemarktbmark((RoR"RBsplugins/Templates/Processor.pyt__mark_and_tag_placeholdersłsN           cCsm|iidƒoŌ|id}ddkl}l}|t|iƒdƒo4|id=d|_|ddtf|i|iRwtmaxRJR:titemsRx(R"t cursor_markerRnR\tnavigating_index_listtkeyRT((splugins/Templates/Processor.pyt__determine_last_placeholder.s&   ! %   cCso|iiƒ}|iƒddkl}x?|D]7}|||iƒo|i|do|Sqgq0q0WdS(sķ Determine the next placeholder index to jump to. @param self: Reference to the TemplateProcessor instance. @type self: A TemplateProcessor object. @return: The next placeholder index to jump to. @rtype: An Integer object. i’’’’(R\iN(R<RJtsortRIR\R=R>(R"tindexesR\tindex((splugins/Templates/Processor.pyt__calculate_next_indexJs  cCsĀ|iiƒ}|iƒ|iƒddkl}l}x‚|D]z}||iƒo3t|ƒ|_|i|ido |iSq‰n|||iƒo|i|do|Sqŗq@q@WdS(sń Determine the previous placeholder index to jump to. @param self: Reference to the TemplateProcessor instance. @type self: A TemplateProcessor object. @return: The next placeholder index to jump to. @rtype: An Integer object. i’’’’(RotltiN( R<RJR‡treverseRIRoR‹R=RR>(R"RˆRoR‹R‰((splugins/Templates/Processor.pyt__calculate_previous_index]s   cCsWxPt|idƒD];}|i|}||jo||jo||_PqqWdS(s’ Update the current placeholder index. @param self: Reference to the TemplateProcessor instance. @type self: A TemplateProcessor object. iN(txrangeR?R<R=(R"RRRSRTtmarks((splugins/Templates/Processor.pyt__update_indexus   cCss|id\}}}|oR|oK|oD|iii|ƒ}|iii|ƒ}|iii||ƒndS(sŠ Select the first placeholder. @param self: Reference to the TemplateProcessor instance. @type self: A TemplateProcessor object. iN(R<RR RFRN(R"RRRSRTRURV((splugins/Templates/Processor.pyt__select_first_placeholderƒs cCs|i|i\}}}g}ddkl}l}l}xe|iiƒD]T\}}|||i||fƒo+||||fƒo|i|ƒqŸqKqKW||ƒodSn|i i i |i ƒx„|D]} |i i i |ƒ} |i i i |ƒ} |i i i | dƒ} |i i i | dƒ} |i i i| | ƒ|i i i |ƒ} |i i i |ƒ} |i i i | dƒ} |i i i | dƒ} |i i i| | | ƒ|i i i |ƒ} |i i i |ƒ} |i i i | dƒ} |i i i | dƒ} |i i i|i| | ƒ|i i i|i| | ƒ|i i i|i| | ƒqÕW|i i i|i ƒdS(sœ Update other mirrors when one mirror is edited. @param self: Reference to the TemplateProcessor instance. @type self: A TemplateProcessor object. i’’’’(RntneRoNii(R<R=RIRnR’RoR;R‚RxRR t handler_blockRRFRgt insert_rangeRGR2R6RHR4thandler_unblock(R"RRRSRTR{RnR’RoR…R`tbegin_positionRjRURV((splugins/Templates/Processor.pyt__update_mirrors‘s>  cCsV|iiiƒ}|iddƒ|iddƒddkl}|id|ƒ|S(sŹ Create a tag for unmodified placeholders. @param self: Reference to the TemplateProcessor. @type self: A TemplateProcessor object. @return: A highlight tag. @rtype: A gtk.TextTag object. t backgroundtyellowt foregroundtbluei’’’’(t WEIGHT_HEAVYtweight(RR t create_tagt set_propertytpangoRœ(R"t highlight_tagRœ((splugins/Templates/Processor.pyt__create_pre_modification_tag¼s cCs\|iiiƒ}|iddƒddkl}l}|id|ƒ|id|ƒ|S(sČ Create a tag for modified placeholders. @param self: Reference to the TemplateProcessor. @type self: A TemplateProcessor object. @return: A highlight tag. @rtype: A gtk.TextTag object. RšR›i’’’’(Rœt STYLE_ITALICRtstyle(RR RžRŸR RœR£(R"R”RœR£((splugins/Templates/Processor.pyt__create_post_modification_tagĶs cCsV|iiiƒ}|iddƒ|iddƒddkl}|id|ƒ|S(sĪ Create a tag for placeholders being modified. @param self: Reference to the TemplateProcessor. @type self: A TemplateProcessor object. @return: A highlight tag. @rtype: A gtk.TextTag object. R˜s#ADD8E6Ršs#CB5A30i’’’’(RœR(RR RžRŸR Rœ(R"R”Rœ((splugins/Templates/Processor.pyt__create_modification_tagŽs cCsF|iiiƒ}|iddƒddkl}|id|ƒ|S(sĒ Create a tag for special placeholders. @param self: Reference to the TemplateProcessor. @type self: A TemplateProcessor object. @return: A highlight tag. @rtype: A gtk.TextTag object. Rštpinki’’’’(RœR(RR RžRŸR Rœ(R"R”Rœ((splugins/Templates/Processor.pyt__create_special_tagļs cCsÅ|iƒ}|iii|iƒ}|iii|iƒ}ddkl}||i||ƒƒo\|i |ƒo$|i |ƒo|i |i ƒqĮ|i |ƒoqĮ|i |i ƒndS(sā Handles callback when the "cursor-moved" signal is emitted. @param self: Reference to the class instance. @type self: A class object. @param editor: Reference to the text editor. @type editor: An Editor object. i’’’’(RoN( R-RR RFR/R0RIRotin_rangetequalR R+(R"R$RlR–RjRo((splugins/Templates/Processor.pyt__cursor_moved_cbs  c Cs;ddkl}l}||i|iƒotSn|i|i\}}} ||iiƒ||fƒotSn|oƒ|o|| ou|i i i |ƒ} |i i i |ƒ} |i | | ƒp |i | ƒp|i | ƒo|i|iƒq7n:|i i i |ƒ}|i |ƒo|i|iƒntS(sy Handles callback when the "insert-text" signal is emitted. @param self: Reference to the TemplateProcessor instance. @type self: A TemplateProcessor object. @param textbuffer: The text editor's buffer. @type textbuffer: A ScribesTextBuffer object. @param iterator: The position to insert text. @type iterator: A gtk.TextIter object. @param text: Text to be entered in the text editor's buffer. @type text: A String object. @param length: The length of text to be entered in the buffer. @type length: An Integer object. @return: True to propagate signals to parent widgets. @type: A Boolean Object. i’’’’(R’RB(RIR’RBR=R?RuR<R;RJRR RFR©RŖR R+( R"R R@ttexttlengthR’RBRRRSRTRURV((splugins/Templates/Processor.pyt__insert_text_cbs3cCsÉ|iiƒ}x³|D]«}|do|d o|doqn|iii|dƒ}|iii|dƒ}|iiƒ}|i||ƒp |i|ƒp|i|ƒo|SqqWdS(sś Return the position of a placeholder under modification. @param self: Reference to the TemplateProcessor instance. @type self: A TemplateProcessor object. @return: The position of the placeholder being modified. @rtype: A List object. iiiN( R<tvaluesRR RFR-R©RŖR>(R"RzR`RURVR@((splugins/Templates/Processor.pyt__get_modified_placeholderHs "3 cCsWxPt|idƒD];}|i|}||jo||jo||_PqqWdS(s’ Update the current placeholder index. @param self: Reference to the TemplateProcessor instance. @type self: A TemplateProcessor object. iN(RŽR?R<R=(R"RRRSRTR((splugins/Templates/Processor.pyR^s   c Cs›|iƒ}ddkl}||ƒotSn|iii|dƒ}|iii|dƒ}|iii|i||ƒ|i |d|dƒtS(sy Handles callback when the "insert-text" signal is emitted. @param self: Reference to the TemplateProcessor instance. @type self: A TemplateProcessor object. @param textbuffer: The text editor's buffer. @type textbuffer: A ScribesTextBuffer object. @param iterator: The position to insert text. @type iterator: A gtk.TextIter object. @param text: Text to be entered in the text editor's buffer. @type text: A String object. @param length: The length of text to be entered in the buffer. @type length: An Integer object. @return: True to propagate signals to parent widgets. @type: A Boolean Object. i’’’’(Roii( t,_TemplateProcessor__get_modified_placeholderRIRoRuRR RFRHR6t _TemplateProcessor__update_index( R"R R@R¬R­R`RoR–Rj((splugins/Templates/Processor.pyt__insert_text_after_cbls  cCsūddkl}l}|iid|ƒ||i|ƒ||i|iƒ||i|ii ƒ||i |ii ƒ|ii i |i ƒ}|ii i |i ƒ}|ii i|i||ƒ|ii i|i||ƒ|ii i|i||ƒ|ii i|i||ƒ|ii|i ƒ|ii|i ƒxM|iiƒD]<}y,|ii|dƒ|ii|dƒWqNqNXqNW|iiƒ|iiƒ|iii|iƒddkl}|iii|dƒ||ƒd}~tS(Ni’’’’(tdelete_attributestdisconnect_signalstemplate-destroyedii(tmsg0002RE( t SCRIBES.utilsR“RµR+temitR RRRR RRFR/R0RGR2R4R6R8t delete_markR<RÆR;tclearRtunset_modal_messageR!RR¶RQR>Ru(R"R#R“RµR–Rjt positionsR¶((splugins/Templates/Processor.pyt __destroy_cbŽsD       (t__name__t __module__t__doc__R&RRWR[R9RRRRMRZR²RRKR1R3R5R7RRR±RR (((splugins/Templates/Processor.pyR s0 ' 7 0 %   5      +      *   "N(RĄtobjectR(((splugins/Templates/Processor.pyss