Type correction to allow documentFragment to be children of span. (#1247)

* Type correction to allow documentFragment to be children of span.

This is necessary because documentFragments are put in spans in some cases --
e.g. src/functions/sqrt.js. Not sure why this wasn't caught by the type system.
It's possible that it might be happening in buildHTML as well -- it is not yet
been typed and thus violations of the existing types haven't yet had a change to
be caught.
This commit is contained in:
Ashish Myles
2018-04-06 00:20:51 -04:00
committed by GitHub
parent 0f17ac5080
commit cbfcd57162

View File

@@ -34,7 +34,7 @@ interface VirtualNodeInterface {
toMarkup(): string; toMarkup(): string;
} }
interface HtmlDomInterface extends VirtualNodeInterface { export interface HtmlDomNode extends VirtualNodeInterface {
classes: string[]; classes: string[];
height: number; height: number;
depth: number; depth: number;
@@ -43,13 +43,6 @@ interface HtmlDomInterface extends VirtualNodeInterface {
tryCombine(sibling: HtmlDomNode): boolean; tryCombine(sibling: HtmlDomNode): boolean;
} }
/**
* All `HtmlDomNode`s must implement HtmlDomInterface.
*
* `HtmlDomNode` is not defined as an interface since `documentFragment` also
* has these fields but should not be considered a `HtmlDomNode`.
*/
export type HtmlDomNode = DomSpan | SvgSpan | anchor | symbolNode;
// Span wrapping other DOM nodes. // Span wrapping other DOM nodes.
export type DomSpan = span<HtmlDomNode>; export type DomSpan = span<HtmlDomNode>;
// Span wrapping an SVG node. // Span wrapping an SVG node.
@@ -68,7 +61,7 @@ export type CssStyle = {[name: string]: string};
* otherwise. This typesafety is important when HTML builders access a span's * otherwise. This typesafety is important when HTML builders access a span's
* children. * children.
*/ */
class span<ChildType: VirtualNodeInterface> implements HtmlDomInterface { class span<ChildType: VirtualNodeInterface> implements HtmlDomNode {
classes: string[]; classes: string[];
children: ChildType[]; children: ChildType[];
height: number; height: number;
@@ -200,7 +193,7 @@ class span<ChildType: VirtualNodeInterface> implements HtmlDomInterface {
* a list of children, and an inline style. It also contains information about its * a list of children, and an inline style. It also contains information about its
* height, depth, and maxFontSize. * height, depth, and maxFontSize.
*/ */
class anchor implements HtmlDomInterface { class anchor implements HtmlDomNode {
href: string; href: string;
classes: string[]; classes: string[];
children: HtmlDomNode[]; children: HtmlDomNode[];
@@ -336,19 +329,25 @@ class anchor implements HtmlDomInterface {
* contains children and doesn't have any HTML properties. It also keeps track * contains children and doesn't have any HTML properties. It also keeps track
* of a height, depth, and maxFontSize. * of a height, depth, and maxFontSize.
*/ */
class documentFragment implements VirtualNodeInterface { class documentFragment implements HtmlDomNode {
children: HtmlDomNode[]; children: HtmlDomNode[];
classes: string[]; // Never used; needed for satisfying interface.
height: number; height: number;
depth: number; depth: number;
maxFontSize: number; maxFontSize: number;
constructor(children?: HtmlDomNode[]) { constructor(children?: HtmlDomNode[]) {
this.children = children || []; this.children = children || [];
this.classes = [];
this.height = 0; this.height = 0;
this.depth = 0; this.depth = 0;
this.maxFontSize = 0; this.maxFontSize = 0;
} }
tryCombine(sibling: HtmlDomNode): boolean {
return false;
}
/** /**
* Convert the fragment into a node * Convert the fragment into a node
*/ */
@@ -392,7 +391,7 @@ const iCombinations = {
* to a single text node, or a span with a single text node in it, depending on * to a single text node, or a span with a single text node in it, depending on
* whether it has CSS classes, styles, or needs italic correction. * whether it has CSS classes, styles, or needs italic correction.
*/ */
class symbolNode implements HtmlDomInterface { class symbolNode implements HtmlDomNode {
value: string; value: string;
height: number; height: number;
depth: number; depth: number;