rdv.rb

自作のYARF + VisualuRubyで。
RDをパースしてHTMLに変換した結果をIEコンポーネントで見ます。
立ち上がるのはHTMLをレンダリングして自らに表示するだけの窓です。プルダウンメニューもなにもあったもんじゃありません。見終わったら閉じてください。

require 'yarf'
require 'vr/vractivex'
require 'vr/vrlayout'
require 'tempfile'
require 'erb'

class ExplorerAxControl < VRActiveXControl
  ACTIVEXCINFO =["Shell.Explorer","DWebBrowserEvents"]
end

class MyForm < VRForm
  
  include VRHorizLayoutManager
  
  def construct
    addControl ExplorerAxControl, "browser", ""
    @browser.add_oleeventhandler("NavigateComplete","completed") 
    @browser.add_oleeventhandler("TitleChange","titlechange") 
  end
  
  def navigate(uri)
    @browser.ole_interface.Navigate(uri)
  end
  
  def browser_titlechange(title)
    self.caption = title
  end
  
  def browser_completed(url)
  end
  
end #MyForm

class HTMLTempfile < Tempfile
  
  def make_tmpname(basename, n)
    "#{super}.html"
  end
  
end #HTMLTempfile

class Screen
  
  def initialize(src, h={})
    @erb = ERB.new(src)
    h.each do |k, v|
      instance_variable_set "@#{k}", v
    end
  end
  
  def render
    @erb.result binding()
  end
  
end #Screen

template = <<__HTML__
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
<title><%= @title %></title>
<% if @css %>
<link href="file://<%= @css %>" type="text/css" rel="stylesheet" />
<% end %>
</head>
<body>
<%= @body %>
</body>
</html>
__HTML__

begin
  form = VRLocalScreen.newform(nil, nil, MyForm)
  form.create
  form.show
  css = [ENV['HOME'], ENV['RDV_DIR'], '.'].compact.map{|dir|
    File.join(dir, '.rdvrc')
  }.find{|path| File.file? path }
  parser    = YARF::Block::Parser.new
  formatter = YARF::FormatRepository['HTML'].new(parser.data_register)
  tree      = parser.parse(ARGF)
  HTMLTempfile.open('rdv') do |f|
    screen = Screen.new(
      template,
      :title => ARGV.join(','),
      :css   => css,
      :body  => formatter.format(tree)
    )
    f.write screen.render
    f.rewind
    form.navigate "file://#{File.expand_path(f.path)}"
    VRLocalScreen.messageloop
  end
rescue Exception => ex
  form.messageBox("#{ex.message}\n\n#{ex.backtrace.join("\n")}", ex.class.name)
  exit 1
end