[#10209] Market for XML Web stuff — Matt Sergeant <matt@...>

I'm trying to get a handle on what the size of the market for AxKit would be

15 messages 2001/02/01

[#10238] RFC: RubyVM (long) — Robert Feldt <feldt@...>

Hi,

20 messages 2001/02/01
[#10364] Re: RFC: RubyVM (long) — Mathieu Bouchard <matju@...> 2001/02/05

[#10708] Suggestion for threading model — Stephen White <spwhite@...>

I've been playing around with multi-threading. I notice that there are

11 messages 2001/02/11

[#10853] Re: RubyChangeRequest #U002: new proper name for Hash#indexes, Array#indexes — "Mike Wilson" <wmwilson01@...>

10 messages 2001/02/14

[#11037] to_s and << — "Brent Rowland" <tarod@...>

list = [1, 2.3, 'four', false]

15 messages 2001/02/18

[#11094] Re: Summary: RCR #U002 - proper new name fo r indexes — Aleksi Niemel<aleksi.niemela@...>

> On Mon, 19 Feb 2001, Yukihiro Matsumoto wrote:

12 messages 2001/02/19

[#11131] Re: Summary: RCR #U002 - proper new name fo r indexes — "Conrad Schneiker" <schneik@...>

Robert Feldt wrote:

10 messages 2001/02/19

[#11251] Programming Ruby is now online — Dave Thomas <Dave@...>

36 messages 2001/02/21

[#11469] XML-RPC and KDE — schuerig@... (Michael Schuerig)

23 messages 2001/02/24
[#11490] Re: XML-RPC and KDE — schuerig@... (Michael Schuerig) 2001/02/24

Michael Neumann <neumann@s-direktnet.de> wrote:

[#11491] Negative Reviews for Ruby and Programming Ruby — Jim Freeze <jim@...> 2001/02/24

Hi all:

[#11633] RCR: shortcut for instance variable initialization — Dave Thomas <Dave@...>

13 messages 2001/02/26

[#11652] RE: RCR: shortcut for instance variable initialization — Michael Davis <mdavis@...>

I like it!

14 messages 2001/02/27

[#11700] Starting Once Again — Ron Jeffries <ronjeffries@...>

OK, I'm starting again with Ruby. I'm just assuming that I've

31 messages 2001/02/27
[#11712] RE: Starting Once Again — "Aaron Hinni" <aaron@...> 2001/02/27

> 2. So far I think running under TextPad will be better than running

[#11726] Re: Starting Once Again — Aleksi Niemel<zak@...> 2001/02/28

On Wed, 28 Feb 2001, Aaron Hinni wrote:

[ruby-talk:10298] Local directory search "server" script

From: schuerig@... (Michael Schuerig)
Date: 2001-02-03 02:10:12 UTC
List: ruby-talk #10298
Now that my X server is working again I've put together the first
version of my first half-way useful script. It is a "one shot" server
that's started by inetd for each request on a specific port set in
/etc/inetd.conf. That is at least how I use it on Linux; I can't say
what to do on Windows.

*** If you use this script, or even only try it, make sure that your
firewall blocks the port where it is listening! ***

The script uses two variants of grep: agrep and sgrep. The former
because it's a lot faster than what I could come up with for searching
files; the later because I've been lazy. Incidentally, sgrep is pretty
slow for this task, but it is incredibly neat for ad hoc extracting of
parts from structured files -- are there similarly comfortable ways to
do it natively in Ruby?

Todo
- Browser integration through a JavaScript triggered from the toolbar.
- Resolving of symbolic links.
- Searching of compressed files.
- Nice output formatting.
- Replacement of sgrep with something faster.
- "Transclusion" of CGI.unescape


Thanks for your help in writing this piece.

Michael



#! /usr/bin/ruby -w

require 'cgi'


def main 
  @myname = File.basename($0)
  @searchprog = "agrep -clr"
  @hits = {}
  @totalocc = 0

  args = parseArgs(getRequest())

  search(args['pattern'], args['dir'])
  output(args['pattern'], args['dir'], @hits.sort { |a, b| b[1] <=> a[1]
})

  exit 0
end


def getRequest()
  rawRequest = $stdin.sysread(1024)
  request = rawRequest.split('\r\n').first
  request =~ /searchdir\?(.*) HTTP/
  $1
end


def parseArgs(rawArgs)
  args = {}
  rawArgs.split('+').each do |kv|
    key, value = kv.split('=')
    args[key.strip().downcase()] = CGI.unescape(value.strip())
  end
  args
end


def search(pat, dir)
  matches = `#{@searchprog} #{pat} #{dir}`
  raise "Search for \"#{pat}\" in #{dir} failed with #{$?}!" if $? != 0
  matches.each() do |m| 
    file, occ = m.split(':')
    occ = occ.to_i
    if occ > 0
      @hits[file] = occ
      @totalocc += occ
    end
  end
end


def output(pat, dir, hits)
  print "HTTP/1.1 200/OK\r\nContent-type: text/html\r\n\r\n"

  print "<html>\r\n"
  print "<head><title>Search result for \"#{pat}\"</title></head>\r\n"
  print "<body>\r\n"
  print "<p><h1>Found #{@totalocc} occurrences of \"#{pat}\" in
#{dir}</h1></p>\r\n"
    
  hits.each do |hit|
    formatHit(*hit)
  end

  print "</body></html>\r\n"
end


def formatHit(file, occ)
  linktext = file
  if html?(file)
    title = extractTitle(file)
    if !title.empty?
      linktext = title
    end
  end
  print "<p><a href=\"file://#{file}\">#{linktext}</a></p>\r\n"
end


def html?(file)
  name = File.basename(file)
  ext = file.split(".").last()
  ext.downcase!()
  ext.include?("htm")
  #false
end


def extractTitle(file)
  # This is slow, but excessively practical
  `sgrep -g html 'first(1, stag("TITLE") __ etag("TITLE") in
(stag("HEAD") .. etag("HEAD")))' #{file}`.strip()
end


main()


-- 
Michael Schuerig
mailto:schuerig@acm.org
http://www.schuerig.de/michael/

In This Thread

Prev Next