development.html 49 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429
  1. <!DOCTYPE html>
  2. <html lang="en" data-content_root="../../">
  3. <head>
  4. <meta charset="utf-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1">
  7. <title>Plugin Development &#8212; SearXNG Documentation (2025.4.30+fd33559cf)</title>
  8. <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=6625fa76" />
  9. <link rel="stylesheet" type="text/css" href="../../_static/searxng.css?v=52e4ff28" />
  10. <script src="../../_static/documentation_options.js?v=b12b0e12"></script>
  11. <script src="../../_static/doctools.js?v=9a2dae69"></script>
  12. <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
  13. <script data-project="searxng" data-version="2025.4.30+fd33559cf" src="../../_static/describe_version.js?v=fa7f30d0"></script>
  14. <link rel="index" title="Index" href="../../genindex.html" />
  15. <link rel="search" title="Search" href="../../search.html" />
  16. <link rel="next" title="Built-in Plugins" href="builtins.html" />
  17. <link rel="prev" title="Plugins" href="index.html" />
  18. </head><body>
  19. <div class="related" role="navigation" aria-label="Related">
  20. <h3>Navigation</h3>
  21. <ul>
  22. <li class="right" style="margin-right: 10px">
  23. <a href="../../genindex.html" title="General Index"
  24. accesskey="I">index</a></li>
  25. <li class="right" >
  26. <a href="../../py-modindex.html" title="Python Module Index"
  27. >modules</a> |</li>
  28. <li class="right" >
  29. <a href="builtins.html" title="Built-in Plugins"
  30. accesskey="N">next</a> |</li>
  31. <li class="right" >
  32. <a href="index.html" title="Plugins"
  33. accesskey="P">previous</a> |</li>
  34. <li class="nav-item nav-item-0"><a href="../../index.html">SearXNG Documentation (2025.4.30+fd33559cf)</a> &#187;</li>
  35. <li class="nav-item nav-item-1"><a href="../index.html" >Developer documentation</a> &#187;</li>
  36. <li class="nav-item nav-item-2"><a href="index.html" accesskey="U">Plugins</a> &#187;</li>
  37. <li class="nav-item nav-item-this"><a href="">Plugin Development</a></li>
  38. </ul>
  39. </div>
  40. <div class="document">
  41. <div class="documentwrapper">
  42. <div class="bodywrapper">
  43. <div class="body" role="main">
  44. <section id="module-searx.plugins">
  45. <span id="plugin-development"></span><span id="dev-plugin"></span><h1>Plugin Development<a class="headerlink" href="#module-searx.plugins" title="Link to this heading">¶</a></h1>
  46. <aside class="sidebar">
  47. <p class="sidebar-title">Further reading ..</p>
  48. <ul class="simple">
  49. <li><p><a class="reference internal" href="../../admin/plugins.html#plugins-admin"><span class="std std-ref">List of plugins</span></a></p></li>
  50. <li><p><a class="reference internal" href="../../admin/settings/settings_plugins.html#settings-plugins"><span class="std std-ref">SearXNG settings</span></a></p></li>
  51. </ul>
  52. </aside>
  53. <p>Plugins can extend or replace functionality of various components of SearXNG.</p>
  54. <p>Entry points (hooks) define when a plugin runs. Right now only three hooks are
  55. implemented. So feel free to implement a hook if it fits the behaviour of your
  56. plugin / a plugin doesn’t need to implement all the hooks.</p>
  57. <ul class="simple">
  58. <li><p>pre search: <a class="reference internal" href="#searx.plugins.Plugin.pre_search" title="searx.plugins.Plugin.pre_search"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Plugin.pre_search</span></code></a></p></li>
  59. <li><p>post search: <a class="reference internal" href="#searx.plugins.Plugin.post_search" title="searx.plugins.Plugin.post_search"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Plugin.post_search</span></code></a></p></li>
  60. <li><p>on each result item: <a class="reference internal" href="#searx.plugins.Plugin.on_result" title="searx.plugins.Plugin.on_result"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Plugin.on_result</span></code></a></p></li>
  61. </ul>
  62. <p>Below you will find some examples, for more coding examples have a look at the
  63. built-in plugins <a class="extlink-origin reference external" href="https://github.com/searxng/searxng/blob/master/searx/plugins/">git://searx/plugins/</a> or <a class="reference external" href="https://github.com/return42/tgwf-searx-plugins/">Only show green hosted results</a>.</p>
  64. <section id="add-answer-example">
  65. <h2>Add Answer example<a class="headerlink" href="#add-answer-example" title="Link to this heading">¶</a></h2>
  66. <p>Here is an example of a very simple plugin that adds a “Hello World” into the
  67. answer area:</p>
  68. <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span><span class="w"> </span><span class="nn">flask_babel</span><span class="w"> </span><span class="kn">import</span> <span class="n">gettext</span> <span class="k">as</span> <span class="n">_</span>
  69. <span class="kn">from</span><span class="w"> </span><span class="nn">searx.plugins</span><span class="w"> </span><span class="kn">import</span> <span class="n">Plugin</span>
  70. <span class="kn">from</span><span class="w"> </span><span class="nn">searx.result_types</span><span class="w"> </span><span class="kn">import</span> <span class="n">Answer</span>
  71. <span class="k">class</span><span class="w"> </span><span class="nc">MyPlugin</span><span class="p">(</span><span class="n">Plugin</span><span class="p">):</span>
  72. <span class="nb">id</span> <span class="o">=</span> <span class="s2">&quot;hello world&quot;</span>
  73. <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">plg_cfg</span><span class="p">):</span>
  74. <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">plg_cfg</span><span class="p">)</span>
  75. <span class="bp">self</span><span class="o">.</span><span class="n">info</span> <span class="o">=</span> <span class="n">PluginInfo</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">id</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;Hello&quot;</span><span class="p">),</span> <span class="n">description</span><span class="o">=</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;demo plugin&quot;</span><span class="p">))</span>
  76. <span class="k">def</span><span class="w"> </span><span class="nf">post_search</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">search</span><span class="p">):</span>
  77. <span class="k">return</span> <span class="p">[</span> <span class="n">Answer</span><span class="p">(</span><span class="n">answer</span><span class="o">=</span><span class="s2">&quot;Hello World&quot;</span><span class="p">)</span> <span class="p">]</span>
  78. </pre></div>
  79. </div>
  80. </section>
  81. <section id="filter-urls-example">
  82. <span id="id1"></span><h2>Filter URLs example<a class="headerlink" href="#filter-urls-example" title="Link to this heading">¶</a></h2>
  83. <aside class="sidebar">
  84. <p class="sidebar-title">Further reading ..</p>
  85. <ul class="simple">
  86. <li><p><a class="reference internal" href="../result_types/base_result.html#searx.result_types._base.Result.filter_urls" title="searx.result_types._base.Result.filter_urls"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Result.filter_urls(..)</span></code></a></p></li>
  87. </ul>
  88. </aside>
  89. <p>The <a class="reference internal" href="../result_types/base_result.html#searx.result_types._base.Result.filter_urls" title="searx.result_types._base.Result.filter_urls"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Result.filter_urls(..)</span></code></a>
  90. can be used to filter and/or modify URL fields. In the following example, the
  91. filter function <code class="docutils literal notranslate"><span class="pre">my_url_filter</span></code>:</p>
  92. <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span><span class="w"> </span><span class="nf">my_url_filter</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">field_name</span><span class="p">,</span> <span class="n">url_src</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span> <span class="o">|</span> <span class="nb">str</span><span class="p">:</span>
  93. <span class="k">if</span> <span class="s2">&quot;google&quot;</span> <span class="ow">in</span> <span class="n">url_src</span><span class="p">:</span>
  94. <span class="k">return</span> <span class="kc">False</span> <span class="c1"># remove URL field from result</span>
  95. <span class="k">if</span> <span class="s2">&quot;facebook&quot;</span> <span class="ow">in</span> <span class="n">url_src</span><span class="p">:</span>
  96. <span class="n">new_url</span> <span class="o">=</span> <span class="n">url_src</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;facebook&quot;</span><span class="p">,</span> <span class="s2">&quot;fb-dummy&quot;</span><span class="p">)</span>
  97. <span class="k">return</span> <span class="n">new_url</span> <span class="c1"># return modified URL</span>
  98. <span class="k">return</span> <span class="kc">True</span> <span class="c1"># leave URL in field unchanged</span>
  99. </pre></div>
  100. </div>
  101. <p>is applied to all URL fields in the <a class="reference internal" href="#searx.plugins.Plugin.on_result" title="searx.plugins.Plugin.on_result"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Plugin.on_result</span></code></a> hook:</p>
  102. <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">class</span><span class="w"> </span><span class="nc">MyUrlFilter</span><span class="p">(</span><span class="n">Plugin</span><span class="p">):</span>
  103. <span class="o">...</span>
  104. <span class="k">def</span><span class="w"> </span><span class="nf">on_result</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">search</span><span class="p">,</span> <span class="n">result</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
  105. <span class="n">result</span><span class="o">.</span><span class="n">filter_urls</span><span class="p">(</span><span class="n">my_url_filter</span><span class="p">)</span>
  106. <span class="k">return</span> <span class="kc">True</span>
  107. </pre></div>
  108. </div>
  109. </section>
  110. <section id="implementation">
  111. <h2>Implementation<a class="headerlink" href="#implementation" title="Link to this heading">¶</a></h2>
  112. <dl class="py class">
  113. <dt class="sig sig-object py" id="searx.plugins.Plugin">
  114. <em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">searx.plugins.</span></span><span class="sig-name descname"><span class="pre">Plugin</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">plg_cfg</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="#searx.plugins.PluginCfg" title="searx.plugins._core.PluginCfg"><span class="pre">PluginCfg</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/searx/plugins/_core.html#Plugin"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.plugins.Plugin" title="Link to this definition">¶</a></dt>
  115. <dd><p>Abstract base class of all Plugins.</p>
  116. <dl class="py attribute">
  117. <dt class="sig sig-object py" id="searx.plugins.Plugin.id">
  118. <span class="sig-name descname"><span class="pre">id</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.13)"><span class="pre">str</span></a></em><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">''</span></em><a class="headerlink" href="#searx.plugins.Plugin.id" title="Link to this definition">¶</a></dt>
  119. <dd><p>The ID (suffix) in the HTML form.</p>
  120. </dd></dl>
  121. <dl class="py attribute">
  122. <dt class="sig sig-object py" id="searx.plugins.Plugin.active">
  123. <span class="sig-name descname"><span class="pre">active</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.ClassVar" title="(in Python v3.13)"><span class="pre">ClassVar</span></a><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.13)"><span class="pre">bool</span></a><span class="p"><span class="pre">]</span></span></em><a class="headerlink" href="#searx.plugins.Plugin.active" title="Link to this definition">¶</a></dt>
  124. <dd><p>Plugin is enabled/disabled by default (<a class="reference internal" href="#searx.plugins.PluginCfg.active" title="searx.plugins.PluginCfg.active"><code class="xref py py-obj docutils literal notranslate"><span class="pre">PluginCfg.active</span></code></a>).</p>
  125. </dd></dl>
  126. <dl class="py attribute">
  127. <dt class="sig sig-object py" id="searx.plugins.Plugin.keywords">
  128. <span class="sig-name descname"><span class="pre">keywords</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.13)"><span class="pre">list</span></a><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.13)"><span class="pre">str</span></a><span class="p"><span class="pre">]</span></span></em><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">[]</span></em><a class="headerlink" href="#searx.plugins.Plugin.keywords" title="Link to this definition">¶</a></dt>
  129. <dd><p>Keywords in the search query that activate the plugin. The <em>keyword</em> is
  130. the first word in a search query. If a plugin should be executed regardless
  131. of the search query, the list of keywords should be empty (which is also the
  132. default in the base class for Plugins).</p>
  133. </dd></dl>
  134. <dl class="py attribute">
  135. <dt class="sig sig-object py" id="searx.plugins.Plugin.info">
  136. <span class="sig-name descname"><span class="pre">info</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference internal" href="#searx.plugins.PluginInfo" title="searx.plugins._core.PluginInfo"><span class="pre">PluginInfo</span></a></em><a class="headerlink" href="#searx.plugins.Plugin.info" title="Link to this definition">¶</a></dt>
  137. <dd><p>Informations about the <em>plugin</em>, see <a class="reference internal" href="#searx.plugins.PluginInfo" title="searx.plugins.PluginInfo"><code class="xref py py-obj docutils literal notranslate"><span class="pre">PluginInfo</span></code></a>.</p>
  138. </dd></dl>
  139. <dl class="py attribute">
  140. <dt class="sig sig-object py" id="searx.plugins.Plugin.log">
  141. <span class="sig-name descname"><span class="pre">log</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/logging.html#logging.Logger" title="(in Python v3.13)"><span class="pre">Logger</span></a></em><a class="headerlink" href="#searx.plugins.Plugin.log" title="Link to this definition">¶</a></dt>
  142. <dd><p>A logger object, is automatically initialized when calling the
  143. constructor (if not already set in the subclass).</p>
  144. </dd></dl>
  145. <dl class="py method">
  146. <dt class="sig sig-object py" id="searx.plugins.Plugin.init">
  147. <span class="sig-name descname"><span class="pre">init</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">app</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://flask.palletsprojects.com/en/stable/api/#flask.Flask" title="(in Flask v3.1.x)"><span class="pre">flask.Flask</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.13)"><span class="pre">bool</span></a></span></span><a class="reference internal" href="../../_modules/searx/plugins/_core.html#Plugin.init"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.plugins.Plugin.init" title="Link to this definition">¶</a></dt>
  148. <dd><p>Initialization of the plugin, the return value decides whether this
  149. plugin is active or not. Initialization only takes place once, at the
  150. time the WEB application is set up. The base methode always returns
  151. <code class="docutils literal notranslate"><span class="pre">True</span></code>, the methode can be overwritten in the inheritances,</p>
  152. <ul class="simple">
  153. <li><p><code class="docutils literal notranslate"><span class="pre">True</span></code> plugin is active</p></li>
  154. <li><p><code class="docutils literal notranslate"><span class="pre">False</span></code> plugin is inactive</p></li>
  155. </ul>
  156. </dd></dl>
  157. <dl class="py method">
  158. <dt class="sig sig-object py" id="searx.plugins.Plugin.pre_search">
  159. <span class="sig-name descname"><span class="pre">pre_search</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">request</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../extended_types.html#searx.extended_types.SXNG_Request" title="searx.extended_types.SXNG_Request"><span class="pre">SXNG_Request</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">search</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../../src/searx.search.html#searx.search.SearchWithPlugins" title="searx.search.SearchWithPlugins"><span class="pre">SearchWithPlugins</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.13)"><span class="pre">bool</span></a></span></span><a class="reference internal" href="../../_modules/searx/plugins/_core.html#Plugin.pre_search"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.plugins.Plugin.pre_search" title="Link to this definition">¶</a></dt>
  160. <dd><p>Runs BEFORE the search request and returns a boolean:</p>
  161. <ul class="simple">
  162. <li><p><code class="docutils literal notranslate"><span class="pre">True</span></code> to continue the search</p></li>
  163. <li><p><code class="docutils literal notranslate"><span class="pre">False</span></code> to stop the search</p></li>
  164. </ul>
  165. </dd></dl>
  166. <dl class="py method">
  167. <dt class="sig sig-object py" id="searx.plugins.Plugin.on_result">
  168. <span class="sig-name descname"><span class="pre">on_result</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">request</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../extended_types.html#searx.extended_types.SXNG_Request" title="searx.extended_types.SXNG_Request"><span class="pre">SXNG_Request</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">search</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../../src/searx.search.html#searx.search.SearchWithPlugins" title="searx.search.SearchWithPlugins"><span class="pre">SearchWithPlugins</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">result</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../result_types/base_result.html#searx.result_types._base.Result" title="searx.result_types._base.Result"><span class="pre">Result</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.13)"><span class="pre">bool</span></a></span></span><a class="reference internal" href="../../_modules/searx/plugins/_core.html#Plugin.on_result"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.plugins.Plugin.on_result" title="Link to this definition">¶</a></dt>
  169. <dd><p>Runs for each result of each engine and returns a boolean:</p>
  170. <ul class="simple">
  171. <li><p><code class="docutils literal notranslate"><span class="pre">True</span></code> to keep the result</p></li>
  172. <li><p><code class="docutils literal notranslate"><span class="pre">False</span></code> to remove the result from the result list</p></li>
  173. </ul>
  174. <p>The <code class="docutils literal notranslate"><span class="pre">result</span></code> can be modified to the needs.</p>
  175. <div class="admonition hint">
  176. <p class="admonition-title">Hint</p>
  177. <p>If <a class="reference internal" href="../result_types/base_result.html#searx.result_types._base.Result.url" title="searx.result_types._base.Result.url"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Result.url</span></code></a> is modified,
  178. <a class="reference internal" href="../result_types/base_result.html#searx.result_types._base.Result.parsed_url" title="searx.result_types._base.Result.parsed_url"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Result.parsed_url</span></code></a> must
  179. be changed accordingly:</p>
  180. <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">result</span><span class="p">[</span><span class="s2">&quot;parsed_url&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">urlparse</span><span class="p">(</span><span class="n">result</span><span class="p">[</span><span class="s2">&quot;url&quot;</span><span class="p">])</span>
  181. </pre></div>
  182. </div>
  183. </div>
  184. </dd></dl>
  185. <dl class="py method">
  186. <dt class="sig sig-object py" id="searx.plugins.Plugin.post_search">
  187. <span class="sig-name descname"><span class="pre">post_search</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">request</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../extended_types.html#searx.extended_types.SXNG_Request" title="searx.extended_types.SXNG_Request"><span class="pre">SXNG_Request</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">search</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../../src/searx.search.html#searx.search.SearchWithPlugins" title="searx.search.SearchWithPlugins"><span class="pre">SearchWithPlugins</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.13)"><span class="pre">None</span></a><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.Sequence" title="(in Python v3.13)"><span class="pre">Sequence</span></a><span class="p"><span class="pre">[</span></span><a class="reference internal" href="../result_types/base_result.html#searx.result_types._base.Result" title="searx.result_types._base.Result"><span class="pre">Result</span></a><span class="p"><span class="pre">]</span></span></span></span><a class="reference internal" href="../../_modules/searx/plugins/_core.html#Plugin.post_search"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.plugins.Plugin.post_search" title="Link to this definition">¶</a></dt>
  188. <dd><p>Runs AFTER the search request. Can return a list of
  189. <a class="reference internal" href="../result_types/base_result.html#searx.result_types._base.Result" title="searx.result_types._base.Result"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Result</span></code></a> objects to be added to the
  190. final result list.</p>
  191. </dd></dl>
  192. </dd></dl>
  193. <dl class="py class">
  194. <dt class="sig sig-object py" id="searx.plugins.PluginInfo">
  195. <em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">searx.plugins.</span></span><span class="sig-name descname"><span class="pre">PluginInfo</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">id:</span> <span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">name:</span> <span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">description:</span> <span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">preference_section:</span> <span class="pre">~typing.Literal['general'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">'ui'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">'privacy'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">'query']</span> <span class="pre">|</span> <span class="pre">None</span> <span class="pre">=</span> <span class="pre">'general'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">examples:</span> <span class="pre">list[str]</span> <span class="pre">=</span> <span class="pre">&lt;factory&gt;</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">keywords:</span> <span class="pre">list[str]</span> <span class="pre">=</span> <span class="pre">&lt;factory&gt;</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/searx/plugins/_core.html#PluginInfo"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.plugins.PluginInfo" title="Link to this definition">¶</a></dt>
  196. <dd><p>Object that holds informations about a <em>plugin</em>, these infos are shown to
  197. the user in the Preferences menu.</p>
  198. <p>To be able to translate the information into other languages, the text must
  199. be written in English and translated with <a class="reference external" href="https://python-babel.github.io/flask-babel/index.html#flask_babel.gettext" title="(in Flask-Babel)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">flask_babel.gettext</span></code></a>.</p>
  200. <dl class="py attribute">
  201. <dt class="sig sig-object py" id="searx.plugins.PluginInfo.id">
  202. <span class="sig-name descname"><span class="pre">id</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.13)"><span class="pre">str</span></a></em><a class="headerlink" href="#searx.plugins.PluginInfo.id" title="Link to this definition">¶</a></dt>
  203. <dd><p>The ID-selector in HTML/CSS <cite>#&lt;id&gt;</cite>.</p>
  204. </dd></dl>
  205. <dl class="py attribute">
  206. <dt class="sig sig-object py" id="searx.plugins.PluginInfo.name">
  207. <span class="sig-name descname"><span class="pre">name</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.13)"><span class="pre">str</span></a></em><a class="headerlink" href="#searx.plugins.PluginInfo.name" title="Link to this definition">¶</a></dt>
  208. <dd><p>Name of the <em>plugin</em>.</p>
  209. </dd></dl>
  210. <dl class="py attribute">
  211. <dt class="sig sig-object py" id="searx.plugins.PluginInfo.description">
  212. <span class="sig-name descname"><span class="pre">description</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.13)"><span class="pre">str</span></a></em><a class="headerlink" href="#searx.plugins.PluginInfo.description" title="Link to this definition">¶</a></dt>
  213. <dd><p>Short description of the <em>answerer</em>.</p>
  214. </dd></dl>
  215. <dl class="py attribute">
  216. <dt class="sig sig-object py" id="searx.plugins.PluginInfo.preference_section">
  217. <span class="sig-name descname"><span class="pre">preference_section</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/typing.html#typing.Literal" title="(in Python v3.13)"><span class="pre">Literal</span></a><span class="p"><span class="pre">[</span></span><span class="s"><span class="pre">'general'</span></span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="s"><span class="pre">'ui'</span></span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="s"><span class="pre">'privacy'</span></span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="s"><span class="pre">'query'</span></span><span class="p"><span class="pre">]</span></span><span class="w"> </span><span class="p"><span class="pre">|</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.13)"><span class="pre">None</span></a></em><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">'general'</span></em><a class="headerlink" href="#searx.plugins.PluginInfo.preference_section" title="Link to this definition">¶</a></dt>
  218. <dd><p>Section (tab/group) in the preferences where this plugin is shown to the
  219. user.</p>
  220. <p>The value <code class="docutils literal notranslate"><span class="pre">query</span></code> is reserved for plugins that are activated via a
  221. <em>keyword</em> as part of a search query, see:</p>
  222. <ul class="simple">
  223. <li><p><a class="reference internal" href="#searx.plugins.PluginInfo.examples" title="searx.plugins.PluginInfo.examples"><code class="xref py py-obj docutils literal notranslate"><span class="pre">PluginInfo.examples</span></code></a></p></li>
  224. <li><p><a class="reference internal" href="#searx.plugins.Plugin.keywords" title="searx.plugins.Plugin.keywords"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Plugin.keywords</span></code></a></p></li>
  225. </ul>
  226. <p>Those plugins are shown in the preferences in tab <em>Special Queries</em>.</p>
  227. </dd></dl>
  228. <dl class="py attribute">
  229. <dt class="sig sig-object py" id="searx.plugins.PluginInfo.examples">
  230. <span class="sig-name descname"><span class="pre">examples</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.13)"><span class="pre">list</span></a><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.13)"><span class="pre">str</span></a><span class="p"><span class="pre">]</span></span></em><a class="headerlink" href="#searx.plugins.PluginInfo.examples" title="Link to this definition">¶</a></dt>
  231. <dd><p>List of short examples of the usage / of query terms.</p>
  232. </dd></dl>
  233. <dl class="py attribute">
  234. <dt class="sig sig-object py" id="searx.plugins.PluginInfo.keywords">
  235. <span class="sig-name descname"><span class="pre">keywords</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.13)"><span class="pre">list</span></a><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.13)"><span class="pre">str</span></a><span class="p"><span class="pre">]</span></span></em><a class="headerlink" href="#searx.plugins.PluginInfo.keywords" title="Link to this definition">¶</a></dt>
  236. <dd><p>See <a class="reference internal" href="#searx.plugins.Plugin.keywords" title="searx.plugins.Plugin.keywords"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Plugin.keywords</span></code></a></p>
  237. </dd></dl>
  238. </dd></dl>
  239. <dl class="py class">
  240. <dt class="sig sig-object py" id="searx.plugins.PluginStorage">
  241. <em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">searx.plugins.</span></span><span class="sig-name descname"><span class="pre">PluginStorage</span></span><a class="reference internal" href="../../_modules/searx/plugins/_core.html#PluginStorage"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.plugins.PluginStorage" title="Link to this definition">¶</a></dt>
  242. <dd><p>A storage for managing the <em>plugins</em> of SearXNG.</p>
  243. <dl class="py attribute">
  244. <dt class="sig sig-object py" id="searx.plugins.PluginStorage.plugin_list">
  245. <span class="sig-name descname"><span class="pre">plugin_list</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#set" title="(in Python v3.13)"><span class="pre">set</span></a><span class="p"><span class="pre">[</span></span><a class="reference internal" href="#searx.plugins.Plugin" title="searx.plugins._core.Plugin"><span class="pre">Plugin</span></a><span class="p"><span class="pre">]</span></span></em><a class="headerlink" href="#searx.plugins.PluginStorage.plugin_list" title="Link to this definition">¶</a></dt>
  246. <dd><p>The list of <code class="xref py py-obj docutils literal notranslate"><span class="pre">Plugins</span></code> in this storage.</p>
  247. </dd></dl>
  248. <dl class="py method">
  249. <dt class="sig sig-object py" id="searx.plugins.PluginStorage.load_settings">
  250. <span class="sig-name descname"><span class="pre">load_settings</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">cfg</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#dict" title="(in Python v3.13)"><span class="pre">dict</span></a><span class="p"><span class="pre">[</span></span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.13)"><span class="pre">str</span></a><span class="p"><span class="pre">,</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#dict" title="(in Python v3.13)"><span class="pre">dict</span></a><span class="p"><span class="pre">]</span></span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/searx/plugins/_core.html#PluginStorage.load_settings"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.plugins.PluginStorage.load_settings" title="Link to this definition">¶</a></dt>
  251. <dd><p>Load plugins configured in SearXNG’s settings <a class="reference internal" href="../../admin/settings/settings_plugins.html#settings-plugins"><span class="std std-ref">plugins:</span></a>.</p>
  252. </dd></dl>
  253. <dl class="py method">
  254. <dt class="sig sig-object py" id="searx.plugins.PluginStorage.register">
  255. <span class="sig-name descname"><span class="pre">register</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">plugin</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="#searx.plugins.Plugin" title="searx.plugins._core.Plugin"><span class="pre">Plugin</span></a></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/searx/plugins/_core.html#PluginStorage.register"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.plugins.PluginStorage.register" title="Link to this definition">¶</a></dt>
  256. <dd><p>Register a <a class="reference internal" href="#searx.plugins.Plugin" title="searx.plugins.Plugin"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Plugin</span></code></a>. In case of name collision (if two
  257. plugins have same ID) a <a class="reference external" href="https://docs.python.org/3/library/exceptions.html#KeyError" title="(in Python v3.13)"><code class="xref py py-obj docutils literal notranslate"><span class="pre">KeyError</span></code></a> exception is raised.</p>
  258. </dd></dl>
  259. <dl class="py method">
  260. <dt class="sig sig-object py" id="searx.plugins.PluginStorage.init">
  261. <span class="sig-name descname"><span class="pre">init</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">app</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://flask.palletsprojects.com/en/stable/api/#flask.Flask" title="(in Flask v3.1.x)"><span class="pre">flask.Flask</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.13)"><span class="pre">None</span></a></span></span><a class="reference internal" href="../../_modules/searx/plugins/_core.html#PluginStorage.init"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.plugins.PluginStorage.init" title="Link to this definition">¶</a></dt>
  262. <dd><p>Calls the method <a class="reference internal" href="#searx.plugins.Plugin.init" title="searx.plugins.Plugin.init"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Plugin.init</span></code></a> of each plugin in this
  263. storage. Depending on its return value, the plugin is removed from
  264. <em>this</em> storage or not.</p>
  265. </dd></dl>
  266. <dl class="py method">
  267. <dt class="sig sig-object py" id="searx.plugins.PluginStorage.post_search">
  268. <span class="sig-name descname"><span class="pre">post_search</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">request</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../extended_types.html#searx.extended_types.SXNG_Request" title="searx.extended_types.SXNG_Request"><span class="pre">SXNG_Request</span></a></span></em>, <em class="sig-param"><span class="n"><span class="pre">search</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference internal" href="../../src/searx.search.html#searx.search.SearchWithPlugins" title="searx.search.SearchWithPlugins"><span class="pre">SearchWithPlugins</span></a></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.13)"><span class="pre">None</span></a></span></span><a class="reference internal" href="../../_modules/searx/plugins/_core.html#PluginStorage.post_search"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.plugins.PluginStorage.post_search" title="Link to this definition">¶</a></dt>
  269. <dd><p>Extend <code class="xref py py-obj docutils literal notranslate"><span class="pre">search.result_container</span>
  270. <span class="pre">&lt;searx.results.ResultContainer</span></code>&gt; with result items from plugins listed
  271. in <code class="xref py py-obj docutils literal notranslate"><span class="pre">search.user_plugins</span></code>.</p>
  272. </dd></dl>
  273. </dd></dl>
  274. <dl class="py class">
  275. <dt class="sig sig-object py" id="searx.plugins.PluginCfg">
  276. <em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">searx.plugins.</span></span><span class="sig-name descname"><span class="pre">PluginCfg</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">active</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.13)"><span class="pre">bool</span></a></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/searx/plugins/_core.html#PluginCfg"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#searx.plugins.PluginCfg" title="Link to this definition">¶</a></dt>
  277. <dd><p>Settings of a plugin.</p>
  278. <div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nt">mypackage.mymodule.MyPlugin</span><span class="p">:</span>
  279. <span class="w"> </span><span class="nt">active</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
  280. </pre></div>
  281. </div>
  282. <dl class="py attribute">
  283. <dt class="sig sig-object py" id="searx.plugins.PluginCfg.active">
  284. <span class="sig-name descname"><span class="pre">active</span></span><em class="property"><span class="p"><span class="pre">:</span></span><span class="w"> </span><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.13)"><span class="pre">bool</span></a></em><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">False</span></em><a class="headerlink" href="#searx.plugins.PluginCfg.active" title="Link to this definition">¶</a></dt>
  285. <dd><p>Plugin is active by default and the user can <em>opt-out</em> in the preferences.</p>
  286. </dd></dl>
  287. </dd></dl>
  288. </section>
  289. </section>
  290. <div class="clearer"></div>
  291. </div>
  292. </div>
  293. </div>
  294. <span id="sidebar-top"></span>
  295. <div class="sphinxsidebar" role="navigation" aria-label="Main">
  296. <div class="sphinxsidebarwrapper">
  297. <p class="logo"><a href="../../index.html">
  298. <img class="logo" src="../../_static/searxng-wordmark.svg" alt="Logo of SearXNG"/>
  299. </a></p>
  300. <h3><a href="../../index.html">Table of Contents</a></h3>
  301. <ul class="current">
  302. <li class="toctree-l1"><a class="reference internal" href="../../user/index.html">User information</a></li>
  303. <li class="toctree-l1"><a class="reference internal" href="../../own-instance.html">Why use a private instance?</a></li>
  304. <li class="toctree-l1"><a class="reference internal" href="../../admin/index.html">Administrator documentation</a></li>
  305. <li class="toctree-l1 current"><a class="reference internal" href="../index.html">Developer documentation</a><ul class="current">
  306. <li class="toctree-l2"><a class="reference internal" href="../quickstart.html">Development Quickstart</a></li>
  307. <li class="toctree-l2"><a class="reference internal" href="../rtm_asdf.html">Runtime Management</a></li>
  308. <li class="toctree-l2"><a class="reference internal" href="../contribution_guide.html">How to contribute</a></li>
  309. <li class="toctree-l2"><a class="reference internal" href="../extended_types.html">Extended Types</a></li>
  310. <li class="toctree-l2"><a class="reference internal" href="../engines/index.html">Engine Implementations</a></li>
  311. <li class="toctree-l2"><a class="reference internal" href="../result_types/index.html">Result Types</a></li>
  312. <li class="toctree-l2"><a class="reference internal" href="../templates.html">Simple Theme Templates</a></li>
  313. <li class="toctree-l2"><a class="reference internal" href="../search_api.html">Search API</a></li>
  314. <li class="toctree-l2 current"><a class="reference internal" href="index.html">Plugins</a><ul class="current">
  315. <li class="toctree-l3 current"><a class="current reference internal" href="#">Plugin Development</a><ul>
  316. <li class="toctree-l4"><a class="reference internal" href="#add-answer-example">Add Answer example</a></li>
  317. <li class="toctree-l4"><a class="reference internal" href="#filter-urls-example">Filter URLs example</a></li>
  318. <li class="toctree-l4"><a class="reference internal" href="#implementation">Implementation</a><ul>
  319. <li class="toctree-l5"><a class="reference internal" href="#searx.plugins.Plugin"><code class="docutils literal notranslate"><span class="pre">Plugin</span></code></a></li>
  320. <li class="toctree-l5"><a class="reference internal" href="#searx.plugins.PluginInfo"><code class="docutils literal notranslate"><span class="pre">PluginInfo</span></code></a></li>
  321. <li class="toctree-l5"><a class="reference internal" href="#searx.plugins.PluginStorage"><code class="docutils literal notranslate"><span class="pre">PluginStorage</span></code></a></li>
  322. <li class="toctree-l5"><a class="reference internal" href="#searx.plugins.PluginCfg"><code class="docutils literal notranslate"><span class="pre">PluginCfg</span></code></a></li>
  323. </ul>
  324. </li>
  325. </ul>
  326. </li>
  327. <li class="toctree-l3"><a class="reference internal" href="builtins.html">Built-in Plugins</a></li>
  328. </ul>
  329. </li>
  330. <li class="toctree-l2"><a class="reference internal" href="../answerers/index.html">Answerers</a></li>
  331. <li class="toctree-l2"><a class="reference internal" href="../translation.html">Translation</a></li>
  332. <li class="toctree-l2"><a class="reference internal" href="../lxcdev.html">Developing in Linux Containers</a></li>
  333. <li class="toctree-l2"><a class="reference internal" href="../makefile.html">Makefile &amp; <code class="docutils literal notranslate"><span class="pre">./manage</span></code></a></li>
  334. <li class="toctree-l2"><a class="reference internal" href="../reST.html">reST primer</a></li>
  335. <li class="toctree-l2"><a class="reference internal" href="../searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a></li>
  336. </ul>
  337. </li>
  338. <li class="toctree-l1"><a class="reference internal" href="../../utils/index.html">DevOps tooling box</a></li>
  339. <li class="toctree-l1"><a class="reference internal" href="../../src/index.html">Source-Code</a></li>
  340. </ul>
  341. <h3>Project Links</h3>
  342. <ul>
  343. <li><a href="https://github.com/searxng/searxng/tree/master">Source</a>
  344. <li><a href="https://github.com/searxng/searxng/wiki">Wiki</a>
  345. <li><a href="https://searx.space">Public instances</a>
  346. <li><a href="https://github.com/searxng/searxng/issues">Issue Tracker</a>
  347. </ul><h3>Navigation</h3>
  348. <ul>
  349. <li><a href="../../index.html">Overview</a>
  350. <ul>
  351. <li><a href="../index.html">Developer documentation</a>
  352. <ul>
  353. <li><a href="index.html">Plugins</a>
  354. <ul>
  355. <li>Previous: <a href="index.html" title="previous chapter">Plugins</a>
  356. <li>Next: <a href="builtins.html" title="next chapter">Built-in Plugins</a></ul>
  357. </li></ul>
  358. </li>
  359. </ul>
  360. </li>
  361. </ul>
  362. <search id="searchbox" style="display: none" role="search">
  363. <h3 id="searchlabel">Quick search</h3>
  364. <div class="searchformwrapper">
  365. <form class="search" action="../../search.html" method="get">
  366. <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
  367. <input type="submit" value="Go" />
  368. </form>
  369. </div>
  370. </search>
  371. <script>document.getElementById('searchbox').style.display = "block"</script>
  372. <div role="note" aria-label="source link">
  373. <h3>This Page</h3>
  374. <ul class="this-page-menu">
  375. <li><a href="../../_sources/dev/plugins/development.rst.txt"
  376. rel="nofollow">Show Source</a></li>
  377. </ul>
  378. </div>
  379. </div>
  380. </div>
  381. <div class="clearer"></div>
  382. </div>
  383. <div class="footer" role="contentinfo">
  384. &#169; Copyright SearXNG team.
  385. </div>
  386. </body>
  387. </html>