コマンドラインスクリプトを使用して OmniGraffle からエクスポートする

2018 年 8 月 21 日

時々 OmniGraffle に図をたくさん描きますが、その都度 Web ページに表示できる形式へ変換する必要があります。1、2 枚しかない場合は、その都度やるのが問題ありません。でも、1 ダース以上ある場合は、スクリプトがあると便利です。そうすれば、いつでも必要な時にそれらをすべて安全にエクスポートできます。

幸い、OmniGraffle で AppleScript 経由でやりとりできる自動化インターフェイスが提供されているため、このようなことが可能になります。それは長年にわたって変化しており、今朝は動作させるために 2 時間ほど苦労しました。そのため、他の誰かが同じことをしたくなった場合に備えてメモを残しておこうと思いました。

最終的には、これを行うより良い方法が見つかるかもしれません。Omni Group は、JavaScript から呼び出すことができる、よりリッチな自動化環境を構築しています。執筆時点では、JavaScript からエクスポート機能にアクセスすることはできません。その代わりに、AppleScript ルートを利用しました。

私は AppleScript に詳しくなく、それを使ったときもあまり好きではありませんでした。そのため、AppleScript のコードを最小限に抑えています。いつものように Google で調べ回り、現在のフロントドキュメントをエクスポートする小さなスクリプトを作成しました。ファイルにはキャンバスが 1 つだけあると想定しています。これは私が作業しているファイルには当てはまります。

omni2png.scpt…

  on convertGraffleFile(outputFile)
    tell application "OmniGraffle"
      export front document scope "all graphics" as "SVG" to file outputFile
      close front document
    end tell
  end convertGraffleFile
  
  on run argv
     convertGraffleFile(item 1 of argv)
  end run

特定の名前パターンに一致する特定のフォルダー内のすべてのファイルに対して、これらすべてを実行したいと考えています。そのようなスクリプティングに必要なロジックの大部分を使い慣れた言語で使用したいと考えており、そのようなスクリプティングには Ruby を使用しています。

omni.rb…

  module Omni
    def self.convert_file folder, name
      input = folder + (name + ".graffle")
      return unless input.exist?
      output = folder + (name + ".svg")
      return if FileUtils::uptodate?(output.to_s, [input.to_s])
      system "open #{input}"
      call_conversion(macpath(output))
    end
  
    def self.convert_rgram folder
      convert_file folder, "rgram2"
    end
  
    def self.call_conversion output
      cmd = "osascript lib/omni2png.scpt #{output}"
      result = system cmd
      puts "error processing #{output}" unless result
    end
  
    def self.convert_all_rgrams
      Pathname('catalog').children
        .select {|p| p.directory?}
        .each {|p| convert_rgram p }
    end
  
    def self.macpath arg
      return arg.expand_path.to_s.tr("/", ":")[1..-1]
    end
  end

このコードは catalog のすべての子ディレクトリを見て、ggram.graffle を含むディレクトリごとに、同様に名前が付けられた png ファイルにエクスポートします。それは、日付が png ファイルを書き換える必要があることを示している場合にのみ行われます。

コマンドラインコール (system) を使用してファイルを開くのではなく、AppleScript スクリプト内でファイルを開くのが奇妙に思えるかもしれません。このようなことをする理由は、AppleScript 内から OmniGraffle ドキュメントを開くと、時々イライラするようなエラーが発生するためです (アクセス権エラーが発生すると表示されますが、手動で開くかコマンドラインで開くと問題ありません)


重要な改訂

2018 年 8 月 21 日: OmniGraffle が「保存」を使用するのではなく、新しい「エクスポート」バーブを使用するようにエクスポートアプローチを変更したため、更新されました

2017 年 10 月 31 日: 元の投稿