#!/usr/bin/env python #--!-- coding: utf8 --!-- from qt import * from enums import * from functions import * import re ############################################################################### # SHORT REFERENCES ############################################################################### RegEx = r"::(\w):(\d+?)::" RegExNonCapturing = r"::\w:\d+?::" EmptyRef = "::{}:{}::" PersoLetter = "C" TextLetter = "T" PlotLetter = "P" def plotReference(plotID): return EmptyRef.format(PlotLetter, plotID) def persoReference(persoID): return EmptyRef.format(PersoLetter, persoID) def textReference(outlineID): return EmptyRef.format(TextLetter, outlineID) ############################################################################### # READABLE INFOS ############################################################################### def infos(ref): match = re.fullmatch(RegEx, ref) if match: _type = match.group(1) _ref = match.group(2) if _type == TextLetter: m = mainWindow().mdlOutline idx = m.getIndexByID(_ref) if not idx.isValid(): return qApp.translate("references", "Unknown reference: {}.").format(ref) item = idx.internalPointer() #Titles pathTitle = qApp.translate("references", "Path:") statsTitle = qApp.translate("references", "Stats:") POVTitle = qApp.translate("references", "POV:") statusTitle = qApp.translate("references", "Status:") labelTitle = qApp.translate("references", "Label:") ssTitle = qApp.translate("references", "Short summary:") lsTitle = qApp.translate("references", "Long summary:") notesTitle = qApp.translate("references", "Notes:") POV = "" if item.POV(): POV = "{text}".format( ref=getPersoReference(item.POV()), text=mainWindow().mdlPersos.getPersoNameByID(item.POV())) status = item.status() if status: status = mainWindow().mdlStatus.item(int(status), 0).text() else: status = "" label = item.label() if label: label = mainWindow().mdlLabels.item(int(label), 0).text() else: label = "" path = item.pathID() pathStr = [] for _id, title in path: pathStr.append("{text}".format( ref=getTextReference(_id), text=title)) path = " > ".join(pathStr) ss = item.data(Outline.summarySentance.value) ls = item.data(Outline.summaryFull.value) notes = item.data(Outline.notes.value) text = """

{title}

{pathTitle} {path}

{statsTitle} {stats}
{POV} {status} {label}

{ss} {ls} {notes} """.format( title=item.title(), pathTitle=pathTitle, path=path, statsTitle=statsTitle, stats=item.stats(), POV="{POVTitle} {POV}
".format( POVTitle=POVTitle, POV=POV) if POV else "", status="{statusTitle} {status}
".format( statusTitle=statusTitle, status=status) if status else "", label="{labelTitle} {label}

".format( labelTitle=labelTitle, label=label) if label else "", ss="

{ssTitle} {ss}

".format( ssTitle=ssTitle, ss=ss.replace("\n", "
")) if ss else "", ls="

{lsTitle}
{ls}

".format( lsTitle=lsTitle, ls=ls.replace("\n", "
")) if ls else "", notes="

{notesTitle}
{notes}

".format( notesTitle=notesTitle, notes=linkifyAllRefs(basicT2TFormat(notes))) if notes else "", ) return text elif _type == PersoLetter: m = mainWindow().mdlPersos index = m.getIndexFromID(_ref) name = m.name(index.row()) # Titles basicTitle = qApp.translate("references", "Basic infos") detailedTitle = qApp.translate("references", "Detailed infos") POVof = qApp.translate("references", "POV of:") referencedIn = qApp.translate("references", "Referenced in:") # basic infos basic = [] for i in [ (Perso.motivation, qApp.translate("references", "Motivation"), False), (Perso.goal, qApp.translate("references", "Goal"), False), (Perso.conflict, qApp.translate("references", "Conflict"), False), (Perso.epiphany, qApp.translate("references", "Epiphany"), False), (Perso.summarySentance, qApp.translate("references", "Short summary"), True), (Perso.summaryPara, qApp.translate("references", "Longer summary"), True), ]: val = m.data(index.sibling(index.row(), i[0].value)) if val: basic .append("{title}:{n}{val}".format( title=i[1], n = "\n" if i[2] else " ", val=val)) basic = "
".join(basic) # detailed infos detailed = [] for _name, _val in m.listPersoInfos(index): detailed.append("{}: {}".format( _name, _val)) detailed = "
".join(detailed) # list scenes of which it is POV oM = mainWindow().mdlOutline lst = oM.findItemsByPOV(_ref) listPOV = "" for t in lst: idx = oM.getIndexByID(t) listPOV += "
  • {text}".format( link=getTextReference(t), text=oM.data(idx, Outline.title.value)) # List scences where character is referenced listRefs = "" lst = oM.findItemsContaining(ref, [Outline.notes.value]) for t in lst: idx = oM.getIndexByID(t) listRefs += "
  • {text}".format( link=getTextReference(t), text=oM.data(idx, Outline.title.value)) text = """

    {name}

    {basicInfos} {detailedInfos} {POV} {references} """.format( name=name, basicInfos="

    {basicTitle}

    {basic}".format( basicTitle=basicTitle, basic=basic) if basic else "", detailedInfos="

    {detailedTitle}

    {detailed}".format( detailedTitle=detailedTitle, detailed=detailed) if detailed else "", POV="

    {POVof}

    ".format( POVof=POVof, listPOV=listPOV) if listPOV else "", references="

    {referencedIn}

    ".format( referencedIn=referencedIn, listRefs=listRefs) if listRefs else "", ) return text else: return qApp.translate("references", "Unknown reference: {}.").format(ref) def tooltip(ref): match = re.fullmatch(RegEx, ref) if match: _type = match.group(1) _ref = match.group(2) if _type == TextLetter: m = mainWindow().mdlOutline idx = m.getIndexByID(_ref) if not idx.isValid(): return qApp.translate("references", "Unknown reference: {}.").format(ref) item = idx.internalPointer() tooltip = qApp.translate("references", "Text: {}").format(item.title()) tooltip += "
    {}".format(item.path()) return tooltip elif _type == PersoLetter: m = mainWindow().mdlPersos name = m.item(int(_ref), Perso.name.value).text() return qApp.translate("references", "Character: {}").format(name) else: return qApp.translate("references", "Unknown reference: {}.").format(ref) ############################################################################### # FUNCTIONS ############################################################################### def refToLink(ref): match = re.fullmatch(RegEx, ref) if match: _type = match.group(1) _ref = match.group(2) text = "" if _type == TextLetter: m = mainWindow().mdlOutline idx = m.getIndexByID(_ref) if idx.isValid(): item = idx.internalPointer() text = item.title() elif _type == PersoLetter: m = mainWindow().mdlPersos text = m.item(int(_ref), Perso.name.value).text() if text: return "{text}".format( ref=ref, text=text) else: return ref def linkifyAllRefs(text): return re.sub(RegEx, lambda m: refToLink(m.group(0)), text) def basicT2TFormat(text): text = re.sub("\*\*(.*?)\*\*", "\\1", text) text = re.sub("//(.*?)//", "\\1", text) text = re.sub("__(.*?)__", "\\1", text) text = text.replace("\n", "
    ") return text def open(ref): match = re.fullmatch(RegEx, ref) if match: _type = match.group(1) _ref = match.group(2) if _type == PersoLetter: mw = mainWindow() for i in range(mw.mdlPersos.rowCount()): if mw.mdlPersos.ID(i) == _ref: mw.tabMain.setCurrentIndex(2) item = mw.lstPersos.getItemByID(_ref) mw.lstPersos.setCurrentItem(item) return True print("Ref not found") return False elif _type == TextLetter: mw = mainWindow() index = mw.mdlOutline.getIndexByID(_ref) if index.isValid(): mw.mainEditor.setCurrentModelIndex(index, newTab=True) return True else: print("Ref not found") return False print("Ref not implemented") return False