forked from zaclys/searxng
commit
952473d297
1
Makefile
1
Makefile
|
@ -51,6 +51,7 @@ styles:
|
||||||
@lessc -x searx/static/themes/courgette/less/style-rtl.less > searx/static/themes/courgette/css/style-rtl.css
|
@lessc -x searx/static/themes/courgette/less/style-rtl.less > searx/static/themes/courgette/css/style-rtl.css
|
||||||
@lessc -x searx/static/less/bootstrap/bootstrap.less > searx/static/css/bootstrap.min.css
|
@lessc -x searx/static/less/bootstrap/bootstrap.less > searx/static/css/bootstrap.min.css
|
||||||
@lessc -x searx/static/themes/oscar/less/oscar/oscar.less > searx/static/themes/oscar/css/oscar.min.css
|
@lessc -x searx/static/themes/oscar/less/oscar/oscar.less > searx/static/themes/oscar/css/oscar.min.css
|
||||||
|
@lessc -x searx/static/themes/pix-art/less/style.less > searx/static/themes/pix-art/css/style.css
|
||||||
|
|
||||||
grunt:
|
grunt:
|
||||||
@grunt --gruntfile searx/static/themes/oscar/gruntfile.js
|
@grunt --gruntfile searx/static/themes/oscar/gruntfile.js
|
||||||
|
|
File diff suppressed because one or more lines are too long
Binary file not shown.
After Width: | Height: | Size: 3.0 KiB |
Binary file not shown.
After Width: | Height: | Size: 242 B |
Binary file not shown.
After Width: | Height: | Size: 204 B |
Binary file not shown.
After Width: | Height: | Size: 238 B |
Binary file not shown.
After Width: | Height: | Size: 439 B |
|
@ -0,0 +1,141 @@
|
||||||
|
if(searx.autocompleter) {
|
||||||
|
window.addEvent('domready', function() {
|
||||||
|
new Autocompleter.Request.JSON('q', '/autocompleter', {
|
||||||
|
postVar:'q',
|
||||||
|
postData:{
|
||||||
|
'format': 'json'
|
||||||
|
},
|
||||||
|
ajaxOptions:{
|
||||||
|
timeout: 5 // Correct option?
|
||||||
|
},
|
||||||
|
'minLength': 4,
|
||||||
|
'selectMode': false,
|
||||||
|
cache: true,
|
||||||
|
delay: 300
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
(function (w, d) {
|
||||||
|
'use strict';
|
||||||
|
function addListener(el, type, fn) {
|
||||||
|
if (el.addEventListener) {
|
||||||
|
el.addEventListener(type, fn, false);
|
||||||
|
} else {
|
||||||
|
el.attachEvent('on' + type, fn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function placeCursorAtEnd() {
|
||||||
|
if (this.setSelectionRange) {
|
||||||
|
var len = this.value.length * 2;
|
||||||
|
this.setSelectionRange(len, len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
addListener(w, 'load', function () {
|
||||||
|
var qinput = d.getElementById('q');
|
||||||
|
if (qinput !== null && qinput.value === "") {
|
||||||
|
addListener(qinput, 'focus', placeCursorAtEnd);
|
||||||
|
qinput.focus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!!('ontouchstart' in window)) {
|
||||||
|
document.getElementsByTagName("html")[0].className += " touch";
|
||||||
|
}
|
||||||
|
|
||||||
|
})(window, document);
|
||||||
|
|
||||||
|
var xmlHttp
|
||||||
|
|
||||||
|
function GetXmlHttpObject(){
|
||||||
|
|
||||||
|
var xmlHttp = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Firefox, Opera 8.0+, Safari
|
||||||
|
xmlHttp = new XMLHttpRequest();
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
// Internet Explorer
|
||||||
|
try {
|
||||||
|
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
|
||||||
|
}
|
||||||
|
catch (e){
|
||||||
|
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return xmlHttp;
|
||||||
|
}
|
||||||
|
|
||||||
|
var timer;
|
||||||
|
|
||||||
|
// Load more results
|
||||||
|
function load_more(query,page){
|
||||||
|
|
||||||
|
xmlHttp = GetXmlHttpObject();
|
||||||
|
clearTimeout(timer);
|
||||||
|
|
||||||
|
if(xmlHttp == null){
|
||||||
|
alert ("Your browser does not support AJAX!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
favicons[page] = [];
|
||||||
|
|
||||||
|
xmlHttp.onreadystatechange = function(){
|
||||||
|
|
||||||
|
var loader = document.getElementById('load_more');
|
||||||
|
|
||||||
|
// If 4, response OK
|
||||||
|
if (xmlHttp.readyState == 4){
|
||||||
|
|
||||||
|
var res = xmlHttp.responseText;
|
||||||
|
|
||||||
|
clearTimeout(timer);
|
||||||
|
timer = setTimeout(function(){},6000);
|
||||||
|
|
||||||
|
var results = document.getElementById('results_list');
|
||||||
|
|
||||||
|
var newNode = document.createElement('span');
|
||||||
|
newNode.innerHTML = res;
|
||||||
|
results_list.appendChild(newNode);
|
||||||
|
|
||||||
|
var scripts = newNode.getElementsByTagName('script');
|
||||||
|
for (var ix = 0; ix < scripts.length; ix++) {
|
||||||
|
eval(scripts[ix].text);
|
||||||
|
}
|
||||||
|
|
||||||
|
load_images(page);
|
||||||
|
document.getElementById("load_more").onclick = function() { load_more(query, (page+1)); }
|
||||||
|
loader.removeAttribute("disabled");
|
||||||
|
|
||||||
|
} else {
|
||||||
|
loader.disabled = 'disabled';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var url = "/";
|
||||||
|
var params = "q="+query+"&pageno="+page+"&category_general=1&category_files=1&category_images=1&category_it=1&category_map=1&category_music=1&category_news=1&category_social+media=1&category_videos=1";
|
||||||
|
xmlHttp.open("POST",url,true);
|
||||||
|
xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
|
||||||
|
xmlHttp.setRequestHeader("Content-length", params.length);
|
||||||
|
xmlHttp.setRequestHeader("Connection", "close");
|
||||||
|
xmlHttp.send(params);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load the images on the canvas in the page
|
||||||
|
function load_images(page){
|
||||||
|
var arrayLength = favicons[page].length;
|
||||||
|
for (var i = 1; i < arrayLength+1; i++) {
|
||||||
|
var img = new Image();
|
||||||
|
img.setAttribute("i",i)
|
||||||
|
img.onload = function () {
|
||||||
|
var id = 'canvas-'+page+'-'+this.getAttribute("i");
|
||||||
|
var can = document.getElementById(id);
|
||||||
|
var ctx = can.getContext("2d");
|
||||||
|
ctx.drawImage(this, 0, 0, 16, 16);
|
||||||
|
};
|
||||||
|
img.src = favicons[page][i];
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,119 @@
|
||||||
|
/*
|
||||||
|
* searx, A privacy-respecting, hackable metasearch engine
|
||||||
|
*
|
||||||
|
* To change the colors of the site, simple edit this variables
|
||||||
|
*/
|
||||||
|
|
||||||
|
/// Basic Colors
|
||||||
|
|
||||||
|
@color-base: #3498DB;
|
||||||
|
@color-base-dark: #2980B9;
|
||||||
|
@color-base-light: #ECF0F1;
|
||||||
|
@color-highlight: #094089;
|
||||||
|
@color-black: #000000;
|
||||||
|
|
||||||
|
/// General
|
||||||
|
|
||||||
|
@color-font: #444;
|
||||||
|
@color-font-light: #888;
|
||||||
|
|
||||||
|
@color-red: #C0392B;
|
||||||
|
|
||||||
|
@color-url-font: #1a11be;
|
||||||
|
@color-url-visited-font: #8E44AD;
|
||||||
|
@results-width: 50em;
|
||||||
|
|
||||||
|
|
||||||
|
/// Start-Screen
|
||||||
|
|
||||||
|
// hmarg
|
||||||
|
@color-hmarg-border: @color-base;
|
||||||
|
@color-hmarg-font: @color-base;
|
||||||
|
@color-hmarg-font-hover: @color-base;
|
||||||
|
|
||||||
|
|
||||||
|
/// Search-Input
|
||||||
|
|
||||||
|
@color-search-border: @color-base;
|
||||||
|
@color-search-background: #FFF;
|
||||||
|
@color-search-font: #222;
|
||||||
|
|
||||||
|
/// Autocompleter
|
||||||
|
|
||||||
|
@color-autocompleter-choices-background: #FFF;
|
||||||
|
@color-autocompleter-choices-border: @color-base;
|
||||||
|
@color-autocompleter-choices-border-left-right: @color-base;
|
||||||
|
@color-autocompleter-choices-border-bottom: @color-base;
|
||||||
|
|
||||||
|
@color-autocompleter-choices-font: #444;
|
||||||
|
|
||||||
|
/// Answers
|
||||||
|
@color-answers-border: @color-base-dark;
|
||||||
|
|
||||||
|
// Selected
|
||||||
|
@color-autocompleter-selected-background: #444;
|
||||||
|
@color-autocompleter-selected-font: #FFF;
|
||||||
|
@color-autocompleter-selected-queried-font: #9FCFFF;
|
||||||
|
|
||||||
|
/// Categories
|
||||||
|
|
||||||
|
@color-categories-item-selected: @color-base;
|
||||||
|
@color-categories-item-selected-font: #FFF;
|
||||||
|
|
||||||
|
@color-categories-item-border-selected: @color-base-dark;
|
||||||
|
@color-categories-item-border-unselected: #E8E7E6;
|
||||||
|
@color-categories-item-border-unselected-hover: @color-base;
|
||||||
|
|
||||||
|
|
||||||
|
/// Results
|
||||||
|
|
||||||
|
@color-suggestions-button-background: @color-base;
|
||||||
|
@color-suggestions-button-font: #FFF;
|
||||||
|
|
||||||
|
@color-download-button-background: @color-base;
|
||||||
|
@color-download-button-font: #FFF;
|
||||||
|
|
||||||
|
@color-result-search-background: @color-base-light;
|
||||||
|
|
||||||
|
@color-result-definition-border: gray;
|
||||||
|
@color-result-torrent-border: lightgray;
|
||||||
|
@color-result-top-border: #E8E7E6;
|
||||||
|
|
||||||
|
// Link to result
|
||||||
|
@color-result-link-font: @color-base-dark;
|
||||||
|
@color-result-link-visited-font: @color-url-visited-font;
|
||||||
|
|
||||||
|
// Url to result
|
||||||
|
@color-result-url-font: @color-red;
|
||||||
|
|
||||||
|
// Publish Date
|
||||||
|
@color-result-publishdate-font: @color-font-light;
|
||||||
|
|
||||||
|
// Images
|
||||||
|
@color-result-image-span-background-hover: rgba(0, 0, 0, 0.6);
|
||||||
|
@color-result-image-span-font: #FFF;
|
||||||
|
|
||||||
|
// Search-URL
|
||||||
|
@color-result-search-url-border: #888;
|
||||||
|
@color-result-search-url-font: #444;
|
||||||
|
|
||||||
|
|
||||||
|
/// Settings
|
||||||
|
|
||||||
|
@color-settings-fieldset: @color-base;
|
||||||
|
@color-settings-tr-hover: #DDD;
|
||||||
|
|
||||||
|
// Labels
|
||||||
|
@color-settings-label-allowed-background: #E74C3C;
|
||||||
|
@color-settings-label-allowed-font: #FFF;
|
||||||
|
|
||||||
|
@color-settings-label-deny-background: #2ECC71;
|
||||||
|
@color-settings-label-deny-font: @color-font;
|
||||||
|
|
||||||
|
@color-settings-return-background: @color-base;
|
||||||
|
@color-settings-return-font: #FFF;
|
||||||
|
|
||||||
|
/// Other
|
||||||
|
|
||||||
|
@color-engines-font: @color-font-light;
|
||||||
|
@color-percentage-div-background: #444;
|
|
@ -0,0 +1,27 @@
|
||||||
|
/*
|
||||||
|
* searx, A privacy-respecting, hackable metasearch engine
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Mixins
|
||||||
|
|
||||||
|
.text-size-adjust (@property: 100%) {
|
||||||
|
-webkit-text-size-adjust: @property;
|
||||||
|
-ms-text-size-adjust: @property;
|
||||||
|
-moz-text-size-adjust: @property;
|
||||||
|
text-size-adjust: @property;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rounded-corners (@radius: 4px) {
|
||||||
|
-webkit-border-radius: @radius;
|
||||||
|
-moz-border-radius: @radius;
|
||||||
|
border-radius: @radius;
|
||||||
|
}
|
||||||
|
|
||||||
|
.user-select () {
|
||||||
|
-webkit-touch-callout: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-khtml-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
}
|
|
@ -0,0 +1,57 @@
|
||||||
|
/*
|
||||||
|
* searx, A privacy-respecting, hackable metasearch engine
|
||||||
|
*/
|
||||||
|
|
||||||
|
.search {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#search_wrapper {
|
||||||
|
position: relative;
|
||||||
|
width: @results-width;
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.center #search_wrapper {
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.q {
|
||||||
|
background: none repeat scroll 0 0 @color-search-background;
|
||||||
|
border: 1px solid @color-search-border;
|
||||||
|
color: @color-search-font;
|
||||||
|
font-size: 16px;
|
||||||
|
font-family: "Courier New", Courier, monospace;
|
||||||
|
height: 28px;
|
||||||
|
margin: 0;
|
||||||
|
outline: medium none;
|
||||||
|
padding: 2px;
|
||||||
|
padding-left: 8px;
|
||||||
|
padding-right: 0px !important;
|
||||||
|
width: 100%;
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
#search_submit {
|
||||||
|
position: absolute;
|
||||||
|
top: 15px;
|
||||||
|
right: 5px;
|
||||||
|
padding: 0;
|
||||||
|
border: 0;
|
||||||
|
background: url('../img/search-icon-pixel.png') no-repeat;
|
||||||
|
background-size: 24px 24px;
|
||||||
|
opacity: 0.8;
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
font-size: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: @results-width) {
|
||||||
|
#search_wrapper {
|
||||||
|
width: 90%;
|
||||||
|
clear:both;
|
||||||
|
overflow: hidden
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,451 @@
|
||||||
|
/*
|
||||||
|
* searx, A privacy-respecting, hackable metasearch engine
|
||||||
|
*
|
||||||
|
* To convert "style.less" to "style.css" run: $make styles
|
||||||
|
*/
|
||||||
|
|
||||||
|
@import "definitions.less";
|
||||||
|
|
||||||
|
@import "mixins.less";
|
||||||
|
|
||||||
|
|
||||||
|
// Main LESS-Code
|
||||||
|
|
||||||
|
html {
|
||||||
|
font-family: "Courier New", Courier, monospace;
|
||||||
|
font-size: 0.9em;
|
||||||
|
.text-size-adjust;
|
||||||
|
color: @color-font;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
body, #container {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
canvas {
|
||||||
|
image-rendering: optimizeSpeed;
|
||||||
|
image-rendering: -moz-crisp-edges;
|
||||||
|
image-rendering: -webkit-optimize-contrast;
|
||||||
|
image-rendering: optimize-contrast;
|
||||||
|
image-rendering: pixelated;
|
||||||
|
-ms-interpolation-mode: nearest-neighbor;
|
||||||
|
width:32px;
|
||||||
|
height:32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#container {
|
||||||
|
width: 100%;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Search-Field
|
||||||
|
|
||||||
|
@import "search.less";
|
||||||
|
|
||||||
|
.row {
|
||||||
|
max-width: 800px;
|
||||||
|
margin: 20px auto;
|
||||||
|
text-align: justify;
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 3em;
|
||||||
|
margin-top: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
padding: 0 10px;
|
||||||
|
max-width: 700px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h3,ul {
|
||||||
|
margin: 4px 8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.hmarg {
|
||||||
|
margin: 0 20px;
|
||||||
|
border: 1px solid @color-hmarg-border;
|
||||||
|
padding: 4px 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
&:link.hmarg {
|
||||||
|
color: @color-hmarg-font;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:visited.hmarg {
|
||||||
|
color: @color-hmarg-font;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active.hmarg {
|
||||||
|
color: @color-hmarg-font-hover;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover.hmarg {
|
||||||
|
color: @color-hmarg-font-hover;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.top_margin {
|
||||||
|
margin-top: 60px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.center {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.title {
|
||||||
|
background: url('../img/searx-pixel.png') no-repeat;
|
||||||
|
width: 100%;
|
||||||
|
min-height: 80px;
|
||||||
|
background-position: center;
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="button"],
|
||||||
|
input[type="submit"] {
|
||||||
|
font-family: "Courier New", Courier, monospace;
|
||||||
|
padding: 4px 12px;
|
||||||
|
margin: 2px 4px;
|
||||||
|
display: inline-block;
|
||||||
|
background: @color-download-button-background;
|
||||||
|
color: @color-download-button-font;
|
||||||
|
.rounded-corners;
|
||||||
|
border: 0;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="button"]:disabled {
|
||||||
|
cursor: progress;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="checkbox"] {
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
fieldset {
|
||||||
|
margin: 8px;
|
||||||
|
border: 1px solid @color-settings-fieldset;
|
||||||
|
}
|
||||||
|
|
||||||
|
#logo {
|
||||||
|
position: absolute;
|
||||||
|
top: 13px;
|
||||||
|
left: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#categories {
|
||||||
|
margin: 0 10px;
|
||||||
|
.user-select;
|
||||||
|
}
|
||||||
|
|
||||||
|
.checkbox_container {
|
||||||
|
display: inline-block;
|
||||||
|
position: relative;
|
||||||
|
margin: 0 3px;
|
||||||
|
padding: 0px;
|
||||||
|
|
||||||
|
input {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.checkbox_container label, .engine_checkbox label {
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 4px 10px;
|
||||||
|
margin: 0;
|
||||||
|
display: block;
|
||||||
|
text-transform: capitalize;
|
||||||
|
.user-select;
|
||||||
|
}
|
||||||
|
|
||||||
|
.checkbox_container input[type="checkbox"]:checked + label {
|
||||||
|
background: @color-categories-item-selected;
|
||||||
|
color: @color-categories-item-selected-font;
|
||||||
|
}
|
||||||
|
|
||||||
|
.engine_checkbox {
|
||||||
|
padding: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
label {
|
||||||
|
&.allow {
|
||||||
|
background: @color-settings-label-allowed-background;
|
||||||
|
padding: 4px 8px;
|
||||||
|
color: @color-settings-label-allowed-font;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.deny {
|
||||||
|
background: @color-settings-label-deny-background;
|
||||||
|
padding: 4px 8px;
|
||||||
|
color: @color-settings-label-deny-font;
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.engine_checkbox input[type="checkbox"]:checked + label {
|
||||||
|
&:nth-child(2) + label {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.allow {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
text-decoration: none;
|
||||||
|
color: @color-url-font;
|
||||||
|
|
||||||
|
&:visited {
|
||||||
|
color: @color-url-visited-font;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.engines {
|
||||||
|
color: @color-engines-font;
|
||||||
|
}
|
||||||
|
|
||||||
|
.small_font {
|
||||||
|
font-size: 0.8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.small p {
|
||||||
|
margin: 2px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.right {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.invisible {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.left {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlight {
|
||||||
|
color: @color-highlight;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content .highlight {
|
||||||
|
color: @color-black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.percentage {
|
||||||
|
position: relative;
|
||||||
|
width: 300px;
|
||||||
|
|
||||||
|
div {
|
||||||
|
background: @color-percentage-div-background;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
td {
|
||||||
|
padding: 0 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
tr {
|
||||||
|
&:hover {
|
||||||
|
background: @color-settings-tr-hover;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#results {
|
||||||
|
margin: auto;
|
||||||
|
padding: 0;
|
||||||
|
width: @results-width;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#search_url {
|
||||||
|
margin-top: 8px;
|
||||||
|
|
||||||
|
input {
|
||||||
|
border: 1px solid @color-result-search-url-border;
|
||||||
|
padding: 4px;
|
||||||
|
color: @color-result-search-url-font;
|
||||||
|
width: 14em;
|
||||||
|
display: block;
|
||||||
|
margin: 4px;
|
||||||
|
font-size: 0.8em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#preferences {
|
||||||
|
top: 10px;
|
||||||
|
padding: 0;
|
||||||
|
border: 0;
|
||||||
|
background: url('../img/preference-icon-pixel.png') no-repeat;
|
||||||
|
background-size: 28px 28px;
|
||||||
|
opacity: 0.8;
|
||||||
|
width: 28px;
|
||||||
|
height: 30px;
|
||||||
|
display: block;
|
||||||
|
|
||||||
|
* {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#pagination {
|
||||||
|
clear: both;
|
||||||
|
text-align: center;
|
||||||
|
br {
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#apis {
|
||||||
|
margin-top: 8px;
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
|
||||||
|
#categories_container {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: @results-width) {
|
||||||
|
|
||||||
|
#results {
|
||||||
|
margin: auto;
|
||||||
|
padding: 0;
|
||||||
|
width: 90%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.checkbox_container {
|
||||||
|
display: block;
|
||||||
|
width: 90%;
|
||||||
|
//float: left;
|
||||||
|
|
||||||
|
label {
|
||||||
|
border-bottom: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.preferences_container {
|
||||||
|
display: none;
|
||||||
|
postion: fixed !important;
|
||||||
|
top: 100px;
|
||||||
|
right: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 75em) {
|
||||||
|
|
||||||
|
div.title {
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
html.touch #categories {
|
||||||
|
width: 95%;
|
||||||
|
height: 30px;
|
||||||
|
text-align: left;
|
||||||
|
overflow-x: scroll;
|
||||||
|
overflow-y: hidden;
|
||||||
|
-webkit-overflow-scrolling: touch;
|
||||||
|
|
||||||
|
#categories_container {
|
||||||
|
width: 1000px;
|
||||||
|
width: -moz-max-content;
|
||||||
|
width: -webkit-max-content;
|
||||||
|
width: max-content;
|
||||||
|
|
||||||
|
.checkbox_container {
|
||||||
|
display: inline-block;
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#categories {
|
||||||
|
font-size: 90%;
|
||||||
|
clear: both;
|
||||||
|
|
||||||
|
.checkbox_container {
|
||||||
|
margin-top: 2px;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#categories {
|
||||||
|
font-size: 90%;
|
||||||
|
clear: both;
|
||||||
|
|
||||||
|
.checkbox_container {
|
||||||
|
margin-top: 2px;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#apis {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#search_url {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#logo {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.favicon {
|
||||||
|
float: left;
|
||||||
|
margin-right: 4px;
|
||||||
|
margin-top: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.preferences_back {
|
||||||
|
background: none repeat scroll 0 0 @color-settings-return-background;
|
||||||
|
border: 0 none;
|
||||||
|
.rounded-corners;
|
||||||
|
cursor: pointer;
|
||||||
|
display: inline-block;
|
||||||
|
margin: 2px 4px;
|
||||||
|
padding: 4px 6px;
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: @color-settings-return-font;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.hidden {
|
||||||
|
opacity: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
font-size: 0.8em;
|
||||||
|
position: absolute;
|
||||||
|
bottom: -20px;
|
||||||
|
width: 100%;
|
||||||
|
text-position: center;
|
||||||
|
background: white;
|
||||||
|
transition: opacity 1s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
#categories_container:hover .hidden {
|
||||||
|
transition: opacity 1s ease;
|
||||||
|
opacity: 0.8;
|
||||||
|
}
|
|
@ -0,0 +1,65 @@
|
||||||
|
{% extends 'pix-art/base.html' %}
|
||||||
|
{% block content %}
|
||||||
|
<div class="row"{% if rtl %} dir="ltr"{% endif %}>
|
||||||
|
<h1>About <a href="{{ url_for('index') }}">searx</a></h1>
|
||||||
|
|
||||||
|
<p>Searx is a <a href="https://en.wikipedia.org/wiki/Metasearch_engine">metasearch engine</a>, aggregating the results of other <a href="{{ url_for('preferences') }}">search engines</a> while not storing information about its users.
|
||||||
|
</p>
|
||||||
|
<h2>Why use Searx?</h2>
|
||||||
|
<ul>
|
||||||
|
<li>Searx may not offer you as personalised results as Google, but it doesn't generate a profile about you</li>
|
||||||
|
<li>Searx doesn't care about what you search for, never shares anything with a third party, and it can't be used to compromise you</li>
|
||||||
|
<li>Searx is free software, the code is 100% open and you can help to make it better. See more on <a href="https://github.com/asciimoo/searx">github</a></li>
|
||||||
|
</ul>
|
||||||
|
<p>If you do care about privacy, want to be a conscious user, or otherwise believe
|
||||||
|
in digital freedom, make Searx your default search engine or run it on your own server</p>
|
||||||
|
|
||||||
|
<h2>Technical details - How does it work?</h2>
|
||||||
|
|
||||||
|
<p>Searx is a <a href="https://en.wikipedia.org/wiki/Metasearch_engine">metasearch engine</a>,
|
||||||
|
inspired by the <a href="http://seeks-project.info/">seeks project</a>.<br />
|
||||||
|
It provides basic privacy by mixing your queries with searches on other platforms without storing search data. Queries are made using a POST request on every browser (except chrome*). Therefore they show up in neither our logs, nor your url history. In case of Chrome* users there is an exception, if Searx used from the search bar it performs GET requests.<br />
|
||||||
|
Searx can be added to your browser's search bar; moreover, it can be set as the default search engine.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>How can I make it my own?</h2>
|
||||||
|
|
||||||
|
<p>Searx appreciates your concern regarding logs, so take the <a href="https://github.com/asciimoo/searx">code</a> and run it yourself! <br />Add your Searx to this <a href="https://github.com/asciimoo/searx/wiki/Searx-instances">list</a> to help other people reclaim their privacy and make the Internet freer!
|
||||||
|
<br />The more decentralized Internet is the more freedom we have!</p>
|
||||||
|
|
||||||
|
|
||||||
|
<h2>More about searx</h2>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li><a href="https://github.com/asciimoo/searx">github</a></li>
|
||||||
|
<li><a href="https://www.ohloh.net/p/searx/">ohloh</a></li>
|
||||||
|
<li><a href="https://twitter.com/Searx_engine">twitter</a></li>
|
||||||
|
<li>IRC: #searx @ freenode (<a href="https://kiwiirc.com/client/irc.freenode.com/searx">webclient</a>)</li>
|
||||||
|
<li><a href="https://www.transifex.com/projects/p/searx/">transifex</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
|
<hr />
|
||||||
|
|
||||||
|
<h2 id="faq">FAQ</h2>
|
||||||
|
|
||||||
|
<h3>How to add to firefox?</h3>
|
||||||
|
<p><a href="#" onclick="window.external.AddSearchProvider(window.location.protocol + '//' + window.location.host + '{{ url_for('opensearch') }}');">Install</a> searx as a search engine on any version of Firefox! (javascript required)</p>
|
||||||
|
|
||||||
|
<h2 id="dev_faq">Developer FAQ</h2>
|
||||||
|
|
||||||
|
<h3>New engines?</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Edit your <a href="https://raw.github.com/asciimoo/searx/master/searx/settings.yml">settings.yml</a></li>
|
||||||
|
<li>Create your custom engine module, check the <a href="https://github.com/asciimoo/searx/blob/master/examples/basic_engine.py">example engine</a></li>
|
||||||
|
</ul>
|
||||||
|
<p>Don't forget to restart searx after config edit!</p>
|
||||||
|
|
||||||
|
<h3>Installation/WSGI support?</h3>
|
||||||
|
<p>See the <a href="https://github.com/asciimoo/searx/wiki/Installation">installation and setup</a> wiki page</p>
|
||||||
|
|
||||||
|
<h3>How to debug engines?</h3>
|
||||||
|
<p><a href="{{ url_for('stats') }}">Stats page</a> contains some useful data about the engines used.</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
|
@ -0,0 +1,34 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"{% if rtl %} dir="rtl"{% endif %}>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="description" content="Searx - a privacy-respecting, hackable metasearch engine" />
|
||||||
|
<meta name="keywords" content="searx, search, search engine, metasearch, meta search" />
|
||||||
|
<meta name="generator" content="searx/{{ searx_version }}">
|
||||||
|
<meta name="viewport" content="width=device-width, maximum-scale=1.0, user-scalable=1" />
|
||||||
|
<title>{% block title %}{% endblock %}searx</title>
|
||||||
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}" type="text/css" media="screen" />
|
||||||
|
<link rel="shortcut icon" href="{{ url_for('static', filename='img/favicon.png') }}?v=2" />
|
||||||
|
{% block styles %}
|
||||||
|
{% endblock %}
|
||||||
|
{% block meta %}{% endblock %}
|
||||||
|
{% block head %}
|
||||||
|
{% endblock %}
|
||||||
|
<script type="text/javascript">
|
||||||
|
var favicons = [[]];
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="container">
|
||||||
|
{% block content %}
|
||||||
|
{% endblock %}
|
||||||
|
<script type="text/javascript">
|
||||||
|
searx = {};
|
||||||
|
</script>
|
||||||
|
<script src="{{ url_for('static', filename='js/searx.js') }}" ></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
load_images(1);
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,12 @@
|
||||||
|
{% extends "pix-art/base.html" %}
|
||||||
|
{% block content %}
|
||||||
|
<div class="center">
|
||||||
|
<div class="title"><h1><img src="{{ url_for('static', filename='img/searx-pixel.png') }}" alt="Searx Logo"/></h1></div>
|
||||||
|
{% include 'pix-art/search.html' %}
|
||||||
|
<p class="top_margin">
|
||||||
|
<a href="{{ url_for('about') }}" class="hmarg">{{ _('about') }}</a>
|
||||||
|
<a href="{{ url_for('preferences') }}" class="hmarg">{{ _('preferences') }}</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
|
|
@ -0,0 +1,82 @@
|
||||||
|
{% extends "default/base.html" %}
|
||||||
|
{% block head %} {% endblock %}
|
||||||
|
{% block content %}
|
||||||
|
<div class="row">
|
||||||
|
<h2>{{ _('Preferences') }}</h2>
|
||||||
|
|
||||||
|
<form method="post" action="{{ url_for('preferences') }}" id="search_form">
|
||||||
|
<fieldset>
|
||||||
|
<legend>{{ _('Search language') }}</legend>
|
||||||
|
<p>
|
||||||
|
<select name='language'>
|
||||||
|
<option value="all" {% if current_language == 'all' %}selected="selected"{% endif %}>{{ _('Automatic') }}</option>
|
||||||
|
{% for lang_id,lang_name,country_name in language_codes | sort(attribute=1) %}
|
||||||
|
<option value="{{ lang_id }}" {% if lang_id == current_language %}selected="selected"{% endif %}>{{ lang_name }} ({{ country_name }}) - {{ lang_id }}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
</p>
|
||||||
|
</fieldset>
|
||||||
|
<fieldset>
|
||||||
|
<legend>{{ _('Interface language') }}</legend>
|
||||||
|
<p>
|
||||||
|
<select name='locale'>
|
||||||
|
{% for locale_id,locale_name in locales.items() | sort %}
|
||||||
|
<option value="{{ locale_id }}" {% if locale_id == current_locale %}selected="selected"{% endif %}>{{ locale_name }}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
</p>
|
||||||
|
</fieldset>
|
||||||
|
<fieldset>
|
||||||
|
<legend>{{ _('Method') }}</legend>
|
||||||
|
<p>
|
||||||
|
<select name='method'>
|
||||||
|
<option value="POST" {% if method == 'POST' %}selected="selected"{% endif %}>POST</option>
|
||||||
|
<option value="GET" {% if method == 'GET' %}selected="selected"{% endif %}>GET</option>
|
||||||
|
</select>
|
||||||
|
</p>
|
||||||
|
</fieldset>
|
||||||
|
<fieldset>
|
||||||
|
<legend>{{ _('Themes') }}</legend>
|
||||||
|
<p>
|
||||||
|
<select name="theme">
|
||||||
|
{% for name in themes %}
|
||||||
|
<option value="{{ name }}" {% if name == theme %}selected="selected"{% endif %}>{{ name }}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
</p>
|
||||||
|
</fieldset>
|
||||||
|
<fieldset>
|
||||||
|
<legend>{{ _('Currently used search engines') }}</legend>
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<th>{{ _('Engine name') }}</th>
|
||||||
|
<th>{{ _('Allow') }} / {{ _('Block') }}</th>
|
||||||
|
</tr>
|
||||||
|
{% for (categ,search_engines) in categs %}
|
||||||
|
{% for search_engine in search_engines %}
|
||||||
|
|
||||||
|
{% if not search_engine.private %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ search_engine.name }} ({{ shortcuts[search_engine.name] }})‎</td>
|
||||||
|
<td class="engine_checkbox">
|
||||||
|
<input type="checkbox" id="engine_{{ categ|replace(' ', '_') }}_{{ search_engine.name|replace(' ', '_') }}" name="engine_{{ search_engine.name }}__{{ categ }}"{% if (search_engine.name, categ) in blocked_engines %} checked="checked"{% endif %} />
|
||||||
|
<label class="allow" for="engine_{{ categ|replace(' ', '_') }}_{{ search_engine.name|replace(' ', '_') }}">{{ _('Allow') }}</label>
|
||||||
|
<label class="deny" for="engine_{{ categ|replace(' ', '_') }}_{{ search_engine.name|replace(' ', '_') }}">{{ _('Block') }}</label>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
</fieldset>
|
||||||
|
<p class="small_font">{{ _('These settings are stored in your cookies, this allows us not to store this data about you.') }}
|
||||||
|
<br />
|
||||||
|
{{ _("These cookies serve your sole convenience, we don't use these cookies to track you.") }}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<input type="submit" value="{{ _('save') }}" />
|
||||||
|
<div class="{% if rtl %}left{% else %}right{% endif %} preferences_back"><a href="{{ url_for('index') }}">{{ _('back') }}</a></div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
|
@ -0,0 +1,6 @@
|
||||||
|
<a href="{{ result.url }}" title="{{ result.title | striptags }}">
|
||||||
|
<canvas id="canvas-{{ pageno }}-{{ index }}" class="icon" width="16" height="16"></canvas>
|
||||||
|
</a>
|
||||||
|
<script type="text/javascript">
|
||||||
|
favicons[{{ pageno }}][{{ index }}] = 'http://{{ result.url | extract_domain }}/favicon.ico';
|
||||||
|
</script>
|
|
@ -0,0 +1,6 @@
|
||||||
|
<div class="image_result">
|
||||||
|
<p>
|
||||||
|
<a href="{{ result.img_src }}"><img src="{% if result.thumbnail_src %}{{ image_proxify(result.thumbnail_src) }}{% else %}{{ image_proxify(result.img_src) }}{% endif %}" title="{{ result.title|striptags }}" alt="{{ result.title|striptags }}" /></a>
|
||||||
|
<span class="url"><a href="{{ result.url }}" class="small_font">{{ _('original context') }}</a></span>
|
||||||
|
</p>
|
||||||
|
</div>
|
|
@ -0,0 +1,32 @@
|
||||||
|
{% if pageno > 1 %}
|
||||||
|
{% for result in results %}
|
||||||
|
{% set index = loop.index %}
|
||||||
|
{% include 'pix-art/result_templates/default.html' %}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
{% extends "pix-art/base.html" %}
|
||||||
|
{% block title %}{{ q }} - {% endblock %}
|
||||||
|
{% block meta %}{% endblock %}
|
||||||
|
{% block content %}
|
||||||
|
<div id="logo"><a href="./"><img src="{{ url_for('static', filename='img/searx-pixel-small.png') }}" alt="Searx Logo"/></a></div>
|
||||||
|
<div class="preferences_container right"><a href="{{ url_for('preferences') }}" id="preferences"><span>preferences</span></a></div>
|
||||||
|
<div class="small search center">
|
||||||
|
{% include 'pix-art/search.html' %}
|
||||||
|
</div>
|
||||||
|
<script type="text/javascript">
|
||||||
|
favicons[{{ pageno }}] = [];
|
||||||
|
</script>
|
||||||
|
<div id="results">
|
||||||
|
<span id="results_list">
|
||||||
|
{% for result in results %}
|
||||||
|
{% set index = loop.index %}
|
||||||
|
{% include 'pix-art/result_templates/default.html' %}
|
||||||
|
{% endfor %}
|
||||||
|
</span>
|
||||||
|
<div id="pagination">
|
||||||
|
<br />
|
||||||
|
<input type="button" onclick="load_more('{{ q }}', {{ pageno+1 }})" id="load_more" value="{{ _('Load more...') }}" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
{% endif %}
|
|
@ -0,0 +1,9 @@
|
||||||
|
<form method="{{ method or 'POST' }}" action="{{ url_for('index') }}" id="search_form">
|
||||||
|
<div id="search_wrapper">
|
||||||
|
<input type="text" placeholder="{{ _('Search for...') }}" id="q" class="q" name="q" tabindex="1" size="100" {% if q %}value="{{ q }}"{% endif %}/>
|
||||||
|
<input type="submit" value="" id="search_submit" />
|
||||||
|
{% for category in categories %}
|
||||||
|
<input type="hidden" name="category_{{ category }}" value="1"/>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</form>
|
|
@ -0,0 +1,22 @@
|
||||||
|
{% extends "default/base.html" %}
|
||||||
|
{% block head %} {% endblock %}
|
||||||
|
{% block content %}
|
||||||
|
<h2>{{ _('Engine stats') }}</h2>
|
||||||
|
|
||||||
|
{% for stat_name,stat_category in stats %}
|
||||||
|
<div class="left">
|
||||||
|
<table>
|
||||||
|
<tr colspan="3">
|
||||||
|
<th>{{ stat_name }}</th>
|
||||||
|
</tr>
|
||||||
|
{% for engine in stat_category %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ engine.name }}</td>
|
||||||
|
<td>{{ '%.02f'|format(engine.avg) }}</td>
|
||||||
|
<td class="percentage"><div style="width: {{ engine.percentage }}%"> </div></td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
{% endblock %}
|
|
@ -42,6 +42,7 @@ except:
|
||||||
|
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from urllib import urlencode
|
from urllib import urlencode
|
||||||
|
from urlparse import urlparse
|
||||||
from werkzeug.contrib.fixers import ProxyFix
|
from werkzeug.contrib.fixers import ProxyFix
|
||||||
from flask import (
|
from flask import (
|
||||||
Flask, request, render_template, url_for, Response, make_response,
|
Flask, request, render_template, url_for, Response, make_response,
|
||||||
|
@ -181,6 +182,12 @@ def code_highlighter(codelines, language=None):
|
||||||
return html_code
|
return html_code
|
||||||
|
|
||||||
|
|
||||||
|
# Extract domain from url
|
||||||
|
@app.template_filter('extract_domain')
|
||||||
|
def extract_domain(url):
|
||||||
|
return urlparse(url)[1]
|
||||||
|
|
||||||
|
|
||||||
def get_base_url():
|
def get_base_url():
|
||||||
if settings['server']['base_url']:
|
if settings['server']['base_url']:
|
||||||
hostname = settings['server']['base_url']
|
hostname = settings['server']['base_url']
|
||||||
|
|
Loading…
Reference in New Issue