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