-
Notifications
You must be signed in to change notification settings - Fork 0
/
GetRefs.py
53 lines (50 loc) · 1.98 KB
/
GetRefs.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#Script to get all labels in TeX project
import glob as glob
import sys
def ExtractLabelInfo(lineNum):
info = {}
line = allText[lineNum]
try:
info['Type'] = line.split('\label{')[1].split(':')[0]
info['Key'] = line.split('\label{'+info['Type']+':')[1].split('}')[0]
if (info['Type'] in ['fig','tab']):
info['Caption'] = line.split('\label{'+info['Type']+':'+info['Key']+'}')[1].split('}')[0]
elif (info['Type']=='sec'):
try:
sectionLine = allText[lineNum-1]
info['Section'] = sectionLine.split('{')[1].split('}')[0]
info['Section Type'] = sectionLine.split('\\')[1].split('{')[0]
except IndexError:
pass
except IndexError:
info = {}
info['Label'] = line.split('\label{')[1].split('}')[0]
info['File'] = fileMarkers[keysList[[II for II, key in enumerate(keysList) if key<lineNum][-1]]]
return info
#Specify directory of project
try:
directory = sys.argv[1] #The target directory can be parsed from the command line
except IndexError:
directory = '' #A default directory can be specified here
if (len(directory)==0):
directory = './' #Allow working in directory where this script is saved
if not(directory[-1]=='/'):
directory+='/'
#Search for all .tex files in main directory and subdirectories
texFiles = glob.glob(directory+'**/*.tex',recursive=True)
#Get every line of text into one list with a dictionary marking
# indices of beginnings of files
allText = []
fileMarkers = {}
for texFile in texFiles:
fileMarkers[len(allText)] = texFile.split(directory)[-1]
with open(texFile,'r') as f:
allText.extend(f.readlines())
keysList = list(fileMarkers.keys())
#Find all lines containg \label
labelLines = [II for II, line in enumerate(allText) if '\label' in line and not line[0]=='%']
#Extract label info
labels = [ExtractLabelInfo(labelLine) for labelLine in labelLines]
for label in labels:
print(label)
print('\n')