Ruby Textkonverter

Ich hab mir mal ein nettes Helferlein gebastelt. Man installiert es im cgi-bin Verzeichnis des lokalen Webservers (nur in sicherer Umgebung verwenden, nicht fürs Internet!). Dann Start im Browser über:

 
http://localhost/cgi-bin/rconvert.cgi

Nun erhält man ein Formular mit 3 Eingabetextfeldern. Im Input-Texteld kann man den Text hineinkopieren, den man irgendwie bearbeiten möchte. Ins Code-Textfeld kommt der Ruby-Code, der den Text bearbeitet. Nach Klick auf "Ausführen" erhält man im Output-Textfeld das Ergebnis.

Wichtig: Der Input Text ist über die Variable tin erreichbar. Das Ergebnis schreibt man in eine Textvariable, z.B. tout. Der Wert des letzten Ausdrucks wird als Ergebnis gewertet, also schreibt man zum Schluß tout.

Beispielprogramm, welches Zeilennummern einfügt:

 
tout = ""
x = 1
tin.each do |line|
  tout << sprintf( "%3.3d %s", x, line )
  x += 1
end
tout

Das Programm ist so praktisch, dass ich alle möglichen Ruby-Helferlein darin laufen lasse. Die Programme selbst verwalte ich in einer Textdatei.

Befehle, die auf $stdout oder $stderr schreiben, sollte man nicht verwenden.

Eine Warnung: Weil das Skript beliebigen Ruby-Code ausführt, kann man grundsätzlich alles damit tun, was der Benutzer darf, der den Prozess ausführt. Klar, dass man so ein Skript niemals auf seinen Internet-Server stellt.

Changelog

  • 2005/03/14: Problem mit \ Substitution durch fehlerhaftes gsub bereinigt
  • 2005/03/09: Initial Release.

Latest Release 2005/03/14

 
#!/usr/bin/ruby1.8

# rconvert.cgi - Ruby Textkonverter   Version: 2005/03/14
#
# Winfried Mueller, www.reintechnisch.de
# 
# Liest aus dem Inputtextfeld, bearbeitet mit dem Rubycode
# des Codetextfeldes und gibt das Ergebnis ans Outputtextfeld.
#
# Hiermit lassen sich "on the fly" Textmanipulationen mit Ruby
# machen.
#
# Installation im cgi-bin Verzeichnis des Webservers
#
# Achtung: Gefährliches Skript, nur in sicherer Umgebung 
#          laufen lassen. Durch die Eingabe von Ruby-Code 
#          können beliebige Programme ausgeführt werden.
#
# Public Domain

require 'cgi'


module TEMPLATES
  ERR = <<EOF
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <title>Ruby Text-Konverter</title>
  </head>
  <body>
    <h1>Fehlermeldung</h1>
    Ein Fehler ist aufgetreten: <br />
    <!-- Mark1 -->
  </body>
</html>
EOF


  FORM1 = <<EOF
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <title>Ruby Text-Konverter</title>
  </head>
  <body>
    <h1>Ruby Text-Konverter</h1>

    <form action="<!-- Mark4 -->" method='post'>
      <h3>Input</h3>
      <textarea name='input' rows='10' cols='60'
      ><!-- Mark1 --></textarea>
      <h3>Code</h3>
      <textarea name='code' rows='10' cols='60'
      ><!-- Mark3 --></textarea>
      <h3>Output</h3>
      <textarea name='code' rows='10' cols='60'
      ><!-- Mark2 --></textarea>
      <br />
      <input type='submit' name='post' value=' Ausführen ' />
    </form>

  </body>
</html>
EOF

end

class HTMLTemplate
  def initialize( template )
    @vars = {}
    load_template( template )
  end

  def load_template( template )
    @template = template
  end

  def load_vars( vars )
    raise "require" unless vars.class == Hash
    @vars = vars
  end

  def html_page
    page = @template
    @vars.each do |key, value|
      page.gsub!( /<!-- #{key} -->/m ) do |match|
        CGI::escapeHTML(value)
      end
    end
    return page
  end
end


query = CGI.new

Script_URL = "http://" + ENV['SERVER_NAME'] + ENV['SCRIPT_NAME']

def xUmgebung( tin )
  return binding
end

begin  

  cgi = CGI.new("html4")
  tmpl = HTMLTemplate.new( TEMPLATES::FORM1 )

  tin    = query['input']
  code   = query['code']
  result = ""
  binding = xUmgebung( tin ) 

  begin       
    result = eval( code, binding, "Code", 1 ) || ""
  rescue Exception =>exc
    result = exc.message + "\n"
    result << exc.backtrace[0]
  end

  tmpl.load_vars( { 'Mark1' => tin,
                    'Mark3' => code,
                    'Mark2' => result,
                    'Mark4' => Script_URL } )
  cgi.out() do
    tmpl.html_page
  end
rescue Exception => exc
  tmpl = HTMLTemplate.new( TEMPLATES::ERR )
  tmpl.load_vars( { 'Mark1' => 
                    "#{exc.class}: #{exc.message}: #{exc.backtrace.join("\n")}" } )
  cgi.out() do
    tmpl.html_page  
  end
end


Version 2005/03/09

 
#!/usr/bin/ruby

# rconvert.cgi - Ruby Textkonverter   Version: 2005/03/09
#
# Winfried Mueller, www.reintechnisch.de
# 
# Liest aus dem Inputtextfeld, bearbeitet mit dem Rubycode
# des Codetextfeldes und gibt das Ergebnis ans Outputtextfeld.
#
# Hiermit lassen sich "on the fly" Textmanipulationen mit Ruby
# machen.
#
# Installation im cgi-bin Verzeichnis des Webservers
#
# Achtung: Gefährliches Skript, nur in sicherer Umgebung 
#          laufen lassen. Durch die Eingabe von Ruby-Code 
#          können beliebige Programme ausgeführt werden.
#
# Public Domain

require 'cgi'

module TEMPLATES
  ERR = <<EOF
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <title>Ruby Text-Konverter</title>
  </head>
  <body>
    <h1>Fehlermeldung</h1>
    Ein Fehler ist aufgetreten: <br />
    <!-- Mark1 -->
  </body>
</html>
EOF


  FORM1 = <<EOF
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <title>Ruby Text-Konverter</title>
  </head>
  <body>
    <h1>Ruby Text-Konverter</h1>

    <form action="<!-- Mark4 -->" method='post'>
      <h3>Input</h3>
      <textarea name='input' rows='10' cols='60'
      ><!-- Mark1 --></textarea>
      <h3>Code</h3>
      <textarea name='code' rows='10' cols='60'
      ><!-- Mark3 --></textarea>
      <h3>Output</h3>
      <textarea name='code' rows='10' cols='60'
      ><!-- Mark2 --></textarea>
      <br />
      <input type='submit' name='post' value=' Ausführen ' />
    </form>

  </body>
</html>
EOF

end

class HTMLTemplate
  def initialize( template )
    @vars = {}
    load_template( template )
  end

  def load_template( template )
    @template = template
  end

  def load_vars( vars )
    raise "require" unless vars.class == Hash
    @vars = vars
  end

  def html_page
    page = @template
    @vars.each do |key, value|
      page.gsub!( /<!-- #{key} -->/m, CGI::escapeHTML(value) )
    end
    return page
  end
end


query = CGI.new

Script_URL = "http://" + ENV['SERVER_NAME'] + ENV['SCRIPT_NAME']

def xUmgebung( tin )
  return binding
end

begin  

  cgi = CGI.new("html4")
  tmpl = HTMLTemplate.new( TEMPLATES::FORM1 )

  tin     = query['input']
  code    = query['code']
  result  = ""
  binding = xUmgebung( tin ) 

  begin       
    result = eval( code, binding, "Code", 1 ) || ""
  rescue Exception =>exc
    result = exc.message + "\n"
    result << exc.backtrace[0]
  end

  tmpl.load_vars( { 'Mark1' => tin,
                    'Mark3' => code,
                    'Mark2' => result,
                    'Mark4' => Script_URL } )
  cgi.out() do
    tmpl.html_page
  end
rescue Exception => exc
  tmpl = HTMLTemplate.new( TEMPLATES::ERR )
  tmpl.load_vars( { 'Mark1' => 
                    "#{exc.class}: #{exc.message}: #{exc.backtrace.join("\n")}" } )
  cgi.out() do
    tmpl.html_page  
  end
end