2015-02-22 05:45:20 +00:00
#!/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 :
2015-02-22 07:34:14 +00:00
# Default templates and output files
templatePaths = [ ]
outputPaths = [ ]
2015-02-22 05:45:20 +00:00
# Initializes backend
# Looks for template file and builds list of fill tags
2015-02-22 07:34:14 +00:00
def __init__ ( self , templatePaths ) :
# Use defaults if no template is specified
if templatePaths is not None :
self . templatePaths = templatePaths
2015-02-22 05:45:20 +00:00
self . fill_dict = dict ( )
2015-02-22 07:19:35 +00:00
# Process each template and add to tagList
2015-02-22 05:45:20 +00:00
self . tagList = [ ]
2015-02-22 07:34:14 +00:00
for templatePath in self . templatePaths :
2015-02-22 07:19:35 +00:00
# Does template exist?
if not os . path . isfile ( templatePath ) :
print ( " {0} ' {1} ' does not exist... " . format ( ERROR , templatePath ) )
sys . exit ( 1 )
# Generate list of fill tags
with open ( templatePath , ' r ' ) as openFile :
for line in openFile :
match = re . findall ( ' < \ |([^|>]+) \ |> ' , line )
for item in match :
self . tagList . append ( item )
2015-02-22 05:45:20 +00:00
# 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
2015-02-22 07:19:35 +00:00
# XXX Make sure to override
2015-02-22 05:45:20 +00:00
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
2015-02-22 07:19:35 +00:00
def generate ( self , outputPaths ) :
2015-02-22 07:34:14 +00:00
# Use default if not specified
if outputPaths is None :
outputPaths = self . outputPaths
2015-02-22 07:19:35 +00:00
for templatePath , outputPath in zip ( self . templatePaths , outputPaths ) :
# Process each line of the template, outputting to the target path
with open ( outputPath , ' w ' ) as outputFile :
with open ( 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 )
2015-02-22 05:45:20 +00:00