def setSessionDate(): '''sets a default date for new cards''' if dataIndex.sessionDate == None: dialog = SessionDate.SessionDateManager() if dialog.exec_(): tDate = dialog.getSessionDate() dataIndex.sessionDate = tDate dataIndex.fldbk.actionSession_Date.setChecked(1) else: dataIndex.sessionDate = 'today' else: tDate = dataIndex.sessionDate if dataIndex.sessionDate == 'today': tDate = SessionDate.dateFinder() dataIndex.fldbk.actionSession_Date.setChecked(0) return tDate
def setSessionResearcher(p0): if p0 == True: dialog = SessionDate.SessionResearcherManager() if dialog.exec_(): researcher = dialog.getSessionResearcher() dataIndex.sessionResearcher = researcher dataIndex.lastRschr = researcher dataIndex.root.set('LastRschr', researcher) else: dataIndex.sessionResearcher = None
def setSessionSpeaker(p0): if p0 == True: dialog = SessionDate.SessionSpeakerManager() if dialog.exec_(): speaker = dialog.getSessionSpeaker() dataIndex.sessionSpeaker = speaker dataIndex.lastSpeaker = speaker dataIndex.root.set('LastSpeaker', speaker) else: dataIndex.sessionSpeaker = None
def newDataset(fldbk, title, newText=''): #1 create DSNode tDate = setSessionDate() today = SessionDate.dateFinder() newID = idGenerator.generateID('DS', dataIndex.dataDict) newNode = etree.Element('Dset') newNode.set('DsetID', newID) newNode.set('Date', tDate) newNode.set('Update', today) if dataIndex.lastSpeaker != None: newNode.set('Spkr', dataIndex.lastSpeaker) else: newNode.set('Spkr', '') if dataIndex.lastRschr != None: newNode.set('Rschr', dataIndex.lastRschr) else: newNode.set('Rschr', '') etree.SubElement(newNode, 'Title') etree.SubElement(newNode, 'Data') newNode.find('Title').text = title newNode.find('Data').text = newText #2 add new DS to XML and dataDict and set current DSet dataIndex.dataDict[newID] = newNode dataIndex.lastDset = newID dList = list(dataIndex.dataDict.keys()) lastDCard = dataIndex.dataDict[dList[len(dataIndex.dataDict) - 1]] try: i = list(dataIndex.root).index(lastDCard) except ValueError: lastDCard = dataIndex.dataDict[dList[len(dataIndex.dataDict) - 2]] i = list(dataIndex.root).index(lastDCard) if len(dataIndex.dataDict.keys()) == 1: badNode = dataIndex.root.find('Dset') badID = badNode.attrib.get('DsetID') if badID == 'DS00': dataIndex.root.remove(badNode) del dataIndex.dataDict[badID] dataIndex.root.insert(i, newNode) #3 add new DS to listnav navLists.navListBuilderData(fldbk) cardLoader.resetNavBars(fldbk.dDataNav, newID) dataIndex.currentCard = newID dataIndex.lastDset = newID dataIndex.root.set('LastDset', newID) return newNode
def tRemoveLine(fldbk): dataIndex.unsavedEdit = 1 updated = SessionDate.dateFinder() fldbk.tUpdated.setPlainText(updated) text = dataIndex.currentText ##step 1: update text XML (remove line from text) text.set('Update', updated) textElementList = text.findall('Ln') try: badID = dataIndex.currentTextTable.verticalHeaderItem(0).data( 35).attrib.get('ExID') for line in textElementList: if line.attrib.get('LnRef') == badID: text.remove(line) break except AttributeError: badID = None index = int( dataIndex.currentTextTable.verticalHeaderItem(0).text()) - 1 badLine = textElementList[index] text.remove(badLine) ##step 2: rebuild tText cardLoader.addTextWidget(fldbk, text) dataIndex.currentTextTable = None ##step 3: expunge line from database altogether? if badID != None: expungeMessage = QtWidgets.QMessageBox() expungeMessage.setStandardButtons(QtWidgets.QMessageBox.Cancel | QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No) expungeMessage.setDefaultButton(QtWidgets.QMessageBox.No) expungeMessage.setText('Expunge line from database?') expungeMessage.setInformativeText( 'This will remove the example and all cross-references permanently.' ) expungeMessage.exec_() if expungeMessage.result() == QtWidgets.QMessageBox.Yes: update.cleanUpIDs(badID)
def newData(self, oldID): self.fldbk = dataIndex.fldbk line1 = self.firstLine.toPlainText() line2 = self.secondLine.toPlainText() gloss11 = self.firstL1.toPlainText() gloss12 = self.secondL1.toPlainText() if len(self.firstL2.toPlainText()) !=0: gloss21 = self.firstL2.toPlainText() gloss22 = self.secondL2.toPlainText() if self.egTable.columnCount() != 0: mrphList1 = [] mrphList2 = [] ilegList1 = [] ilegList2 = [] mrph1 = None mrph2 = None ileg1 = None ileg2 = None for i in range(0,self.egTable.currentColumn()): mrphList1.append(self.egTable.item(0,i).text()) ilegList1.append(self.egTable.item(1,i).text()) for i in range(self.egTable.currentColumn(),self.egTable.columnCount()): mrphList2.append(self.egTable.item(0,i).text()) ilegList2.append(self.egTable.item(1,i).text()) for item in mrphList1: if mrph1 == None: mrph1 = item else: mrph1 += '\t' + item for item in mrphList2: if mrph2 == None: mrph2 = item else: mrph2 += '\t' + item for item in ilegList1: if ileg1 == None: ileg1 = item else: ileg1 += '\t' + item for item in ilegList2: if ileg2 == None: ileg2 = item else: ileg2 += '\t' + item update = SessionDate.dateFinder() tDate = self.fldbk.tDate.toPlainText() spkr = self.fldbk.tSource.toPlainText() rschr = self.fldbk.tResearcher.toPlainText() newID = idGenerator.generateID('Ex', dataIndex.exDict) ##revised node node = dataIndex.exDict[oldID] node.find('Line').text = line1 d = i if self.egTable.columnCount() != 0: node.find('Mrph').text = mrph1 node.find('ILEG').text = ileg1 node.find('L1Gloss').text = gloss11 node.find('L2Gloss').text = gloss21 node.set('Update',update) k = dataIndex.root.find('Ex[@ExID="%s"]'%oldID) d = list(dataIndex.root).index(k) + 1 ##new node newNode = etree.Element('Ex') etree.SubElement(newNode,'Line') newNode.find('Line').text = line2 if self.egTable.columnCount() != 0: etree.SubElement(newNode,'Mrph') etree.SubElement(newNode,'ILEG') newNode.find('Mrph').text = mrph2 newNode.find('ILEG').text = ileg2 etree.SubElement(newNode,'L1Gloss') newNode.find('L1Gloss').text = gloss12 etree.SubElement(newNode,'L2Gloss') newNode.find('L2Gloss').text = gloss22 newNode.set('Date',tDate) newNode.set('Update',update) newNode.set('Spkr',spkr) newNode.set('Rschr',rschr) newNode.set('ExID',newID) if node.attrib.get('SourceText') != None: newNode.set('SourceText', node.attrib.get('SourceText')) dataIndex.root.insert(d,newNode) dataIndex.exDict[newID] = newNode idList = [oldID,newID] return idList
def tNewLine(fldbk): ''' adds a new line to a text immediately following the currently selected line ''' if dataIndex.currentTextTable == None: return update = SessionDate.dateFinder() scroll = fldbk.tFullText.verticalScrollBar().value() timeCode = None spokenBy = None newLineDialog = AddTextLine.AddLineDialog() if newLineDialog.exec_(): values = newLineDialog.returnValues() if len(values[0]) == 0: #bial if there is no text supplied return else: return if values[1] != None: spokenBy, values[1] = codeExtractor.getSpokenBy(values[1]) if '[' in values[ 1]: # check to see if timeCode is contained in the gloss timeCode, endTime, values[1] = codeExtractor.getTime(values[1]) ##step one: generate nodes (Ln in both cases, EX if possible) newLineNode = etree.Element('Ln') if spokenBy != None: newLineNode.set('SpokenBy', spokenBy) if values[2] == True: #if unparseable if values[1] == None: newLineNode.text = values[0] else: newLineNode.text = values[0] + '\n' + values[1] if timeCode != None: newLineNode.set('Time', timeCode) if endTime != None: newLineNode.set('EndTime', endTime) else: #if parseable, we need to set up an Ex Node for it tDate = fldbk.tDate.toPlainText() spkr = fldbk.tSource.toPlainText() rschr = fldbk.tResearcher.toPlainText() newExNode = etree.Element('Ex') etree.SubElement(newExNode, 'Line') etree.SubElement(newExNode, 'Mrph') etree.SubElement(newExNode, 'ILEG') etree.SubElement(newExNode, 'L1Gloss') newExNode.find('Line').text = values[0] newExNode.find('L1Gloss').text = values[1] ExID = idGenerator.generateID('Ex', dataIndex.exDict) newExNode.set('ExID', ExID) newExNode.set('Date', tDate) newExNode.set('Update', update) newExNode.set('Spkr', spkr) newExNode.set('Rschr', rschr) newExNode.set('SourceText', dataIndex.currentCard) if timeCode != None: newExNode.set('Time', timeCode) ##insert ex nodes into XML and add to dicts dataIndex.exDict[ExID] = newExNode prevID = dataIndex.currentTextTable.verticalHeaderItem(0).data( 35).attrib.get('ExID') k = dataIndex.root.find('Ex[@ExID="%s"]' % prevID) d = list(dataIndex.root).index(k) dataIndex.root.insert(d + 1, newExNode) newLineNode.set('LnRef', ExID) ##insert Ln node textRoot = dataIndex.currentText textViewIndex = int( dataIndex.currentTextTable.verticalHeaderItem(0).text()) if textViewIndex == 1: msgbox = QtWidgets.QMessageBox() msgbox.setIcon(QtWidgets.QMessageBox.Question) msgbox.setText("Add line at beginning?") msgbox.setInformativeText( "Add this line before the first line of the text?") msgbox.setStandardButtons(QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No) msgbox.setDefaultButton(QtWidgets.QMessageBox.No) reply = msgbox.exec_() if reply == QtWidgets.QMessageBox.Yes: textRoot.insert(0, newLineNode) scroll -= 65 else: textRoot.insert(1, newLineNode) else: textRoot.insert(textViewIndex + 1, newLineNode) ##step 5: rebuild tText cardLoader.addTextWidget(fldbk, dataIndex.currentText) fldbk.tUpdated.setPlainText(update) dataIndex.unsavedEdit = 1 dataIndex.currentTextTable = None fldbk.tFullText.verticalScrollBar().setValue(scroll + 65)
def updateExample(self): dataIndex.unsavedEdit = 1 update = SessionDate.dateFinder() self.fldbk.eUpdated.setPlainText(update) ExNode = dataIndex.exDict[dataIndex.currentCard] ExNode.set('Update', update) updateFlag = False if self.fldbk.eAutoParsingBtn.isChecked( ) and dataIndex.unparsedILEG != None: updateFlag = True for r in range(0, self.fldbk.eAnalysis.rowCount()): #for every row try: string = '' label = self.fldbk.eAnalysis.verticalHeaderItem(r).text() for c in range(0, self.fldbk.eAnalysis.columnCount() - 1): #for each cell try: itemText = self.fldbk.eAnalysis.item(r, c).text() itemText = itemText.strip() except AttributeError: itemText = '' if label == 'ILEG': newContents = '' if itemText != '[—]': itemText = itemText.replace('-', '–') itemText = itemText.replace('<small>', '') itemText = itemText.replace('</small>', '') newContents, newText = formattingHandlers.smallCapsConverter( itemText) self.boundaryChecker(r, c) self.fldbk.eAnalysis.item(r, c).setText(newText) try: if updateFlag == True and dataIndex.unparsedILEG.column( ) == c: autoparsing.updateIndex(c) except RuntimeError: pass itemText = newContents elif label == 'Morph': if itemText != '[—]': itemText = itemText.replace('-', '–') self.fldbk.eAnalysis.item(r, c).setText(itemText) if len(string) == 0: string = itemText else: string += "\t" + itemText if label == 'Morph': ExNode.find('Mrph').text = string elif label == 'ILEG': ExNode.find('ILEG').text = string else: ExNode.find('Synt[@Tier="%s"]' % label).text = string except AttributeError: pass self.fldbk.eAnalysis.resizeColumnsToContents() self.fldbk.eAnalysis.clearSelection() if ExNode.attrib.get( 'SourceText') != None and dataIndex.currentText != None: if ExNode.attrib.get('SourceText') == dataIndex.currentText: textOnlyBtns.updateText(self.fldbk, ExNode)
def setContents(fldbk, fieldname): update = SessionDate.dateFinder() # print('updating %s' %fieldname) '''update XML for edited fields''' # if dataIndex.updateEnabled == 'off': # return if fieldname[0] == "l": fldbk.lUpdated.setPlainText(update) newContent = fldbk.lUpdated.toPlainText() child = dataIndex.lexDict[dataIndex.currentCard] child.set('Update', newContent) elif fieldname[0] == "t": fldbk.tUpdated.setPlainText(update) newContent = fldbk.tUpdated.toPlainText() child = dataIndex.textDict[dataIndex.currentCard] child.set('Update', newContent) elif fieldname[0] == "e": fldbk.eUpdated.setPlainText(update) newContent = fldbk.eUpdated.toPlainText() child = dataIndex.exDict[dataIndex.currentCard] child.set('Update', newContent) elif fieldname[0] == "d": fldbk.dUpdated.setPlainText(update) newContent = fldbk.dUpdated.toPlainText() child = dataIndex.dataDict[dataIndex.currentCard] child.set('Update', newContent) #Home tab if fieldname == 'hTitle': html = fldbk.hTitle.toHtml() newHtml = formattingHandlers.textStyleHandler(html) fldbk.hTitle.setText(newHtml) newContent = fldbk.hTitle.toPlainText() dataIndex.root.set('Dbase', newContent) fldbk.hTitle.setText(html) elif fieldname == 'hLanguage': newContent = fldbk.hLanguage.toPlainText() dataIndex.root.set('Language', newContent) elif fieldname == 'hFamily': newContent = fldbk.hFamily.toPlainText() dataIndex.root.set('Family', newContent) elif fieldname == 'hPopulation': newContent = fldbk.hPopulation.toPlainText() dataIndex.root.set('Population', newContent) elif fieldname == 'hLocation': newContent = fldbk.hLocation.toPlainText() dataIndex.root.set('Location', newContent) elif fieldname == 'hISO': newContent = fldbk.hISO.toPlainText() dataIndex.root.set('ISO', newContent) #Lexicon elif fieldname == 'lOrthography': newContent = fldbk.lOrthography.text() oldListText = child.find('Orth').text entryID = child.attrib.get('LexID') if newContent != oldListText: child.find('Orth').text = newContent currentProxyIndex = fldbk.lLexNav.currentIndex() currentSourceIndex = fldbk.lLexNav.model().mapToSource( currentProxyIndex) fldbk.lLexNav.model().sourceModel().itemFromIndex( currentSourceIndex).setText(newContent) cardLoader.resetNavBars(fldbk.lLexNav, dataIndex.currentCard) '''if this was a homonym and now isn't in the same set, delink it''' if child.attrib.get('Hom') != None: syn = child.attrib.get('Hom') synList = syn.split(', ') if len(synList) != 0: for card in synList: del dataIndex.lexDict[card].attrib['Hom'] try: synList.remove(entryID) except ValueError: pass if len(synList) != 1: manageHomonyms(synList) '''check to see if you've created homonymy''' homList = [entryID] for node in dataIndex.root.iter('Lex'): '''create list of all homophonous entries''' if node.find('Orth').text == newContent and node.attrib.get( 'LexID') != entryID: homList.append(node.attrib.get('LexID')) if len(homList) > 1: manageHomonyms(homList) '''autoconversion''' if fldbk.lAutoBtn.isChecked(): IPA = Orthographies.toIPA(newContent) fldbk.lIPA.setText(IPA) ipaNode = child.find('IPA') if ipaNode != None: child.remove(ipaNode) if len(newContent) != 0: elemList = list(child) elemList.reverse() for i, item in enumerate(elemList): if item.tag == 'POS': break elif item.tag == 'Orth': break i = len(elemList) - i child.insert(i, etree.Element('IPA')) child.find('IPA').text = IPA elif fieldname == 'lPOS': newContent = fldbk.lPOS.toPlainText() posNode = child.find('POS') if posNode != None: child.remove(posNode) if len(newContent) != 0: child.insert(1, etree.Element('POS')) child.find('POS').text = newContent elif fieldname == 'lIPA': newContent = fldbk.lIPA.text() ipaNode = child.find('IPA') if ipaNode != None: child.remove(ipaNode) if len(newContent) != 0: elemList = list(child) elemList.reverse() for i, item in enumerate(elemList): if item.tag == 'POS': break elif item.tag == 'Orth': break i = len(elemList) - i child.insert(i, etree.Element('IPA')) child.find('IPA').text = newContent elif fieldname == 'lLiteral': newContent = fldbk.lLiteral.toPlainText() if len(newContent) != 0: newContent, newText = formattingHandlers.smallCapsConverter( newContent) fldbk.lLiteral.setText(newText) else: newContent = '' litNode = child.find('Lit') if litNode != None: child.remove(litNode) if len(newContent) != 0: elemList = list(child) for i, item in enumerate(elemList): if item.tag == 'Def': break child.insert(i, etree.Element('Lit')) child.find('Lit').text = newContent elif fieldname == 'lRegister': newContent = fldbk.lRegister.toPlainText() regNode = child.find('Reg') if regNode != None: child.remove(regNode) if len(newContent) != 0: elemList = list(child) elemList.reverse() for i, item in enumerate(elemList): if item.tag == 'Cf.': break elif item.tag == 'C2': break elif item.tag == 'Grm': break elif item.tag == 'IPA': break elif item.tag == 'POS': break elif item.tag == 'Orth': break i = len(elemList) - i child.insert(i, etree.Element('Reg')) child.find('Reg').text = newContent elif fieldname == 'lDialect': newContent = fldbk.lDialect.toPlainText() alternate = '' if newContent: dialectList = newContent.split(None, 1) dialect = dialectList[0] diaText = dialect altList = None if len(dialectList) > 1: alternate = dialectList[1] alternate = re.sub("\(", "", alternate) alternate = re.sub("\)", "", alternate) altList = alternate.split("; ") for i in range(0, len(altList)): alternative = altList[i].split(None, 1) variant = alternative[0] try: alternate = alternative[1] except IndexError: fldbk.dialectBox = QtWidgets.QMessageBox() fldbk.dialectBox.setIcon(QtWidgets.QMessageBox.Warning) fldbk.dialectBox.setStandardButtons( QtWidgets.QMessageBox.Cancel) fldbk.dialectBox.setStandardButtons( QtWidgets.QMessageBox.Ok) fldbk.dialectBox.setDefaultButton( QtWidgets.QMessageBox.Ok) fldbk.dialectBox.setText('Formatting error.') fldbk.dialectBox.setInformativeText( 'Format dialect information as' '<blockquote><big>Cdn. (US. soda; UK fizzy drink)</big></blockquote>' 'For expressions known for only one dialect, simply<br /> ' 'give the dialect name without an alternative.<br />' ) fldbk.dialectBox.exec_() return if i == 0 and len(altList) - 1 == 0: dialect = dialect + " (" + variant + " " + alternate + ")" elif i == 0: dialect = dialect + " (" + variant + " " + alternate elif i == len(altList) - 1: dialect = dialect + "; " + variant + " " + alternate + ")" else: dialect = dialect + "; " + variant + " " + alternate fldbk.lDialect.setText(dialect) crossRef = None oldCrossRef = None if child.find('Dia') != None: oldAlt = child.findall('Dia/Alternative') oldCrossRef = [] if oldAlt != None: for item in oldAlt: oldRef = item.attrib.get('CrossRef') oldCrossRef.append(oldRef) child.remove(child.find('Dia')) if newContent: elemList = list(child) elemList.reverse() for i, item in enumerate(elemList): if item.tag == 'Reg': break elif item.tag == 'Cf': break elif item.tag == 'C2': break elif item.tag == 'Grm': break elif item.tag == 'IPA': break elif item.tag == 'POS': break elif item.tag == 'Orth': break i = len(elemList) - i child.insert(i, etree.Element('Dia', {'Dialect': diaText})) if altList != None and len(altList) != 0: crossRefList = [] alterList = [] for j in range(0, len(altList)): altParts = altList[j].split(None, 1) variant = altParts[0] alternate = altParts[1] newAltNode = etree.SubElement(child.find('Dia'), 'Alternative', {'Variant': variant}) newAltNode.text = alternate for entry in dataIndex.root.iter('Lex'): lexeme = entry.find('Orth').text if lexeme == alternate and entry.attrib.get( 'Hom') != None: #TODO: fix so you can see defs as well as forms? for oldRef in oldCrossRef: if entry.attrib.get('LexID') == oldRef: crossRef = oldRef newAltNode.set('CrossRef', crossRef) break else: synList = entry.attrib.get('Hom').split( ", ") for syn in synList: if entry.attrib.get( 'LexID') == oldCrossRef: crossRef = oldRef newAltNode.set( 'CrossRef', crossRef) break synList.append(entry.attrib.get('LexID')) newCf = CrossRefManager.Dialog(fldbk) newCf.setRefs(synList) if newCf.exec_(): crossRef = newCf.getRef() else: crossRef = None break elif lexeme == alternate: crossRef = entry.attrib.get('LexID') newAltNode.set('CrossRef', crossRef) break if crossRef != None: crossRefList.append(crossRef) alterList.append(alternate) if crossRefList != None: contextMenus.updateContextMenu(fldbk, fieldname, crossRefList, alterList) if crossRefList == None: contextMenus.clearContextMenu(fldbk, fieldname) elif fieldname == 'lBrrw': newContent = fldbk.lBrrw.toPlainText() if newContent: borrowing = newContent.split(None, 1) source = borrowing[0] cognate = borrowing[1] cognate = re.sub('"', '', cognate) cognate = re.sub('“', '', cognate) cognate = re.sub('”', '', cognate) newText = source + ' “' + cognate + '”' fldbk.lBrrw.setPlainText(newText) borrowNode = child.find('Brrw') if borrowNode != None: child.remove(borrowNode) if newContent: elemList = list(child) elemList.reverse() for i, item in enumerate(elemList): if item.tag == 'Dia': break elif item.tag == 'Reg': break elif item.tag == 'Cf.': break elif item.tag == 'C2': break elif item.tag == 'Grm': break elif item.tag == 'IPA': break elif item.tag == 'POS': break elif item.tag == 'Orth': break i = len(elemList) - i child.insert(i, etree.Element('Brrw')) child.find('Brrw').text = cognate child.find('Brrw').set('Source', source) elif fieldname == 'lSource': newContent = fldbk.lSource.toPlainText() child.set('Spkr', newContent) elif fieldname == 'lResearcher': newContent = fldbk.lResearcher.toPlainText() child.set('Rschr', newContent) elif fieldname == 'lDate': newContent = fldbk.lDate.toPlainText() child.set('Date', newContent) elif fieldname == 'lUpdated': newContent = fldbk.lUpdated.toPlainText() child.set('Update', newContent) elif fieldname == 'lConfirmed': newContent = fldbk.lConfirmed.toPlainText() child.set('Confirmed', newContent) elif fieldname == 'lNotes': html = fldbk.lNotes.toHtml() newHtml = formattingHandlers.textStyleHandler(html) fldbk.lNotes.setHtml(newHtml) newContent = fldbk.lNotes.toPlainText().strip() fldbk.lNotes.setHtml(html) comNode = child.find('Comments') if comNode != None: child.remove(comNode) if len(newContent) != 0: elemList = list(child) elemList.reverse() for i, item in enumerate(elemList): if item.tag == 'Root': break elif item.tag == 'Drvn': break elif item.tag == 'Def': break i = len(elemList) - i newCommentNode = etree.Element('Comments') newCommentNode.text = newContent child.insert(i, newCommentNode) elif fieldname == 'lPrimaryIndex': newContent = fldbk.lPrimaryIndex.toPlainText() child.set('L1Index', newContent) elif fieldname == 'lSecondaryIndex': newContent = fldbk.lSecondaryIndex.toPlainText() child.set('L2Index', newContent) elif fieldname == 'lKeywordIndex': newContent = fldbk.lKeywordIndex.toPlainText() child.set('Kywd', newContent) #Examples elif fieldname == 'eLine': html = fldbk.eLine.toHtml() while ' ' in html: html = html.replace(' ', ' ') newHtml = formattingHandlers.textStyleHandler(html) fldbk.eLine.setHtml(newHtml) child.find('Line').text = fldbk.eLine.toPlainText().strip() fldbk.eLine.setHtml(html) ExNode = dataIndex.exDict[dataIndex.currentCard] if dataIndex.currentText != None and ExNode.attrib.get( 'SourceText') != None: prepareTextUpdate(fldbk, ExNode) elif fieldname == 'eL1Gloss': html = fldbk.eL1Gloss.toHtml() while ' ' in html: html = html.replace(' ', ' ') newHtml = formattingHandlers.textStyleHandler(html) fldbk.eL1Gloss.setHtml(newHtml) child.find('L1Gloss').text = fldbk.eL1Gloss.toPlainText().strip() fldbk.eL1Gloss.setHtml(html) ExNode = dataIndex.exDict[dataIndex.currentCard] if dataIndex.currentText != None and ExNode.attrib.get( 'SourceText') != None: prepareTextUpdate(fldbk, ExNode) elif fieldname == 'eL2Gloss': html = fldbk.eL2Gloss.toHtml() while ' ' in html: html = html.replace(' ', ' ') newHtml = formattingHandlers.textStyleHandler(html) fldbk.eL2Gloss.setHtml(newHtml) newGloss = fldbk.eL2Gloss.toPlainText().strip() fldbk.eL2Gloss.setHtml(html) l2Node = child.find('L2Gloss') if l2Node != None: child.remove(l2Node) if len(newContent) != 0: elemList = list(child) elemList.reverse() for i, item in enumerate(elemList): if item.tag == 'L1Gloss': break i = len(elemList) - i child.insert(i, etree.Element('L2Gloss')) child.find('L2Gloss').text = newGloss ExNode = dataIndex.exDict[dataIndex.currentCard] if dataIndex.currentText != None and ExNode.attrib.get( 'SourceText') != None: prepareTextUpdate(fldbk, ExNode) elif fieldname == 'eNotes': if len(fldbk.eNotes.toPlainText()) != 0: html = fldbk.eNotes.toHtml() newHtml = formattingHandlers.textStyleHandler(html) fldbk.eNotes.setHtml(newHtml) newContent = fldbk.eNotes.toPlainText().strip() fldbk.eNotes.setHtml(html) comNode = child.find('Comments') if comNode != None: child.remove(comNode) if len(newContent) != 0: elemList = list(child) elemList.reverse() for i, item in enumerate(elemList): if item.tag == 'L2Gloss': break elif item.tag == 'L1Gloss': break i = len(elemList) - i child.insert(i, etree.Element('Comments')) child.find('Comments').text = newContent elif fieldname == 'eKeywords': newContent = fldbk.eKeywords.toPlainText() child.set('Kywd', newContent) elif fieldname == 'eSource': newContent = fldbk.eSource.toPlainText() child.set('Spkr', newContent) elif fieldname == 'eResearcher': newContent = fldbk.eResearcher.toPlainText() child.set('Rschr', newContent) elif fieldname == 'eDate': newContent = fldbk.eDate.toPlainText() child.set('Date', newContent) elif fieldname == 'eTimeCode': newContent = fldbk.eTimeCode.toPlainText() child.set('Time', newContent) elif fieldname == 'eSpokenBy': newContent = fldbk.eSpokenBy.toPlainText() if child.attrib.get("SourceText") != None: for line in dataIndex.textDict[child.attrib.get( "SourceText")].iter('Ln'): if line.attrib.get('LnRef') == child.attrib.get('ExID'): if len(newContent ) == 0 and line.attrib.get("SpokenBy") != None: del line.attrib['SpokenBy'] elif len(newContent) != 0: line.set('SpokenBy', newContent) for speaker in dataIndex.root.iter('Speaker'): if speaker.attrib.get('SCode') == newContent: child.attrib['Spkr'] = newContent fldbk.eSource.setPlainText(newContent) break break #TEXTS elif fieldname == 'tNotes': if len(fldbk.tNotes.toPlainText()) != 0: html = fldbk.tNotes.toHtml() newHtml = formattingHandlers.textStyleHandler(html) fldbk.tNotes.setHtml(newHtml) newContent = fldbk.tNotes.toPlainText().strip() fldbk.tNotes.setHtml(html) comNode = child.find('Comments') if comNode != None: child.remove(comNode) if len(newContent) != 0: elemList = list(child) elemList.reverse() for i, item in enumerate(elemList): if item.tag == 'Ln': break i = len(elemList) - i child.insert(i, etree.Element('Comments')) child.find('Comments').text = newContent elif fieldname == 'tTranscriber': newContent = fldbk.tTranscriber.toPlainText() child.set('Trns', newContent) elif fieldname == 'tSource': newContent = fldbk.tSource.toPlainText() child.set('Spkr', newContent) elif fieldname == 'tResearcher': newContent = fldbk.tResearcher.toPlainText() child.set('Rschr', newContent) elif fieldname == 'tDate': newContent = fldbk.tDate.toPlainText() child.set('Date', newContent) elif fieldname == 'tTitle': plainTextTitle = fldbk.tTitle.toPlainText() html = fldbk.tTitle.toHtml() newHtml = formattingHandlers.textStyleHandler(html) fldbk.tTitle.setHtml(newHtml) newContent = fldbk.tTitle.toPlainText() fldbk.tTitle.setHtml(html) child.find('Title').text = newContent currentProxyIndex = fldbk.tTextNav.currentIndex() currentSourceIndex = fldbk.tTextNav.model().mapToSource( currentProxyIndex) fldbk.tTextNav.model().sourceModel().itemFromIndex( currentSourceIndex).setText(plainTextTitle) fldbk.tTextNav.model().setSortCaseSensitivity(0) fldbk.tTextNav.model().sort(0, QtCore.Qt.AscendingOrder) fldbk.tTextNav.scrollTo(fldbk.tTextNav.currentIndex(), QtWidgets.QAbstractItemView.EnsureVisible) #DATASETS elif fieldname == 'dSource': newContent = fldbk.dSource.toPlainText() child.set('Spkr', newContent) elif fieldname == 'dResearcher': newContent = fldbk.dResearcher.toPlainText() child.set('Rschr', newContent) elif fieldname == 'dDate': newContent = fldbk.dDate.toPlainText() elif fieldname == 'dKeywords': newContent = fldbk.dKeywords.toPlainText() child.set('Kywd', newContent) elif fieldname == 'dNotes': if len(fldbk.dNotes.toPlainText()) != 0: html = fldbk.dNotes.toHtml() newHtml = formattingHandlers.textStyleHandler(html) fldbk.dNotes.setHtml(newHtml) newContent = fldbk.dNotes.toPlainText().strip() fldbk.dNotes.setHtml(html) comNode = child.find('Comments') if comNode != None: child.remove(comNode) if len(newContent) != 0: elemList = list(child) elemList.reverse() for i, item in enumerate(elemList): if item.tag == 'Data': break elif item.tag == 'Ln': break i = len(elemList) - i child.insert(i, etree.Element('Comments')) child.find('Comments').text = newContent elif fieldname == 'dData': html = fldbk.dData.toHtml() newHtml = formattingHandlers.textStyleHandler(html) fldbk.dData.setHtml(newHtml) newContent = fldbk.dData.toPlainText() fldbk.dData.setHtml(html) child.find('Data').text = newContent elif fieldname == 'dTitle': html = fldbk.dTitle.toHtml() plainTextTitle = fldbk.dTitle.toPlainText() newHtml = formattingHandlers.textStyleHandler(html) fldbk.dTitle.setHtml(newHtml) newContent = fldbk.dTitle.toPlainText() fldbk.dTitle.setHtml(html) child.find('Title').text = newContent currentProxyIndex = fldbk.dDataNav.currentIndex() currentSourceIndex = fldbk.dDataNav.model().mapToSource( currentProxyIndex) fldbk.dDataNav.model().sourceModel().itemFromIndex( currentSourceIndex).setText(plainTextTitle) fldbk.dDataNav.model().setSortCaseSensitivity(0) fldbk.dDataNav.model().sort(0, QtCore.Qt.AscendingOrder) fldbk.dDataNav.scrollTo(fldbk.dDataNav.currentIndex(), QtWidgets.QAbstractItemView.EnsureVisible) #METADATA fields # elif fieldname == 'oOrder' or fieldname == 'oDiacriticsField': # alert = '!Orthography has been edited. Use “Update” to save permanent changes.' # fldbk.oOrthChangedLabel.setText(alert) # fldbk.oOrthChangedLabel.setToolTip('This warning indicates that changes have been made to the\n' # 'Mapping or Diacritics field. These will not be saved unless\n' # 'you click the "Update" button. The original orthography can\n' # 'be restored by clicking on its name in the list below.') elif fieldname == 'sOrder' or fieldname == 'sExclusions': alert = '!Sorting order has been edited. Use “Update” to save permanent changes.' fldbk.sOrderChangedLabel.setText(alert) fldbk.sOrderChangedLabel.setToolTip( 'This warning indicates that changes have been made to the\n' 'Sorting order or Exclusions field. These will not be saved\n' 'unless you click the "Update" button. The original order can\n' 'be restored by clicking on its name in the list below.')
def updateExample(self): dataIndex.unsavedEdit = 1 update = SessionDate.dateFinder() self.fldbk.tUpdated.setPlainText(update) ExNode = dataIndex.currentTextTable.verticalHeaderItem(0).data(35) LnNode = dataIndex.currentTextTable.verticalHeaderItem(0).data(36) timeCode = None spokenBy = None endTime = None if ExNode != None: ExNode.set('Update', update) newLine = formattingHandlers.RTFtoXML( dataIndex.currentTextTable.item(0, 0).text()) ExNode.find('Line').text = newLine j = dataIndex.currentTextTable.rowCount() - 1 glossLine = formattingHandlers.RTFtoXML( dataIndex.currentTextTable.item(j, 0).text()) spokenBy, glossLine = codeExtractor.getSpokenBy(glossLine) if spokenBy != None: LnNode.set('SpokenBy', spokenBy) if '[' in glossLine: # check to see if timeCode is contained in the gloss timeCode, endTime, glossLine = codeExtractor.getTime(glossLine) if timeCode != None: LnNode.set('Time', timeCode) if endTime != None: LnNode.set('EndTime', endTime) glossLine = glossLine[1:-1] if dataIndex.glossingLanguage == 'L1Gloss': ExNode.find('L1Gloss').text = glossLine else: ExNode.find('L2Gloss').text = glossLine if dataIndex.currentTextTable.rowCount() > 2: for r in range(1, 3): string = '' for c in range(0, dataIndex.currentTextTable.columnCount()): try: itemText = dataIndex.currentTextTable.item( r, c).text() except AttributeError: itemText = '' if len(string) == 0: string = itemText else: string = string + "\t" + itemText if r == 1: ExNode.find('Mrph').text = string elif r == 2: ExNode.find('ILEG').text = formattingHandlers.RTFtoXML( string) dataIndex.currentTextTable.resizeColumns() else: dataIndex.currentTextTable.resizeColumnsToContents() else: if dataIndex.currentTextTable.rowCount() == 2: #don't forget to extract the speaker code gloss = dataIndex.currentTextTable.item(1, 0).text() spokenBy, gloss = codeExtractor.getSpokenBy(gloss) if '[' in gloss: # check to see if timeCode is contained in the gloss timeCode, endTime, gloss = codeExtractor.getTime(gloss) gloss = gloss.replace('‘', '') gloss = gloss.replace('’', '') newText = dataIndex.currentTextTable.item( 0, 0).text() + '\n' + gloss.strip() else: newText = dataIndex.currentTextTable.item(0, 0).text() LnNode.text = newText if spokenBy != None: LnNode.set('SpokenBy', spokenBy) if timeCode != None: LnNode.set('Time', timeCode) if endTime != None: LnNode.set('EndTime', endTime)
def delCard(fldbk): target = dataIndex.currentCard if fldbk.tabWidget.currentIndex() == 1: cardType = "lexical entry" badNode = dataIndex.lexDict[target] navBar = fldbk.lNavBar if fldbk.tabWidget.currentIndex() == 2: cardType = "text" badNode = dataIndex.textDict[target] navBar = fldbk.tNavBar if fldbk.tabWidget.currentIndex() == 3: cardType = "example" badNode = dataIndex.exDict[target] navBar = fldbk.eNavBar if fldbk.tabWidget.currentIndex() == 4: cardType = "dataset" badNode = dataIndex.dataDict[target] navBar = fldbk.dNavBar if cardType == "example" and badNode.attrib.get('SourceText') != None: textTitle = "<i>" + fldbk.eSourceText.toPlainText() + "</i>" msgbox = QtWidgets.QMessageBox() msgbox.setIcon(QtWidgets.QMessageBox.Critical) msgbox.setText("Line from text.") msgbox.setInformativeText( 'This is a line from the text %s. Please edit texts from the <b>Texts</b> tab.' % textTitle) msgbox.setStandardButtons(QtWidgets.QMessageBox.Ok) msgbox.setDefaultButton(QtWidgets.QMessageBox.Ok) reply = msgbox.exec_() return else: msgbox = QtWidgets.QMessageBox() msgbox.setIcon(QtWidgets.QMessageBox.Warning) msgbox.setText("Delete card?") msgbox.setInformativeText( "This will remove the current %s and all cross-references to it from the database." % cardType) msgbox.setStandardButtons(QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel) msgbox.setDefaultButton(QtWidgets.QMessageBox.Ok) reply = msgbox.exec_() if reply == QtWidgets.QMessageBox.Ok: if cardType == "lexical entry": if badNode.attrib.get('Hom') != None: homs = badNode.attrib.get('Hom') homList = homs.split(', ') update.manageHomonyms(homList) if len(dataIndex.lexDict) != 1: for i in range(fldbk.lLexNav.model().rowCount()): if fldbk.lLexNav.model().index(i, 0).data(32) == target: fldbk.lLexNav.model().removeRow(i) break update.cleanUpIDs(target) fldbk.lNavBar.goPrev() dataIndex.root.remove(badNode) else: clearCard(fldbk) tDate = setSessionDate() today = SessionDate.dateFinder() update.cleanUpIDs(target) node = dataIndex.lexDict[target] node.clear() node.set("LexID", target) node.set("Date", tDate) node.set("Update", today) etree.SubElement(node, "Orth") defNode = etree.SubElement(node, "Def", attrib={"Index": "1"}) dummyDef = etree.SubElement(defNode, "L1") dummyDef.text = 'new word' fldbk.lOrthography.setText(dummyDef.text) currentProxyIndex = fldbk.lLexNav.currentIndex() currentSourceIndex = fldbk.lLexNav.model().mapToSource( currentProxyIndex) fldbk.lLexNav.model().sourceModel().itemFromIndex( currentSourceIndex).setText(dummyDef.text) dataIndex.currentCard = target elif cardType == "text": if len(dataIndex.textDict) != 1: purgeTexts(target) del dataIndex.textDict[target] for i in range(fldbk.tTextNav.model().rowCount()): if fldbk.tTextNav.model().index(i, 0).data(32) == target: fldbk.tTextNav.model().removeRow(i) break update.cleanUpIDs(target) fldbk.tNavBar.goPrev() dataIndex.root.remove(badNode) else: purgeTexts(target) update.cleanUpIDs(target) clearCard(fldbk) while fldbk.textLayout.count(): item = fldbk.textLayout.takeAt(0) widget = item.widget() if widget != None: widget.deleteLater() node = dataIndex.textDict[target] node.clear() node.set("TextID", target) node.set("Date", tDate) node.set("Update", today) dummyTitle = etree.SubElement(node, "Title") dummyTitle.text = "new text" fldbk.tTitle.setText(dummyTitle.text) fldbk.tNewTitle.setText(dummyTitle.text) currentProxyIndex = fldbk.tTextNav.currentIndex() currentSourceIndex = fldbk.tTextNav.model().mapToSource( currentProxyIndex) fldbk.tTextNav.model().sourceModel().itemFromIndex( currentSourceIndex).setText(dummyTitle.text) dataIndex.currentText = True dataIndex.currentCard = target textOnlyBtns.enterNewText(fldbk) elif cardType == "example": if len(dataIndex.exDict) != 1: del dataIndex.exDict[target] update.cleanUpIDs(target) fldbk.eNavBar.goPrev() dataIndex.root.remove(badNode) else: clearCard(fldbk) node = dataIndex.exDict[target] update.cleanUpIDs(target) node.clear() node.set("ExID", target) node.set("Date", tDate) node.set("Update", today) etree.SubElement(node, "Line") etree.SubElement(node, "Mrph") etree.SubElement(node, "ILEG") etree.SubElement(node, "L1Gloss") dataIndex.currentCard = target elif cardType == "dataset": if len(dataIndex.dataDict) != 1: del dataIndex.dataDict[target] for i in range(fldbk.dDataNav.model().rowCount()): if fldbk.dDataNav.model().index(i, 0).data(32) == target: fldbk.dDataNav.model().removeRow(i) break update.cleanUpIDs(target) fldbk.dNavBar.goPrev() dataIndex.root.remove(badNode) else: clearCard(fldbk) node = dataIndex.dataDict[target] node.clear() update.cleanUpIDs(target) node.set("DSetID", target) node.set("Date", tDate) node.set("Update", today) etree.SubElement(node, "Title") etree.SubElement(node, "Data") currentProxyIndex = fldbk.dDataNav.currentIndex() currentSourceIndex = fldbk.dDataNav.model().mapToSource( currentProxyIndex) fldbk.dDataNav.model().sourceModel().itemFromIndex( currentSourceIndex).setText("") dataIndex.currentCard = target else: return dataIndex.unsavedEdit = 1 if target in navBar.stack: navBar.stack.remove(target) navBar.index = navBar.index - 1
def newCard(fldbk): today = SessionDate.dateFinder() tDate = setSessionDate() dataIndex.unsavedEdit = 1 if fldbk.tabWidget.currentIndex() == 1: #lexicon card newID = idGenerator.generateID('LX', dataIndex.lexDict) newCdWindow = NewLexDialog.NewLexDialog(fldbk) navBar = fldbk.lNavBar if newCdWindow.exec_(): clearCard(fldbk) fldbk.lL1Definition.clear() fldbk.lL2Definition.clear() fldbk.lDerivatives.clear() fldbk.lSound.Recordings.clear() fldbk.lSound.SoundFileMeta.clear() fldbk.lDoneBtn.setChecked(0) data = newCdWindow.getData() '''returns a list [speaker,researcher,entry word,gloss]''' newNode = etree.Element('Lex', {"LexID": newID}) newNode.set('Date', tDate) newNode.set('Update', today) newNode.set('Spkr', data[0]) newNode.set('Rschr', data[1]) newNode.set('Done', '0') newOrth = etree.SubElement(newNode, 'Orth') newOrth.text = data[2] '''generate IPA node if Auto checked''' if fldbk.lAutoBtn.isChecked() == True: IPA = Orthographies.toIPA(data[2]) newIPA = etree.SubElement(newNode, 'IPA') newIPA.text = IPA fldbk.lIPA.setText(IPA) newDef = etree.SubElement(newNode, 'Def', {'Index': '1'}) newL1 = etree.SubElement(newDef, 'L1') newL1.text = data[3] fldbk.lSource.setPlainText(data[0]) fldbk.lResearcher.setPlainText(data[1]) fldbk.lDate.setPlainText(tDate) fldbk.lUpdated.setPlainText(tDate) fldbk.lOrthography.setText(data[2]) '''if new word in data[2] is homophonous with another entry''' homList = fldbk.lLexNav.findChildren(QtGui.QStandardItem, data[2]) if homList != None: homList.append(newID) update.manageHomonyms(homList) cardLoader.loadDefinitions(fldbk, newNode) if len(dataIndex.lexDict.keys()) == 1: badNode = dataIndex.root.find('Lex') badID = badNode.attrib.get('LexID') if badID == 'LX00': dataIndex.root.remove(badNode) del dataIndex.lexDict[badID] dataIndex.root.insert(1, newNode) dataIndex.lexDict[newID] = newNode navLists.navListBuilderLex(fldbk) cardLoader.resetNavBars(fldbk.lLexNav, newID) dataIndex.currentCard = newID dataIndex.lastLex = newID dataIndex.lexDict[newID] = newNode dataIndex.root.set('LastLex', newID) if fldbk.tabWidget.currentIndex() == 2: # text card textOnlyBtns.enterNewText(fldbk) navBar = fldbk.tNavBar if fldbk.tabWidget.currentIndex() == 3: # example card navBar = fldbk.eNavBar fldbk.eAnalysis.clear() fldbk.eAnalysis.setColumnCount(2) fldbk.eAnalysis.setRowCount(2) lastHeadWidget = QtWidgets.QTableWidgetItem(1001) lastHeadWidget.setText('+') fldbk.eAnalysis.setHorizontalHeaderItem(1, lastHeadWidget) fldbk.eAnalysis.resizeColumnToContents(1) rowHeader = QtWidgets.QTableWidgetItem(1001) rowHeader.setText('Morph') fldbk.eAnalysis.setVerticalHeaderItem(0, rowHeader) rowHeader = QtWidgets.QTableWidgetItem(1001) rowHeader.setText('ILEG') fldbk.eAnalysis.setVerticalHeaderItem(1, rowHeader) clearCard(fldbk) fldbk.eLinksList.clear() newID = idGenerator.generateID('EX', dataIndex.exDict) newNode = etree.Element('Ex', {"ExID": newID}) newNode.set('Date', tDate) newNode.set('Update', today) if dataIndex.lastRschr != None and len(dataIndex.lastRschr) != 0: newNode.set('Rschr', dataIndex.lastRschr) else: newNode.set('Rschr', 'YYY') if dataIndex.lastSpeaker != None and len(dataIndex.lastSpeaker) != 0: newNode.set('Spkr', dataIndex.lastSpeaker) else: newNode.set('Spkr', 'XX') etree.SubElement(newNode, 'Line') etree.SubElement(newNode, 'Mrph') etree.SubElement(newNode, 'ILEG') etree.SubElement(newNode, 'L1Gloss') egList = list(dataIndex.exDict.keys()) lastExCard = dataIndex.exDict[egList[len(dataIndex.exDict) - 1]] i = list(dataIndex.root).index(lastExCard) if len(dataIndex.exDict.keys()) == 1: badNode = dataIndex.root.find('Ex') badID = badNode.attrib.get('ExID') if badID == 'EX00': dataIndex.root.remove(badNode) del dataIndex.exDict[badID] dataIndex.root.insert(i, newNode) dataIndex.currentCard = newID dataIndex.exDict[newID] = newNode dataIndex.lastEx = newID dataIndex.root.set('lastEx', newID) cardLoader.loadExCard(newNode) if fldbk.tabWidget.currentIndex() == 4: # dataset card nameBox = StyledInputDialog.StyledInputDialog(fldbk) nameBox.setWindowTitle('New dataset.') nameBox.inputLabel.setText('Give the dataset a name.') navBar = fldbk.dNavBar if nameBox.exec_(): title = nameBox.returnInput() newNode = newDataset(fldbk, title) clearCard(fldbk) cardLoader.loadDataCard(newNode) navBar.stack.append(dataIndex.currentCard) navBar.index = navBar.index + 1