files.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. var fs = require("fs");
  2. var url = require("url");
  3. var os = require("os");
  4. var dirname = require("path").dirname;
  5. var resolvePath = require("path").resolve;
  6. var isAbsolutePath = require('path-is-absolute');
  7. var promises = require("../promises");
  8. exports.Files = Files;
  9. exports.uriToPath = uriToPath;
  10. function Files(base) {
  11. function read(uri, encoding) {
  12. return resolveUri(uri).then(function(path) {
  13. return readFile(path, encoding).caught(function(error) {
  14. var message = "could not open external image: '" + uri + "' (document directory: '" + base + "')\n" + error.message;
  15. return promises.reject(new Error(message));
  16. });
  17. });
  18. }
  19. function resolveUri(uri) {
  20. var path = uriToPath(uri);
  21. if (isAbsolutePath(path)) {
  22. return promises.resolve(path);
  23. } else if (base) {
  24. return promises.resolve(resolvePath(base, path));
  25. } else {
  26. return promises.reject(new Error("could not find external image '" + uri + "', path of input document is unknown"));
  27. }
  28. }
  29. return {
  30. read: read
  31. };
  32. }
  33. function relativeToFile(filePath) {
  34. return new Files(dirname(filePath));
  35. }
  36. Files.relativeToFile = relativeToFile;
  37. var readFile = promises.promisify(fs.readFile.bind(fs));
  38. function uriToPath(uriString, platform) {
  39. if (!platform) {
  40. platform = os.platform();
  41. }
  42. var uri = url.parse(uriString);
  43. if (isLocalFileUri(uri) || isRelativeUri(uri)) {
  44. var path = decodeURIComponent(uri.path);
  45. if (platform === "win32" && /^\/[a-z]:/i.test(path)) {
  46. return path.slice(1);
  47. } else {
  48. return path;
  49. }
  50. } else {
  51. throw new Error("Could not convert URI to path: " + uriString);
  52. }
  53. }
  54. function isLocalFileUri(uri) {
  55. return uri.protocol === "file:" && (!uri.host || uri.host === "localhost");
  56. }
  57. function isRelativeUri(uri) {
  58. return !uri.protocol && !uri.host;
  59. }