ArrangeNote

ArrangeNoteは新しい分野のアプリケーションを切り開きつつある。階層型管理ができるメモ帳という触れ込みだが、その実、アウトライン・エディタの一種でもあるし、有能なブックマーク・マネージャでもある。知的生産の現場における情報の収集・加工・整理の強力なツールなのだ。特にインターネットと連携させれば様々な可能性が見えてくる。このページではArrangeNoteの持つ能力を引き出すスクリプトを少しずつ紹介していこうと思う。ArrangeNoteはスクリプト実行環境としてこそ、その能力を十二分に発揮することになる。

ブックマークのXML-XBELフォーマット出力

私はArrangeNoteでブックマークを管理しているので、ArrangeNoteにIEからドラッグ&ドロップで放り込んだURLをXML-XBELで出力するJavaScriptを書きました。といっても付属している山本さんのgenxml.jsを改造したものですが・・・

////////////////////////////////////////////////////////////
// ArrangeNote専用スクリプト
//     genxbel.js - ブックマークのメモをXML-XBELファイルに出力
///     genxml.js Copyright (C) 2001 Koichi Yamamoto
///     modified by Kazuo Fujioka
////////////////////////////////////////////////////////////

// お約束・ノートオブジェクトを取得する ////////////////////////////////////////
var note = ANScript.GetNote();

// いろんな関数の定義 //////////////////////////////////////////////////////////
function substitute( body, c, rep ) {
  var body2 = new String( '' );
  var i, j;
  for( i = 0; ( j = body.indexOf( c, i ) ) != -1; i = j + c.length ) {
    body2 += body.substring( i, j );
    body2 += rep;
  }
  body2 += body.substr( i );
  return body2;
}
function genXMLtag( name, value ) {
  var value2 = new String( value );
  value2 = substitute( value2, '&', '&' );
  value2 = substitute( value2, '<', '<' );
  value2 = substitute( value2, '>', '>' );
  value2 = substitute( value2, "'", ''' );
  value2 = substitute( value2, '"', '"' );
  var tag = new String( '' );
  tag += '<' + name;
  if ( value2.length ) {
    tag += '>' + value2 + '</' + name + '>';
  } else {
    tag += ' />';
  }
  return tag;
}
function genXML( node ) {
  if ( node == null || node.Type == note.MEMO ) { return; }
  var i;
  for( i = 0; i < node.GetChildItemCount(); i++ ) {
    var item = node.GetChildItem( i );
    if ( item.Type == note.MEMO ) {
      if (item.UrlBody == true){
        var x = new String(item.Body);
        var y = new String;
        y = x.split("\n",2);
        xml += '    <bookmark href="' + y[0] + '" visited="' + item.ModifiedTime + '">\n';
      }
      if ( item.UrlRemarks == true ){
        xml += '    <bookmark href="' + item.Remarks + '" visited="' + item.ModifiedTime + '">\n';
      }
      xml += "      " + genXMLtag( 'title', item.Title ) + '\n';
      xml += "      " + genXMLtag( 'desc', item.Body ) + '\n';
      xml += '    </bookmark>\n';
    } else {
      xml += '  <folder>\n';
      xml += "    " + genXMLtag( 'title', item.Title ) + '\n';
      genXML( item );
      xml += '  </folder>\n';
    }
  }
}

// XMLファイルの出力先を選ぶ ///////////////////////////////////////////////////
var filename = ANScript.ChooseFile( "出力するXMLファイル名を指定してください。", true );
if ( filename == "" ) {
  ANScript.Quit();
}
if ( filename.lastIndexOf( '.xml' ) == -1 ) {
  filename += '.xml';
}
var file = ANScript.FileObject( filename );
if ( file.Exist() ) {
  var confirm = ANScript.Confirm( 
      "指定されたファイルは既に存在します。\n上書きしてもよろしいですか?", ANScript.YESNO );
  if ( confirm != ANScript.YES ) {
    ANScript.Quit();
  }
}

// XMLデータを作成する /////////////////////////////////////////////////////////
var xml = '<?xml version="1.0" encoding="Shift_JIS" ?>\n';
xml += '<?xml-stylesheet type="text/xsl" href="xbel-1.0.xsl"?>\n';
xml += '<!-- <?xml-stylesheet type="text/xsl" href="basic_xbel.xsl"?> -->\n';
xml += '<!DOCTYPE xbel PUBLIC "+//IDN python.org//DTD XML Bookmark Exchange Language 1.0//EN//XML" "http://www.python.org/topics/xml/dtds/xbel-1.0.dtd">\n';
xml += '<xbel>\n';
xml += '  <title>Bookmarks of Kazuo Fujioka</title>\n';
xml += '  <info><metadata owner="Kazuo Fujioka"/></info>\n';
genXML( note.GetRootItem() );
xml += '</xbel>\n';

// XMLデータをファイルに出力する ///////////////////////////////////////////////
file.Write( xml );

これで最近集めたxml関係のブックマークをXBELで出力して、xbel-1.0.xslと一緒に「TS Networkのために」ホームページにアップロードしています。

http://text.world.coocan.jp/xml_bookmarks.xml

ブックマーク記述言語「XBEL」については
http://www2.airnet.ne.jp/sardine/complang/XBEL.html
に解説があります。

このスクリプトを書くきっかけを与えてくれたねこ丸さんに感謝します。以上はTSNETのXMLの部屋で発表したものを再編集したものです。最後に改変したスクリプトの掲載を快諾していただいた山本幸一さんに感謝いたします。


(C)jscripter