diff --git a/CHANGES b/CHANGES index 5b890fe8420..3739db03572 100644 --- a/CHANGES +++ b/CHANGES @@ -13,6 +13,9 @@ Deprecated Features added -------------- +* Revert the removal of ``sphinx.util:force_decode()`` to become some 3rd party + extensions available again during 5.0 + Bugs fixed ---------- diff --git a/doc/extdev/deprecated.rst b/doc/extdev/deprecated.rst index 9e17b9fb4f0..e37c2b2ba4b 100644 --- a/doc/extdev/deprecated.rst +++ b/doc/extdev/deprecated.rst @@ -1015,7 +1015,7 @@ The following is a list of deprecated interfaces. * - ``sphinx.util.force_decode()`` - 2.0 - - 4.0 + - 5.0 - N/A * - ``sphinx.util.get_matching_docs()`` diff --git a/sphinx/util/__init__.py b/sphinx/util/__init__.py index 7e24909ee83..170c554d77b 100644 --- a/sphinx/util/__init__.py +++ b/sphinx/util/__init__.py @@ -337,6 +337,23 @@ def parselinenos(spec: str, total: int) -> List[int]: return items +def force_decode(string: str, encoding: str) -> str: + """Forcibly get a unicode string out of a bytestring.""" + warnings.warn('force_decode() is deprecated.', + RemovedInSphinx50Warning, stacklevel=2) + if isinstance(string, bytes): + try: + if encoding: + string = string.decode(encoding) + else: + # try decoding with utf-8, should only work for real UTF-8 + string = string.decode() + except UnicodeError: + # last resort -- can't fail + string = string.decode('latin1') + return string + + def rpartition(s: str, t: str) -> Tuple[str, str]: """Similar to str.rpartition from 2.5, but doesn't return the separator.""" warnings.warn('rpartition() is now deprecated.', RemovedInSphinx50Warning, stacklevel=2)