blob: 95e79e44f1db6e55d70acaf5a8243ed55e659111 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
const { dest, series, parallel, src, symlink } = require('gulp');
const del = require('del');
const filter = require('gulp-filter');
const inject = require('gulp-inject');
const map = require('map-stream')
const path = require('path');
const rename = require('gulp-rename');
const replace = require('gulp-replace');
const sort = require('gulp-sort');
const through2 = require('through2');
const File = require('vinyl')
const fs = require('fs');
function deleteComponentSymlinks() {
return del(['components/modules/ROOT/pages/*', '!components/modules/ROOT/pages/index.adoc']);
}
function deleteComponentImageSymlinks() {
return del(['components/modules/ROOT/assets/images/*']);
}
function createComponentSymlinks() {
const f = filter(['**','!**/*-language.adoc', '!**/*-dataformat.adoc'])
return src(['../core/camel-base/src/main/docs/*.adoc','../components/{*,*/*}/src/main/docs/*.adoc'])
.pipe(f)
.pipe(map((file, done) => {
// this flattens the output to just .../pages/....adoc
// instead of .../pages/camel-.../src/main/docs/....adoc
file.base = path.dirname(file.path);
done(null, file);
}))
// Antora disabled symlinks, there is an issue open
// https://gitlab.com/antora/antora/issues/188
// to reinstate symlink support, until that's resolved
// we'll simply copy over instead of creating symlinks
// .pipe(symlink('components/modules/ROOT/pages/', {
// relativeSymlinks: true
// }));
// uncomment above .pipe() and remove the .pipe() below
// when antora#188 is resolved
.pipe(insertSourceAttribute())
.pipe(dest('components/modules/ROOT/pages/'));
}
function createComponentDataFormatSymlinks() {
return src(['../components/{*,*/*}/src/main/docs/*-dataformat.adoc'])
.pipe(map((file, done) => {
// this flattens the output to just .../pages/....adoc
// instead of .../pages/camel-.../src/main/docs/....adoc
file.base = path.dirname(file.path);
done(null, file);
}))
// Antora disabled symlinks, there is an issue open
// https://gitlab.com/antora/antora/issues/188
// to reinstate symlink support, until that's resolved
// we'll simply copy over instead of creating symlinks
// .pipe(symlink('components/modules/ROOT/pages/', {
// relativeSymlinks: true
// }));
// uncomment above .pipe() and remove the .pipe() below
// when antora#188 is resolved
.pipe(insertSourceAttribute())
.pipe(dest('components/modules/dataformats/pages/'));
}
function createComponentLanguageSymlinks() {
return src(['../components/{*,*/*}/src/main/docs/*-language.adoc'])
.pipe(map((file, done) => {
// this flattens the output to just .../pages/....adoc
// instead of .../pages/camel-.../src/main/docs/....adoc
file.base = path.dirname(file.path);
done(null, file);
}))
// Antora disabled symlinks, there is an issue open
// https://gitlab.com/antora/antora/issues/188
// to reinstate symlink support, until that's resolved
// we'll simply copy over instead of creating symlinks
// .pipe(symlink('components/modules/ROOT/pages/', {
// relativeSymlinks: true
// }));
// uncomment above .pipe() and remove the .pipe() below
// when antora#188 is resolved
.pipe(insertSourceAttribute())
.pipe(dest('components/modules/languages/pages/'));
}
function createComponentImageSymlinks() {
return src('../components/{*,*/*}/src/main/docs/*.png')
.pipe(map((file, done) => {
// this flattens the output to just .../pages/....adoc
// instead of .../pages/camel-.../src/main/docs/....adoc
file.base = path.dirname(file.path);
done(null, file);
}))
// Antora disabled symlinks, there is an issue open
// https://gitlab.com/antora/antora/issues/188
// to reinstate symlink support, until that's resolved
// we'll simply copy over instead of creating symlinks
// .pipe(symlink('components/modules/ROOT/pages/', {
// relativeSymlinks: true
// }));
// uncomment above .pipe() and remove the .pipe() below
// when antora#188 is resolved
.pipe(dest('components/modules/ROOT/assets/images/'));
}
function titleFrom(file) {
const maybeName = /(?:=|#) (.*)/.exec(file.contents.toString())
if (maybeName == null) {
throw new Error(`${file.path} doesn't contain Asciidoc heading ('= <Title>') or ('# <Title')`);
}
return maybeName[1];
}
function compare (file1, file2) {
if (file1 === file2) return 0
return titleFrom(file1).toUpperCase() < titleFrom(file2).toUpperCase() ? -1: 1
}
function insertGeneratedNotice() {
return inject(src('./generated.txt'), {
name: 'generated',
removeTags: true,
transform: (filename, file) => {
return file.contents.toString('utf8');
}
});
}
function insertSourceAttribute() {
return replace(/^= .+/m, function(match) {
return `${match}\n:page-source: ${path.relative('..', this.file.path)}`;
});
}
function createComponentNav() {
return src('component-nav.adoc.template')
.pipe(insertGeneratedNotice())
.pipe(inject(src(['components/modules/ROOT/pages/**/*.adoc', '!components/modules/ROOT/pages/index.adoc'])
.pipe(sort(compare)), {
removeTags: true,
transform: (filename, file) => {
const filepath = path.basename(filename);
const title = titleFrom(file);
return `** xref:${filepath}[${title}]`;
}
}))
.pipe(rename('nav.adoc'))
.pipe(dest('components/modules/ROOT/'))
}
function createComponentDataFormatsNav() {
return src('component-dataformats-nav.adoc.template')
.pipe(insertGeneratedNotice())
.pipe(inject(src(['components/modules/dataformats/pages/**/*.adoc', '!components/modules/dataformats/pages/index.adoc'])
.pipe(sort(compare)), {
removeTags: true,
transform: (filename, file) => {
const filepath = path.basename(filename);
const title = titleFrom(file);
return `** xref:dataformats:${filepath}[${title}]`;
}
}))
.pipe(rename('nav.adoc'))
.pipe(dest('components/modules/dataformats/'))
}
function createComponentLanguagesNav() {
return src('component-languages-nav.adoc.template')
.pipe(insertGeneratedNotice())
.pipe(inject(src(['components/modules/languages/pages/**/*.adoc',
'../core/camel-core-languages/src/main/docs/modules/languages/pages/*.adoc',
'../core/camel-xml-jaxp/src/main/docs/modules/languages/pages/*.adoc',
'!components/modules/languages/pages/index.adoc'])
.pipe(sort(compare)), {
removeTags: true,
transform: (filename, file) => {
const filepath = path.basename(filename);
const title = titleFrom(file);
return `** xref:languages:${filepath}[${title}]`;
}
}))
.pipe(rename('nav.adoc'))
.pipe(dest('components/modules/languages/'))
}
function createEIPNav() {
const f = filter(['**','!**/enterprise-integration-patterns.adoc'])
return src('eip-nav.adoc.template')
.pipe(insertGeneratedNotice())
.pipe(inject(src('../core/camel-core-engine/src/main/docs/modules/eips/pages/*.adoc')
.pipe(f).pipe(sort(compare)), {
removeTags: true,
name: 'eips',
transform: (filename, file) => {
const filepath = path.basename(filename);
const title = titleFrom(file);
return ` ** xref:eips:${filepath}[${title}]`;
}
}))
.pipe(rename('nav.adoc'))
.pipe(dest('../core/camel-core-engine/src/main/docs/modules/eips/'))
}
const extractExamples = function(file, enc, next) {
const asciidoc = file.contents.toString();
const includes = /(?:include::\{examplesdir\}\/)([^[]+)/g;
let example;
let exampleFiles = new Set()
while (example = includes.exec(asciidoc)) {
let examplePath = path.resolve(path.join('..', example[1]));
exampleFiles.add(examplePath);
}
// (exampleFiles.size > 0) && console.log('example files', exampleFiles)
exampleFiles.forEach(examplePath => this.push(new File({
base: path.resolve('..'),
path: examplePath,
contents: fs.createReadStream(examplePath)
})));
return next();
}
function deleteExamples(){
return del(['user-manual/modules/ROOT/examples/', 'components/modules/ROOT/examples/']);
}
function createUserManualExamples() {
return src('user-manual/modules/ROOT/**/*.adoc')
.pipe(through2.obj(extractExamples))
.pipe(dest('user-manual/modules/ROOT/examples/'));
}
function createEIPExamples() {
return src('../core/camel-core-engine/src/main/docs/modules/eips/**/*.adoc')
.pipe(through2.obj(extractExamples))
.pipe(dest('../core/camel-core-engine/src/main/docs/modules/eips/examples/'));
}
function createUserManualLanguageExamples() {
return src('../core/camel-core-languages/src/main/docs/user-manual/modules/languages/**/*.adoc')
.pipe(through2.obj(extractExamples))
.pipe(dest('user-manual/modules/ROOT/examples/'));
}
function createComponentExamples() {
return src('../components/{*,*/*}/src/main/docs/*.adoc')
.pipe(through2.obj(extractExamples))
.pipe(dest('components/modules/ROOT/examples/'));
}
const symlinks = parallel(
series(deleteComponentSymlinks, createComponentSymlinks, createComponentDataFormatSymlinks, createComponentLanguageSymlinks),
series(deleteComponentImageSymlinks, createComponentImageSymlinks)
);
const nav = parallel(createComponentNav, createComponentDataFormatsNav, createComponentLanguagesNav, createEIPNav);
const examples = series(deleteExamples, createUserManualExamples, createEIPExamples, createUserManualLanguageExamples, createComponentExamples);
exports.symlinks = symlinks;
exports.nav = nav;
exports.examples = examples;
exports.default = series(symlinks, nav, examples);