|
| NabML, un dialecte XML pour le lapin | |
| | Auteur | Message |
---|
Harfangdesneiges Special Nabz
Age : 28 Localisation : Quelque part sur la côte d'Azur Nbr de messages : 1383 Carottes : 6525
| Sujet: NabML, un dialecte XML pour le lapin Ven 26 Nov 2010 - 16:40 | |
| Bonjour à tous ! J'ai codé un truc qui s'appelle le NabML : il s'agit d'un dialecte XML, accompagné de son parseur écrit en PHP, fait pour envoyer des messages au lapin et interagir avec son API. Il supporte actuellement toutes les commandes de l'API (enfin je crois bien). Voici un exemple de code : - Code:
-
<app> <!-- Définition du serial et du token ; ici, c'est le script qui choisit --> <config serial="{SERIAL}" token="{TOKEN}" /> <!-- Création d'une chorégraphie --> <chor tempo="10"> <led pos="top" r="255" g="255" b="255" time="0" /> <led pos="bottom" r="255" g="255" b="255" time="10" /> <led pos="left" r="255" g="255" b="255" time="10" /> <led pos="right" r="255" g="255" b="255" time="10" /> <led pos="middle" r="255" g="255" b="255" time="10" /> <motor ear="left" angle="60" direction="1" time="10" /> <motor ear="right" angle="60" direction="0" time="10" /> </chor> <!-- Envoi de la requête --> <sendRequest /> <!-- Envoi de TTS --> <tts voice="FR-Archibald" text="YO" /> <!-- Changement de position des oreilles --> <ear ear="left" pos="0" /> <ear ear="right" pos="12" /> <sendRequest /> <!-- Inclusion d'un fichier NabML (peut être désactivé pour raisons de sécurité) --> <nabMLInclude url="ex2.xml" /> <!-- Création d'un flux mp3 --> <streamMp3 url="http://url.com/mp3.mp3" /> <streamMp3 url="http://url.com/mp3_2.mp3" /> <!-- Envoi des deux flux --> <sendStream /> <!-- Exécution d'une action (a peu d'intérêt suivant les actions, enfin toujours est-il que ça marche) --> <action id="1"> <sendRequest /> <!-- Bascule de l'état : si le Nabz dort, on le réveille ; si il est réveillé, on l'endort --> <sleepToggle /> </app> Le code du parseur (qui devrait être compréhensible par n'importe qui sans grandes difficultés) : - Spoiler:
- Code:
-
<?php /***************** NabML - Un dialecte XML pour le Nabaztag / Copyright 2010 Harfangdesneiges
License CC-BY-SA (cf : http://creativecommons.org/licenses/by-sa/2.0/fr/)
*****************/
// Autoriser ou non l'inclusion de NabML (conseillé : false pour des raisons de sécurité) define('ALLOW_NABML_INCLUDE', false);
$GLOBALS['serial'] = ''; $GLOBALS['token'] = ''; $app = array(); $app['config'] = array(); $app['config']['sn'] = ''; $app['config']['token'] = ''; $app['chor'] = array(); $app['chor']['content'] = ''; $app['chor']['title'] = ''; $app['request'] = array(); $app['request']['tts'] = array(); $app['request']['tts']['voice'] = ''; $app['request']['tts']['text'] = ''; $app['request']['stream'] = array(); $app['request']['action'] = 0; function nabml_parse($serial, $token, $xml, $recursive = false, &$parser = NULL) { if($recursive != true) { $GLOBALS['serial'] = $serial; $GLOBALS['token'] = $token; } if(isset($parser)) xml_parse($parser, $xml); else { $parser = xml_parser_create(); xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, false); xml_set_element_handler($parser, 'start_element_handler', 'end_element_handler'); xml_parse($parser, $xml); } global $server_answer; return $server_answer; }
function start_element_handler($parser, $name, $attrs) { global $app; global $server_answer; $server_answer = array(); switch($name) { case 'config': if(isset($attrs['serial']) && isset($attrs['token'])) { if($attrs['serial'] == '{SERIAL}') { $app['config']['sn'] = $GLOBALS['serial']; } else { $app['config']['sn'] = $attrs['serial']; } if($attrs['token'] == '{TOKEN}') { $app['config']['token'] = $GLOBALS['token']; } else { $app['config']['token'] = $attrs['token']; } } else { $app['config']['sn'] = $GLOBALS['serial']; $app['config']['token'] = $GLOBALS['token']; } break; case 'chor': if(isset($attrs['tempo'])) { $app['chor']['content'] .= $attrs['tempo']; if(!empty($attrs['title'])) $app['chor']['title'] = $attrs['title']; } else { exit('Chor:tempo/title error'); } break; case 'led': if(isset($attrs['pos']) && isset($attrs['r']) && isset($attrs['g']) && isset($attrs['b']) && isset($attrs['time'])) { $pos = 0; switch($attrs['pos']) { case 'top': $pos = 4; break; case 'bottom': $pos = 0; break; case 'left': $pos = 1; break; case 'middle': $pos = 2; break; case 'right': $pos = 3; break; default: exit('Chor:led position error'); break; } if(($attrs['r'] + $attrs['g'] + $attrs['b']) > 255*3) exit('Chor:led color error'); else $app['chor']['content'] .= ','.$attrs['time'].',led,'.$pos.','.$attrs['r'].','.$attrs['g'].','.$attrs['b']; } break; case 'motor': if(isset($attrs['ear']) && isset($attrs['angle']) && isset($attrs['direction']) && isset($attrs['time'])) { if($attrs['ear'] == 'left') $ear = 1; elseif($attrs['ear'] == 'right') $ear = 0; else exit('Chor:ear error'); if($attrs['angle'] <= 0 || $attrs['angle'] >= 180) exit('Chor:ear angle error'); if(!($attrs['direction'] == 0 || $attrs['direction'] == 1)) exit('Chor:ear direction error'); $app['chor']['content'] .= ','.$attrs['time'].',motor,'.$ear.','.$attrs['angle'].',0,'.$attrs['direction']; } else exit('Chor:motor error'); break; case 'tts': if(isset($attrs['voice']) && isset($attrs['text'])) { $app['request']['tts']['voice'] = $attrs['voice']; $app['request']['tts']['text'] = $attrs['text']; } else exit('TTS:voice/text error'); break; case 'ear': if(isset($attrs['ear']) && isset($attrs['pos'])) { $ear = $attrs['ear']; if($attrs['pos'] >= 0 && $attrs['pos'] <= 16 && ($attrs['ear'] == 'left' || $attrs['ear'] == 'right')) $app['request']['ears'][$ear] = $attrs['pos']; else exit('Ears:bad pos/ear'); } else exit('Ears:error'); break; case 'action': if(isset($attrs['id']) && $attrs['id'] >= 1 && $attrs['id'] <= 14) { $app['request']['action'] = $attrs['id']; } else exit('Action:bad id'); break; case 'sendRequest': $request = 'http://api.nabaztag.com/vl/FR/api.jsp?sn='.$app['config']['sn'].'&token='.$app['config']['token']; if(!empty($app['request']['tts']['voice']) && !empty($app['request']['tts']['text'])) $request .= '&voice='.$app['request']['tts']['voice'].'&tts='.urlencode($app['request']['tts']['text']); if(!empty($app['request']['ears']['left'])) $request .= '&posleft='.$app['request']['ears']['left']; if(!empty($app['request']['ears']['right'])) $request .= '&posright='.$app['request']['ears']['right'].'&ears=ok'; if(!empty($app['chor']['content'])) $request .= '&chor='.$app['chor']['content']; if(!empty($app['chor']['title'])) $request .= '&chortitle='.$app['chor']['title']; if(!empty($app['request']['action'])) $request .= '&action='.$app['request']['action']; $server_answer[] = file_get_contents($request); break; case 'streamMp3': if(!empty($attrs['url'])) $app['request']['stream'][] = $attrs['url']; else exit('Stream:no url'); break; case 'sendStream': $request = 'http://api.nabaztag.com/vl/FR/api_stream.jsp?sn='.$app['config']['sn'].'&token='.$app['config']['token']; if(isset($app['request']['stream'][0])) { foreach($app['request']['stream'] as $value) { if($request == 'http://api.nabaztag.com/vl/FR/api_stream.jsp?sn='.$app['config']['sn'].'&token='.$app['config']['token']) $request .= '&urlList='.$value; else $request .= '|'.$value; } $server_answer[] = file_get_contents($request); } else exit('Stream:no mp3 to send'); break; case 'sleepToggle': if(preg_match('#yes#i', file_get_contents('http://api.nabaztag.com/vl/FR/api.jsp?sn='.$app['config']['sn'].'&token='.$app['config']['token'].'&action=7'))) { $server_answer[] = file_get_contents('http://api.nabaztag.com/vl/FR/api.jsp?sn='.$app['config']['sn'].'&token='.$app['config']['token'].'&action=14'); } else { $server_answer[] = file_get_contents('http://api.nabaztag.com/vl/FR/api.jsp?sn='.$app['config']['sn'].'&token='.$app['config']['token'].'&action=13'); } break; case 'nabMLInclude': if(ALLOW_NABML_INCLUDE == true) { if(isset($attrs['url'])) { $remote_nabml = file_get_contents($attrs['url']); if($remote_nabml == false) exit('NabML include:can't find the file'); else { nabml_parse(0, 0, $remote_nabml, true); } } else exit('NabML include:no url'); } else exit('NabML include:not allowed!'); break; case 'app': break; default: exit($name.' doesn't exist !'); break; } }
function end_element_handler($parser, $name) { return "nothing to do right now"; } ?>
Un exemple d'utilisation : - Code:
-
<?php include('parser.php'); $xml = file_get_contents('ex.xml'); $foo = nabml_parse('0118CF9A2680', '1234655660', $xml); // le couple serial/token n'existe pas réellement ;) Je ne sais pas si ça sert à grand-chose, mais toujours est-il que ça marche. J'ai pas fait de DTD, si ça intéresse du monde je m'y attellerais... | |
| | | nabazland Karotzeur taquin
Age : 57 Localisation : Rouen - France Nabaztag : Caulfield (v2.1) Nbr de messages : 9783 Carottes : 13344
| Sujet: Re: NabML, un dialecte XML pour le lapin Ven 26 Nov 2010 - 18:35 | |
| Bon boulot ! _____________________________
| |
| | | | NabML, un dialecte XML pour le lapin | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |