summaryrefslogtreecommitdiffstats
path: root/web_src/fomantic
diff options
context:
space:
mode:
authorsilverwind <me@silverwind.io>2020-04-30 08:26:37 +0200
committerGitHub <noreply@github.com>2020-04-30 07:26:37 +0100
commit310699bca71f15cc7b46363800574ba6e74d8c5c (patch)
tree0eeb028ed12cafadd7043deb5db7dcb97e84b333 /web_src/fomantic
parentbfda0f38646f66dbae2767eed3097489c456ebf5 (diff)
downloadgitea-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.js260
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;