asset.js 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. 'use strict';
  2. const fs = require('hexo-fs');
  3. const Promise = require('bluebird');
  4. const { extname } = require('path');
  5. const { magenta } = require('chalk');
  6. const process = (name, ctx) => {
  7. return Promise.filter(ctx.model(name).toArray(), asset => fs.exists(asset.source).tap(exist => {
  8. if (!exist) return asset.remove();
  9. })).map(asset => {
  10. const { source } = asset;
  11. let { path } = asset;
  12. const data = {
  13. modified: asset.modified
  14. };
  15. if (asset.renderable && ctx.render.isRenderable(path)) {
  16. // Replace extension name if the asset is renderable
  17. const filename = path.substring(0, path.length - extname(path).length);
  18. path = `${filename}.${ctx.render.getOutput(path)}`;
  19. data.data = () => ctx.render.render({
  20. path: source,
  21. toString: true
  22. }).catch(err => {
  23. ctx.log.error({err}, 'Asset render failed: %s', magenta(path));
  24. });
  25. } else {
  26. data.data = () => fs.createReadStream(source);
  27. }
  28. return { path, data };
  29. });
  30. };
  31. function assetGenerator() {
  32. return Promise.all([
  33. process('Asset', this),
  34. process('PostAsset', this)
  35. ]).then(data => [].concat(...data));
  36. }
  37. module.exports = assetGenerator;