mirror of
				https://github.com/searxng/searxng.git
				synced 2025-11-03 19:17:07 -05:00 
			
		
		
		
	Merge pull request #538 from return42/eslint
SearXNG JavaScript Style Guide
This commit is contained in:
		
						commit
						4f22615259
					
				@ -91,7 +91,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 (json-mode
 | 
					 (json-mode
 | 
				
			||||||
  . ((eval . (progn
 | 
					  . ((eval . (progn
 | 
				
			||||||
               (setq-local js-indent-level 2)
 | 
					               (setq-local js-indent-level 4)
 | 
				
			||||||
               (flycheck-checker . json-python-json)))))
 | 
					               (flycheck-checker . json-python-json)))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 (js-mode
 | 
					 (js-mode
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							@ -89,7 +89,7 @@ MANAGE += py.build py.clean
 | 
				
			|||||||
MANAGE += pyenv pyenv.install pyenv.uninstall
 | 
					MANAGE += pyenv pyenv.install pyenv.uninstall
 | 
				
			||||||
MANAGE += pypi.upload pypi.upload.test
 | 
					MANAGE += pypi.upload pypi.upload.test
 | 
				
			||||||
MANAGE += test.yamllint test.pylint test.pep8 test.unit test.coverage test.robot test.clean
 | 
					MANAGE += test.yamllint test.pylint test.pep8 test.unit test.coverage test.robot test.clean
 | 
				
			||||||
MANAGE += themes.all themes.oscar themes.simple pygments.less
 | 
					MANAGE += themes.all themes.oscar themes.simple themes.simple.test pygments.less
 | 
				
			||||||
MANAGE += static.build.commit static.build.drop static.build.restore
 | 
					MANAGE += static.build.commit static.build.drop static.build.restore
 | 
				
			||||||
MANAGE += nvm.install nvm.clean nvm.status nvm.nodejs
 | 
					MANAGE += nvm.install nvm.clean nvm.status nvm.nodejs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										11
									
								
								manage
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								manage
									
									
									
									
									
								
							@ -714,6 +714,17 @@ themes.simple() {
 | 
				
			|||||||
    dump_return $?
 | 
					    dump_return $?
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					themes.simple.test() {
 | 
				
			||||||
 | 
					    build_msg TEST "theme: simple"
 | 
				
			||||||
 | 
					    if ! nvm.min_node "${NODE_MINIMUM_VERSION}"; then
 | 
				
			||||||
 | 
					        info_msg "install Node.js by NVM"
 | 
				
			||||||
 | 
					        nvm.nodejs
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    npm --prefix searx/static/themes/simple install
 | 
				
			||||||
 | 
					    npm --prefix searx/static/themes/simple run test
 | 
				
			||||||
 | 
					    dump_return $?
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PYLINT_FILES=()
 | 
					PYLINT_FILES=()
 | 
				
			||||||
while IFS= read -r line; do
 | 
					while IFS= read -r line; do
 | 
				
			||||||
   PYLINT_FILES+=("$line")
 | 
					   PYLINT_FILES+=("$line")
 | 
				
			||||||
 | 
				
			|||||||
@ -22,7 +22,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(function (w, d) {
 | 
					(function (w, d) {
 | 
				
			||||||
  function ImageLayout(container_selector, results_selector, img_selector, verticalMargin, horizontalMargin, maxHeight) {
 | 
					  function ImageLayout (container_selector, results_selector, img_selector, verticalMargin, horizontalMargin, maxHeight) {
 | 
				
			||||||
    this.container_selector = container_selector;
 | 
					    this.container_selector = container_selector;
 | 
				
			||||||
    this.results_selector = results_selector;
 | 
					    this.results_selector = results_selector;
 | 
				
			||||||
    this.img_selector = img_selector;
 | 
					    this.img_selector = img_selector;
 | 
				
			||||||
@ -57,7 +57,7 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return (width - images.length * this.verticalMargin) / r; //have to round down because Firefox will automatically roundup value with number of decimals > 3
 | 
					    return (width - images.length * this.verticalMargin) / r; // have to round down because Firefox will automatically roundup value with number of decimals > 3
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ImageLayout.prototype._setSize = function (images, height) {
 | 
					  ImageLayout.prototype._setSize = function (images, height) {
 | 
				
			||||||
@ -147,12 +147,12 @@
 | 
				
			|||||||
    var results_nodes = d.querySelectorAll(this.results_selector);
 | 
					    var results_nodes = d.querySelectorAll(this.results_selector);
 | 
				
			||||||
    var results_length = results_nodes.length;
 | 
					    var results_length = results_nodes.length;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function img_load_error(event) {
 | 
					    function img_load_error (event) {
 | 
				
			||||||
      // console.log("ERROR can't load: " + event.originalTarget.src);
 | 
					      // console.log("ERROR can't load: " + event.originalTarget.src);
 | 
				
			||||||
      event.originalTarget.src = w.searxng.static_path + w.searxng.theme.img_load_error;
 | 
					      event.originalTarget.src = w.searxng.static_path + w.searxng.theme.img_load_error;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function throttleAlign() {
 | 
					    function throttleAlign () {
 | 
				
			||||||
      if (obj.isAlignDone) {
 | 
					      if (obj.isAlignDone) {
 | 
				
			||||||
        obj.isAlignDone = false;
 | 
					        obj.isAlignDone = false;
 | 
				
			||||||
        setTimeout(function () {
 | 
					        setTimeout(function () {
 | 
				
			||||||
 | 
				
			|||||||
@ -9,5 +9,21 @@
 | 
				
			|||||||
        "ecmaVersion": 12
 | 
					        "ecmaVersion": 12
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "rules": {
 | 
					    "rules": {
 | 
				
			||||||
 | 
					        "indent": ["error", 2],
 | 
				
			||||||
 | 
					        "keyword-spacing": ["error", { "before": true, "after": true }],
 | 
				
			||||||
 | 
					        "no-trailing-spaces": 2,
 | 
				
			||||||
 | 
					        "space-before-function-paren": ["error", "always"],
 | 
				
			||||||
 | 
					        "space-infix-ops": "error",
 | 
				
			||||||
 | 
					        "comma-spacing": ["error", { "before": false, "after": true }],
 | 
				
			||||||
 | 
					        "brace-style": ["error", "1tbs", { "allowSingleLine": true }],
 | 
				
			||||||
 | 
					        "curly": ["error", "multi-line"],
 | 
				
			||||||
 | 
					        "block-spacing": ["error", "always"],
 | 
				
			||||||
 | 
					        "comma-spacing": ["error", { "before": false, "after": true }],
 | 
				
			||||||
 | 
					        "dot-location": ["error", "property"],
 | 
				
			||||||
 | 
					        "key-spacing": ["error", { "beforeColon": false, "afterColon": true }],
 | 
				
			||||||
 | 
					        "spaced-comment": ["error", "always", {
 | 
				
			||||||
 | 
					            "line": { "markers": ["*package", "!", "/", ",", "="] },
 | 
				
			||||||
 | 
					            "block": { "balanced": true, "markers": ["*package", "!", ",", ":", "::", "flow-include"], "exceptions": ["*"] }
 | 
				
			||||||
 | 
					        }]
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
/*jshint esversion: 6 */
 | 
					/* SPDX-License-Identifier: AGPL-3.0-or-later */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module.exports = function(grunt) {
 | 
					module.exports = function (grunt) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const eachAsync = require('each-async');
 | 
					  const eachAsync = require('each-async');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -27,9 +27,11 @@ module.exports = function(grunt) {
 | 
				
			|||||||
    eslint: {
 | 
					    eslint: {
 | 
				
			||||||
      options: {
 | 
					      options: {
 | 
				
			||||||
        overrideConfigFile: '.eslintrc.json',
 | 
					        overrideConfigFile: '.eslintrc.json',
 | 
				
			||||||
        failOnError: false
 | 
					        failOnError: true,
 | 
				
			||||||
 | 
					        fix: grunt.option('fix')
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      target: [
 | 
					      target: [
 | 
				
			||||||
 | 
					        'gruntfile.js',
 | 
				
			||||||
        'svg4web.svgo.js',
 | 
					        'svg4web.svgo.js',
 | 
				
			||||||
        'src/js/main/*.js',
 | 
					        'src/js/main/*.js',
 | 
				
			||||||
        'src/js/head/*.js',
 | 
					        'src/js/head/*.js',
 | 
				
			||||||
@ -111,7 +113,7 @@ module.exports = function(grunt) {
 | 
				
			|||||||
            new (require('less-plugin-clean-css'))()
 | 
					            new (require('less-plugin-clean-css'))()
 | 
				
			||||||
          ],
 | 
					          ],
 | 
				
			||||||
          sourceMap: true,
 | 
					          sourceMap: true,
 | 
				
			||||||
          sourceMapURL: (name) => { const s = name.split('/'); return s[s.length - 1] + '.map';},
 | 
					          sourceMapURL: (name) => { const s = name.split('/'); return s[s.length - 1] + '.map'; },
 | 
				
			||||||
          outputSourceFiles: true,
 | 
					          outputSourceFiles: true,
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        files: {
 | 
					        files: {
 | 
				
			||||||
@ -176,37 +178,37 @@ module.exports = function(grunt) {
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  grunt.registerMultiTask('svg2jinja', 'Create Jinja2 macro', function() {
 | 
					  grunt.registerMultiTask('svg2jinja', 'Create Jinja2 macro', function () {
 | 
				
			||||||
    const ejs = require('ejs'), svgo = require('svgo');
 | 
					    const ejs = require('ejs'), svgo = require('svgo');
 | 
				
			||||||
    const icons = {}
 | 
					    const icons = {}
 | 
				
			||||||
    for(const iconName in this.data.src) {
 | 
					    for (const iconName in this.data.src) {
 | 
				
			||||||
        const svgFileName = this.data.src[iconName];
 | 
					      const svgFileName = this.data.src[iconName];
 | 
				
			||||||
        try {
 | 
					      try {
 | 
				
			||||||
            const svgContent = grunt.file.read(svgFileName, { encoding: 'utf8' })
 | 
					        const svgContent = grunt.file.read(svgFileName, { encoding: 'utf8' })
 | 
				
			||||||
            const svgoResult = svgo.optimize(svgContent, {
 | 
					        const svgoResult = svgo.optimize(svgContent, {
 | 
				
			||||||
              path: svgFileName,
 | 
					          path: svgFileName,
 | 
				
			||||||
              multipass: true,
 | 
					          multipass: true,
 | 
				
			||||||
              plugins: [
 | 
					          plugins: [
 | 
				
			||||||
                {
 | 
					            {
 | 
				
			||||||
                  name: "removeTitle",
 | 
					              name: "removeTitle",
 | 
				
			||||||
                },
 | 
					            },
 | 
				
			||||||
                {
 | 
					            {
 | 
				
			||||||
                  name: "removeXMLNS",
 | 
					              name: "removeXMLNS",
 | 
				
			||||||
                },
 | 
					            },
 | 
				
			||||||
                {
 | 
					            {
 | 
				
			||||||
                  name: "addAttributesToSVGElement",
 | 
					              name: "addAttributesToSVGElement",
 | 
				
			||||||
                  params: {
 | 
					              params: {
 | 
				
			||||||
                    attributes: [
 | 
					                attributes: [
 | 
				
			||||||
                      { "aria-hidden": "true" }
 | 
					                  { "aria-hidden": "true" }
 | 
				
			||||||
                    ]
 | 
					                ]
 | 
				
			||||||
                  }
 | 
					              }
 | 
				
			||||||
                }
 | 
					            }
 | 
				
			||||||
              ]
 | 
					          ]
 | 
				
			||||||
            });
 | 
					        });
 | 
				
			||||||
            icons[iconName] = svgoResult.data.replace("'", "\\'");
 | 
					        icons[iconName] = svgoResult.data.replace("'", "\\'");
 | 
				
			||||||
        } catch (err) {
 | 
					      } catch (err) {
 | 
				
			||||||
          grunt.log.error(err);
 | 
					        grunt.log.error(err);
 | 
				
			||||||
        }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    const template = `{# this file was generated by searx/static/themes/simple/gruntfile.js #}
 | 
					    const template = `{# this file was generated by searx/static/themes/simple/gruntfile.js #}
 | 
				
			||||||
{%- set icons = {
 | 
					{%- set icons = {
 | 
				
			||||||
@ -266,13 +268,12 @@ module.exports = function(grunt) {
 | 
				
			|||||||
  grunt.loadNpmTasks('grunt-contrib-copy');
 | 
					  grunt.loadNpmTasks('grunt-contrib-copy');
 | 
				
			||||||
  grunt.loadNpmTasks('grunt-contrib-uglify');
 | 
					  grunt.loadNpmTasks('grunt-contrib-uglify');
 | 
				
			||||||
  grunt.loadNpmTasks('grunt-image');
 | 
					  grunt.loadNpmTasks('grunt-image');
 | 
				
			||||||
  grunt.loadNpmTasks('grunt-contrib-jshint');
 | 
					 | 
				
			||||||
  grunt.loadNpmTasks('grunt-contrib-less');
 | 
					  grunt.loadNpmTasks('grunt-contrib-less');
 | 
				
			||||||
  grunt.loadNpmTasks('grunt-contrib-cssmin');
 | 
					  grunt.loadNpmTasks('grunt-contrib-cssmin');
 | 
				
			||||||
  grunt.loadNpmTasks('grunt-stylelint');
 | 
					  grunt.loadNpmTasks('grunt-stylelint');
 | 
				
			||||||
  grunt.loadNpmTasks('grunt-eslint');
 | 
					  grunt.loadNpmTasks('grunt-eslint');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  grunt.registerTask('test', ['jshint']);
 | 
					  grunt.registerTask('test', ['eslint']);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  grunt.registerTask('default', [
 | 
					  grunt.registerTask('default', [
 | 
				
			||||||
    'eslint',
 | 
					    'eslint',
 | 
				
			||||||
 | 
				
			|||||||
@ -4,7 +4,6 @@
 | 
				
			|||||||
    "grunt": "~1.4.1",
 | 
					    "grunt": "~1.4.1",
 | 
				
			||||||
    "grunt-contrib-copy": "^1.0.0",
 | 
					    "grunt-contrib-copy": "^1.0.0",
 | 
				
			||||||
    "grunt-contrib-cssmin": "^4.0.0",
 | 
					    "grunt-contrib-cssmin": "^4.0.0",
 | 
				
			||||||
    "grunt-contrib-jshint": "~3.1.1",
 | 
					 | 
				
			||||||
    "grunt-contrib-less": "~3.0.0",
 | 
					    "grunt-contrib-less": "~3.0.0",
 | 
				
			||||||
    "grunt-contrib-uglify": "~5.0.1",
 | 
					    "grunt-contrib-uglify": "~5.0.1",
 | 
				
			||||||
    "grunt-xmlmin": "~0.1.8",
 | 
					    "grunt-xmlmin": "~0.1.8",
 | 
				
			||||||
@ -29,7 +28,9 @@
 | 
				
			|||||||
  "scripts": {
 | 
					  "scripts": {
 | 
				
			||||||
    "all": "npm install && grunt",
 | 
					    "all": "npm install && grunt",
 | 
				
			||||||
    "build": "grunt",
 | 
					    "build": "grunt",
 | 
				
			||||||
 | 
					    "test": "grunt test",
 | 
				
			||||||
    "eslint": "grunt eslint",
 | 
					    "eslint": "grunt eslint",
 | 
				
			||||||
 | 
					    "eslint-fix": "grunt eslint --fix",
 | 
				
			||||||
    "watch": "grunt watch",
 | 
					    "watch": "grunt watch",
 | 
				
			||||||
    "webfont": "grunt webfont",
 | 
					    "webfont": "grunt webfont",
 | 
				
			||||||
    "clean": "rm -Rf node_modules package-lock.json ion.less",
 | 
					    "clean": "rm -Rf node_modules package-lock.json ion.less",
 | 
				
			||||||
 | 
				
			|||||||
@ -5,36 +5,36 @@
 | 
				
			|||||||
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
					 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
/* global DocumentTouch:readonly */
 | 
					/* global DocumentTouch:readonly */
 | 
				
			||||||
(function(w, d) {
 | 
					(function (w, d) {
 | 
				
			||||||
    'use strict';
 | 
					  'use strict';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // add data- properties
 | 
					  // add data- properties
 | 
				
			||||||
    var script = d.currentScript  || (function() {
 | 
					  var script = d.currentScript  || (function () {
 | 
				
			||||||
        var scripts = d.getElementsByTagName('script');
 | 
					    var scripts = d.getElementsByTagName('script');
 | 
				
			||||||
        return scripts[scripts.length - 1];
 | 
					    return scripts[scripts.length - 1];
 | 
				
			||||||
    })();
 | 
					  })();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // try to detect touch screen
 | 
					  // try to detect touch screen
 | 
				
			||||||
    w.searxng = {
 | 
					  w.searxng = {
 | 
				
			||||||
        touch: (("ontouchstart" in w) || w.DocumentTouch && document instanceof DocumentTouch) || false,
 | 
					    touch: (("ontouchstart" in w) || w.DocumentTouch && document instanceof DocumentTouch) || false,
 | 
				
			||||||
        method: script.getAttribute('data-method'),
 | 
					    method: script.getAttribute('data-method'),
 | 
				
			||||||
        autocompleter: script.getAttribute('data-autocompleter') === 'true',
 | 
					    autocompleter: script.getAttribute('data-autocompleter') === 'true',
 | 
				
			||||||
        search_on_category_select: script.getAttribute('data-search-on-category-select') === 'true',
 | 
					    search_on_category_select: script.getAttribute('data-search-on-category-select') === 'true',
 | 
				
			||||||
        infinite_scroll: script.getAttribute('data-infinite-scroll') === 'true',
 | 
					    infinite_scroll: script.getAttribute('data-infinite-scroll') === 'true',
 | 
				
			||||||
        hotkeys: script.getAttribute('data-hotkeys') === 'true',
 | 
					    hotkeys: script.getAttribute('data-hotkeys') === 'true',
 | 
				
			||||||
        static_path: script.getAttribute('data-static-path'),
 | 
					    static_path: script.getAttribute('data-static-path'),
 | 
				
			||||||
        translations: JSON.parse(script.getAttribute('data-translations')),
 | 
					    translations: JSON.parse(script.getAttribute('data-translations')),
 | 
				
			||||||
        theme : {
 | 
					    theme: {
 | 
				
			||||||
            // image that is displayed if load of <img src='...'> failed
 | 
					      // image that is displayed if load of <img src='...'> failed
 | 
				
			||||||
            img_load_error: 'img/img_load_error.svg'
 | 
					      img_load_error: 'img/img_load_error.svg'
 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // update the css
 | 
					 | 
				
			||||||
    var hmtlElement = d.getElementsByTagName("html")[0];
 | 
					 | 
				
			||||||
    hmtlElement.classList.remove('no-js');
 | 
					 | 
				
			||||||
    hmtlElement.classList.add('js');
 | 
					 | 
				
			||||||
    if (w.searxng.touch) {
 | 
					 | 
				
			||||||
        hmtlElement.classList.add('touch');
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // update the css
 | 
				
			||||||
 | 
					  var hmtlElement = d.getElementsByTagName("html")[0];
 | 
				
			||||||
 | 
					  hmtlElement.classList.remove('no-js');
 | 
				
			||||||
 | 
					  hmtlElement.classList.add('js');
 | 
				
			||||||
 | 
					  if (w.searxng.touch) {
 | 
				
			||||||
 | 
					    hmtlElement.classList.add('touch');
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
})(window, document);
 | 
					})(window, document);
 | 
				
			||||||
@ -4,7 +4,7 @@
 | 
				
			|||||||
 * (C) Copyright Contributors to the searx project (2014 - 2021).
 | 
					 * (C) Copyright Contributors to the searx project (2014 - 2021).
 | 
				
			||||||
 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
					 * SPDX-License-Identifier: AGPL-3.0-or-later
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
window.searxng = (function(w, d) {
 | 
					window.searxng = (function (w, d) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  'use strict';
 | 
					  'use strict';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -13,12 +13,12 @@ window.searxng = (function(w, d) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  // from https://plainjs.com/javascript/events/live-binding-event-handlers-14/
 | 
					  // from https://plainjs.com/javascript/events/live-binding-event-handlers-14/
 | 
				
			||||||
  if (w.Element) {
 | 
					  if (w.Element) {
 | 
				
			||||||
    (function(ElementPrototype) {
 | 
					    (function (ElementPrototype) {
 | 
				
			||||||
      ElementPrototype.matches = ElementPrototype.matches ||
 | 
					      ElementPrototype.matches = ElementPrototype.matches ||
 | 
				
			||||||
      ElementPrototype.matchesSelector ||
 | 
					      ElementPrototype.matchesSelector ||
 | 
				
			||||||
      ElementPrototype.webkitMatchesSelector ||
 | 
					      ElementPrototype.webkitMatchesSelector ||
 | 
				
			||||||
      ElementPrototype.msMatchesSelector ||
 | 
					      ElementPrototype.msMatchesSelector ||
 | 
				
			||||||
      function(selector) {
 | 
					      function (selector) {
 | 
				
			||||||
        var node = this, nodes = (node.parentNode || node.document).querySelectorAll(selector), i = -1;
 | 
					        var node = this, nodes = (node.parentNode || node.document).querySelectorAll(selector), i = -1;
 | 
				
			||||||
        while (nodes[++i] && nodes[i] != node);
 | 
					        while (nodes[++i] && nodes[i] != node);
 | 
				
			||||||
        return !!nodes[i];
 | 
					        return !!nodes[i];
 | 
				
			||||||
@ -26,7 +26,7 @@ window.searxng = (function(w, d) {
 | 
				
			|||||||
    })(Element.prototype);
 | 
					    })(Element.prototype);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  function callbackSafe(callback, el, e) {
 | 
					  function callbackSafe (callback, el, e) {
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
      callback.call(el, e);
 | 
					      callback.call(el, e);
 | 
				
			||||||
    } catch (exception) {
 | 
					    } catch (exception) {
 | 
				
			||||||
@ -36,14 +36,14 @@ window.searxng = (function(w, d) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  var searxng = window.searxng || {};
 | 
					  var searxng = window.searxng || {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  searxng.on = function(obj, eventType, callback, useCapture) {
 | 
					  searxng.on = function (obj, eventType, callback, useCapture) {
 | 
				
			||||||
    useCapture = useCapture || false;
 | 
					    useCapture = useCapture || false;
 | 
				
			||||||
    if (typeof obj !== 'string') {
 | 
					    if (typeof obj !== 'string') {
 | 
				
			||||||
      // obj HTMLElement, HTMLDocument
 | 
					      // obj HTMLElement, HTMLDocument
 | 
				
			||||||
      obj.addEventListener(eventType, callback, useCapture);
 | 
					      obj.addEventListener(eventType, callback, useCapture);
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      // obj is a selector
 | 
					      // obj is a selector
 | 
				
			||||||
      d.addEventListener(eventType, function(e) {
 | 
					      d.addEventListener(eventType, function (e) {
 | 
				
			||||||
        var el = e.target || e.srcElement, found = false;
 | 
					        var el = e.target || e.srcElement, found = false;
 | 
				
			||||||
        while (el && el.matches && el !== d && !(found = el.matches(obj))) el = el.parentElement;
 | 
					        while (el && el.matches && el !== d && !(found = el.matches(obj))) el = el.parentElement;
 | 
				
			||||||
        if (found) callbackSafe(callback, el, e);
 | 
					        if (found) callbackSafe(callback, el, e);
 | 
				
			||||||
@ -51,7 +51,7 @@ window.searxng = (function(w, d) {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  searxng.ready = function(callback) {
 | 
					  searxng.ready = function (callback) {
 | 
				
			||||||
    if (document.readyState != 'loading') {
 | 
					    if (document.readyState != 'loading') {
 | 
				
			||||||
      callback.call(w);
 | 
					      callback.call(w);
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
@ -59,20 +59,20 @@ window.searxng = (function(w, d) {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  searxng.http = function(method, url) {
 | 
					  searxng.http = function (method, url) {
 | 
				
			||||||
    var req = new XMLHttpRequest(),
 | 
					    var req = new XMLHttpRequest(),
 | 
				
			||||||
    resolve = function() {},
 | 
					      resolve = function () {},
 | 
				
			||||||
    reject = function() {},
 | 
					      reject = function () {},
 | 
				
			||||||
    promise = {
 | 
					      promise = {
 | 
				
			||||||
      then: function(callback) { resolve = callback; return promise; },
 | 
					        then: function (callback) { resolve = callback; return promise; },
 | 
				
			||||||
      catch: function(callback) { reject = callback; return promise; }
 | 
					        catch: function (callback) { reject = callback; return promise; }
 | 
				
			||||||
    };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
      req.open(method, url, true);
 | 
					      req.open(method, url, true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      // On load
 | 
					      // On load
 | 
				
			||||||
      req.onload = function() {
 | 
					      req.onload = function () {
 | 
				
			||||||
        if (req.status == 200) {
 | 
					        if (req.status == 200) {
 | 
				
			||||||
          resolve(req.response, req.responseType);
 | 
					          resolve(req.response, req.responseType);
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
@ -81,11 +81,11 @@ window.searxng = (function(w, d) {
 | 
				
			|||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      // Handle network errors
 | 
					      // Handle network errors
 | 
				
			||||||
      req.onerror = function() {
 | 
					      req.onerror = function () {
 | 
				
			||||||
        reject(Error("Network Error"));
 | 
					        reject(Error("Network Error"));
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      req.onabort = function() {
 | 
					      req.onabort = function () {
 | 
				
			||||||
        reject(Error("Transaction is aborted"));
 | 
					        reject(Error("Transaction is aborted"));
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -98,10 +98,10 @@ window.searxng = (function(w, d) {
 | 
				
			|||||||
    return promise;
 | 
					    return promise;
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  searxng.loadStyle = function(src) {
 | 
					  searxng.loadStyle = function (src) {
 | 
				
			||||||
    var path = searxng.static_path + src,
 | 
					    var path = searxng.static_path + src,
 | 
				
			||||||
    id = "style_" + src.replace('.', '_'),
 | 
					      id = "style_" + src.replace('.', '_'),
 | 
				
			||||||
    s = d.getElementById(id);
 | 
					      s = d.getElementById(id);
 | 
				
			||||||
    if (s === null) {
 | 
					    if (s === null) {
 | 
				
			||||||
      s = d.createElement('link');
 | 
					      s = d.createElement('link');
 | 
				
			||||||
      s.setAttribute('id', id);
 | 
					      s.setAttribute('id', id);
 | 
				
			||||||
@ -112,16 +112,16 @@ window.searxng = (function(w, d) {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  searxng.loadScript = function(src, callback) {
 | 
					  searxng.loadScript = function (src, callback) {
 | 
				
			||||||
    var path = searxng.static_path + src,
 | 
					    var path = searxng.static_path + src,
 | 
				
			||||||
    id = "script_" + src.replace('.', '_'),
 | 
					      id = "script_" + src.replace('.', '_'),
 | 
				
			||||||
    s = d.getElementById(id);
 | 
					      s = d.getElementById(id);
 | 
				
			||||||
    if (s === null) {
 | 
					    if (s === null) {
 | 
				
			||||||
      s = d.createElement('script');
 | 
					      s = d.createElement('script');
 | 
				
			||||||
      s.setAttribute('id', id);
 | 
					      s.setAttribute('id', id);
 | 
				
			||||||
      s.setAttribute('src', path);
 | 
					      s.setAttribute('src', path);
 | 
				
			||||||
      s.onload = callback;
 | 
					      s.onload = callback;
 | 
				
			||||||
      s.onerror = function() {
 | 
					      s.onerror = function () {
 | 
				
			||||||
        s.setAttribute('error', '1');
 | 
					        s.setAttribute('error', '1');
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
      d.body.appendChild(s);
 | 
					      d.body.appendChild(s);
 | 
				
			||||||
@ -140,11 +140,11 @@ window.searxng = (function(w, d) {
 | 
				
			|||||||
    referenceNode.parentNode.insertBefore(newNode, referenceNode);
 | 
					    referenceNode.parentNode.insertBefore(newNode, referenceNode);
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  searxng.insertAfter = function(newNode, referenceNode) {
 | 
					  searxng.insertAfter = function (newNode, referenceNode) {
 | 
				
			||||||
    referenceNode.parentNode.insertAfter(newNode, referenceNode.nextSibling);
 | 
					    referenceNode.parentNode.insertAfter(newNode, referenceNode.nextSibling);
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  searxng.on('.close', 'click', function() {
 | 
					  searxng.on('.close', 'click', function () {
 | 
				
			||||||
    this.parentNode.classList.add('invisible');
 | 
					    this.parentNode.classList.add('invisible');
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,9 +1,9 @@
 | 
				
			|||||||
/* SPDX-License-Identifier: AGPL-3.0-or-later */
 | 
					/* SPDX-License-Identifier: AGPL-3.0-or-later */
 | 
				
			||||||
/*global searxng*/
 | 
					/* global searxng */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
searxng.ready(function() {
 | 
					searxng.ready(function () {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  function isElementInDetail(el) {
 | 
					  function isElementInDetail (el) {
 | 
				
			||||||
    while (el !== undefined) {
 | 
					    while (el !== undefined) {
 | 
				
			||||||
      if (el.classList.contains('detail')) {
 | 
					      if (el.classList.contains('detail')) {
 | 
				
			||||||
        return true;
 | 
					        return true;
 | 
				
			||||||
@ -18,7 +18,7 @@ searxng.ready(function() {
 | 
				
			|||||||
    return false;
 | 
					    return false;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  function getResultElement(el) {
 | 
					  function getResultElement (el) {
 | 
				
			||||||
    while (el !== undefined) {
 | 
					    while (el !== undefined) {
 | 
				
			||||||
      if (el.classList.contains('result')) {
 | 
					      if (el.classList.contains('result')) {
 | 
				
			||||||
        return el;
 | 
					        return el;
 | 
				
			||||||
@ -28,11 +28,11 @@ searxng.ready(function() {
 | 
				
			|||||||
    return undefined;
 | 
					    return undefined;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  function isImageResult(resultElement) {
 | 
					  function isImageResult (resultElement) {
 | 
				
			||||||
    return resultElement && resultElement.classList.contains('result-images');
 | 
					    return resultElement && resultElement.classList.contains('result-images');
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  searxng.on('.result', 'click', function(e) {
 | 
					  searxng.on('.result', 'click', function (e) {
 | 
				
			||||||
    if (!isElementInDetail(e.target)) {
 | 
					    if (!isElementInDetail(e.target)) {
 | 
				
			||||||
      highlightResult(this)(true);
 | 
					      highlightResult(this)(true);
 | 
				
			||||||
      let resultElement = getResultElement(e.target);
 | 
					      let resultElement = getResultElement(e.target);
 | 
				
			||||||
@ -43,7 +43,7 @@ searxng.ready(function() {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  searxng.on('.result a', 'focus', function(e) {
 | 
					  searxng.on('.result a', 'focus', function (e) {
 | 
				
			||||||
    if (!isElementInDetail(e.target)) {
 | 
					    if (!isElementInDetail(e.target)) {
 | 
				
			||||||
      let resultElement = getResultElement(e.target);
 | 
					      let resultElement = getResultElement(e.target);
 | 
				
			||||||
      if (resultElement && resultElement.getAttribute("data-vim-selected") === null) {
 | 
					      if (resultElement && resultElement.getAttribute("data-vim-selected") === null) {
 | 
				
			||||||
@ -155,7 +155,7 @@ searxng.ready(function() {
 | 
				
			|||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (searxng.hotkeys) {
 | 
					  if (searxng.hotkeys) {
 | 
				
			||||||
    searxng.on(document, "keydown", function(e) {
 | 
					    searxng.on(document, "keydown", function (e) {
 | 
				
			||||||
      // check for modifiers so we don't break browser's hotkeys
 | 
					      // check for modifiers so we don't break browser's hotkeys
 | 
				
			||||||
      if (Object.prototype.hasOwnProperty.call(vimKeys, e.keyCode) && !e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey) {
 | 
					      if (Object.prototype.hasOwnProperty.call(vimKeys, e.keyCode) && !e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey) {
 | 
				
			||||||
        var tagName = e.target.tagName.toLowerCase();
 | 
					        var tagName = e.target.tagName.toLowerCase();
 | 
				
			||||||
@ -171,10 +171,10 @@ searxng.ready(function() {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  function highlightResult(which) {
 | 
					  function highlightResult (which) {
 | 
				
			||||||
    return function(noScroll) {
 | 
					    return function (noScroll) {
 | 
				
			||||||
      var current = document.querySelector('.result[data-vim-selected]'),
 | 
					      var current = document.querySelector('.result[data-vim-selected]'),
 | 
				
			||||||
      effectiveWhich = which;
 | 
					        effectiveWhich = which;
 | 
				
			||||||
      if (current === null) {
 | 
					      if (current === null) {
 | 
				
			||||||
        // no selection : choose the first one
 | 
					        // no selection : choose the first one
 | 
				
			||||||
        current = document.querySelector('.result');
 | 
					        current = document.querySelector('.result');
 | 
				
			||||||
@ -194,7 +194,7 @@ searxng.ready(function() {
 | 
				
			|||||||
        next = effectiveWhich;
 | 
					        next = effectiveWhich;
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
        switch (effectiveWhich) {
 | 
					        switch (effectiveWhich) {
 | 
				
			||||||
          case 'visible':
 | 
					        case 'visible':
 | 
				
			||||||
          var top = document.documentElement.scrollTop || document.body.scrollTop;
 | 
					          var top = document.documentElement.scrollTop || document.body.scrollTop;
 | 
				
			||||||
          var bot = top + document.documentElement.clientHeight;
 | 
					          var bot = top + document.documentElement.clientHeight;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -208,24 +208,24 @@ searxng.ready(function() {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
          break;
 | 
					          break;
 | 
				
			||||||
          case 'down':
 | 
					        case 'down':
 | 
				
			||||||
          next = current.nextElementSibling;
 | 
					          next = current.nextElementSibling;
 | 
				
			||||||
          if (next === null) {
 | 
					          if (next === null) {
 | 
				
			||||||
            next = results[0];
 | 
					            next = results[0];
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
          break;
 | 
					          break;
 | 
				
			||||||
          case 'up':
 | 
					        case 'up':
 | 
				
			||||||
          next = current.previousElementSibling;
 | 
					          next = current.previousElementSibling;
 | 
				
			||||||
          if (next === null) {
 | 
					          if (next === null) {
 | 
				
			||||||
            next = results[results.length - 1];
 | 
					            next = results[results.length - 1];
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
          break;
 | 
					          break;
 | 
				
			||||||
          case 'bottom':
 | 
					        case 'bottom':
 | 
				
			||||||
          next = results[results.length - 1];
 | 
					          next = results[results.length - 1];
 | 
				
			||||||
          break;
 | 
					          break;
 | 
				
			||||||
          case 'top':
 | 
					        case 'top':
 | 
				
			||||||
          /* falls through */
 | 
					          /* falls through */
 | 
				
			||||||
          default:
 | 
					        default:
 | 
				
			||||||
          next = results[0];
 | 
					          next = results[0];
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@ -244,11 +244,11 @@ searxng.ready(function() {
 | 
				
			|||||||
    };
 | 
					    };
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  function reloadPage() {
 | 
					  function reloadPage () {
 | 
				
			||||||
    document.location.reload(true);
 | 
					    document.location.reload(true);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  function removeFocus(e) {
 | 
					  function removeFocus (e) {
 | 
				
			||||||
    const tagName = e.target.tagName.toLowerCase();
 | 
					    const tagName = e.target.tagName.toLowerCase();
 | 
				
			||||||
    if (document.activeElement && (tagName === 'input' || tagName === 'select' || tagName === 'textarea')) {
 | 
					    if (document.activeElement && (tagName === 'input' || tagName === 'select' || tagName === 'textarea')) {
 | 
				
			||||||
      document.activeElement.blur();
 | 
					      document.activeElement.blur();
 | 
				
			||||||
@ -257,8 +257,8 @@ searxng.ready(function() {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  function pageButtonClick(css_selector) {
 | 
					  function pageButtonClick (css_selector) {
 | 
				
			||||||
    return function() {
 | 
					    return function () {
 | 
				
			||||||
      var button = document.querySelector(css_selector);
 | 
					      var button = document.querySelector(css_selector);
 | 
				
			||||||
      if (button) {
 | 
					      if (button) {
 | 
				
			||||||
        button.click();
 | 
					        button.click();
 | 
				
			||||||
@ -266,24 +266,24 @@ searxng.ready(function() {
 | 
				
			|||||||
    };
 | 
					    };
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  function GoToNextPage() {
 | 
					  function GoToNextPage () {
 | 
				
			||||||
    return pageButtonClick('nav#pagination .next_page button[type="submit"]');
 | 
					    return pageButtonClick('nav#pagination .next_page button[type="submit"]');
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  function GoToPreviousPage() {
 | 
					  function GoToPreviousPage () {
 | 
				
			||||||
    return pageButtonClick('nav#pagination .previous_page button[type="submit"]');
 | 
					    return pageButtonClick('nav#pagination .previous_page button[type="submit"]');
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  function scrollPageToSelected() {
 | 
					  function scrollPageToSelected () {
 | 
				
			||||||
    var sel = document.querySelector('.result[data-vim-selected]');
 | 
					    var sel = document.querySelector('.result[data-vim-selected]');
 | 
				
			||||||
    if (sel === null) {
 | 
					    if (sel === null) {
 | 
				
			||||||
      return;
 | 
					      return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    var wtop = document.documentElement.scrollTop || document.body.scrollTop,
 | 
					    var wtop = document.documentElement.scrollTop || document.body.scrollTop,
 | 
				
			||||||
    wheight = document.documentElement.clientHeight,
 | 
					      wheight = document.documentElement.clientHeight,
 | 
				
			||||||
    etop = sel.offsetTop,
 | 
					      etop = sel.offsetTop,
 | 
				
			||||||
    ebot = etop + sel.clientHeight,
 | 
					      ebot = etop + sel.clientHeight,
 | 
				
			||||||
    offset = 120;
 | 
					      offset = 120;
 | 
				
			||||||
    // first element ?
 | 
					    // first element ?
 | 
				
			||||||
    if ((sel.previousElementSibling === null) && (ebot < wheight)) {
 | 
					    if ((sel.previousElementSibling === null) && (ebot < wheight)) {
 | 
				
			||||||
      // set to the top of page if the first element
 | 
					      // set to the top of page if the first element
 | 
				
			||||||
@ -301,27 +301,27 @@ searxng.ready(function() {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  function scrollPage(amount) {
 | 
					  function scrollPage (amount) {
 | 
				
			||||||
    return function() {
 | 
					    return function () {
 | 
				
			||||||
      window.scrollBy(0, amount);
 | 
					      window.scrollBy(0, amount);
 | 
				
			||||||
      highlightResult('visible')();
 | 
					      highlightResult('visible')();
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  function scrollPageTo(position, nav) {
 | 
					  function scrollPageTo (position, nav) {
 | 
				
			||||||
    return function() {
 | 
					    return function () {
 | 
				
			||||||
      window.scrollTo(0, position);
 | 
					      window.scrollTo(0, position);
 | 
				
			||||||
      highlightResult(nav)();
 | 
					      highlightResult(nav)();
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  function searchInputFocus() {
 | 
					  function searchInputFocus () {
 | 
				
			||||||
    window.scrollTo(0, 0);
 | 
					    window.scrollTo(0, 0);
 | 
				
			||||||
    document.querySelector('#q').focus();
 | 
					    document.querySelector('#q').focus();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  function openResult(newTab) {
 | 
					  function openResult (newTab) {
 | 
				
			||||||
    return function() {
 | 
					    return function () {
 | 
				
			||||||
      var link = document.querySelector('.result[data-vim-selected] h3 a');
 | 
					      var link = document.querySelector('.result[data-vim-selected] h3 a');
 | 
				
			||||||
      if (link === null) {
 | 
					      if (link === null) {
 | 
				
			||||||
        link = document.querySelector('.result[data-vim-selected] > a');
 | 
					        link = document.querySelector('.result[data-vim-selected] > a');
 | 
				
			||||||
@ -337,7 +337,7 @@ searxng.ready(function() {
 | 
				
			|||||||
    };
 | 
					    };
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  function initHelpContent(divElement) {
 | 
					  function initHelpContent (divElement) {
 | 
				
			||||||
    var categories = {};
 | 
					    var categories = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (var k in vimKeys) {
 | 
					    for (var k in vimKeys) {
 | 
				
			||||||
@ -346,7 +346,7 @@ searxng.ready(function() {
 | 
				
			|||||||
      categories[key.cat].push(key);
 | 
					      categories[key.cat].push(key);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var sorted = Object.keys(categories).sort(function(a, b) {
 | 
					    var sorted = Object.keys(categories).sort(function (a, b) {
 | 
				
			||||||
      return categories[b].length - categories[a].length;
 | 
					      return categories[b].length - categories[a].length;
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -386,23 +386,23 @@ searxng.ready(function() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    html += '</table>';
 | 
					    html += '</table>';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
     divElement.innerHTML = html;
 | 
					    divElement.innerHTML = html;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  function toggleHelp() {
 | 
					  function toggleHelp () {
 | 
				
			||||||
    var helpPanel = document.querySelector('#vim-hotkeys-help');
 | 
					    var helpPanel = document.querySelector('#vim-hotkeys-help');
 | 
				
			||||||
    if (helpPanel === undefined || helpPanel === null) {
 | 
					    if (helpPanel === undefined || helpPanel === null) {
 | 
				
			||||||
       // first call
 | 
					      // first call
 | 
				
			||||||
      helpPanel = document.createElement('div');
 | 
					      helpPanel = document.createElement('div');
 | 
				
			||||||
         helpPanel.id = 'vim-hotkeys-help';
 | 
					      helpPanel.id = 'vim-hotkeys-help';
 | 
				
			||||||
        helpPanel.className='dialog-modal';
 | 
					      helpPanel.className = 'dialog-modal';
 | 
				
			||||||
 | 
					      initHelpContent(helpPanel);
 | 
				
			||||||
      initHelpContent(helpPanel);
 | 
					      initHelpContent(helpPanel);
 | 
				
			||||||
			initHelpContent(helpPanel);					
 | 
					 | 
				
			||||||
      initHelpContent(helpPanel);
 | 
					      initHelpContent(helpPanel);
 | 
				
			||||||
      var body = document.getElementsByTagName('body')[0];
 | 
					      var body = document.getElementsByTagName('body')[0];
 | 
				
			||||||
      body.appendChild(helpPanel);
 | 
					      body.appendChild(helpPanel);
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
       // togggle hidden
 | 
					      // togggle hidden
 | 
				
			||||||
      helpPanel.classList.toggle('invisible');
 | 
					      helpPanel.classList.toggle('invisible');
 | 
				
			||||||
      return;
 | 
					      return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -4,7 +4,7 @@
 | 
				
			|||||||
  'use strict';
 | 
					  'use strict';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  searxng.ready(function () {
 | 
					  searxng.ready(function () {
 | 
				
			||||||
    searxng.on('.searxng_init_map', 'click', function(event) {
 | 
					    searxng.on('.searxng_init_map', 'click', function (event) {
 | 
				
			||||||
      // no more request
 | 
					      // no more request
 | 
				
			||||||
      this.classList.remove("searxng_init_map");
 | 
					      this.classList.remove("searxng_init_map");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -17,9 +17,9 @@
 | 
				
			|||||||
      var map_geojson = JSON.parse(this.dataset.mapGeojson);
 | 
					      var map_geojson = JSON.parse(this.dataset.mapGeojson);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      searxng.loadStyle('css/leaflet.css');
 | 
					      searxng.loadStyle('css/leaflet.css');
 | 
				
			||||||
      searxng.loadScript('js/leaflet.js', function() {
 | 
					      searxng.loadScript('js/leaflet.js', function () {
 | 
				
			||||||
        var map_bounds = null;
 | 
					        var map_bounds = null;
 | 
				
			||||||
        if(map_boundingbox) {
 | 
					        if (map_boundingbox) {
 | 
				
			||||||
          var southWest = L.latLng(map_boundingbox[0], map_boundingbox[2]);
 | 
					          var southWest = L.latLng(map_boundingbox[0], map_boundingbox[2]);
 | 
				
			||||||
          var northEast = L.latLng(map_boundingbox[1], map_boundingbox[3]);
 | 
					          var northEast = L.latLng(map_boundingbox[1], map_boundingbox[3]);
 | 
				
			||||||
          map_bounds = L.latLngBounds(southWest, northEast);
 | 
					          map_bounds = L.latLngBounds(southWest, northEast);
 | 
				
			||||||
@ -28,26 +28,26 @@
 | 
				
			|||||||
        // init map
 | 
					        // init map
 | 
				
			||||||
        var map = L.map(leaflet_target);
 | 
					        var map = L.map(leaflet_target);
 | 
				
			||||||
        // create the tile layer with correct attribution
 | 
					        // create the tile layer with correct attribution
 | 
				
			||||||
        var osmMapnikUrl='https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';
 | 
					        var osmMapnikUrl = 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';
 | 
				
			||||||
        var osmMapnikAttrib='Map data © <a href="https://openstreetmap.org">OpenStreetMap</a> contributors';
 | 
					        var osmMapnikAttrib = 'Map data © <a href="https://openstreetmap.org">OpenStreetMap</a> contributors';
 | 
				
			||||||
        var osmMapnik = new L.TileLayer(osmMapnikUrl, {minZoom: 1, maxZoom: 19, attribution: osmMapnikAttrib});
 | 
					        var osmMapnik = new L.TileLayer(osmMapnikUrl, {minZoom: 1, maxZoom: 19, attribution: osmMapnikAttrib});
 | 
				
			||||||
        var osmWikimediaUrl='https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png';
 | 
					        var osmWikimediaUrl = 'https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png';
 | 
				
			||||||
        var osmWikimediaAttrib = 'Wikimedia maps | Maps data © <a href="https://openstreetmap.org">OpenStreetMap contributors</a>';
 | 
					        var osmWikimediaAttrib = 'Wikimedia maps | Maps data © <a href="https://openstreetmap.org">OpenStreetMap contributors</a>';
 | 
				
			||||||
        var osmWikimedia = new L.TileLayer(osmWikimediaUrl, {minZoom: 1, maxZoom: 19, attribution: osmWikimediaAttrib});
 | 
					        var osmWikimedia = new L.TileLayer(osmWikimediaUrl, {minZoom: 1, maxZoom: 19, attribution: osmWikimediaAttrib});
 | 
				
			||||||
        // init map view
 | 
					        // init map view
 | 
				
			||||||
        if(map_bounds) {
 | 
					        if (map_bounds) {
 | 
				
			||||||
          // TODO hack: https://github.com/Leaflet/Leaflet/issues/2021
 | 
					          // TODO hack: https://github.com/Leaflet/Leaflet/issues/2021
 | 
				
			||||||
          // Still useful ?
 | 
					          // Still useful ?
 | 
				
			||||||
          setTimeout(function () {
 | 
					          setTimeout(function () {
 | 
				
			||||||
            map.fitBounds(map_bounds, {
 | 
					            map.fitBounds(map_bounds, {
 | 
				
			||||||
              maxZoom:17
 | 
					              maxZoom: 17
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
          }, 0);
 | 
					          }, 0);
 | 
				
			||||||
        } else if (map_lon && map_lat) {
 | 
					        } else if (map_lon && map_lat) {
 | 
				
			||||||
          if(map_zoom) {
 | 
					          if (map_zoom) {
 | 
				
			||||||
            map.setView(new L.latLng(map_lat, map_lon),map_zoom);
 | 
					            map.setView(new L.latLng(map_lat, map_lon), map_zoom);
 | 
				
			||||||
          } else {
 | 
					          } else {
 | 
				
			||||||
            map.setView(new L.latLng(map_lat, map_lon),8);
 | 
					            map.setView(new L.latLng(map_lat, map_lon), 8);
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -60,11 +60,11 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        L.control.layers(baseLayers).addTo(map);
 | 
					        L.control.layers(baseLayers).addTo(map);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if(map_geojson) {
 | 
					        if (map_geojson) {
 | 
				
			||||||
          L.geoJson(map_geojson).addTo(map);
 | 
					          L.geoJson(map_geojson).addTo(map);
 | 
				
			||||||
        } /*else if(map_bounds) {
 | 
					        } /* else if(map_bounds) {
 | 
				
			||||||
          L.rectangle(map_bounds, {color: "#ff7800", weight: 3, fill:false}).addTo(map);
 | 
					          L.rectangle(map_bounds, {color: "#ff7800", weight: 3, fill:false}).addTo(map);
 | 
				
			||||||
        }*/
 | 
					        } */
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      // this event occour only once per element
 | 
					      // this event occour only once per element
 | 
				
			||||||
 | 
				
			|||||||
@ -1,28 +1,28 @@
 | 
				
			|||||||
/* SPDX-License-Identifier: AGPL-3.0-or-later */
 | 
					/* SPDX-License-Identifier: AGPL-3.0-or-later */
 | 
				
			||||||
(function (w, d, searxng) {
 | 
					(function (w, d, searxng) {
 | 
				
			||||||
    'use strict';
 | 
					  'use strict';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    searxng.ready(function() {
 | 
					  searxng.ready(function () {
 | 
				
			||||||
        let engine_descriptions = null;
 | 
					    let engine_descriptions = null;
 | 
				
			||||||
        function load_engine_descriptions() {
 | 
					    function load_engine_descriptions () {
 | 
				
			||||||
            if (engine_descriptions == null) {
 | 
					      if (engine_descriptions == null) {
 | 
				
			||||||
                searxng.http("GET", "engine_descriptions.json").then(function(content) {
 | 
					        searxng.http("GET", "engine_descriptions.json").then(function (content) {
 | 
				
			||||||
                    engine_descriptions = JSON.parse(content);
 | 
					          engine_descriptions = JSON.parse(content);
 | 
				
			||||||
                    for (const [engine_name, description] of Object.entries(engine_descriptions)) {
 | 
					          for (const [engine_name, description] of Object.entries(engine_descriptions)) {
 | 
				
			||||||
                        let elements = d.querySelectorAll('[data-engine-name="' + engine_name + '"] .engine-description');
 | 
					            let elements = d.querySelectorAll('[data-engine-name="' + engine_name + '"] .engine-description');
 | 
				
			||||||
                        for(const element of elements) {
 | 
					            for (const element of elements) {
 | 
				
			||||||
                            let source = ' (<i>' + searxng.translations['Source'] + ': ' + description[1] + '</i>)';
 | 
					              let source = ' (<i>' + searxng.translations['Source'] + ': ' + description[1] + '</i>)';
 | 
				
			||||||
                            element.innerHTML = description[0] + source;
 | 
					              element.innerHTML = description[0] + source;
 | 
				
			||||||
                        }
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                });
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					          }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (d.querySelector('body[class="preferences_endpoint"]')) {
 | 
					    if (d.querySelector('body[class="preferences_endpoint"]')) {
 | 
				
			||||||
            for(const el of d.querySelectorAll('[data-engine-name]')) {
 | 
					      for (const el of d.querySelectorAll('[data-engine-name]')) {
 | 
				
			||||||
                searxng.on(el, 'mouseenter', load_engine_descriptions);
 | 
					        searxng.on(el, 'mouseenter', load_engine_descriptions);
 | 
				
			||||||
            }
 | 
					      }
 | 
				
			||||||
        }
 | 
					    }
 | 
				
			||||||
    });
 | 
					  });
 | 
				
			||||||
})(window, document, window.searxng);
 | 
					})(window, document, window.searxng);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,12 +1,12 @@
 | 
				
			|||||||
/* SPDX-License-Identifier: AGPL-3.0-or-later */
 | 
					/* SPDX-License-Identifier: AGPL-3.0-or-later */
 | 
				
			||||||
(function(w, d, searxng) {
 | 
					(function (w, d, searxng) {
 | 
				
			||||||
  'use strict';
 | 
					  'use strict';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  searxng.ready(function() {
 | 
					  searxng.ready(function () {
 | 
				
			||||||
    searxng.image_thumbnail_layout = new searxng.ImageLayout('#urls', '#urls .result-images', 'img.image_thumbnail', 14, 6, 200);
 | 
					    searxng.image_thumbnail_layout = new searxng.ImageLayout('#urls', '#urls .result-images', 'img.image_thumbnail', 14, 6, 200);
 | 
				
			||||||
    searxng.image_thumbnail_layout.watch();
 | 
					    searxng.image_thumbnail_layout.watch();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    searxng.on('.btn-collapse', 'click', function() {
 | 
					    searxng.on('.btn-collapse', 'click', function () {
 | 
				
			||||||
      var btnLabelCollapsed = this.getAttribute('data-btn-text-collapsed');
 | 
					      var btnLabelCollapsed = this.getAttribute('data-btn-text-collapsed');
 | 
				
			||||||
      var btnLabelNotCollapsed = this.getAttribute('data-btn-text-not-collapsed');
 | 
					      var btnLabelNotCollapsed = this.getAttribute('data-btn-text-not-collapsed');
 | 
				
			||||||
      var target = this.getAttribute('data-target');
 | 
					      var target = this.getAttribute('data-target');
 | 
				
			||||||
@ -22,7 +22,7 @@
 | 
				
			|||||||
      targetElement.classList.toggle('invisible');
 | 
					      targetElement.classList.toggle('invisible');
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    searxng.on('.media-loader', 'click', function() {
 | 
					    searxng.on('.media-loader', 'click', function () {
 | 
				
			||||||
      var target = this.getAttribute('data-target');
 | 
					      var target = this.getAttribute('data-target');
 | 
				
			||||||
      var iframe_load = d.querySelector(target + ' > iframe');
 | 
					      var iframe_load = d.querySelector(target + ' > iframe');
 | 
				
			||||||
      var srctest = iframe_load.getAttribute('src');
 | 
					      var srctest = iframe_load.getAttribute('src');
 | 
				
			||||||
@ -31,8 +31,8 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    searxng.selectImage = function(resultElement) {
 | 
					    searxng.selectImage = function (resultElement) {
 | 
				
			||||||
      /*eslint no-unused-vars: 0*/
 | 
					      /* eslint no-unused-vars: 0 */
 | 
				
			||||||
      if (resultElement) {
 | 
					      if (resultElement) {
 | 
				
			||||||
        // load full size image in background
 | 
					        // load full size image in background
 | 
				
			||||||
        const imgElement = resultElement.querySelector('.result-images-source img');
 | 
					        const imgElement = resultElement.querySelector('.result-images-source img');
 | 
				
			||||||
@ -65,7 +65,7 @@
 | 
				
			|||||||
      searxng.scrollPageToSelected();
 | 
					      searxng.scrollPageToSelected();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    searxng.closeDetail = function(e) {
 | 
					    searxng.closeDetail = function (e) {
 | 
				
			||||||
      d.getElementById('results').classList.remove('image-detail-open');
 | 
					      d.getElementById('results').classList.remove('image-detail-open');
 | 
				
			||||||
      searxng.image_thumbnail_layout.align();
 | 
					      searxng.image_thumbnail_layout.align();
 | 
				
			||||||
      searxng.scrollPageToSelected();
 | 
					      searxng.scrollPageToSelected();
 | 
				
			||||||
@ -77,10 +77,10 @@
 | 
				
			|||||||
    searxng.on('.result-detail-previous', 'click', e => searxng.selectPrevious(false));
 | 
					    searxng.on('.result-detail-previous', 'click', e => searxng.selectPrevious(false));
 | 
				
			||||||
    searxng.on('.result-detail-next', 'click', e => searxng.selectNext(false));
 | 
					    searxng.on('.result-detail-next', 'click', e => searxng.selectNext(false));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    w.addEventListener('scroll', function() {
 | 
					    w.addEventListener('scroll', function () {
 | 
				
			||||||
      var e = d.getElementById('backToTop'),
 | 
					      var e = d.getElementById('backToTop'),
 | 
				
			||||||
      scrollTop = document.documentElement.scrollTop || document.body.scrollTop,
 | 
					        scrollTop = document.documentElement.scrollTop || document.body.scrollTop,
 | 
				
			||||||
      results = d.getElementById('results');
 | 
					        results = d.getElementById('results');
 | 
				
			||||||
      if (e !== null) {
 | 
					      if (e !== null) {
 | 
				
			||||||
        if (scrollTop >= 100) {
 | 
					        if (scrollTop >= 100) {
 | 
				
			||||||
          results.classList.add('scrolling');
 | 
					          results.classList.add('scrolling');
 | 
				
			||||||
 | 
				
			|||||||
@ -1,48 +1,48 @@
 | 
				
			|||||||
/* SPDX-License-Identifier: AGPL-3.0-or-later */
 | 
					/* SPDX-License-Identifier: AGPL-3.0-or-later */
 | 
				
			||||||
/* global AutoComplete */
 | 
					/* global AutoComplete */
 | 
				
			||||||
(function(w, d, searxng) {
 | 
					(function (w, d, searxng) {
 | 
				
			||||||
  'use strict';
 | 
					  'use strict';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  var firstFocus = true, qinput_id = "q", qinput;
 | 
					  var firstFocus = true, qinput_id = "q", qinput;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  function placeCursorAtEnd(element) {
 | 
					  function placeCursorAtEnd (element) {
 | 
				
			||||||
    if (element.setSelectionRange) {
 | 
					    if (element.setSelectionRange) {
 | 
				
			||||||
      var len = element.value.length;
 | 
					      var len = element.value.length;
 | 
				
			||||||
      element.setSelectionRange(len, len);
 | 
					      element.setSelectionRange(len, len);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  function submitIfQuery() {
 | 
					  function submitIfQuery () {
 | 
				
			||||||
    if (qinput.value.length  > 0) {
 | 
					    if (qinput.value.length  > 0) {
 | 
				
			||||||
      var search = document.getElementById('search');
 | 
					      var search = document.getElementById('search');
 | 
				
			||||||
      setTimeout(search.submit.bind(search), 0);
 | 
					      setTimeout(search.submit.bind(search), 0);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  function createClearButton(qinput) {
 | 
					  function createClearButton (qinput) {
 | 
				
			||||||
    var cs = document.getElementById('clear_search');
 | 
					    var cs = document.getElementById('clear_search');
 | 
				
			||||||
    var updateClearButton = function() {
 | 
					    var updateClearButton = function () {
 | 
				
			||||||
      if (qinput.value.length === 0) {
 | 
					      if (qinput.value.length === 0) {
 | 
				
			||||||
	cs.classList.add("empty");
 | 
					        cs.classList.add("empty");
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
	cs.classList.remove("empty");
 | 
					        cs.classList.remove("empty");
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // update status, event listener
 | 
					    // update status, event listener
 | 
				
			||||||
    updateClearButton();
 | 
					    updateClearButton();
 | 
				
			||||||
    cs.addEventListener('click', function() {
 | 
					    cs.addEventListener('click', function () {
 | 
				
			||||||
      qinput.value='';
 | 
					      qinput.value = '';
 | 
				
			||||||
      qinput.focus();
 | 
					      qinput.focus();
 | 
				
			||||||
      updateClearButton();
 | 
					      updateClearButton();
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    qinput.addEventListener('keyup', updateClearButton, false);
 | 
					    qinput.addEventListener('keyup', updateClearButton, false);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  searxng.ready(function() {
 | 
					  searxng.ready(function () {
 | 
				
			||||||
    qinput = d.getElementById(qinput_id);
 | 
					    qinput = d.getElementById(qinput_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function placeCursorAtEndOnce() {
 | 
					    function placeCursorAtEndOnce () {
 | 
				
			||||||
      if (firstFocus) {
 | 
					      if (firstFocus) {
 | 
				
			||||||
        placeCursorAtEnd(qinput);
 | 
					        placeCursorAtEnd(qinput);
 | 
				
			||||||
        firstFocus = false;
 | 
					        firstFocus = false;
 | 
				
			||||||
@ -67,7 +67,7 @@
 | 
				
			|||||||
          },
 | 
					          },
 | 
				
			||||||
          MinChars: 4,
 | 
					          MinChars: 4,
 | 
				
			||||||
          Delay: 300,
 | 
					          Delay: 300,
 | 
				
			||||||
          _Position:function() {
 | 
					          _Position: function () {
 | 
				
			||||||
            this.DOMResults.setAttribute("class", "autocomplete");
 | 
					            this.DOMResults.setAttribute("class", "autocomplete");
 | 
				
			||||||
            this.DOMResults.style.top = (this.Input.offsetTop + this.Input.offsetHeight) + "px";
 | 
					            this.DOMResults.style.top = (this.Input.offsetTop + this.Input.offsetHeight) + "px";
 | 
				
			||||||
            this.DOMResults.style.left = this.Input.offsetLeft + "px";
 | 
					            this.DOMResults.style.left = this.Input.offsetLeft + "px";
 | 
				
			||||||
@ -76,7 +76,7 @@
 | 
				
			|||||||
        }, "#" + qinput_id);
 | 
					        }, "#" + qinput_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // hack, see : https://github.com/autocompletejs/autocomplete.js/issues/37
 | 
					        // hack, see : https://github.com/autocompletejs/autocomplete.js/issues/37
 | 
				
			||||||
        w.addEventListener('resize', function() {
 | 
					        w.addEventListener('resize', function () {
 | 
				
			||||||
          var event = new CustomEvent("position");
 | 
					          var event = new CustomEvent("position");
 | 
				
			||||||
          qinput.dispatchEvent(event);
 | 
					          qinput.dispatchEvent(event);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
@ -88,11 +88,11 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // vanilla js version of search_on_category_select.js
 | 
					    // vanilla js version of search_on_category_select.js
 | 
				
			||||||
    if (qinput !== null && d.querySelector('.help') != null && searxng.search_on_category_select) {
 | 
					    if (qinput !== null && d.querySelector('.help') != null && searxng.search_on_category_select) {
 | 
				
			||||||
      d.querySelector('.help').className='invisible';
 | 
					      d.querySelector('.help').className = 'invisible';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      searxng.on('#categories input', 'change', function() {
 | 
					      searxng.on('#categories input', 'change', function () {
 | 
				
			||||||
        var i, categories = d.querySelectorAll('#categories input[type="checkbox"]');
 | 
					        var i, categories = d.querySelectorAll('#categories input[type="checkbox"]');
 | 
				
			||||||
        for(i=0; i<categories.length; i++) {
 | 
					        for (i = 0; i < categories.length; i++) {
 | 
				
			||||||
          if (categories[i] !== this && categories[i].checked) {
 | 
					          if (categories[i] !== this && categories[i].checked) {
 | 
				
			||||||
            categories[i].click();
 | 
					            categories[i].click();
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
 | 
				
			|||||||
@ -15,5 +15,5 @@ module.exports = {
 | 
				
			|||||||
    // Optimize SVG for WEB usage
 | 
					    // Optimize SVG for WEB usage
 | 
				
			||||||
    'convertStyleToAttrs',
 | 
					    'convertStyleToAttrs',
 | 
				
			||||||
    'removeXMLNS'
 | 
					    'removeXMLNS'
 | 
				
			||||||
 ],
 | 
					  ],
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user