evennia/docs/latest/_modules/evennia/utils/evmore.html
2023-12-20 18:49:25 +01:00

670 lines
No EOL
71 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>evennia.utils.evmore &#8212; Evennia latest documentation</title>
<link rel="stylesheet" href="../../../_static/nature.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
<script id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
<script src="../../../_static/jquery.js"></script>
<script src="../../../_static/underscore.js"></script>
<script src="../../../_static/doctools.js"></script>
<script src="../../../_static/language_data.js"></script>
<link rel="shortcut icon" href="../../../_static/favicon.ico"/>
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
</head><body>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../../../index.html">Evennia latest</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.utils.evmore</a></li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<p class="logo"><a href="../../../index.html">
<img class="logo" src="../../../_static/evennia_logo.png" alt="Logo"/>
</a></p>
<div id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../../../search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" />
<input type="submit" value="Go" />
</form>
</div>
</div>
<script>$('#searchbox').show(0);</script><h3>Links</h3>
<ul>
<li><a href="https://www.evennia.com/docs/latest/index.html">Documentation Top</a> </li>
<li><a href="https://www.evennia.com">Evennia Home</a> </li>
<li><a href="https://github.com/evennia/evennia">Github</a> </li>
<li><a href="http://games.evennia.com">Game Index</a> </li>
<li>
<a href="https://discord.gg/AJJpcRUhtF">Discord</a> -
<a href="https://github.com/evennia/evennia/discussions">Discussions</a> -
<a href="https://evennia.blogspot.com/">Blog</a>
</li>
</ul>
</div>
</div>
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for evennia.utils.evmore</h1><div class="highlight"><pre>
<span></span><span class="c1"># -*- coding: utf-8 -*-</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd">EvMore - pager mechanism</span>
<span class="sd">This is a pager for displaying long texts and allows stepping up and down in</span>
<span class="sd">the text (the name comes from the traditional &#39;more&#39; unix command).</span>
<span class="sd">To use, simply pass the text through the EvMore object:</span>
<span class="sd">```python</span>
<span class="sd"> from evennia.utils.evmore import EvMore</span>
<span class="sd"> text = some_long_text_output()</span>
<span class="sd"> EvMore(caller, text, always_page=False, session=None, justify_kwargs=None, **kwargs)</span>
<span class="sd">```</span>
<span class="sd">One can also use the convenience function `msg` from this module to avoid</span>
<span class="sd">having to set up the `EvMenu` object manually:</span>
<span class="sd">```python</span>
<span class="sd"> from evennia.utils import evmore</span>
<span class="sd"> text = some_long_text_output()</span>
<span class="sd"> evmore.msg(caller, text, always_page=False, session=None, justify_kwargs=None, **kwargs)</span>
<span class="sd">```</span>
<span class="sd">The `always_page` argument decides if the pager is used also if the text is not long</span>
<span class="sd">enough to need to scroll, `session` is used to determine which session to relay</span>
<span class="sd">to and `justify_kwargs` are kwargs to pass to utils.utils.justify in order to</span>
<span class="sd">change the formatting of the text. The remaining `**kwargs` will be passed on to</span>
<span class="sd">the `caller.msg()` construct every time the page is updated.</span>
<span class="sd">----</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">evennia</span>
<span class="kn">from</span> <span class="nn">django.conf</span> <span class="kn">import</span> <span class="n">settings</span>
<span class="kn">from</span> <span class="nn">django.core.paginator</span> <span class="kn">import</span> <span class="n">Paginator</span>
<span class="kn">from</span> <span class="nn">django.db.models.query</span> <span class="kn">import</span> <span class="n">QuerySet</span>
<span class="kn">from</span> <span class="nn">django.utils.translation</span> <span class="kn">import</span> <span class="n">gettext</span> <span class="k">as</span> <span class="n">_</span>
<span class="kn">from</span> <span class="nn">evennia.commands</span> <span class="kn">import</span> <span class="n">cmdhandler</span>
<span class="kn">from</span> <span class="nn">evennia.commands.cmdset</span> <span class="kn">import</span> <span class="n">CmdSet</span>
<span class="kn">from</span> <span class="nn">evennia.commands.command</span> <span class="kn">import</span> <span class="n">Command</span>
<span class="kn">from</span> <span class="nn">evennia.utils.ansi</span> <span class="kn">import</span> <span class="n">ANSIString</span>
<span class="kn">from</span> <span class="nn">evennia.utils.utils</span> <span class="kn">import</span> <span class="n">dedent</span><span class="p">,</span> <span class="n">inherits_from</span><span class="p">,</span> <span class="n">justify</span><span class="p">,</span> <span class="n">make_iter</span>
<span class="n">_CMD_NOMATCH</span> <span class="o">=</span> <span class="n">cmdhandler</span><span class="o">.</span><span class="n">CMD_NOMATCH</span>
<span class="n">_CMD_NOINPUT</span> <span class="o">=</span> <span class="n">cmdhandler</span><span class="o">.</span><span class="n">CMD_NOINPUT</span>
<span class="c1"># we need to use NAWS for this</span>
<span class="n">_SCREEN_WIDTH</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">CLIENT_DEFAULT_WIDTH</span>
<span class="n">_SCREEN_HEIGHT</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">CLIENT_DEFAULT_HEIGHT</span>
<span class="n">_EVTABLE</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">_LBR</span> <span class="o">=</span> <span class="n">ANSIString</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="c1"># text</span>
<span class="n">_DISPLAY</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span><span class="si">{text}</span>
<span class="s2">|n(|wPage|n [</span><span class="si">{pageno}</span><span class="s2">/</span><span class="si">{pagemax}</span><span class="s2">] |wn|next|n || |wp|nrevious || |wt|nop || |we|nnd || |wq|nuit)&quot;&quot;&quot;</span>
<div class="viewcode-block" id="CmdMore"><a class="viewcode-back" href="../../../api/evennia.utils.evmore.html#evennia.utils.evmore.CmdMore">[docs]</a><span class="k">class</span> <span class="nc">CmdMore</span><span class="p">(</span><span class="n">Command</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Manipulate the text paging. Catch no-input with aliases.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="n">_CMD_NOINPUT</span>
<span class="n">aliases</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;quit&quot;</span><span class="p">,</span> <span class="s2">&quot;q&quot;</span><span class="p">,</span> <span class="s2">&quot;abort&quot;</span><span class="p">,</span> <span class="s2">&quot;a&quot;</span><span class="p">,</span> <span class="s2">&quot;next&quot;</span><span class="p">,</span> <span class="s2">&quot;n&quot;</span><span class="p">,</span> <span class="s2">&quot;previous&quot;</span><span class="p">,</span> <span class="s2">&quot;p&quot;</span><span class="p">,</span> <span class="s2">&quot;top&quot;</span><span class="p">,</span> <span class="s2">&quot;t&quot;</span><span class="p">,</span> <span class="s2">&quot;end&quot;</span><span class="p">,</span> <span class="s2">&quot;e&quot;</span><span class="p">]</span>
<span class="n">auto_help</span> <span class="o">=</span> <span class="kc">False</span>
<div class="viewcode-block" id="CmdMore.func"><a class="viewcode-back" href="../../../api/evennia.utils.evmore.html#evennia.utils.evmore.CmdMore.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Implement the command</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">more</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">_more</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">more</span> <span class="ow">and</span> <span class="n">inherits_from</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="p">,</span> <span class="n">evennia</span><span class="o">.</span><span class="n">DefaultObject</span><span class="p">):</span>
<span class="n">more</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">account</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">_more</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">more</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;Error in loading the pager. Contact an admin.&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">cmd</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cmdstring</span>
<span class="k">if</span> <span class="n">cmd</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;abort&quot;</span><span class="p">,</span> <span class="s2">&quot;a&quot;</span><span class="p">,</span> <span class="s2">&quot;q&quot;</span><span class="p">):</span>
<span class="n">more</span><span class="o">.</span><span class="n">page_quit</span><span class="p">()</span>
<span class="k">elif</span> <span class="n">cmd</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;previous&quot;</span><span class="p">,</span> <span class="s2">&quot;p&quot;</span><span class="p">):</span>
<span class="n">more</span><span class="o">.</span><span class="n">page_back</span><span class="p">()</span>
<span class="k">elif</span> <span class="n">cmd</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;top&quot;</span><span class="p">,</span> <span class="s2">&quot;t&quot;</span><span class="p">,</span> <span class="s2">&quot;look&quot;</span><span class="p">,</span> <span class="s2">&quot;l&quot;</span><span class="p">):</span>
<span class="n">more</span><span class="o">.</span><span class="n">page_top</span><span class="p">()</span>
<span class="k">elif</span> <span class="n">cmd</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;end&quot;</span><span class="p">,</span> <span class="s2">&quot;e&quot;</span><span class="p">):</span>
<span class="n">more</span><span class="o">.</span><span class="n">page_end</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># return or n, next</span>
<span class="n">more</span><span class="o">.</span><span class="n">page_next</span><span class="p">()</span></div></div>
<div class="viewcode-block" id="CmdMoreExit"><a class="viewcode-back" href="../../../api/evennia.utils.evmore.html#evennia.utils.evmore.CmdMoreExit">[docs]</a><span class="k">class</span> <span class="nc">CmdMoreExit</span><span class="p">(</span><span class="n">Command</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Any non-more command will exit the pager.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="n">_CMD_NOMATCH</span>
<div class="viewcode-block" id="CmdMoreExit.func"><a class="viewcode-back" href="../../../api/evennia.utils.evmore.html#evennia.utils.evmore.CmdMoreExit.func">[docs]</a> <span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Exit pager and re-fire the failed command.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">more</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">_more</span>
<span class="n">more</span><span class="o">.</span><span class="n">page_quit</span><span class="p">()</span>
<span class="c1"># re-fire the command (in new cmdset)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">caller</span><span class="o">.</span><span class="n">execute_cmd</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">raw_string</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="CmdSetMore"><a class="viewcode-back" href="../../../api/evennia.utils.evmore.html#evennia.utils.evmore.CmdSetMore">[docs]</a><span class="k">class</span> <span class="nc">CmdSetMore</span><span class="p">(</span><span class="n">CmdSet</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Stores the more command</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;more_commands&quot;</span>
<span class="n">priority</span> <span class="o">=</span> <span class="mi">110</span>
<span class="n">mergetype</span> <span class="o">=</span> <span class="s2">&quot;Replace&quot;</span>
<div class="viewcode-block" id="CmdSetMore.at_cmdset_creation"><a class="viewcode-back" href="../../../api/evennia.utils.evmore.html#evennia.utils.evmore.CmdSetMore.at_cmdset_creation">[docs]</a> <span class="k">def</span> <span class="nf">at_cmdset_creation</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdMore</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdMoreExit</span><span class="p">())</span></div></div>
<span class="c1"># resources for handling queryset inputs</span>
<div class="viewcode-block" id="queryset_maxsize"><a class="viewcode-back" href="../../../api/evennia.utils.evmore.html#evennia.utils.evmore.queryset_maxsize">[docs]</a><span class="k">def</span> <span class="nf">queryset_maxsize</span><span class="p">(</span><span class="n">qs</span><span class="p">):</span>
<span class="k">return</span> <span class="n">qs</span><span class="o">.</span><span class="n">count</span><span class="p">()</span></div>
<div class="viewcode-block" id="EvMore"><a class="viewcode-back" href="../../../api/evennia.utils.evmore.html#evennia.utils.evmore.EvMore">[docs]</a><span class="k">class</span> <span class="nc">EvMore</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> The main pager object</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="EvMore.__init__"><a class="viewcode-back" href="../../../api/evennia.utils.evmore.html#evennia.utils.evmore.EvMore.__init__">[docs]</a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">caller</span><span class="p">,</span>
<span class="n">inp</span><span class="p">,</span>
<span class="n">always_page</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">session</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">justify</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">justify_kwargs</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">exit_on_lastpage</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">exit_cmd</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">page_formatter</span><span class="o">=</span><span class="nb">str</span><span class="p">,</span>
<span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
<span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Initialization of the EvMore pager.</span>
<span class="sd"> Args:</span>
<span class="sd"> caller (Object or Account): Entity reading the text.</span>
<span class="sd"> inp (str, EvTable, Paginator or iterator): The text or data to put under paging.</span>
<span class="sd"> - If a string, paginage normally. If this text contains</span>
<span class="sd"> one or more `\\\\f` format symbol, automatic pagination and justification</span>
<span class="sd"> are force-disabled and page-breaks will only happen after each `\\\\f`.</span>
<span class="sd"> - If `EvTable`, the EvTable will be paginated with the same</span>
<span class="sd"> setting on each page if it is too long. The table</span>
<span class="sd"> decorations will be considered in the size of the page.</span>
<span class="sd"> - Otherwise `inp` is converted to an iterator, where each step is</span>
<span class="sd"> expected to be a line in the final display. Each line</span>
<span class="sd"> will be run through `iter_callable`.</span>
<span class="sd"> always_page (bool, optional): If `False`, the</span>
<span class="sd"> pager will only kick in if `inp` is too big</span>
<span class="sd"> to fit the screen.</span>
<span class="sd"> session (Session, optional): If given, this session will be used</span>
<span class="sd"> to determine the screen width and will receive all output.</span>
<span class="sd"> justify (bool, optional): If set, auto-justify long lines. This must be turned</span>
<span class="sd"> off for fixed-width or formatted output, like tables. It&#39;s force-disabled</span>
<span class="sd"> if `inp` is an EvTable.</span>
<span class="sd"> justify_kwargs (dict, optional): Keywords for the justify function. Used only</span>
<span class="sd"> if `justify` is True. If this is not set, default arguments will be used.</span>
<span class="sd"> exit_on_lastpage (bool, optional): If reaching the last page without the</span>
<span class="sd"> page being completely filled, exit pager immediately. If unset,</span>
<span class="sd"> another move forward is required to exit. If set, the pager</span>
<span class="sd"> exit message will not be shown.</span>
<span class="sd"> exit_cmd (str, optional): If given, this command-string will be executed on</span>
<span class="sd"> the caller when the more page exits. Note that this will be using whatever</span>
<span class="sd"> cmdset the user had *before* the evmore pager was activated (so none of</span>
<span class="sd"> the evmore commands will be available when this is run).</span>
<span class="sd"> kwargs (any, optional): These will be passed on to the `caller.msg` method. Notably,</span>
<span class="sd"> one can pass additional outputfuncs this way. There is one special kwarg:</span>
<span class="sd"> - `text_kwargs` - extra kwargs to pass with the text outputfunc, e.g.</span>
<span class="sd"> `text_kwargs={&quot;type&quot;: &quot;help&quot;}` would result to each page being sent</span>
<span class="sd"> to `msg` as `text=(pagetxt, {&quot;type&quot;: &quot;help&quot;})`.</span>
<span class="sd"> Examples:</span>
<span class="sd"> ```python</span>
<span class="sd"> super_long_text = &quot; ... &quot;</span>
<span class="sd"> EvMore(caller, super_long_text)</span>
<span class="sd"> ```</span>
<span class="sd"> Paginator</span>
<span class="sd"> ```python</span>
<span class="sd"> from django.core.paginator import Paginator</span>
<span class="sd"> query = ObjectDB.objects.all()</span>
<span class="sd"> pages = Paginator(query, 10) # 10 objs per page</span>
<span class="sd"> EvMore(caller, pages)</span>
<span class="sd"> ```</span>
<span class="sd"> Every page an EvTable</span>
<span class="sd"> ```python</span>
<span class="sd"> from evennia import EvTable</span>
<span class="sd"> def _to_evtable(page):</span>
<span class="sd"> table = ... # convert page to a table</span>
<span class="sd"> return EvTable(*headers, table=table, ...)</span>
<span class="sd"> EvMore(caller, pages, page_formatter=_to_evtable)</span>
<span class="sd"> ```</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_caller</span> <span class="o">=</span> <span class="n">caller</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_always_page</span> <span class="o">=</span> <span class="n">always_page</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">session</span><span class="p">:</span>
<span class="c1"># if not supplied, use the first session to</span>
<span class="c1"># determine screen size</span>
<span class="n">sessions</span> <span class="o">=</span> <span class="n">caller</span><span class="o">.</span><span class="n">sessions</span><span class="o">.</span><span class="n">get</span><span class="p">()</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">sessions</span><span class="p">:</span>
<span class="k">return</span>
<span class="n">session</span> <span class="o">=</span> <span class="n">sessions</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_session</span> <span class="o">=</span> <span class="n">session</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_justify</span> <span class="o">=</span> <span class="n">justify</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_justify_kwargs</span> <span class="o">=</span> <span class="n">justify_kwargs</span>
<span class="bp">self</span><span class="o">.</span><span class="n">exit_on_lastpage</span> <span class="o">=</span> <span class="n">exit_on_lastpage</span>
<span class="bp">self</span><span class="o">.</span><span class="n">exit_cmd</span> <span class="o">=</span> <span class="n">exit_cmd</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_exit_msg</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;|xExited pager.|n&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_text_kwargs</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">&quot;text_kwargs&quot;</span><span class="p">,</span> <span class="p">{})</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_kwargs</span> <span class="o">=</span> <span class="n">kwargs</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_data</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_pages</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_npos</span> <span class="o">=</span> <span class="mi">0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_npages</span> <span class="o">=</span> <span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_paginator</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">paginator_index</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_page_formatter</span> <span class="o">=</span> <span class="nb">str</span>
<span class="c1"># set up individual pages for different sessions</span>
<span class="n">height</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="n">session</span><span class="o">.</span><span class="n">protocol_flags</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;SCREENHEIGHT&quot;</span><span class="p">,</span> <span class="p">{</span><span class="mi">0</span><span class="p">:</span> <span class="n">_SCREEN_HEIGHT</span><span class="p">})[</span><span class="mi">0</span><span class="p">]</span> <span class="o">-</span> <span class="mi">4</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">width</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="n">protocol_flags</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;SCREENWIDTH&quot;</span><span class="p">,</span> <span class="p">{</span><span class="mi">0</span><span class="p">:</span> <span class="n">_SCREEN_WIDTH</span><span class="p">})[</span><span class="mi">0</span><span class="p">]</span>
<span class="c1"># always limit number of chars to 10 000 per page</span>
<span class="bp">self</span><span class="o">.</span><span class="n">height</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="mi">10000</span> <span class="o">//</span> <span class="nb">max</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">width</span><span class="p">),</span> <span class="n">height</span><span class="p">)</span>
<span class="c1"># does initial parsing of input</span>
<span class="bp">self</span><span class="o">.</span><span class="n">init_pages</span><span class="p">(</span><span class="n">inp</span><span class="p">)</span>
<span class="c1"># kick things into gear</span>
<span class="bp">self</span><span class="o">.</span><span class="n">start</span><span class="p">()</span></div>
<span class="c1"># EvMore functional methods</span>
<div class="viewcode-block" id="EvMore.display"><a class="viewcode-back" href="../../../api/evennia.utils.evmore.html#evennia.utils.evmore.EvMore.display">[docs]</a> <span class="k">def</span> <span class="nf">display</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">show_footer</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Pretty-print the page.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">pos</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">text</span> <span class="o">=</span> <span class="s2">&quot;[no content]&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_npages</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">pos</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_npos</span>
<span class="n">text</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">page_formatter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">paginator</span><span class="p">(</span><span class="n">pos</span><span class="p">))</span>
<span class="k">if</span> <span class="n">show_footer</span><span class="p">:</span>
<span class="n">page</span> <span class="o">=</span> <span class="n">_DISPLAY</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="n">text</span><span class="p">,</span> <span class="n">pageno</span><span class="o">=</span><span class="n">pos</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">pagemax</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_npages</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">page</span> <span class="o">=</span> <span class="n">text</span>
<span class="c1"># check to make sure our session is still valid</span>
<span class="n">sessions</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="o">.</span><span class="n">sessions</span><span class="o">.</span><span class="n">get</span><span class="p">()</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">sessions</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">page_quit</span><span class="p">()</span>
<span class="k">return</span>
<span class="c1"># this must be an &#39;is&#39; check, not an == check</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">any</span><span class="p">(</span><span class="n">ses</span> <span class="k">for</span> <span class="n">ses</span> <span class="ow">in</span> <span class="n">sessions</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_session</span> <span class="ow">is</span> <span class="n">ses</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_session</span> <span class="o">=</span> <span class="n">sessions</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">text_outputfunc</span> <span class="o">=</span> <span class="p">(</span><span class="n">page</span><span class="p">,</span> <span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">_text_kwargs</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="n">text_outputfunc</span><span class="p">,</span> <span class="n">session</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_session</span><span class="p">,</span> <span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">_kwargs</span><span class="p">)</span></div>
<div class="viewcode-block" id="EvMore.page_top"><a class="viewcode-back" href="../../../api/evennia.utils.evmore.html#evennia.utils.evmore.EvMore.page_top">[docs]</a> <span class="k">def</span> <span class="nf">page_top</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Display the top page</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_npos</span> <span class="o">=</span> <span class="mi">0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">display</span><span class="p">()</span></div>
<div class="viewcode-block" id="EvMore.page_end"><a class="viewcode-back" href="../../../api/evennia.utils.evmore.html#evennia.utils.evmore.EvMore.page_end">[docs]</a> <span class="k">def</span> <span class="nf">page_end</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Display the bottom page.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_npos</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_npages</span> <span class="o">-</span> <span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">display</span><span class="p">()</span></div>
<div class="viewcode-block" id="EvMore.page_next"><a class="viewcode-back" href="../../../api/evennia.utils.evmore.html#evennia.utils.evmore.EvMore.page_next">[docs]</a> <span class="k">def</span> <span class="nf">page_next</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Scroll the text to the next page. Quit if already at the end</span>
<span class="sd"> of the page.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_npos</span> <span class="o">&gt;=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_npages</span> <span class="o">-</span> <span class="mi">1</span><span class="p">:</span>
<span class="c1"># exit if we are already at the end</span>
<span class="bp">self</span><span class="o">.</span><span class="n">page_quit</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_npos</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">exit_on_lastpage</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_npos</span> <span class="o">&gt;=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_npages</span> <span class="o">-</span> <span class="mi">1</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">display</span><span class="p">(</span><span class="n">show_footer</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">page_quit</span><span class="p">(</span><span class="n">quiet</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">display</span><span class="p">()</span></div>
<div class="viewcode-block" id="EvMore.page_back"><a class="viewcode-back" href="../../../api/evennia.utils.evmore.html#evennia.utils.evmore.EvMore.page_back">[docs]</a> <span class="k">def</span> <span class="nf">page_back</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Scroll the text back up, at the most to the top.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_npos</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_npos</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">display</span><span class="p">()</span></div>
<div class="viewcode-block" id="EvMore.page_quit"><a class="viewcode-back" href="../../../api/evennia.utils.evmore.html#evennia.utils.evmore.EvMore.page_quit">[docs]</a> <span class="k">def</span> <span class="nf">page_quit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">quiet</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Quit the pager</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">_more</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">quiet</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_exit_msg</span><span class="p">,</span> <span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">_kwargs</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="o">.</span><span class="n">cmdset</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">CmdSetMore</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">exit_cmd</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="o">.</span><span class="n">execute_cmd</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">exit_cmd</span><span class="p">,</span> <span class="n">session</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_session</span><span class="p">)</span></div>
<div class="viewcode-block" id="EvMore.start"><a class="viewcode-back" href="../../../api/evennia.utils.evmore.html#evennia.utils.evmore.EvMore.start">[docs]</a> <span class="k">def</span> <span class="nf">start</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Starts the pagination</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_npages</span> <span class="o">&lt;=</span> <span class="mi">1</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_always_page</span><span class="p">:</span>
<span class="c1"># no need for paging; just pass-through.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">display</span><span class="p">(</span><span class="n">show_footer</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># go into paging mode</span>
<span class="c1"># first pass on the msg kwargs</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="o">.</span><span class="n">ndb</span><span class="o">.</span><span class="n">_more</span> <span class="o">=</span> <span class="bp">self</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_caller</span><span class="o">.</span><span class="n">cmdset</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">CmdSetMore</span><span class="p">)</span>
<span class="c1"># goto top of the text</span>
<span class="bp">self</span><span class="o">.</span><span class="n">page_top</span><span class="p">()</span></div>
<span class="c1"># default paginators - responsible for extracting a specific page number</span>
<div class="viewcode-block" id="EvMore.paginator_index"><a class="viewcode-back" href="../../../api/evennia.utils.evmore.html#evennia.utils.evmore.EvMore.paginator_index">[docs]</a> <span class="k">def</span> <span class="nf">paginator_index</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pageno</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Paginate to specific, known index&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_data</span><span class="p">[</span><span class="n">pageno</span><span class="p">]</span></div>
<div class="viewcode-block" id="EvMore.paginator_slice"><a class="viewcode-back" href="../../../api/evennia.utils.evmore.html#evennia.utils.evmore.EvMore.paginator_slice">[docs]</a> <span class="k">def</span> <span class="nf">paginator_slice</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pageno</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Paginate by slice. This is done with an eye on memory efficiency (usually for</span>
<span class="sd"> querysets); to avoid fetching all objects at the same time.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_data</span><span class="p">[</span><span class="n">pageno</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">height</span> <span class="p">:</span> <span class="n">pageno</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">height</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">height</span><span class="p">]</span></div>
<div class="viewcode-block" id="EvMore.paginator_django"><a class="viewcode-back" href="../../../api/evennia.utils.evmore.html#evennia.utils.evmore.EvMore.paginator_django">[docs]</a> <span class="k">def</span> <span class="nf">paginator_django</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pageno</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Paginate using the django queryset Paginator API. Note that his is indexed from 1.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_data</span><span class="o">.</span><span class="n">page</span><span class="p">(</span><span class="n">pageno</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span></div>
<span class="c1"># default helpers to set up particular input types</span>
<div class="viewcode-block" id="EvMore.init_evtable"><a class="viewcode-back" href="../../../api/evennia.utils.evmore.html#evennia.utils.evmore.EvMore.init_evtable">[docs]</a> <span class="k">def</span> <span class="nf">init_evtable</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">table</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;The input is an EvTable.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">table</span><span class="o">.</span><span class="n">height</span><span class="p">:</span>
<span class="c1"># enforced height of each paged table, plus space for evmore extras</span>
<span class="bp">self</span><span class="o">.</span><span class="n">height</span> <span class="o">=</span> <span class="n">table</span><span class="o">.</span><span class="n">height</span> <span class="o">-</span> <span class="mi">4</span>
<span class="c1"># convert table to string</span>
<span class="n">text</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">table</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_justify</span> <span class="o">=</span> <span class="kc">False</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_justify_kwargs</span> <span class="o">=</span> <span class="kc">None</span> <span class="c1"># enforce</span>
<span class="bp">self</span><span class="o">.</span><span class="n">init_str</span><span class="p">(</span><span class="n">text</span><span class="p">)</span></div>
<div class="viewcode-block" id="EvMore.init_queryset"><a class="viewcode-back" href="../../../api/evennia.utils.evmore.html#evennia.utils.evmore.EvMore.init_queryset">[docs]</a> <span class="k">def</span> <span class="nf">init_queryset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">qs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;The input is a queryset&quot;&quot;&quot;</span>
<span class="n">nsize</span> <span class="o">=</span> <span class="n">qs</span><span class="o">.</span><span class="n">count</span><span class="p">()</span> <span class="c1"># we assume each will be a line</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_npages</span> <span class="o">=</span> <span class="n">nsize</span> <span class="o">//</span> <span class="bp">self</span><span class="o">.</span><span class="n">height</span> <span class="o">+</span> <span class="p">(</span><span class="mi">0</span> <span class="k">if</span> <span class="n">nsize</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">height</span> <span class="o">==</span> <span class="mi">0</span> <span class="k">else</span> <span class="mi">1</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_data</span> <span class="o">=</span> <span class="n">qs</span></div>
<div class="viewcode-block" id="EvMore.init_django_paginator"><a class="viewcode-back" href="../../../api/evennia.utils.evmore.html#evennia.utils.evmore.EvMore.init_django_paginator">[docs]</a> <span class="k">def</span> <span class="nf">init_django_paginator</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pages</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> The input is a django Paginator object.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_npages</span> <span class="o">=</span> <span class="n">pages</span><span class="o">.</span><span class="n">num_pages</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_data</span> <span class="o">=</span> <span class="n">pages</span></div>
<div class="viewcode-block" id="EvMore.init_iterable"><a class="viewcode-back" href="../../../api/evennia.utils.evmore.html#evennia.utils.evmore.EvMore.init_iterable">[docs]</a> <span class="k">def</span> <span class="nf">init_iterable</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">inp</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;The input is something other than a string - convert to iterable of strings&quot;&quot;&quot;</span>
<span class="n">inp</span> <span class="o">=</span> <span class="n">make_iter</span><span class="p">(</span><span class="n">inp</span><span class="p">)</span>
<span class="n">nsize</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">inp</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_npages</span> <span class="o">=</span> <span class="n">nsize</span> <span class="o">//</span> <span class="bp">self</span><span class="o">.</span><span class="n">height</span> <span class="o">+</span> <span class="p">(</span><span class="mi">0</span> <span class="k">if</span> <span class="n">nsize</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">height</span> <span class="o">==</span> <span class="mi">0</span> <span class="k">else</span> <span class="mi">1</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_data</span> <span class="o">=</span> <span class="n">inp</span></div>
<div class="viewcode-block" id="EvMore.init_f_str"><a class="viewcode-back" href="../../../api/evennia.utils.evmore.html#evennia.utils.evmore.EvMore.init_f_str">[docs]</a> <span class="k">def</span> <span class="nf">init_f_str</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> The input contains `\\f` markers. We use `\\f` to indicate the user wants to</span>
<span class="sd"> enforce their line breaks on their own. If so, we do no automatic</span>
<span class="sd"> line-breaking/justification at all.</span>
<span class="sd"> Args:</span>
<span class="sd"> text (str): The string to format with f-markers.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_data</span> <span class="o">=</span> <span class="n">text</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\f</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_npages</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_data</span><span class="p">)</span></div>
<div class="viewcode-block" id="EvMore.init_str"><a class="viewcode-back" href="../../../api/evennia.utils.evmore.html#evennia.utils.evmore.EvMore.init_str">[docs]</a> <span class="k">def</span> <span class="nf">init_str</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;The input is a string&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_justify</span><span class="p">:</span>
<span class="c1"># we must break very long lines into multiple ones. Note that this</span>
<span class="c1"># will also remove spurious whitespace.</span>
<span class="n">justify_kwargs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_justify_kwargs</span> <span class="ow">or</span> <span class="p">{}</span>
<span class="n">width</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_justify_kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;width&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">width</span><span class="p">)</span>
<span class="n">justify_kwargs</span><span class="p">[</span><span class="s2">&quot;width&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">width</span>
<span class="n">justify_kwargs</span><span class="p">[</span><span class="s2">&quot;align&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_justify_kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;align&quot;</span><span class="p">,</span> <span class="s2">&quot;l&quot;</span><span class="p">)</span>
<span class="n">justify_kwargs</span><span class="p">[</span><span class="s2">&quot;indent&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_justify_kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;indent&quot;</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="n">lines</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">text</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">line</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">width</span><span class="p">:</span>
<span class="n">lines</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">justify</span><span class="p">(</span><span class="n">line</span><span class="p">,</span> <span class="o">**</span><span class="n">justify_kwargs</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">lines</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># no justification. Simple division by line</span>
<span class="n">lines</span> <span class="o">=</span> <span class="n">text</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="c1"># note: If joining on ANSIString here, we will parse out || escapes into | too early,</span>
<span class="c1"># meaning the protocol will later parse into color; better to leave things and only parse</span>
<span class="c1"># once.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_data</span> <span class="o">=</span> <span class="p">[</span>
<span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">lines</span><span class="p">[</span><span class="n">i</span> <span class="p">:</span> <span class="n">i</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">height</span><span class="p">])</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">lines</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">height</span><span class="p">)</span>
<span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_npages</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_data</span><span class="p">)</span></div>
<span class="c1"># Hooks for customizing input handling and formatting (override in a child class)</span>
<div class="viewcode-block" id="EvMore.init_pages"><a class="viewcode-back" href="../../../api/evennia.utils.evmore.html#evennia.utils.evmore.EvMore.init_pages">[docs]</a> <span class="k">def</span> <span class="nf">init_pages</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">inp</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Initialize the pagination. By default, will analyze input type to determine</span>
<span class="sd"> how pagination automatically.</span>
<span class="sd"> Args:</span>
<span class="sd"> inp (any): Incoming data to be paginated. By default, handles pagination of</span>
<span class="sd"> strings, querysets, django.Paginator, EvTables and any iterables with strings.</span>
<span class="sd"> Notes:</span>
<span class="sd"> If overridden, this method must perform the following actions:</span>
<span class="sd"> - read and re-store `self._data` (the incoming data set) if needed for pagination to</span>
<span class="sd"> work.</span>
<span class="sd"> - set `self._npages` to the total number of pages. Default is 1.</span>
<span class="sd"> - set `self._paginator` to a callable that will take a page number 1...N and return</span>
<span class="sd"> the data to display on that page (not any decorations or next/prev buttons). If only</span>
<span class="sd"> wanting to change the paginator, override `self.paginator` instead.</span>
<span class="sd"> - set `self._page_formatter` to a callable that will receive the page from</span>
<span class="sd"> `self._paginator` and format it with one element per line. Default is `str`. Or</span>
<span class="sd"> override `self.page_formatter` directly instead.</span>
<span class="sd"> By default, helper methods are called that perform these actions</span>
<span class="sd"> depending on supported inputs.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">inherits_from</span><span class="p">(</span><span class="n">inp</span><span class="p">,</span> <span class="s2">&quot;evennia.utils.evtable.EvTable&quot;</span><span class="p">):</span>
<span class="c1"># an EvTable</span>
<span class="bp">self</span><span class="o">.</span><span class="n">init_evtable</span><span class="p">(</span><span class="n">inp</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_paginator</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">paginator_index</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">inp</span><span class="p">,</span> <span class="n">QuerySet</span><span class="p">):</span>
<span class="c1"># a queryset</span>
<span class="bp">self</span><span class="o">.</span><span class="n">init_queryset</span><span class="p">(</span><span class="n">inp</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_paginator</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">paginator_slice</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">inp</span><span class="p">,</span> <span class="n">Paginator</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">init_django_paginator</span><span class="p">(</span><span class="n">inp</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_paginator</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">paginator_django</span>
<span class="k">elif</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">inp</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="c1"># anything else not a str</span>
<span class="bp">self</span><span class="o">.</span><span class="n">init_iterable</span><span class="p">(</span><span class="n">inp</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_paginator</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">paginator_slice</span>
<span class="k">elif</span> <span class="s2">&quot;</span><span class="se">\f</span><span class="s2">&quot;</span> <span class="ow">in</span> <span class="n">inp</span><span class="p">:</span>
<span class="c1"># string with \f line-break markers in it</span>
<span class="bp">self</span><span class="o">.</span><span class="n">init_f_str</span><span class="p">(</span><span class="n">inp</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_paginator</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">paginator_index</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># a string</span>
<span class="bp">self</span><span class="o">.</span><span class="n">init_str</span><span class="p">(</span><span class="n">inp</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_paginator</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">paginator_index</span></div>
<div class="viewcode-block" id="EvMore.paginator"><a class="viewcode-back" href="../../../api/evennia.utils.evmore.html#evennia.utils.evmore.EvMore.paginator">[docs]</a> <span class="k">def</span> <span class="nf">paginator</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pageno</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Paginator. The data operated upon is in `self._data`.</span>
<span class="sd"> Args:</span>
<span class="sd"> pageno (int): The page number to view, from 0...N-1</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: The page to display (without any decorations, those are added</span>
<span class="sd"> by EvMore).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_paginator</span><span class="p">(</span><span class="n">pageno</span><span class="p">)</span></div>
<div class="viewcode-block" id="EvMore.page_formatter"><a class="viewcode-back" href="../../../api/evennia.utils.evmore.html#evennia.utils.evmore.EvMore.page_formatter">[docs]</a> <span class="k">def</span> <span class="nf">page_formatter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">page</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Page formatter. Every page passes through this method. Override</span>
<span class="sd"> it to customize behavior per-page. A common use is to generate a new</span>
<span class="sd"> EvTable for every page (this is more efficient than to generate one huge</span>
<span class="sd"> EvTable across many pages and feed it into EvMore all at once).</span>
<span class="sd"> Args:</span>
<span class="sd"> page (any): A piece of data representing one page to display. This must</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: A ready-formatted page to display. Extra footer with help about</span>
<span class="sd"> switching to the next/prev page will be added automatically</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_page_formatter</span><span class="p">(</span><span class="n">page</span><span class="p">)</span></div></div>
<span class="c1"># helper function</span>
<div class="viewcode-block" id="msg"><a class="viewcode-back" href="../../../api/evennia.utils.evmore.html#evennia.utils.evmore.msg">[docs]</a><span class="k">def</span> <span class="nf">msg</span><span class="p">(</span>
<span class="n">caller</span><span class="p">,</span>
<span class="n">text</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">,</span>
<span class="n">always_page</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">session</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">justify</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">justify_kwargs</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">exit_on_lastpage</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
<span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> EvMore-supported version of msg, mimicking the normal msg method.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">EvMore</span><span class="p">(</span>
<span class="n">caller</span><span class="p">,</span>
<span class="n">text</span><span class="p">,</span>
<span class="n">always_page</span><span class="o">=</span><span class="n">always_page</span><span class="p">,</span>
<span class="n">session</span><span class="o">=</span><span class="n">session</span><span class="p">,</span>
<span class="n">justify</span><span class="o">=</span><span class="n">justify</span><span class="p">,</span>
<span class="n">justify_kwargs</span><span class="o">=</span><span class="n">justify_kwargs</span><span class="p">,</span>
<span class="n">exit_on_lastpage</span><span class="o">=</span><span class="n">exit_on_lastpage</span><span class="p">,</span>
<span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
<span class="p">)</span></div>
<span class="n">msg</span><span class="o">.</span><span class="vm">__doc__</span> <span class="o">+=</span> <span class="n">dedent</span><span class="p">(</span><span class="n">EvMore</span><span class="o">.</span><span class="fm">__init__</span><span class="o">.</span><span class="vm">__doc__</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../../../index.html">Evennia latest</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.utils.evmore</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2023, The Evennia developer community.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
</div>
</body>
</html>