Skip to content

Commit 7fcbdcd

Browse files
committed
Allow empty lists to be compacted to any @list container term.
1 parent 87e6862 commit 7fcbdcd

File tree

3 files changed

+48
-39
lines changed

3 files changed

+48
-39
lines changed

lib/compact.js

Lines changed: 44 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -432,48 +432,55 @@ api.compactIri = ({
432432
containers.push('@list');
433433
}
434434
const list = value['@list'];
435-
let commonLanguage = (list.length === 0) ? defaultLanguage : null;
436-
let commonType = null;
437-
for(let i = 0; i < list.length; ++i) {
438-
const item = list[i];
439-
let itemLanguage = '@none';
440-
let itemType = '@none';
441-
if(_isValue(item)) {
442-
if('@language' in item) {
443-
itemLanguage = item['@language'];
444-
} else if('@type' in item) {
445-
itemType = item['@type'];
435+
if(list.length === 0) {
436+
// any empty list can be matched against any term that uses the
437+
// @list container regardless of @type or @language
438+
typeOrLanguage = '@any';
439+
typeOrLanguageValue = '@none';
440+
} else {
441+
let commonLanguage = (list.length === 0) ? defaultLanguage : null;
442+
let commonType = null;
443+
for(let i = 0; i < list.length; ++i) {
444+
const item = list[i];
445+
let itemLanguage = '@none';
446+
let itemType = '@none';
447+
if(_isValue(item)) {
448+
if('@language' in item) {
449+
itemLanguage = item['@language'];
450+
} else if('@type' in item) {
451+
itemType = item['@type'];
452+
} else {
453+
// plain literal
454+
itemLanguage = '@null';
455+
}
446456
} else {
447-
// plain literal
448-
itemLanguage = '@null';
457+
itemType = '@id';
458+
}
459+
if(commonLanguage === null) {
460+
commonLanguage = itemLanguage;
461+
} else if(itemLanguage !== commonLanguage && _isValue(item)) {
462+
commonLanguage = '@none';
463+
}
464+
if(commonType === null) {
465+
commonType = itemType;
466+
} else if(itemType !== commonType) {
467+
commonType = '@none';
468+
}
469+
// there are different languages and types in the list, so choose
470+
// the most generic term, no need to keep iterating the list
471+
if(commonLanguage === '@none' && commonType === '@none') {
472+
break;
449473
}
450-
} else {
451-
itemType = '@id';
452-
}
453-
if(commonLanguage === null) {
454-
commonLanguage = itemLanguage;
455-
} else if(itemLanguage !== commonLanguage && _isValue(item)) {
456-
commonLanguage = '@none';
457-
}
458-
if(commonType === null) {
459-
commonType = itemType;
460-
} else if(itemType !== commonType) {
461-
commonType = '@none';
462474
}
463-
// there are different languages and types in the list, so choose
464-
// the most generic term, no need to keep iterating the list
465-
if(commonLanguage === '@none' && commonType === '@none') {
466-
break;
475+
commonLanguage = commonLanguage || '@none';
476+
commonType = commonType || '@none';
477+
if(commonType !== '@none') {
478+
typeOrLanguage = '@type';
479+
typeOrLanguageValue = commonType;
480+
} else {
481+
typeOrLanguageValue = commonLanguage;
467482
}
468483
}
469-
commonLanguage = commonLanguage || '@none';
470-
commonType = commonType || '@none';
471-
if(commonType !== '@none') {
472-
typeOrLanguage = '@type';
473-
typeOrLanguageValue = commonType;
474-
} else {
475-
typeOrLanguageValue = commonLanguage;
476-
}
477484
} else {
478485
if(_isValue(value)) {
479486
if('@language' in value && !('@index' in value)) {

lib/context.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -601,10 +601,12 @@ api.getInitialContext = (options) => {
601601
if(!entry[container]) {
602602
entry[container] = {
603603
'@language': {},
604-
'@type': {}
604+
'@type': {},
605+
'@any': {}
605606
};
606607
}
607608
entry = entry[container];
609+
_addPreferredTerm(term, entry['@any'], '@none');
608610

609611
if(mapping.reverse) {
610612
// term is preferred for values using @reverse

tests/test-common.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ const manifest = options.manifest || {
2929
const TEST_TYPES = {
3030
'jld:CompactTest': {
3131
skip: {
32-
regex: [/#t0073/, /#t0074/],
32+
regex: [/#t0073/],
3333
specVersion: ['json-ld-1.1']
3434
},
3535
fn: 'compact',

0 commit comments

Comments
 (0)