*Trace Output* このページをアンテナに追加 RSSフィード Twitter

アーカイブ | プロフィール
 | 

2006-06-13

livedoor-reader-notifier 0.1 リリース

livedoor-reader-notifier 0.1 をリリースしました。

f:id:miyamuko:20060613225819p:image:w200


xyzzy のメニューに livedoor Reader の未読数を表示します。

xml-http-request を使って非同期に処理をしているので通信中も xyzzy 上での作業を邪魔しません。

xml-http-request 0.1 リリース

xml-http-request 0.1 をリリースしました。


xml-http-request は HTTP 通信を行うためのライブラリです。非同期通信を行えるため xyzzy を止めることなく通信することができます。

PowerPointのファイルからノート部分のみを自動で抜き出す

PowerPointのファイルからノート部分のみを自動で抜き出すような方法、あるいはソフトがあれば教えてください。

これでどうでしょうか。

使い方

Rubyインストールして以下のように実行します。

> ruby note.rb foo.ppt bar.ppt
= タイトル

== スライドタイトル
note

== スライドタイトル 2
note 2

     ry)

ソース

require "win32ole"

class WIN32OLE
  include Enumerable
end


module Scripting

  class FileSystemObject

    @@fs = nil

    class << self
      def fs
        @@fs ||= WIN32OLE.new('Scripting.FileSystemObject')
      end

      def abs_path(path)
        fs.getAbsolutePathName(path)
      end
    end
  end
end


module PowerPoint

  class Application

    def self.run
      app = self.new
      begin
        yield app
      ensure
        app.close
      end
    end

    def initialize
      @app = nil
    end

    def app
      @app ||= WIN32OLE.new("PowerPoint.Application")
    end
    private :app

    def open(filename)
      ppt = app.Presentations.Open(Scripting::FileSystemObject.abs_path(filename),
                                   nil,  # ReadOnly
                                   nil,  # Untitled
                                   nil)  # WithWindow
      Presentation.new(ppt)
    end

    def close
      if @app
        @app.Quit
        @app = nil
      end
    end

  end

  class Presentation

    attr_reader :ppt

    def initialize(ppt)
      @ppt = ppt
    end

    def title
      ppt.BuiltInDocumentProperties("Title").Value
    end

    def each_slide(&block)
      ppt.Slides.map {|e| Slide.new(e) }.each(&block)
    end

  end

  class Slide

    attr_reader :slide

    def initialize(slide)
      @slide = slide
    end

    def title
      get_text(find_text_shapes(@slide.Shapes).first)
    end

    def notes
      texts = find_text_shapes(@slide.NotesPage.Shapes)
      if texts
        texts.map {|e| get_text(e) }.join
      end
    end

    def find_text_shapes(shapes)
      shapes.find_all {|e| e.TextFrame.HasText != 0 }
    end
    private :find_text_shapes

    def get_text(shape)
      shape.TextFrame.TextRange.Text if shape
    end
    private :get_text

  end
end


if $0 == __FILE__
  if ARGV.empty?
    puts "Usage: #{$0} ppt..."
    exit 1
  end

  PowerPoint::Application.run do |app|
    ARGV.each do |file|
      ppt = app.open(Scripting::FileSystemObject.abs_path(file))
      puts "= #{ppt.title}"

      ppt.each_slide do |slide|
        puts "== #{slide.title or "**unknown**"}"
        puts slide.notes
        puts
      end
    end
  end
end
 |