Repository: Textualize/rich

Issue:
[REQUEST] support multiple chars for rule printing
Have you checked the issues for a similar suggestions? Yes

**How would you improve Rich?**

Currently for rule.py it only allows the character to have 1 cell length, it would better if it could allow more, like

```python
>>> console.print(Rule("hello", character="-+"))
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ hello -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
```


**What problem does it solved for you?**

I was just thinking it would improve it and it looks like an ASCII rule, which is cool (like [this](https://github.com/LuRsT/hr#how-to-use-it) program)

---

If this is accepted, I would like to work on it, because I have already tried it out ”locally” (https://repl.it/@hedythedev/rich#rich/rule.py) and it works well

```python
console.print(Rule(text, character="-/-"))
```

![BDB784D3-8BA2-4978-9791-6860EEFE0384](https://user-images.githubusercontent.com/50042066/89253524-7613f000-d64f-11ea-8abf-19070df40fab.jpeg)




Discussion:
I will also remember add tests for this (if accepted) of course
Hi @hedythedev 

Works for me. Since we allow multiple characters now, it should probably take in to account multi-cell characters like emoji. See the functions in [cells.py](https://github.com/willmcgugan/rich/blob/master/rich/cells.py) for help with that.

The name of the parameter is probably wrong now. `character` implies a single character. Suggest adding additional `characters` parameter which allows for multiple characters. 

BTW there is a [rule](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console.rule) method on the Console class that will also need updating...

Thanks!
Got it!
Btw when you say works for me, do you mean the code in repl.it?

Also would `chars` work better? Because `characters` is a bit long
> Btw when you say works for me, do you mean the code in repl.it?

Just meant its a good idea in general.

> Also would chars work better? Because characters is a bit long

It is, but I dislike abbreviations. I'd rather type it in full than recall how it was abbreviated...
So if the characters provided have a long length, this might end up happening (`|` represents terminal width)
```python
>>> console.print(Rule("hello", character="12345"))
|12345 hello 12345    |
#                 ^^^^
```
Because `12345` is longer than the width left after the right side of `12345`, there will be a number blank spaces smaller than the cell width of `characters` param, in this case it is `len(“12345”) == 5`. Which is caused by treating `characters` (12345) as a whole.

So in this case, which solution would we want? 
1. using `truncate()` to make it
`|1234512 hello 1234512 |`  (there will be an ending space if length of `characters` is odd)

2. Or just leave it as is
```
|12345 hello 12345    |
```

In my opinion we should use truncate
The Rule should extend to the full width available, which may mean you need an extra character on the right hand side. To use your example:

```
|1234512 hello 12345123|
```

Resolving patch:
diff --git a/rich/console.py b/rich/console.py
--- a/rich/console.py
+++ b/rich/console.py
@@ -795,18 +795,22 @@ def rule(
         self,
         title: str = "",
         *,
-        character: str = "─",
+        character: Optional[str] = None,
+        characters: str = "─",
         style: Union[str, Style] = "rule.line",
     ) -> None:
         """Draw a line with optional centered title.
         
         Args:
             title (str, optional): Text to render over the rule. Defaults to "".
-            character (str, optional): Character to form the line. Defaults to "─".
+            character: Will be deprecated in v6.0.0, please use characters argument instead.
+            characters (str, optional): Character(s) to form the line. Defaults to "─".
         """
         from .rule import Rule
 
-        rule = Rule(title=title, character=character, style=style)
+        if character:
+            characters = character
+        rule = Rule(title=title, characters=characters, style=style)
         self.print(rule)
 
     def control(self, control_codes: Union["Control", str]) -> None:
diff --git a/rich/rule.py b/rich/rule.py
--- a/rich/rule.py
+++ b/rich/rule.py
@@ -1,6 +1,6 @@
 from typing import Union
 
-from .cells import cell_len
+from .cells import cell_len, set_cell_size
 from .console import Console, ConsoleOptions, RenderResult
 from .jupyter import JupyterMixin
 from .style import Style
@@ -12,7 +12,8 @@ class Rule(JupyterMixin):
     
     Args:
         title (Union[str, Text], optional): Text to render in the rule. Defaults to "".
-        character (str, optional): Character used to draw the line. Defaults to "─".
+        character: Will be deprecated in v6.0.0, please use characters argument instead.
+        characters (str, optional): Character(s) used to draw the line. Defaults to "─".
         style (StyleType, optional): Style of Rule. Defaults to "rule.line".
         end (str, optional): Character at end of Rule. defaults to "\\n"
     """
@@ -21,29 +22,37 @@ def __init__(
         self,
         title: Union[str, Text] = "",
         *,
-        character: str = None,
+        character: Union[str, None] = None,
+        characters: str = "─",
         style: Union[str, Style] = "rule.line",
         end: str = "\n",
     ) -> None:
-        if character and cell_len(character) != 1:
-            raise ValueError("'character' argument must have a cell width of 1")
+        if character:
+            characters = character
+
+        if cell_len(characters) < 1:
+            raise ValueError(
+                "'characters' argument must have at least a cell width of 1"
+            )
         self.title = title
-        self.character = character
+        self.characters = characters
         self.style = style
         self.end = end
 
     def __repr__(self) -> str:
-        return f"Rule({self.title!r}, {self.character!r})"
+        return f"Rule({self.title!r}, {self.characters!r})"
 
     def __rich_console__(
         self, console: Console, options: ConsoleOptions
     ) -> RenderResult:
         width = options.max_width
 
-        character = self.character or "─"
+        characters = self.characters or "─"
 
+        chars_len = cell_len(characters)
         if not self.title:
-            yield Text(character * width, self.style)
+            rule_text = Text(characters * ((width // chars_len) + 1), self.style)
+            rule_text.truncate(width)
         else:
             if isinstance(self.title, Text):
                 title_text = self.title
@@ -56,13 +65,17 @@ def __rich_console__(
             title_text.plain = title_text.plain.replace("\n", " ")
             title_text = title_text.tabs_to_spaces()
             rule_text = Text(end=self.end)
-            center = (width - cell_len(title_text.plain)) // 2
-            rule_text.append(character * (center - 1) + " ", self.style)
+            side_width = (width - cell_len(title_text.plain)) // 2
+            left = Text(characters * (side_width // chars_len + 1))
+            left.truncate(side_width - 1)
+            right_length = width - cell_len(left.plain) - cell_len(title_text.plain)
+            right = Text(characters * (side_width // chars_len + 1))
+            right.truncate(right_length)
+            rule_text.append(left.plain + " ", self.style)
             rule_text.append(title_text)
-            rule_text.append(
-                " " + character * (width - cell_len(rule_text.plain) - 1), self.style
-            )
-            yield rule_text
+            rule_text.append(" " + right.plain, self.style)
+            rule_text.plain = set_cell_size(rule_text.plain, width)
+        yield rule_text
 
 
 if __name__ == "__main__":  # pragma: no cover
@@ -74,4 +87,4 @@ def __rich_console__(
     except IndexError:
         text = "Hello, World"
     console = Console()
-    console.print(Rule(text))
+    console.print(Rule(title=text))


Test patch:
diff --git a/tests/_card_render.py b/tests/_card_render.py
--- a/tests/_card_render.py
+++ b/tests/_card_render.py
@@ -1 +1 @@
-expected='\x1b[3m                                           Rich features                                            \x1b[0m\n\x1b[1;31m                     \x1b[0m                                                                               \n\x1b[1;31m \x1b[0m\x1b[1;31m             Colors\x1b[0m\x1b[1;31m \x1b[0m\x1b[1;33m256\x1b[0m colors or \x1b[1;32m16.7 million\x1b[0m colors \x1b[34m(if supported by your terminal)\x1b[0m.             \n                                                                                                    \n                     \x1b[48;5;16m  \x1b[0m\x1b[48;5;17m  \x1b[0m\x1b[48;5;18m  \x1b[0m\x1b[48;5;19m  \x1b[0m\x1b[48;5;20m  \x1b[0m\x1b[48;5;21m  \x1b[0m\x1b[48;5;52m  \x1b[0m\x1b[48;5;53m  \x1b[0m\x1b[48;5;54m  \x1b[0m\x1b[48;5;55m  \x1b[0m\x1b[48;5;56m  \x1b[0m\x1b[48;5;57m  \x1b[0m\x1b[48;5;88m  \x1b[0m\x1b[48;5;89m  \x1b[0m\x1b[48;5;90m  \x1b[0m\x1b[48;5;91m  \x1b[0m\x1b[48;5;92m  \x1b[0m\x1b[48;5;93m  \x1b[0m\x1b[48;5;124m  \x1b[0m\x1b[48;5;125m  \x1b[0m\x1b[48;5;126m  \x1b[0m\x1b[48;5;127m  \x1b[0m\x1b[48;5;128m  \x1b[0m\x1b[48;5;129m  \x1b[0m\x1b[48;5;160m  \x1b[0m\x1b[48;5;161m  \x1b[0m\x1b[48;5;162m  \x1b[0m\x1b[48;5;163m  \x1b[0m\x1b[48;5;164m  \x1b[0m\x1b[48;5;165m  \x1b[0m\x1b[48;5;196m  \x1b[0m\x1b[48;5;197m  \x1b[0m\x1b[48;5;198m  \x1b[0m\x1b[48;5;199m  \x1b[0m\x1b[48;5;200m  \x1b[0m\x1b[48;5;201m  \x1b[0m       \n                     \x1b[48;5;22m  \x1b[0m\x1b[48;5;23m  \x1b[0m\x1b[48;5;24m  \x1b[0m\x1b[48;5;25m  \x1b[0m\x1b[48;5;26m  \x1b[0m\x1b[48;5;27m  \x1b[0m\x1b[48;5;58m  \x1b[0m\x1b[48;5;59m  \x1b[0m\x1b[48;5;60m  \x1b[0m\x1b[48;5;61m  \x1b[0m\x1b[48;5;62m  \x1b[0m\x1b[48;5;63m  \x1b[0m\x1b[48;5;94m  \x1b[0m\x1b[48;5;95m  \x1b[0m\x1b[48;5;96m  \x1b[0m\x1b[48;5;97m  \x1b[0m\x1b[48;5;98m  \x1b[0m\x1b[48;5;99m  \x1b[0m\x1b[48;5;130m  \x1b[0m\x1b[48;5;131m  \x1b[0m\x1b[48;5;132m  \x1b[0m\x1b[48;5;133m  \x1b[0m\x1b[48;5;134m  \x1b[0m\x1b[48;5;135m  \x1b[0m\x1b[48;5;166m  \x1b[0m\x1b[48;5;167m  \x1b[0m\x1b[48;5;168m  \x1b[0m\x1b[48;5;169m  \x1b[0m\x1b[48;5;170m  \x1b[0m\x1b[48;5;171m  \x1b[0m\x1b[48;5;202m  \x1b[0m\x1b[48;5;203m  \x1b[0m\x1b[48;5;204m  \x1b[0m\x1b[48;5;205m  \x1b[0m\x1b[48;5;206m  \x1b[0m\x1b[48;5;207m  \x1b[0m       \n                     \x1b[48;5;28m  \x1b[0m\x1b[48;5;29m  \x1b[0m\x1b[48;5;30m  \x1b[0m\x1b[48;5;31m  \x1b[0m\x1b[48;5;32m  \x1b[0m\x1b[48;5;33m  \x1b[0m\x1b[48;5;64m  \x1b[0m\x1b[48;5;65m  \x1b[0m\x1b[48;5;66m  \x1b[0m\x1b[48;5;67m  \x1b[0m\x1b[48;5;68m  \x1b[0m\x1b[48;5;69m  \x1b[0m\x1b[48;5;100m  \x1b[0m\x1b[48;5;101m  \x1b[0m\x1b[48;5;102m  \x1b[0m\x1b[48;5;103m  \x1b[0m\x1b[48;5;104m  \x1b[0m\x1b[48;5;105m  \x1b[0m\x1b[48;5;136m  \x1b[0m\x1b[48;5;137m  \x1b[0m\x1b[48;5;138m  \x1b[0m\x1b[48;5;139m  \x1b[0m\x1b[48;5;140m  \x1b[0m\x1b[48;5;141m  \x1b[0m\x1b[48;5;172m  \x1b[0m\x1b[48;5;173m  \x1b[0m\x1b[48;5;174m  \x1b[0m\x1b[48;5;175m  \x1b[0m\x1b[48;5;176m  \x1b[0m\x1b[48;5;177m  \x1b[0m\x1b[48;5;208m  \x1b[0m\x1b[48;5;209m  \x1b[0m\x1b[48;5;210m  \x1b[0m\x1b[48;5;211m  \x1b[0m\x1b[48;5;212m  \x1b[0m\x1b[48;5;213m  \x1b[0m       \n                     \x1b[48;5;34m  \x1b[0m\x1b[48;5;35m  \x1b[0m\x1b[48;5;36m  \x1b[0m\x1b[48;5;37m  \x1b[0m\x1b[48;5;38m  \x1b[0m\x1b[48;5;39m  \x1b[0m\x1b[48;5;70m  \x1b[0m\x1b[48;5;71m  \x1b[0m\x1b[48;5;72m  \x1b[0m\x1b[48;5;73m  \x1b[0m\x1b[48;5;74m  \x1b[0m\x1b[48;5;75m  \x1b[0m\x1b[48;5;106m  \x1b[0m\x1b[48;5;107m  \x1b[0m\x1b[48;5;108m  \x1b[0m\x1b[48;5;109m  \x1b[0m\x1b[48;5;110m  \x1b[0m\x1b[48;5;111m  \x1b[0m\x1b[48;5;142m  \x1b[0m\x1b[48;5;143m  \x1b[0m\x1b[48;5;144m  \x1b[0m\x1b[48;5;145m  \x1b[0m\x1b[48;5;146m  \x1b[0m\x1b[48;5;147m  \x1b[0m\x1b[48;5;178m  \x1b[0m\x1b[48;5;179m  \x1b[0m\x1b[48;5;180m  \x1b[0m\x1b[48;5;181m  \x1b[0m\x1b[48;5;182m  \x1b[0m\x1b[48;5;183m  \x1b[0m\x1b[48;5;214m  \x1b[0m\x1b[48;5;215m  \x1b[0m\x1b[48;5;216m  \x1b[0m\x1b[48;5;217m  \x1b[0m\x1b[48;5;218m  \x1b[0m\x1b[48;5;219m  \x1b[0m       \n                     \x1b[48;5;40m  \x1b[0m\x1b[48;5;41m  \x1b[0m\x1b[48;5;42m  \x1b[0m\x1b[48;5;43m  \x1b[0m\x1b[48;5;44m  \x1b[0m\x1b[48;5;45m  \x1b[0m\x1b[48;5;76m  \x1b[0m\x1b[48;5;77m  \x1b[0m\x1b[48;5;78m  \x1b[0m\x1b[48;5;79m  \x1b[0m\x1b[48;5;80m  \x1b[0m\x1b[48;5;81m  \x1b[0m\x1b[48;5;112m  \x1b[0m\x1b[48;5;113m  \x1b[0m\x1b[48;5;114m  \x1b[0m\x1b[48;5;115m  \x1b[0m\x1b[48;5;116m  \x1b[0m\x1b[48;5;117m  \x1b[0m\x1b[48;5;148m  \x1b[0m\x1b[48;5;149m  \x1b[0m\x1b[48;5;150m  \x1b[0m\x1b[48;5;151m  \x1b[0m\x1b[48;5;152m  \x1b[0m\x1b[48;5;153m  \x1b[0m\x1b[48;5;184m  \x1b[0m\x1b[48;5;185m  \x1b[0m\x1b[48;5;186m  \x1b[0m\x1b[48;5;187m  \x1b[0m\x1b[48;5;188m  \x1b[0m\x1b[48;5;189m  \x1b[0m\x1b[48;5;220m  \x1b[0m\x1b[48;5;221m  \x1b[0m\x1b[48;5;222m  \x1b[0m\x1b[48;5;223m  \x1b[0m\x1b[48;5;224m  \x1b[0m\x1b[48;5;225m  \x1b[0m       \n                     \x1b[48;5;46m  \x1b[0m\x1b[48;5;47m  \x1b[0m\x1b[48;5;48m  \x1b[0m\x1b[48;5;49m  \x1b[0m\x1b[48;5;50m  \x1b[0m\x1b[48;5;51m  \x1b[0m\x1b[48;5;82m  \x1b[0m\x1b[48;5;83m  \x1b[0m\x1b[48;5;84m  \x1b[0m\x1b[48;5;85m  \x1b[0m\x1b[48;5;86m  \x1b[0m\x1b[48;5;87m  \x1b[0m\x1b[48;5;118m  \x1b[0m\x1b[48;5;119m  \x1b[0m\x1b[48;5;120m  \x1b[0m\x1b[48;5;121m  \x1b[0m\x1b[48;5;122m  \x1b[0m\x1b[48;5;123m  \x1b[0m\x1b[48;5;154m  \x1b[0m\x1b[48;5;155m  \x1b[0m\x1b[48;5;156m  \x1b[0m\x1b[48;5;157m  \x1b[0m\x1b[48;5;158m  \x1b[0m\x1b[48;5;159m  \x1b[0m\x1b[48;5;190m  \x1b[0m\x1b[48;5;191m  \x1b[0m\x1b[48;5;192m  \x1b[0m\x1b[48;5;193m  \x1b[0m\x1b[48;5;194m  \x1b[0m\x1b[48;5;195m  \x1b[0m\x1b[48;5;226m  \x1b[0m\x1b[48;5;227m  \x1b[0m\x1b[48;5;228m  \x1b[0m\x1b[48;5;229m  \x1b[0m\x1b[48;5;230m  \x1b[0m\x1b[48;5;231m  \x1b[0m       \n\x1b[1;31m                     \x1b[0m                                                                               \n\x1b[1;31m \x1b[0m\x1b[1;31m             Styles\x1b[0m\x1b[1;31m \x1b[0mAll ansi styles: \x1b[1mbold\x1b[0m, \x1b[2mdim\x1b[0m, \x1b[3mitalic\x1b[0m, \x1b[4munderline\x1b[0m, \x1b[9mstrikethrough\x1b[0m, \x1b[7mreverse\x1b[0m, and     \n                     even \x1b[5mblink\x1b[0m.                                                                    \n\x1b[1;31m                     \x1b[0m                                                                               \n\x1b[1;31m \x1b[0m\x1b[1;31m               Text\x1b[0m\x1b[1;31m \x1b[0mWord wrap text. Justify \x1b[32mleft\x1b[0m, \x1b[33mcenter\x1b[0m, \x1b[34mright\x1b[0m or \x1b[31mfull\x1b[0m.                           \n                                                                                                    \n                     \x1b[32mLorem ipsum dolor  \x1b[0m \x1b[33mLorem ipsum dolor \x1b[0m \x1b[34m  Lorem ipsum dolor\x1b[0m \x1b[31mLorem\x1b[0m\x1b[31m  \x1b[0m\x1b[31mipsum\x1b[0m\x1b[31m  \x1b[0m\x1b[31mdolor\x1b[0m \n                     \x1b[32msit amet,          \x1b[0m \x1b[33m    sit amet,     \x1b[0m \x1b[34m          sit amet,\x1b[0m \x1b[31msit\x1b[0m\x1b[31m           \x1b[0m\x1b[31mamet,\x1b[0m \n                     \x1b[32mconsectetur        \x1b[0m \x1b[33m   consectetur    \x1b[0m \x1b[34m        consectetur\x1b[0m \x1b[31mconsectetur\x1b[0m         \n                     \x1b[32madipiscing elit.   \x1b[0m \x1b[33m adipiscing elit. \x1b[0m \x1b[34m   adipiscing elit.\x1b[0m \x1b[31madipiscing\x1b[0m\x1b[31m    \x1b[0m\x1b[31melit.\x1b[0m \n                     \x1b[32mQuisque in metus   \x1b[0m \x1b[33m Quisque in metus \x1b[0m \x1b[34m   Quisque in metus\x1b[0m \x1b[31mQuisque\x1b[0m\x1b[31m  \x1b[0m\x1b[31min\x1b[0m\x1b[31m   \x1b[0m\x1b[31mmetus\x1b[0m \n                     \x1b[32msed sapien         \x1b[0m \x1b[33m    sed sapien    \x1b[0m \x1b[34m         sed sapien\x1b[0m \x1b[31msed\x1b[0m\x1b[31m          \x1b[0m\x1b[31msapien\x1b[0m \n                     \x1b[32multricies pretium a\x1b[0m \x1b[33multricies pretium \x1b[0m \x1b[34multricies pretium a\x1b[0m \x1b[31multricies\x1b[0m\x1b[31m \x1b[0m\x1b[31mpretium\x1b[0m\x1b[31m \x1b[0m\x1b[31ma\x1b[0m \n                     \x1b[32mat justo. Maecenas \x1b[0m \x1b[33m   a at justo.    \x1b[0m \x1b[34m at justo. Maecenas\x1b[0m \x1b[31mat\x1b[0m\x1b[31m \x1b[0m\x1b[31mjusto.\x1b[0m\x1b[31m  \x1b[0m\x1b[31mMaecenas\x1b[0m \n                     \x1b[32mluctus velit et    \x1b[0m \x1b[33m Maecenas luctus  \x1b[0m \x1b[34m    luctus velit et\x1b[0m \x1b[31mluctus\x1b[0m\x1b[31m   \x1b[0m\x1b[31mvelit\x1b[0m\x1b[31m   \x1b[0m\x1b[31met\x1b[0m \n                     \x1b[32mauctor maximus.    \x1b[0m \x1b[33m velit et auctor  \x1b[0m \x1b[34m    auctor maximus.\x1b[0m \x1b[31mauctor\x1b[0m\x1b[31m     \x1b[0m\x1b[31mmaximus.\x1b[0m \n                     \x1b[32mDonec faucibus vel \x1b[0m \x1b[33m  maximus. Donec  \x1b[0m \x1b[34m Donec faucibus vel\x1b[0m \x1b[31mDonec\x1b[0m\x1b[31m \x1b[0m\x1b[31mfaucibus\x1b[0m\x1b[31m  \x1b[0m\x1b[31mvel\x1b[0m \n                     \x1b[32marcu id pretium.   \x1b[0m \x1b[33mfaucibus vel arcu \x1b[0m \x1b[34m   arcu id pretium.\x1b[0m \x1b[31marcu id pretium.\x1b[0m    \n                                         \x1b[33m   id pretium.    \x1b[0m                                         \n\x1b[1;31m                     \x1b[0m                                                                               \n\x1b[1;31m \x1b[0m\x1b[1;31m        CJK support\x1b[0m\x1b[1;31m \x1b[0m\x1b[31m╔══════════════════════════════╗\x1b[0m                                               \n                     \x1b[31m║\x1b[0m该库支持中文，日文和韩文文本！\x1b[31m║\x1b[0m                                               \n                     \x1b[31m╚══════════════════════════════╝\x1b[0m                                               \n\x1b[1;31m                     \x1b[0m                                                                               \n\x1b[1;31m \x1b[0m\x1b[1;31m              Emoji\x1b[0m\x1b[1;31m \x1b[0mRender emoji code: :+1: :apple: :ant:   Render emoji code: 👍 🍎 🐜 🐻 🥖 🚌   \n                     :bear: :baguette_bread: :bus:                                                  \n\x1b[1;31m                     \x1b[0m                                                                               \n\x1b[1;31m \x1b[0m\x1b[1;31m     Console markup\x1b[0m\x1b[1;31m \x1b[0m[bold magenta]Rich[/] supports a        \x1b[1;35mRich\x1b[0m supports a simple \x1b[3mbbcode\x1b[0m like     \n                     simple [i]bbcode[/i] like               \x1b[1mmarkup\x1b[0m, you can use to insert \x1b[33mcolor\x1b[0m    \n                     [b]markup[/b], you can use to insert    and \x1b[4mstyle\x1b[0m.                             \n                     [yellow]color[/] and                                                           \n                     [underline]style[/].                                                           \n\x1b[1;31m                     \x1b[0m                                                                               \n\x1b[1;31m \x1b[0m\x1b[1;31m             Tables\x1b[0m\x1b[1;31m \x1b[0m\x1b[3m                             Star Wars box office                             \x1b[0m \n                     ┏━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┓ \n                     ┃\x1b[1;35m \x1b[0m\x1b[1;35mDate        \x1b[0m\x1b[1;35m \x1b[0m┃\x1b[1;35m \x1b[0m\x1b[1;35mTitle                 \x1b[0m\x1b[1;35m \x1b[0m┃\x1b[1;35m \x1b[0m\x1b[1;35mProduction Budget\x1b[0m\x1b[1;35m \x1b[0m┃\x1b[1;35m \x1b[0m\x1b[1;35m    Box Office\x1b[0m\x1b[1;35m \x1b[0m┃ \n                     ┡━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━┩ \n                     │\x1b[2m \x1b[0m\x1b[2mDec 20, 2019\x1b[0m\x1b[2m \x1b[0m│ Star Wars: The Rise of │      $275,000,000 │   $375,126,118 │ \n                     │              │ Skywalker              │                   │                │ \n                     │\x1b[2m \x1b[0m\x1b[2mMay 25, 2018\x1b[0m\x1b[2m \x1b[0m│ \x1b[31mSolo\x1b[0m: A Star Wars      │      $275,000,000 │   $393,151,347 │ \n                     │              │ Story                  │                   │                │ \n                     │\x1b[2m \x1b[0m\x1b[2mDec 15, 2017\x1b[0m\x1b[2m \x1b[0m│ Star Wars Ep. VIII:    │      $262,000,000 │ \x1b[1m$1,332,539,889\x1b[0m │ \n                     │              │ The Last Jedi          │                   │                │ \n                     └──────────────┴────────────────────────┴───────────────────┴────────────────┘ \n\x1b[1;31m                     \x1b[0m                                                                               \n\x1b[1;31m \x1b[0m\x1b[1;31mSyntax highlighting\x1b[0m\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m  \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 1 \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mdef\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;166;226;46;48;2;39;40;34miter_last\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m(\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mvalues\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m:\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mIterable\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m[\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mT\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m]\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m)\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;249;38;114;48;2;39;40;34m-\x1b[0m\x1b[38;2;249;38;114;48;2;39;40;34m>\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mIterable\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m[\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mTuple\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m[\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mbool\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m,\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mT\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m]\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m]\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m:\x1b[0m\x1b[48;2;39;40;34m          \x1b[0m \n                     \x1b[1;38;2;227;227;221;48;2;39;40;34m  \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 2 \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m    \x1b[0m\x1b[38;2;230;219;116;48;2;39;40;34m"""Iterate and generate a tuple with a flag for last value."""\x1b[0m\x1b[48;2;39;40;34m       \x1b[0m \n                     \x1b[1;38;2;227;227;221;48;2;39;40;34m  \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 3 \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m    \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34miter_values\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;249;38;114;48;2;39;40;34m=\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34miter\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m(\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mvalues\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m)\x1b[0m\x1b[48;2;39;40;34m                                           \x1b[0m \n                     \x1b[1;38;2;227;227;221;48;2;39;40;34m  \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 4 \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m    \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mtry\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m:\x1b[0m\x1b[48;2;39;40;34m                                                                 \x1b[0m \n                     \x1b[1;38;2;227;227;221;48;2;39;40;34m  \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 5 \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m        \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mprevious_value\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;249;38;114;48;2;39;40;34m=\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mnext\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m(\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34miter_values\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m)\x1b[0m\x1b[48;2;39;40;34m                               \x1b[0m \n                     \x1b[1;38;2;227;227;221;48;2;39;40;34m  \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 6 \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m    \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mexcept\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;166;226;46;48;2;39;40;34mStopIteration\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m:\x1b[0m\x1b[48;2;39;40;34m                                                \x1b[0m \n                     \x1b[1;38;2;227;227;221;48;2;39;40;34m  \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 7 \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m        \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mreturn\x1b[0m\x1b[48;2;39;40;34m                                                           \x1b[0m \n                     \x1b[1;38;2;227;227;221;48;2;39;40;34m  \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 8 \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m    \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mfor\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mvalue\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;249;38;114;48;2;39;40;34min\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34miter_values\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m:\x1b[0m\x1b[48;2;39;40;34m                                            \x1b[0m \n                     \x1b[1;38;2;227;227;221;48;2;39;40;34m  \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 9 \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m        \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34myield\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mFalse\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m,\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mprevious_value\x1b[0m\x1b[48;2;39;40;34m                                      \x1b[0m \n                     \x1b[1;38;2;227;227;221;48;2;39;40;34m  \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m10 \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m        \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mprevious_value\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;249;38;114;48;2;39;40;34m=\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mvalue\x1b[0m\x1b[48;2;39;40;34m                                           \x1b[0m \n                     \x1b[1;38;2;227;227;221;48;2;39;40;34m  \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m11 \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m    \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34myield\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mTrue\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m,\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mprevious_value\x1b[0m\x1b[48;2;39;40;34m                                           \x1b[0m \n\x1b[1;31m                     \x1b[0m                                                                               \n\x1b[1;31m \x1b[0m\x1b[1;31m           Markdown\x1b[0m\x1b[1;31m \x1b[0m# Markdown                              ╔════════════════════════════════════╗ \n                                                             ║              \x1b[1mMarkdown\x1b[0m              ║ \n                     Supports much of the *markdown*,        ╚════════════════════════════════════╝ \n                     __syntax__!                                                                    \n                                                             Supports much of the \x1b[3mmarkdown\x1b[0m, \x1b[1msyntax\x1b[0m! \n                     - Headers                                                                      \n                     - Basic formatting: **bold**,           \x1b[1;33m • \x1b[0mHeaders                             \n                     *italic*, `code`                        \x1b[1;33m • \x1b[0mBasic formatting: \x1b[1mbold\x1b[0m, \x1b[3mitalic\x1b[0m,     \n                     - Block quotes                          \x1b[1;33m   \x1b[0m\x1b[97;40mcode\x1b[0m                                \n                     - Lists, and more...                    \x1b[1;33m • \x1b[0mBlock quotes                        \n                                                             \x1b[1;33m • \x1b[0mLists, and more...                  \n\x1b[1;31m                     \x1b[0m                                                                               \n\x1b[1;31m \x1b[0m\x1b[1;31m           And more\x1b[0m\x1b[1;31m \x1b[0mProgress bars, styled logging handler, tracebacks, etc...                      \n\x1b[1;31m                     \x1b[0m                                                                               \n'
\ No newline at end of file
+expected = '\x1b[3m                                           Rich features                                            \x1b[0m\n\x1b[1;31m                     \x1b[0m                                                                               \n\x1b[1;31m \x1b[0m\x1b[1;31m             Colors\x1b[0m\x1b[1;31m \x1b[0m\x1b[1;33m256\x1b[0m colors or \x1b[1;32m16.7 million\x1b[0m colors \x1b[34m(if supported by your terminal)\x1b[0m.             \n                                                                                                    \n                     \x1b[48;5;16m  \x1b[0m\x1b[48;5;17m  \x1b[0m\x1b[48;5;18m  \x1b[0m\x1b[48;5;19m  \x1b[0m\x1b[48;5;20m  \x1b[0m\x1b[48;5;21m  \x1b[0m\x1b[48;5;52m  \x1b[0m\x1b[48;5;53m  \x1b[0m\x1b[48;5;54m  \x1b[0m\x1b[48;5;55m  \x1b[0m\x1b[48;5;56m  \x1b[0m\x1b[48;5;57m  \x1b[0m\x1b[48;5;88m  \x1b[0m\x1b[48;5;89m  \x1b[0m\x1b[48;5;90m  \x1b[0m\x1b[48;5;91m  \x1b[0m\x1b[48;5;92m  \x1b[0m\x1b[48;5;93m  \x1b[0m\x1b[48;5;124m  \x1b[0m\x1b[48;5;125m  \x1b[0m\x1b[48;5;126m  \x1b[0m\x1b[48;5;127m  \x1b[0m\x1b[48;5;128m  \x1b[0m\x1b[48;5;129m  \x1b[0m\x1b[48;5;160m  \x1b[0m\x1b[48;5;161m  \x1b[0m\x1b[48;5;162m  \x1b[0m\x1b[48;5;163m  \x1b[0m\x1b[48;5;164m  \x1b[0m\x1b[48;5;165m  \x1b[0m\x1b[48;5;196m  \x1b[0m\x1b[48;5;197m  \x1b[0m\x1b[48;5;198m  \x1b[0m\x1b[48;5;199m  \x1b[0m\x1b[48;5;200m  \x1b[0m\x1b[48;5;201m  \x1b[0m       \n                     \x1b[48;5;22m  \x1b[0m\x1b[48;5;23m  \x1b[0m\x1b[48;5;24m  \x1b[0m\x1b[48;5;25m  \x1b[0m\x1b[48;5;26m  \x1b[0m\x1b[48;5;27m  \x1b[0m\x1b[48;5;58m  \x1b[0m\x1b[48;5;59m  \x1b[0m\x1b[48;5;60m  \x1b[0m\x1b[48;5;61m  \x1b[0m\x1b[48;5;62m  \x1b[0m\x1b[48;5;63m  \x1b[0m\x1b[48;5;94m  \x1b[0m\x1b[48;5;95m  \x1b[0m\x1b[48;5;96m  \x1b[0m\x1b[48;5;97m  \x1b[0m\x1b[48;5;98m  \x1b[0m\x1b[48;5;99m  \x1b[0m\x1b[48;5;130m  \x1b[0m\x1b[48;5;131m  \x1b[0m\x1b[48;5;132m  \x1b[0m\x1b[48;5;133m  \x1b[0m\x1b[48;5;134m  \x1b[0m\x1b[48;5;135m  \x1b[0m\x1b[48;5;166m  \x1b[0m\x1b[48;5;167m  \x1b[0m\x1b[48;5;168m  \x1b[0m\x1b[48;5;169m  \x1b[0m\x1b[48;5;170m  \x1b[0m\x1b[48;5;171m  \x1b[0m\x1b[48;5;202m  \x1b[0m\x1b[48;5;203m  \x1b[0m\x1b[48;5;204m  \x1b[0m\x1b[48;5;205m  \x1b[0m\x1b[48;5;206m  \x1b[0m\x1b[48;5;207m  \x1b[0m       \n                     \x1b[48;5;28m  \x1b[0m\x1b[48;5;29m  \x1b[0m\x1b[48;5;30m  \x1b[0m\x1b[48;5;31m  \x1b[0m\x1b[48;5;32m  \x1b[0m\x1b[48;5;33m  \x1b[0m\x1b[48;5;64m  \x1b[0m\x1b[48;5;65m  \x1b[0m\x1b[48;5;66m  \x1b[0m\x1b[48;5;67m  \x1b[0m\x1b[48;5;68m  \x1b[0m\x1b[48;5;69m  \x1b[0m\x1b[48;5;100m  \x1b[0m\x1b[48;5;101m  \x1b[0m\x1b[48;5;102m  \x1b[0m\x1b[48;5;103m  \x1b[0m\x1b[48;5;104m  \x1b[0m\x1b[48;5;105m  \x1b[0m\x1b[48;5;136m  \x1b[0m\x1b[48;5;137m  \x1b[0m\x1b[48;5;138m  \x1b[0m\x1b[48;5;139m  \x1b[0m\x1b[48;5;140m  \x1b[0m\x1b[48;5;141m  \x1b[0m\x1b[48;5;172m  \x1b[0m\x1b[48;5;173m  \x1b[0m\x1b[48;5;174m  \x1b[0m\x1b[48;5;175m  \x1b[0m\x1b[48;5;176m  \x1b[0m\x1b[48;5;177m  \x1b[0m\x1b[48;5;208m  \x1b[0m\x1b[48;5;209m  \x1b[0m\x1b[48;5;210m  \x1b[0m\x1b[48;5;211m  \x1b[0m\x1b[48;5;212m  \x1b[0m\x1b[48;5;213m  \x1b[0m       \n                     \x1b[48;5;34m  \x1b[0m\x1b[48;5;35m  \x1b[0m\x1b[48;5;36m  \x1b[0m\x1b[48;5;37m  \x1b[0m\x1b[48;5;38m  \x1b[0m\x1b[48;5;39m  \x1b[0m\x1b[48;5;70m  \x1b[0m\x1b[48;5;71m  \x1b[0m\x1b[48;5;72m  \x1b[0m\x1b[48;5;73m  \x1b[0m\x1b[48;5;74m  \x1b[0m\x1b[48;5;75m  \x1b[0m\x1b[48;5;106m  \x1b[0m\x1b[48;5;107m  \x1b[0m\x1b[48;5;108m  \x1b[0m\x1b[48;5;109m  \x1b[0m\x1b[48;5;110m  \x1b[0m\x1b[48;5;111m  \x1b[0m\x1b[48;5;142m  \x1b[0m\x1b[48;5;143m  \x1b[0m\x1b[48;5;144m  \x1b[0m\x1b[48;5;145m  \x1b[0m\x1b[48;5;146m  \x1b[0m\x1b[48;5;147m  \x1b[0m\x1b[48;5;178m  \x1b[0m\x1b[48;5;179m  \x1b[0m\x1b[48;5;180m  \x1b[0m\x1b[48;5;181m  \x1b[0m\x1b[48;5;182m  \x1b[0m\x1b[48;5;183m  \x1b[0m\x1b[48;5;214m  \x1b[0m\x1b[48;5;215m  \x1b[0m\x1b[48;5;216m  \x1b[0m\x1b[48;5;217m  \x1b[0m\x1b[48;5;218m  \x1b[0m\x1b[48;5;219m  \x1b[0m       \n                     \x1b[48;5;40m  \x1b[0m\x1b[48;5;41m  \x1b[0m\x1b[48;5;42m  \x1b[0m\x1b[48;5;43m  \x1b[0m\x1b[48;5;44m  \x1b[0m\x1b[48;5;45m  \x1b[0m\x1b[48;5;76m  \x1b[0m\x1b[48;5;77m  \x1b[0m\x1b[48;5;78m  \x1b[0m\x1b[48;5;79m  \x1b[0m\x1b[48;5;80m  \x1b[0m\x1b[48;5;81m  \x1b[0m\x1b[48;5;112m  \x1b[0m\x1b[48;5;113m  \x1b[0m\x1b[48;5;114m  \x1b[0m\x1b[48;5;115m  \x1b[0m\x1b[48;5;116m  \x1b[0m\x1b[48;5;117m  \x1b[0m\x1b[48;5;148m  \x1b[0m\x1b[48;5;149m  \x1b[0m\x1b[48;5;150m  \x1b[0m\x1b[48;5;151m  \x1b[0m\x1b[48;5;152m  \x1b[0m\x1b[48;5;153m  \x1b[0m\x1b[48;5;184m  \x1b[0m\x1b[48;5;185m  \x1b[0m\x1b[48;5;186m  \x1b[0m\x1b[48;5;187m  \x1b[0m\x1b[48;5;188m  \x1b[0m\x1b[48;5;189m  \x1b[0m\x1b[48;5;220m  \x1b[0m\x1b[48;5;221m  \x1b[0m\x1b[48;5;222m  \x1b[0m\x1b[48;5;223m  \x1b[0m\x1b[48;5;224m  \x1b[0m\x1b[48;5;225m  \x1b[0m       \n                     \x1b[48;5;46m  \x1b[0m\x1b[48;5;47m  \x1b[0m\x1b[48;5;48m  \x1b[0m\x1b[48;5;49m  \x1b[0m\x1b[48;5;50m  \x1b[0m\x1b[48;5;51m  \x1b[0m\x1b[48;5;82m  \x1b[0m\x1b[48;5;83m  \x1b[0m\x1b[48;5;84m  \x1b[0m\x1b[48;5;85m  \x1b[0m\x1b[48;5;86m  \x1b[0m\x1b[48;5;87m  \x1b[0m\x1b[48;5;118m  \x1b[0m\x1b[48;5;119m  \x1b[0m\x1b[48;5;120m  \x1b[0m\x1b[48;5;121m  \x1b[0m\x1b[48;5;122m  \x1b[0m\x1b[48;5;123m  \x1b[0m\x1b[48;5;154m  \x1b[0m\x1b[48;5;155m  \x1b[0m\x1b[48;5;156m  \x1b[0m\x1b[48;5;157m  \x1b[0m\x1b[48;5;158m  \x1b[0m\x1b[48;5;159m  \x1b[0m\x1b[48;5;190m  \x1b[0m\x1b[48;5;191m  \x1b[0m\x1b[48;5;192m  \x1b[0m\x1b[48;5;193m  \x1b[0m\x1b[48;5;194m  \x1b[0m\x1b[48;5;195m  \x1b[0m\x1b[48;5;226m  \x1b[0m\x1b[48;5;227m  \x1b[0m\x1b[48;5;228m  \x1b[0m\x1b[48;5;229m  \x1b[0m\x1b[48;5;230m  \x1b[0m\x1b[48;5;231m  \x1b[0m       \n\x1b[1;31m                     \x1b[0m                                                                               \n\x1b[1;31m \x1b[0m\x1b[1;31m             Styles\x1b[0m\x1b[1;31m \x1b[0mAll ansi styles: \x1b[1mbold\x1b[0m, \x1b[2mdim\x1b[0m, \x1b[3mitalic\x1b[0m, \x1b[4munderline\x1b[0m, \x1b[9mstrikethrough\x1b[0m, \x1b[7mreverse\x1b[0m, and     \n                     even \x1b[5mblink\x1b[0m.                                                                    \n\x1b[1;31m                     \x1b[0m                                                                               \n\x1b[1;31m \x1b[0m\x1b[1;31m               Text\x1b[0m\x1b[1;31m \x1b[0mWord wrap text. Justify \x1b[32mleft\x1b[0m, \x1b[33mcenter\x1b[0m, \x1b[34mright\x1b[0m or \x1b[31mfull\x1b[0m.                           \n                                                                                                    \n                     \x1b[32mLorem ipsum dolor  \x1b[0m \x1b[33mLorem ipsum dolor \x1b[0m \x1b[34m  Lorem ipsum dolor\x1b[0m \x1b[31mLorem\x1b[0m\x1b[31m  \x1b[0m\x1b[31mipsum\x1b[0m\x1b[31m  \x1b[0m\x1b[31mdolor\x1b[0m \n                     \x1b[32msit amet,          \x1b[0m \x1b[33m    sit amet,     \x1b[0m \x1b[34m          sit amet,\x1b[0m \x1b[31msit\x1b[0m\x1b[31m           \x1b[0m\x1b[31mamet,\x1b[0m \n                     \x1b[32mconsectetur        \x1b[0m \x1b[33m   consectetur    \x1b[0m \x1b[34m        consectetur\x1b[0m \x1b[31mconsectetur\x1b[0m         \n                     \x1b[32madipiscing elit.   \x1b[0m \x1b[33m adipiscing elit. \x1b[0m \x1b[34m   adipiscing elit.\x1b[0m \x1b[31madipiscing\x1b[0m\x1b[31m    \x1b[0m\x1b[31melit.\x1b[0m \n                     \x1b[32mQuisque in metus   \x1b[0m \x1b[33m Quisque in metus \x1b[0m \x1b[34m   Quisque in metus\x1b[0m \x1b[31mQuisque\x1b[0m\x1b[31m  \x1b[0m\x1b[31min\x1b[0m\x1b[31m   \x1b[0m\x1b[31mmetus\x1b[0m \n                     \x1b[32msed sapien         \x1b[0m \x1b[33m    sed sapien    \x1b[0m \x1b[34m         sed sapien\x1b[0m \x1b[31msed\x1b[0m\x1b[31m          \x1b[0m\x1b[31msapien\x1b[0m \n                     \x1b[32multricies pretium a\x1b[0m \x1b[33multricies pretium \x1b[0m \x1b[34multricies pretium a\x1b[0m \x1b[31multricies\x1b[0m\x1b[31m \x1b[0m\x1b[31mpretium\x1b[0m\x1b[31m \x1b[0m\x1b[31ma\x1b[0m \n                     \x1b[32mat justo. Maecenas \x1b[0m \x1b[33m   a at justo.    \x1b[0m \x1b[34m at justo. Maecenas\x1b[0m \x1b[31mat\x1b[0m\x1b[31m \x1b[0m\x1b[31mjusto.\x1b[0m\x1b[31m  \x1b[0m\x1b[31mMaecenas\x1b[0m \n                     \x1b[32mluctus velit et    \x1b[0m \x1b[33m Maecenas luctus  \x1b[0m \x1b[34m    luctus velit et\x1b[0m \x1b[31mluctus\x1b[0m\x1b[31m   \x1b[0m\x1b[31mvelit\x1b[0m\x1b[31m   \x1b[0m\x1b[31met\x1b[0m \n                     \x1b[32mauctor maximus.    \x1b[0m \x1b[33m velit et auctor  \x1b[0m \x1b[34m    auctor maximus.\x1b[0m \x1b[31mauctor\x1b[0m\x1b[31m     \x1b[0m\x1b[31mmaximus.\x1b[0m \n                     \x1b[32mDonec faucibus vel \x1b[0m \x1b[33m  maximus. Donec  \x1b[0m \x1b[34m Donec faucibus vel\x1b[0m \x1b[31mDonec\x1b[0m\x1b[31m \x1b[0m\x1b[31mfaucibus\x1b[0m\x1b[31m  \x1b[0m\x1b[31mvel\x1b[0m \n                     \x1b[32marcu id pretium.   \x1b[0m \x1b[33mfaucibus vel arcu \x1b[0m \x1b[34m   arcu id pretium.\x1b[0m \x1b[31marcu id pretium.\x1b[0m    \n                                         \x1b[33m   id pretium.    \x1b[0m                                         \n\x1b[1;31m                     \x1b[0m                                                                               \n\x1b[1;31m \x1b[0m\x1b[1;31m        CJK support\x1b[0m\x1b[1;31m \x1b[0m\x1b[31m╔══════════════════════════════╗\x1b[0m                                               \n                     \x1b[31m║\x1b[0m该库支持中文，日文和韩文文本！\x1b[31m║\x1b[0m                                               \n                     \x1b[31m╚══════════════════════════════╝\x1b[0m                                               \n\x1b[1;31m                     \x1b[0m                                                                               \n\x1b[1;31m \x1b[0m\x1b[1;31m              Emoji\x1b[0m\x1b[1;31m \x1b[0mRender emoji code: :+1: :apple: :ant:   Render emoji code: 👍 🍎 🐜 🐻 🥖 🚌   \n                     :bear: :baguette_bread: :bus:                                                  \n\x1b[1;31m                     \x1b[0m                                                                               \n\x1b[1;31m \x1b[0m\x1b[1;31m     Console markup\x1b[0m\x1b[1;31m \x1b[0m[bold magenta]Rich[/] supports a        \x1b[1;35mRich\x1b[0m supports a simple \x1b[3mbbcode\x1b[0m like     \n                     simple [i]bbcode[/i] like               \x1b[1mmarkup\x1b[0m, you can use to insert \x1b[33mcolor\x1b[0m    \n                     [b]markup[/b], you can use to insert    and \x1b[4mstyle\x1b[0m.                             \n                     [yellow]color[/] and                                                           \n                     [underline]style[/].                                                           \n\x1b[1;31m                     \x1b[0m                                                                               \n\x1b[1;31m \x1b[0m\x1b[1;31m             Tables\x1b[0m\x1b[1;31m \x1b[0m\x1b[3m                             Star Wars box office                             \x1b[0m \n                     ┏━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┓ \n                     ┃\x1b[1;35m \x1b[0m\x1b[1;35mDate        \x1b[0m\x1b[1;35m \x1b[0m┃\x1b[1;35m \x1b[0m\x1b[1;35mTitle                 \x1b[0m\x1b[1;35m \x1b[0m┃\x1b[1;35m \x1b[0m\x1b[1;35mProduction Budget\x1b[0m\x1b[1;35m \x1b[0m┃\x1b[1;35m \x1b[0m\x1b[1;35m    Box Office\x1b[0m\x1b[1;35m \x1b[0m┃ \n                     ┡━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━┩ \n                     │\x1b[2m \x1b[0m\x1b[2mDec 20, 2019\x1b[0m\x1b[2m \x1b[0m│ Star Wars: The Rise of │      $275,000,000 │   $375,126,118 │ \n                     │              │ Skywalker              │                   │                │ \n                     │\x1b[2m \x1b[0m\x1b[2mMay 25, 2018\x1b[0m\x1b[2m \x1b[0m│ \x1b[31mSolo\x1b[0m: A Star Wars      │      $275,000,000 │   $393,151,347 │ \n                     │              │ Story                  │                   │                │ \n                     │\x1b[2m \x1b[0m\x1b[2mDec 15, 2017\x1b[0m\x1b[2m \x1b[0m│ Star Wars Ep. VIII:    │      $262,000,000 │ \x1b[1m$1,332,539,889\x1b[0m │ \n                     │              │ The Last Jedi          │                   │                │ \n                     └──────────────┴────────────────────────┴───────────────────┴────────────────┘ \n\x1b[1;31m                     \x1b[0m                                                                               \n\x1b[1;31m \x1b[0m\x1b[1;31mSyntax highlighting\x1b[0m\x1b[1;31m \x1b[0m\x1b[1;38;2;227;227;221;48;2;39;40;34m  \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 1 \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mdef\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;166;226;46;48;2;39;40;34miter_last\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m(\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mvalues\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m:\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mIterable\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m[\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mT\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m]\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m)\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;249;38;114;48;2;39;40;34m-\x1b[0m\x1b[38;2;249;38;114;48;2;39;40;34m>\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mIterable\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m[\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mTuple\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m[\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mbool\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m,\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mT\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m]\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m]\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m:\x1b[0m\x1b[48;2;39;40;34m          \x1b[0m \n                     \x1b[1;38;2;227;227;221;48;2;39;40;34m  \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 2 \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m    \x1b[0m\x1b[38;2;230;219;116;48;2;39;40;34m"""Iterate and generate a tuple with a flag for last value."""\x1b[0m\x1b[48;2;39;40;34m       \x1b[0m \n                     \x1b[1;38;2;227;227;221;48;2;39;40;34m  \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 3 \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m    \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34miter_values\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;249;38;114;48;2;39;40;34m=\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34miter\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m(\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mvalues\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m)\x1b[0m\x1b[48;2;39;40;34m                                           \x1b[0m \n                     \x1b[1;38;2;227;227;221;48;2;39;40;34m  \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 4 \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m    \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mtry\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m:\x1b[0m\x1b[48;2;39;40;34m                                                                 \x1b[0m \n                     \x1b[1;38;2;227;227;221;48;2;39;40;34m  \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 5 \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m        \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mprevious_value\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;249;38;114;48;2;39;40;34m=\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mnext\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m(\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34miter_values\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m)\x1b[0m\x1b[48;2;39;40;34m                               \x1b[0m \n                     \x1b[1;38;2;227;227;221;48;2;39;40;34m  \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 6 \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m    \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mexcept\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;166;226;46;48;2;39;40;34mStopIteration\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m:\x1b[0m\x1b[48;2;39;40;34m                                                \x1b[0m \n                     \x1b[1;38;2;227;227;221;48;2;39;40;34m  \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 7 \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m        \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mreturn\x1b[0m\x1b[48;2;39;40;34m                                                           \x1b[0m \n                     \x1b[1;38;2;227;227;221;48;2;39;40;34m  \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 8 \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m    \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mfor\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mvalue\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;249;38;114;48;2;39;40;34min\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34miter_values\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m:\x1b[0m\x1b[48;2;39;40;34m                                            \x1b[0m \n                     \x1b[1;38;2;227;227;221;48;2;39;40;34m  \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m 9 \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m        \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34myield\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mFalse\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m,\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mprevious_value\x1b[0m\x1b[48;2;39;40;34m                                      \x1b[0m \n                     \x1b[1;38;2;227;227;221;48;2;39;40;34m  \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m10 \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m        \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mprevious_value\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;249;38;114;48;2;39;40;34m=\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mvalue\x1b[0m\x1b[48;2;39;40;34m                                           \x1b[0m \n                     \x1b[1;38;2;227;227;221;48;2;39;40;34m  \x1b[0m\x1b[38;2;101;102;96;48;2;39;40;34m11 \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m    \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34myield\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;102;217;239;48;2;39;40;34mTrue\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m,\x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34m \x1b[0m\x1b[38;2;248;248;242;48;2;39;40;34mprevious_value\x1b[0m\x1b[48;2;39;40;34m                                           \x1b[0m \n\x1b[1;31m                     \x1b[0m                                                                               \n\x1b[1;31m \x1b[0m\x1b[1;31m           Markdown\x1b[0m\x1b[1;31m \x1b[0m# Markdown                              ╔════════════════════════════════════╗ \n                                                             ║              \x1b[1mMarkdown\x1b[0m              ║ \n                     Supports much of the *markdown*,        ╚════════════════════════════════════╝ \n                     __syntax__!                                                                    \n                                                             Supports much of the \x1b[3mmarkdown\x1b[0m, \x1b[1msyntax\x1b[0m! \n                     - Headers                                                                      \n                     - Basic formatting: **bold**,           \x1b[1;33m • \x1b[0mHeaders                             \n                     *italic*, `code`                        \x1b[1;33m • \x1b[0mBasic formatting: \x1b[1mbold\x1b[0m, \x1b[3mitalic\x1b[0m,     \n                     - Block quotes                          \x1b[1;33m   \x1b[0m\x1b[97;40mcode\x1b[0m                                \n                     - Lists, and more...                    \x1b[1;33m • \x1b[0mBlock quotes                        \n                                                             \x1b[1;33m • \x1b[0mLists, and more...                  \n\x1b[1;31m                     \x1b[0m                                                                               \n\x1b[1;31m \x1b[0m\x1b[1;31m           And more\x1b[0m\x1b[1;31m \x1b[0mProgress bars, styled logging handler, tracebacks, etc...                      \n\x1b[1;31m                     \x1b[0m                                                                               \n'
diff --git a/tests/test_rule.py b/tests/test_rule.py
--- a/tests/test_rule.py
+++ b/tests/test_rule.py
@@ -11,13 +11,16 @@ def test_rule():
     console = Console(
         width=16, file=io.StringIO(), force_terminal=True, legacy_windows=False
     )
-    console.rule()
-    console.rule("foo")
+    console.print(Rule())
+    console.print(Rule("foo"))
     console.rule(Text("foo", style="bold"))
     console.rule("foobarbazeggfoobarbazegg")
-    expected = "\x1b[92m────────────────\x1b[0m\n\x1b[92m───── \x1b[0mfoo\x1b[92m ──────\x1b[0m\n\x1b[92m───── \x1b[0m\x1b[1mfoo\x1b[0m\x1b[92m ──────\x1b[0m\n\x1b[92m─ \x1b[0mfoobarbazeg…\x1b[92m ─\x1b[0m\n"
+    expected = "\x1b[92m────────────────\x1b[0m\n"
+    expected += "\x1b[92m───── \x1b[0mfoo\x1b[92m ──────\x1b[0m\n"
+    expected += "\x1b[92m───── \x1b[0m\x1b[1mfoo\x1b[0m\x1b[92m ──────\x1b[0m\n"
+    expected += "\x1b[92m─ \x1b[0mfoobarbazeg…\x1b[92m ─\x1b[0m\n"
+
     result = console.file.getvalue()
-    print(repr(result))
     assert result == expected
 
 
@@ -34,6 +37,23 @@ def test_rule_cjk():
     assert console.file.getvalue() == expected
 
 
+def test_characters():
+    console = Console(
+        width=16,
+        file=io.StringIO(),
+        force_terminal=True,
+        color_system=None,
+        legacy_windows=False,
+    )
+    console.rule(characters="+*")
+    console.rule("foo", characters="+*")
+    console.print(Rule(characters=".,"))
+    expected = "+*+*+*+*+*+*+*+*\n"
+    expected += "+*+*+ foo +*+*+*\n"
+    expected += ".,.,.,.,.,.,.,.,\n"
+    assert console.file.getvalue() == expected
+
+
 def test_repr():
     rule = Rule("foo")
     assert isinstance(repr(rule), str)
@@ -41,4 +61,4 @@ def test_repr():
 
 def test_error():
     with pytest.raises(ValueError):
-        Rule(character="bar")
+        Rule(characters="")