Update docs for main

This commit is contained in:
github-actions 2022-06-30 14:44:33 +00:00
parent ab2902304b
commit deceee4e97
22 changed files with 1014 additions and 1005 deletions

View file

@ -15,6 +15,7 @@
<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script> <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script> <script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script> <script src="_static/underscore.js"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="_static/doctools.js"></script> <script src="_static/doctools.js"></script>
<script src="_static/js/theme.js"></script> <script src="_static/js/theme.js"></script>
<link rel="index" title="Index" href="genindex.html" /> <link rel="index" title="Index" href="genindex.html" />
@ -51,11 +52,14 @@
<p class="caption" role="heading"><span class="caption-text">General</span></p> <p class="caption" role="heading"><span class="caption-text">General</span></p>
<ul class="current"> <ul class="current">
<li class="toctree-l1 current"><a class="current reference internal" href="#">Changelog</a><ul> <li class="toctree-l1 current"><a class="current reference internal" href="#">Changelog</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#v1-0-7-devel">v1.0.7-devel</a></li> <li class="toctree-l2"><a class="reference internal" href="#v1-0-7-devel">v1.0.7-devel</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#v1-0-6">v1.0.6</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#bugfixes">Bugfixes</a></li> <li class="toctree-l3"><a class="reference internal" href="#bugfixes">Bugfixes</a></li>
</ul> </ul>
</li> </li>
<li class="toctree-l2"><a class="reference internal" href="#v1-0-6">v1.0.6</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#id2">Bugfixes</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#v1-0-5">v1.0.5</a><ul> <li class="toctree-l2"><a class="reference internal" href="#v1-0-5">v1.0.5</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#minor-changes">Minor Changes</a></li> <li class="toctree-l3"><a class="reference internal" href="#minor-changes">Minor Changes</a></li>
</ul> </ul>
@ -63,23 +67,23 @@
<li class="toctree-l2"><a class="reference internal" href="#v1-0-4">v1.0.4</a></li> <li class="toctree-l2"><a class="reference internal" href="#v1-0-4">v1.0.4</a></li>
<li class="toctree-l2"><a class="reference internal" href="#v1-0-3">v1.0.3</a><ul> <li class="toctree-l2"><a class="reference internal" href="#v1-0-3">v1.0.3</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#major-changes">Major Changes</a></li> <li class="toctree-l3"><a class="reference internal" href="#major-changes">Major Changes</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id5">Minor Changes</a></li> <li class="toctree-l3"><a class="reference internal" href="#id7">Minor Changes</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id7">Bugfixes</a></li> <li class="toctree-l3"><a class="reference internal" href="#id9">Bugfixes</a></li>
</ul> </ul>
</li> </li>
<li class="toctree-l2"><a class="reference internal" href="#v1-0-2">v1.0.2</a><ul> <li class="toctree-l2"><a class="reference internal" href="#v1-0-2">v1.0.2</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#id9">Minor Changes</a></li> <li class="toctree-l3"><a class="reference internal" href="#id11">Minor Changes</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id12">Bugfixes</a></li> <li class="toctree-l3"><a class="reference internal" href="#id14">Bugfixes</a></li>
</ul> </ul>
</li> </li>
<li class="toctree-l2"><a class="reference internal" href="#v1-0-1">v1.0.1</a><ul> <li class="toctree-l2"><a class="reference internal" href="#v1-0-1">v1.0.1</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#release-summary">Release Summary</a></li> <li class="toctree-l3"><a class="reference internal" href="#release-summary">Release Summary</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id14">Major Changes</a></li> <li class="toctree-l3"><a class="reference internal" href="#id16">Major Changes</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id16">Minor Changes</a></li> <li class="toctree-l3"><a class="reference internal" href="#id18">Minor Changes</a></li>
</ul> </ul>
</li> </li>
<li class="toctree-l2"><a class="reference internal" href="#v1-0-0">v1.0.0</a><ul> <li class="toctree-l2"><a class="reference internal" href="#v1-0-0">v1.0.0</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#id18">Release Summary</a></li> <li class="toctree-l3"><a class="reference internal" href="#id20">Release Summary</a></li>
</ul> </ul>
</li> </li>
</ul> </ul>
@ -111,47 +115,51 @@
<div itemprop="articleBody"> <div itemprop="articleBody">
<section id="middleware-automation-keycloak-release-notes"> <section id="middleware-automation-keycloak-release-notes">
<h1><a class="toc-backref" href="#id19">middleware_automation.keycloak Release Notes</a><a class="headerlink" href="#middleware-automation-keycloak-release-notes" title="Permalink to this headline"></a></h1> <h1><a class="toc-backref" href="#id21">middleware_automation.keycloak Release Notes</a><a class="headerlink" href="#middleware-automation-keycloak-release-notes" title="Permalink to this heading"></a></h1>
<div class="contents topic" id="topics"> <div class="contents topic" id="topics">
<p class="topic-title">Topics</p> <p class="topic-title">Topics</p>
<ul class="simple"> <ul class="simple">
<li><p><a class="reference internal" href="#middleware-automation-keycloak-release-notes" id="id19">middleware_automation.keycloak Release Notes</a></p> <li><p><a class="reference internal" href="#middleware-automation-keycloak-release-notes" id="id21">middleware_automation.keycloak Release Notes</a></p>
<ul> <ul>
<li><p><a class="reference internal" href="#v1-0-7-devel" id="id20">v1.0.7-devel</a></p></li> <li><p><a class="reference internal" href="#v1-0-7-devel" id="id22">v1.0.7-devel</a></p>
<li><p><a class="reference internal" href="#v1-0-6" id="id21">v1.0.6</a></p>
<ul> <ul>
<li><p><a class="reference internal" href="#bugfixes" id="id22">Bugfixes</a></p></li> <li><p><a class="reference internal" href="#bugfixes" id="id23">Bugfixes</a></p></li>
</ul> </ul>
</li> </li>
<li><p><a class="reference internal" href="#v1-0-5" id="id23">v1.0.5</a></p> <li><p><a class="reference internal" href="#v1-0-6" id="id24">v1.0.6</a></p>
<ul> <ul>
<li><p><a class="reference internal" href="#minor-changes" id="id24">Minor Changes</a></p></li> <li><p><a class="reference internal" href="#id2" id="id25">Bugfixes</a></p></li>
</ul> </ul>
</li> </li>
<li><p><a class="reference internal" href="#v1-0-4" id="id25">v1.0.4</a></p></li> <li><p><a class="reference internal" href="#v1-0-5" id="id26">v1.0.5</a></p>
<li><p><a class="reference internal" href="#v1-0-3" id="id26">v1.0.3</a></p>
<ul> <ul>
<li><p><a class="reference internal" href="#major-changes" id="id27">Major Changes</a></p></li> <li><p><a class="reference internal" href="#minor-changes" id="id27">Minor Changes</a></p></li>
<li><p><a class="reference internal" href="#id5" id="id28">Minor Changes</a></p></li>
<li><p><a class="reference internal" href="#id7" id="id29">Bugfixes</a></p></li>
</ul> </ul>
</li> </li>
<li><p><a class="reference internal" href="#v1-0-2" id="id30">v1.0.2</a></p> <li><p><a class="reference internal" href="#v1-0-4" id="id28">v1.0.4</a></p></li>
<li><p><a class="reference internal" href="#v1-0-3" id="id29">v1.0.3</a></p>
<ul> <ul>
<li><p><a class="reference internal" href="#id9" id="id31">Minor Changes</a></p></li> <li><p><a class="reference internal" href="#major-changes" id="id30">Major Changes</a></p></li>
<li><p><a class="reference internal" href="#id12" id="id32">Bugfixes</a></p></li> <li><p><a class="reference internal" href="#id7" id="id31">Minor Changes</a></p></li>
<li><p><a class="reference internal" href="#id9" id="id32">Bugfixes</a></p></li>
</ul> </ul>
</li> </li>
<li><p><a class="reference internal" href="#v1-0-1" id="id33">v1.0.1</a></p> <li><p><a class="reference internal" href="#v1-0-2" id="id33">v1.0.2</a></p>
<ul> <ul>
<li><p><a class="reference internal" href="#release-summary" id="id34">Release Summary</a></p></li> <li><p><a class="reference internal" href="#id11" id="id34">Minor Changes</a></p></li>
<li><p><a class="reference internal" href="#id14" id="id35">Major Changes</a></p></li> <li><p><a class="reference internal" href="#id14" id="id35">Bugfixes</a></p></li>
<li><p><a class="reference internal" href="#id16" id="id36">Minor Changes</a></p></li>
</ul> </ul>
</li> </li>
<li><p><a class="reference internal" href="#v1-0-0" id="id37">v1.0.0</a></p> <li><p><a class="reference internal" href="#v1-0-1" id="id36">v1.0.1</a></p>
<ul> <ul>
<li><p><a class="reference internal" href="#id18" id="id38">Release Summary</a></p></li> <li><p><a class="reference internal" href="#release-summary" id="id37">Release Summary</a></p></li>
<li><p><a class="reference internal" href="#id16" id="id38">Major Changes</a></p></li>
<li><p><a class="reference internal" href="#id18" id="id39">Minor Changes</a></p></li>
</ul>
</li>
<li><p><a class="reference internal" href="#v1-0-0" id="id40">v1.0.0</a></p>
<ul>
<li><p><a class="reference internal" href="#id20" id="id41">Release Summary</a></p></li>
</ul> </ul>
</li> </li>
</ul> </ul>
@ -160,12 +168,18 @@
</div> </div>
<p>This changelog describes changes after version 0.2.6.</p> <p>This changelog describes changes after version 0.2.6.</p>
<section id="v1-0-7-devel"> <section id="v1-0-7-devel">
<h2><a class="toc-backref" href="#id20">v1.0.7-devel</a><a class="headerlink" href="#v1-0-7-devel" title="Permalink to this headline"></a></h2> <h2><a class="toc-backref" href="#id22">v1.0.7-devel</a><a class="headerlink" href="#v1-0-7-devel" title="Permalink to this heading"></a></h2>
<section id="bugfixes">
<h3><a class="toc-backref" href="#id23">Bugfixes</a><a class="headerlink" href="#bugfixes" title="Permalink to this heading"></a></h3>
<ul class="simple">
<li><p>Use become for tasks that will otherwise fail <a class="reference external" href="https://github.com/ansible-middleware/keycloak/pull/38">#38</a></p></li>
</ul>
</section>
</section> </section>
<section id="v1-0-6"> <section id="v1-0-6">
<h2><a class="toc-backref" href="#id21">v1.0.6</a><a class="headerlink" href="#v1-0-6" title="Permalink to this headline"></a></h2> <h2><a class="toc-backref" href="#id24">v1.0.6</a><a class="headerlink" href="#v1-0-6" title="Permalink to this heading"></a></h2>
<section id="bugfixes"> <section id="id2">
<h3><a class="toc-backref" href="#id22">Bugfixes</a><a class="headerlink" href="#bugfixes" title="Permalink to this headline"></a></h3> <h3><a class="toc-backref" href="#id25">Bugfixes</a><a class="headerlink" href="#id2" title="Permalink to this heading"></a></h3>
<ul class="simple"> <ul class="simple">
<li><p>keycloak_quarkus: add selected java to PATH in systemd unit <a class="reference external" href="https://github.com/ansible-middleware/keycloak/pull/34">#34</a></p></li> <li><p>keycloak_quarkus: add selected java to PATH in systemd unit <a class="reference external" href="https://github.com/ansible-middleware/keycloak/pull/34">#34</a></p></li>
<li><p>keycloak_quarkus: set logfile path correctly under keycloak home <a class="reference external" href="https://github.com/ansible-middleware/keycloak/pull/35">#35</a></p></li> <li><p>keycloak_quarkus: set logfile path correctly under keycloak home <a class="reference external" href="https://github.com/ansible-middleware/keycloak/pull/35">#35</a></p></li>
@ -173,77 +187,77 @@
</section> </section>
</section> </section>
<section id="v1-0-5"> <section id="v1-0-5">
<h2><a class="toc-backref" href="#id23">v1.0.5</a><a class="headerlink" href="#v1-0-5" title="Permalink to this headline"></a></h2> <h2><a class="toc-backref" href="#id26">v1.0.5</a><a class="headerlink" href="#v1-0-5" title="Permalink to this heading"></a></h2>
<section id="minor-changes"> <section id="minor-changes">
<h3><a class="toc-backref" href="#id24">Minor Changes</a><a class="headerlink" href="#minor-changes" title="Permalink to this headline"></a></h3> <h3><a class="toc-backref" href="#id27">Minor Changes</a><a class="headerlink" href="#minor-changes" title="Permalink to this heading"></a></h3>
<ul class="simple"> <ul class="simple">
<li><p>Update config options: keycloak and quarkus <a class="reference external" href="https://github.com/ansible-middleware/keycloak/pull/32">#32</a></p></li> <li><p>Update config options: keycloak and quarkus <a class="reference external" href="https://github.com/ansible-middleware/keycloak/pull/32">#32</a></p></li>
</ul> </ul>
</section> </section>
</section> </section>
<section id="v1-0-4"> <section id="v1-0-4">
<h2><a class="toc-backref" href="#id25">v1.0.4</a><a class="headerlink" href="#v1-0-4" title="Permalink to this headline"></a></h2> <h2><a class="toc-backref" href="#id28">v1.0.4</a><a class="headerlink" href="#v1-0-4" title="Permalink to this heading"></a></h2>
</section> </section>
<section id="v1-0-3"> <section id="v1-0-3">
<h2><a class="toc-backref" href="#id26">v1.0.3</a><a class="headerlink" href="#v1-0-3" title="Permalink to this headline"></a></h2> <h2><a class="toc-backref" href="#id29">v1.0.3</a><a class="headerlink" href="#v1-0-3" title="Permalink to this heading"></a></h2>
<section id="major-changes"> <section id="major-changes">
<h3><a class="toc-backref" href="#id27">Major Changes</a><a class="headerlink" href="#major-changes" title="Permalink to this headline"></a></h3> <h3><a class="toc-backref" href="#id30">Major Changes</a><a class="headerlink" href="#major-changes" title="Permalink to this heading"></a></h3>
<ul class="simple"> <ul class="simple">
<li><p>New role for installing keycloak &gt;= 17.0.0 (quarkus) <a class="reference external" href="https://github.com/ansible-middleware/keycloak/pull/29">#29</a></p></li> <li><p>New role for installing keycloak &gt;= 17.0.0 (quarkus) <a class="reference external" href="https://github.com/ansible-middleware/keycloak/pull/29">#29</a></p></li>
</ul> </ul>
</section> </section>
<section id="id5"> <section id="id7">
<h3><a class="toc-backref" href="#id28">Minor Changes</a><a class="headerlink" href="#id5" title="Permalink to this headline"></a></h3> <h3><a class="toc-backref" href="#id31">Minor Changes</a><a class="headerlink" href="#id7" title="Permalink to this heading"></a></h3>
<ul class="simple"> <ul class="simple">
<li><p>Add <code class="docutils literal notranslate"><span class="pre">keycloak_config_override_template</span></code> parameter for passing a custom xml config template <a class="reference external" href="https://github.com/ansible-middleware/keycloak/pull/30">#30</a></p></li> <li><p>Add <code class="docutils literal notranslate"><span class="pre">keycloak_config_override_template</span></code> parameter for passing a custom xml config template <a class="reference external" href="https://github.com/ansible-middleware/keycloak/pull/30">#30</a></p></li>
</ul> </ul>
</section> </section>
<section id="id7"> <section id="id9">
<h3><a class="toc-backref" href="#id29">Bugfixes</a><a class="headerlink" href="#id7" title="Permalink to this headline"></a></h3> <h3><a class="toc-backref" href="#id32">Bugfixes</a><a class="headerlink" href="#id9" title="Permalink to this heading"></a></h3>
<ul class="simple"> <ul class="simple">
<li><p>Make sure systemd unit starts with selected java JVM <a class="reference external" href="https://github.com/ansible-middleware/keycloak/pull/31">#31</a></p></li> <li><p>Make sure systemd unit starts with selected java JVM <a class="reference external" href="https://github.com/ansible-middleware/keycloak/pull/31">#31</a></p></li>
</ul> </ul>
</section> </section>
</section> </section>
<section id="v1-0-2"> <section id="v1-0-2">
<h2><a class="toc-backref" href="#id30">v1.0.2</a><a class="headerlink" href="#v1-0-2" title="Permalink to this headline"></a></h2> <h2><a class="toc-backref" href="#id33">v1.0.2</a><a class="headerlink" href="#v1-0-2" title="Permalink to this heading"></a></h2>
<section id="id9"> <section id="id11">
<h3><a class="toc-backref" href="#id31">Minor Changes</a><a class="headerlink" href="#id9" title="Permalink to this headline"></a></h3> <h3><a class="toc-backref" href="#id34">Minor Changes</a><a class="headerlink" href="#id11" title="Permalink to this heading"></a></h3>
<ul class="simple"> <ul class="simple">
<li><p>Make <code class="docutils literal notranslate"><span class="pre">keycloak_admin_password</span></code> a default with assert (was: role variable) <a class="reference external" href="https://github.com/ansible-middleware/keycloak/pull/26">#26</a></p></li> <li><p>Make <code class="docutils literal notranslate"><span class="pre">keycloak_admin_password</span></code> a default with assert (was: role variable) <a class="reference external" href="https://github.com/ansible-middleware/keycloak/pull/26">#26</a></p></li>
<li><p>Simplify dependency install logic and reduce play execution time <a class="reference external" href="https://github.com/ansible-middleware/keycloak/pull/19">#19</a></p></li> <li><p>Simplify dependency install logic and reduce play execution time <a class="reference external" href="https://github.com/ansible-middleware/keycloak/pull/19">#19</a></p></li>
</ul> </ul>
</section> </section>
<section id="id12"> <section id="id14">
<h3><a class="toc-backref" href="#id32">Bugfixes</a><a class="headerlink" href="#id12" title="Permalink to this headline"></a></h3> <h3><a class="toc-backref" href="#id35">Bugfixes</a><a class="headerlink" href="#id14" title="Permalink to this heading"></a></h3>
<ul class="simple"> <ul class="simple">
<li><p>Set <code class="docutils literal notranslate"><span class="pre">keycloak_frontend_url</span></code> default according to other defaults <a class="reference external" href="https://github.com/ansible-middleware/keycloak/pull/25">#25</a></p></li> <li><p>Set <code class="docutils literal notranslate"><span class="pre">keycloak_frontend_url</span></code> default according to other defaults <a class="reference external" href="https://github.com/ansible-middleware/keycloak/pull/25">#25</a></p></li>
</ul> </ul>
</section> </section>
</section> </section>
<section id="v1-0-1"> <section id="v1-0-1">
<h2><a class="toc-backref" href="#id33">v1.0.1</a><a class="headerlink" href="#v1-0-1" title="Permalink to this headline"></a></h2> <h2><a class="toc-backref" href="#id36">v1.0.1</a><a class="headerlink" href="#v1-0-1" title="Permalink to this heading"></a></h2>
<section id="release-summary"> <section id="release-summary">
<h3><a class="toc-backref" href="#id34">Release Summary</a><a class="headerlink" href="#release-summary" title="Permalink to this headline"></a></h3> <h3><a class="toc-backref" href="#id37">Release Summary</a><a class="headerlink" href="#release-summary" title="Permalink to this heading"></a></h3>
<p>Minor enhancements, bug and documentation fixes.</p> <p>Minor enhancements, bug and documentation fixes.</p>
</section> </section>
<section id="id14"> <section id="id16">
<h3><a class="toc-backref" href="#id35">Major Changes</a><a class="headerlink" href="#id14" title="Permalink to this headline"></a></h3> <h3><a class="toc-backref" href="#id38">Major Changes</a><a class="headerlink" href="#id16" title="Permalink to this heading"></a></h3>
<ul class="simple"> <ul class="simple">
<li><p>Apply latest cumulative patch of RH-SSO automatically when new parameter <code class="docutils literal notranslate"><span class="pre">keycloak_rhsso_apply_patches</span></code> is <code class="docutils literal notranslate"><span class="pre">true</span></code> <a class="reference external" href="https://github.com/ansible-middleware/keycloak/pull/18">#18</a></p></li> <li><p>Apply latest cumulative patch of RH-SSO automatically when new parameter <code class="docutils literal notranslate"><span class="pre">keycloak_rhsso_apply_patches</span></code> is <code class="docutils literal notranslate"><span class="pre">true</span></code> <a class="reference external" href="https://github.com/ansible-middleware/keycloak/pull/18">#18</a></p></li>
</ul> </ul>
</section> </section>
<section id="id16"> <section id="id18">
<h3><a class="toc-backref" href="#id36">Minor Changes</a><a class="headerlink" href="#id16" title="Permalink to this headline"></a></h3> <h3><a class="toc-backref" href="#id39">Minor Changes</a><a class="headerlink" href="#id18" title="Permalink to this heading"></a></h3>
<ul class="simple"> <ul class="simple">
<li><p>Clustered installs now perform database initialization on first node to avoid locking issues <a class="reference external" href="https://github.com/ansible-middleware/keycloak/pull/17">#17</a></p></li> <li><p>Clustered installs now perform database initialization on first node to avoid locking issues <a class="reference external" href="https://github.com/ansible-middleware/keycloak/pull/17">#17</a></p></li>
</ul> </ul>
</section> </section>
</section> </section>
<section id="v1-0-0"> <section id="v1-0-0">
<h2><a class="toc-backref" href="#id37">v1.0.0</a><a class="headerlink" href="#v1-0-0" title="Permalink to this headline"></a></h2> <h2><a class="toc-backref" href="#id40">v1.0.0</a><a class="headerlink" href="#v1-0-0" title="Permalink to this heading"></a></h2>
<section id="id18"> <section id="id20">
<h3><a class="toc-backref" href="#id38">Release Summary</a><a class="headerlink" href="#id18" title="Permalink to this headline"></a></h3> <h3><a class="toc-backref" href="#id41">Release Summary</a><a class="headerlink" href="#id20" title="Permalink to this heading"></a></h3>
<p>This is the first stable release of the <code class="docutils literal notranslate"><span class="pre">middleware_automation.keycloak</span></code> collection.</p> <p>This is the first stable release of the <code class="docutils literal notranslate"><span class="pre">middleware_automation.keycloak</span></code> collection.</p>
</section> </section>
</section> </section>

View file

@ -15,6 +15,7 @@
<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script> <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script> <script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script> <script src="_static/underscore.js"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="_static/doctools.js"></script> <script src="_static/doctools.js"></script>
<script src="_static/js/theme.js"></script> <script src="_static/js/theme.js"></script>
<link rel="index" title="Index" href="genindex.html" /> <link rel="index" title="Index" href="genindex.html" />
@ -106,20 +107,20 @@
<div itemprop="articleBody"> <div itemprop="articleBody">
<section id="ansible-collection-middleware-automation-keycloak"> <section id="ansible-collection-middleware-automation-keycloak">
<h1>Ansible Collection - middleware_automation.keycloak<a class="headerlink" href="#ansible-collection-middleware-automation-keycloak" title="Permalink to this headline"></a></h1> <h1>Ansible Collection - middleware_automation.keycloak<a class="headerlink" href="#ansible-collection-middleware-automation-keycloak" title="Permalink to this heading"></a></h1>
<p><a class="reference external" href="https://github.com/ansible-middleware/keycloak/actions/workflows/ci.yml"><img alt="Build Status" src="https://github.com/ansible-middleware/keycloak/workflows/CI/badge.svg?branch=main" /></a></p> <p><a class="reference external" href="https://github.com/ansible-middleware/keycloak/actions/workflows/ci.yml"><img alt="Build Status" src="https://github.com/ansible-middleware/keycloak/workflows/CI/badge.svg?branch=main" /></a></p>
<p>Collection to install and configure <a class="reference external" href="https://www.keycloak.org/">Keycloak</a> or <a class="reference external" href="https://access.redhat.com/products/red-hat-single-sign-on">Red Hat Single Sign-On</a>.</p> <p>Collection to install and configure <a class="reference external" href="https://www.keycloak.org/">Keycloak</a> or <a class="reference external" href="https://access.redhat.com/products/red-hat-single-sign-on">Red Hat Single Sign-On</a>.</p>
<!--start requires_ansible--> <!--start requires_ansible-->
<section id="ansible-version-compatibility"> <section id="ansible-version-compatibility">
<h2>Ansible version compatibility<a class="headerlink" href="#ansible-version-compatibility" title="Permalink to this headline"></a></h2> <h2>Ansible version compatibility<a class="headerlink" href="#ansible-version-compatibility" title="Permalink to this heading"></a></h2>
<p>This collection has been tested against following Ansible versions: <strong>&gt;=2.9.10</strong>.</p> <p>This collection has been tested against following Ansible versions: <strong>&gt;=2.9.10</strong>.</p>
<p>Plugins and modules within a collection may be tested with only specific Ansible versions. A collection may contain metadata that identifies these versions.</p> <p>Plugins and modules within a collection may be tested with only specific Ansible versions. A collection may contain metadata that identifies these versions.</p>
<!--end requires_ansible--> <!--end requires_ansible-->
</section> </section>
<section id="installation"> <section id="installation">
<h2>Installation<a class="headerlink" href="#installation" title="Permalink to this headline"></a></h2> <h2>Installation<a class="headerlink" href="#installation" title="Permalink to this heading"></a></h2>
<section id="installing-the-collection-from-ansible-galaxy"> <section id="installing-the-collection-from-ansible-galaxy">
<h3>Installing the Collection from Ansible Galaxy<a class="headerlink" href="#installing-the-collection-from-ansible-galaxy" title="Permalink to this headline"></a></h3> <h3>Installing the Collection from Ansible Galaxy<a class="headerlink" href="#installing-the-collection-from-ansible-galaxy" title="Permalink to this heading"></a></h3>
<p>Before using the collection, you need to install it with the Ansible Galaxy CLI:</p> <p>Before using the collection, you need to install it with the Ansible Galaxy CLI:</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>ansible-galaxy collection install middleware_automation.keycloak <div class="highlight-none notranslate"><div class="highlight"><pre><span></span>ansible-galaxy collection install middleware_automation.keycloak
</pre></div> </pre></div>
@ -140,7 +141,7 @@
</div> </div>
</section> </section>
<section id="included-roles"> <section id="included-roles">
<h3>Included roles<a class="headerlink" href="#included-roles" title="Permalink to this headline"></a></h3> <h3>Included roles<a class="headerlink" href="#included-roles" title="Permalink to this heading"></a></h3>
<ul class="simple"> <ul class="simple">
<li><p><a class="reference external" href="https://github.com/ansible-middleware/keycloak/blob/main/roles/keycloak/README.md"><code class="docutils literal notranslate"><span class="pre">keycloak</span></code></a>: role for installing the service.</p></li> <li><p><a class="reference external" href="https://github.com/ansible-middleware/keycloak/blob/main/roles/keycloak/README.md"><code class="docutils literal notranslate"><span class="pre">keycloak</span></code></a>: role for installing the service.</p></li>
<li><p><a class="reference external" href="https://github.com/ansible-middleware/keycloak/blob/main/roles/keycloak_realm/README.md"><code class="docutils literal notranslate"><span class="pre">keycloak_realm</span></code></a>: role for configuring a realm, user federation(s), clients and users, in an installed service.</p></li> <li><p><a class="reference external" href="https://github.com/ansible-middleware/keycloak/blob/main/roles/keycloak_realm/README.md"><code class="docutils literal notranslate"><span class="pre">keycloak_realm</span></code></a>: role for configuring a realm, user federation(s), clients and users, in an installed service.</p></li>
@ -149,9 +150,9 @@
</section> </section>
</section> </section>
<section id="usage"> <section id="usage">
<h2>Usage<a class="headerlink" href="#usage" title="Permalink to this headline"></a></h2> <h2>Usage<a class="headerlink" href="#usage" title="Permalink to this heading"></a></h2>
<section id="install-playbook"> <section id="install-playbook">
<h3>Install Playbook<a class="headerlink" href="#install-playbook" title="Permalink to this headline"></a></h3> <h3>Install Playbook<a class="headerlink" href="#install-playbook" title="Permalink to this heading"></a></h3>
<ul class="simple"> <ul class="simple">
<li><p><a class="reference external" href="https://github.com/ansible-middleware/keycloak/blob/main/playbooks/keycloak.yml"><code class="docutils literal notranslate"><span class="pre">playbooks/keycloak.yml</span></code></a> installs the upstream(Keycloak) based on the defined variables.</p></li> <li><p><a class="reference external" href="https://github.com/ansible-middleware/keycloak/blob/main/playbooks/keycloak.yml"><code class="docutils literal notranslate"><span class="pre">playbooks/keycloak.yml</span></code></a> installs the upstream(Keycloak) based on the defined variables.</p></li>
<li><p><a class="reference external" href="https://github.com/ansible-middleware/keycloak/blob/main/playbooks/rhsso.yml"><code class="docutils literal notranslate"><span class="pre">playbooks/rhsso.yml</span></code></a> installs Red Hat Single Sign-On(RHSSO) based on defined variables.</p></li> <li><p><a class="reference external" href="https://github.com/ansible-middleware/keycloak/blob/main/playbooks/rhsso.yml"><code class="docutils literal notranslate"><span class="pre">playbooks/rhsso.yml</span></code></a> installs Red Hat Single Sign-On(RHSSO) based on defined variables.</p></li>
@ -160,15 +161,15 @@
<p>For full service configuration details, refer to the <a class="reference external" href="https://github.com/ansible-middleware/keycloak/blob/main/roles/keycloak/README.md">keycloak role README</a>.</p> <p>For full service configuration details, refer to the <a class="reference external" href="https://github.com/ansible-middleware/keycloak/blob/main/roles/keycloak/README.md">keycloak role README</a>.</p>
</section> </section>
<section id="choosing-between-upstream-project-keycloak-and-red-hat-single-sign-on-rhsso"> <section id="choosing-between-upstream-project-keycloak-and-red-hat-single-sign-on-rhsso">
<h3>Choosing between upstream project (Keycloak) and Red Hat Single Sign-On (RHSSO)<a class="headerlink" href="#choosing-between-upstream-project-keycloak-and-red-hat-single-sign-on-rhsso" title="Permalink to this headline"></a></h3> <h3>Choosing between upstream project (Keycloak) and Red Hat Single Sign-On (RHSSO)<a class="headerlink" href="#choosing-between-upstream-project-keycloak-and-red-hat-single-sign-on-rhsso" title="Permalink to this heading"></a></h3>
<p>The general flag <code class="docutils literal notranslate"><span class="pre">keycloak_rhsso_enable</span></code> controls what to install between upstream (Keycloak, when <code class="docutils literal notranslate"><span class="pre">False</span></code>) or Red Hat Single Sign-On (when <code class="docutils literal notranslate"><span class="pre">True</span></code>). <p>The general flag <code class="docutils literal notranslate"><span class="pre">keycloak_rhsso_enable</span></code> controls what to install between upstream (Keycloak, when <code class="docutils literal notranslate"><span class="pre">False</span></code>) or Red Hat Single Sign-On (when <code class="docutils literal notranslate"><span class="pre">True</span></code>).
The default value for the flag if <code class="docutils literal notranslate"><span class="pre">True</span></code> when Red Hat Network credentials are defined, <code class="docutils literal notranslate"><span class="pre">False</span></code> otherwise.</p> The default value for the flag if <code class="docutils literal notranslate"><span class="pre">True</span></code> when Red Hat Network credentials are defined, <code class="docutils literal notranslate"><span class="pre">False</span></code> otherwise.</p>
<section id="install-upstream-keycloak-from-keycloak-releases"> <section id="install-upstream-keycloak-from-keycloak-releases">
<h4>Install upstream (Keycloak) from keycloak releases<a class="headerlink" href="#install-upstream-keycloak-from-keycloak-releases" title="Permalink to this headline"></a></h4> <h4>Install upstream (Keycloak) from keycloak releases<a class="headerlink" href="#install-upstream-keycloak-from-keycloak-releases" title="Permalink to this heading"></a></h4>
<p>This is the default approach when RHN credentials are not defined. Keycloak is downloaded from keycloak builds (hosted on github.com) locally, and distributed to target nodes.</p> <p>This is the default approach when RHN credentials are not defined. Keycloak is downloaded from keycloak builds (hosted on github.com) locally, and distributed to target nodes.</p>
</section> </section>
<section id="install-rhsso-from-the-red-hat-customer-support-portal"> <section id="install-rhsso-from-the-red-hat-customer-support-portal">
<h4>Install RHSSO from the Red Hat Customer Support Portal<a class="headerlink" href="#install-rhsso-from-the-red-hat-customer-support-portal" title="Permalink to this headline"></a></h4> <h4>Install RHSSO from the Red Hat Customer Support Portal<a class="headerlink" href="#install-rhsso-from-the-red-hat-customer-support-portal" title="Permalink to this heading"></a></h4>
<p>Define the credentials as follows, and the default behaviour is to download a fresh archive of RHSSO on the controller node, then distribute to target nodes.</p> <p>Define the credentials as follows, and the default behaviour is to download a fresh archive of RHSSO on the controller node, then distribute to target nodes.</p>
<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nt">rhn_username</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;&lt;customer_portal_username&gt;&#39;</span><span class="w"></span> <div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nt">rhn_username</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;&lt;customer_portal_username&gt;&#39;</span><span class="w"></span>
<span class="nt">rhn_password</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;&lt;customer_portal_password&gt;&#39;</span><span class="w"></span> <span class="nt">rhn_password</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;&lt;customer_portal_password&gt;&#39;</span><span class="w"></span>
@ -177,7 +178,7 @@ The default value for the flag if <code class="docutils literal notranslate"><sp
</div> </div>
</section> </section>
<section id="install-from-controller-node-local-source"> <section id="install-from-controller-node-local-source">
<h4>Install from controller node (local source)<a class="headerlink" href="#install-from-controller-node-local-source" title="Permalink to this headline"></a></h4> <h4>Install from controller node (local source)<a class="headerlink" href="#install-from-controller-node-local-source" title="Permalink to this heading"></a></h4>
<p>Making the keycloak zip archive (or the RHSSO zip archive), available to the playbook repository root directory, and setting <code class="docutils literal notranslate"><span class="pre">keycloak_offline_install</span></code> to <code class="docutils literal notranslate"><span class="pre">True</span></code>, allows to skip <p>Making the keycloak zip archive (or the RHSSO zip archive), available to the playbook repository root directory, and setting <code class="docutils literal notranslate"><span class="pre">keycloak_offline_install</span></code> to <code class="docutils literal notranslate"><span class="pre">True</span></code>, allows to skip
the download tasks. The local path for the archive matches the downloaded archive path, so it is also used as a cache when multiple hosts are provisioned in a cluster.</p> the download tasks. The local path for the archive matches the downloaded archive path, so it is also used as a cache when multiple hosts are provisioned in a cluster.</p>
<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nt">keycloak_offline_install</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">True</span><span class="w"></span> <div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nt">keycloak_offline_install</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">True</span><span class="w"></span>
@ -190,7 +191,7 @@ the download tasks. The local path for the archive matches the downloaded archiv
</ul> </ul>
</section> </section>
<section id="install-from-alternate-sources-like-corporate-nexus-artifactory-proxy-etc"> <section id="install-from-alternate-sources-like-corporate-nexus-artifactory-proxy-etc">
<h4>Install from alternate sources (like corporate Nexus, artifactory, proxy, etc)<a class="headerlink" href="#install-from-alternate-sources-like-corporate-nexus-artifactory-proxy-etc" title="Permalink to this headline"></a></h4> <h4>Install from alternate sources (like corporate Nexus, artifactory, proxy, etc)<a class="headerlink" href="#install-from-alternate-sources-like-corporate-nexus-artifactory-proxy-etc" title="Permalink to this heading"></a></h4>
<p>For RHSSO:</p> <p>For RHSSO:</p>
<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nt">keycloak_rhsso_enable</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">True</span><span class="w"></span> <div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nt">keycloak_rhsso_enable</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">True</span><span class="w"></span>
<span class="nt">keycloak_rhsso_download_url</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;https://&lt;internal-nexus.private.net&gt;/&lt;path&gt;/&lt;to&gt;/rh-sso-x.y.z-server-dist.zip&quot;</span><span class="w"></span> <span class="nt">keycloak_rhsso_download_url</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;https://&lt;internal-nexus.private.net&gt;/&lt;path&gt;/&lt;to&gt;/rh-sso-x.y.z-server-dist.zip&quot;</span><span class="w"></span>
@ -204,7 +205,7 @@ the download tasks. The local path for the archive matches the downloaded archiv
</section> </section>
</section> </section>
<section id="example-installation-command"> <section id="example-installation-command">
<h3>Example installation command<a class="headerlink" href="#example-installation-command" title="Permalink to this headline"></a></h3> <h3>Example installation command<a class="headerlink" href="#example-installation-command" title="Permalink to this heading"></a></h3>
<p>Execute the following command from the source root directory</p> <p>Execute the following command from the source root directory</p>
<div class="highlight-YAML+Jinja notranslate"><div class="highlight"><pre><span></span><span class="l l-Scalar l-Scalar-Plain">ansible-playbook -i &lt;ansible_hosts&gt; -e @rhn-creds.yml playbooks/keycloak.yml -e keycloak_admin_password=&lt;changeme&gt;</span><span class="w"></span> <div class="highlight-YAML+Jinja notranslate"><div class="highlight"><pre><span></span><span class="l l-Scalar l-Scalar-Plain">ansible-playbook -i &lt;ansible_hosts&gt; -e @rhn-creds.yml playbooks/keycloak.yml -e keycloak_admin_password=&lt;changeme&gt;</span><span class="w"></span>
</pre></div> </pre></div>
@ -221,13 +222,13 @@ the download tasks. The local path for the archive matches the downloaded archiv
</section> </section>
</section> </section>
<section id="configuration"> <section id="configuration">
<h2>Configuration<a class="headerlink" href="#configuration" title="Permalink to this headline"></a></h2> <h2>Configuration<a class="headerlink" href="#configuration" title="Permalink to this heading"></a></h2>
<section id="config-playbook"> <section id="config-playbook">
<h3>Config Playbook<a class="headerlink" href="#config-playbook" title="Permalink to this headline"></a></h3> <h3>Config Playbook<a class="headerlink" href="#config-playbook" title="Permalink to this heading"></a></h3>
<p><a class="reference external" href="https://github.com/ansible-middleware/keycloak/blob/main/playbooks/keycloak_realm.yml"><code class="docutils literal notranslate"><span class="pre">playbooks/keycloak_realm.yml</span></code></a> creates or updates provided realm, user federation(s), client(s), client role(s) and client user(s).</p> <p><a class="reference external" href="https://github.com/ansible-middleware/keycloak/blob/main/playbooks/keycloak_realm.yml"><code class="docutils literal notranslate"><span class="pre">playbooks/keycloak_realm.yml</span></code></a> creates or updates provided realm, user federation(s), client(s), client role(s) and client user(s).</p>
</section> </section>
<section id="example-configuration-command"> <section id="example-configuration-command">
<h3>Example configuration command<a class="headerlink" href="#example-configuration-command" title="Permalink to this headline"></a></h3> <h3>Example configuration command<a class="headerlink" href="#example-configuration-command" title="Permalink to this heading"></a></h3>
<p>Execute the following command from the source root directory:</p> <p>Execute the following command from the source root directory:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>ansible-playbook -i &lt;ansible_hosts&gt; playbooks/keycloak_realm.yml -e <span class="nv">keycloak_admin_password</span><span class="o">=</span>&lt;changeme&gt; -e <span class="nv">keycloak_realm</span><span class="o">=</span><span class="nb">test</span> <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>ansible-playbook -i &lt;ansible_hosts&gt; playbooks/keycloak_realm.yml -e <span class="nv">keycloak_admin_password</span><span class="o">=</span>&lt;changeme&gt; -e <span class="nv">keycloak_realm</span><span class="o">=</span><span class="nb">test</span>
</pre></div> </pre></div>
@ -246,11 +247,11 @@ the download tasks. The local path for the archive matches the downloaded archiv
</section> </section>
</section> </section>
<section id="support"> <section id="support">
<h2>Support<a class="headerlink" href="#support" title="Permalink to this headline"></a></h2> <h2>Support<a class="headerlink" href="#support" title="Permalink to this heading"></a></h2>
<p>Keycloak collection v1.0.0 is a Beta release and for <a class="reference external" href="https://access.redhat.com/support/offerings/techpreview">Technical Preview</a>. If you have any issues or questions related to collection, please dont hesitate to contact us on Ansible-middleware-core&#64;redhat.com or open an issue on https://github.com/ansible-middleware/keycloak/issues</p> <p>Keycloak collection v1.0.0 is a Beta release and for <a class="reference external" href="https://access.redhat.com/support/offerings/techpreview">Technical Preview</a>. If you have any issues or questions related to collection, please dont hesitate to contact us on Ansible-middleware-core&#64;redhat.com or open an issue on https://github.com/ansible-middleware/keycloak/issues</p>
</section> </section>
<section id="license"> <section id="license">
<h2>License<a class="headerlink" href="#license" title="Permalink to this headline"></a></h2> <h2>License<a class="headerlink" href="#license" title="Permalink to this heading"></a></h2>
<p>Apache License v2.0 or later</p> <p>Apache License v2.0 or later</p>
<p>See <span class="xref myst">LICENSE</span> to view the full text.</p> <p>See <span class="xref myst">LICENSE</span> to view the full text.</p>
</section> </section>

View file

@ -9,6 +9,11 @@ This changelog describes changes after version 0.2.6.
v1.0.7-devel v1.0.7-devel
============ ============
Bugfixes
--------
- Use become for tasks that will otherwise fail `#38 <https://github.com/ansible-middleware/keycloak/pull/38>`_
v1.0.6 v1.0.6
====== ======

View file

@ -0,0 +1,134 @@
/*
* _sphinx_javascript_frameworks_compat.js
* ~~~~~~~~~~
*
* Compatability shim for jQuery and underscores.js.
*
* WILL BE REMOVED IN Sphinx 6.0
* xref RemovedInSphinx60Warning
*
*/
/**
* select a different prefix for underscore
*/
$u = _.noConflict();
/**
* small helper function to urldecode strings
*
* See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL
*/
jQuery.urldecode = function(x) {
if (!x) {
return x
}
return decodeURIComponent(x.replace(/\+/g, ' '));
};
/**
* small helper function to urlencode strings
*/
jQuery.urlencode = encodeURIComponent;
/**
* This function returns the parsed url parameters of the
* current request. Multiple values per key are supported,
* it will always return arrays of strings for the value parts.
*/
jQuery.getQueryParameters = function(s) {
if (typeof s === 'undefined')
s = document.location.search;
var parts = s.substr(s.indexOf('?') + 1).split('&');
var result = {};
for (var i = 0; i < parts.length; i++) {
var tmp = parts[i].split('=', 2);
var key = jQuery.urldecode(tmp[0]);
var value = jQuery.urldecode(tmp[1]);
if (key in result)
result[key].push(value);
else
result[key] = [value];
}
return result;
};
/**
* highlight a given string on a jquery object by wrapping it in
* span elements with the given class name.
*/
jQuery.fn.highlightText = function(text, className) {
function highlight(node, addItems) {
if (node.nodeType === 3) {
var val = node.nodeValue;
var pos = val.toLowerCase().indexOf(text);
if (pos >= 0 &&
!jQuery(node.parentNode).hasClass(className) &&
!jQuery(node.parentNode).hasClass("nohighlight")) {
var span;
var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg");
if (isInSVG) {
span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
} else {
span = document.createElement("span");
span.className = className;
}
span.appendChild(document.createTextNode(val.substr(pos, text.length)));
node.parentNode.insertBefore(span, node.parentNode.insertBefore(
document.createTextNode(val.substr(pos + text.length)),
node.nextSibling));
node.nodeValue = val.substr(0, pos);
if (isInSVG) {
var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
var bbox = node.parentElement.getBBox();
rect.x.baseVal.value = bbox.x;
rect.y.baseVal.value = bbox.y;
rect.width.baseVal.value = bbox.width;
rect.height.baseVal.value = bbox.height;
rect.setAttribute('class', className);
addItems.push({
"parent": node.parentNode,
"target": rect});
}
}
}
else if (!jQuery(node).is("button, select, textarea")) {
jQuery.each(node.childNodes, function() {
highlight(this, addItems);
});
}
}
var addItems = [];
var result = this.each(function() {
highlight(this, addItems);
});
for (var i = 0; i < addItems.length; ++i) {
jQuery(addItems[i].parent).before(addItems[i].target);
}
return result;
};
/*
* backward compatibility for jQuery.browser
* This will be supported until firefox bug is fixed.
*/
if (!jQuery.browser) {
jQuery.uaMatch = function(ua) {
ua = ua.toLowerCase();
var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
/(webkit)[ \/]([\w.]+)/.exec(ua) ||
/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
/(msie) ([\w.]+)/.exec(ua) ||
ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
[];
return {
browser: match[ 1 ] || "",
version: match[ 2 ] || "0"
};
};
jQuery.browser = {};
jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true;
}

View file

@ -222,7 +222,7 @@ table.modindextable td {
/* -- general body styles --------------------------------------------------- */ /* -- general body styles --------------------------------------------------- */
div.body { div.body {
min-width: 450px; min-width: 360px;
max-width: 800px; max-width: 800px;
} }
@ -236,7 +236,6 @@ div.body p, div.body dd, div.body li, div.body blockquote {
a.headerlink { a.headerlink {
visibility: hidden; visibility: hidden;
} }
a.brackets:before, a.brackets:before,
span.brackets > a:before{ span.brackets > a:before{
content: "["; content: "[";
@ -247,6 +246,7 @@ span.brackets > a:after {
content: "]"; content: "]";
} }
h1:hover > a.headerlink, h1:hover > a.headerlink,
h2:hover > a.headerlink, h2:hover > a.headerlink,
h3:hover > a.headerlink, h3:hover > a.headerlink,
@ -334,13 +334,11 @@ aside.sidebar {
p.sidebar-title { p.sidebar-title {
font-weight: bold; font-weight: bold;
} }
div.admonition, div.topic, blockquote { div.admonition, div.topic, blockquote {
clear: left; clear: left;
} }
/* -- topics ---------------------------------------------------------------- */ /* -- topics ---------------------------------------------------------------- */
div.topic { div.topic {
border: 1px solid #ccc; border: 1px solid #ccc;
padding: 7px; padding: 7px;
@ -428,10 +426,6 @@ table.docutils td, table.docutils th {
border-bottom: 1px solid #aaa; border-bottom: 1px solid #aaa;
} }
table.footnote td, table.footnote th {
border: 0 !important;
}
th { th {
text-align: left; text-align: left;
padding-right: 5px; padding-right: 5px;
@ -615,6 +609,7 @@ ul.simple p {
margin-bottom: 0; margin-bottom: 0;
} }
/* Docutils 0.17 and older (footnotes & citations) */
dl.footnote > dt, dl.footnote > dt,
dl.citation > dt { dl.citation > dt {
float: left; float: left;
@ -632,6 +627,33 @@ dl.citation > dd:after {
clear: both; clear: both;
} }
/* Docutils 0.18+ (footnotes & citations) */
aside.footnote > span,
div.citation > span {
float: left;
}
aside.footnote > span:last-of-type,
div.citation > span:last-of-type {
padding-right: 0.5em;
}
aside.footnote > p {
margin-left: 2em;
}
div.citation > p {
margin-left: 4em;
}
aside.footnote > p:last-of-type,
div.citation > p:last-of-type {
margin-bottom: 0em;
}
aside.footnote > p:last-of-type:after,
div.citation > p:last-of-type:after {
content: "";
clear: both;
}
/* Footnotes & citations ends */
dl.field-list { dl.field-list {
display: grid; display: grid;
grid-template-columns: fit-content(30%) auto; grid-template-columns: fit-content(30%) auto;

View file

@ -2,357 +2,263 @@
* doctools.js * doctools.js
* ~~~~~~~~~~~ * ~~~~~~~~~~~
* *
* Sphinx JavaScript utilities for all documentation. * Base JavaScript utilities for all Sphinx HTML documentation.
* *
* :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details. * :license: BSD, see LICENSE for details.
* *
*/ */
"use strict";
/** const _ready = (callback) => {
* select a different prefix for underscore if (document.readyState !== "loading") {
*/ callback();
$u = _.noConflict(); } else {
document.addEventListener("DOMContentLoaded", callback);
/**
* make the code below compatible with browsers without
* an installed firebug like debugger
if (!window.console || !console.firebug) {
var names = ["log", "debug", "info", "warn", "error", "assert", "dir",
"dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace",
"profile", "profileEnd"];
window.console = {};
for (var i = 0; i < names.length; ++i)
window.console[names[i]] = function() {};
}
*/
/**
* small helper function to urldecode strings
*
* See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL
*/
jQuery.urldecode = function(x) {
if (!x) {
return x
} }
return decodeURIComponent(x.replace(/\+/g, ' '));
}; };
/** /**
* small helper function to urlencode strings * highlight a given string on a node by wrapping it in
*/
jQuery.urlencode = encodeURIComponent;
/**
* This function returns the parsed url parameters of the
* current request. Multiple values per key are supported,
* it will always return arrays of strings for the value parts.
*/
jQuery.getQueryParameters = function(s) {
if (typeof s === 'undefined')
s = document.location.search;
var parts = s.substr(s.indexOf('?') + 1).split('&');
var result = {};
for (var i = 0; i < parts.length; i++) {
var tmp = parts[i].split('=', 2);
var key = jQuery.urldecode(tmp[0]);
var value = jQuery.urldecode(tmp[1]);
if (key in result)
result[key].push(value);
else
result[key] = [value];
}
return result;
};
/**
* highlight a given string on a jquery object by wrapping it in
* span elements with the given class name. * span elements with the given class name.
*/ */
jQuery.fn.highlightText = function(text, className) { const _highlight = (node, addItems, text, className) => {
function highlight(node, addItems) { if (node.nodeType === Node.TEXT_NODE) {
if (node.nodeType === 3) { const val = node.nodeValue;
var val = node.nodeValue; const parent = node.parentNode;
var pos = val.toLowerCase().indexOf(text); const pos = val.toLowerCase().indexOf(text);
if (pos >= 0 && if (
!jQuery(node.parentNode).hasClass(className) && pos >= 0 &&
!jQuery(node.parentNode).hasClass("nohighlight")) { !parent.classList.contains(className) &&
var span; !parent.classList.contains("nohighlight")
var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); ) {
if (isInSVG) { let span;
span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
} else { const closestNode = parent.closest("body, svg, foreignObject");
span = document.createElement("span"); const isInSVG = closestNode && closestNode.matches("svg");
span.className = className; if (isInSVG) {
} span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
span.appendChild(document.createTextNode(val.substr(pos, text.length))); } else {
node.parentNode.insertBefore(span, node.parentNode.insertBefore( span = document.createElement("span");
span.classList.add(className);
}
span.appendChild(document.createTextNode(val.substr(pos, text.length)));
parent.insertBefore(
span,
parent.insertBefore(
document.createTextNode(val.substr(pos + text.length)), document.createTextNode(val.substr(pos + text.length)),
node.nextSibling)); node.nextSibling
node.nodeValue = val.substr(0, pos); )
if (isInSVG) { );
var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); node.nodeValue = val.substr(0, pos);
var bbox = node.parentElement.getBBox();
rect.x.baseVal.value = bbox.x; if (isInSVG) {
rect.y.baseVal.value = bbox.y; const rect = document.createElementNS(
rect.width.baseVal.value = bbox.width; "http://www.w3.org/2000/svg",
rect.height.baseVal.value = bbox.height; "rect"
rect.setAttribute('class', className); );
addItems.push({ const bbox = parent.getBBox();
"parent": node.parentNode, rect.x.baseVal.value = bbox.x;
"target": rect}); rect.y.baseVal.value = bbox.y;
} rect.width.baseVal.value = bbox.width;
rect.height.baseVal.value = bbox.height;
rect.setAttribute("class", className);
addItems.push({ parent: parent, target: rect });
} }
} }
else if (!jQuery(node).is("button, select, textarea")) { } else if (node.matches && !node.matches("button, select, textarea")) {
jQuery.each(node.childNodes, function() { node.childNodes.forEach((el) => _highlight(el, addItems, text, className));
highlight(this, addItems);
});
}
} }
var addItems = [];
var result = this.each(function() {
highlight(this, addItems);
});
for (var i = 0; i < addItems.length; ++i) {
jQuery(addItems[i].parent).before(addItems[i].target);
}
return result;
}; };
const _highlightText = (thisNode, text, className) => {
/* let addItems = [];
* backward compatibility for jQuery.browser _highlight(thisNode, addItems, text, className);
* This will be supported until firefox bug is fixed. addItems.forEach((obj) =>
*/ obj.parent.insertAdjacentElement("beforebegin", obj.target)
if (!jQuery.browser) { );
jQuery.uaMatch = function(ua) { };
ua = ua.toLowerCase();
var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
/(webkit)[ \/]([\w.]+)/.exec(ua) ||
/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
/(msie) ([\w.]+)/.exec(ua) ||
ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
[];
return {
browser: match[ 1 ] || "",
version: match[ 2 ] || "0"
};
};
jQuery.browser = {};
jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true;
}
/** /**
* Small JavaScript module for the documentation. * Small JavaScript module for the documentation.
*/ */
var Documentation = { const Documentation = {
init: () => {
init : function() { Documentation.highlightSearchWords();
this.fixFirefoxAnchorBug(); Documentation.initDomainIndexTable();
this.highlightSearchWords(); Documentation.initOnKeyListeners();
this.initIndexTable();
this.initOnKeyListeners();
}, },
/** /**
* i18n support * i18n support
*/ */
TRANSLATIONS : {}, TRANSLATIONS: {},
PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, PLURAL_EXPR: (n) => (n === 1 ? 0 : 1),
LOCALE : 'unknown', LOCALE: "unknown",
// gettext and ngettext don't access this so that the functions // gettext and ngettext don't access this so that the functions
// can safely bound to a different name (_ = Documentation.gettext) // can safely bound to a different name (_ = Documentation.gettext)
gettext : function(string) { gettext: (string) => {
var translated = Documentation.TRANSLATIONS[string]; const translated = Documentation.TRANSLATIONS[string];
if (typeof translated === 'undefined') switch (typeof translated) {
return string; case "undefined":
return (typeof translated === 'string') ? translated : translated[0]; return string; // no translation
case "string":
return translated; // translation exists
default:
return translated[0]; // (singular, plural) translation tuple exists
}
}, },
ngettext : function(singular, plural, n) { ngettext: (singular, plural, n) => {
var translated = Documentation.TRANSLATIONS[singular]; const translated = Documentation.TRANSLATIONS[singular];
if (typeof translated === 'undefined') if (typeof translated !== "undefined")
return (n == 1) ? singular : plural; return translated[Documentation.PLURAL_EXPR(n)];
return translated[Documentation.PLURALEXPR(n)]; return n === 1 ? singular : plural;
}, },
addTranslations : function(catalog) { addTranslations: (catalog) => {
for (var key in catalog.messages) Object.assign(Documentation.TRANSLATIONS, catalog.messages);
this.TRANSLATIONS[key] = catalog.messages[key]; Documentation.PLURAL_EXPR = new Function(
this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); "n",
this.LOCALE = catalog.locale; `return (${catalog.plural_expr})`
}, );
Documentation.LOCALE = catalog.locale;
/**
* add context elements like header anchor links
*/
addContextElements : function() {
$('div[id] > :header:first').each(function() {
$('<a class="headerlink">\u00B6</a>').
attr('href', '#' + this.id).
attr('title', _('Permalink to this headline')).
appendTo(this);
});
$('dt[id]').each(function() {
$('<a class="headerlink">\u00B6</a>').
attr('href', '#' + this.id).
attr('title', _('Permalink to this definition')).
appendTo(this);
});
},
/**
* workaround a firefox stupidity
* see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075
*/
fixFirefoxAnchorBug : function() {
if (document.location.hash && $.browser.mozilla)
window.setTimeout(function() {
document.location.href += '';
}, 10);
}, },
/** /**
* highlight the search words provided in the url in the text * highlight the search words provided in the url in the text
*/ */
highlightSearchWords : function() { highlightSearchWords: () => {
var params = $.getQueryParameters(); const highlight =
var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; new URLSearchParams(window.location.search).get("highlight") || "";
if (terms.length) { const terms = highlight.toLowerCase().split(/\s+/).filter(x => x);
var body = $('div.body'); if (terms.length === 0) return; // nothing to do
if (!body.length) {
body = $('body');
}
window.setTimeout(function() {
$.each(terms, function() {
body.highlightText(this.toLowerCase(), 'highlighted');
});
}, 10);
$('<p class="highlight-link"><a href="javascript:Documentation.' +
'hideSearchWords()">' + _('Hide Search Matches') + '</a></p>')
.appendTo($('#searchbox'));
}
},
/** // There should never be more than one element matching "div.body"
* init the domain index toggle buttons const divBody = document.querySelectorAll("div.body");
*/ const body = divBody.length ? divBody[0] : document.querySelector("body");
initIndexTable : function() { window.setTimeout(() => {
var togglers = $('img.toggler').click(function() { terms.forEach((term) => _highlightText(body, term, "highlighted"));
var src = $(this).attr('src'); }, 10);
var idnum = $(this).attr('id').substr(7);
$('tr.cg-' + idnum).toggle(); const searchBox = document.getElementById("searchbox");
if (src.substr(-9) === 'minus.png') if (searchBox === null) return;
$(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); searchBox.appendChild(
else document
$(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); .createRange()
}).css('display', ''); .createContextualFragment(
if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { '<p class="highlight-link">' +
togglers.click(); '<a href="javascript:Documentation.hideSearchWords()">' +
} Documentation.gettext("Hide Search Matches") +
"</a></p>"
)
);
}, },
/** /**
* helper function to hide the search marks again * helper function to hide the search marks again
*/ */
hideSearchWords : function() { hideSearchWords: () => {
$('#searchbox .highlight-link').fadeOut(300); document
$('span.highlighted').removeClass('highlighted'); .querySelectorAll("#searchbox .highlight-link")
var url = new URL(window.location); .forEach((el) => el.remove());
url.searchParams.delete('highlight'); document
window.history.replaceState({}, '', url); .querySelectorAll("span.highlighted")
.forEach((el) => el.classList.remove("highlighted"));
const url = new URL(window.location);
url.searchParams.delete("highlight");
window.history.replaceState({}, "", url);
}, },
/** /**
* helper function to focus on search bar * helper function to focus on search bar
*/ */
focusSearchBar : function() { focusSearchBar: () => {
$('input[name=q]').first().focus(); document.querySelectorAll("input[name=q]")[0]?.focus();
}, },
/** /**
* make the url absolute * Initialise the domain index toggle buttons
*/ */
makeURL : function(relativeURL) { initDomainIndexTable: () => {
return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; const toggler = (el) => {
const idNumber = el.id.substr(7);
const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`);
if (el.src.substr(-9) === "minus.png") {
el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`;
toggledRows.forEach((el) => (el.style.display = "none"));
} else {
el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`;
toggledRows.forEach((el) => (el.style.display = ""));
}
};
const togglerElements = document.querySelectorAll("img.toggler");
togglerElements.forEach((el) =>
el.addEventListener("click", (event) => toggler(event.currentTarget))
);
togglerElements.forEach((el) => (el.style.display = ""));
if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler);
}, },
/** initOnKeyListeners: () => {
* get the current relative url
*/
getCurrentURL : function() {
var path = document.location.pathname;
var parts = path.split(/\//);
$.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
if (this === '..')
parts.pop();
});
var url = parts.join('/');
return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
},
initOnKeyListeners: function() {
// only install a listener if it is really needed // only install a listener if it is really needed
if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && if (
!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS &&
return; !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS
)
return;
$(document).keydown(function(event) { const blacklistedElements = new Set([
var activeElementType = document.activeElement.tagName; "TEXTAREA",
// don't navigate when in search box, textarea, dropdown or button "INPUT",
if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT' "SELECT",
&& activeElementType !== 'BUTTON') { "BUTTON",
if (event.altKey || event.ctrlKey || event.metaKey) ]);
return; document.addEventListener("keydown", (event) => {
if (blacklistedElements.has(document.activeElement.tagName)) return; // bail for input elements
if (event.altKey || event.ctrlKey || event.metaKey) return; // bail with special keys
if (!event.shiftKey) { if (!event.shiftKey) {
switch (event.key) {
case 'ArrowLeft':
if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS)
break;
var prevHref = $('link[rel="prev"]').prop('href');
if (prevHref) {
window.location.href = prevHref;
return false;
}
break;
case 'ArrowRight':
if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS)
break;
var nextHref = $('link[rel="next"]').prop('href');
if (nextHref) {
window.location.href = nextHref;
return false;
}
break;
case 'Escape':
if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS)
break;
Documentation.hideSearchWords();
return false;
}
}
// some keyboard layouts may need Shift to get /
switch (event.key) { switch (event.key) {
case '/': case "ArrowLeft":
if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
break;
Documentation.focusSearchBar(); const prevLink = document.querySelector('link[rel="prev"]');
return false; if (prevLink && prevLink.href) {
window.location.href = prevLink.href;
event.preventDefault();
}
break;
case "ArrowRight":
if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
const nextLink = document.querySelector('link[rel="next"]');
if (nextLink && nextLink.href) {
window.location.href = nextLink.href;
event.preventDefault();
}
break;
case "Escape":
if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break;
Documentation.hideSearchWords();
event.preventDefault();
} }
} }
// some keyboard layouts may need Shift to get /
switch (event.key) {
case "/":
if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break;
Documentation.focusSearchBar();
event.preventDefault();
}
}); });
} },
}; };
// quick alias for translations // quick alias for translations
_ = Documentation.gettext; const _ = Documentation.gettext;
$(document).ready(function() { _ready(Documentation.init);
Documentation.init();
});

View file

@ -1,7 +1,7 @@
var DOCUMENTATION_OPTIONS = { var DOCUMENTATION_OPTIONS = {
URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'),
VERSION: '', VERSION: '',
LANGUAGE: 'None', LANGUAGE: 'en',
COLLAPSE_INDEX: false, COLLAPSE_INDEX: false,
BUILDER: 'html', BUILDER: 'html',
FILE_SUFFIX: '.html', FILE_SUFFIX: '.html',
@ -10,5 +10,5 @@ var DOCUMENTATION_OPTIONS = {
SOURCELINK_SUFFIX: '.txt', SOURCELINK_SUFFIX: '.txt',
NAVIGATION_WITH_KEYS: false, NAVIGATION_WITH_KEYS: false,
SHOW_SEARCH_SUMMARY: true, SHOW_SEARCH_SUMMARY: true,
ENABLE_SEARCH_SHORTCUTS: true, ENABLE_SEARCH_SHORTCUTS: false,
}; };

View file

@ -1,15 +1,15 @@
/*! /*!
* jQuery JavaScript Library v3.5.1 * jQuery JavaScript Library v3.6.0
* https://jquery.com/ * https://jquery.com/
* *
* Includes Sizzle.js * Includes Sizzle.js
* https://sizzlejs.com/ * https://sizzlejs.com/
* *
* Copyright JS Foundation and other contributors * Copyright OpenJS Foundation and other contributors
* Released under the MIT license * Released under the MIT license
* https://jquery.org/license * https://jquery.org/license
* *
* Date: 2020-05-04T22:49Z * Date: 2021-03-02T17:08Z
*/ */
( function( global, factory ) { ( function( global, factory ) {
@ -76,12 +76,16 @@ var support = {};
var isFunction = function isFunction( obj ) { var isFunction = function isFunction( obj ) {
// Support: Chrome <=57, Firefox <=52 // Support: Chrome <=57, Firefox <=52
// In some browsers, typeof returns "function" for HTML <object> elements // In some browsers, typeof returns "function" for HTML <object> elements
// (i.e., `typeof document.createElement( "object" ) === "function"`). // (i.e., `typeof document.createElement( "object" ) === "function"`).
// We don't want to classify *any* DOM node as a function. // We don't want to classify *any* DOM node as a function.
return typeof obj === "function" && typeof obj.nodeType !== "number"; // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5
}; // Plus for old WebKit, typeof returns "function" for HTML collections
// (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756)
return typeof obj === "function" && typeof obj.nodeType !== "number" &&
typeof obj.item !== "function";
};
var isWindow = function isWindow( obj ) { var isWindow = function isWindow( obj ) {
@ -147,7 +151,7 @@ function toType( obj ) {
var var
version = "3.5.1", version = "3.6.0",
// Define a local copy of jQuery // Define a local copy of jQuery
jQuery = function( selector, context ) { jQuery = function( selector, context ) {
@ -401,7 +405,7 @@ jQuery.extend( {
if ( isArrayLike( Object( arr ) ) ) { if ( isArrayLike( Object( arr ) ) ) {
jQuery.merge( ret, jQuery.merge( ret,
typeof arr === "string" ? typeof arr === "string" ?
[ arr ] : arr [ arr ] : arr
); );
} else { } else {
push.call( ret, arr ); push.call( ret, arr );
@ -496,9 +500,9 @@ if ( typeof Symbol === "function" ) {
// Populate the class2type map // Populate the class2type map
jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
function( _i, name ) { function( _i, name ) {
class2type[ "[object " + name + "]" ] = name.toLowerCase(); class2type[ "[object " + name + "]" ] = name.toLowerCase();
} ); } );
function isArrayLike( obj ) { function isArrayLike( obj ) {
@ -518,14 +522,14 @@ function isArrayLike( obj ) {
} }
var Sizzle = var Sizzle =
/*! /*!
* Sizzle CSS Selector Engine v2.3.5 * Sizzle CSS Selector Engine v2.3.6
* https://sizzlejs.com/ * https://sizzlejs.com/
* *
* Copyright JS Foundation and other contributors * Copyright JS Foundation and other contributors
* Released under the MIT license * Released under the MIT license
* https://js.foundation/ * https://js.foundation/
* *
* Date: 2020-03-14 * Date: 2021-02-16
*/ */
( function( window ) { ( function( window ) {
var i, var i,
@ -1108,8 +1112,8 @@ support = Sizzle.support = {};
* @returns {Boolean} True iff elem is a non-HTML XML node * @returns {Boolean} True iff elem is a non-HTML XML node
*/ */
isXML = Sizzle.isXML = function( elem ) { isXML = Sizzle.isXML = function( elem ) {
var namespace = elem.namespaceURI, var namespace = elem && elem.namespaceURI,
docElem = ( elem.ownerDocument || elem ).documentElement; docElem = elem && ( elem.ownerDocument || elem ).documentElement;
// Support: IE <=8 // Support: IE <=8
// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
@ -3024,9 +3028,9 @@ var rneedsContext = jQuery.expr.match.needsContext;
function nodeName( elem, name ) { function nodeName( elem, name ) {
return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
}; }
var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
@ -3997,8 +4001,8 @@ jQuery.extend( {
resolveContexts = Array( i ), resolveContexts = Array( i ),
resolveValues = slice.call( arguments ), resolveValues = slice.call( arguments ),
// the master Deferred // the primary Deferred
master = jQuery.Deferred(), primary = jQuery.Deferred(),
// subordinate callback factory // subordinate callback factory
updateFunc = function( i ) { updateFunc = function( i ) {
@ -4006,30 +4010,30 @@ jQuery.extend( {
resolveContexts[ i ] = this; resolveContexts[ i ] = this;
resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
if ( !( --remaining ) ) { if ( !( --remaining ) ) {
master.resolveWith( resolveContexts, resolveValues ); primary.resolveWith( resolveContexts, resolveValues );
} }
}; };
}; };
// Single- and empty arguments are adopted like Promise.resolve // Single- and empty arguments are adopted like Promise.resolve
if ( remaining <= 1 ) { if ( remaining <= 1 ) {
adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,
!remaining ); !remaining );
// Use .then() to unwrap secondary thenables (cf. gh-3000) // Use .then() to unwrap secondary thenables (cf. gh-3000)
if ( master.state() === "pending" || if ( primary.state() === "pending" ||
isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
return master.then(); return primary.then();
} }
} }
// Multiple arguments are aggregated like Promise.all array elements // Multiple arguments are aggregated like Promise.all array elements
while ( i-- ) { while ( i-- ) {
adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );
} }
return master.promise(); return primary.promise();
} }
} ); } );
@ -4180,8 +4184,8 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
for ( ; i < len; i++ ) { for ( ; i < len; i++ ) {
fn( fn(
elems[ i ], key, raw ? elems[ i ], key, raw ?
value : value :
value.call( elems[ i ], i, fn( elems[ i ], key ) ) value.call( elems[ i ], i, fn( elems[ i ], key ) )
); );
} }
} }
@ -5089,10 +5093,7 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
} }
var var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
rkeyEvent = /^key/,
rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
function returnTrue() { function returnTrue() {
return true; return true;
@ -5387,8 +5388,8 @@ jQuery.event = {
event = jQuery.event.fix( nativeEvent ), event = jQuery.event.fix( nativeEvent ),
handlers = ( handlers = (
dataPriv.get( this, "events" ) || Object.create( null ) dataPriv.get( this, "events" ) || Object.create( null )
)[ event.type ] || [], )[ event.type ] || [],
special = jQuery.event.special[ event.type ] || {}; special = jQuery.event.special[ event.type ] || {};
// Use the fix-ed jQuery.Event rather than the (read-only) native event // Use the fix-ed jQuery.Event rather than the (read-only) native event
@ -5512,12 +5513,12 @@ jQuery.event = {
get: isFunction( hook ) ? get: isFunction( hook ) ?
function() { function() {
if ( this.originalEvent ) { if ( this.originalEvent ) {
return hook( this.originalEvent ); return hook( this.originalEvent );
} }
} : } :
function() { function() {
if ( this.originalEvent ) { if ( this.originalEvent ) {
return this.originalEvent[ name ]; return this.originalEvent[ name ];
} }
}, },
@ -5656,7 +5657,13 @@ function leverageNative( el, type, expectSync ) {
// Cancel the outer synthetic event // Cancel the outer synthetic event
event.stopImmediatePropagation(); event.stopImmediatePropagation();
event.preventDefault(); event.preventDefault();
return result.value;
// Support: Chrome 86+
// In Chrome, if an element having a focusout handler is blurred by
// clicking outside of it, it invokes the handler synchronously. If
// that handler calls `.remove()` on the element, the data is cleared,
// leaving `result` undefined. We need to guard against this.
return result && result.value;
} }
// If this is an inner synthetic event for an event with a bubbling surrogate // If this is an inner synthetic event for an event with a bubbling surrogate
@ -5821,34 +5828,7 @@ jQuery.each( {
targetTouches: true, targetTouches: true,
toElement: true, toElement: true,
touches: true, touches: true,
which: true
which: function( event ) {
var button = event.button;
// Add which for key events
if ( event.which == null && rkeyEvent.test( event.type ) ) {
return event.charCode != null ? event.charCode : event.keyCode;
}
// Add which for click: 1 === left; 2 === middle; 3 === right
if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
if ( button & 1 ) {
return 1;
}
if ( button & 2 ) {
return 3;
}
if ( button & 4 ) {
return 2;
}
return 0;
}
return event.which;
}
}, jQuery.event.addProp ); }, jQuery.event.addProp );
jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
@ -5874,6 +5854,12 @@ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateTyp
return true; return true;
}, },
// Suppress native focus or blur as it's already being fired
// in leverageNative.
_default: function() {
return true;
},
delegateType: delegateType delegateType: delegateType
}; };
} ); } );
@ -6541,6 +6527,10 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
// set in CSS while `offset*` properties report correct values. // set in CSS while `offset*` properties report correct values.
// Behavior in IE 9 is more subtle than in newer versions & it passes // Behavior in IE 9 is more subtle than in newer versions & it passes
// some versions of this test; make sure not to make it pass there! // some versions of this test; make sure not to make it pass there!
//
// Support: Firefox 70+
// Only Firefox includes border widths
// in computed dimensions. (gh-4529)
reliableTrDimensions: function() { reliableTrDimensions: function() {
var table, tr, trChild, trStyle; var table, tr, trChild, trStyle;
if ( reliableTrDimensionsVal == null ) { if ( reliableTrDimensionsVal == null ) {
@ -6548,17 +6538,32 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
tr = document.createElement( "tr" ); tr = document.createElement( "tr" );
trChild = document.createElement( "div" ); trChild = document.createElement( "div" );
table.style.cssText = "position:absolute;left:-11111px"; table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
tr.style.cssText = "border:1px solid";
// Support: Chrome 86+
// Height set through cssText does not get applied.
// Computed height then comes back as 0.
tr.style.height = "1px"; tr.style.height = "1px";
trChild.style.height = "9px"; trChild.style.height = "9px";
// Support: Android 8 Chrome 86+
// In our bodyBackground.html iframe,
// display for all div elements is set to "inline",
// which causes a problem only in Android 8 Chrome 86.
// Ensuring the div is display: block
// gets around this issue.
trChild.style.display = "block";
documentElement documentElement
.appendChild( table ) .appendChild( table )
.appendChild( tr ) .appendChild( tr )
.appendChild( trChild ); .appendChild( trChild );
trStyle = window.getComputedStyle( tr ); trStyle = window.getComputedStyle( tr );
reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +
parseInt( trStyle.borderTopWidth, 10 ) +
parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;
documentElement.removeChild( table ); documentElement.removeChild( table );
} }
@ -7022,10 +7027,10 @@ jQuery.each( [ "height", "width" ], function( _i, dimension ) {
// Running getBoundingClientRect on a disconnected node // Running getBoundingClientRect on a disconnected node
// in IE throws an error. // in IE throws an error.
( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
swap( elem, cssShow, function() { swap( elem, cssShow, function() {
return getWidthOrHeight( elem, dimension, extra ); return getWidthOrHeight( elem, dimension, extra );
} ) : } ) :
getWidthOrHeight( elem, dimension, extra ); getWidthOrHeight( elem, dimension, extra );
} }
}, },
@ -7084,7 +7089,7 @@ jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
swap( elem, { marginLeft: 0 }, function() { swap( elem, { marginLeft: 0 }, function() {
return elem.getBoundingClientRect().left; return elem.getBoundingClientRect().left;
} ) } )
) + "px"; ) + "px";
} }
} }
); );
@ -7223,7 +7228,7 @@ Tween.propHooks = {
if ( jQuery.fx.step[ tween.prop ] ) { if ( jQuery.fx.step[ tween.prop ] ) {
jQuery.fx.step[ tween.prop ]( tween ); jQuery.fx.step[ tween.prop ]( tween );
} else if ( tween.elem.nodeType === 1 && ( } else if ( tween.elem.nodeType === 1 && (
jQuery.cssHooks[ tween.prop ] || jQuery.cssHooks[ tween.prop ] ||
tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
} else { } else {
@ -7468,7 +7473,7 @@ function defaultPrefilter( elem, props, opts ) {
anim.done( function() { anim.done( function() {
/* eslint-enable no-loop-func */ /* eslint-enable no-loop-func */
// The final step of a "hide" animation is actually hiding the element // The final step of a "hide" animation is actually hiding the element
if ( !hidden ) { if ( !hidden ) {
@ -7588,7 +7593,7 @@ function Animation( elem, properties, options ) {
tweens: [], tweens: [],
createTween: function( prop, end ) { createTween: function( prop, end ) {
var tween = jQuery.Tween( elem, animation.opts, prop, end, var tween = jQuery.Tween( elem, animation.opts, prop, end,
animation.opts.specialEasing[ prop ] || animation.opts.easing ); animation.opts.specialEasing[ prop ] || animation.opts.easing );
animation.tweens.push( tween ); animation.tweens.push( tween );
return tween; return tween;
}, },
@ -7761,7 +7766,8 @@ jQuery.fn.extend( {
anim.stop( true ); anim.stop( true );
} }
}; };
doAnimation.finish = doAnimation;
doAnimation.finish = doAnimation;
return empty || optall.queue === false ? return empty || optall.queue === false ?
this.each( doAnimation ) : this.each( doAnimation ) :
@ -8401,8 +8407,8 @@ jQuery.fn.extend( {
if ( this.setAttribute ) { if ( this.setAttribute ) {
this.setAttribute( "class", this.setAttribute( "class",
className || value === false ? className || value === false ?
"" : "" :
dataPriv.get( this, "__className__" ) || "" dataPriv.get( this, "__className__" ) || ""
); );
} }
} }
@ -8417,7 +8423,7 @@ jQuery.fn.extend( {
while ( ( elem = this[ i++ ] ) ) { while ( ( elem = this[ i++ ] ) ) {
if ( elem.nodeType === 1 && if ( elem.nodeType === 1 &&
( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
return true; return true;
} }
} }
@ -8707,9 +8713,7 @@ jQuery.extend( jQuery.event, {
special.bindType || type; special.bindType || type;
// jQuery handler // jQuery handler
handle = ( handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] &&
dataPriv.get( cur, "events" ) || Object.create( null )
)[ event.type ] &&
dataPriv.get( cur, "handle" ); dataPriv.get( cur, "handle" );
if ( handle ) { if ( handle ) {
handle.apply( cur, data ); handle.apply( cur, data );
@ -8856,7 +8860,7 @@ var rquery = ( /\?/ );
// Cross-browser xml parsing // Cross-browser xml parsing
jQuery.parseXML = function( data ) { jQuery.parseXML = function( data ) {
var xml; var xml, parserErrorElem;
if ( !data || typeof data !== "string" ) { if ( !data || typeof data !== "string" ) {
return null; return null;
} }
@ -8865,12 +8869,17 @@ jQuery.parseXML = function( data ) {
// IE throws on parseFromString with invalid input. // IE throws on parseFromString with invalid input.
try { try {
xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
} catch ( e ) { } catch ( e ) {}
xml = undefined;
}
if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
jQuery.error( "Invalid XML: " + data ); if ( !xml || parserErrorElem ) {
jQuery.error( "Invalid XML: " + (
parserErrorElem ?
jQuery.map( parserErrorElem.childNodes, function( el ) {
return el.textContent;
} ).join( "\n" ) :
data
) );
} }
return xml; return xml;
}; };
@ -8971,16 +8980,14 @@ jQuery.fn.extend( {
// Can add propHook for "elements" to filter or add form elements // Can add propHook for "elements" to filter or add form elements
var elements = jQuery.prop( this, "elements" ); var elements = jQuery.prop( this, "elements" );
return elements ? jQuery.makeArray( elements ) : this; return elements ? jQuery.makeArray( elements ) : this;
} ) } ).filter( function() {
.filter( function() {
var type = this.type; var type = this.type;
// Use .is( ":disabled" ) so that fieldset[disabled] works // Use .is( ":disabled" ) so that fieldset[disabled] works
return this.name && !jQuery( this ).is( ":disabled" ) && return this.name && !jQuery( this ).is( ":disabled" ) &&
rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
( this.checked || !rcheckableType.test( type ) ); ( this.checked || !rcheckableType.test( type ) );
} ) } ).map( function( _i, elem ) {
.map( function( _i, elem ) {
var val = jQuery( this ).val(); var val = jQuery( this ).val();
if ( val == null ) { if ( val == null ) {
@ -9033,7 +9040,8 @@ var
// Anchor tag for parsing the document origin // Anchor tag for parsing the document origin
originAnchor = document.createElement( "a" ); originAnchor = document.createElement( "a" );
originAnchor.href = location.href;
originAnchor.href = location.href;
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
function addToPrefiltersOrTransports( structure ) { function addToPrefiltersOrTransports( structure ) {
@ -9414,8 +9422,8 @@ jQuery.extend( {
// Context for global events is callbackContext if it is a DOM node or jQuery collection // Context for global events is callbackContext if it is a DOM node or jQuery collection
globalEventContext = s.context && globalEventContext = s.context &&
( callbackContext.nodeType || callbackContext.jquery ) ? ( callbackContext.nodeType || callbackContext.jquery ) ?
jQuery( callbackContext ) : jQuery( callbackContext ) :
jQuery.event, jQuery.event,
// Deferreds // Deferreds
deferred = jQuery.Deferred(), deferred = jQuery.Deferred(),
@ -9727,8 +9735,10 @@ jQuery.extend( {
response = ajaxHandleResponses( s, jqXHR, responses ); response = ajaxHandleResponses( s, jqXHR, responses );
} }
// Use a noop converter for missing script // Use a noop converter for missing script but not if jsonp
if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { if ( !isSuccess &&
jQuery.inArray( "script", s.dataTypes ) > -1 &&
jQuery.inArray( "json", s.dataTypes ) < 0 ) {
s.converters[ "text script" ] = function() {}; s.converters[ "text script" ] = function() {};
} }
@ -10466,12 +10476,6 @@ jQuery.offset = {
options.using.call( elem, props ); options.using.call( elem, props );
} else { } else {
if ( typeof props.top === "number" ) {
props.top += "px";
}
if ( typeof props.left === "number" ) {
props.left += "px";
}
curElem.css( props ); curElem.css( props );
} }
} }
@ -10640,8 +10644,11 @@ jQuery.each( [ "top", "left" ], function( _i, prop ) {
// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, jQuery.each( {
function( defaultExtra, funcName ) { padding: "inner" + name,
content: type,
"": "outer" + name
}, function( defaultExtra, funcName ) {
// Margin is only for outerHeight, outerWidth // Margin is only for outerHeight, outerWidth
jQuery.fn[ funcName ] = function( margin, value ) { jQuery.fn[ funcName ] = function( margin, value ) {
@ -10726,7 +10733,8 @@ jQuery.fn.extend( {
} }
} ); } );
jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + jQuery.each(
( "blur focus focusin focusout resize scroll click dblclick " +
"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
"change select submit keydown keypress keyup contextmenu" ).split( " " ), "change select submit keydown keypress keyup contextmenu" ).split( " " ),
function( _i, name ) { function( _i, name ) {
@ -10737,7 +10745,8 @@ jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
this.on( name, null, data, fn ) : this.on( name, null, data, fn ) :
this.trigger( name ); this.trigger( name );
}; };
} ); }
);

File diff suppressed because one or more lines are too long

View file

@ -10,7 +10,7 @@
* *
*/ */
var stopwords = ["a","and","are","as","at","be","but","by","for","if","in","into","is","it","near","no","not","of","on","or","such","that","the","their","then","there","these","they","this","to","was","will","with"]; var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"];
/* Non-minified version is copied as a separate JS file, is available */ /* Non-minified version is copied as a separate JS file, is available */
@ -197,101 +197,3 @@ var Stemmer = function() {
} }
} }
var splitChars = (function() {
var result = {};
var singles = [96, 180, 187, 191, 215, 247, 749, 885, 903, 907, 909, 930, 1014, 1648,
1748, 1809, 2416, 2473, 2481, 2526, 2601, 2609, 2612, 2615, 2653, 2702,
2706, 2729, 2737, 2740, 2857, 2865, 2868, 2910, 2928, 2948, 2961, 2971,
2973, 3085, 3089, 3113, 3124, 3213, 3217, 3241, 3252, 3295, 3341, 3345,
3369, 3506, 3516, 3633, 3715, 3721, 3736, 3744, 3748, 3750, 3756, 3761,
3781, 3912, 4239, 4347, 4681, 4695, 4697, 4745, 4785, 4799, 4801, 4823,
4881, 5760, 5901, 5997, 6313, 7405, 8024, 8026, 8028, 8030, 8117, 8125,
8133, 8181, 8468, 8485, 8487, 8489, 8494, 8527, 11311, 11359, 11687, 11695,
11703, 11711, 11719, 11727, 11735, 12448, 12539, 43010, 43014, 43019, 43587,
43696, 43713, 64286, 64297, 64311, 64317, 64319, 64322, 64325, 65141];
var i, j, start, end;
for (i = 0; i < singles.length; i++) {
result[singles[i]] = true;
}
var ranges = [[0, 47], [58, 64], [91, 94], [123, 169], [171, 177], [182, 184], [706, 709],
[722, 735], [741, 747], [751, 879], [888, 889], [894, 901], [1154, 1161],
[1318, 1328], [1367, 1368], [1370, 1376], [1416, 1487], [1515, 1519], [1523, 1568],
[1611, 1631], [1642, 1645], [1750, 1764], [1767, 1773], [1789, 1790], [1792, 1807],
[1840, 1868], [1958, 1968], [1970, 1983], [2027, 2035], [2038, 2041], [2043, 2047],
[2070, 2073], [2075, 2083], [2085, 2087], [2089, 2307], [2362, 2364], [2366, 2383],
[2385, 2391], [2402, 2405], [2419, 2424], [2432, 2436], [2445, 2446], [2449, 2450],
[2483, 2485], [2490, 2492], [2494, 2509], [2511, 2523], [2530, 2533], [2546, 2547],
[2554, 2564], [2571, 2574], [2577, 2578], [2618, 2648], [2655, 2661], [2672, 2673],
[2677, 2692], [2746, 2748], [2750, 2767], [2769, 2783], [2786, 2789], [2800, 2820],
[2829, 2830], [2833, 2834], [2874, 2876], [2878, 2907], [2914, 2917], [2930, 2946],
[2955, 2957], [2966, 2968], [2976, 2978], [2981, 2983], [2987, 2989], [3002, 3023],
[3025, 3045], [3059, 3076], [3130, 3132], [3134, 3159], [3162, 3167], [3170, 3173],
[3184, 3191], [3199, 3204], [3258, 3260], [3262, 3293], [3298, 3301], [3312, 3332],
[3386, 3388], [3390, 3423], [3426, 3429], [3446, 3449], [3456, 3460], [3479, 3481],
[3518, 3519], [3527, 3584], [3636, 3647], [3655, 3663], [3674, 3712], [3717, 3718],
[3723, 3724], [3726, 3731], [3752, 3753], [3764, 3772], [3774, 3775], [3783, 3791],
[3802, 3803], [3806, 3839], [3841, 3871], [3892, 3903], [3949, 3975], [3980, 4095],
[4139, 4158], [4170, 4175], [4182, 4185], [4190, 4192], [4194, 4196], [4199, 4205],
[4209, 4212], [4226, 4237], [4250, 4255], [4294, 4303], [4349, 4351], [4686, 4687],
[4702, 4703], [4750, 4751], [4790, 4791], [4806, 4807], [4886, 4887], [4955, 4968],
[4989, 4991], [5008, 5023], [5109, 5120], [5741, 5742], [5787, 5791], [5867, 5869],
[5873, 5887], [5906, 5919], [5938, 5951], [5970, 5983], [6001, 6015], [6068, 6102],
[6104, 6107], [6109, 6111], [6122, 6127], [6138, 6159], [6170, 6175], [6264, 6271],
[6315, 6319], [6390, 6399], [6429, 6469], [6510, 6511], [6517, 6527], [6572, 6592],
[6600, 6607], [6619, 6655], [6679, 6687], [6741, 6783], [6794, 6799], [6810, 6822],
[6824, 6916], [6964, 6980], [6988, 6991], [7002, 7042], [7073, 7085], [7098, 7167],
[7204, 7231], [7242, 7244], [7294, 7400], [7410, 7423], [7616, 7679], [7958, 7959],
[7966, 7967], [8006, 8007], [8014, 8015], [8062, 8063], [8127, 8129], [8141, 8143],
[8148, 8149], [8156, 8159], [8173, 8177], [8189, 8303], [8306, 8307], [8314, 8318],
[8330, 8335], [8341, 8449], [8451, 8454], [8456, 8457], [8470, 8472], [8478, 8483],
[8506, 8507], [8512, 8516], [8522, 8525], [8586, 9311], [9372, 9449], [9472, 10101],
[10132, 11263], [11493, 11498], [11503, 11516], [11518, 11519], [11558, 11567],
[11622, 11630], [11632, 11647], [11671, 11679], [11743, 11822], [11824, 12292],
[12296, 12320], [12330, 12336], [12342, 12343], [12349, 12352], [12439, 12444],
[12544, 12548], [12590, 12592], [12687, 12689], [12694, 12703], [12728, 12783],
[12800, 12831], [12842, 12880], [12896, 12927], [12938, 12976], [12992, 13311],
[19894, 19967], [40908, 40959], [42125, 42191], [42238, 42239], [42509, 42511],
[42540, 42559], [42592, 42593], [42607, 42622], [42648, 42655], [42736, 42774],
[42784, 42785], [42889, 42890], [42893, 43002], [43043, 43055], [43062, 43071],
[43124, 43137], [43188, 43215], [43226, 43249], [43256, 43258], [43260, 43263],
[43302, 43311], [43335, 43359], [43389, 43395], [43443, 43470], [43482, 43519],
[43561, 43583], [43596, 43599], [43610, 43615], [43639, 43641], [43643, 43647],
[43698, 43700], [43703, 43704], [43710, 43711], [43715, 43738], [43742, 43967],
[44003, 44015], [44026, 44031], [55204, 55215], [55239, 55242], [55292, 55295],
[57344, 63743], [64046, 64047], [64110, 64111], [64218, 64255], [64263, 64274],
[64280, 64284], [64434, 64466], [64830, 64847], [64912, 64913], [64968, 65007],
[65020, 65135], [65277, 65295], [65306, 65312], [65339, 65344], [65371, 65381],
[65471, 65473], [65480, 65481], [65488, 65489], [65496, 65497]];
for (i = 0; i < ranges.length; i++) {
start = ranges[i][0];
end = ranges[i][1];
for (j = start; j <= end; j++) {
result[j] = true;
}
}
return result;
})();
function splitQuery(query) {
var result = [];
var start = -1;
for (var i = 0; i < query.length; i++) {
if (splitChars[query.charCodeAt(i)]) {
if (start !== -1) {
result.push(query.slice(start, i));
start = -1;
}
} else if (start === -1) {
start = i;
}
}
if (start !== -1) {
result.push(query.slice(start));
}
return result;
}

View file

@ -8,18 +8,20 @@
* :license: BSD, see LICENSE for details. * :license: BSD, see LICENSE for details.
* *
*/ */
"use strict";
if (!Scorer) { /**
/** * Simple result scoring code.
* Simple result scoring code. */
*/ if (typeof Scorer === "undefined") {
var Scorer = { var Scorer = {
// Implement the following function to further tweak the score for each result // Implement the following function to further tweak the score for each result
// The function takes a result array [filename, title, anchor, descr, score] // The function takes a result array [docname, title, anchor, descr, score, filename]
// and returns the new score. // and returns the new score.
/* /*
score: function(result) { score: result => {
return result[4]; const [docname, title, anchor, descr, score, filename] = result
return score
}, },
*/ */
@ -28,9 +30,11 @@ if (!Scorer) {
// or matches in the last dotted part of the object name // or matches in the last dotted part of the object name
objPartialMatch: 6, objPartialMatch: 6,
// Additive scores depending on the priority of the object // Additive scores depending on the priority of the object
objPrio: {0: 15, // used to be importantResults objPrio: {
1: 5, // used to be objectResults 0: 15, // used to be importantResults
2: -5}, // used to be unimportantResults 1: 5, // used to be objectResults
2: -5, // used to be unimportantResults
},
// Used when the priority is not in the mapping. // Used when the priority is not in the mapping.
objPrioDefault: 0, objPrioDefault: 0,
@ -39,452 +43,455 @@ if (!Scorer) {
partialTitle: 7, partialTitle: 7,
// query found in terms // query found in terms
term: 5, term: 5,
partialTerm: 2 partialTerm: 2,
}; };
} }
if (!splitQuery) { const _removeChildren = (element) => {
function splitQuery(query) { while (element && element.lastChild) element.removeChild(element.lastChild);
return query.split(/\s+/); };
/**
* See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping
*/
const _escapeRegExp = (string) =>
string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
const _displayItem = (item, highlightTerms, searchTerms) => {
const docBuilder = DOCUMENTATION_OPTIONS.BUILDER;
const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT;
const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX;
const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX;
const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY;
const [docName, title, anchor, descr] = item;
let listItem = document.createElement("li");
let requestUrl;
let linkUrl;
if (docBuilder === "dirhtml") {
// dirhtml builder
let dirname = docName + "/";
if (dirname.match(/\/index\/$/))
dirname = dirname.substring(0, dirname.length - 6);
else if (dirname === "index/") dirname = "";
requestUrl = docUrlRoot + dirname;
linkUrl = requestUrl;
} else {
// normal html builders
requestUrl = docUrlRoot + docName + docFileSuffix;
linkUrl = docName + docLinkSuffix;
} }
const params = new URLSearchParams();
params.set("highlight", [...highlightTerms].join(" "));
let linkEl = listItem.appendChild(document.createElement("a"));
linkEl.href = linkUrl + "?" + params.toString() + anchor;
linkEl.innerHTML = title;
if (descr)
listItem.appendChild(document.createElement("span")).innerText =
" (" + descr + ")";
else if (showSearchSummary)
fetch(requestUrl)
.then((responseData) => responseData.text())
.then((data) => {
if (data)
listItem.appendChild(
Search.makeSearchSummary(data, searchTerms, highlightTerms)
);
});
Search.output.appendChild(listItem);
};
const _finishSearch = (resultCount) => {
Search.stopPulse();
Search.title.innerText = _("Search Results");
if (!resultCount)
Search.status.innerText = Documentation.gettext(
"Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories."
);
else
Search.status.innerText = _(
`Search finished, found ${resultCount} page(s) matching the search query.`
);
};
const _displayNextItem = (
results,
resultCount,
highlightTerms,
searchTerms
) => {
// results left, load the summary and display it
// this is intended to be dynamic (don't sub resultsCount)
if (results.length) {
_displayItem(results.pop(), highlightTerms, searchTerms);
setTimeout(
() => _displayNextItem(results, resultCount, highlightTerms, searchTerms),
5
);
}
// search finished, update title and status message
else _finishSearch(resultCount);
};
/**
* Default splitQuery function. Can be overridden in ``sphinx.search`` with a
* custom function per language.
*
* The regular expression works by splitting the string on consecutive characters
* that are not Unicode letters, numbers, underscores, or emoji characters.
* This is the same as ``\W+`` in Python, preserving the surrogate pair area.
*/
if (typeof splitQuery === "undefined") {
var splitQuery = (query) => query
.split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu)
.filter(term => term) // remove remaining empty strings
} }
/** /**
* Search Module * Search Module
*/ */
var Search = { const Search = {
_index: null,
_queued_query: null,
_pulse_status: -1,
_index : null, htmlToText: (htmlString) => {
_queued_query : null, const htmlElement = document
_pulse_status : -1, .createRange()
.createContextualFragment(htmlString);
htmlToText : function(htmlString) { _removeChildren(htmlElement.querySelectorAll(".headerlink"));
var virtualDocument = document.implementation.createHTMLDocument('virtual'); const docContent = htmlElement.querySelector('[role="main"]');
var htmlElement = $(htmlString, virtualDocument); if (docContent !== undefined) return docContent.textContent;
htmlElement.find('.headerlink').remove(); console.warn(
docContent = htmlElement.find('[role=main]')[0]; "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template."
if(docContent === undefined) { );
console.warn("Content block not found. Sphinx search tries to obtain it " + return "";
"via '[role=main]'. Could you check your theme or template.");
return "";
}
return docContent.textContent || docContent.innerText;
}, },
init : function() { init: () => {
var params = $.getQueryParameters(); const query = new URLSearchParams(window.location.search).get("q");
if (params.q) { document
var query = params.q[0]; .querySelectorAll('input[name="q"]')
$('input[name="q"]')[0].value = query; .forEach((el) => (el.value = query));
this.performSearch(query); if (query) Search.performSearch(query);
}
}, },
loadIndex : function(url) { loadIndex: (url) =>
$.ajax({type: "GET", url: url, data: null, (document.body.appendChild(document.createElement("script")).src = url),
dataType: "script", cache: true,
complete: function(jqxhr, textstatus) {
if (textstatus != "success") {
document.getElementById("searchindexloader").src = url;
}
}});
},
setIndex : function(index) { setIndex: (index) => {
var q; Search._index = index;
this._index = index; if (Search._queued_query !== null) {
if ((q = this._queued_query) !== null) { const query = Search._queued_query;
this._queued_query = null; Search._queued_query = null;
Search.query(q); Search.query(query);
} }
}, },
hasIndex : function() { hasIndex: () => Search._index !== null,
return this._index !== null;
},
deferQuery : function(query) { deferQuery: (query) => (Search._queued_query = query),
this._queued_query = query;
},
stopPulse : function() { stopPulse: () => (Search._pulse_status = -1),
this._pulse_status = 0;
},
startPulse : function() { startPulse: () => {
if (this._pulse_status >= 0) if (Search._pulse_status >= 0) return;
return;
function pulse() { const pulse = () => {
var i;
Search._pulse_status = (Search._pulse_status + 1) % 4; Search._pulse_status = (Search._pulse_status + 1) % 4;
var dotString = ''; Search.dots.innerText = ".".repeat(Search._pulse_status);
for (i = 0; i < Search._pulse_status; i++) if (Search._pulse_status >= 0) window.setTimeout(pulse, 500);
dotString += '.'; };
Search.dots.text(dotString);
if (Search._pulse_status > -1)
window.setTimeout(pulse, 500);
}
pulse(); pulse();
}, },
/** /**
* perform a search for something (or wait until index is loaded) * perform a search for something (or wait until index is loaded)
*/ */
performSearch : function(query) { performSearch: (query) => {
// create the required interface elements // create the required interface elements
this.out = $('#search-results'); const searchText = document.createElement("h2");
this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out); searchText.textContent = _("Searching");
this.dots = $('<span></span>').appendTo(this.title); const searchSummary = document.createElement("p");
this.status = $('<p class="search-summary">&nbsp;</p>').appendTo(this.out); searchSummary.classList.add("search-summary");
this.output = $('<ul class="search"/>').appendTo(this.out); searchSummary.innerText = "";
const searchList = document.createElement("ul");
searchList.classList.add("search");
$('#search-progress').text(_('Preparing search...')); const out = document.getElementById("search-results");
this.startPulse(); Search.title = out.appendChild(searchText);
Search.dots = Search.title.appendChild(document.createElement("span"));
Search.status = out.appendChild(searchSummary);
Search.output = out.appendChild(searchList);
const searchProgress = document.getElementById("search-progress");
// Some themes don't use the search progress node
if (searchProgress) {
searchProgress.innerText = _("Preparing search...");
}
Search.startPulse();
// index already loaded, the browser was quick! // index already loaded, the browser was quick!
if (this.hasIndex()) if (Search.hasIndex()) Search.query(query);
this.query(query); else Search.deferQuery(query);
else
this.deferQuery(query);
}, },
/** /**
* execute search (requires search index to be loaded) * execute search (requires search index to be loaded)
*/ */
query : function(query) { query: (query) => {
var i; // stem the search terms and add them to the correct list
const stemmer = new Stemmer();
const searchTerms = new Set();
const excludedTerms = new Set();
const highlightTerms = new Set();
const objectTerms = new Set(splitQuery(query.toLowerCase().trim()));
splitQuery(query.trim()).forEach((queryTerm) => {
const queryTermLower = queryTerm.toLowerCase();
// stem the searchterms and add them to the correct list // maybe skip this "word"
var stemmer = new Stemmer(); // stopwords array is from language_data.js
var searchterms = []; if (
var excluded = []; stopwords.indexOf(queryTermLower) !== -1 ||
var hlterms = []; queryTerm.match(/^\d+$/)
var tmp = splitQuery(query); )
var objectterms = []; return;
for (i = 0; i < tmp.length; i++) {
if (tmp[i] !== "") {
objectterms.push(tmp[i].toLowerCase());
}
if ($u.indexOf(stopwords, tmp[i].toLowerCase()) != -1 || tmp[i] === "") {
// skip this "word"
continue;
}
// stem the word // stem the word
var word = stemmer.stemWord(tmp[i].toLowerCase()); let word = stemmer.stemWord(queryTermLower);
var toAppend;
// select the correct list // select the correct list
if (word[0] == '-') { if (word[0] === "-") excludedTerms.add(word.substr(1));
toAppend = excluded;
word = word.substr(1);
}
else { else {
toAppend = searchterms; searchTerms.add(word);
hlterms.push(tmp[i].toLowerCase()); highlightTerms.add(queryTermLower);
} }
// only add if not already in the list });
if (!$u.contains(toAppend, word))
toAppend.push(word);
}
var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" "));
// console.debug('SEARCH: searching for:'); // console.debug("SEARCH: searching for:");
// console.info('required: ', searchterms); // console.info("required: ", [...searchTerms]);
// console.info('excluded: ', excluded); // console.info("excluded: ", [...excludedTerms]);
// prepare search // array of [docname, title, anchor, descr, score, filename]
var terms = this._index.terms; let results = [];
var titleterms = this._index.titleterms; _removeChildren(document.getElementById("search-progress"));
// array of [filename, title, anchor, descr, score]
var results = [];
$('#search-progress').empty();
// lookup as object // lookup as object
for (i = 0; i < objectterms.length; i++) { objectTerms.forEach((term) =>
var others = [].concat(objectterms.slice(0, i), results.push(...Search.performObjectSearch(term, objectTerms))
objectterms.slice(i+1, objectterms.length)); );
results = results.concat(this.performObjectSearch(objectterms[i], others));
}
// lookup as search terms in fulltext // lookup as search terms in fulltext
results = results.concat(this.performTermsSearch(searchterms, excluded, terms, titleterms)); results.push(...Search.performTermsSearch(searchTerms, excludedTerms));
// let the scorer override scores with a custom scoring function // let the scorer override scores with a custom scoring function
if (Scorer.score) { if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item)));
for (i = 0; i < results.length; i++)
results[i][4] = Scorer.score(results[i]);
}
// now sort the results by score (in opposite order of appearance, since the // now sort the results by score (in opposite order of appearance, since the
// display function below uses pop() to retrieve items) and then // display function below uses pop() to retrieve items) and then
// alphabetically // alphabetically
results.sort(function(a, b) { results.sort((a, b) => {
var left = a[4]; const leftScore = a[4];
var right = b[4]; const rightScore = b[4];
if (left > right) { if (leftScore === rightScore) {
return 1;
} else if (left < right) {
return -1;
} else {
// same score: sort alphabetically // same score: sort alphabetically
left = a[1].toLowerCase(); const leftTitle = a[1].toLowerCase();
right = b[1].toLowerCase(); const rightTitle = b[1].toLowerCase();
return (left > right) ? -1 : ((left < right) ? 1 : 0); if (leftTitle === rightTitle) return 0;
return leftTitle > rightTitle ? -1 : 1; // inverted is intentional
} }
return leftScore > rightScore ? 1 : -1;
}); });
// remove duplicate search results
// note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept
let seen = new Set();
results = results.reverse().reduce((acc, result) => {
let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(',');
if (!seen.has(resultStr)) {
acc.push(result);
seen.add(resultStr);
}
return acc;
}, []);
results = results.reverse();
// for debugging // for debugging
//Search.lastresults = results.slice(); // a copy //Search.lastresults = results.slice(); // a copy
//console.info('search results:', Search.lastresults); // console.info("search results:", Search.lastresults);
// print the results // print the results
var resultCount = results.length; _displayNextItem(results, results.length, highlightTerms, searchTerms);
function displayNextItem() {
// results left, load the summary and display it
if (results.length) {
var item = results.pop();
var listItem = $('<li></li>');
var requestUrl = "";
var linkUrl = "";
if (DOCUMENTATION_OPTIONS.BUILDER === 'dirhtml') {
// dirhtml builder
var dirname = item[0] + '/';
if (dirname.match(/\/index\/$/)) {
dirname = dirname.substring(0, dirname.length-6);
} else if (dirname == 'index/') {
dirname = '';
}
requestUrl = DOCUMENTATION_OPTIONS.URL_ROOT + dirname;
linkUrl = requestUrl;
} else {
// normal html builders
requestUrl = DOCUMENTATION_OPTIONS.URL_ROOT + item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX;
linkUrl = item[0] + DOCUMENTATION_OPTIONS.LINK_SUFFIX;
}
listItem.append($('<a/>').attr('href',
linkUrl +
highlightstring + item[2]).html(item[1]));
if (item[3]) {
listItem.append($('<span> (' + item[3] + ')</span>'));
Search.output.append(listItem);
setTimeout(function() {
displayNextItem();
}, 5);
} else if (DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY) {
$.ajax({url: requestUrl,
dataType: "text",
complete: function(jqxhr, textstatus) {
var data = jqxhr.responseText;
if (data !== '' && data !== undefined) {
var summary = Search.makeSearchSummary(data, searchterms, hlterms);
if (summary) {
listItem.append(summary);
}
}
Search.output.append(listItem);
setTimeout(function() {
displayNextItem();
}, 5);
}});
} else {
// just display title
Search.output.append(listItem);
setTimeout(function() {
displayNextItem();
}, 5);
}
}
// search finished, update title and status message
else {
Search.stopPulse();
Search.title.text(_('Search Results'));
if (!resultCount)
Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.'));
else
Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount));
Search.status.fadeIn(500);
}
}
displayNextItem();
}, },
/** /**
* search for object names * search for object names
*/ */
performObjectSearch : function(object, otherterms) { performObjectSearch: (object, objectTerms) => {
var filenames = this._index.filenames; const filenames = Search._index.filenames;
var docnames = this._index.docnames; const docNames = Search._index.docnames;
var objects = this._index.objects; const objects = Search._index.objects;
var objnames = this._index.objnames; const objNames = Search._index.objnames;
var titles = this._index.titles; const titles = Search._index.titles;
var i; const results = [];
var results = [];
for (var prefix in objects) { const objectSearchCallback = (prefix, match) => {
for (var iMatch = 0; iMatch != objects[prefix].length; ++iMatch) { const name = match[4]
var match = objects[prefix][iMatch]; const fullname = (prefix ? prefix + "." : "") + name;
var name = match[4]; const fullnameLower = fullname.toLowerCase();
var fullname = (prefix ? prefix + '.' : '') + name; if (fullnameLower.indexOf(object) < 0) return;
var fullnameLower = fullname.toLowerCase()
if (fullnameLower.indexOf(object) > -1) {
var score = 0;
var parts = fullnameLower.split('.');
// check for different match types: exact matches of full name or
// "last name" (i.e. last dotted part)
if (fullnameLower == object || parts[parts.length - 1] == object) {
score += Scorer.objNameMatch;
// matches in last name
} else if (parts[parts.length - 1].indexOf(object) > -1) {
score += Scorer.objPartialMatch;
}
var objname = objnames[match[1]][2];
var title = titles[match[0]];
// If more than one term searched for, we require other words to be
// found in the name/title/description
if (otherterms.length > 0) {
var haystack = (prefix + ' ' + name + ' ' +
objname + ' ' + title).toLowerCase();
var allfound = true;
for (i = 0; i < otherterms.length; i++) {
if (haystack.indexOf(otherterms[i]) == -1) {
allfound = false;
break;
}
}
if (!allfound) {
continue;
}
}
var descr = objname + _(', in ') + title;
var anchor = match[3]; let score = 0;
if (anchor === '') const parts = fullnameLower.split(".");
anchor = fullname;
else if (anchor == '-') // check for different match types: exact matches of full name or
anchor = objnames[match[1]][1] + '-' + fullname; // "last name" (i.e. last dotted part)
// add custom score for some objects according to scorer if (fullnameLower === object || parts.slice(-1)[0] === object)
if (Scorer.objPrio.hasOwnProperty(match[2])) { score += Scorer.objNameMatch;
score += Scorer.objPrio[match[2]]; else if (parts.slice(-1)[0].indexOf(object) > -1)
} else { score += Scorer.objPartialMatch; // matches in last name
score += Scorer.objPrioDefault;
} const objName = objNames[match[1]][2];
results.push([docnames[match[0]], fullname, '#'+anchor, descr, score, filenames[match[0]]]); const title = titles[match[0]];
}
// If more than one term searched for, we require other words to be
// found in the name/title/description
const otherTerms = new Set(objectTerms);
otherTerms.delete(object);
if (otherTerms.size > 0) {
const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase();
if (
[...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0)
)
return;
} }
}
let anchor = match[3];
if (anchor === "") anchor = fullname;
else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname;
const descr = objName + _(", in ") + title;
// add custom score for some objects according to scorer
if (Scorer.objPrio.hasOwnProperty(match[2]))
score += Scorer.objPrio[match[2]];
else score += Scorer.objPrioDefault;
results.push([
docNames[match[0]],
fullname,
"#" + anchor,
descr,
score,
filenames[match[0]],
]);
};
Object.keys(objects).forEach((prefix) =>
objects[prefix].forEach((array) =>
objectSearchCallback(prefix, array)
)
);
return results; return results;
}, },
/**
* See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
*/
escapeRegExp : function(string) {
return string.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
},
/** /**
* search for full-text terms in the index * search for full-text terms in the index
*/ */
performTermsSearch : function(searchterms, excluded, terms, titleterms) { performTermsSearch: (searchTerms, excludedTerms) => {
var docnames = this._index.docnames; // prepare search
var filenames = this._index.filenames; const terms = Search._index.terms;
var titles = this._index.titles; const titleTerms = Search._index.titleterms;
const docNames = Search._index.docnames;
const filenames = Search._index.filenames;
const titles = Search._index.titles;
var i, j, file; const scoreMap = new Map();
var fileMap = {}; const fileMap = new Map();
var scoreMap = {};
var results = [];
// perform the search on the required terms // perform the search on the required terms
for (i = 0; i < searchterms.length; i++) { searchTerms.forEach((word) => {
var word = searchterms[i]; const files = [];
var files = []; const arr = [
var _o = [ { files: terms[word], score: Scorer.term },
{files: terms[word], score: Scorer.term}, { files: titleTerms[word], score: Scorer.title },
{files: titleterms[word], score: Scorer.title}
]; ];
// add support for partial matches // add support for partial matches
if (word.length > 2) { if (word.length > 2) {
var word_regex = this.escapeRegExp(word); const escapedWord = _escapeRegExp(word);
for (var w in terms) { Object.keys(terms).forEach((term) => {
if (w.match(word_regex) && !terms[word]) { if (term.match(escapedWord) && !terms[word])
_o.push({files: terms[w], score: Scorer.partialTerm}) arr.push({ files: terms[term], score: Scorer.partialTerm });
} });
} Object.keys(titleTerms).forEach((term) => {
for (var w in titleterms) { if (term.match(escapedWord) && !titleTerms[word])
if (w.match(word_regex) && !titleterms[word]) { arr.push({ files: titleTerms[word], score: Scorer.partialTitle });
_o.push({files: titleterms[w], score: Scorer.partialTitle}) });
}
}
} }
// no match but word was a required one // no match but word was a required one
if ($u.every(_o, function(o){return o.files === undefined;})) { if (arr.every((record) => record.files === undefined)) return;
break;
}
// found search word in contents // found search word in contents
$u.each(_o, function(o) { arr.forEach((record) => {
var _files = o.files; if (record.files === undefined) return;
if (_files === undefined)
return
if (_files.length === undefined) let recordFiles = record.files;
_files = [_files]; if (recordFiles.length === undefined) recordFiles = [recordFiles];
files = files.concat(_files); files.push(...recordFiles);
// set score for the word in each file to Scorer.term // set score for the word in each file
for (j = 0; j < _files.length; j++) { recordFiles.forEach((file) => {
file = _files[j]; if (!scoreMap.has(file)) scoreMap.set(file, {});
if (!(file in scoreMap)) scoreMap.get(file)[word] = record.score;
scoreMap[file] = {}; });
scoreMap[file][word] = o.score;
}
}); });
// create the mapping // create the mapping
for (j = 0; j < files.length; j++) { files.forEach((file) => {
file = files[j]; if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1)
if (file in fileMap && fileMap[file].indexOf(word) === -1) fileMap.get(file).push(word);
fileMap[file].push(word); else fileMap.set(file, [word]);
else });
fileMap[file] = [word]; });
}
}
// now check if the files don't contain excluded terms // now check if the files don't contain excluded terms
for (file in fileMap) { const results = [];
var valid = true; for (const [file, wordList] of fileMap) {
// check if all requirements are matched // check if all requirements are matched
var filteredTermCount = // as search terms with length < 3 are discarded: ignore
searchterms.filter(function(term){return term.length > 2}).length // as search terms with length < 3 are discarded
const filteredTermCount = [...searchTerms].filter(
(term) => term.length > 2
).length;
if ( if (
fileMap[file].length != searchterms.length && wordList.length !== searchTerms.size &&
fileMap[file].length != filteredTermCount wordList.length !== filteredTermCount
) continue; )
continue;
// ensure that none of the excluded terms is in the search result // ensure that none of the excluded terms is in the search result
for (i = 0; i < excluded.length; i++) { if (
if (terms[excluded[i]] == file || [...excludedTerms].some(
titleterms[excluded[i]] == file || (term) =>
$u.contains(terms[excluded[i]] || [], file) || terms[term] === file ||
$u.contains(titleterms[excluded[i]] || [], file)) { titleTerms[term] === file ||
valid = false; (terms[term] || []).includes(file) ||
break; (titleTerms[term] || []).includes(file)
} )
} )
break;
// if we have still a valid result we can add it to the result list // select one (max) score for the file.
if (valid) { const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w]));
// select one (max) score for the file. // add result to the result list
// for better ranking, we should calculate ranking by using words statistics like basic tf-idf... results.push([
var score = $u.max($u.map(fileMap[file], function(w){return scoreMap[file][w]})); docNames[file],
results.push([docnames[file], titles[file], '', null, score, filenames[file]]); titles[file],
} "",
null,
score,
filenames[file],
]);
} }
return results; return results;
}, },
@ -492,34 +499,33 @@ var Search = {
/** /**
* helper function to return a node containing the * helper function to return a node containing the
* search summary for a given text. keywords is a list * search summary for a given text. keywords is a list
* of stemmed words, hlwords is the list of normal, unstemmed * of stemmed words, highlightWords is the list of normal, unstemmed
* words. the first one is used to find the occurrence, the * words. the first one is used to find the occurrence, the
* latter for highlighting it. * latter for highlighting it.
*/ */
makeSearchSummary : function(htmlText, keywords, hlwords) { makeSearchSummary: (htmlText, keywords, highlightWords) => {
var text = Search.htmlToText(htmlText); const text = Search.htmlToText(htmlText).toLowerCase();
if (text == "") { if (text === "") return null;
return null;
} const actualStartPosition = [...keywords]
var textLower = text.toLowerCase(); .map((k) => text.indexOf(k.toLowerCase()))
var start = 0; .filter((i) => i > -1)
$.each(keywords, function() { .slice(-1)[0];
var i = textLower.indexOf(this.toLowerCase()); const startWithContext = Math.max(actualStartPosition - 120, 0);
if (i > -1)
start = i; const top = startWithContext === 0 ? "" : "...";
}); const tail = startWithContext + 240 < text.length ? "..." : "";
start = Math.max(start - 120, 0);
var excerpt = ((start > 0) ? '...' : '') + let summary = document.createElement("div");
$.trim(text.substr(start, 240)) + summary.classList.add("context");
((start + 240 - text.length) ? '...' : ''); summary.innerText = top + text.substr(startWithContext, 240).trim() + tail;
var rv = $('<p class="context"></p>').text(excerpt);
$.each(hlwords, function() { highlightWords.forEach((highlightWord) =>
rv = rv.highlightText(this, 'highlighted'); _highlightText(summary, highlightWord, "highlighted")
}); );
return rv;
} return summary;
},
}; };
$(document).ready(function() { _ready(Search.init);
Search.init();
});

View file

@ -15,6 +15,7 @@
<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script> <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script> <script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script> <script src="_static/underscore.js"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="_static/doctools.js"></script> <script src="_static/doctools.js"></script>
<script src="_static/js/theme.js"></script> <script src="_static/js/theme.js"></script>
<link rel="index" title="Index" href="genindex.html" /> <link rel="index" title="Index" href="genindex.html" />
@ -79,7 +80,7 @@
<div itemprop="articleBody"> <div itemprop="articleBody">
<section id="contributor-s-guidelines"> <section id="contributor-s-guidelines">
<h1>Contributors Guidelines<a class="headerlink" href="#contributor-s-guidelines" title="Permalink to this headline"></a></h1> <h1>Contributors Guidelines<a class="headerlink" href="#contributor-s-guidelines" title="Permalink to this heading"></a></h1>
<ul class="simple"> <ul class="simple">
<li><p>All YAML files named with <code class="docutils literal notranslate"><span class="pre">.yml</span></code> extension</p></li> <li><p>All YAML files named with <code class="docutils literal notranslate"><span class="pre">.yml</span></code> extension</p></li>
<li><p>Use spaces around jinja variables. <code class="docutils literal notranslate"><span class="pre">{{</span> <span class="pre">var</span> <span class="pre">}}</span></code> over <code class="docutils literal notranslate"><span class="pre">{{var}}</span></code></p></li> <li><p>Use spaces around jinja variables. <code class="docutils literal notranslate"><span class="pre">{{</span> <span class="pre">var</span> <span class="pre">}}</span></code> over <code class="docutils literal notranslate"><span class="pre">{{var}}</span></code></p></li>

View file

@ -14,6 +14,7 @@
<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script> <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script> <script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script> <script src="_static/underscore.js"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="_static/doctools.js"></script> <script src="_static/doctools.js"></script>
<script src="_static/js/theme.js"></script> <script src="_static/js/theme.js"></script>
<link rel="index" title="Index" href="#" /> <link rel="index" title="Index" href="#" />

View file

@ -15,6 +15,7 @@
<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script> <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script> <script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script> <script src="_static/underscore.js"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="_static/doctools.js"></script> <script src="_static/doctools.js"></script>
<script src="_static/js/theme.js"></script> <script src="_static/js/theme.js"></script>
<link rel="index" title="Index" href="genindex.html" /> <link rel="index" title="Index" href="genindex.html" />
@ -78,7 +79,7 @@
<div itemprop="articleBody"> <div itemprop="articleBody">
<section id="welcome-to-keycloak-collection-documentation"> <section id="welcome-to-keycloak-collection-documentation">
<h1>Welcome to Keycloak Collection documentation<a class="headerlink" href="#welcome-to-keycloak-collection-documentation" title="Permalink to this headline"></a></h1> <h1>Welcome to Keycloak Collection documentation<a class="headerlink" href="#welcome-to-keycloak-collection-documentation" title="Permalink to this heading"></a></h1>
<div class="toctree-wrapper compound"> <div class="toctree-wrapper compound">
<p class="caption" role="heading"><span class="caption-text">User documentation</span></p> <p class="caption" role="heading"><span class="caption-text">User documentation</span></p>
<ul> <ul>
@ -140,7 +141,7 @@
</div> </div>
</section> </section>
<section id="indices-and-tables"> <section id="indices-and-tables">
<h1>Indices and tables<a class="headerlink" href="#indices-and-tables" title="Permalink to this headline"></a></h1> <h1>Indices and tables<a class="headerlink" href="#indices-and-tables" title="Permalink to this heading"></a></h1>
<ul class="simple"> <ul class="simple">
<li><p><a class="reference internal" href="genindex.html"><span class="std std-ref">Index</span></a></p></li> <li><p><a class="reference internal" href="genindex.html"><span class="std std-ref">Index</span></a></p></li>
<li><p><a class="reference internal" href="search.html"><span class="std std-ref">Search Page</span></a></p></li> <li><p><a class="reference internal" href="search.html"><span class="std std-ref">Search Page</span></a></p></li>

View file

@ -15,6 +15,7 @@
<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script> <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script> <script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script> <script src="_static/underscore.js"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="_static/doctools.js"></script> <script src="_static/doctools.js"></script>
<script src="_static/js/theme.js"></script> <script src="_static/js/theme.js"></script>
<link rel="index" title="Index" href="genindex.html" /> <link rel="index" title="Index" href="genindex.html" />
@ -89,7 +90,7 @@
<div itemprop="articleBody"> <div itemprop="articleBody">
<section id="collection-versioning-strategy"> <section id="collection-versioning-strategy">
<h1>Collection Versioning Strategy<a class="headerlink" href="#collection-versioning-strategy" title="Permalink to this headline"></a></h1> <h1>Collection Versioning Strategy<a class="headerlink" href="#collection-versioning-strategy" title="Permalink to this heading"></a></h1>
<p>Each supported collection maintained by Ansible follows Semantic Versioning 2.0.0 (https://semver.org/), for example: <p>Each supported collection maintained by Ansible follows Semantic Versioning 2.0.0 (https://semver.org/), for example:
Given a version number MAJOR.MINOR.PATCH, the following is incremented:</p> Given a version number MAJOR.MINOR.PATCH, the following is incremented:</p>
<p>MAJOR version: when making incompatible API changes (see Feature Release scenarios below for examples)</p> <p>MAJOR version: when making incompatible API changes (see Feature Release scenarios below for examples)</p>
@ -98,19 +99,19 @@ Given a version number MAJOR.MINOR.PATCH, the following is incremented:</p>
<p>Additional labels for pre-release and build metadata are available as extensions to the MAJOR.MINOR.PATCH format.</p> <p>Additional labels for pre-release and build metadata are available as extensions to the MAJOR.MINOR.PATCH format.</p>
<p>The first version of a generally available supported collection on Ansible Automation Hub shall be version 1.0.0. NOTE: By default, all newly created collections may begin with a smaller default version of 0.1.0, and therefore a version of 1.0.0 should be explicitly stated by the collection maintainer.</p> <p>The first version of a generally available supported collection on Ansible Automation Hub shall be version 1.0.0. NOTE: By default, all newly created collections may begin with a smaller default version of 0.1.0, and therefore a version of 1.0.0 should be explicitly stated by the collection maintainer.</p>
<section id="new-content-is-added-to-an-existing-collection"> <section id="new-content-is-added-to-an-existing-collection">
<h2>New content is added to an existing collection<a class="headerlink" href="#new-content-is-added-to-an-existing-collection" title="Permalink to this headline"></a></h2> <h2>New content is added to an existing collection<a class="headerlink" href="#new-content-is-added-to-an-existing-collection" title="Permalink to this heading"></a></h2>
<p>Assuming the current release is 1.0.0, and a new module is ready to be added to the collection, the minor version would be incremented to 1.1.0. The change in the MINOR version indicates an additive change was made while maintaining backward compatibility for existing content within the collection.</p> <p>Assuming the current release is 1.0.0, and a new module is ready to be added to the collection, the minor version would be incremented to 1.1.0. The change in the MINOR version indicates an additive change was made while maintaining backward compatibility for existing content within the collection.</p>
</section> </section>
<section id="new-feature-to-existing-plugin-or-role-within-a-collection-backwards-compatible"> <section id="new-feature-to-existing-plugin-or-role-within-a-collection-backwards-compatible">
<h2>New feature to existing plugin or role within a collection (backwards compatible)<a class="headerlink" href="#new-feature-to-existing-plugin-or-role-within-a-collection-backwards-compatible" title="Permalink to this headline"></a></h2> <h2>New feature to existing plugin or role within a collection (backwards compatible)<a class="headerlink" href="#new-feature-to-existing-plugin-or-role-within-a-collection-backwards-compatible" title="Permalink to this heading"></a></h2>
<p>Assuming the current release is 1.0.0, and new features for an existing module are ready for release . We would increment the MINOR version to 1.1.0. The change in the MINOR version indicates an additive change was made while maintaining backward compatibility for existing content within the collection.</p> <p>Assuming the current release is 1.0.0, and new features for an existing module are ready for release . We would increment the MINOR version to 1.1.0. The change in the MINOR version indicates an additive change was made while maintaining backward compatibility for existing content within the collection.</p>
</section> </section>
<section id="bug-fix-or-security-fix-to-existing-content-within-a-collection"> <section id="bug-fix-or-security-fix-to-existing-content-within-a-collection">
<h2>Bug fix or security fix to existing content within a collection<a class="headerlink" href="#bug-fix-or-security-fix-to-existing-content-within-a-collection" title="Permalink to this headline"></a></h2> <h2>Bug fix or security fix to existing content within a collection<a class="headerlink" href="#bug-fix-or-security-fix-to-existing-content-within-a-collection" title="Permalink to this heading"></a></h2>
<p>Assuming the current release is 1.0.0 and a bug is fixed prior to the next minor release, the PATCH version would be incremented to 1.0.1. The patch indicates only a bug was fixed within a current version. The PATCH release does not contain new content, nor was functionality removed. Bug fixes may be included in a MINOR or MAJOR feature release if the timing allows, eliminating the need for a PATCH dedicated to the fix.</p> <p>Assuming the current release is 1.0.0 and a bug is fixed prior to the next minor release, the PATCH version would be incremented to 1.0.1. The patch indicates only a bug was fixed within a current version. The PATCH release does not contain new content, nor was functionality removed. Bug fixes may be included in a MINOR or MAJOR feature release if the timing allows, eliminating the need for a PATCH dedicated to the fix.</p>
</section> </section>
<section id="breaking-change-to-any-content-within-a-collection"> <section id="breaking-change-to-any-content-within-a-collection">
<h2>Breaking change to any content within a collection<a class="headerlink" href="#breaking-change-to-any-content-within-a-collection" title="Permalink to this headline"></a></h2> <h2>Breaking change to any content within a collection<a class="headerlink" href="#breaking-change-to-any-content-within-a-collection" title="Permalink to this heading"></a></h2>
<p>Assuming the current release is 1.0.0, and a breaking change (API or module) is introduced for a user or developer. The MAJOR version would be incremented to 2.0.0.</p> <p>Assuming the current release is 1.0.0, and a breaking change (API or module) is introduced for a user or developer. The MAJOR version would be incremented to 2.0.0.</p>
<p>Examples of breaking changes within a collection may include but are not limited to:</p> <p>Examples of breaking changes within a collection may include but are not limited to:</p>
<ul class="simple"> <ul class="simple">
@ -122,19 +123,19 @@ Given a version number MAJOR.MINOR.PATCH, the following is incremented:</p>
</ul> </ul>
</section> </section>
<section id="content-removed-from-a-collection"> <section id="content-removed-from-a-collection">
<h2>Content removed from a collection<a class="headerlink" href="#content-removed-from-a-collection" title="Permalink to this headline"></a></h2> <h2>Content removed from a collection<a class="headerlink" href="#content-removed-from-a-collection" title="Permalink to this heading"></a></h2>
<p>Deleting a module or API is a breaking change. Please see the Breaking change section for how to version this.</p> <p>Deleting a module or API is a breaking change. Please see the Breaking change section for how to version this.</p>
</section> </section>
<section id="a-typographical-error-was-fixed-in-the-documentation-for-a-collection"> <section id="a-typographical-error-was-fixed-in-the-documentation-for-a-collection">
<h2>A typographical error was fixed in the documentation for a collection<a class="headerlink" href="#a-typographical-error-was-fixed-in-the-documentation-for-a-collection" title="Permalink to this headline"></a></h2> <h2>A typographical error was fixed in the documentation for a collection<a class="headerlink" href="#a-typographical-error-was-fixed-in-the-documentation-for-a-collection" title="Permalink to this heading"></a></h2>
<p>A correction to the README would be considered a bug fix and the PATCH incremented. See Bug fix above.</p> <p>A correction to the README would be considered a bug fix and the PATCH incremented. See Bug fix above.</p>
</section> </section>
<section id="documentation-added-removed-modified-within-a-collection"> <section id="documentation-added-removed-modified-within-a-collection">
<h2>Documentation added/removed/modified within a collection<a class="headerlink" href="#documentation-added-removed-modified-within-a-collection" title="Permalink to this headline"></a></h2> <h2>Documentation added/removed/modified within a collection<a class="headerlink" href="#documentation-added-removed-modified-within-a-collection" title="Permalink to this heading"></a></h2>
<p>Only the PATCH version should be increased for a release that contains changes limited to revised documentation.</p> <p>Only the PATCH version should be increased for a release that contains changes limited to revised documentation.</p>
</section> </section>
<section id="release-automation"> <section id="release-automation">
<h2>Release automation<a class="headerlink" href="#release-automation" title="Permalink to this headline"></a></h2> <h2>Release automation<a class="headerlink" href="#release-automation" title="Permalink to this heading"></a></h2>
<p>New releases are triggered by annotated git tags named after semantic versioning. The automation publishes the built artifacts to ansible-galaxy and github releases page.</p> <p>New releases are triggered by annotated git tags named after semantic versioning. The automation publishes the built artifacts to ansible-galaxy and github releases page.</p>
</section> </section>
</section> </section>

View file

@ -15,6 +15,7 @@
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script> <script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script> <script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script> <script src="../_static/underscore.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../_static/doctools.js"></script> <script src="../_static/doctools.js"></script>
<script src="../_static/js/theme.js"></script> <script src="../_static/js/theme.js"></script>
<link rel="index" title="Index" href="../genindex.html" /> <link rel="index" title="Index" href="../genindex.html" />
@ -84,7 +85,7 @@
<div itemprop="articleBody"> <div itemprop="articleBody">
<section id="role-index"> <section id="role-index">
<h1>Role Index<a class="headerlink" href="#role-index" title="Permalink to this headline"></a></h1> <h1>Role Index<a class="headerlink" href="#role-index" title="Permalink to this heading"></a></h1>
<div class="toctree-wrapper compound"> <div class="toctree-wrapper compound">
<ul> <ul>
<li class="toctree-l1"><a class="reference internal" href="keycloak.html">keycloak</a><ul> <li class="toctree-l1"><a class="reference internal" href="keycloak.html">keycloak</a><ul>

View file

@ -15,6 +15,7 @@
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script> <script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script> <script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script> <script src="../_static/underscore.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../_static/doctools.js"></script> <script src="../_static/doctools.js"></script>
<script src="../_static/js/theme.js"></script> <script src="../_static/js/theme.js"></script>
<link rel="index" title="Index" href="../genindex.html" /> <link rel="index" title="Index" href="../genindex.html" />
@ -96,10 +97,10 @@
<div itemprop="articleBody"> <div itemprop="articleBody">
<section id="keycloak"> <section id="keycloak">
<h1>keycloak<a class="headerlink" href="#keycloak" title="Permalink to this headline"></a></h1> <h1>keycloak<a class="headerlink" href="#keycloak" title="Permalink to this heading"></a></h1>
<p>Install <a class="reference external" href="https://keycloak.org/">keycloak</a> or <a class="reference external" href="https://access.redhat.com/products/red-hat-single-sign-on">Red Hat Single Sign-On</a> server configurations.</p> <p>Install <a class="reference external" href="https://keycloak.org/">keycloak</a> or <a class="reference external" href="https://access.redhat.com/products/red-hat-single-sign-on">Red Hat Single Sign-On</a> server configurations.</p>
<section id="requirements"> <section id="requirements">
<h2>Requirements<a class="headerlink" href="#requirements" title="Permalink to this headline"></a></h2> <h2>Requirements<a class="headerlink" href="#requirements" title="Permalink to this heading"></a></h2>
<p>This role requires the <code class="docutils literal notranslate"><span class="pre">python3-netaddr</span></code> library installed on the controller node.</p> <p>This role requires the <code class="docutils literal notranslate"><span class="pre">python3-netaddr</span></code> library installed on the controller node.</p>
<ul class="simple"> <ul class="simple">
<li><p>to install via yum/dnf: <code class="docutils literal notranslate"><span class="pre">dnf</span> <span class="pre">install</span> <span class="pre">python3-netaddr</span></code></p></li> <li><p>to install via yum/dnf: <code class="docutils literal notranslate"><span class="pre">dnf</span> <span class="pre">install</span> <span class="pre">python3-netaddr</span></code></p></li>
@ -108,7 +109,7 @@
</ul> </ul>
</section> </section>
<section id="dependencies"> <section id="dependencies">
<h2>Dependencies<a class="headerlink" href="#dependencies" title="Permalink to this headline"></a></h2> <h2>Dependencies<a class="headerlink" href="#dependencies" title="Permalink to this heading"></a></h2>
<p>The roles depends on:</p> <p>The roles depends on:</p>
<ul class="simple"> <ul class="simple">
<li><p>the <code class="docutils literal notranslate"><span class="pre">redhat_csp_download</span></code> role from <a class="reference external" href="https://github.com/ansible-middleware/redhat-csp-download">middleware_automation.redhat_csp_download</a> collection if Red Hat Single Sign-on zip have to be downloaded from RHN.</p></li> <li><p>the <code class="docutils literal notranslate"><span class="pre">redhat_csp_download</span></code> role from <a class="reference external" href="https://github.com/ansible-middleware/redhat-csp-download">middleware_automation.redhat_csp_download</a> collection if Red Hat Single Sign-on zip have to be downloaded from RHN.</p></li>
@ -116,7 +117,7 @@
</ul> </ul>
</section> </section>
<section id="versions"> <section id="versions">
<h2>Versions<a class="headerlink" href="#versions" title="Permalink to this headline"></a></h2> <h2>Versions<a class="headerlink" href="#versions" title="Permalink to this heading"></a></h2>
<table class="colwidths-auto docutils align-default"> <table class="colwidths-auto docutils align-default">
<thead> <thead>
<tr class="row-odd"><th class="text-left head"><p>RH-SSO VERSION</p></th> <tr class="row-odd"><th class="text-left head"><p>RH-SSO VERSION</p></th>
@ -137,7 +138,7 @@
</table> </table>
</section> </section>
<section id="patching"> <section id="patching">
<h2>Patching<a class="headerlink" href="#patching" title="Permalink to this headline"></a></h2> <h2>Patching<a class="headerlink" href="#patching" title="Permalink to this heading"></a></h2>
<p>When variable <code class="docutils literal notranslate"><span class="pre">keycloak_rhsso_apply_patches</span></code> is <code class="docutils literal notranslate"><span class="pre">True</span></code> (default: <code class="docutils literal notranslate"><span class="pre">False</span></code>), the role will automatically apply the latest cumulative patch for the selected base version.</p> <p>When variable <code class="docutils literal notranslate"><span class="pre">keycloak_rhsso_apply_patches</span></code> is <code class="docutils literal notranslate"><span class="pre">True</span></code> (default: <code class="docutils literal notranslate"><span class="pre">False</span></code>), the role will automatically apply the latest cumulative patch for the selected base version.</p>
<table class="colwidths-auto docutils align-default"> <table class="colwidths-auto docutils align-default">
<thead> <thead>
@ -157,7 +158,7 @@
</table> </table>
</section> </section>
<section id="role-defaults"> <section id="role-defaults">
<h2>Role Defaults<a class="headerlink" href="#role-defaults" title="Permalink to this headline"></a></h2> <h2>Role Defaults<a class="headerlink" href="#role-defaults" title="Permalink to this heading"></a></h2>
<ul class="simple"> <ul class="simple">
<li><p>Service configuration</p></li> <li><p>Service configuration</p></li>
</ul> </ul>
@ -383,7 +384,7 @@
</table> </table>
</section> </section>
<section id="role-variables"> <section id="role-variables">
<h2>Role Variables<a class="headerlink" href="#role-variables" title="Permalink to this headline"></a></h2> <h2>Role Variables<a class="headerlink" href="#role-variables" title="Permalink to this heading"></a></h2>
<p>The following are a set of <em>required</em> variables for the role:</p> <p>The following are a set of <em>required</em> variables for the role:</p>
<table class="colwidths-auto docutils align-default"> <table class="colwidths-auto docutils align-default">
<thead> <thead>
@ -476,7 +477,7 @@
</table> </table>
</section> </section>
<section id="example-playbooks"> <section id="example-playbooks">
<h2>Example Playbooks<a class="headerlink" href="#example-playbooks" title="Permalink to this headline"></a></h2> <h2>Example Playbooks<a class="headerlink" href="#example-playbooks" title="Permalink to this heading"></a></h2>
<p><em>NOTE</em>: use ansible vaults or other security systems for storing credentials.</p> <p><em>NOTE</em>: use ansible vaults or other security systems for storing credentials.</p>
<ul class="simple"> <ul class="simple">
<li><p>The following is an example playbook that makes use of the role to install keycloak from remote:</p></li> <li><p>The following is an example playbook that makes use of the role to install keycloak from remote:</p></li>
@ -568,11 +569,11 @@
</div> </div>
</section> </section>
<section id="license"> <section id="license">
<h2>License<a class="headerlink" href="#license" title="Permalink to this headline"></a></h2> <h2>License<a class="headerlink" href="#license" title="Permalink to this heading"></a></h2>
<p>Apache License 2.0</p> <p>Apache License 2.0</p>
</section> </section>
<section id="author-information"> <section id="author-information">
<h2>Author Information<a class="headerlink" href="#author-information" title="Permalink to this headline"></a></h2> <h2>Author Information<a class="headerlink" href="#author-information" title="Permalink to this heading"></a></h2>
<ul class="simple"> <ul class="simple">
<li><p><a class="reference external" href="https://github.com/guidograzioli">Guido Grazioli</a></p></li> <li><p><a class="reference external" href="https://github.com/guidograzioli">Guido Grazioli</a></p></li>
<li><p><a class="reference external" href="https://github.com/rpelisse">Romain Pelisse</a></p></li> <li><p><a class="reference external" href="https://github.com/rpelisse">Romain Pelisse</a></p></li>

View file

@ -15,6 +15,7 @@
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script> <script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script> <script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script> <script src="../_static/underscore.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../_static/doctools.js"></script> <script src="../_static/doctools.js"></script>
<script src="../_static/js/theme.js"></script> <script src="../_static/js/theme.js"></script>
<link rel="index" title="Index" href="../genindex.html" /> <link rel="index" title="Index" href="../genindex.html" />
@ -91,10 +92,10 @@
<div itemprop="articleBody"> <div itemprop="articleBody">
<section id="keycloak-quarkus"> <section id="keycloak-quarkus">
<h1>keycloak_quarkus<a class="headerlink" href="#keycloak-quarkus" title="Permalink to this headline"></a></h1> <h1>keycloak_quarkus<a class="headerlink" href="#keycloak-quarkus" title="Permalink to this heading"></a></h1>
<p>Install <a class="reference external" href="https://keycloak.org/">keycloak</a> &gt;= 17.0.0 (quarkus) server configurations.</p> <p>Install <a class="reference external" href="https://keycloak.org/">keycloak</a> &gt;= 17.0.0 (quarkus) server configurations.</p>
<section id="role-defaults"> <section id="role-defaults">
<h2>Role Defaults<a class="headerlink" href="#role-defaults" title="Permalink to this headline"></a></h2> <h2>Role Defaults<a class="headerlink" href="#role-defaults" title="Permalink to this heading"></a></h2>
<ul class="simple"> <ul class="simple">
<li><p>Installation options</p></li> <li><p>Installation options</p></li>
</ul> </ul>
@ -399,7 +400,7 @@
</table> </table>
</section> </section>
<section id="role-variables"> <section id="role-variables">
<h2>Role Variables<a class="headerlink" href="#role-variables" title="Permalink to this headline"></a></h2> <h2>Role Variables<a class="headerlink" href="#role-variables" title="Permalink to this heading"></a></h2>
<table class="colwidths-auto docutils align-default"> <table class="colwidths-auto docutils align-default">
<thead> <thead>
<tr class="row-odd"><th class="text-left head"><p>Variable</p></th> <tr class="row-odd"><th class="text-left head"><p>Variable</p></th>
@ -416,11 +417,11 @@
</table> </table>
</section> </section>
<section id="license"> <section id="license">
<h2>License<a class="headerlink" href="#license" title="Permalink to this headline"></a></h2> <h2>License<a class="headerlink" href="#license" title="Permalink to this heading"></a></h2>
<p>Apache License 2.0</p> <p>Apache License 2.0</p>
</section> </section>
<section id="author-information"> <section id="author-information">
<h2>Author Information<a class="headerlink" href="#author-information" title="Permalink to this headline"></a></h2> <h2>Author Information<a class="headerlink" href="#author-information" title="Permalink to this heading"></a></h2>
<ul class="simple"> <ul class="simple">
<li><p><a class="reference external" href="https://github.com/guidograzioli">Guido Grazioli</a></p></li> <li><p><a class="reference external" href="https://github.com/guidograzioli">Guido Grazioli</a></p></li>
</ul> </ul>

View file

@ -15,6 +15,7 @@
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script> <script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script> <script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script> <script src="../_static/underscore.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../_static/doctools.js"></script> <script src="../_static/doctools.js"></script>
<script src="../_static/js/theme.js"></script> <script src="../_static/js/theme.js"></script>
<link rel="index" title="Index" href="../genindex.html" /> <link rel="index" title="Index" href="../genindex.html" />
@ -93,10 +94,10 @@
<div itemprop="articleBody"> <div itemprop="articleBody">
<section id="keycloak-realm"> <section id="keycloak-realm">
<h1>keycloak_realm<a class="headerlink" href="#keycloak-realm" title="Permalink to this headline"></a></h1> <h1>keycloak_realm<a class="headerlink" href="#keycloak-realm" title="Permalink to this heading"></a></h1>
<p>Create realms and clients in <a class="reference external" href="https://keycloak.org/">keycloak</a> or <a class="reference external" href="https://access.redhat.com/products/red-hat-single-sign-on">Red Hat Single Sign-On</a> services.</p> <p>Create realms and clients in <a class="reference external" href="https://keycloak.org/">keycloak</a> or <a class="reference external" href="https://access.redhat.com/products/red-hat-single-sign-on">Red Hat Single Sign-On</a> services.</p>
<section id="role-defaults"> <section id="role-defaults">
<h2>Role Defaults<a class="headerlink" href="#role-defaults" title="Permalink to this headline"></a></h2> <h2>Role Defaults<a class="headerlink" href="#role-defaults" title="Permalink to this heading"></a></h2>
<table class="colwidths-auto docutils align-default"> <table class="colwidths-auto docutils align-default">
<thead> <thead>
<tr class="row-odd"><th class="text-left head"><p>Variable</p></th> <tr class="row-odd"><th class="text-left head"><p>Variable</p></th>
@ -161,7 +162,7 @@
</table> </table>
</section> </section>
<section id="role-variables"> <section id="role-variables">
<h2>Role Variables<a class="headerlink" href="#role-variables" title="Permalink to this headline"></a></h2> <h2>Role Variables<a class="headerlink" href="#role-variables" title="Permalink to this heading"></a></h2>
<p>The following are a set of <em>required</em> variables for the role:</p> <p>The following are a set of <em>required</em> variables for the role:</p>
<table class="colwidths-auto docutils align-default"> <table class="colwidths-auto docutils align-default">
<thead> <thead>
@ -218,7 +219,7 @@
</table> </table>
</section> </section>
<section id="variable-formats"> <section id="variable-formats">
<h2>Variable formats<a class="headerlink" href="#variable-formats" title="Permalink to this headline"></a></h2> <h2>Variable formats<a class="headerlink" href="#variable-formats" title="Permalink to this heading"></a></h2>
<ul class="simple"> <ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">keycloak_user_federation</span></code>, a list of:</p></li> <li><p><code class="docutils literal notranslate"><span class="pre">keycloak_user_federation</span></code>, a list of:</p></li>
</ul> </ul>
@ -264,7 +265,7 @@
<p>For a comprehensive example, refer to the <a class="reference download internal" download="" href="../_downloads/a0468922d38230cfdad1d445a6b10b9e/keycloak_realm.yml"><span class="xref download myst">playbook</span></a>.</p> <p>For a comprehensive example, refer to the <a class="reference download internal" download="" href="../_downloads/a0468922d38230cfdad1d445a6b10b9e/keycloak_realm.yml"><span class="xref download myst">playbook</span></a>.</p>
</section> </section>
<section id="example-playbook"> <section id="example-playbook">
<h2>Example Playbook<a class="headerlink" href="#example-playbook" title="Permalink to this headline"></a></h2> <h2>Example Playbook<a class="headerlink" href="#example-playbook" title="Permalink to this heading"></a></h2>
<p>The following is an example playbook that makes use of the role to create a realm in keycloak.</p> <p>The following is an example playbook that makes use of the role to create a realm in keycloak.</p>
<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nn">---</span><span class="w"></span> <div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nn">---</span><span class="w"></span>
<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">hosts</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span><span class="w"></span> <span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">hosts</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">...</span><span class="w"></span>
@ -282,11 +283,11 @@
</div> </div>
</section> </section>
<section id="license"> <section id="license">
<h2>License<a class="headerlink" href="#license" title="Permalink to this headline"></a></h2> <h2>License<a class="headerlink" href="#license" title="Permalink to this heading"></a></h2>
<p>Apache License 2.0</p> <p>Apache License 2.0</p>
</section> </section>
<section id="author-information"> <section id="author-information">
<h2>Author Information<a class="headerlink" href="#author-information" title="Permalink to this headline"></a></h2> <h2>Author Information<a class="headerlink" href="#author-information" title="Permalink to this heading"></a></h2>
<ul class="simple"> <ul class="simple">
<li><p><a class="reference external" href="https://github.com/guidograzioli">Guido Grazioli</a></p></li> <li><p><a class="reference external" href="https://github.com/guidograzioli">Guido Grazioli</a></p></li>
<li><p><a class="reference external" href="https://github.com/rpelisse">Romain Pelisse</a></p></li> <li><p><a class="reference external" href="https://github.com/rpelisse">Romain Pelisse</a></p></li>

View file

@ -15,6 +15,7 @@
<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script> <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script> <script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script> <script src="_static/underscore.js"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="_static/doctools.js"></script> <script src="_static/doctools.js"></script>
<script src="_static/js/theme.js"></script> <script src="_static/js/theme.js"></script>
<script src="_static/searchtools.js"></script> <script src="_static/searchtools.js"></script>

File diff suppressed because one or more lines are too long

View file

@ -15,6 +15,7 @@
<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script> <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script> <script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script> <script src="_static/underscore.js"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="_static/doctools.js"></script> <script src="_static/doctools.js"></script>
<script src="_static/js/theme.js"></script> <script src="_static/js/theme.js"></script>
<link rel="index" title="Index" href="genindex.html" /> <link rel="index" title="Index" href="genindex.html" />
@ -84,9 +85,9 @@
<div itemprop="articleBody"> <div itemprop="articleBody">
<section id="testing"> <section id="testing">
<h1>Testing<a class="headerlink" href="#testing" title="Permalink to this headline"></a></h1> <h1>Testing<a class="headerlink" href="#testing" title="Permalink to this heading"></a></h1>
<section id="continuous-integration"> <section id="continuous-integration">
<h2>Continuous integration<a class="headerlink" href="#continuous-integration" title="Permalink to this headline"></a></h2> <h2>Continuous integration<a class="headerlink" href="#continuous-integration" title="Permalink to this heading"></a></h2>
<p>The collection is tested with a <a class="reference external" href="https://github.com/ansible-community/molecule">molecule</a> setup covering the included roles and verifying correct installation and idempotency. <p>The collection is tested with a <a class="reference external" href="https://github.com/ansible-community/molecule">molecule</a> setup covering the included roles and verifying correct installation and idempotency.
In order to run the molecule tests locally with python 3.9 available, after cloning the repository:</p> In order to run the molecule tests locally with python 3.9 available, after cloning the repository:</p>
<div class="highlight-YAML+Jinja notranslate"><div class="highlight"><pre><span></span><span class="l l-Scalar l-Scalar-Plain">pip install yamllint &#39;molecule[docker]~=3.5.2&#39; ansible-core flake8 ansible-lint voluptuous</span><span class="w"></span> <div class="highlight-YAML+Jinja notranslate"><div class="highlight"><pre><span></span><span class="l l-Scalar l-Scalar-Plain">pip install yamllint &#39;molecule[docker]~=3.5.2&#39; ansible-core flake8 ansible-lint voluptuous</span><span class="w"></span>
@ -95,7 +96,7 @@ In order to run the molecule tests locally with python 3.9 available, after clon
</div> </div>
</section> </section>
<section id="integration-testing"> <section id="integration-testing">
<h2>Integration testing<a class="headerlink" href="#integration-testing" title="Permalink to this headline"></a></h2> <h2>Integration testing<a class="headerlink" href="#integration-testing" title="Permalink to this heading"></a></h2>
<p>Demo repositories which depend on the collection, and aggregate functionality with other middleware_automation collections, are automatically rebuilt <p>Demo repositories which depend on the collection, and aggregate functionality with other middleware_automation collections, are automatically rebuilt
at every collection release to ensure non-breaking changes and consistent behaviour.</p> at every collection release to ensure non-breaking changes and consistent behaviour.</p>
<p>The repository are:</p> <p>The repository are:</p>
@ -107,7 +108,7 @@ A clustered multi-regional installation of keycloak with infinispan remote cache
</ul> </ul>
</section> </section>
<section id="test-playbooks"> <section id="test-playbooks">
<h2>Test playbooks<a class="headerlink" href="#test-playbooks" title="Permalink to this headline"></a></h2> <h2>Test playbooks<a class="headerlink" href="#test-playbooks" title="Permalink to this heading"></a></h2>
<p>Sample playbooks are provided in the <code class="docutils literal notranslate"><span class="pre">playbooks/</span></code> directory; to run the playbooks locally (requires a rhel system with python 3.9+, ansible, and systemd) the steps are as follows:</p> <p>Sample playbooks are provided in the <code class="docutils literal notranslate"><span class="pre">playbooks/</span></code> directory; to run the playbooks locally (requires a rhel system with python 3.9+, ansible, and systemd) the steps are as follows:</p>
<div class="highlight-YAML+Jinja notranslate"><div class="highlight"><pre><span></span><span class="c1"># setup environment</span><span class="w"></span> <div class="highlight-YAML+Jinja notranslate"><div class="highlight"><pre><span></span><span class="c1"># setup environment</span><span class="w"></span>
<span class="l l-Scalar l-Scalar-Plain">pip install ansible-core</span><span class="w"></span> <span class="l l-Scalar l-Scalar-Plain">pip install ansible-core</span><span class="w"></span>