def importTextFile(fileName, frame): # the 1 MB limit is arbitrary, we just want to avoid getting a # MemoryError exception for /dev/zero etc. data = util.loadFile(fileName, frame, 1000000) if data == None: return None if len(data) == 0: wx.MessageBox("File is empty.", "Error", wx.OK, frame) return None data = util.fixNL(data) lines = data.split("\n") tabWidth = 4 # key = indent level, value = Indent indDict = {} for i in range(len(lines)): s = util.toInputStr(lines[i].rstrip().expandtabs(tabWidth)) # don't count empty lines towards indentation statistics if s.strip() == "": lines[i] = "" continue cnt = util.countInitial(s, " ") ind = indDict.get(cnt) if not ind: ind = Indent(cnt) indDict[cnt] = ind tmp = s.upper() if util.multiFind(tmp, ["EXT.", "INT."]): ind.sceneStart += 1 if util.multiFind(tmp, ["CUT TO:", "DISSOLVE TO:"]): ind.trans += 1 if re.match(r"^ +\(.*\)$", tmp): ind.paren += 1 ind.lines.append(s.lstrip()) lines[i] = s if len(indDict) == 0: wx.MessageBox("File contains only empty lines.", "Error", wx.OK, frame) return None # scene/action indent setType(SCENE_ACTION, indDict, lambda v: v.sceneStart) # indent with most lines is dialogue in non-pure-action scripts setType(screenplay.DIALOGUE, indDict, lambda v: len(v.lines)) # remaining indent with lines is character most likely setType(screenplay.CHARACTER, indDict, lambda v: len(v.lines)) # transitions setType(screenplay.TRANSITION, indDict, lambda v: v.trans) # parentheticals setType(screenplay.PAREN, indDict, lambda v: v.paren) # some text files have this type of parens: # # JOE # (smiling and # hopping along) # # this handles them. parenIndent = findIndent(indDict, lambda v: v.lt == screenplay.PAREN) if parenIndent != -1: paren2Indent = findIndent( indDict, lambda v, var: (v.lt == -1) and (v.indent == var), parenIndent + 1) if paren2Indent != -1: indDict[paren2Indent].lt = screenplay.PAREN # set line type to ACTION for any indents not recognized for v in indDict.itervalues(): if v.lt == -1: v.lt = screenplay.ACTION dlg = ImportDlg(frame, indDict.values()) if dlg.ShowModal() != wx.ID_OK: dlg.Destroy() return None dlg.Destroy() ret = [] for i in range(len(lines)): s = lines[i] cnt = util.countInitial(s, " ") s = s.lstrip() sUp = s.upper() if s: lt = indDict[cnt].lt if lt == IGNORE: continue if lt == SCENE_ACTION: if s.startswith("EXT.") or s.startswith("INT."): lt = screenplay.SCENE else: lt = screenplay.ACTION if ret and (ret[-1].lt != lt): ret[-1].lb = screenplay.LB_LAST if lt == screenplay.CHARACTER: if sUp.endswith("(CONT'D)"): s = sUp[:-8].rstrip() elif lt == screenplay.PAREN: if s == "(continuing)": s = "" if s: line = screenplay.Line(screenplay.LB_SPACE, lt, s) ret.append(line) elif ret: ret[-1].lb = screenplay.LB_LAST if len(ret) == 0: ret.append(screenplay.Line(screenplay.LB_LAST, screenplay.ACTION)) # make sure the last line ends an element ret[-1].lb = screenplay.LB_LAST return ret
def importTextFile(fileName, frame): # the 1 MB limit is arbitrary, we just want to avoid getting a # MemoryError exception for /dev/zero etc. data = util.loadFile(fileName, frame, 1000000) if data == None: return None if len(data) == 0: wx.MessageBox("File is empty.", "Error", wx.OK, frame) return None data = util.fixNL(data) lines = data.split("\n") tabWidth = 4 # key = indent level, value = Indent indDict = {} for i in range(len(lines)): s = util.toInputStr(lines[i].rstrip().expandtabs(tabWidth)) # don't count empty lines towards indentation statistics if s.strip() == "": lines[i] = "" continue cnt = util.countInitial(s, " ") ind = indDict.get(cnt) if not ind: ind = Indent(cnt) indDict[cnt] = ind tmp = s.upper() if util.multiFind(tmp, ["EXT.", "INT."]): ind.sceneStart += 1 if util.multiFind(tmp, ["CUT TO:", "DISSOLVE TO:"]): ind.trans += 1 if re.match(r"^ +\(.*\)$", tmp): ind.paren += 1 ind.lines.append(s.lstrip()) lines[i] = s if len(indDict) == 0: wx.MessageBox("File contains only empty lines.", "Error", wx.OK, frame) return None # scene/action indent setType(SCENE_ACTION, indDict, lambda v: v.sceneStart) # indent with most lines is dialogue in non-pure-action scripts setType(screenplay.DIALOGUE, indDict, lambda v: len(v.lines)) # remaining indent with lines is character most likely setType(screenplay.CHARACTER, indDict, lambda v: len(v.lines)) # transitions setType(screenplay.TRANSITION, indDict, lambda v: v.trans) # parentheticals setType(screenplay.PAREN, indDict, lambda v: v.paren) # some text files have this type of parens: # # JOE # (smiling and # hopping along) # # this handles them. parenIndent = findIndent(indDict, lambda v: v.lt == screenplay.PAREN) if parenIndent != -1: paren2Indent = findIndent(indDict, lambda v, var: (v.lt == -1) and (v.indent == var), parenIndent + 1) if paren2Indent != -1: indDict[paren2Indent].lt = screenplay.PAREN # set line type to ACTION for any indents not recognized for v in indDict.itervalues(): if v.lt == -1: v.lt = screenplay.ACTION dlg = ImportDlg(frame, indDict.values()) if dlg.ShowModal() != wx.ID_OK: dlg.Destroy() return None dlg.Destroy() ret = [] for i in range(len(lines)): s = lines[i] cnt = util.countInitial(s, " ") s = s.lstrip() sUp = s.upper() if s: lt = indDict[cnt].lt if lt == IGNORE: continue if lt == SCENE_ACTION: if s.startswith("EXT.") or s.startswith("INT."): lt = screenplay.SCENE else: lt = screenplay.ACTION if ret and (ret[-1].lt != lt): ret[-1].lb = screenplay.LB_LAST if lt == screenplay.CHARACTER: if sUp.endswith("(CONT'D)"): s = sUp[:-8].rstrip() elif lt == screenplay.PAREN: if s == "(continuing)": s = "" if s: line = screenplay.Line(screenplay.LB_SPACE, lt, s) ret.append(line) elif ret: ret[-1].lb = screenplay.LB_LAST if len(ret) == 0: ret.append(screenplay.Line(screenplay.LB_LAST, screenplay.ACTION)) # make sure the last line ends an element ret[-1].lb = screenplay.LB_LAST return ret