Advertisement
s243a

PT Bookmark Parser2

Dec 7th, 2018
240
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.79 KB | None | 0 0
  1. import sgmllib, urllib, urlparse, os, pickle, md5
  2. class HTML_Link:
  3.     def __init__(self,**kw):
  4.         self.text=kw.get("text"," ")
  5.         self.href=kw.get("href",'/')
  6.         self.add_date=kw.get("add_date",'0')
  7.         self.linkType=kw.get("linkType",None)
  8.  
  9.     def toHTML(self):
  10.        
  11.         if self.linkType is None:
  12.             str='<A HREF="'+self.href+'" ADD_DATE="'+self.add_date+'">'+self.text+"</A>"
  13.             return str
  14.         elif self.linkType.upper()=="FOLDER":
  15.             str='<A HREF="'+self.href+'">'+self.text+"</A>"          
  16.             return '<b>Folder:</b>'+str
  17. class Section:
  18.     def __init__(self,text):
  19.         self.text=text
  20.     def toHTML(self):
  21.         return "<H3>"+self.text+"</H3>"
  22. class SimpePathWatcher:
  23.     __init__(self,root):
  24.         self.root=root
  25.         self.bname=None
  26.     def On_Header(self,bname)
  27.         self.bname=bname
  28.     def On_Enter(self):
  29.         pass
  30.     def On_Exit(self):
  31.         pass
  32. class EncodedPathWatcher(SimplePathWatcher):
  33.     __init__(self,root,**kw):
  34.         super(SimplePathWatcher,self).__init__(root)                
  35.         self.items=[]
  36.         self.sep=kw.get('seperator','/')
  37.         self.writePath,self.fname=kw.get('writePath',(False,encodepath.txt))
  38.         self.encoder=kw.get('encoder',self.defaultEncoder)
  39.         self.symLastCB=kw.get('symLast',defualtSymLast)
  40.         self.SymLastWhen=kw.get('SymLastWhen','SOMETIMES')
  41.         self.MAX_PATH_LEN=kw.get('MAX_PATH_LEN',200)#typically is is 255 for the maxium path length in linux but we want to leave some room for the filename.
  42.         self.MAX_NESTING=KW.GET('MAX_NESTING',0) #0 Means no limit on the amount of nexted directories.
  43.         self.hashFn=
  44.     def On_Enter(self):
  45.         dirname = self.encode(self.bname)#Self.bname is from superclass (i.e. SimplePathWatcher)
  46.         #dirname2= urllib.quote(dirname, safe='') #Maybe use this if we want to write links
  47.  
  48.         if self.item.len()=0:
  49.             m=md5.new()
  50.             pathLen=0
  51.             nesting=0
  52.         else
  53.             last=self.items[-1]
  54.             pathLen=last.pathLen
  55.             nesting=last.nesting+1
  56.             m.last.md4.copy()
  57.         m.update(self.bname)        
  58.         if (nesting<=self.MAX_NESTING or self.MAX_NESTING==0) and \
  59.            (pathlen<=self.MAX_PATH_LEN):
  60.             if self.item.len()==0:
  61.                 fullpath=self.root+sep+dirname
  62.             else:      
  63.                 fullpath=last.full+self.sep+dirname
  64.             self.items.append({'bname':dirname,
  65.                                'full':fullpath,
  66.                                'nesting':last.nesting+1,
  67.                                'pathLen':fullpath.len()
  68.                                'md5':m)
  69.         else
  70.             (dirname2,newdir)=mkLinks(last,dirname,m)
  71.             self.items.append({'bname':dirname2,
  72.                                'full':newdir,
  73.                                'nesting':last.nesting+1,
  74.                                'pathLen':fullpath.len()
  75.                                'md5':m})          
  76.     def mkLinks(self,last,dirname,m)
  77.            dig=m.digest()
  78.            dig2=base64.b64encode(s,'~-') #Alt chacters are tilda and dash like in freenet: https://github.com/freenet/wiki/wiki/Signed-Subspace-Key
  79.            self.mkLinks(last.full,dig,dirname)
  80.            dirname2=dirname+"-md5"+dig2
  81.            newdir=self.root+self.sep+dirname2
  82.            if not os.path.exists(newdir):
  83.              print("Making directory "+self.wd)
  84.              os.makedirs(newdir)
  85.            os.symlink(last.full,newdir)
  86.            os.symlink(newdir,last.full+self.sep+dirname)
  87.            return dirname2,newdir)        
  88.     def On_Exit(self):
  89.         self.items.pop()
  90.     def encode(self,bname):
  91.         return self.encoder(self.bname,self)
  92.     def defaultEncoder(self,bname):
  93.         return urllib.quote(self.bname, safe='')
  94.     def defaultSymLast(
  95. class BookMarkParser(sgmllib.SGMLParser):
  96.     def __init__(self,**kw):
  97.         sgmllib.SGMLParser.__init__(self)
  98.         self.STATE="__init__"
  99.         self.DL=[]
  100.         self.items=[]
  101.         self.wd=kw.get('wd','/root/Downloads/pt')
  102.         if not os.path.exists(self.wd):
  103.             print("Making directory "+self.wd)
  104.             os.makedirs(self.wd)
  105.     def writeHTMLHeader(self,f):
  106.         print('WriteHTMLHeader')
  107.         f.write("%s\n" % '<!DOCTYPE html>')
  108.         f.write("%s\n" % '<html>')
  109.         f.write("%s\n" % '<body>')
  110.     def writeHTMLFooter(self,f):
  111.         print('writeHTMLFooter')
  112.         f.write("%s\n" % '</body>')        
  113.         f.write("%s\n" % '</html>')  
  114.     def writeList(self):
  115.         print('writeList')
  116.         with open('index.html', 'w') as f:
  117.             self.writeHTMLHeader(f)
  118.             for item in self.items:
  119.                 if item is not None:
  120.                     f.write("%s\n" % item.toHTML())
  121.                 else:
  122.                     f.write("<b>Empty Item!!!!</b>")
  123.                
  124.             self.writeHTMLFooter(f)
  125.     def storeList(self):
  126.         print('storeList')
  127.         os.chdir(self.wd)
  128.         print(os.getcwd())
  129.         self.wd=os.getcwd()
  130.         pickle.dump(self.items,open( "list.p", "wb" ))
  131.     def loadList(self):
  132.         print('loadList')
  133.         os.chdir(self.wd)
  134.         print(self.wd)
  135.         print(os.getcwd())
  136.         self.items=pickle.load(open( "list.p", "rb" ))
  137.     def start_h3(self, attributes):
  138.         print('start_H3')
  139.         self.STATE='Started H3'
  140.         for name, value in attributes:
  141.             print(name+"="+value)
  142.             if (value == 'FOLDED') or (name == 'folded'):
  143.                 self.STATE='FOLDED'
  144.     def handle_data(self,data):
  145.         print('handleData')
  146.         print("self.STATE="+self.STATE)
  147.         if self.STATE=='FOLDED':
  148.             #dirname = urllib.quote(data, safe='')
  149.             #dirname2= urllib.quote(dirname, safe='')
  150.             self.NotifyHeaderWatchers(data)
  151.             self.items.append(HTML_Link(href=dirname2+"/index.html",linkType='FOLDER',text=data))
  152.             self.storeList()
  153.             self.wd=os.path.join(self.wd,dirname)
  154.             print("self.wd="+self.wd)
  155.             #https://stackoverflow.com/questions/273192/how-can-i-safely-create-a-nested-directory-in-python
  156.             if not os.path.exists(self.wd):
  157.                 print("Making directory "+self.wd)
  158.                 os.makedirs(self.wd)
  159.             print("Entering:" + str(self.wd))
  160.             self.STATE="Seeking DL"
  161.  
  162.         if self.STATE=="A":
  163.            
  164.             self.A.text=data
  165.         if self.STATE=="DD":
  166.             self.items.append(Section(data.split('\n')[0]))
  167.     def end_h3(self): #Probably redundant
  168.         print('end_H3')
  169.         self.FOLDED=False        
  170.     def start_dl(self, atributes):
  171.         print('start_DL')
  172.         self.items=[]
  173.         print(self.DL)
  174.         print(self.wd)
  175.         self.DL.append(os.path.basename(self.wd)) #Maybe append the full path here instead of the basename
  176.     def end_dl(self):
  177.         print('end_DL')
  178.         self.writeList()
  179.         self.DL.pop
  180.         self.wd=os.path.join(self.wd,"..")
  181.         self.loadList()
  182.        
  183.     def start_a(self,atributes):
  184.         print('start_A')
  185.         self.A=HTML_Link()
  186.         for key,value in atributes:
  187.            setattr(self.A,key,value)
  188.         self.STATE='A'
  189.     def end_a(self):
  190.         print('end_A')
  191.         self.items.append(self.A)
  192.         self.A=None
  193.         self.STATE='Ended A'
  194.     def do_dd(self, atributes):
  195.         print('do_DD')
  196.         self.STATE="DD"
  197.     def do_dt(self, atributes):
  198.         print('do_DT')
  199.         self.STATE="DT"
  200. p = BookMarkParser()
  201. filename='/root/Downloads/pearltrees_export.html'
  202. f = open(filename, "r")
  203. BUFSIZE = 8192
  204. while True:
  205.     #data = f.read(BUFSIZE)
  206.     data=f.readline()
  207.     print('data='+str(data))
  208.     if not data: break
  209.     p.feed(data)
  210. p.close(  )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement