diff --git a/drace-gui.py b/drace-gui.py
index 01968fc..e7310cf 100644
--- a/drace-gui.py
+++ b/drace-gui.py
@@ -2,17 +2,20 @@
import os
import shutil
-copy_file = True
-if not copy_file:
- copy_text = True
-else:
- copy_text = False
+SOURCEFILE_BL = list()
+SOURCEFILE_WL = list()
+BLACKLISTING = True
+WHITELISTING = False
class ReportCreator:
__errorTag = 'error'
__htmlTemplatesPath = "templates/entries.xml"
__htmlTemplates = (ET.parse(__htmlTemplatesPath)).getroot()
sourcefileList = list()
+ __callStackNumber = 0
+ __errorNumber = 0
+ snippets = str()
+
def __init__(self, pathOfReport):
@@ -43,67 +46,156 @@ def __getHeader(self):
return header
- def __returnCode(self, filename, directory):
+ def __handleSourceCode(self, filename, directory):
fullPath = directory +'/'+ filename
fullPath = fullPath.replace('\\', '/')
- if os.path.isfile(fullPath):
- if copy_file:
- sourceCode = (self.__htmlTemplates.find('code_entry_reference').text).replace('*SOURCEFILE*', filename)
- self.sourcefileList.append(fullPath)
- return sourceCode
+ src = self.__returnCode(fullPath, justExistance=1)
+ if src == -1:
+ return -1, self.__htmlTemplates.find('no_code_entry').text
+ else:
+ try:
+ index = self.sourcefileList.index(fullPath)
+ except ValueError:
+ self.sourcefileList.append(fullPath)
+ index = self.sourcefileList.index(fullPath)
- if copy_text:
- sourceFile = open(fullPath, mode='r')
- sourceCode = sourceFile.read()
- sourceFile.close()
- sourceCode = (self.__htmlTemplates.find('code_entry').text).replace('*CODE*', self.adjText(sourceCode))
- return sourceCode
+ return index, (self.__htmlTemplates.find('code_entry').text)
+
+ def __createCodeVars(self):
+ codeString = str()
+
+ for sourcefile in self.sourcefileList:
+ src = self.__returnCode(sourcefile, justExistance=0)
+ tmpCode = "code_" + str(self.sourcefileList.index(sourcefile)) + ' = `' + src + '`;\n'
+ codeString += tmpCode
+
+ self.htmlReport = self.htmlReport.replace("*CODE_VARIABLES*", codeString)
+ self.htmlReport = self.htmlReport.replace("*SNIPPET_VARIABLES*", self.snippets)
+
+ def __returnCode(self, fullPath, justExistance):
+
+ if os.path.isfile(fullPath):
+ if BLACKLISTING:
+ for element in SOURCEFILE_BL:
+ if element in fullPath:
+ return -1
+ if justExistance:
+ return 0
+ else:
+ sourceFile = open(fullPath, mode='r')
+ sourceCode = sourceFile.read()
+ sourceFile.close()
+ sourceCode = self.adjText(sourceCode)
+ return sourceCode
+ if WHITELISTING:
+ for element in SOURCEFILE_WL:
+ if element in fullPath:
+ if justExistance:
+ return 0
+ else:
+ sourceFile = open(fullPath, mode='r')
+ sourceCode = sourceFile.read()
+ sourceFile.close()
+ sourceCode = self.adjText(sourceCode)
+ return sourceCode
+ return -1
else:
- return self.__htmlTemplates.find('no_code_entry').text
+ return -1
- def __createCallStack(self, errorEntry, position):
+ def __createCallStack(self, errorEntry, position, outputID):
+
callStack = str()
stackTemplate = self.__htmlTemplates.find('stack_entry').text
+ snippetTemplate = self.__htmlTemplates.find('snippet_entry').text
stackArray = errorEntry.findall('stack')
stack = stackArray[position]
elementNumber = 0
for frame in stack.findall('frame'):
- newStackElement = stackTemplate.replace('*STACK_NUMBER*', self.adjText(hex(elementNumber)))
- newStackElement = newStackElement.replace('*OBJ*', self.adjText(frame.find('obj').text))
- newStackElement = newStackElement.replace('*FUNCTION*', self.adjText(frame.find('fn').text))
- newStackElement = newStackElement.replace('*INSTRUCTION_POINTER*', self.adjText(frame.find('ip').text))
+
+ ###make heading in read box###
+ if elementNumber == 0:
+ if len(self.__errorHeading) == 0:
+ self.__errorHeading += "
Obj. 1: " + (self.adjText(frame.find('obj').text) + ': "' + self.adjText(frame.find('fn').text)) + '"
'
+ else:
+ self.__errorHeading += "Obj. 2: " + (self.adjText(frame.find('obj').text) + ': "' + self.adjText(frame.find('fn').text)) + '"'
+
+
+ newStackElement = stackTemplate.replace('*STACK_NUMBER*', self.adjText(hex(elementNumber))+":")
+ newStackElement = newStackElement.replace('*SNIPPET_VAR*', ("snippet_" + str(self.__callStackNumber)))
+ newStackElement = newStackElement.replace('*OUTPUT_ID*', outputID+str(position))
+
+ newSnippet = snippetTemplate.replace('*SNIPPET_VAR*', ("snippet_" + str(self.__callStackNumber)))
+ newSnippet = newSnippet.replace('*STACK_NUMBER*', self.adjText(hex(elementNumber)))
+ newSnippet = newSnippet.replace('*OBJ*', self.adjText(frame.find('obj').text))
+ newSnippet = newSnippet.replace('*FUNCTION*', self.adjText(frame.find('fn').text))
+ newSnippet = newSnippet.replace('*INSTRUCTION_POINTER*', self.adjText(frame.find('ip').text))
+
+
+
if (frame.find('file')!= None):
+ code_index, tag = self.__handleSourceCode(frame.find('file').text, frame.find('dir').text)
+
newStackElement = newStackElement.replace('*FILE*', self.adjText(frame.find('file').text))
- newStackElement = newStackElement.replace('*DIRECTORY*', self.adjText(frame.find('dir').text))
- newStackElement = newStackElement.replace('*CODE_TAG*', self.__returnCode(frame.find('file').text, frame.find('dir').text))
- newStackElement = newStackElement.replace('*LINE_OF_CODE*', self.adjText(frame.find('line').text))
- else:
+ newSnippet = newSnippet.replace('*FILE*', self.adjText(frame.find('file').text))
+ newSnippet = newSnippet.replace('*DIRECTORY*', self.adjText(frame.find('dir').text))
+ newSnippet = newSnippet.replace('*CODE_TAG*', tag)
+ newSnippet = newSnippet.replace('*LINE_OF_CODE*', self.adjText(frame.find('line').text))
+
+ if(code_index != -1):
+ newStackElement = newStackElement.replace('*CODE_VAR*', "code_"+str(code_index))
+ newStackElement = newStackElement.replace('*CODE_ID_VAR*', "'snippet_"+str(self.__callStackNumber)+"_code'")
+ newStackElement = newStackElement.replace('*LINE_OF_CODE*', self.adjText(frame.find('line').text))
+ newSnippet = newSnippet.replace('*CODE_ID_VAR*', "snippet_"+str(self.__callStackNumber)+"_code")
+
+ else: #file is not available on device
+ newStackElement = newStackElement.replace('*CODE_VAR*', "'None'")
+ newStackElement = newStackElement.replace('*CODE_ID_VAR*', "'None'")
+ newStackElement = newStackElement.replace('*LINE_OF_CODE*', "'None'")
+ newSnippet = newSnippet.replace('*CODE_ID_VAR*', "'None'")
+
+ insertPosition = newStackElement.find('btn"')
+ newStackElement = newStackElement[:insertPosition] + "grey " + newStackElement[insertPosition:]
+
+ else: #no filepath for file is given
+ code_index, tag = self.__handleSourceCode("","")
+
newStackElement = newStackElement.replace('*FILE*', 'no filename available')
- newStackElement = newStackElement.replace('*DIRECTORY*', 'no directory available')
- newStackElement = newStackElement.replace('*CODE_TAG*', self.__returnCode('',''))
- newStackElement = newStackElement.replace('*LINE_OF_CODE*', 'no line of code available')
+ newStackElement = newStackElement.replace('*LINE_OF_CODE*', "'None'")
+
+ newSnippet = newSnippet.replace('*FILE*', 'no filename available')
+ newSnippet = newSnippet.replace('*DIRECTORY*', 'no directory available')
+ newSnippet = newSnippet.replace('*CODE_TAG*', tag)
+
+ newStackElement = newStackElement.replace('*CODE_VAR*', "'None'")
+ newStackElement = newStackElement.replace('*CODE_ID_VAR*', "'None'")
+ newSnippet = newSnippet.replace('*LINE_OF_CODE*', 'no line of code available')
+
+ insertPosition = newStackElement.find('btn"')
+ newStackElement = newStackElement[:insertPosition] + "grey " + newStackElement[insertPosition:]
- callStack += newStackElement
+ callStack += newStackElement #append stack element
+ self.snippets += newSnippet #append referenced code snippet
elementNumber += 1
-
+ self.__callStackNumber += 1 #increase global call stack number (used for reference variables)
return callStack
-
-
def __createErrorList(self):
self.__strErrors = str()
+
errorTemplate = self.__htmlTemplates.find('error_entry').text
errorList = self.__reportRoot.findall(self.__errorTag)
self.__numberOfErrors = len(errorList)
for error in errorList:
+ self.__errorNumber += 1
+ outputID = "output_"+str(self.__errorNumber)+"_"
newError = errorTemplate.replace('*ERROR_ID*', self.adjText(error.find('unique').text))
newError = newError.replace('*ERROR_TYPE*', self.adjText(error.find('kind').text))
@@ -111,9 +203,13 @@ def __createErrorList(self):
newError = newError.replace('*XWHAT_TEXT_1*', self.adjText(xwhat[0].find('text').text))
newError = newError.replace('*XWHAT_TEXT_2*', self.adjText(xwhat[1].find('text').text))
- newError = newError.replace('*CALL_STACK_ENTRIES_1*', self.__createCallStack(error, 0))
- newError = newError.replace('*CALL_STACK_ENTRIES_2*', self.__createCallStack(error, 1))
-
+ self.__errorHeading = str() #filled by __createCallStack
+ newError = newError.replace('*CALL_STACK_ENTRIES_1*', self.__createCallStack(error, 0, outputID))
+ newError = newError.replace('*CALL_STACK_ENTRIES_2*', self.__createCallStack(error, 1, outputID))
+ newError = newError.replace('*OUTPUT_ID_1*', outputID+'0')
+ newError = newError.replace('*OUTPUT_ID_2*', outputID+'1')
+ newError = newError.replace('*ERROR_HEADING*', self.__errorHeading)
+
self.__strErrors += newError
def __createHeader(self):
@@ -132,32 +228,35 @@ def __createHeader(self):
def __createReport(self):
self.__createErrorList()
self.__createHeader()
+ self.__createCodeVars()
- def adjText(self, text):
- #text = text.replace('<', '<')
- #text = text.replace('>', '&gr;')
- #text = text.replace('&', '&')
+ def adjText(self, text): #change html symbols
+ text = text.replace('&', '&')
+ text = text.replace('<', '<')
+ text = text.replace('>', '>')
+ text = text.replace('"', '"')
+ text = text.replace('\\', '/')
return text
def main():
targetDirectory = 'test_files/output'
- report = ReportCreator('test_files/test.xml')
+ report = ReportCreator('test_files/test.1.xml')
+
+ shutil.rmtree(targetDirectory)
if not os.path.isdir(targetDirectory):
os.mkdir(targetDirectory)
+
output = open(targetDirectory+'/output.html', mode='w')
output.write(report.htmlReport)
output.close()
- for path in report.sourcefileList:
- shutil.copy(path, targetDirectory)
-
- #shutil.copy("templates/css", targetDirectory)
- #shutil.copy("templates/js", targetDirectory)
+ shutil.copytree("templates/css", targetDirectory+"/css")
+ shutil.copytree("templates/js", targetDirectory+"/js")
return 0