読者です 読者をやめる 読者になる 読者になる

二つのパスから相対パスを得る関数

id:teramako さんに教えて貰いました。

function fromUTF8Octets (s) {
  let conv =
    Components.classes['@mozilla.org/intl/scriptableunicodeconverter'].
      getService(Components.interfaces.nsIScriptableUnicodeConverter);
  conv.charset = 'UTF-8';
  return conv.ConvertToUnicode(s);
}

// 非推奨版 http://nanto.asablo.jp/blog/2006/10/23/572458
//  function fromUTF8Octets (s)
//    decodeURIComponent(escape(s));

function makeLocalFile (path) {
  let file = Components.classes['@mozilla.org/file/local;1']
                       .createInstance(Components.interfaces.nsILocalFile);
  file.initWithPath(path);
  return file;
}

function getRelativePath (target, base) {
  return fromUTF8Octets(makeLocalFile(target).getRelativeDescriptor(makeLocalFile(base)));
}

getRelativeDescriptor の返値は何故か UTF-8 のバイト列なので fromUTF8Octets を適用する必要がある。