#!/usr/bin/perl # Kwiki <=> SubEthaEdit Bridge # cf. http://www.apple.com/applescript/uiscripting/03.html use FindBin; use strict; use constant TTL => 180; # 3 mins time-to-live use constant REFRESH => 15; # push back every 15 secs #use constant REPOS => 'file:///Users/subethakwiki/see/svn'; use constant REPOS => 'svn+ssh://www@blogs/home/ingy/kwiki.org/see/plugin/archive'; chdir $FindBin::Bin; system("rm -rf repos"); system("svn co -r 0 ".+REPOS." repos"); system("killall SubEthaEdit"); # XXX - use applescript to set pref to UTF8 here! system("open /Applications/SubEthaEdit.app"); chdir "$FindBin::Bin/repos"; my %ttl; while (1) { system("osascript -e 'save documents of application \"SubEthaEdit\"'"); system("svn cleanup"); my @new = map { m{^A\s+edits/(.+)} ? $1 : () } `svn up`; if (@new) { print "New: @new\n" if @new; chdir "$FindBin::Bin/repos/pages"; open_see(@new); chdir "$FindBin::Bin/repos"; } my @lines = `svn ci -m autocommit`; my @modified = map { m{^Sending\s+pages/(.+)} ? $1 : () } @lines; if (@modified) { print "Modified: @modified\n"; } $ttl{$_}++ foreach keys %ttl; @ttl{@new, @modified} = (); if ( my @expired = grep { ($ttl{$_} * REFRESH) >= TTL } keys %ttl ) { print "Expired: @expired\n"; system("svn rm " . join(' ', map "edits/$_", @expired)); chdir "$FindBin::Bin/repos/pages"; close_see(@expired); chdir "$FindBin::Bin/repos"; system("svn ci -m autocommit"); delete @ttl{@expired}; } sleep REFRESH; } sub open_see { system("open -a SubEthaEdit " . join(' ', map $_, @_)); tell_see(map qq{ click menu item "$_" of menu "Window" try click menu item "Announce" of menu "File" tell menu bar item "File" tell menu "File" tell menu item "Access Control" tell menu "Access Control" click menu item "Read/Write" end tell end tell end tell end tell end try }, @_); } sub close_see { tell_see(map qq{ click menu item "$_" of menu "Window" try click menu item "Conceal" of menu "File" click menu item "Close" of menu "File" end try }, @_); } sub tell_see { open ETHA, ">$FindBin::Bin/script.osa" or die $!; print ETHA << "."; tell application "SubEthaEdit" activate save documents end tell tell application "System Events" tell process "SubEthaEdit" tell menu bar 1 @_ end tell end tell end tell . close ETHA; system("osascript $FindBin::Bin/script.osa"); }