diff options
author | silverwind <me@silverwind.io> | 2020-04-30 08:26:37 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-30 07:26:37 +0100 |
commit | 310699bca71f15cc7b46363800574ba6e74d8c5c (patch) | |
tree | 0eeb028ed12cafadd7043deb5db7dcb97e84b333 /web_src/fomantic | |
parent | bfda0f38646f66dbae2767eed3097489c456ebf5 (diff) | |
download | gitea-310699bca71f15cc7b46363800574ba6e74d8c5c.tar.gz gitea-310699bca71f15cc7b46363800574ba6e74d8c5c.zip |
Patch fomantic-ui to workaround build issue (#11244)
* Patch fomantic-ui to workaround build issue
Better workaround than https://github.com/go-gitea/gitea/issues/10653
for https://github.com/fomantic/Fomantic-UI/issues/1356. It does not
seem like we're getting a new Fomantic-UI release anytime soon, so
this patches it after node_modules installation.
Fixes: https://github.com/go-gitea/gitea/issues/11243
Fixes: https://github.com/go-gitea/gitea/issues/10679
* copy instead of patch
* update package-lock.json
* Update Makefile
Co-Authored-By: Sorien <Sorien@users.noreply.github.com>
* Update web_src/fomantic/css.js
Co-Authored-By: zeripath <art27@cantab.net>
Co-authored-by: Sorien <Sorien@users.noreply.github.com>
Co-authored-by: zeripath <art27@cantab.net>
Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
Co-authored-by: guillep2k <18600385+guillep2k@users.noreply.github.com>
Diffstat (limited to 'web_src/fomantic')
-rw-r--r-- | web_src/fomantic/css.js | 260 |
1 files changed, 260 insertions, 0 deletions
diff --git a/web_src/fomantic/css.js b/web_src/fomantic/css.js new file mode 100644 index 0000000000..2d753f0613 --- /dev/null +++ b/web_src/fomantic/css.js @@ -0,0 +1,260 @@ +/******************************* + * Build Task + *******************************/ + +const + gulp = require('gulp'), + + // node dependencies + console = require('better-console'), + + // gulp dependencies + autoprefixer = require('gulp-autoprefixer'), + chmod = require('gulp-chmod'), + concatCSS = require('gulp-concat-css'), + dedupe = require('gulp-dedupe'), + flatten = require('gulp-flatten'), + gulpif = require('gulp-if'), + header = require('gulp-header'), + less = require('gulp-less'), + minifyCSS = require('gulp-clean-css'), + normalize = require('normalize-path'), + plumber = require('gulp-plumber'), + print = require('gulp-print').default, + rename = require('gulp-rename'), + replace = require('gulp-replace'), + replaceExt = require('replace-ext'), + rtlcss = require('gulp-rtlcss'), + + // config + config = require('./../config/user'), + docsConfig = require('./../config/docs'), + tasks = require('../config/tasks'), + install = require('../config/project/install'), + + // shorthand + globs = config.globs, + assets = config.paths.assets, + + banner = tasks.banner, + filenames = tasks.filenames, + comments = tasks.regExp.comments, + log = tasks.log, + settings = tasks.settings +; + +/** + * Builds the css + * @param src + * @param type + * @param compress + * @param config + * @param opts + * @return {*} + */ +function build(src, type, compress, config, opts) { + let fileExtension; + if (type === 'rtl' && compress) { + fileExtension = settings.rename.rtlMinCSS; + } else if (type === 'rtl') { + fileExtension = settings.rename.rtlCSS; + } else if (compress) { + fileExtension = settings.rename.minCSS; + } + + return gulp.src(src, opts) + .pipe(plumber(settings.plumber.less)) + .pipe(less(settings.less)) + .pipe(autoprefixer(settings.prefix)) + .pipe(gulpif(type === 'rtl', rtlcss())) + .pipe(replace(comments.variables.in, comments.variables.out)) + .pipe(replace(comments.license.in, comments.license.out)) + .pipe(replace(comments.large.in, comments.large.out)) + .pipe(replace(comments.small.in, comments.small.out)) + .pipe(replace(comments.tiny.in, comments.tiny.out)) + .pipe(flatten()) + .pipe(replace(config.paths.assets.source, + compress ? config.paths.assets.compressed : config.paths.assets.uncompressed)) + .pipe(gulpif(compress, minifyCSS(settings.minify))) + .pipe(gulpif(fileExtension, rename(fileExtension))) + .pipe(gulpif(config.hasPermissions, chmod(config.parsedPermissions))) + .pipe(gulp.dest(compress ? config.paths.output.compressed : config.paths.output.uncompressed)) + .pipe(print(log.created)) + ; +} + +/** + * Packages the css files in dist + * @param {string} type - type of the css processing (none, rtl, docs) + * @param {boolean} compress - should the output be compressed + */ +function pack(type, compress) { + const output = type === 'docs' ? docsConfig.paths.output : config.paths.output; + const ignoredGlobs = type === 'rtl' ? globs.ignoredRTL + '.rtl.css' : globs.ignored + '.css'; + + let concatenatedCSS; + if (type === 'rtl') { + concatenatedCSS = compress ? filenames.concatenatedMinifiedRTLCSS : filenames.concatenatedRTLCSS; + } else { + concatenatedCSS = compress ? filenames.concatenatedMinifiedCSS : filenames.concatenatedCSS; + } + + return gulp.src(output.uncompressed + '/**/' + globs.components + ignoredGlobs) + .pipe(plumber()) + .pipe(dedupe()) + .pipe(replace(assets.uncompressed, assets.packaged)) + .pipe(concatCSS(concatenatedCSS, settings.concatCSS)) + .pipe(gulpif(config.hasPermissions, chmod(config.parsedPermissions))) + .pipe(gulpif(compress, minifyCSS(settings.concatMinify))) + .pipe(header(banner, settings.header)) + .pipe(gulp.dest(output.packaged)) + .pipe(print(log.created)) + ; +} + +function buildCSS(src, type, config, opts, callback) { + if (!install.isSetup()) { + console.error('Cannot build CSS files. Run "gulp install" to set-up Semantic'); + callback(); + return; + } + + if (callback === undefined) { + callback = opts; + opts = config; + config = type; + type = src; + src = config.paths.source.definitions + '/**/' + config.globs.components + '.less'; + } + + const buildUncompressed = () => build(src, type, false, config, opts); + buildUncompressed.displayName = 'Building uncompressed CSS'; + + const buildCompressed = () => build(src, type, true, config, opts); + buildCompressed.displayName = 'Building compressed CSS'; + + const packUncompressed = () => pack(type, false); + packUncompressed.displayName = 'Packing uncompressed CSS'; + + const packCompressed = () => pack(type, true); + packCompressed.displayName = 'Packing compressed CSS'; + + gulp.parallel( + gulp.series( + buildUncompressed, + gulp.parallel(packUncompressed, packCompressed) + ), + gulp.series(buildCompressed) + )(callback); +} + +function rtlAndNormal(src, callback) { + if (callback === undefined) { + callback = src; + src = config.paths.source.definitions + '/**/' + config.globs.components + '.less'; + } + + const rtl = (callback) => buildCSS(src, 'rtl', config, {}, callback); + rtl.displayName = "CSS Right-To-Left"; + const css = (callback) => buildCSS(src, 'default', config, {}, callback); + css.displayName = "CSS"; + + if (config.rtl === true || config.rtl === 'Yes') { + rtl(callback); + } else if (config.rtl === 'both') { + gulp.series(rtl, css)(callback); + } else { + css(callback); + } +} + +function docs(src, callback) { + if (callback === undefined) { + callback = src; + src = config.paths.source.definitions + '/**/' + config.globs.components + '.less'; + } + + const func = (callback) => buildCSS(src, 'docs', config, {}, callback); + func.displayName = "CSS Docs"; + + func(callback); +} + +// Default tasks +module.exports = rtlAndNormal; + +// We keep the changed files in an array to call build with all of them at the same time +let timeout, files = []; + +/** + * Watch changes in CSS files and call the correct build pipe + * @param type + * @param config + */ +module.exports.watch = function (type, config) { + const method = type === 'docs' ? docs : rtlAndNormal; + + // Watch theme.config file + gulp.watch([ + normalize(config.paths.source.config), + normalize(config.paths.source.site + '/**/site.variables'), + normalize(config.paths.source.themes + '/**/site.variables') + ]) + .on('all', function () { + // Clear timeout and reset files + timeout && clearTimeout(timeout); + files = []; + return gulp.series(method)(); + }); + + // Watch any less / overrides / variables files + gulp.watch([ + normalize(config.paths.source.definitions + '/**/*.less'), + normalize(config.paths.source.site + '/**/*.{overrides,variables}'), + normalize(config.paths.source.themes + '/**/*.{overrides,variables}') + ]) + .on('all', function (event, path) { + // We don't handle deleted files yet + if (event === 'unlink' || event === 'unlinkDir') { + return; + } + + // Clear timeout + timeout && clearTimeout(timeout); + + // Determine which LESS file has to be recompiled + let lessPath; + if(path.indexOf('site.variables') !== -1) { + return; + } else if (path.indexOf(config.paths.source.themes) !== -1) { + console.log('Change detected in packaged theme'); + lessPath = replaceExt(path, '.less'); + lessPath = lessPath.replace(tasks.regExp.theme, config.paths.source.definitions); + } else if (path.indexOf(config.paths.source.site) !== -1) { + console.log('Change detected in site theme'); + lessPath = replaceExt(path, '.less'); + lessPath = lessPath.replace(config.paths.source.site, config.paths.source.definitions); + } else { + console.log('Change detected in definition'); + lessPath = path; + } + + // Add file to internal changed files array + if (!files.includes(lessPath)) { + files.push(lessPath); + } + + // Update timeout + timeout = setTimeout(() => { + // Copy files to build in another array + const buildFiles = [...files]; + // Call method + gulp.series((callback) => method(buildFiles, callback))(); + // Reset internal changed files array + files = []; + }, 1000); + }); +}; + +// Expose build css method +module.exports.buildCSS = buildCSS; |