Team:EPF Lausanne/Project/Modelling/Code

Code

code2html

The following Python code allows to generate HTML (and CSS) code from source files in C++ and Python languages. It is based on Pygment, a Python syntax highlighter. All code in our Wiki is formatted using this script.

from pygments import highlight
from pygments.lexers import PythonLexer
from pygments.lexers import CppLexer
from pygments.formatters import HtmlFormatter

# C++ extensions
cpp = ["cpp","cxx","cc","h"]

# Python extensions
py = ["py"]

def load_file_as_sting(fname):
    """
    Open the file FNAME and save all its content in an unformatted string
    """
    
    content = ""
    
    with open(fname,'r') as f: # Open the file (read only)
        content = f.read() # Read file and store it in an unformatted string
        # The file is automatically closed
    
    return content
    
def save_string_as_file(fname,string):
    """
    Save the unformatted string STRING into the file FNAME
    """
    
    with open(fname,'w') as f: # Open the file (write only)
        f.write(string)
        # The file is automatically closed
        
def lexer_formatter(language,css=False):
    """
    Return the lexer for the appropriate language and the HTML formatter
    """
    
    L = None
    
    if language in py:
        # Python Lexer
        L = PythonLexer()
        
    elif language in cpp:
        # C++ Lexer
        L = CppLexer() 
    else:
        raise NameError("Invalid language.")
        
    HF = HtmlFormatter(full=css,style="monokai")
        
    return L, HF


def code_to_htmlcss(code,language):
    """
    Transform CODE into html and css (separate files)
    """
    
    # Obtain lexer and HtmlFormatter
    L, HF = lexer_formatter(language,css=True)
    
    # Create html code
    html = highlight(code,L,HF)
    
    # Create css code
    css = HF.get_style_defs('.highlight')
    
    return html,css
    
def code_to_html(code,language):
    """
    Transform CODE into html and css (all in the same file)
    """
    
    # Obtain lexer and HtmlFormatter
    L, HF = lexer_formatter(language)
    
    # Create fill html code
    html = highlight(code,L,HF)
    
    return html

import sys

if __name__ == "__main__":
    """
    Command:
    
    ######################################
    
        python code2html INPUTFILE [CSS]
        
    ######################################
        
    INPUTFILE: name (with path) of the file to convert to html
    CSS: write "true" in order to obtain separate .html and .css files ("false" by default)
    """
    
    # Command line arguments
    args = sys.argv
    
    # Check command line arguments
    ncla = len(args) # number of command line arguments
    
    if ncla != 2 and ncla != 3 :
        raise TypeError("Invalid number of command line arguments.")
        
    css_bool = False
    
    if ncla == 3 and args[-1].lower() == "true":
        css_bool = True # Export css separately
    
    # Input file
    fname_code = sys.argv[1] # Name of the file containing the code to convert in html
    
    # Input file extension
    language = fname_code.split('.')[-1]
    
    # Output files
    fname_html = fname_code.split('.')[0] + ".html" # Name of the file where the html code will be stored
    fname_css = fname_code.split('.')[0] + ".css" # Name of the file where the css code will be stored
    
    # Save code into a unformatted string
    code = load_file_as_sting(fname_code)
    
    if css_bool == False: # Convert to standalone html
        html = code_to_html(code,language)
    else: # Convert to html and css separately
        html,css = code_to_htmlcss(code,language)
    
    # Save html
    save_string_as_file(fname_html,html)
    
    if css_bool == True:
        # Save css
        save_string_as_file(fname_css,css)

ODE Generator

class Reaction:
	def __init__(self, reaction_, cst_name_, cst_value_, description_):
		self.reaction = reaction_
		self.cst_name = cst_name_
		self.cst_value = cst_value_
		self.description = description_
		
	def __str__(self):
		    return "{}\n{} = {}\n{}".format(self.reaction,
		    self.cst_name,
		    str(self.cst_value),
		    self.description)
		
class ReactionParser:
	
	def __init__(self, input_, sep_=":", comment_="#"):
		self.sep = sep_
		self.comment = comment_
		
		self.file = open(input_, 'r') # TODO: OPEN SAFELY
		
		self.reactions = []
		
		self._load()
	
	def __del__(self):
		self.file.close()
		
	def _load(self):
		for line in self.file:
			if line.strip() == "\n" or line.strip() == "": # Check for empty lines
				continue
				
			if len(line.strip()) != 0 and line.strip()[0] == self.comment: # Check for comments
				continue
		
			splitted = line.split(":")
			
			if len(splitted) != 4:
				raise ValueError('ReactionParser: problem with the input file (not enough arguments)')
			
			reaction = Reaction(splitted[0].strip(),
								splitted[1].strip(),
								float(splitted[2].strip()),
								splitted[3].strip())
								
			self.reactions.append(reaction)
			
	def print_reactions(self):
		for reaction in self.reactions:
			print(reaction)
			print()
			
	def reaction_table(self):
		kin = []
		
		for reaction in self.reactions:
			splitted = reaction.reaction.split("->")
		
			left = splitted[0].strip()
			right = splitted[-1].strip()
			
			kin.append( ([left, right], (reaction.cst_name, reaction.description, reaction.cst_value) ) )
		
		return kin
		
			
		
if __name__ == "__main__":
	myParser = ReactionParser("reactions.dat")
	
	#myParser.load()
	myParser.print_reactions()
	
	kin = myParser.reaction_table()
	
	print(kin)

Still under construction