scrabble-solver 2.9.1 → 2.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/.eslintrc.js +8 -1
  2. package/LICENSE +1 -1
  3. package/README.md +50 -30
  4. package/img/logo.svg +76 -0
  5. package/lerna.json +1 -1
  6. package/package.json +3 -3
  7. package/packages/configs/package.json +5 -5
  8. package/packages/constants/package.json +3 -3
  9. package/packages/dictionaries/package-lock.json +2 -2
  10. package/packages/dictionaries/package.json +6 -6
  11. package/packages/logger/package-lock.json +2 -2
  12. package/packages/logger/package.json +3 -3
  13. package/packages/scrabble-solver/.next/BUILD_ID +1 -1
  14. package/packages/scrabble-solver/.next/build-manifest.json +7 -7
  15. package/packages/scrabble-solver/.next/cache/.tsbuildinfo +1 -1
  16. package/packages/scrabble-solver/.next/cache/eslint/.cache_8dgz12 +1 -1
  17. package/packages/scrabble-solver/.next/cache/next-server.js.nft.json +1 -1
  18. package/packages/scrabble-solver/.next/cache/webpack/client-production/0.pack +0 -0
  19. package/packages/scrabble-solver/.next/cache/webpack/client-production/index.pack +0 -0
  20. package/packages/scrabble-solver/.next/cache/webpack/edge-server-production/0.pack +0 -0
  21. package/packages/scrabble-solver/.next/cache/webpack/edge-server-production/index.pack +0 -0
  22. package/packages/scrabble-solver/.next/cache/webpack/server-production/0.pack +0 -0
  23. package/packages/scrabble-solver/.next/cache/webpack/server-production/index.pack +0 -0
  24. package/packages/scrabble-solver/.next/next-server.js.nft.json +1 -1
  25. package/packages/scrabble-solver/.next/prerender-manifest.json +1 -1
  26. package/packages/scrabble-solver/.next/required-server-files.json +1 -1
  27. package/packages/scrabble-solver/.next/routes-manifest.json +1 -1
  28. package/packages/scrabble-solver/.next/server/chunks/413.js +6 -2
  29. package/packages/scrabble-solver/.next/server/chunks/44.js +894 -3
  30. package/packages/scrabble-solver/.next/server/chunks/515.js +10 -3
  31. package/packages/scrabble-solver/.next/server/middleware-build-manifest.js +1 -1
  32. package/packages/scrabble-solver/.next/server/pages/404.html +2 -2
  33. package/packages/scrabble-solver/.next/server/pages/404.js.nft.json +1 -1
  34. package/packages/scrabble-solver/.next/server/pages/500.html +2 -2
  35. package/packages/scrabble-solver/.next/server/pages/_app.js.nft.json +1 -1
  36. package/packages/scrabble-solver/.next/server/pages/api/dictionary/[locale]/[word].js +121 -65
  37. package/packages/scrabble-solver/.next/server/pages/api/dictionary/[locale]/[word].js.nft.json +1 -1
  38. package/packages/scrabble-solver/.next/server/pages/api/dictionary/[locale].js +1 -1
  39. package/packages/scrabble-solver/.next/server/pages/api/dictionary/[locale].js.nft.json +1 -1
  40. package/packages/scrabble-solver/.next/server/pages/api/solve.js +1 -1
  41. package/packages/scrabble-solver/.next/server/pages/api/solve.js.nft.json +1 -1
  42. package/packages/scrabble-solver/.next/server/pages/api/verify.js +1 -1
  43. package/packages/scrabble-solver/.next/server/pages/api/verify.js.nft.json +1 -1
  44. package/packages/scrabble-solver/.next/server/pages/index.html +2 -2
  45. package/packages/scrabble-solver/.next/server/pages/index.js.nft.json +1 -1
  46. package/packages/scrabble-solver/.next/server/pages/index.json +1 -1
  47. package/packages/scrabble-solver/.next/static/{Oki2Ia4sgLw021iM7byAe → Ntg-ilwD7GqTIFwRpSaTQ}/_buildManifest.js +1 -1
  48. package/packages/scrabble-solver/.next/static/{Oki2Ia4sgLw021iM7byAe → Ntg-ilwD7GqTIFwRpSaTQ}/_ssgManifest.js +0 -0
  49. package/packages/scrabble-solver/.next/static/chunks/{317-e7d5d859f1f95938.js → 317-5e5334962dd7c681.js} +1 -1
  50. package/packages/scrabble-solver/.next/static/chunks/pages/{_app-10893b318367f97c.js → _app-183f598b1d4d480b.js} +1 -1
  51. package/packages/scrabble-solver/.next/static/css/e8de67ad5ea35427.css +1 -0
  52. package/packages/scrabble-solver/.next/trace +52 -52
  53. package/packages/scrabble-solver/package-lock.json +2 -2
  54. package/packages/scrabble-solver/package.json +10 -10
  55. package/packages/scrabble-solver/src/components/Dictionary/Dictionary.module.scss +1 -0
  56. package/packages/scrabble-solver/src/components/Dictionary/Dictionary.tsx +7 -2
  57. package/packages/scrabble-solver/src/i18n/en.json +2 -2
  58. package/packages/scrabble-solver/src/pages/api/dictionary/[locale]/[word].ts +3 -1
  59. package/packages/solver/package-lock.json +2 -2
  60. package/packages/solver/package.json +7 -7
  61. package/packages/types/build/WordDefinition.d.ts +8 -5
  62. package/packages/types/build/WordDefinition.js +5 -1
  63. package/packages/types/build/WordDefinitionJson.d.ts +7 -0
  64. package/packages/types/package.json +4 -4
  65. package/packages/types/src/WordDefinition.ts +13 -1
  66. package/packages/types/src/WordDefinitionJson.ts +7 -0
  67. package/packages/word-definitions/build/getWordDefinition.d.ts +1 -1
  68. package/packages/word-definitions/build/getWordDefinition.js +3 -3
  69. package/packages/word-definitions/build/lib/normalizeDefinition.js +3 -1
  70. package/packages/word-definitions/build/parse/parse.js +2 -2
  71. package/packages/word-definitions/build/parse/parseEnglish.js +7 -7
  72. package/packages/word-definitions/build/parse/parseFrench.js +3 -6
  73. package/packages/word-definitions/build/parse/parseGerman.js +54 -16
  74. package/packages/word-definitions/build/parse/parsePolish.js +3 -6
  75. package/packages/word-definitions/build/parse/parseSpanish.js +3 -6
  76. package/packages/word-definitions/build/types.d.ts +1 -1
  77. package/packages/word-definitions/package-lock.json +8 -8
  78. package/packages/word-definitions/package.json +4 -4
  79. package/packages/word-definitions/src/getWordDefinition.ts +3 -3
  80. package/packages/word-definitions/src/lib/normalizeDefinition.ts +4 -1
  81. package/packages/word-definitions/src/parse/__tests__/expected/de-DE.hm.json +4 -0
  82. package/packages/word-definitions/src/parse/__tests__/expected/de-DE.ho.json +9 -0
  83. package/packages/word-definitions/src/parse/__tests__/expected/de-DE.kolla.json +4 -0
  84. package/packages/word-definitions/src/parse/__tests__/expected/de-DE.vom.json +16 -0
  85. package/packages/word-definitions/src/parse/__tests__/expected/en-US.awe.json +1 -1
  86. package/packages/word-definitions/src/parse/__tests__/expected/en-US.pawn.json +1 -1
  87. package/packages/word-definitions/src/parse/__tests__/expected/en-US.pawnee.json +1 -1
  88. package/packages/word-definitions/src/parse/__tests__/expected/en-US.pean.json +1 -1
  89. package/packages/word-definitions/src/parse/__tests__/expected/en-US.wiz.json +1 -1
  90. package/packages/word-definitions/src/parse/__tests__/expected/es-ES.corma.json +1 -1
  91. package/packages/word-definitions/src/parse/__tests__/expected/es-ES.portero.json +1 -1
  92. package/packages/word-definitions/src/parse/__tests__/input/de-DE.hm.html +873 -0
  93. package/packages/word-definitions/src/parse/__tests__/input/de-DE.ho.html +1144 -0
  94. package/packages/word-definitions/src/parse/__tests__/input/de-DE.kolla.html +980 -0
  95. package/packages/word-definitions/src/parse/__tests__/input/de-DE.vom.html +738 -0
  96. package/packages/word-definitions/src/parse/parse.test.ts +4 -0
  97. package/packages/word-definitions/src/parse/parse.ts +2 -2
  98. package/packages/word-definitions/src/parse/parseEnglish.ts +8 -4
  99. package/packages/word-definitions/src/parse/parseFrench.ts +3 -3
  100. package/packages/word-definitions/src/parse/parseGerman.ts +71 -12
  101. package/packages/word-definitions/src/parse/parsePolish.ts +3 -3
  102. package/packages/word-definitions/src/parse/parseSpanish.ts +3 -3
  103. package/packages/word-definitions/src/types.ts +1 -1
  104. package/packages/word-lists/build/getDeDeWordList.js +1 -1
  105. package/packages/word-lists/build/getPlPlWordList.js +2 -2
  106. package/packages/word-lists/package-lock.json +2 -2
  107. package/packages/word-lists/package.json +4 -4
  108. package/packages/word-lists/src/getDeDeWordList.ts +1 -1
  109. package/packages/word-lists/src/getPlPlWordList.ts +2 -2
  110. package/img/logo.png +0 -0
  111. package/packages/scrabble-solver/.next/server/chunks/452.js +0 -894
  112. package/packages/scrabble-solver/.next/static/css/e3d218f4ea72c5fb.css +0 -1
  113. package/packages/scrabble-solver/public/robots.txt +0 -4
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@scrabble-solver/scrabble-solver",
3
- "version": "2.9.1",
3
+ "version": "2.9.2",
4
4
  "lockfileVersion": 2,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@scrabble-solver/scrabble-solver",
9
- "version": "2.9.1",
9
+ "version": "2.9.2",
10
10
  "license": "CC BY-NC-ND 4.0",
11
11
  "dependencies": {
12
12
  "@kamilmielnik/trie": "^2.0.1",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scrabble-solver/scrabble-solver",
3
- "version": "2.9.1",
3
+ "version": "2.9.2",
4
4
  "description": "Scrabble Solver 2 - App",
5
5
  "engines": {
6
6
  "node": ">=16"
@@ -11,8 +11,8 @@
11
11
  },
12
12
  "author": {
13
13
  "name": "Kamil Mielnik",
14
- "email": "kamil.adam.mielnik@gmail.com",
15
- "url": "https://kamilmielnik.com/"
14
+ "email": "kamil@kamilmielnik.com",
15
+ "url": "https://kamilmielnik.com"
16
16
  },
17
17
  "license": "CC BY-NC-ND 4.0",
18
18
  "bugs": {
@@ -31,13 +31,13 @@
31
31
  "@kamilmielnik/trie": "^2.0.1",
32
32
  "@popperjs/core": "^2.11.6",
33
33
  "@reduxjs/toolkit": "^1.8.6",
34
- "@scrabble-solver/configs": "^2.9.1",
35
- "@scrabble-solver/constants": "^2.9.1",
36
- "@scrabble-solver/dictionaries": "^2.9.1",
37
- "@scrabble-solver/logger": "^2.9.1",
38
- "@scrabble-solver/solver": "^2.9.1",
39
- "@scrabble-solver/types": "^2.9.1",
40
- "@scrabble-solver/word-definitions": "^2.9.1",
34
+ "@scrabble-solver/configs": "^2.9.2",
35
+ "@scrabble-solver/constants": "^2.9.2",
36
+ "@scrabble-solver/dictionaries": "^2.9.2",
37
+ "@scrabble-solver/logger": "^2.9.2",
38
+ "@scrabble-solver/solver": "^2.9.2",
39
+ "@scrabble-solver/types": "^2.9.2",
40
+ "@scrabble-solver/word-definitions": "^2.9.2",
41
41
  "classnames": "^2.3.2",
42
42
  "next": "^12.3.1",
43
43
  "normalize.css": "^8.0.1",
@@ -53,6 +53,7 @@
53
53
 
54
54
  .definition {
55
55
  margin-bottom: var(--spacing--s);
56
+ white-space: pre-wrap;
56
57
 
57
58
  &:last-child {
58
59
  margin-bottom: 0;
@@ -31,7 +31,7 @@ const Dictionary: FunctionComponent<Props> = ({ className }) => {
31
31
  </EmptyState>
32
32
  )}
33
33
 
34
- {results.map(({ definitions, isAllowed, word }) => (
34
+ {results.map(({ definitions, exists, isAllowed, word }) => (
35
35
  <div
36
36
  className={classNames(styles.result, {
37
37
  [styles.isAllowed]: isAllowed === true,
@@ -51,7 +51,12 @@ const Dictionary: FunctionComponent<Props> = ({ className }) => {
51
51
 
52
52
  {isAllowed === true && (
53
53
  <>
54
- {definitions.length === 0 && <div>{translate('dictionary.empty-state.no-definitions')}</div>}
54
+ {definitions.length === 0 && (
55
+ <>
56
+ {exists && <div>{translate('dictionary.empty-state.no-definitions')}</div>}
57
+ {!exists && <div>{translate('dictionary.empty-state.no-results')}</div>}
58
+ </>
59
+ )}
55
60
 
56
61
  {definitions.length > 0 && (
57
62
  <ul className={styles.definitions}>
@@ -15,9 +15,9 @@
15
15
  "common.word": "Word",
16
16
  "common.words": "Words",
17
17
  "dictionary.empty-state.no-definitions": "Word exists in the dictionary but it does not have a definition.",
18
- "dictionary.empty-state.no-results": "Unable to find word definition in dictionary.",
18
+ "dictionary.empty-state.no-results": "Unable to find word definition in the dictionary.",
19
19
  "dictionary.empty-state.not-allowed": "This word is not allowed.",
20
- "dictionary.empty-state.uninitialized": "Dictionary definition of the last highlighted word will be shown here.",
20
+ "dictionary.empty-state.uninitialized": "Dictionary definition of the most recently highlighted word will be shown here.",
21
21
  "dictionary.input.placeholder": "Search dictionary...",
22
22
  "empty-state.error": "Error",
23
23
  "empty-state.info": "Info",
@@ -1,4 +1,5 @@
1
1
  import { scrabble } from '@scrabble-solver/configs';
2
+ import { dictionaries } from '@scrabble-solver/dictionaries';
2
3
  import logger from '@scrabble-solver/logger';
3
4
  import { isLocale, Locale } from '@scrabble-solver/types';
4
5
  import { getWordDefinition } from '@scrabble-solver/word-definitions';
@@ -27,7 +28,8 @@ const dictionary = async (request: NextApiRequest, response: NextApiResponse): P
27
28
  },
28
29
  });
29
30
 
30
- const results = await Promise.all(words.map((word) => getWordDefinition(locale, word)));
31
+ const trie = await dictionaries.get(locale);
32
+ const results = await Promise.all(words.map((word) => getWordDefinition(locale, word, trie.has(word))));
31
33
  response.status(200).send(results.map((result) => result.toJson()));
32
34
  } catch (error) {
33
35
  const message = error instanceof Error ? error.message : 'Unknown error';
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@scrabble-solver/solver",
3
- "version": "2.9.1",
3
+ "version": "2.9.2",
4
4
  "lockfileVersion": 2,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@scrabble-solver/solver",
9
- "version": "2.9.1",
9
+ "version": "2.9.2",
10
10
  "license": "CC-BY-NC-ND-4.0",
11
11
  "dependencies": {
12
12
  "@kamilmielnik/trie": "^2.0.1"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scrabble-solver/solver",
3
- "version": "2.9.1",
3
+ "version": "2.9.2",
4
4
  "description": "Scrabble Solver 2 - Solver",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -10,8 +10,8 @@
10
10
  },
11
11
  "author": {
12
12
  "name": "Kamil Mielnik",
13
- "email": "kamil.adam.mielnik@gmail.com",
14
- "url": "https://kamilmielnik.com/"
13
+ "email": "kamil@kamilmielnik.com",
14
+ "url": "https://kamilmielnik.com"
15
15
  },
16
16
  "license": "CC-BY-NC-ND-4.0",
17
17
  "bugs": {
@@ -25,12 +25,12 @@
25
25
  },
26
26
  "dependencies": {
27
27
  "@kamilmielnik/trie": "^2.0.1",
28
- "@scrabble-solver/types": "^2.9.1"
28
+ "@scrabble-solver/types": "^2.9.2"
29
29
  },
30
30
  "devDependencies": {
31
- "@scrabble-solver/configs": "^2.9.1",
32
- "@scrabble-solver/constants": "^2.9.1",
33
- "@scrabble-solver/dictionaries": "^2.9.1"
31
+ "@scrabble-solver/configs": "^2.9.2",
32
+ "@scrabble-solver/constants": "^2.9.2",
33
+ "@scrabble-solver/dictionaries": "^2.9.2"
34
34
  },
35
35
  "gitHead": "1e2d1ad49a288d4a44196d8e3336740da132c637"
36
36
  }
@@ -3,13 +3,16 @@ declare class WordDefinition {
3
3
  static fromJson(json: WordDefinitionJson | null): WordDefinition;
4
4
  static readonly Null: WordDefinition;
5
5
  readonly definitions: string[];
6
+ /**
7
+ * Does the word have an entry in a corresponding online dictionary?
8
+ */
9
+ readonly exists: boolean;
10
+ /**
11
+ * Can the word be legally used in the game?
12
+ */
6
13
  readonly isAllowed: boolean;
7
14
  readonly word: string;
8
- constructor({ definitions, isAllowed, word }: {
9
- definitions: string[];
10
- isAllowed: boolean;
11
- word: string;
12
- });
15
+ constructor({ definitions, exists, isAllowed, word }: WordDefinitionJson);
13
16
  toJson(): WordDefinitionJson | null;
14
17
  }
15
18
  export default WordDefinition;
@@ -1,8 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  class WordDefinition {
4
- constructor({ definitions, isAllowed, word }) {
4
+ constructor({ definitions, exists, isAllowed, word }) {
5
5
  this.definitions = definitions;
6
+ this.exists = exists;
6
7
  this.isAllowed = isAllowed;
7
8
  this.word = word;
8
9
  }
@@ -12,6 +13,7 @@ class WordDefinition {
12
13
  }
13
14
  return new WordDefinition({
14
15
  definitions: json.definitions,
16
+ exists: json.exists,
15
17
  isAllowed: json.isAllowed,
16
18
  word: json.word,
17
19
  });
@@ -19,6 +21,7 @@ class WordDefinition {
19
21
  toJson() {
20
22
  return {
21
23
  definitions: this.definitions,
24
+ exists: this.exists,
22
25
  isAllowed: this.isAllowed,
23
26
  word: this.word,
24
27
  };
@@ -26,6 +29,7 @@ class WordDefinition {
26
29
  }
27
30
  WordDefinition.Null = Object.freeze({
28
31
  definitions: [],
32
+ exists: false,
29
33
  isAllowed: false,
30
34
  word: '',
31
35
  toJson: () => null,
@@ -1,5 +1,12 @@
1
1
  interface WordDefinitionJson {
2
2
  definitions: string[];
3
+ /**
4
+ * Does the word have an entry in a corresponding online dictionary?
5
+ */
6
+ exists: boolean;
7
+ /**
8
+ * Can the word be legally used in the game?
9
+ */
3
10
  isAllowed: boolean;
4
11
  word: string;
5
12
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scrabble-solver/types",
3
- "version": "2.9.1",
3
+ "version": "2.9.2",
4
4
  "description": "Scrabble Solver 2 - Types",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -10,8 +10,8 @@
10
10
  },
11
11
  "author": {
12
12
  "name": "Kamil Mielnik",
13
- "email": "kamil.adam.mielnik@gmail.com",
14
- "url": "https://kamilmielnik.com/"
13
+ "email": "kamil@kamilmielnik.com",
14
+ "url": "https://kamilmielnik.com"
15
15
  },
16
16
  "license": "CC-BY-NC-ND-4.0",
17
17
  "bugs": {
@@ -24,7 +24,7 @@
24
24
  "clean:force": "npm run clean && rimraf package-lock.json"
25
25
  },
26
26
  "dependencies": {
27
- "@scrabble-solver/constants": "^2.9.1"
27
+ "@scrabble-solver/constants": "^2.9.2"
28
28
  },
29
29
  "gitHead": "1e2d1ad49a288d4a44196d8e3336740da132c637"
30
30
  }
@@ -8,6 +8,7 @@ class WordDefinition {
8
8
 
9
9
  return new WordDefinition({
10
10
  definitions: json.definitions,
11
+ exists: json.exists,
11
12
  isAllowed: json.isAllowed,
12
13
  word: json.word,
13
14
  });
@@ -15,6 +16,7 @@ class WordDefinition {
15
16
 
16
17
  public static readonly Null: WordDefinition = Object.freeze({
17
18
  definitions: [],
19
+ exists: false,
18
20
  isAllowed: false,
19
21
  word: '',
20
22
  toJson: () => null,
@@ -22,12 +24,21 @@ class WordDefinition {
22
24
 
23
25
  public readonly definitions: string[];
24
26
 
27
+ /**
28
+ * Does the word have an entry in a corresponding online dictionary?
29
+ */
30
+ public readonly exists: boolean;
31
+
32
+ /**
33
+ * Can the word be legally used in the game?
34
+ */
25
35
  public readonly isAllowed: boolean;
26
36
 
27
37
  public readonly word: string;
28
38
 
29
- constructor({ definitions, isAllowed, word }: { definitions: string[]; isAllowed: boolean; word: string }) {
39
+ constructor({ definitions, exists, isAllowed, word }: WordDefinitionJson) {
30
40
  this.definitions = definitions;
41
+ this.exists = exists;
31
42
  this.isAllowed = isAllowed;
32
43
  this.word = word;
33
44
  }
@@ -35,6 +46,7 @@ class WordDefinition {
35
46
  public toJson(): WordDefinitionJson | null {
36
47
  return {
37
48
  definitions: this.definitions,
49
+ exists: this.exists,
38
50
  isAllowed: this.isAllowed,
39
51
  word: this.word,
40
52
  };
@@ -1,5 +1,12 @@
1
1
  interface WordDefinitionJson {
2
2
  definitions: string[];
3
+ /**
4
+ * Does the word have an entry in a corresponding online dictionary?
5
+ */
6
+ exists: boolean;
7
+ /**
8
+ * Can the word be legally used in the game?
9
+ */
3
10
  isAllowed: boolean;
4
11
  word: string;
5
12
  }
@@ -1,3 +1,3 @@
1
1
  import { Locale, WordDefinition } from '@scrabble-solver/types';
2
- declare const getWordDefinition: (locale: Locale, word: string) => Promise<WordDefinition>;
2
+ declare const getWordDefinition: (locale: Locale, word: string, isAllowed: boolean) => Promise<WordDefinition>;
3
3
  export default getWordDefinition;
@@ -3,10 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const types_1 = require("@scrabble-solver/types");
4
4
  const crawl_1 = require("./crawl");
5
5
  const parse_1 = require("./parse");
6
- const getWordDefinition = async (locale, word) => {
6
+ const getWordDefinition = async (locale, word, isAllowed) => {
7
7
  const html = await (0, crawl_1.crawl)(locale, word);
8
- const { definitions, isAllowed } = (0, parse_1.parse)(locale, html);
9
- const wordDefinition = new types_1.WordDefinition({ definitions, isAllowed, word });
8
+ const { definitions, exists } = (0, parse_1.parse)(locale, html);
9
+ const wordDefinition = new types_1.WordDefinition({ definitions, exists, isAllowed, word });
10
10
  return wordDefinition;
11
11
  };
12
12
  exports.default = getWordDefinition;
@@ -6,7 +6,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const striptags_1 = __importDefault(require("striptags"));
7
7
  const EMPHASIS_TAGS = ['a', 'b', 'em', 'internalXref'];
8
8
  const normalizeHtmlTags = (definition) => (0, striptags_1.default)((0, striptags_1.default)(definition, EMPHASIS_TAGS), undefined, '"');
9
- const normalizeLineBreaks = (definition) => definition.replace(/[\r\n]/g, '');
9
+ const normalizeLineBreaks = (definition) => definition.replace(/\r\n/g, '\n');
10
+ const normalizeWhitespace = (definition) => definition.replace(/[ ]+/g, ' ');
10
11
  const normalizeQuotes = (definition) => definition.replace(/\."/g, '".');
11
12
  /**
12
13
  * `(1.2) definition` -> `definition`
@@ -26,6 +27,7 @@ const normalizers = [
26
27
  normalizeMarkers,
27
28
  normalizeQuotes,
28
29
  normalizeLineBreaks,
30
+ normalizeWhitespace,
29
31
  normalizeTrailingSymbols,
30
32
  normalizeLeadingSymbols,
31
33
  normalizeNonWords,
@@ -19,10 +19,10 @@ const parsePerLocale = {
19
19
  [types_1.Locale.PL_PL]: parsePolish_1.default,
20
20
  };
21
21
  const parse = (locale, html) => {
22
- const { definitions, isAllowed } = parsePerLocale[locale](html);
22
+ const { definitions, exists } = parsePerLocale[locale](html);
23
23
  return {
24
24
  definitions: (0, lib_1.unique)(definitions.map(lib_1.normalizeDefinition).filter(Boolean)),
25
- isAllowed,
25
+ exists,
26
26
  };
27
27
  };
28
28
  exports.default = parse;
@@ -1,18 +1,18 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const cheerio_1 = __importDefault(require("cheerio"));
3
+ const cheerio_1 = require("cheerio");
4
+ const DOES_NOT_EXIST_MESSAGE =
5
+ // eslint-disable-next-line max-len
6
+ "The word you've entered isn't in the dictionary. Click on a spelling suggestion below or try again using the search bar above.";
7
7
  const parseEnglish = (html) => {
8
- const $ = cheerio_1.default.load(html);
8
+ const $ = (0, cheerio_1.load)(html);
9
9
  $('strong.mw_t_bc').replaceWith(', ');
10
10
  $('.text-lowercase').remove();
11
11
  $('[id^=dictionary-entry]').find('.dtText > *:not(a)').remove();
12
12
  const $definitions = $('[id^=dictionary-entry]').find('.dtText, .cxl-ref');
13
13
  return {
14
- definitions: Array.from($definitions).map((definition) => $(definition).text()),
15
- isAllowed: $definitions.length > 0,
14
+ definitions: Array.from($definitions).map((definition) => $(definition).text().replace(/\n/g, '')),
15
+ exists: $('.spelling-suggestion-text').text().trim() !== DOES_NOT_EXIST_MESSAGE,
16
16
  };
17
17
  };
18
18
  exports.default = parseEnglish;
@@ -1,15 +1,12 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const cheerio_1 = __importDefault(require("cheerio"));
3
+ const cheerio_1 = require("cheerio");
7
4
  const parseFrench = (html) => {
8
- const $ = cheerio_1.default.load(html);
5
+ const $ = (0, cheerio_1.load)(html);
9
6
  const $definitions = $('.tlf_cdefinition');
10
7
  return {
11
8
  definitions: Array.from($definitions).map((definition) => $(definition).text()),
12
- isAllowed: $('#vitemselected span').length > 0,
9
+ exists: $('#vitemselected span').length > 0,
13
10
  };
14
11
  };
15
12
  exports.default = parseFrench;
@@ -1,22 +1,60 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const cheerio_1 = __importDefault(require("cheerio"));
3
+ const cheerio_1 = require("cheerio");
7
4
  const parseGerman = (html) => {
8
- const $ = cheerio_1.default.load(html);
9
- const $meaningOverview = $('.bedeutungsuebersicht');
10
- let $definitions;
11
- if ($meaningOverview.length > 0) {
12
- $definitions = $('.bedeutungsuebersicht > ol > li > a');
13
- }
14
- else {
15
- $definitions = $('.dwdswb-lesart .dwdswb-definition');
5
+ const $ = (0, cheerio_1.load)(html);
6
+ const definitions = [parseBedeutungsubersicht, parseBedeutungen, parseBedeutung].reduce((results, parse) => (results.length === 0 ? parse($) : results), []);
7
+ const exists = Array.from($('.label-danger')).every((label) => $(label).text() !== 'Hinweis');
8
+ return { definitions, exists };
9
+ };
10
+ const parseBedeutungsubersicht = ($) => {
11
+ Array.from($('.bedeutungsuebersicht ol > li > a')).forEach((item) => {
12
+ $(item).text($(item).text().replace(/\n/g, ''));
13
+ });
14
+ Array.from($('.bedeutungsuebersicht ol > li > ol > li')).forEach((item) => {
15
+ const text = `\n${$(item).text().replace(/\n/g, '')}`;
16
+ const $text = $(`<div>${text}</div>`);
17
+ $(item).replaceWith($text);
18
+ });
19
+ Array.from($('.bedeutungsuebersicht ol > li > ol')).forEach((list) => {
20
+ const $list = $(list);
21
+ const html = $list.html() || '';
22
+ const $html = $(`<div>${html}</div>`);
23
+ const $prev = $list.prev('a');
24
+ if ($prev) {
25
+ $prev.append($html);
26
+ $(list).remove();
27
+ }
28
+ else {
29
+ $(list).replaceWith($html);
30
+ }
31
+ });
32
+ return parseDefinitions($, $('.bedeutungsuebersicht ol > li'));
33
+ };
34
+ const parseBedeutung = ($) => {
35
+ return parseDefinitions($, $('.dwdswb-lesart .dwdswb-definition-spezifizierung'));
36
+ };
37
+ const parseBedeutungen = ($) => {
38
+ const definitions = parseDefinitions($, $('.dwdswb-lesart .dwdswb-definition'));
39
+ if (definitions.length > 0) {
40
+ return definitions;
16
41
  }
17
- return {
18
- definitions: Array.from($definitions).map((definition) => $(definition).text().replace('/\n/', '')),
19
- isAllowed: $definitions.length > 0,
20
- };
42
+ const $references = $('.dwdswb-lesart .dwdswb-verweis');
43
+ const references = Array.from($references).reduce((result, reference) => {
44
+ const html = reference.attribs['data-content'] || '<span />';
45
+ const values = $(html)
46
+ .text()
47
+ .split(';')
48
+ .map((value) => value.trim());
49
+ return result.concat(values);
50
+ }, []);
51
+ return references;
52
+ };
53
+ const parseDefinitions = ($, $definitions) => {
54
+ return Array.from($definitions).map((definition) => $(definition)
55
+ .text()
56
+ .replace(/[ ]+/g, ' ')
57
+ .replace(/[ ]\n/g, '\n')
58
+ .replace(/^[0-9]+\.\s/g, ''));
21
59
  };
22
60
  exports.default = parseGerman;
@@ -1,17 +1,14 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const cheerio_1 = __importDefault(require("cheerio"));
3
+ const cheerio_1 = require("cheerio");
7
4
  const parsePolish = (html) => {
8
- const $ = cheerio_1.default.load(html);
5
+ const $ = (0, cheerio_1.load)(html);
9
6
  const $header = $($('h1')[0]);
10
7
  const $isAllowed = $header.next();
11
8
  const $definitions = $header.next().next().next().next();
12
9
  return {
13
10
  definitions: $definitions.text().trim().split(/\d+\./),
14
- isAllowed: $isAllowed.text().trim().indexOf('dopuszczalne w grach') >= 0,
11
+ exists: $isAllowed.text().trim().indexOf('dopuszczalne w grach') >= 0,
15
12
  };
16
13
  };
17
14
  exports.default = parsePolish;
@@ -1,11 +1,8 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const cheerio_1 = __importDefault(require("cheerio"));
3
+ const cheerio_1 = require("cheerio");
7
4
  const parseSpanish = (html) => {
8
- const $ = cheerio_1.default.load(html);
5
+ const $ = (0, cheerio_1.load)(html);
9
6
  $('.verdBold14 + .gris11 + .gris13').remove();
10
7
  $('br + .gris13').remove();
11
8
  $('.grisItalic13 + .gris13').remove();
@@ -26,7 +23,7 @@ const parseSpanish = (html) => {
26
23
  .filter(Boolean)
27
24
  .map((definition) => definition.replace(/\s+\.$/g, ''))
28
25
  .map((definition) => (definition.endsWith('.') ? definition : `${definition}.`)),
29
- isAllowed: definitions.length > 0,
26
+ exists: $('.wrapper > p > strong').text() !== 'No se ha encontrado la palabra exacta',
30
27
  };
31
28
  };
32
29
  exports.default = parseSpanish;
@@ -1,4 +1,4 @@
1
1
  export interface ParseResult {
2
2
  definitions: string[];
3
- isAllowed: boolean;
3
+ exists: boolean;
4
4
  }
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@scrabble-solver/word-definitions",
3
- "version": "2.9.1",
3
+ "version": "2.9.2",
4
4
  "lockfileVersion": 2,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@scrabble-solver/word-definitions",
9
- "version": "2.9.1",
9
+ "version": "2.9.2",
10
10
  "license": "CC-BY-NC-ND-4.0",
11
11
  "dependencies": {
12
12
  "cheerio": "^1.0.0-rc.12",
@@ -27,9 +27,9 @@
27
27
  }
28
28
  },
29
29
  "node_modules/@types/node": {
30
- "version": "18.11.17",
31
- "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.17.tgz",
32
- "integrity": "sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng==",
30
+ "version": "18.11.18",
31
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz",
32
+ "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==",
33
33
  "dev": true
34
34
  },
35
35
  "node_modules/boolbase": {
@@ -249,9 +249,9 @@
249
249
  }
250
250
  },
251
251
  "@types/node": {
252
- "version": "18.11.17",
253
- "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.17.tgz",
254
- "integrity": "sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng==",
252
+ "version": "18.11.18",
253
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz",
254
+ "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==",
255
255
  "dev": true
256
256
  },
257
257
  "boolbase": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scrabble-solver/word-definitions",
3
- "version": "2.9.1",
3
+ "version": "2.9.2",
4
4
  "description": "Scrabble Solver 2 - Word definitions",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -10,8 +10,8 @@
10
10
  },
11
11
  "author": {
12
12
  "name": "Kamil Mielnik",
13
- "email": "kamil.adam.mielnik@gmail.com",
14
- "url": "https://kamilmielnik.com/"
13
+ "email": "kamil@kamilmielnik.com",
14
+ "url": "https://kamilmielnik.com"
15
15
  },
16
16
  "license": "CC-BY-NC-ND-4.0",
17
17
  "bugs": {
@@ -23,7 +23,7 @@
23
23
  "clean": "rimraf build/ node_modules/ package-lock.json"
24
24
  },
25
25
  "dependencies": {
26
- "@scrabble-solver/types": "^2.9.1",
26
+ "@scrabble-solver/types": "^2.9.2",
27
27
  "cheerio": "^1.0.0-rc.12",
28
28
  "follow-redirects": "^1.15.2",
29
29
  "striptags": "^3.2.0"
@@ -3,10 +3,10 @@ import { Locale, WordDefinition } from '@scrabble-solver/types';
3
3
  import { crawl } from './crawl';
4
4
  import { parse } from './parse';
5
5
 
6
- const getWordDefinition = async (locale: Locale, word: string): Promise<WordDefinition> => {
6
+ const getWordDefinition = async (locale: Locale, word: string, isAllowed: boolean): Promise<WordDefinition> => {
7
7
  const html = await crawl(locale, word);
8
- const { definitions, isAllowed } = parse(locale, html);
9
- const wordDefinition = new WordDefinition({ definitions, isAllowed, word });
8
+ const { definitions, exists } = parse(locale, html);
9
+ const wordDefinition = new WordDefinition({ definitions, exists, isAllowed, word });
10
10
  return wordDefinition;
11
11
  };
12
12