いわゆる、ひとつの答え

風邪です。風邪。もう、しんどーい。

さて、以前に掲載した問題ですが、掲示板の方でお答えをいただきました。どうも、ありがとうございました。返答が長くなるのでこちらで答えさせていただきます。

『エディタごとに Wrapper となるスクリプトオブジェクトを用意する』(注、意訳。原典は、掲示板の方を)、というのが頂いた答えでした。書いてくださった方も常套手段と書かれているように、おそらく基本的な解答なのだと思います。

では、問題を作ったときに私が作ったスクリプトを掲載しておきます。

script QuoEdit
    on selectedText()
        tell application "QuoEdit"
            text of selection
        end tell
    end selectedText
end script

script CotEditor
    on selectedText()
        tell application "CotEditor"
            contents of selection
        end tell
    end selectedText
end script

script KEdit
    on selectedText()
        tell application "KEdit"
            selected text of front document
        end tell
    end selectedText
end script

script EnhanceEditor

    on currentEditor()
        tell application "System Events"
            return ((name of processes whose frontmost is true) as Unicode text)
        end tell
    end currentEditor

    on selectedText()
        set apps to currentEditor()
        if apps is "QuoEdit" then
            selectedText() of QuoEdit
        else if apps is "CotEditor" then
            selectedText() of CotEditor
        else if apps is "KEdit" then
            selectedText() of KEdit
        else
            return ""
        end if
    end selectedText
end script

display dialog (EnhanceEditor's selectedText())

ラッパーとなるスクリプトオブジェクトを用意して...というのはこういう感じでしょうか?

おそらく、こういう形が基本的かと思います。ただ、もっと簡潔に簡要に簡便に書けないものなのかと思うのです。例えば、このスクリプトの EnhanceEditor オブジェクトの selectedText() は、if 文が続きます。対象とするエディタが増えるとそれだけ if 文が増えます。どう考えても、不細工です。問題として提起したのは、この if 文が引っかかったからなのでした。もっとスマートな書き方があるはずだ、と。

引き続き、この問題に対する答えは受け付けています。iTMS カードは、やっぱりないですが(笑

「仕方ないな...このサイトの管理人はこんなことも分からないのか。手間がかかるが教えてやろう」という気骨のある方、どうかよろしく。

0 件のコメント :

コメントを投稿