diff --git a/generator/GeneralFunctions/DataStructureManupulations.py b/generator/GeneralFunctions/DataStructureManupulations.py index 5187a05..da30347 100644 --- a/generator/GeneralFunctions/DataStructureManupulations.py +++ b/generator/GeneralFunctions/DataStructureManupulations.py @@ -8,6 +8,7 @@ else: PathSlash = '/' FileProtocol = "file:" + 2*PathSlash + def ConvertToStandardPathFormat(Path): """ Example, Input: '"file:///some/path/somefile.extension" @@ -18,6 +19,7 @@ def ConvertToStandardPathFormat(Path): Path = Path[len(FileProtocol):] return Path + def GetTextAfter(Text, ReadlinesTextFile): for Lines in range(len(ReadlinesTextFile)): Line = ReadlinesTextFile[Lines].strip('\n') @@ -25,18 +27,21 @@ def GetTextAfter(Text, ReadlinesTextFile): return Line[len(Text):] return '' + def SingleQuoteString(String): if len(String) > 0: if String[0] != '\'' or String[-1] != '\'': String = '\'' + String + '\'' return String + def DoubleQuoteString(String): if len(String) > 0: if String[0] != '"' or String[-1] != '"': String = '"' + String + '"' return String + def ListIntoString(List, QuoteItems=0, Seprator=' '): if QuoteItems == 2: for i in range(len(List)): @@ -49,36 +54,42 @@ def ListIntoString(List, QuoteItems=0, Seprator=' '): Stringoflist = (Seprator).join(List) return Stringoflist + # strip=0 => remove both ' & ", 1 => remove ', 2 => remove " def UnquoteString(String, strip=0): while True: if ( - strip != 2 - and String.startswith('"') - and String.endswith('"')): + strip != 2 and + String.startswith('"') and + String.endswith('"') + ): String = String.strip('"') elif ( strip != 1 and String.startswith("'") - and String.endswith("'")): + and String.endswith("'") + ): String = String.strip("'") else: break return String + def StandardVariableName(Variable): Variable = Variable.casefold() Variable = Variable.replace('_', '').replace(' ', '') return Variable -#def DictionaryToJsonStr(Dict, BaseIndentation=0): - #BI = '\t'*BaseIndentation - #JsonStr = BI+'{\n' - #for k, v in Dict.items(): - #JsonStr += BI+'\t"'+k+'" : "'+v+'",\n' - #JsonStr = JsonStr[:-2] - #JsonStr += '\n'+BI+'}' - #return JsonStr +""" +def DictionaryToJsonStr(Dict, BaseIndentation=0): + BI = '\t'*BaseIndentation + JsonStr = BI+'{\n' + for k, v in Dict.items(): + JsonStr += BI+'\t"'+k+'" : "'+v+'",\n' + JsonStr = JsonStr[:-2] + JsonStr += '\n'+BI+'}' + return JsonStr +""" def StringToKeyValuePair(String, Seprator): SepratorAt = String.find(Seprator) @@ -89,14 +100,17 @@ def StringToKeyValuePair(String, Seprator): else: return "", String + def FormatStrForDictinary(String): String = String.strip(" \n\r") return UnquoteString(String) + def StrListToDictionary( List, - Seprator = '=', - FormatFunction = FormatStrForDictinary): + Seprator='=', + FormatFunction=FormatStrForDictinary + ): Dictionary = {} for i in List: k, v = StringToKeyValuePair(i, Seprator) diff --git a/generator/GeneralFunctions/InputOutput.py b/generator/GeneralFunctions/InputOutput.py index a503596..b2138fa 100644 --- a/generator/GeneralFunctions/InputOutput.py +++ b/generator/GeneralFunctions/InputOutput.py @@ -2,6 +2,7 @@ from os.path import isfile as DoesFileExist from .DataStructureManupulations import ConvertToStandardPathFormat + def ReadTextFile(FilePath): FilePath = ConvertToStandardPathFormat(FilePath) if DoesFileExist(FilePath) is True: @@ -11,11 +12,13 @@ def ReadTextFile(FilePath): return ReadFile else: return '' - + + def ReadlinesTextFile(FilePath): String = ReadTextFile(FilePath) return String.split('\n') + def WriteTextFiles(FilePath, Text): if type(Text) != str: Text = '\n'.join(Text) @@ -23,7 +26,8 @@ def WriteTextFiles(FilePath, Text): File.write(Text) File.close() + def WriteBinaryToFile(Filepath, Data): - File=open(Filepath, 'wb') + File = open(Filepath, 'wb') File.write(Data) File.close() diff --git a/generator/GeneralFunctions/Network.py b/generator/GeneralFunctions/Network.py index c506405..2f469f2 100644 --- a/generator/GeneralFunctions/Network.py +++ b/generator/GeneralFunctions/Network.py @@ -3,6 +3,6 @@ from urllib.request import urlopen HttpsContext = ssl.create_default_context() + def Download(Url): return urlopen(Url, context=HttpsContext).read() - diff --git a/generator/GeneralFunctions/OS.py b/generator/GeneralFunctions/OS.py index eb250db..152527e 100644 --- a/generator/GeneralFunctions/OS.py +++ b/generator/GeneralFunctions/OS.py @@ -1,11 +1,13 @@ import os + def CallFuncInDir(Directory, Function, *args, **kwArgs): CurrentDir = os.getcwd() os.chdir(Directory) Function(*args, **kwArgs) os.chdir(CurrentDir) + # return True if operation succesful and False if failed def CreateDir(Directory): if not os.path.isfile(Directory): diff --git a/generator/main.py b/generator/main.py index 0293c23..0c1e3b7 100644 --- a/generator/main.py +++ b/generator/main.py @@ -6,10 +6,6 @@ All sub-directories of bundles directory will be scanned for activity bundles i.e. .xo files. """ -""" FIXME: paths hard coded unix style & most likely will not work on winodws. -Use code written for IMM to handle it. -""" - import glob import json import os @@ -19,8 +15,6 @@ from urllib.parse import quote as strToHtmlFmt import zipfile from GeneralFunctions.DataStructureManupulations import ( - GetTextAfter, - UnquoteString, StrListToDictionary ) from GeneralFunctions.InputOutput import ( @@ -32,15 +26,21 @@ from GeneralFunctions.OS import ( CreateDir ) + +""" FIXME: paths hard coded unix style & most likely will not work on winodws. +Use code written for IMM to handle it. +""" + + class extractData: - + def findInfoFiles(self, bundle): infoFiles = [] for File in bundle.namelist(): if File.endswith("activity/activity.info"): infoFiles.append(File) return infoFiles - + def copyBundle(self, bundleSrc, activityName): CallFuncInDir( self.websiteDir, @@ -48,31 +48,31 @@ class extractData: self.bundlesDir+bundleSrc, "bundles/"+activityName+".xo" ) - + def createDirectories(self): assert(CreateDir("app")) assert(CreateDir("icons")) assert(CreateDir("bundles")) assert(CreateDir("js")) - + def extractActivityInfo(self, infoFilePath, zipFile): - infoList, infoDict = [], {} + infoList = [] infoList = zipFile.read( infoFilePath).decode("utf-8").split('\n') return StrListToDictionary(infoList) - + def extractInfoAndIconFromBundles(self): for bundlePath in self.activityBundles: bundle = zipfile.ZipFile(bundlePath, "r") - + infoFiles = self.findInfoFiles(bundle) if len(infoFiles) != 1: self.bundlesNotExactlyOneInfoFile.append(bundlePath) else: - + infoDict = self.extractActivityInfo(infoFiles[0], bundle) self.bundlesInfoList.append(infoDict) - + # FIXME: create seprate function for it # extract and copy icon activityName = infoDict.get("name") @@ -85,9 +85,9 @@ class extractData: if iconAbsolutePath in bundle.namelist(): icon = bundle.read(iconAbsolutePath) iconPath = ( - "icons/"+ + "icons/" + activityName - +".svg" + + ".svg" ) CallFuncInDir( self.websiteDir, @@ -98,115 +98,122 @@ class extractData: else: # Conitnue without icon since non-fatal error self.iconErroredBundles.append(bundlePath) - + bundle.close() # FIXME: uncomment below function. # Disabled sometime during devlopment as time consuming self.copyBundle(bundlePath, activityName) bundle.close() - + def generateAppsHtmlPages(self): iconsDir = "../icons/" bundlesDir = "../bundles/" for appInfo in self.indexDictList: pathName = strToHtmlFmt(appInfo["name"], safe='') - + html = ( - '\n\n
\n'+appInfo["summary"]+ - '
\n'+ - appInfo["description"]+'
\n