summaryrefslogtreecommitdiff
path: root/searx/static/themes/simple/gruntfile.js
blob: f10d00cf35953b4be60b22972b2c50a1e5f96245 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
/*jshint esversion: 6 */

module.exports = function(grunt) {

  const path = require('path');

  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    watch: {
      scripts: {
        files: ['src/**'],
        tasks: ['eslint', 'copy', 'concat', 'uglify', 'htmlmin', 'less:development', 'less:production']
      }
    },
    eslint: {
      options: {
        configFile: '.eslintrc.json',
        failOnError: false
      },
      target: [
        'src/js/main/*.js',
        'src/js/head/*.js',
        '../__common__/js/*.js'
      ],
    },
    stylelint: {
      options: {
        formatter: 'unix',
      },
      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',
        ]
      },
    },
    concat: {
      head_and_body: {
        options: {
          separator: ';'
        },
        files: {
          'js/searxng.head.js': ['src/js/head/*.js'],
          'js/searxng.js': ['src/js/main/*.js', '../__common__/js/*.js', './node_modules/autocomplete-js/dist/autocomplete.js']
        }
      }
    },
    uglify: {
      options: {
        output: {
	        comments: 'some'
        },
        ie8: false,
        warnings: true,
        compress: false,
        mangle: true,
        sourceMap: true
      },
      dist: {
        files: {
          'js/searxng.head.min.js': ['js/searxng.head.js'],
          'js/searxng.min.js': ['js/searxng.js']
        }
      }
    },
    htmlmin: {
      dist: {
        options: {
          removeComments: true,
          collapseWhitespace: true
        },
        files: {
          '../../../templates/__common__/searxng-wordmark.min.svg': 'src/svg/searxng-wordmark.svg'
        }
      }
    },
    webfont: {
      icons: {
        // src: 'node_modules/ionicons-npm/src/*.svg',
        src: [
          'node_modules/ionicons-npm/src/navicon-round.svg',
          'node_modules/ionicons-npm/src/search.svg',
          'node_modules/ionicons-npm/src/play.svg',
          'node_modules/ionicons-npm/src/link.svg',
          'node_modules/ionicons-npm/src/chevron-up.svg',
          'node_modules/ionicons-npm/src/chevron-left.svg',
          'node_modules/ionicons-npm/src/chevron-right.svg',
          'node_modules/ionicons-npm/src/arrow-down-a.svg',
          'node_modules/ionicons-npm/src/arrow-up-a.svg',
          'node_modules/ionicons-npm/src/arrow-swap.svg',
          'node_modules/ionicons-npm/src/telephone.svg',
          'node_modules/ionicons-npm/src/android-arrow-dropdown.svg',
          'node_modules/ionicons-npm/src/android-globe.svg',
          'node_modules/ionicons-npm/src/android-time.svg',
          'node_modules/ionicons-npm/src/location.svg',
          'node_modules/ionicons-npm/src/alert-circled.svg',
          'node_modules/ionicons-npm/src/android-alert.svg',
          'node_modules/ionicons-npm/src/ios-film-outline.svg',
          'node_modules/ionicons-npm/src/music-note.svg',
          'node_modules/ionicons-npm/src/ion-close-round.svg',
          'node_modules/ionicons-npm/src/android-more-vertical.svg',
          'src/fonts/magnet.svg',
          'node_modules/ionicons-npm/src/android-close.svg',
        ],
        dest: 'fonts',
        destLess: 'src/generated',
        options: {
          font: 'ion',
          hashes : true,
          syntax: 'bem',
          styles : 'font,icon',
          types : 'eot,woff2,woff,ttf,svg',
          order : 'eot,woff2,woff,ttf,svg',
          stylesheets : ['css', 'less'],
          relativeFontPath : '../fonts/',
          autoHint : false,
          normalize : false,
          // ligatures : true,
          optimize : true,
          // fontHeight : 400,
          rename : function(name) {
            basename = path.basename(name);
            if (basename === 'android-alert.svg') {
              return 'error.svg';
            }
            if (basename === 'alert-circled.svg') {
              return 'warning.svg';
            }
            if (basename === 'ion-close-round.svg') {
              return 'close.svg';
            }
            return basename.replace(/(ios|md|android)-/i, '');
          },
          templateOptions: {
            baseClass: 'ion-icon',
            classPrefix: 'ion-'
          }
        }
      }
    },
    less: {
      development: {
        options: {
          paths: ["less"],
        },
        files: {
          "css/searxng.css": "src/less/style.less",
          "css/searxng-rtl.css": "src/less/style-rtl.less"
        }
      },
      production: {
        options: {
          paths: ["less"],
          plugins: [
            new (require('less-plugin-clean-css'))()
          ],
          sourceMap: true,
          sourceMapURL: (name) => { const s = name.split('/'); return s[s.length - 1] + '.map';},
          outputSourceFiles: false,
          sourceMapRootpath: '../',
        },
        files: {
          "css/searxng.min.css": "src/less/style.less",
          "css/searxng-rtl.min.css": "src/less/style-rtl.less"
        }
      },
    },
  });

  grunt.loadNpmTasks('grunt-contrib-watch');
  grunt.loadNpmTasks('grunt-contrib-copy');
  grunt.loadNpmTasks('grunt-contrib-uglify');
  grunt.loadNpmTasks('grunt-contrib-htmlmin');
  grunt.loadNpmTasks('grunt-contrib-jshint');
  grunt.loadNpmTasks('grunt-contrib-concat');
  grunt.loadNpmTasks('grunt-contrib-less');
  grunt.loadNpmTasks('grunt-contrib-cssmin');
  grunt.loadNpmTasks('grunt-webfont');
  grunt.loadNpmTasks('grunt-stylelint');
  grunt.loadNpmTasks('grunt-eslint');

  grunt.registerTask('test', ['jshint']);

  grunt.registerTask('default', [
    'eslint',
    'stylelint',
    'copy',
    'concat',
    'uglify',
    'htmlmin',
    'less:development',
    'less:production'
  ]);
};