Earlier this year, I already added XML output to yast2-core which came in very handy for this project. Using the REXML stream listener to code the translator was the fun part of a couple of late night hacks.
The result is a complete syntax translator for all YaST client and module code. The generated Ruby code is nicely indented and passes the Ruby syntax checker.
Combined with Duncans Ruby-YCP bindings, translating ycp to Ruby should be quite useful as we try to provide support for more widespread scripting languages.
The translator is available at svn.opensuse.org and requires a recent version of yast2-core, which supports XML output and the '-x' parameter of ycpc.
Then run
ycpc -c -x file.ycp -o file.xmlto convert YCP code to XML.
Now use the xml-ruby translator as
cd yxmlconv ruby src/converter.rb file.xml > file.rb
Translating e.g /usr/share/YaST2/modules/Arch.ycp
{
module "Arch";
// local variables
string _architecture = nil;
string _board_compatible = nil;
string _checkgeneration = "";
boolean _has_pcmcia = nil;
boolean _is_laptop = nil;
boolean _is_uml = nil;
boolean _has_smp = nil;
// Xen domain (dom0 or domU)
boolean _is_xen = nil;
// Xen dom0
boolean _is_xen0 = nil;
/* ************************************************************ */
/* system architecture */
/**
* General architecture type
*/
global string architecture () {
if (_architecture == nil)
_architecture = (string)SCR::Read(.probe.architecture);
return _architecture;
}
...
outputs the following Ruby code
module Arch
require 'ycp/SCR'
_architecture = nil
_board_compatible = nil
_checkgeneration = ""
_has_pcmcia = nil
_is_laptop = nil
_is_uml = nil
_has_smp = nil
_is_xen = nil
_is_xen0 = nil
def architecture( )
if ( _architecture == nil ) then
_architecture = Ycp::Builtin::Read( ".probe.architecture" )
end
return _architecture
end
...
Preserving the comments from the ycp code would be nice -- for next Hackweek.
Btw, it's fairly straightforward to change the translator to output e.g. Python or Java or C# or ...
No comments:
Post a Comment