mirror of
https://github.com/panda3d/panda3d.git
synced 2025-09-30 16:58:40 -04:00
inline_file
This commit is contained in:
parent
c4e79695e9
commit
e84cf13bda
@ -1283,13 +1283,13 @@ class Packager:
|
||||
|
||||
return words
|
||||
|
||||
def __getNextLine(self, file, lineNum):
|
||||
""" Extracts the next line from the input file, and splits it
|
||||
into words. Returns a tuple (lineNum, list), or (lineNum,
|
||||
None) at end of file. """
|
||||
def __getNextLine(self):
|
||||
""" Extracts the next line from self.inFile, and splits it
|
||||
into words. Returns the list of words, or None at end of
|
||||
file. """
|
||||
|
||||
line = file.readline()
|
||||
lineNum += 1
|
||||
line = self.inFile.readline()
|
||||
self.lineNum += 1
|
||||
while line:
|
||||
line = line.strip()
|
||||
if not line:
|
||||
@ -1301,13 +1301,13 @@ class Packager:
|
||||
pass
|
||||
|
||||
else:
|
||||
return (lineNum, self.__splitLine(line))
|
||||
return self.__splitLine(line)
|
||||
|
||||
line = file.readline()
|
||||
lineNum += 1
|
||||
line = self.inFile.readline()
|
||||
self.lineNum += 1
|
||||
|
||||
# End of file.
|
||||
return (lineNum, None)
|
||||
return None
|
||||
|
||||
def readPackageDef(self, packageDef):
|
||||
""" Reads the lines in the .pdef file named by packageDef and
|
||||
@ -1317,13 +1317,13 @@ class Packager:
|
||||
self.packageList = []
|
||||
|
||||
self.notify.info('Reading %s' % (packageDef))
|
||||
file = open(packageDef.toOsSpecific())
|
||||
lineNum = 0
|
||||
self.inFile = open(packageDef.toOsSpecific())
|
||||
self.lineNum = 0
|
||||
|
||||
# Now start parsing the packageDef lines
|
||||
try:
|
||||
lineNum, words = self.__getNextLine(file, lineNum)
|
||||
while words:
|
||||
words = self.__getNextLine()
|
||||
while words is not None:
|
||||
command = words[0]
|
||||
try:
|
||||
methodName = 'parse_%s' % (command)
|
||||
@ -1341,20 +1341,55 @@ class Packager:
|
||||
message = '%s command encounted outside of package specification' %(command)
|
||||
raise OutsideOfPackageError, message
|
||||
|
||||
lineNum, words = self.__getNextLine(file, lineNum)
|
||||
words = self.__getNextLine()
|
||||
|
||||
except PackagerError:
|
||||
# Append the line number and file name to the exception
|
||||
# error message.
|
||||
inst = sys.exc_info()[1]
|
||||
inst.args = (inst.args[0] + ' on line %s of %s' % (lineNum, packageDef),)
|
||||
inst.args = (inst.args[0] + ' on line %s of %s' % (self.lineNum, packageDef),)
|
||||
del self.inFile
|
||||
del self.lineNum
|
||||
raise
|
||||
|
||||
del self.inFile
|
||||
del self.lineNum
|
||||
|
||||
packageList = self.packageList
|
||||
self.packageList = []
|
||||
|
||||
return packageList
|
||||
|
||||
def __expandTabs(self, line, tabWidth = 8):
|
||||
""" Expands tab characters in the line to 8 spaces. """
|
||||
p = 0
|
||||
while p < len(line):
|
||||
if line[p] == '\t':
|
||||
# Expand a tab.
|
||||
nextStop = ((p + tabWidth) / tabWidth) * tabWidth
|
||||
numSpaces = nextStop - p
|
||||
line = line[:p] + ' ' * numSpaces + line[p + 1:]
|
||||
p = nextStop
|
||||
else:
|
||||
p += 1
|
||||
|
||||
return line
|
||||
|
||||
def __countLeadingWhitespace(self, line):
|
||||
""" Returns the number of leading whitespace characters in the
|
||||
line. """
|
||||
|
||||
line = self.__expandTabs(line)
|
||||
return len(line) - len(line.lstrip())
|
||||
|
||||
def __stripLeadingWhitespace(self, line, whitespaceCount):
|
||||
""" Removes the indicated number of whitespace characters, but
|
||||
no more. """
|
||||
|
||||
line = self.__expandTabs(line)
|
||||
line = line[:whitespaceCount].lstrip() + line[whitespaceCount:]
|
||||
return line
|
||||
|
||||
def parse_set(self, words):
|
||||
"""
|
||||
set variable=value
|
||||
@ -1588,6 +1623,93 @@ class Packager:
|
||||
newNameOrDir = newNameOrDir, extract = extract,
|
||||
executable = executable)
|
||||
|
||||
def parse_inline_file(self, words):
|
||||
"""
|
||||
inline_file newName [extract=1] <<[-] eof-symbol
|
||||
.... file text
|
||||
.... file text
|
||||
eof-symbol
|
||||
"""
|
||||
|
||||
if not self.currentPackage:
|
||||
raise OutsideOfPackageError
|
||||
|
||||
# Look for the eof-symbol at the end of the command line.
|
||||
eofSymbols = None
|
||||
for i in range(len(words)):
|
||||
if words[i].startswith('<<'):
|
||||
eofSymbols = words[i:]
|
||||
words = words[:i]
|
||||
break
|
||||
if eofSymbols is None:
|
||||
raise PackagerError, 'No << appearing on inline_file'
|
||||
|
||||
# Following the bash convention, <<- means to strip leading
|
||||
# whitespace, << means to keep it.
|
||||
stripWhitespace = False
|
||||
if eofSymbols[0][0:3] == '<<-':
|
||||
stripWhitespace = True
|
||||
eofSymbols[0] = eofSymbols[0][3:]
|
||||
else:
|
||||
eofSymbols[0] = eofSymbols[0][2:]
|
||||
|
||||
# If there's nothing left in the first word, look to the next
|
||||
# word.
|
||||
if not eofSymbols[0]:
|
||||
del eofSymbols[0]
|
||||
|
||||
if len(eofSymbols) == 1:
|
||||
# The eof symbol is the only word.
|
||||
eofSymbol = eofSymbols[0]
|
||||
else:
|
||||
# It must be only one word.
|
||||
raise PackagerError, 'Only one word may follow <<'
|
||||
|
||||
# Now parse the remaining args.
|
||||
args = self.__parseArgs(words, ['extract'])
|
||||
|
||||
newName = None
|
||||
try:
|
||||
command, newName = words
|
||||
except ValueError:
|
||||
raise ArgumentError
|
||||
|
||||
extract = args.get('extract', None)
|
||||
if extract is not None:
|
||||
extract = int(extract)
|
||||
|
||||
tempFile = Filename.temporary('', self.currentPackage.packageName)
|
||||
temp = open(tempFile.toOsSpecific(), 'w')
|
||||
|
||||
# Now read text from the input file until we come across
|
||||
# eofSymbol on a line by itself.
|
||||
lineNum = self.lineNum
|
||||
line = self.inFile.readline()
|
||||
if not line:
|
||||
raise PackagerError, 'No text following inline_file'
|
||||
lineNum += 1
|
||||
line = line.rstrip()
|
||||
if stripWhitespace:
|
||||
# For the first line, we count up the amount of
|
||||
# whitespace.
|
||||
whitespaceCount = self.__countLeadingWhitespace(line)
|
||||
line = self.__stripLeadingWhitespace(line, whitespaceCount)
|
||||
|
||||
while line != eofSymbol:
|
||||
print >> temp, line
|
||||
line = self.inFile.readline()
|
||||
if not line:
|
||||
raise PackagerError, 'EOF indicator not found following inline_file'
|
||||
lineNum += 1
|
||||
line = line.rstrip()
|
||||
if stripWhitespace:
|
||||
line = self.__stripLeadingWhitespace(line, whitespaceCount)
|
||||
|
||||
temp.close()
|
||||
self.lineNum = lineNum
|
||||
self.file(tempFile, deleteTemp = True,
|
||||
newNameOrDir = newName, extract = extract)
|
||||
|
||||
def parse_exclude(self, words):
|
||||
"""
|
||||
exclude filename
|
||||
@ -2010,8 +2132,8 @@ class Packager:
|
||||
freezer.reset()
|
||||
package.mainModule = None
|
||||
|
||||
def file(self, filename, newNameOrDir = None, extract = None,
|
||||
executable = None):
|
||||
def file(self, filename, source = None, newNameOrDir = None,
|
||||
extract = None, executable = None, deleteTemp = False):
|
||||
""" Adds the indicated arbitrary file to the current package.
|
||||
|
||||
The file is placed in the named directory, or the toplevel
|
||||
@ -2037,6 +2159,9 @@ class Packager:
|
||||
|
||||
If executable is true, the file is marked as an executable
|
||||
filename, for special treatment.
|
||||
|
||||
If deleteTemp is true, the file is a temporary file and will
|
||||
be deleted after its contents are copied to the package.
|
||||
|
||||
"""
|
||||
|
||||
@ -2070,7 +2195,8 @@ class Packager:
|
||||
|
||||
self.currentPackage.addFile(
|
||||
filename, newName = name, extract = extract,
|
||||
explicit = explicit, executable = executable)
|
||||
explicit = explicit, executable = executable,
|
||||
deleteTemp = deleteTemp)
|
||||
|
||||
def exclude(self, filename):
|
||||
""" Marks the indicated filename as not to be included. The
|
||||
|
Loading…
x
Reference in New Issue
Block a user