#!/usr/bin/env python

from xml.sax.saxutils import escape, quoteattr

from param import *
from emit import Emit

# Emit APM documentation in an machine readable XML format
class XmlEmit(Emit):
    
    def __init__(self):
        wiki_fname = 'apm.pdef.xml'
        self.f = open(wiki_fname, mode='w')
        preamble = '''<?xml version="1.0" encoding="utf-8"?>
        <!-- Dynamically generated list of documented parameters (generated by param_parse.py) -->    
        <paramfile>
        <vehicles>
        '''
        self.f.write(preamble)
    
    def close(self): 
        self.f.write('</libraries>')
        self.f.write('''</paramfile>\n''')
        self.f.close
        
    def emit_comment(self, s):
        self.f.write("<!-- " + s + " -->")

    def start_libraries(self):
        self.f.write('</vehicles>')
        self.f.write('<libraries>')
    
    def emit(self, g, f):
        t = '''<parameters name=%s>\n'''  % quoteattr(g.name) # i.e. ArduPlane
        
        for param in g.params:
            # Begin our parameter node
            if hasattr(param, 'DisplayName'):   
                t += '<param humanName=%s name=%s' % (quoteattr(param.DisplayName),quoteattr(param.name)) # i.e. ArduPlane (ArduPlane:FOOPARM)
            else:
                t += '<param name=%s' % quoteattr(param.name)
                    
            if hasattr(param, 'Description'):   
                t += ' documentation=%s' % quoteattr(param.Description) # i.e. parameter docs
            if hasattr(param, 'User'):
                t += ' user=%s' % quoteattr(param.User) # i.e. Standard or Advanced
            
            t += ">\n"
            
            # Add values as chidren of this node
            for field in param.__dict__.keys():
                if field not in ['name', 'DisplayName', 'Description', 'User'] and field in known_param_fields:
                    if field == 'Values' and Emit.prog_values_field.match(param.__dict__[field]):
                        t+= "<values>\n"
                        
                        values = (param.__dict__[field]).split(',')
                        for value in values:
                            v = value.split(':')
                            t+='''<value code=%s>%s</value>\n''' % (quoteattr(v[0]), escape(v[1])) # i.e. numeric value, string label
                            
                        t += "</values>\n"
                    else:
                        t += '''<field name=%s>%s</field>\n''' % (quoteattr(field), escape(param.__dict__[field])) # i.e. Range: 0 10
            
            t += '''</param>\n'''
        t += '''</parameters>\n'''
                        
        #print t
        self.f.write(t)