基本事項 ← : 操作ライブラリ : → 文書生成

RubyでFreemindを操作するライブラリ

GitHubにも置きました。

FreemindはXML形式のファイルなのでRubyだとNokogiriを使えば特に困らないのですが Freemindでのノード、属性、アイコン等がXMLとしての属性と混乱しやすいので Freemind用の拡張をNokogiriに加えたものを作成しました。

細かな処理は作り込んでいません。Freemindのファイルを読書きするのに必要充分な 機能はあると思いますので後は組み合わせて利用して下さい。

FreemindクラスとFreemind_Extensionモジュールから構成されています。

FreemindクラスはFreemindのファイル処理を担当しopenで開いて処理を実行し、 書込む必要があればsaveで書き込みを行ないます。

Freemind_ExtensionはNokogiriに組み込んでいます。ですから、Nokogiriのオブジェクトに対して 拡張機能で用意されたFreemind用の fme_... という手続き群が使用できるようになります。 詳細はドキュメントを参照してください。

モジュール名 概要
freemind.rb Freemind拡張用モジュール
sample.rb Freemind拡張用モジュールの使用例
test_freemind.rb Freemind拡張用モジュール UNITテスト
RDOC Freemind拡張用モジュール ドキュメント

Freemind の アイコン一覧表

attach back bell bookmark
broken-line button_cancel button_ok calendar
clanbomber clock clock2 closed
decrypted desktop_new down edit
encrypted family fema female1
female2 flag-black flag-blue flag-green
flag-orange flag-pink flag-yellow flag
folder forward freemind_butterfly full-0
full-1 full-2 full-3 full-4
full-5 full-6 full-7 full-8
full-9 go gohome group
help hourglass idea info
kaddressbook kmail knotify korn
ksmiletris launch licq list
Mail male1 male2 messagebox_warning
password pencil penguin prepare
redo smiley-angry smiley-neutral smiley-oh
smily_bad stop-sign stop up
wizard xmag yes

RubyでFreemindを操作するライブラリの使用例

#! ruby -EWindows-31J
# -*- mode:ruby; coding:Windows-31J -*-

require './freemind'

def dump_node(node,level)
  print "#{level}node: #{node.fme_get_text} #{node.fme_get_xml_attr('id')} "
  print ", RichContent" if node.fme_get_richcontent('NODE')
  print ", NOTE" if node.fme_get_richcontent('NOTE')
  print "\n"
  
  level += '  '
  if t = node.fme_get_remind
    print "#{level}Remind: #{t}\n"
  end
  
  node.fme_attributes.each do |name,value|
    case name
    when 'arrowlink'
      value.each{|dt| print "#{level}ArrowLink to #{dt[1]}, color=#{dt[2]}\n"}
    when 'attribute'
      value.each{|dt| print "#{level}Attribute [ #{dt[1]} = #{dt[2]} ]\n"}
    when 'icon'
      value.each{|dt| print "#{level}#{name}      [ #{dt[1]} ]\n"}
    when 'hook'
      value.each do |dt|
        if dt[1] !~ /TimeManagementReminder/i
          print "#{level}#{name}      [ #{dt[1]} ]\n"
        end
      end
    else
      print "#{level}unknown #{name}\n"
    end
  end
  # print node.fme_get_richcontent('NODE')
  # print node.fme_get_richcontent('NOTE')
  
  node.fme_children.each do |cnode|
    dump_node(cnode,level)
  end
end

file_name = 'sample.mm'
File.delete(file_name) if File.exist?(file_name)

# ファイルが無ければrootノードだけを持つ初期状態としてopenされる。
Freemind.open(file_name) do |fm,root|
  c1 = root.fme_add_child('Child1')
  c2 = root.fme_add_child('Child2')
  c2.fme_add_icon('idea')
  c2_1 = c2.fme_add_child('')
  c2_1.fme_set_richcontent('NODE','<html><head /><body><p>RichContent Node</p><table border="1"><tr><td><p>1</p></td><td><p>2</p></td></tr></table></body></html>')
  c2_1.fme_set_richcontent('NOTE','<html><head /><body><p>test code</p><table border="1"><tr><td><p>x</p></td><td><p>y</p></td></tr></table></body></html>')
  c2_1.fme_add_icon('button_ok')
  c2_1.fme_add_remind(Time.new(2012,1,1,9,0,0))
  c2_1.fme_add_attribute('x','1')
  c1.fme_add_arrowlink(c2,'#ff0000')
  
  dump_node(root,'')
  root.search("//node/icon[@BUILTIN='idea']/..").each do |node|
    if [] == node.fme_attribute?('HasIdea')
      node.fme_add_attribute('HasIdea','Yes') 
    end
    print "#{node.fme_get_text} has Idea icon ,HasIdea attribute = #{node.fme_attribute?('HasIdea')}\n"
  end
  fm.save
end



基本事項 ← : 操作ライブラリ : → 文書生成