高橋マインドポイント

作ってみた。

  • FreeMindで作った高橋メソッド用の原稿を、わざわざPowerPointに変換する。
  • excel_lib必要。でもWIN32OLEだけで動くように簡単に改造できるはず。
  • フォントサイズとか位置調整とか改善の余地あり。
  • PowerPoint 2000と2007betaで動作確認。
require 'rexml/document'
require 'kconv'
require 'excel_lib'

MsoDistributeVertically = 1
MsoTextOrientationHorizontal = 1

class FreeMind
  attr_reader :elements

  def initialize(file = nil)
    @elements = []
    parse_file(file) if file
  end

  def parse_file(file)
    doc = REXML::Document.new file
    node(doc.elements["/map"])
  end

  def node(doc)
    doc.elements.each('node') { |e|
      @elements << e.attributes['TEXT'].tosjis
      node(e)
    }
  end
end

class PowerPoint < Excel_Wrapper
  def initialize(visible = true)
    connector('PowerPoint.Application')
    @raw_object.visible = visible
    if block_given?
       yield self
       #quit unless @connected
    end
  end

  def connector(app_name)
    begin
      @raw_object = WIN32OLE.connect(app_name)
      @connected = true
    rescue
      @raw_object = WIN32OLE.new(app_name)
    end
    WIN32OLE.my_const_load(@raw_object, self.class)
  end

  def takahashi_mind(pre, text)
    @width ||= pre.pageSetup.slideWidth
    @height ||= pre.pageSetup.slideHeight
    s = pre.slides.add(
      'Index' => pre.slides.count + 1,
      'Layout' => PowerPoint::PpLayoutBlank)
    t = s.shapes.addTextBox(
      MsoTextOrientationHorizontal,
      0, 0, @width, @height).textFrame.textRange
    t.text = text
    t.font.size = fit_font_size(@width, @height, text)
    t.paragraphFormat.alignment = PowerPoint::PpAlignCenter
    s.shapes.range(1).distribute(MsoDistributeVertically, true)
  end

  def fit_font_size(width, height, text)
    Math.sqrt(width * height / [text.size, 1].max).to_i
  end
end

if $0 == __FILE__
  file = File.new(ARGV[0])
  elements = FreeMind.new(file).elements
  PowerPoint.new do |app|
    pre = app.presentations.add
    elements.each do |e|
      app.takahashi_mind(pre, e)
    end
  end
end