2 # KLL Compiler - Kiibohd Backend
4 # Backend code generator classes
6 # Copyright (C) 2015 by Jacob Alexander
8 # This file is free software: you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation, either version 3 of the License, or
11 # (at your option) any later version.
13 # This file is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
18 # You should have received a copy of the GNU General Public License
19 # along with this file. If not, see <http://www.gnu.org/licenses/>.
30 ## Print Decorator Variables
31 ERROR = '\033[5;1;31mERROR\033[0m:'
32 WARNING = '\033[5;1;33mWARNING\033[0m:'
39 # Default templates and output files
44 # Looks for template file and builds list of fill tags
45 def __init__( self, templatePaths ):
46 # Use defaults if no template is specified
47 if templatePaths is not None:
48 self.templatePaths = templatePaths
50 self.fill_dict = dict()
52 # Process each template and add to tagList
54 for templatePath in self.templatePaths:
55 # Does template exist?
56 if not os.path.isfile( templatePath ):
57 print ( "{0} '{1}' does not exist...".format( ERROR, templatePath ) )
60 # Generate list of fill tags
61 with open( templatePath, 'r' ) as openFile:
63 match = re.findall( '<\|([^|>]+)\|>', line )
65 self.tagList.append( item )
68 # USB Code Capability Name
69 # XXX Make sure to override
70 def usbCodeCapability( self ):
71 return "my_capability";
74 # Processes content for fill tags and does any needed dataset calculations
75 # XXX Make sure to override
76 def process( self, capabilities, macros, variables, gitRev, gitChanges ):
77 print ( "{0} BackendBase 'process' function must be overridden".format( ERROR ) )
81 # Generates the output keymap with fill tags filled
82 def generate( self, outputPaths ):
83 # Use default if not specified
84 if outputPaths is None:
85 outputPaths = self.outputPaths
87 for templatePath, outputPath in zip( self.templatePaths, outputPaths ):
88 # Process each line of the template, outputting to the target path
89 with open( outputPath, 'w' ) as outputFile:
90 with open( templatePath, 'r' ) as templateFile:
91 for line in templateFile:
92 # TODO Support multiple replacements per line
93 # TODO Support replacement with other text inline
94 match = re.findall( '<\|([^|>]+)\|>', line )
96 # If match, replace with processed variable
98 outputFile.write( self.fill_dict[ match[ 0 ] ] )
99 outputFile.write("\n")
101 # Otherwise, just append template to output file
103 outputFile.write( line )