Browse Source

Merge pull request #246 from Cqoicebordel/pix-arts

New theme !
Adam Tauber 10 years ago
parent
commit
952473d297

+ 1 - 0
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/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/pix-art/less/style.less > searx/static/themes/pix-art/css/style.css
 
 grunt:
 	@grunt --gruntfile searx/static/themes/oscar/gruntfile.js

File diff suppressed because it is too large
+ 0 - 0
searx/static/themes/pix-art/css/style.css


BIN
searx/static/themes/pix-art/img/favicon.png


BIN
searx/static/themes/pix-art/img/preference-icon-pixel.png


BIN
searx/static/themes/pix-art/img/search-icon-pixel.png


BIN
searx/static/themes/pix-art/img/searx-pixel-small.png


BIN
searx/static/themes/pix-art/img/searx-pixel.png


+ 141 - 0
searx/static/themes/pix-art/js/searx.js

@@ -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];
+    }
+}

+ 119 - 0
searx/static/themes/pix-art/less/definitions.less

@@ -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;

+ 27 - 0
searx/static/themes/pix-art/less/mixins.less

@@ -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;
+}

+ 57 - 0
searx/static/themes/pix-art/less/search.less

@@ -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
+	}
+}

+ 451 - 0
searx/static/themes/pix-art/less/style.less

@@ -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;
+}

+ 65 - 0
searx/templates/pix-art/about.html

@@ -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 %}

+ 34 - 0
searx/templates/pix-art/base.html

@@ -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>

+ 12 - 0
searx/templates/pix-art/index.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 %}
+

+ 82 - 0
searx/templates/pix-art/preferences.html

@@ -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] }})&lrm;</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 %}

+ 6 - 0
searx/templates/pix-art/result_templates/default.html

@@ -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>

+ 6 - 0
searx/templates/pix-art/result_templates/images.html

@@ -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>

+ 32 - 0
searx/templates/pix-art/results.html

@@ -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 %}

+ 9 - 0
searx/templates/pix-art/search.html

@@ -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>

+ 22 - 0
searx/templates/pix-art/stats.html

@@ -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 }}%">&nbsp;</div></td>
+        </tr>
+        {% endfor %}
+    </table>
+</div>
+{% endfor %}
+{% endblock %}

+ 7 - 0
searx/webapp.py

@@ -42,6 +42,7 @@ except:
 
 from datetime import datetime, timedelta
 from urllib import urlencode
+from urlparse import urlparse
 from werkzeug.contrib.fixers import ProxyFix
 from flask import (
     Flask, request, render_template, url_for, Response, make_response,
@@ -181,6 +182,12 @@ def code_highlighter(codelines, language=None):
     return html_code
 
 
+# Extract domain from url
+@app.template_filter('extract_domain')
+def extract_domain(url):
+    return urlparse(url)[1]
+
+
 def get_base_url():
     if settings['server']['base_url']:
         hostname = settings['server']['base_url']

Some files were not shown because too many files changed in this diff