diff --git a/pptx/text/fonts.py b/pptx/text/fonts.py index 9c67352a7..73919f827 100644 --- a/pptx/text/fonts.py +++ b/pptx/text/fonts.py @@ -54,6 +54,8 @@ def _font_directories(cls): return cls._os_x_font_directories() if sys.platform.startswith('win32'): return cls._windows_font_directories() + if sys.platform.startswith('linux'): + return cls._linux_font_directories() raise OSError('unsupported operating system') @classmethod @@ -100,6 +102,23 @@ def _windows_font_directories(cls): """ return [r'C:\Windows\Fonts'] + @classmethod + def _linux_font_directories(cls): + """ + Return a sequence of directory paths on Linux in which fonts are + likely to be located. + """ + linux_font_dirs = [ + '/usr/share/fonts', + '/usr/local/share/fonts', + ] + home = os.environ.get('HOME') + if home is not None: + linux_font_dirs.extend([ + os.path.join(home, '.fonts'), + os.path.join(home, '.local/share/fonts'), + ]) + return linux_font_dirs class _Font(object): """ diff --git a/tests/text/test_fonts.py b/tests/text/test_fonts.py index 95cdc7a68..d6971cb45 100644 --- a/tests/text/test_fonts.py +++ b/tests/text/test_fonts.py @@ -54,6 +54,11 @@ def it_knows_windows_font_dirs_to_help_find(self, win_dirs_fixture): font_dirs = FontFiles._windows_font_directories() assert font_dirs == expected_dirs + def it_knows_linux_font_dirs_to_help_find(self, linux_dirs_fixture): + expected_dirs = linux_dirs_fixture + font_dirs = FontFiles._linux_font_directories() + assert font_dirs == expected_dirs + def it_iterates_over_fonts_in_dir_to_help_find(self, iter_fixture): directory, _Font_, expected_calls, expected_paths = iter_fixture paths = list(FontFiles._iter_font_files_in(directory)) @@ -77,14 +82,16 @@ def find_fixture(self, request, _installed_fonts_): @pytest.fixture(params=[ ('darwin', ['a', 'b']), ('win32', ['c', 'd']), + ('linux', ['e', 'f']), ]) def font_dirs_fixture( self, request, _os_x_font_directories_, - _windows_font_directories_): + _windows_font_directories_, _linux_font_directories_): platform, expected_dirs = request.param dirs_meth_mock = { 'darwin': _os_x_font_directories_, 'win32': _windows_font_directories_, + 'linux': _linux_font_directories_, }[platform] sys_ = var_mock(request, 'pptx.text.fonts.sys') sys_.platform = platform @@ -133,6 +140,19 @@ def osx_dirs_fixture(self, request): def win_dirs_fixture(self, request): return [r'C:\Windows\Fonts'] + @pytest.fixture + def linux_dirs_fixture(self, request): + import os + os_ = var_mock(request, 'pptx.text.fonts.os') + os_.path = os.path + os_.environ = {'HOME': '/home/fbar'} + return [ + '/usr/share/fonts', + '/usr/local/share/fonts', + '/home/fbar/.fonts', + '/home/fbar/.local/share/fonts', + ] + # fixture components ----------------------------------- @pytest.fixture @@ -167,6 +187,9 @@ def _os_x_font_directories_(self, request): def _windows_font_directories_(self, request): return method_mock(request, FontFiles, '_windows_font_directories') + @pytest.fixture + def _linux_font_directories_(self, request): + return method_mock(request, FontFiles, '_linux_font_directories') class Describe_Font(object):