diff --git a/novelwriter/constants.py b/novelwriter/constants.py index 9451ea7f..daf09fcb 100644 --- a/novelwriter/constants.py +++ b/novelwriter/constants.py @@ -145,34 +145,35 @@ class nwFiles: class nwKeyWords: - TAG_KEY = "@tag" - POV_KEY = "@pov" - FOCUS_KEY = "@focus" - CHAR_KEY = "@char" - PLOT_KEY = "@plot" - TIME_KEY = "@time" - WORLD_KEY = "@location" - OBJECT_KEY = "@object" - ENTITY_KEY = "@entity" - CUSTOM_KEY = "@custom" + TAG_KEY = "@tag" + POV_KEY = "@pov" + FOCUS_KEY = "@focus" + CHAR_KEY = "@char" + PLOT_KEY = "@plot" + TIME_KEY = "@time" + WORLD_KEY = "@location" + OBJECT_KEY = "@object" + ENTITY_KEY = "@entity" + CUSTOM_KEY = "@custom" + MENTION_KEY = "@mention" # Set of Valid Keys VALID_KEYS = { TAG_KEY, POV_KEY, FOCUS_KEY, CHAR_KEY, PLOT_KEY, TIME_KEY, - WORLD_KEY, OBJECT_KEY, ENTITY_KEY, CUSTOM_KEY + WORLD_KEY, OBJECT_KEY, ENTITY_KEY, CUSTOM_KEY, MENTION_KEY } # Map from Keys to Item Class KEY_CLASS = { - POV_KEY: nwItemClass.CHARACTER, - FOCUS_KEY: nwItemClass.CHARACTER, - CHAR_KEY: nwItemClass.CHARACTER, - PLOT_KEY: nwItemClass.PLOT, - TIME_KEY: nwItemClass.TIMELINE, - WORLD_KEY: nwItemClass.WORLD, - OBJECT_KEY: nwItemClass.OBJECT, - ENTITY_KEY: nwItemClass.ENTITY, - CUSTOM_KEY: nwItemClass.CUSTOM, + POV_KEY: nwItemClass.CHARACTER, + FOCUS_KEY: nwItemClass.CHARACTER, + CHAR_KEY: nwItemClass.CHARACTER, + PLOT_KEY: nwItemClass.PLOT, + TIME_KEY: nwItemClass.TIMELINE, + WORLD_KEY: nwItemClass.WORLD, + OBJECT_KEY: nwItemClass.OBJECT, + ENTITY_KEY: nwItemClass.ENTITY, + CUSTOM_KEY: nwItemClass.CUSTOM, } diff --git a/novelwriter/core/index.py b/novelwriter/core/index.py index 089d4f27..4ca509c0 100644 --- a/novelwriter/core/index.py +++ b/novelwriter/core/index.py @@ -487,13 +487,14 @@ class NWIndex: if nBits == 0: return [] - # Check that the key is valid - isGood[0] = tBits[0] in nwKeyWords.VALID_KEYS + # Check that the keyword is valid + kBit = tBits[0] + isGood[0] = kBit in nwKeyWords.VALID_KEYS if not isGood[0] or nBits == 1: return isGood # For a tag, only the first value is accepted, the rest are ignored - if tBits[0] == nwKeyWords.TAG_KEY and nBits > 1: + if kBit == nwKeyWords.TAG_KEY and nBits > 1: check, _ = self.parseValue(tBits[1]) if check in self._tagsIndex: isGood[1] = self._tagsIndex.tagHandle(check) == tHandle @@ -501,12 +502,16 @@ class NWIndex: isGood[1] = True return isGood + if kBit == nwKeyWords.MENTION_KEY and nBits > 1: + isGood[1:nBits] = [aBit in self._tagsIndex for aBit in tBits[1:nBits]] + return isGood + # If we're still here, we check that the references exist # Class references cannot have the | symbol in them - refKey = nwKeyWords.KEY_CLASS[tBits[0]].name - for n in range(1, nBits): - if (aBit := tBits[n]) in self._tagsIndex: - isGood[n] = self._tagsIndex.tagClass(aBit) == refKey and "|" not in aBit + if rClass := nwKeyWords.KEY_CLASS.get(kBit): + for n in range(1, nBits): + if (aBit := tBits[n]) in self._tagsIndex: + isGood[n] = self._tagsIndex.tagClass(aBit) == rClass.name and "|" not in aBit return isGood