Skip to content

Commit 0970d7e

Browse files
committed
Fix tex root determination
This commit makes sure to resolve open view's root document properly, by first checking for `%!TEX root=...` and falling back to only project-specific settings' `latextools.tex_root` while properly resolving relative paths. Without this commit... 1. fallback to settings may not have worked for unsaved sub-documents. 2. sub-document's file name is returned, if resolved main document doesn't exist, which incorrectly turns sub-document into main document, instead of giving caller a chance to handle invalid directive/settings.
1 parent 0647380 commit 0970d7e

File tree

2 files changed

+21
-38
lines changed

2 files changed

+21
-38
lines changed

latextools/utils/is_tex_file.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ def is_tex_file(file_name, exts=None, view=None):
99
if not isinstance(file_name, str):
1010
raise TypeError("file_name must be a string")
1111

12-
return any(map(file_name.lower().endswith, exts or get_tex_extensions(view)))
12+
lower_name = file_name.lower()
13+
return any(map(lower_name.endswith, exts or get_tex_extensions(view)))

latextools/utils/tex_directives.py

Lines changed: 19 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
from .is_tex_file import is_tex_file
99
from .logging import logger
10+
from .sublime_utils import get_project_data
1011
from .sublime_utils import get_project_file_name
1112

1213

@@ -110,48 +111,29 @@ def parse_tex_directives(view_or_path, multi_values=[], key_maps={}, only_for=[]
110111
lines.close()
111112

112113

113-
# Contributed by Sam Finn
114114
def get_tex_root(view):
115115
if not view:
116116
return None
117117

118118
view_file = view.file_name()
119119

120-
root = None
121-
directives = parse_tex_directives(view, only_for=["root"])
122-
try:
123-
root = directives["root"]
124-
except KeyError:
125-
pass
126-
else:
127-
if not is_tex_file(root):
128-
root = None
129-
elif not os.path.isabs(root) and view_file is not None:
130-
file_path, _ = os.path.split(view_file)
131-
root = os.path.normpath(os.path.join(file_path, root))
132-
133-
if root is None:
134-
root = get_tex_root_from_settings(view)
135-
136-
if root is not None:
137-
return root
138-
return view_file
139-
140-
141-
def get_tex_root_from_settings(view):
142-
root = view.settings().get("latextools.tex_root", None)
143-
144-
if root is not None:
120+
# from directive
121+
root = parse_tex_directives(view, only_for=["root"]).get("root")
122+
if root and is_tex_file(root):
123+
root = os.path.normpath(root)
145124
if os.path.isabs(root):
146-
if os.path.isfile(root):
147-
return root
148-
else:
149-
proj_file = get_project_file_name(view)
150-
151-
if proj_file:
152-
project_dir = os.path.dirname(proj_file)
153-
root_path = os.path.normpath(os.path.join(project_dir, root))
154-
if os.path.isfile(root_path):
155-
return root_path
125+
return root
126+
if view_file:
127+
return os.path.join(os.path.dirname(view_file), root)
128+
129+
# from project-specific settings
130+
root = get_project_data(view).get("settings", {}).get("latextools.tex_root")
131+
if root and is_tex_file(root):
132+
root = os.path.normpath(root)
133+
if os.path.isabs(root):
134+
return root
135+
proj_file = get_project_file_name(view)
136+
if proj_file:
137+
return os.path.join(os.path.dirname(proj_file), root)
156138

157-
return root
139+
return view_file

0 commit comments

Comments
 (0)