##// END OF EJS Templates
configitems: declare items in a TOML file...
configitems: declare items in a TOML file Mercurial ships with Rust code that also needs to read from the config. Having a way of presenting `configitems` to both Python and Rust is needed to prevent duplication, drift, and have the appropriate devel warnings. Abstracting away from Python means choosing a config format. No single format is perfect, and I have yet to come across a developer that doesn't hate all of them in some way. Since we have a strict no-dependencies policy for Mercurial, we either need to use whatever comes with Python, vendor a library, or implement a custom format ourselves. Python stdlib means using JSON, which doesn't support comments and isn't great for humans, or `configparser` which is an obscure, untyped format that nobody uses and doesn't have a commonplace Rust parser. Implementing a custom format is error-prone, tedious and subject to the same issues as picking an existing format. Vendoring opens us to the vast array of common config formats. The ones being picked for most modern software are YAML and TOML. YAML is older and common in the Python community, but TOML is much simpler and less error-prone. I would much rather be responsible for the <1000 lines of `tomli`, on top of TOML being the choice of the Rust community, with robust crates for reading it. The structure of `configitems.toml` is explained inline.

File last commit:

r50445:5f22c92d stable
r51655:c51b178b default
Show More
highlight.py
100 lines | 3.1 KiB | text/x-python | PythonLexer
Martin Geisler
highlight: add copyright and license header
r8251 # highlight.py - highlight extension implementation file
#
# Copyright 2007-2009 Adam Hupp <adam@hupp.org> and others
#
# This software may be used and distributed according to the terms of the
Matt Mackall
Update license to GPLv2+
r10263 # GNU General Public License version 2 or any later version.
Patrick Mezard
highlight: split code to improve startup times
r6938 #
# The original module was split in an interface and an implementation
# file to defer pygments loading and speedup extension setup.
Pulkit Goyal
py3: make files use absolute_import and print_function...
r29485
Patrick Mezard
highlight: split code to improve startup times
r6938 from mercurial import demandimport
Augie Fackler
formatting: blacken the codebase...
r43346
Matt Harbison
demandimport: convert ignored modules from bytes -> str in extensions...
r50445 demandimport.IGNORES.update(['pkgutil', 'pkg_resources', '__main__'])
Pulkit Goyal
py3: make files use absolute_import and print_function...
r29485
from mercurial import (
encoding,
Connor Sheehan
highlight: fix encoding issues to enable Py3 compatibility...
r43193 pycompat,
Yuya Nishihara
stringutil: bulk-replace call sites to point to new module...
r37102 )
Augie Fackler
formatting: blacken the codebase...
r43346 from mercurial.utils import stringutil
Patrick Mezard
highlight: split code to improve startup times
r6938
Augie Fackler
highlight: put pygments import inside demandimport.deactivated...
r32908 with demandimport.deactivated():
import pygments
import pygments.formatters
import pygments.lexers
Augie Fackler
highlight: eagerly discover plugin lexers while demandimport is off...
r35330 import pygments.plugin
Augie Fackler
highlight: put pygments import inside demandimport.deactivated...
r32908 import pygments.util
Augie Fackler
highlight: eagerly discover plugin lexers while demandimport is off...
r35330 for unused in pygments.plugin.find_plugin_lexers():
pass
Pulkit Goyal
py3: make files use absolute_import and print_function...
r29485 highlight = pygments.highlight
ClassNotFound = pygments.util.ClassNotFound
guess_lexer = pygments.lexers.guess_lexer
guess_lexer_for_filename = pygments.lexers.guess_lexer_for_filename
TextLexer = pygments.lexers.TextLexer
HtmlFormatter = pygments.formatters.HtmlFormatter
Patrick Mezard
highlight: split code to improve startup times
r6938
Augie Fackler
formatting: blacken the codebase...
r43346 SYNTAX_CSS = (
Martin von Zweigbergk
cleanup: join string literals that are already on one line...
r43387 b'\n<link rel="stylesheet" href="{url}highlightcss" type="text/css" />'
Augie Fackler
formatting: blacken the codebase...
r43346 )
Patrick Mezard
highlight: split code to improve startup times
r6938
Gregory Szorc
highlight: add option to prevent content-only based fallback...
r26680 def pygmentize(field, fctx, style, tmpl, guessfilenameonly=False):
Patrick Mezard
highlight: split code to improve startup times
r6938
# append a <link ...> to the syntax highlighting css
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 tmpl.load(b'header')
old_header = tmpl.cache[b'header']
Patrick Mezard
highlight: split code to improve startup times
r6938 if SYNTAX_CSS not in old_header:
timeless
cleanup: remove superfluous space after space after equals (python)
r27637 new_header = old_header + SYNTAX_CSS
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 tmpl.cache[b'header'] = new_header
Patrick Mezard
highlight: split code to improve startup times
r6938
text = fctx.data()
Yuya Nishihara
stringutil: bulk-replace call sites to point to new module...
r37102 if stringutil.binary(text):
Patrick Mezard
highlight: split code to improve startup times
r6938 return
Matt Mackall
highlight: ignore Unicode's extra linebreaks (issue4291)...
r23613 # str.splitlines() != unicode.splitlines() because "reasons"
Denis Laxalde
py3: avoid iterating over a literal bytes in highlight...
r44014 for c in b"\x0c", b"\x1c", b"\x1d", b"\x1e":
Matt Mackall
highlight: ignore Unicode's extra linebreaks (issue4291)...
r23613 if c in text:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 text = text.replace(c, b'')
Matt Mackall
highlight: ignore Unicode's extra linebreaks (issue4291)...
r23613
Yuya Nishihara
highlight: fixes garbled text in non-UTF-8 environment...
r9424 # Pygments is best used with Unicode strings:
# <http://pygments.org/docs/unicode/>
Connor Sheehan
highlight: fix encoding issues to enable Py3 compatibility...
r43193 text = text.decode(pycompat.sysstr(encoding.encoding), 'replace')
Christian Ebert
highlight: convert text to local before passing to pygmentize (issue1341)...
r7120
Patrick Mezard
highlight: split code to improve startup times
r6938 # To get multi-line strings right, we can't format line-by-line
try:
Connor Sheehan
highlight: fix encoding issues to enable Py3 compatibility...
r43193 path = pycompat.sysstr(fctx.path())
Augie Fackler
formatting: blacken the codebase...
r43346 lexer = guess_lexer_for_filename(path, text[:1024], stripnl=False)
Patrick Mezard
highlight: split code to improve startup times
r6938 except (ClassNotFound, ValueError):
Gregory Szorc
highlight: add option to prevent content-only based fallback...
r26680 # guess_lexer will return a lexer if *any* lexer matches. There is
# no way to specify a minimum match score. This can give a high rate of
# false positives on files with an unknown filename pattern.
if guessfilenameonly:
return
Patrick Mezard
highlight: split code to improve startup times
r6938 try:
Alexander Plavin
highlight: fix page layout with empty first and last lines...
r19169 lexer = guess_lexer(text[:1024], stripnl=False)
Patrick Mezard
highlight: split code to improve startup times
r6938 except (ClassNotFound, ValueError):
av6
highlight: exit early on textual and unknown files (issue3005)...
r25899 # Don't highlight unknown files
return
# Don't highlight text files
if isinstance(lexer, TextLexer):
return
Patrick Mezard
highlight: split code to improve startup times
r6938
Connor Sheehan
highlight: fix encoding issues to enable Py3 compatibility...
r43193 formatter = HtmlFormatter(nowrap=True, style=pycompat.sysstr(style))
Patrick Mezard
highlight: split code to improve startup times
r6938
colorized = highlight(text, lexer, formatter)
Augie Fackler
formatting: blacken the codebase...
r43346 coloriter = (
s.encode(pycompat.sysstr(encoding.encoding), 'replace')
for s in colorized.splitlines()
)
Patrick Mezard
highlight: split code to improve startup times
r6938
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 tmpl._filters[b'colorize'] = lambda x: next(coloriter)
Patrick Mezard
highlight: split code to improve startup times
r6938
oldl = tmpl.cache[field]
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 newl = oldl.replace(b'line|escape', b'line|colorize')
Patrick Mezard
highlight: split code to improve startup times
r6938 tmpl.cache[field] = newl