Skip to content
This repository was archived by the owner on Feb 5, 2020. It is now read-only.

Commit 09c829d

Browse files
committed
Complete LANGMATCHES implementation.
1 parent d0f90ff commit 09c829d

File tree

2 files changed

+19
-5
lines changed

2 files changed

+19
-5
lines changed

lib/util/SparqlExpressionEvaluator.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,13 @@ operators = {
135135
'lang': function (a) {
136136
return '"' + N3Util.getLiteralLanguage(a).toLowerCase() + '"';
137137
},
138-
'langmatches': function (a, b) {
139-
return a.toLowerCase() === b.toLowerCase();
138+
'langmatches': function (langTag, langRange) {
139+
// Implements https://tools.ietf.org/html/rfc4647#section-3.3.1
140+
langTag = langTag.toLowerCase();
141+
langRange = langRange.toLowerCase();
142+
return langTag === langRange ||
143+
(langRange = literalValue(langRange)) === '*' ||
144+
langTag.substr(1, langRange.length + 1) === langRange + '-';
140145
},
141146
'contains': function (string, substring) {
142147
substring = literalValue(substring);

test/util/SparqlExpressionEvaluator-test.js

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -343,11 +343,20 @@ describe('SparqlExpressionEvaluator', function () {
343343
var evaluator = SparqlExpressionEvaluator({
344344
type: 'operation',
345345
operator: 'langmatches',
346-
args: ['?l', '"EN"'],
346+
args: ['"de-DE-1996"', '?l'],
347347
});
348348

349-
it('should return true if the language matches', function () {
350-
evaluator({ '?l': '"en"' }).should.equal(TRUE);
349+
it('should return true if the language is equal', function () {
350+
evaluator({ '?l': '"de-de-1996"' }).should.equal(TRUE);
351+
});
352+
353+
it('should return true if the language has the same prefix', function () {
354+
evaluator({ '?l': '"de"' }).should.equal(TRUE);
355+
evaluator({ '?l': '"de-DE"' }).should.equal(TRUE);
356+
});
357+
358+
it('should return true on *', function () {
359+
evaluator({ '?l': '"de-de-1996"' }).should.equal(TRUE);
351360
});
352361

353362
it("should return false if the language doesn't match", function () {

0 commit comments

Comments
 (0)