]> git.donarmstrong.com Git - kiibohd-kll.git/blob - kll_lib/backends.py
Adding inheritance to Backend class
[kiibohd-kll.git] / kll_lib / backends.py
1 #!/usr/bin/env python3
2 # KLL Compiler - Kiibohd Backend
3 #
4 # Backend code generator classes
5 #
6 # Copyright (C) 2015 by Jacob Alexander
7 #
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.
12 #
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.
17 #
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/>.
20
21 ### Imports ###
22
23 import os
24 import sys
25 import re
26
27
28 ### Decorators ###
29
30  ## Print Decorator Variables
31 ERROR = '\033[5;1;31mERROR\033[0m:'
32 WARNING = '\033[5;1;33mWARNING\033[0m:'
33
34
35
36 ### Classes ###
37
38 class BackendBase:
39         # Initializes backend
40         # Looks for template file and builds list of fill tags
41         def __init__( self, templatePath, definesTemplatePath ):
42                 # Does template exist?
43                 if not os.path.isfile( templatePath ):
44                         print ( "{0} '{1}' does not exist...".format( ERROR, templatePath ) )
45                         sys.exit( 1 )
46
47                 self.definesTemplatePath = definesTemplatePath
48                 self.templatePath = templatePath
49                 self.fill_dict = dict()
50
51                 # Generate list of fill tags
52                 self.tagList = []
53                 with open( templatePath, 'r' ) as openFile:
54                         for line in openFile:
55                                 match = re.findall( '<\|([^|>]+)\|>', line )
56                                 for item in match:
57                                         self.tagList.append( item )
58                 with open( definesTemplatePath, 'r' ) as openFile:
59                         for line in openFile:
60                                 match = re.findall( '<\|([^|>]+)\|>', line )
61                                 for item in match:
62                                         self.tagList.append( item )
63
64
65         # USB Code Capability Name
66         # XXX Make sure to override
67         def usbCodeCapability( self ):
68                 return "my_capability";
69
70
71         # Processes content for fill tags and does any needed dataset calculations
72         def process( self, capabilities, macros, variables, gitRev, gitChanges ):
73                 print ( "{0} BackendBase 'process' function must be overridden".format( ERROR ) )
74                 sys.exit( 2 )
75
76
77         # Generates the output keymap with fill tags filled
78         def generate( self, outputPath, definesOutputPath ):
79                 # Process each line of the template, outputting to the target path
80                 with open( outputPath, 'w' ) as outputFile:
81                         with open( self.templatePath, 'r' ) as templateFile:
82                                 for line in templateFile:
83                                         # TODO Support multiple replacements per line
84                                         # TODO Support replacement with other text inline
85                                         match = re.findall( '<\|([^|>]+)\|>', line )
86
87                                         # If match, replace with processed variable
88                                         if match:
89                                                 outputFile.write( self.fill_dict[ match[ 0 ] ] )
90                                                 outputFile.write("\n")
91
92                                         # Otherwise, just append template to output file
93                                         else:
94                                                 outputFile.write( line )
95
96                 # Process each line of the defines template, outputting to the target path
97                 with open( definesOutputPath, 'w' ) as outputFile:
98                         with open( self.definesTemplatePath, 'r' ) as templateFile:
99                                 for line in templateFile:
100                                         # TODO Support multiple replacements per line
101                                         # TODO Support replacement with other text inline
102                                         match = re.findall( '<\|([^|>]+)\|>', line )
103
104                                         # If match, replace with processed variable
105                                         if match:
106                                                 outputFile.write( self.fill_dict[ match[ 0 ] ] )
107                                                 outputFile.write("\n")
108
109                                         # Otherwise, just append template to output file
110                                         else:
111                                                 outputFile.write( line )
112