113 lines
3.8 KiB
JavaScript
113 lines
3.8 KiB
JavaScript
![]() |
/*---------------------------------------------------------------------------------------------
|
||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||
|
*--------------------------------------------------------------------------------------------*/
|
||
|
import { normalizeMarkupContent } from '../utils/markup';
|
||
|
export class HTMLDataProvider {
|
||
|
isApplicable() {
|
||
|
return true;
|
||
|
}
|
||
|
/**
|
||
|
* Currently, unversioned data uses the V1 implementation
|
||
|
* In the future when the provider handles multiple versions of HTML custom data,
|
||
|
* use the latest implementation for unversioned data
|
||
|
*/
|
||
|
constructor(id, customData) {
|
||
|
this.id = id;
|
||
|
this._tags = [];
|
||
|
this._tagMap = {};
|
||
|
this._valueSetMap = {};
|
||
|
this._tags = customData.tags || [];
|
||
|
this._globalAttributes = customData.globalAttributes || [];
|
||
|
this._tags.forEach(t => {
|
||
|
this._tagMap[t.name.toLowerCase()] = t;
|
||
|
});
|
||
|
if (customData.valueSets) {
|
||
|
customData.valueSets.forEach(vs => {
|
||
|
this._valueSetMap[vs.name] = vs.values;
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
getId() {
|
||
|
return this.id;
|
||
|
}
|
||
|
provideTags() {
|
||
|
return this._tags;
|
||
|
}
|
||
|
provideAttributes(tag) {
|
||
|
const attributes = [];
|
||
|
const processAttribute = (a) => {
|
||
|
attributes.push(a);
|
||
|
};
|
||
|
const tagEntry = this._tagMap[tag.toLowerCase()];
|
||
|
if (tagEntry) {
|
||
|
tagEntry.attributes.forEach(processAttribute);
|
||
|
}
|
||
|
this._globalAttributes.forEach(processAttribute);
|
||
|
return attributes;
|
||
|
}
|
||
|
provideValues(tag, attribute) {
|
||
|
const values = [];
|
||
|
attribute = attribute.toLowerCase();
|
||
|
const processAttributes = (attributes) => {
|
||
|
attributes.forEach(a => {
|
||
|
if (a.name.toLowerCase() === attribute) {
|
||
|
if (a.values) {
|
||
|
a.values.forEach(v => {
|
||
|
values.push(v);
|
||
|
});
|
||
|
}
|
||
|
if (a.valueSet) {
|
||
|
if (this._valueSetMap[a.valueSet]) {
|
||
|
this._valueSetMap[a.valueSet].forEach(v => {
|
||
|
values.push(v);
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
};
|
||
|
const tagEntry = this._tagMap[tag.toLowerCase()];
|
||
|
if (tagEntry) {
|
||
|
processAttributes(tagEntry.attributes);
|
||
|
}
|
||
|
processAttributes(this._globalAttributes);
|
||
|
return values;
|
||
|
}
|
||
|
}
|
||
|
/**
|
||
|
* Generate Documentation used in hover/complete
|
||
|
* From `documentation` and `references`
|
||
|
*/
|
||
|
export function generateDocumentation(item, settings = {}, doesSupportMarkdown) {
|
||
|
const result = {
|
||
|
kind: doesSupportMarkdown ? 'markdown' : 'plaintext',
|
||
|
value: ''
|
||
|
};
|
||
|
if (item.description && settings.documentation !== false) {
|
||
|
const normalizedDescription = normalizeMarkupContent(item.description);
|
||
|
if (normalizedDescription) {
|
||
|
result.value += normalizedDescription.value;
|
||
|
}
|
||
|
}
|
||
|
if (item.references && item.references.length > 0 && settings.references !== false) {
|
||
|
if (result.value.length) {
|
||
|
result.value += `\n\n`;
|
||
|
}
|
||
|
if (doesSupportMarkdown) {
|
||
|
result.value += item.references.map(r => {
|
||
|
return `[${r.name}](${r.url})`;
|
||
|
}).join(' | ');
|
||
|
}
|
||
|
else {
|
||
|
result.value += item.references.map(r => {
|
||
|
return `${r.name}: ${r.url}`;
|
||
|
}).join('\n');
|
||
|
}
|
||
|
}
|
||
|
if (result.value === '') {
|
||
|
return undefined;
|
||
|
}
|
||
|
return result;
|
||
|
}
|