2023-11-30 14:15:19 +00:00

132 lines
3.2 KiB
JavaScript

const filters = require("./docs/filters.js");
const files = require("./docs/files.js");
const sass = require("node-sass");
const fs = require("fs");
function extract(src) {
const data = {};
const readme = fs.readFileSync(src + "README.md", "utf-8");
data.title = (readme.match(/^\#\s(.+)/gm) || []).map(one =>
one.replace(/^\#\s/, "")
)[0];
if (!data.title)
throw new Error("Your file " + file + "/README.md has no h1 in markdown");
data.sections = (readme.match(/^\#\#[\s](.+)/gm) || []).map(one =>
one.replace(/^\#\#\s/, "")
);
return data;
}
function getInfo(src) {
delete require.cache[require.resolve(src)];
const info = {};
if (/documentation/.test(src)) {
const base = { title: "Introduction", url: "/documentation/" };
info.introduction = Object.assign({}, extract(src), base);
}
return require(src).reduce((obj, one) => {
return Object.assign({}, obj, { [one]: extract(src + one + "/") });
}, info);
}
// Generate the documentation final:origin pairs
const transform = dir =>
files(__dirname + "/" + dir)
.filter(str => /\.html\.pug$/.test(str))
.reduce((docs, one) => {
docs[one.replace(/\.pug$/, "")] = one;
return docs;
}, {});
// This builds the library itself
module.exports = function(grunt) {
// Configuration
grunt.initConfig({
bytesize: {
all: {
src: ["docs/assets/style.min.css", "docs/assets/javascript.js"]
}
},
jshint: {
options: { esversion: 6 },
src: ["Gruntfile.js", "server.js", "src"]
},
// Launch a small static server
connect: {
server: {
options: {
port: 3000,
hostname: "*",
base: "docs",
livereload: true,
useAvailablePort: false
}
}
},
sass: {
dist: {
options: { implementation: sass, outputStyle: "compressed" },
files: { "docs/assets/style.min.css": "docs/assets/style.scss" }
}
},
pug: {
compile: {
options: {
client: false,
data: file => {
return {
require,
file,
tutorials: getInfo("./docs/tutorials/"),
documentation: getInfo("./docs/documentation/"),
slug: str => str.toLowerCase().replace(/[^\w]+/g, "-")
};
},
filters: filters
},
files: transform("docs")
}
},
watch: {
scripts: {
files: [
"Gruntfile.js",
// Docs
"docs/**/*.*",
"README.md",
// For testing:
"server.js",
"src/**/*.js",
// To bump versions
"package.js"
],
tasks: ["default"],
options: {
spawn: false,
livereload: true
}
}
}
});
grunt.loadNpmTasks("grunt-contrib-connect");
grunt.loadNpmTasks("grunt-contrib-jshint");
grunt.loadNpmTasks("grunt-contrib-pug");
grunt.loadNpmTasks("grunt-contrib-watch");
grunt.loadNpmTasks("grunt-bytesize");
grunt.loadNpmTasks("grunt-sass");
grunt.registerTask("build", ["sass", "pug"]);
grunt.registerTask("test", ["bytesize"]);
grunt.registerTask("default", ["build", "test", "connect"]);
};