1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 | var xml = require('jstoxml');
|
12 | var async = require('async');
|
13 | var _ = require('lodash');
|
14 | var path = require('path');
|
15 |
|
16 | module.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 |
|
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 |
|
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 |
|
107 | module.exports.options = {
|
108 | stage: 'render:pre:pages'
|
109 | }; |
\ | No newline at end of file |