ó SŃX=c@s–dZddlZddlZddlZddlZejZejZddl Tddl Tddl Tddl TdZ dZdefd„ƒYZdS(sµ The main module of the parser. All other modules will be imported into this one, so this module is the only one one needs to import. For validating parsing, import xmlval instead. i’’’’N(t*s0.70s$Revision: 1.25 $t XMLProcessorcBseZdZd„Zd„Zd„Zdd„Zd„Zdd„Z d„Z d „Z d „Z d „Z d „Zd „Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Z RS( s8A parser that performs a complete well-formedness check.cCsJtj|ƒtƒ|_t|ƒ|_|j|_d|_d|_ dS(Ni( t EntityParsert__init__t ApplicationtapptWFCDTDtdtdtenttNonet dtd_listenert stop_on_wf(tself((sM/opt/freeware/lib/python2.7/site-packages/_xmlplus/parsers/xmlproc/xmlproc.pyRs     cCs||_|j|ƒdS(s'Sets the object to send data events to.N(Rt set_locator(R R((sM/opt/freeware/lib/python2.7/site-packages/_xmlplus/parsers/xmlproc/xmlproc.pytset_application's cCs ||_dS(s6Registers an object that listens for DTD parse events.N(R (R tlistener((sM/opt/freeware/lib/python2.7/site-packages/_xmlplus/parsers/xmlproc/xmlproc.pytset_dtd_listener,sicCs ||_dS(sčSets the parser policy on well-formedness errors. If this is set to 0 data events are still delivered, even after well-formedness errors. Otherwise no more data events reach the application after such erors. N(R (R R ((sM/opt/freeware/lib/python2.7/site-packages/_xmlplus/parsers/xmlproc/xmlproc.pytset_data_after_wf_error0scCs ||_dS(sQTells the parser whether to read the external subset of documents or not.N(tread_external_subset(R tread_it((sM/opt/freeware/lib/python2.7/site-packages/_xmlplus/parsers/xmlproc/xmlproc.pytset_read_external_subset7scCs;|jr$|dkr$tƒ|_ntj|||ƒdS(Ni· (R RRRt report_error(R tnumbertargs((sM/opt/freeware/lib/python2.7/site-packages/_xmlplus/parsers/xmlproc/xmlproc.pyR<scCsftj|ƒt|dƒr,|jjƒng|_d|_d|_d|_d|_d|_ dS(NRii( RtresetthasattrRtstackt seen_roott seen_doctypet seen_xmldeclR R(R ((sM/opt/freeware/lib/python2.7/site-packages/_xmlplus/parsers/xmlproc/xmlproc.pyRAs      cCs)d|_|_|_|_|_dS(sDeletes circular references.N(R RRterrRtpubres(R ((sM/opt/freeware/lib/python2.7/site-packages/_xmlplus/parsers/xmlproc/xmlproc.pytderefNscCsńy†x|j|jkr„|j|_|j|jdkr(|j|jd}|dkrg|jƒq|dkrŒ|dkrŒ|jƒq|jdƒr®|j|jƒq|jdƒrÓ|j |jdƒq|jdƒrļ|j ƒq|jd ƒr |j ƒq|j d ƒ|j d ƒq|j|jd krw|jd ƒrZ|jƒq|jd|_|jƒq|jƒqWWndtk r¼}|jr­tƒ‚qķ|j|_n1tk rģ}|jrŻ|‚qķ|j|_nXdS(sDoes the actual parsing.tt&s&#N(tpostdatasizetprepostdatat parse_end_tagtparse_start_tagtnow_att parse_commentRtparse_pit parse_cdatat parse_doctypeRtscan_tot parse_charreft parse_ent_reft parse_datat IndexErrortfinaltOutOfDataException(R ttte((sM/opt/freeware/lib/python2.7/site-packages/_xmlplus/parsers/xmlproc/xmlproc.pytdo_parseRsB             cCs|jjƒdS(s=Must be called before parsing starts. (Notifies application.)N(Rt doc_start(R ((sM/opt/freeware/lib/python2.7/site-packages/_xmlplus/parsers/xmlproc/xmlproc.pyt parseStart„scCsb|jgkr8|jgkr8|jd|jdƒn|jsQ|jdƒn|jjƒdS(sdMust be called when parsing is finished. (Does some checks and " "notifies the application.)iĘ i’’’’iĒ N(Rt ent_stackRRRtdoc_end(R ((sM/opt/freeware/lib/python2.7/site-packages/_xmlplus/parsers/xmlproc/xmlproc.pytparseEndˆs  cCs˜|jd|_|jƒ}|jƒy&|jj|\}}|jƒ}Wntk rki}i}nX|j|jdkré|j|jdkréi}xH|jdƒ rå|jdƒ rå|jƒ}|jƒ|j dƒs |j ddƒ|j dƒd}Pn|jƒ|j ƒ}|dkrp|jd|_|j|jddkrl|jd|_nPn|j |ƒr’|j d |ƒn d||<|||<|j |ƒrŲ|||krŲ|j d |ƒn|jƒq”Wn|jgkr|jr|j d ƒnd|_|j dƒrO|jj||ƒ|jj|ƒnE|j dƒr„|jj||ƒ|jj|ƒn|j d dƒdS(sParses the start tag.iR%R"s/>t=i½ ti’’’’iČ iŠiÉ i¼ s'>'N(s'>'s/>(R't _get_nametskip_wsRtattrinfotcopytKeyErrorR*ttest_strR-RR2t parse_att_valthas_keyRRRthandle_start_tagtappendthandle_end_tag(R tnametattrstfixedstseenta_nameta_val((sM/opt/freeware/lib/python2.7/site-packages/_xmlplus/parsers/xmlproc/xmlproc.pyR,’sV    ,#         cCs4d}|jdƒr$d}t}n?|jdƒrBd}t}n!|jddƒ|jdƒdSxŹ|j|ƒ}|t|ƒ}|j|ƒr˜Pn|jdƒrŗ||jƒ}nQ|jdƒrÉ|jƒ}||j krõ|jd ƒd S|j j |ƒy“|j j |ƒ}|j ƒrŠ|j|jƒ|j|ƒd |_||jƒ}|j|jks}|jd ƒn|jƒn |jd ƒWn!tk r»|jd|ƒnX|j d=nB|jdƒrė|jdƒqfn |jdƒ|jd |_qf|jdƒsf|jddƒqfqf|S(sCParses an attribute value and resolves all entity references in it.RBt"t'i¼ R%i’’’’s&#R&iĖ Nii¹ iĢ iĶ R!iĪ i”t;i½ (RURT(R-treg_attval_stop_quotetreg_attval_stop_singRR2tfind_regtws_transt_read_char_refRCt open_entsRLRt resolve_get is_internalt push_entitytget_current_sysidtvalueR7tparse_literal_entvalR'R(t pop_entityRG(R tvaltdelimtreg_attval_stoptpieceRNR((sM/opt/freeware/lib/python2.7/site-packages/_xmlplus/parsers/xmlproc/xmlproc.pyRIĶs\             cCsźd}tjdƒ}xĪy|j|ƒ}Wn8tk re|t|j|jƒ}|j|_PnX|t|ƒ}|jdƒr˜||j ƒ}n|jdƒr§|j ƒ}||j krÓ|j dƒdS|j j |ƒy“|jj|ƒ}|jƒrh|j|jƒ|j|ƒd|_||jƒ}|j|jks[|j dƒn|jƒn |j dƒWn!tk r™|j d|ƒnX|j d =n |j d ƒ|jd ƒs|j d d ƒ|jd ƒqq|S(sBParses a literal entity value for insertion in an attribute value.RBR&s&#iĖ ii¹ iĢ iĶ i’’’’i”RVi½ R%(tretcompileRYR8RZR*R'R(R-R[RCR\RRLRR]R^R_R`RaR7RbRcRGR2(R Rdtreg_stopRgRNR((sM/opt/freeware/lib/python2.7/site-packages/_xmlplus/parsers/xmlproc/xmlproc.pyRbsJ           cCs.|jd|_|jƒ}|j|jdkra|jƒ|jdƒsq|jddƒqqn|jd|_y…|jd}||krė|jd||fƒt|jƒdkrŲ|jd|krŲ|jd=qõ|jj|ƒn |jd=Wn!t k r|jd|ƒnX|j j |ƒd S( s6Parses the end tag from after the ''.iR%i½ ii’’’’iĻ iiŠ N( R'RCR*RDR-RRtlenRLR6RRM(R RNtelem((sM/opt/freeware/lib/python2.7/site-packages/_xmlplus/parsers/xmlproc/xmlproc.pyR+Js$    (  cCs||j}t|jd|jƒ}|dkrut|jd|jƒ}|dkr„|jsftƒ‚n|j}q„n0t|jd|j|ƒ}|dkr„|}n||_t|jd||ƒdkrt|jd||ƒ|_|jdƒ|jd|_n|jgkr_tj |j|ƒ}|d ksL|j dƒ|krx|jdƒqxn|j j |j||ƒd S( sParses character data.R!i’’’’R&s]]>iŃ iiiÕ N(R't string_findR*R7R8R(RRtreg_wstmatchR tendRt handle_data(R tstartRptampendtres((sM/opt/freeware/lib/python2.7/site-packages/_xmlplus/parsers/xmlproc/xmlproc.pyR5gs*         !c Csw|jdƒr't|jtƒƒ}n@yt|jtƒƒ}Wn$tk rf|jdƒd}nX|jdƒs‰|jddƒn|dkr™dS|dkpŅ|dkpŅ|dkpŅ|d koŅ|d ks8|d kr%t r|d kr|j j t |ƒd d ƒq5|jd|ƒqs|jd|ƒn;|j gkrW|jdƒn|j j t |ƒd d ƒdS(sParses a character reference.txiÓ RVi½ Ni i i i i’iiiiķiŹ iŌ (R-tunhext get_matchtreg_hex_digitstintt reg_digitst ValueErrorRR t using_unicodeRRqtxml_chrR(R tdigs((sM/opt/freeware/lib/python2.7/site-packages/_xmlplus/parsers/xmlproc/xmlproc.pyR3†s*    $ cCs[|jdƒ}|jgkr.|jdƒn|jj|j|j|ƒ|d|_dS(s9Parses a CDATA marked section from after the 'iÕ iN(t get_indexRRRRqR*R'(R tnew_pos((sM/opt/freeware/lib/python2.7/site-packages/_xmlplus/parsers/xmlproc/xmlproc.pyR0¢s cCsŹ|jƒ}|jdƒs.|jddƒny|jj|ƒ}Wn"tk rh|jd|ƒdSX|j|jkrŒ|jdƒdS|jj|jƒ|j gkr¾|jdƒnt |j ƒ}|j ƒr;|j |j ƒ|j|ƒy|jƒWntk r#|jdƒnX|jƒ|jƒn\|jdkrZ|jdƒn=d |_|j|jj|jƒ|jƒƒ|ƒd |_|t |j ƒkr¼|jd ƒn|jd =dS( s5Parses a general entity reference from after the '&'.RVi½ iĶ NiĖ iÖ i¹ i× iiiā i’’’’(RCR-RRR]RGRNR\RLRRkR^R_R`RaR;R8tflushRctnotationR Rt open_entityRtresolve_entity_pubidt get_pubidt get_sysid(R RNRt stack_size((sM/opt/freeware/lib/python2.7/site-packages/_xmlplus/parsers/xmlproc/xmlproc.pyR4ŖsB          cCsß|jr|jdƒn|jr2|jdƒn|jdƒ|jƒ}|jdƒ|jƒ\}}|jƒ|jj|||ƒ|jj ƒ|j dƒr³|j ƒn"|j dƒsÕ|jddƒn|d ksķ|d kr |j ƒ r&tj|ƒddkr&|jd |ƒn|jr |jdƒ}z>|jj||ƒ}d|_|jt|j ƒ|ƒƒWd |jƒ|jj|ƒXq n|d krø|d ksĀ|j rŅ|jjƒnd|_d S( s%Parses the document type declaration.iŲ iŁ it[R%i½ iRBičN(RRRRDRCtparse_external_idRthandle_doctypeRt dtd_startR-tparse_internal_dtdR R`turlparseRt_setup_dtd_parserRtresolve_doctype_pubidtdtd_start_calledtparse_resourcet join_sysidsR RR tdtd_end(R trootnametpub_idtsys_idtp((sM/opt/freeware/lib/python2.7/site-packages/_xmlplus/parsers/xmlproc/xmlproc.pyR1Śs@             cCsE|jƒ|jƒ|j}|j}d}xō|jtƒ|jdƒr[|jdƒq/|jdƒrz|jdƒq/|jdƒr™|jdƒq/|jdƒrø|jdƒq/|jdƒr×|jd ƒq/|jd ƒr/|j}|j ƒ|jd ƒr |j|d }Pq q/q/|j |||j ƒ| ƒd S(s&Parse the internal DTD beyond the '['.is"RUssst]R%iN( tset_start_pointt update_postlinet last_breakRYt reg_int_dtdR-R2R'RDthandle_internal_dtdt get_region(R R›tlbtlast_part_sizeR—((sM/opt/freeware/lib/python2.7/site-packages/_xmlplus/parsers/xmlproc/xmlproc.pyRŒ s0        cCs›zy|jdƒ}yE||_||_|j|jƒƒd|_|j|ddƒWntk rw|jdƒnXWd|j ƒ|j j |ƒXdS(sHandles the internal DTD.itdecodediŚ N( RŽR›Rœt set_sysidR`R7tfeedR8RR RR (R t doctype_linet doctype_lbtint_dtdR—((sM/opt/freeware/lib/python2.7/site-packages/_xmlplus/parsers/xmlproc/xmlproc.pyRž%s     cCsÆtƒ}|j|jƒ|j|jƒ|j|jƒ|j|jƒ|j |j ƒ|j |jƒ|j dkrŽ|jj|j ƒn|j|ƒ|jj|ƒ|S(N(t DTDParsertset_error_handlerRtset_dtd_consumerRtset_error_languageterr_langtset_inputsource_factorytisftset_pubid_resolverRtset_dtd_objectR R Rt set_internalR (R tinternal_subsetR—((sM/opt/freeware/lib/python2.7/site-packages/_xmlplus/parsers/xmlproc/xmlproc.pyRŽ6s  cCs|jS(s>Returns the internal element stack. Note: this is a live list!(R(R ((sM/opt/freeware/lib/python2.7/site-packages/_xmlplus/parsers/xmlproc/xmlproc.pytget_elem_stackFscCs|jS(s Returns the current data buffer.(R*(R ((sM/opt/freeware/lib/python2.7/site-packages/_xmlplus/parsers/xmlproc/xmlproc.pytget_data_bufferJscCs|jS(sPReturns the start position of the current construct (tag, comment, etc).(R)(R ((sM/opt/freeware/lib/python2.7/site-packages/_xmlplus/parsers/xmlproc/xmlproc.pytget_construct_startNscCs|jS(sNReturns the end position of the current construct (tag, comment, etc).(R'(R ((sM/opt/freeware/lib/python2.7/site-packages/_xmlplus/parsers/xmlproc/xmlproc.pytget_construct_endSscCs|j|j|j!S(s.Returns the raw form of the current construct.(R*R)R'(R ((sM/opt/freeware/lib/python2.7/site-packages/_xmlplus/parsers/xmlproc/xmlproc.pytget_raw_constructXscCstd„|jƒS(ssReturns a snapshot of the entity stack. A list of the system identifier of the entity and its name, if any.cSs|d|dfS(Nii ((R((sM/opt/freeware/lib/python2.7/site-packages/_xmlplus/parsers/xmlproc/xmlproc.pyt_s(tmapR>(R ((sM/opt/freeware/lib/python2.7/site-packages/_xmlplus/parsers/xmlproc/xmlproc.pytget_current_ent_stack\sN(!t__name__t __module__t__doc__RRRRRR RRR R;R=R@R,RIRbR+R5R3R0R4R1RŒRžRŽR³R“RµR¶R·Rŗ(((sM/opt/freeware/lib/python2.7/site-packages/_xmlplus/parsers/xmlproc/xmlproc.pyRs<       2  ; C :     0 0        (R½RhtstringtsysRt translatetstring_translatetfindRmt dtdparsertxmlutilstxmlapptxmldtdtversiontrevisiontXMLCommonParserR(((sM/opt/freeware/lib/python2.7/site-packages/_xmlplus/parsers/xmlproc/xmlproc.pyts0