|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
#!/usr/bin/env ruby1.8
# From a posting by Rubikitch at the eev mailing list:
# <http://lists.gnu.org/archive/html/eev/2005-06/msg00002.html>
# <http://article.gmane.org/gmane.emacs.eev.devel/11>
# Note that Rubikitch hasn't signed the FSF papers yet -- this file
# cannot be included in Emacs until he signs the transfer of
# copyright, but it isn't part of the "kernel" of eev that is ready
# for inclusion...
# I created a command index of ratpoison and screen.
# (eev "infoindex.rb -o /tmp/ratpoison.e ratpoison.info")
# (eev "infoindex.rb -o /tmp/screen.e screen.info*")
# (find-fline "/tmp/ratpoison.e")
# (find-fline "/tmp/screen.e")
# The infoindex.rb script is here.
# (find-fline "/usr/share/info/" "screen")
# (find-angg ".zshrc" "zcatinfo")
# cd /usr/share/info/; zcatinfo screen > /tmp/screen.info
# ruby1.8 $EEVE/infoindex.rb -o /tmp/screen.e /tmp/screen.info
# (find-fline "/tmp/screen.e")
require 'optparse'
require 'tempfile'
class << IO
def redirect(stdout)
begin
stdout_sv = STDOUT.dup
STDOUT.reopen(stdout)
yield
ensure
STDOUT.flush
STDOUT.reopen(stdout_sv)
end
end
end
def system_to_string(*args)
ret = nil
Tempfile.open("s2s") do |f|
IO.redirect(f) {
system *args
}
ret = f.open.read
end
ret
end
module EmacsLisp
def elisp(lisp)
system_to_string("gnudoit", lisp).chomp
end
# imported from el4r
def dump_string(string)
dumped = string.dup
# \ -> \\
dumped.gsub! %r"\\" do '\\\\' end
# " -> \"
dumped.gsub! %r'"' do '\\"' end
# (zero byte) -> \0
dumped.gsub! %r'\0' do "\\\0" end
%Q'"#{dumped}"'
end
end
class ParseInfo
def initialize(io, regexp)
@io = io
@regexp = regexp
@results = []
end
class Result < Struct.new(:info, :node, :line)
include EmacsLisp
def to_s
arg = dump_string("(#{info})#{node}")
line = dump_string(self.line)
%Q[# (find-node #{arg} #{line})]
end
end
def parse
@io.read.split(/\n/).each do |line|
case line
when /^File: (.+)\.info, Node: (.+?),/
@info = $1
@node = $2
when @regexp
@results << Result.new(@info, @node, line)
else
end
end
end
def output(output=$>)
@results.each do |res|
output.puts res
end
end
end
if __FILE__==$0
outfile = nil
ARGV.options {|o|
o.on("-o OUTFILE") {|v| outfile = v}
o.parse!
}
obj = ParseInfo.new(ARGF, /^ - Command: (.+)$/)
obj.parse
if outfile
File.chmod 0644, outfile if File.exist? outfile
open(outfile, "w"){|io|
obj.output io
io.chmod 0444
}
else
obj.output $>
end
end