forked from zaclys/searxng
Merge branch 'master' into bug/oscar-theme
This commit is contained in:
commit
1d86d0054f
4
Makefile
4
Makefile
|
@ -8,6 +8,9 @@ PYOBJECTS = searx
|
||||||
DOC = docs
|
DOC = docs
|
||||||
PY_SETUP_EXTRAS ?= \[test\]
|
PY_SETUP_EXTRAS ?= \[test\]
|
||||||
|
|
||||||
|
PYDIST=./dist/py
|
||||||
|
PYBUILD=./build/py
|
||||||
|
|
||||||
include utils/makefile.include
|
include utils/makefile.include
|
||||||
include utils/makefile.python
|
include utils/makefile.python
|
||||||
include utils/makefile.sphinx
|
include utils/makefile.sphinx
|
||||||
|
@ -23,6 +26,7 @@ help:
|
||||||
@echo ' install - developer install (./local)'
|
@echo ' install - developer install (./local)'
|
||||||
@echo ' uninstall - uninstall (./local)'
|
@echo ' uninstall - uninstall (./local)'
|
||||||
@echo ' gh-pages - build docs & deploy on gh-pages branch'
|
@echo ' gh-pages - build docs & deploy on gh-pages branch'
|
||||||
|
@echo ' clean - drop builds and environments'
|
||||||
@echo ''
|
@echo ''
|
||||||
@$(MAKE) -s -f utils/makefile.include make-help
|
@$(MAKE) -s -f utils/makefile.include make-help
|
||||||
@echo ''
|
@echo ''
|
||||||
|
|
|
@ -23,13 +23,13 @@ Go to the `searx-docker <https://github.com/searx/searx-docker>`__ project.
|
||||||
|
|
||||||
Without Docker
|
Without Docker
|
||||||
------
|
------
|
||||||
For all the details, follow this `step by step installation <https://asciimoo.github.io/searx/dev/install/installation.html>`__.
|
For all of the details, follow this `step by step installation <https://asciimoo.github.io/searx/dev/install/installation.html>`__.
|
||||||
|
|
||||||
Note: the documentation needs to be updated.
|
Note: the documentation needs to be updated.
|
||||||
|
|
||||||
If you are in hurry
|
If you are in a hurry
|
||||||
------
|
------
|
||||||
- clone source:
|
- clone the source:
|
||||||
``git clone https://github.com/asciimoo/searx.git && cd searx``
|
``git clone https://github.com/asciimoo/searx.git && cd searx``
|
||||||
- install dependencies: ``./manage.sh update_packages``
|
- install dependencies: ``./manage.sh update_packages``
|
||||||
- edit your
|
- edit your
|
||||||
|
|
|
@ -24,7 +24,107 @@ p.sidebar-title, .sidebar p {
|
||||||
margin: 6pt;
|
margin: 6pt;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sidebar li {
|
.sidebar li,
|
||||||
|
.hlist li {
|
||||||
list-style-type: disclosure-closed;
|
list-style-type: disclosure-closed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* admonitions
|
||||||
|
*/
|
||||||
|
|
||||||
|
div.admonition, div.topic {
|
||||||
|
background-color: #fafafa;
|
||||||
|
margin: 8px 0px;
|
||||||
|
padding: 1em;
|
||||||
|
border-radius: 3pt 0 0 3pt;
|
||||||
|
border-top: none;
|
||||||
|
border-right: none;
|
||||||
|
border-bottom: none;
|
||||||
|
border-left: 5pt solid #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.admonition-title:after {
|
||||||
|
content: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.admonition.hint { border-color: #416dc0b0; }
|
||||||
|
.admonition.note { border-color: #6c856cb0; }
|
||||||
|
.admonition.tip { border-color: #85c5c2b0; }
|
||||||
|
.admonition.attention { border-color: #ecec97b0; }
|
||||||
|
.admonition.caution { border-color: #a6c677b0; }
|
||||||
|
.admonition.danger { border-color: #d46262b0; }
|
||||||
|
.admonition.important { border-color: #dfa3a3b0; }
|
||||||
|
.admonition.error { border-color: red; }
|
||||||
|
.admonition.warning { border-color: darkred; }
|
||||||
|
|
||||||
|
.admonition.admonition-generic-admonition-title {
|
||||||
|
border-color: #416dc0b0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* admonitions with (rendered) reST markup examples (:class: rst-example)
|
||||||
|
*
|
||||||
|
* .. admonition:: title of the example
|
||||||
|
* :class: rst-example
|
||||||
|
* ....
|
||||||
|
*/
|
||||||
|
|
||||||
|
div.rst-example {
|
||||||
|
background-color: inherit;
|
||||||
|
margin: 0;
|
||||||
|
border-top: none;
|
||||||
|
border-right: 1px solid #ccc;
|
||||||
|
border-bottom: none;
|
||||||
|
border-left: none;
|
||||||
|
border-radius: none;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.rst-example > p.admonition-title {
|
||||||
|
font-family: Sans Serif;
|
||||||
|
font-style: italic;
|
||||||
|
font-size: 0.8em;
|
||||||
|
display: block;
|
||||||
|
border-bottom: 1px solid #ccc;
|
||||||
|
padding: 0.5em 1em;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* code block in figures
|
||||||
|
*/
|
||||||
|
|
||||||
|
div.highlight pre {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Table theme
|
||||||
|
*/
|
||||||
|
|
||||||
|
thead, tfoot {
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
th:hover, td:hover {
|
||||||
|
background-color: #ffc;
|
||||||
|
}
|
||||||
|
|
||||||
|
thead th, tfoot th, tfoot td, tbody th {
|
||||||
|
background-color: #fffaef;
|
||||||
|
}
|
||||||
|
|
||||||
|
tbody tr:nth-child(odd) {
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
tbody tr:nth-child(even) {
|
||||||
|
background-color: #fafafa;
|
||||||
|
}
|
||||||
|
|
||||||
|
caption {
|
||||||
|
font-family: Sans Serif;
|
||||||
|
padding: 0.5em;
|
||||||
|
margin: 0.5em 0 0.5em 0;
|
||||||
|
caption-side: top;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
digraph G {
|
||||||
|
|
||||||
|
node [style=filled, shape=box, fillcolor="#ffffcc", fontname="Sans"];
|
||||||
|
edge [fontname="Sans"];
|
||||||
|
|
||||||
|
browser [label="Browser", shape=Mdiamond];
|
||||||
|
rp [label="Reverse Proxy", href="url to configure reverse proxy"];
|
||||||
|
filtron [label="Filtron", href="https://github.com/asciimoo/filtron"];
|
||||||
|
morty [label="Morty", href="https://github.com/asciimoo/morty"];
|
||||||
|
static [label="Static files", href="url to configure static files"];
|
||||||
|
uwsgi [label="uwsgi", href="url to configure uwsgi"]
|
||||||
|
searx1 [label="Searx #1"];
|
||||||
|
searx2 [label="Searx #2"];
|
||||||
|
searx3 [label="Searx #3"];
|
||||||
|
searx4 [label="Searx #4"];
|
||||||
|
|
||||||
|
browser -> rp [label="HTTPS"]
|
||||||
|
|
||||||
|
subgraph cluster_searx {
|
||||||
|
label = "Searx instance" fontname="Sans";
|
||||||
|
bgcolor="#fafafa";
|
||||||
|
{ rank=same; static rp };
|
||||||
|
rp -> morty [label="optional: images and HTML pages proxy"];
|
||||||
|
rp -> static [label="optional: reverse proxy serves directly static files"];
|
||||||
|
rp -> filtron [label="HTTP"];
|
||||||
|
filtron -> uwsgi [label="HTTP"];
|
||||||
|
uwsgi -> searx1;
|
||||||
|
uwsgi -> searx2;
|
||||||
|
uwsgi -> searx3;
|
||||||
|
uwsgi -> searx4;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
.. _architecture:
|
||||||
|
|
||||||
|
============
|
||||||
|
Architecture
|
||||||
|
============
|
||||||
|
|
||||||
|
.. sidebar:: Needs work!
|
||||||
|
|
||||||
|
This article needs some work / Searx is a collaborative effort. If you have
|
||||||
|
any contribution, feel welcome to send us your :pull:`PR <../pulls>`, see
|
||||||
|
:ref:`how to contribute`.
|
||||||
|
|
||||||
|
Herein you will find some hints and suggestions about typical architectures of
|
||||||
|
searx infrastructures.
|
||||||
|
|
||||||
|
We start with a contribution from :pull:`@dalf <1776#issuecomment-567917320>`.
|
||||||
|
It shows a *reference* setup for public searx instances.
|
||||||
|
|
||||||
|
.. _arch public:
|
||||||
|
|
||||||
|
.. kernel-figure:: arch_public.dot
|
||||||
|
:alt: arch_public.dot
|
||||||
|
|
||||||
|
Reference architecture of a public searx setup.
|
|
@ -0,0 +1,103 @@
|
||||||
|
.. _buildhosts:
|
||||||
|
|
||||||
|
==========
|
||||||
|
Buildhosts
|
||||||
|
==========
|
||||||
|
|
||||||
|
.. sidebar:: This article needs some work
|
||||||
|
|
||||||
|
If you have any contribution send us your :pull:`PR <../pulls>`, see
|
||||||
|
:ref:`how to contribute`.
|
||||||
|
|
||||||
|
To get best results from build, its recommend to install additional packages
|
||||||
|
on build hosts.
|
||||||
|
|
||||||
|
.. _docs build:
|
||||||
|
|
||||||
|
Build docs
|
||||||
|
==========
|
||||||
|
|
||||||
|
.. _Graphviz: https://graphviz.gitlab.io
|
||||||
|
.. _ImageMagick: https://www.imagemagick.org
|
||||||
|
.. _XeTeX: https://tug.org/xetex/
|
||||||
|
.. _dvisvgm: https://dvisvgm.de/
|
||||||
|
|
||||||
|
.. sidebar:: Sphinx build needs
|
||||||
|
|
||||||
|
- ImageMagick_
|
||||||
|
- Graphviz_
|
||||||
|
- XeTeX_
|
||||||
|
- dvisvgm_
|
||||||
|
|
||||||
|
Most of the sphinx requirements are installed from :origin:`setup.py` and the
|
||||||
|
docs can be build from scratch with ``make docs``. For better math and image
|
||||||
|
processing additional packages are needed. The XeTeX_ needed not only for PDF
|
||||||
|
creation, its also needed for :ref:`math` when HTML output is build.
|
||||||
|
|
||||||
|
To be able to do :ref:`sphinx:math-support` without CDNs, the math are rendered
|
||||||
|
as images (``sphinx.ext.imgmath`` extension). If your docs build (``make
|
||||||
|
docs``) shows warnings like this::
|
||||||
|
|
||||||
|
WARNING: dot(1) not found, for better output quality install \
|
||||||
|
graphviz from http://www.graphviz.org
|
||||||
|
..
|
||||||
|
WARNING: LaTeX command 'latex' cannot be run (needed for math \
|
||||||
|
display), check the imgmath_latex setting
|
||||||
|
|
||||||
|
you need to install additional packages on your build host, to get better HTML
|
||||||
|
output.
|
||||||
|
|
||||||
|
.. _system requirements:
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Ubuntu / debian
|
||||||
|
|
||||||
|
.. code-block:: sh
|
||||||
|
|
||||||
|
$ sudo apt install graphviz imagemagick texlive-xetex librsvg2-bin
|
||||||
|
|
||||||
|
.. group-tab:: Arch Linux
|
||||||
|
|
||||||
|
.. code-block:: sh
|
||||||
|
|
||||||
|
$ sudo pacman -S graphviz imagemagick texlive-bin extra/librsvg
|
||||||
|
|
||||||
|
.. group-tab:: Fedora / RHEL
|
||||||
|
|
||||||
|
.. code-block:: sh
|
||||||
|
|
||||||
|
$ sudo dnf install graphviz graphviz-gd texlive-xetex-bin librsvg2-tools
|
||||||
|
|
||||||
|
|
||||||
|
For PDF output you also need:
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Ubuntu / debian
|
||||||
|
|
||||||
|
.. code:: sh
|
||||||
|
|
||||||
|
$ sudo apt texlive-latex-recommended texlive-extra-utils ttf-dejavu
|
||||||
|
|
||||||
|
.. group-tab:: Arch Linux
|
||||||
|
|
||||||
|
.. code:: sh
|
||||||
|
|
||||||
|
$ sudo pacman -S texlive-core texlive-latexextra ttf-dejavu
|
||||||
|
|
||||||
|
.. group-tab:: Fedora / RHEL
|
||||||
|
|
||||||
|
.. code:: sh
|
||||||
|
|
||||||
|
$ sudo dnf install \
|
||||||
|
texlive-collection-fontsrecommended texlive-collection-latex \
|
||||||
|
dejavu-sans-fonts dejavu-serif-fonts dejavu-sans-mono-fonts
|
||||||
|
|
||||||
|
.. _system requirements END:
|
||||||
|
|
||||||
|
.. literalinclude:: ../conf.py
|
||||||
|
:language: python
|
||||||
|
:start-after: # sphinx.ext.imgmath setup
|
||||||
|
:end-before: # sphinx.ext.imgmath setup END
|
||||||
|
|
|
@ -0,0 +1,68 @@
|
||||||
|
.. _engines generic:
|
||||||
|
|
||||||
|
=======
|
||||||
|
engines
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. sidebar:: Further reading ..
|
||||||
|
|
||||||
|
- :ref:`engines generic`
|
||||||
|
- :ref:`configured engines`
|
||||||
|
- :ref:`engine settings`
|
||||||
|
- :ref:`engine file`
|
||||||
|
|
||||||
|
============= =========== ==================== ============
|
||||||
|
:ref:`engine settings` :ref:`engine file`
|
||||||
|
------------------------- ---------------------------------
|
||||||
|
Name (cfg) Categories
|
||||||
|
------------------------- ---------------------------------
|
||||||
|
Engine .. Paging support **P**
|
||||||
|
------------------------- -------------------- ------------
|
||||||
|
Shortcut **S** Language support **L**
|
||||||
|
Timeout **TO** Time range support **TR**
|
||||||
|
Disabled **D** Offline **O**
|
||||||
|
------------- ----------- -------------------- ------------
|
||||||
|
Suspend end **SE**
|
||||||
|
------------- ----------- ---------------------------------
|
||||||
|
Safe search **SS**
|
||||||
|
============= =========== =================================
|
||||||
|
|
||||||
|
Configuration defaults (at built time):
|
||||||
|
|
||||||
|
.. _configured engines:
|
||||||
|
|
||||||
|
.. jinja:: webapp
|
||||||
|
|
||||||
|
.. flat-table:: Engines configured at built time (defaults)
|
||||||
|
:header-rows: 1
|
||||||
|
:stub-columns: 2
|
||||||
|
|
||||||
|
* - Name (cfg)
|
||||||
|
- S
|
||||||
|
- Engine
|
||||||
|
- TO
|
||||||
|
- Categories
|
||||||
|
- P
|
||||||
|
- L
|
||||||
|
- SS
|
||||||
|
- D
|
||||||
|
- TR
|
||||||
|
- O
|
||||||
|
- SE
|
||||||
|
|
||||||
|
{% for name, mod in engines.items() %}
|
||||||
|
|
||||||
|
* - {{name}}
|
||||||
|
- !{{mod.shortcut}}
|
||||||
|
- {{mod.__name__}}
|
||||||
|
- {{mod.timeout}}
|
||||||
|
- {{", ".join(mod.categories)}}
|
||||||
|
- {{(mod.paging and "y") or ""}}
|
||||||
|
- {{(mod.language_support and "y") or ""}}
|
||||||
|
- {{(mod.safesearch and "y") or ""}}
|
||||||
|
- {{(mod.disabled and "y") or ""}}
|
||||||
|
- {{(mod.time_range_support and "y") or ""}}
|
||||||
|
- {{(mod.offline and "y") or ""}}
|
||||||
|
- {{mod.suspend_end_time}}
|
||||||
|
|
||||||
|
{% endfor %}
|
|
@ -7,5 +7,9 @@ Administrator documentation
|
||||||
|
|
||||||
installation
|
installation
|
||||||
api
|
api
|
||||||
|
architecture
|
||||||
filtron
|
filtron
|
||||||
morty
|
morty
|
||||||
|
engines
|
||||||
|
plugins
|
||||||
|
buildhosts
|
||||||
|
|
|
@ -114,6 +114,9 @@ content:
|
||||||
# Module to import
|
# Module to import
|
||||||
module = searx.webapp
|
module = searx.webapp
|
||||||
|
|
||||||
|
# Support running the module from a webserver subdirectory.
|
||||||
|
route-run = fixpathinfo:
|
||||||
|
|
||||||
# Virtualenv and python path
|
# Virtualenv and python path
|
||||||
virtualenv = /usr/local/searx/searx-ve/
|
virtualenv = /usr/local/searx/searx-ve/
|
||||||
pythonpath = /usr/local/searx/
|
pythonpath = /usr/local/searx/
|
||||||
|
@ -151,7 +154,10 @@ content:
|
||||||
server {
|
server {
|
||||||
listen 80;
|
listen 80;
|
||||||
server_name searx.example.com;
|
server_name searx.example.com;
|
||||||
root /usr/local/searx;
|
root /usr/local/searx/searx;
|
||||||
|
|
||||||
|
location /static {
|
||||||
|
}
|
||||||
|
|
||||||
location / {
|
location / {
|
||||||
include uwsgi_params;
|
include uwsgi_params;
|
||||||
|
@ -180,14 +186,13 @@ Add this configuration in the server config file
|
||||||
|
|
||||||
.. code:: nginx
|
.. code:: nginx
|
||||||
|
|
||||||
location = /searx { rewrite ^ /searx/; }
|
location /searx/static {
|
||||||
location /searx {
|
alias /usr/local/searx/searx/static;
|
||||||
try_files $uri @searx;
|
|
||||||
}
|
}
|
||||||
location @searx {
|
|
||||||
|
location /searx {
|
||||||
uwsgi_param SCRIPT_NAME /searx;
|
uwsgi_param SCRIPT_NAME /searx;
|
||||||
include uwsgi_params;
|
include uwsgi_params;
|
||||||
uwsgi_modifier1 30;
|
|
||||||
uwsgi_pass unix:/run/uwsgi/app/searx/socket;
|
uwsgi_pass unix:/run/uwsgi/app/searx/socket;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -197,6 +202,10 @@ in case of single-user or low-traffic instances.)
|
||||||
|
|
||||||
.. code:: nginx
|
.. code:: nginx
|
||||||
|
|
||||||
|
location /searx/static {
|
||||||
|
alias /usr/local/searx/searx/static;
|
||||||
|
}
|
||||||
|
|
||||||
location /searx {
|
location /searx {
|
||||||
proxy_pass http://127.0.0.1:8888;
|
proxy_pass http://127.0.0.1:8888;
|
||||||
proxy_set_header Host $host;
|
proxy_set_header Host $host;
|
||||||
|
@ -338,4 +347,3 @@ References
|
||||||
|
|
||||||
* How to: `Setup searx in a couple of hours with a free SSL certificate
|
* How to: `Setup searx in a couple of hours with a free SSL certificate
|
||||||
<https://www.reddit.com/r/privacytoolsIO/comments/366kvn/how_to_setup_your_own_privacy_respecting_search/>`__
|
<https://www.reddit.com/r/privacytoolsIO/comments/366kvn/how_to_setup_your_own_privacy_respecting_search/>`__
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
.. _plugins generic:
|
||||||
|
|
||||||
|
===============
|
||||||
|
Plugins builtin
|
||||||
|
===============
|
||||||
|
|
||||||
|
.. sidebar:: Further reading ..
|
||||||
|
|
||||||
|
- :ref:`dev plugin`
|
||||||
|
|
||||||
|
Configuration defaults (at built time):
|
||||||
|
|
||||||
|
:DO: Default on
|
||||||
|
|
||||||
|
.. _configured plugins:
|
||||||
|
|
||||||
|
.. jinja:: webapp
|
||||||
|
|
||||||
|
.. flat-table:: Plugins configured at built time (defaults)
|
||||||
|
:header-rows: 1
|
||||||
|
:stub-columns: 1
|
||||||
|
:widths: 3 1 9
|
||||||
|
|
||||||
|
* - Name
|
||||||
|
- DO
|
||||||
|
- Description
|
||||||
|
|
||||||
|
JS & CSS dependencies
|
||||||
|
|
||||||
|
{% for plgin in plugins %}
|
||||||
|
|
||||||
|
* - {{plgin.name}}
|
||||||
|
- {{(plgin.default_on and "y") or ""}}
|
||||||
|
- {{plgin.description}}
|
||||||
|
|
||||||
|
{% for dep in (plgin.js_dependencies + plgin.css_dependencies) %}
|
||||||
|
| ``{{dep}}`` {% endfor %}
|
||||||
|
|
||||||
|
{% endfor %}
|
37
docs/conf.py
37
docs/conf.py
|
@ -14,11 +14,18 @@ project = u'searx'
|
||||||
copyright = u'2015-2019, Adam Tauber, Noémi Ványi'
|
copyright = u'2015-2019, Adam Tauber, Noémi Ványi'
|
||||||
author = u'Adam Tauber'
|
author = u'Adam Tauber'
|
||||||
release, version = VERSION_STRING, VERSION_STRING
|
release, version = VERSION_STRING, VERSION_STRING
|
||||||
|
highlight_language = 'none'
|
||||||
|
|
||||||
# General --------------------------------------------------------------
|
# General --------------------------------------------------------------
|
||||||
|
|
||||||
master_doc = "index"
|
master_doc = "index"
|
||||||
source_suffix = '.rst'
|
source_suffix = '.rst'
|
||||||
|
numfig = True
|
||||||
|
|
||||||
|
from searx import webapp
|
||||||
|
jinja_contexts = {
|
||||||
|
'webapp': dict(**webapp.__dict__)
|
||||||
|
}
|
||||||
|
|
||||||
# usage:: lorem :patch:`f373169` ipsum
|
# usage:: lorem :patch:`f373169` ipsum
|
||||||
extlinks = {}
|
extlinks = {}
|
||||||
|
@ -32,21 +39,40 @@ extlinks['origin'] = (GIT_URL + '/blob/master/%s', 'git://')
|
||||||
extlinks['patch'] = (GIT_URL + '/commit/%s', '#')
|
extlinks['patch'] = (GIT_URL + '/commit/%s', '#')
|
||||||
extlinks['search'] = (SEARX_URL + '/%s', '#')
|
extlinks['search'] = (SEARX_URL + '/%s', '#')
|
||||||
extlinks['docs'] = (DOCS_URL + '/%s', 'docs: ')
|
extlinks['docs'] = (DOCS_URL + '/%s', 'docs: ')
|
||||||
|
extlinks['pypi'] = ('https://pypi.org/project/%s', 'PyPi: ')
|
||||||
|
extlinks['man'] = ('https://manpages.debian.org/jump?q=%s', '')
|
||||||
|
#extlinks['role'] = (
|
||||||
|
# 'https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-%s', '')
|
||||||
|
extlinks['duref'] = (
|
||||||
|
'http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html#%s', '')
|
||||||
|
extlinks['durole'] = (
|
||||||
|
'http://docutils.sourceforge.net/docs/ref/rst/roles.html#%s', '')
|
||||||
|
extlinks['dudir'] = (
|
||||||
|
'http://docutils.sourceforge.net/docs/ref/rst/directives.html#%s', '')
|
||||||
|
extlinks['ctan'] = (
|
||||||
|
'https://ctan.org/pkg/%s', 'CTAN: ')
|
||||||
|
|
||||||
extensions = [
|
extensions = [
|
||||||
|
'sphinx.ext.imgmath',
|
||||||
'sphinx.ext.extlinks',
|
'sphinx.ext.extlinks',
|
||||||
'sphinx.ext.viewcode',
|
'sphinx.ext.viewcode',
|
||||||
"sphinx.ext.autodoc",
|
"sphinx.ext.autodoc",
|
||||||
"sphinx.ext.intersphinx",
|
"sphinx.ext.intersphinx",
|
||||||
"pallets_sphinx_themes",
|
"pallets_sphinx_themes",
|
||||||
"sphinx_issues", # https://github.com/sloria/sphinx-issues/blob/master/README.rst
|
"sphinx_issues", # https://github.com/sloria/sphinx-issues/blob/master/README.rst
|
||||||
|
"sphinxcontrib.jinja", # https://github.com/tardyp/sphinx-jinja
|
||||||
|
'linuxdoc.rstFlatTable', # Implementation of the 'flat-table' reST-directive.
|
||||||
|
'linuxdoc.kfigure', # Sphinx extension which implements scalable image handling.
|
||||||
|
"sphinx_tabs.tabs", # https://github.com/djungelorm/sphinx-tabs
|
||||||
]
|
]
|
||||||
|
|
||||||
intersphinx_mapping = {
|
intersphinx_mapping = {
|
||||||
"python": ("https://docs.python.org/3/", None),
|
"python": ("https://docs.python.org/3/", None),
|
||||||
# "flask": ("https://flask.palletsprojects.com/", None),
|
"flask": ("https://flask.palletsprojects.com/", None),
|
||||||
# "werkzeug": ("https://werkzeug.palletsprojects.com/", None),
|
# "werkzeug": ("https://werkzeug.palletsprojects.com/", None),
|
||||||
# "jinja": ("https://jinja.palletsprojects.com/", None),
|
"jinja": ("https://jinja.palletsprojects.com/", None),
|
||||||
|
"linuxdoc" : ("https://return42.github.io/linuxdoc/", None),
|
||||||
|
"sphinx" : ("https://www.sphinx-doc.org/en/master/", None),
|
||||||
}
|
}
|
||||||
|
|
||||||
issues_github_path = "asciimoo/searx"
|
issues_github_path = "asciimoo/searx"
|
||||||
|
@ -54,10 +80,15 @@ issues_github_path = "asciimoo/searx"
|
||||||
# HTML -----------------------------------------------------------------
|
# HTML -----------------------------------------------------------------
|
||||||
|
|
||||||
sys.path.append(os.path.abspath('_themes'))
|
sys.path.append(os.path.abspath('_themes'))
|
||||||
|
|
||||||
html_theme_path = ['_themes']
|
html_theme_path = ['_themes']
|
||||||
html_theme = "searx"
|
html_theme = "searx"
|
||||||
|
|
||||||
|
# sphinx.ext.imgmath setup
|
||||||
|
html_math_renderer = 'imgmath'
|
||||||
|
imgmath_image_format = 'svg'
|
||||||
|
imgmath_font_size = 14
|
||||||
|
# sphinx.ext.imgmath setup END
|
||||||
|
|
||||||
html_theme_options = {"index_sidebar_logo": True}
|
html_theme_options = {"index_sidebar_logo": True}
|
||||||
html_context = {
|
html_context = {
|
||||||
"project_links": [
|
"project_links": [
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
.. _how to contribute:
|
||||||
|
|
||||||
=================
|
=================
|
||||||
How to contribute
|
How to contribute
|
||||||
=================
|
=================
|
||||||
|
@ -48,7 +50,20 @@ Code
|
||||||
====
|
====
|
||||||
|
|
||||||
.. _PEP8: https://www.python.org/dev/peps/pep-0008/
|
.. _PEP8: https://www.python.org/dev/peps/pep-0008/
|
||||||
|
.. _Conventional Commits: https://www.conventionalcommits.org/
|
||||||
|
.. _Git Commit Good Practice: https://wiki.openstack.org/wiki/GitCommitMessages
|
||||||
|
.. _Structural split of changes:
|
||||||
|
https://wiki.openstack.org/wiki/GitCommitMessages#Structural_split_of_changes
|
||||||
|
.. _gitmoji: https://gitmoji.carloscuesta.me/
|
||||||
|
.. _Semantic PR: https://github.com/zeke/semantic-pull-requests
|
||||||
|
|
||||||
|
.. sidebar:: Create good commits!
|
||||||
|
|
||||||
|
- `Structural split of changes`_
|
||||||
|
- `Conventional Commits`_
|
||||||
|
- `Git Commit Good Practice`_
|
||||||
|
- some like to use: gitmoji_
|
||||||
|
- not yet active: `Semantic PR`_
|
||||||
|
|
||||||
In order to submit a patch, please follow the steps below:
|
In order to submit a patch, please follow the steps below:
|
||||||
|
|
||||||
|
@ -57,6 +72,9 @@ In order to submit a patch, please follow the steps below:
|
||||||
- PEP8_ standards apply, except the convention of line length
|
- PEP8_ standards apply, except the convention of line length
|
||||||
- Maximum line length is 120 characters
|
- Maximum line length is 120 characters
|
||||||
|
|
||||||
|
- The cardinal rule for creating good commits is to ensure there is only one
|
||||||
|
*logical change* per commit / read `Structural split of changes`_
|
||||||
|
|
||||||
- Check if your code breaks existing tests. If so, update the tests or fix your
|
- Check if your code breaks existing tests. If so, update the tests or fix your
|
||||||
code.
|
code.
|
||||||
|
|
||||||
|
@ -64,6 +82,16 @@ In order to submit a patch, please follow the steps below:
|
||||||
|
|
||||||
- Add yourself to the :origin:`AUTHORS.rst` file.
|
- Add yourself to the :origin:`AUTHORS.rst` file.
|
||||||
|
|
||||||
|
- Choose meaning full commit messages, read `Conventional Commits`_
|
||||||
|
|
||||||
|
.. code::
|
||||||
|
|
||||||
|
<type>[optional scope]: <description>
|
||||||
|
|
||||||
|
[optional body]
|
||||||
|
|
||||||
|
[optional footer(s)]
|
||||||
|
|
||||||
- Create a pull request.
|
- Create a pull request.
|
||||||
|
|
||||||
For more help on getting started with searx development, see :ref:`devquickstart`.
|
For more help on getting started with searx development, see :ref:`devquickstart`.
|
||||||
|
@ -79,6 +107,8 @@ Translation currently takes place on :ref:`transifex <translation>`.
|
||||||
Please, do not update translation files in the repo.
|
Please, do not update translation files in the repo.
|
||||||
|
|
||||||
|
|
||||||
|
.. _contrib docs:
|
||||||
|
|
||||||
Documentation
|
Documentation
|
||||||
=============
|
=============
|
||||||
|
|
||||||
|
@ -91,7 +121,7 @@ Documentation
|
||||||
|
|
||||||
The documentation is built using Sphinx_. So in order to be able to generate
|
The documentation is built using Sphinx_. So in order to be able to generate
|
||||||
the required files, you have to install it on your system. Much easier, use
|
the required files, you have to install it on your system. Much easier, use
|
||||||
Makefile our targets.
|
our :ref:`makefile`.
|
||||||
|
|
||||||
Here is an example which makes a complete rebuild:
|
Here is an example which makes a complete rebuild:
|
||||||
|
|
||||||
|
@ -101,6 +131,7 @@ Here is an example which makes a complete rebuild:
|
||||||
...
|
...
|
||||||
The HTML pages are in dist/docs.
|
The HTML pages are in dist/docs.
|
||||||
|
|
||||||
|
.. _make docs-live:
|
||||||
|
|
||||||
live build
|
live build
|
||||||
----------
|
----------
|
||||||
|
@ -110,9 +141,10 @@ live build
|
||||||
It is recommended to assert a complete rebuild before deploying (use
|
It is recommended to assert a complete rebuild before deploying (use
|
||||||
``docs-clean``).
|
``docs-clean``).
|
||||||
|
|
||||||
Live build is like WYSIWYG, If you want to edit the documentation, its
|
Live build is like WYSIWYG. If you want to edit the documentation, its
|
||||||
recommended to use. The Makefile target ``docs-live`` builds the docs, opens URL
|
recommended to use. The Makefile target ``docs-live`` builds the docs, opens
|
||||||
in your favorite browser and rebuilds every time a reST file has been changed.
|
URL in your favorite browser and rebuilds every time a reST file has been
|
||||||
|
changed.
|
||||||
|
|
||||||
.. code:: sh
|
.. code:: sh
|
||||||
|
|
||||||
|
@ -123,12 +155,13 @@ in your favorite browser and rebuilds every time a reST file has been changed.
|
||||||
... Start watching changes
|
... Start watching changes
|
||||||
|
|
||||||
|
|
||||||
|
.. _deploy on github.io:
|
||||||
|
|
||||||
deploy on github.io
|
deploy on github.io
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
To deploy documentation at :docs:`github.io <.>` use Makefile target
|
To deploy documentation at :docs:`github.io <.>` use Makefile target
|
||||||
``gh-pages``, which will builds the documentation, clones searx into a sub
|
:ref:`make gh-pages`, which will builds the documentation, clones searx into a sub
|
||||||
folder ``gh-pages``, cleans it, copies the doc build into and runs all the
|
folder ``gh-pages``, cleans it, copies the doc build into and runs all the
|
||||||
needed git add, commit and push:
|
needed git add, commit and push:
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
stub col row 1, column, "loremLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
|
||||||
|
eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
|
||||||
|
voluptua."
|
||||||
|
stub col row 1, "At vero eos et accusam et justo duo dolores et ea rebum. Stet clita
|
||||||
|
kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.", column
|
||||||
|
stub col row 1, column, column
|
|
@ -29,6 +29,7 @@ the ones in the engine file.
|
||||||
It does not matter if an option is stored in the engine file or in the
|
It does not matter if an option is stored in the engine file or in the
|
||||||
settings. However, the standard way is the following:
|
settings. However, the standard way is the following:
|
||||||
|
|
||||||
|
.. _engine file:
|
||||||
|
|
||||||
engine file
|
engine file
|
||||||
-----------
|
-----------
|
||||||
|
@ -43,6 +44,7 @@ time_range_support boolean support search time range
|
||||||
offline boolean engine runs offline
|
offline boolean engine runs offline
|
||||||
======================= =========== ===========================================
|
======================= =========== ===========================================
|
||||||
|
|
||||||
|
.. _engine settings:
|
||||||
|
|
||||||
settings.yml
|
settings.yml
|
||||||
------------
|
------------
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
graph G {
|
||||||
|
Hello -- World
|
||||||
|
}
|
|
@ -11,3 +11,5 @@ Developer documentation
|
||||||
search_api
|
search_api
|
||||||
plugins
|
plugins
|
||||||
translation
|
translation
|
||||||
|
makefile
|
||||||
|
reST
|
||||||
|
|
|
@ -0,0 +1,221 @@
|
||||||
|
.. _makefile:
|
||||||
|
|
||||||
|
================
|
||||||
|
Makefile Targets
|
||||||
|
================
|
||||||
|
|
||||||
|
.. _gnu-make: https://www.gnu.org/software/make/manual/make.html#Introduction
|
||||||
|
|
||||||
|
.. sidebar:: build environment
|
||||||
|
|
||||||
|
Before looking deeper at the targets, first read about :ref:`makefile setup`
|
||||||
|
and :ref:`make pyenv`.
|
||||||
|
|
||||||
|
With the aim to simplify development cycles, started with :pull:`1756` a
|
||||||
|
``Makefile`` based boilerplate was added. If you are not familiar with
|
||||||
|
Makefiles, we recommend to read gnu-make_ introduction.
|
||||||
|
|
||||||
|
The usage is simple, just type ``make {target-name}`` to *build* a target.
|
||||||
|
Calling the ``help`` target gives a first overview::
|
||||||
|
|
||||||
|
$ make help
|
||||||
|
test - run developer tests
|
||||||
|
docs - build documentation
|
||||||
|
docs-live - autobuild HTML documentation while editing
|
||||||
|
run - run developer instance
|
||||||
|
install - developer install (./local)
|
||||||
|
uninstall - uninstall (./local)
|
||||||
|
gh-pages - build docs & deploy on gh-pages branch
|
||||||
|
clean - drop builds and environments
|
||||||
|
...
|
||||||
|
|
||||||
|
.. contents:: Contents
|
||||||
|
:depth: 2
|
||||||
|
:local:
|
||||||
|
:backlinks: entry
|
||||||
|
|
||||||
|
|
||||||
|
.. _makefile setup:
|
||||||
|
|
||||||
|
Setup
|
||||||
|
=====
|
||||||
|
|
||||||
|
.. _git stash: https://git-scm.com/docs/git-stash
|
||||||
|
|
||||||
|
The main setup is done in the :origin:`Makefile`::
|
||||||
|
|
||||||
|
export GIT_URL=https://github.com/asciimoo/searx
|
||||||
|
export SEARX_URL=https://searx.me
|
||||||
|
export DOCS_URL=https://asciimoo.github.io/searx
|
||||||
|
|
||||||
|
.. sidebar:: fork & upstream
|
||||||
|
|
||||||
|
Commit changes in your (local) branch, fork or whatever, but do not push them
|
||||||
|
upstream / `git stash`_ is your friend.
|
||||||
|
|
||||||
|
:GIT_URL: Changes this, to point to your searx fork.
|
||||||
|
|
||||||
|
:SEARX_URL: Changes this, to point to your searx instance.
|
||||||
|
|
||||||
|
:DOCS_URL: If you host your own (branded) documentation, change this URL.
|
||||||
|
|
||||||
|
.. _make pyenv:
|
||||||
|
|
||||||
|
Python environment
|
||||||
|
==================
|
||||||
|
|
||||||
|
.. sidebar:: activate environment
|
||||||
|
|
||||||
|
``source ./local/py3/bin/activate``
|
||||||
|
|
||||||
|
With Makefile we do no longer need to build up the virualenv manually (as
|
||||||
|
described in the :ref:`devquickstart` guide). Jump into your git working tree
|
||||||
|
and release a ``make pyenv``:
|
||||||
|
|
||||||
|
.. code:: sh
|
||||||
|
|
||||||
|
$ cd ~/searx-clone
|
||||||
|
$ make pyenv
|
||||||
|
PYENV usage: source ./local/py3/bin/activate
|
||||||
|
...
|
||||||
|
|
||||||
|
With target ``pyenv`` a development environment (aka virtualenv) was build up in
|
||||||
|
``./local/py3/``. To make a *developer install* of searx (:origin:`setup.py`)
|
||||||
|
into this environment, use make target ``install``:
|
||||||
|
|
||||||
|
.. code:: sh
|
||||||
|
|
||||||
|
$ make install
|
||||||
|
PYENV usage: source ./local/py3/bin/activate
|
||||||
|
PYENV using virtualenv from ./local/py3
|
||||||
|
PYENV install .
|
||||||
|
|
||||||
|
You have never to think about intermediate targets like ``pyenv`` or
|
||||||
|
``install``, the ``Makefile`` chains them as requisites. Just run your main
|
||||||
|
target.
|
||||||
|
|
||||||
|
.. sidebar:: drop environment
|
||||||
|
|
||||||
|
To get rid of the existing environment before re-build use :ref:`clean target
|
||||||
|
<make clean>` first.
|
||||||
|
|
||||||
|
If you think, something goes wrong with your ./local environment or you change
|
||||||
|
the :origin:`setup.py` file (or the requirements listed in
|
||||||
|
:origin:`requirements-dev.txt` and :origin:`requirements.txt`), you have to call
|
||||||
|
:ref:`make clean`.
|
||||||
|
|
||||||
|
|
||||||
|
.. _make run:
|
||||||
|
|
||||||
|
``make run``
|
||||||
|
============
|
||||||
|
|
||||||
|
To get up a running a developer instance simply call ``make run``. This enables
|
||||||
|
*debug* option in :origin:`searx/settings.yml`, starts a ``./searx/webapp.py``
|
||||||
|
instance, disables *debug* option again and opens the URL in your favorite WEB
|
||||||
|
browser (:man:`xdg-open`):
|
||||||
|
|
||||||
|
.. code:: sh
|
||||||
|
|
||||||
|
$ make run
|
||||||
|
PYENV usage: source ./local/py3/bin/activate
|
||||||
|
PYENV install .
|
||||||
|
./local/py3/bin/python ./searx/webapp.py
|
||||||
|
...
|
||||||
|
INFO:werkzeug: * Running on http://127.0.0.1:8888/ (Press CTRL+C to quit)
|
||||||
|
...
|
||||||
|
|
||||||
|
.. _make clean:
|
||||||
|
|
||||||
|
``make clean``
|
||||||
|
==============
|
||||||
|
|
||||||
|
Drop all intermediate files, all builds, but keep sources untouched. Includes
|
||||||
|
target ``pyclean`` which drops ./local environment. Before calling ``make
|
||||||
|
clean`` stop all processes using :ref:`make pyenv`.
|
||||||
|
|
||||||
|
.. code:: sh
|
||||||
|
|
||||||
|
$ make clean
|
||||||
|
CLEAN pyclean
|
||||||
|
CLEAN clean
|
||||||
|
|
||||||
|
.. _make docs:
|
||||||
|
|
||||||
|
``make docs docs-live docs-clean``
|
||||||
|
==================================
|
||||||
|
|
||||||
|
We describe the usage of the ``doc*`` targets in the :ref:`How to contribute /
|
||||||
|
Documentation <contrib docs>` section. If you want to edit the documentation
|
||||||
|
read our :ref:`make docs-live` section. If you are working in your own brand,
|
||||||
|
adjust your :ref:`Makefile setup <makefile setup>`.
|
||||||
|
|
||||||
|
|
||||||
|
.. _make gh-pages:
|
||||||
|
|
||||||
|
``make gh-pages``
|
||||||
|
=================
|
||||||
|
|
||||||
|
To deploy on github.io first adjust your :ref:`Makefile setup <makefile
|
||||||
|
setup>`. For any further read :ref:`deploy on github.io`.
|
||||||
|
|
||||||
|
.. _make test:
|
||||||
|
|
||||||
|
``make test``
|
||||||
|
=============
|
||||||
|
|
||||||
|
Runs a series of tests: ``test.pep8``, ``test.unit``, ``test.robot`` and does
|
||||||
|
additional :ref:`pylint checks <make pylint>`. You can run tests selective,
|
||||||
|
e.g.:
|
||||||
|
|
||||||
|
.. code:: sh
|
||||||
|
|
||||||
|
$ make test.pep8 test.unit
|
||||||
|
. ./local/py3/bin/activate; ./manage.sh pep8_check
|
||||||
|
[!] Running pep8 check
|
||||||
|
. ./local/py3/bin/activate; ./manage.sh unit_tests
|
||||||
|
[!] Running unit tests
|
||||||
|
|
||||||
|
.. _make pylint:
|
||||||
|
|
||||||
|
``make pylint``
|
||||||
|
===============
|
||||||
|
|
||||||
|
.. _Pylint: https://www.pylint.org/
|
||||||
|
|
||||||
|
Before commiting its recommend to do some (more) linting. Pylint_ is known as
|
||||||
|
one of the best source-code, bug and quality checker for the Python programming
|
||||||
|
language. Pylint_ is not yet a quality gate within our searx project (like
|
||||||
|
:ref:`test.pep8 <make test>` it is), but Pylint_ can help to improve code
|
||||||
|
quality anyway. The pylint profile we use at searx project is found in
|
||||||
|
project's root folder :origin:`.pylintrc`.
|
||||||
|
|
||||||
|
Code quality is a ongoing process. Don't try to fix all messages from Pylint,
|
||||||
|
run Pylint and check if your changed lines are bringing up new messages. If so,
|
||||||
|
fix it. By this, code quality gets incremental better and if there comes the
|
||||||
|
day, the linting is balanced out, we might decide to add Pylint as a quality
|
||||||
|
gate.
|
||||||
|
|
||||||
|
|
||||||
|
``make pybuild``
|
||||||
|
================
|
||||||
|
|
||||||
|
.. _PyPi: https://pypi.org/
|
||||||
|
.. _twine: https://twine.readthedocs.io/en/latest/
|
||||||
|
|
||||||
|
Build Python packages in ``./dist/py``.
|
||||||
|
|
||||||
|
.. code:: sh
|
||||||
|
|
||||||
|
$ make pybuild
|
||||||
|
...
|
||||||
|
BUILD pybuild
|
||||||
|
running sdist
|
||||||
|
running egg_info
|
||||||
|
...
|
||||||
|
$ ls ./dist/py/
|
||||||
|
searx-0.15.0-py3-none-any.whl searx-0.15.0.tar.gz
|
||||||
|
|
||||||
|
To upload packages to PyPi_, there is also a ``upload-pypi`` target. It needs
|
||||||
|
twine_ to be installed. Since you are not the owner of :pypi:`searx` you will
|
||||||
|
never need the latter.
|
|
@ -1,7 +1,13 @@
|
||||||
|
.. _dev plugin:
|
||||||
|
|
||||||
=======
|
=======
|
||||||
Plugins
|
Plugins
|
||||||
=======
|
=======
|
||||||
|
|
||||||
|
.. sidebar:: Further reading ..
|
||||||
|
|
||||||
|
- :ref:`plugins generic`
|
||||||
|
|
||||||
Plugins can extend or replace functionality of various components of searx.
|
Plugins can extend or replace functionality of various components of searx.
|
||||||
|
|
||||||
Example plugin
|
Example plugin
|
||||||
|
|
|
@ -4,15 +4,23 @@
|
||||||
Development Quickstart
|
Development Quickstart
|
||||||
======================
|
======================
|
||||||
|
|
||||||
|
.. sidebar:: :ref:`makefile`
|
||||||
|
|
||||||
|
For additional developer purpose there are :ref:`makefile`.
|
||||||
|
|
||||||
This quickstart guide gets your environment set up with searx. Furthermore, it
|
This quickstart guide gets your environment set up with searx. Furthermore, it
|
||||||
gives a short introduction to the ``manage.sh`` script.
|
gives a short introduction to the ``manage.sh`` script.
|
||||||
|
|
||||||
How to setup your development environment
|
How to setup your development environment
|
||||||
=========================================
|
=========================================
|
||||||
|
|
||||||
|
.. sidebar:: :ref:`make pyenv <make pyenv>`
|
||||||
|
|
||||||
|
Alternatively use the :ref:`make pyenv`.
|
||||||
|
|
||||||
First, clone the source code of searx to the desired folder. In this case the
|
First, clone the source code of searx to the desired folder. In this case the
|
||||||
source is cloned to ``~/myprojects/searx``. Then create and activate the
|
source is cloned to ``~/myprojects/searx``. Then create and activate the
|
||||||
searx-ve virtualenv and install the required packages using manage.sh.
|
searx-ve virtualenv and install the required packages using ``manage.sh``.
|
||||||
|
|
||||||
.. code:: sh
|
.. code:: sh
|
||||||
|
|
||||||
|
@ -27,6 +35,10 @@ searx-ve virtualenv and install the required packages using manage.sh.
|
||||||
How to run tests
|
How to run tests
|
||||||
================
|
================
|
||||||
|
|
||||||
|
.. sidebar:: :ref:`make test.unit <make test>`
|
||||||
|
|
||||||
|
Alternatively use the ``test.pep8``, ``test.unit``, ``test.robot`` targets.
|
||||||
|
|
||||||
Tests can be run using the ``manage.sh`` script. Following tests and checks are
|
Tests can be run using the ``manage.sh`` script. Following tests and checks are
|
||||||
available:
|
available:
|
||||||
|
|
||||||
|
@ -41,7 +53,8 @@ For example unit tests are run with the command below:
|
||||||
|
|
||||||
./manage.sh unit_tests
|
./manage.sh unit_tests
|
||||||
|
|
||||||
For further test options, please consult the help of the ``manage.sh`` script.
|
For further test options, please consult the help of the ``manage.sh`` script or
|
||||||
|
read :ref:`make test`.
|
||||||
|
|
||||||
|
|
||||||
How to compile styles and javascript
|
How to compile styles and javascript
|
||||||
|
@ -97,6 +110,11 @@ After installing grunt, the files can be built using the following command:
|
||||||
Tips for debugging/development
|
Tips for debugging/development
|
||||||
==============================
|
==============================
|
||||||
|
|
||||||
|
.. sidebar:: :ref:`make run`
|
||||||
|
|
||||||
|
Makefile target ``run`` already enables debug option for your developer
|
||||||
|
session / see :ref:`make run`.
|
||||||
|
|
||||||
Turn on debug logging
|
Turn on debug logging
|
||||||
Whether you are working on a new engine or trying to eliminate a bug, it is
|
Whether you are working on a new engine or trying to eliminate a bug, it is
|
||||||
always a good idea to turn on debug logging. When debug logging is enabled a
|
always a good idea to turn on debug logging. When debug logging is enabled a
|
||||||
|
@ -104,6 +122,10 @@ Turn on debug logging
|
||||||
message. It can be turned on by setting ``debug: False`` to ``debug: True`` in
|
message. It can be turned on by setting ``debug: False`` to ``debug: True`` in
|
||||||
:origin:`settings.yml <searx/settings.yml>`.
|
:origin:`settings.yml <searx/settings.yml>`.
|
||||||
|
|
||||||
|
.. sidebar:: :ref:`make test`
|
||||||
|
|
||||||
|
Alternatively use the :ref:`make test` targets.
|
||||||
|
|
||||||
Run ``./manage.sh tests`` before creating a PR.
|
Run ``./manage.sh tests`` before creating a PR.
|
||||||
Failing build on Travis is common because of PEP8 checks. So a new commit
|
Failing build on Travis is common because of PEP8 checks. So a new commit
|
||||||
must be created containing these format fixes. This phase can be skipped if
|
must be created containing these format fixes. This phase can be skipped if
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -14,6 +14,13 @@ Furthermore, two enpoints ``/`` and ``/search`` are available for querying.
|
||||||
Parameters
|
Parameters
|
||||||
==========
|
==========
|
||||||
|
|
||||||
|
.. sidebar:: Further reading ..
|
||||||
|
|
||||||
|
- :ref:`engines generic`
|
||||||
|
- :ref:`configured engines`
|
||||||
|
- :ref:`engine settings`
|
||||||
|
- :ref:`engine file`
|
||||||
|
|
||||||
``q`` : required
|
``q`` : required
|
||||||
The search query. This string is passed to external search services. Thus,
|
The search query. This string is passed to external search services. Thus,
|
||||||
searx supports syntax of each search service. For example, ``site:github.com
|
searx supports syntax of each search service. For example, ``site:github.com
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- originate: https://commons.wikimedia.org/wiki/File:Variable_Resistor.svg -->
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg"
|
||||||
|
version="1.1" baseProfile="full"
|
||||||
|
width="70px" height="40px" viewBox="0 0 700 400">
|
||||||
|
<line x1="0" y1="200" x2="700" y2="200" stroke="black" stroke-width="20px"/>
|
||||||
|
<rect x="100" y="100" width="500" height="200" fill="white" stroke="black" stroke-width="20px"/>
|
||||||
|
<line x1="180" y1="370" x2="500" y2="50" stroke="black" stroke-width="15px"/>
|
||||||
|
<polygon points="585 0 525 25 585 50" transform="rotate(135 525 25)"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 580 B |
|
@ -11,3 +11,6 @@ transifex-client==0.12.2
|
||||||
unittest2==1.1.0
|
unittest2==1.1.0
|
||||||
zope.testrunner==4.5.1
|
zope.testrunner==4.5.1
|
||||||
selenium==3.141.0
|
selenium==3.141.0
|
||||||
|
linuxdoc @ git+http://github.com/return42/linuxdoc.git
|
||||||
|
sphinx-jinja
|
||||||
|
sphinx-tabs
|
||||||
|
|
|
@ -89,8 +89,7 @@ def response(resp):
|
||||||
'content': content})
|
'content': content})
|
||||||
|
|
||||||
try:
|
try:
|
||||||
result_len_container = "".join(eval_xpath(dom, '//span[@class="sb_count"]/text()'))
|
result_len_container = "".join(eval_xpath(dom, '//span[@class="sb_count"]//text()'))
|
||||||
result_len_container = utils.to_string(result_len_container)
|
|
||||||
if "-" in result_len_container:
|
if "-" in result_len_container:
|
||||||
# Remove the part "from-to" for paginated request ...
|
# Remove the part "from-to" for paginated request ...
|
||||||
result_len_container = result_len_container[result_len_container.find("-") * 2 + 2:]
|
result_len_container = result_len_container[result_len_container.find("-") * 2 + 2:]
|
||||||
|
@ -102,7 +101,7 @@ def response(resp):
|
||||||
logger.debug('result error :\n%s', e)
|
logger.debug('result error :\n%s', e)
|
||||||
pass
|
pass
|
||||||
|
|
||||||
if _get_offset_from_pageno(resp.search_params.get("pageno", 0)) > result_len:
|
if result_len and _get_offset_from_pageno(resp.search_params.get("pageno", 0)) > result_len:
|
||||||
return []
|
return []
|
||||||
|
|
||||||
results.append({'number_of_results': result_len})
|
results.append({'number_of_results': result_len})
|
||||||
|
|
|
@ -109,14 +109,22 @@ def response(resp):
|
||||||
else:
|
else:
|
||||||
url = build_flickr_url(photo['ownerNsid'], photo['id'])
|
url = build_flickr_url(photo['ownerNsid'], photo['id'])
|
||||||
|
|
||||||
results.append({'url': url,
|
result = {
|
||||||
'title': title,
|
'url': url,
|
||||||
'img_src': img_src,
|
'img_src': img_src,
|
||||||
'thumbnail_src': thumbnail_src,
|
'thumbnail_src': thumbnail_src,
|
||||||
'content': content,
|
'source': source,
|
||||||
'author': author,
|
'img_format': img_format,
|
||||||
'source': source,
|
'template': 'images.html'
|
||||||
'img_format': img_format,
|
}
|
||||||
'template': 'images.html'})
|
try:
|
||||||
|
result['author'] = author.encode('utf-8')
|
||||||
|
result['title'] = title.encode('utf-8')
|
||||||
|
result['content'] = content.encode('utf-8')
|
||||||
|
except:
|
||||||
|
result['author'] = ''
|
||||||
|
result['title'] = ''
|
||||||
|
result['content'] = ''
|
||||||
|
results.append(result)
|
||||||
|
|
||||||
return results
|
return results
|
||||||
|
|
|
@ -32,7 +32,7 @@ base_url = 'https://www.ina.fr'
|
||||||
search_url = base_url + '/layout/set/ajax/recherche/result?autopromote=&hf={ps}&b={start}&type=Video&r=&{query}'
|
search_url = base_url + '/layout/set/ajax/recherche/result?autopromote=&hf={ps}&b={start}&type=Video&r=&{query}'
|
||||||
|
|
||||||
# specific xpath variables
|
# specific xpath variables
|
||||||
results_xpath = '//div[contains(@class,"search-results--list")]/div[@class="media"]'
|
results_xpath = '//div[contains(@class,"search-results--list")]//div[@class="media-body"]'
|
||||||
url_xpath = './/a/@href'
|
url_xpath = './/a/@href'
|
||||||
title_xpath = './/h3[@class="h3--title media-heading"]'
|
title_xpath = './/h3[@class="h3--title media-heading"]'
|
||||||
thumbnail_xpath = './/img/@src'
|
thumbnail_xpath = './/img/@src'
|
||||||
|
@ -65,8 +65,11 @@ def response(resp):
|
||||||
videoid = result.xpath(url_xpath)[0]
|
videoid = result.xpath(url_xpath)[0]
|
||||||
url = base_url + videoid
|
url = base_url + videoid
|
||||||
title = p.unescape(extract_text(result.xpath(title_xpath)))
|
title = p.unescape(extract_text(result.xpath(title_xpath)))
|
||||||
thumbnail = extract_text(result.xpath(thumbnail_xpath)[0])
|
try:
|
||||||
if thumbnail[0] == '/':
|
thumbnail = extract_text(result.xpath(thumbnail_xpath)[0])
|
||||||
|
except:
|
||||||
|
thumbnail = ''
|
||||||
|
if thumbnail and thumbnail[0] == '/':
|
||||||
thumbnail = base_url + thumbnail
|
thumbnail = base_url + thumbnail
|
||||||
d = extract_text(result.xpath(publishedDate_xpath)[0])
|
d = extract_text(result.xpath(publishedDate_xpath)[0])
|
||||||
d = d.split('/')
|
d = d.split('/')
|
||||||
|
|
|
@ -45,6 +45,8 @@ def request(query, params):
|
||||||
def response(resp):
|
def response(resp):
|
||||||
results = []
|
results = []
|
||||||
response_data = loads(resp.text)
|
response_data = loads(resp.text)
|
||||||
|
if not response_data:
|
||||||
|
return results
|
||||||
|
|
||||||
for result in response_data['results']:
|
for result in response_data['results']:
|
||||||
url = _get_url(result)
|
url = _get_url(result)
|
||||||
|
|
|
@ -29,7 +29,7 @@ def request(query, params):
|
||||||
params['url'] = search_url
|
params['url'] = search_url
|
||||||
params['method'] = 'POST'
|
params['method'] = 'POST'
|
||||||
params['headers']['Content-type'] = "application/json"
|
params['headers']['Content-type'] = "application/json"
|
||||||
params['data'] = dumps({"query": query,
|
params['data'] = dumps({"query": query.decode('utf-8'),
|
||||||
"searchField": "ALL",
|
"searchField": "ALL",
|
||||||
"sortDirection": "ASC",
|
"sortDirection": "ASC",
|
||||||
"sortOrder": "RELEVANCY",
|
"sortOrder": "RELEVANCY",
|
||||||
|
|
|
@ -12,10 +12,14 @@
|
||||||
|
|
||||||
from json import loads
|
from json import loads
|
||||||
from searx.url_utils import urlencode
|
from searx.url_utils import urlencode
|
||||||
|
import requests
|
||||||
|
import base64
|
||||||
|
|
||||||
# engine dependent config
|
# engine dependent config
|
||||||
categories = ['music']
|
categories = ['music']
|
||||||
paging = True
|
paging = True
|
||||||
|
api_client_id = None
|
||||||
|
api_client_secret = None
|
||||||
|
|
||||||
# search-url
|
# search-url
|
||||||
url = 'https://api.spotify.com/'
|
url = 'https://api.spotify.com/'
|
||||||
|
@ -31,6 +35,16 @@ def request(query, params):
|
||||||
|
|
||||||
params['url'] = search_url.format(query=urlencode({'q': query}), offset=offset)
|
params['url'] = search_url.format(query=urlencode({'q': query}), offset=offset)
|
||||||
|
|
||||||
|
r = requests.post(
|
||||||
|
'https://accounts.spotify.com/api/token',
|
||||||
|
data={'grant_type': 'client_credentials'},
|
||||||
|
headers={'Authorization': 'Basic ' + base64.b64encode(
|
||||||
|
"{}:{}".format(api_client_id, api_client_secret).encode('utf-8')
|
||||||
|
).decode('utf-8')}
|
||||||
|
)
|
||||||
|
j = loads(r.text)
|
||||||
|
params['headers'] = {'Authorization': 'Bearer {}'.format(j.get('access_token'))}
|
||||||
|
|
||||||
return params
|
return params
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -79,9 +79,10 @@ engines:
|
||||||
categories : science
|
categories : science
|
||||||
timeout : 4.0
|
timeout : 4.0
|
||||||
|
|
||||||
- name : base
|
# tmp suspended: dh key too small
|
||||||
engine : base
|
# - name : base
|
||||||
shortcut : bs
|
# engine : base
|
||||||
|
# shortcut : bs
|
||||||
|
|
||||||
- name : wikipedia
|
- name : wikipedia
|
||||||
engine : wikipedia
|
engine : wikipedia
|
||||||
|
@ -408,7 +409,7 @@ engines:
|
||||||
|
|
||||||
- name : library genesis
|
- name : library genesis
|
||||||
engine : xpath
|
engine : xpath
|
||||||
search_url : http://libgen.io/search.php?req={query}
|
search_url : https://libgen.is/search.php?req={query}
|
||||||
url_xpath : //a[contains(@href,"bookfi.net")]/@href
|
url_xpath : //a[contains(@href,"bookfi.net")]/@href
|
||||||
title_xpath : //a[contains(@href,"book/")]/text()[1]
|
title_xpath : //a[contains(@href,"book/")]/text()[1]
|
||||||
content_xpath : //td/a[1][contains(@href,"=author")]/text()
|
content_xpath : //td/a[1][contains(@href,"=author")]/text()
|
||||||
|
@ -464,7 +465,7 @@ engines:
|
||||||
- name : openairedatasets
|
- name : openairedatasets
|
||||||
engine : json_engine
|
engine : json_engine
|
||||||
paging : True
|
paging : True
|
||||||
search_url : http://api.openaire.eu/search/datasets?format=json&page={pageno}&size=10&title={query}
|
search_url : https://api.openaire.eu/search/datasets?format=json&page={pageno}&size=10&title={query}
|
||||||
results_query : response/results/result
|
results_query : response/results/result
|
||||||
url_query : metadata/oaf:entity/oaf:result/children/instance/webresource/url/$
|
url_query : metadata/oaf:entity/oaf:result/children/instance/webresource/url/$
|
||||||
title_query : metadata/oaf:entity/oaf:result/title/$
|
title_query : metadata/oaf:entity/oaf:result/title/$
|
||||||
|
@ -476,7 +477,7 @@ engines:
|
||||||
- name : openairepublications
|
- name : openairepublications
|
||||||
engine : json_engine
|
engine : json_engine
|
||||||
paging : True
|
paging : True
|
||||||
search_url : http://api.openaire.eu/search/publications?format=json&page={pageno}&size=10&title={query}
|
search_url : https://api.openaire.eu/search/publications?format=json&page={pageno}&size=10&title={query}
|
||||||
results_query : response/results/result
|
results_query : response/results/result
|
||||||
url_query : metadata/oaf:entity/oaf:result/children/instance/webresource/url/$
|
url_query : metadata/oaf:entity/oaf:result/children/instance/webresource/url/$
|
||||||
title_query : metadata/oaf:entity/oaf:result/title/$
|
title_query : metadata/oaf:entity/oaf:result/title/$
|
||||||
|
@ -552,10 +553,11 @@ engines:
|
||||||
timeout : 10.0
|
timeout : 10.0
|
||||||
disabled : True
|
disabled : True
|
||||||
|
|
||||||
- name : scanr structures
|
# tmp suspended: bad certificate
|
||||||
shortcut: scs
|
# - name : scanr structures
|
||||||
engine : scanr_structures
|
# shortcut: scs
|
||||||
disabled : True
|
# engine : scanr_structures
|
||||||
|
# disabled : True
|
||||||
|
|
||||||
- name : soundcloud
|
- name : soundcloud
|
||||||
engine : soundcloud
|
engine : soundcloud
|
||||||
|
@ -598,9 +600,12 @@ engines:
|
||||||
shortcut : se
|
shortcut : se
|
||||||
categories : science
|
categories : science
|
||||||
|
|
||||||
- name : spotify
|
# Spotify needs API credentials
|
||||||
engine : spotify
|
# - name : spotify
|
||||||
shortcut : stf
|
# engine : spotify
|
||||||
|
# shortcut : stf
|
||||||
|
# api_client_id : *******
|
||||||
|
# api_client_secret : *******
|
||||||
|
|
||||||
- name : startpage
|
- name : startpage
|
||||||
engine : startpage
|
engine : startpage
|
||||||
|
@ -812,7 +817,7 @@ locales:
|
||||||
doi_resolvers :
|
doi_resolvers :
|
||||||
oadoi.org : 'https://oadoi.org/'
|
oadoi.org : 'https://oadoi.org/'
|
||||||
doi.org : 'https://doi.org/'
|
doi.org : 'https://doi.org/'
|
||||||
doai.io : 'http://doai.io/'
|
doai.io : 'https://doai.io/'
|
||||||
sci-hub.tw : 'http://sci-hub.tw/'
|
sci-hub.tw : 'https://sci-hub.tw/'
|
||||||
|
|
||||||
default_doi_resolver : 'oadoi.org'
|
default_doi_resolver : 'oadoi.org'
|
||||||
|
|
|
@ -43,7 +43,7 @@ locales:
|
||||||
doi_resolvers :
|
doi_resolvers :
|
||||||
oadoi.org : 'https://oadoi.org/'
|
oadoi.org : 'https://oadoi.org/'
|
||||||
doi.org : 'https://doi.org/'
|
doi.org : 'https://doi.org/'
|
||||||
doai.io : 'http://doai.io/'
|
doai.io : 'https://doai.io/'
|
||||||
sci-hub.tw : 'http://sci-hub.tw/'
|
sci-hub.tw : 'https://sci-hub.tw/'
|
||||||
|
|
||||||
default_doi_resolver : 'oadoi.org'
|
default_doi_resolver : 'oadoi.org'
|
||||||
|
|
|
@ -125,6 +125,14 @@ $(document).ready(function() {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
function nextResult(current, direction) {
|
||||||
|
var next = current[direction]();
|
||||||
|
while (!next.is('.result') && next.length !== 0) {
|
||||||
|
next = next[direction]();
|
||||||
|
}
|
||||||
|
return next
|
||||||
|
}
|
||||||
|
|
||||||
function highlightResult(which) {
|
function highlightResult(which) {
|
||||||
return function() {
|
return function() {
|
||||||
var current = $('.result[data-vim-selected]');
|
var current = $('.result[data-vim-selected]');
|
||||||
|
@ -157,13 +165,13 @@ $(document).ready(function() {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'down':
|
case 'down':
|
||||||
next = current.next('.result');
|
next = nextResult(current, 'next');
|
||||||
if (next.length === 0) {
|
if (next.length === 0) {
|
||||||
next = $('.result:first');
|
next = $('.result:first');
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'up':
|
case 'up':
|
||||||
next = current.prev('.result');
|
next = nextResult(current, 'prev');
|
||||||
if (next.length === 0) {
|
if (next.length === 0) {
|
||||||
next = $('.result:last');
|
next = $('.result:last');
|
||||||
}
|
}
|
||||||
|
|
|
@ -198,6 +198,7 @@ $(GH_PAGES)::
|
||||||
$(MAKE) docs
|
$(MAKE) docs
|
||||||
[ -d "gh-pages/.git" ] || git clone $(GIT_URL) gh-pages
|
[ -d "gh-pages/.git" ] || git clone $(GIT_URL) gh-pages
|
||||||
-cd $(GH_PAGES); git checkout gh-pages >/dev/null
|
-cd $(GH_PAGES); git checkout gh-pages >/dev/null
|
||||||
|
-cd $(GH_PAGES); git pull
|
||||||
-cd $(GH_PAGES); ls -A | grep -v '.git$$' | xargs rm -rf
|
-cd $(GH_PAGES); ls -A | grep -v '.git$$' | xargs rm -rf
|
||||||
cp -r $(DOCS_DIST)/* $(GH_PAGES)/
|
cp -r $(DOCS_DIST)/* $(GH_PAGES)/
|
||||||
touch $(GH_PAGES)/.nojekyll
|
touch $(GH_PAGES)/.nojekyll
|
||||||
|
|
Loading…
Reference in New Issue