mirror of
https://github.com/evennia/evennia.git
synced 2026-03-30 20:47:17 +02:00
1852 lines
No EOL
227 KiB
HTML
1852 lines
No EOL
227 KiB
HTML
|
|
<!DOCTYPE html>
|
|
|
|
<html>
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
<title>evennia.utils.evtable — Evennia 0.9.5 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 0.9.5</a> »</li>
|
|
<li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> »</li>
|
|
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> »</li>
|
|
<li class="nav-item nav-item-this"><a href="">evennia.utils.evtable</a></li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="document">
|
|
<div class="documentwrapper">
|
|
<div class="bodywrapper">
|
|
<div class="body" role="main">
|
|
|
|
<h1>Source code for evennia.utils.evtable</h1><div class="highlight"><pre>
|
|
<span></span><span class="sd">"""</span>
|
|
<span class="sd">This is an advanced ASCII table creator. It was inspired by Prettytable</span>
|
|
<span class="sd">(https://code.google.com/p/prettytable/) but shares no code and is considerably</span>
|
|
<span class="sd">more advanced, supporting auto-balancing of incomplete tables and ANSI colors among</span>
|
|
<span class="sd">other things.</span>
|
|
|
|
<span class="sd">Example usage:</span>
|
|
|
|
<span class="sd">```python</span>
|
|
<span class="sd"> from evennia.utils import evtable</span>
|
|
|
|
<span class="sd"> table = evtable.EvTable("Heading1", "Heading2",</span>
|
|
<span class="sd"> table=[[1,2,3],[4,5,6],[7,8,9]], border="cells")</span>
|
|
<span class="sd"> table.add_column("This is long data", "This is even longer data")</span>
|
|
<span class="sd"> table.add_row("This is a single row")</span>
|
|
<span class="sd"> print table</span>
|
|
<span class="sd">```</span>
|
|
|
|
<span class="sd">Result:</span>
|
|
|
|
<span class="sd">::</span>
|
|
|
|
<span class="sd"> +----------------------+----------+---+--------------------------+</span>
|
|
<span class="sd"> | Heading1 | Heading2 | | |</span>
|
|
<span class="sd"> +~~~~~~~~~~~~~~~~~~~~~~+~~~~~~~~~~+~~~+~~~~~~~~~~~~~~~~~~~~~~~~~~+</span>
|
|
<span class="sd"> | 1 | 4 | 7 | This is long data |</span>
|
|
<span class="sd"> +----------------------+----------+---+--------------------------+</span>
|
|
<span class="sd"> | 2 | 5 | 8 | This is even longer data |</span>
|
|
<span class="sd"> +----------------------+----------+---+--------------------------+</span>
|
|
<span class="sd"> | 3 | 6 | 9 | |</span>
|
|
<span class="sd"> +----------------------+----------+---+--------------------------+</span>
|
|
<span class="sd"> | This is a single row | | | |</span>
|
|
<span class="sd"> +----------------------+----------+---+--------------------------+</span>
|
|
|
|
<span class="sd">As seen, the table will automatically expand with empty cells to make</span>
|
|
<span class="sd">the table symmetric. Tables can be restricted to a given width:</span>
|
|
|
|
<span class="sd">```python</span>
|
|
<span class="sd"> table.reformat(width=50, align="l")</span>
|
|
<span class="sd">```</span>
|
|
|
|
<span class="sd">(We could just have added these keywords to the table creation call)</span>
|
|
|
|
<span class="sd">This yields the following result:</span>
|
|
|
|
<span class="sd">::</span>
|
|
|
|
<span class="sd"> +-----------+------------+-----------+-----------+</span>
|
|
<span class="sd"> | Heading1 | Heading2 | | |</span>
|
|
<span class="sd"> +~~~~~~~~~~~+~~~~~~~~~~~~+~~~~~~~~~~~+~~~~~~~~~~~+</span>
|
|
<span class="sd"> | 1 | 4 | 7 | This is |</span>
|
|
<span class="sd"> | | | | long data |</span>
|
|
<span class="sd"> +-----------+------------+-----------+-----------+</span>
|
|
<span class="sd"> | | | | This is |</span>
|
|
<span class="sd"> | 2 | 5 | 8 | even |</span>
|
|
<span class="sd"> | | | | longer |</span>
|
|
<span class="sd"> | | | | data |</span>
|
|
<span class="sd"> +-----------+------------+-----------+-----------+</span>
|
|
<span class="sd"> | 3 | 6 | 9 | |</span>
|
|
<span class="sd"> +-----------+------------+-----------+-----------+</span>
|
|
<span class="sd"> | This is a | | | |</span>
|
|
<span class="sd"> | single | | | |</span>
|
|
<span class="sd"> | row | | | |</span>
|
|
<span class="sd"> +-----------+------------+-----------+-----------+</span>
|
|
|
|
|
|
<span class="sd">Table-columns can be individually formatted. Note that if an</span>
|
|
<span class="sd">individual column is set with a specific width, table auto-balancing</span>
|
|
<span class="sd">will not affect this column (this may lead to the full table being too</span>
|
|
<span class="sd">wide, so be careful mixing fixed-width columns with auto- balancing).</span>
|
|
<span class="sd">Here we change the width and alignment of the column at index 3</span>
|
|
<span class="sd">(Python starts from 0):</span>
|
|
|
|
<span class="sd">```python</span>
|
|
|
|
<span class="sd">table.reformat_column(3, width=30, align="r")</span>
|
|
<span class="sd">print table</span>
|
|
<span class="sd">```</span>
|
|
|
|
<span class="sd">::</span>
|
|
|
|
<span class="sd"> +-----------+-------+-----+-----------------------------+---------+</span>
|
|
<span class="sd"> | Heading1 | Headi | | | |</span>
|
|
<span class="sd"> | | ng2 | | | |</span>
|
|
<span class="sd"> +~~~~~~~~~~~+~~~~~~~+~~~~~+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+~~~~~~~~~+</span>
|
|
<span class="sd"> | 1 | 4 | 7 | This is long data | Test1 |</span>
|
|
<span class="sd"> +-----------+-------+-----+-----------------------------+---------+</span>
|
|
<span class="sd"> | 2 | 5 | 8 | This is even longer data | Test3 |</span>
|
|
<span class="sd"> +-----------+-------+-----+-----------------------------+---------+</span>
|
|
<span class="sd"> | 3 | 6 | 9 | | Test4 |</span>
|
|
<span class="sd"> +-----------+-------+-----+-----------------------------+---------+</span>
|
|
<span class="sd"> | This is a | | | | |</span>
|
|
<span class="sd"> | single | | | | |</span>
|
|
<span class="sd"> | row | | | | |</span>
|
|
<span class="sd"> +-----------+-------+-----+-----------------------------+---------+</span>
|
|
|
|
<span class="sd">When adding new rows/columns their data can have its own alignments</span>
|
|
<span class="sd">(left/center/right, top/center/bottom).</span>
|
|
|
|
<span class="sd">If the height is restricted, cells will be restricted from expanding</span>
|
|
<span class="sd">vertically. This will lead to text contents being cropped. Each cell</span>
|
|
<span class="sd">can only shrink to a minimum width and height of 1.</span>
|
|
|
|
<span class="sd">`EvTable` is intended to be used with `ANSIString` for supporting ANSI-coloured</span>
|
|
<span class="sd">string types.</span>
|
|
|
|
<span class="sd">When a cell is auto-wrapped across multiple lines, ANSI-reset sequences will be</span>
|
|
<span class="sd">put at the end of each wrapped line. This means that the colour of a wrapped</span>
|
|
<span class="sd">cell will not "bleed", but it also means that eventual colour outside the table</span>
|
|
<span class="sd">will not transfer "across" a table, you need to re-set the color to have it</span>
|
|
<span class="sd">appear on both sides of the table string.</span>
|
|
|
|
<span class="sd">----</span>
|
|
|
|
<span class="sd">"""</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">textwrap</span> <span class="kn">import</span> <span class="n">TextWrapper</span>
|
|
<span class="kn">from</span> <span class="nn">copy</span> <span class="kn">import</span> <span class="n">deepcopy</span><span class="p">,</span> <span class="n">copy</span>
|
|
<span class="kn">from</span> <span class="nn">evennia.utils.utils</span> <span class="kn">import</span> <span class="n">is_iter</span><span class="p">,</span> <span class="n">display_len</span> <span class="k">as</span> <span class="n">d_len</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="n">_DEFAULT_WIDTH</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">CLIENT_DEFAULT_WIDTH</span>
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">_to_ansi</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> convert to ANSIString.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> obj (str): Convert incoming text to</span>
|
|
<span class="sd"> be ANSI aware ANSIStrings.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="n">is_iter</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="p">[</span><span class="n">_to_ansi</span><span class="p">(</span><span class="n">o</span><span class="p">)</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">obj</span><span class="p">]</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">ANSIString</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
|
|
|
|
|
|
<span class="n">_whitespace</span> <span class="o">=</span> <span class="s2">"</span><span class="se">\t\n\x0b\x0c\r</span><span class="s2"> "</span>
|
|
|
|
|
|
<div class="viewcode-block" id="ANSITextWrapper"><a class="viewcode-back" href="../../../api/evennia.utils.evtable.html#evennia.utils.evtable.ANSITextWrapper">[docs]</a><span class="k">class</span> <span class="nc">ANSITextWrapper</span><span class="p">(</span><span class="n">TextWrapper</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> This is a wrapper work class for handling strings with ANSI tags</span>
|
|
<span class="sd"> in it. It overloads the standard library `TextWrapper` class and</span>
|
|
<span class="sd"> is used internally in `EvTable` and has no public methods.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_munge_whitespace</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">"""_munge_whitespace(text : string) -> string</span>
|
|
|
|
<span class="sd"> Munge whitespace in text: expand tabs and convert all other</span>
|
|
<span class="sd"> whitespace characters to spaces. Eg. " foo\tbar\n\nbaz"</span>
|
|
<span class="sd"> becomes " foo bar baz".</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="n">text</span>
|
|
|
|
<span class="c1"># TODO: Ignore expand_tabs/replace_whitespace until ANSIString handles them.</span>
|
|
<span class="c1"># - don't remove this code. /Griatch</span>
|
|
<span class="c1"># if self.expand_tabs:</span>
|
|
<span class="c1"># text = text.expandtabs()</span>
|
|
<span class="c1"># if self.replace_whitespace:</span>
|
|
<span class="c1"># if isinstance(text, str):</span>
|
|
<span class="c1"># text = text.translate(self.whitespace_trans)</span>
|
|
<span class="c1"># return text</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_split</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">"""_split(text : string) -> [string]</span>
|
|
|
|
<span class="sd"> Split the text to wrap into indivisible chunks. Chunks are</span>
|
|
<span class="sd"> not quite the same as words; see _wrap_chunks() for full</span>
|
|
<span class="sd"> details. As an example, the text</span>
|
|
<span class="sd"> Look, goof-ball -- use the -b option!</span>
|
|
<span class="sd"> breaks into the following chunks:</span>
|
|
<span class="sd"> 'Look,', ' ', 'goof-', 'ball', ' ', '--', ' ',</span>
|
|
<span class="sd"> 'use', ' ', 'the', ' ', '-b', ' ', 'option!'</span>
|
|
<span class="sd"> if break_on_hyphens is True, or in:</span>
|
|
<span class="sd"> 'Look,', ' ', 'goof-ball', ' ', '--', ' ',</span>
|
|
<span class="sd"> 'use', ' ', 'the', ' ', '-b', ' ', option!'</span>
|
|
<span class="sd"> otherwise.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="c1"># NOTE-PYTHON3: The following code only roughly approximates what this</span>
|
|
<span class="c1"># function used to do. Regex splitting on ANSIStrings is</span>
|
|
<span class="c1"># dropping ANSI codes, so we're using ANSIString.split</span>
|
|
<span class="c1"># for the time being.</span>
|
|
<span class="c1">#</span>
|
|
<span class="c1"># A less hackier solution would be appreciated.</span>
|
|
<span class="n">chunks</span> <span class="o">=</span> <span class="n">_to_ansi</span><span class="p">(</span><span class="n">text</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
|
|
|
|
<span class="n">chunks</span> <span class="o">=</span> <span class="p">[</span><span class="n">chunk</span> <span class="o">+</span> <span class="s2">" "</span> <span class="k">for</span> <span class="n">chunk</span> <span class="ow">in</span> <span class="n">chunks</span> <span class="k">if</span> <span class="n">chunk</span><span class="p">]</span> <span class="c1"># remove empty chunks</span>
|
|
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">chunks</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="n">chunks</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">chunks</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
|
|
|
|
<span class="k">return</span> <span class="n">chunks</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_wrap_chunks</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">chunks</span><span class="p">):</span>
|
|
<span class="sd">"""_wrap_chunks(chunks : [string]) -> [string]</span>
|
|
|
|
<span class="sd"> Wrap a sequence of text chunks and return a list of lines of</span>
|
|
<span class="sd"> length 'self.width' or less. (If 'break_long_words' is false,</span>
|
|
<span class="sd"> some lines may be longer than this.) Chunks correspond roughly</span>
|
|
<span class="sd"> to words and the whitespace between them: each chunk is</span>
|
|
<span class="sd"> indivisible (modulo 'break_long_words'), but a line break can</span>
|
|
<span class="sd"> come between any two chunks. Chunks should not have internal</span>
|
|
<span class="sd"> whitespace; ie. a chunk is either all whitespace or a "word".</span>
|
|
<span class="sd"> Whitespace chunks will be removed from the beginning and end of</span>
|
|
<span class="sd"> lines, but apart from that whitespace is preserved.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">lines</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">width</span> <span class="o"><=</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"invalid width </span><span class="si">%r</span><span class="s2"> (must be > 0)"</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">width</span><span class="p">)</span>
|
|
|
|
<span class="c1"># Arrange in reverse order so items can be efficiently popped</span>
|
|
<span class="c1"># from a stack of chucks.</span>
|
|
<span class="n">chunks</span><span class="o">.</span><span class="n">reverse</span><span class="p">()</span>
|
|
|
|
<span class="k">while</span> <span class="n">chunks</span><span class="p">:</span>
|
|
|
|
<span class="c1"># Start the list of chunks that will make up the current line.</span>
|
|
<span class="c1"># cur_len is just the length of all the chunks in cur_line.</span>
|
|
<span class="n">cur_line</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="n">cur_len</span> <span class="o">=</span> <span class="mi">0</span>
|
|
|
|
<span class="c1"># Figure out which static string will prefix this line.</span>
|
|
<span class="k">if</span> <span class="n">lines</span><span class="p">:</span>
|
|
<span class="n">indent</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">subsequent_indent</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">indent</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">initial_indent</span>
|
|
|
|
<span class="c1"># Maximum width for this line.</span>
|
|
<span class="n">width</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">width</span> <span class="o">-</span> <span class="n">d_len</span><span class="p">(</span><span class="n">indent</span><span class="p">)</span>
|
|
|
|
<span class="c1"># First chunk on line is whitespace -- drop it, unless this</span>
|
|
<span class="c1"># is the very beginning of the text (ie. no lines started yet).</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">drop_whitespace</span> <span class="ow">and</span> <span class="n">chunks</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="o">==</span> <span class="s2">""</span> <span class="ow">and</span> <span class="n">lines</span><span class="p">:</span>
|
|
<span class="k">del</span> <span class="n">chunks</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
|
|
|
|
<span class="k">while</span> <span class="n">chunks</span><span class="p">:</span>
|
|
<span class="n">ln</span> <span class="o">=</span> <span class="n">d_len</span><span class="p">(</span><span class="n">chunks</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
|
|
|
|
<span class="c1"># Can at least squeeze this chunk onto the current line.</span>
|
|
<span class="k">if</span> <span class="n">cur_len</span> <span class="o">+</span> <span class="n">ln</span> <span class="o"><=</span> <span class="n">width</span><span class="p">:</span>
|
|
<span class="n">cur_line</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">chunks</span><span class="o">.</span><span class="n">pop</span><span class="p">())</span>
|
|
<span class="n">cur_len</span> <span class="o">+=</span> <span class="n">ln</span>
|
|
|
|
<span class="c1"># Nope, this line is full.</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">break</span>
|
|
|
|
<span class="c1"># The current line is full, and the next chunk is too big to</span>
|
|
<span class="c1"># fit on *any* line (not just this one).</span>
|
|
<span class="k">if</span> <span class="n">chunks</span> <span class="ow">and</span> <span class="n">d_len</span><span class="p">(</span><span class="n">chunks</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span> <span class="o">></span> <span class="n">width</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_handle_long_word</span><span class="p">(</span><span class="n">chunks</span><span class="p">,</span> <span class="n">cur_line</span><span class="p">,</span> <span class="n">cur_len</span><span class="p">,</span> <span class="n">width</span><span class="p">)</span>
|
|
|
|
<span class="c1"># If the last chunk on this line is all whitespace, drop it.</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">drop_whitespace</span> <span class="ow">and</span> <span class="n">cur_line</span> <span class="ow">and</span> <span class="n">cur_line</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="o">==</span> <span class="s2">""</span><span class="p">:</span>
|
|
<span class="k">del</span> <span class="n">cur_line</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
|
|
|
|
<span class="c1"># Convert current line back to a string and store it in list</span>
|
|
<span class="c1"># of all lines (return value).</span>
|
|
<span class="k">if</span> <span class="n">cur_line</span><span class="p">:</span>
|
|
<span class="n">ln</span> <span class="o">=</span> <span class="s2">""</span>
|
|
<span class="k">for</span> <span class="n">w</span> <span class="ow">in</span> <span class="n">cur_line</span><span class="p">:</span> <span class="c1"># ANSI fix</span>
|
|
<span class="n">ln</span> <span class="o">+=</span> <span class="n">w</span> <span class="c1">#</span>
|
|
<span class="n">lines</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">indent</span> <span class="o">+</span> <span class="n">ln</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">lines</span></div>
|
|
|
|
|
|
<span class="c1"># -- Convenience interface ---------------------------------------------</span>
|
|
|
|
|
|
<div class="viewcode-block" id="wrap"><a class="viewcode-back" href="../../../api/evennia.utils.evtable.html#evennia.utils.evtable.wrap">[docs]</a><span class="k">def</span> <span class="nf">wrap</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">width</span><span class="o">=</span><span class="n">_DEFAULT_WIDTH</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Wrap a single paragraph of text, returning a list of wrapped lines.</span>
|
|
|
|
<span class="sd"> Reformat the single paragraph in 'text' so it fits in lines of no</span>
|
|
<span class="sd"> more than 'width' columns, and return a list of wrapped lines. By</span>
|
|
<span class="sd"> default, tabs in 'text' are expanded with string.expandtabs(), and</span>
|
|
<span class="sd"> all other whitespace characters (including newline) are converted to</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> text (str): Text to wrap.</span>
|
|
<span class="sd"> width (int, optional): Width to wrap `text` to.</span>
|
|
|
|
<span class="sd"> Keyword Args:</span>
|
|
<span class="sd"> See TextWrapper class for available keyword args to customize</span>
|
|
<span class="sd"> wrapping behaviour.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="n">w</span> <span class="o">=</span> <span class="n">ANSITextWrapper</span><span class="p">(</span><span class="n">width</span><span class="o">=</span><span class="n">width</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">w</span><span class="o">.</span><span class="n">wrap</span><span class="p">(</span><span class="n">text</span><span class="p">)</span></div>
|
|
|
|
|
|
<div class="viewcode-block" id="fill"><a class="viewcode-back" href="../../../api/evennia.utils.evtable.html#evennia.utils.evtable.fill">[docs]</a><span class="k">def</span> <span class="nf">fill</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">width</span><span class="o">=</span><span class="n">_DEFAULT_WIDTH</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="sd">"""Fill a single paragraph of text, returning a new string.</span>
|
|
|
|
<span class="sd"> Reformat the single paragraph in 'text' to fit in lines of no more</span>
|
|
<span class="sd"> than 'width' columns, and return a new string containing the entire</span>
|
|
<span class="sd"> wrapped paragraph. As with wrap(), tabs are expanded and other</span>
|
|
<span class="sd"> whitespace characters converted to space.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> text (str): Text to fill.</span>
|
|
<span class="sd"> width (int, optional): Width of fill area.</span>
|
|
|
|
<span class="sd"> Keyword Args:</span>
|
|
<span class="sd"> See TextWrapper class for available keyword args to customize</span>
|
|
<span class="sd"> filling behaviour.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="n">w</span> <span class="o">=</span> <span class="n">ANSITextWrapper</span><span class="p">(</span><span class="n">width</span><span class="o">=</span><span class="n">width</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">w</span><span class="o">.</span><span class="n">fill</span><span class="p">(</span><span class="n">text</span><span class="p">)</span></div>
|
|
|
|
|
|
<span class="c1"># EvCell class (see further down for the EvTable itself)</span>
|
|
|
|
|
|
<div class="viewcode-block" id="EvCell"><a class="viewcode-back" href="../../../api/evennia.utils.evtable.html#evennia.utils.evtable.EvCell">[docs]</a><span class="k">class</span> <span class="nc">EvCell</span><span class="p">:</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Holds a single data cell for the table. A cell has a certain width</span>
|
|
<span class="sd"> and height and contains one or more lines of data. It can shrink</span>
|
|
<span class="sd"> and resize as needed.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<div class="viewcode-block" id="EvCell.__init__"><a class="viewcode-back" href="../../../api/evennia.utils.evtable.html#evennia.utils.evtable.EvCell.__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">data</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> data (str): The un-padded data of the entry.</span>
|
|
|
|
<span class="sd"> Keyword Args:</span>
|
|
<span class="sd"> width (int): Desired width of cell. It will pad</span>
|
|
<span class="sd"> to this size.</span>
|
|
<span class="sd"> height (int): Desired height of cell. it will pad</span>
|
|
<span class="sd"> to this size.</span>
|
|
<span class="sd"> pad_width (int): General padding width. This can be overruled</span>
|
|
<span class="sd"> by individual settings below.</span>
|
|
<span class="sd"> pad_left (int): Number of extra pad characters on the left.</span>
|
|
<span class="sd"> pad_right (int): Number of extra pad characters on the right.</span>
|
|
<span class="sd"> pad_top (int): Number of extra pad lines top (will pad with `vpad_char`).</span>
|
|
<span class="sd"> pad_bottom (int): Number of extra pad lines bottom (will pad with `vpad_char`).</span>
|
|
<span class="sd"> pad_char (str)- pad character to use for padding. This is overruled</span>
|
|
<span class="sd"> by individual settings below (default `" "`).</span>
|
|
<span class="sd"> hpad_char (str): Pad character to use both for extra horizontal</span>
|
|
<span class="sd"> padding (default `" "`).</span>
|
|
<span class="sd"> vpad_char (str): Pad character to use for extra vertical padding</span>
|
|
<span class="sd"> and for vertical fill (default `" "`).</span>
|
|
<span class="sd"> fill_char (str): Character used to filling (expanding cells to</span>
|
|
<span class="sd"> desired size). This can be overruled by individual settings below.</span>
|
|
<span class="sd"> hfill_char (str): Character used for horizontal fill (default `" "`).</span>
|
|
<span class="sd"> vfill_char (str): Character used for vertical fill (default `" "`).</span>
|
|
<span class="sd"> align (str): Should be one of "l", "r" or "c" for left-, right- or center</span>
|
|
<span class="sd"> horizontal alignment respectively. Default is left-aligned.</span>
|
|
<span class="sd"> valign (str): Should be one of "t", "b" or "c" for top-, bottom and center</span>
|
|
<span class="sd"> vertical alignment respectively. Default is centered.</span>
|
|
<span class="sd"> border_width (int): General border width. This is overruled</span>
|
|
<span class="sd"> by individual settings below.</span>
|
|
<span class="sd"> border_left (int): Left border width.</span>
|
|
<span class="sd"> border_right (int): Right border width.</span>
|
|
<span class="sd"> border_top (int): Top border width.</span>
|
|
<span class="sd"> border_bottom (int): Bottom border width.</span>
|
|
<span class="sd"> border_char (str): This will use a single border char for all borders.</span>
|
|
<span class="sd"> overruled by individual settings below.</span>
|
|
<span class="sd"> border_left_char (str): Char used for left border.</span>
|
|
<span class="sd"> border_right_char (str): Char used for right border.</span>
|
|
<span class="sd"> border_top_char (str): Char used for top border.</span>
|
|
<span class="sd"> border_bottom_char (str): Char user for bottom border.</span>
|
|
<span class="sd"> corner_char (str): Character used when two borders cross. (default is "").</span>
|
|
<span class="sd"> This is overruled by individual settings below.</span>
|
|
<span class="sd"> corner_top_left_char (str): Char used for "nw" corner.</span>
|
|
<span class="sd"> corner_top_right_char (str): Char used for "ne" corner.</span>
|
|
<span class="sd"> corner_bottom_left_char (str): Char used for "sw" corner.</span>
|
|
<span class="sd"> corner_bottom_right_char (str): Char used for "se" corner.</span>
|
|
<span class="sd"> crop_string (str): String to use when cropping sideways, default is `'[...]'`.</span>
|
|
<span class="sd"> crop (bool): Crop contentof cell rather than expand vertically, default=`False`.</span>
|
|
<span class="sd"> enforce_size (bool): If true, the width/height of the cell is</span>
|
|
<span class="sd"> strictly enforced and extra text will be cropped rather than the</span>
|
|
<span class="sd"> cell growing vertically.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> Exception: for impossible cell size requirements where the</span>
|
|
<span class="sd"> border width or height cannot fit, or the content is too</span>
|
|
<span class="sd"> small.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">formatted</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="n">padwidth</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"pad_width"</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
<span class="n">padwidth</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">padwidth</span><span class="p">)</span> <span class="k">if</span> <span class="n">padwidth</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="kc">None</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">pad_left</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"pad_left"</span><span class="p">,</span> <span class="n">padwidth</span> <span class="k">if</span> <span class="n">padwidth</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</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">pad_right</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"pad_right"</span><span class="p">,</span> <span class="n">padwidth</span> <span class="k">if</span> <span class="n">padwidth</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</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">pad_top</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"pad_top"</span><span class="p">,</span> <span class="n">padwidth</span> <span class="k">if</span> <span class="n">padwidth</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="mi">0</span><span class="p">))</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">pad_bottom</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"pad_bottom"</span><span class="p">,</span> <span class="n">padwidth</span> <span class="k">if</span> <span class="n">padwidth</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="mi">0</span><span class="p">))</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">enforce_size</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"enforce_size"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
|
|
|
<span class="c1"># avoid multi-char pad_chars messing up counting</span>
|
|
<span class="n">pad_char</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"pad_char"</span><span class="p">,</span> <span class="s2">" "</span><span class="p">)</span>
|
|
<span class="n">pad_char</span> <span class="o">=</span> <span class="n">pad_char</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">pad_char</span> <span class="k">else</span> <span class="s2">" "</span>
|
|
<span class="n">hpad_char</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"hpad_char"</span><span class="p">,</span> <span class="n">pad_char</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">hpad_char</span> <span class="o">=</span> <span class="n">hpad_char</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">hpad_char</span> <span class="k">else</span> <span class="n">pad_char</span>
|
|
<span class="n">vpad_char</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"vpad_char"</span><span class="p">,</span> <span class="n">pad_char</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">vpad_char</span> <span class="o">=</span> <span class="n">vpad_char</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">vpad_char</span> <span class="k">else</span> <span class="n">pad_char</span>
|
|
|
|
<span class="n">fill_char</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"fill_char"</span><span class="p">,</span> <span class="s2">" "</span><span class="p">)</span>
|
|
<span class="n">fill_char</span> <span class="o">=</span> <span class="n">fill_char</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">fill_char</span> <span class="k">else</span> <span class="s2">" "</span>
|
|
<span class="n">hfill_char</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"hfill_char"</span><span class="p">,</span> <span class="n">fill_char</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">hfill_char</span> <span class="o">=</span> <span class="n">hfill_char</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">hfill_char</span> <span class="k">else</span> <span class="s2">" "</span>
|
|
<span class="n">vfill_char</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"vfill_char"</span><span class="p">,</span> <span class="n">fill_char</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">vfill_char</span> <span class="o">=</span> <span class="n">vfill_char</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">vfill_char</span> <span class="k">else</span> <span class="s2">" "</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">crop_string</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"crop_string"</span><span class="p">,</span> <span class="s2">"[...]"</span><span class="p">)</span>
|
|
|
|
<span class="c1"># borders and corners</span>
|
|
<span class="n">borderwidth</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"border_width"</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">border_left</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"border_left"</span><span class="p">,</span> <span class="n">borderwidth</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">border_right</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"border_right"</span><span class="p">,</span> <span class="n">borderwidth</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">border_top</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"border_top"</span><span class="p">,</span> <span class="n">borderwidth</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">border_bottom</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"border_bottom"</span><span class="p">,</span> <span class="n">borderwidth</span><span class="p">)</span>
|
|
|
|
<span class="n">borderchar</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"border_char"</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">border_left_char</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"border_left_char"</span><span class="p">,</span> <span class="n">borderchar</span> <span class="k">if</span> <span class="n">borderchar</span> <span class="k">else</span> <span class="s2">"|"</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">border_right_char</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
|
|
<span class="s2">"border_right_char"</span><span class="p">,</span> <span class="n">borderchar</span> <span class="k">if</span> <span class="n">borderchar</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">border_left_char</span>
|
|
<span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">border_top_char</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"border_top_char"</span><span class="p">,</span> <span class="n">borderchar</span> <span class="k">if</span> <span class="n">borderchar</span> <span class="k">else</span> <span class="s2">"-"</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">border_bottom_char</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
|
|
<span class="s2">"border_bottom_char"</span><span class="p">,</span> <span class="n">borderchar</span> <span class="k">if</span> <span class="n">borderchar</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">border_top_char</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="n">corner_char</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"corner_char"</span><span class="p">,</span> <span class="s2">"+"</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">corner_top_left_char</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"corner_top_left_char"</span><span class="p">,</span> <span class="n">corner_char</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">corner_top_right_char</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"corner_top_right_char"</span><span class="p">,</span> <span class="n">corner_char</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">corner_bottom_left_char</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"corner_bottom_left_char"</span><span class="p">,</span> <span class="n">corner_char</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">corner_bottom_right_char</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"corner_bottom_right_char"</span><span class="p">,</span> <span class="n">corner_char</span><span class="p">)</span>
|
|
|
|
<span class="c1"># alignments</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">align</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"align"</span><span class="p">,</span> <span class="s2">"l"</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">valign</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"valign"</span><span class="p">,</span> <span class="s2">"c"</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="bp">self</span><span class="o">.</span><span class="n">_split_lines</span><span class="p">(</span><span class="n">_to_ansi</span><span class="p">(</span><span class="n">data</span><span class="p">))</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">raw_width</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">d_len</span><span class="p">(</span><span class="n">line</span><span class="p">)</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</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">raw_height</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="c1"># this is extra trimming required for cels in the middle of a table only</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">trim_horizontal</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">trim_vertical</span> <span class="o">=</span> <span class="mi">0</span>
|
|
|
|
<span class="c1"># width/height is given without left/right or top/bottom padding</span>
|
|
<span class="k">if</span> <span class="s2">"width"</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
|
|
<span class="n">width</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">"width"</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="p">(</span>
|
|
<span class="n">width</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">pad_left</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">pad_right</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">border_left</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">border_right</span>
|
|
<span class="p">)</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">width</span> <span class="o"><=</span> <span class="mi">0</span> <span class="o"><</span> <span class="bp">self</span><span class="o">.</span><span class="n">raw_width</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"Cell width too small - no space for data."</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">width</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">raw_width</span>
|
|
<span class="k">if</span> <span class="s2">"height"</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
|
|
<span class="n">height</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">"height"</span><span class="p">)</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="n">height</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">pad_top</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">pad_bottom</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">border_top</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">border_bottom</span>
|
|
<span class="p">)</span>
|
|
<span class="k">if</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="o"><</span> <span class="bp">self</span><span class="o">.</span><span class="n">raw_height</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"Cell height too small - no space for data."</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">height</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">raw_height</span></div>
|
|
|
|
<span class="c1"># prepare data</span>
|
|
<span class="c1"># self.formatted = self._reformat()</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_crop</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="n">width</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Apply cropping of text.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> text (str): The text to crop.</span>
|
|
<span class="sd"> width (int): The width to crop `text` to.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="n">d_len</span><span class="p">(</span><span class="n">text</span><span class="p">)</span> <span class="o">></span> <span class="n">width</span><span class="p">:</span>
|
|
<span class="n">crop_string</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">crop_string</span>
|
|
<span class="k">return</span> <span class="n">text</span><span class="p">[:</span> <span class="n">width</span> <span class="o">-</span> <span class="n">d_len</span><span class="p">(</span><span class="n">crop_string</span><span class="p">)]</span> <span class="o">+</span> <span class="n">crop_string</span>
|
|
<span class="k">return</span> <span class="n">text</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_reformat</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Apply all EvCells' formatting operations.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_border</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_pad</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_valign</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_align</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_fit_width</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="k">return</span> <span class="n">data</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_split_lines</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">"""</span>
|
|
<span class="sd"> Simply split by linebreaks</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> text (str): text to split.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> split (list): split text.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="n">text</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_fit_width</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Split too-long lines to fit the desired width of the Cell.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> data (str): Text to adjust to the cell's width.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> adjusted data (str): The adjusted text.</span>
|
|
|
|
<span class="sd"> Notes:</span>
|
|
<span class="sd"> This also updates `raw_width`.</span>
|
|
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="n">width</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">width</span>
|
|
<span class="n">adjusted_data</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">data</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="mi">0</span> <span class="o"><</span> <span class="n">width</span> <span class="o"><</span> <span class="n">d_len</span><span class="p">(</span><span class="n">line</span><span class="p">):</span>
|
|
<span class="c1"># replace_whitespace=False, expand_tabs=False is a</span>
|
|
<span class="c1"># fix for ANSIString not supporting expand_tabs/translate</span>
|
|
<span class="n">adjusted_data</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span>
|
|
<span class="p">[</span>
|
|
<span class="n">ANSIString</span><span class="p">(</span><span class="n">part</span> <span class="o">+</span> <span class="n">ANSIString</span><span class="p">(</span><span class="s2">"|n"</span><span class="p">))</span>
|
|
<span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">wrap</span><span class="p">(</span><span class="n">line</span><span class="p">,</span> <span class="n">width</span><span class="o">=</span><span class="n">width</span><span class="p">,</span> <span class="n">drop_whitespace</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
|
<span class="p">]</span>
|
|
<span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">adjusted_data</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">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">enforce_size</span><span class="p">:</span>
|
|
<span class="c1"># don't allow too high cells</span>
|
|
<span class="n">excess</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">adjusted_data</span><span class="p">)</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">height</span>
|
|
<span class="k">if</span> <span class="n">excess</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="c1"># too many lines. Crop and mark last line with crop_string</span>
|
|
<span class="n">crop_string</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">crop_string</span>
|
|
<span class="n">adjusted_data</span> <span class="o">=</span> <span class="n">adjusted_data</span><span class="p">[:</span><span class="o">-</span><span class="n">excess</span><span class="p">]</span>
|
|
<span class="n">crop_string_length</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">crop_string</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">adjusted_data</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span> <span class="o">></span> <span class="n">crop_string_length</span><span class="p">:</span>
|
|
<span class="n">adjusted_data</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">adjusted_data</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">][:</span><span class="o">-</span><span class="n">crop_string_length</span><span class="p">]</span> <span class="o">+</span> <span class="n">crop_string</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">adjusted_data</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+=</span> <span class="n">crop_string</span>
|
|
<span class="k">elif</span> <span class="n">excess</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="c1"># too few lines. Fill to height.</span>
|
|
<span class="n">adjusted_data</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="s2">""</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">excess</span><span class="p">)])</span>
|
|
|
|
<span class="k">return</span> <span class="n">adjusted_data</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_center</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="n">width</span><span class="p">,</span> <span class="n">pad_char</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Horizontally center text on line of certain width, using padding.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> text (str): The text to center.</span>
|
|
<span class="sd"> width (int): How wide the area is (in characters) where `text`</span>
|
|
<span class="sd"> should be centered.</span>
|
|
<span class="sd"> pad_char (str): Which padding character to use.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> text (str): Centered text.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="n">excess</span> <span class="o">=</span> <span class="n">width</span> <span class="o">-</span> <span class="n">d_len</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">excess</span> <span class="o"><=</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">text</span>
|
|
<span class="k">if</span> <span class="n">excess</span> <span class="o">%</span> <span class="mi">2</span><span class="p">:</span>
|
|
<span class="c1"># uneven padding</span>
|
|
<span class="n">narrowside</span> <span class="o">=</span> <span class="p">(</span><span class="n">excess</span> <span class="o">//</span> <span class="mi">2</span><span class="p">)</span> <span class="o">*</span> <span class="n">pad_char</span>
|
|
<span class="n">widerside</span> <span class="o">=</span> <span class="n">narrowside</span> <span class="o">+</span> <span class="n">pad_char</span>
|
|
<span class="k">if</span> <span class="n">width</span> <span class="o">%</span> <span class="mi">2</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">narrowside</span> <span class="o">+</span> <span class="n">text</span> <span class="o">+</span> <span class="n">widerside</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">widerside</span> <span class="o">+</span> <span class="n">text</span> <span class="o">+</span> <span class="n">narrowside</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="c1"># even padding - same on both sides</span>
|
|
<span class="n">side</span> <span class="o">=</span> <span class="p">(</span><span class="n">excess</span> <span class="o">//</span> <span class="mi">2</span><span class="p">)</span> <span class="o">*</span> <span class="n">pad_char</span>
|
|
<span class="k">return</span> <span class="n">side</span> <span class="o">+</span> <span class="n">text</span> <span class="o">+</span> <span class="n">side</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_align</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Align list of rows of cell. Whitespace characters will be stripped</span>
|
|
<span class="sd"> if there is only one whitespace character - otherwise, it's assumed</span>
|
|
<span class="sd"> the caller may be trying some manual formatting in the text.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> data (str): Text to align.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> text (str): Aligned result.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="n">align</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">align</span>
|
|
<span class="n">hfill_char</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">hfill_char</span>
|
|
<span class="n">width</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">width</span>
|
|
<span class="k">if</span> <span class="n">align</span> <span class="o">==</span> <span class="s2">"l"</span><span class="p">:</span>
|
|
<span class="n">lines</span> <span class="o">=</span> <span class="p">[</span>
|
|
<span class="p">(</span>
|
|
<span class="n">line</span><span class="o">.</span><span class="n">lstrip</span><span class="p">(</span><span class="s2">" "</span><span class="p">)</span> <span class="o">+</span> <span class="s2">" "</span>
|
|
<span class="k">if</span> <span class="n">line</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">" "</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">line</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">" "</span><span class="p">)</span>
|
|
<span class="k">else</span> <span class="n">line</span>
|
|
<span class="p">)</span>
|
|
<span class="o">+</span> <span class="n">hfill_char</span> <span class="o">*</span> <span class="p">(</span><span class="n">width</span> <span class="o">-</span> <span class="n">d_len</span><span class="p">(</span><span class="n">line</span><span class="p">))</span>
|
|
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">data</span>
|
|
<span class="p">]</span>
|
|
<span class="k">return</span> <span class="n">lines</span>
|
|
<span class="k">elif</span> <span class="n">align</span> <span class="o">==</span> <span class="s2">"r"</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="p">[</span>
|
|
<span class="n">hfill_char</span> <span class="o">*</span> <span class="p">(</span><span class="n">width</span> <span class="o">-</span> <span class="n">d_len</span><span class="p">(</span><span class="n">line</span><span class="p">))</span>
|
|
<span class="o">+</span> <span class="p">(</span>
|
|
<span class="s2">" "</span> <span class="o">+</span> <span class="n">line</span><span class="o">.</span><span class="n">rstrip</span><span class="p">(</span><span class="s2">" "</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">line</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s2">" "</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">line</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s2">" "</span><span class="p">)</span>
|
|
<span class="k">else</span> <span class="n">line</span>
|
|
<span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">data</span>
|
|
<span class="p">]</span>
|
|
<span class="k">else</span><span class="p">:</span> <span class="c1"># center, 'c'</span>
|
|
<span class="k">return</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_center</span><span class="p">(</span><span class="n">line</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="bp">self</span><span class="o">.</span><span class="n">hfill_char</span><span class="p">)</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">data</span><span class="p">]</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_valign</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Align cell vertically</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> data (str): Text to align.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> text (str): Vertically aligned text.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="n">valign</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">valign</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="n">cheight</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
|
|
<span class="n">excess</span> <span class="o">=</span> <span class="n">height</span> <span class="o">-</span> <span class="n">cheight</span>
|
|
<span class="n">padline</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">vfill_char</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">width</span>
|
|
|
|
<span class="k">if</span> <span class="n">excess</span> <span class="o"><=</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">data</span>
|
|
<span class="c1"># only care if we need to add new lines</span>
|
|
<span class="k">if</span> <span class="n">valign</span> <span class="o">==</span> <span class="s2">"t"</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">data</span> <span class="o">+</span> <span class="p">[</span><span class="n">padline</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">excess</span><span class="p">)]</span>
|
|
<span class="k">elif</span> <span class="n">valign</span> <span class="o">==</span> <span class="s2">"b"</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="p">[</span><span class="n">padline</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">excess</span><span class="p">)]</span> <span class="o">+</span> <span class="n">data</span>
|
|
<span class="k">else</span><span class="p">:</span> <span class="c1"># center</span>
|
|
<span class="n">narrowside</span> <span class="o">=</span> <span class="p">[</span><span class="n">padline</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">excess</span> <span class="o">//</span> <span class="mi">2</span><span class="p">)]</span>
|
|
<span class="n">widerside</span> <span class="o">=</span> <span class="n">narrowside</span> <span class="o">+</span> <span class="p">[</span><span class="n">padline</span><span class="p">]</span>
|
|
<span class="k">if</span> <span class="n">excess</span> <span class="o">%</span> <span class="mi">2</span><span class="p">:</span>
|
|
<span class="c1"># uneven padding</span>
|
|
<span class="k">if</span> <span class="n">height</span> <span class="o">%</span> <span class="mi">2</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">widerside</span> <span class="o">+</span> <span class="n">data</span> <span class="o">+</span> <span class="n">narrowside</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">narrowside</span> <span class="o">+</span> <span class="n">data</span> <span class="o">+</span> <span class="n">widerside</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="c1"># even padding, same on both sides</span>
|
|
<span class="k">return</span> <span class="n">narrowside</span> <span class="o">+</span> <span class="n">data</span> <span class="o">+</span> <span class="n">narrowside</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_pad</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Pad data with extra characters on all sides.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> data (str): Text to pad.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> text (str): Padded text.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="n">left</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">hpad_char</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">pad_left</span>
|
|
<span class="n">right</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">hpad_char</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">pad_right</span>
|
|
<span class="n">vfill</span> <span class="o">=</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="bp">self</span><span class="o">.</span><span class="n">pad_left</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">pad_right</span><span class="p">)</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">vpad_char</span>
|
|
<span class="n">top</span> <span class="o">=</span> <span class="p">[</span><span class="n">vfill</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pad_top</span><span class="p">)]</span>
|
|
<span class="n">bottom</span> <span class="o">=</span> <span class="p">[</span><span class="n">vfill</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pad_bottom</span><span class="p">)]</span>
|
|
<span class="k">return</span> <span class="n">top</span> <span class="o">+</span> <span class="p">[</span><span class="n">left</span> <span class="o">+</span> <span class="n">line</span> <span class="o">+</span> <span class="n">right</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">data</span><span class="p">]</span> <span class="o">+</span> <span class="n">bottom</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_border</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Add borders to the cell.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> data (str): Text to surround with borders.</span>
|
|
|
|
<span class="sd"> Return:</span>
|
|
<span class="sd"> text (str): Text with borders.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="n">left</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">border_left_char</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">border_left</span> <span class="o">+</span> <span class="n">ANSIString</span><span class="p">(</span><span class="s2">"|n"</span><span class="p">)</span>
|
|
<span class="n">right</span> <span class="o">=</span> <span class="n">ANSIString</span><span class="p">(</span><span class="s2">"|n"</span><span class="p">)</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">border_right_char</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">border_right</span>
|
|
|
|
<span class="n">cwidth</span> <span class="o">=</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="bp">self</span><span class="o">.</span><span class="n">pad_left</span>
|
|
<span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">pad_right</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">border_left</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</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">border_right</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="n">vfill</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">corner_top_left_char</span> <span class="k">if</span> <span class="n">left</span> <span class="k">else</span> <span class="s2">""</span>
|
|
<span class="n">vfill</span> <span class="o">+=</span> <span class="n">cwidth</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">border_top_char</span>
|
|
<span class="n">vfill</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">corner_top_right_char</span> <span class="k">if</span> <span class="n">right</span> <span class="k">else</span> <span class="s2">""</span>
|
|
<span class="n">top</span> <span class="o">=</span> <span class="p">[</span><span class="n">vfill</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">border_top</span><span class="p">)]</span>
|
|
|
|
<span class="n">vfill</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">corner_bottom_left_char</span> <span class="k">if</span> <span class="n">left</span> <span class="k">else</span> <span class="s2">""</span>
|
|
<span class="n">vfill</span> <span class="o">+=</span> <span class="n">cwidth</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">border_bottom_char</span>
|
|
<span class="n">vfill</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">corner_bottom_right_char</span> <span class="k">if</span> <span class="n">right</span> <span class="k">else</span> <span class="s2">""</span>
|
|
<span class="n">bottom</span> <span class="o">=</span> <span class="p">[</span><span class="n">vfill</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">border_bottom</span><span class="p">)]</span>
|
|
|
|
<span class="k">return</span> <span class="n">top</span> <span class="o">+</span> <span class="p">[</span><span class="n">left</span> <span class="o">+</span> <span class="n">line</span> <span class="o">+</span> <span class="n">right</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">data</span><span class="p">]</span> <span class="o">+</span> <span class="n">bottom</span>
|
|
|
|
<div class="viewcode-block" id="EvCell.get_min_height"><a class="viewcode-back" href="../../../api/evennia.utils.evtable.html#evennia.utils.evtable.EvCell.get_min_height">[docs]</a> <span class="k">def</span> <span class="nf">get_min_height</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Get the minimum possible height of cell, including at least</span>
|
|
<span class="sd"> one line for data.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> min_height (int): The mininum height of cell.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">pad_top</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">pad_bottom</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">border_bottom</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">border_top</span> <span class="o">+</span> <span class="mi">1</span></div>
|
|
|
|
<div class="viewcode-block" id="EvCell.get_min_width"><a class="viewcode-back" href="../../../api/evennia.utils.evtable.html#evennia.utils.evtable.EvCell.get_min_width">[docs]</a> <span class="k">def</span> <span class="nf">get_min_width</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Get the minimum possible width of cell, including at least one</span>
|
|
<span class="sd"> character-width for data.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> min_width (int): The minimum width of cell.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">pad_left</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">pad_right</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">border_left</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">border_right</span> <span class="o">+</span> <span class="mi">1</span></div>
|
|
|
|
<div class="viewcode-block" id="EvCell.get_height"><a class="viewcode-back" href="../../../api/evennia.utils.evtable.html#evennia.utils.evtable.EvCell.get_height">[docs]</a> <span class="k">def</span> <span class="nf">get_height</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Get natural height of cell, including padding.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> natural_height (int): Height of cell.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">formatted</span><span class="p">)</span> <span class="c1"># if self.formatted else 0</span></div>
|
|
|
|
<div class="viewcode-block" id="EvCell.get_width"><a class="viewcode-back" href="../../../api/evennia.utils.evtable.html#evennia.utils.evtable.EvCell.get_width">[docs]</a> <span class="k">def</span> <span class="nf">get_width</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Get natural width of cell, including padding.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> natural_width (int): Width of cell.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="n">d_len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">formatted</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="c1"># if self.formatted else 0</span></div>
|
|
|
|
<div class="viewcode-block" id="EvCell.replace_data"><a class="viewcode-back" href="../../../api/evennia.utils.evtable.html#evennia.utils.evtable.EvCell.replace_data">[docs]</a> <span class="k">def</span> <span class="nf">replace_data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Replace cell data. This causes a full reformat of the cell.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> data (str): Cell data.</span>
|
|
|
|
<span class="sd"> Notes:</span>
|
|
<span class="sd"> The available keyword arguments are the same as for</span>
|
|
<span class="sd"> `EvCell.__init__`.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_split_lines</span><span class="p">(</span><span class="n">_to_ansi</span><span class="p">(</span><span class="n">data</span><span class="p">))</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">raw_width</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">d_len</span><span class="p">(</span><span class="n">line</span><span class="p">)</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</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">raw_height</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">reformat</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="EvCell.reformat"><a class="viewcode-back" href="../../../api/evennia.utils.evtable.html#evennia.utils.evtable.EvCell.reformat">[docs]</a> <span class="k">def</span> <span class="nf">reformat</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Reformat the EvCell with new options</span>
|
|
|
|
<span class="sd"> Keyword Args:</span>
|
|
<span class="sd"> The available keyword arguments are the same as for `EvCell.__init__`.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> Exception: If the cells cannot shrink enough to accomodate</span>
|
|
<span class="sd"> the options or the data given.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="c1"># keywords that require manipulation</span>
|
|
<span class="n">padwidth</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"pad_width"</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
<span class="n">padwidth</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">padwidth</span><span class="p">)</span> <span class="k">if</span> <span class="n">padwidth</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="kc">None</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">pad_left</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span>
|
|
<span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">"pad_left"</span><span class="p">,</span> <span class="n">padwidth</span> <span class="k">if</span> <span class="n">padwidth</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">pad_left</span><span class="p">)</span>
|
|
<span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">pad_right</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span>
|
|
<span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">"pad_right"</span><span class="p">,</span> <span class="n">padwidth</span> <span class="k">if</span> <span class="n">padwidth</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">pad_right</span><span class="p">)</span>
|
|
<span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">pad_top</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span>
|
|
<span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">"pad_top"</span><span class="p">,</span> <span class="n">padwidth</span> <span class="k">if</span> <span class="n">padwidth</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">pad_top</span><span class="p">)</span>
|
|
<span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">pad_bottom</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span>
|
|
<span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">"pad_bottom"</span><span class="p">,</span> <span class="n">padwidth</span> <span class="k">if</span> <span class="n">padwidth</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">pad_bottom</span><span class="p">)</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">enforce_size</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"enforce_size"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
|
|
|
<span class="n">pad_char</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">"pad_char"</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
<span class="n">hpad_char</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">"hpad_char"</span><span class="p">,</span> <span class="n">pad_char</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">hpad_char</span> <span class="o">=</span> <span class="n">hpad_char</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">hpad_char</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">hpad_char</span>
|
|
<span class="n">vpad_char</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">"vpad_char"</span><span class="p">,</span> <span class="n">pad_char</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">vpad_char</span> <span class="o">=</span> <span class="n">vpad_char</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">vpad_char</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">vpad_char</span>
|
|
|
|
<span class="n">fillchar</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">"fill_char"</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
<span class="n">hfill_char</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">"hfill_char"</span><span class="p">,</span> <span class="n">fillchar</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">hfill_char</span> <span class="o">=</span> <span class="n">hfill_char</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">hfill_char</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">hfill_char</span>
|
|
<span class="n">vfill_char</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">"vfill_char"</span><span class="p">,</span> <span class="n">fillchar</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">vfill_char</span> <span class="o">=</span> <span class="n">vfill_char</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">vfill_char</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">vfill_char</span>
|
|
|
|
<span class="n">borderwidth</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"border_width"</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">border_left</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">"border_left"</span><span class="p">,</span> <span class="n">borderwidth</span> <span class="k">if</span> <span class="n">borderwidth</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">border_left</span>
|
|
<span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">border_right</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">"border_right"</span><span class="p">,</span> <span class="n">borderwidth</span> <span class="k">if</span> <span class="n">borderwidth</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">border_right</span>
|
|
<span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">border_top</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">"border_top"</span><span class="p">,</span> <span class="n">borderwidth</span> <span class="k">if</span> <span class="n">borderwidth</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">border_top</span>
|
|
<span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">border_bottom</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">"border_bottom"</span><span class="p">,</span> <span class="n">borderwidth</span> <span class="k">if</span> <span class="n">borderwidth</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">border_bottom</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="n">borderchar</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"border_char"</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">border_left_char</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">"border_left_char"</span><span class="p">,</span> <span class="n">borderchar</span> <span class="k">if</span> <span class="n">borderchar</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">border_left_char</span>
|
|
<span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">border_right_char</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">"border_right_char"</span><span class="p">,</span> <span class="n">borderchar</span> <span class="k">if</span> <span class="n">borderchar</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">border_right_char</span>
|
|
<span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">border_top_char</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">"border_topchar"</span><span class="p">,</span> <span class="n">borderchar</span> <span class="k">if</span> <span class="n">borderchar</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">border_top_char</span>
|
|
<span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">border_bottom_char</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">"border_bottom_char"</span><span class="p">,</span> <span class="n">borderchar</span> <span class="k">if</span> <span class="n">borderchar</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">border_bottom_char</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="n">corner_char</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"corner_char"</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">corner_top_left_char</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">"corner_top_left"</span><span class="p">,</span> <span class="n">corner_char</span> <span class="k">if</span> <span class="n">corner_char</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">corner_top_left_char</span>
|
|
<span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">corner_top_right_char</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">"corner_top_right"</span><span class="p">,</span>
|
|
<span class="n">corner_char</span> <span class="k">if</span> <span class="n">corner_char</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">corner_top_right_char</span><span class="p">,</span>
|
|
<span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">corner_bottom_left_char</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">"corner_bottom_left"</span><span class="p">,</span>
|
|
<span class="n">corner_char</span> <span class="k">if</span> <span class="n">corner_char</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">corner_bottom_left_char</span><span class="p">,</span>
|
|
<span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">corner_bottom_right_char</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">"corner_bottom_right"</span><span class="p">,</span>
|
|
<span class="n">corner_char</span> <span class="k">if</span> <span class="n">corner_char</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">corner_bottom_right_char</span><span class="p">,</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="c1"># this is used by the table to adjust size of cells with borders in the middle</span>
|
|
<span class="c1"># of the table</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">trim_horizontal</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">"trim_horizontal"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">trim_horizontal</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">trim_vertical</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">"trim_vertical"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">trim_vertical</span><span class="p">)</span>
|
|
|
|
<span class="c1"># fill all other properties</span>
|
|
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
|
<span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
|
|
|
|
<span class="c1"># Handle sizes</span>
|
|
<span class="k">if</span> <span class="s2">"width"</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
|
|
<span class="n">width</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">"width"</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="p">(</span>
|
|
<span class="n">width</span>
|
|
<span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">pad_left</span>
|
|
<span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">pad_right</span>
|
|
<span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">border_left</span>
|
|
<span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">border_right</span>
|
|
<span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">trim_horizontal</span>
|
|
<span class="p">)</span>
|
|
<span class="c1"># if self.width <= 0 and self.raw_width > 0:</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">width</span> <span class="o"><=</span> <span class="mi">0</span> <span class="o"><</span> <span class="bp">self</span><span class="o">.</span><span class="n">raw_width</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"Cell width too small, no room for data."</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="s2">"height"</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
|
|
<span class="n">height</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">"height"</span><span class="p">)</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="n">height</span>
|
|
<span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">pad_top</span>
|
|
<span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">pad_bottom</span>
|
|
<span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">border_top</span>
|
|
<span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">border_bottom</span>
|
|
<span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">trim_vertical</span>
|
|
<span class="p">)</span>
|
|
<span class="k">if</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="o"><</span> <span class="bp">self</span><span class="o">.</span><span class="n">raw_height</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"Cell height too small, no room for data."</span><span class="p">)</span>
|
|
|
|
<span class="c1"># reformat (to new sizes, padding, header and borders)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">formatted</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reformat</span><span class="p">()</span></div>
|
|
|
|
<div class="viewcode-block" id="EvCell.get"><a class="viewcode-back" href="../../../api/evennia.utils.evtable.html#evennia.utils.evtable.EvCell.get">[docs]</a> <span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Get data, padded and aligned in the form of a list of lines.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">formatted</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reformat</span><span class="p">()</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">formatted</span></div>
|
|
|
|
<span class="k">def</span> <span class="fm">__repr__</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">formatted</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reformat</span><span class="p">()</span>
|
|
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">ANSIString</span><span class="p">(</span><span class="s2">"<EvCel </span><span class="si">%s</span><span class="s2">>"</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">formatted</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="s2">"returns cell contents on string form"</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">formatted</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reformat</span><span class="p">()</span>
|
|
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">ANSIString</span><span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">formatted</span><span class="p">))</span></div>
|
|
|
|
|
|
<span class="c1"># EvColumn class</span>
|
|
|
|
|
|
<div class="viewcode-block" id="EvColumn"><a class="viewcode-back" href="../../../api/evennia.utils.evtable.html#evennia.utils.evtable.EvColumn">[docs]</a><span class="k">class</span> <span class="nc">EvColumn</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> This class holds a list of Cells to represent a column of a table.</span>
|
|
<span class="sd"> It holds operations and settings that affect *all* cells in the</span>
|
|
<span class="sd"> column.</span>
|
|
|
|
<span class="sd"> Columns are not intended to be used stand-alone; they should be</span>
|
|
<span class="sd"> incorporated into an EvTable (like EvCells)</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<div class="viewcode-block" id="EvColumn.__init__"><a class="viewcode-back" href="../../../api/evennia.utils.evtable.html#evennia.utils.evtable.EvColumn.__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="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> Text for each row in the column</span>
|
|
|
|
<span class="sd"> Keyword Args:</span>
|
|
<span class="sd"> All `EvCell.__init_` keywords are available, these</span>
|
|
<span class="sd"> settings will be persistently applied to every Cell in the</span>
|
|
<span class="sd"> column.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">options</span> <span class="o">=</span> <span class="n">kwargs</span> <span class="c1"># column-specific options</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">column</span> <span class="o">=</span> <span class="p">[</span><span class="n">EvCell</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="k">for</span> <span class="n">data</span> <span class="ow">in</span> <span class="n">args</span><span class="p">]</span></div>
|
|
|
|
<span class="k">def</span> <span class="nf">_balance</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Make sure to adjust the width of all cells so we form a</span>
|
|
<span class="sd"> coherent and lined-up column. Will enforce column-specific</span>
|
|
<span class="sd"> options to cells.</span>
|
|
|
|
<span class="sd"> Keyword Args:</span>
|
|
<span class="sd"> Extra keywords to modify the column setting. Same keywords</span>
|
|
<span class="sd"> as in `EvCell.__init__`.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="n">col</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">column</span>
|
|
<span class="c1"># fixed options for the column will override those requested in the call!</span>
|
|
<span class="c1"># this is particularly relevant to things like width/height, to avoid</span>
|
|
<span class="c1"># fixed-widths columns from being auto-balanced</span>
|
|
<span class="n">kwargs</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">)</span>
|
|
<span class="c1"># use fixed width or adjust to the largest cell</span>
|
|
<span class="k">if</span> <span class="s2">"width"</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
|
|
<span class="p">[</span>
|
|
<span class="n">cell</span><span class="o">.</span><span class="n">reformat</span><span class="p">()</span> <span class="k">for</span> <span class="n">cell</span> <span class="ow">in</span> <span class="n">col</span>
|
|
<span class="p">]</span> <span class="c1"># this is necessary to get initial widths of all cells</span>
|
|
<span class="n">kwargs</span><span class="p">[</span><span class="s2">"width"</span><span class="p">]</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">cell</span><span class="o">.</span><span class="n">get_width</span><span class="p">()</span> <span class="k">for</span> <span class="n">cell</span> <span class="ow">in</span> <span class="n">col</span><span class="p">)</span> <span class="k">if</span> <span class="n">col</span> <span class="k">else</span> <span class="mi">0</span>
|
|
<span class="p">[</span><span class="n">cell</span><span class="o">.</span><span class="n">reformat</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="k">for</span> <span class="n">cell</span> <span class="ow">in</span> <span class="n">col</span><span class="p">]</span>
|
|
|
|
<div class="viewcode-block" id="EvColumn.add_rows"><a class="viewcode-back" href="../../../api/evennia.utils.evtable.html#evennia.utils.evtable.EvColumn.add_rows">[docs]</a> <span class="k">def</span> <span class="nf">add_rows</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Add new cells to column. They will be inserted as</span>
|
|
<span class="sd"> a series of rows. It will inherit the options</span>
|
|
<span class="sd"> of the rest of the column's cells (use update to change</span>
|
|
<span class="sd"> options).</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> Texts for the new cells</span>
|
|
<span class="sd"> ypos (int, optional): Index position in table before which to insert the</span>
|
|
<span class="sd"> new column. Uses Python indexing, so to insert at the top,</span>
|
|
<span class="sd"> use `ypos=0`. If not given, data will be inserted at the end</span>
|
|
<span class="sd"> of the column.</span>
|
|
|
|
<span class="sd"> Keyword Args:</span>
|
|
<span class="sd"> Available keywods as per `EvCell.__init__`.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="c1"># column-level options override those in kwargs</span>
|
|
<span class="n">options</span> <span class="o">=</span> <span class="p">{</span><span class="o">**</span><span class="n">kwargs</span><span class="p">,</span> <span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">}</span>
|
|
|
|
<span class="n">ypos</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"ypos"</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">ypos</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">ypos</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">column</span><span class="p">):</span>
|
|
<span class="c1"># add to the end</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">column</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="n">EvCell</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="o">**</span><span class="n">options</span><span class="p">)</span> <span class="k">for</span> <span class="n">data</span> <span class="ow">in</span> <span class="n">args</span><span class="p">])</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="c1"># insert cells before given index</span>
|
|
<span class="n">ypos</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">column</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="nb">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">ypos</span><span class="p">)))</span>
|
|
<span class="n">new_cells</span> <span class="o">=</span> <span class="p">[</span><span class="n">EvCell</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="o">**</span><span class="n">options</span><span class="p">)</span> <span class="k">for</span> <span class="n">data</span> <span class="ow">in</span> <span class="n">args</span><span class="p">]</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">column</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">column</span><span class="p">[:</span><span class="n">ypos</span><span class="p">]</span> <span class="o">+</span> <span class="n">new_cells</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">column</span><span class="p">[</span><span class="n">ypos</span><span class="p">:]</span></div>
|
|
<span class="c1"># self._balance(**kwargs)</span>
|
|
|
|
<div class="viewcode-block" id="EvColumn.reformat"><a class="viewcode-back" href="../../../api/evennia.utils.evtable.html#evennia.utils.evtable.EvColumn.reformat">[docs]</a> <span class="k">def</span> <span class="nf">reformat</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Change the options for the column.</span>
|
|
|
|
<span class="sd"> Keyword Args:</span>
|
|
<span class="sd"> Keywords as per `EvCell.__init__`.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_balance</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="EvColumn.reformat_cell"><a class="viewcode-back" href="../../../api/evennia.utils.evtable.html#evennia.utils.evtable.EvColumn.reformat_cell">[docs]</a> <span class="k">def</span> <span class="nf">reformat_cell</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> reformat cell at given index, keeping column options if</span>
|
|
<span class="sd"> necessary.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> index (int): Index location of the cell in the column,</span>
|
|
<span class="sd"> starting from 0 for the first row to Nrows-1.</span>
|
|
|
|
<span class="sd"> Keyword Args:</span>
|
|
<span class="sd"> Keywords as per `EvCell.__init__`.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="c1"># column-level options take precedence here</span>
|
|
<span class="n">kwargs</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">column</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="o">.</span><span class="n">reformat</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
|
|
|
|
<span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="s2">"<EvColumn</span><span class="se">\n</span><span class="s2"> </span><span class="si">%s</span><span class="s2">>"</span> <span class="o">%</span> <span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2"> "</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="nb">repr</span><span class="p">(</span><span class="n">cell</span><span class="p">)</span> <span class="k">for</span> <span class="n">cell</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">column</span><span class="p">]))</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">column</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">column</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">column</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__setitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">column</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__delitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">):</span>
|
|
<span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">column</span><span class="p">[</span><span class="n">index</span><span class="p">]</span></div>
|
|
|
|
|
|
<span class="c1"># Main Evtable class</span>
|
|
|
|
|
|
<div class="viewcode-block" id="EvTable"><a class="viewcode-back" href="../../../api/evennia.utils.evtable.html#evennia.utils.evtable.EvTable">[docs]</a><span class="k">class</span> <span class="nc">EvTable</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> The table class holds a list of EvColumns, each consisting of EvCells so</span>
|
|
<span class="sd"> that the result is a 2D matrix.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<div class="viewcode-block" id="EvTable.__init__"><a class="viewcode-back" href="../../../api/evennia.utils.evtable.html#evennia.utils.evtable.EvTable.__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="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> Header texts for the table.</span>
|
|
|
|
<span class="sd"> Keyword Args:</span>
|
|
<span class="sd"> table (list of lists or list of `EvColumns`, optional):</span>
|
|
<span class="sd"> This is used to build the table in a quick way. If not</span>
|
|
<span class="sd"> given, the table will start out empty and `add_` methods</span>
|
|
<span class="sd"> need to be used to add rows/columns.</span>
|
|
<span class="sd"> header (bool, optional): `True`/`False` - turn off the</span>
|
|
<span class="sd"> header texts (`*args`) being treated as a header (such as</span>
|
|
<span class="sd"> not adding extra underlining)</span>
|
|
<span class="sd"> pad_width (int, optional): How much empty space to pad your cells with</span>
|
|
<span class="sd"> (default is 1)</span>
|
|
<span class="sd"> border (str, optional)): The border style to use. This is one of</span>
|
|
<span class="sd"> - `None` - No border drawing at all.</span>
|
|
<span class="sd"> - "table" - only a border around the whole table.</span>
|
|
<span class="sd"> - "tablecols" - table and column borders. (default)</span>
|
|
<span class="sd"> - "header" - only border under header.</span>
|
|
<span class="sd"> - "cols" - only vertical borders.</span>
|
|
<span class="sd"> - "incols" - vertical borders, no outer edges.</span>
|
|
<span class="sd"> - "rows" - only borders between rows.</span>
|
|
<span class="sd"> - "cells" - border around all cells.</span>
|
|
<span class="sd"> border_width (int, optional): Width of table borders, if border is active.</span>
|
|
<span class="sd"> Note that widths wider than 1 may give artifacts in the corners. Default is 1.</span>
|
|
<span class="sd"> corner_char (str, optional): Character to use in corners when border is active.</span>
|
|
<span class="sd"> Default is `+`.</span>
|
|
<span class="sd"> corner_top_left_char (str, optional): Character used for "nw" corner of table.</span>
|
|
<span class="sd"> Defaults to `corner_char`.</span>
|
|
<span class="sd"> corner_top_right_char (str, optional): Character used for "ne" corner of table.</span>
|
|
<span class="sd"> Defaults to `corner_char`.</span>
|
|
<span class="sd"> corner_bottom_left_char (str, optional): Character used for "sw" corner of table.</span>
|
|
<span class="sd"> Defaults to `corner_char`.</span>
|
|
<span class="sd"> corner_bottom_right_char (str, optional): Character used for "se" corner of table.</span>
|
|
<span class="sd"> Defaults to `corner_char`.</span>
|
|
<span class="sd"> pretty_corners (bool, optional): Use custom characters to</span>
|
|
<span class="sd"> make the table corners look "rounded". Uses UTF-8</span>
|
|
<span class="sd"> characters. Defaults to `False` for maximum compatibility with various displays</span>
|
|
<span class="sd"> that may occationally have issues with UTF-8 characters.</span>
|
|
<span class="sd"> header_line_char (str, optional): Character to use for underlining</span>
|
|
<span class="sd"> the header row (default is '~'). Requires `border` to not be `None`.</span>
|
|
<span class="sd"> width (int, optional): Fixed width of table. If not set,</span>
|
|
<span class="sd"> width is set by the total width of each column. This will</span>
|
|
<span class="sd"> resize individual columns in the vertical direction to fit.</span>
|
|
<span class="sd"> height (int, optional): Fixed height of table. Defaults to being unset. Width is</span>
|
|
<span class="sd"> still given precedence. If given, table cells will crop text rather</span>
|
|
<span class="sd"> than expand vertically.</span>
|
|
<span class="sd"> evenwidth (bool, optional): Used with the `width` keyword. Adjusts columns to have as</span>
|
|
<span class="sd"> even width as possible. This often looks best also for mixed-length tables. Default</span>
|
|
<span class="sd"> is `False`.</span>
|
|
<span class="sd"> maxwidth (int, optional): This will set a maximum width</span>
|
|
<span class="sd"> of the table while allowing it to be smaller. Only if it grows wider than this</span>
|
|
<span class="sd"> size will it be resized by expanding horizontally (or crop `height` is given).</span>
|
|
<span class="sd"> This keyword has no meaning if `width` is set.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> Exception: If given erroneous input or width settings for the data.</span>
|
|
|
|
<span class="sd"> Notes:</span>
|
|
<span class="sd"> Beyond those table-specific keywords, the non-overlapping keywords</span>
|
|
<span class="sd"> of `EvCell.__init__` are also available. These will be passed down</span>
|
|
<span class="sd"> to every cell in the table.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="c1"># at this point table is a 2D grid - a list of columns</span>
|
|
<span class="c1"># x is the column position, y the row</span>
|
|
<span class="n">table</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">"table"</span><span class="p">,</span> <span class="p">[])</span>
|
|
|
|
<span class="c1"># header is a list of texts. We merge it to the table's top</span>
|
|
<span class="n">header</span> <span class="o">=</span> <span class="p">[</span><span class="n">_to_ansi</span><span class="p">(</span><span class="n">head</span><span class="p">)</span> <span class="k">for</span> <span class="n">head</span> <span class="ow">in</span> <span class="n">args</span><span class="p">]</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">header</span> <span class="o">=</span> <span class="n">header</span> <span class="o">!=</span> <span class="p">[]</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">header</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">table</span><span class="p">:</span>
|
|
<span class="n">excess</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">header</span><span class="p">)</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="n">table</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">excess</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="c1"># header bigger than table</span>
|
|
<span class="n">table</span><span class="o">.</span><span class="n">extend</span><span class="p">([]</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">excess</span><span class="p">))</span>
|
|
<span class="k">elif</span> <span class="n">excess</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="c1"># too short header</span>
|
|
<span class="n">header</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">_to_ansi</span><span class="p">([</span><span class="s2">""</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="n">excess</span><span class="p">))]))</span>
|
|
<span class="k">for</span> <span class="n">ix</span><span class="p">,</span> <span class="n">heading</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">header</span><span class="p">):</span>
|
|
<span class="n">table</span><span class="p">[</span><span class="n">ix</span><span class="p">]</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">heading</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">table</span> <span class="o">=</span> <span class="p">[[</span><span class="n">heading</span><span class="p">]</span> <span class="k">for</span> <span class="n">heading</span> <span class="ow">in</span> <span class="n">header</span><span class="p">]</span>
|
|
<span class="c1"># even though we inserted the header, we can still turn off</span>
|
|
<span class="c1"># header border underling etc. We only allow this if a header</span>
|
|
<span class="c1"># was actually set</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">header</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">"header"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">header</span><span class="p">)</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">header</span> <span class="k">else</span> <span class="kc">False</span>
|
|
<span class="n">hchar</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">"header_line_char"</span><span class="p">,</span> <span class="s2">"~"</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">header_line_char</span> <span class="o">=</span> <span class="n">hchar</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">hchar</span> <span class="k">else</span> <span class="s2">"~"</span>
|
|
|
|
<span class="n">border</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">"border"</span><span class="p">,</span> <span class="s2">"tablecols"</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">border</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">border</span> <span class="o">=</span> <span class="s2">"none"</span>
|
|
<span class="k">if</span> <span class="n">border</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span>
|
|
<span class="s2">"none"</span><span class="p">,</span>
|
|
<span class="s2">"table"</span><span class="p">,</span>
|
|
<span class="s2">"tablecols"</span><span class="p">,</span>
|
|
<span class="s2">"header"</span><span class="p">,</span>
|
|
<span class="s2">"incols"</span><span class="p">,</span>
|
|
<span class="s2">"cols"</span><span class="p">,</span>
|
|
<span class="s2">"rows"</span><span class="p">,</span>
|
|
<span class="s2">"cells"</span><span class="p">,</span>
|
|
<span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"Unsupported border type: '</span><span class="si">%s</span><span class="s2">'"</span> <span class="o">%</span> <span class="n">border</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">border</span> <span class="o">=</span> <span class="n">border</span>
|
|
|
|
<span class="c1"># border settings are passed into Cell as well (so kwargs.get and not pop)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">border_width</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"border_width"</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">corner_char</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"corner_char"</span><span class="p">,</span> <span class="s2">"+"</span><span class="p">)</span>
|
|
<span class="n">pcorners</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">"pretty_corners"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">corner_top_left_char</span> <span class="o">=</span> <span class="n">_to_ansi</span><span class="p">(</span>
|
|
<span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">"corner_top_left_char"</span><span class="p">,</span> <span class="s2">"."</span> <span class="k">if</span> <span class="n">pcorners</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">corner_char</span><span class="p">)</span>
|
|
<span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">corner_top_right_char</span> <span class="o">=</span> <span class="n">_to_ansi</span><span class="p">(</span>
|
|
<span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">"corner_top_right_char"</span><span class="p">,</span> <span class="s2">"."</span> <span class="k">if</span> <span class="n">pcorners</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">corner_char</span><span class="p">)</span>
|
|
<span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">corner_bottom_left_char</span> <span class="o">=</span> <span class="n">_to_ansi</span><span class="p">(</span>
|
|
<span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">"corner_bottom_left_char"</span><span class="p">,</span> <span class="s2">" "</span> <span class="k">if</span> <span class="n">pcorners</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">corner_char</span><span class="p">)</span>
|
|
<span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">corner_bottom_right_char</span> <span class="o">=</span> <span class="n">_to_ansi</span><span class="p">(</span>
|
|
<span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">"corner_bottom_right_char"</span><span class="p">,</span> <span class="s2">" "</span> <span class="k">if</span> <span class="n">pcorners</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">corner_char</span><span class="p">)</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">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">"width"</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">height</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">"height"</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">evenwidth</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">"evenwidth"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">maxwidth</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">"maxwidth"</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">maxwidth</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">width</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">maxwidth</span> <span class="o"><</span> <span class="bp">self</span><span class="o">.</span><span class="n">width</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"table maxwidth < table width!"</span><span class="p">)</span>
|
|
<span class="c1"># size in cell cols/rows</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ncols</span> <span class="o">=</span> <span class="nb">len</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">nrows</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">col</span><span class="p">)</span> <span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="n">table</span><span class="p">)</span> <span class="k">if</span> <span class="n">table</span> <span class="k">else</span> <span class="mi">0</span>
|
|
<span class="c1"># size in characters (gets set when _balance is called)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">nwidth</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">nheight</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="c1"># save options</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">options</span> <span class="o">=</span> <span class="n">kwargs</span>
|
|
|
|
<span class="c1"># use the temporary table to generate the table on the fly, as a list of EvColumns</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">table</span> <span class="o">=</span> <span class="p">[</span><span class="n">EvColumn</span><span class="p">(</span><span class="o">*</span><span class="n">col</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="n">table</span><span class="p">]</span>
|
|
|
|
<span class="c1"># this is the actual working table</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">worktable</span> <span class="o">=</span> <span class="kc">None</span></div>
|
|
|
|
<span class="c1"># balance the table</span>
|
|
<span class="c1"># self._balance()</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_cellborders</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ix</span><span class="p">,</span> <span class="n">iy</span><span class="p">,</span> <span class="n">nx</span><span class="p">,</span> <span class="n">ny</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Adds borders to the table by adjusting the input kwarg to</span>
|
|
<span class="sd"> instruct cells to build a border in the right positions.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> ix (int): x index positions in table.</span>
|
|
<span class="sd"> iy (int): y index positions in table.</span>
|
|
<span class="sd"> nx (int): x size of table.</span>
|
|
<span class="sd"> ny (int): y size of table.</span>
|
|
|
|
<span class="sd"> Keyword Args:</span>
|
|
<span class="sd"> Keywords as per `EvTable.__init__`.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> table (str): string with the correct borders.</span>
|
|
|
|
<span class="sd"> Notes:</span>
|
|
<span class="sd"> A copy of the kwarg is returned to the cell. This is method</span>
|
|
<span class="sd"> is called by self._borders.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="n">ret</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
|
|
|
<span class="c1"># handle the various border modes</span>
|
|
<span class="n">border</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">border</span>
|
|
<span class="n">header</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">header</span>
|
|
|
|
<span class="n">bwidth</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">border_width</span>
|
|
<span class="n">headchar</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">header_line_char</span>
|
|
|
|
<span class="k">def</span> <span class="nf">corners</span><span class="p">(</span><span class="n">ret</span><span class="p">):</span>
|
|
<span class="sd">"""Handle corners of table"""</span>
|
|
<span class="k">if</span> <span class="n">ix</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">iy</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">ret</span><span class="p">[</span><span class="s2">"corner_top_left_char"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">corner_top_left_char</span>
|
|
<span class="k">if</span> <span class="n">ix</span> <span class="o">==</span> <span class="n">nx</span> <span class="ow">and</span> <span class="n">iy</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">ret</span><span class="p">[</span><span class="s2">"corner_top_right_char"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">corner_top_right_char</span>
|
|
<span class="k">if</span> <span class="n">ix</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">iy</span> <span class="o">==</span> <span class="n">ny</span><span class="p">:</span>
|
|
<span class="n">ret</span><span class="p">[</span><span class="s2">"corner_bottom_left_char"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">corner_bottom_left_char</span>
|
|
<span class="k">if</span> <span class="n">ix</span> <span class="o">==</span> <span class="n">nx</span> <span class="ow">and</span> <span class="n">iy</span> <span class="o">==</span> <span class="n">ny</span><span class="p">:</span>
|
|
<span class="n">ret</span><span class="p">[</span><span class="s2">"corner_bottom_right_char"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">corner_bottom_right_char</span>
|
|
<span class="k">return</span> <span class="n">ret</span>
|
|
|
|
<span class="k">def</span> <span class="nf">left_edge</span><span class="p">(</span><span class="n">ret</span><span class="p">):</span>
|
|
<span class="sd">"""add vertical border along left table edge"""</span>
|
|
<span class="k">if</span> <span class="n">ix</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">ret</span><span class="p">[</span><span class="s2">"border_left"</span><span class="p">]</span> <span class="o">=</span> <span class="n">bwidth</span>
|
|
<span class="c1"># ret["trim_horizontal"] = bwidth</span>
|
|
<span class="k">return</span> <span class="n">ret</span>
|
|
|
|
<span class="k">def</span> <span class="nf">top_edge</span><span class="p">(</span><span class="n">ret</span><span class="p">):</span>
|
|
<span class="sd">"""add border along top table edge"""</span>
|
|
<span class="k">if</span> <span class="n">iy</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">ret</span><span class="p">[</span><span class="s2">"border_top"</span><span class="p">]</span> <span class="o">=</span> <span class="n">bwidth</span>
|
|
<span class="c1"># ret["trim_vertical"] = bwidth</span>
|
|
<span class="k">return</span> <span class="n">ret</span>
|
|
|
|
<span class="k">def</span> <span class="nf">right_edge</span><span class="p">(</span><span class="n">ret</span><span class="p">):</span>
|
|
<span class="sd">"""add vertical border along right table edge"""</span>
|
|
<span class="k">if</span> <span class="n">ix</span> <span class="o">==</span> <span class="n">nx</span><span class="p">:</span> <span class="c1"># and 0 < iy < ny:</span>
|
|
<span class="n">ret</span><span class="p">[</span><span class="s2">"border_right"</span><span class="p">]</span> <span class="o">=</span> <span class="n">bwidth</span>
|
|
<span class="c1"># ret["trim_horizontal"] = 0</span>
|
|
<span class="k">return</span> <span class="n">ret</span>
|
|
|
|
<span class="k">def</span> <span class="nf">bottom_edge</span><span class="p">(</span><span class="n">ret</span><span class="p">):</span>
|
|
<span class="sd">"""add border along bottom table edge"""</span>
|
|
<span class="k">if</span> <span class="n">iy</span> <span class="o">==</span> <span class="n">ny</span><span class="p">:</span>
|
|
<span class="n">ret</span><span class="p">[</span><span class="s2">"border_bottom"</span><span class="p">]</span> <span class="o">=</span> <span class="n">bwidth</span>
|
|
<span class="c1"># ret["trim_vertical"] = bwidth</span>
|
|
<span class="k">return</span> <span class="n">ret</span>
|
|
|
|
<span class="k">def</span> <span class="nf">cols</span><span class="p">(</span><span class="n">ret</span><span class="p">):</span>
|
|
<span class="sd">"""Adding vertical borders inside the table"""</span>
|
|
<span class="k">if</span> <span class="mi">0</span> <span class="o"><=</span> <span class="n">ix</span> <span class="o"><</span> <span class="n">nx</span><span class="p">:</span>
|
|
<span class="n">ret</span><span class="p">[</span><span class="s2">"border_right"</span><span class="p">]</span> <span class="o">=</span> <span class="n">bwidth</span>
|
|
<span class="k">return</span> <span class="n">ret</span>
|
|
|
|
<span class="k">def</span> <span class="nf">rows</span><span class="p">(</span><span class="n">ret</span><span class="p">):</span>
|
|
<span class="sd">"""Adding horizontal borders inside the table"""</span>
|
|
<span class="k">if</span> <span class="mi">0</span> <span class="o"><=</span> <span class="n">iy</span> <span class="o"><</span> <span class="n">ny</span><span class="p">:</span>
|
|
<span class="n">ret</span><span class="p">[</span><span class="s2">"border_bottom"</span><span class="p">]</span> <span class="o">=</span> <span class="n">bwidth</span>
|
|
<span class="k">return</span> <span class="n">ret</span>
|
|
|
|
<span class="k">def</span> <span class="nf">head</span><span class="p">(</span><span class="n">ret</span><span class="p">):</span>
|
|
<span class="sd">"""Add header underline"""</span>
|
|
<span class="k">if</span> <span class="n">iy</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="c1"># put different bottom line for header</span>
|
|
<span class="n">ret</span><span class="p">[</span><span class="s2">"border_bottom"</span><span class="p">]</span> <span class="o">=</span> <span class="n">bwidth</span>
|
|
<span class="n">ret</span><span class="p">[</span><span class="s2">"border_bottom_char"</span><span class="p">]</span> <span class="o">=</span> <span class="n">headchar</span>
|
|
<span class="k">return</span> <span class="n">ret</span>
|
|
|
|
<span class="c1"># use the helper functions to define various</span>
|
|
<span class="c1"># table "styles"</span>
|
|
|
|
<span class="k">if</span> <span class="n">border</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">"table"</span><span class="p">,</span> <span class="s2">"tablecols"</span><span class="p">,</span> <span class="s2">"cells"</span><span class="p">):</span>
|
|
<span class="n">ret</span> <span class="o">=</span> <span class="n">bottom_edge</span><span class="p">(</span><span class="n">right_edge</span><span class="p">(</span><span class="n">top_edge</span><span class="p">(</span><span class="n">left_edge</span><span class="p">(</span><span class="n">corners</span><span class="p">(</span><span class="n">ret</span><span class="p">)))))</span>
|
|
<span class="k">if</span> <span class="n">border</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">"cols"</span><span class="p">,</span> <span class="s2">"tablecols"</span><span class="p">,</span> <span class="s2">"cells"</span><span class="p">):</span>
|
|
<span class="n">ret</span> <span class="o">=</span> <span class="n">cols</span><span class="p">(</span><span class="n">right_edge</span><span class="p">(</span><span class="n">left_edge</span><span class="p">(</span><span class="n">ret</span><span class="p">)))</span>
|
|
<span class="k">if</span> <span class="n">border</span> <span class="ow">in</span> <span class="s2">"incols"</span><span class="p">:</span>
|
|
<span class="n">ret</span> <span class="o">=</span> <span class="n">cols</span><span class="p">(</span><span class="n">ret</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">border</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">"rows"</span><span class="p">,</span> <span class="s2">"cells"</span><span class="p">):</span>
|
|
<span class="n">ret</span> <span class="o">=</span> <span class="n">rows</span><span class="p">(</span><span class="n">bottom_edge</span><span class="p">(</span><span class="n">top_edge</span><span class="p">(</span><span class="n">ret</span><span class="p">)))</span>
|
|
<span class="k">if</span> <span class="n">header</span> <span class="ow">and</span> <span class="n">border</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">"none"</span><span class="p">,</span> <span class="kc">None</span><span class="p">):</span>
|
|
<span class="n">ret</span> <span class="o">=</span> <span class="n">head</span><span class="p">(</span><span class="n">ret</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="n">ret</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_borders</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Add borders to table. This is called from self._balance.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">nx</span><span class="p">,</span> <span class="n">ny</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ncols</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">nrows</span> <span class="o">-</span> <span class="mi">1</span>
|
|
<span class="n">options</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">options</span>
|
|
<span class="k">for</span> <span class="n">ix</span><span class="p">,</span> <span class="n">col</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">worktable</span><span class="p">):</span>
|
|
<span class="k">for</span> <span class="n">iy</span><span class="p">,</span> <span class="n">cell</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">col</span><span class="p">):</span>
|
|
<span class="n">col</span><span class="o">.</span><span class="n">reformat_cell</span><span class="p">(</span><span class="n">iy</span><span class="p">,</span> <span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">_cellborders</span><span class="p">(</span><span class="n">ix</span><span class="p">,</span> <span class="n">iy</span><span class="p">,</span> <span class="n">nx</span><span class="p">,</span> <span class="n">ny</span><span class="p">,</span> <span class="o">**</span><span class="n">options</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_balance</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Balance the table. This means to make sure</span>
|
|
<span class="sd"> all cells on the same row have the same height,</span>
|
|
<span class="sd"> that all columns have the same number of rows</span>
|
|
<span class="sd"> and that the table fits within the given width.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="c1"># we make all modifications on a working copy of the</span>
|
|
<span class="c1"># actual table. This allows us to add columns/rows</span>
|
|
<span class="c1"># and re-balance over and over without issue.</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">worktable</span> <span class="o">=</span> <span class="n">deepcopy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">table</span><span class="p">)</span>
|
|
<span class="c1"># self._borders()</span>
|
|
<span class="c1"># return</span>
|
|
<span class="n">options</span> <span class="o">=</span> <span class="n">copy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">)</span>
|
|
|
|
<span class="c1"># balance number of rows to make a rectangular table</span>
|
|
<span class="c1"># column by column</span>
|
|
<span class="n">ncols</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">worktable</span><span class="p">)</span>
|
|
<span class="n">nrows</span> <span class="o">=</span> <span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="n">col</span><span class="p">)</span> <span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">worktable</span><span class="p">]</span>
|
|
<span class="n">nrowmax</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">nrows</span><span class="p">)</span> <span class="k">if</span> <span class="n">nrows</span> <span class="k">else</span> <span class="mi">0</span>
|
|
<span class="k">for</span> <span class="n">icol</span><span class="p">,</span> <span class="n">nrow</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">nrows</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">worktable</span><span class="p">[</span><span class="n">icol</span><span class="p">]</span><span class="o">.</span><span class="n">reformat</span><span class="p">(</span><span class="o">**</span><span class="n">options</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">nrow</span> <span class="o"><</span> <span class="n">nrowmax</span><span class="p">:</span>
|
|
<span class="c1"># add more rows to too-short columns</span>
|
|
<span class="n">empty_rows</span> <span class="o">=</span> <span class="p">[</span><span class="s2">""</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">nrowmax</span> <span class="o">-</span> <span class="n">nrow</span><span class="p">)]</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">worktable</span><span class="p">[</span><span class="n">icol</span><span class="p">]</span><span class="o">.</span><span class="n">add_rows</span><span class="p">(</span><span class="o">*</span><span class="n">empty_rows</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ncols</span> <span class="o">=</span> <span class="n">ncols</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">nrows</span> <span class="o">=</span> <span class="n">nrowmax</span>
|
|
|
|
<span class="c1"># add borders - these add to the width/height, so we must do this before calculating</span>
|
|
<span class="c1"># width/height</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_borders</span><span class="p">()</span>
|
|
|
|
<span class="c1"># equalize widths within each column</span>
|
|
<span class="n">cwidths</span> <span class="o">=</span> <span class="p">[</span><span class="nb">max</span><span class="p">(</span><span class="n">cell</span><span class="o">.</span><span class="n">get_width</span><span class="p">()</span> <span class="k">for</span> <span class="n">cell</span> <span class="ow">in</span> <span class="n">col</span><span class="p">)</span> <span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">worktable</span><span class="p">]</span>
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">width</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">maxwidth</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">maxwidth</span> <span class="o"><</span> <span class="nb">sum</span><span class="p">(</span><span class="n">cwidths</span><span class="p">):</span>
|
|
<span class="c1"># we set a table width. Horizontal cells will be evenly distributed and</span>
|
|
<span class="c1"># expand vertically as needed (unless self.height is set, see below)</span>
|
|
|
|
<span class="c1"># use fixed width, or set to maxwidth</span>
|
|
<span class="n">width</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">width</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">width</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">maxwidth</span>
|
|
|
|
<span class="k">if</span> <span class="n">ncols</span><span class="p">:</span>
|
|
<span class="c1"># get minimum possible cell widths for each row</span>
|
|
<span class="n">cwidths_min</span> <span class="o">=</span> <span class="p">[</span><span class="nb">max</span><span class="p">(</span><span class="n">cell</span><span class="o">.</span><span class="n">get_min_width</span><span class="p">()</span> <span class="k">for</span> <span class="n">cell</span> <span class="ow">in</span> <span class="n">col</span><span class="p">)</span> <span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">worktable</span><span class="p">]</span>
|
|
<span class="n">cwmin</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">(</span><span class="n">cwidths_min</span><span class="p">)</span>
|
|
|
|
<span class="c1"># get which cols have separately set widths - these should be locked</span>
|
|
<span class="c1"># note that we need to remove cwidths_min for each lock to avoid counting</span>
|
|
<span class="c1"># it twice (in cwmin and in locked_cols)</span>
|
|
<span class="n">locked_cols</span> <span class="o">=</span> <span class="p">{</span>
|
|
<span class="n">icol</span><span class="p">:</span> <span class="n">col</span><span class="o">.</span><span class="n">options</span><span class="p">[</span><span class="s2">"width"</span><span class="p">]</span> <span class="o">-</span> <span class="n">cwidths_min</span><span class="p">[</span><span class="n">icol</span><span class="p">]</span>
|
|
<span class="k">for</span> <span class="n">icol</span><span class="p">,</span> <span class="n">col</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">worktable</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="s2">"width"</span> <span class="ow">in</span> <span class="n">col</span><span class="o">.</span><span class="n">options</span>
|
|
<span class="p">}</span>
|
|
<span class="n">locked_width</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">(</span><span class="n">locked_cols</span><span class="o">.</span><span class="n">values</span><span class="p">())</span>
|
|
|
|
<span class="n">excess</span> <span class="o">=</span> <span class="n">width</span> <span class="o">-</span> <span class="n">cwmin</span> <span class="o">-</span> <span class="n">locked_width</span>
|
|
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">locked_cols</span><span class="p">)</span> <span class="o">>=</span> <span class="n">ncols</span> <span class="ow">and</span> <span class="n">excess</span><span class="p">:</span>
|
|
<span class="c1"># we can't adjust the width at all - all columns are locked</span>
|
|
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span>
|
|
<span class="s2">"Cannot balance table to width </span><span class="si">%s</span><span class="s2"> - "</span>
|
|
<span class="s2">"all columns have a set, fixed width summing to </span><span class="si">%s</span><span class="s2">!"</span>
|
|
<span class="o">%</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="nb">sum</span><span class="p">(</span><span class="n">cwidths</span><span class="p">))</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">excess</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="c1"># the locked cols makes it impossible</span>
|
|
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span>
|
|
<span class="s2">"Cannot shrink table width to </span><span class="si">%s</span><span class="s2">. "</span>
|
|
<span class="s2">"Minimum size (and/or fixed-width columns) "</span>
|
|
<span class="s2">"sets minimum at </span><span class="si">%s</span><span class="s2">."</span> <span class="o">%</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">cwmin</span> <span class="o">+</span> <span class="n">locked_width</span><span class="p">)</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">evenwidth</span><span class="p">:</span>
|
|
<span class="c1"># make each column of equal width</span>
|
|
<span class="c1"># use cwidths as a work-array to track weights</span>
|
|
<span class="n">cwidths</span> <span class="o">=</span> <span class="n">copy</span><span class="p">(</span><span class="n">cwidths_min</span><span class="p">)</span>
|
|
<span class="n">correction</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="k">while</span> <span class="n">correction</span> <span class="o"><</span> <span class="n">excess</span><span class="p">:</span>
|
|
<span class="c1"># flood-fill the minimum table starting with the smallest columns</span>
|
|
<span class="n">ci</span> <span class="o">=</span> <span class="n">cwidths</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="nb">min</span><span class="p">(</span><span class="n">cwidths</span><span class="p">))</span>
|
|
<span class="k">if</span> <span class="n">ci</span> <span class="ow">in</span> <span class="n">locked_cols</span><span class="p">:</span>
|
|
<span class="c1"># locked column, make sure it's not picked again</span>
|
|
<span class="n">cwidths</span><span class="p">[</span><span class="n">ci</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">9999</span>
|
|
<span class="n">cwidths_min</span><span class="p">[</span><span class="n">ci</span><span class="p">]</span> <span class="o">=</span> <span class="n">locked_cols</span><span class="p">[</span><span class="n">ci</span><span class="p">]</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">cwidths_min</span><span class="p">[</span><span class="n">ci</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span>
|
|
<span class="n">correction</span> <span class="o">+=</span> <span class="mi">1</span>
|
|
<span class="n">cwidths</span> <span class="o">=</span> <span class="n">cwidths_min</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="c1"># make each column expand more proportional to their data size</span>
|
|
<span class="c1"># we use cwidth as a work-array to track weights</span>
|
|
<span class="n">correction</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="k">while</span> <span class="n">correction</span> <span class="o"><</span> <span class="n">excess</span><span class="p">:</span>
|
|
<span class="c1"># fill wider columns first</span>
|
|
<span class="n">ci</span> <span class="o">=</span> <span class="n">cwidths</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="nb">max</span><span class="p">(</span><span class="n">cwidths</span><span class="p">))</span>
|
|
<span class="k">if</span> <span class="n">ci</span> <span class="ow">in</span> <span class="n">locked_cols</span><span class="p">:</span>
|
|
<span class="c1"># locked column, make sure it's not picked again</span>
|
|
<span class="n">cwidths</span><span class="p">[</span><span class="n">ci</span><span class="p">]</span> <span class="o">-=</span> <span class="mi">9999</span>
|
|
<span class="n">cwidths_min</span><span class="p">[</span><span class="n">ci</span><span class="p">]</span> <span class="o">=</span> <span class="n">locked_cols</span><span class="p">[</span><span class="n">ci</span><span class="p">]</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">cwidths_min</span><span class="p">[</span><span class="n">ci</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span>
|
|
<span class="n">correction</span> <span class="o">+=</span> <span class="mi">1</span>
|
|
<span class="c1"># give a just changed col less prio next run</span>
|
|
<span class="n">cwidths</span><span class="p">[</span><span class="n">ci</span><span class="p">]</span> <span class="o">-=</span> <span class="mi">3</span>
|
|
<span class="n">cwidths</span> <span class="o">=</span> <span class="n">cwidths_min</span>
|
|
|
|
<span class="c1"># reformat worktable (for width align)</span>
|
|
<span class="k">for</span> <span class="n">ix</span><span class="p">,</span> <span class="n">col</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">worktable</span><span class="p">):</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">col</span><span class="o">.</span><span class="n">reformat</span><span class="p">(</span><span class="n">width</span><span class="o">=</span><span class="n">cwidths</span><span class="p">[</span><span class="n">ix</span><span class="p">],</span> <span class="o">**</span><span class="n">options</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
|
|
<span class="k">raise</span>
|
|
|
|
<span class="c1"># equalize heights for each row (we must do this here, since it may have changed to fit new</span>
|
|
<span class="c1"># widths)</span>
|
|
<span class="n">cheights</span> <span class="o">=</span> <span class="p">[</span>
|
|
<span class="nb">max</span><span class="p">(</span><span class="n">cell</span><span class="o">.</span><span class="n">get_height</span><span class="p">()</span> <span class="k">for</span> <span class="n">cell</span> <span class="ow">in</span> <span class="p">(</span><span class="n">col</span><span class="p">[</span><span class="n">iy</span><span class="p">]</span> <span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">worktable</span><span class="p">))</span>
|
|
<span class="k">for</span> <span class="n">iy</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">nrowmax</span><span class="p">)</span>
|
|
<span class="p">]</span>
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">height</span><span class="p">:</span>
|
|
<span class="c1"># if we are fixing the table height, it means cells must crop text instead of resizing.</span>
|
|
<span class="k">if</span> <span class="n">nrowmax</span><span class="p">:</span>
|
|
|
|
<span class="c1"># get minimum possible cell heights for each column</span>
|
|
<span class="n">cheights_min</span> <span class="o">=</span> <span class="p">[</span>
|
|
<span class="nb">max</span><span class="p">(</span><span class="n">cell</span><span class="o">.</span><span class="n">get_min_height</span><span class="p">()</span> <span class="k">for</span> <span class="n">cell</span> <span class="ow">in</span> <span class="p">(</span><span class="n">col</span><span class="p">[</span><span class="n">iy</span><span class="p">]</span> <span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">worktable</span><span class="p">))</span>
|
|
<span class="k">for</span> <span class="n">iy</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">nrowmax</span><span class="p">)</span>
|
|
<span class="p">]</span>
|
|
<span class="n">chmin</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">(</span><span class="n">cheights_min</span><span class="p">)</span>
|
|
|
|
<span class="c1"># get which cols have separately set heights - these should be locked</span>
|
|
<span class="c1"># note that we need to remove cheights_min for each lock to avoid counting</span>
|
|
<span class="c1"># it twice (in chmin and in locked_cols)</span>
|
|
<span class="n">locked_cols</span> <span class="o">=</span> <span class="p">{</span>
|
|
<span class="n">icol</span><span class="p">:</span> <span class="n">col</span><span class="o">.</span><span class="n">options</span><span class="p">[</span><span class="s2">"height"</span><span class="p">]</span> <span class="o">-</span> <span class="n">cheights_min</span><span class="p">[</span><span class="n">icol</span><span class="p">]</span>
|
|
<span class="k">for</span> <span class="n">icol</span><span class="p">,</span> <span class="n">col</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">worktable</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="s2">"height"</span> <span class="ow">in</span> <span class="n">col</span><span class="o">.</span><span class="n">options</span>
|
|
<span class="p">}</span>
|
|
<span class="n">locked_height</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">(</span><span class="n">locked_cols</span><span class="o">.</span><span class="n">values</span><span class="p">())</span>
|
|
|
|
<span class="n">excess</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="n">chmin</span> <span class="o">-</span> <span class="n">locked_height</span>
|
|
|
|
<span class="k">if</span> <span class="n">chmin</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="c1"># we cannot shrink any more</span>
|
|
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span>
|
|
<span class="s2">"Cannot shrink table height to </span><span class="si">%s</span><span class="s2">. Minimum "</span>
|
|
<span class="s2">"size (and/or fixed-height rows) sets minimum at </span><span class="si">%s</span><span class="s2">."</span>
|
|
<span class="o">%</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="n">chmin</span> <span class="o">+</span> <span class="n">locked_height</span><span class="p">)</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="c1"># Add all the excess at the end of the table</span>
|
|
<span class="c1"># Note: Older solutions tried to balance individual</span>
|
|
<span class="c1"># rows' vsize. This could lead to empty rows that</span>
|
|
<span class="c1"># looked like a bug. This solution instead</span>
|
|
<span class="c1"># adds empty rows at the end which is less sophisticated</span>
|
|
<span class="c1"># but much more visually consistent.</span>
|
|
<span class="n">cheights_min</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+=</span> <span class="n">excess</span>
|
|
<span class="n">cheights</span> <span class="o">=</span> <span class="n">cheights_min</span>
|
|
|
|
<span class="c1"># we must tell cells to crop instead of expanding</span>
|
|
<span class="n">options</span><span class="p">[</span><span class="s2">"enforce_size"</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span>
|
|
|
|
<span class="c1"># reformat table (for vertical align)</span>
|
|
<span class="k">for</span> <span class="n">ix</span><span class="p">,</span> <span class="n">col</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">worktable</span><span class="p">):</span>
|
|
<span class="k">for</span> <span class="n">iy</span><span class="p">,</span> <span class="n">cell</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">col</span><span class="p">):</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">col</span><span class="o">.</span><span class="n">reformat_cell</span><span class="p">(</span><span class="n">iy</span><span class="p">,</span> <span class="n">height</span><span class="o">=</span><span class="n">cheights</span><span class="p">[</span><span class="n">iy</span><span class="p">],</span> <span class="o">**</span><span class="n">options</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
|
<span class="n">msg</span> <span class="o">=</span> <span class="s2">"ix=</span><span class="si">%s</span><span class="s2">, iy=</span><span class="si">%s</span><span class="s2">, height=</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">ix</span><span class="p">,</span> <span class="n">iy</span><span class="p">,</span> <span class="n">cheights</span><span class="p">[</span><span class="n">iy</span><span class="p">],</span> <span class="n">e</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
|
|
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"Error in vertical align:</span><span class="se">\n</span><span class="s2"> </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="n">msg</span><span class="p">)</span>
|
|
|
|
<span class="c1"># calculate actual table width/height in characters</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">cwidth</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">(</span><span class="n">cwidths</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">cheight</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">(</span><span class="n">cheights</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_generate_lines</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Generates lines across all columns</span>
|
|
<span class="sd"> (each cell may contain multiple lines)</span>
|
|
<span class="sd"> This will also balance the table.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_balance</span><span class="p">()</span>
|
|
<span class="k">for</span> <span class="n">iy</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nrows</span><span class="p">):</span>
|
|
<span class="n">cell_row</span> <span class="o">=</span> <span class="p">[</span><span class="n">col</span><span class="p">[</span><span class="n">iy</span><span class="p">]</span> <span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">worktable</span><span class="p">]</span>
|
|
<span class="c1"># this produces a list of lists, each of equal length</span>
|
|
<span class="n">cell_data</span> <span class="o">=</span> <span class="p">[</span><span class="n">cell</span><span class="o">.</span><span class="n">get</span><span class="p">()</span> <span class="k">for</span> <span class="n">cell</span> <span class="ow">in</span> <span class="n">cell_row</span><span class="p">]</span>
|
|
<span class="n">cell_height</span> <span class="o">=</span> <span class="nb">min</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="k">for</span> <span class="n">lines</span> <span class="ow">in</span> <span class="n">cell_data</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">iline</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">cell_height</span><span class="p">):</span>
|
|
<span class="k">yield</span> <span class="n">ANSIString</span><span class="p">(</span><span class="s2">""</span><span class="p">)</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">_to_ansi</span><span class="p">(</span><span class="n">celldata</span><span class="p">[</span><span class="n">iline</span><span class="p">]</span> <span class="k">for</span> <span class="n">celldata</span> <span class="ow">in</span> <span class="n">cell_data</span><span class="p">))</span>
|
|
|
|
<div class="viewcode-block" id="EvTable.add_header"><a class="viewcode-back" href="../../../api/evennia.utils.evtable.html#evennia.utils.evtable.EvTable.add_header">[docs]</a> <span class="k">def</span> <span class="nf">add_header</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Add header to table. This is a number of texts to be put at</span>
|
|
<span class="sd"> the top of the table. They will replace an existing header.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> args (str): These strings will be used as the header texts.</span>
|
|
|
|
<span class="sd"> Keyword Args:</span>
|
|
<span class="sd"> Same keywords as per `EvTable.__init__`. Will be applied</span>
|
|
<span class="sd"> to the new header's cells.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">header</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">add_row</span><span class="p">(</span><span class="n">ypos</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="EvTable.add_column"><a class="viewcode-back" href="../../../api/evennia.utils.evtable.html#evennia.utils.evtable.EvTable.add_column">[docs]</a> <span class="k">def</span> <span class="nf">add_column</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Add a column to table. If there are more rows in new column</span>
|
|
<span class="sd"> than there are rows in the current table, the table will</span>
|
|
<span class="sd"> expand with empty rows in the other columns. If too few, the</span>
|
|
<span class="sd"> new column with get new empty rows. All filling rows are added</span>
|
|
<span class="sd"> to the end.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> args (`EvColumn` or multiple strings): Either a single EvColumn instance or</span>
|
|
<span class="sd"> a number of data string arguments to be used to create a new column.</span>
|
|
<span class="sd"> header (str, optional): The header text for the column</span>
|
|
<span class="sd"> xpos (int, optional): Index position in table *before* which</span>
|
|
<span class="sd"> to input new column. If not given, column will be added to the end</span>
|
|
<span class="sd"> of the table. Uses Python indexing (so first column is `xpos=0`)</span>
|
|
|
|
<span class="sd"> Keyword Args:</span>
|
|
<span class="sd"> Other keywords as per `Cell.__init__`.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="c1"># this will replace default options with new ones without changing default</span>
|
|
<span class="n">options</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="o">.</span><span class="n">items</span><span class="p">())</span> <span class="o">+</span> <span class="nb">list</span><span class="p">(</span><span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">()))</span>
|
|
|
|
<span class="n">xpos</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"xpos"</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
<span class="n">column</span> <span class="o">=</span> <span class="n">EvColumn</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">options</span><span class="p">)</span>
|
|
<span class="n">wtable</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ncols</span>
|
|
<span class="n">htable</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">nrows</span>
|
|
|
|
<span class="n">header</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"header"</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">header</span><span class="p">:</span>
|
|
<span class="n">column</span><span class="o">.</span><span class="n">add_rows</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">header</span><span class="p">),</span> <span class="n">ypos</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="o">**</span><span class="n">options</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">header</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">header</span><span class="p">:</span>
|
|
<span class="c1"># we have a header already. Offset</span>
|
|
<span class="n">column</span><span class="o">.</span><span class="n">add_rows</span><span class="p">(</span><span class="s2">""</span><span class="p">,</span> <span class="n">ypos</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="o">**</span><span class="n">options</span><span class="p">)</span>
|
|
|
|
<span class="c1"># Calculate whether the new column needs to expand to the</span>
|
|
<span class="c1"># current table size, or if the table needs to expand to</span>
|
|
<span class="c1"># the column size.</span>
|
|
<span class="c1"># This needs to happen after the header rows have already been</span>
|
|
<span class="c1"># added to the column in order for the size calculations to match.</span>
|
|
<span class="n">excess</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">column</span><span class="p">)</span> <span class="o">-</span> <span class="n">htable</span>
|
|
<span class="k">if</span> <span class="n">excess</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="c1"># we need to add new rows to table</span>
|
|
<span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">table</span><span class="p">:</span>
|
|
<span class="n">empty_rows</span> <span class="o">=</span> <span class="p">[</span><span class="s2">""</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">excess</span><span class="p">)]</span>
|
|
<span class="n">col</span><span class="o">.</span><span class="n">add_rows</span><span class="p">(</span><span class="o">*</span><span class="n">empty_rows</span><span class="p">,</span> <span class="o">**</span><span class="n">options</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">nrows</span> <span class="o">+=</span> <span class="n">excess</span>
|
|
<span class="k">elif</span> <span class="n">excess</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="c1"># we need to add new rows to new column</span>
|
|
<span class="n">empty_rows</span> <span class="o">=</span> <span class="p">[</span><span class="s2">""</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="n">excess</span><span class="p">))]</span>
|
|
<span class="n">column</span><span class="o">.</span><span class="n">add_rows</span><span class="p">(</span><span class="o">*</span><span class="n">empty_rows</span><span class="p">,</span> <span class="o">**</span><span class="n">options</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">nrows</span> <span class="o">-=</span> <span class="n">excess</span>
|
|
|
|
<span class="k">if</span> <span class="n">xpos</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">xpos</span> <span class="o">></span> <span class="n">wtable</span> <span class="o">-</span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="c1"># add to the end</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">table</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">column</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="c1"># insert column</span>
|
|
<span class="n">xpos</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">wtable</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="nb">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">xpos</span><span class="p">)))</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">table</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="n">xpos</span><span class="p">,</span> <span class="n">column</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ncols</span> <span class="o">+=</span> <span class="mi">1</span></div>
|
|
<span class="c1"># self._balance()</span>
|
|
|
|
<div class="viewcode-block" id="EvTable.add_row"><a class="viewcode-back" href="../../../api/evennia.utils.evtable.html#evennia.utils.evtable.EvTable.add_row">[docs]</a> <span class="k">def</span> <span class="nf">add_row</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Add a row to table (not a header). If there are more cells in</span>
|
|
<span class="sd"> the given row than there are cells in the current table the</span>
|
|
<span class="sd"> table will be expanded with empty columns to match. These will</span>
|
|
<span class="sd"> be added to the end of the table. In the same way, adding a</span>
|
|
<span class="sd"> line with too few cells will lead to the last ones getting</span>
|
|
<span class="sd"> padded.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> args (str): Any number of string argumnets to use as the</span>
|
|
<span class="sd"> data in the row (one cell per argument).</span>
|
|
<span class="sd"> ypos (int, optional): Index position in table before which to</span>
|
|
<span class="sd"> input new row. If not given, will be added to the end of the table.</span>
|
|
<span class="sd"> Uses Python indexing (so first row is `ypos=0`)</span>
|
|
|
|
<span class="sd"> Keyword Args:</span>
|
|
<span class="sd"> Other keywords are as per `EvCell.__init__`.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="c1"># this will replace default options with new ones without changing default</span>
|
|
<span class="n">row</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
|
|
<span class="n">options</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="o">.</span><span class="n">items</span><span class="p">())</span> <span class="o">+</span> <span class="nb">list</span><span class="p">(</span><span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">()))</span>
|
|
|
|
<span class="n">ypos</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"ypos"</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
<span class="n">wtable</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ncols</span>
|
|
<span class="n">htable</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">nrows</span>
|
|
<span class="n">excess</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">row</span><span class="p">)</span> <span class="o">-</span> <span class="n">wtable</span>
|
|
|
|
<span class="k">if</span> <span class="n">excess</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="c1"># we need to add new empty columns to table</span>
|
|
<span class="n">empty_rows</span> <span class="o">=</span> <span class="p">[</span><span class="s2">""</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">htable</span><span class="p">)]</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">table</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="n">EvColumn</span><span class="p">(</span><span class="o">*</span><span class="n">empty_rows</span><span class="p">,</span> <span class="o">**</span><span class="n">options</span><span class="p">)</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">excess</span><span class="p">)])</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ncols</span> <span class="o">+=</span> <span class="n">excess</span>
|
|
<span class="k">elif</span> <span class="n">excess</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="c1"># we need to add more cells to row</span>
|
|
<span class="n">row</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="s2">""</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="n">excess</span><span class="p">))])</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">ncols</span> <span class="o">-=</span> <span class="n">excess</span>
|
|
|
|
<span class="k">if</span> <span class="n">ypos</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">ypos</span> <span class="o">></span> <span class="n">htable</span> <span class="o">-</span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="c1"># add new row to the end</span>
|
|
<span class="k">for</span> <span class="n">icol</span><span class="p">,</span> <span class="n">col</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">table</span><span class="p">):</span>
|
|
<span class="n">col</span><span class="o">.</span><span class="n">add_rows</span><span class="p">(</span><span class="n">row</span><span class="p">[</span><span class="n">icol</span><span class="p">],</span> <span class="o">**</span><span class="n">options</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="c1"># insert row elsewhere</span>
|
|
<span class="n">ypos</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">htable</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="nb">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">ypos</span><span class="p">)))</span>
|
|
<span class="k">for</span> <span class="n">icol</span><span class="p">,</span> <span class="n">col</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">table</span><span class="p">):</span>
|
|
<span class="n">col</span><span class="o">.</span><span class="n">add_rows</span><span class="p">(</span><span class="n">row</span><span class="p">[</span><span class="n">icol</span><span class="p">],</span> <span class="n">ypos</span><span class="o">=</span><span class="n">ypos</span><span class="p">,</span> <span class="o">**</span><span class="n">options</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">nrows</span> <span class="o">+=</span> <span class="mi">1</span></div>
|
|
<span class="c1"># self._balance()</span>
|
|
|
|
<div class="viewcode-block" id="EvTable.reformat"><a class="viewcode-back" href="../../../api/evennia.utils.evtable.html#evennia.utils.evtable.EvTable.reformat">[docs]</a> <span class="k">def</span> <span class="nf">reformat</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Force a re-shape of the entire table.</span>
|
|
|
|
<span class="sd"> Keyword Args:</span>
|
|
<span class="sd"> Table options as per `EvTable.__init__`.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">width</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">"width"</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="bp">self</span><span class="o">.</span><span class="n">height</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">"height"</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="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
|
<span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
|
|
|
|
<span class="n">hchar</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">"header_line_char"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">header_line_char</span><span class="p">)</span>
|
|
|
|
<span class="c1"># border settings are also passed on into EvCells (so kwargs.get, not kwargs.pop)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">header_line_char</span> <span class="o">=</span> <span class="n">hchar</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">hchar</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">header_line_char</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">border_width</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"border_width"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">border_width</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">corner_char</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"corner_char"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">corner_char</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">header_line_char</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"header_line_char"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">header_line_char</span><span class="p">)</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">corner_top_left_char</span> <span class="o">=</span> <span class="n">_to_ansi</span><span class="p">(</span><span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">"corner_top_left_char"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">corner_char</span><span class="p">))</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">corner_top_right_char</span> <span class="o">=</span> <span class="n">_to_ansi</span><span class="p">(</span><span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">"corner_top_right_char"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">corner_char</span><span class="p">))</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">corner_bottom_left_char</span> <span class="o">=</span> <span class="n">_to_ansi</span><span class="p">(</span>
|
|
<span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">"corner_bottom_left_char"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">corner_char</span><span class="p">)</span>
|
|
<span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">corner_bottom_right_char</span> <span class="o">=</span> <span class="n">_to_ansi</span><span class="p">(</span>
|
|
<span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">"corner_bottom_right_char"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">corner_char</span><span class="p">)</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">kwargs</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="EvTable.reformat_column"><a class="viewcode-back" href="../../../api/evennia.utils.evtable.html#evennia.utils.evtable.EvTable.reformat_column">[docs]</a> <span class="k">def</span> <span class="nf">reformat_column</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Sends custom options to a specific column in the table.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> index (int): Which column to reformat. The column index is</span>
|
|
<span class="sd"> given from 0 to Ncolumns-1.</span>
|
|
|
|
<span class="sd"> Keyword Args:</span>
|
|
<span class="sd"> Column options as per `EvCell.__init__`.</span>
|
|
|
|
<span class="sd"> Raises:</span>
|
|
<span class="sd"> Exception: if an invalid index is found.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="n">index</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">table</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"Not a valid column index"</span><span class="p">)</span>
|
|
<span class="c1"># we update the columns' options which means eventual width/height</span>
|
|
<span class="c1"># will be 'locked in' and withstand auto-balancing width/height from the table later</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">table</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="o">.</span><span class="n">options</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">table</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="o">.</span><span class="n">reformat</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="EvTable.get"><a class="viewcode-back" href="../../../api/evennia.utils.evtable.html#evennia.utils.evtable.EvTable.get">[docs]</a> <span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> Return lines of table as a list.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> table_lines (list): The lines of the table, in order.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="p">[</span><span class="n">line</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_generate_lines</span><span class="p">()]</span></div>
|
|
|
|
<span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""print table (this also balances it)"""</span>
|
|
<span class="c1"># h = "12345678901234567890123456789012345678901234567890123456789012345678901234567890"</span>
|
|
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">ANSIString</span><span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">line</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_generate_lines</span><span class="p">()])))</span></div>
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">_test</span><span class="p">():</span>
|
|
<span class="sd">"""Test"""</span>
|
|
<span class="n">table</span> <span class="o">=</span> <span class="n">EvTable</span><span class="p">(</span>
|
|
<span class="s2">"|yHeading1|n"</span><span class="p">,</span>
|
|
<span class="s2">"|gHeading2|n"</span><span class="p">,</span>
|
|
<span class="n">table</span><span class="o">=</span><span class="p">[[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span> <span class="p">[</span><span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">],</span> <span class="p">[</span><span class="mi">7</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">9</span><span class="p">]],</span>
|
|
<span class="n">border</span><span class="o">=</span><span class="s2">"cells"</span><span class="p">,</span>
|
|
<span class="n">align</span><span class="o">=</span><span class="s2">"l"</span><span class="p">,</span>
|
|
<span class="p">)</span>
|
|
<span class="n">table</span><span class="o">.</span><span class="n">add_column</span><span class="p">(</span><span class="s2">"|rThis is long data|n"</span><span class="p">,</span> <span class="s2">"|bThis is even longer data|n"</span><span class="p">)</span>
|
|
<span class="n">table</span><span class="o">.</span><span class="n">add_row</span><span class="p">(</span><span class="s2">"This is a single row"</span><span class="p">)</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">table</span><span class="p">))</span>
|
|
<span class="n">table</span><span class="o">.</span><span class="n">reformat</span><span class="p">(</span><span class="n">width</span><span class="o">=</span><span class="mi">50</span><span class="p">)</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">table</span><span class="p">))</span>
|
|
<span class="n">table</span><span class="o">.</span><span class="n">reformat_column</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="n">width</span><span class="o">=</span><span class="mi">30</span><span class="p">,</span> <span class="n">align</span><span class="o">=</span><span class="s2">"r"</span><span class="p">)</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">table</span><span class="p">))</span>
|
|
<span class="k">return</span> <span class="n">table</span>
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">_test2</span><span class="p">():</span>
|
|
<span class="n">table</span> <span class="o">=</span> <span class="n">EvTable</span><span class="p">(</span><span class="s2">"|yHeading1|n"</span><span class="p">,</span> <span class="s2">"|B|[GHeading2|n"</span><span class="p">,</span> <span class="s2">"Heading3"</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">100</span><span class="p">):</span>
|
|
<span class="n">table</span><span class="o">.</span><span class="n">add_row</span><span class="p">(</span>
|
|
<span class="s2">"This is col 0, row </span><span class="si">%i</span><span class="s2">"</span> <span class="o">%</span> <span class="n">i</span><span class="p">,</span>
|
|
<span class="s2">"|gThis is col 1, row |w</span><span class="si">%i</span><span class="s2">|n|g.|n"</span> <span class="o">%</span> <span class="n">i</span><span class="p">,</span>
|
|
<span class="s2">"This is col 2, row </span><span class="si">%i</span><span class="s2">"</span> <span class="o">%</span> <span class="n">i</span><span class="p">,</span>
|
|
<span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">table</span>
|
|
</pre></div>
|
|
|
|
<div class="clearer"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<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">Home page</a> </li>
|
|
<li><a href="https://github.com/evennia/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>
|
|
<h3>Versions</h3>
|
|
<ul>
|
|
<li><a href="../../../../1.0-dev/index.html">1.0-dev (develop branch)</a></li>
|
|
<li><a href="evtable.html">0.9.5 (v0.9.5 branch)</a></li>
|
|
</ul>
|
|
|
|
</div>
|
|
</div>
|
|
<div class="clearer"></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 0.9.5</a> »</li>
|
|
<li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> »</li>
|
|
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> »</li>
|
|
<li class="nav-item nav-item-this"><a href="">evennia.utils.evtable</a></li>
|
|
</ul>
|
|
</div>
|
|
<div class="footer" role="contentinfo">
|
|
© Copyright 2020, The Evennia developer community.
|
|
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
|
|
</div>
|
|
</body>
|
|
</html> |