Merge pull request #246 from Cqoicebordel/pix-arts

New theme !
This commit is contained in:
Adam Tauber 2015-04-25 12:52:07 -04:00
commit 952473d297
22 changed files with 1072 additions and 0 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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