« 雪 | トップページ | こんなことってあるんだ »

2021年2月 5日 (金)

Macro Template

薄雲ではあったけれど、しっかりと太陽が出ていた晴れ。

 

少し前に、Thunderbirdの

Macro Template :: Thunderbird向けアドオン

が、

復活してくれた: おはのおはなし

再復活したので、使ってみると、

バグなのだろうか: おはのおはなし

という感じだった。

興味を持ったので、中を見て動作確認。

今回、僕が問題だと思ったものは2つ。

・ToやCCに設定したメールアドレスが読み込まれない

・メールの返信ボタンを押し、メール作成ウインドウが現れると、カーソルが引用文の下になってしまう。設定では、引用文の上にしている

まず、メールアドレスの方は、どうも読み込むタイミングが合っていないようだった。

そこで、遅延処理を入れると、きちんとメールアドレスも読み込むようになった!

次に、カーソルが引用文の下になる件。

このプログラム、メール作成画面で表示するもの全て、読み込んでいるようだ。
それが原因で、今回のようなことになっている。

理想は、テンプレート・フォルダのものだけを対象にして処理をすることなんだけれど、どうも、そういうのは出来なさそう、もしくは、面倒くさそう。

このMacro Templateは、「{{{文字列}}}」を対象に、しかるべき日時に置き換えている。

メール文で、「{{{文字列}}}」というような書き方なんて、基本的にはしないと思う。

よって、題名やメール本文に、これがあれば、Macro Template対象として処理し、そうでなければ何もしないにすればいいのでは?と思って、やってみたら、ビンゴー!

返信ボタンを押して、メール作成画面が立ち上がると、きちんと引用文の上にカーソルが行くようになった。

このアドオンの使用者数は少ないようだけれど、僕はどうやったかを残しておく。
また、その後に、このMacro TemplateのuserChrome.jsバージョンを書いておく。

ソースは、

macrotemplate/bootstrap.js at master · nattoheaven/macrotemplate · GitHub

にあるので、ここを参照してね。

まず、1つ目。

await browser.compose.getComposeDetails(tab.id);

とあるのを削除。

どうも、裏技的に追記しているようだ。

それを、

await new Promise(resolve => setTimeout(resolve, 500));

に置き換え。

非同期のスリープだ。

こうすることにより、メールアドレスの読み込むタイミングを合わせてあげる。

2つ目。

題名(Subject)や本文(Body)を書き換えしているものを、それぞれに分離。

そして、それぞれのところに、if分を追加。

if(/\{\{\{.*\}\}\}/.test(変数)){

これは、正規表現で、「{{{」と「}}}」の間に、何らかの文字「.*」があるものを対象にしている。

この書き方だと、最長一致になるけれど、今回は、それが1つでもあれば対象にするので、それで問題ない。

このif分の中に、マクロ変換処理と題名や本文の書き換え処理を入れておけばいい。

次は、userChrome.js版のMacro Templateの基本形。

(function() {
'use strict';
window.MacroTemplate = {
init: async function () {
if (location != 'chrome://messenger/content/messengercompose/messengercompose.xhtml') return;

await new Promise(resolve => setTimeout(resolve, 500));

let date = new Date();

//題名
let oldSubject = msgSubject.value;
if(/\{\{\{.*\}\}\}/.test(oldSubject)){
msgSubject.value = this.replaceMacros(oldSubject, date);
}

//本文
let oldBody = document.getElementById('content-frame').contentDocument.getElementsByTagName("body")[0].innerText;
if(/\{\{\{.*\}\}\}/.test(oldBody)){
document.getElementById('content-frame').contentDocument.getElementsByTagName("body")[0].innerText = this.replaceMacros(oldBody, date);
}
},

replaceMacros: function(s, date) {
//macrotemplate/bootstrap.js at master · nattoheaven/macrotemplate · GitHub
//のソースの「var padZero = function(x, n) {」以降を参照。「return s;」まで
}
};
window.MacroTemplate.init();
})();

マクロ変換部分は、ソースの方を参照し、コピーすればいいだけ。

上記を「userChrome_MacroTemplate.uc.js」という名前にでもして、保存。
そして、Thunderbirdの「chrome」フォルダに置いておけばいい。

僕は、マクロ変換処理のところに、「午前/午後」「a.m./p.m.」「和暦」「英語の日付(1st, 2nd, 3rd・・・)」なんかを追加した。

例えば、次のようなマクロを、テンプレートとして保存し、

{{{yyy}}}年{{{M}}}月{{{d}}}日 {{{JE}}} {{{PH}}}時{{{m}}}分{{{s}}}秒
{{{yyyy}}}/{{{MM}}}/{{{dd}}}({{{JEEE}}}) {{{HH}}}:{{{mm}}}:{{{ss}}}
{{{EPT}}} {{{E}}} {{{d}}} {{{MMMM}}} {{{yyyy}}}

そのメールを起動すると、こんな感じになる。

令和3年2月5日 金曜日 午後9時18分49秒
2021/02/05(金) 21:18:49
9:18 p.m. Thursday 5th February 2021

日時は、そのメールを新規作成した時のものになる。

メール送信時に、その日時がほしい時、いちいち手で打ち込まなくてもいいので、とても便利!

これで、問題点は解決したので、以前のように使うことが出来るようになった。

結局、userChrome.jsで出来るようになったので、アドオンの方は、寝かせている。

ちなみに、新規メール画面で何か処理をしたいなら、このuserChrome.jsを応用すれば、それが可能となる。

ツールバーを作成し、そこにボタンを並べ、それぞれのボタンに定型文を埋め込めば、「Quicktext」

Quicktext :: Thunderbird向けアドオン

GitHub - jobisoft/quicktext: An extension for Thunderbird that lets you create templates that can be easily inserted into your own emails.

のようなものを作ることも可能。

結構面倒だけれど。(苦笑)

メニューバーを作るなら、

var hb = document.getElementById('headers-box');
var mb = document.createXULElement('menubar');
mb.setAttribute('id', 'mymenubar');
mb.setAttribute('class', 'menubar');
hb.appendChild(mb);

で出来る。
これに、ボタンなりメニューなりを登録し、それぞれに対して処理を書いていけばいい。

|

« 雪 | トップページ | こんなことってあるんだ »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




« 雪 | トップページ | こんなことってあるんだ »