ruby-web 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ChangeLog +474 -0
- data/INSTALL.txt +9 -0
- data/InstalledFiles +180 -0
- data/LICENSE.txt +74 -0
- data/Rakefile +529 -0
- data/TODO +65 -0
- data/doc/additional.xml +149 -0
- data/doc/core.xml +652 -0
- data/doc/credits/index.xml +52 -0
- data/doc/credits/php.contributors.xml +118 -0
- data/doc/credits/php.language-snippets.ent +622 -0
- data/doc/install/index.xml +136 -0
- data/doc/install/mac/index.xml +21 -0
- data/doc/install/ruby-web.install.rb.instructions.xml +7 -0
- data/doc/install/unix/index.xml +46 -0
- data/doc/install/win/apache1.xml +166 -0
- data/doc/install/win/apache2.xml +141 -0
- data/doc/install/win/iis.xml +162 -0
- data/doc/install/win/index.xml +24 -0
- data/doc/install/win/installer.xml +31 -0
- data/doc/install/win/manual.xml +43 -0
- data/doc/manual.xml +69 -0
- data/doc/old/apache_cgi.txt +23 -0
- data/doc/old/fastcgi.txt +23 -0
- data/doc/old/mod_ruby.txt +21 -0
- data/doc/old/snippets.rdoc +183 -0
- data/doc/old/webrick.txt +23 -0
- data/doc/old/windows_cgi.txt +9 -0
- data/doc/tutorial.xml +14 -0
- data/doc/xsl/manual-multi.xsl +10 -0
- data/doc/xsl/manual-pdf.xsl +6 -0
- data/doc/xsl/manual-single.xsl +6 -0
- data/doc/xsl/manual.css +22 -0
- data/install.rb +1022 -0
- data/lib/formatter.rb +314 -0
- data/lib/html-parser.rb +429 -0
- data/lib/htmlrepair.rb +113 -0
- data/lib/htmlsplit.rb +842 -0
- data/lib/sgml-parser.rb +332 -0
- data/lib/web.rb +68 -0
- data/lib/web/assertinclude.rb +129 -0
- data/lib/web/config.rb +50 -0
- data/lib/web/connection.rb +1070 -0
- data/lib/web/convenience.rb +154 -0
- data/lib/web/formreader.rb +318 -0
- data/lib/web/htmlparser/html-parser.rb +429 -0
- data/lib/web/htmlparser/sgml-parser.rb +332 -0
- data/lib/web/htmltools/element.rb +296 -0
- data/lib/web/htmltools/stparser.rb +276 -0
- data/lib/web/htmltools/tags.rb +286 -0
- data/lib/web/htmltools/tree.rb +139 -0
- data/lib/web/htmltools/xmltree.rb +160 -0
- data/lib/web/htmltools/xpath.rb +71 -0
- data/lib/web/info.rb +63 -0
- data/lib/web/load.rb +210 -0
- data/lib/web/mime.rb +87 -0
- data/lib/web/phprb.rb +340 -0
- data/lib/web/resources/test/cookie.rb +33 -0
- data/lib/web/resources/test/counter.rb +20 -0
- data/lib/web/resources/test/multipart.rb +14 -0
- data/lib/web/resources/test/redirect.rb +8 -0
- data/lib/web/resources/test/stock.rb +33 -0
- data/lib/web/sapi/apache.rb +129 -0
- data/lib/web/sapi/fastcgi.rb +22 -0
- data/lib/web/sapi/install/apache.rb +180 -0
- data/lib/web/sapi/install/iis.rb +93 -0
- data/lib/web/sapi/install/macosx.rb +90 -0
- data/lib/web/sapi/webrick.rb +86 -0
- data/lib/web/session.rb +83 -0
- data/lib/web/shim/cgi.rb +129 -0
- data/lib/web/shim/rails.rb +175 -0
- data/lib/web/stringio.rb +78 -0
- data/lib/web/strscanparser.rb +24 -0
- data/lib/web/tagparser.rb +96 -0
- data/lib/web/testing.rb +666 -0
- data/lib/web/traceoutput.rb +75 -0
- data/lib/web/unit.rb +56 -0
- data/lib/web/upload.rb +59 -0
- data/lib/web/validate.rb +52 -0
- data/lib/web/wiki.rb +557 -0
- data/lib/web/wiki/linker.rb +72 -0
- data/lib/web/wiki/page.rb +201 -0
- data/lib/webunit.rb +27 -0
- data/lib/webunit/assert.rb +152 -0
- data/lib/webunit/converter.rb +154 -0
- data/lib/webunit/cookie.rb +118 -0
- data/lib/webunit/domwalker.rb +185 -0
- data/lib/webunit/exception.rb +14 -0
- data/lib/webunit/form.rb +116 -0
- data/lib/webunit/frame.rb +37 -0
- data/lib/webunit/htmlelem.rb +122 -0
- data/lib/webunit/image.rb +26 -0
- data/lib/webunit/jscript.rb +31 -0
- data/lib/webunit/link.rb +33 -0
- data/lib/webunit/params.rb +321 -0
- data/lib/webunit/parser.rb +229 -0
- data/lib/webunit/response.rb +464 -0
- data/lib/webunit/runtest.rb +41 -0
- data/lib/webunit/table.rb +148 -0
- data/lib/webunit/testcase.rb +45 -0
- data/lib/webunit/ui/cui/testrunner.rb +50 -0
- data/lib/webunit/utils.rb +68 -0
- data/lib/webunit/webunit.rb +28 -0
- data/test/dev/action.rb +83 -0
- data/test/dev/forms.rb +104 -0
- data/test/dev/forms2.rb +104 -0
- data/test/dev/parser.rb +17 -0
- data/test/dev/scripts/dump.rb +24 -0
- data/test/dev/scripts/makedist.rb +62 -0
- data/test/dev/scripts/uri.rb +41 -0
- data/test/dev/scripts/uri/common.rb +432 -0
- data/test/dev/scripts/uri/ftp.rb +149 -0
- data/test/dev/scripts/uri/generic.rb +1106 -0
- data/test/dev/scripts/uri/http.rb +76 -0
- data/test/dev/scripts/uri/https.rb +26 -0
- data/test/dev/scripts/uri/ldap.rb +238 -0
- data/test/dev/scripts/uri/mailto.rb +260 -0
- data/test/dev/scripts/urireg.rb +174 -0
- data/test/dev/simpledispatcher.rb +156 -0
- data/test/dev/test.action.rb +146 -0
- data/test/dev/test.formreader.rb +463 -0
- data/test/dev/test.simpledispatcher.rb +186 -0
- data/test/dev/webunit/conv/digit-0.rb +21 -0
- data/test/dev/webunit/conv/digit-1.rb +17 -0
- data/test/dev/webunit/conv/digit.rb +23 -0
- data/test/dev/webunit/conv/test_digit-0.rb +16 -0
- data/test/dev/webunit/conv/test_digit-1.rb +19 -0
- data/test/dev/webunit/conv/test_digit.rb +26 -0
- data/test/dev/webunit/conv/test_digit_view-0.rb +76 -0
- data/test/dev/webunit/conv/test_digit_view-1.rb +102 -0
- data/test/dev/webunit/conv/test_digit_view.rb +134 -0
- data/test/installation/htdocs/cgi_test.rb +296 -0
- data/test/installation/htdocs/test_install.rb +4 -0
- data/test/installation/runwebtest.rb +5 -0
- data/test/installation/test_cookie.rb +128 -0
- data/test/installation/test_form.rb +47 -0
- data/test/installation/test_multipart.rb +51 -0
- data/test/installation/test_request.rb +24 -0
- data/test/installation/test_response.rb +35 -0
- data/test/unit/htdocs/cookie.rb +32 -0
- data/test/unit/htdocs/multipart.rb +28 -0
- data/test/unit/htdocs/redirect.rb +12 -0
- data/test/unit/htdocs/simple.rb +13 -0
- data/test/unit/htdocs/stock.rb +33 -0
- data/test/unit/test_assert.rb +162 -0
- data/test/unit/test_cookie.rb +114 -0
- data/test/unit/test_domwalker.rb +77 -0
- data/test/unit/test_form.rb +42 -0
- data/test/unit/test_frame.rb +40 -0
- data/test/unit/test_htmlelem.rb +74 -0
- data/test/unit/test_image.rb +45 -0
- data/test/unit/test_jscript.rb +57 -0
- data/test/unit/test_link.rb +85 -0
- data/test/unit/test_multipart.rb +51 -0
- data/test/unit/test_params.rb +210 -0
- data/test/unit/test_parser.rb +53 -0
- data/test/unit/test_response.rb +150 -0
- data/test/unit/test_table.rb +70 -0
- data/test/unit/test_utils.rb +106 -0
- data/test/unit/test_webunit.rb +28 -0
- data/test/web/mod_ruby_stub.rb +39 -0
- data/test/web/test.assertinclude.rb +109 -0
- data/test/web/test.buffer.rb +182 -0
- data/test/web/test.code.loader.rb +78 -0
- data/test/web/test.config.rb +31 -0
- data/test/web/test.error.handling.rb +91 -0
- data/test/web/test.formreader-2.0.rb +352 -0
- data/test/web/test.load.rb +125 -0
- data/test/web/test.mime-type.rb +23 -0
- data/test/web/test.narf.cgi.rb +106 -0
- data/test/web/test.phprb.rb +239 -0
- data/test/web/test.request.rb +368 -0
- data/test/web/test.response.rb +637 -0
- data/test/web/test.ruby-web.rb +10 -0
- data/test/web/test.session.rb +50 -0
- data/test/web/test.shim.cgi.rb +96 -0
- data/test/web/test.tagparser.rb +65 -0
- data/test/web/test.template2.rb +297 -0
- data/test/web/test.testing2.rb +318 -0
- data/test/web/test.upload.rb +45 -0
- data/test/web/test.validate.rb +46 -0
- data/test/web/test.web.test.rb +495 -0
- data/test/wiki/test.history.rb +297 -0
- data/test/wiki/test.illustration_page.rb +287 -0
- data/test/wiki/test.linker.rb +197 -0
- data/test/wiki/test.tarpit.rb +56 -0
- data/test/wiki/test.wiki.rb +300 -0
- data/test/wikitestroot/admin.rb +7 -0
- data/test/wikitestroot/wiki.rb +6 -0
- metadata +234 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Copyright:: Copyright (C) 2002, Ned Konz <ned@bike-nomad.com>
|
|
2
|
+
# License:: Same as Ruby's
|
|
3
|
+
# CVS ID: $Id: xpath.rb,v 1.2 2002/06/04 02:52:12 ned Exp $
|
|
4
|
+
|
|
5
|
+
# This module adapts REXML's XPath functionality for use with
|
|
6
|
+
# <tt>HTMLTree::Parser</tt>.
|
|
7
|
+
|
|
8
|
+
require 'web/htmltools/tree'
|
|
9
|
+
require 'rexml/element'
|
|
10
|
+
require 'rexml/document'
|
|
11
|
+
require 'rexml/xpath'
|
|
12
|
+
|
|
13
|
+
module HTMLTree #:nodoc: all
|
|
14
|
+
|
|
15
|
+
module TreeElement
|
|
16
|
+
# Given the XPath path, return an Array of matching sub-elements of
|
|
17
|
+
# the REXML tree.
|
|
18
|
+
def rexml_match(path)
|
|
19
|
+
node = as_rexml_document
|
|
20
|
+
REXML::XPath.match(node, path)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
class Element
|
|
25
|
+
# convert the given HTMLTree::Element (or HTMLTree::Document) into
|
|
26
|
+
# a REXML::Element or REXML::Document, ready to use REXML::XPath on.
|
|
27
|
+
# Note that this caches the tree; further changes to my tree will
|
|
28
|
+
# not be reflected in subsequent calls
|
|
29
|
+
def as_rexml_document(rparent = nil, context = {})
|
|
30
|
+
return @_rexml_tree if @_rexml_tree
|
|
31
|
+
node = REXML::Element.new( tag, rparent, context )
|
|
32
|
+
attribute_order().each { |attr|
|
|
33
|
+
node.add_attribute(attr, attribute(attr).to_s)
|
|
34
|
+
}
|
|
35
|
+
children().each { |child|
|
|
36
|
+
childNode = child.as_rexml_document(node, context)
|
|
37
|
+
}
|
|
38
|
+
@_rexml_tree = node
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
class Data
|
|
43
|
+
def as_rexml_document(rparent = nil, context = {})
|
|
44
|
+
rparent.add_text(@_content)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
class Comment
|
|
49
|
+
def as_rexml_document(rparent = nil, context = {})
|
|
50
|
+
node = REXML::Comment.new(@_content, parent)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
class Special
|
|
55
|
+
def as_rexml_document(rparent = nil, context = {})
|
|
56
|
+
node = REXML::Instruction.new(@_content,
|
|
57
|
+
context[:respect_whitespace] || false, rparent)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
class Document
|
|
62
|
+
def as_rexml_document(context = {})
|
|
63
|
+
node = REXML::Document.new(nil, context)
|
|
64
|
+
# add DocType
|
|
65
|
+
# add <HTML> node
|
|
66
|
+
node.add( html_node.as_rexml_document(node, context) )
|
|
67
|
+
node
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
end
|
data/lib/web/info.rb
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
module Web
|
|
2
|
+
@@message_template = nil
|
|
3
|
+
|
|
4
|
+
def Web::print_message( title, content )
|
|
5
|
+
@@message_template ||=
|
|
6
|
+
lib_file_contents('resources/message_template.html' )
|
|
7
|
+
puts( @@message_template.gsub( /\$title\$/,
|
|
8
|
+
title ).gsub( /\$content\$/,
|
|
9
|
+
content ) )
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def Web::info_fileinfo( file)
|
|
13
|
+
lines = '<table>'
|
|
14
|
+
%w!original_filename read content_type!.each { |m|
|
|
15
|
+
lines << "<tr><td>#{m}</td><td>#{file.send(m)}</td></tr>"
|
|
16
|
+
}
|
|
17
|
+
lines << '</table>'
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def Web::info
|
|
23
|
+
Web::clear()
|
|
24
|
+
if ( [
|
|
25
|
+
"multipart.html",
|
|
26
|
+
"multipart.rb",
|
|
27
|
+
"cookie.rb",
|
|
28
|
+
"response.html",
|
|
29
|
+
"redirect.rb",
|
|
30
|
+
"counter.rb"
|
|
31
|
+
].include? Web["test"] )
|
|
32
|
+
Web::load( File.dirname(__FILE__) + "/resources/test/" + Web["test"] )
|
|
33
|
+
else
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
msg = ""
|
|
37
|
+
|
|
38
|
+
[:request, :get, :post, :cookie, :env].each do |namespace|
|
|
39
|
+
variables = Web::send(namespace)
|
|
40
|
+
unless variables.empty?
|
|
41
|
+
msg += "<h2>Web::#{namespace}</h2>"
|
|
42
|
+
msg += "<table onMouseover=\"changeto(event, '#F8FF80')\" onMouseout=\"changeback(event, '#eeeeff')\">"
|
|
43
|
+
variables.keys.sort.each do |key|
|
|
44
|
+
msg += "<tr><td><b>#{key}</b></td><td>"
|
|
45
|
+
value = variables[key]
|
|
46
|
+
value = [value] unless value.kind_of? Array
|
|
47
|
+
msg += value.collect do |e|
|
|
48
|
+
Web::html_encode( if e.kind_of? String
|
|
49
|
+
e
|
|
50
|
+
else
|
|
51
|
+
e.inspect
|
|
52
|
+
end )
|
|
53
|
+
end.join("<br />")
|
|
54
|
+
end
|
|
55
|
+
msg += "</table>"
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
Web::print_message( "Web::info", msg )
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
end
|
|
63
|
+
end
|
data/lib/web/load.rb
ADDED
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
#!/usr/bin/ruby
|
|
2
|
+
|
|
3
|
+
require 'web'
|
|
4
|
+
require 'web/phprb'
|
|
5
|
+
|
|
6
|
+
module Web
|
|
7
|
+
SHEBANG_PATTERN = /^#!.*?[\r\n\f]/
|
|
8
|
+
APPLICATION = "application.rb"
|
|
9
|
+
|
|
10
|
+
class TemplateError < Exception
|
|
11
|
+
attr_accessor :original_error, :scriptname
|
|
12
|
+
def initialize(error, scriptname)
|
|
13
|
+
self.original_error = error
|
|
14
|
+
self.scriptname = scriptname
|
|
15
|
+
super(error.to_s)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def trimmed_original
|
|
19
|
+
call_index = original_error.backtrace.length
|
|
20
|
+
original_error.backtrace.each_with_index do |line, i|
|
|
21
|
+
if line =~ /web\/load.rb.*in `call'/
|
|
22
|
+
call_index = i + 1
|
|
23
|
+
break
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
trace = original_error.backtrace[call_index..-1]
|
|
27
|
+
# I want to set the script name, but I can't get it to work
|
|
28
|
+
#trace[-1] = trace[-1].gsub(/^\(eval\):/, scriptname + ":")
|
|
29
|
+
original_error.set_backtrace( trace )
|
|
30
|
+
original_error
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
Web::config::describe( :load_suffix => "hash of :ext => lambda {|scriptname|...} code handlers, used by Web::load" )
|
|
35
|
+
Web::config[:load_suffix] = \
|
|
36
|
+
{ :rb => lambda do |script|
|
|
37
|
+
begin
|
|
38
|
+
Kernel::load( script )
|
|
39
|
+
#rescue Exception => e
|
|
40
|
+
# raise TemplateError.new(e, script)
|
|
41
|
+
end
|
|
42
|
+
end,
|
|
43
|
+
:cgi => lambda do |script|
|
|
44
|
+
begin
|
|
45
|
+
Kernel::load( script, true )
|
|
46
|
+
#rescue Exception => e
|
|
47
|
+
# raise TemplateError.new(e, script)
|
|
48
|
+
end
|
|
49
|
+
end,
|
|
50
|
+
:so => lambda do |script| \
|
|
51
|
+
begin
|
|
52
|
+
Kernel::load(script, true )
|
|
53
|
+
#rescue Exception => e
|
|
54
|
+
# raise TemplateError.new(e, script)
|
|
55
|
+
end
|
|
56
|
+
end, }
|
|
57
|
+
|
|
58
|
+
class Template
|
|
59
|
+
attr_accessor :name, :src
|
|
60
|
+
def initialize( name, src )
|
|
61
|
+
@name = name
|
|
62
|
+
# ruby doesn't like mac files ("\r")
|
|
63
|
+
@src = src.gsub( /\r\n|\n|\r/, "\n" )
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def evaluate
|
|
67
|
+
begin
|
|
68
|
+
### request coupling problem here
|
|
69
|
+
eval( self.src )
|
|
70
|
+
rescue Exception => e
|
|
71
|
+
raise TemplateError.new(e, self.name)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def include symbol
|
|
76
|
+
Object::instance_eval do
|
|
77
|
+
include( symbol )
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def Template::evaluate( name, src )
|
|
82
|
+
self.new( name, src ).evaluate
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
Web::config[:load_suffix].default = lambda do |script|
|
|
87
|
+
rhtml = File.open(script) {|f|f.read}.sub(SHEBANG_PATTERN, '')
|
|
88
|
+
|
|
89
|
+
require 'erb'
|
|
90
|
+
compiler = ERB::Compiler.new nil
|
|
91
|
+
compiler.put_cmd = 'Web::write'
|
|
92
|
+
src = compiler.compile(rhtml)
|
|
93
|
+
Web::Template.evaluate( script, src )
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def Web::load( scriptname )
|
|
97
|
+
Web::connection.templates ||= [ ]
|
|
98
|
+
Web::connection.templates.push scriptname
|
|
99
|
+
|
|
100
|
+
scriptname = Web::template_file( scriptname )
|
|
101
|
+
|
|
102
|
+
unless (File.exists? scriptname)
|
|
103
|
+
raise LoadError.new("Template not found: #{scriptname}")
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
Web::local.merge! Web::options[:local] || {}
|
|
107
|
+
|
|
108
|
+
unless Web::application_loaded
|
|
109
|
+
Web::application_loaded = true
|
|
110
|
+
Web::connection.run_caller = caller
|
|
111
|
+
Web::load_application(scriptname)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
begin
|
|
115
|
+
Web::config[:load_suffix].each do |suffix, block|
|
|
116
|
+
if scriptname =~ /\.#{suffix}$/i
|
|
117
|
+
return block.call( scriptname )
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
return Web::config[:load_suffix].default.call( scriptname )
|
|
121
|
+
rescue TemplateError => e
|
|
122
|
+
raise e.trimmed_original
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
Web::config[:load_path] ||= ['.']
|
|
127
|
+
def Web::template_file( template )
|
|
128
|
+
template_file = template
|
|
129
|
+
Web::config[:load_path].reverse.each{ |dir|
|
|
130
|
+
full_template_path = File.join( dir, template )
|
|
131
|
+
if (File.exists? full_template_path)
|
|
132
|
+
template_file = full_template_path
|
|
133
|
+
end
|
|
134
|
+
}
|
|
135
|
+
template_file
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def Web::load_application(scriptname)
|
|
139
|
+
search_path = File.expand_path(scriptname)
|
|
140
|
+
while( search_path && \
|
|
141
|
+
!(search_path =~ /^([a-z]:)?\/$/i ) && \
|
|
142
|
+
search_path != '.' )
|
|
143
|
+
app = File.join( File::dirname(search_path), APPLICATION )
|
|
144
|
+
|
|
145
|
+
if File.exists? app
|
|
146
|
+
Web::load app
|
|
147
|
+
search_path = nil
|
|
148
|
+
else
|
|
149
|
+
search_path = File::dirname(search_path)
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def Web::ruby_web()
|
|
155
|
+
# remnants of narflets.. do we still want to use this?
|
|
156
|
+
#Web::docroot = ENV["DOCUMENT_ROOT"]
|
|
157
|
+
#$: << "#{Web::docroot}/../src"
|
|
158
|
+
#$: << "#{Web::docroot}/../config"
|
|
159
|
+
|
|
160
|
+
options = {}
|
|
161
|
+
switches = Web::argv_switches(ARGV)
|
|
162
|
+
switches.each do |arg|
|
|
163
|
+
case arg
|
|
164
|
+
when /^-I/
|
|
165
|
+
$:.unshift arg.sub( /^-I/, '' )
|
|
166
|
+
when /^--cli$/
|
|
167
|
+
options[:noheader] = true
|
|
168
|
+
when /^--ruby$/
|
|
169
|
+
options[:style] = :ruby
|
|
170
|
+
when /^--xml$/
|
|
171
|
+
options[:xml] = true
|
|
172
|
+
else
|
|
173
|
+
#Web::print_usage
|
|
174
|
+
#exit
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
script = if (File.exists? ENV['PATH_TRANSLATED'].to_s)
|
|
179
|
+
ENV['PATH_TRANSLATED']
|
|
180
|
+
elsif(File.exists?ENV['SCRIPT_FILENAME'].to_s)
|
|
181
|
+
ENV['SCRIPT_FILENAME']
|
|
182
|
+
else
|
|
183
|
+
ARGV[0]
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
ARGV.shift if (script == ARGV.first )
|
|
187
|
+
|
|
188
|
+
Web::open(options) { Web::load( script ) }
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
def Web::argv_switches( args )
|
|
192
|
+
args.shift
|
|
193
|
+
switches = []
|
|
194
|
+
found_doubledash = false
|
|
195
|
+
args.delete_if do |e|
|
|
196
|
+
unless found_doubledash
|
|
197
|
+
if e =~ /(^--$)/
|
|
198
|
+
found_doubledash = true
|
|
199
|
+
elsif e =~ /^[^-]/
|
|
200
|
+
found_doubledash = true
|
|
201
|
+
false
|
|
202
|
+
else
|
|
203
|
+
switches.push e
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
switches
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
end
|
data/lib/web/mime.rb
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
module Web
|
|
2
|
+
# == Purpose
|
|
3
|
+
# This class returns mime types. It parses an apache-style mime.types file
|
|
4
|
+
# located in site_lib/web/resources/mime.types for it's database.
|
|
5
|
+
#
|
|
6
|
+
# This class can be independantly of the rest of NARF:
|
|
7
|
+
#
|
|
8
|
+
# require 'web/mime.rb'
|
|
9
|
+
# Web::Mime::get_mime_type( 'filename.txt' )
|
|
10
|
+
#
|
|
11
|
+
class Mime
|
|
12
|
+
DEFAULT_MIMETYPE = "text/html"
|
|
13
|
+
@@readers = []
|
|
14
|
+
def Mime.readers
|
|
15
|
+
@@readers
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
class ApacheUnixReader #:nodoc:
|
|
19
|
+
MIME_FILENAME = "resources/mime.types"
|
|
20
|
+
COMMENTED_PATTERN = /(^\s*#)|(^\s*$)/
|
|
21
|
+
VALUE_PATTERN = /\.*(\S+)\s*=\s*(\S+)/
|
|
22
|
+
|
|
23
|
+
def self.mime_file
|
|
24
|
+
Web::lib_filename( MIME_FILENAME )
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def self.applies?
|
|
28
|
+
File.exists? mime_file
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def mime_types
|
|
32
|
+
mime_array = File.open( self.class.mime_file, "r" ) { |f|
|
|
33
|
+
f.read.to_a
|
|
34
|
+
}
|
|
35
|
+
mime_array.uniq!
|
|
36
|
+
mime_array.delete_if { |line|
|
|
37
|
+
line =~ COMMENTED_PATTERN
|
|
38
|
+
}
|
|
39
|
+
mime_hash = {}
|
|
40
|
+
mime_hash.default = DEFAULT_MIMETYPE
|
|
41
|
+
mime_array.each { |line|
|
|
42
|
+
pieces = line.split( /\s+/ )
|
|
43
|
+
mime_type = pieces.shift
|
|
44
|
+
pieces.each { |extension|
|
|
45
|
+
mime_hash[extension] = mime_type
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
mime_hash
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
Mime.readers.push self
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
@@mime_types = nil
|
|
55
|
+
|
|
56
|
+
class << self
|
|
57
|
+
def clear
|
|
58
|
+
@@mime_types = nil
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def mime_types
|
|
62
|
+
unless(@@mime_types)
|
|
63
|
+
readers.each{ |klass|
|
|
64
|
+
if klass.applies?
|
|
65
|
+
@@mime_types = klass.new.mime_types
|
|
66
|
+
break
|
|
67
|
+
end
|
|
68
|
+
}
|
|
69
|
+
end
|
|
70
|
+
@@mime_types
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def get_mime_type( filename )
|
|
74
|
+
mime_types[filename.split(".").last].to_s
|
|
75
|
+
end
|
|
76
|
+
alias :get_mimetype :get_mime_type
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
class << self
|
|
81
|
+
def get_mime_type(filename)
|
|
82
|
+
Mime.get_mime_type(filename)
|
|
83
|
+
end
|
|
84
|
+
alias :get_mimetype :get_mime_type
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
end
|
data/lib/web/phprb.rb
ADDED
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
# + modified by Patrick May to support php-style
|
|
2
|
+
# question marks ( <? ... ?> ) instead of
|
|
3
|
+
# the current asp-style ( <% ... %> )
|
|
4
|
+
# Tiny eRuby --- ERB2
|
|
5
|
+
# Copyright (c) 1999-2000,2002,2003 Masatoshi SEKI
|
|
6
|
+
# You can redistribute it and/or modify it under the same terms as Ruby.
|
|
7
|
+
|
|
8
|
+
class PHPRB #:nodoc: all
|
|
9
|
+
Revision = '$Date: 2003/12/10 09:07:52 $' #'
|
|
10
|
+
|
|
11
|
+
def self.version
|
|
12
|
+
"erb.rb [2.0.4 #{PHPRB::Revision.split[1]}]"
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# PHPRB::Compiler
|
|
17
|
+
class PHPRB
|
|
18
|
+
def PHPRB::load( script )
|
|
19
|
+
scriptname = script
|
|
20
|
+
script = if (File.exists? script)
|
|
21
|
+
File.open(scriptname,'r'){|f|f.read} || ""
|
|
22
|
+
else
|
|
23
|
+
scriptname = nil
|
|
24
|
+
script
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
script.gsub!( Web::SHEBANG_PATTERN, '' )
|
|
28
|
+
|
|
29
|
+
# I'm keeping the compiler separate from the template
|
|
30
|
+
# class, because I plan to replace the compiler
|
|
31
|
+
# ~ pat
|
|
32
|
+
script = PHPRB.new(script, nil, Web::options[:xml] ).src
|
|
33
|
+
|
|
34
|
+
Web::Template.evaluate( scriptname, script )
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class Compiler
|
|
39
|
+
class PercentLine
|
|
40
|
+
def initialize(str)
|
|
41
|
+
@value = str
|
|
42
|
+
end
|
|
43
|
+
attr_reader :value
|
|
44
|
+
alias :to_s :value
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
class Scanner
|
|
48
|
+
|
|
49
|
+
def initialize(src, xml_mode=nil)
|
|
50
|
+
@src = src
|
|
51
|
+
@stag = nil
|
|
52
|
+
@xml_mode = xml_mode
|
|
53
|
+
end
|
|
54
|
+
attr_accessor :stag
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def stag_exp
|
|
58
|
+
open_pattern = if @xml_mode
|
|
59
|
+
'\?ruby'
|
|
60
|
+
else
|
|
61
|
+
'\?(ruby)?'
|
|
62
|
+
end
|
|
63
|
+
'(<\?\?)|(<' + open_pattern + '=)|(<!---)|(<' + open_pattern + ')'
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def etag_exp
|
|
67
|
+
'(\?\?>)|(--->)|(\?>)'
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
begin
|
|
71
|
+
require 'strscan'
|
|
72
|
+
def scan
|
|
73
|
+
stag_reg = /(.*?)(#{self.stag_exp}|\n|\z)/
|
|
74
|
+
etag_reg = /(.*?)(#{self.etag_exp}|\n|\z)/
|
|
75
|
+
scanner = StringScanner.new(@src)
|
|
76
|
+
while ! scanner.eos?
|
|
77
|
+
scanner.scan(@stag ? etag_reg : stag_reg)
|
|
78
|
+
text = scanner[1]
|
|
79
|
+
elem = scanner[2]
|
|
80
|
+
yield(text) unless text.empty?
|
|
81
|
+
yield(elem) unless elem.empty?
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
rescue LoadError
|
|
85
|
+
SplitRegexp = /#{self.stag_exp}|#{self.etag_exp}|(\n)/
|
|
86
|
+
def scan
|
|
87
|
+
@src.each do |line|
|
|
88
|
+
line.split(SplitRegexp).each do |token|
|
|
89
|
+
next if token.empty?
|
|
90
|
+
yield(token)
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
class Buffer
|
|
99
|
+
def initialize(compiler)
|
|
100
|
+
@compiler = compiler
|
|
101
|
+
@line = []
|
|
102
|
+
@script = ""
|
|
103
|
+
@compiler.pre_cmd.each do |x|
|
|
104
|
+
push(x)
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
attr_reader :script
|
|
108
|
+
|
|
109
|
+
def push(cmd)
|
|
110
|
+
@line << cmd
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def cr
|
|
114
|
+
@script << (@line.join('; '))
|
|
115
|
+
@line = []
|
|
116
|
+
@script << "\n"
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def close
|
|
120
|
+
return unless @line
|
|
121
|
+
@compiler.post_cmd.each do |x|
|
|
122
|
+
push(x)
|
|
123
|
+
end
|
|
124
|
+
@script << (@line.join('; '))
|
|
125
|
+
@line = nil
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def compile(s)
|
|
130
|
+
out = Buffer.new(self)
|
|
131
|
+
|
|
132
|
+
content = ''
|
|
133
|
+
scanner = make_scanner(s)
|
|
134
|
+
scanner.scan do |token|
|
|
135
|
+
if scanner.stag.nil?
|
|
136
|
+
case token
|
|
137
|
+
when PercentLine
|
|
138
|
+
out.push("#{@put_cmd} #{content.dump}") if content.size > 0
|
|
139
|
+
content = ''
|
|
140
|
+
out.push(token.to_s)
|
|
141
|
+
out.cr
|
|
142
|
+
when :cr
|
|
143
|
+
out.cr
|
|
144
|
+
when '<?', '<?=', '<!---', '<?ruby', '<?ruby='
|
|
145
|
+
scanner.stag = token
|
|
146
|
+
out.push("#{@put_cmd} #{content.dump}") if content.size > 0
|
|
147
|
+
content = ''
|
|
148
|
+
when "\n"
|
|
149
|
+
content << "\n"
|
|
150
|
+
out.push("#{@put_cmd} #{content.dump}")
|
|
151
|
+
out.cr
|
|
152
|
+
content = ''
|
|
153
|
+
when '<??'
|
|
154
|
+
content << '<?'
|
|
155
|
+
else
|
|
156
|
+
content << token
|
|
157
|
+
end
|
|
158
|
+
else
|
|
159
|
+
# comments should include everything inside themselves
|
|
160
|
+
if scanner.stag == '<!---' && token != '--->'
|
|
161
|
+
content << token
|
|
162
|
+
else
|
|
163
|
+
case token
|
|
164
|
+
when '--->'
|
|
165
|
+
scanner.stag = nil
|
|
166
|
+
content = ''
|
|
167
|
+
# out.push("# #{content.dump}")
|
|
168
|
+
when '?>'
|
|
169
|
+
case scanner.stag
|
|
170
|
+
when '<?', '<?ruby'
|
|
171
|
+
if content[-1] == ?\n
|
|
172
|
+
content.chop!
|
|
173
|
+
out.push(content)
|
|
174
|
+
out.cr
|
|
175
|
+
else
|
|
176
|
+
out.push(content)
|
|
177
|
+
end
|
|
178
|
+
when '<?=', '<?ruby='
|
|
179
|
+
out.push("#{@put_cmd}((#{content}).to_s)")
|
|
180
|
+
#when '<?--'
|
|
181
|
+
# out.push("# #{content.dump}")
|
|
182
|
+
end
|
|
183
|
+
scanner.stag = nil
|
|
184
|
+
content = ''
|
|
185
|
+
when '??>'
|
|
186
|
+
content << '?>'
|
|
187
|
+
else
|
|
188
|
+
content << token
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
out.push("#{@put_cmd} #{content.dump}") if content.size > 0
|
|
194
|
+
out.close
|
|
195
|
+
out.script
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
def prepare_trim_mode(mode)
|
|
199
|
+
case mode
|
|
200
|
+
when 1
|
|
201
|
+
return [false, '>']
|
|
202
|
+
when 2
|
|
203
|
+
return [false, '<>']
|
|
204
|
+
when 0
|
|
205
|
+
return [false, nil]
|
|
206
|
+
when String
|
|
207
|
+
perc = mode.include?('?')
|
|
208
|
+
if mode.include?('-')
|
|
209
|
+
return [perc, '-']
|
|
210
|
+
elsif mode.include?('<>')
|
|
211
|
+
return [perc, '<>']
|
|
212
|
+
elsif mode.include?('>')
|
|
213
|
+
return [perc, '>']
|
|
214
|
+
else
|
|
215
|
+
[perc, nil]
|
|
216
|
+
end
|
|
217
|
+
else
|
|
218
|
+
return [false, nil]
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
def make_scanner(src)
|
|
223
|
+
Scanner.new(src, @xml_mode)
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
def initialize(xml_mode=nil)
|
|
227
|
+
@xml_mode = xml_mode
|
|
228
|
+
@put_cmd = 'Web::print'
|
|
229
|
+
@pre_cmd = []
|
|
230
|
+
@post_cmd = []
|
|
231
|
+
end
|
|
232
|
+
attr_accessor :put_cmd, :pre_cmd, :post_cmd
|
|
233
|
+
end
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
# PHPRB
|
|
237
|
+
class PHPRB
|
|
238
|
+
def initialize(str, safe_level=nil, xml_mode=nil )
|
|
239
|
+
@safe_level = safe_level
|
|
240
|
+
compiler = PHPRB::Compiler.new(xml_mode)
|
|
241
|
+
|
|
242
|
+
#, eoutvar='_erbout')
|
|
243
|
+
#set_eoutvar(compiler, eoutvar)
|
|
244
|
+
#def set_eoutvar(compiler, eoutvar = '_erbout')
|
|
245
|
+
#compiler.put_cmd = "#{eoutvar}.concat"
|
|
246
|
+
#
|
|
247
|
+
#cmd = []
|
|
248
|
+
#cmd.push "#{eoutvar} = ''"
|
|
249
|
+
#
|
|
250
|
+
#compiler.pre_cmd = cmd
|
|
251
|
+
#
|
|
252
|
+
#cmd = []
|
|
253
|
+
#cmd.push(eoutvar)
|
|
254
|
+
#
|
|
255
|
+
#compiler.post_cmd = cmd
|
|
256
|
+
#end
|
|
257
|
+
|
|
258
|
+
compiler.put_cmd = "Web::write"
|
|
259
|
+
#cmd = []
|
|
260
|
+
#cmd.push "#{eoutvar} = ''"
|
|
261
|
+
#
|
|
262
|
+
#compiler.pre_cmd = cmd
|
|
263
|
+
#
|
|
264
|
+
#cmd = []
|
|
265
|
+
#cmd.push(eoutvar)
|
|
266
|
+
#
|
|
267
|
+
#compiler.post_cmd = cmd
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
@src = compiler.compile(str)
|
|
271
|
+
@filename = nil
|
|
272
|
+
end
|
|
273
|
+
attr_reader :src
|
|
274
|
+
attr_accessor :filename
|
|
275
|
+
|
|
276
|
+
def run(b=TOPLEVEL_BINDING)
|
|
277
|
+
print self.result(b)
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
def result(b=TOPLEVEL_BINDING)
|
|
281
|
+
if @safe_level
|
|
282
|
+
th = Thread.start {
|
|
283
|
+
$SAFE = @safe_level
|
|
284
|
+
eval(@src, b)
|
|
285
|
+
}
|
|
286
|
+
return th.value
|
|
287
|
+
else
|
|
288
|
+
return eval(@src, b, (@filename || '(erb)'), 1)
|
|
289
|
+
end
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
def def_method(mod, methodname, fname='(PHPRB)')
|
|
293
|
+
mod.module_eval("def #{methodname}\n" + self.src + "\nend\n", fname, 0)
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
def def_module(methodname='erb')
|
|
297
|
+
mod = Module.new
|
|
298
|
+
def_method(mod, methodname)
|
|
299
|
+
mod
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
def def_class(superklass=Object, methodname='result')
|
|
303
|
+
cls = Class.new(superklass)
|
|
304
|
+
def_method(cls, methodname)
|
|
305
|
+
cls
|
|
306
|
+
end
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
# PHPRB::Util
|
|
310
|
+
class PHPRB
|
|
311
|
+
module Util
|
|
312
|
+
public
|
|
313
|
+
def html_escape(s)
|
|
314
|
+
s.to_s.gsub(/&/, "&").gsub(/\"/, """).gsub(/>/, ">").gsub(/</, "<")
|
|
315
|
+
end
|
|
316
|
+
alias h html_escape
|
|
317
|
+
|
|
318
|
+
def url_encode(s)
|
|
319
|
+
s.to_s.gsub(/[^a-zA-Z0-9_\-.]/n){ sprintf("%%%02X", $&.unpack("C")[0]) }
|
|
320
|
+
end
|
|
321
|
+
alias u url_encode
|
|
322
|
+
end
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
# PHPRB::DefMethod
|
|
326
|
+
class PHPRB
|
|
327
|
+
module DefMethod
|
|
328
|
+
public
|
|
329
|
+
def def_erb_method(methodname, erb)
|
|
330
|
+
if erb.kind_of? String
|
|
331
|
+
fname = erb
|
|
332
|
+
File.open(fname) {|f| erb = PHPRB.new(f.read) }
|
|
333
|
+
erb.def_method(self, methodname, fname)
|
|
334
|
+
else
|
|
335
|
+
erb.def_method(self, methodname)
|
|
336
|
+
end
|
|
337
|
+
end
|
|
338
|
+
module_function :def_erb_method
|
|
339
|
+
end
|
|
340
|
+
end
|