mirror of
https://github.com/searxng/searxng.git
synced 2025-03-12 15:41:15 +00:00
[web-client] simple theme: final build by vite & clean up grunt leftovers
Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
This commit is contained in:
parent
872e09d103
commit
1a3543d4b2
10 changed files with 31 additions and 10174 deletions
1
searx/static/themes/simple/.gitignore
vendored
1
searx/static/themes/simple/.gitignore
vendored
|
@ -1 +0,0 @@
|
|||
/node_modules
|
|
@ -1,8 +0,0 @@
|
|||
{
|
||||
"proto": true,
|
||||
"globals": {
|
||||
"browser": true,
|
||||
"jQuery": false,
|
||||
"devel": true
|
||||
}
|
||||
}
|
|
@ -1,313 +0,0 @@
|
|||
/* SPDX-License-Identifier: AGPL-3.0-or-later */
|
||||
|
||||
module.exports = function (grunt) {
|
||||
|
||||
const eachAsync = require('each-async');
|
||||
|
||||
function file_exists (filepath) {
|
||||
// filter function to exit grunt task with error if a (src) file not exists
|
||||
if (!grunt.file.exists(filepath)) {
|
||||
grunt.fail.fatal('Could not find: ' + filepath, 42);
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
grunt.initConfig({
|
||||
|
||||
_brand: '../../../../src/brand',
|
||||
_templates: '../../../templates',
|
||||
|
||||
pkg: grunt.file.readJSON('package.json'),
|
||||
watch: {
|
||||
scripts: {
|
||||
files: ['gruntfile.js', 'eslint.config.mjs', '.stylelintrc.json', 'src/**'],
|
||||
tasks: [
|
||||
'eslint',
|
||||
'stylelint',
|
||||
'copy',
|
||||
'uglify',
|
||||
'less',
|
||||
'image',
|
||||
'svg2png',
|
||||
'svg2jinja'
|
||||
]
|
||||
}
|
||||
},
|
||||
eslint: {
|
||||
options: {
|
||||
overrideConfigFile: 'eslint.config.mjs',
|
||||
failOnError: true,
|
||||
fix: grunt.option('fix')
|
||||
},
|
||||
target: [
|
||||
'gruntfile.js',
|
||||
'svg4web.svgo.js',
|
||||
'src/js/main/*.js',
|
||||
'src/js/head/*.js',
|
||||
],
|
||||
},
|
||||
stylelint: {
|
||||
options: {
|
||||
formatter: 'unix',
|
||||
fix: grunt.option('fix')
|
||||
},
|
||||
src: [
|
||||
'src/less/**/*.less',
|
||||
]
|
||||
},
|
||||
copy: {
|
||||
js: {
|
||||
expand: true,
|
||||
cwd: './node_modules',
|
||||
dest: './js/',
|
||||
flatten: true,
|
||||
filter: 'isFile',
|
||||
timestamp: true,
|
||||
src: [
|
||||
'./leaflet/dist/leaflet.js',
|
||||
]
|
||||
},
|
||||
css: {
|
||||
expand: true,
|
||||
cwd: './node_modules',
|
||||
dest: './css/',
|
||||
flatten: true,
|
||||
filter: 'isFile',
|
||||
timestamp: true,
|
||||
src: [
|
||||
'./leaflet/dist/leaflet.css',
|
||||
]
|
||||
},
|
||||
leaflet_images: {
|
||||
expand: true,
|
||||
cwd: './node_modules',
|
||||
dest: './css/images/',
|
||||
flatten: true,
|
||||
filter: 'isFile',
|
||||
timestamp: true,
|
||||
src: [
|
||||
'./leaflet/dist/images/*.png',
|
||||
]
|
||||
},
|
||||
},
|
||||
uglify: {
|
||||
options: {
|
||||
output: {
|
||||
comments: 'some'
|
||||
},
|
||||
ie8: false,
|
||||
warnings: true,
|
||||
compress: false,
|
||||
mangle: true,
|
||||
sourceMap: {
|
||||
includeSources: true
|
||||
}
|
||||
},
|
||||
dist: {
|
||||
files: {
|
||||
'js/searxng.head.min.js': ['src/js/head/*.js'],
|
||||
'js/searxng.min.js': [
|
||||
'src/js/main/*.js',
|
||||
'./node_modules/autocomplete-js/dist/autocomplete.js',
|
||||
'./node_modules/swiped-events/src/swiped-events.js'
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
less: {
|
||||
production: {
|
||||
options: {
|
||||
paths: ["less"],
|
||||
sourceMap: true,
|
||||
sourceMapURL: (name) => { const s = name.split('/'); return s[s.length - 1] + '.map'; },
|
||||
outputSourceFiles: true,
|
||||
},
|
||||
files: [
|
||||
{
|
||||
src: ['src/less/style-ltr.less'],
|
||||
dest: 'css/searxng.min.css',
|
||||
nonull: true,
|
||||
filter: file_exists,
|
||||
},
|
||||
{
|
||||
src: ['src/less/style-rtl.less'],
|
||||
dest: 'css/searxng-rtl.min.css',
|
||||
nonull: true,
|
||||
filter: file_exists,
|
||||
},
|
||||
{
|
||||
src: ['src/less/rss.less'],
|
||||
dest: 'css/rss.min.css',
|
||||
nonull: true,
|
||||
filter: file_exists,
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
image: {
|
||||
svg4web: {
|
||||
options: {
|
||||
svgo: ['--config', 'svg4web.svgo.js']
|
||||
},
|
||||
files: {
|
||||
'<%= _templates %>/simple/searxng-wordmark.min.svg': '<%= _brand %>/searxng-wordmark.svg',
|
||||
'img/searxng.svg': '<%= _brand %>/searxng.svg',
|
||||
'img/img_load_error.svg': '<%= _brand %>/img_load_error.svg'
|
||||
}
|
||||
},
|
||||
favicon: {
|
||||
options: {
|
||||
svgo: ['--config', 'svg4favicon.svgo.js']
|
||||
},
|
||||
files: {
|
||||
'img/favicon.svg': '<%= _brand %>/searxng-wordmark.svg'
|
||||
}
|
||||
},
|
||||
},
|
||||
svg2png: {
|
||||
favicon: {
|
||||
files: {
|
||||
'img/favicon.png': '<%= _brand %>/searxng-wordmark.svg',
|
||||
'img/searxng.png': '<%= _brand %>/searxng.svg',
|
||||
}
|
||||
}
|
||||
},
|
||||
svg2jinja: {
|
||||
all: {
|
||||
src: {
|
||||
'warning': 'node_modules/ionicons/dist/svg/alert-outline.svg',
|
||||
'close': 'node_modules/ionicons/dist/svg/close-outline.svg',
|
||||
'chevron-up-outline': 'node_modules/ionicons/dist/svg/chevron-up-outline.svg',
|
||||
'chevron-right': 'node_modules/ionicons/dist/svg/chevron-forward-outline.svg',
|
||||
'chevron-left': 'node_modules/ionicons/dist/svg/chevron-back-outline.svg',
|
||||
'menu-outline': 'node_modules/ionicons/dist/svg/settings-outline.svg',
|
||||
'ellipsis-vertical-outline': 'node_modules/ionicons/dist/svg/ellipsis-vertical-outline.svg',
|
||||
'magnet-outline': 'node_modules/ionicons/dist/svg/magnet-outline.svg',
|
||||
'globe-outline': 'node_modules/ionicons/dist/svg/globe-outline.svg',
|
||||
'search-outline': 'node_modules/ionicons/dist/svg/search-outline.svg',
|
||||
'image-outline': 'node_modules/ionicons/dist/svg/image-outline.svg',
|
||||
'play-outline': 'node_modules/ionicons/dist/svg/play-outline.svg',
|
||||
'newspaper-outline': 'node_modules/ionicons/dist/svg/newspaper-outline.svg',
|
||||
'location-outline': 'node_modules/ionicons/dist/svg/location-outline.svg',
|
||||
'musical-notes-outline': 'node_modules/ionicons/dist/svg/musical-notes-outline.svg',
|
||||
'layers-outline': 'node_modules/ionicons/dist/svg/layers-outline.svg',
|
||||
'school-outline': 'node_modules/ionicons/dist/svg/school-outline.svg',
|
||||
'file-tray-full-outline': 'node_modules/ionicons/dist/svg/file-tray-full-outline.svg',
|
||||
'people-outline': 'node_modules/ionicons/dist/svg/people-outline.svg',
|
||||
'heart-outline': 'node_modules/ionicons/dist/svg/heart-outline.svg',
|
||||
'information-circle-outline': 'src/svg/information-circle-outline.svg',
|
||||
},
|
||||
dest: '../../../templates/simple/icons.html',
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
grunt.registerMultiTask('svg2jinja', 'Create Jinja2 macro', function () {
|
||||
const ejs = require('ejs'), svgo = require('svgo');
|
||||
const icons = {}
|
||||
for (const iconName in this.data.src) {
|
||||
const svgFileName = this.data.src[iconName];
|
||||
try {
|
||||
const svgContent = grunt.file.read(svgFileName, { encoding: 'utf8' })
|
||||
const svgoResult = svgo.optimize(svgContent, {
|
||||
path: svgFileName,
|
||||
multipass: true,
|
||||
plugins: [
|
||||
{
|
||||
name: "removeTitle",
|
||||
},
|
||||
{
|
||||
name: "removeXMLNS",
|
||||
},
|
||||
{
|
||||
name: "addAttributesToSVGElement",
|
||||
params: {
|
||||
attributes: [
|
||||
{ "class": "ionicon", "aria-hidden": "true" }
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
});
|
||||
icons[iconName] = svgoResult.data.replace("'", "\\'");
|
||||
} catch (err) {
|
||||
grunt.log.error(err);
|
||||
}
|
||||
}
|
||||
const template = `{# this file was generated by searx/static/themes/simple/gruntfile.js #}
|
||||
{%- set icons = {
|
||||
<% for (const iconName in icons) { %> '<%- iconName %>':'<%- icons[iconName] %>',
|
||||
<% } %>
|
||||
}
|
||||
-%}
|
||||
|
||||
{% macro icon(action, alt) -%}
|
||||
{{ icons[action] | replace("ionicon", "ion-icon") | safe }}
|
||||
{%- endmacro %}
|
||||
|
||||
{% macro icon_small(action) -%}
|
||||
{{ icons[action] | replace("ionicon", "ion-icon-small") | safe }}
|
||||
{%- endmacro %}
|
||||
|
||||
{% macro icon_big(action, alt) -%}
|
||||
{{ icons[action] | replace("ionicon", "ion-icon-big") | safe }}
|
||||
{%- endmacro %}
|
||||
`;
|
||||
const result = ejs.render(template, { icons });
|
||||
grunt.file.write(this.data.dest, result, { encoding: 'utf8' });
|
||||
grunt.log.ok(this.data.dest + " created");
|
||||
});
|
||||
|
||||
grunt.registerMultiTask('svg2png', 'Convert SVG to PNG', function () {
|
||||
const sharp = require('sharp'), done = this.async();
|
||||
eachAsync(this.files, async (file, _index, next) => {
|
||||
try {
|
||||
if (file.src.length != 1) {
|
||||
next("this task supports only one source per destination");
|
||||
}
|
||||
const info = await sharp(file.src[0])
|
||||
.png({
|
||||
force: true,
|
||||
compressionLevel: 9,
|
||||
palette: true,
|
||||
})
|
||||
.toFile(file.dest);
|
||||
grunt.log.ok(file.dest + ' created (' + info.size + ' bytes, ' + info.width + 'px * ' + info.height + 'px)');
|
||||
next();
|
||||
} catch (error) {
|
||||
grunt.fatal(error);
|
||||
next(error);
|
||||
}
|
||||
}, error => {
|
||||
if (error) {
|
||||
grunt.fatal(error);
|
||||
done(error);
|
||||
} else {
|
||||
done();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
grunt.loadNpmTasks('grunt-contrib-watch');
|
||||
grunt.loadNpmTasks('grunt-contrib-copy');
|
||||
grunt.loadNpmTasks('grunt-contrib-uglify');
|
||||
grunt.loadNpmTasks('grunt-image');
|
||||
grunt.loadNpmTasks('grunt-contrib-less');
|
||||
grunt.loadNpmTasks('grunt-contrib-cssmin');
|
||||
grunt.loadNpmTasks('grunt-stylelint');
|
||||
grunt.loadNpmTasks('grunt-eslint');
|
||||
|
||||
grunt.registerTask('test', ['eslint', 'stylelint']);
|
||||
|
||||
grunt.registerTask('default', [
|
||||
'eslint',
|
||||
'stylelint',
|
||||
'copy',
|
||||
'uglify',
|
||||
'less',
|
||||
'image',
|
||||
'svg2png',
|
||||
'svg2jinja',
|
||||
]);
|
||||
};
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"searxng.head.min.js","sources":["../../src/js/head/00_init.js"],"sourcesContent":["/* SPDX-License-Identifier: AGPL-3.0-or-later */\n(function (w, d) {\n 'use strict';\n\n // add data- properties\n var script = d.currentScript || (function () {\n var scripts = d.getElementsByTagName('script');\n return scripts[scripts.length - 1];\n })();\n\n w.searxng = {\n settings: JSON.parse(atob(script.getAttribute('client_settings')))\n };\n\n // update the css\n var htmlElement = d.getElementsByTagName(\"html\")[0];\n htmlElement.classList.remove('no-js');\n htmlElement.classList.add('js');\n\n})(window, document);\n"],"names":["w","d","script","scripts","htmlElement"],"mappings":"CACC,SAAUA,EAAGC,EAAG,CAIf,IAAIC,EAASD,EAAE,eAAmB,UAAY,CAC5C,IAAIE,EAAUF,EAAE,qBAAqB,QAAQ,EAC7C,OAAOE,EAAQA,EAAQ,OAAS,CAAC,CACrC,EAAM,EAEJH,EAAE,QAAU,CACV,SAAU,KAAK,MAAM,KAAKE,EAAO,aAAa,iBAAiB,CAAC,CAAC,CAClE,EAGD,IAAIE,EAAcH,EAAE,qBAAqB,MAAM,EAAE,CAAC,EAClDG,EAAY,UAAU,OAAO,OAAO,EACpCA,EAAY,UAAU,IAAI,IAAI,CAEhC,GAAG,OAAQ,QAAQ"}
|
||||
{"version":3,"file":"searxng.head.min.js","sources":["../../../../../client/simple/src/js/head/00_init.js"],"sourcesContent":["/* SPDX-License-Identifier: AGPL-3.0-or-later */\n(function (w, d) {\n 'use strict';\n\n // add data- properties\n var script = d.currentScript || (function () {\n var scripts = d.getElementsByTagName('script');\n return scripts[scripts.length - 1];\n })();\n\n w.searxng = {\n settings: JSON.parse(atob(script.getAttribute('client_settings')))\n };\n\n // update the css\n var htmlElement = d.getElementsByTagName(\"html\")[0];\n htmlElement.classList.remove('no-js');\n htmlElement.classList.add('js');\n\n})(window, document);\n"],"names":["w","d","script","scripts","htmlElement"],"mappings":"CACC,SAAUA,EAAGC,EAAG,CAIf,IAAIC,EAASD,EAAE,eAAmB,UAAY,CAC5C,IAAIE,EAAUF,EAAE,qBAAqB,QAAQ,EAC7C,OAAOE,EAAQA,EAAQ,OAAS,CAAC,CACrC,EAAM,EAEJH,EAAE,QAAU,CACV,SAAU,KAAK,MAAM,KAAKE,EAAO,aAAa,iBAAiB,CAAC,CAAC,CAClE,EAGD,IAAIE,EAAcH,EAAE,qBAAqB,MAAM,EAAE,CAAC,EAClDG,EAAY,UAAU,OAAO,OAAO,EACpCA,EAAY,UAAU,IAAI,IAAI,CAEhC,GAAG,OAAQ,QAAQ"}
|
File diff suppressed because one or more lines are too long
29
searx/static/themes/simple/manifest.json
Normal file
29
searx/static/themes/simple/manifest.json
Normal file
|
@ -0,0 +1,29 @@
|
|||
{
|
||||
"js/searxng.head.js": {
|
||||
"file": "js/searxng.head.min.js",
|
||||
"name": "js/searxng.head.min",
|
||||
"src": "js/searxng.head.js",
|
||||
"isEntry": true
|
||||
},
|
||||
"js/searxng.js": {
|
||||
"file": "js/searxng.min.js",
|
||||
"name": "js/searxng.min",
|
||||
"src": "js/searxng.js",
|
||||
"isEntry": true
|
||||
},
|
||||
"less/rss.less": {
|
||||
"file": "css/rss.min.css",
|
||||
"src": "less/rss.less",
|
||||
"isEntry": true
|
||||
},
|
||||
"less/style-ltr.less": {
|
||||
"file": "css/searxng.min.css",
|
||||
"src": "less/style-ltr.less",
|
||||
"isEntry": true
|
||||
},
|
||||
"less/style-rtl.less": {
|
||||
"file": "css/searxng-rtl.min.css",
|
||||
"src": "less/style-rtl.less",
|
||||
"isEntry": true
|
||||
}
|
||||
}
|
9775
searx/static/themes/simple/package-lock.json
generated
9775
searx/static/themes/simple/package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
@ -1,41 +0,0 @@
|
|||
{
|
||||
"devDependencies": {
|
||||
"ejs": "^3.1.10",
|
||||
"eslint": "^9.18.0",
|
||||
"grunt": "^1.6.1",
|
||||
"grunt-contrib-copy": "^1.0.0",
|
||||
"grunt-contrib-cssmin": "^5.0.0",
|
||||
"grunt-contrib-less": "^3.0.0",
|
||||
"grunt-contrib-uglify": "^5.2.2",
|
||||
"grunt-contrib-watch": "^1.1.0",
|
||||
"grunt-eslint": "^25.0.0",
|
||||
"grunt-image": "^6.4.0",
|
||||
"grunt-stylelint": "^0.20.1",
|
||||
"grunt-xmlmin": "^0.1.8",
|
||||
"ionicons": "^7.4.0",
|
||||
"less": "^4.2.2",
|
||||
"sharp": "^0.33.5",
|
||||
"stylelint": "^16.12.0",
|
||||
"stylelint-config-standard": "^37.0.0",
|
||||
"stylelint-config-standard-less": "^3.0.1",
|
||||
"svgo": "^3.3.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"autocomplete-js": "^2.7.1",
|
||||
"leaflet": "^1.9.4",
|
||||
"normalize.css": "^8.0.1",
|
||||
"swiped-events": "^1.2.0"
|
||||
},
|
||||
"scripts": {
|
||||
"all": "npm install && grunt",
|
||||
"build": "grunt",
|
||||
"clean": "rm -Rf node_modules",
|
||||
"eslint": "grunt eslint",
|
||||
"eslint-fix": "grunt eslint --fix",
|
||||
"fix": "grunt test --fix",
|
||||
"stylelint": "grunt stylelint",
|
||||
"stylelint-fix": "grunt stylelint --fix",
|
||||
"test": "grunt test",
|
||||
"watch": "grunt watch --fix"
|
||||
}
|
||||
}
|
|
@ -1,16 +0,0 @@
|
|||
/**
|
||||
* @license
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*
|
||||
* svgo config: Optimize SVG for WEB usage
|
||||
*/
|
||||
|
||||
module.exports = {
|
||||
plugins: [
|
||||
{
|
||||
name: 'preset-default',
|
||||
},
|
||||
// make diff friendly
|
||||
'sortAttrs',
|
||||
],
|
||||
};
|
|
@ -1,18 +0,0 @@
|
|||
/**
|
||||
* @license
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*
|
||||
* svgo config: Optimize SVG for WEB usage
|
||||
*/
|
||||
|
||||
module.exports = {
|
||||
plugins: [
|
||||
{
|
||||
name: 'preset-default',
|
||||
},
|
||||
// make diff friendly
|
||||
'sortAttrs',
|
||||
// Optimize SVG for WEB usage
|
||||
'convertStyleToAttrs',
|
||||
],
|
||||
};
|
Loading…
Reference in a new issue