Generating PHP parser & usage code
This tutorial will demonstrate how to use the The program interface definition framework to generate a PHP command line parser for your program.
Step 1. Defining the options
The first step is to describe the program options in a XML file. The XML elements have to follow the program interface XML Schema.
miniapp.xml
<?xml version="1.0" encoding="utf-8"?>
<prg:program version="2.0" xmlns:prg="http://xsd.nore.fr/program">
<prg:name>miniapp</prg:name>
<prg:version>1.0</prg:version>
<prg:options>
<prg:switch>
<prg:databinding>
<prg:variable>displayHelp</prg:variable>
</prg:databinding>
<prg:names>
<prg:long>help</prg:long>
<prg:short>h</prg:short>
</prg:names>
</prg:switch>
<prg:argument>
<prg:databinding>
<prg:variable>arg</prg:variable>
</prg:databinding>
<prg:names>
<prg:long>some-arg</prg:long>
<prg:short>a</prg:short>
</prg:names>
</prg:argument>
</prg:options>
</prg:program>
You can use any editor to write this file but an XML editor with auto-completion and XML Schema support will greatly increase the writing speed.
Step 2. Generate parser and program description
Using the build-php command line tool
${NS_XML_PATH}/ns/sh/build-php.sh --xml-description miniapp.xml --embed --output miniapp-cli.php
This command line will generate miniapp-cli.php which will contains
-
A copy of the PHP parser classes
-
A miniappProgramInfo class, extending ProgramInfo, which is a PHP representation of the XML file.
Step 3. Write your program
Let's write a little and useless PHP program miniapp.php
#!/usr/bin/env php
<?php
#
# The line above will tell the shell to invoke the php interpreter
# so the program can be called directly
# ./miniapp.php arg1 arg2 ...
#
# Without this line, you have to type
# php -f miniapp.php -- arg1 arg2 ...
#
# This line should be removed if the program
# can be called through http SAPI
/*
* Include the parser program interface definition
* generated by build-php
*/
require dirname(__FILE__) . "/miniapp-cli.php";
/*
* Represents the miniapp interface description
*/
$info = new miniappProgramInfo
;
/*
* Create a command line parser
*/
$parser = new Parser
($info);
/*
* Parse all command line arguments except the first (the program path)
*
* The returned value is an instance of ProgramResult
* populated dynamically with the value of miniapp's options
*/
$result = $parser->parse($_SERVER["argv"], 1);
/*
* Define several display options for program usage
*/
$usage = new UsageFormat
;
/*
* PregramResult redefines the __invoke magic method.
* This will return TRUE if no error occurs
*/
if (!$result())
{
// Print all warnings and errors
foreach ($result->getMessages() as $m)
{
echo (" - " . $m . "\n");
}
/*
* Prints a short program usage
*/
$usage->format = UsageFormat
::SHORT_TEXT;
echo ($info->usage($usage));
}
/**
* ProgramResult redefines the __get and __call magic methods
* to search in its OptionResult array.
*
* Thus, OptionResult redefines __invoke to return the value of the option.
* In this case, a switch will return a boolean to indicates if it was present or not
*
* The longer version is
* $result["displayHelp"]-isSet
* or
* $result["displayHelp"]-value()
*/
if ($result->displayHelp())
{
/*
* Prints a detailed program usage
*/
$usage->format = UsageFormat
::DETAILED_TEXT;
echo ($info->usage($usage));
}
if ($result->arg->isSet)
{
/*
* Here, __invoke returs the option argument value
*/
echo ("Value of arg: " . $result->arg() . "\n");
}
?>
Step 4. Run!
php -f ./miniapp.php -- --help --some-arg "Bleeeh Blaaah"
You should try to type invalid options or forget the --some-arg argument to see what's happen.
Step 5. Beyond the PHP program
Auto complete
To get a bash auto-completion command file, use the bashcompletion.xsl style sheet to transform the option specification file
xsltproc -o miniapp-autocomplete.inc.sh ${NS_XML_PATH}/ns/xsl/program/${SCHEMA_VERSION}/bashcompletion.xsl miniapp.xml
Then, include the generated file in your current environment
. miniapp-autocomplete.inc.sh
And try typing
./miniapp -<TAB>
The shell will propose...
$ ./miniapp -
-a -h --help --some-arg
See the Bash auto-complete file generation for more details.
XUL Frontend
You can automatically build a XUL application without more work. Follow the XUL Tutorial to learn how.
See also
The program interface definition framework