Ein normaler mehrzeiliger Kommentar. Und noch eine Zeile
2. Abschnitt
3. Abschnitt xx bb
require 'socket'
class Server
def initialize(host = "localhost", port = 8877, root = File.dirname(__FILE__))
@host = host
@port = port
@root = root
@mimeTypes = { ".html" => "text/html", ".rb" => "text/html", ".wiki" => "text/html",
".jpg" => "image/jpeg", ".png" => "image/png" }
@mimeTypes.default = "text/plain"
end
def start
server = TCPServer.new(@host, @port)
puts "serving #{@root} on http://#{@host}:#{@port}"
while (session = server.accept)
request = session.gets
puts %Q(request: #{request})
header = request.split
case header[0]
when "GET"
get(session, header[1])
else
default(session, request)
end
session.close
end
end
def get(session, path)
unless serve(session, path)
notFound(session, path)
end
end
def notFound(session, path)
session << "HTTP/1.1 200/OK\r\nContent-type: text/html\r\n\r\n"
session << <<-EOT
<html>
<head>
<title>File Not Found</title>
</head>
<body>
<h1>File Not Found:</h1>
<a href="#{path}">
#{path}
</a>
<hr />
#{Time.now}
</body>
</html>
EOT
end
def default(session, request)
session << "HTTP/1.1 200/OK\r\nContent-type: text/html\r\n\r\n"
session << <<-EOT
<html>
<head>
<title>Default Response</title>
</head>
<body>
<h1>Request:</h1>
#{request.gsub(" ", "<br />")}
<hr />
#{Time.now}
</body>
</html>
EOT
end
def serve(session, path)
abs = @root + path.split("?")[0]
if File.directory?(abs)
abs << "/" unless abs[-1] == "/"[0]
abs << "index.html"
end
if File.exists?(abs)
serveFile(session, abs)
true
else
false
end
end
def serveFile(session, absPath)
writeHeader(session, header(absPath))
File.open(absPath) do |file|
session.write file.read
end
end
def writeHeader(session, header)
hd = ""
hd << header.join("\r\n") << "\r\n\r\n"
p hd
session << hd
end
def header(name)
header = ["HTTP/1.1 200/OK"]
header << "Content-type: #{contentType(name)}"
end
def contentType(name)
@mimeTypes[suffix(name)]
end
def suffix(name)
name =~ /(\.\w+)/
$1
end
attr_reader :root
end
class RubyServer < Server
def initialize(*args)
super
end
def serveFile(session, absPath)
case suffix(absPath)
when '.rb' then serveRb(session, absPath)
when '.wiki' then serveWiki(session, absPath)
else super
end
end
def serveRb(session, absPath)
writeHeader(session, header(absPath))
session << RubyReader.new(absPath).html
end
def serveWiki(session, absPath)
writeHeader(session, header(absPath))
File.open(absPath) do |file|
session.write file.read
end
end
def head(session, absPath)
session << <<-EOT
<html>
<head>
<title>#{absPath}</title>
<link type="text/css" rel="stylesheet" href="style.css">
</head>
<body>
EOT
end
def foot(session, absPath)
session << <<-EOT
</body>
</html>
EOT
end
end
class RubyReader
def initialize(source)
@source = source
@comment = false
@first = true
@formatted = ""
@skip = true
@start = true
@paragraph = false
read(source)
end
attr_reader :formatted
def html
return <<-EOT
<html>
<head>
<title>#{@source}</title>
<link type="text/css" rel="stylesheet" href="style.css">
</head>
<body>
#{@formatted}
</body>
</html>
EOT
end
private
def read(source)
File.open(source) do |file|
file.each_line do |line|
processLine(line)
end
end
end
def processLine(line)
return if @skip and line.strip.empty?
if @start
@comment = line =~ /^=begin/
@start = false
return if @comment
end
if @comment
@comment = processCommentLine(line)
else
@comment = processCodeLine(line)
end
end
def processCommentLine(line)
if @first
@first = false
@skip = false
end
case line
when /^=end/
paragraphEnd
@first = true
@skip = true
return false
when /^=result\s+/
paragraphEnd
processResult($'.chomp)
when /^\*\*\s+/
@formatted << "<h1>#{quote($'.chomp)}</h1>\n"
when /^==\s+/
@formatted << "<h2>#{quote($'.chomp)}</h2>\n"
when /^--\s+/
@formatted << "<h3>#{quote($'.chomp)}</h3>\n"
when /^\s*$/
paragraphEnd
else
unless @paragraph
@formatted << "<p>"
@paragraph = true
end
@formatted << link(quote(line))
end
true
end
def paragraphEnd
if @paragraph
@formatted << "</p>"
@paragraph = false
end
end
def processCodeLine(line)
if @first
@first = false
@skip = false
@formatted << %Q(<pre class="code">\n)
end
if line =~ /^=begin/
@formatted << %Q(</pre>\n)
@first = true
return true
else
@formatted << quoteCode(line)
end
false
end
def processResult(cmd)
cmd.gsub!(/self\.rb/, @source)
result = `#{cmd}`
@formatted << <<-EOT
<div class="subject">Ergebnis:</div>
<pre class="result">
#{quoteCode(result)}
</pre>
EOT
end
def quoteCode(line)
line.gsub(/&/, "&").gsub(/</, "<").gsub(/>/, ">")
# line
end
def quote(line)
line.gsub(/ä/, "ä").
gsub(/ö/, "ö").
gsub(/ü/, "ü").
gsub(/Ä/, "Ä").
gsub(/Ö/, "Ö").
gsub(/Ü/, "Ü").
gsub(/ß/, "ß")
end
def link(line)
line.gsub(/(\w+\.rb)/, %q(<a href="\1">\1</a>))
end
end
def export(dir)
Dir["*.rb"].each do |file|
htmlFile = dir + "/" + file.gsub(/(\w+)\.rb/, '\1.html')
puts "#{file} ==> #{htmlFile}"
File.open(htmlFile, "w") do |io|
io.write(RubyReader.new(file).html.gsub(/href="(.+)\.html"/, 'href="\1.html"'))
end
end
end
if ARGV.size == 2 && ARGV[0] == "--export"
export(ARGV[1])
else
RubyServer.new(*ARGV).start
end