/* * (c) Copyright Ascensio System SIA 2010-2024 * * This program is a free software product. You can redistribute it and/or * modify it under the terms of the GNU Affero General Public License (AGPL) * version 3 as published by the Free Software Foundation. In accordance with * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect * that Ascensio System SIA expressly excludes the warranty of non-infringement * of any third-party rights. * * This program is distributed WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html * * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish * street, Riga, Latvia, EU, LV-1050. * * The interactive user interfaces in modified source and object code versions * of the Program must display Appropriate Legal Notices, as required under * Section 5 of the GNU AGPL version 3. * * Pursuant to Section 7(b) of the License you must retain the original Product * logo when distributing the program. Pursuant to Section 7(e) we decline to * grant you any rights under trademark law for use of our trademarks. * * All the Product's GUI elements, including illustrations and icon sets, as * well as technical writing content are licensed under the terms of the * Creative Commons Attribution-ShareAlike 4.0 International. See the License * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode * */ module.exports = function (grunt, rootpathprefix) { const sprite_name = 'iconssmall'; const sprite_name_big = 'iconsbig'; const sprite_name_huge = 'iconshuge'; var self = this; const helpers = { parselang: (name, options) => { if (/\((\S+)\)$/.test(name)) { let _match = /(.+)\((\S+)\)$/.exec(name); return '[applang=' + _match[2] + '] ' + options.fn({name:_match[1]}); } return options.fn({name:name}); }, spritepostfix: () => `${opts.extpath ? opts.extpath : 'small'}-${scaling_table[opts.scale]}`, }; const _prefix = rootpathprefix || '../../'; const scaling_table = {'1x':'100','1.25x':'125','1.5x':'150','1.75x':'175','2x':'200'}; const configTemplate = opts => { let _editor_res_root = `${_prefix}apps/${opts.editor}/main/resources`, _common_res_root = `${_prefix}apps/common/main/resources`, _scaled_path = `${opts.scale}/${opts.extpath ? opts.extpath : '.'}`; const _mod_path = opts.mod2 ? 'v2/' : ''; let hbhelpers = {...helpers}; hbhelpers.spritepostfix = () => `${opts.extpath ? opts.extpath : 'small'}-${scaling_table[opts.scale]}`; hbhelpers.extracls = () => opts.mod2 ? '.theme-icons-cls-mod2 ' : ''; hbhelpers.iesupport = () => !opts.mod2; hbhelpers.xpsupport = () => !opts.mod2; return { src: [`${_editor_res_root}/img/toolbar/${_mod_path}${_scaled_path}/*.png`, `${_common_res_root}/img/toolbar/${_mod_path}${_scaled_path}/*.png`], dest: `${_editor_res_root}/img/${_mod_path}${opts.scale != '1x' ? opts.spritename + '@' + opts.scale : opts.spritename}.png`, destCss: `${_editor_res_root}/less/sprites/${opts.spritename}@${opts.scale}${opts.mod2?'.mod2':''}.less`, cssTemplate: `${_common_res_root}/img/toolbar/${_scaled_path}/.css.handlebars`, algorithm: 'top-down', cssHandlebarsHelpers: hbhelpers }; }; const configTemplateV2 = opts => { let _editor_res_root = `${_prefix}apps/${opts.editor}/main/resources`, _common_res_root = `${_prefix}apps/common/main/resources`, _scaled_path = `${opts.scale}/${opts.extpath ? opts.extpath : '.'}`; let hbhelpers = {...helpers}; hbhelpers.spritepostfix = () => `${opts.extpath ? opts.extpath : 'small'}-${scaling_table[opts.scale]}`; hbhelpers.extracls = () => '.theme-icons-cls-mod2 '; return { src: [`${_editor_res_root}/img/toolbar/v2/${_scaled_path}/*.png`, `${_common_res_root}/img/toolbar/v2/${_scaled_path}/*.png`], dest: `${_editor_res_root}/img/v2/${opts.scale != '1x' ? opts.spritename + '@' + opts.scale : opts.spritename}.png`, destCss: `${_editor_res_root}/less/sprites/${opts.spritename}@${opts.scale}.mod2.less`, cssTemplate: `${_common_res_root}/img/toolbar/${_scaled_path}/.css.handlebars`, algorithm: 'top-down', cssHandlebarsHelpers: hbhelpers }; }; const generate_sprite_tasks = function(editor, mod2=false) { const scalings = ['1x','1.25x','1.5x','1.75x','2x']; const alias = {"word": "documenteditor", "cell": "spreadsheeteditor", "slide": "presentationeditor", "pdf": "pdfeditor", "draw": "visioeditor"} const spritename = {'small': sprite_name, 'big': sprite_name_big, 'huge' : sprite_name_huge}; let out = {}; scalings.forEach((_scaling_) => { ['small', 'big', 'huge'].forEach((ext, i) => { out[`${editor}${mod2?'-mod2':''}${i?'-'+ext:''}-${_scaling_}`] = configTemplate({ editor:`${alias[editor]}`, spritename: spritename[ext], scale: `${_scaling_}`, extpath: i ? ext : '', mod2: mod2, }) }); }); return out } const generate_svg_sprite_tasks = function(editor, mod2=false) { const alias = {"word": "documenteditor", "cell": "spreadsheeteditor", "slide": "presentationeditor", "pdf": "pdfeditor", "draw": "visioeditor"}; const mod_path = mod2 ? 'v2' : '.'; const mod_task_name_ext = mod2 ? '-v2' : ''; let out = {}; ['small', 'big', 'huge'].forEach((ext, i) => { const ext_path = ext == 'small' ? '' : `${ext}/`; out[`${editor}${mod_task_name_ext}-${ext}2.5x`] = { src: [`${_prefix}apps/common/main/resources/img/toolbar/${mod_path}/2.5x/${ext_path}*.svg`, `${_prefix}apps/${alias[editor]}/main/resources/img/toolbar/${mod_path}/2.5x/${ext_path}*.svg`], dest: `${_prefix}apps/${alias[editor]}/main/resources/img/${mod_path}/`, options: { mode: { symbol: { inline: true, dest: './', sprite: `icons${ext}@2.5x.svg`, }, }, } }; }) return out; } grunt.initConfig({ sprite: { // 'word-1x': configTemplate({ // editor:'documenteditor', // spritename: sprite_name, // scale: '1x' // }), // 'word-big-1x': configTemplate({ // editor:'documenteditor', // spritename: sprite_name_big, // scale: '1x', // extpath: 'big' // }), // 'word-huge-1x': configTemplate({ // editor:'documenteditor', // spritename: sprite_name_huge, // scale: '1x', // extpath: 'huge' // }), ...generate_sprite_tasks('word'), ...generate_sprite_tasks('word', mod2=true), ...generate_sprite_tasks('slide'), ...generate_sprite_tasks('slide', mod2=true), ...generate_sprite_tasks('cell'), ...generate_sprite_tasks('cell', true), ...generate_sprite_tasks('pdf'), ...generate_sprite_tasks('pdf', true), ...generate_sprite_tasks('draw'), ...generate_sprite_tasks('draw', true), }, svg_sprite: { options: { svg: { rootAttributes: { //xmlns:'http://www.w3.org/2000/svg', }, namespaceClassnames: false, }, shape: { id: { separator: "" }, transform: [{ svgo: { plugins: [ 'removeXMLNS', { name: "removeAttrs", params: { attrs: "(fill|stroke)" } }, ] }, }] }, mode: { symbol: { }, }, }, ...generate_svg_sprite_tasks('word'), ...generate_svg_sprite_tasks('word', mod=true), ...generate_svg_sprite_tasks('slide'), ...generate_svg_sprite_tasks('slide', true), ...generate_svg_sprite_tasks('cell'), ...generate_svg_sprite_tasks('cell', true), ...generate_svg_sprite_tasks('pdf'), ...generate_svg_sprite_tasks('pdf', mod=true), ...generate_svg_sprite_tasks('draw'), ...generate_svg_sprite_tasks('draw', true), docformats: { src: [ `${_prefix}apps/common/main/resources/img/doc-formats/*.svg`, `!${_prefix}apps/common/main/resources/img/doc-formats/formats@2.5x.svg` ], dest: `${_prefix}apps/common/main/resources/img/doc-formats`, options: { svg: { rootAttributes: { xmlns:'http://www.w3.org/2000/svg', }, dimensionAttributes: false, }, mode: { symbol: { inline: false, dest: './', sprite: `formats@2.5x.svg`, }, }, shape: { id: { separator: "" }, transform: [{ svgo: { plugins: [ 'removeXMLNS', ] }, }] }, } }, }, }); // Load in `grunt-spritesmith` grunt.loadNpmTasks('grunt-spritesmith'); grunt.loadNpmTasks('grunt-svg-sprite'); grunt.registerTask('word-icons', ['sprite:word-1x', 'sprite:word-mod2-1x', 'sprite:word-big-1x', 'sprite:word-mod2-big-1x', 'sprite:word-huge-1x', 'sprite:word-mod2-huge-1x', 'sprite:word-2x', 'sprite:word-big-2x', 'sprite:word-huge-2x', 'sprite:word-mod2-2x', 'sprite:word-mod2-big-2x', 'sprite:word-mod2-huge-2x', 'sprite:word-1.25x', 'sprite:word-big-1.25x', 'sprite:word-huge-1.25x', 'sprite:word-mod2-1.25x', 'sprite:word-mod2-big-1.25x', 'sprite:word-mod2-huge-1.25x', 'sprite:word-1.5x', 'sprite:word-big-1.5x', 'sprite:word-huge-1.5x', 'sprite:word-mod2-1.5x', 'sprite:word-mod2-big-1.5x', 'sprite:word-mod2-huge-1.5x', 'sprite:word-1.75x', 'sprite:word-big-1.75x', 'sprite:word-huge-1.75x', 'sprite:word-mod2-1.75x', 'sprite:word-mod2-big-1.75x', 'sprite:word-mod2-huge-1.75x']); grunt.registerTask('slide-icons', ['sprite:slide-1x', 'sprite:slide-big-1x','sprite:slide-2x', 'sprite:slide-big-2x', 'sprite:slide-1.5x', 'sprite:slide-big-1.5x', 'sprite:slide-1.25x', 'sprite:slide-big-1.25x', 'sprite:slide-1.75x', 'sprite:slide-big-1.75x']); grunt.registerTask('cell-icons', ['sprite:cell-1x', 'sprite:cell-big-1x','sprite:cell-2x', 'sprite:cell-big-2x', 'sprite:cell-1.5x', 'sprite:cell-big-1.5x', 'sprite:cell-1.25x', 'sprite:cell-big-1.25x', 'sprite:cell-1.75x', 'sprite:cell-big-1.75x']); grunt.registerTask('pdf-icons', ['sprite:pdf-1x', 'sprite:pdf-big-1x', 'sprite:pdf-huge-1x', 'sprite:pdf-2x', 'sprite:pdf-big-2x', 'sprite:pdf-huge-2x', 'sprite:pdf-1.25x', 'sprite:pdf-big-1.25x', 'sprite:pdf-huge-1.25x', 'sprite:pdf-1.5x', 'sprite:pdf-big-1.5x', 'sprite:pdf-huge-1.5x', 'sprite:pdf-1.75x', 'sprite:pdf-big-1.75x', 'sprite:pdf-huge-1.75x']); grunt.registerTask('draw-icons', ['sprite:draw-1x', 'sprite:draw-big-1x', 'sprite:draw-2x', 'sprite:draw-big-2x', 'sprite:draw-1.25x', 'sprite:draw-big-1.25x', 'sprite:draw-1.5x', 'sprite:draw-big-1.5x', 'sprite:draw-1.75x', 'sprite:draw-big-1.75x']); grunt.registerTask('png_sprite', ['sprite']); grunt.registerTask('all-icons-sprite', ['png_sprite','svg_sprite']); grunt.registerTask('default', ['all-icons-sprite']); };