mirror of https://github.com/searxng/searxng
Merge remote-tracking branch 'searxng/master'
commit
0f0a17f5d9
@ -0,0 +1,13 @@
|
||||
.. _voidlinux engine:
|
||||
|
||||
==========================
|
||||
Void Linux binary packages
|
||||
==========================
|
||||
|
||||
.. contents:: Contents
|
||||
:depth: 2
|
||||
:local:
|
||||
:backlinks: entry
|
||||
|
||||
.. automodule:: searx.engines.voidlinux
|
||||
:members:
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,69 @@
|
||||
{
|
||||
"LOCALE_NAMES": {
|
||||
"af": "Afrikaans",
|
||||
"ar": "العربية (Arabic)",
|
||||
"bg": "Български (Bulgarian)",
|
||||
"bn": "বাংলা (Bangla)",
|
||||
"bo": "བོད་སྐད་ (Tibetan)",
|
||||
"ca": "Català (Catalan)",
|
||||
"cs": "Čeština (Czech)",
|
||||
"cy": "Cymraeg (Welsh)",
|
||||
"da": "Dansk (Danish)",
|
||||
"de": "Deutsch (German)",
|
||||
"dv": "ދިވެހި (Dhivehi)",
|
||||
"el-GR": "Ελληνικά, Ελλάδα (Greek, Greece)",
|
||||
"en": "English",
|
||||
"eo": "Esperanto",
|
||||
"es": "Español (Spanish)",
|
||||
"et": "Eesti (Estonian)",
|
||||
"eu": "Euskara (Basque)",
|
||||
"fa-IR": "فارسی, ایران (Persian, Iran)",
|
||||
"fi": "Suomi (Finnish)",
|
||||
"fil": "Filipino",
|
||||
"fr": "Français (French)",
|
||||
"gl": "Galego (Galician)",
|
||||
"he": "עברית (Hebrew)",
|
||||
"hr": "Hrvatski (Croatian)",
|
||||
"hu": "Magyar (Hungarian)",
|
||||
"ia": "Interlingua",
|
||||
"id": "Indonesia (Indonesian)",
|
||||
"it": "Italiano (Italian)",
|
||||
"ja": "日本語 (Japanese)",
|
||||
"ko": "한국어 (Korean)",
|
||||
"lt": "Lietuvių (Lithuanian)",
|
||||
"lv": "Latviešu (Latvian)",
|
||||
"ml": "മലയാളം (Malayalam)",
|
||||
"ms": "Melayu (Malay)",
|
||||
"nb-NO": "Norsk bokmål, Norge (Norwegian bokmål, Norway)",
|
||||
"nl": "Nederlands (Dutch)",
|
||||
"nl-BE": "Nederlands, België (Dutch, Belgium)",
|
||||
"oc": "Occitan",
|
||||
"pa": "ਪੰਜਾਬੀ (Punjabi)",
|
||||
"pap": "Papiamento",
|
||||
"pl": "Polski (Polish)",
|
||||
"pt": "Português (Portuguese)",
|
||||
"pt-BR": "Português, Brasil (Portuguese, Brazil)",
|
||||
"ro": "Română (Romanian)",
|
||||
"ru": "Русский (Russian)",
|
||||
"si": "සිංහල (Sinhala)",
|
||||
"sk": "Slovenčina (Slovak)",
|
||||
"sl": "Slovenščina (Slovenian)",
|
||||
"sr": "Српски (Serbian)",
|
||||
"sv": "Svenska (Swedish)",
|
||||
"szl": "Ślōnski (Silesian)",
|
||||
"ta": "தமிழ் (Tamil)",
|
||||
"te": "తెలుగు (Telugu)",
|
||||
"th": "ไทย (Thai)",
|
||||
"tr": "Türkçe (Turkish)",
|
||||
"uk": "Українська (Ukrainian)",
|
||||
"vi": "Tiếng việt (Vietnamese)",
|
||||
"zh-HK": "中文, 中國香港特別行政區 (Chinese, Hong Kong SAR China)",
|
||||
"zh-Hans-CN": "中文, 中国 (Chinese, China)",
|
||||
"zh-Hant-TW": "中文, 台灣 (Chinese, Taiwan)"
|
||||
},
|
||||
"RTL_LOCALES": [
|
||||
"ar",
|
||||
"fa-IR",
|
||||
"he"
|
||||
]
|
||||
}
|
@ -0,0 +1,74 @@
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
# lint: pylint
|
||||
"""Ask.com"""
|
||||
|
||||
from urllib.parse import urlencode
|
||||
import dateutil
|
||||
from lxml import html
|
||||
from searx import utils
|
||||
|
||||
# Metadata
|
||||
about = {
|
||||
"website": "https://www.ask.com/",
|
||||
"wikidata_id": 'Q847564',
|
||||
"official_api_documentation": None,
|
||||
"use_official_api": False,
|
||||
"require_api_key": False,
|
||||
"results": "HTML",
|
||||
}
|
||||
|
||||
# Engine Configuration
|
||||
categories = ['general']
|
||||
paging = True
|
||||
|
||||
# Base URL
|
||||
base_url = "https://www.ask.com/web"
|
||||
|
||||
|
||||
def request(query, params):
|
||||
|
||||
query_params = {
|
||||
"q": query,
|
||||
"page": params["pageno"],
|
||||
}
|
||||
|
||||
params["url"] = f"{base_url}?{urlencode(query_params)}"
|
||||
return params
|
||||
|
||||
|
||||
def response(resp):
|
||||
|
||||
start_tag = 'window.MESON.initialState = {'
|
||||
end_tag = '}};'
|
||||
|
||||
dom = html.fromstring(resp.text)
|
||||
script = utils.eval_xpath_getindex(dom, '//script', 0, default=None).text
|
||||
|
||||
pos = script.index(start_tag) + len(start_tag) - 1
|
||||
script = script[pos:]
|
||||
pos = script.index(end_tag) + len(end_tag) - 1
|
||||
script = script[:pos]
|
||||
|
||||
json_resp = utils.js_variable_to_python(script)
|
||||
|
||||
results = []
|
||||
|
||||
for item in json_resp['search']['webResults']['results']:
|
||||
|
||||
pubdate_original = item.get('pubdate_original')
|
||||
if pubdate_original:
|
||||
pubdate_original = dateutil.parser.parse(pubdate_original)
|
||||
metadata = [item.get(field) for field in ['category_l1', 'catsy'] if item.get(field)]
|
||||
|
||||
results.append(
|
||||
{
|
||||
"url": item['url'],
|
||||
"title": item['title'],
|
||||
"content": item['abstract'],
|
||||
"publishedDate": pubdate_original,
|
||||
# "img_src": item.get('image_url') or None, # these are not thumbs / to large
|
||||
"metadata": ' | '.join(metadata),
|
||||
}
|
||||
)
|
||||
|
||||
return results
|
@ -0,0 +1,101 @@
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
# lint: pylint
|
||||
"""LiveSpace (Videos)
|
||||
|
||||
.. hint::
|
||||
|
||||
This engine only search for **live streams**!
|
||||
|
||||
"""
|
||||
|
||||
from urllib.parse import urlencode
|
||||
from datetime import datetime
|
||||
from babel import dates
|
||||
|
||||
about = {
|
||||
"website": 'https://live.space',
|
||||
"wikidata_id": None,
|
||||
"official_api_documentation": None,
|
||||
"use_official_api": True,
|
||||
"require_api_key": False,
|
||||
"results": 'JSON',
|
||||
}
|
||||
|
||||
categories = ['videos']
|
||||
|
||||
base_url = 'https://backend.live.space'
|
||||
|
||||
# engine dependent config
|
||||
paging = True
|
||||
results_per_page = 10
|
||||
|
||||
|
||||
def request(query, params):
|
||||
|
||||
args = {'page': params['pageno'] - 1, 'searchKey': query, 'size': results_per_page}
|
||||
params['url'] = f"{base_url}/search/public/stream?{urlencode(args)}"
|
||||
params['headers'] = {'Accept': 'application/json', 'Content-Type': 'application/json'}
|
||||
|
||||
return params
|
||||
|
||||
|
||||
def response(resp):
|
||||
|
||||
results = []
|
||||
json = resp.json()
|
||||
now = datetime.now()
|
||||
|
||||
# for live videos
|
||||
|
||||
for result in json.get('result', []):
|
||||
|
||||
title = result.get("title")
|
||||
thumbnailUrl = result.get("thumbnailUrl")
|
||||
category = result.get("category/name")
|
||||
username = result.get("user", {}).get("userName", "")
|
||||
url = f'https://live.space/watch/{username}'
|
||||
|
||||
# stream tags
|
||||
# currently the api seems to always return null before the first tag,
|
||||
# so strip that unless it's not already there
|
||||
tags = ''
|
||||
if result.get("tags"):
|
||||
tags = [x for x in result.get("tags").split(';') if x and x != 'null']
|
||||
tags = ', '.join(tags)
|
||||
|
||||
content = []
|
||||
if category:
|
||||
content.append(f'category - {category}')
|
||||
|
||||
if tags and len(tags) > 0:
|
||||
content.append(f'tags - {tags}')
|
||||
|
||||
# time & duration
|
||||
start_time = None
|
||||
if result.get("startTimeStamp"):
|
||||
start_time = datetime.fromtimestamp(result.get("startTimeStamp") / 1000)
|
||||
|
||||
# for VODs (videos on demand)
|
||||
end_time = None
|
||||
if result.get("endTimeStamp"):
|
||||
end_time = datetime.fromtimestamp(result.get("endTimeStamp") / 1000)
|
||||
|
||||
timestring = ""
|
||||
if start_time:
|
||||
delta = (now if end_time is None else end_time) - start_time
|
||||
timestring = dates.format_timedelta(delta, granularity='second')
|
||||
|
||||
results.append(
|
||||
{
|
||||
'url': url,
|
||||
'title': title,
|
||||
'content': "No category or tags." if len(content) == 0 else ' '.join(content),
|
||||
'author': username,
|
||||
'length': (">= " if end_time is None else "") + timestring,
|
||||
'publishedDate': start_time,
|
||||
'thumbnail': thumbnailUrl,
|
||||
'template': 'videos.html',
|
||||
}
|
||||
)
|
||||
|
||||
return results
|
@ -0,0 +1,59 @@
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
# lint: pylint
|
||||
"""Mozhi (alternative frontend for popular translation engines)"""
|
||||
|
||||
import random
|
||||
import re
|
||||
from urllib.parse import urlencode
|
||||
|
||||
about = {
|
||||
"website": 'https://codeberg.org/aryak/mozhi',
|
||||
"wikidata_id": None,
|
||||
"official_api_documentation": 'https://mozhi.aryak.me/api/swagger/index.html',
|
||||
"use_official_api": True,
|
||||
"require_api_key": False,
|
||||
"results": 'JSON',
|
||||
}
|
||||
|
||||
engine_type = 'online_dictionary'
|
||||
categories = ['general']
|
||||
|
||||
base_url = "https://mozhi.aryak.me"
|
||||
mozhi_engine = "google"
|
||||
|
||||
re_transliteration_unsupported = "Direction '.*' is not supported"
|
||||
|
||||
|
||||
def request(_query, params):
|
||||
request_url = random.choice(base_url) if isinstance(base_url, list) else base_url
|
||||
|
||||
args = {'from': params['from_lang'][1], 'to': params['to_lang'][1], 'text': params['query'], 'engine': mozhi_engine}
|
||||
params['url'] = f"{request_url}/api/translate?{urlencode(args)}"
|
||||
return params
|
||||
|
||||
|
||||
def response(resp):
|
||||
translation = resp.json()
|
||||
|
||||
infobox = ""
|
||||
|
||||
if translation['target_transliteration'] and not re.match(
|
||||
re_transliteration_unsupported, translation['target_transliteration']
|
||||
):
|
||||
infobox = f"<b>{translation['target_transliteration']}</b>"
|
||||
|
||||
if translation['word_choices']:
|
||||
for word in translation['word_choices']:
|
||||
infobox += f"<dl><dt>{word['word']}</dt>"
|
||||
|
||||
for example in word['examples_target']:
|
||||
infobox += f"<dd>{re.sub(r'<|>', '', example)}</dd>"
|
||||
|
||||
infobox += "</dl>"
|
||||
|
||||
result = {
|
||||
'infobox': translation['translated-text'],
|
||||
'content': infobox,
|
||||
}
|
||||
|
||||
return [result]
|
@ -0,0 +1,72 @@
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
# lint: pylint
|
||||
"""Pixiv (images)"""
|
||||
|
||||
from urllib.parse import urlencode
|
||||
import random
|
||||
|
||||
# Engine metadata
|
||||
about = {
|
||||
"website": 'https://www.pixiv.net/',
|
||||
"wikidata_id": 'Q306956',
|
||||
"official_api_documentation": None,
|
||||
"use_official_api": False,
|
||||
"require_api_key": False,
|
||||
"results": 'JSON',
|
||||
}
|
||||
|
||||
# Engine configuration
|
||||
paging = True
|
||||
categories = ['images']
|
||||
|
||||
# Search URL
|
||||
base_url = "https://www.pixiv.net/ajax/search/illustrations"
|
||||
pixiv_image_proxies: list = []
|
||||
|
||||
|
||||
def request(query, params):
|
||||
query_params = {
|
||||
"word": query,
|
||||
"order": "date_d",
|
||||
"mode": "all",
|
||||
"p": params["pageno"],
|
||||
"s_mode": "s_tag_full",
|
||||
"type": "illust_and_ugoira",
|
||||
"lang": "en",
|
||||
}
|
||||
|
||||
params["url"] = f"{base_url}/{query}?{urlencode(query_params)}"
|
||||
|
||||
return params
|
||||
|
||||
|
||||
def response(resp):
|
||||
results = []
|
||||
data = resp.json()
|
||||
|
||||
for item in data["body"]["illust"]["data"]:
|
||||
|
||||
image_url = item["url"]
|
||||
pixiv_proxy = random.choice(pixiv_image_proxies)
|
||||
proxy_image_url = image_url.replace("https://i.pximg.net", pixiv_proxy)
|
||||
proxy_full_image_url = (
|
||||
proxy_image_url.replace("/c/250x250_80_a2/", "/")
|
||||
.replace("_square1200.jpg", "_master1200.jpg")
|
||||
.replace("custom-thumb", "img-master")
|
||||
.replace("_custom1200.jpg", "_master1200.jpg")
|
||||
)
|
||||
|
||||
results.append(
|
||||
{
|
||||
"title": item.get("title"),
|
||||
"url": proxy_full_image_url,
|
||||
'content': item.get('alt'),
|
||||
"author": f"{item.get('userName')} (ID: {item.get('userId')})",
|
||||
"img_src": proxy_full_image_url,
|
||||
"thumbnail_src": proxy_image_url,
|
||||
"source": 'pixiv.net',
|
||||
"template": "images.html",
|
||||
}
|
||||
)
|
||||
|
||||
return results
|
@ -0,0 +1,68 @@
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
# lint: pylint
|
||||
"""pypi.org
|
||||
|
||||
"""
|
||||
|
||||
from urllib.parse import urlencode
|
||||
from dateutil import parser
|
||||
|
||||
from lxml import html
|
||||
from searx.utils import (
|
||||
eval_xpath_getindex,
|
||||
eval_xpath_list,
|
||||
extract_text,
|
||||
)
|
||||
|
||||
# about
|
||||
about = {
|
||||
"website": "https://pypi.org",
|
||||
"wikidata_id": "Q2984686",
|
||||
"official_api_documentation": "https://warehouse.readthedocs.io/api-reference/index.html",
|
||||
"use_official_api": False,
|
||||
"require_api_key": False,
|
||||
"results": "HTML",
|
||||
}
|
||||
|
||||
categories = ['it', 'packages']
|
||||
|
||||
|
||||
# engine dependent config
|
||||
first_page_num = 1
|
||||
base_url = "https://pypi.org"
|
||||
search_url = base_url + '/search/?{query}'
|
||||
|
||||
|
||||
def request(query, params):
|
||||
args = {
|
||||
"q": query,
|
||||
"page": params['pageno'],
|
||||
}
|
||||
params['url'] = search_url.format(query=urlencode(args))
|
||||
return params
|
||||
|
||||
|
||||
def response(resp):
|
||||
results = []
|
||||
dom = html.fromstring(resp.text)
|
||||
for entry in eval_xpath_list(dom, '/html/body/main/div/div/div/form/div/ul/li/a[@class="package-snippet"]'):
|
||||
url = base_url + extract_text(eval_xpath_getindex(entry, './@href', 0)) # type: ignore
|
||||
title = extract_text(eval_xpath_getindex(entry, './h3/span[@class="package-snippet__name"]', 0))
|
||||
version = extract_text(eval_xpath_getindex(entry, './h3/span[@class="package-snippet__version"]', 0))
|
||||
created_at = extract_text(
|
||||
eval_xpath_getindex(entry, './h3/span[@class="package-snippet__created"]/time/@datetime', 0)
|
||||
)
|
||||
content = extract_text(eval_xpath_getindex(entry, './p', 0))
|
||||
results.append(
|
||||
{
|
||||
"template": "packages.html",
|
||||
"url": url,
|
||||
"title": title,
|
||||
'package_name': title,
|
||||
"content": content,
|
||||
"version": version,
|
||||
'publishedDate': parser.parse(created_at), # type: ignore
|
||||
}
|
||||
)
|
||||
|
||||
return results
|
@ -0,0 +1,91 @@
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
# lint: pylint
|
||||
"""SearXNG engine for `Void Linux binary packages`_. Void is a general purpose
|
||||
operating system, based on the monolithic Linux kernel. Its package system
|
||||
allows you to quickly install, update and remove software; software is provided
|
||||
in binary packages or can be built directly from sources with the help of the
|
||||
XBPS source packages collection.
|
||||
|
||||
.. _Void Linux binary packages: https://voidlinux.org/packages/
|
||||
|
||||
"""
|
||||
|
||||
import re
|
||||
|
||||
from urllib.parse import quote_plus
|
||||
from searx.utils import humanize_bytes
|
||||
|
||||
about = {
|
||||
'website': 'https://voidlinux.org/packages/',
|
||||
'wikidata_id': 'Q19310966',
|
||||
'use_official_api': True,
|
||||
'official_api_documentation': None,
|
||||
'require_api_key': False,
|
||||
'results': 'JSON',
|
||||
}
|
||||
|
||||
categories = ['packages', 'it']
|
||||
|
||||
base_url = "https://xq-api.voidlinux.org"
|
||||
pkg_repo_url = "https://github.com/void-linux/void-packages"
|
||||
|
||||
void_arch = 'x86_64'
|
||||
"""Default architecture to search for. For valid values see :py:obj:`ARCH_RE`"""
|
||||
|
||||
ARCH_RE = re.compile('aarch64-musl|armv6l-musl|armv7l-musl|x86_64-musl|aarch64|armv6l|armv7l|i686|x86_64')
|
||||
"""Regular expresion that match a architecture in the query string."""
|
||||
|
||||
|
||||
def request(query, params):
|
||||
arch_path = ARCH_RE.search(query)
|
||||
if arch_path:
|
||||
arch_path = arch_path.group(0)
|
||||
query = query.replace(arch_path, '').strip()
|
||||
else:
|
||||
arch_path = void_arch
|
||||
|
||||
params['url'] = f"{base_url}/v1/query/{arch_path}?q={quote_plus(query)}"
|
||||
return params
|
||||
|
||||
|
||||
def response(resp):
|
||||
"""
|
||||
At Void Linux, several packages sometimes share the same source code
|
||||
(template) and therefore also have the same URL. Results with identical
|
||||
URLs are merged as one result for SearXNG.
|
||||
"""
|
||||
|
||||
packages = {}
|
||||
for result in resp.json()['data']:
|
||||
|
||||
# 32bit and dbg packages don't have their own package templates
|
||||
github_slug = re.sub(r"-(32bit|dbg)$", "", result['name'])
|
||||
pkg_url = f"{pkg_repo_url}/tree/master/srcpkgs/{github_slug}"
|
||||
|
||||
pkg_list = packages.get(pkg_url, [])
|
||||
pkg_list.append(
|
||||
{
|
||||
'title': result['name'],
|
||||
'content': f"{result['short_desc']} - {humanize_bytes(result['filename_size'])}",
|
||||
'package_name': result['name'],
|
||||
'version': f"v{result['version']}_{result['revision']}",
|
||||
'tags': result['repository'],
|
||||
}
|
||||
)
|
||||
packages[pkg_url] = pkg_list
|
||||
|
||||
results = []
|
||||
for pkg_url, pkg_list in packages.items():
|
||||
|
||||
results.append(
|
||||
{
|
||||
'url': pkg_url,
|
||||
'template': 'packages.html',
|
||||
'title': ' | '.join(x['title'] for x in pkg_list),
|
||||
'content': pkg_list[0]['content'],
|
||||
'package_name': ' | '.join(x['package_name'] for x in pkg_list),
|
||||
'version': pkg_list[0]['version'],
|
||||
'tags': [x['tags'] for x in pkg_list],
|
||||
}
|
||||
)
|
||||
return results
|
@ -0,0 +1,63 @@
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
# lint: pylint
|
||||
"""Yandex Music
|
||||
|
||||
.. _Countries where Yandex.Music is available: https://yandex.com/support/music/access.html
|
||||
|
||||
.. hint::
|
||||
|
||||
Access to music is limited to a few countries: `Countries where Yandex.Music
|
||||
is available`_
|
||||
|
||||
"""
|
||||
|
||||
from urllib.parse import urlencode
|
||||
|
||||
# about
|
||||
about = {
|
||||
"website": 'https://music.yandex.ru',
|
||||
"wikidata_id": 'Q4537983',
|
||||
"official_api_documentation": None,
|
||||
"use_official_api": False,
|
||||
"require_api_key": False,
|
||||
"results": 'JSON',
|
||||
}
|
||||
|
||||
# engine dependent config
|
||||
categories = ['music']
|
||||
paging = True
|
||||
|
||||
# search-url
|
||||
url = 'https://music.yandex.ru'
|
||||
search_url = url + '/handlers/music-search.jsx'
|
||||
|
||||
# do search-request
|
||||
def request(query, params):
|
||||
args = {'text': query, 'page': params['pageno'] - 1}
|
||||
params['url'] = search_url + '?' + urlencode(args)
|
||||
|
||||
return params
|
||||
|
||||
|
||||
# get response from search-request
|
||||
def response(resp):
|
||||
results = []
|
||||
search_res = resp.json()
|
||||
|
||||
# parse results
|
||||
for result in search_res.get('tracks', {}).get('items', []):
|
||||
if result['type'] == 'music':
|
||||
track_id = result['id']
|
||||
album_id = result['albums'][0]['id']
|
||||
|
||||
# append result
|
||||
results.append(
|
||||
{
|
||||
'url': f'{url}/album/{album_id}/track/{track_id}',
|
||||
'title': result['title'],
|
||||
'content': f"[{result['albums'][0]['title']}] {result['artists'][0]['name']} - {result['title']}",
|
||||
'iframe_src': f'{url}/iframe/track/{track_id}/{album_id}',
|
||||
}
|
||||
)
|
||||
|
||||
return results
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1 +1 @@
|
||||
<svg width="92mm" height="92mm" viewBox="0 0 92 92"><path d="M39.581 41.421h-8.954v-1.215q0-2.034.818-3.597.819-1.587 3.448-4.018l1.588-1.439q1.414-1.29 2.059-2.43.67-1.142.67-2.283 0-1.736-1.191-2.703-1.19-.993-3.324-.993-2.01 0-4.341.844-2.332.818-4.862 2.455v-7.788q3.002-1.042 5.482-1.538t4.787-.496q6.053 0 9.228 2.48 3.175 2.456 3.175 7.194 0 2.43-.968 4.365-.967 1.91-3.299 4.118L42.31 35.79q-1.687 1.538-2.208 2.48-.52.918-.52 2.034zm-8.954 3.671h8.954v8.83h-8.954Z" style="line-height:1;-inkscape-font-specification:"DejaVu Sans Bold"" font-style="normal" font-variant="normal" font-weight="700" font-stretch="normal" font-size="50.80000305px" font-family="DejaVu Sans" display="inline" fill="#db3434" fill-opacity="1" stroke-width=".26458335"/><circle cx="35" cy="36.486" r="30" fill="none" fill-opacity="1" stroke="#db3434" stroke-width="10" stroke-miterlimit="4" stroke-dasharray="none" stroke-opacity="1"/><rect width="18.846" height="39.963" x="-12.021" y="80.49" ry="0" transform="rotate(-46.235)" opacity="1" fill="#db3434" fill-opacity="1" stroke="none" stroke-width="8" stroke-miterlimit="4" stroke-dasharray="none" stroke-opacity="1"/></svg>
|
||||
<svg width="92mm" height="92mm" viewBox="0 0 92 92"><path d="M39.581 41.421h-8.954v-1.215q0-2.034.818-3.597.819-1.587 3.448-4.018l1.588-1.439q1.414-1.29 2.059-2.43.67-1.142.67-2.283 0-1.736-1.191-2.703-1.19-.993-3.324-.993-2.01 0-4.341.844-2.332.818-4.862 2.455v-7.788q3.002-1.042 5.482-1.538 2.48-.496 4.787-.496 6.053 0 9.228 2.48 3.175 2.456 3.175 7.194 0 2.43-.968 4.365-.967 1.91-3.299 4.118L42.31 35.79q-1.687 1.538-2.208 2.48-.52.918-.52 2.034zm-8.954 3.671h8.954v8.83h-8.954Z" style="line-height:1;-inkscape-font-specification:"DejaVu Sans Bold"" font-style="normal" font-variant="normal" font-weight="700" font-stretch="normal" font-size="50.80000305px" font-family="DejaVu Sans" display="inline" fill="#db3434" fill-opacity="1" stroke-width=".26458335"/><circle cx="35" cy="36.486" r="30" fill="none" fill-opacity="1" stroke="#db3434" stroke-width="10" stroke-miterlimit="4" stroke-dasharray="none" stroke-opacity="1"/><rect width="18.846" height="39.963" x="-12.021" y="80.49" ry="0" transform="rotate(-46.235)" opacity="1" fill="#db3434" fill-opacity="1" stroke="none" stroke-width="8" stroke-miterlimit="4" stroke-dasharray="none" stroke-opacity="1"/></svg>
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.2 KiB |
@ -1 +1 @@
|
||||
<svg width="853.677" height="146.304" viewBox="0 0 225.869 38.71"><g aria-label="SearXNG" style="line-height:1.25" font-style="normal" font-weight="400" font-size="50.8px" font-family="sans-serif" fill="#487cff" fill-opacity="1" stroke="none" stroke-width=".264583"><path d="M56.494 102.704q-1.168-1.22-3.048-2.032t-4.42-.813q-3.15 0-5.08 1.32-1.93 1.27-1.93 3.455 0 2.337 3.708 3.607l7.671 2.641q3.963 1.321 5.842 3.404 1.88 2.083 1.88 5.13 0 4.065-2.185 7.011-2.184 2.896-5.943 4.42-3.76 1.524-8.484 1.524-5.334 0-9.042-1.778-3.709-1.829-5.537-5.131-.204-.356-.204-.711 0-.356.407-.61l4.013-2.438q.356-.254.762-.254.61 0 1.118.66 1.32 1.626 2.387 2.54 1.118.864 2.693 1.321 1.625.457 4.165.457 3.2 0 5.182-1.168 1.981-1.22 1.981-3.76 0-1.27-.914-2.082-.915-.864-2.947-1.575l-7.417-2.49q-3.657-1.218-5.588-3.555-1.88-2.388-1.88-5.436 0-3.759 2.134-6.655 2.134-2.895 5.69-4.47 3.607-1.575 7.874-1.575 4.369 0 7.67 1.575 3.354 1.524 5.182 3.962.407.508.407.762t-.356.458l-4.52 2.997q-.052.05-.204.05-.305 0-1.067-.761M77.004 132.37q-3.607 0-6.401-1.472-2.794-1.474-4.318-4.115-1.524-2.693-1.524-6.198 0-4.165 1.981-7.874 2.032-3.759 5.537-5.994 3.556-2.286 7.925-2.286 5.334 0 8.484 3.15t3.15 8.686q0 1.473-.204 2.845-.101.406-.355.61-.204.152-.813.152h-17.12q-.813 0-.813 2.184 0 2.388 1.524 3.709 1.575 1.27 4.064 1.27 1.93 0 3.607-.813t3.302-2.54q.254-.254.508-.254.153 0 .66.203l3.353 1.575q.61.203.61.66 0 .254-.254.66-2.946 3.303-5.893 4.573-2.895 1.27-7.01 1.27m6.451-16.56q1.22 0 1.22-1.981 0-1.93-1.169-3.251-1.168-1.372-3.251-1.372-2.54 0-4.521 1.93-1.93 1.88-2.235 4.674zM109.411 129.374q-3.048 2.997-8.331 2.997-3.556 0-5.588-1.829t-2.032-4.775q0-3.607 2.387-5.893 2.388-2.337 5.995-3.353 3.657-1.067 7.569-1.168l1.829-.153q.965 0 1.117-.965l.153-1.067q.05-.254.05-.812 0-3.048-3.505-3.048-4.013 0-5.943 3.15-.254.355-.66.355-.305 0-.458-.051l-4.927-1.168q-.508-.102-.508-.66 0-.509.254-1.017 3.352-5.486 12.649-5.486 5.486 0 8.026 1.93 2.591 1.93 2.591 5.334 0 .457-.102 1.473l-2.54 17.78q-.05.66-.203.813-.152.102-.711.102h-5.232q-.508 0-.66-.305t-.204-1.016l.05-1.32q0-.407-.253-.407-.254 0-.813.559m2.184-9.754v-.305q0-.203-.101-.254-.102-.101-.407-.05l-1.828.152q-2.947.203-5.487 1.473t-2.54 3.912q0 1.219.864 1.98.914.712 2.438.712 1.321 0 2.49-.356 1.168-.406 2.031-1.066 1.88-1.423 2.083-2.896zM123.864 131.863q-.61 0-.915-.356-.254-.355-.152-.914l3.505-24.943q.05-.457.152-.559.153-.152.56-.152h6.044q.915 0 .712 1.067l-.356 2.286v.203q0 .355.203.355.153 0 .457-.304 1.778-1.88 3.963-2.998 2.184-1.117 3.962-1.117 1.067 0 1.575.152.508.153.457.61l-.813 5.69q-.05.558-.203.71-.101.153-.406.102-1.727-.254-3.455-.254-1.32 0-2.794.711-1.473.66-2.54 1.778-1.016 1.067-1.168 2.134l-2.083 14.834q-.101.66-.355.812-.204.153-.966.153zM176.481 130.085q.457.813.457 1.219 0 .305-.254.457-.254.102-.762.102h-7.06q-.61 0-.966-.153-.305-.152-.508-.61l-5.639-11.734q-.254-.508-.508-.508-.152 0-.559.559l-9.042 11.836q-.254.407-.61.508-.304.102-1.066.102h-5.944q-1.016 0-1.016-.66 0-.458.762-1.525l13.005-16.306q.559-.61.559-1.067 0-.356-.102-.559l-8.484-16.56q-.152-.255-.152-.509 0-.508.762-.508h7.417q.66 0 .914.153.254.152.508.66l4.928 10.363q.152.407.355.407.204 0 .508-.407l8.027-10.566q.305-.407.559-.508.304-.102.965-.102h6.553q.61 0 .61.559 0 .406-.305.914l-12.599 15.647q-.508.66-.508.914 0 .203.153.508zM218.113 94.17q.355 0 .457.202.101.153.05.56l-5.13 36.372q-.05.356-.254.457-.153.102-.559.102h-5.182q-.66 0-1.168-.813l-13.106-22.708q-.153-.254-.305-.254-.305 0-.356.56l-3.15 22.402q-.1.508-.304.66-.153.153-.711.153h-5.588q-.813 0-.712-1.118l5.08-35.814q.102-.508.204-.61.152-.152.66-.152h6.147q.508 0 .762.254.305.203.559.711l11.988 21.184q.254.406.508.406.407 0 .458-.61l2.946-21.284q.05-.407.203-.508.203-.153.66-.153zM236.44 132.37q-4.572 0-7.925-1.93t-5.131-5.435q-1.727-3.556-1.727-8.331 0-6.3 2.489-11.532 2.49-5.283 7.061-8.382 4.572-3.099 10.516-3.099 4.064 0 7.163 1.575 3.15 1.575 4.876 4.166 1.728 2.54 1.83 5.435 0 .508-.102.762-.051.203-.254.254l-6.96 1.016h-.05q-.204 0-.356-.254-.102-.254-.254-1.016-.356-2.54-1.93-4.115-1.525-1.574-4.319-1.574-3.607 0-5.994 2.641-2.337 2.642-3.455 6.807-1.117 4.115-1.117 8.586 0 4.368 1.625 6.299 1.677 1.88 4.877 1.88 3.099 0 5.233-1.728t3.15-4.216l.304-1.423q.152-.254.152-.355 0-.305-.61-.305h-6.248q-.304 0-.406-.102-.102-.152-.05-.558l.456-4.166q.051-.559.508-.559l14.53.051q.609 0 .761.203.203.153.102.66l-2.49 17.577q-.05.66-.812.66h-1.524q-.457 0-.711-.152-.204-.152-.356-.61l-.864-3.708q-.05-.254-.355-.254t-.66.407q-1.677 2.083-4.37 3.454-2.692 1.372-6.603 1.372" style="-inkscape-font-specification:"Libre Franklin"" transform="translate(-29.722 -93.661)" font-style="normal" font-variant="normal" font-weight="400" font-stretch="normal" font-size="50.8px" font-family="Libre Franklin" fill="#487cff" fill-opacity="1" stroke-width=".264583"/></g></svg>
|
||||
<svg width="853.677" height="146.304" viewBox="0 0 225.869 38.71"><g aria-label="SearXNG" style="line-height:1.25" font-style="normal" font-weight="400" font-size="50.8px" font-family="sans-serif" fill="#487cff" fill-opacity="1" stroke="none" stroke-width=".264583"><path d="M56.494 102.704q-1.168-1.22-3.048-2.032-1.88-.813-4.42-.813-3.15 0-5.08 1.32-1.93 1.27-1.93 3.455 0 2.337 3.708 3.607l7.671 2.641q3.963 1.321 5.842 3.404 1.88 2.083 1.88 5.13 0 4.065-2.185 7.011-2.184 2.896-5.943 4.42-3.76 1.524-8.484 1.524-5.334 0-9.042-1.778-3.709-1.829-5.537-5.131-.204-.356-.204-.711 0-.356.407-.61l4.013-2.438q.356-.254.762-.254.61 0 1.118.66 1.32 1.626 2.387 2.54 1.118.864 2.693 1.321 1.625.457 4.165.457 3.2 0 5.182-1.168 1.981-1.22 1.981-3.76 0-1.27-.914-2.082-.915-.864-2.947-1.575l-7.417-2.49q-3.657-1.218-5.588-3.555-1.88-2.388-1.88-5.436 0-3.759 2.134-6.655 2.134-2.895 5.69-4.47 3.607-1.575 7.874-1.575 4.369 0 7.67 1.575 3.354 1.524 5.182 3.962.407.508.407.762t-.356.458l-4.52 2.997q-.052.05-.204.05-.305 0-1.067-.761zM77.004 132.37q-3.607 0-6.401-1.472-2.794-1.474-4.318-4.115-1.524-2.693-1.524-6.198 0-4.165 1.981-7.874 2.032-3.759 5.537-5.994 3.556-2.286 7.925-2.286 5.334 0 8.484 3.15 3.15 3.149 3.15 8.686 0 1.473-.204 2.845-.101.406-.355.61-.204.152-.813.152h-17.12q-.813 0-.813 2.184 0 2.388 1.524 3.709 1.575 1.27 4.064 1.27 1.93 0 3.607-.813 1.677-.813 3.302-2.54.254-.254.508-.254.153 0 .66.203l3.353 1.575q.61.203.61.66 0 .254-.254.66-2.946 3.303-5.893 4.573-2.895 1.27-7.01 1.27zm6.451-16.56q1.22 0 1.22-1.981 0-1.93-1.169-3.251-1.168-1.372-3.251-1.372-2.54 0-4.521 1.93-1.93 1.88-2.235 4.674zM109.411 129.374q-3.048 2.997-8.331 2.997-3.556 0-5.588-1.829t-2.032-4.775q0-3.607 2.387-5.893 2.388-2.337 5.995-3.353 3.657-1.067 7.569-1.168l1.829-.153q.965 0 1.117-.965l.153-1.067q.05-.254.05-.812 0-3.048-3.505-3.048-4.013 0-5.943 3.15-.254.355-.66.355-.305 0-.458-.051l-4.927-1.168q-.508-.102-.508-.66 0-.509.254-1.017 3.352-5.486 12.649-5.486 5.486 0 8.026 1.93 2.591 1.93 2.591 5.334 0 .457-.102 1.473l-2.54 17.78q-.05.66-.203.813-.152.102-.711.102h-5.232q-.508 0-.66-.305-.153-.305-.204-1.016l.05-1.32q0-.407-.253-.407-.254 0-.813.559zm2.184-9.754v-.305q0-.203-.101-.254-.102-.101-.407-.05l-1.828.152q-2.947.203-5.487 1.473t-2.54 3.912q0 1.219.864 1.98.914.712 2.438.712 1.321 0 2.49-.356 1.168-.406 2.031-1.066 1.88-1.423 2.083-2.896zM123.864 131.863q-.61 0-.915-.356-.254-.355-.152-.914l3.505-24.943q.05-.457.152-.559.153-.152.56-.152h6.044q.915 0 .712 1.067l-.356 2.286v.203q0 .355.203.355.153 0 .457-.304 1.778-1.88 3.963-2.998 2.184-1.117 3.962-1.117 1.067 0 1.575.152.508.153.457.61l-.813 5.69q-.05.558-.203.71-.101.153-.406.102-1.727-.254-3.455-.254-1.32 0-2.794.711-1.473.66-2.54 1.778-1.016 1.067-1.168 2.134l-2.083 14.834q-.101.66-.355.812-.204.153-.966.153zM176.481 130.085q.457.813.457 1.219 0 .305-.254.457-.254.102-.762.102h-7.06q-.61 0-.966-.153-.305-.152-.508-.61l-5.639-11.734q-.254-.508-.508-.508-.152 0-.559.559l-9.042 11.836q-.254.407-.61.508-.304.102-1.066.102h-5.944q-1.016 0-1.016-.66 0-.458.762-1.525l13.005-16.306q.559-.61.559-1.067 0-.356-.102-.559l-8.484-16.56q-.152-.255-.152-.509 0-.508.762-.508h7.417q.66 0 .914.153.254.152.508.66l4.928 10.363q.152.407.355.407.204 0 .508-.407l8.027-10.566q.305-.407.559-.508.304-.102.965-.102h6.553q.61 0 .61.559 0 .406-.305.914l-12.599 15.647q-.508.66-.508.914 0 .203.153.508zM218.113 94.17q.355 0 .457.202.101.153.05.56l-5.13 36.372q-.05.356-.254.457-.153.102-.559.102h-5.182q-.66 0-1.168-.813l-13.106-22.708q-.153-.254-.305-.254-.305 0-.356.56l-3.15 22.402q-.1.508-.304.66-.153.153-.711.153h-5.588q-.813 0-.712-1.118l5.08-35.814q.102-.508.204-.61.152-.152.66-.152h6.147q.508 0 .762.254.305.203.559.711l11.988 21.184q.254.406.508.406.407 0 .458-.61l2.946-21.284q.05-.407.203-.508.203-.153.66-.153zM236.44 132.37q-4.572 0-7.925-1.93-3.353-1.93-5.131-5.435-1.727-3.556-1.727-8.331 0-6.3 2.489-11.532 2.49-5.283 7.061-8.382 4.572-3.099 10.516-3.099 4.064 0 7.163 1.575 3.15 1.575 4.876 4.166 1.728 2.54 1.83 5.435 0 .508-.102.762-.051.203-.254.254l-6.96 1.016h-.05q-.204 0-.356-.254-.102-.254-.254-1.016-.356-2.54-1.93-4.115-1.525-1.574-4.319-1.574-3.607 0-5.994 2.641-2.337 2.642-3.455 6.807-1.117 4.115-1.117 8.586 0 4.368 1.625 6.299 1.677 1.88 4.877 1.88 3.099 0 5.233-1.728 2.133-1.727 3.15-4.216l.304-1.423q.152-.254.152-.355 0-.305-.61-.305h-6.248q-.304 0-.406-.102-.102-.152-.05-.558l.456-4.166q.051-.559.508-.559l14.53.051q.609 0 .761.203.203.153.102.66l-2.49 17.577q-.05.66-.812.66h-1.524q-.457 0-.711-.152-.204-.152-.356-.61l-.864-3.708q-.05-.254-.355-.254t-.66.407q-1.677 2.083-4.37 3.454-2.692 1.372-6.603 1.372z" style="-inkscape-font-specification:"Libre Franklin"" transform="translate(-29.722 -93.661)" font-style="normal" font-variant="normal" font-weight="400" font-stretch="normal" font-size="50.8px" font-family="Libre Franklin" fill="#487cff" fill-opacity="1" stroke-width=".264583"/></g></svg>
|
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 4.8 KiB |
@ -0,0 +1,67 @@
|
||||
{%- from 'simple/macros.html' import result_header, result_sub_header, result_sub_footer, result_footer with context -%}
|
||||
{{ result_header(result, favicons, image_proxify) -}}
|
||||
|
||||
{%- if result.content -%}<p class="content">{{- result.content|safe -}}</p>{%- endif -%}
|
||||
<div class="attributes">{{- '' -}}
|
||||
<div class="result_package_name">{{- '' -}}
|
||||
<span>{{ _('Name') }}:</span>{{- '' -}}
|
||||
<span><code>{{- result.package_name -}}</code></span>{{- '' -}}
|
||||
</div>
|
||||
{%- if result.version -%}
|
||||
<div class="result_version">{{- '' -}}
|
||||
<span>{{- _('Version') }}:</span>{{- '' -}}
|
||||
<span><strong>{{ result.version }}</strong></span>{{- '' -}}
|
||||
</div>
|
||||
{%- endif -%}
|
||||
{%- if result.maintainer -%}
|
||||
<div class="result_maintainer">{{- '' -}}
|
||||
<span>{{ _('Maintainer') }}:</span>{{- '' -}}
|
||||
<span>{{ result.maintainer }}</span>{{- '' -}}
|
||||
</div>
|
||||
{%- endif -%}
|
||||
{%- if result.publishedDate -%}
|
||||
<div class="result_pubdate">{{- '' -}}
|
||||
<span>{{ _('Updated at') }}:</span>{{- '' -}}
|
||||
<span><time datetime="{{ result.pubdate }}">{{ result.publishedDate }}</time></span>{{- '' -}}
|
||||
</div>
|
||||
{%- endif -%}
|
||||
{%- if result.tags -%}
|
||||
<div class="result_tags">{{- '' -}}
|
||||
<span>{{ _('Tags') }}:</span>{{- '' -}}
|
||||
<span>{{ result.tags|join(', ') }}</span>{{- '' -}}
|
||||
</div>
|
||||
{%- endif -%}
|
||||
{%- if result.popularity -%}
|
||||
<div class="result_popularity">{{- '' -}}
|
||||
<span>{{ _('Popularity') }}:</span>{{- '' -}}
|
||||
<span>{{ result.popularity }}</span>{{- '' -}}
|
||||
</div>
|
||||
{%- endif -%}
|
||||
{%- if result.license_name -%}
|
||||
<div class="result_license">{{- '' -}}
|
||||
<span>{{- _('License') -}}:</span>
|
||||
{%- if result.license_url -%}
|
||||
<span><a href="{{ result.license_url }}" target="_blank">{{ result.license_name }}</a></span>
|
||||
{%- else -%}
|
||||
<span>{{ result.license_name }}</span>
|
||||
{%- endif -%}
|
||||
</div>
|
||||
{%- endif -%}
|
||||
{%- if result.homepage or result.source_code_url -%}
|
||||
<div class="result_project">{{- '' -}}
|
||||
<span>{{ _('Project') }}</span>
|
||||
<span>{{- '' -}}
|
||||
{%- if result.homepage -%}
|
||||
<a href="{{ result.homepage }}" target="_blank">{{ _('Project homepage') }}</a>
|
||||
{%- endif -%}
|
||||
{%- if result.homepage and result.source_code_url %} | {% endif -%}
|
||||
{%- if result.source_code_url -%}
|
||||
<a href="{{ result.source_code_url }}" target="_blank">{{ _('Source code') }}</a>
|
||||
{%- endif -%}
|
||||
</span>{{- '' -}}
|
||||
</div>
|
||||
{%- endif -%}
|
||||
</div>{{- '' -}}
|
||||
<div class="break"></div>
|
||||
|
||||
{{- result_footer(result) }}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue