381 lines
16 KiB
Python
381 lines
16 KiB
Python
#!/usr/bin/pythonw
|
|
# This file is part of JMRI.
|
|
#
|
|
# JMRI is free software; you can redistribute it and/or modify it under
|
|
# the terms of version 2 of the GNU General Public License as published
|
|
# by the Free Software Foundation. See the "COPYING" file for a copy
|
|
# of this license.
|
|
#
|
|
# JMRI is distributed in the hope that it will be useful, but WITHOUT
|
|
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
# for more details.
|
|
#
|
|
# Revision $Revision$
|
|
# by Simon Ginsburg (simon.ginsburg at bluewin.ch)
|
|
"""
|
|
This Python class represents the content of one single file for translation
|
|
It contains all keys individually and also all commentary text lines
|
|
It technically extends and replaces the earlier class "singlefile".
|
|
"""
|
|
|
|
from fileitem import fileitem
|
|
from Property_File_Error import Property_File_Error
|
|
from textmanager import textmanager
|
|
|
|
class singlefilestructure:
|
|
def __init__(self, tm, fullfilename, path, filename, corename, key, content):
|
|
"""
|
|
At initialisation the class will be filled basic naming information as well as the file content.
|
|
"""
|
|
self.fullfilename = fullfilename
|
|
self.path = path
|
|
self.filename = filename
|
|
self.corename = corename
|
|
self.key = key
|
|
self.version = []
|
|
self.numitems = 0
|
|
self.numkeys = 0
|
|
self.numMissing = 0
|
|
self.numNontrans = 0
|
|
self.numObsolete = 0
|
|
self.list = []
|
|
self.firstel = []
|
|
self.tm = tm
|
|
self.report = []
|
|
#self.Debugkey = 0
|
|
#if self.corename == "jmri-web-server-Html":
|
|
# self.Debugkey = 1
|
|
if not (content == []):
|
|
self.createstructure(content)
|
|
if self.version == []:
|
|
self.version = -1
|
|
|
|
def createstructure(self, content):
|
|
"""
|
|
This is the helper function to fill the file content into the class at initialisation time
|
|
"""
|
|
lineidx = 0
|
|
tempstr = []
|
|
tempkey = []
|
|
numlines = 1
|
|
tempprevel = []
|
|
#print self.filename
|
|
for lines in content:
|
|
lineidx = lineidx + 1
|
|
if not (len(lines.strip()) < 1):
|
|
# Exclude empty lines
|
|
if lines[0] is "#" or (lines[0] is "/" and lines[1] is "/"):
|
|
tempitem = fileitem(lineidx,1,'',lines,1)
|
|
self.list.append(tempitem)
|
|
self.numitems = self.numitems + 1
|
|
if self.version == []:
|
|
if lines.strip().endswith("$"):
|
|
self.version = self.tm.getversion(lines)
|
|
#if self.Debugkey:
|
|
# print str(str(lineidx) + ": " + "Textstring: " + lines)
|
|
else:
|
|
#errorflag = 0
|
|
if tempstr == []:
|
|
temp = lines.split("=",1)
|
|
if len(temp) == 1:
|
|
raise Property_File_Error(self.fullfilename, str(lineidx), temp[0])
|
|
else:
|
|
tempkey = temp[0].strip()
|
|
tempstr.append(temp[1].strip())
|
|
else:
|
|
tempstr.append(str(lines.strip()))
|
|
numlines = numlines + 1
|
|
#if self.Debugkey:
|
|
# print str(str(lineidx) + ": " + "Addon line " + str(numlines) + ": " + lines)
|
|
if not (lines.strip().endswith("\\")):
|
|
if numlines is 1:
|
|
tempitem = fileitem(lineidx,1,tempkey,tempstr[0],0)
|
|
#if self.Debugkey:
|
|
# print str(str(lineidx) + ": " + "Singleline Key: " + tempkey)
|
|
else:
|
|
tempitem = fileitem(lineidx + 1 - numlines,numlines,tempkey,tempstr,0)
|
|
#if self.Debugkey:
|
|
# print str(str(lineidx) + ": " + "Multiline Key: " + tempkey + str(numlines) + " lines")
|
|
self.list.append(tempitem)
|
|
self.numitems = self.numitems + 1
|
|
self.numkeys = self.numkeys + 1
|
|
tempstr = []
|
|
tempkey = []
|
|
numlines = 1
|
|
if not tempprevel == []:
|
|
tempprevel.nextitem = tempitem
|
|
tempitem.previtem = tempprevel
|
|
tempprevel = tempitem
|
|
else:
|
|
tempprevel = tempitem
|
|
self.firstel = tempitem
|
|
if numlines > 1:
|
|
raise Property_File_Error(self.fullfilename, str(lineidx + 1 - numlines), tempkey)
|
|
#if self.Debugkey:
|
|
# print str(str(lineidx) + ": " + str(numlines) + " Key: " + tempkey)
|
|
#if not self.tm.isvalidversion(self.version):
|
|
# print "Found Version string found in:"
|
|
# print self.fullfilename
|
|
# print self.version
|
|
|
|
def copystructure(self, firstel):
|
|
self.firstel = firstel
|
|
curritem = firstel
|
|
tempprevel = []
|
|
while not (curritem == []):
|
|
newitem = curritem.copy()
|
|
newitem.previtem = tempprevel
|
|
if not (tempprevel == []):
|
|
tempprevel.nextitem = newitem
|
|
tempprevel = newitem
|
|
curritem = curritem.nextitem
|
|
|
|
def copy(self):
|
|
newstruct = singlefilestructure(self.tm, self.fullfilename, self.path, self.filename, self.corename, self.key, [])
|
|
newstruct.copystructure(self.firstel)
|
|
newstruct.version = self.version
|
|
newstruct.numitems = self.numitems
|
|
newstruct.numkeys = self.numkeys
|
|
return newstruct
|
|
|
|
def iskey(self, seachstring):
|
|
return (seachstring == self.key)
|
|
|
|
def isname(self, seachstring):
|
|
return (seachstring.strip() == self.corename.strip())
|
|
|
|
def isitem(self, seachstring):
|
|
curritem = self.firstel
|
|
while not (curritem == []):
|
|
if curritem.iskey(seachstring):
|
|
return 1
|
|
curritem = curritem.nextitem
|
|
return 0
|
|
|
|
def getitem(self, seachstring):
|
|
curritem = self.firstel
|
|
while not (curritem == []):
|
|
if curritem.iskey(seachstring):
|
|
return curritem.getitem()
|
|
curritem = curritem.nextitem
|
|
return []
|
|
|
|
def setitem(self, seachstring, content, numlines):
|
|
curritem = self.firstel
|
|
while not (curritem == []):
|
|
if curritem.iskey(seachstring):
|
|
curritem.setitem(content, numlines)
|
|
curritem = curritem.nextitem
|
|
|
|
def creatitem(self, linenum, numlines, key, content, istext):
|
|
# Create new item
|
|
newitem = fileitem(linenum,numlines,key,content,istext)
|
|
# Insert as new first element?
|
|
if (self.firstel.getlinenum >= linenum + numlines):
|
|
newitem.nextitem = self.firstel
|
|
self.firstel = newitem
|
|
else:
|
|
# Insert in between
|
|
lastitem = []
|
|
curritem = self.firstel
|
|
found = 0
|
|
while not (curritem == [] or found):
|
|
# Check if ne item needs to be inserted before current item
|
|
if (curritem.getlinenum >= linenum):
|
|
newitem.nextitem = curritem
|
|
newitem.previtem = curritem.previtem
|
|
curritem.previtem.nextitem = newitem
|
|
curritem.previtem = newitem
|
|
found = 1
|
|
# Append
|
|
if (curritem.nextitem == []):
|
|
curritem.nextitem = newitem
|
|
newitem.previtem = curritem
|
|
curritem = curritem.nextitem
|
|
# Check if lines need to be shifted
|
|
curritem = self.firstel
|
|
lastline = 0
|
|
while not (curritem.nextitem == []):
|
|
if curritem.getlinenum <= lastline:
|
|
curritem.moveposition(self, lastline - curritem.getlinenum + 1)
|
|
lastline = curritem.getlinenum + curritem.numlines
|
|
curritem = curritem.nextitem
|
|
|
|
def addreport(self, report):
|
|
if self.report == []:
|
|
self.report = report
|
|
else:
|
|
if self.report.endswith("\n"):
|
|
self.report = str(self.report + report)
|
|
else:
|
|
self.report = str(self.report + "\n" + report)
|
|
|
|
def getreport(self):
|
|
return self.report
|
|
|
|
def write(self, filehandle):
|
|
intcnt = 1
|
|
elidx = 0
|
|
curritem = self.firstel
|
|
while not (curritem == []):
|
|
while intcnt < curritem.linenum:
|
|
filehandle.write(str("\n"))
|
|
# print "Add newline"
|
|
intcnt = intcnt + 1
|
|
curritem.write(filehandle)
|
|
intcnt = intcnt + curritem.numlines
|
|
curritem = curritem.nextitem
|
|
|
|
def compare(self, tm, origfile):
|
|
self.report = []
|
|
self.numMissing = 0
|
|
self.numNontrans = 0
|
|
self.numObsolete = 0
|
|
found = 0
|
|
self.addreport(str("Items in original File: " + str(origfile.numkeys)))
|
|
self.addreport(str("Revision of original File: " + str(origfile.version)))
|
|
self.addreport(str("Items in translated File: " + str(self.numkeys)))
|
|
self.addreport(str("Revision of translated File: " + str(self.version)))
|
|
currel = origfile.firstel
|
|
while not currel == []:
|
|
if not currel.isText:
|
|
tranel = self.getitem(currel.key)
|
|
if tranel == []:
|
|
if found == 0:
|
|
self.addreport("\nMissing Items:")
|
|
found = 1
|
|
self.addreport(str(str(currel.linenum).zfill(3) + ": " + str(currel.getcontent())))
|
|
self.numMissing += 1
|
|
currel = currel.nextitem
|
|
found = 0
|
|
currel = origfile.firstel
|
|
while not currel == []:
|
|
if not currel.isText:
|
|
tranel = self.getitem(currel.key)
|
|
if not tranel == []:
|
|
if str(tranel).strip() == str(currel.getitem()).strip():
|
|
if not tm.isDefaults(self.corename, currel.key):
|
|
if found == 0:
|
|
self.addreport("\nNon translated Items:")
|
|
found = 1
|
|
self.addreport(str(str(currel.linenum).zfill(3) + ": " + str(currel.getcontent())))
|
|
#print str(str(currel.linenum).zfill(3) + ": " + str(currel.getcontent()))
|
|
self.numNontrans += 1
|
|
currel = currel.nextitem
|
|
found = 0
|
|
currel = self.firstel
|
|
while not currel == []:
|
|
if not currel.isText:
|
|
tranel = origfile.getitem(currel.key)
|
|
if tranel == []:
|
|
if found == 0:
|
|
self.addreport("\nObsolete Items:")
|
|
found = 1
|
|
self.addreport(str(str(currel.linenum).zfill(3) + ": " + str(currel.getcontent())))
|
|
self.numObsolete += 1
|
|
currel = currel.nextitem
|
|
return self.numMissing, self.numNontrans, self.numObsolete
|
|
|
|
def isdifferent(self, tm, reffile):
|
|
currel = reffile.firstel
|
|
while not currel == []:
|
|
if not currel.isText:
|
|
tranel = self.getitem(currel.key)
|
|
if tranel == []:
|
|
#print(str("Returnvalue due to empty Test with " + currel.key))
|
|
return 1
|
|
else:
|
|
if not str(tranel).strip() == str(currel.getitem()).strip():
|
|
#print(str("Returnvalue due to Test with " + str(tranel).strip() + " and " + str(currel.getitem()).strip()))
|
|
return 1
|
|
currel = currel.nextitem
|
|
currel = self.firstel
|
|
while not currel == []:
|
|
if not currel.isText:
|
|
tranel = reffile.getitem(currel.key)
|
|
if tranel == []:
|
|
#print(str("Returnvalue due to empty Test with " + currel.key))
|
|
return 1
|
|
currel = currel.nextitem
|
|
return 0
|
|
|
|
def comparefull(self, tm, origfile, reforigfile, reftransfile):
|
|
self.numMissing = 0
|
|
self.numNontrans = 0
|
|
self.numObsolete = 0
|
|
found = 0
|
|
self.addreport(str("Items in current original File: " + str(origfile.numkeys)))
|
|
self.addreport(str("Revision of original File: " + str(origfile.version)))
|
|
self.addreport(str("Items in current translated File: " + str(self.numkeys)))
|
|
self.addreport(str("Revision of translated File: " + str(self.version)))
|
|
self.addreport(str("Items in reference original File: " + str(reforigfile.numkeys)))
|
|
self.addreport(str("Revision of original File: " + str(reforigfile.version)))
|
|
self.addreport(str("Items in reference translated File: " + str(reftransfile.numkeys)))
|
|
self.addreport(str("Revision of translated File: " + str(reftransfile.version)))
|
|
currel = origfile.firstel
|
|
while not currel == []:
|
|
if not currel.isText:
|
|
tranel = self.getitem(currel.key)
|
|
if tranel == []:
|
|
if not tm.isDefaults(self.corename, currel.key):
|
|
if found == 0:
|
|
self.addreport("\nMissing Items:")
|
|
found = 1
|
|
self.addreport(str(str(currel.linenum).zfill(3) + ": " + str(currel.getcontent())))
|
|
self.numMissing += 1
|
|
currel = currel.nextitem
|
|
found = 0
|
|
currel = origfile.firstel
|
|
while not currel == []:
|
|
if not currel.isText:
|
|
tranel = self.getitem(currel.key)
|
|
if not tranel == []:
|
|
if str(tranel).strip() == str(currel.getitem()).strip():
|
|
if not tm.isDefaults(self.corename, currel.key):
|
|
if found == 0:
|
|
self.addreport("\nNon translated Items:")
|
|
found = 1
|
|
self.addreport(str(str(currel.linenum).zfill(3) + ": " + str(currel.getcontent())))
|
|
self.numNontrans += 1
|
|
currel = currel.nextitem
|
|
found = 0
|
|
currel = self.firstel
|
|
while not currel == []:
|
|
if not currel.isText:
|
|
tranel = origfile.getitem(currel.key)
|
|
if tranel == []:
|
|
if found == 0:
|
|
self.addreport("\nObsolete Items:")
|
|
found = 1
|
|
self.addreport(str(str(currel.linenum).zfill(3) + ": " + str(currel.getcontent())))
|
|
self.numObsolete += 1
|
|
currel = currel.nextitem
|
|
found = 0
|
|
currel = origfile.firstel
|
|
while not currel == []:
|
|
if not currel.isText:
|
|
tranel = reforigfile.getitem(currel.key)
|
|
if tranel == []:
|
|
if found == 0:
|
|
self.addreport("\nAdded Reference Items:")
|
|
found = 1
|
|
self.addreport(str(str(currel.linenum).zfill(3) + ": " + str(currel.getcontent())))
|
|
currel = currel.nextitem
|
|
found = 0
|
|
currel = self.firstel
|
|
while not currel == []:
|
|
if not currel.isText:
|
|
tranel = reftransfile.getitem(currel.key)
|
|
if tranel == []:
|
|
if found == 0:
|
|
self.addreport("\nAdded Translation:")
|
|
found = 1
|
|
self.addreport(str(str(currel.linenum).zfill(3) + ": " + str(currel.getcontent())))
|
|
currel = currel.nextitem
|
|
return self.numMissing, self.numNontrans, self.numObsolete
|
|
|
|
|
|
|
|
|