beautifygraph.py
96 lines
| 3.0 KiB
| text/x-python
|
PythonLexer
/ hgext / beautifygraph.py
John Stiles
|
r38359 | # -*- coding: UTF-8 -*- | ||
# beautifygraph.py - improve graph output by using Unicode characters | ||||
# | ||||
# Copyright 2018 John Stiles <johnstiles@gmail.com> | ||||
# | ||||
# This software may be used and distributed according to the terms of the | ||||
# GNU General Public License version 2 or any later version. | ||||
'''beautify log -G output by using Unicode characters (EXPERIMENTAL) | ||||
A terminal with UTF-8 support and monospace narrow text are required. | ||||
''' | ||||
from __future__ import absolute_import | ||||
from mercurial.i18n import _ | ||||
from mercurial import ( | ||||
encoding, | ||||
extensions, | ||||
graphmod, | ||||
Gregory Szorc
|
r38806 | pycompat, | ||
John Stiles
|
r38359 | templatekw, | ||
) | ||||
# Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for | ||||
# extensions which SHIP WITH MERCURIAL. Non-mainline extensions should | ||||
# be specifying the version(s) of Mercurial they are tested with, or | ||||
# leave the attribute unspecified. | ||||
testedwith = 'ships-with-hg-core' | ||||
def prettyedge(before, edge, after): | ||||
if edge == '~': | ||||
return '\xE2\x95\xA7' # U+2567 ╧ | ||||
if edge == 'X': | ||||
return '\xE2\x95\xB3' # U+2573 ╳ | ||||
if edge == '/': | ||||
return '\xE2\x95\xB1' # U+2571 ╱ | ||||
if edge == '-': | ||||
return '\xE2\x94\x80' # U+2500 ─ | ||||
if edge == '|': | ||||
return '\xE2\x94\x82' # U+2502 │ | ||||
if edge == ':': | ||||
return '\xE2\x94\x86' # U+2506 ┆ | ||||
if edge == '\\': | ||||
return '\xE2\x95\xB2' # U+2572 ╲ | ||||
if edge == '+': | ||||
if before == ' ' and not after == ' ': | ||||
return '\xE2\x94\x9C' # U+251C ├ | ||||
if after == ' ' and not before == ' ': | ||||
return '\xE2\x94\xA4' # U+2524 ┤ | ||||
return '\xE2\x94\xBC' # U+253C ┼ | ||||
return edge | ||||
def convertedges(line): | ||||
line = ' %s ' % line | ||||
pretty = [] | ||||
Gregory Szorc
|
r38806 | for idx in pycompat.xrange(len(line) - 2): | ||
Augie Fackler
|
r39089 | pretty.append(prettyedge(line[idx:idx + 1], | ||
line[idx + 1:idx + 2], | ||||
line[idx + 2:idx + 3])) | ||||
John Stiles
|
r38359 | return ''.join(pretty) | ||
def getprettygraphnode(orig, *args, **kwargs): | ||||
node = orig(*args, **kwargs) | ||||
if node == 'o': | ||||
return '\xE2\x97\x8B' # U+25CB ○ | ||||
if node == '@': | ||||
return '\xE2\x97\x8D' # U+25CD ◍ | ||||
if node == '*': | ||||
return '\xE2\x88\x97' # U+2217 ∗ | ||||
if node == 'x': | ||||
return '\xE2\x97\x8C' # U+25CC ◌ | ||||
if node == '_': | ||||
return '\xE2\x95\xA4' # U+2564 ╤ | ||||
return node | ||||
def outputprettygraph(orig, ui, graph, *args, **kwargs): | ||||
(edges, text) = zip(*graph) | ||||
graph = zip([convertedges(e) for e in edges], text) | ||||
return orig(ui, graph, *args, **kwargs) | ||||
def extsetup(ui): | ||||
Augie Fackler
|
r39249 | if ui.plain('graph'): | ||
return | ||||
John Stiles
|
r38359 | if encoding.encoding != 'UTF-8': | ||
ui.warn(_('beautifygraph: unsupported encoding, UTF-8 required\n')) | ||||
return | ||||
Augie Fackler
|
r39088 | if r'A' in encoding._wide: | ||
John Stiles
|
r38359 | ui.warn(_('beautifygraph: unsupported terminal settings, ' | ||
'monospace narrow text required\n')) | ||||
return | ||||
extensions.wrapfunction(graphmod, 'outputgraph', outputprettygraph) | ||||
extensions.wrapfunction(templatekw, 'getgraphnode', getprettygraphnode) | ||||