Skip to content

Commit 1cc1440

Browse files
committed
Implement logic with regexp rather than custom parsing
1 parent 1919229 commit 1cc1440

File tree

2 files changed

+14
-22
lines changed

2 files changed

+14
-22
lines changed
Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,20 @@
1-
function parseAcceptLanguageEntry(entry: string): { lang: string; q: number } {
2-
const langWithQ = entry.split(";").map(u => u.trim());
3-
let q = 1.0;
4-
if (langWithQ.length > 1) {
5-
const qVal = langWithQ[1].split("=").map(u => u.trim());
6-
if (qVal.length === 2 && qVal[0].toLowerCase() === "q") {
7-
const qn = Number(qVal[1]);
8-
q = isNaN(qn) ? 0.0 : qn;
9-
}
10-
}
11-
return { lang: langWithQ[0], q };
12-
}
1+
const entryRegexp =
2+
// locale ; q = qval
3+
/(?:^|,)([^,;]+)(?:;\s*[qQ]\s*=([^,;]+))?/g;
134

145
export function acceptedLanguages(acceptLanguageHeader = ""): string[] {
156
if (typeof acceptLanguageHeader !== "string") {
167
throw new TypeError("Argument must be a string");
178
}
18-
const tokens = acceptLanguageHeader
19-
.split(",")
20-
.map(t => t.trim())
21-
.filter(t => t !== "");
22-
const langsWithQ = Array.from(tokens.map(parseAcceptLanguageEntry).entries());
9+
10+
const langsWithQ: Array<{ lang: string; q: number; index: number }> = [];
11+
for (const token of acceptLanguageHeader.matchAll(entryRegexp)) {
12+
const q = token[2] ? parseFloat(token[2]) || 0 : 1;
13+
langsWithQ.push({ lang: token[1].trim(), q, index: token.index });
14+
}
15+
2316
// order by q descending, keeping the header order for equal weights
24-
langsWithQ.sort(([aidx, aval], [bidx, bval]) =>
25-
aval.q === bval.q ? aidx - bidx : bval.q - aval.q
26-
);
27-
return langsWithQ.map(([, val]) => val.lang);
17+
langsWithQ.sort((a, b) => (a.q === b.q ? a.index - b.index : b.q - a.q));
18+
19+
return langsWithQ.map(val => val.lang);
2820
}

fluent-langneg/test/headers_test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ suite("parse headers", () => {
3737
acceptedLanguages(
3838
"en;q=no, fr;z=0.9, de;q=0.7;q=9, *;q=0.5, fr-CH;q=a=0.1"
3939
),
40-
["fr", "fr-CH", "de", "*", "en"]
40+
["fr", "de", "*", "en", "fr-CH"]
4141
);
4242
});
4343

0 commit comments

Comments
 (0)