diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/find.js | 166 |
1 files changed, 86 insertions, 80 deletions
diff --git a/src/find.js b/src/find.js index 238abda8..74f0f765 100644 --- a/src/find.js +++ b/src/find.js @@ -94,6 +94,33 @@ export function processAllAvailableMatches(data, spec) { return {byName, byDirectory, multipleNameMatches}; } +function matchHelper(fullRef, { + mode, + + matchByDirectory = (_referenceType, _directory) => null, + matchByName = (_name) => null, +}) { + const regexMatch = fullRef.match(keyRefRegex); + if (!regexMatch) { + return warnOrThrow(mode, + `Malformed link reference: "${fullRef}"`); + } + + const {key: keyPart, ref: refPart} = regexMatch.groups; + + const match = + (keyPart + ? matchByDirectory(keyPart, refPart) + : matchByName(refPart)); + + if (match) { + return match; + } else { + return warnOrThrow(mode, + `Didn't match anything for ${colors.bright(fullRef)}`); + } +} + function findHelper({ referenceTypes, @@ -136,46 +163,37 @@ function findHelper({ cache.set(data, subcache); } - const regexMatch = fullRef.match(keyRefRegex); - if (!regexMatch) { - return warnOrThrow(mode, - `Malformed link reference: "${fullRef}"`); - } - - const {key: keyPart, ref: refPart} = regexMatch.groups; - - let match; - - if (keyPart) { - if (!referenceTypes.includes(keyPart)) { - return warnOrThrow(mode, - `Reference starts with "${keyPart}:", expected ` + - referenceTypes.map(type => `"${type}:"`).join(', ')); - } + return matchHelper(fullRef, { + mode, - match = subcache.byDirectory[refPart]; - } else { - const normalizedName = - refPart.toLowerCase(); - - match = subcache.byName[normalizedName]; - - if (!match && subcache.multipleNameMatches[normalizedName]) { - return warnOrThrow(mode, - `Multiple matches for reference "${fullRef}". Please resolve:\n` + - subcache.multipleNameMatches[normalizedName] - .map(match => `- ${inspect(match)}\n`) - .join('') + - `Returning null for this reference.`); - } - } - - if (!match) { - return warnOrThrow(mode, - `Didn't match anything for ${colors.bright(fullRef)}`); - } + matchByDirectory(referenceType, directory) { + if (!referenceTypes.includes(referenceType)) { + return warnOrThrow(mode, + `Reference starts with "${referenceType}:", expected ` + + referenceTypes.map(type => `"${type}:"`).join(', ')); + } - return match; + return subcache.byDirectory[directory]; + }, + + matchByName(name) { + const normalizedName = name.toLowerCase(); + const match = subcache.byName[normalizedName]; + + if (match) { + return match; + } else if (subcache.multipleNameMatches[normalizedName]) { + return warnOrThrow(mode, + `Multiple matches for reference "${fullRef}". Please resolve:\n` + + subcache.multipleNameMatches[normalizedName] + .map(match => `- ${inspect(match)}\n`) + .join('') + + `Returning null for this reference.`); + } else { + return null; + } + }, + }); }; } @@ -297,50 +315,38 @@ function findMixedHelper(config) { }); } - // TODO: Factor out this common behavior w/ findHelper - - const regexMatch = fullRef.match(keyRefRegex); - if (!regexMatch) { - return warnOrThrow(mode, - `Malformed link reference: "${fullRef}"`); - } - - const {key: keyPart, ref: refPart} = regexMatch.groups; - - let match; - - if (keyPart) { - if (!referenceTypes.includes(keyPart)) { - return warnOrThrow(mode, - `Reference starts with "${keyPart}:", expected ` + - referenceTypes.map(type => `"${type}:"`).join(', ')); - } + return matchHelper(fullRef, { + mode, - // TODO: Do something - match = null; - } else { - const normalizedName = - refPart.toLowerCase(); - - match = - byName[normalizedName]; - - if (!match && multipleNameMatches[normalizedName]) { - return warnOrThrow(mode, - `Multiple matches for reference "${fullRef}". Please resolve:\n` + - multipleNameMatches[normalizedName] - .map(match => `- ${inspect(match)}\n`) - .join('') + - `Returning null for this reference.`); - } - } - - if (!match) { - return warnOrThrow(mode, - `Didn't match anything for ${colors.bright(fullRef)}`); - } + matchByDirectory(referenceType, _directory) { + if (!referenceTypes.includes(referenceType)) { + return warnOrThrow(mode, + `Reference starts with "${referenceType}:", expected ` + + referenceTypes.map(type => `"${type}:"`).join(', ')); + } - return match; + // TODO: Do something + return null; + }, + + matchByName(name) { + const normalizedName = name.toLowerCase(); + const match = byName[normalizedName]; + + if (match) { + return match; + } else if (multipleNameMatches[normalizedName]) { + return warnOrThrow(mode, + `Multiple matches for reference "${fullRef}". Please resolve:\n` + + multipleNameMatches[normalizedName] + .map(match => `- ${inspect(match)}\n`) + .join('') + + `Returning null for this reference.`); + } else { + return null; + } + }, + }); }; } |