view kll_lib/backends.py @ 30:2aa96be4e395

Adding inheritance to Backend class - Preparing for JSON->kll and kll->JSON compilation modes
author Jacob Alexander <haata@kiibohd.com>
date Sat, 21 Feb 2015 21:45:20 -0800
parents
children 0a2ddc9f2e0b
line wrap: on
line source

#!/usr/bin/env python3
# KLL Compiler - Kiibohd Backend
#
# Backend code generator classes
#
# Copyright (C) 2015 by Jacob Alexander
#
# This file is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This file is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this file.  If not, see <http://www.gnu.org/licenses/>.

### Imports ###

import os
import sys
import re


### Decorators ###

 ## Print Decorator Variables
ERROR = '\033[5;1;31mERROR\033[0m:'
WARNING = '\033[5;1;33mWARNING\033[0m:'



### Classes ###

class BackendBase:
	# Initializes backend
	# Looks for template file and builds list of fill tags
	def __init__( self, templatePath, definesTemplatePath ):
		# Does template exist?
		if not os.path.isfile( templatePath ):
			print ( "{0} '{1}' does not exist...".format( ERROR, templatePath ) )
			sys.exit( 1 )

		self.definesTemplatePath = definesTemplatePath
		self.templatePath = templatePath
		self.fill_dict = dict()

		# Generate list of fill tags
		self.tagList = []
		with open( templatePath, 'r' ) as openFile:
			for line in openFile:
				match = re.findall( '<\|([^|>]+)\|>', line )
				for item in match:
					self.tagList.append( item )
		with open( definesTemplatePath, 'r' ) as openFile:
			for line in openFile:
				match = re.findall( '<\|([^|>]+)\|>', line )
				for item in match:
					self.tagList.append( item )


	# USB Code Capability Name
	# XXX Make sure to override
	def usbCodeCapability( self ):
		return "my_capability";


	# Processes content for fill tags and does any needed dataset calculations
	def process( self, capabilities, macros, variables, gitRev, gitChanges ):
		print ( "{0} BackendBase 'process' function must be overridden".format( ERROR ) )
		sys.exit( 2 )


	# Generates the output keymap with fill tags filled
	def generate( self, outputPath, definesOutputPath ):
		# Process each line of the template, outputting to the target path
		with open( outputPath, 'w' ) as outputFile:
			with open( self.templatePath, 'r' ) as templateFile:
				for line in templateFile:
					# TODO Support multiple replacements per line
					# TODO Support replacement with other text inline
					match = re.findall( '<\|([^|>]+)\|>', line )

					# If match, replace with processed variable
					if match:
						outputFile.write( self.fill_dict[ match[ 0 ] ] )
						outputFile.write("\n")

					# Otherwise, just append template to output file
					else:
						outputFile.write( line )

		# Process each line of the defines template, outputting to the target path
		with open( definesOutputPath, 'w' ) as outputFile:
			with open( self.definesTemplatePath, 'r' ) as templateFile:
				for line in templateFile:
					# TODO Support multiple replacements per line
					# TODO Support replacement with other text inline
					match = re.findall( '<\|([^|>]+)\|>', line )

					# If match, replace with processed variable
					if match:
						outputFile.write( self.fill_dict[ match[ 0 ] ] )
						outputFile.write("\n")

					# Otherwise, just append template to output file
					else:
						outputFile.write( line )