From eacb38928e409e720fc826b195e828854d648a1d Mon Sep 17 00:00:00 2001 From: "Felix W. Dekker" Date: Fri, 14 May 2021 15:29:43 +0200 Subject: [PATCH] Add wrongly-cased link and page state Fixes #45. --- package.json | 2 +- src/main/js/DOM.js | 4 ++++ src/main/js/MediaWiki.js | 19 ++++++++++++++++++- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 8dc4fec..781032b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "interlanguage-checker", - "version": "1.11.7", + "version": "1.12.0", "description": "Check the consistency of MediaWiki interlanguage links in a simple overview.", "author": "Felix W. Dekker", "browser": "dist/bundle.js", diff --git a/src/main/js/DOM.js b/src/main/js/DOM.js index a660bc4..a2b5b85 100644 --- a/src/main/js/DOM.js +++ b/src/main/js/DOM.js @@ -356,6 +356,8 @@ export class InterlangTable { return this._createIcon("chain-broken", "Misses one or more links 😕", ["error"]); case "redirected": return this._createIcon("mail-forward", "Links to a redirect 😕", ["warning"]); + case "wrongly-cased": + return this._createIcon("text-height", "Links with incorrect capitalisation 😕", ["warning"]); default: throw new Error(`Invalid page state '${state}'`); } @@ -375,6 +377,8 @@ export class InterlangTable { return ``; case "redirected": return this._createIcon("mail-forward", "Links to a redirect 😕", ["warning"]); + case "wrongly-cased": + return this._createIcon("text-height", "Links with incorrect capitalisation 😕", ["warning"]); default: throw new Error(`Invalid link state '${linkState}'`); } diff --git a/src/main/js/MediaWiki.js b/src/main/js/MediaWiki.js index 46412de..276c269 100644 --- a/src/main/js/MediaWiki.js +++ b/src/main/js/MediaWiki.js @@ -33,6 +33,18 @@ export class InterlangLink { return other instanceof InterlangLink && this.lang === other.lang && this.title === other.title; } + /** + * Returns `true` if and only if the given object equals this `InterlangLink`, ignoring the case of the titles. + * + * @param other {*} the object to compare to this `InterlangLink` + * @returns {boolean} `true` if and only if the given object equals this `InterlangLink`, ignoring the case of the + * titles + */ + equalsIgnoringCase(other) { + return other instanceof InterlangLink && this.lang === other.lang + && this.title.toLowerCase() === other.title.toLowerCase(); + } + /** * Converts this `InterlangLink` to a string. * @@ -232,6 +244,9 @@ export class InterlangNetwork { if (source.langLinks.some(it => it.equals(destination.link))) return isSelfLangLink ? "self-linked" : "linked"; + if (source.langLinks.some(it => it.equalsIgnoringCase(destination.link))) + return isSelfLangLink ? "self-linked" : "wrongly-cased"; + if (source.langLinks.some(link => this.redirects.some(it => it.equals(new Redirect(link, destination.link))))) return isSelfLangLink ? "self-linked" : "redirected"; @@ -267,6 +282,8 @@ export class InterlangNetwork { selfStates.push("unlinked"); if (pageStates.some(({verdict}) => verdict === "redirected")) selfStates.push("redirected"); + if (pageStates.some(({verdict}) => verdict === "wrongly-cased")) + selfStates.push("wrongly-cased"); if (selfStates.length === 0) selfStates.push("perfect"); @@ -285,7 +302,7 @@ export class InterlangNetwork { const verdict = this.getPageVerdict(page).self; if (verdict.some(it => ["not-found", "unlinked"].includes(it))) return mergeStates(states, state, "broken"); - if (verdict.some(it => ["wrongly-ordered", "doubly-linked", "self-linked", "redirected"].includes(it))) + if (verdict.some(it => ["wrongly-ordered", "doubly-linked", "self-linked", "redirected", "wrongly-cased"].includes(it))) return mergeStates(states, state, "flawed"); return mergeStates(states, state, "perfect"); }, "perfect");