Blame tools/create-reference.rb

Packit bc1512
#!/usr/bin/env ruby
Packit bc1512
Packit bc1512
# GEGL API creator Øyvind Kolås 2007,
Packit bc1512
#
Packit bc1512
# Use under a public domain license.
Packit bc1512
#
Packit bc1512
Packit bc1512
class Argument
Packit bc1512
    attr_accessor :name, :data_type, :doc
Packit bc1512
    def initialize
Packit bc1512
        @data_type=""
Packit bc1512
        @name=""
Packit bc1512
    end
Packit bc1512
    def data_type
Packit bc1512
        type = @data_type.gsub("const", "").gsub(/\**/,"").gsub(/\s*/, "")
Packit bc1512
        ret = @data_type.sub(/\s+/, " ")
Packit bc1512
        url = ""
Packit bc1512
        
Packit bc1512
        case type
Packit bc1512
        when "void"
Packit bc1512
        when "gint"
Packit bc1512
        when "guint"
Packit bc1512
        when "gchar"
Packit bc1512
        when "gdouble"
Packit bc1512
        when "gfloat"
Packit bc1512
        when "gboolean"
Packit bc1512
        when "gpointer"
Packit bc1512
        when "GList"
Packit bc1512
          url="http://developer.gnome.org/doc/API/2.0/glib/glib-Doubly-Linked-Lists.html#GList"
Packit bc1512
        when "GSList"
Packit bc1512
          url="http://developer.gnome.org/doc/API/2.0/glib/glib-Singly-Linked-Lists.html#GSList"
Packit bc1512
        when "GParamSpec"
Packit bc1512
          url="http://developer.gnome.org/doc/API/2.0/gobject/gobject-GParamSpec.html#GParamSpec"
Packit bc1512
        when "GOptionGroup"
Packit bc1512
          url="http://developer.gnome.org/doc/API/2.2/glib/glib-Commandline-option-parser.html#GOptionGroup"
Packit bc1512
        when "GValue"
Packit bc1512
          url="http://developer.gnome.org/doc/API/2.0/gobject/gobject-Generic-values.html#GValue"
Packit bc1512
        else
Packit bc1512
          url="##{type}"
Packit bc1512
        end
Packit bc1512
        if url!=""
Packit bc1512
          ret.sub(type, "#{type}")
Packit bc1512
        else
Packit bc1512
          ret
Packit bc1512
        end
Packit bc1512
    end
Packit bc1512
end
Packit bc1512
Packit bc1512
class String
Packit bc1512
    def htmlify
Packit bc1512
        self.gsub("\n\n","\n

").gsub("XXX","XXX").gsub("NULL","NULL").gsub(/#([a-zA-Z_]*)/, "\\1").gsub(/@([a-zA-Z_]*)/, "\\1").gsub("TRUE", "TRUE")

Packit bc1512
    end
Packit bc1512
end
Packit bc1512
Packit bc1512
class Section
Packit bc1512
    attr_accessor :name, :doc, :sample
Packit bc1512
    def initialize
Packit bc1512
        @doc=""
Packit bc1512
        @sample=""
Packit bc1512
        @name=""
Packit bc1512
    end
Packit bc1512
    def menu_entry
Packit bc1512
        if @name == "GeglBuffer" or
Packit bc1512
           @name == "GeglNode" or
Packit bc1512
           @name == "GeglColor" or
Packit bc1512
           @name == "GeglRectangle" or
Packit bc1512
           @name == "GeglProcessor" or
Packit bc1512
           @name == "XML" or
Packit bc1512
           @name == "The GEGL API" then
Packit bc1512
          return "
#{@name}
"
Packit bc1512
        else
Packit bc1512
          return "#{@name}"
Packit bc1512
        end
Packit bc1512
    end
Packit bc1512
    def to_s
Packit bc1512
        ret = "#{@name}\n"
Packit bc1512
    end
Packit bc1512
    def sample_html
Packit bc1512
        @sample.gsub('&','&').gsub('<','<').gsub('>','>').gsub(/(.)(#.*)$/, "\\1\\2") 
Packit bc1512
    end
Packit bc1512
    def to_html
Packit bc1512
        ret = "
Packit bc1512
                 

#{@name}

"
Packit bc1512
            ret += "
"
Packit bc1512
            
Packit bc1512
            ret += "

"

Packit bc1512
            ret += @doc.htmlify
Packit bc1512
            ret += "

"
Packit bc1512
            ret += "
#{sample_html}
"
Packit bc1512
            ret += ""
Packit bc1512
        ret += ""
Packit bc1512
    end
Packit bc1512
end
Packit bc1512
Packit bc1512
class Function
Packit bc1512
    attr_accessor :name, :return_type, :return_doc, :doc, :arguments, :sample
Packit bc1512
    def initialize
Packit bc1512
        @arguments = Array.new
Packit bc1512
        @doc=""
Packit bc1512
        @return_type=""
Packit bc1512
        @return_doc=""
Packit bc1512
        @name=""
Packit bc1512
        @sample=""
Packit bc1512
    end
Packit bc1512
    def menu_entry
Packit bc1512
        "  #{@name}"
Packit bc1512
    end
Packit bc1512
    def sample_html
Packit bc1512
        @sample.gsub('&','&').gsub('<','<').gsub('>','>').gsub(/(.)(#.*)$/, "\\1\\2") 
Packit bc1512
    end
Packit bc1512
    def add_arg arg
Packit bc1512
        @arguments << arg
Packit bc1512
    end
Packit bc1512
    def to_s
Packit bc1512
        ret = "#{@return_type} #{@name}\n"
Packit bc1512
        @arguments.each {|arg|
Packit bc1512
            ret += "\t#{arg.data_type} #{arg.name} : #{arg.doc}\n"
Packit bc1512
        }
Packit bc1512
        ret += " _#{@doc}\n"
Packit bc1512
        ret += " _#{@return_doc}\n"
Packit bc1512
        ret += "\n"
Packit bc1512
    end
Packit bc1512
Packit bc1512
    def return_type
Packit bc1512
        type = @return_type.gsub("const", "").gsub(/\**/,"").gsub(/\s*/, "")
Packit bc1512
        ret = @return_type.sub(/\s+/, " ")
Packit bc1512
        url = ""
Packit bc1512
        
Packit bc1512
        case type
Packit bc1512
        when "void"
Packit bc1512
        when "gint"
Packit bc1512
        when "guint"
Packit bc1512
        when "gchar"
Packit bc1512
        when "gdouble"
Packit bc1512
        when "gfloat"
Packit bc1512
        when "gboolean"
Packit bc1512
        when "gpointer"
Packit bc1512
        when "GList"
Packit bc1512
          url="http://developer.gnome.org/doc/API/2.0/glib/glib-Doubly-Linked-Lists.html#GList"
Packit bc1512
        when "GSList"
Packit bc1512
          url="http://developer.gnome.org/doc/API/2.0/glib/glib-Singly-Linked-Lists.html#GSList"
Packit bc1512
        when "GParamSpec"
Packit bc1512
          url="http://developer.gnome.org/doc/API/2.0/gobject/gobject-GParamSpec.html#GParamSpec"
Packit bc1512
        when "GOptionGroup"
Packit bc1512
          url="http://developer.gnome.org/doc/API/2.2/glib/glib-Commandline-option-parser.html#GOptionGroup"
Packit bc1512
        when "GValue"
Packit bc1512
          url="http://developer.gnome.org/doc/API/2.0/gobject/gobject-Generic-values.html#GValue"
Packit bc1512
        else
Packit bc1512
          url="##{type}"
Packit bc1512
        end
Packit bc1512
        if url!=""
Packit bc1512
          ret.sub(type, "#{type}")
Packit bc1512
        else
Packit bc1512
          ret
Packit bc1512
        end
Packit bc1512
    end
Packit bc1512
Packit bc1512
Packit bc1512
    def to_html
Packit bc1512
Packit bc1512
Packit bc1512
        ret = "
Packit bc1512
                 
Packit bc1512
                 
Packit bc1512
                   
Packit bc1512
                   
#{self.return_type.sub(/const/,"const").gsub("*","*")}
Packit bc1512
                   
#{@name}
Packit bc1512
                   "
Packit bc1512
        ret += "
"
Packit bc1512
Packit bc1512
        first=true
Packit bc1512
        i=0
Packit bc1512
        if @arguments.length==0 and @return_type!=""
Packit bc1512
            ret += "
(void)
\n"
Packit bc1512
        end
Packit bc1512
        @arguments.each {|arg|
Packit bc1512
            i=i+1
Packit bc1512
            if(first and i==@arguments.length)
Packit bc1512
            ret += "
Packit bc1512
                      
(#{arg.data_type.sub(/const/,"const").gsub("*","*")}
Packit bc1512
                      
#{arg.name.sub("...","..., NULL")})
Packit bc1512
                    \n"
Packit bc1512
            elsif(first)
Packit bc1512
                first=false
Packit bc1512
            ret += "
Packit bc1512
                      
(#{arg.data_type.sub(/const/,"const").gsub("*","*")}
Packit bc1512
                      
#{arg.name.sub("...","..., NULL")},
Packit bc1512
                    \n"
Packit bc1512
            elsif(i==@arguments.length)
Packit bc1512
            ret += "
Packit bc1512
                      
#{arg.data_type.sub(/const/,"const").gsub("*","*")}
Packit bc1512
                      
#{arg.name.sub("...","..., NULL")})
Packit bc1512
                    \n"
Packit bc1512
            else
Packit bc1512
            ret += "
Packit bc1512
                      
#{arg.data_type.sub(/const/,"const").gsub("*","*")}
Packit bc1512
                      
#{arg.name.sub("...","..., NULL")},
Packit bc1512
                    \n"
Packit bc1512
            end
Packit bc1512
        }
Packit bc1512
Packit bc1512
        ret += ""
Packit bc1512
        ret += "
"
Packit bc1512
        ret += ""
Packit bc1512
        ret += "
"
Packit bc1512
        
Packit bc1512
        ret += "

"

Packit bc1512
        ret += @doc.htmlify;
Packit bc1512
        ret += "

"
Packit bc1512
Packit bc1512
        if @arguments.length > 0
Packit bc1512
            ret += "

Arguments:

"
Packit bc1512
            ret += "\n"
Packit bc1512
            @arguments.each { |arg|
Packit bc1512
                ret += "#{arg.name}"
Packit bc1512
                ret += "#{arg.doc.htmlify}"
Packit bc1512
            }
Packit bc1512
            ret += "\n"
Packit bc1512
        end
Packit bc1512
Packit bc1512
        ret += ""
Packit bc1512
        ret += "
#{@return_doc.htmlify.sub("Returns", "Returns")}
"
Packit bc1512
        ret += "
#{sample_html}
"
Packit bc1512
        ret += ""
Packit bc1512
    end
Packit bc1512
end
Packit bc1512
Packit bc1512
CSS="div.function{
Packit bc1512
    margin-top: 2em;
Packit bc1512
  }
Packit bc1512
  div.function_signature{
Packit bc1512
      background-color: #ddd;
Packit bc1512
      padding: 0.5em;
Packit bc1512
  }
Packit bc1512
  div.function_header{
Packit bc1512
      position: relative;
Packit bc1512
      top: 0;
Packit bc1512
      left: 0;
Packit bc1512
      display:block;
Packit bc1512
  }
Packit bc1512
  div.return_type{
Packit bc1512
        display: block;
Packit bc1512
        font-style: italic;
Packit bc1512
        color: #22F;
Packit bc1512
        float:left;
Packit bc1512
        padding-right: 1em;
Packit bc1512
  }
Packit bc1512
  div.function_name{
Packit bc1512
     display: block;
Packit bc1512
     float: left;
Packit bc1512
     font-weight: bold;
Packit bc1512
  }
Packit bc1512
  div.function_args{
Packit bc1512
        float: right;
Packit bc1512
      display:block;
Packit bc1512
  }
Packit bc1512
  div.argument{
Packit bc1512
     display: block;
Packit bc1512
     clear: left;
Packit bc1512
  }
Packit bc1512
  div.arg_type{
Packit bc1512
        display: block;
Packit bc1512
        font-style: italic;
Packit bc1512
        color: #22F;
Packit bc1512
        width: 11em;
Packit bc1512
        float: left;
Packit bc1512
  }
Packit bc1512
  div.arg_name{
Packit bc1512
        color: #050;
Packit bc1512
        display: block;
Packit bc1512
        float: left;
Packit bc1512
  }
Packit bc1512
  span.arg_name{
Packit bc1512
        color: #050;
Packit bc1512
  }
Packit bc1512
  div.arg_doc{
Packit bc1512
        display: none;
Packit bc1512
  }
Packit bc1512
  div.function_doc{
Packit bc1512
        display: block;
Packit bc1512
        margin-top: 2em;
Packit bc1512
  }
Packit bc1512
  div.float_breaker{
Packit bc1512
     clear: both;
Packit bc1512
  }
Packit bc1512
  div.return_doc{
Packit bc1512
        margin-top: 2em;
Packit bc1512
  }
Packit bc1512
  span.const{
Packit bc1512
        color: grey;
Packit bc1512
  }
Packit bc1512
  span.pointer{
Packit bc1512
        color: red;
Packit bc1512
  }
Packit bc1512
  span.varargs{
Packit bc1512
        color: #F22;
Packit bc1512
        font-style: italic;
Packit bc1512
  }
Packit bc1512
  span.keyword {
Packit bc1512
        color: #22F;
Packit bc1512
        font-family: mono;
Packit bc1512
  }
Packit bc1512
Packit bc1512
  div.sect{
Packit bc1512
    margin-top: 2em;
Packit bc1512
  }
Packit bc1512
  div.sect_doc{
Packit bc1512
        display: block;
Packit bc1512
        margin-top: 2em;
Packit bc1512
  }
Packit bc1512
"
Packit bc1512
Packit bc1512
elements = []
Packit bc1512
function = nil
Packit bc1512
state = :none
Packit bc1512
arg_no=0
Packit bc1512
Packit bc1512
(ARGV.length-1).times {
Packit bc1512
    |file_no|
Packit bc1512
line_no=0
Packit bc1512
Packit bc1512
state=:none
Packit bc1512
puts ARGV[file_no]
Packit bc1512
Packit bc1512
IO.foreach(ARGV[file_no]) {
Packit bc1512
    |line|
Packit bc1512
    line_no = line_no+1
Packit bc1512
Packit bc1512
    case state
Packit bc1512
    when :none
Packit bc1512
        state = :start if (line =~ /\/\*\*/)
Packit bc1512
        state = :section if (line =~ /\/\*\*\*/)
Packit bc1512
    when :section
Packit bc1512
        line =~ / \* (.*):/
Packit bc1512
        elements << function if (function!=nil)
Packit bc1512
        function=Section.new
Packit bc1512
        function.name=$1.to_s
Packit bc1512
        state = :section_doc
Packit bc1512
    when :start
Packit bc1512
        line =~ / \* (.*):(.*)/
Packit bc1512
        elements << function if (function!=nil)
Packit bc1512
        function=Function.new
Packit bc1512
        function.name=$1.to_s
Packit bc1512
        # $2 is the introspection annotations
Packit bc1512
        state = :args
Packit bc1512
        arg_no=-1
Packit bc1512
    when :args
Packit bc1512
        if line =~ /.*@(.*):(.*):(.*)/
Packit bc1512
            arg_no=arg_no+1
Packit bc1512
            argument=Argument.new
Packit bc1512
            argument.name=$1
Packit bc1512
            # $2 is introspection annotations
Packit bc1512
            argument.doc=""+$3.to_s
Packit bc1512
            function.add_arg argument
Packit bc1512
        elsif line =~ /.*@(.*):(.*)/
Packit bc1512
            arg_no=arg_no+1
Packit bc1512
            argument=Argument.new
Packit bc1512
            argument.name=$1
Packit bc1512
            argument.doc=""+$2.to_s
Packit bc1512
            function.add_arg argument
Packit bc1512
        elsif line =~ / \*(.*)/
Packit bc1512
            if $1.chomp==''
Packit bc1512
                state=:more
Packit bc1512
            else
Packit bc1512
              function.arguments[arg_no].doc = function.arguments[arg_no].doc + $1.to_s + "\n" if arg_no != -1
Packit bc1512
            end
Packit bc1512
        else
Packit bc1512
            state=:more
Packit bc1512
        end
Packit bc1512
Packit bc1512
    when :section_doc
Packit bc1512
        if line =~ /^ \* ---/
Packit bc1512
            state=:section_sample
Packit bc1512
        elsif line =~ /\*\//
Packit bc1512
            state=:none
Packit bc1512
        else
Packit bc1512
            line =~ /.*\*(.*)/
Packit bc1512
            function.doc = function.doc + $1.to_s + "\n"
Packit bc1512
        end
Packit bc1512
    when :section_sample
Packit bc1512
        if line =~ /\*\//
Packit bc1512
            state=:none
Packit bc1512
        else
Packit bc1512
            line =~ /.*\* (.*)/
Packit bc1512
            function.sample = function.sample + $1.to_s + "\n"
Packit bc1512
        end
Packit bc1512
    when :function_sample
Packit bc1512
        if line =~ /\*\//
Packit bc1512
            state=:fun
Packit bc1512
            arg_no=0
Packit bc1512
        else
Packit bc1512
            line =~ /.*\* (.*)/
Packit bc1512
            function.sample = function.sample + $1.to_s + "\n"
Packit bc1512
        end
Packit bc1512
    when :more
Packit bc1512
        if line =~ /^ \* ---/
Packit bc1512
            state=:function_sample
Packit bc1512
        elsif line =~ /.*(Returns.*)/
Packit bc1512
            function.return_doc = $1 + "\n"
Packit bc1512
            state=:more_return
Packit bc1512
        elsif line =~ /\*\//
Packit bc1512
            state=:fun
Packit bc1512
            arg_no=0
Packit bc1512
        else
Packit bc1512
            line =~ /.*\*(.*)/
Packit bc1512
            function.doc = function.doc + $1.to_s + "\n"
Packit bc1512
        end
Packit bc1512
Packit bc1512
    when :more_return
Packit bc1512
        if line =~ /^ \* ---/
Packit bc1512
            state=:function_sample
Packit bc1512
        elsif line =~ /\*\//
Packit bc1512
            state=:fun
Packit bc1512
            arg_no=0
Packit bc1512
        else
Packit bc1512
            line =~ /.*\*(.*)/
Packit bc1512
            function.return_doc = function.return_doc + $1.to_s + "\n"
Packit bc1512
        end
Packit bc1512
Packit bc1512
    when :fun  # might be getting more data on current fun
Packit bc1512
        if line=~ /^\s*((?:const)?\s*[a-zA-Z\d_]*\s*\**\s*)([a-z_\d]*)\s*\(\s*((?:const)?\s*[a-zA-Z\d_]*\s*\**)\s*([a-zA-Z\d_]*)(,?)/
Packit bc1512
            #.*\(([a-zA-Z_\s\*])([a-zA-Z\d]*)/
Packit bc1512
            function.return_type=$1
Packit bc1512
            name=$2
Packit bc1512
            argtype=$3
Packit bc1512
            argname=$4
Packit bc1512
            comma=$5
Packit bc1512
            arg_no=0
Packit bc1512
Packit bc1512
            if name!=function.name and function.name!='GeglProcessor'
Packit bc1512
                puts "#{line_no}:function name mismatch #{name}!=#{function.name}"
Packit bc1512
            end
Packit bc1512
            if argtype=='void'
Packit bc1512
                state=:none
Packit bc1512
            elsif argtype==''
Packit bc1512
                puts "#{line_no}: empty argument list"
Packit bc1512
                state=:none
Packit bc1512
            else
Packit bc1512
                if argname==''
Packit bc1512
                   puts "#{line_no}: expected argument name"
Packit bc1512
                   state=:none
Packit bc1512
                end
Packit bc1512
                if (function.arguments[arg_no].name!=argname)
Packit bc1512
                   puts "#{line_no}: #{function.arguments[arg_no].name}!=#{argname}"
Packit bc1512
                end
Packit bc1512
                function.arguments[arg_no].data_type=argtype
Packit bc1512
                arg_no = arg_no+1
Packit bc1512
            end
Packit bc1512
        elsif line=~ /^\s*((?:const)?\s*[a-zA-Z\d_]*\s*\**\s*)([a-z_\d]*)/
Packit bc1512
            argtype=$1
Packit bc1512
            argname=$2
Packit bc1512
            if (argtype!='' and argname!='' and function.arguments.length>arg_no)
Packit bc1512
                if (function.arguments[arg_no].name!=argname)
Packit bc1512
                   puts "#{line_no}: #{function.arguments[arg_no].name}!=#{argname}"
Packit bc1512
                end
Packit bc1512
                function.arguments[arg_no].data_type=argtype
Packit bc1512
                arg_no = arg_no+1
Packit bc1512
            end
Packit bc1512
        else
Packit bc1512
            #puts "we're in fun and got: #{line}"
Packit bc1512
        end
Packit bc1512
        state = :start if (line =~ /\/\*\*/)
Packit bc1512
        state = :section if (line =~ /\/\*\*\*/)
Packit bc1512
    else
Packit bc1512
        state=:none
Packit bc1512
    end
Packit bc1512
}
Packit bc1512
}
Packit bc1512
Packit bc1512
if ARGV.length<2
Packit bc1512
    puts "usage: #{$0} <header1 [header2 ..]> <output.html>"
Packit bc1512
    exit
Packit bc1512
end
Packit bc1512
Packit bc1512
=begin
Packit bc1512
File.open(ARGV[1], "w") {|file|
Packit bc1512
    file.puts "<html><body><head><style type='text/css'>#{CSS}</style></head>"
Packit bc1512
    elements.each {|fun| file.puts fun.to_html
Packit bc1512
    file.puts "</body></html>"
Packit bc1512
    }
Packit bc1512
}
Packit bc1512
=end
Packit bc1512
Packit bc1512
Packit bc1512
File.open(ARGV[ARGV.length-1], "w") {|file|
Packit bc1512
Packit bc1512
file.puts "
Packit bc1512
<html>          
Packit bc1512
  <head>
Packit bc1512
    <title>GEGL API</title>
Packit bc1512
    <meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />
Packit bc1512
Packit bc1512
    <style type='text/css'>
Packit bc1512
       @import url(\"gegl.css\");
Packit bc1512
       div#toc ul {
Packit bc1512
          font-size: 70%;
Packit bc1512
       }
Packit bc1512
       h3 {
Packit bc1512
         margin-top: 2em;
Packit bc1512
         margin-bottom: 0;
Packit bc1512
         padding-bottom: 0;
Packit bc1512
         padding-top: 0.2em;
Packit bc1512
         border-top: 1px solid grey;
Packit bc1512
       }
Packit bc1512
       h4 {
Packit bc1512
         margin-top: 1.5em;
Packit bc1512
         margin-bottom: 0;
Packit bc1512
         padding-bottom: 0.5em;
Packit bc1512
         padding-top: 0.2em;
Packit bc1512
         border-top: 1px solid grey;
Packit bc1512
       }
Packit bc1512
       #{CSS}
Packit bc1512
    </style>
Packit bc1512
    </head>
Packit bc1512
    <body>"
Packit bc1512
Packit bc1512
file.puts "
Packit bc1512
      
Packit bc1512
         

Contents

Packit bc1512
      
Packit bc1512
      
    Packit bc1512
            
  • GEGL
  • Packit bc1512
            
  • Documentation
  • Packit bc1512
            
  •   Glossary
  • Packit bc1512
            
  •   Operations
  • Packit bc1512
    Packit bc1512
    "
    Packit bc1512
        elements.each { |element|
    Packit bc1512
          file.puts "
  • #{element.menu_entry}
  • "
    Packit bc1512
        }
    Packit bc1512
        file.puts "\n"
    Packit bc1512
       
    Packit bc1512
        file.puts "
    "
    Packit bc1512
        elements.each {|element| 
    Packit bc1512
            if !element.name.empty?
    Packit bc1512
            file.puts "
    #{element.to_html}
    "
    Packit bc1512
            end
    Packit bc1512
        }
    Packit bc1512
        file.puts "
    Packit bc1512
      </body>
    Packit bc1512
    </html>"
    Packit bc1512
    Packit bc1512
    }
    Packit bc1512
    Packit bc1512
    File.open("gegl.devhelp", "w") {|file|
    Packit bc1512
        file.puts "
    Packit bc1512
    Packit bc1512
    <book xmlns='http://www.devhelp.net/book' title='GEGL Reference Manual' link='api.html' author='' name='gegl'>"
    Packit bc1512
        file.puts "<chapters>"
    Packit bc1512
        elements.each { |element|
    Packit bc1512
           if element.is_a? Section and !element.name.empty?
    Packit bc1512
             file.puts "<sub name='#{element.name}' link='api.html\##{element.name.gsub(' ','_')}'/>"
    Packit bc1512
           end
    Packit bc1512
        }
    Packit bc1512
        file.puts "<sub name='Operations' link='operations.html'/>"
    Packit bc1512
        file.puts "</chapters>"
    Packit bc1512
        file.puts "<functions>"
    Packit bc1512
    Packit bc1512
        elements.each { |element|
    Packit bc1512
           if element.is_a? Function and !element.name.empty?
    Packit bc1512
             file.puts "<function name='#{element.name}' link='api.html\##{element.name.gsub(' ','_')}'/>"
    Packit bc1512
           end
    Packit bc1512
           if element.is_a? Section and !element.name.empty? and element.name=~ /^Gegl/
    Packit bc1512
             file.puts "<function name='#{element.name}' link='api.html\##{element.name.gsub(' ','_')}'/>"
    Packit bc1512
           end
    Packit bc1512
    Packit bc1512
    Packit bc1512
        }
    Packit bc1512
    Packit bc1512
        IO.foreach("operations.html"){ |line|
    Packit bc1512
            if line =~ /^
  • .*<\/a><\/li>/
  • Packit bc1512
                opname=line.gsub(/.*op_/,'').gsub(/'.*/,'').strip
    Packit bc1512
                file.puts "<function name='#{opname}' link='operations.html#op_#{opname}'/>"
    Packit bc1512
            end
    Packit bc1512
        }
    Packit bc1512
    Packit bc1512
        file.puts "</functions>"
    Packit bc1512
        file.puts "</book>"
    Packit bc1512
    }