Archive for the 'MacJournal' Category

2017/04/21 Safariの最前面のウィンドウで表示している内容をMacJournalの選択中のjournalに新規エントリを作成して入れ

Safariの最前面のウィンドウで表示しているページのテキストとタイトルで、MacJournalの選択中のJournalに新規エントリを作成するAppleScriptです。

mjournal1.png

さまざまなデータ処理を行うさいのコーパス(例文)を集めるために作成したものです。本来は指定URLをリストで保持しておいて、そこから順次Webページを表示して複数のページを一気に処理するAppleScriptを作ったときに「ついで」に作成。

SafariからWebサイトのテキストを取得するのは、なかなか大変です。

何が大変かといえば、「取得そのもの」ではなく、「取得した内容」が本当に文字化けしていないかどうか、チェックする必要があるということです。とくに、古いWebサイトだと文字コードの指定が不十分で、自動判別できないケースもあります

とりあえず、その処理は省略して(すでに書いてあるので)、MacJournalの中にWebサイトから取得した本文を入れてみることにしました。

すべて自動で連続して作成したときには問題はなかったのですが、「現在表示中のWebサイトの内容を現在選択中のMacJournalのジャーナルに新規エントリに作成」とかいう、1回実行するだけのScriptを走らせてみたところ、予想外の挙動がありました。

選択中のジャーナル(フォルダみたいなもの)の中に新規エントリ(記事)を作成すると、そのエントリへのオブジェクト参照が返ってくることが期待できます。ところが、MacJournalで実行したところ、なぜか以前に作成したエントリに内容が上書きされてしまいました。

おそらく、内部処理のバグだと思うのですが、本来であればID(固有値)が返ってくるべきところでindex(順番で数えた数)が返ってきてしまっている様子。エントリの新規作成時の返り値をそのまま使うとだまされるわけです。

そこで、新規作成エントリが選択中される(selected entry)ことを利用し、その選択中のエントリに対してタイトルと本文を設定することで、新規作成エントリを指定しないで対処しました。

何も考えずに単にObjective-Cの解釈と書き換えを行うだけのAppleScriptObjCのプログラムよりも、出来の悪いGUIアプリケーションを相手に対策を考えることのほうがプログラミングっぽい感じがします。

AppleScript名:Safariの最前面のウィンドウで表示している内容をMacJournalの選択中のjournalに新規エントリを作成して入れる
– Created 2017-04-21 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
–http://piyocast.com/as/archives/4598

–現在選択中のJournalを取得
tell application "MacJournal"
  tell document 1
    set curJournal to selected journal
  end tell
end tell

set titleRes to getPageTitleOfFrontmostWindow() of me
if titleRes = false then return

set textRes to getPageTextOfFrontmostWindow() of me
if textRes = false then return

tell application "MacJournal"
  tell curJournal
    set jRes to make new journal entry –ここで新規作成したentryへの参照を取得するが、どうも固定のIDではなくindexが返ってくるもよう
  end tell
  
  
tell selected entry
    set name to titleRes
    
set plain text content to textRes
  end tell
end tell

on getPageTextOfFrontmostWindow()
  tell application "Safari"
    if (count every window) = 0 then return false
    
tell window 1
      set aProp to properties
    end tell
    
set aDoc to document of aProp
    
set aText to text of aDoc
  end tell
  
return aText
end getPageTextOfFrontmostWindow

on getPageTitleOfFrontmostWindow()
  tell application "Safari"
    if (count every window) = 0 then return false
    
tell window 1
      set aProp to properties
    end tell
    
set aDoc to document of aProp
    
set aText to name of aDoc
  end tell
  
return aText
end getPageTitleOfFrontmostWindow

★Click Here to Open This Script 

2015/06/27 MacJournalで選択中のエントリのタイトル冒頭から日付を取得して作成日付とタイトルに反映

MacJournal 6.1.5で、選択中のエントリからタイトルを取得し、その先頭に存在する「YYYY年MM月DD日[space]」のデータを取得して日付として評価し、該当するエントリの作成日付として適用。そして、タイトルから冒頭の日付部分を削除して設定するAppleScriptです。

ab9159b6-ed35-4f68-be14-656667b191e6.jpg

mj1.jpg

▲実行前

c08d18f1-a9fd-456e-abaf-4f0438e0358a.jpg

mj2.jpg

▲実行後

AppleScript名:MacJournalで選択中のエントリの冒頭から日付を取得して作成日付とタイトルに反映
tell application “MacJournal”
  set aSel to selected entries
  
  
repeat with i in aSel
    set j to contents of i
    
set aName to name of j
    
set aDate to date of j
    
    
set aDelim to ” “ –半角スペース
    
set {bDate, aText} to getDateAndNewTitleFromStr(aName, aDelim) of me
    
    
if {bDate, aText} = {0, 0} then –半角スペースが見当たらなかった場合にリトライ
      set aDelim to “ ” –全角スペース
      
set {bDate, aText} to getDateAndNewTitleFromStr(aName, aDelim) of me
    end if
    
    
if {bDate, aText} is not equal to {0, 0} and {bDate, aText} is not equal to {false, false} then
      try
        set date of j to bDate
        
set name of j to aText
      end try
    end if
    
  end repeat
end tell

on getDateAndNewTitleFromStr(a, aDelim)
  try
    set aOffset to offset of aDelim in a
    
if aOffset = 0 then return {0, 0}
    
set aDate to text 1 thru (aOffset - (length of aDelim)) of a
    
set newTitle to text (aOffset + 1) thru -1 of a
    
set aDateO to date aDate
    
return {aDateO, newTitle}
  on error
    return {false, false}
  end try
end getDateAndNewTitleFromStr

★Click Here to Open This Script 

2014/03/06 MacJournalで選択中のテキストにASが存在すれば実行して結果を返す

選択範囲(selected text)の読み書きができるようになったMacJournal 6.10で、作者のDan Schimpfいわく「そんなことしてどーすんだ?」と疑問を呈していたとのこと。

テキストエディタ的なソフトウェアで、selectionの書き換えができないと逆に不便で仕方ないのですが……ここは、選択範囲の書き換えができるから「こそ」の用途を提示してみる必要があります。

書いておいた日本語の文章をparseして簡易コマンドを受け付けるようにするとか(すべてAppleScriptで記述した人工知能風インタフェース「Newt On」的に)、いろいろありますが……空いた時間にちょっと作ってみたのがコレです。

MacJournalのEntry本文中に<AppleScript>〜</AppleScript>のタグでくくったAppleScriptを書いておいて、本Scriptを(Script Menuなどから)実行すると、選択範囲中のテキストをAppleScriptとみなして、実行し、結果をMacJournalの選択範囲のうしろに返します。

実行すると危険なScriptでも強引に実行してしまうので、事前に実行しても安全なものだけを実行してください。

プログラムとドキュメントと実行結果やスクリーンショットなどをMacJournal上で一括管理して、Script単体で転がしておくと、操作手順や実行結果の履歴などをほったらかしにしがちなところを「なんでも取り込める」MacJournal上でまとめておくことができるのでは? というアイデアを手っ取り早くAppleScriptとして書いてみたものです。

mj10.png
▲MacJournalのエントリに、タグでくくったAppleScriptを書いて、選択する

mj11.png
▲Script Menuから本Scriptを呼び出す

mj12.png
▲MacJournalに書かれていたAppleScriptを実行

mj13.png
▲結果をMacJournalに返す。RecordやListでもテキストに(強引に)変換して返す

mj14.png
▲用意しておいた別のScriptを選択して実行

mj15.png
▲実行結果である100個の乱数をMacJournalに返した

スクリプト名:MacJournalで選択中のテキストにASが存在すれば実行して結果を返す
property asBeginTag :
property asEndTag : “”

tell application “MacJournal”
  tell document 1
    set aSel to selected text
  end tell
end tell

set aSel to aSel as string

if ( is in aSel) and (“” is in aSel) then
  
  
–replace double quote characters
  
set bSel to repChar(aSel, ““”, “\”") of me
  
set bSel to repChar(bSel, “””, “\”") of me
  
  
set aPos to offset of asBeginTag in bSel
  
set bPos to offset of asEndTag in bSel
  
  
if bPos > aPos then
    set scriptStr to text (aPos + (length of asBeginTag) + 1) thru (bPos - 1) of bSel
    
    
try
      set aRes to run script scriptStr
    on error erM
      set aRes to erM
    end try
  else
    
    
tell application “MacJournal”
      display dialog “AS Fetch Error” buttons {“OK”} default button 1 with icon 1
    end tell
    
    
return
    
  end if
  
  
set aClass to (class of aRes) as string
  
if aClass = “record” then
    set aRes to recToString(aRes) of recToStrKit
  else if aClass = “list” then
    set aRes to listToText(aRes) of me
  else
    set aRes to aRes as string
  end if
else
  tell application “MacJournal”
    display dialog “AS Fetch Error” buttons {“OK”} default button 1 with icon 1
  end tell
  
  
return
  
end if

tell application “MacJournal”
  tell document 1
    set selected text to aSel & return & “–> “ & aRes
  end tell
end tell

–文字置換ルーチン
on repChar(origText, targStr, repStr)
  set {txdl, AppleScript’s text item delimiters} to {AppleScript’s text item delimiters, targStr}
  
set temp to text items of origText
  
set AppleScript’s text item delimiters to repStr
  
set res to temp as text
  
set AppleScript’s text item delimiters to txdl
  
return res
end repChar

–リストを任意のデリミタ付きでテキストに
on retArrowText(aList, aDelim)
  set aText to “”
  
set curDelim to AppleScript’s text item delimiters
  
set AppleScript’s text item delimiters to aDelim
  
set aText to aList as text
  
set AppleScript’s text item delimiters to curDelim
  
return aText
end retArrowText

script recToStrKit
  
  
–エラートラップを使って、わざとエラーを発生させ、エラーメッセージからレコードをstringに変換する
  
on recToString(aRec)
    
    
–レコードを無理矢理stringにcastして、エラーメッセージを取得する
    
try
      set a to aRec as string –ここでエラー発生
    on error aMes
      set a to aMes
    end try
    
    
–エラーメッセージ文字列から、元のレコードの情報を組み立てる
    
set b to trimStrFromTo(a, “{”, “}”)
    
set b to “{” & b & “}”
    
    
return b
    
  end recToString
  
  
  
on trimStrFromTo(aStr, fromStr, toStr)
    –fromStrは前から探す
    
if fromStr is not equal to “” then
      set sPos to (offset of fromStr in aStr) + 1
    else
      set sPos to 1
    end if
    
    
–toStrは後ろから探す
    
if toStr is not equal to “” then
      set b to (reverse of characters of aStr) as string
      
set ePos to (offset of toStr in b)
      
set ePos to ((length of aStr) - ePos)
    else
      set ePos to length of aStr
    end if
    
set aRes to text sPos thru ePos of aStr
    
    
return aRes
    
  end trimStrFromTo
  
end script

on listToText(aList)
  set listText to {“{”}
  
set quotChar to ASCII character 34
  
set firstFlag to true
  
repeat with i in aList
    set j to contents of i
    
set aClass to class of i
    
if (aClass = integer) or (aClass = number) or (aClass = real) then
      set the end of listText to (getFirst(firstFlag) of me & j as text)
      
set firstFlag to false
    else if (aClass = string) or (aClass = text) or (aClass = Unicode text) then
      set the end of listText to ((getFirst(firstFlag) of me & quotChar & j as text) & quotChar)
      
set firstFlag to false
    else if aClass is list then
      set the end of listText to (getFirst(firstFlag) of me & listToText(j)) –ちょっと再帰処理
      
set firstFlag to false
    end if
  end repeat
  
set the end of listText to “}”
  
set listText to listText as text
  
return listText
end listToText

on getFirst(aFlag)
  if aFlag = true then return “”
  
if aFlag = false then return “,”
end getFirst

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2014/03/06 MacJournal 6.10で選択中のテキスト(selected text)の書き換えが可能に

Dan Schimpf Software(販売はMariner Software)のジャーナリングソフトウェア(日常の雑多なメモやWebページの内容をコピペして放り込んでおく記録ソフト)「MacJournal」は誰にでもおすすめできる「定番ソフトウェア」です。iOS版とのデータのシンクロもスピーディーに行うことができ、非常に有用性が高いソフトウェアです。

img_2443.jpg

最新のバージョン6.10で、AppleScriptの機能が強化され、選択中のテキスト(selected text)を書き換えられるようになりました(r/oからr/wになった)。

mj0.png

前回紹介したときに、『「読むだけで書けない」というのはナンセンスです。』と書いていましたが、今回のアップデートで対応されたことになります。

MacJournal上で、

mj1.png

と、テキストを選択した状態で……

スクリプト名:MacJournalでselected textを書き換えるテスト
tell application “MacJournal”
  tell document 1
    
    
set a to selected text
    
set selected text to “text”
    
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

というテストAppleScriptを実行すると……

mj2.png

のようになります。選択範囲を書き換えると、選択範囲が解除されるのでその点にのみご注意ください。

2013/07/17 MacJournal 6.0.7 Beta10で選択中のテキストの取得「だけ」可能に

Dan Schimpf Software(販売はMariner Software)のジャーナリングソフトウェア(日常の雑多なメモやWebページの内容をコピペして放り込んでおく記録ソフト)「MacJournal」は、いまや押しも押されもせぬ「定番ソフトウェア」の地位を築いたといえます。

mj4.png

ただ、AppleScript関連では疑問の残る実装もそこかしこに見られ、Beta段階のバージョンでは「なんでこの機能が使えなくなったんだ?」と思わされること幾度。

かなり頻繁にAppleScript用語辞書の書き換えを行われていますが、それだけ試行錯誤が多い(失敗も多い)といえます。

過去の(自分が知りうるかぎりの)MacJournalのアップデート履歴は以下のとおりで、赤いラベルを付けてあるのが「AppleScript用語辞書に有為な変更が加わった」バージョンです(マイナーバージョンアップするたびに、主要AppleScript対応アプリの用語辞書をHTML書き出しして、diffで差分比較を行っています)。

mj0.png

今回、最新のMacJournal 6.0.7 Beta10において、documentの属性として「selected text」という項目が機能するようになりました。これで、選択中のentry内の選択中のテキストを取得することができるようになりました。

mj1.png

ただし、ご覧のとおりこの属性は「r/o」(read only)に設定されています。

AppleScriptからは、各アプリのデータ構造にアクセスしたり、選択中の項目にアクセスしたりできることが望ましいのですが、「読むだけで書けない」というのはナンセンスです。

一応、Beta10の段階の機能を用いて、選択中のテキストの書き換えAppleScript(↓)は即座に書くことはできましたが……これは、selected textのcontentsを書き換え可能であれば、わざわざこんな長い記述を書かなくて済むものです。

mj2.png

この、テキストを選択した状態で本AppleScriptを実行すると……

mj3.png

のようになります。read onlyの「selected text」から文字情報を取得して、選択中のentryの全文のテキストから、selected textの文字の該当部分を置換して、selected entryにテキストを書き戻しました。

selected text(のcontents?)に書き込みができれば、わざわざこんなプログラムを書かなくて済むのですが、現状ではこんな遠回りかつアクロバティックな対応が必要になるという実例です。

スクリプト名:MacJOurnal 6.0.7beta10のselected textでread,writeを実行する実験
–MacJournal 6.0.7 Beta 10で追加された機能「selected text」をなんとかまともに使いこなすための不毛な努力

set repStr to “XXXXXXXXXX”

tell application “MacJournal”
  
  
–複数エントリーが選択されている状態であれば処理終了
  
set sList to selected entries
  
if length of sList is not equal to 1 then
    display dialog “Too many selected entry.” buttons {“OK”} default button 1
    
return
  end if
  
  
–選択中のテキストを取得
  
tell document 1
    set aStr to selected text –選択中のEntry中の選択中のテキストを取得できるようになった。だが、書き込みはできない。
  end tell
  
  
–選択中のEntryから本文テキストを取得して、上記のテキストを置換する試み。短すぎると(1文字とか)処理の精度が落ちる
  
tell selected entry
    set wholeText to plain text content
  end tell
  
  
set newText to repChar(wholeText, aStr, repStr) of me
  
  
–選択中のEntry本文テキストに書き戻す
  
tell selected entry
    set plain text content to newText
  end tell
  
  
–なぜかEntryにデータを再設定するとPlain Text状態が解除されるので、明示的にPlain Textに設定してみた
  
convert to plain text selected entry –個人の用途に応じて、必ずしも必要というわけではない
  
end tell

–文字置換ルーチン
on repChar(origText, targStr, repStr)
  set {txdl, AppleScript’s text item delimiters} to {AppleScript’s text item delimiters, targStr}
  
set temp to text items of origText
  
set AppleScript’s text item delimiters to repStr
  
set res to temp as text
  
set AppleScript’s text item delimiters to txdl
  
return res
end repChar

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2010/11/21 MacJournal 5.2.6でBlogへの投稿系AppleScriptコマンドを強化

macjournal_icon.jpgDan Schimpf氏が開発している職人気質のメモ集積ソフトウェア「MacJournal」。

このMacJournalバージョン5.2.6のβ版を調べたところ、AppleScript用語辞書が変更され、コマンドが増えていることを確認しました。

macjournal1.jpg

exportコマンドのオプションが増加

macjournal2.jpg

新設の「send text to blog」コマンド

あいにく、Blogは直接Webブラウザ上から更新しているため、MacJournalから更新をかけることはないのですが、こうしたコマンドはたしかに存在していることが期待されるものですね。

2010/06/13 MacJournalで指定キーワードを含むジャーナルをリストアップ

MacJournalで、指定のキーワードを含むジャーナルを検索して、結果をリストアップし、選択したジャーナルを選択状態にするAppleScriptです。

MacJournalでは、キーワードを入力するとジャーナルエントリー(記事)を全文検索する機能が付いています。Mac OS XのSpotlightのようなもので、たしかに高速で便利なのですが……検索対象はあくまでジャーナルエントリー(記事)であって、ジャーナル(フォルダ)ではありません。

この、ジャーナル(フォルダ)自体だけを検索するための機能が存在しないため、自前で作ってみました。ヘタにジャーナルを大量に作ってしまったため、複数のジャンルに重複したジャーナルを作っていないかどうか、作ろうと思ったジャーナルがすでに存在しているのではないか……といったことを調べるのに、こうしたAppleScriptがないと大変です。というより、標準でこうした機能は用意してほしいところです。

ジャーナルの検索は、すべてのジャーナルを再帰でピックアップして、キーワードに合致するものだけを抽出リストに追加していきます。処理ロジックはかなり単純です。作る前には処理速度に不安があったのですが、ジャーナル(フォルダ)はジャーナルエントリー(記事)ほどには多くないので、それほど処理対象も無闇に増えず、常識的な処理時間で(MacBook Pro Core i7 2.66GHzで、1秒以下。検索対象はウンザリするほどジャーナルを作りまくった自分のMacJournal書類)。

mj1.jpg
▲検索キーワードを入力

mj2.jpg
▲キーワードがヒットした(含む)ジャーナル一覧を表示。心配したとおり、「デジタルラジオ」のジャーナルが複数存在していた

mj3.jpg
▲一覧から選択したジャーナルを選択状態に

journal entryをselected journal entryにする機能はあるのですが、joiurnalそのものを選択状態にする機能がないため、選択したjoiurnalのjournal entry 1を選択状態にしています。その際にエラーが生じたら(指定journalにjournal entryが1件もなかったら)、エラートラップで対応しています。

スクリプト名:MacJournalで指定キーワードを含むジャーナルをリストアップ
global nList, rList, nnList, rrList
set nList to {}
set rList to {}

set nnList to {}
set rrList to {}

set aKey to text returned of (display dialog “Journalの検索対象キーワードを入力してください” default answer “”)

tell application “MacJournal”
  tell document 1
    set j1List to every journal
    
set nList to every journal whose name contains aKey
    
if nList is not equal to {} then
      set nnList to nnList & nList
      
set rrList to rrList & name of every journal whose name contains aKey
    end if
    
getJournal(j1List, aKey) of me
  end tell
end tell

–ヒットしたジャーナル名称一覧を表示して、ユーザーに選択してもらう
set aRes to choose from list rrList default items (contents of first item of rrList)
if aRes = false then return –キャンセルされた場合の対応
set aRes to contents of first item of aRes

–選択した項目をジャーナル名リストから検索し、ジャーナル項目リストから合致したインデックスの項目を取り出す
set aCount to 1
set aF to false
repeat with i in rrList
  set j to contents of i
  
if j = aRes then
    set aF to true
    
exit repeat
  end if
  
set aCount to aCount + 1
end repeat
if aF = false then
  display dialog “MISS(あり得ないエラー?)”
  
return
end if

–実際に、MacJournal上で選択・表示する
tell application “MacJournal”
  set aResJounal to contents of (item aCount of nnList)
  
  
activate
  
tell document 1
    try
      set selected entry to journal entry 1 of aResJounal –ここがミソ!!
    on error
      display dialog “指定のジャーナルにはエントリーが1つも存在しませんでした(T_T)” buttons {“OK”} default button 1 with icon 1
    end try
  end tell
end tell

on getJournal(aList, aKey)
  repeat with i in aList
    tell application “MacJournal”
      tell i
        set j1List to every journal
        
set nList to (every journal whose name contains aKey)
        
if nList is not equal to {} then
          set nnList to nnList & nList
          
set rrList to rrList & (name of every journal whose name contains aKey)
        end if
        
getJournal(j1List, aKey) of me
      end tell
    end tell
  end repeat
end getJournal

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2010/05/03 MacJournal 5.2.1でエントリのtag情報(tags)を取得/設定

MacJournal 5.2.1で、エントリのキーワード(tag)の情報を取得、設定できるようになりました。

mj20.jpg
▲この状態のエントリのtag情報を取得すると……

tagsの情報を取得すると、tag情報がリストで返ってきます。

スクリプト名:MacJournalでエントリのtag情報を取得する
tell application "MacJournal"
  tell document 1
    set aSel to selected entries
    
repeat with i in aSel
      tell i
        set aKey to tags
        
–> {"radio"}
      end tell
    end repeat
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

一方、取得するだけでなく設定もできます。以下のAppleScriptを実行すると、実際にtag情報が付加されたことをGUI側からも確認できます。

スクリプト名:MacJournalでエントリのtag情報を取得・設定する
tell application "MacJournal"
  tell document 1
    set aSel to selected entries
    
repeat with i in aSel
      tell i
        set aKey to tags
        
–> {"radio"}
        
        
set the end of aKey to "piyomaru"
        
set tags to aKey
      end tell
    end repeat
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

mj21.jpg
▲tag情報「piyomaru」が追加された

2010/05/03 MacJournal 5.2.1で「選択中のエントリ」の実装を増強。複数選択に対応

MacJournal 5.2.1で増強されたAppleScript用語辞書のうち、「選択中のエントリ」を扱うもの(selected entry/selected entries)を解説します。

McJournalでは、documentオブジェクトのプロパティとして「選択中のエントリ」を示す「selected entry」という属性値がありますが、これは表示中のエントリを指し示すもののようで、複数のエントリを選択状態にするとmissing valueが返ってきました。

mj10.jpg

mj11.jpg
▲1つのエントリ(記事)を選択中の状態

スクリプト名:MacJournalで選択中のエントリを取得する
tell application “MacJournal”
  tell document 1
    set aSel to selected entry
  end tell
end tell
–> journal entry 1 of journal 3 of journal 15 of journal 10 of journal 1 of application “MacJournal”

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

mj12.jpg
▲複数のエントリを選択中の状態

スクリプト名:MacJournalで選択中のエントリを取得する2
tell application “MacJournal”
  tell document 1
    set aSel to selected entry
  end tell
end tell
–> missing value

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

MacJournal 5.2.1で追加された「selceted entries」では、1つのエントリが選択されていても、複数のエントリが選択されていても結果がリストで返ってくるようになっており、こちらのほうがAppleScript対応アプリケーションにおける一般的な実装になっているといえます。

スクリプト名:MacJournalで選択中のエントリを取得する3
tell application “MacJournal”
  tell document 1
    set aSel to selected entries –selceted entryとは挙動が違う
  end tell
end tell
–> {journal entry 1 of journal 3 of journal 15 of journal 10 of journal 1 of application “MacJournal”} –1つのエントリを選択している場合
–> {journal entry 1 of journal 3 of journal 15 of journal 10 of journal 1 of application “MacJournal”, journal entry 2 of journal 3 of journal 15 of journal 10 of journal 1 of application “MacJournal”}–2つのエントリを選択している場合

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2010/05/03 MacJournal 5.2.1で大幅なAS用語辞書の増強が

MacJournalでは、バージョン5.1.3b6および5.2.1でAS用語辞書の改変が行われており、これから先もいろいろと改変がありそうです。

mj1.jpg

「よろずデータスクラップブック系」とでも呼ぶべきMacJournalのようなアプリケーションは、サーバー側にデータをため込み将来的にはサーバー側でさまざまな処理を行うことが予想される「Evernote」などのソフトウェアと、ローカルにデータを蓄えユーザーが好き勝手に処理できるMacJournalなどのソフトウェアの2系統に分化していきそうです。

MacJournalのAS用語辞書の増強は、Evernoteのローカル処理が箸にも棒にもつかない、まるで使い物にならないレベルであることに対して、ローカル処理での圧倒的な優位性を確保しようというものでしょうか。他のさまざまなアプリケーションと連携して処理を行うという意味において、Evernoteではまるっきり使い物にならないので、個人的には極力MacJournalを応援したいところです。

長い目で見れば、おそらくMacJournalがオンラインサービスとの連携や、場合によってはEvernoteをはじめとするサーバー側のサービスと連携するといった方向に進化していくのかもしれません。

Evernoteでは、データのバックアップ的な方向にしかAppleScript系の機能が実装されておらず、AppleScriptによって各種アプリケーションを連携させるようなワークフローにおいては、まるっきり使い物にならないのが現状です(ローカルのEvernoteアプリと通信するより、直接サーバーのAPIと通信したほうがやりやすそう)。

ローカル系では「Devon Think」がシソーラス(類語)辞書を背景に高度な検索処理を行ってくれていますが、DevonThinkのシソーラス辞書は英語にしか効かないのでイマイチな感じがします。

2009/06/29 Safariで表示中のページ内容をMacJournalの現在選択中のJournalにペースト

Safariで表示中のページ内容を、MacJournalの現在選択中のJournalにペーストするAppleScriptです。

AppleScriptに対応しているのに、実践的な機能が欠けているためにいまひとつ自動化しづらいMacJournal。一括自動処理はしづらくても、ワンアクションだけ自動化するのであればなんとか使えることでしょう。

MacJournalには、Webの内容をコピー&ペーストして内容をとっておいています。ブックマークだと、内容が消えたり、Blogなどはサイトごとなくなったりすることは日常茶飯事。ローカルなりWeb上のアルバムにとっておくなりしておく必要があることでしょう。

重要なページだとコピー&ペーストして必要な部分だけクリッピングしておくのですが、そうでもないページはこの程度で十分でしょう。もうちょっと改良して、Safariで表示中のページの内容を、CLIのWebレンダラーを併用してPDFに落としておいてから、MacJournalにPDFを取り込むところまで作り込むといい感じでしょうか。

スクリプト名:Safariで表示中のページ内容をMacJournalの現在選択中のJournalにペースト
ページにフレームを使っていないことが前提条件
tell application Safari
  set wCount to count every window
  
if wCount = 0 then
    display dialog Safariでウィンドウがオープンされていません buttons {”OK“} default button 1
    
return
  end if
  
  
tell document 1
    set aURL to URL
    
set aTitle to name
  end tell
  
set aText to text of document 1 本文テキスト
end tell

MacJournalの操作
createNewEntryonMacJournal() of me

tell application MacJournal
  tell document 1
    set aSel to selected entry
    
set name of aSel to aTitle
    
set plain text content of aSel to (aURL & return & return & aText)
  end tell
end tell

MacJournalで新規エントリを作成して選択状態にしておく
on createNewEntryonMacJournal()
  activate application MacJournal
  
tell application System Events
    tell process MacJournal
      set aName to title of menu item 1 of menu 1 of menu bar item 3 of menu bar 1
      
if aName = 新規エントリー then 日本語環境用。他の言語環境では、ここのチェックを行わないか、あるいは書き換えること
        click menu item 1 of menu 1 of menu bar item 3 of menu bar 1 Menu > New Entry
      end if
    end tell
  end tell
end createNewEntryonMacJournal

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2009/06/13 津田大介氏の最近の発言を取得してMacJournalにスクラップする

twitterrificをコントロールして、津田大介氏のtwitter上の発言を集めて、時系列順に並べかえ直して、MacJournalの指定のジャーナル内に新規ジャーナルエントリを作成して、そこに文章を入れるAppleScriptです。

mj11.jpg

▲twitteriffic上で津田大介氏によるテキスト中継が行われている様子

mj10.jpg

▲スクリプト実行後 MacJournalの指定エントリに発言内容がまとめられている

スクリプト名:津田大介氏の最近の発言を取得してMacJournalにスクラップする
津田大介氏のtwitter上の発言を集めてテキスト化
tell application "Twitterrific"
  set tList to every tweet whose screen name is equal to "tsuda"
  
set textList to {}
  
repeat with i in tList
    set the end of textList to {date of i, text of i}
  end repeat
end tell

set sortedList to shellSortListAscending(textList, 1) of me

set pureText to {}
repeat with i in sortedList
  set {aDate, aText} to i
  
set the end of pureText to (aText & return & return)
end repeat

set pureText to pureText as string

Journalの階層状況は個人によって異なるので、このまま動くわけではありません
ご自分の環境に合わせて書き換えて使ってみてください
tell application "MacJournal"
  tell document 1
    tell journal "個人"
      tell journal "業界動向"
        tell journal "音楽配信"
          tell journal "津田大介"
            set jRes to make new journal entry
            
tell jRes
              set plain text content to pureText
            end tell
          end tell
        end tell
      end tell
    end tell
  end tell
end tell

シェルソートで入れ子のリストを昇順ソート
on shellSortListAscending(a, keyItem)
  set n to length of a
  
set cols to {1391376, 463792, 198768, 86961, 33936, 13776, 4592, 1968, 861, 336, 112, 48, 21, 7, 3, 1}
  
repeat with h in cols
    if (h (n - 1)) then
      repeat with i from h to (n - 1)
        set v to item (i + 1) of a
        
set j to i
        
repeat while (j h) and ((contents of item keyItem of item (j - h + 1) of a) > (item keyItem of v))
          set (item (j + 1) of a) to (item (j - h + 1) of a)
          
set j to j - h
        end repeat
        
set item (j + 1) of a to v
      end repeat
    end if
  end repeat
  
return a
end shellSortListAscending

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2009/04/15 MacJournalで任意のjournalをロックする(未遂)

MacJournal 5で、任意のjournalをロックするAppleScriptです……が、辞書に用語が記載されているものの、実際に書いてみると動きません(汗) 構文確認(コンパイル)までは行えるのですが、実行するとエラーになります。

MacJournalMacJournalであるかぎり、このへんのAppleScript系の機能が甘いのは直らないかもしれません(ーー;; もう少しまともになると、ずいぶん使えるのですが……いっそ、この程度ならAppleScript Studioで自分で作ってしまおうかと(汗)

スクリプト名:MacJournalで任意のjournalをロックする(未遂)
tell application "MacJournal"
  tell document 1
    set aSel to choose journal "ロックするJournalを選択"
    
tell aSel
      lock エラーになる!!
    end tell
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2009/04/15 MacJournalで選択中のjournal entryをricher textに変換

MacJournal 5で、選択中のjournal entryを(プレーンテキストから)リッチテキストに変換するAppleScriptです。

mj532.jpg
▲変換前(プレーンテキスト)

mj540.jpg
▲変換後(リッチテキスト)

……実際には、データ内容は変わらず、プレーンテキストに対してデフォルト指定したフォントから、リッチテキストに対してデフォルト指定したフォントに表示が変わるだけです。

スクリプト名:MacJournalで選択中のjournal entryをricher textに変換
tell application MacJournal
  tell document 1
    set aSel to selected entry
    
tell aSel
      set a to convert to richer text
      
一度スタイルつきテキストのエントリをplain textにして、
      
再度richer textに変更しても……書式が元に戻るわけではない
    end tell
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2009/04/15 MacJournalで選択中のjournal entryをプレーンテキストに変換

MacJournal 5で、選択中のjournal entryをリッチテキストからプレーンテキストに変換するAppleScriptです。

mj530.jpg
▲変換前(リッチテキスト)

mj531.jpg
▲変換後(プレーンテキスト)

ただし、一度実行してしまうとメニューからアンドゥを実行しても元に戻りません。

スクリプト名:MacJournalで選択中のjournal entryをプレーンテキストに変換
tell application MacJournal
  tell document 1
    set aSel to selected entry
    
tell aSel
      set a to convert to plain text
      
GUIからUndoを実行しても変換前の状態に復帰できないので注意!!
    end tell
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2009/04/14 MacJournalでjournalを選択UIを表示しつつ表示

MacJournal 5で、選択UIを表示しつつjournalを選択するAppleScriptです。

mj520.jpg

スクリプト名:MacJournalでjournalを選択UIを表示しつつ表示
tell application "MacJournal"
  tell document 1
    set anEntry to choose journal with prompt "なんかjournalをえらんでね"
    
> journal 1 of journal 2 of journal 1 of application "MacJournal"
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2009/04/14 MacJournalでjournal entryを選択UIを表示しつつ選択

MacJournal 5で、choose fileのようにjournal entryを選択する専用UIを表示するAppleScriptです。

mj510.jpg

UIの仕様で、複数のjournal entryを一度に選択することはできません。

スクリプト名:MacJournalでjournal entryを選択UIを表示しつつ選択
tell application MacJournal
  tell document 1
    set anEntry to choose entry with prompt どれかjournal entryをえらんでね
    
> journal entry 2 of journal 2 of journal 1 of application “MacJournal”
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2009/04/14 MacJournalで選択中のjournal entryを取得する

MacJournal 5の鬼門、選択部分の取得を行うAppleScriptです。

MacJournal 5では、selectionで選択されているオブジェクトを取得できないようになっており、selected entryでアクセスする必要があることを知っておく必要があります。

さらに、選択中のJournalを取得できるわけではありませんし、選択中のjournal entryのparentを取得してJournalを取得することもできません。

また、表示中のjournal entryの本文中の選択部分を取得する、とかいった「よくありがちな」処理はできません。このあたり、いまひとつ作者のDan SchimpfがAppleScriptによるスクリプティングを理解していないのではないかと邪推してしまいます。

作者のDan Schimpfはいいやつなので、メールを出して指摘すると直るかもしれません。ただ、直すべき箇所が多すぎて、どこから指摘してよいのか分らないというのが困りものです。

スクリプト名:MacJournalで選択中のjournal entryを取得する
tell application MacJournal
  tell document 1
    set aSel to selected entry
    
> journal entry 2 of journal 9 of journal 2 of journal 1 of application “MacJournal”
    
リストではなく、裸でオブジェクトが返ってくる(リストに入ってこない)
    
    
複数のオブジェクト(journal entry)が選択されている場合にはmissing valueが返ってくるが、この実装は間違い
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2009/04/14 MacJournalでキーワード検索状態を解除

MacJournal 5で、「search for」コマンドによるキーワード検索モードに入ってしまった状態から復帰するAppleScriptです。これもあまりAppleScriptっぽい挙動ではありませんが、まあないよりはよいでしょう。

スクリプト名:MacJournalでキーワード検索状態を解除
tell application MacJournal
  tell document 1
    end search
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2009/04/14 MacJournalで指定のキーワードによる検索

MacJournal 5で、指定キーワードによる全文検索を行うAppleScriptです。ただし、GUIのウィンドウ上からキーワードを入力したのとまるっきり同じであり、AppleScriptっぽい挙動(検索でヒットした結果journal entryがリストで返ってくる)を行うわけではありません。

mj53.jpg

mj52.jpg

スクリプト名:MacJournalで指定のキーワードによる検索
tell application MacJournal
  tell document 1
    search for ぴよまるソフトウェア
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2009/04/14 MacJournalでjournal entryをexportできない

MacJournal 5にはexportコマンドが用意されているのですが、どうやってもこれは利用できませんでした。バグと思われます(v5.1.3)。

スクリプト名:MacJournalでjournal entryをexportできない
set dtPath to (path to desktop folder) as string

tell application MacJournal
  tell document 1
    tell journal 1
      tell journal プログラミング
        set jList to every journal entry
        
set fCount to 1
        
repeat with i in jList
          set j to contents of i
          
export j as plain text to (dtPath & exportedJ & (fCount as string) & .html“)
          
export {j} as plain text to (dtPath & “exportedJ” & (fCount as string) & “.html”)
          
htmlでもritch textでも、他の形式でもexportできない
          
exportする対象を裸で渡しても、リストで渡してもダメ
          
set fCount to fCount + 1
        end repeat
      end tell
    end tell
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2009/04/14 MacJournalでjournalの階層をたどる

MacJournal 5でjournalの階層をたどるAppleScriptの記述例です。階層をたどっていくときに、オブジェクトの階層(journal)を順次もぐっていかなくてはならず、Mail.appのように複数階層を一気に指定するような記述ができないので、なかなか大変です。

mj51.jpg

すべてのjournalの階層をたどるためには、再帰処理でも書かないとダメかもしれません。処理時間もかなりかかりそうです。

スクリプト名:MacJournalでjournalの階層をたどる
tell application MacJournal
  tell document 1
    set n1List to name of every journal
    
> {”個人”, “会社関連”, “UNIX系アプリ”, “for DEMO”}
    
tell journal 1
      set n2List to name of every journal
      
> {”個人の活動”, “プログラミング”, “アプリケーション”, “周辺機器”, “Windowsアプリ”, “業界動向”, “私的な内容”, “戦略的な内容”, “DVD,映画”, “PiyoCast”, “家庭用グッズ”}
      
tell journal プログラミング
        set n3List to name of every journal
        
> {”REALbasic”, “Dylan”, “iPhone/iPod touchアプリケーション開発”, “インストーラ”, “アイコンデザイン”, “yuma”, “ruby”, “iTunes”, “AppleScript”, “Apple People”, “Newton Script”, “Theme”, “XML”, “Switch”, “Xcode”, “HTML”, “SMILE”}
        
tell journal AppleScript
          set j1Count to count every journal entry
          
tell journal entry 1
            set a to plain text content
            
journal entryに対してpropertiesの取得が行えない
            
ものすごくバグっぽい仕様
          end tell
        end tell
      end tell
    end tell
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2009/04/14 MacJournalで書類のプロパティを取得

MacJournal 5で書類のプロパティを取得するAppleScriptです。

スクリプト名:MacJournalで書類のプロパティを取得
tell application MacJournal
  tell document 1
    properties
  end tell
end tell
> {modified:false, class:document, path:”/Users/maro/Library/Application Support/MacJournal/MacJournal Data.mjdoc”, selected entry:missing value, name:”MacJournal Data”}

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2009/04/14 MacJournalでアプリのプロパティを取得

MacJournal 5のアプリケーションのプロパティを取得するAppleScriptです。

MacJournal 5は、Webの内容をスクラップしておくスクラップブックとして活用しています。このソフトは、多くの機能がAppleScriptに対応しているように見えるのですが、AppleScript系の機能は割と作り込みが甘くて、「これはないんじゃない?」とか「バグでは?」といった実装が見受けられます。

AppleScript系の機能が甘いだけであり、普通にGUIから利用している分には使い勝手のいい、よいソフトだと思っています。

スクリプト名:MacJournalでアプリのプロパティを取得
tell application MacJournal
  properties
end tell

> {frontmost:false, class:application, version:”5.1.3″, name:”MacJournal”, selected entry:missing value, main document:document “MacJournal Data” of application “MacJournal”}

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に