Diff for /ECHO_content/vlp_xmlhelpers.py between versions 1.3 and 1.18

version 1.3, 2004/10/05 17:29:41 version 1.18, 2010/10/11 13:14:59
Line 1 Line 1
 from sys import argv  from sys import argv
   
 import string  import string
   import logging
 import xml.dom.minidom  import xml.dom.minidom
 import Ft.Xml.XLink.Processor  import Ft.Xml.XLink.Processor
 import Ft.Xml.XLink.XLinkElements  import Ft.Xml.XLink.XLinkElements
Line 9  from Ft.Xml import XPath Line 10  from Ft.Xml import XPath
 from Ft.Xml.XPath import Evaluate  from Ft.Xml.XPath import Evaluate
 from Ft.Xml.XLink import XLINK_NAMESPACE  from Ft.Xml.XLink import XLINK_NAMESPACE
 from Ft.Xml.XLink import XLinkElements  from Ft.Xml.XLink import XLinkElements
   import cStringIO
 #from Ft.Xml.Domlette import NonvalidatingReader,InputSource  from Ft.Xml.Domlette import NonvalidatingReader, PrettyPrint,Print
 #from Ft.Xml import EMPTY_NAMESPACE  from Ft.Xml import EMPTY_NAMESPACE
 from Ft.Lib import Uri  from Ft.Lib import Uri
 import urllib  import urllib
 import re  import re
   from ECHO_collection import unicodify,utf8ify
   
   patternTXT=r"<\s*txt.*?>(.*?)</txt>"
   regexpTXT = re.compile(patternTXT, re.IGNORECASE + re.DOTALL)
 patternPage=r"<\s*page.*?>(.*?)</page>"  patternPage=r"<\s*page.*?>(.*?)</page>"
 regexpPage = re.compile(patternPage, re.IGNORECASE + re.DOTALL)  regexpPage = re.compile(patternPage, re.IGNORECASE + re.DOTALL)
   
 xml2htmlArray={'WEB_normal':('<p>','</p>'),'Normal':('<p>','</p>'),'WEB_picture':('<p class=\"picture\">','</p>'),'WEB_figuretitle':('<p class=\"picturetitle\">','</p>'),'WEB_bibliography':('<p><i>','</i></p>'),'Web_kursiv':('<i>','</i>'),'WEB_kursiv':('<i>','</i>'),'WEB_hyperlink':('',''),'Hyperlink':('',''),'Picture':('<p class=\"picture\">','</p>'),'FigureTitle':('<p class=\"picturetitle\">','</p>')}  #xml2htmlArray={'WEB_normal':('<p>','</p>'),'Normal':('<p>','</p>'),'WEB_picture':('<p class=\"picture\">','</p>'),'WEB_figuretitle':('<p class=\"picturetitle\">','</p>'),'WEB_bibliography':('<p><i>','</i></p>'),'Web_kursiv':('<i>','</i>'),'WEB_kursiv':('<i>','</i>'),'WEB_hyperlink':('',''),'Hyperlink':('',''),'Picture':('<p class=\"picture\">','</p>'),'FigureTitle':('<p class=\"picturetitle\">','</p>')}
   #
 def addToDict(dict,name,value):  #def addToDict(dict,name,value):
     if name=="":  #    if name=="":
         return 0  #        return 0
     else:  #    else:
   #        
   #        if not dict.has_key(name):
   #            dict[name]=[] # als array anlegen
   #
   #        dict[name].append(value)
   #        return 1    
   #
   #def proj2hash(self,xmlstring):
   #    """wandelt xml-files fuer die projekte in ein hash"""
   #    
   #    dom=xml.dom.minidom.parseString(xmlstring)
   #    
   #        
   #    list={}
   #
   #    #gettitle
   #    pars=Evaluate('par',dom.getElementsByTagName('part')[0])
   #    for par in pars:
   #        className=par.getAttribute('class')
   #        content=getText(self,par.childNodes)
   #        addToDict(list,className,content)
   #             
   #
   #    sectionXPath="section"
   #
   #    
   #    sections=Evaluate(sectionXPath,dom.getElementsByTagName('part')[0])
   #    
   #    while sections:
   #        
   #        for section in sections:
   #            
   #            sec=parseSection(self,section)
   #            
   #            if sec[0]=="WEB_project_header": # Sonderfall project
   #                addToDict(list,'WEB_project_header',sec[1]) # store title
   #                addToDict(list,'WEB_project_description',sec[2]) #store description
   #            else: # no information in heading
   #                level=int(sec[3])+2
   #                aTag="<h%i>"%level
   #                eTag="</h%i>"%level
   #                addToDict(list,"text",aTag+sec[1]+eTag)
   #                addToDict(list,"text",sec[2])
   #        sectionXPath+="/section"
   #        sections=Evaluate(sectionXPath,dom.getElementsByTagName('part')[0])
   #    return list
   #
   #
   #def parseSection(self,section):
   #    type=""
   #    header=""
   #    level=section.getAttribute('level')
   #    for heading in section.childNodes:
   #        if getattr(heading,'tagName','')=="heading":
   #            
   #            type=heading.getAttribute('class')
   #            header=getText(self,heading.childNodes)
   #
   #    if type=="": # falls heading fehlt, pruefe ob erster par richtig
   #        par=section.getElementsByTagName('par')[0]
   #        type=par.getAttribute('class')
   #        header=getText(par.childNodes)
   #
   #    #print section.childNodes
   #    #pars=Evaluate('par',section)
   #    pars=section.childNodes
   #    content=par2html(self,pars)
   #    #print "CONTENT",repr(content)
   #    return (type,header,content,level)
   #
   #def parseTable(table):
   #    fields={}
   #    rows=table.getElementsByTagName('html:tr')
   #    for row in rows:
   #        #print "ROW"
   #        cols=row.getElementsByTagName('html:td')
   #        
   #        #Name des Datenfeldes einlesen
   #        try:
   #            field=cols[0].getElementsByTagName('par')[0].getAttribute('class')
   #            #print "field",field
   #        except:
   #            print "error"
   #            field=""
   #
   #        #Wandeln der Eintrge in HTML
   #
   #        #pars=cols[1].getElementsByTagName('par')
   #        pars=cols[1].childNodes
   #        
   #        html=par2html(self,pars,tags=("",";"))
   #        
   #        addToDict(fields,field,html)
   #        #print fields
   #    return fields
   #
   #def par2html(self,pars,tags=None):
   #    html=""
   #
   #    for par in pars:
   #        tagName=getattr(par,'tagName','')
   #        if tagName in ["par","inline"]:
   #            #print repr(par.getAttribute('class')),xml2htmlArray.get(par.getAttribute('class'),'NOT FOUND')
   #            #print "par",par
   #            if not tags:
   #                try:
   #                    tag=xml2htmlArray[par.getAttribute('class')]
   #                except:
   #                    tag=('<p>','</p>')
   #            else:
   #                tag=tags
   #            #print "TAG",tag
   #            content=getText(self,par.childNodes,par.getAttribute('class'))
   #            
   #            
   #
   #            #print par.getAttribute('class'),node
   #            try:
   #                html+=tag[0]+content+tag[1]
   #            except:
   #                html=+tag[0]+content+tag[1]
   #            
   #        elif tagName=="pb":
   #            html+="<pb/>"
   #        
   #    
   #    try:
   #
   #        return html
   #    except:
   #        return ""
                   
         if not dict.has_key(name):  def getXlink(nodes):
             dict[name]=[] # als array anlegen      """searches xlinks and gives them back as html"""
       ret=""
       for node in nodes:
           if node.attributes:
               if 'xlink:type' in node.attributes.keys(): #is a xlink?
                   ret +=xlink2html(node)
       return ret
   
         dict[name].append(value)  def checkRef(self,ref):
         return 1              """teste ob reference angezeigt werden sollen"""
           dbs={'vl_literature':'AND online = \'1\'',
                'vl_technology':'AND complete =\'yes\'',
                'vl_people':'AND complete =\'yes\'',
                'vl_sites':'AND complete =\'yes\'',
                'vl_transcript':'AND complete =\'yes\'',
                'vl_essays':'AND online =\'yes\'',
            'vl_categories':''
                }
           res=None
           for db in dbs.keys():
               searchStr=str("select reference from %s where reference =\'%s\' %s"%(db,ref,dbs[db]))
               res=res or self.search(var=searchStr)
           return res
   
 def proj2hash(self,xmlstring):  def link2html(self,str):
     """wandelt xml-files fuer die projekte in ein hash"""          """link2html links in html wandeln"""
           if str:
           
     dom=xml.dom.minidom.parseString(xmlstring)              str=re.sub("\&","&amp;",str)
               dom=xml.dom.minidom.parseString("<?xml version='1.0' encoding='utf-8'?><txt>"+utf8ify(str)+"</txt>")
           
                   
     list={}              links=dom.getElementsByTagName("link")
   
     #gettitle  
     pars=Evaluate('par',dom.getElementsByTagName('part')[0])  
     for par in pars:  
         className=par.getAttribute('class')  
         content=getText(self,par.childNodes)  
         addToDict(list,className,content)  
                             
               for link in links:
                   link.tagName="a"
                   ref=link.getAttribute("ref")
                   pn=link.getAttribute("page")
                   mk=link.getAttribute("mk")
                   href= link.getAttribute("href")
                   if href:
                       link.setAttribute("class","external")
   
     sectionXPath="section"                  if self.checkRef(ref):
                       more = ""
                       if pn:
                           more += "&page=%s"%pn
   
                       if mk:
                           more += "&mk=%s"%mk
           
     sections=Evaluate(sectionXPath,dom.getElementsByTagName('part')[0])                      link.setAttribute("href",self.REQUEST['SERVER_URL']+"/references?id="+ref+more)
           
     while sections:  
                   
         for section in sections:              newxml=dom.toxml('utf-8')
                           
             sec=parseSection(self,section)  
                           
             if sec[0]=="WEB_project_header": # Sonderfall project  
                 addToDict(list,'WEB_project_header',sec[1]) # store title  
                 addToDict(list,'WEB_project_description',sec[2]) #store description  
             else: # no information in heading  
                 level=int(sec[3])+2  
                 aTag="<h%i>"%level  
                 eTag="</h%i>"%level  
                 addToDict(list,"text",aTag+sec[1]+eTag)  
                 addToDict(list,"text",sec[2])  
         sectionXPath+="/section"  
         sections=Evaluate(sectionXPath,dom.getElementsByTagName('part')[0])  
     return list  
   
               retStr=regexpTXT.search(newxml)
               retStr = retStr.group(1)
   
 def parseSection(self,section):              return retStr.decode('utf-8') # we return unicode
     type=""  
     header=""  
     level=section.getAttribute('level')  
     for heading in section.childNodes:  
         if getattr(heading,'tagName','')=="heading":  
                           
             type=heading.getAttribute('class')          return u""
             header=getText(self,heading.childNodes)  
   
     if type=="": # falls heading fehlt, pruefe ob erster par richtig  def related2html(self,str):
         par=section.getElementsByTagName('par')[0]      """related library items: xlinks in html wandeln / mb 22.11.2006"""
         type=par.getAttribute('class')      if str:
         header=getText(par.childNodes)  
   
     #print section.childNodes          str=re.sub("\&","&amp;",str)
     #pars=Evaluate('par',section)          dom=xml.dom.minidom.parseString("<?xml version='1.0' encoding='utf-8'?><txt>"+utf8ify(str)+"</txt>")
     pars=section.childNodes          links=dom.getElementsByTagName("link")
     content=par2html(self,pars)  
     #print "CONTENT",repr(content)  
     return (type,header,content,level)  
   
 def parseTable(table):          for link in links:
     fields={}              link.tagName = "a"
     rows=table.getElementsByTagName('html:tr')              ref = link.getAttribute("ref")
     for row in rows:              pn = link.getAttribute("page")
         #print "ROW"              obj = ref[0:3]
         cols=row.getElementsByTagName('html:td')  
                   
         #Name des Datenfeldes einlesen              """erweiterung der related items von literatur auf weitere datenbankobjekte, mb 09.06.2009"""
         try:              searchStr = ''
             field=cols[0].getElementsByTagName('par')[0].getAttribute('class')              if obj == 'lit':            
             #print "field",field                  searchStr="select fullreference, online from vl_literature where reference =\'%s\' and authorized = 1"%(ref)
         except:              elif obj == 'sit':
             print "error"                  searchStr="select reference from vl_sites where reference =\'%s\' and complete = 'yes'"%(ref)
             field=""              elif obj == 'per':
                   searchStr="select reference from vl_people where reference =\'%s\' and complete = 'yes'"%(ref)
               elif obj == 'tec':
                   searchStr="select reference from vl_technology where reference =\'%s\' and complete = 'yes'"%(ref)
               elif obj == 'exp':
                   searchStr="select reference from vl_experiments where reference =\'%s\' and complete = 'yes'"%(ref)
                   
               res = self.search(var=searchStr)
                                           
               if res:
                   if obj == 'lit':
                       if res[0]['online'] == 1: 
                           # literatur item online verfuegbar
                           if pn:
                               link.setAttribute("href",self.REQUEST['SERVER_URL']+"/references?id="+ref+"&page="+pn)
                           else:
                               link.setAttribute("href",self.REQUEST['SERVER_URL']+"/references?id="+ref)
   
         #Wandeln der Eintrge in HTML                          link.setAttribute("title", "click to view!")
                           link.removeAttribute("ref")
   
         #pars=cols[1].getElementsByTagName('par')                          # prefix preceding the link
         pars=cols[1].childNodes                          prefix = dom.createTextNode(U"\u2013\u0020") # = ndash + space
                           dom.documentElement.insertBefore(prefix, link)
                   
         html=par2html(self,pars,tags=("",";"))                      else:
                           # literatur item nur als bibliographische angabe vorhanden
                           link.setAttribute("alt", unicodify(res[0]['fullreference']))
                           link.setAttribute("title", "click to expand")
                           link.setAttribute("onclick", "return toggle(this);")
                           link.setAttribute("class", "x_offline")
                   
         addToDict(fields,field,html)                          # prefix inside link text
         #print fields                          link.firstChild.data = '+ ' + link.firstChild.data
     return fields                  else:
                       # links zu den anderen datenbankobjekten
                       link.setAttribute("href",self.REQUEST['SERVER_URL']+"/references?id="+ref)
                       link.setAttribute("title", "click to view")
                       link.removeAttribute("ref")
               
                       # prefix preceding the link
                       prefix = dom.createTextNode(U"\u2013\u0020") # = ndash + space
                       dom.documentElement.insertBefore(prefix, link)
   
 def par2html(self,pars,tags=None):              else:
     html=""                  # objekt nicht verfuegbar/freigegeben oder (web)link mit href statt ref
   
     for par in pars:  
         tagName=getattr(par,'tagName','')  
         if tagName in ["par","inline"]:  
             #print repr(par.getAttribute('class')),xml2htmlArray.get(par.getAttribute('class'),'NOT FOUND')  
             #print "par",par  
             if not tags:  
                 try:                  try:
                     tag=xml2htmlArray[par.getAttribute('class')]                      link.removeAttribute("ref")
                       link.setAttribute("title", ref)
                 except:                  except:
                     tag=('<p>','</p>')                      pass
             else:  
                 tag=tags  
             #print "TAG",tag  
             content=getText(self,par.childNodes,par.getAttribute('class'))  
                           
                           
                   # prefix preceding the link
                   prefix = dom.createTextNode(U"\u2013\u0020") # = ndash + space
                   dom.documentElement.insertBefore(prefix, link)
   
             #print par.getAttribute('class'),node  
             try:  
                 html+=tag[0]+content+tag[1]  
             except:  
                 html=+tag[0]+content+tag[1]  
                           
         elif tagName=="pb":          newxml=dom.toxml('utf-8')
             html+="<pb/>"  
         elif tagName=="img":  
             html+="XXX"  
           
     try:          retStr=regexpTXT.search(newxml)
           retStr = retStr.group(1)
           #logging.debug("related2html out=%s"%repr(retStr))
           return retStr.decode('utf-8') # we return unicode
   
         return html      return u""
     except:  
         return ""  
   
 def getXlink(nodes):  
     """searches xlinks and gives them back as html"""  
     ret=""  
     for node in nodes:  
         if node.attributes:  
             if 'xlink:type' in node.attributes.keys(): #is a xlink?  
                 ret +=xlink2html(node)  
     return ret  
   
 def checkRef(self,ref):  
         dbs={'vl_literature':'AND CD LIKE \'%lise%\'','vl_technology':'','vl_people':'','vl_sites':''}  
         res=None  
         for db in dbs.keys():  
   
             res=res or self.search(var=str("select reference from %s where reference =\'%s\' %s"%(db,ref,dbs[db])))  
         return res  
   
 def xml2html(self,str,quote="yes"):  def xml2html(self,str,quote="yes"):
         """link2html fuer VLP muss hier noch raus"""          """link2html fuer VLP muss hier noch raus"""
       
           
         if str:          if str:
             if quote=="yes2":              if quote=="yes2":
                 str=re.sub("\&","&amp;",str)                  str=re.sub("\&","&amp;",str)
               #dom=xml.dom.minidom.parseString(str)
               logging.debug(str)
               dom = NonvalidatingReader.parseString(str,"http://www.mpiwg-berlin.mpg.de/")
               #links=dom.getElementsByTagName("link")
               links=Ft.Xml.XPath.Evaluate(".//link", contextNode=dom)
               for link in links:
                   #link.tagName="a"
           
                   ref=link.getAttributeNS(EMPTY_NAMESPACE,"ref")
                   pn=link.getAttributeNS(EMPTY_NAMESPACE,"page")
   
                   cns=link.childNodes[0:]
                   
                   newLink=dom.createElementNS(EMPTY_NAMESPACE,"a")
                   for x in cns:
                           newLink.appendChild(x)
                           
             str=re.sub("ref\=([^>]*)\>",'ref=\"\g<1>\">',str)# einfuegen anfuehrungszeichen um ref attribut, falls fehlt.  
             #str=re.sub("ref\=([.[*^[>]]])",'XX',str)  
             #print "STR::",str  
             dom=xml.dom.minidom.parseString(str)  
             links=dom.getElementsByTagName("link")  
                           
             for link in links:  
                 link.tagName="a"  
                 ref=link.getAttribute("ref")  
         pn=link.getAttribute("page")  
   
                 if checkRef(self,ref):                  link.parentNode.replaceChild(newLink,link)
   
                   if self.checkRef(ref):
             if pn:              if pn:
                 link.setAttribute("href",self.aq_parent.absolute_url()+"/vlp_coll?id="+ref+"&p="+pn)                                  newLink.setAttributeNS(EMPTY_NAMESPACE,"href",self.REQUEST['SERVER_URL']+"/references?id="+ref+"&page="+pn)
             else:              else:
                 link.setAttribute("href",self.aq_parent.absolute_url()+"/vlp_coll?id="+ref)                                  newLink.setAttributeNS(EMPTY_NAMESPACE,"href",self.REQUEST['SERVER_URL']+"/references?id="+ref)
   
             str= dom.toxml()  
                   
               #str= dom.toxml('utf-8')
               buf = cStringIO.StringIO()
               PrettyPrint(dom, stream=buf)
               str = buf.getvalue()
               buf.close()
               #str=PrettyPrint(dom.documentElement,encoding='UTF-8')
         #print link.toxml('utf-8')          #print link.toxml('utf-8')
               #print type(str)
         retStr=regexpPage.search(str)          retStr=regexpPage.search(str)
   
             try:              try: # hack warum fehtl manchmal page??
                 return retStr.group(1)                      return retStr.group(1).decode('utf-8')
             except:              except:
                 exStr="""<?xml version="1.0" ?>"""                      return str
                 str=re.sub("\n","",str)  
                 #str=  
                 #print repr(str)  
                 return str.replace(exStr,'')  
         return ""          return ""
           
       
 def xlink2html(self,xlink,parClass=None):  def xlink2html(self,xlink,parClass=None):
     ret=""      ret=""
     attributes=xlink.attributes      attributes=xlink.attributes

Removed from v.1.3  
changed lines
  Added in v.1.18


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>