UNPKG

2.94 kBJavaScriptView Raw
1/*
2 * Assemble Plugin: Sitemap
3 * https://github.com/assemble/assemble-contrib-sitemap
4 *
5 * Sitemap generator plugin for Assemble.
6 *
7 * Copyright (c) 2014 Hariadi Hinta, contributors.
8 * Licensed under the MIT license.
9 */
10
11var xml = require('jstoxml');
12var async = require('async');
13var _ = require('lodash');
14var path = require('path');
15
16module.exports = function (params, callback) {
17
18 var assemble = params.assemble;
19 var grunt = params.grunt;
20 var pages = assemble.options.pages;
21 var options = assemble.options.sitemap || {};
22 var sitemap = [];
23 var robots = [];
24 var exclusion = ['404'];
25 var pkg = grunt.file.readJSON('package.json');
26
27 options.homepage = options.homepage || pkg.homepage;
28 options.robot = options.robot !== false;
29 options.changefreq = options.changefreq || 'weekly';
30 options.priority = (options.priority || 0.5).toString();
31 options.dest = options.dest || path.dirname(pages[0].dest);
32
33
34 // Only write if it actually changed.
35 var write = function (file, content) {
36 var msg;
37 var old = grunt.file.exists(file) ? grunt.file.read(file) : '';
38
39 if (old !== content) {
40 grunt.file.write(file, content);
41 msg = 'Created '.yellow + file.cyan;
42 } else {
43 msg = 'Keeping '.yellow + file.cyan;
44 }
45 return grunt.verbose.ok(msg);
46 };
47
48 // Return the relative destination if the option is enabled
49 var getExternalFilePath = function (relativedest, file) {
50 return (relativedest ? file.dest.replace(options.dest + "/", "") : file.dest );
51 };
52
53 async.forEach(pages, function (file, next) {
54
55 if (!_.isUndefined(options.exclude)) {
56 exclusion = _.union([], exclusion, options.exclude || []);
57 }
58
59 var url = options.homepage;
60 var date = file.data.updated || file.data.date || new Date();
61 var changefreq = file.data.changefreq || options.changefreq;
62 var priority = options.priority;
63 var relativedest = options.relativedest;
64
65 if (exclusion.indexOf(file.basename) !== -1 ||
66 grunt.file.isMatch({srcBase: options.dest}, exclusion, file.dest)) {
67 robots.push('Disallow: /' + getExternalFilePath(relativedest, file));
68 return;
69 }
70
71 sitemap.push({
72 url: {
73 loc: url + '/' + getExternalFilePath(relativedest, file),
74 lastmod: date.toISOString(),
75 changefreq: changefreq,
76 priority: priority
77 }
78 });
79
80 next();
81 }, callback());
82
83 var result = xml.toXML({
84 _name: 'urlset',
85 _attrs: {
86 xmlns: 'http://www.sitemaps.org/schemas/sitemap/0.9'
87 },
88 _content: sitemap
89 }, {header: true, indent: ' '});
90
91
92
93 var sitemapDest = options.dest + '/sitemap.xml';
94 write(sitemapDest, result);
95
96 if (options.robot) {
97 var robot = "User-agent: *\n\n";
98
99 robot += robots.join('\n') + '\n';
100
101 var robotpDest = options.dest + '/robots.txt';
102 write(robotpDest, robot);
103 }
104
105};
106
107module.exports.options = {
108 stage: 'render:pre:pages'
109};
\No newline at end of file