1#!/usr/bin/env python 2 3__author__ = "chrysn <chrysn@fsfe.org>" 4__copyright__ = "Copyright 2007, chrysn" 5__license__ = "GPL" 6 7import sys 8import csv 9 10import stfl 11 12class CSV(object): 13 def __init__(self,file,delimiter): 14 self.file=file 15 self.delimiter=delimiter 16 17 self.data=[l for l in csv.reader(open(self.file),delimiter=self.delimiter)] 18 maxlen=max([len(l) for l in self.data]) 19 for l in self.data: 20 while len(l)<maxlen: l.append("") 21 22 @staticmethod 23 def cellname(row,col): return "cell_%d_%d"%(row,col) 24 @staticmethod 25 def valuename(row,col): return "value_%d_%d"%(row,col) 26 @staticmethod 27 def namecell(name): 28 tag,row,col=name.split('_') 29 assert tag=='cell' 30 row,col=int(row),int(col) 31 return row,col 32 33 def stfltable(self): 34 return "{table .expand:1 %s}"%"{tablebr}".join([ 35 " ".join([ 36 "{input[%s] text[%s]:%s style_focus:bg=blue}"%(self.cellname(row,col),self.valuename(row,col),stfl.quote(x)) 37 for col,x in zip(range(len(l)),l) 38 ]) 39 for row,l in zip(range(len(self.data)),self.data) 40 ]) 41 42 def updatefromstfl(self, f): 43 for row in range(len(self.data)): 44 for col in range(len(self.data[row])): 45 self.data[row][col]=f.get(self.valuename(row,col)) 46 47 48 def save(self): 49 w=csv.writer(open(self.file,'w'),delimiter=self.delimiter) 50 w.writerows(self.data) 51 52 53if __name__=="__main__": 54 if len(sys.argv) not in [2,3]: 55 print "Usage: %s file.csv [delimiter]"%sys.argv[0] 56 sys.exit(1) 57 58 c=CSV(sys.argv[1], len(sys.argv)==3 and sys.argv[2] or ",") 59 60 table=c.stfltable() 61 62 form="{vbox %s {label} {hbox .expand:0 @style_normal:attr=reverse {label text[statusbar]:}{label text[help]: .tie:r}}"%table 63 64 f=stfl.create(form) 65 66 def setstatus(text): 67 f.set('statusbar',text) 68 def sethelp(text): 69 f.set('help',text) 70 def currentcell(): 71 return c.namecell(f.get_focus()) 72 def setcell(row,col): 73 f.set_focus(c.cellname(row,col)) 74 75 setstatus("editing %s"%c.file) 76 sethelp("^W = write, ^C = exit") 77 78 while True: 79 try: 80 e=f.run(0) 81 except KeyboardInterrupt: 82 e='^C' # other possible reasons? 83 row,col=currentcell() 84 setstatus("editing %s, row %d, col %d"%(c.file,row,col)) 85 if e=="ENTER": 86 row=row+1 87 setcell(row,col) 88 elif e=='^C': 89 break; 90 elif e=='^W': 91 c.updatefromstfl(f) 92 c.save() 93 setstatus("saved to %s"%c.file) 94