mirror of
https://github.com/tenrok/BBob.git
synced 2026-06-11 18:02:26 +03:00
fix(289): contextFreeTags closing tag bug (#290)
* feat: add tests * fix: parsing context free * refactor: code style * chore: add changeset * fix: disable coveralls
This commit is contained in:
@@ -1,14 +1,7 @@
|
||||
import type { NodeContent, TagNodeObject, TagNodeTree, TagPosition } from "@bbob/types";
|
||||
|
||||
import { OPEN_BRAKET, CLOSE_BRAKET, SLASH } from './char.js';
|
||||
import {
|
||||
getUniqAttr,
|
||||
getNodeLength,
|
||||
appendToNode,
|
||||
attrsToString,
|
||||
attrValue,
|
||||
isTagNode,
|
||||
} from './helpers.js';
|
||||
import { CLOSE_BRAKET, OPEN_BRAKET, SLASH } from './char.js';
|
||||
import { appendToNode, attrsToString, attrValue, getNodeLength, getUniqAttr, isTagNode, } from './helpers.js';
|
||||
|
||||
const getTagAttrs = <AttrValue>(tag: string, params: Record<string, AttrValue>) => {
|
||||
const uniqAttr = getUniqAttr(params);
|
||||
@@ -27,19 +20,19 @@ const getTagAttrs = <AttrValue>(tag: string, params: Record<string, AttrValue>)
|
||||
return `${tag}${attrsToString(params)}`;
|
||||
};
|
||||
|
||||
const renderContent = (content: TagNodeTree, openTag: string, closeTag: string) => {
|
||||
const toString = (node: NodeContent) => {
|
||||
if (isTagNode(node)) {
|
||||
return node.toString({ openTag, closeTag });
|
||||
}
|
||||
const toString = (node: NodeContent, openTag: string, closeTag: string) => {
|
||||
if (isTagNode(node)) {
|
||||
return node.toString({ openTag, closeTag });
|
||||
}
|
||||
|
||||
return String(node);
|
||||
};
|
||||
return String(node);
|
||||
};
|
||||
|
||||
const nodeTreeToString = (content: TagNodeTree, openTag: string, closeTag: string) => {
|
||||
if (Array.isArray(content)) {
|
||||
return content.reduce<string>((r, node) => {
|
||||
if (node !== null) {
|
||||
return r + toString(node);
|
||||
return r + toString(node, openTag, closeTag);
|
||||
}
|
||||
|
||||
return r;
|
||||
@@ -47,7 +40,7 @@ const renderContent = (content: TagNodeTree, openTag: string, closeTag: string)
|
||||
}
|
||||
|
||||
if (content) {
|
||||
return toString(content);
|
||||
return toString(content, openTag, closeTag);
|
||||
}
|
||||
|
||||
return null;
|
||||
@@ -60,10 +53,16 @@ export class TagNode<TagValue extends any = any> implements TagNodeObject {
|
||||
public start?: TagPosition;
|
||||
public end?: TagPosition;
|
||||
|
||||
constructor(tag: string | TagValue, attrs: Record<string, unknown>, content: TagNodeTree) {
|
||||
this.tag = tag;
|
||||
constructor(tag: string | TagValue, attrs: Record<string, unknown>, content: TagNodeTree, start?: TagPosition, end?: TagPosition) {
|
||||
this.tag = tag
|
||||
this.attrs = attrs;
|
||||
this.content = content;
|
||||
this.start = start;
|
||||
this.end = end;
|
||||
}
|
||||
|
||||
get length(): number {
|
||||
return getNodeLength(this);
|
||||
}
|
||||
|
||||
attr(name: string, value?: unknown) {
|
||||
@@ -86,10 +85,6 @@ export class TagNode<TagValue extends any = any> implements TagNodeObject {
|
||||
this.end = value;
|
||||
}
|
||||
|
||||
get length(): number {
|
||||
return getNodeLength(this);
|
||||
}
|
||||
|
||||
toTagStart({ openTag = OPEN_BRAKET, closeTag = CLOSE_BRAKET } = {}) {
|
||||
const tagAttrs = getTagAttrs(String(this.tag), this.attrs);
|
||||
|
||||
@@ -101,18 +96,11 @@ export class TagNode<TagValue extends any = any> implements TagNodeObject {
|
||||
}
|
||||
|
||||
toTagNode() {
|
||||
const newNode = new TagNode(String(this.tag).toLowerCase(), this.attrs, this.content);
|
||||
if (this.start) {
|
||||
newNode.setStart(this.start);
|
||||
}
|
||||
if (this.end) {
|
||||
newNode.setEnd(this.end);
|
||||
}
|
||||
return newNode;
|
||||
return new TagNode(this.tag, this.attrs, this.content, this.start, this.end);
|
||||
}
|
||||
|
||||
toString({ openTag = OPEN_BRAKET, closeTag = CLOSE_BRAKET } = {}): string {
|
||||
const content = this.content ? renderContent(this.content, openTag, closeTag) : '';
|
||||
const content = this.content ? nodeTreeToString(this.content, openTag, closeTag) : '';
|
||||
const tagStart = this.toTagStart({ openTag, closeTag });
|
||||
|
||||
if (this.content === null || Array.isArray(this.content) && this.content.length === 0) {
|
||||
@@ -122,12 +110,18 @@ export class TagNode<TagValue extends any = any> implements TagNodeObject {
|
||||
return `${tagStart}${content}${this.toTagEnd({ openTag, closeTag })}`;
|
||||
}
|
||||
|
||||
toJSON() {
|
||||
return {
|
||||
tag: this.tag,
|
||||
attrs: this.attrs,
|
||||
content: this.content,
|
||||
start: this.start,
|
||||
end: this.end,
|
||||
};
|
||||
}
|
||||
|
||||
static create(tag: string, attrs: Record<string, unknown> = {}, content: TagNodeTree = null, start?: TagPosition) {
|
||||
const node = new TagNode(tag, attrs, content);
|
||||
if (start) {
|
||||
node.setStart(start);
|
||||
}
|
||||
return node;
|
||||
return new TagNode(tag, attrs, content, start);
|
||||
}
|
||||
|
||||
static isOf(node: TagNode, type: string) {
|
||||
|
||||
Reference in New Issue
Block a user