« Ribbon Controls と VCL Styles | トップページ | Evernoteへメモを追加する。(添付ファイル付) »

Evernoteへメモを追加する。

Evernoteに自分で作成したメモを簡単に追加できればいいなと思っていたのですが、EvernoteのAPIは、ThriftなのでDelphiから直接扱うことはできません。だからずっとあきらめていたのですが、先ほどENScriptというものを見つけました。

Evernote
Windowsでの開発
http://www.evernote.com/about/intl/jp/developer/windows.php


Evernoteがインストールされていることが前提条件なのですが、Evernote.exeをパラメーター付でわざわざ起動させるのなら、そのままEvernote使えばいいと思います。しかしENScriptならDelphiから直接メモを追加できそうな感じなので試してみました。

今回createNoteではなく、importNotesを使っているのは、どちらにしても書き込んだメモをファイルとして渡すのであれば、パラメーターが少ないimportNotesの方がすっきりすると考えたからです。 Evernoteエクスポートファイル (ENEX) の仕様は、単純なメモを出力させて、それに基づいて作成していますので、必ずしも正しいとは言えないかも知れません。

実行するとこんな感じ

Memotoevernote1


const
  Temp = 'Evernote.enex';
  S1 = '<?xml version="1.0" encoding="UTF-8"?>'+
       '<!DOCTYPE en-export SYSTEM "http://xml.evernote.com/pub/evernote-export.dtd">'+
       '<en-export>';  // エクスポートしたファイルには、その時の日時や
                       // EverNoteのバージョンが入っていますが、
                       // なくても動作しましたので、消しました。

  // 複数ある場合は、<note></note>までを繰り返す。
  S2 = '<note>';

  // ここにタイトル <title>タイトル</title>

  S3 = '<content>' +
       '<![CDATA[' +
       '<?xml version="1.0" encoding="UTF-8"?>' +
       '<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd">'+
       '<en-note style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">';

  // ここに本文

  S4 = '</en-note>' +
       ']]>' +
       '</content>';

  // ここに作成日時 <created>20111001T042516Z</created>
  // ここにタグ <tag>タグ1</tag> <tag>タグ2</tag>

  S5 = '<note-attributes>';

  // ここにURL <source-url>http://delphi-fan</source-url>

  S6 = '</note-attributes>' +
       '</note>';


  S7 = '</en-export>';


// Evernoteエクスポートファイル (ENEX)の作成
procedure TForm1.MakeTempFile(FileName: String);

  // UTCの日時-「年月日T時分秒Z」という文字列にします。
  function GetCreateDateTime: String;
  var
    UTC: TSystemTime;
  begin
    GetSystemTime(UTC);
  with UTC do
    Result := Format('%.2d%.2d%.2dT%.2d%.2d%.2dZ',
      [wYear,wMonth,wDay,wHour,wMinute,wSecond]);
  end;

var
  SL1, SL2: TStringList;
  I: Integer;
begin
  SL1 := TStringList.Create;
  SL2 := TStringList.Create;
  try
    SL2.Delimiter := ',';
    SL2.StrictDelimiter := True;

    SL1.Add(S1);
    SL1.Add(S2);

    // タイトル
    SL1.Add('<title>'+Edit1.Text+'</title>');
    SL1.Add(S3);

    // 本文
    for I := 0 to Memo1.Lines.Count -1 do
      if I = 0 then
        SL1.Add(Memo1.Lines[I])
      else
        SL1.Add('<div>'+Memo1.Lines[I]+'</div>');

    SL1.Add(S4);

    // 作成日時
    SL1.Add('<created>'+GetCreateDateTime+'</created>');

    // タグ
    SL2.CommaText := Edit2.Text;
    for I := 0 to SL2.Count -1 do
      SL1.Add('<tag>'+SL2[I]+'</tag>');
    SL1.Add(S5);

    // URL
    if Trim(Edit3.Text) <> '' then
      SL1.Add('<source-url>' + Edit3.Text + '</source-url>');
    SL1.Add(S6);
    SL1.Add(S7);
    SL1.SaveToFile(FileName, TEncoding.UTF8);
    Sleep(50); // おまじない
  finally
    SL2.Free;
    SL1.Free;
  end;
end;


// ファイルを作成してEvernoteに読み込ませます。
procedure TForm1.Button1Click(Sender: TObject);
var
  FileName: String;
  Param1, Param2: String;
begin
  FileName := ExtractFilePath(Application.ExeName) + Temp;
  MakeTempFile(FileName);
  if FileExists(FileName) then
  begin
    Param1 := 'C:\Program Files\Evernote\Evernote\ENScript';
    Param2 := 'importNotes /s ' + FileName + ' /n ' + Edit4.Text;
    ShellExecute(Handle, 'OPEN', PWideChar(Param1), PWideChar(Param2), nil, SW_HIDE);
  end;
end;

// 同期
procedure TForm1.Button2Click(Sender: TObject);
var
  FileName: String;
  Param1, Param2: String;
begin
  Param1 := 'C:\Program Files\Evernote\Evernote\ENScript';
  Param2 := 'syncDatabase';
  ShellExecute(Handle, 'OPEN', PWideChar(Param1), PWideChar(Param2), nil, SW_HIDE);
end;

Evernoteでは、こんな感じ

Memotoevernote2

ノートブックにないノートブックを指定した場合、ローカルノートブックとして新規作成されます。(Delphi_Newは、新規ノートブック)



Memotoevernote3

リストにあるノートブックの場合は、そこにメモが追加されています。(Delphi2は作成済みノートブック)



このサンプルのように、わざわざ入力用ボックスを分けるのであれば、Evernoteを使っているのと変わらないですが、メモの1行目はタイトル、2行目はタグというようにすれば入力も楽でメモとして使えるのではないかと思います。

※このプログラムでは、処理に失敗してもエラーメッセージが表示されません。ENScriptは、エラーを起こすと実行されたままになることがあり、その場合、タスクマネージャーから終了させて下さい。

|

« Ribbon Controls と VCL Styles | トップページ | Evernoteへメモを追加する。(添付ファイル付) »