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; | ||
|  | } |