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