Example #1
0
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
Example #2
0
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
Example #3
0
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
Example #4
0
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)
Example #6
0
 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)
Example #8
0
 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)
Example #9
0
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.')
Example #10
0
 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)
Example #11
0
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
Example #12
0
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