BuildScript/scripts/parser/CsprojParser.py

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)