diff --git a/scripts/gulp/declarations.d.ts b/scripts/gulp/declarations.d.ts index f30f90ebb9..54588cef7b 100644 --- a/scripts/gulp/declarations.d.ts +++ b/scripts/gulp/declarations.d.ts @@ -1,3 +1,7 @@ -declare module 'google-closure-compiler-js'; +declare module 'dgeni'; +declare module 'event-stream'; +declare module 'html-entities'; declare module 'rollup'; -declare module 'rollup-plugin-node-resolve'; \ No newline at end of file +declare module 'rollup-plugin-commonjs'; +declare module 'rollup-plugin-node-resolve'; +declare module 'yargs'; \ No newline at end of file diff --git a/scripts/gulp/gulpfile.ts b/scripts/gulp/gulpfile.ts index dce6e63ded..21aec8b569 100644 --- a/scripts/gulp/gulpfile.ts +++ b/scripts/gulp/gulpfile.ts @@ -2,6 +2,7 @@ import './tasks/build'; import './tasks/clean'; import './tasks/default'; import './tasks/demos'; +import './tasks/docs'; import './tasks/e2e'; import './tasks/lint'; import './tasks/release'; diff --git a/scripts/gulp/tasks/docs.ts b/scripts/gulp/tasks/docs.ts new file mode 100644 index 0000000000..dac03bafc1 --- /dev/null +++ b/scripts/gulp/tasks/docs.ts @@ -0,0 +1,89 @@ +import { createReadStream, writeFileSync } from 'fs'; +import { join, relative } from 'path'; +import { DEMOS_ROOT, DEMOS_SRC_ROOT } from '../constants'; +import { src, dest, task } from 'gulp'; + +import * as Dgeni from 'dgeni'; +import { split, map } from 'event-stream'; +import { AllHtmlEntities } from 'html-entities'; +import * as mkdirp from 'mkdirp'; +import { valid }from 'semver'; +import { argv } from 'yargs'; + + +task('docs', () => { + const docVersion = argv['doc-version'] || 'nightly'; + const initialVersionBuild = argv['initial-build'] || false; + if (docVersion !== 'nightly' && ! valid(docVersion)) { + console.log('Usage: gulp docs --doc-version=(nightly|versionName)\nversionName must be a valid semver version.'); + return process.exit(1); + } + + try { + const ionicPackage = require('../../docs/dgeni-config')(docVersion, initialVersionBuild); + const dgeni = new Dgeni([ionicPackage]); + return dgeni.generate(); + } catch (err) { + console.log(err.stack); + } +}); + +task('docs.copyDemos', [], () => { + const config = require('../../config.json'); + const outputDir = join(config.docsDest, 'dist', 'demos'); + return src([`${DEMOS_ROOT}/css`, `${DEMOS_ROOT}/fonts`, `${DEMOS_ROOT}/polyfills`, `${DEMOS_SRC_ROOT}`]) + .pipe(dest(outputDir)); +}); + +task('docs.sassVariables', () => { + let variables = []; + const outputFile = 'tmp/sass.json'; + + function addVariable(variableName, defaultValue, file) { + const entities = new AllHtmlEntities(); + defaultValue = entities.encode(defaultValue); + defaultValue = defaultValue.replace('!default;', ''); + + variables.push({ + name: variableName, + defaultValue: defaultValue.trim(), + file: relative('./', file.path) + }); + } + + return src('./src/**/*.scss') + .pipe(map((file, callback) => { + let variableLine, variableName, defaultValue, multiline; + createReadStream(file.path, { flags: 'r'}) + .pipe(split()) + .pipe(map((line, callback) => { + if (line.charAt(0) === '$') { + variableLine = line.split(/:(.+)/); + variableName = variableLine[0]; + defaultValue = variableLine[1]; + + // If there is a semicolon then it isn't a multiline value + multiline = line.indexOf(';') > -1 ? false : true; + if (!multiline && line.indexOf('!default') > -1) { + addVariable(variableName, defaultValue, file); + } + } else if (multiline === true) { + defaultValue += '\n' + line; + + // If the line has a semicolon then we've found the end of the value + if (line.indexOf(';') > -1 && line.indexOf('!default') > -1) { + addVariable(variableName, defaultValue, file); + multiline = false; + } + } + callback(); + })); + callback(); + }).on('end', () => { + const config = require('../../config.json'); + console.log(`Writing to file at /driftyco/ionic/${outputFile}`); + console.log(`Place this file in /driftyco/ionic-site/${config.v2DocsDir}/theming/overriding-ionic-variables in order to update the docs`); + mkdirp.sync('tmp'); + writeFileSync(outputFile, JSON.stringify(variables)); + })); +});