7 On @defManual manual refManual eg @defManual LM rlearning
8 Associate manual name 'manual' with reference @'refManual'{ ... }
9 Add 'refManual' to list of keywords
10 On @setManual manual set current manual name to 'manual'
11 On @include open and process new file
12 On @node add node to Nodes list with current manual name and current file name
13 On @ref add contents to References list with refManual, current manual name and current file name
14 On one of refManual keywords add contents to References list with ditto
16 Process References list:
17 Check reference is contained in Nodes list with refManual in Nodes = refManual in References
21 Node names containing commas are only checked up to the comma
22 Spurious warnings "Xref should be internal" for files in /included
27 ##################################################
29 """ Holds References and Nodes """
33 self.nodeNames = {} # used to check for duplicates only
37 def addManual(self, manualName, refManual):
38 self.Manuals[refManual] = manualName
40 def getRefManuals(self):
41 return self.Manuals.keys()
43 def getManualName(self, refManual):
44 return self.Manuals[refManual]
46 def addNode(self, nodeName, manualName, fileName):
48 # print "Node: ", nodeName, " in ", manualName, " found in ", fileName
51 print "nodeName: ", nodeName, " in ", fileName, " contains backslash"
52 if manualName+"/"+nodeName in self.Nodes.keys():
53 print "Error: Duplicate nodename ",nodeName, " in ", fileName, " and ", self.Nodes[manualName+"/"+nodeName][1]
55 self.Nodes[manualName + "/" + nodeName] = [manualName, fileName]
56 self.nodeNames[nodeName] = fileName
58 def addRef(self, toManualName, toHeading, inFileName):
62 print "ref to: ", toHeading, " in ", inFileName, " contains backslash"
63 # if inFileName == "notation/vocal.itely":
64 # print "Ref to ", toManualName, "/",toHeading, " found in ", inFileName
65 self.Refs.append([toManualName + "/" + toHeading, inFileName])
69 for [refHeading, refFileName] in self.Refs:
71 targetFileName = self.Nodes[refHeading]
72 # if refFileName == "notation/vocal.itely":
73 # print "ref to: ", refHeading, " in ", refFileName, " found in ", targetFileName
76 print "ref to: ", refHeading, " in ", refFileName, " not found"
78 print " All references satisfied"
82 ##################################################
84 """ Process an included file """
87 CurrentManualName = ""
93 def __init__(self, fileName):
94 self.fileName = fileName
96 self.fullFileName = File.Paths[fileName] + fileName
98 self.fullFileName = File.DefaultPath + fileName
100 def read(self, crossRefs):
105 myfile = open(self.fullFileName, 'r')
107 print "File ", self.fullFileName, " referenced in ", File.CurrentManualName, " but not found"
115 if words[0] == "@ignore" or words[0] == "@macro":
117 if skip and len(words) > 1:
118 if words[0] == "@end" and (words[1].find("ignore") >= 0 or words[1].find("macro") >= 0):
121 if not skip and words[0] != "@c":
122 if words[0].find("@defManual") >= 0:
123 # Manual definition found - extract manual name and refManual string
124 manualName = words[1]
126 crossRefs.addManual(manualName, refManual)
127 # print manualName, refManual
129 elif words[0].find("@defaultPath") >=0:
130 File.DefaultPath = words[1]
132 elif words[0].find("@path") >=0:
133 File.Paths[words[1]] = words[2]
135 elif words[0].find("@setManual") >= 0:
136 File.CurrentManualName = words[1]
137 # print " Checking ", File.CurrentManualName
139 elif words[0].find("@exclude") >=0:
140 File.Excludes.append(words[1])
142 elif words[0].find("@include") >= 0:
143 if words[1] not in File.Excludes:
144 currentFileName = words[1]
145 # print " File: ", currentFileName
146 currentFile = File(currentFileName)
147 currentFile.read(crossRefs)
149 elif words[0] == "@node":
150 nodeName = line[6:-1]
151 crossRefs.addNode(nodeName, File.CurrentManualName, self.fileName)
155 twoLines = remainderLine + ' ' + line.strip()
156 manualRefStrings = crossRefs.getRefManuals()
158 for manualRefString in manualRefStrings:
159 toManualName = crossRefs.getManualName(manualRefString)
160 actualToManualName = toManualName
161 if toManualName == "this":
162 toManualName = File.CurrentManualName
163 refString = "@" + manualRefString + "{"
164 refStart = twoLines.find(refString)
167 if actualToManualName == File.CurrentManualName:
168 print "Warning: should xref be internal around line ", lineNo, " in ", self.fileName, "?"
169 twoLines = twoLines[refStart:]
170 refNodeStart = twoLines.find("{") + 1
171 # TODO Need to check here for nested {}
172 refNodeEnd = twoLines.find("}")
173 refNodeEndComma = twoLines.find(",")
174 if refNodeEndComma > 0:
175 refNodeEnd = min(refNodeEnd, refNodeEndComma)
177 crossRefs.addRef(toManualName, twoLines[refNodeStart:refNodeEnd], self.fileName)
178 remainderLine=twoLines[refNodeEnd+1:]
188 topFile = File("scripts/auxiliar/ref_check.tely") # TODO get from input params
189 print "RefCheck ver 0.1"
191 crossRefs = CrossRefs()
192 topFile.read(crossRefs)
195 print "Errors found: status code: ",returnCode