From 7a0fbdecc484284296574a2c2ba9afda01212723 Mon Sep 17 00:00:00 2001 From: Alexandre Flament Date: Mon, 22 Mar 2021 12:00:48 +0100 Subject: [PATCH] [enh] oscar: image thumbnail layout Adjust thumbnail sizes to fill the container width --- .../js/image_layout.js} | 110 +++--- .../themes/oscar/css/logicodev-dark.css | 29 +- .../themes/oscar/css/logicodev-dark.min.css | Bin 16699 -> 17141 bytes .../oscar/css/logicodev-dark.min.css.map | Bin 7913 -> 8107 bytes searx/static/themes/oscar/css/logicodev.css | 29 +- .../static/themes/oscar/css/logicodev.min.css | Bin 13078 -> 13520 bytes .../themes/oscar/css/logicodev.min.css.map | Bin 6447 -> 6641 bytes searx/static/themes/oscar/gruntfile.js | 4 +- searx/static/themes/oscar/js/searx.js | 172 ++++++++++ searx/static/themes/oscar/js/searx.min.js | Bin 5695 -> 7829 bytes searx/static/themes/oscar/js/searx.min.js.map | Bin 6642 -> 9889 bytes searx/static/themes/oscar/src/js/01_init.js | 3 + .../themes/oscar/src/js/element_modifiers.js | 6 + .../oscar/src/less/logicodev/results.less | 31 +- searx/static/themes/simple/css/searx-rtl.css | 2 +- .../themes/simple/css/searx-rtl.min.css | Bin 27825 -> 27825 bytes searx/static/themes/simple/css/searx.css | 2 +- searx/static/themes/simple/css/searx.min.css | Bin 27790 -> 27790 bytes searx/static/themes/simple/gruntfile.js | 4 +- .../static/themes/simple/js/searx.head.min.js | Bin 752 -> 752 bytes searx/static/themes/simple/js/searx.js | 316 +++++++++--------- searx/static/themes/simple/js/searx.min.js | Bin 24025 -> 24399 bytes .../static/themes/simple/js/searx.min.js.map | Bin 30503 -> 30991 bytes .../simple/js/searx_src/searx_results.js | 2 +- searx/templates/oscar/base.html | 2 +- 25 files changed, 497 insertions(+), 215 deletions(-) rename searx/static/themes/{simple/js/searx_src/searx_imageresult.js => __common__/js/image_layout.js} (53%) diff --git a/searx/static/themes/simple/js/searx_src/searx_imageresult.js b/searx/static/themes/__common__/js/image_layout.js similarity index 53% rename from searx/static/themes/simple/js/searx_src/searx_imageresult.js rename to searx/static/themes/__common__/js/image_layout.js index 7bbfc1454..ea54cf515 100644 --- a/searx/static/themes/simple/js/searx_src/searx_imageresult.js +++ b/searx/static/themes/__common__/js/image_layout.js @@ -3,21 +3,21 @@ * Google Image Layout v0.0.1 * Description, by Anh Trinh. * Heavily modified for searx -* http://trinhtrunganh.com +* https://ptgamr.github.io/2014-09-12-google-image-layout/ +* https://ptgamr.github.io/google-image-layout/src/google-image-layout.js * * @license Free to use under the MIT License. * */ -(function(w, d) { - 'use strict'; - - function ImageLayout(container_selector, results_selector, img_selector, maxHeight) { + +(function (w, d) { + function ImageLayout(container_selector, results_selector, img_selector, margin, maxHeight) { this.container_selector = container_selector; this.results_selector = results_selector; this.img_selector = img_selector; - this.margin = 10; + this.margin = margin; this.maxHeight = maxHeight; - this._alignAllDone = true; + this.isAlignDone = true; } /** @@ -31,12 +31,11 @@ * * @return {[type]} the height */ - ImageLayout.prototype._getHeigth = function(images, width) { - var r = 0, - img; + ImageLayout.prototype._getHeigth = function (images, width) { + var i, img; + var r = 0; - width -= images.length * this.margin; - for (var i = 0; i < images.length; i++) { + for (i = 0; i < images.length; i++) { img = images[i]; if ((img.naturalWidth > 0) && (img.naturalHeight > 0)) { r += img.naturalWidth / img.naturalHeight; @@ -46,12 +45,14 @@ } } - return width / r; //have to round down because Firefox will automatically roundup value with number of decimals > 3 + return (width - images.length * this.margin) / r; //have to round down because Firefox will automatically roundup value with number of decimals > 3 }; - ImageLayout.prototype._setSize = function(images, height) { - var img, imgWidth, imagesLength = images.length; - for (var i = 0; i < imagesLength; i++) { + ImageLayout.prototype._setSize = function (images, height) { + var i, img, imgWidth; + var imagesLength = images.length, resultNode; + + for (i = 0; i < imagesLength; i++) { img = images[i]; if ((img.naturalWidth > 0) && (img.naturalHeight > 0)) { imgWidth = height * img.naturalWidth / img.naturalHeight; @@ -65,38 +66,52 @@ img.style.marginTop = '3px'; img.style.marginRight = this.margin - 7 + 'px'; // -4 is the negative margin of the inline element img.style.marginBottom = this.margin - 7 + 'px'; + resultNode = img.parentNode.parentNode; + if (!resultNode.classList.contains('js')) { + resultNode.classList.add('js'); + } } }; - ImageLayout.prototype._alignImgs = function(imgGroup) { - var slice, h, - containerWidth = d.querySelector(this.container_selector).clientWidth; + ImageLayout.prototype._alignImgs = function (imgGroup) { + var isSearching, slice, i, h; + var containerElement = d.querySelector(this.container_selector); + var containerCompStyles = window.getComputedStyle(containerElement); + var containerPaddingLeft = parseInt(containerCompStyles.getPropertyValue('padding-left'), 10); + var containerPaddingRight = parseInt(containerCompStyles.getPropertyValue('padding-right'), 10); + var containerWidth = containerElement.clientWidth - containerPaddingLeft - containerPaddingRight; - w: while (imgGroup.length > 0) { - for (var i = 1; i <= imgGroup.length; i++) { + while (imgGroup.length > 0) { + isSearching = true; + for (i = 1; i <= imgGroup.length && isSearching; i++) { slice = imgGroup.slice(0, i); h = this._getHeigth(slice, containerWidth); if (h < this.maxHeight) { this._setSize(slice, h); + // continue with the remaining images imgGroup = imgGroup.slice(i); - continue w; + isSearching = false; } } - this._setSize(slice, Math.min(this.maxHeight, h)); - break; + if (isSearching) { + this._setSize(slice, Math.min(this.maxHeight, h)); + break; + } } }; - ImageLayout.prototype.align = function(results_selector) { - var results_selectorNode = d.querySelectorAll(this.results_selector), - results_length = results_selectorNode.length, - previous = null, - current = null, - imgGroup = []; - for (var i = 0; i < results_length; i++) { + ImageLayout.prototype.align = function () { + var i; + var results_selectorNode = d.querySelectorAll(this.results_selector); + var results_length = results_selectorNode.length; + var previous = null; + var current = null; + var imgGroup = []; + + for (i = 0; i < results_length; i++) { current = results_selectorNode[i]; if (current.previousElementSibling !== previous && imgGroup.length > 0) { - // the current image is not conected to previous one + // the current image is not connected to previous one // so the current image is the start of a new group of images. // so call _alignImgs to align the current group this._alignImgs(imgGroup); @@ -114,32 +129,29 @@ } }; - ImageLayout.prototype.watch = function() { - var i, img, imgGroup, imgNodeLength, - obj = this, - results_nodes = d.querySelectorAll(this.results_selector), - results_length = results_nodes.length; + ImageLayout.prototype.watch = function () { + var i, img; + var obj = this; + var results_nodes = d.querySelectorAll(this.results_selector); + var results_length = results_nodes.length; - function align(e) { - obj.align(); - } - - function throttleAlign(e) { - if (obj._alignAllDone) { - obj._alignAllDone = false; - setTimeout(function() { + function throttleAlign() { + if (obj.isAlignDone) { + obj.isAlignDone = false; + setTimeout(function () { obj.align(); - obj._alignAllDone = true; + obj.isAlignDone = true; }, 100); } } + w.addEventListener('pageshow', throttleAlign); + w.addEventListener('load', throttleAlign); w.addEventListener('resize', throttleAlign); - w.addEventListener('pageshow', align); for (i = 0; i < results_length; i++) { img = results_nodes[i].querySelector(this.img_selector); - if (typeof img !== 'undefined') { + if (img !== null && img !== undefined) { img.addEventListener('load', throttleAlign); img.addEventListener('error', throttleAlign); } @@ -148,4 +160,4 @@ w.searx.ImageLayout = ImageLayout; -})(window, document); +}(window, document)); diff --git a/searx/static/themes/oscar/css/logicodev-dark.css b/searx/static/themes/oscar/css/logicodev-dark.css index cfd6f7f23..9bacb3c13 100644 --- a/searx/static/themes/oscar/css/logicodev-dark.css +++ b/searx/static/themes/oscar/css/logicodev-dark.css @@ -202,14 +202,39 @@ input[type=checkbox]:not(:checked) + .label_hide_if_checked + .label_hide_if_not } .result-images { float: left !important; - width: 24%; - margin: 0.5%; + margin: 0; + padding: 0; } .result-images a { display: block; width: 100%; background-size: cover; } +.result-images a .img-thumbnail { + border: none !important; + padding: 0; +} +.result-images a:hover, +.result-images a:focus { + outline: 0; +} +.result-images a:hover .img-thumbnail, +.result-images a:focus .img-thumbnail { + box-shadow: 5px 5px 15px 0px black; +} +.result-images.js a .img-thumbnail { + max-height: inherit; + min-height: inherit; +} +.result-images:not(.js) { + width: 25%; + padding: 3px 13px 13px 3px; +} +.result-images:not(.js) a .img-thumbnail { + margin: 0; + max-height: 128px; + min-height: 128px; +} .img-thumbnail { margin: 5px; max-height: 128px; diff --git a/searx/static/themes/oscar/css/logicodev-dark.min.css b/searx/static/themes/oscar/css/logicodev-dark.min.css index 58e477082c62afc8eb4890dba980d0ae40782243..a70a109f460d87f5195c3522eb58aef040269501 100644 GIT binary patch delta 453 zcmdnp#Q3$9al&hU^HLQva|`l|N)q!*5JuGMq3O3u%TF#X*1-_Y z$S+GRs?IMh$;r%1wK9O~tA|+((THX}4s*~{0UcSPTbz-Yl3#9RT2P??!iFHiKtb8S z0AUxzD!nXZZ`MQonVVRln~|ECo>5|znU|4Tlv!e(o0*3u1a~#WBw(nNXaJ4VtS-+? mDao)hGF63#j4{X!a01A{p;uZHGt6NzHQ9t)WwQ*oycqyc#if7% delta 39 vcmey`%DB6Ual@fJS#m@)yX%woHk$Mkv9VXFEI{J diff --git a/searx/static/themes/oscar/css/logicodev-dark.min.css.map b/searx/static/themes/oscar/css/logicodev-dark.min.css.map index 549274f3b0a22c8e2f65aeba5c7aac72506e7192..4cd2eb8c52aedbd71077218f7083d17ebcb1a592 100644 GIT binary patch delta 227 zcmaE9yV`z(5xc0rqobpatE01{P9U6>Ie9*dEl>FkcAx!4(G4v+-u3I{Pg;eKN|6GTxU$Y`+gKu7mvopPX| vDLTHI5UnuBflUG%0wz2iT|IRwA+Z75( z%9Zm{d5#X%1Z?U&38X8_`ujztCfnsZr7~Nds1O2y hBpLp;c2VwEo=$!Hr4#@F delta 37 scmcbRIW292F^@=jW=cthm63_6b#7u&dS;%Lo~i0&S01O$&V0RU004mub^rhX diff --git a/searx/static/themes/oscar/css/logicodev.min.css.map b/searx/static/themes/oscar/css/logicodev.min.css.map index 407ff7d41953880796f9476f6165d22b90c70c9e..3e15ed5ec95747635e0db40a1c039c23091f060e 100644 GIT binary patch delta 218 zcmZ2)^wD_3M|J^!M@L5;S4U?@oj@>aG9!mtJ&>2~?C9*N1C~ui$U3_E>XbS;I);Eq zXLqO`kbJQ-NIQ@O>Iw%jJ>i5m*kBOh?da>NlM7Un;RI0>2+|5x9_Z+vtWyp&G)2c( s6QUL7Ca_6hL%@WmqpPP*CB%7?CkRL}c}H#5 0) && (img.naturalHeight > 0)) { + r += img.naturalWidth / img.naturalHeight; + } else { + // assume that not loaded images are square + r += 1; + } + } + + return (width - images.length * this.margin) / r; //have to round down because Firefox will automatically roundup value with number of decimals > 3 + }; + + ImageLayout.prototype._setSize = function (images, height) { + var i, img, imgWidth; + var imagesLength = images.length, resultNode; + + for (i = 0; i < imagesLength; i++) { + img = images[i]; + if ((img.naturalWidth > 0) && (img.naturalHeight > 0)) { + imgWidth = height * img.naturalWidth / img.naturalHeight; + } else { + // not loaded image : make it square as _getHeigth said it + imgWidth = height; + } + img.style.width = imgWidth + 'px'; + img.style.height = height + 'px'; + img.style.marginLeft = '3px'; + img.style.marginTop = '3px'; + img.style.marginRight = this.margin - 7 + 'px'; // -4 is the negative margin of the inline element + img.style.marginBottom = this.margin - 7 + 'px'; + resultNode = img.parentNode.parentNode; + if (!resultNode.classList.contains('js')) { + resultNode.classList.add('js'); + } + } + }; + + ImageLayout.prototype._alignImgs = function (imgGroup) { + var isSearching, slice, i, h; + var containerElement = d.querySelector(this.container_selector); + var containerCompStyles = window.getComputedStyle(containerElement); + var containerPaddingLeft = parseInt(containerCompStyles.getPropertyValue('padding-left'), 10); + var containerPaddingRight = parseInt(containerCompStyles.getPropertyValue('padding-right'), 10); + var containerWidth = containerElement.clientWidth - containerPaddingLeft - containerPaddingRight; + + while (imgGroup.length > 0) { + isSearching = true; + for (i = 1; i <= imgGroup.length && isSearching; i++) { + slice = imgGroup.slice(0, i); + h = this._getHeigth(slice, containerWidth); + if (h < this.maxHeight) { + this._setSize(slice, h); + // continue with the remaining images + imgGroup = imgGroup.slice(i); + isSearching = false; + } + } + if (isSearching) { + this._setSize(slice, Math.min(this.maxHeight, h)); + break; + } + } + }; + + ImageLayout.prototype.align = function () { + var i; + var results_selectorNode = d.querySelectorAll(this.results_selector); + var results_length = results_selectorNode.length; + var previous = null; + var current = null; + var imgGroup = []; + + for (i = 0; i < results_length; i++) { + current = results_selectorNode[i]; + if (current.previousElementSibling !== previous && imgGroup.length > 0) { + // the current image is not connected to previous one + // so the current image is the start of a new group of images. + // so call _alignImgs to align the current group + this._alignImgs(imgGroup); + // and start a new empty group of images + imgGroup = []; + } + // add the current image to the group (only the img tag) + imgGroup.push(current.querySelector(this.img_selector)); + // update the previous variable + previous = current; + } + // align the remaining images + if (imgGroup.length > 0) { + this._alignImgs(imgGroup); + } + }; + + ImageLayout.prototype.watch = function () { + var i, img; + var obj = this; + var results_nodes = d.querySelectorAll(this.results_selector); + var results_length = results_nodes.length; + + function throttleAlign() { + if (obj.isAlignDone) { + obj.isAlignDone = false; + setTimeout(function () { + obj.align(); + obj.isAlignDone = true; + }, 100); + } + } + + w.addEventListener('pageshow', throttleAlign); + w.addEventListener('load', throttleAlign); + w.addEventListener('resize', throttleAlign); + + for (i = 0; i < results_length; i++) { + img = results_nodes[i].querySelector(this.img_selector); + if (img !== null && img !== undefined) { + img.addEventListener('load', throttleAlign); + img.addEventListener('error', throttleAlign); + } + } + }; + + w.searx.ImageLayout = ImageLayout; + +}(window, document)); diff --git a/searx/static/themes/oscar/js/searx.min.js b/searx/static/themes/oscar/js/searx.min.js index b3317e0c51b66df6783720a4d2ccb1123257262c..8b17d4f61a1f4383c2ad26fb21b91bff1155ec6a 100644 GIT binary patch delta 3123 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 diff --git a/searx/static/themes/oscar/js/searx.min.js.map b/searx/static/themes/oscar/js/searx.min.js.map index 13e949a74dba2cf4d8542352ad43b1b6f7092fac..506dde42f5412339a6c072b164d2cf5abc624b7c 100644 GIT binary patch literal 9889 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 0) && (img.naturalHeight > 0)) { - r += img.naturalWidth / img.naturalHeight; - } else { - // assume that not loaded images are square - r += 1; - } - } - - return width / r; //have to round down because Firefox will automatically roundup value with number of decimals > 3 - }; - - ImageLayout.prototype._setSize = function(images, height) { - var img, imgWidth, imagesLength = images.length; - for (var i = 0; i < imagesLength; i++) { - img = images[i]; - if ((img.naturalWidth > 0) && (img.naturalHeight > 0)) { - imgWidth = height * img.naturalWidth / img.naturalHeight; - } else { - // not loaded image : make it square as _getHeigth said it - imgWidth = height; - } - img.style.width = imgWidth + 'px'; - img.style.height = height + 'px'; - img.style.marginLeft = '3px'; - img.style.marginTop = '3px'; - img.style.marginRight = this.margin - 7 + 'px'; // -4 is the negative margin of the inline element - img.style.marginBottom = this.margin - 7 + 'px'; - } - }; - - ImageLayout.prototype._alignImgs = function(imgGroup) { - var slice, h, - containerWidth = d.querySelector(this.container_selector).clientWidth; - - w: while (imgGroup.length > 0) { - for (var i = 1; i <= imgGroup.length; i++) { - slice = imgGroup.slice(0, i); - h = this._getHeigth(slice, containerWidth); - if (h < this.maxHeight) { - this._setSize(slice, h); - imgGroup = imgGroup.slice(i); - continue w; - } - } - this._setSize(slice, Math.min(this.maxHeight, h)); - break; - } - }; - - ImageLayout.prototype.align = function(results_selector) { - var results_selectorNode = d.querySelectorAll(this.results_selector), - results_length = results_selectorNode.length, - previous = null, - current = null, - imgGroup = []; - for (var i = 0; i < results_length; i++) { - current = results_selectorNode[i]; - if (current.previousElementSibling !== previous && imgGroup.length > 0) { - // the current image is not conected to previous one - // so the current image is the start of a new group of images. - // so call _alignImgs to align the current group - this._alignImgs(imgGroup); - // and start a new empty group of images - imgGroup = []; - } - // add the current image to the group (only the img tag) - imgGroup.push(current.querySelector(this.img_selector)); - // update the previous variable - previous = current; - } - // align the remaining images - if (imgGroup.length > 0) { - this._alignImgs(imgGroup); - } - }; - - ImageLayout.prototype.watch = function() { - var i, img, imgGroup, imgNodeLength, - obj = this, - results_nodes = d.querySelectorAll(this.results_selector), - results_length = results_nodes.length; - - function align(e) { - obj.align(); - } - - function throttleAlign(e) { - if (obj._alignAllDone) { - obj._alignAllDone = false; - setTimeout(function() { - obj.align(); - obj._alignAllDone = true; - }, 100); - } - } - - w.addEventListener('resize', throttleAlign); - w.addEventListener('pageshow', align); - - for (i = 0; i < results_length; i++) { - img = results_nodes[i].querySelector(this.img_selector); - if (typeof img !== 'undefined') { - img.addEventListener('load', throttleAlign); - img.addEventListener('error', throttleAlign); - } - } - }; - - w.searx.ImageLayout = ImageLayout; - -})(window, document); ;searx.ready(function() { searx.on('.result', 'click', function() { @@ -1411,7 +1260,7 @@ module.exports = AutoComplete; 'use strict'; searx.ready(function() { - searx.image_thumbnail_layout = new searx.ImageLayout('#urls', '#urls .result-images', 'img.image_thumbnail', 200); + searx.image_thumbnail_layout = new searx.ImageLayout('#urls', '#urls .result-images', 'img.image_thumbnail', 10, 200); searx.image_thumbnail_layout.watch(); searx.on('.btn-collapse', 'click', function(event) { @@ -1575,3 +1424,166 @@ module.exports = AutoComplete; }); })(window, document, window.searx); +;/** +* +* Google Image Layout v0.0.1 +* Description, by Anh Trinh. +* Heavily modified for searx +* https://ptgamr.github.io/2014-09-12-google-image-layout/ +* https://ptgamr.github.io/google-image-layout/src/google-image-layout.js +* +* @license Free to use under the MIT License. +* +*/ + +(function (w, d) { + function ImageLayout(container_selector, results_selector, img_selector, margin, maxHeight) { + this.container_selector = container_selector; + this.results_selector = results_selector; + this.img_selector = img_selector; + this.margin = margin; + this.maxHeight = maxHeight; + this.isAlignDone = true; + } + + /** + * Get the height that make all images fit the container + * + * width = w1 + w2 + w3 + ... = r1*h + r2*h + r3*h + ... + * + * @param {[type]} images the images to be calculated + * @param {[type]} width the container witdth + * @param {[type]} margin the margin between each image + * + * @return {[type]} the height + */ + ImageLayout.prototype._getHeigth = function (images, width) { + var i, img; + var r = 0; + + for (i = 0; i < images.length; i++) { + img = images[i]; + if ((img.naturalWidth > 0) && (img.naturalHeight > 0)) { + r += img.naturalWidth / img.naturalHeight; + } else { + // assume that not loaded images are square + r += 1; + } + } + + return (width - images.length * this.margin) / r; //have to round down because Firefox will automatically roundup value with number of decimals > 3 + }; + + ImageLayout.prototype._setSize = function (images, height) { + var i, img, imgWidth; + var imagesLength = images.length, resultNode; + + for (i = 0; i < imagesLength; i++) { + img = images[i]; + if ((img.naturalWidth > 0) && (img.naturalHeight > 0)) { + imgWidth = height * img.naturalWidth / img.naturalHeight; + } else { + // not loaded image : make it square as _getHeigth said it + imgWidth = height; + } + img.style.width = imgWidth + 'px'; + img.style.height = height + 'px'; + img.style.marginLeft = '3px'; + img.style.marginTop = '3px'; + img.style.marginRight = this.margin - 7 + 'px'; // -4 is the negative margin of the inline element + img.style.marginBottom = this.margin - 7 + 'px'; + resultNode = img.parentNode.parentNode; + if (!resultNode.classList.contains('js')) { + resultNode.classList.add('js'); + } + } + }; + + ImageLayout.prototype._alignImgs = function (imgGroup) { + var isSearching, slice, i, h; + var containerElement = d.querySelector(this.container_selector); + var containerCompStyles = window.getComputedStyle(containerElement); + var containerPaddingLeft = parseInt(containerCompStyles.getPropertyValue('padding-left'), 10); + var containerPaddingRight = parseInt(containerCompStyles.getPropertyValue('padding-right'), 10); + var containerWidth = containerElement.clientWidth - containerPaddingLeft - containerPaddingRight; + + while (imgGroup.length > 0) { + isSearching = true; + for (i = 1; i <= imgGroup.length && isSearching; i++) { + slice = imgGroup.slice(0, i); + h = this._getHeigth(slice, containerWidth); + if (h < this.maxHeight) { + this._setSize(slice, h); + // continue with the remaining images + imgGroup = imgGroup.slice(i); + isSearching = false; + } + } + if (isSearching) { + this._setSize(slice, Math.min(this.maxHeight, h)); + break; + } + } + }; + + ImageLayout.prototype.align = function () { + var i; + var results_selectorNode = d.querySelectorAll(this.results_selector); + var results_length = results_selectorNode.length; + var previous = null; + var current = null; + var imgGroup = []; + + for (i = 0; i < results_length; i++) { + current = results_selectorNode[i]; + if (current.previousElementSibling !== previous && imgGroup.length > 0) { + // the current image is not connected to previous one + // so the current image is the start of a new group of images. + // so call _alignImgs to align the current group + this._alignImgs(imgGroup); + // and start a new empty group of images + imgGroup = []; + } + // add the current image to the group (only the img tag) + imgGroup.push(current.querySelector(this.img_selector)); + // update the previous variable + previous = current; + } + // align the remaining images + if (imgGroup.length > 0) { + this._alignImgs(imgGroup); + } + }; + + ImageLayout.prototype.watch = function () { + var i, img; + var obj = this; + var results_nodes = d.querySelectorAll(this.results_selector); + var results_length = results_nodes.length; + + function throttleAlign() { + if (obj.isAlignDone) { + obj.isAlignDone = false; + setTimeout(function () { + obj.align(); + obj.isAlignDone = true; + }, 100); + } + } + + w.addEventListener('pageshow', throttleAlign); + w.addEventListener('load', throttleAlign); + w.addEventListener('resize', throttleAlign); + + for (i = 0; i < results_length; i++) { + img = results_nodes[i].querySelector(this.img_selector); + if (img !== null && img !== undefined) { + img.addEventListener('load', throttleAlign); + img.addEventListener('error', throttleAlign); + } + } + }; + + w.searx.ImageLayout = ImageLayout; + +}(window, document)); diff --git a/searx/static/themes/simple/js/searx.min.js b/searx/static/themes/simple/js/searx.min.js index 3b2b9d762b59b542f98ffc87c2832adf9da58b44..17daac2a43f0a4e7b6320c41e3b2af40a9eaf682 100644 GIT binary patch delta 1256 zcmah|&x;&I6lP+;xCEmZLVlUuY0OZ)+g;r~JAr6#DWZV{)F`_ogk=+Ir{8qHq^D}A zuFhl~ng#LbAyD{-$X*07;MI#~Z#n4yVO7u0W(^BD_3QWJtNPye)!)B${(8}Qe)&{? z{g&vH-_+Y$s`yKOhxVv9{5=9f8^Rc2i>Z0DID5HLy48r*1FzJW6lz9mu zj(HAY$@gTfqoviALhH$iqbK!OY8ai6r;n>8bC!N~Nd`lIHmb!?qZBJZAkcvbFi=L) ztz}GgffXI|XSV_KLNhf_VD)*4xiJ6I0SPdD%GHWuaXONU2>TTqKuZw0E>f|!=FgD9 zwlMdj)s8YhM7?urjU`Q^K-WqT9hz=*{w+UJ=GTal7L2n6Kp>By^4H)_E2dY?kI_f5 z4H~4C-YbDlG1CQ8Yu@CUmoAdU{QmkdYkrC^URu<~T;(XXh8UgKFdPd8>MiIxI&NONf3 zTR(5^CLip#3CX4?GC8F==r81WQftUI9Vx>7wxMG7E*0Dnnn>65t&$T^dhZ@DYargl zo`WI}OBiX-50ZF3Rla#@-;F7!@v*s@amx=a_xo0e{!BBiYG`Fb zmZZ3GBwnwlQ*;IpHdU241QG}6r&cXzt4EfA^OY`$I1|*q+o&>sCd->5P<{$WLv}>7 z5icuf8r!4oneBW9dK13~B7(2EF6bDooBrol3*)D|3iy-8-0WXF{thOuejCgE^8@U)ofIY3`Qs*GcN~M aJKQ{faN%80N-781G>ygW-XP{+r}rOvb+8No delta 961 zcmZ8g&ubGw6ejAWqN1o2rP_4SbvM~;HuwYVWQu~IhhEgurcK%~CNJ5+=}efNwXJ25 zUOk9(ZvGKM>9J6}d+_YRi+_nTn{=z5mi_j7-+SNt-u^f){X8mtzImqc=wN26w!hrJ zHeatRNqMYf%7=u-bKMFlT|2Z0KBK>b}kTAS8O zE68a?NX0Y>H_7%3pu<>UItIFg(IJ1znEtx*U;#&g!D|>o27IXE%A`mRDMte#y>~>G zC6176o=}jiR{dRyp)K|KR;9%C!R)t|Sl5d%P}sTuH+}qJNsLZ#{c+Vbz7JMi?XA^ycg;6BF$!GeVY~!{Q>J37&HcK!0DKyI0hr|ESpfBaj7+DDtx`)pM_|UXYL&&rZO6l5BM^hKn#0&hc^?LpL*LQgHfGM5a%J@{fs{g8xh%_!VyWvL R>e}7e!=uILQ@Yx{^9R8&P?-P# diff --git a/searx/static/themes/simple/js/searx.min.js.map b/searx/static/themes/simple/js/searx.min.js.map index efce15142a535689188defe534e8afe7da4a77c3..6541da7b5e9c2ae299b3a26b0c63b7b70355553c 100644 GIT binary patch delta 8552 zcma)BTWo9DSylq0nKK>bblP&RGiT0(Idsm%spHtO6Dpv4ZSU;tv*YY+JGSF6GiP=j z$M^fTV_U7PKA=8SQ$Py|DB=ML0TLi8BK3v7@Pv>M6nKSJh^MK52P9Of55V{TYdeWg zqG~F2a`syP`mf)AS<8R?Ukktf-wWUQn^({O^tJZF%f&&jS8Dn4?$Xy^>GVp&YJ1Q> z|He{z;b;5)xN-iY+b{jh=dGq!F70~b_P}2bEuVRQv2y+&pZk*q`OmL@`9ZH-ZDF

FK~ zcFXswty0ful$ucJ>XP1Wb~4bW)W>SM5DQr_}Su zIj=E*q&t^l0@5_8EEisLe9v>wLEuYONsfV|H0DM{L)v`4`n+2 z#!}_koFBiMPAt{tm;O2(Uuw-Sy_AVBb>^3>%-WJazx0jFJBz+6|2*^Vtr$n%4V&@@ znFl9pE&-(waVglwI(vY;PhT-Nl!u`k>MQO7X22Cdkk}?gEu8_frM9yi*ESQmdZ?)B zVZp!)yYl^mHx^ecIXPIJZm@J?Wrtn8VnTvZ5yW(tskhXAmbUXXF$+ja)7;HHl3JkP zIGXw=h!~&~BhaF`8>$MRbetsJ+-uV0FJ!-DD!nIZW^3fc2DH*XYUot=8L=VgSpKI*-KgST9);BShFr~OU*4vDH!r`L*FUfRT?h@}^;33MPX2p-Iif^nuwpcH)Fho9r>adi#R8OM zRume__~BcN-IUB9zCBe;y}(JKE_jc`Asw=N4y@L^P#ga1QoV#FtXq}!b&i;-VJa*T z_UarVd$we2`UV9{vo<;6nTuG~6dvr!bQgS$ePU~`*~E~sd0ZB7V@d@pLLSlgfmW)~ z;|%}NIdx#I8C8JqP!#oj7U%CX&3cAZD^Uz0BC5`*wPGa&xmHvxF=6}}NiK`F{Ix=C zakwY{s<8USDtT1n3T(6I6wKV=9!HqCcJ#rXynS@X>}3eCNMQb5aIz`bWsMh(5M0s2IOem&NY+#hYpOr3prUaClmGNB z3Z$WOo4xFw(rKp}h~wBat}wZ$IrCgvOzBkRAO3218hijAV8V4ZBCei(@i4+b(v-$J z@Mrgu?EfLVAiqxdg!Kwdc~n$i=`!GI%IRq`O-uMjNV@O8IYn~<&ulw&VINRJM@Q=D z_{z~96SYK)omm#j{}nN!0%<*CRWb~biE8p!4-@~Eh|B{fCI9pN&rTI$^W|&mGXgux z>Y;-CtXenWYZQo^^O4Ub6hzUrV4xk|Rr!y^-%wS(xknprNPkJwbCIn4`Uj8RJX7ic ziPU2nl;bIMF-p~DMt<*uFHIASISy7(wIiy^uJIo?Zm1Zjh@hH5hJ|KF{04kBf4K-0 zx54{^I{Tu>I!;{$G+eAr5)=wOP+A4G_333kHV z@geFZ&8!%4+5G6?EsUU$m>F2|H$VE~Q=cl3R)|pzF(+4xHfv*{Cxc&Mn3ezb(c|}H zRD<+mVqmcq#b}B<_&TdlWUb*|qmg7s;v7e@n^f({K_}Jg+;_7+bzGR+M02Z&ep-Iu z-F@4jf|dfpvBaIMEV3jr=)aY;{B3Xb;R$6kkA zUp@YcsO1=2^<2;m(2Kcw1!G^nGq-P2T!OfAsV;?c@~z^%H-hsvDd%4qPR>LvPXvqg z-1%1V$->lUl%@Jq*kB6`a>`_c=8g_n6Lv|Pt5^yxobv`b2tPZ+ZKj}sK}+>18>kH8 zEan;Fz}DJ6O-Ndy&(NkX%4^!U;1c<-C%30vRV*&IW+ufL%k0yWOSrMB&W0M6&>dNE zWQnRUCI&Ak=c*06#jQ3&D!QAT#bvQY6NBc~Q*<;FlJ!#RPIT@Rj~w*q(SxMcr&6Tk)TGu!Y^)eOapTjLaVJdv?gz7>|jr4>g|FV*OeT@ruRW$PK`g%^@ zt3JBbyZHK*xv$f?uaB$u@8H5tZcxclNOe^UR-!eY&pE6tNk`zVMNC5YAGI+W@ju|J7rhPTf|sL!}i ziHEVew$oFz0fT`sKyD<2e#4Md_KW386xQbH&X}$*2%*M?KGRy29_|;Y(Wvhfk}d%_q@n&^0LvFuW?GzN8FRC( zl4jQQQ4S7yPk!8f`xQ2_I69KwZNIg}SDdVBIh~C1546M$hl*R5W-?rxDVw^Nm+yiLPC^ zZ}jvyy;f-XuDUX+TU$lJa^+B_d+#kA$*=Y9Kj2P=Cp9Dqp47-C3UDn)ey4Zu6&7Hk z+kU@yXUb~fgQGpGFnP_ci7q{N=o*LBoD}F?0}m4_lfXGDs_Y-9<*-R)_iH9J2HpaFRUYp~v#%G&?kZ1bIkw>mhHC2%y#d9%6RVJa*sBEwwV&q-}a{#qYHnS^` z=@6}Yo^@7`-|eS=UM2LJN4dv$)}e?f5$hhotyIg&6+d>HKRkXds_A%lZ24=iJ2czS zizKQbo+MEP|H6Oc6&g{^0|eacJX%t(G%m-zd?5eNe=wyP!J3HR5n|rhbv72yq?8m% z_PE0?LR=_1P0o-!xzPs(Qn6ULL7KeB*j z=aG5YY95p=6IV-JJ2TCWM+e;!@0~Ie{mWPWr)!>iyU6nNhbK00RVmbDj}|sL)!Hba zu&=KE6!`;B4ImC18(wHiR-Ac^06gD-6hkM#Ny}r8Qvl$g<&l`EWq^zT#fu$68PNh| zG?eh-NmQ-HJPKHW*J=X7h%oL^f1(Mz*b^;%O3D>F1r9CrpfbrOUs1HBrdV(VtqHEs zh97;bFhh$5gWyu4Zi`p1NYECi984SJ&MS~;=)~zRVyT)B41rUQ@gKZId-4yq-<{Sd zRGPh_r08rmR|mWtB3E=2GmQ4T0U2lkZ<4af2V5o%BxfdSVuqin=uRlD%~}%o-z)ZS zvgvuYe>Y@I!HQo1YRUnXV5Jv_}x39bd37W;^H`gp=s;Rd}%o5*N|cML!Tw-r?A6yg&>GT0|Yy83Z1;5eub- znuSt6p(y^P9$uI_gc_R0*Sly+lYp|g}R>VO9_LNtY? zlU!#Cm-9ChT**lUJd9M1h-pkQt&tqfMtV`;)mx>*4?%E0L|Fy8QhvhN=Ew4C;+n6Apq(8OO(|ua&aAq)(HtWR5h=PXUrYNol00x zTk8zXDu!rKc17(F@tRHhO`c0Q%hm4=6;5@Us8#H&I={VBu{4;%o+!U_9}0fq=rgp- z!Y^I~u%!>U7-Tp3d{^{}6gRy8QB2gHTL@l|+kCAouqnWV+_Ud4#*by$eshW|68US) zHnIl5)!8J3_chz*yo}W^H zG|Ojj%(bT)mz@+Ih2W|jQ^jX)_$e_7GJO^kbv@}&NHF*?4!ehh3H5Wu)>Jt=&KEz1 zSWBoO(o$=L5~enC)I{(u~8KxM(s2ChUq?#*;cXVubs>mcsQIB*hUyL^B8K2M`YO z6hHpZ+)H>R;5fwH<;>vQmy1~qO@Z!U7zbb!}Ukk`p*p9VaNw1dHd|%{{wi)dCmX; delta 8092 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 SUoQ5>kDImD<9dJP*Z&u(GwzE3 diff --git a/searx/static/themes/simple/js/searx_src/searx_results.js b/searx/static/themes/simple/js/searx_src/searx_results.js index b13da8391..fe00efc90 100644 --- a/searx/static/themes/simple/js/searx_src/searx_results.js +++ b/searx/static/themes/simple/js/searx_src/searx_results.js @@ -18,7 +18,7 @@ 'use strict'; searx.ready(function() { - searx.image_thumbnail_layout = new searx.ImageLayout('#urls', '#urls .result-images', 'img.image_thumbnail', 200); + searx.image_thumbnail_layout = new searx.ImageLayout('#urls', '#urls .result-images', 'img.image_thumbnail', 10, 200); searx.image_thumbnail_layout.watch(); searx.on('.btn-collapse', 'click', function(event) { diff --git a/searx/templates/oscar/base.html b/searx/templates/oscar/base.html index b5c6ed258..6134bd725 100644 --- a/searx/templates/oscar/base.html +++ b/searx/templates/oscar/base.html @@ -1,6 +1,6 @@ {% from 'oscar/macros.html' import icon %} - +