77 lines
2.6 KiB
JavaScript
77 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']
|
|
};
|