diff --git a/gulpfile.js b/gulpfile.js index f8051dd872..8eb12644e0 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -318,37 +318,6 @@ gulp.task('karma-watch', function() { return karma.start({ configFile: __dirname + '/scripts/karma/karma-watch.conf.js' }) }); -gulp.task('docs', ['docs.demos'], function() { - var Dgeni = require('dgeni'); - var semver = require('semver'); - - var docVersion = flags['doc-version'] || 'nightly'; - if (docVersion != 'nightly' && !semver.valid(docVersion)) { - console.log('Usage: gulp docs --doc-version=(nightly|versionName)\nversionName must be a valid semver version.'); - return process.exit(1); - } - try { - var ionicPackage = require('./scripts/docs/dgeni-config')(docVersion); - var dgeni = new Dgeni([ionicPackage]); - return dgeni.generate(); - } catch (err) { - console.log(err.stack); - } -}); - -gulp.task('docs.demos', ['demos', 'bundle', 'sass', 'fonts'], function(){ - return gulp.src([ - 'dist/**', - '!dist/e2e', - '!dist/e2e/**/*', - '!dist/ionic-site', - '!dist/ionic-site/**/*', - '!dist/src', - '!dist/src/**/*' - ]) - .pipe(gulp.dest('dist/ionic-site/docs/v2/dist')); -}) - gulp.task('copy.ts', function() { return gulp.src([ 'ionic/**/*.ts', @@ -376,6 +345,8 @@ gulp.task('src', function(done){ ); }) +require('./scripts/docs/gulp-tasks')(gulp, flags) + gulp.task('demos', function(){ var gulpif = require('gulp-if'); var lazypipe = require('lazypipe'); diff --git a/scripts/docs/gulp-tasks.js b/scripts/docs/gulp-tasks.js new file mode 100644 index 0000000000..df4635d339 --- /dev/null +++ b/scripts/docs/gulp-tasks.js @@ -0,0 +1,168 @@ + +module.exports = function(gulp, flags) { + gulp.task('docs', ['docs.demos'], function() { + var Dgeni = require('dgeni'); + var semver = require('semver'); + + var docVersion = flags['doc-version'] || 'nightly'; + if (docVersion != 'nightly' && !semver.valid(docVersion)) { + console.log('Usage: gulp docs --doc-version=(nightly|versionName)\nversionName must be a valid semver version.'); + return process.exit(1); + } + try { + var ionicPackage = require('./dgeni-config')(docVersion); + var dgeni = new Dgeni([ionicPackage]); + return dgeni.generate(); + } catch (err) { + console.log(err.stack); + } + }); + + gulp.task('docs.demos', ['demos', 'bundle', 'sass', 'fonts'], function(){ + return gulp.src([ + 'dist/**', + '!dist/e2e', + '!dist/e2e/**/*', + '!dist/ionic-site', + '!dist/ionic-site/**/*', + '!dist/src', + '!dist/src/**/*' + ]) + .pipe(gulp.dest('dist/ionic-site/docs/v2/dist')); + }) + + + gulp.task('docs.index', function() { + var idx = lunr(function() { + this.field('path'); + this.field('title', {boost: 10}); + this.field('body'); + this.ref('id'); + }); + var ref = {}; + var refId = 0; + + function addToIndex(path, title, layout, body) { + // Add the data to the indexer and ref object + idx.add({'path': path, 'body': body, 'title': title, id: refId}); + ref[refId] = {'p': path, 't': title, 'l': layout}; + refId++; + } + + var docPath = buildConfig.dist + '/ionic-site'; + gutil.log('Reading docs from', gutil.colors.cyan(docPath)); + + return gulp.src([ + docPath + '/docs/{components,guide,api,overview}/**/*.{md,html,markdown}', + docPath + '/docs/index.html', + docPath + '/getting-started/index.html', + docPath + '/tutorials/**/*.{md,html,markdown}', + docPath + '/_posts/**/*.{md,html,markdown}' + ]) + .pipe(es.map(function(file, callback) { + //docs for gulp file objects: https://github.com/wearefractal/vinyl + var contents = file.contents.toString(); //was buffer + + // Grab relative path from ionic-site root + var relpath = file.path.replace(RegExp('^.*?' + docPath + '/'), ''); + + // Read out the yaml portion of the Jekyll file + var yamlStartIndex = contents.indexOf('---'); + + if (yamlStartIndex === -1) { + return callback(); + } + + // read Jekyll's page yaml variables at the top of the file + var yamlEndIndex = contents.indexOf('---', yamlStartIndex+3); //starting from start + var yamlRaw = contents.substring(yamlStartIndex+3, yamlEndIndex); + + var pageData = yaml.safeLoad(yamlRaw); + if(!pageData.title || !pageData.layout) { + return callback(); + } + + // manually set to not be searchable, or for a blog post, manually set to be searchable + if(pageData.searchable === false || (pageData.layout == 'post' && pageData.searchable !== true)) { + return callback(); + } + + // clean up some content so code variables are searchable too + contents = contents.substring(yamlEndIndex+3); + contents = contents.replace(//gi, ''); + contents = contents.replace(/<\/code>/gi, ''); + contents = contents.replace(/<\/code>/gi, ''); + contents = contents.replace(/``/gi, ''); + + // create a clean path to the URL + var path = '/' + relpath.replace('index.md', '') + .replace('index.html', '') + .replace('.md', '.html') + .replace('.markdown', '.html'); + if(pageData.layout == 'post') { + path = '/blog/' + path.substring(19).replace('.html', '/'); + } + + var parser; + if(pageData.search_sections === true) { + // each section within the content should be its own search result + var section = { body: '', title: '' }; + var isTitleOpen = false; + + parser = new htmlparser.Parser({ + ontext: function(text){ + if(isTitleOpen) { + section.title += text; // get the title of this section + } else { + section.body += text.replace(/{%.*%}/, '', 'g'); // Ignore any Jekyll expressions + } + }, + onopentag: function(name, attrs) { + if(name == 'section' && attrs.id) { + // start building new section data + section = { body: '', path: path + '#' + attrs.id, title: '' }; + } else if( (name == 'h1' || name == 'h2' || name == 'h3') && attrs.class == 'title') { + isTitleOpen = true; // the next text will be this sections title + } + }, + onclosetag: function(name) { + if(name == 'section') { + // section closed, index this section then clear it out + addToIndex(section.path, section.title, pageData.layout, section.body); + section = { body: '', title: '' }; + } else if( (name == 'h1' || name == 'h2' || name == 'h3') && isTitleOpen) { + isTitleOpen = false; + } + } + }); + parser.write(contents); + parser.end(); + + } else { + // index the entire page + var body = ''; + parser = new htmlparser.Parser({ + ontext: function(text){ + body += text.replace(/{%.*%}/, '', 'g'); // Ignore any Jekyll expressions + } + }); + parser.write(contents); + parser.end(); + + addToIndex(path, pageData.title, pageData.layout, body); + } + + callback(); + + })).on('end', function() { + // Write out as one json file + mkdirp.sync(docPath + '/data'); + fs.writeFileSync( + docPath + '/data/index.json', + JSON.stringify({'ref': ref, 'index': idx.toJSON()}) + ); + }); + }); +}