95 lines
2.4 KiB
Python
95 lines
2.4 KiB
Python
from parser.StringValueParser import *
|
|
from parser.AttributeNameParser import *
|
|
|
|
class CsprojParser:
|
|
def __init__(self, config):
|
|
self._config = config
|
|
self._token_buffer = None
|
|
self._token_index = 0
|
|
self._current_project = None
|
|
self.projects = {}
|
|
|
|
def initTokenBuffer(self, string_to_parse, value_token):
|
|
self._token_buffer = string_to_parse.split(' ')
|
|
self._token_buffer.append(value_token)
|
|
self._token_index = 0
|
|
|
|
|
|
def parse(self, string_to_parse, value_token):
|
|
self.initTokenBuffer(string_to_parse, value_token)
|
|
|
|
while self._token_index < len(self._token_buffer):
|
|
self.ProcessToken()
|
|
|
|
|
|
def ProcessToken(self):
|
|
token = self.getCurrentToken()
|
|
|
|
if self.isCsprojStatement(token):
|
|
self._token_index += 1
|
|
elif self.isAppToken(token):
|
|
self.processAppToken(token)
|
|
self._token_index += 1
|
|
elif self.isKeyToken(token):
|
|
key_name = self.processKeyToken(token)
|
|
self._token_index += 1
|
|
token = self.getCurrentToken()
|
|
value = self.processValueToken()
|
|
self._token_index += 1
|
|
self._current_project.settings[key_name] = value
|
|
elif self.isAttributeToken(token):
|
|
attribute_name = self.processAttributeNameToken(token)
|
|
self._token_index += 1
|
|
token = self.getCurrentToken()
|
|
attribute_value = self.processValueToken(token)
|
|
self._token_index += 1
|
|
setattr(self.project, attribute_name, attribute_value)
|
|
|
|
def isCsprojStatement(self, token):
|
|
return token == 'csproj'
|
|
|
|
def isAppToken(self, token):
|
|
return token.startswith('app:')
|
|
|
|
def isKeyToken(self, token):
|
|
return token.startswith('key:')
|
|
|
|
def isAttributeToken(self, token):
|
|
return ':' not in token
|
|
|
|
def processAppToken(self, appToken):
|
|
appName = appToken[len('app:')]
|
|
self.setCurrentProject(appName)
|
|
|
|
def setCurrentProject(self, appName):
|
|
exists = appName in self.projects
|
|
|
|
self._current_project = self.projects[appName] if exists else Csproj(appName)
|
|
self.projects[appName] = self._current_project
|
|
|
|
def processKeyToken(self, token):
|
|
key_name = token[len('key:')]
|
|
return key_name
|
|
|
|
def processAttributeNameToken(self, token):
|
|
attribute_name = token
|
|
return attribute_name
|
|
|
|
def processValueToken(self, token):
|
|
value = token
|
|
|
|
if token.startswith('@'):
|
|
key = token[1:]
|
|
value = self._config[key]
|
|
|
|
return value
|
|
|
|
def getCurrentToken(self):
|
|
token = self._token_buffer[self._token_index]
|
|
return token
|
|
|
|
|
|
class Csproj:
|
|
def __init__(self, appName):
|
|
self.appName = appName
|
|
self.settings = {} |