Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 4 additions & 10 deletions src/vs/languages/html/common/html.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import {OnEnterSupport} from 'vs/editor/common/modes/supports/onEnter';
import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation';
import {IThreadService } from 'vs/platform/thread/common/thread';
import * as htmlTokenTypes from 'vs/languages/html/common/htmlTokenTypes';
import {EMPTY_ELEMENTS} from 'vs/languages/html/common/htmlEmptyTagsShared';

export { htmlTokenTypes }; // export to be used by Razor. We are the main module, so Razor should get ot from use.

Expand All @@ -39,15 +40,8 @@ export enum States {
AttributeValue
}

// list of empty elements - for performance reasons we won't open a bracket for them
var emptyElements:string[] = ['area', 'base', 'basefont', 'br', 'col', 'command', 'embed', 'frame', 'hr', 'img', 'input', 'isindex', 'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr'];

function isEmptyElement(e: string) : boolean {
return arrays.binarySearch(emptyElements, e,(s1: string, s2: string) => s1.localeCompare(s2)) >= 0;
}

// list of element that embedd other content
var tagsEmbeddingContent:any = ['script', 'style'];
// list of elements that embed other content
var tagsEmbeddingContent:string[] = ['script', 'style'];



Expand Down Expand Up @@ -308,7 +302,7 @@ export class HTMLMode<W extends htmlWorker.HTMLWorker> extends AbstractMode<W> i
brackets: [],
regexBrackets:[
{ tokenType: htmlTokenTypes.getTag('$1'),
open: /<(?!(?:area|base|basefont|br|col|command|embed|frame|hr|img|input|link|meta|param|source|track|wbr))(\w[\w\d]*)([^\/>]*(?!\/)>)[^<]*$/i,
open: new RegExp(`<(?!(?:${EMPTY_ELEMENTS.join("|")}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`, 'i'),
closeComplete: '</$1>',
close: /<\/(\w[\w\d]*)\s*>$/i }],
caseInsensitive:true,
Expand Down
12 changes: 12 additions & 0 deletions src/vs/languages/html/common/htmlEmptyTagsShared.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

import arrays = require('vs/base/common/arrays');

export const EMPTY_ELEMENTS:string[] = ['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'menuitem', 'meta', 'param', 'source', 'track', 'wbr'];

export function isEmptyElement(e: string) : boolean {
return arrays.binarySearch(EMPTY_ELEMENTS, e,(s1: string, s2: string) => s1.localeCompare(s2)) >= 0;
}
7 changes: 1 addition & 6 deletions src/vs/languages/html/common/htmlTags.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,7 @@
import strings = require('vs/base/common/strings');
import arrays = require('vs/base/common/arrays');
import nls = require('vs/nls');

var emptyElements:string[] = ['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'menuitem', 'meta', 'param', 'source', 'track', 'wbr'];

export function isEmptyElement(e: string) : boolean {
return arrays.binarySearch(emptyElements, e,(s1: string, s2: string) => s1.localeCompare(s2)) >= 0;
}
import {isEmptyElement} from 'vs/languages/html/common/htmlEmptyTagsShared';

export interface IHTMLTagProvider {
collectTags(collector: (tag:string, label:string) => void): void;
Expand Down
6 changes: 3 additions & 3 deletions src/vs/languages/html/common/htmlWorker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import {IMarkerService} from 'vs/platform/markers/common/markers';
import {IResourceService} from 'vs/editor/common/services/resourceService';
import {getScanner, IHTMLScanner} from 'vs/languages/html/common/htmlScanner';
import {isTag, DELIM_END, DELIM_START, DELIM_ASSIGN, ATTRIB_NAME, ATTRIB_VALUE} from 'vs/languages/html/common/htmlTokenTypes';
import {isEmptyElement} from 'vs/languages/html/common/htmlEmptyTagsShared';

enum LinkDetectionState {
LOOKING_FOR_HREF_OR_SRC = 1,
Expand Down Expand Up @@ -175,7 +176,7 @@ export class HTMLWorker extends AbstractModeWorker {
scanner.scanBack();
if (scanner.getTokenType() === DELIM_END) {
closedTags[tag] = (closedTags[tag] || 0) + 1;
} else if (!htmlTags.isEmptyElement(tag)) {
} else if (!isEmptyElement(tag)) {
if (closedTags[tag]) {
closedTags[tag]--;
} else {
Expand Down Expand Up @@ -404,7 +405,7 @@ export class HTMLWorker extends AbstractModeWorker {
}

private findMatchingBracket(tagname: string, scanner: IHTMLScanner) : EditorCommon.IRange {
if (htmlTags.isEmptyElement(tagname)) {
if (isEmptyElement(tagname)) {
return null;
}
var tagCount = 0;
Expand Down Expand Up @@ -707,4 +708,3 @@ export class HTMLWorker extends AbstractModeWorker {
function isWhiteSpace(s:string) : boolean {
return /^\s*$/.test(s);
}