78 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			78 lines
		
	
	
	
		
			2.6 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 { HTMLDataProvider } from './dataProvider'; | ||
|  | import { htmlData } from './data/webCustomData'; | ||
|  | import * as arrays from '../utils/arrays'; | ||
|  | export class HTMLDataManager { | ||
|  |     constructor(options) { | ||
|  |         this.dataProviders = []; | ||
|  |         this.setDataProviders(options.useDefaultDataProvider !== false, options.customDataProviders || []); | ||
|  |     } | ||
|  |     setDataProviders(builtIn, providers) { | ||
|  |         this.dataProviders = []; | ||
|  |         if (builtIn) { | ||
|  |             this.dataProviders.push(new HTMLDataProvider('html5', htmlData)); | ||
|  |         } | ||
|  |         this.dataProviders.push(...providers); | ||
|  |     } | ||
|  |     getDataProviders() { | ||
|  |         return this.dataProviders; | ||
|  |     } | ||
|  |     isVoidElement(e, voidElements) { | ||
|  |         return !!e && arrays.binarySearch(voidElements, e.toLowerCase(), (s1, s2) => s1.localeCompare(s2)) >= 0; | ||
|  |     } | ||
|  |     getVoidElements(languageOrProviders) { | ||
|  |         const dataProviders = Array.isArray(languageOrProviders) ? languageOrProviders : this.getDataProviders().filter(p => p.isApplicable(languageOrProviders)); | ||
|  |         const voidTags = []; | ||
|  |         dataProviders.forEach((provider) => { | ||
|  |             provider.provideTags().filter(tag => tag.void).forEach(tag => voidTags.push(tag.name)); | ||
|  |         }); | ||
|  |         return voidTags.sort(); | ||
|  |     } | ||
|  |     isPathAttribute(tag, attr) { | ||
|  |         // should eventually come from custom data
 | ||
|  |         if (attr === 'src' || attr === 'href') { | ||
|  |             return true; | ||
|  |         } | ||
|  |         const a = PATH_TAG_AND_ATTR[tag]; | ||
|  |         if (a) { | ||
|  |             if (typeof a === 'string') { | ||
|  |                 return a === attr; | ||
|  |             } | ||
|  |             else { | ||
|  |                 return a.indexOf(attr) !== -1; | ||
|  |             } | ||
|  |         } | ||
|  |         return false; | ||
|  |     } | ||
|  | } | ||
|  | // Selected from https://stackoverflow.com/a/2725168/1780148
 | ||
|  | const PATH_TAG_AND_ATTR = { | ||
|  |     // HTML 4
 | ||
|  |     a: 'href', | ||
|  |     area: 'href', | ||
|  |     body: 'background', | ||
|  |     blockquote: 'cite', | ||
|  |     del: 'cite', | ||
|  |     form: 'action', | ||
|  |     frame: ['src', 'longdesc'], | ||
|  |     img: ['src', 'longdesc'], | ||
|  |     ins: 'cite', | ||
|  |     link: 'href', | ||
|  |     object: 'data', | ||
|  |     q: 'cite', | ||
|  |     script: 'src', | ||
|  |     // HTML 5
 | ||
|  |     audio: 'src', | ||
|  |     button: 'formaction', | ||
|  |     command: 'icon', | ||
|  |     embed: 'src', | ||
|  |     html: 'manifest', | ||
|  |     input: ['src', 'formaction'], | ||
|  |     source: 'src', | ||
|  |     track: 'src', | ||
|  |     video: ['src', 'poster'] | ||
|  | }; |