134 lines
3.2 KiB
Python
134 lines
3.2 KiB
Python
from parser.StringValueParser import *
|
|
from parser.AttributeNameParser import *
|
|
from parser.token import Token
|
|
|
|
|
|
class CsprojParser:
|
|
def __init__(self, config):
|
|
self._config = config
|
|
self._statement_buffer = None
|
|
self._token_index = 0
|
|
self._current_project = None
|
|
self._projects = {}
|
|
|
|
def getProjects(self):
|
|
return self._projects.values()
|
|
|
|
def initStatementBuffer(self, string_to_parse, value_statement):
|
|
self._statement_buffer = string_to_parse.split(' ')
|
|
self._statement_buffer.append(value_statement)
|
|
self._token_index = 0
|
|
|
|
def parse(self, string_to_parse, value_token):
|
|
self.initStatementBuffer(string_to_parse, value_token)
|
|
|
|
while self._token_index < len(self._statement_buffer):
|
|
self.ProcessStatement()
|
|
|
|
|
|
def ProcessStatement(self):
|
|
text = self.getCurrentStatement()
|
|
|
|
if self.isCsprojStatement(text):
|
|
self.procCspojStatement(text)
|
|
|
|
elif self.isAppStatement(text):
|
|
self.procAppStatement(text)
|
|
|
|
elif self.isKeyStatement(text):
|
|
self.procKeyStatement(text)
|
|
|
|
elif self.isAttributeToken(text):
|
|
self.procAttributeToken(text)
|
|
|
|
else:
|
|
raise Exception('unrecognized token', text)
|
|
|
|
def isCsprojStatement(self, text):
|
|
return text == 'csproj'
|
|
|
|
def procCspojStatement(self, text):
|
|
self._token_index += 1
|
|
|
|
def isAppStatement(self, token):
|
|
return token.startswith('app:')
|
|
|
|
def procAppStatement(self, text):
|
|
self.processAppToken(text)
|
|
self._token_index += 1
|
|
|
|
def isKeyStatement(self, text):
|
|
return text.startswith('key:')
|
|
|
|
def procKeyStatement(self, text):
|
|
key_token = self.parseKeyToken(text)
|
|
|
|
self._token_index += 1
|
|
text = self.getCurrentStatement()
|
|
value_token = self.parseValueToken(text)
|
|
value = self.fetchValueFromValueToken(value_token)
|
|
|
|
self._current_project.settings[key_token.content] = value
|
|
self._token_index += 1
|
|
|
|
def isAttributeToken(self, token):
|
|
return ':' not in token
|
|
|
|
def procAttributeToken(self, text):
|
|
attribute_token = self.parseValueToken(text)
|
|
|
|
self._token_index += 1
|
|
text = self.getCurrentStatement()
|
|
value_token = self.parseValueToken(text)
|
|
setattr(self._current_project, attribute_token.content, value_token.content)
|
|
|
|
self._token_index += 1
|
|
|
|
def parseAppToken(self, text):
|
|
appName = text[len('app:'):]
|
|
token = Token(appName, 'appToken')
|
|
|
|
return token
|
|
|
|
def processAppToken(self, text):
|
|
appToken = self.parseAppToken(text)
|
|
self.setCurrentProject(appToken.content)
|
|
|
|
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 parseKeyToken(self, text):
|
|
key_name = text[len('key:'):]
|
|
token = Token(key_name, 'keyToken')
|
|
|
|
return token
|
|
|
|
def parseValueToken(self, text):
|
|
token = Token(text, 'valueToken')
|
|
|
|
return token
|
|
|
|
def fetchValueFromValueToken(self, token):
|
|
value = token.content
|
|
|
|
if value.startswith('@'):
|
|
key = value[1:]
|
|
value = self._config[key]
|
|
|
|
return value
|
|
|
|
def getCurrentStatement(self):
|
|
token = self._statement_buffer[self._token_index]
|
|
return token
|
|
|
|
|
|
class Csproj:
|
|
def __init__(self, appName):
|
|
self.appName = appName
|
|
self.settings = {}
|
|
|
|
def __str__(self):
|
|
return 'app Name: {0} settings: {1}'.format(self.appName, self.settings) |