evennia/docs/1.0-dev/_modules/evennia/utils/evmore.html
2020-06-14 21:48:02 +02:00

702 lines
No EOL
64 KiB
HTML

<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>evennia.utils.evmore &mdash; Evennia 1.0-dev documentation</title>
<link rel="shortcut icon" href="../../../_static/favicon.ico"/>
<link rel="stylesheet" href="../../../_static/css/theme.css" type="text/css" />
<link rel="index" title="Index"
href="../../../genindex.html"/>
<link rel="search" title="Search" href="../../../search.html"/>
<link rel="top" title="Evennia 1.0-dev documentation" href="../../../index.html"/>
<link rel="up" title="evennia" href="../../evennia.html"/>
<script src="../../../_static/js/modernizr.min.js"></script>
</head>
<body class="wy-body-for-nav" role="document">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search">
<a href="../../../index.html" class="icon icon-home"> Evennia
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<!-- Local TOC -->
<div class="local-toc"></div>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" role="navigation" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../../index.html">Evennia</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../../index.html">Docs</a> &raquo;</li>
<li><a href="../../index.html">Module code</a> &raquo;</li>
<li><a href="../../evennia.html">evennia</a> &raquo;</li>
<li>evennia.utils.evmore</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<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</span>
<span class="sd">down in the text (the name comes from the traditional &#39;more&#39; unix</span>
<span class="sd">command).</span>
<span class="sd">To use, simply pass the text through the EvMore object:</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">One can also use the convenience function msg from this module:</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">Where always_page decides if the pager is used also if the text is not</span>
<span class="sd">long enough to need to scroll, session is used to determine which session to relay to</span>
<span class="sd">and justify_kwargs are kwargs to pass to utils.utils.justify in order to change the formatting</span>
<span class="sd">of the text. The remaining **kwargs will be passed on to the</span>
<span class="sd">caller.msg() construct every time the page is updated.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">django.conf</span> <span class="k">import</span> <span class="n">settings</span>
<span class="kn">from</span> <span class="nn">django.db.models.query</span> <span class="k">import</span> <span class="n">QuerySet</span>
<span class="kn">from</span> <span class="nn">evennia</span> <span class="k">import</span> <span class="n">Command</span><span class="p">,</span> <span class="n">CmdSet</span>
<span class="kn">from</span> <span class="nn">evennia.commands</span> <span class="k">import</span> <span class="n">cmdhandler</span>
<span class="kn">from</span> <span class="nn">evennia.utils.ansi</span> <span class="k">import</span> <span class="n">ANSIString</span>
<span class="kn">from</span> <span class="nn">evennia.utils.utils</span> <span class="k">import</span> <span class="n">make_iter</span><span class="p">,</span> <span class="n">inherits_from</span><span class="p">,</span> <span class="n">justify</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"></span>
<span class="s2">(|wmore|n [</span><span class="si">{pageno}</span><span class="s2">/</span><span class="si">{pagemax}</span><span class="s2">] retur|wn|n|||wb|nack|||wt|nop|||we|nnd|||wq|nuit)&quot;&quot;&quot;</span>
<div class="viewcode-block" id="CmdMore"><a class="viewcode-back" href="../../../api/evennia.utils.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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Manipulate the text paging</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;back&quot;</span><span class="p">,</span> <span class="s2">&quot;b&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.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="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="nb">hasattr</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="s2">&quot;account&quot;</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;back&quot;</span><span class="p">,</span> <span class="s2">&quot;b&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="CmdMoreLook"><a class="viewcode-back" href="../../../api/evennia.utils.html#evennia.utils.evmore.CmdMoreLook">[docs]</a><span class="k">class</span> <span class="nc">CmdMoreLook</span><span class="p">(</span><span class="n">Command</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Override look to display window and prevent OOCLook from firing</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;look&quot;</span>
<span class="n">aliases</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;l&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="CmdMoreLook.func"><a class="viewcode-back" href="../../../api/evennia.utils.html#evennia.utils.evmore.CmdMoreLook.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="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="nb">hasattr</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="s2">&quot;account&quot;</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">more</span><span class="o">.</span><span class="n">display</span><span class="p">()</span></div></div>
<div class="viewcode-block" id="CmdSetMore"><a class="viewcode-back" href="../../../api/evennia.utils.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="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>
<div class="viewcode-block" id="CmdSetMore.at_cmdset_creation"><a class="viewcode-back" href="../../../api/evennia.utils.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">CmdMoreLook</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.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.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="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.html#evennia.utils.evmore.EvMore.__init__">[docs]</a> <span class="k">def</span> <span class="nf">__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">text</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Initialization of the text handler.</span>
<span class="sd"> Args:</span>
<span class="sd"> caller (Object or Account): Entity reading the text.</span>
<span class="sd"> text (str, EvTable 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 `text` 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 `text` 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 `text` is an EvTable.</span>
<span class="sd"> justify_kwargs (dict, optional): Keywords for the justifiy 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"> page_formatter (callable, optional): If given, this function will be passed the</span>
<span class="sd"> contents of each extracted page. This is useful when paginating</span>
<span class="sd"> data consisting something other than a string or a list of strings. Especially</span>
<span class="sd"> queryset data is likely to always need this argument specified. Note however,</span>
<span class="sd"> that all size calculations assume this function to return one single line</span>
<span class="sd"> per element on the page!</span>
<span class="sd"> kwargs (any, optional): These will be passed on to the `caller.msg` method.</span>
<span class="sd"> Examples:</span>
<span class="sd"> super_long_text = &quot; ... &quot;</span>
<span class="sd"> EvMore(caller, super_long_text)</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) # will repr() each object per line, 10 to a page</span>
<span class="sd"> multi_page_table = [ [[..],[..]], ...]</span>
<span class="sd"> EvMore(caller, multi_page_table, use_evtable=True,</span>
<span class="sd"> evtable_args=(&quot;Header1&quot;, &quot;Header2&quot;),</span>
<span class="sd"> evtable_kwargs={&quot;align&quot;: &quot;r&quot;, &quot;border&quot;: &quot;tablecols&quot;})</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="s2">&quot;Exited |wmore|n pager.&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_page_formatter</span> <span class="o">=</span> <span class="n">page_formatter</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">_paginator</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">_npages</span> <span class="o">=</span> <span class="mi">1</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="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="k">if</span> <span class="n">inherits_from</span><span class="p">(</span><span class="n">text</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">text</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">text</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">text</span><span class="p">)</span>
<span class="k">elif</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">text</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">text</span><span class="p">)</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">text</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">text</span><span class="p">)</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">text</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"># page formatter</span>
<div class="viewcode-block" id="EvMore.format_page"><a class="viewcode-back" href="../../../api/evennia.utils.html#evennia.utils.evmore.EvMore.format_page">[docs]</a> <span class="k">def</span> <span class="nf">format_page</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Page formatter. Uses the page_formatter callable by default.</span>
<span class="sd"> This allows to easier override the class if needed.</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>
<span class="c1"># 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.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="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.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="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>
<span class="c1"># inits for different input types</span>
<div class="viewcode-block" id="EvMore.init_evtable"><a class="viewcode-back" href="../../../api/evennia.utils.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="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.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="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>
<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></div>
<div class="viewcode-block" id="EvMore.init_iterable"><a class="viewcode-back" href="../../../api/evennia.utils.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="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>
<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></div>
<div class="viewcode-block" id="EvMore.init_f_str"><a class="viewcode-back" href="../../../api/evennia.utils.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="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"> &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>
<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.init_str"><a class="viewcode-back" href="../../../api/evennia.utils.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="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="bp">self</span><span class="o">.</span><span class="n">_data</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">_LBR</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>
<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>
<span class="c1"># display helpers and navigation</span>
<div class="viewcode-block" id="EvMore.display"><a class="viewcode-back" href="../../../api/evennia.utils.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="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="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">format_page</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;, not == 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="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">page</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.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="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.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="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.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="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.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="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.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="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.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="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></div>
<span class="c1"># helper function</span>
<div class="viewcode-block" id="msg"><a class="viewcode-back" href="../../../api/evennia.utils.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="sd">&quot;&quot;&quot;</span>
<span class="sd"> EvMore-supported version of msg, mimicking the normal msg method.</span>
<span class="sd"> Args:</span>
<span class="sd"> caller (Object or Account): Entity reading the text.</span>
<span class="sd"> text (str, EvTable 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 is disabled</span>
<span class="sd"> 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 `text` is converted to an iterator, where each step is</span>
<span class="sd"> is expected to be a line in the final display, and each line</span>
<span class="sd"> will be run through repr().</span>
<span class="sd"> always_page (bool, optional): If `False`, the</span>
<span class="sd"> pager will only kick in if `text` 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, justify long lines in output. Disable for</span>
<span class="sd"> fixed-format output, like tables.</span>
<span class="sd"> justify_kwargs (dict, bool or None, optional): If given, this should</span>
<span class="sd"> be valid keyword arguments to the utils.justify() function. If False,</span>
<span class="sd"> no justification will be done.</span>
<span class="sd"> exit_on_lastpage (bool, optional): Immediately exit pager when reaching the last page.</span>
<span class="sd"> use_evtable (bool, optional): If True, each page will be rendered as an</span>
<span class="sd"> EvTable. For this to work, `text` must be an iterable, where each element</span>
<span class="sd"> is the table (list of list) to render on that page.</span>
<span class="sd"> evtable_args (tuple, optional): The args to use for EvTable on each page.</span>
<span class="sd"> evtable_kwargs (dict, optional): The kwargs to use for EvTable on each</span>
<span class="sd"> page (except `table`, which is supplied by EvMore per-page).</span>
<span class="sd"> kwargs (any, optional): These will be passed on</span>
<span class="sd"> to the `caller.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>
</pre></div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2020, The Evennia developer community.
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> and ❤️ using a custom <a href="https://github.com/LinxiFan/Sphinx-theme">theme</a> based on <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT:'../../../',
VERSION:'1.0-dev',
COLLAPSE_INDEX:false,
FILE_SUFFIX:'.html',
HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt'
};
</script>
<script type="text/javascript" src="../../../_static/jquery.js"></script>
<script type="text/javascript" src="../../../_static/underscore.js"></script>
<script type="text/javascript" src="../../../_static/doctools.js"></script>
<script type="text/javascript" src="../../../_static/language_data.js"></script>
<script type="text/javascript" src="../../../_static/js/theme.js"></script>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.StickyNav.enable();
});
</script>
</body>
</html>