diff --git a/nw/core/index.py b/nw/core/index.py index 36c27b27..2a3a142a 100644 --- a/nw/core/index.py +++ b/nw/core/index.py @@ -321,8 +321,7 @@ class NWIndex(): nTitle = nLine elif aLine.startswith("@"): - self._indexNoteRef(tHandle, aLine, nLine, nTitle) - self._indexTag(tHandle, aLine, nLine, nTitle, itemClass) + self._indexKeyword(tHandle, aLine, nLine, nTitle, itemClass) elif aLine.startswith("%"): if nTitle > 0: @@ -463,41 +462,28 @@ class NWIndex(): self._noteIndex[tHandle][sTitle]["updated"] = round(time()) return - def _indexNoteRef(self, tHandle, aLine, nLine, nTitle): + def _indexKeyword(self, tHandle, aLine, nLine, nTitle, itemClass): """Validate and save the information about a reference to a tag in another file. """ isValid, theBits, _ = self.scanThis(aLine) - if not isValid or len(theBits) == 0: - return False - - sTitle = "T%06d" % nTitle - if sTitle not in self._refIndex[tHandle]: - return False - - if theBits[0] == nwKeyWords.TAG_KEY: - return False + if not isValid or len(theBits) < 2: + logger.warning("Skipping keyword with %d value(s) in %s" % (len(theBits), tHandle)) + return if theBits[0] not in nwKeyWords.VALID_KEYS: - return False - - for aVal in theBits[1:]: - self._refIndex[tHandle][sTitle]["tags"].append([nLine, theBits[0], aVal]) - - return True - - def _indexTag(self, tHandle, aLine, nLine, nTitle, itemClass): - """Validate and save the information from a tag. - """ - isValid, theBits, thePos = self.scanThis(aLine) - if not isValid or len(theBits) != 2: - return False + logger.warning("Skipping invalid keyword '%s' in %s" % (theBits[0], tHandle)) + return + sTitle = "T%06d" % nTitle if theBits[0] == nwKeyWords.TAG_KEY: - sTitle = "T%06d" % nTitle self._tagIndex[theBits[1]] = [nLine, tHandle, itemClass.name, sTitle] - return True + elif sTitle in self._refIndex[tHandle]: + for aVal in theBits[1:]: + self._refIndex[tHandle][sTitle]["tags"].append([nLine, theBits[0], aVal]) + + return ## # Check @ Lines @@ -717,7 +703,7 @@ class NWIndex(): for refTitle in self._refIndex[tHandle]: for aTag in self._refIndex[tHandle][refTitle].get("tags", []): if len(aTag) == 3 and (sTitle is None or sTitle == refTitle): - if aTag[1] in theRefs: # Future-compatible. Check can be removed in 1.2. + if aTag[1] in theRefs: theRefs[aTag[1]].append(aTag[2]) return theRefs diff --git a/tests/test_core/test_core_index.py b/tests/test_core/test_core_index.py index 9b1c656a..487dd68e 100644 --- a/tests/test_core/test_core_index.py +++ b/tests/test_core/test_core_index.py @@ -198,14 +198,28 @@ def testCoreIndex_CheckThese(nwMinimal, dummyGUI): assert theIndex.scanText(cHandle, ( "# Jane Smith\n" - "@tag: Jane" + "@tag: Jane\n" + "@tag:\n" + "@:\n" )) assert theIndex.scanText(nHandle, ( "# Hello World!\n" - "@pov: Jane" + "@pov: Jane\n" + "@invalid: John\n" # Checks for issue #688 )) assert theIndex._tagIndex == {"Jane": [2, cHandle, "CHARACTER", "T000001"]} assert theIndex.getNovelData(nHandle, "T000001")["title"] == "Hello World!" + assert theIndex.getReferences(nHandle, "T000001") == { + "@char": [], + "@custom": [], + "@entity": [], + "@focus": [], + "@location": [], + "@object": [], + "@plot": [], + "@pov": ["Jane"], + "@time": [] + } assert theIndex.novelChangedSince(0) assert theIndex.notesChangedSince(0) @@ -281,7 +295,7 @@ def testCoreIndex_ScanText(nwMinimal, dummyGUI): "This is a story about Jane Smith.\n\n" "Well, not really.\n" )) - assert str(theIndex._tagIndex) == "{'Jane': [2, '%s', 'CHARACTER', 'T000001']}" % cHandle + assert theIndex._tagIndex == {"Jane": [2, cHandle, "CHARACTER", "T000001"]} assert theIndex.getNovelData(nHandle, "T000001")["title"] == "Hello World!" # Check that title sections are indexed properly