From 539e1a873eb772efc06573e46874e9c24afcb773 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9mi=20V=C3=A1nyi?= Date: Thu, 29 Sep 2022 22:24:00 +0200 Subject: [PATCH 01/36] Add documentation about offline engines --- docs/admin/command-engine.rst | 129 +++++++++++++++++++++++ docs/admin/engines.rst | 57 ++++++++++ docs/admin/index.rst | 4 + docs/admin/indexer-engines.rst | 89 ++++++++++++++++ docs/admin/no-sql-engines.rst | 170 ++++++++++++++++++++++++++++++ docs/admin/prefernces-private.png | Bin 0 -> 75817 bytes docs/admin/private-engines.rst | 44 ++++++++ 7 files changed, 493 insertions(+) create mode 100644 docs/admin/command-engine.rst create mode 100644 docs/admin/indexer-engines.rst create mode 100644 docs/admin/no-sql-engines.rst create mode 100644 docs/admin/prefernces-private.png create mode 100644 docs/admin/private-engines.rst diff --git a/docs/admin/command-engine.rst b/docs/admin/command-engine.rst new file mode 100644 index 00000000..c1b43948 --- /dev/null +++ b/docs/admin/command-engine.rst @@ -0,0 +1,129 @@ +===================================== +Run shell commands from your instance +===================================== + +Command line engines are custom engines that run commands in the shell of the +host. In this article you can learn how to create a command engine and how to +customize the result display. + +The command +=========== + +When specifyng commands, you must make sure the commands are available on the +searx host. Searx will not install anything for you. Also, make sure that the +``searx`` user on your host is allowed to run the selected command and has +access to the required files. + +Access control +============== + +Be careful when creating command engines if you are running a public +instance. Do not expose any sensitive information. You can restrict access by +configuring a list of access tokens under tokens in your ``settings.yml``. + +Available settings +================== + +* ``command``: A comma separated list of the elements of the command. A special + token ``{{QUERY}}`` tells searx where to put the search terms of the + user. Example: ``['ls', '-l', '-h', '{{QUERY}}']`` +* ``query_type``: The expected type of user search terms. Possible values: + ``path`` and ``enum``. ``path`` checks if the uesr provided path is inside the + working directory. If not the query is not executed. ``enum`` is a list of + allowed search terms. If the user submits something which is not included in + the list, the query returns an error. +* ``delimiter``: A dict containing a delimiter char and the "titles" of each + element in keys. +* ``parse_regex``: A dict containing the regular expressions for each result + key. +* ``query_enum``: A list containing allowed search terms if ``query_type`` is + set to ``enum``. +* ``working_dir``: The directory where the command has to be executed. Default: + ``.`` +* ``result_separator``: The character that separates results. Default: ``\n`` + +Customize the result template +============================= + +There is a default result template for displaying key-value pairs coming from +command engines. If you want something more tailored to your result types, you +can design your own template. + +Searx relies on `Jinja2 `_ for +templating. If you are familiar with Jinja, you will not have any issues +creating templates. You can access the result attributes with ``{{ +result.attribute_name }}``. + +In the example below the result has two attributes: ``header`` and ``content``. +To customize their diplay, you need the following template (you must define +these classes yourself): + +.. code:: html + +
+
+ {{ result.header }} +
+
+ {{ result.content }} +
+
+ +Then put your template under ``searx/templates/{theme-name}/result_templates`` +named ``your-template-name.html``. You can select your custom template with the +option ``result_template``. + +.. code:: yaml + + - name: your engine name + engine: command + result_template: your-template-name.html + +Examples +======== + +Find files by name +------------------ + +The first example is to find files on your searx host. It uses the command +`find` available on most Linux distributions. It expects a path type query. The +path in the search request must be inside the ``working_dir``. + +The results are displayed with the default `key-value.html` template. A result +is displayed in a single row table with the key "line". + +.. code:: yaml + + - name : find + engine : command + command : ['find', '.', '-name', '{{QUERY}}'] + query_type : path + shortcut : fnd + tokens : [] + disabled : True + delimiter : + chars : ' ' + keys : ['line'] + + +Find files by contents +----------------------- + +In the second example, we define an engine that searches in the contents of the +files under the ``working_dir``. The search type is not defined, so the user can +input any string they want. To restrict the input, you can set the ``query_type`` +to ``enum`` and only allow a set of search terms to protect +yourself. Alternatively, make the engine private, so no one malevolent accesses +the engine. + +.. code:: yaml + + - name : regex search in files + engine : command + command : ['grep', '{{QUERY}}'] + shortcut : gr + tokens : [] + disabled : True + delimiter : + chars : ' ' + keys : ['line'] diff --git a/docs/admin/engines.rst b/docs/admin/engines.rst index 3ad20630..36b96ae3 100644 --- a/docs/admin/engines.rst +++ b/docs/admin/engines.rst @@ -86,3 +86,60 @@ Show errors **DE** {% endfor %} + .. flat-table:: Additional engines (commented out in settings.yml) + :header-rows: 1 + :stub-columns: 2 + + * - Name + - Base URL + - Host + - Port + - Paging + + * - elasticsearch + - localhost:9200 + - + - + - False + + * - meilicsearch + - localhost:7700 + - + - + - True + + * - mongodb + - + - 127.0.0.1 + - 21017 + - True + + * - mysql_server + - + - 127.0.0.1 + - 3306 + - True + + * - postgresql + - + - 127.0.0.1 + - 5432 + - True + + * - redis_server + - + - 127.0.0.1 + - 6379 + - False + + * - solr + - localhost:8983 + - + - + - True + + * - sqlite + - + - + - + - True diff --git a/docs/admin/index.rst b/docs/admin/index.rst index c708c4ff..660ed5fe 100644 --- a/docs/admin/index.rst +++ b/docs/admin/index.rst @@ -19,5 +19,9 @@ Administrator documentation filtron morty engines + private-engines + command-engine + indexer-engines + no-sql-engines plugins buildhosts diff --git a/docs/admin/indexer-engines.rst b/docs/admin/indexer-engines.rst new file mode 100644 index 00000000..fcb814d4 --- /dev/null +++ b/docs/admin/indexer-engines.rst @@ -0,0 +1,89 @@ +================== +Search in indexers +================== + +Searx supports three popular indexer search engines: + +* Elasticsearch +* Meilisearch +* Solr + +Elasticsearch +============= + +Make sure that the Elasticsearch user has access to the index you are querying. +If you are not using TLS during your connection, set ``enable_http`` to ``True``. + +.. code:: yaml + + - name : elasticsearch + shortcut : es + engine : elasticsearch + base_url : http://localhost:9200 + username : elastic + password : changeme + index : my-index + query_type : match + enable_http : True + +Available settings +------------------ + +* ``base_url``: URL of Elasticsearch instance. By default it is set to ``http://localhost:9200``. +* ``index``: Name of the index to query. Required. +* ``query_type``: Elasticsearch query method to use. Available: ``match``, + ``simple_query_string``, ``term``, ``terms``, ``custom``. +* ``custom_query_json``: If you selected ``custom`` for ``query_type``, you must + provide the JSON payload in this option. +* ``username``: Username in Elasticsearch +* ``password``: Password for the Elasticsearch user + +Meilisearch +=========== + +If you are not using TLS during connection, set ``enable_http`` to ``True``. + +.. code:: yaml + + - name : meilisearch + engine : meilisearch + shortcut: mes + base_url : http://localhost:7700 + index : my-index + enable_http: True + +Available settings +------------------ + +* ``base_url``: URL of the Meilisearch instance. By default it is set to http://localhost:7700 +* ``index``: Name of the index to query. Required. +* ``auth_key``: Key required for authentication. +* ``facet_filters``: List of facets to search in. + +Solr +==== + +If you are not using TLS during connection, set ``enable_http`` to ``True``. + +.. code:: yaml + + - name : solr + engine : solr + shortcut : slr + base_url : http://localhost:8983 + collection : my-collection + sort : asc + enable_http : True + +Available settings +------------------ + +* ``base_url``: URL of the Meilisearch instance. By default it is set to http://localhost:8983 +* ``collection``: Name of the collection to query. Required. +* ``sort``: Sorting of the results. Available: ``asc``, ``desc``. +* ``rows``: Maximum number of results from a query. Default value: 10. +* ``field_list``: List of fields returned from the query. +* ``default_fields``: Default fields to query. +* ``query_fields``: List of fields with a boost factor. The bigger the boost + factor of a field, the more important the field is in the query. Example: + ``qf="field1^2.3 field2"`` diff --git a/docs/admin/no-sql-engines.rst b/docs/admin/no-sql-engines.rst new file mode 100644 index 00000000..5da19df5 --- /dev/null +++ b/docs/admin/no-sql-engines.rst @@ -0,0 +1,170 @@ +=========================== +Query SQL and NoSQL servers +=========================== + +SQL +=== + +SQL servers are traditional databases with predefined data schema. Furthermore, +modern versions also support BLOB data. + +You can search in the following servers: + +* `PostgreSQL`_ +* `MySQL`_ +* `SQLite`_ + +The configuration of the new database engines are similar. You must put a valid +SELECT SQL query in ``query_str``. At the moment you can only bind at most +one parameter in your query. + +Do not include LIMIT or OFFSET in your SQL query as the engines +rely on these keywords during paging. + +PostgreSQL +---------- + +Required PyPi package: ``psychopg2`` + +You can find an example configuration below: + +.. code:: yaml + + - name : postgresql + engine : postgresql + database : my_database + username : searx + password : password + query_str : 'SELECT * from my_table WHERE my_column = %(query)s' + shortcut : psql + + +Available options +~~~~~~~~~~~~~~~~~ +* ``host``: IP address of the host running PostgreSQL. By default it is ``127.0.0.1``. +* ``port``: Port number PostgreSQL is listening on. By default it is ``5432``. +* ``database``: Name of the database you are connecting to. +* ``username``: Name of the user connecting to the database. +* ``password``: Password of the database user. +* ``query_str``: Query string to run. Keywords like ``LIMIT`` and ``OFFSET`` are not allowed. Required. +* ``limit``: Number of returned results per page. By default it is 10. + +MySQL +----- + +Required PyPi package: ``mysql-connector-python`` + +This is an example configuration for quering a MySQL server: + +.. code:: yaml + + - name : mysql + engine : mysql_server + database : my_database + username : searx + password : password + limit : 5 + query_str : 'SELECT * from my_table WHERE my_column=%(query)s' + shortcut : mysql + + +Available options +~~~~~~~~~~~~~~~~~ +* ``host``: IP address of the host running MySQL. By default it is ``127.0.0.1``. +* ``port``: Port number MySQL is listening on. By default it is ``3306``. +* ``database``: Name of the database you are connecting to. +* ``auth_plugin``: Authentication plugin to use. By default it is ``caching_sha2_password``. +* ``username``: Name of the user connecting to the database. +* ``password``: Password of the database user. +* ``query_str``: Query string to run. Keywords like ``LIMIT`` and ``OFFSET`` are not allowed. Required. +* ``limit``: Number of returned results per page. By default it is 10. + +SQLite +------ + +You can read from your database ``my_database`` using this example configuration: + +.. code:: yaml + + - name : sqlite + engine : sqlite + shortcut: sq + database : my_database + query_str : 'SELECT * FROM my_table WHERE my_column=:query' + + +Available options +~~~~~~~~~~~~~~~~~ +* ``database``: Name of the database you are connecting to. +* ``query_str``: Query string to run. Keywords like ``LIMIT`` and ``OFFSET`` are not allowed. Required. +* ``limit``: Number of returned results per page. By default it is 10. + +NoSQL +===== + +NoSQL data stores are used for storing arbitrary data without first defining their +structure. To query the supported servers, you must install their drivers using PyPi. + +You can search in the following servers: + +* `Redis`_ +* `MongoDB`_ + +Redis +----- + +Reqired PyPi package: ``redis`` + +Example configuration: + +.. code:: yaml + + - name : mystore + engine : redis_server + exact_match_only : True + host : 127.0.0.1 + port : 6379 + password : secret-password + db : 0 + shortcut : rds + enable_http : True + +Available options +~~~~~~~~~~~~~~~~~ + +* ``host``: IP address of the host running Redis. By default it is ``127.0.0.1``. +* ``port``: Port number Redis is listening on. By default it is ``6379``. +* ``password``: Password if required by Redis. +* ``db``: Number of the database you are connecting to. +* ``exact_match_only``: Enable if you need exact matching. By default it is ``True``. + + +MongoDB +------- + +Required PyPi package: ``pymongo`` + +Below is an example configuration for using a MongoDB collection: + +.. code:: yaml + + - name : mymongo + engine : mongodb + shortcut : icm + host : '127.0.0.1' + port : 27017 + database : personal + collection : income + key : month + enable_http: True + + +Available options +~~~~~~~~~~~~~~~~~ + +* ``host``: IP address of the host running MongoDB. By default it is ``127.0.0.1``. +* ``port``: Port number MongoDB is listening on. By default it is ``27017``. +* ``password``: Password if required by Redis. +* ``database``: Name of the database you are connecting to. +* ``collection``: Name of the collection you want to search in. +* ``exact_match_only``: Enable if you need exact matching. By default it is ``True``. diff --git a/docs/admin/prefernces-private.png b/docs/admin/prefernces-private.png new file mode 100644 index 0000000000000000000000000000000000000000..6ff69ca8ae8c5fd325790ef8b418e0cd485692dc GIT binary patch literal 75817 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 literal 0 HcmV?d00001 diff --git a/docs/admin/private-engines.rst b/docs/admin/private-engines.rst new file mode 100644 index 00000000..36636143 --- /dev/null +++ b/docs/admin/private-engines.rst @@ -0,0 +1,44 @@ +============================= +How to create private engines +============================= + +If you are running your public searx instance, you might want to restrict access +to some engines. Maybe you are afraid of bots might abusing the engine. Or the +engine might return private results you do not want to share with strangers. + +Server side configuration +========================= + +You can make any engine private by setting a list of tokens in your settings.yml +file. In the following example, we set two different tokens that provide access +to the engine. + +.. code:: yaml + + - name: my-private-google + engine: google + shortcut: pgo + tokens: ['my-secret-token-1', 'my-secret-token-2'] + + +To access the private engine, you must distribute the tokens to your searx +users. It is up to you how you let them know what the access token is you +created. + +Client side configuration +========================= + +As a searx instance user, you can add any number of access tokens on the +Preferences page. You have to set a comma separated lists of strings in "Engine +tokens" input, then save your new preferences. + +.. image:: prefernces-private.png + :width: 600px + :align: center + :alt: location of token textarea + +Once the Preferences page is loaded again, you can see the information of the +private engines you got access to. If you cannot see the expected engines in the +engines list, double check your token. If there is no issue with the token, +contact your instance administrator. + From 57e7e3bbf6da3c94f3f4e6f98edbb30b281d03a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9mi=20V=C3=A1nyi?= Date: Thu, 29 Sep 2022 22:58:43 +0200 Subject: [PATCH 02/36] fix issue reported by linter --- searx/webapp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/searx/webapp.py b/searx/webapp.py index 9f5a004b..8c1d57ac 100755 --- a/searx/webapp.py +++ b/searx/webapp.py @@ -647,7 +647,7 @@ def search(): # removing html content and whitespace duplications result['title'] = ' '.join(html_to_text(result['title']).strip().split()) - if 'url' in result and !('pretty_url' in result): + if 'url' in result and 'pretty_url' not in result: result['pretty_url'] = prettify_url(result['url']) # TODO, check if timezone is calculated right From 629ebb426fa19c8009357be1b824008ae981449d Mon Sep 17 00:00:00 2001 From: Kian-Meng Ang Date: Fri, 30 Sep 2022 05:06:59 +0800 Subject: [PATCH 03/36] Fix typos (#3366) Found via `codespell -S ./searx/translations,./searx/data,./searx/static -L ans,te,fo,doubleclick,tthe,dum` --- CHANGELOG.rst | 2 +- README.rst | 6 +++--- dockerfiles/docker-entrypoint.sh | 2 +- dockerfiles/uwsgi.ini | 2 +- docs/admin/engines.rst | 2 +- docs/admin/engines/recoll.rst | 2 +- docs/admin/installation-uwsgi.rst | 2 +- docs/admin/settings.rst | 2 +- docs/blog/lxcdev-202006.rst | 6 +++--- docs/blog/search-database-engines.rst | 4 ++-- docs/blog/search-indexer-engines.rst | 4 ++-- docs/blog/sql-engines.rst | 2 +- docs/dev/engine_overview.rst | 4 ++-- docs/dev/reST.rst | 16 +++++++-------- docs/user/search_syntax.rst | 2 +- manage | 2 +- searx/__init__.py | 4 ++-- searx/engines/__init__.py | 4 ++-- searx/engines/bing_videos.py | 2 +- searx/engines/duckduckgo_definitions.py | 2 +- searx/engines/github.py | 2 +- searx/engines/google.py | 2 +- searx/engines/google_news.py | 4 ++-- searx/engines/google_videos.py | 4 ++-- searx/engines/photon.py | 2 +- searx/engines/prowlarr.py | 2 +- searx/engines/startpage.py | 4 ++-- searx/engines/wikidata.py | 4 ++-- searx/engines/wolframalpha_api.py | 2 +- searx/engines/xpath.py | 2 +- searx/external_urls.py | 2 +- searx/plugins/https_rewrite.py | 2 +- searx/plugins/https_rules/Yahoo.xml | 2 +- searx/poolrequests.py | 2 +- searx/preferences.py | 12 +++++------ searx/query.py | 8 ++++---- searx/results.py | 8 ++++---- searx/search/checker/__main__.py | 2 +- searx/search/checker/background.py | 2 +- searx/search/checker/impl.py | 4 ++-- searx/search/processors/online.py | 2 +- searx/settings.yml | 4 ++-- searx/settings_loader.py | 4 ++-- searx/templates/oscar/preferences.html | 2 +- searx/testing.py | 2 +- searx/webadapter.py | 6 +++--- searx/webapp.py | 2 +- searx/webutils.py | 2 +- searx_extra/update/update_currencies.py | 4 ++-- searx_extra/update/update_languages.py | 2 +- utils/lib.sh | 20 +++++++++---------- utils/lxc.sh | 6 +++--- utils/morty.sh | 2 +- utils/searx.sh | 10 +++++----- .../etc/uwsgi/apps-archlinux/searx.ini | 2 +- .../etc/uwsgi/apps-archlinux/searx.ini:socket | 2 +- .../etc/uwsgi/apps-available/searx.ini | 2 +- .../etc/uwsgi/apps-available/searx.ini:socket | 2 +- 58 files changed, 110 insertions(+), 110 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index d92c5fc9..ee832dd6 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -424,7 +424,7 @@ Special thanks to `NLNet `__ for sponsoring multiple features - Removed engines: faroo Special thanks to `NLNet `__ for sponsoring multiple features of this release. -Special thanks to https://www.accessibility.nl/english for making accessibilty audit. +Special thanks to https://www.accessibility.nl/english for making accessibility audit. News ~~~~ diff --git a/README.rst b/README.rst index b1ca5544..2ddeed0c 100644 --- a/README.rst +++ b/README.rst @@ -94,7 +94,7 @@ the new proposed features privacy respecting enough. The most significant issue engine metrics. Searx is built for privacy conscious users. It comes a unique set of -challanges. One of the problems we face is that users rather not report bugs, +challenges. One of the problems we face is that users rather not report bugs, because they do not want to publicly share what engines they use or what search query triggered a problem. It is a challenge we accepted. @@ -124,8 +124,8 @@ instances locally, instead of using public instances. Why should I use SearxNG? ######################### -SearxNG has rolling releases, depencencies updated more frequently, and engines are fixed +SearxNG has rolling releases, dependencies updated more frequently, and engines are fixed faster. It is easy to set up your own public instance, and monitor its -perfomance and metrics. It is simple to maintain as an instance adminstrator. +performance and metrics. It is simple to maintain as an instance administrator. As a user, it provides a prettier user interface and nicer experience. diff --git a/dockerfiles/docker-entrypoint.sh b/dockerfiles/docker-entrypoint.sh index 6592b1c7..eddab685 100755 --- a/dockerfiles/docker-entrypoint.sh +++ b/dockerfiles/docker-entrypoint.sh @@ -100,7 +100,7 @@ update_conf() { # There is a new version if [ $FORCE_CONF_UPDATE -ne 0 ]; then # Replace the current configuration - printf '⚠️ Automaticaly update %s to the new version\n' "${CONF}" + printf '⚠️ Automatically update %s to the new version\n' "${CONF}" if [ ! -f "${OLD_CONF}" ]; then printf 'The previous configuration is saved to %s\n' "${OLD_CONF}" mv "${CONF}" "${OLD_CONF}" diff --git a/dockerfiles/uwsgi.ini b/dockerfiles/uwsgi.ini index 818a99cc..b4662e79 100644 --- a/dockerfiles/uwsgi.ini +++ b/dockerfiles/uwsgi.ini @@ -9,7 +9,7 @@ workers = 4 # The right granted on the created socket chmod-socket = 666 -# Plugin to use and interpretor config +# Plugin to use and interpreter config single-interpreter = true master = true plugin = python3 diff --git a/docs/admin/engines.rst b/docs/admin/engines.rst index 36b96ae3..ed6f27bd 100644 --- a/docs/admin/engines.rst +++ b/docs/admin/engines.rst @@ -37,7 +37,7 @@ Disabled **D** Engine type **ET** ------------- ----------- -------------------- ------------ Safe search **SS** ------------- ----------- --------------------------------- -Weigth **W** +Weight **W** ------------- ----------- --------------------------------- Disabled **D** ------------- ----------- --------------------------------- diff --git a/docs/admin/engines/recoll.rst b/docs/admin/engines/recoll.rst index cba2e81f..d1f717ac 100644 --- a/docs/admin/engines/recoll.rst +++ b/docs/admin/engines/recoll.rst @@ -39,7 +39,7 @@ Example Scenario: #. Recoll indexes a local filesystem mounted in ``/export/documents/reference``, -#. the Recoll search inteface can be reached at https://recoll.example.org/ and +#. the Recoll search interface can be reached at https://recoll.example.org/ and #. the contents of this filesystem can be reached though https://download.example.org/reference .. code:: yaml diff --git a/docs/admin/installation-uwsgi.rst b/docs/admin/installation-uwsgi.rst index 7b482975..03aabeb7 100644 --- a/docs/admin/installation-uwsgi.rst +++ b/docs/admin/installation-uwsgi.rst @@ -94,7 +94,7 @@ My experience is, that this command is a bit buggy. .. _uwsgi configuration: -Alltogether +All together =========== Create the configuration ini-file according to your distribution (see below) and diff --git a/docs/admin/settings.rst b/docs/admin/settings.rst index 7cf055db..9ef5784e 100644 --- a/docs/admin/settings.rst +++ b/docs/admin/settings.rst @@ -129,7 +129,7 @@ Global Settings outgoing: # communication with search engines request_timeout : 2.0 # default timeout in seconds, can be override by engine # max_request_timeout: 10.0 # the maximum timeout in seconds - useragent_suffix : "" # informations like an email address to the administrator + useragent_suffix : "" # information like an email address to the administrator pool_connections : 100 # Number of different hosts pool_maxsize : 10 # Number of simultaneous requests by host # uncomment below section if you want to use a proxy diff --git a/docs/blog/lxcdev-202006.rst b/docs/blog/lxcdev-202006.rst index b53501da..0323ea22 100644 --- a/docs/blog/lxcdev-202006.rst +++ b/docs/blog/lxcdev-202006.rst @@ -207,7 +207,7 @@ debug services from filtron and morty analogous use: Another point we have to notice is that each service (:ref:`searx `, :ref:`filtron ` and :ref:`morty `) runs under dedicated system user account with the same name (compare :ref:`create searx user`). To -get a shell from theses accounts, simply call one of the scripts: +get a shell from these accounts, simply call one of the scripts: .. tabs:: @@ -311,7 +311,7 @@ of the container: Now we can develop as usual in the working tree of our desktop system. Every time the software was changed, you have to restart the searx service (in the -conatiner): +container): .. tabs:: @@ -370,7 +370,7 @@ We build up a fully functional searx suite in a archlinux container: $ sudo -H ./utils/lxc.sh install suite searx-archlinux To access HTTP from the desktop we installed nginx for the services inside the -conatiner: +container: .. tabs:: diff --git a/docs/blog/search-database-engines.rst b/docs/blog/search-database-engines.rst index 94f418e7..667296a4 100644 --- a/docs/blog/search-database-engines.rst +++ b/docs/blog/search-database-engines.rst @@ -16,7 +16,7 @@ you can use your owm template by placing the template under ``searx/templates/{theme_name}/result_templates/{template_name}`` and setting ``result_template`` attribute to ``{template_name}``. -Futhermore, if you do not want to expose these engines on a public instance, you can +Furthermore, if you do not want to expose these engines on a public instance, you can still add them and limit the access by setting ``tokens`` as described in the `blog post about private engines`_. @@ -29,7 +29,7 @@ structure. Redis ----- -Reqired package: ``redis`` +Required package: ``redis`` Redis is a key value based data store usually stored in memory. diff --git a/docs/blog/search-indexer-engines.rst b/docs/blog/search-indexer-engines.rst index ca4dd3c8..1dafa4fb 100644 --- a/docs/blog/search-indexer-engines.rst +++ b/docs/blog/search-indexer-engines.rst @@ -15,7 +15,7 @@ All of the engines above are added to ``settings.yml`` just commented out, as yo Please note that if you are not using HTTPS to access these engines, you have to enable HTTP requests by setting ``enable_http`` to ``True``. -Futhermore, if you do not want to expose these engines on a public instance, you can +Furthermore, if you do not want to expose these engines on a public instance, you can still add them and limit the access by setting ``tokens`` as described in the `blog post about private engines`_. @@ -57,7 +57,7 @@ small-scale (less than 10 million documents) data collections. E.g. it is great web pages you have visited and searching in the contents later. The engine supports faceted search, so you can search in a subset of documents of the collection. -Futhermore, you can search in Meilisearch instances that require authentication by setting ``auth_token``. +Furthermore, you can search in Meilisearch instances that require authentication by setting ``auth_token``. Here is a simple example to query a Meilisearch instance: diff --git a/docs/blog/sql-engines.rst b/docs/blog/sql-engines.rst index c40e3e79..68a9e3fa 100644 --- a/docs/blog/sql-engines.rst +++ b/docs/blog/sql-engines.rst @@ -62,7 +62,7 @@ Before enabling MySQL engine, you must install the package ``mysql-connector-pyt The authentication plugin is configurable by setting ``auth_plugin`` in the attributes. By default it is set to ``caching_sha2_password``. -This is an example configuration for quering a MySQL server: +This is an example configuration for querying a MySQL server: .. code:: yaml diff --git a/docs/dev/engine_overview.rst b/docs/dev/engine_overview.rst index bbd14139..186042f3 100644 --- a/docs/dev/engine_overview.rst +++ b/docs/dev/engine_overview.rst @@ -41,7 +41,7 @@ engine file argument type information ======================= =========== ======================================================== categories list pages, in which the engine is working -paging boolean support multible pages +paging boolean support multiple pages time_range_support boolean support search time range engine_type str ``online`` by default, other possibles values are ``offline``, ``online_dictionary``, ``online_currency`` @@ -159,7 +159,7 @@ parsed arguments ---------------- The function ``def request(query, params):`` always returns the ``params`` -variable. Inside searx, the following paramters can be used to specify a search +variable. Inside searx, the following parameters can be used to specify a search request: =================== =========== ========================================================================== diff --git a/docs/dev/reST.rst b/docs/dev/reST.rst index 1817504c..e690e55c 100644 --- a/docs/dev/reST.rst +++ b/docs/dev/reST.rst @@ -15,7 +15,7 @@ generated and deployed at :docs:`github.io <.>`. For build prerequisites read :ref:`docs build`. The source files of Searx's documentation are located at :origin:`docs`. Sphinx -assumes source files to be encoded in UTF-8 by defaul. Run :ref:`make docs.live +assumes source files to be encoded in UTF-8 by default. Run :ref:`make docs.live ` to build HTML while editing. .. sidebar:: Further reading @@ -227,13 +227,13 @@ To refer anchors use the `ref role`_ markup: .. code:: reST - Visit chapter :ref:`reST anchor`. Or set hyperlink text manualy :ref:`foo + Visit chapter :ref:`reST anchor`. Or set hyperlink text manually :ref:`foo bar `. .. admonition:: ``:ref:`` role :class: rst-example - Visist chapter :ref:`reST anchor`. Or set hyperlink text manualy :ref:`foo + Visist chapter :ref:`reST anchor`. Or set hyperlink text manually :ref:`foo bar `. .. _reST ordinary ref: @@ -494,8 +494,8 @@ Figures & Images is flexible. To get best results in the generated output format, install ImageMagick_ and Graphviz_. -Searx's sphinx setup includes: :ref:`linuxdoc:kfigure`. Scaleable here means; -scaleable in sense of the build process. Normally in absence of a converter +Searx's sphinx setup includes: :ref:`linuxdoc:kfigure`. Scalable here means; +scalable in sense of the build process. Normally in absence of a converter tool, the build process will break. From the authors POV it’s annoying to care about the build process when handling with images, especially since he has no access to the build process. With :ref:`linuxdoc:kfigure` the build process @@ -503,7 +503,7 @@ continues and scales output quality in dependence of installed image processors. If you want to add an image, you should use the ``kernel-figure`` (inheritance of :dudir:`figure`) and ``kernel-image`` (inheritance of :dudir:`image`) -directives. E.g. to insert a figure with a scaleable image format use SVG +directives. E.g. to insert a figure with a scalable image format use SVG (:ref:`svg image example`): .. code:: reST @@ -1185,7 +1185,7 @@ and *targets* (e.g. a ref to :ref:`row 2 of table's body `). - cell 4.4 * - row 5 - - cell 5.1 with automatic span to rigth end + - cell 5.1 with automatic span to right end * - row 6 - cell 6.1 @@ -1237,7 +1237,7 @@ and *targets* (e.g. a ref to :ref:`row 2 of table's body `). - cell 4.4 * - row 5 - - cell 5.1 with automatic span to rigth end + - cell 5.1 with automatic span to right end * - row 6 - cell 6.1 diff --git a/docs/user/search_syntax.rst b/docs/user/search_syntax.rst index 57cb5195..7068f8dc 100644 --- a/docs/user/search_syntax.rst +++ b/docs/user/search_syntax.rst @@ -17,7 +17,7 @@ Prefix: ``:`` Prefix: ``?`` to add engines and categories to the currently selected categories -Abbrevations of the engines and languages are also accepted. Engine/category +Abbreviations of the engines and languages are also accepted. Engine/category modifiers are chainable and inclusive (e.g. with :search:`!it !ddg !wp qwer ` search in IT category **and** duckduckgo **and** wikipedia for ``qwer``). diff --git a/manage b/manage index f9a92864..af264cdf 100755 --- a/manage +++ b/manage @@ -192,7 +192,7 @@ docker.build() { # awk to remove the "v" and the "g" SEARX_GIT_VERSION=$(git describe --tags | awk -F'-' '{OFS="-"; $1=substr($1, 2); if ($3) { $3=substr($3, 2); } print}') - # add the suffix "-dirty" if the repository has uncommited change + # add the suffix "-dirty" if the repository has uncommitted change # /!\ HACK for searx/searx: ignore utils/brand.env git update-index -q --refresh if [ ! -z "$(git diff-index --name-only HEAD -- | grep -v 'utils/brand.env')" ]; then diff --git a/searx/__init__.py b/searx/__init__.py index 0f9b435b..cf116d31 100644 --- a/searx/__init__.py +++ b/searx/__init__.py @@ -41,11 +41,11 @@ if settings['ui']['static_path']: ''' enable debug if -the environnement variable SEARX_DEBUG is 1 or true +the environment variable SEARX_DEBUG is 1 or true (whatever the value in settings.yml) or general.debug=True in settings.yml disable debug if -the environnement variable SEARX_DEBUG is 0 or false +the environment variable SEARX_DEBUG is 0 or false (whatever the value in settings.yml) or general.debug=False in settings.yml ''' diff --git a/searx/engines/__init__.py b/searx/engines/__init__.py index 79bdfbc0..75e30513 100644 --- a/searx/engines/__init__.py +++ b/searx/engines/__init__.py @@ -142,7 +142,7 @@ def load_engine(engine_data): engine.stats = { 'sent_search_count': 0, # sent search - 'search_count': 0, # succesful search + 'search_count': 0, # successful search 'result_count': 0, 'engine_time': 0, 'engine_time_count': 0, @@ -171,7 +171,7 @@ def load_engine(engine_data): categories.setdefault(category_name, []).append(engine) if engine.shortcut in engine_shortcuts: - logger.error('Engine config error: ambigious shortcut: {0}'.format(engine.shortcut)) + logger.error('Engine config error: ambiguous shortcut: {0}'.format(engine.shortcut)) sys.exit(1) engine_shortcuts[engine.shortcut] = engine.name diff --git a/searx/engines/bing_videos.py b/searx/engines/bing_videos.py index 2e1f13de..e25f152e 100644 --- a/searx/engines/bing_videos.py +++ b/searx/engines/bing_videos.py @@ -70,7 +70,7 @@ def request(query, params): if params['time_range'] in time_range_dict: params['url'] += time_range_string.format(interval=time_range_dict[params['time_range']]) - # bing videos did not like "older" versions < 70.0.1 when selectin other + # bing videos did not like "older" versions < 70.0.1 when selecting other # languages then 'en' .. very strange ?!?! params['headers']['User-Agent'] = 'Mozilla/5.0 (X11; Linux x86_64; rv:73.0.1) Gecko/20100101 Firefox/73.0.1' diff --git a/searx/engines/duckduckgo_definitions.py b/searx/engines/duckduckgo_definitions.py index 0473b0a9..0b5c8563 100644 --- a/searx/engines/duckduckgo_definitions.py +++ b/searx/engines/duckduckgo_definitions.py @@ -80,7 +80,7 @@ def response(resp): # * book / performing art / film / television / media franchise / concert tour / playwright # * prepared food # * website / software / os / programming language / file format / software engineer - # * compagny + # * company content = '' heading = search_res.get('Heading', '') diff --git a/searx/engines/github.py b/searx/engines/github.py index b68caa35..f927e546 100644 --- a/searx/engines/github.py +++ b/searx/engines/github.py @@ -40,7 +40,7 @@ def response(resp): search_res = loads(resp.text) - # check if items are recieved + # check if items are received if 'items' not in search_res: return [] diff --git a/searx/engines/google.py b/searx/engines/google.py index ba7e562d..8d80f297 100644 --- a/searx/engines/google.py +++ b/searx/engines/google.py @@ -282,7 +282,7 @@ def response(resp): # google *sections* if extract_text(eval_xpath(result, g_section_with_header)): - logger.debug("ingoring ") + logger.debug("ignoring ") continue try: diff --git a/searx/engines/google_news.py b/searx/engines/google_news.py index ff39543d..67812d73 100644 --- a/searx/engines/google_news.py +++ b/searx/engines/google_news.py @@ -2,7 +2,7 @@ """Google (News) For detailed description of the *REST-full* API see: `Query Parameter -Definitions`_. Not all parameters can be appied: +Definitions`_. Not all parameters can be applied: - num_ : the number of search results is ignored - save_ : is ignored / Google-News results are always *SafeSearch* @@ -155,7 +155,7 @@ def response(resp): padding = (4 -(len(jslog) % 4)) * "=" jslog = b64decode(jslog + padding) except binascii.Error: - # URL cant be read, skip this result + # URL can't be read, skip this result continue # now we have : b'[null, ... null,"https://www.cnn.com/.../index.html"]' diff --git a/searx/engines/google_videos.py b/searx/engines/google_videos.py index 8665181a..b52a9159 100644 --- a/searx/engines/google_videos.py +++ b/searx/engines/google_videos.py @@ -2,7 +2,7 @@ """Google (Video) For detailed description of the *REST-full* API see: `Query Parameter -Definitions`_. Not all parameters can be appied. +Definitions`_. Not all parameters can be applied. .. _admonition:: Content-Security-Policy (CSP) @@ -163,7 +163,7 @@ def response(resp): # google *sections* if extract_text(eval_xpath(result, g_section_with_header)): - logger.debug("ingoring ") + logger.debug("ignoring ") continue title = extract_text(eval_xpath_getindex(result, title_xpath, 0)) diff --git a/searx/engines/photon.py b/searx/engines/photon.py index 8c11c8ff..0212c1b5 100644 --- a/searx/engines/photon.py +++ b/searx/engines/photon.py @@ -72,7 +72,7 @@ def response(resp): elif properties.get('osm_type') == 'R': osm_type = 'relation' else: - # continue if invalide osm-type + # continue if invalid osm-type continue url = result_base_url.format(osm_type=osm_type, diff --git a/searx/engines/prowlarr.py b/searx/engines/prowlarr.py index 24ad618c..8fb6550e 100644 --- a/searx/engines/prowlarr.py +++ b/searx/engines/prowlarr.py @@ -71,7 +71,7 @@ def response(resp): if 'downloadUrl' in result: new_result['torrentfile'] = result['downloadUrl'] - # magnet link *may* be in guid, but it may be also idential to infoUrl + # magnet link *may* be in guid, but it may be also identical to infoUrl if 'guid' in result and isinstance(result['guid'], str) and result['guid'].startswith('magnet'): new_result['magnetlink'] = result['guid'] diff --git a/searx/engines/startpage.py b/searx/engines/startpage.py index 513f508e..5690e105 100644 --- a/searx/engines/startpage.py +++ b/searx/engines/startpage.py @@ -51,7 +51,7 @@ search_url = base_url + 'sp/search?' # specific xpath variables # ads xpath //div[@id="results"]/div[@id="sponsored"]//div[@class="result"] -# not ads: div[@class="result"] are the direct childs of div[@id="results"] +# not ads: div[@class="result"] are the direct children of div[@id="results"] results_xpath = '//div[@class="w-gl__result__main"]' link_xpath = './/a[@class="w-gl__result-title result-link"]' content_xpath = './/p[@class="w-gl__description"]' @@ -216,7 +216,7 @@ def _fetch_supported_languages(resp): # native name, the English name of the writing script used by the language, # or occasionally something else entirely. - # this cases are so special they need to be hardcoded, a couple of them are mispellings + # this cases are so special they need to be hardcoded, a couple of them are misspellings language_names = { 'english_uk': 'en-GB', 'fantizhengwen': ['zh-TW', 'zh-HK'], diff --git a/searx/engines/wikidata.py b/searx/engines/wikidata.py index 60adb41c..e1841701 100644 --- a/searx/engines/wikidata.py +++ b/searx/engines/wikidata.py @@ -49,7 +49,7 @@ WIKIDATA_PROPERTIES = { # SERVICE wikibase:label: https://en.wikibooks.org/wiki/SPARQL/SERVICE_-_Label#Manual_Label_SERVICE # https://en.wikibooks.org/wiki/SPARQL/WIKIDATA_Precision,_Units_and_Coordinates # https://www.mediawiki.org/wiki/Wikibase/Indexing/RDF_Dump_Format#Data_model -# optmization: +# optimization: # * https://www.wikidata.org/wiki/Wikidata:SPARQL_query_service/query_optimization # * https://github.com/blazegraph/database/wiki/QueryHints QUERY_TEMPLATE = """ @@ -335,7 +335,7 @@ def get_attributes(language): add_amount('P2046') # area add_amount('P281') # postal code add_label('P38') # currency - add_amount('P2048') # heigth (building) + add_amount('P2048') # height (building) # Media for p in ['P400', # platform (videogames, computing) diff --git a/searx/engines/wolframalpha_api.py b/searx/engines/wolframalpha_api.py index 9c84e280..48241269 100644 --- a/searx/engines/wolframalpha_api.py +++ b/searx/engines/wolframalpha_api.py @@ -50,7 +50,7 @@ def request(query, params): # replace private user area characters to make text legible def replace_pua_chars(text): - pua_chars = {'\uf522': '\u2192', # rigth arrow + pua_chars = {'\uf522': '\u2192', # right arrow '\uf7b1': '\u2115', # set of natural numbers '\uf7b4': '\u211a', # set of rational numbers '\uf7b5': '\u211d', # set of real numbers diff --git a/searx/engines/xpath.py b/searx/engines/xpath.py index 92423302..3ef44735 100644 --- a/searx/engines/xpath.py +++ b/searx/engines/xpath.py @@ -35,7 +35,7 @@ time_range_support = False time_range_url = '&hours={time_range_val}' '''Time range URL parameter in the in :py:obj:`search_url`. If no time range is -requested by the user, the URL paramter is an empty string. The +requested by the user, the URL parameter is an empty string. The ``{time_range_val}`` replacement is taken from the :py:obj:`time_range_map`. .. code:: yaml diff --git a/searx/external_urls.py b/searx/external_urls.py index 11c6a32d..e45ca674 100644 --- a/searx/external_urls.py +++ b/searx/external_urls.py @@ -30,7 +30,7 @@ def get_external_url(url_id, item_id, alternative="default"): """Return an external URL or None if url_id is not found. url_id can take value from data/external_urls.json - The "imdb_id" value is automaticaly converted according to the item_id value. + The "imdb_id" value is automatically converted according to the item_id value. If item_id is None, the raw URL with the $1 is returned. """ diff --git a/searx/plugins/https_rewrite.py b/searx/plugins/https_rewrite.py index aeb42495..c2b9646b 100644 --- a/searx/plugins/https_rewrite.py +++ b/searx/plugins/https_rewrite.py @@ -78,7 +78,7 @@ def load_single_https_ruleset(rules_path): rules = [] exclusions = [] - # parse childs from ruleset + # parse children from ruleset for ruleset in root: # this child define a target if ruleset.tag == 'target': diff --git a/searx/plugins/https_rules/Yahoo.xml b/searx/plugins/https_rules/Yahoo.xml index 33548c4a..7fb1e7ac 100644 --- a/searx/plugins/https_rules/Yahoo.xml +++ b/searx/plugins/https_rules/Yahoo.xml @@ -2435,7 +2435,7 @@ - learn more about request methods') %} + {% set method_info = _('Change how forms are submitted, learn more about request methods') %} {{ preferences_item_header(method_info, method_label, rtl, 'method') }}