diff --git a/extensions/html/server/src/htmlServerMain.ts b/extensions/html/server/src/htmlServerMain.ts index a26b2162782..0dfbdceae88 100644 --- a/extensions/html/server/src/htmlServerMain.ts +++ b/extensions/html/server/src/htmlServerMain.ts @@ -84,7 +84,7 @@ connection.onDocumentHighlight(documentHighlightParams => { return languageService.findDocumentHighlights(document, documentHighlightParams.position, htmlDocument); }); -function merge(src: any, dst: any) : any { +function merge(src: any, dst: any): any { for (var key in src) { if (src.hasOwnProperty(key)) { dst[key] = src[key]; @@ -93,7 +93,7 @@ function merge(src: any, dst: any) : any { return dst; } -function getFormattingOptions(formatParams : any) { +function getFormattingOptions(formatParams: any) { let formatSettings = languageSettings && languageSettings.format; if (!formatSettings) { return formatParams; diff --git a/extensions/html/server/src/service/htmlLanguageService.ts b/extensions/html/server/src/service/htmlLanguageService.ts index b5244d1348d..5b43b82bbc6 100644 --- a/extensions/html/server/src/service/htmlLanguageService.ts +++ b/extensions/html/server/src/service/htmlLanguageService.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ 'use strict'; + import {parse} from './parser/htmlParser'; import {doComplete} from './services/htmlCompletion'; import {format} from './services/htmlFormatter'; @@ -26,7 +27,7 @@ export interface HTMLFormatConfiguration { } export interface CompletionConfiguration { - [provider:string]:boolean; + [provider: string]: boolean; } export declare type HTMLDocument = {}; @@ -36,12 +37,12 @@ export interface LanguageService { findDocumentHighlights(document: TextDocument, position: Position, htmlDocument: HTMLDocument): DocumentHighlight[]; doComplete(document: TextDocument, position: Position, htmlDocument: HTMLDocument, options?: CompletionConfiguration): CompletionList; format(document: TextDocument, range: Range, options: HTMLFormatConfiguration): TextEdit[]; - findDocumentLinks(document: TextDocument, workspacePath:string): DocumentLink[]; + findDocumentLinks(document: TextDocument, workspacePath: string): DocumentLink[]; } -export function getLanguageService() : LanguageService { +export function getLanguageService(): LanguageService { return { - parseHTMLDocument: (document) => parse(document.getText()), + parseHTMLDocument: document => parse(document.getText()), doComplete, format, findDocumentHighlights, diff --git a/extensions/html/server/src/service/parser/htmlParser.ts b/extensions/html/server/src/service/parser/htmlParser.ts index fc3b004d980..4b973d958dd 100644 --- a/extensions/html/server/src/service/parser/htmlParser.ts +++ b/extensions/html/server/src/service/parser/htmlParser.ts @@ -18,7 +18,7 @@ export class Node { public get firstChild(): Node { return this.children[0]; } public get lastChild(): Node { return this.children.length ? this.children[this.children.length - 1] : void 0; } - public findNodeBefore(offset:number) : Node { + public findNodeBefore(offset: number): Node { let idx = findFirst(this.children, c => offset <= c.start) - 1; if (idx >= 0) { let child = this.children[idx]; @@ -36,7 +36,7 @@ export class Node { return this; } - public findNodeAt(offset:number) : Node { + public findNodeAt(offset: number): Node { let idx = findFirst(this.children, c => offset <= c.start) - 1; if (idx >= 0) { let child = this.children[idx]; @@ -50,16 +50,16 @@ export class Node { export interface HTMLDocument { roots: Node[]; - findNodeBefore(offset:number) : Node; - findNodeAt(offset:number) : Node; + findNodeBefore(offset: number): Node; + findNodeAt(offset: number): Node; } -export function parse(text: string) : HTMLDocument { +export function parse(text: string): HTMLDocument { let scanner = createScanner(text); let htmlDocument = new Node(0, text.length, [], null); let curr = htmlDocument; - let endTagStart : number = -1; + let endTagStart: number = -1; let token = scanner.scan(); while (token !== TokenType.EOS) { switch (token) { diff --git a/extensions/html/server/src/service/parser/htmlScanner.ts b/extensions/html/server/src/service/parser/htmlScanner.ts index b6ea9566b5d..5cfa208f1c2 100644 --- a/extensions/html/server/src/service/parser/htmlScanner.ts +++ b/extensions/html/server/src/service/parser/htmlScanner.ts @@ -196,7 +196,7 @@ export enum ScannerState { } export interface Scanner { - scan() : TokenType; + scan(): TokenType; getTokenType(): TokenType; getTokenOffset(): number; getTokenLength(): number; @@ -210,7 +210,7 @@ const htmlScriptContents = { 'text/x-handlebars-template': true }; -export function createScanner(input: string, initialOffset = 0, initialState: ScannerState = ScannerState.WithinContent) : Scanner { +export function createScanner(input: string, initialOffset = 0, initialState: ScannerState = ScannerState.WithinContent): Scanner { let stream = new MultiLineStream(input, initialOffset); let state = initialState; @@ -342,7 +342,7 @@ export function createScanner(input: string, initialOffset = 0, initialState: Sc state = ScannerState.WithinContent; } else { state = ScannerState.WithinScriptContent; - } + } } else if (lastTag === 'style') { state = ScannerState.WithinStyleContent; } else { diff --git a/extensions/html/server/src/service/parser/htmlTags.ts b/extensions/html/server/src/service/parser/htmlTags.ts index b0ae9411c4f..ba6436f022c 100644 --- a/extensions/html/server/src/service/parser/htmlTags.ts +++ b/extensions/html/server/src/service/parser/htmlTags.ts @@ -39,13 +39,13 @@ import arrays = require('../utils/arrays'); import * as nls from 'vscode-nls'; let localize = nls.loadMessageBundle(); -export const EMPTY_ELEMENTS:string[] = ['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'menuitem', 'meta', 'param', 'source', 'track', 'wbr']; +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 { +export function isEmptyElement(e: string): boolean { return e && arrays.binarySearch(EMPTY_ELEMENTS, e.toLowerCase(), (s1: string, s2: string) => s1.localeCompare(s2)) >= 0; } -export function isSameTag(t1: string, t2: string) : boolean { +export function isSameTag(t1: string, t2: string): boolean { return t1 && t2 && t1.toLowerCase() === t2.toLowerCase(); } diff --git a/extensions/html/server/src/service/services/htmlCompletion.ts b/extensions/html/server/src/service/services/htmlCompletion.ts index 0bc5f06c9ec..a1d16ac670f 100644 --- a/extensions/html/server/src/service/services/htmlCompletion.ts +++ b/extensions/html/server/src/service/services/htmlCompletion.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { TextDocument, Position, CompletionList, CompletionItemKind, Range } from 'vscode-languageserver-types'; -import { HTMLDocument } from '../parser/htmlParser'; -import { TokenType, createScanner, ScannerState } from '../parser/htmlScanner'; -import { getHTML5TagProvider, getAngularTagProvider, getIonicTagProvider } from '../parser/htmlTags'; -import { getRazorTagProvider } from '../parser/razorTags'; -import { CompletionConfiguration } from '../htmlLanguageService'; +import {TextDocument, Position, CompletionList, CompletionItemKind, Range} from 'vscode-languageserver-types'; +import {HTMLDocument} from '../parser/htmlParser'; +import {TokenType, createScanner, ScannerState} from '../parser/htmlScanner'; +import {getHTML5TagProvider, getAngularTagProvider, getIonicTagProvider} from '../parser/htmlTags'; +import {getRazorTagProvider} from '../parser/razorTags'; +import {CompletionConfiguration} from '../htmlLanguageService'; let allTagProviders = [ getHTML5TagProvider(), @@ -35,14 +35,14 @@ export function doComplete(document: TextDocument, position: Position, doc: HTML let currentTag: string; let currentAttributeName: string; - function getReplaceRange(replaceStart: number) : Range { + function getReplaceRange(replaceStart: number): Range { if (replaceStart > offset) { replaceStart = offset; } - return { start: document.positionAt(replaceStart), end: document.positionAt(offset)}; + return { start: document.positionAt(replaceStart), end: document.positionAt(offset) }; } - function collectOpenTagSuggestions(afterOpenBracket: number) : CompletionList { + function collectOpenTagSuggestions(afterOpenBracket: number): CompletionList { let range = getReplaceRange(afterOpenBracket); tagProviders.forEach((provider) => { provider.collectTags((tag, label) => { @@ -57,7 +57,7 @@ export function doComplete(document: TextDocument, position: Position, doc: HTML return result; } - function collectCloseTagSuggestions(afterOpenBracket: number, matchingOnly: boolean) : CompletionList { + function collectCloseTagSuggestions(afterOpenBracket: number, matchingOnly: boolean): CompletionList { let range = getReplaceRange(afterOpenBracket); let contentAfter = document.getText().substr(offset); let closeTag = contentAfter.match(/^\s*>/) ? '' : '>'; @@ -93,13 +93,13 @@ export function doComplete(document: TextDocument, position: Position, doc: HTML return result; } - function collectTagSuggestions(tagStart: number) : CompletionList { + function collectTagSuggestions(tagStart: number): CompletionList { collectOpenTagSuggestions(tagStart); collectCloseTagSuggestions(tagStart, true); return result; } - function collectAttributeNameSuggestions(nameStart: number) : CompletionList { + function collectAttributeNameSuggestions(nameStart: number): CompletionList { let range = getReplaceRange(nameStart); tagProviders.forEach((provider) => { provider.collectAttributes(currentTag, (attribute, type) => { @@ -117,7 +117,7 @@ export function doComplete(document: TextDocument, position: Position, doc: HTML return result; } - function collectAttributeValueSuggestions(valueStart: number) : CompletionList { + function collectAttributeValueSuggestions(valueStart: number): CompletionList { let range = getReplaceRange(valueStart); tagProviders.forEach((provider) => { provider.collectValues(currentTag, currentAttributeName, (value) => { @@ -206,6 +206,6 @@ export function doComplete(document: TextDocument, position: Position, doc: HTML return result; } -function isWhiteSpace(s:string) : boolean { +function isWhiteSpace(s: string): boolean { return /^\s*$/.test(s); } \ No newline at end of file diff --git a/extensions/html/server/src/service/services/htmlFormatter.ts b/extensions/html/server/src/service/services/htmlFormatter.ts index 830643d8278..ebe4abb2e0d 100644 --- a/extensions/html/server/src/service/services/htmlFormatter.ts +++ b/extensions/html/server/src/service/services/htmlFormatter.ts @@ -15,7 +15,7 @@ export function format(document: TextDocument, range: Range, options: HTMLFormat let endOffset = document.offsetAt(range.end); value = value.substring(startOffset, endOffset); } - let htmlOptions : IBeautifyHTMLOptions = { + let htmlOptions: IBeautifyHTMLOptions = { indent_size: options.insertSpaces ? options.tabSize : 1, indent_char: options.insertSpaces ? ' ' : '\t', wrap_line_length: getFormatOption(options, 'wrapLineLength', 120), @@ -46,7 +46,7 @@ function getFormatOption(options: HTMLFormatConfiguration, key: string, dflt: an } function getTagsFormatOption(options: HTMLFormatConfiguration, key: string, dflt: string[]): string[] { - let list = getFormatOption(options, key, null); + let list = getFormatOption(options, key, null); if (typeof list === 'string') { if (list.length > 0) { return list.split(',').map(t => t.trim().toLowerCase()); diff --git a/extensions/html/server/src/service/services/htmlHighlighting.ts b/extensions/html/server/src/service/services/htmlHighlighting.ts index 3fb1a9cc570..520c06e91cc 100644 --- a/extensions/html/server/src/service/services/htmlHighlighting.ts +++ b/extensions/html/server/src/service/services/htmlHighlighting.ts @@ -36,14 +36,14 @@ function covers(range: Range, position: Position) { return isBeforeOrEqual(range.start, position) && isBeforeOrEqual(position, range.end); } -function getTagNameRange(tokenType: TokenType, document: TextDocument, startOffset: number) : Range { +function getTagNameRange(tokenType: TokenType, document: TextDocument, startOffset: number): Range { let scanner = createScanner(document.getText(), startOffset); let token = scanner.scan(); while (token !== TokenType.EOS && token !== tokenType) { token = scanner.scan(); } if (token !== TokenType.EOS) { - return { start: document.positionAt(scanner.getTokenOffset()), end: document.positionAt(scanner.getTokenEnd()) }; + return { start: document.positionAt(scanner.getTokenOffset()), end: document.positionAt(scanner.getTokenEnd()) }; } return null; } diff --git a/extensions/html/server/src/service/services/htmlLinks.ts b/extensions/html/server/src/service/services/htmlLinks.ts index 650a2296e81..bb81ac8df53 100644 --- a/extensions/html/server/src/service/services/htmlLinks.ts +++ b/extensions/html/server/src/service/services/htmlLinks.ts @@ -14,8 +14,8 @@ import {DocumentLink} from '../htmlLanguageService'; function stripQuotes(url: string): string { return url - .replace(/^'([^']+)'$/,(substr, match1) => match1) - .replace(/^"([^"]+)"$/,(substr, match1) => match1); + .replace(/^'([^']+)'$/, (substr, match1) => match1) + .replace(/^"([^"]+)"$/, (substr, match1) => match1); } function getWorkspaceUrl(modelAbsoluteUri: Uri, rootAbsoluteUrl: Uri, tokenContent: string): string { @@ -79,7 +79,7 @@ function createLink(document: TextDocument, rootAbsoluteUrl: Uri, attributeValue }; } -export function findDocumentLinks(document: TextDocument, workspacePath:string): DocumentLink[] { +export function findDocumentLinks(document: TextDocument, workspacePath: string): DocumentLink[] { let newLinks: DocumentLink[] = []; let rootAbsoluteUrl: Uri = null; @@ -111,7 +111,7 @@ export function findDocumentLinks(document: TextDocument, workspacePath:string): } break; } - token = scanner.scan(); + token = scanner.scan(); } return newLinks; } \ No newline at end of file diff --git a/extensions/html/server/src/service/test/completion.test.ts b/extensions/html/server/src/service/test/completion.test.ts index 52db1dddc5f..af19cada1fa 100644 --- a/extensions/html/server/src/service/test/completion.test.ts +++ b/extensions/html/server/src/service/test/completion.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import * as htmlLanguageService from '../htmlLanguageService'; -import {CompletionList, TextDocument, TextEdit, Position, CompletionItemKind} from 'vscode-languageserver-types'; +import {CompletionList, TextDocument, CompletionItemKind} from 'vscode-languageserver-types'; import {applyEdits} from './textEditSupport'; export interface ItemDescription { @@ -53,12 +53,10 @@ export let assertCompletion = function (completions: CompletionList, expected: I if (actualText !== expectedText) { assert.equal(actualText, expectedText); } - - } }; -let testCompletionFor = function (value: string, expected: { count?: number, items?: ItemDescription[] }, settings? : htmlLanguageService.CompletionConfiguration): Thenable { +let testCompletionFor = function (value: string, expected: { count?: number, items?: ItemDescription[] }, settings?: htmlLanguageService.CompletionConfiguration): Thenable { let offset = value.indexOf('|'); value = value.substr(0, offset) + value.substr(offset + 1); @@ -78,6 +76,7 @@ let testCompletionFor = function (value: string, expected: { count?: number, ite } return Promise.resolve(); }; + function run(tests: Thenable[], testDone) { Promise.all(tests).then(() => { testDone(); @@ -272,7 +271,7 @@ suite('HTML Completion', () => { test('Handlebar Completion', function (testDone) { run([ - testCompletionFor('' , { + testCompletionFor('', { items: [ { label: 'div', resultText: '' }, ] @@ -377,7 +376,7 @@ suite('HTML Completion', () => { run([ testCompletionFor('<|', { items: [ - { label: 'ion-checkbox'}, + { label: 'ion-checkbox' }, { label: 'div', notAvailable: true }, ] }, { html5: false, ionic: true, angular1: false }), diff --git a/extensions/html/server/src/service/test/highlighting.test.ts b/extensions/html/server/src/service/test/highlighting.test.ts index a8ca00452ac..6d1892749d6 100644 --- a/extensions/html/server/src/service/test/highlighting.test.ts +++ b/extensions/html/server/src/service/test/highlighting.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import * as htmlLanguageService from '../htmlLanguageService'; -import {CompletionList, TextDocument, TextEdit, Position, CompletionItemKind} from 'vscode-languageserver-types'; +import {TextDocument} from 'vscode-languageserver-types'; export function assertHighlights(value: string, expectedMatches: number[], elementName: string): void { let offset = value.indexOf('|'); @@ -46,7 +46,6 @@ suite('HTML Highlighting', () => { assertHighlights('', [1, 8], 'html'); assertHighlights('', [1, 8], 'html'); assertHighlights('|', [], null); - }); test('Nested', function (): any { @@ -63,10 +62,8 @@ suite('HTML Highlighting', () => { }); test('Selfclosed', function (): any { - assertHighlights('<|div/>', [ 7 ], 'div'); - assertHighlights('<|br>', [ 7 ], 'br'); - assertHighlights('
', [ 12 ], 'div'); + assertHighlights('<|div/>', [7], 'div'); + assertHighlights('<|br>', [7], 'br'); + assertHighlights('
', [12], 'div'); }); - - }); \ No newline at end of file diff --git a/extensions/html/server/src/service/test/links.test.ts b/extensions/html/server/src/service/test/links.test.ts index 6d7040a816d..8078488341b 100644 --- a/extensions/html/server/src/service/test/links.test.ts +++ b/extensions/html/server/src/service/test/links.test.ts @@ -6,21 +6,19 @@ 'use strict'; import * as assert from 'assert'; -import * as htmlLinks from '../services/htmlLinks'; -import {CompletionList, TextDocument, TextEdit, Position, CompletionItemKind} from 'vscode-languageserver-types'; -import Uri from 'vscode-uri'; +import {TextDocument} from 'vscode-languageserver-types'; import * as htmlLanguageService from '../htmlLanguageService'; suite('HTML Link Detection', () => { - function testLinkCreation(modelUrl:string, rootUrl:string, tokenContent:string, expected:string): void { + function testLinkCreation(modelUrl: string, rootUrl: string, tokenContent: string, expected: string): void { let document = TextDocument.create(modelUrl, 'html', 0, ``); let ls = htmlLanguageService.getLanguageService(); let links = ls.findDocumentLinks(document, rootUrl); assert.equal(links[0] && links[0].target, expected); } - function testLinkDetection(value:string, expectedLinkLocations:number[]): void { + function testLinkDetection(value: string, expectedLinkLocations: number[]): void { let document = TextDocument.create('test://test/test.html', 'html', 0, value); let ls = htmlLanguageService.getLanguageService(); @@ -80,8 +78,8 @@ suite('HTML Link Detection', () => { }); test('Link detection', () => { - testLinkDetection('', [ 9 ]); - testLinkDetection('', [ 8 ]); + testLinkDetection('', [9]); + testLinkDetection('', [8]); }); }); \ No newline at end of file diff --git a/extensions/html/server/src/service/test/parser.test.ts b/extensions/html/server/src/service/test/parser.test.ts index dfba15a0fee..5a553ac77c0 100644 --- a/extensions/html/server/src/service/test/parser.test.ts +++ b/extensions/html/server/src/service/test/parser.test.ts @@ -25,30 +25,32 @@ suite('HTML Parser', () => { } test('Simple', () => { - assertDocument('', [ { tag: 'html', start: 0, end: 13, endTagStart: 6, closed: true, children: []}] ); - assertDocument('', [ { tag: 'html', start: 0, end: 26, endTagStart: 19, closed: true, children: [ { tag: 'body', start: 6, end: 19, endTagStart: 12, closed: true, children: [] }]}] ); - assertDocument('', [ { tag: 'html', start: 0, end: 39, endTagStart: 32, closed: true, children: [ { tag: 'head', start: 6, end: 19, endTagStart: 12, closed: true, children: [] }, { tag: 'body', start: 19, end: 32, endTagStart: 25, closed: true, children: [] }]}] ); + assertDocument('', [{ tag: 'html', start: 0, end: 13, endTagStart: 6, closed: true, children: [] }]); + assertDocument('', [{ tag: 'html', start: 0, end: 26, endTagStart: 19, closed: true, children: [{ tag: 'body', start: 6, end: 19, endTagStart: 12, closed: true, children: [] }] }]); + assertDocument('', [{ tag: 'html', start: 0, end: 39, endTagStart: 32, closed: true, children: [{ tag: 'head', start: 6, end: 19, endTagStart: 12, closed: true, children: [] }, { tag: 'body', start: 19, end: 32, endTagStart: 25, closed: true, children: [] }] }]); }); test('SelfClose', () => { - assertDocument('
', [ { tag: 'br', start: 0, end: 5, endTagStart: void 0, closed: true, children: []}] ); - assertDocument('

', [ { tag: 'div', start: 0, end: 29, endTagStart: 23, closed: true, children: [{ tag: 'br', start: 5, end: 10, endTagStart: void 0, closed: true, children: [] }, { tag: 'span', start: 10, end: 23, endTagStart: 16, closed: true, children: [] }]}] ); + assertDocument('
', [{ tag: 'br', start: 0, end: 5, endTagStart: void 0, closed: true, children: [] }]); + assertDocument('

', [{ tag: 'div', start: 0, end: 29, endTagStart: 23, closed: true, children: [{ tag: 'br', start: 5, end: 10, endTagStart: void 0, closed: true, children: [] }, { tag: 'span', start: 10, end: 23, endTagStart: 16, closed: true, children: [] }] }]); }); test('EmptyTag', () => { - assertDocument('', [ { tag: 'meta', start: 0, end: 6, endTagStart: void 0, closed: true, children: []}] ); - assertDocument('


', [ { tag: 'div', start: 0, end: 53, endTagStart: 47, closed: true, children: [ - { tag: 'input', start: 5, end: 26, endTagStart: void 0, closed: true, children: [] }, - { tag: 'span', start: 26, end: 47, endTagStart: 40, closed: true, children: [{ tag: 'br', start: 32, end: 36, endTagStart: void 0, closed: true, children: [] }, { tag: 'br', start: 36, end: 40, endTagStart: void 0, closed: true, children: [] }] } - ]}] ); + assertDocument('', [{ tag: 'meta', start: 0, end: 6, endTagStart: void 0, closed: true, children: [] }]); + assertDocument('


', [{ + tag: 'div', start: 0, end: 53, endTagStart: 47, closed: true, children: [ + { tag: 'input', start: 5, end: 26, endTagStart: void 0, closed: true, children: [] }, + { tag: 'span', start: 26, end: 47, endTagStart: 40, closed: true, children: [{ tag: 'br', start: 32, end: 36, endTagStart: void 0, closed: true, children: [] }, { tag: 'br', start: 36, end: 40, endTagStart: void 0, closed: true, children: [] }] } + ] + }]); }); test('MissingTags', () => { - assertDocument('', [] ); - assertDocument('
', [ { tag: 'div', start: 0, end: 11, endTagStart: 5, closed: true, children: [] }] ); - assertDocument('
', [ { tag: 'div', start: 0, end: 16, endTagStart: void 0, closed: false, children: [ { tag: 'div', start: 5, end: 16, endTagStart: 10, closed: true, children: [] } ] }] ); - assertDocument('<div>', [ { tag: 'title', start: 0, end: 20, endTagStart: 12, closed: true, children: [ { tag: 'div', start: 7, end: 12, endTagStart: void 0, closed: false, children: [] } ] }] ); - assertDocument('

', [ { tag: 'h1', start: 0, end: 20, endTagStart: 15, closed: true, children: [ { tag: 'div', start: 4, end: 15, endTagStart: void 0, closed: false, children: [ { tag: 'span', start: 9, end: 15, endTagStart: void 0, closed: false, children: [] }] } ] }] ); -}); + assertDocument('', []); + assertDocument('
', [{ tag: 'div', start: 0, end: 11, endTagStart: 5, closed: true, children: [] }]); + assertDocument('
', [{ tag: 'div', start: 0, end: 16, endTagStart: void 0, closed: false, children: [{ tag: 'div', start: 5, end: 16, endTagStart: 10, closed: true, children: [] }] }]); + assertDocument('<div>', [{ tag: 'title', start: 0, end: 20, endTagStart: 12, closed: true, children: [{ tag: 'div', start: 7, end: 12, endTagStart: void 0, closed: false, children: [] }] }]); + assertDocument('

', [{ tag: 'h1', start: 0, end: 20, endTagStart: 15, closed: true, children: [{ tag: 'div', start: 4, end: 15, endTagStart: void 0, closed: false, children: [{ tag: 'span', start: 9, end: 15, endTagStart: void 0, closed: false, children: [] }] }] }]); + }); test('FindNodeBefore', () => { diff --git a/extensions/html/server/src/service/test/scanner.test.ts b/extensions/html/server/src/service/test/scanner.test.ts index 1943c4137bd..ae73eb845d1 100644 --- a/extensions/html/server/src/service/test/scanner.test.ts +++ b/extensions/html/server/src/service/test/scanner.test.ts @@ -10,20 +10,20 @@ import {Scanner, TokenType, ScannerState, createScanner} from '../parser/htmlSca suite('HTML Scanner', () => { interface Token { - offset:number; - type:TokenType; + offset: number; + type: TokenType; content?: string; } - function assertTokens(tests: {input: string; tokens: Token[]; }[]) { + function assertTokens(tests: { input: string; tokens: Token[]; }[]) { let scannerState = ScannerState.WithinContent; for (let t of tests) { let scanner = createScanner(t.input, 0, scannerState); let tokenType = scanner.scan(); - let actual : Token[] = []; + let actual: Token[] = []; while (tokenType !== TokenType.EOS) { - let actualToken : Token= { offset: scanner.getTokenOffset(), type: tokenType }; + let actualToken: Token = { offset: scanner.getTokenOffset(), type: tokenType }; if (tokenType == TokenType.StartTag || tokenType == TokenType.EndTag) { actualToken.content = t.input.substr(scanner.getTokenOffset(), scanner.getTokenLength()); } @@ -39,9 +39,10 @@ suite('HTML Scanner', () => { assertTokens([{ input: ' { assertTokens([{ input: ' { assertTokens([{ input: '< abc', tokens: [ - { offset:0, type: TokenType.StartTagOpen }, - { offset:1, type: TokenType.Whitespace }, - { offset:2, type: TokenType.StartTag, content: 'abc' } - ]} + { offset: 0, type: TokenType.StartTagOpen }, + { offset: 1, type: TokenType.Whitespace }, + { offset: 2, type: TokenType.StartTag, content: 'abc' } + ] + } ]); }); @@ -70,11 +73,12 @@ suite('HTML Scanner', () => { assertTokens([{ input: '< abc>', tokens: [ - { offset:0, type: TokenType.StartTagOpen }, - { offset:1, type: TokenType.Whitespace }, - { offset:2, type: TokenType.StartTag, content: 'abc' }, - { offset:5, type: TokenType.StartTagClose }, - ]} + { offset: 0, type: TokenType.StartTagOpen }, + { offset: 1, type: TokenType.Whitespace }, + { offset: 2, type: TokenType.StartTag, content: 'abc' }, + { offset: 5, type: TokenType.StartTagClose }, + ] + } ]); }); @@ -82,11 +86,12 @@ suite('HTML Scanner', () => { assertTokens([{ input: 'i { assertTokens([{ input: '<', tokens: [ - { offset:0, type: TokenType.StartTagOpen } - ]} + { offset: 0, type: TokenType.StartTagOpen } + ] + } ]); }); @@ -103,9 +109,10 @@ suite('HTML Scanner', () => { assertTokens([{ input: ' { assertTokens([{ input: '', tokens: [ - { offset:0, type: TokenType.StartTagOpen }, - { offset:1, type: TokenType.StartTag, content: 'abc' }, - { offset:4, type: TokenType.StartTagClose } - ]} + { offset: 0, type: TokenType.StartTagOpen }, + { offset: 1, type: TokenType.StartTag, content: 'abc' }, + { offset: 4, type: TokenType.StartTagClose } + ] + } ]); }); @@ -124,11 +132,12 @@ suite('HTML Scanner', () => { assertTokens([{ input: '', tokens: [ - { offset:0, type: TokenType.StartTagOpen }, - { offset:1, type: TokenType.StartTag, content: 'abc' }, - { offset:4, type: TokenType.Whitespace }, - { offset:5, type: TokenType.StartTagClose } - ]} + { offset: 0, type: TokenType.StartTagOpen }, + { offset: 1, type: TokenType.StartTag, content: 'abc' }, + { offset: 4, type: TokenType.Whitespace }, + { offset: 5, type: TokenType.StartTagClose } + ] + } ]); }); @@ -136,10 +145,11 @@ suite('HTML Scanner', () => { assertTokens([{ input: '', tokens: [ - { offset:0, type: TokenType.StartTagOpen }, - { offset:1, type: TokenType.StartTag, content: 'foo:bar' }, - { offset:8, type: TokenType.StartTagClose } - ]} + { offset: 0, type: TokenType.StartTagOpen }, + { offset: 1, type: TokenType.StartTag, content: 'foo:bar' }, + { offset: 8, type: TokenType.StartTagClose } + ] + } ]); }); @@ -147,10 +157,11 @@ suite('HTML Scanner', () => { assertTokens([{ input: '', tokens: [ - { offset:0, type: TokenType.EndTagOpen }, - { offset:2, type: TokenType.EndTag, content: 'abc' }, - { offset:5, type: TokenType.EndTagClose } - ]} + { offset: 0, type: TokenType.EndTagOpen }, + { offset: 2, type: TokenType.EndTag, content: 'abc' }, + { offset: 5, type: TokenType.EndTagClose } + ] + } ]); }); @@ -158,11 +169,12 @@ suite('HTML Scanner', () => { assertTokens([{ input: '', tokens: [ - { offset:0, type: TokenType.EndTagOpen }, - { offset:2, type: TokenType.EndTag, content: 'abc' }, - { offset:5, type: TokenType.Whitespace }, - { offset:7, type: TokenType.EndTagClose } - ]} + { offset: 0, type: TokenType.EndTagOpen }, + { offset: 2, type: TokenType.EndTag, content: 'abc' }, + { offset: 5, type: TokenType.Whitespace }, + { offset: 7, type: TokenType.EndTagClose } + ] + } ]); }); @@ -170,11 +182,12 @@ suite('HTML Scanner', () => { assertTokens([{ input: '', tokens: [ - { offset:0, type: TokenType.StartTagOpen }, - { offset:1, type: TokenType.StartTag, content: 'abc' }, - { offset:4, type: TokenType.Whitespace }, - { offset:5, type: TokenType.StartTagSelfClose } - ]} + { offset: 0, type: TokenType.StartTagOpen }, + { offset: 1, type: TokenType.StartTag, content: 'abc' }, + { offset: 4, type: TokenType.Whitespace }, + { offset: 5, type: TokenType.StartTagSelfClose } + ] + } ]); }); @@ -182,18 +195,19 @@ suite('HTML Scanner', () => { assertTokens([{ input: '', tokens: [ - { offset:0, type: TokenType.StartTagOpen }, - { offset:1, type: TokenType.StartTag, content: 'script' }, - { offset:7, type: TokenType.Whitespace }, - { offset:8, type: TokenType.AttributeName }, - { offset:12, type: TokenType.DelimiterAssign }, - { offset:13, type: TokenType.AttributeValue }, - { offset:30, type: TokenType.StartTagClose }, - { offset:31, type: TokenType.Script }, - { offset:41, type: TokenType.EndTagOpen }, - { offset:43, type: TokenType.EndTag, content: 'script' }, - { offset:49, type: TokenType.EndTagClose } - ]} + { offset: 0, type: TokenType.StartTagOpen }, + { offset: 1, type: TokenType.StartTag, content: 'script' }, + { offset: 7, type: TokenType.Whitespace }, + { offset: 8, type: TokenType.AttributeName }, + { offset: 12, type: TokenType.DelimiterAssign }, + { offset: 13, type: TokenType.AttributeValue }, + { offset: 30, type: TokenType.StartTagClose }, + { offset: 31, type: TokenType.Script }, + { offset: 41, type: TokenType.EndTagOpen }, + { offset: 43, type: TokenType.EndTag, content: 'script' }, + { offset: 49, type: TokenType.EndTagClose } + ] + } ]); }); @@ -201,24 +215,27 @@ suite('HTML Scanner', () => { assertTokens([{ input: '', - tokens: [ - { offset:0, type: TokenType.EndTagOpen }, - { offset:2, type: TokenType.EndTag, content: 'script' }, - { offset:8, type: TokenType.EndTagClose } - ]} + { offset: 0, type: TokenType.StartTagOpen }, + { offset: 1, type: TokenType.StartTag, content: 'script' }, + { offset: 7, type: TokenType.Whitespace }, + { offset: 8, type: TokenType.AttributeName }, + { offset: 12, type: TokenType.DelimiterAssign }, + { offset: 13, type: TokenType.AttributeValue }, + { offset: 30, type: TokenType.StartTagClose } + ] + }, { + input: 'var i= 10;', + tokens: [ + { offset: 0, type: TokenType.Script } + ] + }, { + input: '', + tokens: [ + { offset: 0, type: TokenType.EndTagOpen }, + { offset: 2, type: TokenType.EndTag, content: 'script' }, + { offset: 8, type: TokenType.EndTagClose } + ] + } ]); }); @@ -226,21 +243,23 @@ suite('HTML Scanner', () => { assertTokens([{ input: '', - tokens: [ - { offset:0, type: TokenType.EndTagOpen }, - { offset:2, type: TokenType.EndTag, content: 'script' }, - { offset:8, type: TokenType.EndTagClose } - ]} + { offset: 0, type: TokenType.StartTagOpen }, + { offset: 1, type: TokenType.StartTag, content: 'script' }, + { offset: 7, type: TokenType.Whitespace }, + { offset: 8, type: TokenType.AttributeName }, + { offset: 12, type: TokenType.DelimiterAssign }, + { offset: 13, type: TokenType.AttributeValue }, + { offset: 30, type: TokenType.StartTagClose }, + { offset: 31, type: TokenType.Script } + ] + }, { + input: '', + tokens: [ + { offset: 0, type: TokenType.EndTagOpen }, + { offset: 2, type: TokenType.EndTag, content: 'script' }, + { offset: 8, type: TokenType.EndTagClose } + ] + } ]); }); @@ -248,21 +267,23 @@ suite('HTML Scanner', () => { assertTokens([{ input: '', - tokens: [ - { offset:0, type: TokenType.Script }, - { offset:10, type: TokenType.EndTagOpen }, - { offset:12, type: TokenType.EndTag, content: 'script' }, - { offset:18, type: TokenType.EndTagClose } - ]} + { offset: 0, type: TokenType.StartTagOpen }, + { offset: 1, type: TokenType.StartTag, content: 'script' }, + { offset: 7, type: TokenType.Whitespace }, + { offset: 8, type: TokenType.AttributeName }, + { offset: 12, type: TokenType.DelimiterAssign }, + { offset: 13, type: TokenType.AttributeValue }, + { offset: 30, type: TokenType.StartTagClose } + ] + }, { + input: 'var i= 10;', + tokens: [ + { offset: 0, type: TokenType.Script }, + { offset: 10, type: TokenType.EndTagOpen }, + { offset: 12, type: TokenType.EndTag, content: 'script' }, + { offset: 18, type: TokenType.EndTagClose } + ] + } ]); }); @@ -270,18 +291,19 @@ suite('HTML Scanner', () => { assertTokens([{ input: '', tokens: [ - { offset:0, type: TokenType.StartTagOpen }, - { offset:1, type: TokenType.StartTag, content: 'script' }, - { offset:7, type: TokenType.Whitespace }, - { offset:8, type: TokenType.AttributeName }, - { offset:12, type: TokenType.DelimiterAssign }, - { offset:13, type: TokenType.AttributeValue }, - { offset:25, type: TokenType.StartTagClose }, - { offset:26, type: TokenType.Script }, - { offset:30, type: TokenType.EndTagOpen }, - { offset:32, type: TokenType.EndTag, content: 'script' }, - { offset:38, type: TokenType.EndTagClose } - ]} + { offset: 0, type: TokenType.StartTagOpen }, + { offset: 1, type: TokenType.StartTag, content: 'script' }, + { offset: 7, type: TokenType.Whitespace }, + { offset: 8, type: TokenType.AttributeName }, + { offset: 12, type: TokenType.DelimiterAssign }, + { offset: 13, type: TokenType.AttributeValue }, + { offset: 25, type: TokenType.StartTagClose }, + { offset: 26, type: TokenType.Script }, + { offset: 30, type: TokenType.EndTagOpen }, + { offset: 32, type: TokenType.EndTag, content: 'script' }, + { offset: 38, type: TokenType.EndTagClose } + ] + } ]); }); @@ -289,21 +311,22 @@ suite('HTML Scanner', () => { assertTokens([{ input: '', tokens: [ - { offset:0, type: TokenType.StartTagOpen }, - { offset:1, type: TokenType.StartTag, content: 'script' }, - { offset:7, type: TokenType.StartTagClose }, - { offset:8, type: TokenType.Script }, - { offset:9, type: TokenType.EndTagOpen }, - { offset:11, type: TokenType.EndTag, content: 'script' }, - { offset:17, type: TokenType.EndTagClose }, - { offset:18, type: TokenType.StartTagOpen }, - { offset:19, type: TokenType.StartTag, content: 'script' }, - { offset:25, type: TokenType.StartTagClose }, - { offset:26, type: TokenType.Script }, - { offset:27, type: TokenType.EndTagOpen }, - { offset:29, type: TokenType.EndTag, content: 'script' }, - { offset:35, type: TokenType.EndTagClose } - ]} + { offset: 0, type: TokenType.StartTagOpen }, + { offset: 1, type: TokenType.StartTag, content: 'script' }, + { offset: 7, type: TokenType.StartTagClose }, + { offset: 8, type: TokenType.Script }, + { offset: 9, type: TokenType.EndTagOpen }, + { offset: 11, type: TokenType.EndTag, content: 'script' }, + { offset: 17, type: TokenType.EndTagClose }, + { offset: 18, type: TokenType.StartTagOpen }, + { offset: 19, type: TokenType.StartTag, content: 'script' }, + { offset: 25, type: TokenType.StartTagClose }, + { offset: 26, type: TokenType.Script }, + { offset: 27, type: TokenType.EndTagOpen }, + { offset: 29, type: TokenType.EndTag, content: 'script' }, + { offset: 35, type: TokenType.EndTagClose } + ] + } ]); }); @@ -311,17 +334,18 @@ suite('HTML Scanner', () => { assertTokens([{ input: '', tokens: [ - { offset:0, type: TokenType.StartTagOpen }, - { offset:1, type: TokenType.StartTag, content: 'script' }, - { offset:7, type: TokenType.Whitespace }, - { offset:8, type: TokenType.AttributeName }, - { offset:12, type: TokenType.DelimiterAssign }, - { offset:13, type: TokenType.AttributeValue }, - { offset:30, type: TokenType.StartTagClose }, - { offset:31, type: TokenType.EndTagOpen }, - { offset:33, type: TokenType.EndTag, content: 'script' }, - { offset:39, type: TokenType.EndTagClose } - ]} + { offset: 0, type: TokenType.StartTagOpen }, + { offset: 1, type: TokenType.StartTag, content: 'script' }, + { offset: 7, type: TokenType.Whitespace }, + { offset: 8, type: TokenType.AttributeName }, + { offset: 12, type: TokenType.DelimiterAssign }, + { offset: 13, type: TokenType.AttributeValue }, + { offset: 30, type: TokenType.StartTagClose }, + { offset: 31, type: TokenType.EndTagOpen }, + { offset: 33, type: TokenType.EndTag, content: 'script' }, + { offset: 39, type: TokenType.EndTagClose } + ] + } ]); }); @@ -329,14 +353,15 @@ suite('HTML Scanner', () => { assertTokens([{ input: '', tokens: [ - { offset:0, type: TokenType.StartTagOpen }, - { offset:1, type: TokenType.StartTag, content: 'script' }, - { offset:7, type: TokenType.StartTagClose }, - { offset:8, type: TokenType.Script }, - { offset:18, type: TokenType.EndTagOpen }, - { offset:20, type: TokenType.EndTag, content: 'script' }, - { offset:26, type: TokenType.EndTagClose } - ]} + { offset: 0, type: TokenType.StartTagOpen }, + { offset: 1, type: TokenType.StartTag, content: 'script' }, + { offset: 7, type: TokenType.StartTagClose }, + { offset: 8, type: TokenType.Script }, + { offset: 18, type: TokenType.EndTagOpen }, + { offset: 20, type: TokenType.EndTag, content: 'script' }, + { offset: 26, type: TokenType.EndTagClose } + ] + } ]); }); @@ -344,21 +369,22 @@ suite('HTML Scanner', () => { assertTokens([{ input: '', tokens: [ - { offset:0, type: TokenType.StartTagOpen }, - { offset:1, type: TokenType.StartTag, content: 'script' }, - { offset:7, type: TokenType.Whitespace }, - { offset:8, type: TokenType.AttributeName }, - { offset:12, type: TokenType.DelimiterAssign }, - { offset:13, type: TokenType.AttributeValue }, - { offset:30, type: TokenType.Whitespace }, - { offset:31, type: TokenType.AttributeName }, - { offset:34, type: TokenType.DelimiterAssign }, - { offset:35, type: TokenType.AttributeValue }, - { offset:44, type: TokenType.StartTagClose }, - { offset:45, type: TokenType.EndTagOpen }, - { offset:47, type: TokenType.EndTag, content: 'script' }, - { offset:53, type: TokenType.EndTagClose } - ]} + { offset: 0, type: TokenType.StartTagOpen }, + { offset: 1, type: TokenType.StartTag, content: 'script' }, + { offset: 7, type: TokenType.Whitespace }, + { offset: 8, type: TokenType.AttributeName }, + { offset: 12, type: TokenType.DelimiterAssign }, + { offset: 13, type: TokenType.AttributeValue }, + { offset: 30, type: TokenType.Whitespace }, + { offset: 31, type: TokenType.AttributeName }, + { offset: 34, type: TokenType.DelimiterAssign }, + { offset: 35, type: TokenType.AttributeValue }, + { offset: 44, type: TokenType.StartTagClose }, + { offset: 45, type: TokenType.EndTagOpen }, + { offset: 47, type: TokenType.EndTag, content: 'script' }, + { offset: 53, type: TokenType.EndTagClose } + ] + } ]); }); @@ -366,14 +392,15 @@ suite('HTML Scanner', () => { assertTokens([{ input: '', tokens: [ - { offset:0, type: TokenType.StartTagOpen }, - { offset:1, type: TokenType.StartTag, content: 'script' }, - { offset:7, type: TokenType.StartTagClose }, - { offset:8, type: TokenType.Script }, - { offset:44, type: TokenType.EndTagOpen }, - { offset:46, type: TokenType.EndTag, content: 'script' }, - { offset:52, type: TokenType.EndTagClose } - ]} + { offset: 0, type: TokenType.StartTagOpen }, + { offset: 1, type: TokenType.StartTag, content: 'script' }, + { offset: 7, type: TokenType.StartTagClose }, + { offset: 8, type: TokenType.Script }, + { offset: 44, type: TokenType.EndTagOpen }, + { offset: 46, type: TokenType.EndTag, content: 'script' }, + { offset: 52, type: TokenType.EndTagClose } + ] + } ]); }); @@ -381,14 +408,15 @@ suite('HTML Scanner', () => { assertTokens([{ input: '', tokens: [ - { offset:0, type: TokenType.StartTagOpen }, - { offset:1, type: TokenType.StartTag, content: 'script' }, - { offset:7, type: TokenType.StartTagClose }, - { offset:8, type: TokenType.Script }, - { offset:41, type: TokenType.EndTagOpen }, - { offset:43, type: TokenType.EndTag, content: 'script' }, - { offset:49, type: TokenType.EndTagClose } - ]} + { offset: 0, type: TokenType.StartTagOpen }, + { offset: 1, type: TokenType.StartTag, content: 'script' }, + { offset: 7, type: TokenType.StartTagClose }, + { offset: 8, type: TokenType.Script }, + { offset: 41, type: TokenType.EndTagOpen }, + { offset: 43, type: TokenType.EndTag, content: 'script' }, + { offset: 49, type: TokenType.EndTagClose } + ] + } ]); }); @@ -397,18 +425,19 @@ suite('HTML Scanner', () => { assertTokens([{ input: '"); ', tokens: [ - { offset:0, type: TokenType.StartTagOpen }, - { offset:1, type: TokenType.StartTag, content: 'script' }, - { offset:7, type: TokenType.StartTagClose }, - { offset:8, type: TokenType.Script }, - { offset:20, type: TokenType.EndTagOpen }, - { offset:22, type: TokenType.EndTag, content: 'script' }, - { offset:28, type: TokenType.EndTagClose }, - { offset:29, type: TokenType.Content }, - { offset:33, type: TokenType.EndTagOpen }, - { offset:35, type: TokenType.EndTag, content: 'script' }, - { offset:41, type: TokenType.EndTagClose } - ]} + { offset: 0, type: TokenType.StartTagOpen }, + { offset: 1, type: TokenType.StartTag, content: 'script' }, + { offset: 7, type: TokenType.StartTagClose }, + { offset: 8, type: TokenType.Script }, + { offset: 20, type: TokenType.EndTagOpen }, + { offset: 22, type: TokenType.EndTag, content: 'script' }, + { offset: 28, type: TokenType.EndTagClose }, + { offset: 29, type: TokenType.Content }, + { offset: 33, type: TokenType.EndTagOpen }, + { offset: 35, type: TokenType.EndTag, content: 'script' }, + { offset: 41, type: TokenType.EndTagClose } + ] + } ]); }); @@ -416,18 +445,19 @@ suite('HTML Scanner', () => { assertTokens([{ input: '"); ', tokens: [ - { offset:0, type: TokenType.StartTagOpen }, - { offset:1, type: TokenType.StartTag, content: 'script' }, - { offset:7, type: TokenType.StartTagClose }, - { offset:8, type: TokenType.Script }, - { offset:24, type: TokenType.EndTagOpen }, - { offset:26, type: TokenType.EndTag, content: 'script' }, - { offset:32, type: TokenType.EndTagClose }, - { offset:33, type: TokenType.Content }, - { offset:37, type: TokenType.EndTagOpen }, - { offset:39, type: TokenType.EndTag, content: 'script' }, - { offset:45, type: TokenType.EndTagClose } - ]} + { offset: 0, type: TokenType.StartTagOpen }, + { offset: 1, type: TokenType.StartTag, content: 'script' }, + { offset: 7, type: TokenType.StartTagClose }, + { offset: 8, type: TokenType.Script }, + { offset: 24, type: TokenType.EndTagOpen }, + { offset: 26, type: TokenType.EndTag, content: 'script' }, + { offset: 32, type: TokenType.EndTagClose }, + { offset: 33, type: TokenType.Content }, + { offset: 37, type: TokenType.EndTagOpen }, + { offset: 39, type: TokenType.EndTag, content: 'script' }, + { offset: 45, type: TokenType.EndTagClose } + ] + } ]); }); @@ -435,14 +465,15 @@ suite('HTML Scanner', () => { assertTokens([{ input: '', tokens: [ - { offset:0, type: TokenType.StartTagOpen }, - { offset:1, type: TokenType.StartTag, content: 'abc' }, - { offset:4, type: TokenType.Whitespace }, - { offset:5, type: TokenType.AttributeName }, - { offset:8, type: TokenType.DelimiterAssign }, - { offset:9, type: TokenType.AttributeValue }, - { offset:14, type: TokenType.StartTagClose } - ]} + { offset: 0, type: TokenType.StartTagOpen }, + { offset: 1, type: TokenType.StartTag, content: 'abc' }, + { offset: 4, type: TokenType.Whitespace }, + { offset: 5, type: TokenType.AttributeName }, + { offset: 8, type: TokenType.DelimiterAssign }, + { offset: 9, type: TokenType.AttributeValue }, + { offset: 14, type: TokenType.StartTagClose } + ] + } ]); }); @@ -450,14 +481,15 @@ suite('HTML Scanner', () => { assertTokens([{ input: '', tokens: [ - { offset:0, type: TokenType.StartTagOpen }, - { offset:1, type: TokenType.StartTag, content: 'abc' }, - { offset:4, type: TokenType.Whitespace }, - { offset:5, type: TokenType.AttributeName }, - { offset:8, type: TokenType.DelimiterAssign }, - { offset:9, type: TokenType.AttributeValue }, - { offset:14, type: TokenType.StartTagClose } - ]} + { offset: 0, type: TokenType.StartTagOpen }, + { offset: 1, type: TokenType.StartTag, content: 'abc' }, + { offset: 4, type: TokenType.Whitespace }, + { offset: 5, type: TokenType.AttributeName }, + { offset: 8, type: TokenType.DelimiterAssign }, + { offset: 9, type: TokenType.AttributeValue }, + { offset: 14, type: TokenType.StartTagClose } + ] + } ]); }); @@ -465,14 +497,15 @@ suite('HTML Scanner', () => { assertTokens([{ input: '', tokens: [ - { offset:0, type: TokenType.StartTagOpen }, - { offset:1, type: TokenType.StartTag, content: 'abc' }, - { offset:4, type: TokenType.Whitespace }, - { offset:5, type: TokenType.AttributeName }, - { offset:8, type: TokenType.DelimiterAssign }, - { offset:9, type: TokenType.AttributeValue }, - { offset:11, type: TokenType.StartTagClose } - ]} + { offset: 0, type: TokenType.StartTagOpen }, + { offset: 1, type: TokenType.StartTag, content: 'abc' }, + { offset: 4, type: TokenType.Whitespace }, + { offset: 5, type: TokenType.AttributeName }, + { offset: 8, type: TokenType.DelimiterAssign }, + { offset: 9, type: TokenType.AttributeValue }, + { offset: 11, type: TokenType.StartTagClose } + ] + } ]); }); @@ -480,18 +513,19 @@ suite('HTML Scanner', () => { assertTokens([{ input: '', tokens: [ - { offset:0, type: TokenType.StartTagOpen }, - { offset:1, type: TokenType.StartTag, content: 'abc' }, - { offset:4, type: TokenType.Whitespace }, - { offset:5, type: TokenType.AttributeName }, - { offset:8, type: TokenType.DelimiterAssign }, - { offset:9, type: TokenType.AttributeValue }, - { offset:14, type: TokenType.Whitespace }, - { offset:15, type: TokenType.AttributeName }, - { offset:18, type: TokenType.DelimiterAssign }, - { offset:19, type: TokenType.AttributeValue }, - { offset:24, type: TokenType.StartTagClose } - ]} + { offset: 0, type: TokenType.StartTagOpen }, + { offset: 1, type: TokenType.StartTag, content: 'abc' }, + { offset: 4, type: TokenType.Whitespace }, + { offset: 5, type: TokenType.AttributeName }, + { offset: 8, type: TokenType.DelimiterAssign }, + { offset: 9, type: TokenType.AttributeValue }, + { offset: 14, type: TokenType.Whitespace }, + { offset: 15, type: TokenType.AttributeName }, + { offset: 18, type: TokenType.DelimiterAssign }, + { offset: 19, type: TokenType.AttributeValue }, + { offset: 24, type: TokenType.StartTagClose } + ] + } ]); }); @@ -499,18 +533,19 @@ suite('HTML Scanner', () => { assertTokens([{ input: '', tokens: [ - { offset:0, type: TokenType.StartTagOpen }, - { offset:1, type: TokenType.StartTag, content: 'abc' }, - { offset:4, type: TokenType.Whitespace }, - { offset:5, type: TokenType.AttributeName }, - { offset:8, type: TokenType.DelimiterAssign }, - { offset:9, type: TokenType.AttributeValue }, - { offset:12, type: TokenType.Whitespace }, - { offset:13, type: TokenType.AttributeName }, - { offset:16, type: TokenType.DelimiterAssign }, - { offset:17, type: TokenType.AttributeValue }, - { offset:24, type: TokenType.StartTagClose } - ]} + { offset: 0, type: TokenType.StartTagOpen }, + { offset: 1, type: TokenType.StartTag, content: 'abc' }, + { offset: 4, type: TokenType.Whitespace }, + { offset: 5, type: TokenType.AttributeName }, + { offset: 8, type: TokenType.DelimiterAssign }, + { offset: 9, type: TokenType.AttributeValue }, + { offset: 12, type: TokenType.Whitespace }, + { offset: 13, type: TokenType.AttributeName }, + { offset: 16, type: TokenType.DelimiterAssign }, + { offset: 17, type: TokenType.AttributeValue }, + { offset: 24, type: TokenType.StartTagClose } + ] + } ]); }); @@ -518,15 +553,16 @@ suite('HTML Scanner', () => { assertTokens([{ input: '', tokens: [ - { offset:0, type: TokenType.StartTagOpen }, - { offset:1, type: TokenType.StartTag, content: 'abc' }, - { offset:4, type: TokenType.Whitespace }, - { offset:5, type: TokenType.AttributeName }, - { offset:8, type: TokenType.DelimiterAssign }, - { offset:9, type: TokenType.Whitespace }, - { offset:11, type: TokenType.AttributeValue }, - { offset:16, type: TokenType.StartTagClose } - ]} + { offset: 0, type: TokenType.StartTagOpen }, + { offset: 1, type: TokenType.StartTag, content: 'abc' }, + { offset: 4, type: TokenType.Whitespace }, + { offset: 5, type: TokenType.AttributeName }, + { offset: 8, type: TokenType.DelimiterAssign }, + { offset: 9, type: TokenType.Whitespace }, + { offset: 11, type: TokenType.AttributeValue }, + { offset: 16, type: TokenType.StartTagClose } + ] + } ]); }); @@ -534,16 +570,17 @@ suite('HTML Scanner', () => { assertTokens([{ input: '', tokens: [ - { offset:0, type: TokenType.StartTagOpen }, - { offset:1, type: TokenType.StartTag, content: 'abc' }, - { offset:4, type: TokenType.Whitespace }, - { offset:5, type: TokenType.AttributeName }, - { offset:8, type: TokenType.Whitespace }, - { offset:9, type: TokenType.DelimiterAssign }, - { offset:10, type: TokenType.Whitespace }, - { offset:11, type: TokenType.AttributeValue }, - { offset:16, type: TokenType.StartTagClose } - ]} + { offset: 0, type: TokenType.StartTagOpen }, + { offset: 1, type: TokenType.StartTag, content: 'abc' }, + { offset: 4, type: TokenType.Whitespace }, + { offset: 5, type: TokenType.AttributeName }, + { offset: 8, type: TokenType.Whitespace }, + { offset: 9, type: TokenType.DelimiterAssign }, + { offset: 10, type: TokenType.Whitespace }, + { offset: 11, type: TokenType.AttributeValue }, + { offset: 16, type: TokenType.StartTagClose } + ] + } ]); }); @@ -551,12 +588,13 @@ suite('HTML Scanner', () => { assertTokens([{ input: '', tokens: [ - { offset:0, type: TokenType.StartTagOpen }, - { offset:1, type: TokenType.StartTag, content: 'abc' }, - { offset:4, type: TokenType.Whitespace }, - { offset:5, type: TokenType.AttributeName }, - { offset:8, type: TokenType.StartTagClose } - ]} + { offset: 0, type: TokenType.StartTagOpen }, + { offset: 1, type: TokenType.StartTag, content: 'abc' }, + { offset: 4, type: TokenType.Whitespace }, + { offset: 5, type: TokenType.AttributeName }, + { offset: 8, type: TokenType.StartTagClose } + ] + } ]); }); @@ -564,14 +602,15 @@ suite('HTML Scanner', () => { assertTokens([{ input: '', tokens: [ - { offset:0, type: TokenType.StartTagOpen }, - { offset:1, type: TokenType.StartTag, content: 'abc' }, - { offset:4, type: TokenType.Whitespace }, - { offset:5, type: TokenType.AttributeName }, - { offset:8, type: TokenType.Whitespace }, - { offset:9, type: TokenType.AttributeName }, - { offset:12, type: TokenType.StartTagClose } - ]} + { offset: 0, type: TokenType.StartTagOpen }, + { offset: 1, type: TokenType.StartTag, content: 'abc' }, + { offset: 4, type: TokenType.Whitespace }, + { offset: 5, type: TokenType.AttributeName }, + { offset: 8, type: TokenType.Whitespace }, + { offset: 9, type: TokenType.AttributeName }, + { offset: 12, type: TokenType.StartTagClose } + ] + } ]); }); @@ -579,14 +618,15 @@ suite('HTML Scanner', () => { assertTokens([{ input: '', tokens: [ - { offset:0, type: TokenType.StartTagOpen }, - { offset:1, type: TokenType.StartTag, content: 'abc' }, - { offset:4, type: TokenType.Whitespace }, - { offset:5, type: TokenType.AttributeName }, - { offset:11, type: TokenType.DelimiterAssign }, - { offset:12, type: TokenType.AttributeValue }, - { offset:17, type: TokenType.StartTagClose } - ]} + { offset: 0, type: TokenType.StartTagOpen }, + { offset: 1, type: TokenType.StartTag, content: 'abc' }, + { offset: 4, type: TokenType.Whitespace }, + { offset: 5, type: TokenType.AttributeName }, + { offset: 11, type: TokenType.DelimiterAssign }, + { offset: 12, type: TokenType.AttributeValue }, + { offset: 17, type: TokenType.StartTagClose } + ] + } ]); }); @@ -594,24 +634,25 @@ suite('HTML Scanner', () => { assertTokens([{ input: '', tokens: [ - { offset:0, type: TokenType.StartTagOpen }, - { offset:1, type: TokenType.StartTag, content: 'abc' }, - { offset:4, type: TokenType.Whitespace }, - { offset:5, type: TokenType.AttributeName }, - { offset:13, type: TokenType.Whitespace }, - { offset:14, type: TokenType.AttributeName }, - { offset:21, type: TokenType.DelimiterAssign }, - { offset:22, type: TokenType.AttributeValue }, - { offset:27, type: TokenType.Whitespace }, - { offset:28, type: TokenType.AttributeName }, - { offset:35, type: TokenType.DelimiterAssign }, - { offset:36, type: TokenType.AttributeValue }, - { offset:50, type: TokenType.Whitespace }, - { offset:51, type: TokenType.AttributeName }, - { offset:56, type: TokenType.DelimiterAssign }, - { offset:57, type: TokenType.AttributeValue }, - { offset:72, type: TokenType.StartTagClose } - ]} + { offset: 0, type: TokenType.StartTagOpen }, + { offset: 1, type: TokenType.StartTag, content: 'abc' }, + { offset: 4, type: TokenType.Whitespace }, + { offset: 5, type: TokenType.AttributeName }, + { offset: 13, type: TokenType.Whitespace }, + { offset: 14, type: TokenType.AttributeName }, + { offset: 21, type: TokenType.DelimiterAssign }, + { offset: 22, type: TokenType.AttributeValue }, + { offset: 27, type: TokenType.Whitespace }, + { offset: 28, type: TokenType.AttributeName }, + { offset: 35, type: TokenType.DelimiterAssign }, + { offset: 36, type: TokenType.AttributeValue }, + { offset: 50, type: TokenType.Whitespace }, + { offset: 51, type: TokenType.AttributeName }, + { offset: 56, type: TokenType.DelimiterAssign }, + { offset: 57, type: TokenType.AttributeValue }, + { offset: 72, type: TokenType.StartTagClose } + ] + } ]); }); @@ -619,13 +660,14 @@ suite('HTML Scanner', () => { assertTokens([{ input: '', tokens: [ - { offset:0, type: TokenType.StartDoctypeTag }, - { offset:9, type: TokenType.Doctype }, - { offset:23, type: TokenType.EndDoctypeTag } - ]} + { offset: 0, type: TokenType.StartDoctypeTag }, + { offset: 9, type: TokenType.Doctype }, + { offset: 23, type: TokenType.EndDoctypeTag } + ] + } ]); }); }); \ No newline at end of file