summaryrefslogtreecommitdiffstats
path: root/fontpackages/comps.rb
diff options
context:
space:
mode:
Diffstat (limited to 'fontpackages/comps.rb')
-rwxr-xr-xfontpackages/comps.rb195
1 files changed, 195 insertions, 0 deletions
diff --git a/fontpackages/comps.rb b/fontpackages/comps.rb
new file mode 100755
index 0000000..9f654fc
--- /dev/null
+++ b/fontpackages/comps.rb
@@ -0,0 +1,195 @@
+#! /usr/bin/env ruby
+# -*- encoding: utf-8 mode: ruby -*-
+# comps.rb
+# Copyright (C) 2009-2010 Red Hat, Inc.
+
+# Authors:
+# Akira TAGOH <tagoh@redhat.com>
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+require 'rubygems'
+gem 'hpricot'
+require 'hpricot'
+
+module Comps
+
+=begin rdoc
+
+== Comps::Package
+
+=end
+
+ class Package
+
+ def initialize(name, type, requires)
+ @name = name
+ @type = type
+ @requires = requires
+ end # def initialize
+
+ attr_reader :name
+
+ def is_default?
+ @type == "mandatory" || @type == "default"
+ end # def is_default?
+
+ def is_mandatory?
+ @type == "mandatory"
+ end # def is_mandatory?
+
+ def <=>(b)
+ @name <=> b.name
+ end # def
+
+ end # class Package
+
+=begin rdoc
+
+== Comps::Group
+
+=end
+
+ class Group
+
+ def initialize(name, lang, is_enabled, is_visible)
+ @name = name
+ @is_lang_support = !lang.nil? && !lang.empty?
+ @lang = lang
+ @is_enabled = is_enabled
+ @is_visible = is_visible
+ @packages = []
+ end # def initialize
+
+ attr_reader :name, :lang
+
+ def is_language_support?
+ @is_lang_support
+ end # def is_language_support?
+
+ def is_enabled?
+ @is_enabled
+ end # def is_enabled?
+
+ def is_visible?
+ @is_visible
+ end # def is_visible?
+
+ def push(*x)
+ @packages.push(*x)
+ end # def push
+
+ alias :<< :push
+
+ def packages(mode = :all)
+ case mode
+ when :all
+ @packages
+ when :default
+ @packages.map do |pkg|
+ pkg.is_default? ? pkg : nil
+ end.compact
+ else
+ STDERR.printf("W: unknown query mode: %s\n", mode)
+ end
+ end # def packages
+
+ def has_package?(package)
+ @packages.map do |pkg|
+ if package.kind_of?(Comps::Package) then
+ pkg.name == package.name
+ else
+ pkg.name == package
+ end
+ end.include?(true)
+ end # def has_package?
+
+ def package(package)
+ @package.each do |pkg|
+ if package.kind_of?(Comps::Package) then
+ return pkg if pkg.name == package.name
+ else
+ return pkg if pkg.name == package
+ end
+ end
+ nil
+ end # def package
+
+ end # class Group
+
+=begin rdoc
+
+== Comps::Root
+
+=end
+
+ class Root
+
+ def initialize(file)
+ File.open(file) do |f|
+ x = f.read
+ @doc = Hpricot(x)
+ end
+ end # def initialize
+
+ def inspect
+ sprintf("#<%s:0x%x>", self.class, self.object_id)
+ end # def inspect
+
+ def group(name)
+ _groups.map do |g|
+ g.name == name ? g : nil
+ end.compact[0]
+ end # def group
+
+ def groups(mode = :all)
+ case mode
+ when :all
+ _groups
+ when :langonly
+ _groups.map do |g|
+ g.is_language_support? ? g : nil
+ end.compact
+ else
+ STDERR.printf("W: unknown query mode: %s\n", mode)
+ end
+ end # def groups
+
+ private
+
+ def _groups
+ retval = []
+ @doc.search("group") do |element|
+ id = element.search("id")
+ if id.empty? then
+ STDERR.printf("W: invalid entry: %s", element.pretty_print)
+ else
+ lang = element.search("langonly")
+ default = element.search("default")
+ visible = element.search("uservisible")
+ retval << Comps::Group.new(id.inner_html, lang.inner_html, default.inner_html == "true", visible.inner_html == "true")
+ list = element.search("packagereq")
+ list.each do |pkg|
+ retval[-1] << Comps::Package.new(pkg.inner_html, pkg[:type], pkg[:conditional])
+ end
+ end
+ end
+ retval
+ end # def _groups
+
+ end # class Root
+
+end # module Comps