From: Jakub Wilk <jwilk@debian.org>
Date: Thu, 8 Oct 2015 11:57:09 -0700
Subject: Allow all data files to be moved to /usr/share/docutils/.

Forwarded: not-needed
Last-Update: 2023-05-20
---
 docutils/__init__.py                               | 24 ++++++++++++++++++++++
 docutils/parsers/rst/directives/misc.py            |  3 ++-
 docutils/writers/html4css1/__init__.py             | 11 +++++-----
 docutils/writers/html5_polyglot/__init__.py        |  6 ++++--
 docutils/writers/latex2e/__init__.py               |  9 ++++++--
 docutils/writers/odf_odt/__init__.py               |  4 ++--
 docutils/writers/pep_html/__init__.py              |  5 +++--
 docutils/writers/s5_html/__init__.py               |  2 +-
 .../test_rst/test_directives/test_include.py       |  3 ++-
 9 files changed, 51 insertions(+), 16 deletions(-)

diff --git a/docutils/__init__.py b/docutils/__init__.py
index 16af410..1c196f8 100644
--- a/docutils/__init__.py
+++ b/docutils/__init__.py
@@ -289,3 +289,27 @@ class Component(SettingsSpec, TransformSpec):
         a certain input context or output format.
         """
         return format in self.supported
+
+import os
+
+_debian_package = 0
+
+if _debian_package:
+    def _datadir(path, buildloc=None):
+        dirname = os.path.dirname(path)
+        prefix = os.path.join(os.path.dirname(__file__), '') # _datadir
+        assert path.startswith(prefix), "%r doesn't start with %r" % (path, prefix)
+        suffix = dirname[len(prefix):]
+        datadir = os.path.join('/usr/share/docutils/', suffix)
+
+        # If we are in the process of building the Debian python-docutils
+        # package, we must look for latex files in the debian/tmp directory
+        # rather than in /usr, as they don't yet exist there.
+        if _debian_package == 'build' and buildloc == 'local':
+            datadir = 'debian/tmp' + datadir
+
+        return datadir
+
+else:
+    def _datadir(path, buildloc=None):
+        return os.path.dirname(path)
diff --git a/docutils/parsers/rst/directives/misc.py b/docutils/parsers/rst/directives/misc.py
index c16e943..2af3232 100644
--- a/docutils/parsers/rst/directives/misc.py
+++ b/docutils/parsers/rst/directives/misc.py
@@ -12,6 +12,7 @@ import time
 from urllib.request import urlopen
 from urllib.error import URLError
 
+import docutils
 from docutils import io, nodes, statemachine, utils
 from docutils.parsers.rst import Directive, convert_directive_function
 from docutils.parsers.rst import directives, roles, states
@@ -64,7 +65,7 @@ class Include(Directive):
                    'class': directives.class_option,
                    'name': directives.unchanged}
 
-    standard_include_path = Path(states.__file__).parent / 'include'
+    standard_include_path = Path(docutils._datadir(states.__file__)) / 'include'
 
     def run(self):
         """Include a file as part of the content of this reST file.
diff --git a/docutils/writers/html4css1/__init__.py b/docutils/writers/html4css1/__init__.py
index 799d30e..2afe0cb 100644
--- a/docutils/writers/html4css1/__init__.py
+++ b/docutils/writers/html4css1/__init__.py
@@ -17,6 +17,7 @@ __docformat__ = 'reStructuredText'
 import os.path
 import re
 
+import docutils
 from docutils import frontend, nodes, writers
 from docutils.writers import _html_base
 from docutils.writers._html_base import PIL
@@ -29,13 +30,13 @@ class Writer(writers._html_base.Writer):
 
     default_stylesheets = ['html4css1.css']
     default_stylesheet_dirs = ['.',
-                               os.path.abspath(os.path.dirname(__file__)),
-                               os.path.abspath(os.path.join(
-                                   os.path.dirname(os.path.dirname(__file__)),
-                                   'html5_polyglot'))  # for math.css
+                               docutils._datadir(os.path.abspath(__file__)),
+                               os.path.join(
+                                   docutils._datadir(os.path.dirname(os.path.abspath(__file__))),
+                                   'html5_polyglot')  # for math.css
                                ]
     default_template = os.path.join(
-        os.path.dirname(os.path.abspath(__file__)), 'template.txt')
+        docutils._datadir(os.path.abspath(__file__)), 'template.txt')
 
     # use a copy of the parent spec with some modifications
     settings_spec = frontend.filter_settings_spec(
diff --git a/docutils/writers/html5_polyglot/__init__.py b/docutils/writers/html5_polyglot/__init__.py
index c9bdf66..5fdf1da 100644
--- a/docutils/writers/html5_polyglot/__init__.py
+++ b/docutils/writers/html5_polyglot/__init__.py
@@ -26,8 +26,10 @@ the style sheet "plain.css" improves reading experience.
 """
 __docformat__ = 'reStructuredText'
 
+import os.path
 from pathlib import Path
 
+import docutils
 from docutils import frontend, nodes
 from docutils.writers import _html_base
 
@@ -38,8 +40,8 @@ class Writer(_html_base.Writer):
     """Formats this writer supports."""
 
     default_stylesheets = ['minimal.css', 'plain.css']
-    default_stylesheet_dirs = ['.', str(Path(__file__).parent)]
-    default_template = Path(__file__).parent / 'template.txt'
+    default_stylesheet_dirs = ['.', docutils._datadir(os.path.abspath(__file__))]
+    default_template = Path(docutils._datadir(os.path.abspath(__file__))) / 'template.txt'
 
     # use a copy of the parent spec with some modifications
     settings_spec = frontend.filter_settings_spec(
diff --git a/docutils/writers/latex2e/__init__.py b/docutils/writers/latex2e/__init__.py
index d1960a7..52f28bf 100644
--- a/docutils/writers/latex2e/__init__.py
+++ b/docutils/writers/latex2e/__init__.py
@@ -12,6 +12,7 @@ __docformat__ = 'reStructuredText'
 #
 # convention deactivate code by two # i.e. ##.
 
+import os.path
 from pathlib import Path
 import re
 import string
@@ -22,11 +23,12 @@ try:
 except ImportError:
     import docutils.utils.roman as roman
 
+import docutils
 from docutils import frontend, nodes, languages, writers, utils
 from docutils.transforms import writer_aux
 from docutils.utils.math import pick_math_environment, unichar2tex
 
-LATEX_WRITER_DIR = Path(__file__).parent
+LATEX_WRITER_DIR = Path(docutils._datadir(os.path.abspath(__file__)))
 
 
 class Writer(writers.Writer):
@@ -593,7 +595,10 @@ def _read_block(fp):
     return ''.join(block).rstrip()
 
 
-with open(LATEX_WRITER_DIR/'docutils.sty', encoding='utf-8') as fp:
+_docutils_sty = os.path.join(docutils._datadir(os.path.abspath(__file__),
+                                               "local"),
+                             'docutils.sty')
+with open(_docutils_sty, encoding='utf-8') as fp:
     for line in fp:
         line = line.strip('% \n')
         if not line.endswith('::'):
diff --git a/docutils/writers/odf_odt/__init__.py b/docutils/writers/odf_odt/__init__.py
index c538af3..c736983 100644
--- a/docutils/writers/odf_odt/__init__.py
+++ b/docutils/writers/odf_odt/__init__.py
@@ -370,13 +370,13 @@ class Writer(writers.Writer):
 
     default_stylesheet_path = utils.relative_path(
         os.path.join(os.getcwd(), 'dummy'),
-        os.path.join(os.path.dirname(__file__), default_stylesheet))
+        os.path.join(docutils._datadir(__file__), default_stylesheet))
 
     default_template = 'template.txt'
 
     default_template_path = utils.relative_path(
         os.path.join(os.getcwd(), 'dummy'),
-        os.path.join(os.path.dirname(__file__), default_template))
+        os.path.join(docutils._datadir(__file__), default_template))
 
     settings_spec = (
         'ODF-Specific Options.',
diff --git a/docutils/writers/pep_html/__init__.py b/docutils/writers/pep_html/__init__.py
index dfde2e4..3df36ea 100644
--- a/docutils/writers/pep_html/__init__.py
+++ b/docutils/writers/pep_html/__init__.py
@@ -12,6 +12,7 @@ __docformat__ = 'reStructuredText'
 import os
 import os.path
 
+import docutils
 from docutils import frontend, nodes, utils
 from docutils.writers import html4css1
 
@@ -22,13 +23,13 @@ class Writer(html4css1.Writer):
 
     default_stylesheet_path = utils.relative_path(
         os.path.join(os.getcwd(), 'dummy'),
-        os.path.join(os.path.dirname(__file__), default_stylesheet))
+        os.path.join(docutils._datadir(__file__), default_stylesheet))
 
     default_template = 'template.txt'
 
     default_template_path = utils.relative_path(
         os.path.join(os.getcwd(), 'dummy'),
-        os.path.join(os.path.dirname(__file__), default_template))
+        os.path.join(docutils._datadir(__file__), default_template))
 
     settings_spec = html4css1.Writer.settings_spec + (
         'PEP/HTML Writer Options',
diff --git a/docutils/writers/s5_html/__init__.py b/docutils/writers/s5_html/__init__.py
index 7014de3..e18fc82 100644
--- a/docutils/writers/s5_html/__init__.py
+++ b/docutils/writers/s5_html/__init__.py
@@ -18,7 +18,7 @@ from docutils.writers import html4css1
 
 themes_dir_path = utils.relative_path(
     os.path.join(os.getcwd(), 'dummy'),
-    os.path.join(os.path.dirname(__file__), 'themes'))
+    os.path.join(docutils._datadir(__file__), 'themes'))
 
 
 def find_theme(name):
diff --git a/test/test_parsers/test_rst/test_directives/test_include.py b/test/test_parsers/test_rst/test_directives/test_include.py
index 99514a0..1d96b5a 100755
--- a/test/test_parsers/test_rst/test_directives/test_include.py
+++ b/test/test_parsers/test_rst/test_directives/test_include.py
@@ -17,6 +17,7 @@ if __name__ == '__main__':
     # so we import the local `docutils` package.
     sys.path.insert(0, str(Path(__file__).resolve().parents[4]))
 
+import docutils
 from docutils import parsers, utils
 from docutils.frontend import get_default_settings
 from docutils.parsers.rst import Parser
@@ -95,7 +96,7 @@ latin2 = os.path.join(TEST_ROOT, 'data/latin2.txt')
 utf_16_file = os.path.join(TEST_ROOT, 'data/utf-16-le-sig.txt')
 utf_16_error_str = ("UnicodeDecodeError: 'ascii' codec can't decode byte 0xff "
                     "in position 0: ordinal not in range(128)")
-rst_states_dir = os.path.dirname(parsers.rst.states.__file__)
+rst_states_dir = docutils._datadir(parsers.rst.states.__file__)
 # TODO fix case normalisation bug on Windows in utils.relative_path()
 # nonexistent = os.path.relpath(
 #     os.path.join(rst_states_dir, 'include', 'nonexistent'),
