on master help sign in
Merge pull request #1573 from urbit/mp/new-algo
6f8e66fmatildepark
components/Search.js+4−1
@@ -5,6 +5,7 @@ import debounce from "lodash.debounce";
5import Downshift from "downshift";
5import Downshift from "downshift";
6import ob from "urbit-ob";
6import ob from "urbit-ob";
7import Sigil from "../components/Sigil";
7import Sigil from "../components/Sigil";
8+import levenSort from "leven-sort";
8
9
9class Search extends Component {
10class Search extends Component {
10 constructor(props) {
11 constructor(props) {
@@ -24,11 +25,12 @@ class Search extends Component {
24 }
25 }
25
26
26 glossarySearch(query) {
27 glossarySearch(query) {
27− return glossary.filter((entry) => {
28+ const entries = glossary.filter((entry) => {
28 return (
29 return (
29 entry.name.includes(query.toLowerCase()) || entry.symbol.includes(query)
30 entry.name.includes(query.toLowerCase()) || entry.symbol.includes(query)
30 );
31 );
31 });
32 });
33+ return levenSort(entries, query, ["symbol"]);
32 }
34 }
33
35
34 patpSearch(query) {
36 patpSearch(query) {
@@ -57,6 +59,7 @@ class Search extends Component {
57 fetch(this.searchEndpoint(query))
59 fetch(this.searchEndpoint(query))
58 .then((res) => res.json())
60 .then((res) => res.json())
59 .then((res) => {
61 .then((res) => {
62+ console.log(res);
60 // Wrap results in an object which will tell React what component to use to render results.
63 // Wrap results in an object which will tell React what component to use to render results.
61 const results = res.results.map((item) => ({
64 const results = res.results.map((item) => ({
62 type: "RESULT",
65 type: "RESULT",
package-lock.json+64−34
@@ -20,6 +20,7 @@
20 "feed": "^4.2.2",
20 "feed": "^4.2.2",
21 "foundation-design-system": "github:urbit/foundation-design-system",
21 "foundation-design-system": "github:urbit/foundation-design-system",
22 "gray-matter": "^4.0.3",
22 "gray-matter": "^4.0.3",
23+ "leven-sort": "^3.0.0",
23 "lodash.debounce": "^4.0.8",
24 "lodash.debounce": "^4.0.8",
24 "lodash.omit": "^4.5.0",
25 "lodash.omit": "^4.5.0",
25 "luxon": "^2.0.2",
26 "luxon": "^2.0.2",
@@ -76,9 +77,9 @@
76 "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg=="
77 "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg=="
77 },
78 },
78 "node_modules/@markdoc/markdoc": {
79 "node_modules/@markdoc/markdoc": {
79− "version": "0.1.2",
80+ "version": "0.1.3",
80− "resolved": "https://registry.npmjs.org/@markdoc/markdoc/-/markdoc-0.1.2.tgz",
81+ "resolved": "https://registry.npmjs.org/@markdoc/markdoc/-/markdoc-0.1.3.tgz",
81− "integrity": "sha512-3p+JTC1A0eqBdrl2UOIRoy+FLKtG1mh81R3Zzdm7FJiQIMt2mJmqmVQNDf3Md62G9rTtbj0ZuxlEattMbaslbw==",
82+ "integrity": "sha512-4n2cobUSeOob+237wZhpNiOEHCSfOydlQnKHTFdRY6ug/DupXGaxkkkszJYQxRftiMs8jmb10XvVO1svEYD43Q==",
82 "engines": {
83 "engines": {
83 "node": ">=14.7.0"
84 "node": ">=14.7.0"
84 }
85 }
@@ -589,9 +590,9 @@
589 }
590 }
590 },
591 },
591 "node_modules/caniuse-lite": {
592 "node_modules/caniuse-lite": {
592− "version": "1.0.30001355",
593+ "version": "1.0.30001357",
593− "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001355.tgz",
594+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001357.tgz",
594− "integrity": "sha512-Sd6pjJHF27LzCB7pT7qs+kuX2ndurzCzkpJl6Qct7LPSZ9jn0bkOA8mdgMgmqnQAWLVOOGjLpc+66V57eLtb1g==",
595+ "integrity": "sha512-b+KbWHdHePp+ZpNj+RDHFChZmuN+J5EvuQUlee9jOQIUAdhv9uvAZeEtUeLAknXbkiu1uxjQ9NLp1ie894CuWg==",
595 "funding": [
596 "funding": [
596 {
597 {
597 "type": "opencollective",
598 "type": "opencollective",
@@ -687,9 +688,9 @@
687 "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
688 "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
688 },
689 },
689 "node_modules/core-js": {
690 "node_modules/core-js": {
690− "version": "3.23.1",
691+ "version": "3.23.2",
691− "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.23.1.tgz",
692+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.23.2.tgz",
692− "integrity": "sha512-wfMYHWi1WQjpgZNC9kAlN4ut04TM9fUTdi7CqIoTVM7yaiOUQTklOzfb+oWH3r9edQcT3F887swuVmxrV+CC8w==",
693+ "integrity": "sha512-ELJOWxNrJfOH/WK4VJ3Qd+fOqZuOuDNDJz0xG6Bt4mGg2eO/UT9CljCrbqDGovjLKUrGajEEBcoTOc0w+yBYeQ==",
693 "hasInstallScript": true,
694 "hasInstallScript": true,
694 "funding": {
695 "funding": {
695 "type": "opencollective",
696 "type": "opencollective",
@@ -859,9 +860,9 @@
859 }
860 }
860 },
861 },
861 "node_modules/electron-to-chromium": {
862 "node_modules/electron-to-chromium": {
862− "version": "1.4.158",
863+ "version": "1.4.161",
863− "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.158.tgz",
864+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.161.tgz",
864− "integrity": "sha512-gppO3/+Y6sP432HtvwvuU8S+YYYLH4PmAYvQwqUtt9HDOmEsBwQfLnK9T8+1NIKwAS1BEygIjTaATC4H5EzvxQ=="
865+ "integrity": "sha512-sTjBRhqh6wFodzZtc5Iu8/R95OkwaPNn7tj/TaDU5nu/5EFiQDtADGAXdR4tJcTEHlYfJpHqigzJqHvPgehP8A=="
865 },
866 },
866 "node_modules/end-of-stream": {
867 "node_modules/end-of-stream": {
867 "version": "1.4.4",
868 "version": "1.4.4",
@@ -1107,7 +1108,7 @@
1107 },
1108 },
1108 "node_modules/foundation-design-system": {
1109 "node_modules/foundation-design-system": {
1109 "version": "0.0.0",
1110 "version": "0.0.0",
1110− "resolved": "git+ssh://git@github.com/urbit/foundation-design-system.git#ba69c83265b7cca109217fa6a2b2539a57087f4a",
1111+ "resolved": "git+ssh://git@github.com/urbit/foundation-design-system.git#2d3235b586507cb3bfdb99880e517ddaaa77ede0",
1111 "license": "MIT",
1112 "license": "MIT",
1112 "dependencies": {
1113 "dependencies": {
1113 "@babel/polyfill": "^7.12.1",
1114 "@babel/polyfill": "^7.12.1",
@@ -1583,6 +1584,22 @@
1583 "graceful-fs": "^4.1.11"
1584 "graceful-fs": "^4.1.11"
1584 }
1585 }
1585 },
1586 },
1587+ "node_modules/leven": {
1588+ "version": "3.1.0",
1589+ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
1590+ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
1591+ "engines": {
1592+ "node": ">=6"
1593+ }
1594+ },
1595+ "node_modules/leven-sort": {
1596+ "version": "3.0.0",
1597+ "resolved": "https://registry.npmjs.org/leven-sort/-/leven-sort-3.0.0.tgz",
1598+ "integrity": "sha512-dw+6CDkFAbmXiAv/bU2IQKEJzgdXUYnc2Z4FipY9gOt+tdUUiP1R1Jn8S05aORllj5NLcKyx6zwIz+M3ygCohA==",
1599+ "dependencies": {
1600+ "leven": "^3.1.0"
1601+ }
1602+ },
1586 "node_modules/lilconfig": {
1603 "node_modules/lilconfig": {
1587 "version": "2.0.5",
1604 "version": "2.0.5",
1588 "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz",
1605 "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz",
@@ -2472,11 +2489,11 @@
2472 }
2489 }
2473 },
2490 },
2474 "node_modules/resolve": {
2491 "node_modules/resolve": {
2475− "version": "1.22.0",
2492+ "version": "1.22.1",
2476− "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
2493+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
2477− "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
2494+ "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
2478 "dependencies": {
2495 "dependencies": {
2479− "is-core-module": "^2.8.1",
2496+ "is-core-module": "^2.9.0",
2480 "path-parse": "^1.0.7",
2497 "path-parse": "^1.0.7",
2481 "supports-preserve-symlinks-flag": "^1.0.0"
2498 "supports-preserve-symlinks-flag": "^1.0.0"
2482 },
2499 },
@@ -2932,9 +2949,9 @@
2932 "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg=="
2949 "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg=="
2933 },
2950 },
2934 "@markdoc/markdoc": {
2951 "@markdoc/markdoc": {
2935− "version": "0.1.2",
2952+ "version": "0.1.3",
2936− "resolved": "https://registry.npmjs.org/@markdoc/markdoc/-/markdoc-0.1.2.tgz",
2953+ "resolved": "https://registry.npmjs.org/@markdoc/markdoc/-/markdoc-0.1.3.tgz",
2937− "integrity": "sha512-3p+JTC1A0eqBdrl2UOIRoy+FLKtG1mh81R3Zzdm7FJiQIMt2mJmqmVQNDf3Md62G9rTtbj0ZuxlEattMbaslbw=="
2954+ "integrity": "sha512-4n2cobUSeOob+237wZhpNiOEHCSfOydlQnKHTFdRY6ug/DupXGaxkkkszJYQxRftiMs8jmb10XvVO1svEYD43Q=="
2938 },
2955 },
2939 "@next/env": {
2956 "@next/env": {
2940 "version": "12.1.6",
2957 "version": "12.1.6",
@@ -3222,9 +3239,9 @@
3222 "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="
3239 "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="
3223 },
3240 },
3224 "caniuse-lite": {
3241 "caniuse-lite": {
3225− "version": "1.0.30001355",
3242+ "version": "1.0.30001357",
3226− "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001355.tgz",
3243+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001357.tgz",
3227− "integrity": "sha512-Sd6pjJHF27LzCB7pT7qs+kuX2ndurzCzkpJl6Qct7LPSZ9jn0bkOA8mdgMgmqnQAWLVOOGjLpc+66V57eLtb1g=="
3244+ "integrity": "sha512-b+KbWHdHePp+ZpNj+RDHFChZmuN+J5EvuQUlee9jOQIUAdhv9uvAZeEtUeLAknXbkiu1uxjQ9NLp1ie894CuWg=="
3228 },
3245 },
3229 "chalk": {
3246 "chalk": {
3230 "version": "2.4.2",
3247 "version": "2.4.2",
@@ -3295,9 +3312,9 @@
3295 "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
3312 "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
3296 },
3313 },
3297 "core-js": {
3314 "core-js": {
3298− "version": "3.23.1",
3315+ "version": "3.23.2",
3299− "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.23.1.tgz",
3316+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.23.2.tgz",
3300− "integrity": "sha512-wfMYHWi1WQjpgZNC9kAlN4ut04TM9fUTdi7CqIoTVM7yaiOUQTklOzfb+oWH3r9edQcT3F887swuVmxrV+CC8w=="
3317+ "integrity": "sha512-ELJOWxNrJfOH/WK4VJ3Qd+fOqZuOuDNDJz0xG6Bt4mGg2eO/UT9CljCrbqDGovjLKUrGajEEBcoTOc0w+yBYeQ=="
3301 },
3318 },
3302 "cross-spawn": {
3319 "cross-spawn": {
3303 "version": "6.0.5",
3320 "version": "6.0.5",
@@ -3418,9 +3435,9 @@
3418 }
3435 }
3419 },
3436 },
3420 "electron-to-chromium": {
3437 "electron-to-chromium": {
3421− "version": "1.4.158",
3438+ "version": "1.4.161",
3422− "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.158.tgz",
3439+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.161.tgz",
3423− "integrity": "sha512-gppO3/+Y6sP432HtvwvuU8S+YYYLH4PmAYvQwqUtt9HDOmEsBwQfLnK9T8+1NIKwAS1BEygIjTaATC4H5EzvxQ=="
3440+ "integrity": "sha512-sTjBRhqh6wFodzZtc5Iu8/R95OkwaPNn7tj/TaDU5nu/5EFiQDtADGAXdR4tJcTEHlYfJpHqigzJqHvPgehP8A=="
3424 },
3441 },
3425 "end-of-stream": {
3442 "end-of-stream": {
3426 "version": "1.4.4",
3443 "version": "1.4.4",
@@ -3594,7 +3611,7 @@
3594 "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA=="
3611 "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA=="
3595 },
3612 },
3596 "foundation-design-system": {
3613 "foundation-design-system": {
3597− "version": "git+ssh://git@github.com/urbit/foundation-design-system.git#ba69c83265b7cca109217fa6a2b2539a57087f4a",
3614+ "version": "git+ssh://git@github.com/urbit/foundation-design-system.git#2d3235b586507cb3bfdb99880e517ddaaa77ede0",
3598 "from": "foundation-design-system@github:urbit/foundation-design-system",
3615 "from": "foundation-design-system@github:urbit/foundation-design-system",
3599 "requires": {
3616 "requires": {
3600 "@babel/polyfill": "^7.12.1",
3617 "@babel/polyfill": "^7.12.1",
@@ -3931,6 +3948,19 @@
3931 "graceful-fs": "^4.1.11"
3948 "graceful-fs": "^4.1.11"
3932 }
3949 }
3933 },
3950 },
3951+ "leven": {
3952+ "version": "3.1.0",
3953+ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
3954+ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="
3955+ },
3956+ "leven-sort": {
3957+ "version": "3.0.0",
3958+ "resolved": "https://registry.npmjs.org/leven-sort/-/leven-sort-3.0.0.tgz",
3959+ "integrity": "sha512-dw+6CDkFAbmXiAv/bU2IQKEJzgdXUYnc2Z4FipY9gOt+tdUUiP1R1Jn8S05aORllj5NLcKyx6zwIz+M3ygCohA==",
3960+ "requires": {
3961+ "leven": "^3.1.0"
3962+ }
3963+ },
3934 "lilconfig": {
3964 "lilconfig": {
3935 "version": "2.0.5",
3965 "version": "2.0.5",
3936 "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz",
3966 "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz",
@@ -4530,11 +4560,11 @@
4530 "integrity": "sha512-U7XpAktpbSgHTRSNRrjKSrjYkZKuhUukfoBlXWXUExCAqhzh1TU3BDRAfJmarcl5voKS+pbKU9MvyLWKZ4UEEg=="
4560 "integrity": "sha512-U7XpAktpbSgHTRSNRrjKSrjYkZKuhUukfoBlXWXUExCAqhzh1TU3BDRAfJmarcl5voKS+pbKU9MvyLWKZ4UEEg=="
4531 },
4561 },
4532 "resolve": {
4562 "resolve": {
4533− "version": "1.22.0",
4563+ "version": "1.22.1",
4534− "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
4564+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
4535− "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
4565+ "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
4536 "requires": {
4566 "requires": {
4537− "is-core-module": "^2.8.1",
4567+ "is-core-module": "^2.9.0",
4538 "path-parse": "^1.0.7",
4568 "path-parse": "^1.0.7",
4539 "supports-preserve-symlinks-flag": "^1.0.0"
4569 "supports-preserve-symlinks-flag": "^1.0.0"
4540 }
4570 }
package.json+1
@@ -29,6 +29,7 @@
29 "feed": "^4.2.2",
29 "feed": "^4.2.2",
30 "foundation-design-system": "github:urbit/foundation-design-system",
30 "foundation-design-system": "github:urbit/foundation-design-system",
31 "gray-matter": "^4.0.3",
31 "gray-matter": "^4.0.3",
32+ "leven-sort": "^3.0.0",
32 "lodash.debounce": "^4.0.8",
33 "lodash.debounce": "^4.0.8",
33 "lodash.omit": "^4.5.0",
34 "lodash.omit": "^4.5.0",
34 "luxon": "^2.0.2",
35 "luxon": "^2.0.2",
pages/api/search.js+5−2
@@ -1,12 +1,15 @@
1import { index } from "../../cache/data";
1import { index } from "../../cache/data";
2+const levenSort = require("leven-sort");
2
3
3export default (req, res) => {
4export default (req, res) => {
4 const results = index.filter(
5 const results = index.filter(
5 (e) =>
6 (e) =>
6 e.title?.toLowerCase().includes(req.query.q.toLowerCase()) ||
7 e.title?.toLowerCase().includes(req.query.q.toLowerCase()) ||
7− e?.slug.includes(req.query.q.toLowerCase())
8+ e?.slug.includes(req.query.q.toLowerCase()) ||
9+ e?.parent.toLowerCase().includes(req.query.q.toLowerCase())
8 );
10 );
11+ const sorted = levenSort(results, req.q, ["title", "slug", "parent"]);
9 res.statusCode = 200;
12 res.statusCode = 200;
10 res.setHeader("Content-Type", "application/json");
13 res.setHeader("Content-Type", "application/json");
11− res.end(JSON.stringify({ results }));
14+ res.end(JSON.stringify({ results: sorted }));
12};
15};