Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/search.js
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ function* valuesof(d) {
}

function termFilter(term) {
return new RegExp(`\\b${escapeRegExp(term)}`, "i");
return new RegExp(`(?:^|[^\\p{L}-])${escapeRegExp(term)}`, "iu");
}

function escapeRegExp(text) {
Expand Down
4 changes: 4 additions & 0 deletions test/inputs/searches.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ export async function searchLabelQuery() {
return Inputs.search(["red", "green", "blue", "black"], {label: "colors", query: "bl"});
}

export async function searchLabelQueryCyrillic() {
return Inputs.search(["red", "green", "blue", "чёрный"], {label: "colors", query: "чёрн"});
}

export async function searchPlaceholder() {
return Inputs.search(["red", "green", "blue"], {placeholder: "dollars&pounds"});
}
Expand Down
6 changes: 6 additions & 0 deletions test/output/searchLabelQueryCyrillic.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<form class="__ns__">
<label for="__ns__-1">colors</label>
<div class="__ns__-input">
<input name="input" type="search" placeholder="Search" value="чёрн" id="__ns__-1"><output name="output">1 result</output>
</div>
</form>
13 changes: 13 additions & 0 deletions test/search-test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import * as Inputs from "@observablehq/inputs";
import assert from "assert";
import it from "./jsdom.js";

it("Inputs.search(data) handles word boundaries", () => {
const s = Inputs.search(["red", "blue", "The Real", "Mr.Real", "un-real"], {query: "re"});
assert.deepStrictEqual(s.value, ["red", "The Real", "Mr.Real"]);
});

it("Inputs.search(data) supports Cyrillic symbols", () => {
const s = Inputs.search(["red", "дом", "чудо", "Река Дон"], {query: "до"});
assert.deepStrictEqual(s.value, ["дом", "Река Дон"]);
});