/usr/lib/ruby/1.9.1/ramaze/gestalt.rb is in libramaze-ruby1.9.1 2010.06.18-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | #          Copyright (c) 2009 Michael Fellinger m.fellinger@gmail.com
# All files in this distribution are subject to the terms of the Ruby license.
=begin rdoc
Example:
  require 'ramaze'
  require 'ramaze/gestalt'
  page = Ramaze::Gestalt.build{
    title = 'Hello, World!'
    html do
      head{ title(title) }
      body do
        h1(title)
        p 'I count to 10'
        ('1'..'10').each do |count|
          div(:style => 'width: 25px; height: 25px'){ count }
        end
      end
    end
  }
=end
module Ramaze
  # Gestalt is the custom HTML/XML builder for Ramaze, based on a very simple
  # DSL it will build your markup.
  class Gestalt
    attr_accessor :out
    # The default way to start building your markup.
    # Takes a block and returns the markup.
    #
    # Example:
    #   html =
    #     Gestalt.build do
    #       html do
    #         head do
    #           title "Hello, World!"
    #         end
    #         body do
    #           h1 "Hello, World!"
    #         end
    #       end
    #     end
    #
    def self.build(&block)
      self.new(&block).to_s
    end
    # Gestalt.new is like ::build but will return itself.
    # you can either access #out or .to_s it, which will
    # return the actual markup.
    #
    # Useful for distributed building of one page.
    def initialize(&block)
      @out = []
      instance_eval(&block) if block_given?
    end
    # catching all the tags. passing it to _gestalt_build_tag
    def method_missing(meth, *args, &block)
      _gestalt_call_tag meth, args, &block
    end
    # workaround for Kernel#p to make <p /> tags possible.
    def p(*args, &block)
      _gestalt_call_tag :p, args, &block
    end
    # workaround for Kernel#select to make <select></select> work
    def select(*args, &block)
      _gestalt_call_tag(:select, args, &block)
    end
    def _gestalt_call_tag(name, args, &block)
      if args.size == 1 and args[0].kind_of? Hash
        # args are just attributes, children in block...
        _gestalt_build_tag name, args[0], &block
      elsif args[1].kind_of? Hash
        # args are text and attributes ie. a('mylink', :href => '/mylink')
        _gestalt_build_tag(name, args[1], args[0], &block)
      else
        # no attributes, but text
        _gestalt_build_tag name, {}, args, &block
      end
    end
    # build a tag for `name`, using `args` and an optional block that
    # will be yielded
    def _gestalt_build_tag(name, attr = {}, text = [])
      @out << "<#{name}"
      @out << attr.map{|(k,v)| %[ #{k}="#{_gestalt_escape_entities(v)}"] }.join
      if text != [] or block_given?
        @out << ">"
        @out << _gestalt_escape_entities([text].join)
        if block_given?
          text = yield
          @out << text.to_str if text != @out and text.respond_to?(:to_str)
        end
        @out << "</#{name}>"
      else
        @out << ' />'
      end
    end
    def _gestalt_escape_entities(s)
      s.to_s.gsub(/&/, '&').
        gsub(/"/, '"').
        gsub(/'/, ''').
        gsub(/</, '<').
        gsub(/>/, '>')
    end
    def tag(name, *args, &block)
      _gestalt_call_tag(name.to_s, args, &block)
    end
    def to_s
      @out.join
    end
    alias to_str to_s
  end
end
 |