Skip to content

Commit

Permalink
Use handler pattern for OpenElementStack
Browse files Browse the repository at this point in the history
Now that the tokenizer uses this pattern, it only makes sense to adopt it for the open element stack as well.
  • Loading branch information
fb55 committed Feb 27, 2022
1 parent 4c19be2 commit 01f1511
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 21 deletions.
15 changes: 5 additions & 10 deletions packages/parse5/lib/parser/index.ts
@@ -1,5 +1,5 @@
import { TokenHandler, Tokenizer, TokenizerMode } from '../tokenizer/index.js';
import { OpenElementStack } from './open-element-stack.js';
import { OpenElementStack, StackHandler } from './open-element-stack.js';
import { FormattingElementList, ElementEntry, EntryType } from './formatting-element-list.js';
import * as defaultTreeAdapter from '../tree-adapters/default.js';
import * as doctype from '../common/doctype.js';
Expand Down Expand Up @@ -119,7 +119,7 @@ const defaultParserOptions = {
};

//Parser
export class Parser<T extends TreeAdapterTypeMap> implements TokenHandler {
export class Parser<T extends TreeAdapterTypeMap> implements TokenHandler, StackHandler<T> {
treeAdapter: TreeAdapter<T>;
onParseError: ParserErrorHandler | null;
private currentToken: Token | null = null;
Expand Down Expand Up @@ -152,12 +152,7 @@ export class Parser<T extends TreeAdapterTypeMap> implements TokenHandler {
this.fragmentContextID = fragmentContext ? getTagID(this.treeAdapter.getTagName(fragmentContext)) : $.UNKNOWN;
this._setContextModes(fragmentContext ?? this.document, this.fragmentContextID);

this.openElements = new OpenElementStack(
this.document,
this.treeAdapter,
this.onItemPush.bind(this),
this.onItemPop.bind(this)
);
this.openElements = new OpenElementStack(this.document, this.treeAdapter, this);
}

// API
Expand Down Expand Up @@ -289,12 +284,12 @@ export class Parser<T extends TreeAdapterTypeMap> implements TokenHandler {
}

//Text parsing
private onItemPush(node: T['parentNode'], tid: number, isTop: boolean): void {
onItemPush(node: T['parentNode'], tid: number, isTop: boolean): void {
this.treeAdapter.onItemPush?.(node);
if (isTop && this.openElements.stackTop > 0) this._setContextModes(node, tid);
}

private onItemPop(node: T['parentNode'], isTop: boolean): void {
onItemPop(node: T['parentNode'], isTop: boolean): void {
if (this.options.sourceCodeLocationInfo) {
this._setEndLocation(node, this.currentToken!);
}
Expand Down
22 changes: 11 additions & 11 deletions packages/parse5/lib/parser/open-element-stack.ts
Expand Up @@ -41,6 +41,11 @@ const TABLE_BODY_CONTEXT = [$.TBODY, $.TFOOT, $.THEAD, $.TEMPLATE, $.HTML];
const TABLE_CONTEXT = [$.TABLE, $.TEMPLATE, $.HTML];
const TABLE_CELLS = [$.TD, $.TH];

export interface StackHandler<T extends TreeAdapterTypeMap> {
onItemPush: (node: T['parentNode'], tid: number, isTop: boolean) => void;
onItemPop: (node: T['parentNode'], isTop: boolean) => void;
}

//Stack of open elements
export class OpenElementStack<T extends TreeAdapterTypeMap> {
items: T['parentNode'][] = [];
Expand All @@ -55,12 +60,7 @@ export class OpenElementStack<T extends TreeAdapterTypeMap> {
return this._isInTemplate() ? this.treeAdapter.getTemplateContent(this.current) : this.current;
}

constructor(
document: T['document'],
private treeAdapter: TreeAdapter<T>,
private onItemPush: (node: T['parentNode'], tid: number, isTop: boolean) => void,
private onItemPop: (node: T['parentNode'], isTop: boolean) => void
) {
constructor(document: T['document'], private treeAdapter: TreeAdapter<T>, private handler: StackHandler<T>) {
this.current = document;
}

Expand Down Expand Up @@ -92,7 +92,7 @@ export class OpenElementStack<T extends TreeAdapterTypeMap> {
this.tmplCount++;
}

this.onItemPush(element, tagID, true);
this.handler.onItemPush(element, tagID, true);
}

pop(): void {
Expand All @@ -104,7 +104,7 @@ export class OpenElementStack<T extends TreeAdapterTypeMap> {
this.stackTop--;
this._updateCurrentElement();

this.onItemPop(popped, true);
this.handler.onItemPop(popped, true);
}

replace(oldElement: T['element'], newElement: T['element']): void {
Expand All @@ -128,7 +128,7 @@ export class OpenElementStack<T extends TreeAdapterTypeMap> {
this._updateCurrentElement();
}

this.onItemPush(this.current, this.currentTagId, insertionIdx === this.stackTop);
this.handler.onItemPush(this.current, this.currentTagId, insertionIdx === this.stackTop);
}

popUntilTagNamePopped(tagName: $): void {
Expand All @@ -152,7 +152,7 @@ export class OpenElementStack<T extends TreeAdapterTypeMap> {
this.stackTop--;
this._updateCurrentElement();

this.onItemPop(popped, this.stackTop < idx);
this.handler.onItemPop(popped, this.stackTop < idx);
}
}

Expand Down Expand Up @@ -218,7 +218,7 @@ export class OpenElementStack<T extends TreeAdapterTypeMap> {
this.tagIDs.splice(idx, 1);
this.stackTop--;
this._updateCurrentElement();
this.onItemPop(element, false);
this.handler.onItemPop(element, false);
}
}
}
Expand Down

0 comments on commit 01f1511

Please sign in to comment.