Put a message inside a box. Args: message (unicode): message to decorate. border_color (unicode): name of the color to outline the box with.
(message, border_color=None)
| 159 | |
| 160 | |
| 161 | def boxify(message, border_color=None): |
| 162 | """Put a message inside a box. |
| 163 | |
| 164 | Args: |
| 165 | message (unicode): message to decorate. |
| 166 | border_color (unicode): name of the color to outline the box with. |
| 167 | """ |
| 168 | lines = message.split("\n") |
| 169 | max_width = max(_visual_width(line) for line in lines) |
| 170 | |
| 171 | padding_horizontal = 5 |
| 172 | padding_vertical = 1 |
| 173 | |
| 174 | box_size_horizontal = max_width + (padding_horizontal * 2) |
| 175 | |
| 176 | chars = {"corner": "+", "horizontal": "-", "vertical": "|", "empty": " "} |
| 177 | |
| 178 | margin = "{corner}{line}{corner}\n".format( |
| 179 | corner=chars["corner"], line=chars["horizontal"] * box_size_horizontal |
| 180 | ) |
| 181 | |
| 182 | padding_lines = [ |
| 183 | "{border}{space}{border}\n".format( |
| 184 | border=colorize(chars["vertical"], color=border_color), |
| 185 | space=chars["empty"] * box_size_horizontal, |
| 186 | ) |
| 187 | * padding_vertical |
| 188 | ] |
| 189 | |
| 190 | content_lines = [ |
| 191 | "{border}{space}{content}{space}{border}\n".format( |
| 192 | border=colorize(chars["vertical"], color=border_color), |
| 193 | space=chars["empty"] * padding_horizontal, |
| 194 | content=_visual_center(line, max_width), |
| 195 | ) |
| 196 | for line in lines |
| 197 | ] |
| 198 | |
| 199 | return "{margin}{padding}{content}{padding}{margin}".format( |
| 200 | margin=colorize(margin, color=border_color), |
| 201 | padding="".join(padding_lines), |
| 202 | content="".join(content_lines), |
| 203 | ) |
| 204 | |
| 205 | |
| 206 | def _visual_width(line): |
no test coverage detected