diff --git a/lib/block/base/content.ts b/lib/block/base/content.ts index 4199275..54b8d3f 100644 --- a/lib/block/base/content.ts +++ b/lib/block/base/content.ts @@ -22,7 +22,7 @@ class Content extends TreeNode { public _text: string; public isComposed: boolean; - static blockName = 'content'; + static override blockName = 'content'; get hasSelection() { return !!this.getCursor(); @@ -197,7 +197,7 @@ class Content extends TreeNode { } } - createDomNode() { + override createDomNode() { super.createDomNode(); this.update(); } @@ -537,7 +537,7 @@ class Content extends TreeNode { return commonAncestors; } - remove(source = 'user') { + override remove(source = 'user') { super.remove(source); return this; diff --git a/lib/block/base/format.ts b/lib/block/base/format.ts index f2cdef7..82969eb 100644 --- a/lib/block/base/format.ts +++ b/lib/block/base/format.ts @@ -211,7 +211,7 @@ const checkTokenIsInlineFormat = (token: Token) => { }; class Format extends Content { - static blockName = 'format'; + static override blockName = 'format'; private _checkCursorInTokenType( text: string, @@ -325,7 +325,7 @@ class Format extends Content { return false; } - blurHandler() { + override blurHandler() { super.blurHandler(); const needRender = this.checkNeedRender(); if (needRender) { @@ -450,7 +450,7 @@ class Format extends Content { eventCenter.emit('muya-image-toolbar', { reference: null }); } - clickHandler(event: Event): void { + override clickHandler(event: Event): void { if (!isMouseEvent(event)) { return; } @@ -506,7 +506,7 @@ class Format extends Content { }); } - keyupHandler(): void { + override keyupHandler(): void { if (this.isComposed) { return; } @@ -561,7 +561,7 @@ class Format extends Content { } } - inputHandler(event: Event): void { + override inputHandler(event: Event): void { // Do not use `isInputEvent` util, because compositionEnd event also invoke this method. if ( this.isComposed || @@ -1237,7 +1237,7 @@ class Format extends Content { } } - backspaceHandler(event: Event): void { + override backspaceHandler(event: Event): void { const { start, end } = this.getCursor() ?? {}; // Let input handler to handle this case. if (!start || !end || start?.offset !== end?.offset) { @@ -1317,7 +1317,7 @@ class Format extends Content { } } - deleteHandler(event: KeyboardEvent): void { + override deleteHandler(event: KeyboardEvent): void { const { start, end } = this.getCursor()!; const { text } = this; // Let input handler to handle this case. @@ -1358,7 +1358,7 @@ class Format extends Content { this.setCursor(start.offset + 1, end.offset + 1, true); } - enterHandler(event: KeyboardEvent): void { + override enterHandler(event: KeyboardEvent): void { event.preventDefault(); const { text: oldText, muya, parent } = this; const { start, end } = this.getCursor()!; diff --git a/lib/block/base/linkedList/linkedList.ts b/lib/block/base/linkedList/linkedList.ts index fd30c79..d32fc8e 100644 --- a/lib/block/base/linkedList/linkedList.ts +++ b/lib/block/base/linkedList/linkedList.ts @@ -1,17 +1,20 @@ -import LinkedNode from './linkedNode'; +import { Nullable } from '@muya/types'; +import type { LinkedNode } from './linkedNode'; -class LinkedList> { - public head: T | null = null; - public tail: T | null = null; - public length: number = 0; +class LinkedList { + head: Nullable = null; - *iterator(curNode: T | null = this.head, length = this.length) { + tail: Nullable = null; + + length: number = 0; + + *iterator(curNode = this.head, length = this.length) { let count = 0; while (count < length && curNode) { yield curNode; count++; - curNode = curNode.next; + curNode = curNode.next as T; } } @@ -74,11 +77,11 @@ class LinkedList> { } if (this.head === node) { - this.head = node.next; + this.head = node.next as T; } if (this.tail === node) { - this.tail = node.prev; + this.tail = node.prev as T; } this.length -= 1; } @@ -95,7 +98,11 @@ class LinkedList> { return [...this.iterator()].forEach(callback); } - forEachAt(index: number, length: number = this.length, callback: (cur: T, i: number) => void) { + forEachAt( + index: number, + length: number = this.length, + callback: (cur: T, i: number) => void + ) { const curNode = this.find(index); return [...this.iterator(curNode, length)].forEach((node, i) => { diff --git a/lib/block/base/linkedList/linkedNode.ts b/lib/block/base/linkedList/linkedNode.ts index 05aab73..be32fde 100644 --- a/lib/block/base/linkedList/linkedNode.ts +++ b/lib/block/base/linkedList/linkedNode.ts @@ -1,8 +1,7 @@ import { Nullable } from '@muya/types'; -class LinkedNode { - public prev: Nullable = null; - public next: Nullable = null; -} +export interface LinkedNode { + prev: Nullable; -export default LinkedNode; + next: Nullable; +} diff --git a/lib/block/base/parent.ts b/lib/block/base/parent.ts index 953149f..43961e6 100644 --- a/lib/block/base/parent.ts +++ b/lib/block/base/parent.ts @@ -11,10 +11,13 @@ const debug = logger('parent:'); class Parent extends TreeNode { // Used to store icon, checkbox(span) etc. these blocks are not in children properties in json state. - public attachments: LinkedList = new LinkedList(); - public children: LinkedList = new LinkedList(); - public prev: Nullable = null; - public next: Nullable = null; + attachments: LinkedList = new LinkedList(); + + children: LinkedList = new LinkedList(); + + override prev: Nullable = null; + + override next: Nullable = null; private _active: boolean = false; @@ -209,7 +212,7 @@ class Parent extends TreeNode { return newNode; } - remove(source = 'user') { + override remove(source = 'user') { if (source === 'user') { // dispatch json1 operation const path = this.getJsonPath(); diff --git a/lib/block/base/treeNode.ts b/lib/block/base/treeNode.ts index 02b78de..108a4b6 100644 --- a/lib/block/base/treeNode.ts +++ b/lib/block/base/treeNode.ts @@ -1,4 +1,3 @@ -import LinkedNode from '@muya/block/base/linkedList/linkedNode'; import { BLOCK_DOM_PROPERTY } from '@muya/config'; import Muya from '@muya/index'; import type { TState } from '@muya/state/types'; @@ -6,6 +5,7 @@ import { Nullable } from '@muya/types'; import { createDomNode } from '@muya/utils/dom'; import type { Attributes, Datasets } from '@muya/utils/types'; import Content from './content'; +import type { LinkedNode } from './linkedList/linkedNode'; import Parent from './parent'; interface IConstructor { @@ -14,18 +14,22 @@ interface IConstructor { new (muya: Muya): T; } -class TreeNode extends LinkedNode { - public parent: Nullable = null; +class TreeNode implements LinkedNode { + prev: Nullable = null; - public domNode: Nullable = null; + next: Nullable = null; - public tagName: string = ''; + parent: Nullable = null; - public classList: string[] = []; + domNode: Nullable = null; - public attributes: Attributes = {}; + tagName: string = ''; - public datasets: Datasets = {}; + classList: string[] = []; + + attributes: Attributes = {}; + + datasets: Datasets = {}; static blockName = 'tree.node'; @@ -53,8 +57,8 @@ class TreeNode extends LinkedNode { return this.parent ? this.parent.isScrollPage : false; } - get outMostBlock(): this | Parent | null { - let node = this.isContent() ? this.parent : this; + get outMostBlock(): Nullable { + let node = this.isContent() ? this.parent : this as unknown as Parent; while (node) { if (node.isOutMostBlock) { @@ -66,27 +70,25 @@ class TreeNode extends LinkedNode { return null; } - constructor(public muya: Muya) { - super(); - } + constructor(public muya: Muya) {} - /** + /** * check this is a Content block? * @param this * @returns boolean */ - isContent(this: TreeNode): this is Content { - return 'text' in this; - } - - /** - * check this is a Parent block? - * @param this - * @returns boolean - */ - isParent(this: unknown): this is Parent { - return this instanceof Parent; - } + isContent(this: TreeNode): this is Content { + return 'text' in this; + } + + /** + * check this is a Parent block? + * @param this + * @returns boolean + */ + isParent(this: unknown): this is Parent { + return this instanceof Parent; + } /** * create domNode diff --git a/lib/block/commonMark/atxHeading/index.ts b/lib/block/commonMark/atxHeading/index.ts index 6f7da9f..51a2d31 100644 --- a/lib/block/commonMark/atxHeading/index.ts +++ b/lib/block/commonMark/atxHeading/index.ts @@ -11,7 +11,7 @@ import { IAtxHeadingState } from '../../../state/types'; class AtxHeading extends Parent { public meta: IAtxHeadingState['meta']; - static blockName = 'atx-heading'; + static override blockName = 'atx-heading'; static create(muya: Muya, state: IAtxHeadingState) { const heading = new AtxHeading(muya, state); @@ -23,7 +23,7 @@ class AtxHeading extends Parent { return heading; } - get path(): TBlockPath { + override get path(): TBlockPath { const { path: pPath } = this.parent!; const offset = this.parent!.offset(this); @@ -38,7 +38,7 @@ class AtxHeading extends Parent { this.createDomNode(); } - getState(): IAtxHeadingState { + override getState(): IAtxHeadingState { return { name: 'atx-heading', meta: this.meta, diff --git a/lib/block/commonMark/blockQuote/index.ts b/lib/block/commonMark/blockQuote/index.ts index e234d8e..9bd0cf0 100644 --- a/lib/block/commonMark/blockQuote/index.ts +++ b/lib/block/commonMark/blockQuote/index.ts @@ -7,7 +7,7 @@ import { IBlockQuoteState } from '../../../state/types'; @mixins(ContainerQueryBlock) class BlockQuote extends Parent { - static blockName = 'block-quote'; + static override blockName = 'block-quote'; static create(muya: Muya, state: IBlockQuoteState) { const blockQuote = new BlockQuote(muya); @@ -19,7 +19,7 @@ class BlockQuote extends Parent { return blockQuote; } - get path() { + override get path() { const { path: pPath } = this.parent!; const offset = this.parent!.offset(this); @@ -33,7 +33,7 @@ class BlockQuote extends Parent { this.createDomNode(); } - getState(): IBlockQuoteState { + override getState(): IBlockQuoteState { const state: IBlockQuoteState = { name: 'block-quote', children: this.children.map((child) => (child as Parent).getState()), diff --git a/lib/block/commonMark/bulletList/index.ts b/lib/block/commonMark/bulletList/index.ts index 48acd56..910894b 100644 --- a/lib/block/commonMark/bulletList/index.ts +++ b/lib/block/commonMark/bulletList/index.ts @@ -8,9 +8,9 @@ import { mixins } from '@muya/utils'; @mixins(ContainerQueryBlock) class BulletList extends Parent { - public children: LinkedList = new LinkedList(); + public override children: LinkedList = new LinkedList(); - static blockName = 'bullet-list'; + static override blockName = 'bullet-list'; static create(muya: Muya, state: IBulletListState) { const bulletList = new BulletList(muya, state); @@ -24,7 +24,7 @@ class BulletList extends Parent { return bulletList; } - get path() { + override get path() { const { path: pPath } = this.parent!; const offset = this.parent!.offset(this); @@ -47,7 +47,7 @@ class BulletList extends Parent { this.createDomNode(); } - getState(): IBulletListState { + override getState(): IBulletListState { const state: IBulletListState = { name: 'bullet-list', meta: { ...this.meta }, diff --git a/lib/block/commonMark/codeBlock/code.ts b/lib/block/commonMark/codeBlock/code.ts index 928a35d..8dc7030 100644 --- a/lib/block/commonMark/codeBlock/code.ts +++ b/lib/block/commonMark/codeBlock/code.ts @@ -40,9 +40,9 @@ const renderCopyButton = (i18n: I18n) => { }; class Code extends Parent { - public parent: Nullable = null; + public override parent: Nullable = null; - static blockName = 'code'; + static override blockName = 'code'; static create(muya: Muya, state: ICodeBlockState) { const code = new Code(muya); @@ -52,7 +52,7 @@ class Code extends Parent { return code; } - get path() { + override get path() { const { path: pPath } = this.parent!; return [...pPath]; @@ -67,7 +67,7 @@ class Code extends Parent { this.listen(); } - getState(): TState { + override getState(): TState { debug.warn('You can never call `getState` in code'); return {} as TState; } diff --git a/lib/block/commonMark/codeBlock/index.ts b/lib/block/commonMark/codeBlock/index.ts index a626a14..f990e7f 100644 --- a/lib/block/commonMark/codeBlock/index.ts +++ b/lib/block/commonMark/codeBlock/index.ts @@ -13,7 +13,7 @@ const debug = logger('codeblock:'); class CodeBlock extends Parent { public meta: ICodeBlockState['meta']; - static blockName = 'code-block'; + static override blockName = 'code-block'; static create(muya: Muya, state: ICodeBlockState) { const codeBlock = new CodeBlock(muya, state); @@ -76,7 +76,7 @@ class CodeBlock extends Parent { }); } - get path(): TBlockPath { + override get path(): TBlockPath { const { path: pPath } = this.parent!; const offset = this.parent!.offset(this); @@ -105,7 +105,7 @@ class CodeBlock extends Parent { } } - getState(): ICodeBlockState { + override getState(): ICodeBlockState { const state: ICodeBlockState = { name: 'code-block', meta: { ...this.meta }, diff --git a/lib/block/commonMark/html/htmlContainer.ts b/lib/block/commonMark/html/htmlContainer.ts index eea5788..6b750fa 100644 --- a/lib/block/commonMark/html/htmlContainer.ts +++ b/lib/block/commonMark/html/htmlContainer.ts @@ -7,7 +7,7 @@ import { IHtmlBlockState, TState } from '../../../state/types'; const debug = logger('htmlContainer:'); class HTMLContainer extends Parent { - static blockName = 'html-container'; + static override blockName = 'html-container'; static create(muya: Muya, state: IHtmlBlockState) { const htmlContainer = new HTMLContainer(muya); @@ -23,7 +23,7 @@ class HTMLContainer extends Parent { return 'markup'; } - get path() { + override get path() { const { path: pPath } = this.parent!; return [...pPath]; @@ -36,7 +36,7 @@ class HTMLContainer extends Parent { this.createDomNode(); } - getState(): TState { + override getState(): TState { debug.warn('You can never call `getState` in htmlContainer'); return {} as TState; } diff --git a/lib/block/commonMark/html/htmlPreview.ts b/lib/block/commonMark/html/htmlPreview.ts index 2c6d5ac..15cee4a 100644 --- a/lib/block/commonMark/html/htmlPreview.ts +++ b/lib/block/commonMark/html/htmlPreview.ts @@ -11,7 +11,7 @@ const debug = logger('htmlPreview:'); class HTMLPreview extends Parent { public html: string; - static blockName = 'html-preview'; + static override blockName = 'html-preview'; static create(muya: Muya, state: IHtmlBlockState) { const htmlBlock = new HTMLPreview(muya, state); @@ -19,7 +19,7 @@ class HTMLPreview extends Parent { return htmlBlock; } - get path() { + override get path() { debug.warn('You can never call `get path` in htmlPreview'); return []; } @@ -65,7 +65,7 @@ class HTMLPreview extends Parent { } } - getState(): TState { + override getState(): TState { debug.warn('You can never call `getState` in htmlPreview'); return {} as TState; } diff --git a/lib/block/commonMark/html/index.ts b/lib/block/commonMark/html/index.ts index 82d1cd1..99f242f 100644 --- a/lib/block/commonMark/html/index.ts +++ b/lib/block/commonMark/html/index.ts @@ -6,7 +6,7 @@ import Muya from '@muya/index'; import { IHtmlBlockState } from '../../../state/types'; class HTMLBlock extends Parent { - static blockName = 'html-block'; + static override blockName = 'html-block'; static create(muya: Muya, state: IHtmlBlockState) { const htmlBlock = new HTMLBlock(muya); @@ -26,7 +26,7 @@ class HTMLBlock extends Parent { return htmlBlock; } - get path() { + override get path() { const { path: pPath } = this.parent!; const offset = this.parent!.offset(this); @@ -50,7 +50,7 @@ class HTMLBlock extends Parent { : this; } - getState(): IHtmlBlockState { + override getState(): IHtmlBlockState { const state: IHtmlBlockState = { name: 'html-block', text: this.firstContentInDescendant()?.text ?? '', diff --git a/lib/block/commonMark/listItem/index.ts b/lib/block/commonMark/listItem/index.ts index 368eeee..734c2a7 100644 --- a/lib/block/commonMark/listItem/index.ts +++ b/lib/block/commonMark/listItem/index.ts @@ -8,9 +8,9 @@ import { IListItemState } from '../../../state/types'; @mixins(ContainerQueryBlock) class ListItem extends Parent { - public children: LinkedList = new LinkedList(); + public override children: LinkedList = new LinkedList(); - static blockName = 'list-item'; + static override blockName = 'list-item'; static create(muya: Muya, state: IListItemState) { const listItem = new ListItem(muya); @@ -24,7 +24,7 @@ class ListItem extends Parent { return listItem; } - get path() { + override get path() { const { path: pPath } = this.parent!; const offset = this.parent!.offset(this); @@ -38,7 +38,7 @@ class ListItem extends Parent { this.createDomNode(); } - getState(): IListItemState { + override getState(): IListItemState { const state: IListItemState = { name: 'list-item', children: this.children.map((child) => child.getState()), diff --git a/lib/block/commonMark/orderList/index.ts b/lib/block/commonMark/orderList/index.ts index 4e7a197..8e7245e 100644 --- a/lib/block/commonMark/orderList/index.ts +++ b/lib/block/commonMark/orderList/index.ts @@ -9,10 +9,10 @@ import ListItem from '../listItem'; @mixins(ContainerQueryBlock) class OrderList extends Parent { - public children: LinkedList = new LinkedList(); + public override children: LinkedList = new LinkedList(); public meta: IOrderListState['meta']; - static blockName = 'order-list'; + static override blockName = 'order-list'; static create(muya: Muya, state: IOrderListState) { const orderList = new OrderList(muya, state); @@ -26,7 +26,7 @@ class OrderList extends Parent { return orderList; } - get path() { + override get path() { const { path: pPath } = this.parent!; const offset = this.parent!.offset(this); @@ -46,7 +46,7 @@ class OrderList extends Parent { this.createDomNode(); } - getState(): IOrderListState { + override getState(): IOrderListState { const state: IOrderListState = { name: 'order-list', meta: { ...this.meta }, diff --git a/lib/block/commonMark/paragraph/index.ts b/lib/block/commonMark/paragraph/index.ts index 15a26a2..b96c9c8 100644 --- a/lib/block/commonMark/paragraph/index.ts +++ b/lib/block/commonMark/paragraph/index.ts @@ -8,7 +8,7 @@ import { IParagraphState } from '../../../state/types'; @mixins(LeafQueryBlock) class Paragraph extends Parent { - static blockName = 'paragraph'; + static override blockName = 'paragraph'; static create(muya: Muya, state: IParagraphState) { const paragraph = new Paragraph(muya); @@ -20,7 +20,7 @@ class Paragraph extends Parent { return paragraph; } - get path() { + override get path() { const { path: pPath } = this.parent!; const offset = this.parent!.offset(this); @@ -34,7 +34,7 @@ class Paragraph extends Parent { this.createDomNode(); } - getState(): IParagraphState { + override getState(): IParagraphState { return { name: 'paragraph', text: (this.children.head as ParagraphContent).text, diff --git a/lib/block/commonMark/setextHeading/index.ts b/lib/block/commonMark/setextHeading/index.ts index 1778a97..1db66c1 100644 --- a/lib/block/commonMark/setextHeading/index.ts +++ b/lib/block/commonMark/setextHeading/index.ts @@ -10,7 +10,7 @@ import { ISetextHeadingState } from '../../../state/types'; class SetextHeading extends Parent { public meta: ISetextHeadingState['meta']; - static blockName = 'setext-heading'; + static override blockName = 'setext-heading'; static create(muya: Muya, state: ISetextHeadingState) { const heading = new SetextHeading(muya, state); @@ -22,7 +22,7 @@ class SetextHeading extends Parent { return heading; } - get path() { + override get path() { const { path: pPath } = this.parent!; const offset = this.parent!.offset(this); @@ -37,7 +37,7 @@ class SetextHeading extends Parent { this.createDomNode(); } - getState(): ISetextHeadingState { + override getState(): ISetextHeadingState { return { name: 'setext-heading', meta: this.meta, diff --git a/lib/block/commonMark/thematicBreak/index.ts b/lib/block/commonMark/thematicBreak/index.ts index 427bf55..026bef4 100644 --- a/lib/block/commonMark/thematicBreak/index.ts +++ b/lib/block/commonMark/thematicBreak/index.ts @@ -8,7 +8,7 @@ import { IThematicBreakState } from '../../../state/types'; @mixins(LeafQueryBlock) class ThematicBreak extends Parent { - static blockName = 'thematic-break'; + static override blockName = 'thematic-break'; static create(muya: Muya, state: IThematicBreakState) { const heading = new ThematicBreak(muya); @@ -20,7 +20,7 @@ class ThematicBreak extends Parent { return heading; } - get path() { + override get path() { const { path: pPath } = this.parent!; const offset = this.parent!.offset(this); @@ -34,7 +34,7 @@ class ThematicBreak extends Parent { this.createDomNode(); } - getState(): IThematicBreakState { + override getState(): IThematicBreakState { return { name: 'thematic-break', text: (this.children.head as ThematicBreakContent).text, diff --git a/lib/block/content/atxHeadingContent/index.ts b/lib/block/content/atxHeadingContent/index.ts index 28daee6..86f1a1f 100644 --- a/lib/block/content/atxHeadingContent/index.ts +++ b/lib/block/content/atxHeadingContent/index.ts @@ -5,9 +5,9 @@ import Muya from '@muya/index'; import { Cursor } from '@muya/selection/types'; class AtxHeadingContent extends Format { - public parent: AtxHeading | null = null; + public override parent: AtxHeading | null = null; - static blockName = 'atxheading.content'; + static override blockName = 'atxheading.content'; static create(muya: Muya, text: string) { const content = new AtxHeadingContent(muya, text); @@ -21,15 +21,15 @@ class AtxHeadingContent extends Format { this.createDomNode(); } - getAnchor() { + override getAnchor() { return this.parent; } - update(cursor: Cursor, highlights = []) { + override update(cursor: Cursor, highlights = []) { return this.inlineRenderer.patch(this, cursor, highlights); } - enterHandler(event: Event) { + override enterHandler(event: Event) { const { start, end } = this.getCursor()!; const { level } = this.parent!.meta; @@ -50,7 +50,7 @@ class AtxHeadingContent extends Format { } } - backspaceHandler(event: Event) { + override backspaceHandler(event: Event) { const { start, end } = this.getCursor()!; if (start.offset === 0 && end.offset === 0) { event.preventDefault(); diff --git a/lib/block/content/codeBlockContent/index.ts b/lib/block/content/codeBlockContent/index.ts index 76d546f..431d779 100644 --- a/lib/block/content/codeBlockContent/index.ts +++ b/lib/block/content/codeBlockContent/index.ts @@ -86,9 +86,9 @@ function hasStateMeta( class CodeBlockContent extends Content { public initialLang: string; - public parent: Code | null = null; + public override parent: Code | null = null; - static blockName = 'codeblock.content'; + static override blockName = 'codeblock.content'; static create(muya: Muya, state: CodeContentState) { const content = new CodeBlockContent(muya, state); @@ -132,7 +132,7 @@ class CodeBlockContent extends Content { this.createDomNode(); } - getAnchor() { + override getAnchor() { return this.outContainer; } @@ -143,7 +143,7 @@ class CodeBlockContent extends Content { } } - update(_cursor: Cursor, highlights = []) { + override update(_cursor: Cursor, highlights = []) { const { lang, text } = this; // transform alias to original language const fullLengthLang = transformAliasToOrigin([lang])[0]; @@ -170,7 +170,7 @@ class CodeBlockContent extends Content { } } - inputHandler(event: Event): void { + override inputHandler(event: Event): void { if (this.isComposed) { return; } @@ -198,7 +198,7 @@ class CodeBlockContent extends Content { } } - enterHandler(event: KeyboardEvent): void { + override enterHandler(event: KeyboardEvent): void { event.preventDefault(); // Shift + Enter to jump out of code block. @@ -247,7 +247,7 @@ class CodeBlockContent extends Content { this.setCursor(offset, offset, true); } - tabHandler(event: KeyboardEvent): void { + override tabHandler(event: KeyboardEvent): void { event.preventDefault(); const { start, end } = this.getCursor()!; const { lang, text } = this; @@ -324,7 +324,7 @@ class CodeBlockContent extends Content { } } - backspaceHandler(event: KeyboardEvent): void { + override backspaceHandler(event: KeyboardEvent): void { const { start, end } = this.getCursor()!; // If the cursor is in the first position of the code block text, // when backspace is pressed, this time the code block should be converted to a normal paragraph @@ -392,7 +392,7 @@ class CodeBlockContent extends Content { } } - keyupHandler(): void { + override keyupHandler(): void { if (this.isComposed) { return; } diff --git a/lib/block/content/langInputContent/index.ts b/lib/block/content/langInputContent/index.ts index 99beb2a..00c9992 100644 --- a/lib/block/content/langInputContent/index.ts +++ b/lib/block/content/langInputContent/index.ts @@ -6,9 +6,9 @@ import { ICodeBlockState } from '@muya/state/types'; import { getHighlightHtml } from '@muya/utils/highlightHTML'; class LangInputContent extends Content { - public parent: CodeBlock | null = null; + public override parent: CodeBlock | null = null; - static blockName = 'language-input'; + static override blockName = 'language-input'; static create(muya: Muya, state: ICodeBlockState) { const content = new LangInputContent(muya, state); @@ -23,11 +23,11 @@ class LangInputContent extends Content { this.createDomNode(); } - getAnchor() { + override getAnchor() { return this.parent; } - update(_cursor?: Cursor, highlights = []) { + override update(_cursor?: Cursor, highlights = []) { this.domNode!.innerHTML = getHighlightHtml(this.text, highlights); } @@ -45,13 +45,13 @@ class LangInputContent extends Content { this.muya.eventCenter.emit('content-change', { block: this }); } - inputHandler() { + override inputHandler() { const textContent = this.domNode!.textContent ?? ''; const lang = textContent.split(/\s+/)[0]; this.updateLanguage(lang); } - enterHandler(event: Event) { + override enterHandler(event: Event) { event.preventDefault(); event.stopPropagation(); @@ -59,7 +59,7 @@ class LangInputContent extends Content { parent!.lastContentInDescendant()?.setCursor(0, 0); } - backspaceHandler(event: Event) { + override backspaceHandler(event: Event) { const { start, end } = this.getCursor()!; const { text } = this; // The next if statement is used to fix Firefox compatibility issues diff --git a/lib/block/content/paragraphContent/index.ts b/lib/block/content/paragraphContent/index.ts index 90cf9a4..4a707d0 100644 --- a/lib/block/content/paragraphContent/index.ts +++ b/lib/block/content/paragraphContent/index.ts @@ -63,9 +63,9 @@ const parseTableHeader = (text: string) => { * ParagraphContent */ class ParagraphContent extends Format { - public parent: Nullable = null; + public override parent: Nullable = null; - static blockName = 'paragraph.content'; + static override blockName = 'paragraph.content'; static create(muya: Muya, text: string) { const content = new ParagraphContent(muya, text); @@ -81,11 +81,11 @@ class ParagraphContent extends Format { this.createDomNode(); } - getAnchor() { + override getAnchor() { return this.parent; } - update(cursor?: Cursor, highlights = []) { + override update(cursor?: Cursor, highlights = []) { this.inlineRenderer.patch(this, cursor, highlights); const { label } = this.inlineRenderer.getLabelInfo(this); @@ -94,7 +94,7 @@ class ParagraphContent extends Format { } } - backspaceHandler(event: Event) { + override backspaceHandler(event: Event) { const { start, end } = this.getCursor()!; const { eventCenter } = this.muya; @@ -125,7 +125,7 @@ class ParagraphContent extends Format { } } - inputHandler(event: Event) { + override inputHandler(event: Event) { super.inputHandler(event); const { eventCenter } = this.muya; @@ -388,7 +388,7 @@ class ParagraphContent extends Format { } } - enterHandler(event: Event) { + override enterHandler(event: Event) { if (!isKeyboardEvent(event)) { return; } @@ -679,7 +679,7 @@ class ParagraphContent extends Format { cursorBlock.setCursor(start.offset, end.offset, true); } - insertTab() { + override insertTab() { const { muya, text } = this; const { tabSize } = muya.options; const tabCharacter = String.fromCharCode(160).repeat(tabSize); @@ -823,7 +823,7 @@ class ParagraphContent extends Format { return result; } - tabHandler(event: Event) { + override tabHandler(event: Event) { // disable tab focus event.preventDefault(); diff --git a/lib/block/content/setextHeadingContent/index.ts b/lib/block/content/setextHeadingContent/index.ts index 6ebc0c2..381891b 100644 --- a/lib/block/content/setextHeadingContent/index.ts +++ b/lib/block/content/setextHeadingContent/index.ts @@ -5,7 +5,7 @@ import { Cursor } from '@muya/selection/types'; import { isKeyboardEvent } from '@muya/utils'; class SetextHeadingContent extends Format { - static blockName = 'setextheading.content'; + static override blockName = 'setextheading.content'; static create(muya: Muya, text: string) { const content = new SetextHeadingContent(muya, text); @@ -19,15 +19,15 @@ class SetextHeadingContent extends Format { this.createDomNode(); } - getAnchor() { + override getAnchor() { return this.parent; } - update(cursor: Cursor, highlights = []) { + override update(cursor: Cursor, highlights = []) { return this.inlineRenderer.patch(this, cursor, highlights); } - enterHandler(event: Event) { + override enterHandler(event: Event) { if(!isKeyboardEvent(event)) { return; } @@ -68,7 +68,7 @@ class SetextHeadingContent extends Format { } } - backspaceHandler(event: Event) { + override backspaceHandler(event: Event) { const { start, end } = this.getCursor()!; if (start.offset === 0 && end.offset === 0) { this.convertToParagraph(true); diff --git a/lib/block/content/tableCell/index.ts b/lib/block/content/tableCell/index.ts index 9282913..47e8005 100644 --- a/lib/block/content/tableCell/index.ts +++ b/lib/block/content/tableCell/index.ts @@ -12,7 +12,7 @@ import { isKeyboardEvent } from '@muya/utils'; class TableCellContent extends Format { public hasZeroWidthSpaceAtBeginning: boolean = false; - static blockName = 'table.cell.content'; + static override blockName = 'table.cell.content'; static create(muya: Muya, text: string) { const content = new TableCellContent(muya, text); @@ -42,11 +42,11 @@ class TableCellContent extends Format { this.createDomNode(); } - getAnchor() { + override getAnchor() { return this.table; } - update(cursor: Cursor, highlights = []) { + override update(cursor: Cursor, highlights = []) { return this.inlineRenderer.patch(this, cursor, highlights); } @@ -118,7 +118,7 @@ class TableCellContent extends Format { cursorBlock.setCursor(0, 0, true); } - enterHandler(event: Event) { + override enterHandler(event: Event) { if (!isKeyboardEvent(event)) { return; } @@ -131,7 +131,7 @@ class TableCellContent extends Format { } } - arrowHandler(event: Event) { + override arrowHandler(event: Event) { if (!isKeyboardEvent(event)) { return; } @@ -195,7 +195,7 @@ class TableCellContent extends Format { } } - backspaceHandler(event: Event) { + override backspaceHandler(event: Event) { const { start, end } = this.getCursor()!; const previousContentBlock = this.previousContentInContext(); @@ -209,7 +209,7 @@ class TableCellContent extends Format { if ( !previousContentBlock || (previousContentBlock.blockName !== 'table.cell.content' && - this.table.isEmpty) + this.table.isEmpty()) ) { const state = { name: 'paragraph', @@ -227,7 +227,7 @@ class TableCellContent extends Format { } } - tabHandler(event: Event) { + override tabHandler(event: Event) { event.preventDefault(); event.stopPropagation(); @@ -243,7 +243,7 @@ class TableCellContent extends Format { // the table to be messed up, so we insert a zero-width // character before entering the Chinese, and remove the // zero-width character after entering the Chinese. - composeHandler(event: Event) { + override composeHandler(event: Event) { super.composeHandler(event); if (event.type === 'compositionstart' && this.text === '') { this.hasZeroWidthSpaceAtBeginning = true; diff --git a/lib/block/content/thematicBreakContent/index.ts b/lib/block/content/thematicBreakContent/index.ts index 38c8de3..e834975 100644 --- a/lib/block/content/thematicBreakContent/index.ts +++ b/lib/block/content/thematicBreakContent/index.ts @@ -4,7 +4,7 @@ import Muya from '@muya/index'; import { Cursor } from '@muya/selection/types'; class ThematicBreakContent extends Format { - static blockName = 'thematicbreak.content'; + static override blockName = 'thematicbreak.content'; static create(muya: Muya, text: string) { const content = new ThematicBreakContent(muya, text); @@ -18,11 +18,11 @@ class ThematicBreakContent extends Format { this.createDomNode(); } - getAnchor() { + override getAnchor() { return this.parent; } - update(cursor: Cursor, highlights = []) { + override update(cursor: Cursor, highlights = []) { return this.inlineRenderer.patch(this, cursor, highlights); } @@ -30,7 +30,7 @@ class ThematicBreakContent extends Format { * Create an empty paragraph bellow. * @param {*} event */ - enterHandler(event: Event) { + override enterHandler(event: Event) { const { text, muya } = this; const { start, end } = this.getCursor()!; if (start.offset === end.offset && start.offset === 0) { @@ -51,7 +51,7 @@ class ThematicBreakContent extends Format { } } - backspaceHandler(event: Event) { + override backspaceHandler(event: Event) { const { start, end } = this.getCursor()!; if (start.offset === 0 && end.offset === 0) { // Remove the text content and convert it to paragraph diff --git a/lib/block/extra/diagram/diagramContainer.ts b/lib/block/extra/diagram/diagramContainer.ts index 48c861b..a995c0f 100644 --- a/lib/block/extra/diagram/diagramContainer.ts +++ b/lib/block/extra/diagram/diagramContainer.ts @@ -8,7 +8,7 @@ const debug = logger('diagramContainer:'); class DiagramContainer extends Parent { public meta: IDiagramMeta; - static blockName = 'diagram-container'; + static override blockName = 'diagram-container'; static create(muya: Muya, state: IDiagramState) { const diagramContainer = new DiagramContainer(muya, state); @@ -24,7 +24,7 @@ class DiagramContainer extends Parent { return this.meta.lang; } - get path() { + override get path() { const { path: pPath } = this.parent!; return [...pPath]; @@ -38,7 +38,7 @@ class DiagramContainer extends Parent { this.createDomNode(); } - getState(): TState { + override getState(): TState { debug.warn('You can never call `getState` in diagramContainer'); return {} as TState; } diff --git a/lib/block/extra/diagram/diagramPreview.ts b/lib/block/extra/diagram/diagramPreview.ts index b2c243a..bf76c5a 100644 --- a/lib/block/extra/diagram/diagramPreview.ts +++ b/lib/block/extra/diagram/diagramPreview.ts @@ -58,7 +58,7 @@ const renderDiagram = async ({ class DiagramPreview extends Parent { public code: string; public type: string; - static blockName = 'diagram-preview'; + static override blockName = 'diagram-preview'; static create(muya: Muya, state: IDiagramState) { const diagramPreview = new DiagramPreview(muya, state); @@ -66,7 +66,7 @@ class DiagramPreview extends Parent { return diagramPreview; } - get path() { + override get path() { debug.warn('You can never call `get path` in diagramPreview'); return []; } @@ -86,7 +86,7 @@ class DiagramPreview extends Parent { this.update(); } - getState(): TState { + override getState(): TState { debug.warn('You can never call `getState` in diagramPreview'); return {} as TState; } diff --git a/lib/block/extra/diagram/index.ts b/lib/block/extra/diagram/index.ts index 16df097..3a2637b 100644 --- a/lib/block/extra/diagram/index.ts +++ b/lib/block/extra/diagram/index.ts @@ -10,7 +10,7 @@ const debug = logger('diagram:'); class DiagramBlock extends Parent { public meta: IDiagramMeta; - static blockName = 'diagram'; + static override blockName = 'diagram'; static create(muya: Muya, state: IDiagramState) { const diagramBlock = new DiagramBlock(muya, state); @@ -48,7 +48,7 @@ class DiagramBlock extends Parent { return diagramBlock; } - get path() { + override get path() { const { path: pPath } = this.parent!; const offset = this.parent!.offset(this); @@ -69,7 +69,7 @@ class DiagramBlock extends Parent { : this; } - getState(): IDiagramState { + override getState(): IDiagramState { const { meta } = this; const text = this.firstContentInDescendant()?.text; diff --git a/lib/block/extra/frontmatter/index.ts b/lib/block/extra/frontmatter/index.ts index ebfe928..95e058e 100644 --- a/lib/block/extra/frontmatter/index.ts +++ b/lib/block/extra/frontmatter/index.ts @@ -14,7 +14,7 @@ const debug = logger('frontmatter:'); class Frontmatter extends Parent { public meta: IFrontmatterMeta; - static blockName = 'frontmatter'; + static override blockName = 'frontmatter'; static create(muya: Muya, state: IFrontmatterState) { const frontmatter = new Frontmatter(muya, state); @@ -56,7 +56,7 @@ class Frontmatter extends Parent { }); } - get path() { + override get path() { const { path: pPath } = this.parent!; const offset = this.parent!.offset(this); @@ -86,7 +86,7 @@ class Frontmatter extends Parent { } } - getState(): IFrontmatterState { + override getState(): IFrontmatterState { const state: IFrontmatterState = { name: 'frontmatter', meta: { ...this.meta }, diff --git a/lib/block/extra/math/index.ts b/lib/block/extra/math/index.ts index cd30b52..9981259 100644 --- a/lib/block/extra/math/index.ts +++ b/lib/block/extra/math/index.ts @@ -7,7 +7,7 @@ import { IMathBlockState, IMathMeta } from '../../../state/types'; class MathBlock extends Parent { public meta: IMathMeta; - static blockName = 'math-block'; + static override blockName = 'math-block'; static create(muya: Muya, state: IMathBlockState) { const mathBlock = new MathBlock(muya, state); @@ -27,7 +27,7 @@ class MathBlock extends Parent { return mathBlock; } - get path() { + override get path() { const { path: pPath } = this.parent!; const offset = this.parent!.offset(this); @@ -48,7 +48,7 @@ class MathBlock extends Parent { : this; } - getState(): IMathBlockState { + override getState(): IMathBlockState { const { meta } = this; const text = this.firstContentInDescendant()?.text; diff --git a/lib/block/extra/math/mathContainer.ts b/lib/block/extra/math/mathContainer.ts index 1f3bb7f..e6dbc15 100644 --- a/lib/block/extra/math/mathContainer.ts +++ b/lib/block/extra/math/mathContainer.ts @@ -7,7 +7,7 @@ import { IMathBlockState, TState } from '../../../state/types'; const debug = logger('mathContainer:'); class MathContainer extends Parent { - static blockName = 'math-container'; + static override blockName = 'math-container'; static create(muya: Muya, state: IMathBlockState) { const mathContainer = new MathContainer(muya); @@ -23,7 +23,7 @@ class MathContainer extends Parent { return 'latex'; } - get path() { + override get path() { const { path: pPath } = this.parent!; return [...pPath]; @@ -36,7 +36,7 @@ class MathContainer extends Parent { this.createDomNode(); } - getState(): TState { + override getState(): TState { debug.warn('You can never call `getState` in mathContainer'); return {} as TState; } diff --git a/lib/block/extra/math/mathPreview.ts b/lib/block/extra/math/mathPreview.ts index d4c8c43..8508d9e 100644 --- a/lib/block/extra/math/mathPreview.ts +++ b/lib/block/extra/math/mathPreview.ts @@ -10,7 +10,7 @@ const debug = logger('mathPreview:'); class MathPreview extends Parent { public math: string; - static blockName = 'math-preview'; + static override blockName = 'math-preview'; static create(muya: Muya, state: IMathBlockState) { const mathBlock = new MathPreview(muya, state); @@ -18,7 +18,7 @@ class MathPreview extends Parent { return mathBlock; } - get path() { + override get path() { debug.warn('You can never call `get path` in htmlPreview'); return []; } @@ -37,7 +37,7 @@ class MathPreview extends Parent { this.update(); } - getState(): TState { + override getState(): TState { debug.warn('You can never call `getState` in mathPreview'); return {} as TState; } diff --git a/lib/block/gfm/table/cell.ts b/lib/block/gfm/table/cell.ts index 1baddb2..43addb3 100644 --- a/lib/block/gfm/table/cell.ts +++ b/lib/block/gfm/table/cell.ts @@ -1,3 +1,4 @@ +import LinkedList from '@muya/block/base/linkedList/linkedList'; import Parent from '@muya/block/base/parent'; import TableCellContent from '@muya/block/content/tableCell'; import LeafQueryBlock from '@muya/block/mixins/leafQueryBlock'; @@ -11,9 +12,11 @@ import TableInner from './table'; @mixins(LeafQueryBlock) class TableBodyCell extends Parent { + override children: LinkedList = new LinkedList(); + public meta: ITableCellMeta; - static blockName = 'table.cell'; + static override blockName = 'table.cell'; static create(muya: Muya, state: ITableCellState) { const cell = new TableBodyCell(muya, state); @@ -25,7 +28,7 @@ class TableBodyCell extends Parent { return cell; } - get path() { + override get path() { const { path: pPath } = this.parent!; const offset = this.parent!.offset(this); @@ -68,7 +71,7 @@ class TableBodyCell extends Parent { this.createDomNode(); } - getState(): ITableCellState { + override getState(): ITableCellState { const state: ITableCellState = { name: 'table.cell', meta: { ...this.meta }, diff --git a/lib/block/gfm/table/index.ts b/lib/block/gfm/table/index.ts index 8ef4934..382655f 100644 --- a/lib/block/gfm/table/index.ts +++ b/lib/block/gfm/table/index.ts @@ -1,18 +1,24 @@ +import LinkedList from '@muya/block/base/linkedList/linkedList'; import Parent from '@muya/block/base/parent'; +import TableCellContent from '@muya/block/content/tableCell'; import ScrollPage from '@muya/block/scrollPage'; import { TBlockPath } from '@muya/block/types'; import Muya from '@muya/index'; +import { Nullable } from '@muya/types'; import { diffToTextOp } from '@muya/utils'; import logger from '@muya/utils/logger'; import diff from 'fast-diff'; import { ITableState } from '../../../state/types'; +import TableBodyCell from './cell'; import TableRow from './row'; import TableInner from './table'; const debug = logger('table:'); class Table extends Parent { - static blockName = 'table'; + override children: LinkedList = new LinkedList(); + + static override blockName = 'table'; static create(muya: Muya, state: ITableState) { const table = new Table(muya); @@ -52,21 +58,13 @@ class Table extends Parent { return this.create(muya, state); } - get path() { + override get path() { const { path: pPath } = this.parent!; const offset = this.parent!.offset(this); return [...pPath, offset]; } - get isEmpty() { - const state = this.getState(); - - return state.children.every((row) => - row.children.every((cell) => cell.text === '') - ); - } - get rowCount() { return (this.firstChild as TableInner).length(); } @@ -84,6 +82,14 @@ class Table extends Parent { this.listenDomEvent(); } + isEmpty() { + const state = this.getState(); + + return state.children.every((row) => + row.children.every((cell) => cell.text === '') + ); + } + listenDomEvent() { const { eventCenter } = this.muya; const { domNode } = this; @@ -101,30 +107,35 @@ class Table extends Parent { } queryBlock(path: TBlockPath) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore return (this.firstChild as TableInner).queryBlock(path); } - empty() { - const { isEmpty } = this; - if (isEmpty) { + override empty() { + if (this.isEmpty()) { + return; + } + + const table = this.children.head; + if (table == null) { return; } - const table = this.firstChild as TableInner; table.forEach((row) => { - row.forEach((cell) => { - cell.firstChild.text = ''; + (row as TableRow).forEach((cell) => { + ((cell as TableBodyCell).firstChild as TableCellContent).text = ''; }); }); } - insertRow(offset) { + insertRow(offset: number) { const { columnCount } = this; const firstRowState = this.getState().children[0]; const currentRow = offset > 0 - ? (this.firstChild as any).find(offset - 1) - : (this.firstChild as any).find(offset); + ? (this.firstChild as TableInner).find(offset - 1) + : (this.firstChild as TableInner).find(offset); const state = { name: 'table.row', children: [...new Array(columnCount)].map((_, i) => { @@ -141,17 +152,18 @@ class Table extends Parent { const rowBlock = ScrollPage.loadBlock('table.row').create(this.muya, state); if (offset > 0) { - (this.firstChild as any).insertAfter(rowBlock, currentRow); + (this.firstChild as TableInner).insertAfter(rowBlock, currentRow as TableRow); } else { - (this.firstChild as any).insertBefore(rowBlock, currentRow); + (this.firstChild as TableInner).insertBefore(rowBlock, currentRow as TableRow); } return rowBlock.firstContentInDescendant(); } - insertColumn(offset, align = 'none') { - const tableInner: any = this.firstChild; - let firstCellInNewColumn = null; + insertColumn(offset: number, align = 'none') { + const tableInner = this.firstChild as TableInner; + let firstCellInNewColumn: Nullable = null; + tableInner.forEach((row) => { const state = { name: 'table.cell', @@ -159,48 +171,56 @@ class Table extends Parent { text: '', }; const cell = ScrollPage.loadBlock('table.cell').create(this.muya, state); - const ref = row.find(offset); - row.insertBefore(cell, ref); + const ref = (row as TableRow).find(offset); + + (row as TableRow).insertBefore(cell, ref as TableBodyCell); if (!firstCellInNewColumn) { firstCellInNewColumn = cell; } }); - return firstCellInNewColumn.firstChild; + return firstCellInNewColumn!.firstChild as TableCellContent; } - removeRow(offset) { - const row = (this.firstChild as any).find(offset); + removeRow(offset: number) { + const row = (this.firstChild as TableInner).find(offset); + if (row == null) { + return; + } + row.remove(); } - removeColumn(offset) { + removeColumn(offset: number) { const { columnCount } = this; if (offset < 0 || offset >= columnCount) { debug.warn(`column at ${offset} is not existed.`); + return; } - const table: any = this.firstChild; + const table = this.firstChild as TableInner; if (this.columnCount === 1) { return this.remove(); } table.forEach((row) => { - const cell = row.find(offset); + const cell = (row as TableRow).find(offset); if (cell) { cell.remove(); } }); } - alignColumn(offset, value) { + alignColumn(offset: number, value: string) { const { columnCount } = this; if (offset < 0 || offset >= columnCount) { debug.warn(`Column at ${offset} is not existed.`); + return; } - const table: any = this.firstChild; + + const table = this.firstChild as TableInner; table.forEach((row) => { - const cell = row.find(offset); + const cell = (row as TableRow).find(offset) as TableBodyCell; if (cell) { const { align: oldValue } = cell; cell.align = oldValue === value ? 'none' : value; @@ -214,8 +234,8 @@ class Table extends Parent { }); } - getState(): ITableState { - return (this.firstChild as any).getState(); + override getState(): ITableState { + return (this.firstChild as TableInner).getState(); } } diff --git a/lib/block/gfm/table/row.ts b/lib/block/gfm/table/row.ts index 4367aea..d7575e2 100644 --- a/lib/block/gfm/table/row.ts +++ b/lib/block/gfm/table/row.ts @@ -1,3 +1,4 @@ +import LinkedList from '@muya/block/base/linkedList/linkedList'; import Parent from '@muya/block/base/parent'; import ContainerQueryBlock from '@muya/block/mixins/containerQueryBlock'; import ScrollPage from '@muya/block/scrollPage'; @@ -8,7 +9,9 @@ import TableBodyCell from './cell'; @mixins(ContainerQueryBlock) class TableRow extends Parent { - static blockName = 'table.row'; + override children: LinkedList = new LinkedList(); + + static override blockName = 'table.row'; static create(muya: Muya, state: ITableRowState) { const row = new TableRow(muya); @@ -22,7 +25,7 @@ class TableRow extends Parent { return row; } - get path() { + override get path() { const { path: pPath } = this.parent!; const offset = this.parent!.offset(this); @@ -37,7 +40,7 @@ class TableRow extends Parent { this.createDomNode(); } - getState(): ITableRowState { + override getState(): ITableRowState { const state: ITableRowState = { name: 'table.row', children: this.map((node) => (node as TableBodyCell).getState()), diff --git a/lib/block/gfm/table/table.ts b/lib/block/gfm/table/table.ts index 4c293d6..6098d85 100644 --- a/lib/block/gfm/table/table.ts +++ b/lib/block/gfm/table/table.ts @@ -1,3 +1,4 @@ +import LinkedList from '@muya/block/base/linkedList/linkedList'; import Parent from '@muya/block/base/parent'; import ContainerQueryBlock from '@muya/block/mixins/containerQueryBlock'; import ScrollPage from '@muya/block/scrollPage'; @@ -8,7 +9,9 @@ import TableRow from './row'; @mixins(ContainerQueryBlock) class TableInner extends Parent { - static blockName = 'table.inner'; + override children: LinkedList = new LinkedList(); + + static override blockName = 'table.inner'; static create(muya: Muya, state: ITableState) { const table = new TableInner(muya, state); @@ -22,7 +25,7 @@ class TableInner extends Parent { return table; } - get path() { + override get path() { return [...this.parent!.path, 'children']; } @@ -35,7 +38,7 @@ class TableInner extends Parent { this.createDomNode(); } - getState(): ITableState { + override getState(): ITableState { const state: ITableState = { name: 'table', children: this.map((node) => (node as TableRow).getState()), diff --git a/lib/block/gfm/taskList/index.ts b/lib/block/gfm/taskList/index.ts index f808928..9dc7a37 100644 --- a/lib/block/gfm/taskList/index.ts +++ b/lib/block/gfm/taskList/index.ts @@ -10,7 +10,7 @@ import TaskListItem from '../taskListItem'; class TaskList extends Parent { public meta: ITaskListMeta; - static blockName = 'task-list'; + static override blockName = 'task-list'; static create(muya: Muya, state: ITaskListState) { const taskList = new TaskList(muya, state); @@ -24,7 +24,7 @@ class TaskList extends Parent { return taskList; } - get path() { + override get path() { const { path: pPath } = this.parent!; const offset = this.parent!.offset(this); @@ -54,26 +54,26 @@ class TaskList extends Parent { return; } - let first = this.firstChild; - let last = this.lastChild; + let first = this.firstChild as TaskListItem; + let last = this.lastChild as TaskListItem; let anchor = first; while (first !== last) { if (!first.checked) { - first = first.next; + first = first.next as TaskListItem; anchor = first; } else if (last.checked) { - last = last.prev; + last = last.prev as TaskListItem; } else { const temp = last; - last = last.prev; + last = last.prev as TaskListItem; temp.insertInto(this, anchor); anchor = temp; } } } - getState(): ITaskListState { + override getState(): ITaskListState { const state: ITaskListState = { name: 'task-list', meta: { ...this.meta }, diff --git a/lib/block/gfm/taskListCheckbox/index.ts b/lib/block/gfm/taskListCheckbox/index.ts index 1a3bef9..0d7f2c9 100644 --- a/lib/block/gfm/taskListCheckbox/index.ts +++ b/lib/block/gfm/taskListCheckbox/index.ts @@ -20,7 +20,7 @@ class TaskListCheckbox extends TreeNode { private eventIds: string[] = []; - static blockName = 'task-list-checkbox'; + static override blockName = 'task-list-checkbox'; static create(muya: Muya, meta: ITaskListItemMeta) { const checkbox = new TaskListCheckbox(muya, meta); @@ -116,7 +116,7 @@ class TaskListCheckbox extends TreeNode { } // eslint-disable-next-line @typescript-eslint/no-unused-vars - remove(_source: string) { + override remove(_source: string) { super.remove(); this.detachDOMEvents(); diff --git a/lib/block/gfm/taskListItem/index.ts b/lib/block/gfm/taskListItem/index.ts index 38b8213..46ab63f 100644 --- a/lib/block/gfm/taskListItem/index.ts +++ b/lib/block/gfm/taskListItem/index.ts @@ -9,11 +9,11 @@ import { ITaskListItemMeta, ITaskListItemState } from '../../../state/types'; @mixins(ContainerQueryBlock) class TaskListItem extends Parent { - public children: LinkedList = new LinkedList(); + override children: LinkedList = new LinkedList(); - public meta: ITaskListItemMeta; + meta: ITaskListItemMeta; - static blockName = 'task-list-item'; + static override blockName = 'task-list-item'; static create(muya: Muya, state: ITaskListItemState) { const listItem = new TaskListItem(muya, state); @@ -31,7 +31,7 @@ class TaskListItem extends Parent { return listItem; } - get path(): TBlockPath { + override get path(): TBlockPath { const { path: pPath } = this.parent!; const offset = this.parent!.offset(this); @@ -63,7 +63,7 @@ class TaskListItem extends Parent { this.createDomNode(); } - getState(): ITaskListItemState { + override getState(): ITaskListItemState { const state: ITaskListItemState = { name: 'task-list-item', meta: { ...this.meta }, diff --git a/lib/block/mixins/containerQueryBlock.ts b/lib/block/mixins/containerQueryBlock.ts index 19a0461..69b3334 100644 --- a/lib/block/mixins/containerQueryBlock.ts +++ b/lib/block/mixins/containerQueryBlock.ts @@ -19,6 +19,7 @@ class ContainerQueryBlock { const p = path.shift() as number; const block = this.find(p); + // eslint-disable-next-line @typescript-eslint/no-explicit-any return block && path.length ? (block as any).queryBlock(path) : block; } } diff --git a/lib/block/scrollPage/index.ts b/lib/block/scrollPage/index.ts index d4b508e..0b2c9ab 100644 --- a/lib/block/scrollPage/index.ts +++ b/lib/block/scrollPage/index.ts @@ -18,7 +18,7 @@ interface IBlurFocus { class ScrollPage extends Parent { private _blurFocus: IBlurFocus = { blur: null, focus: null }; - static blockName = 'scrollpage'; + static override blockName = 'scrollpage'; static registeredBlocks = new Map(); @@ -51,7 +51,7 @@ class ScrollPage extends Parent { return scrollPage; } - get path() { + override get path() { return []; } @@ -66,7 +66,7 @@ class ScrollPage extends Parent { this.listenDomEvent(); } - getState() { + override getState() { debug.warn('You can never call `getState` in scrollPage'); return {} as TState; @@ -101,7 +101,8 @@ class ScrollPage extends Parent { const p = path.shift() as number; const block = this.find(p) as Parent; - + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore return block && path.length ? block.queryBlock(path) : block; } diff --git a/lib/state/types.ts b/lib/state/types.ts index 34a9437..51d8a56 100644 --- a/lib/state/types.ts +++ b/lib/state/types.ts @@ -79,7 +79,7 @@ export interface ITableRowState { } export interface ITableCellMeta { - align: 'none' | 'left' | 'center' | 'right'; + align: string; // 'none' | 'left' | 'center' | 'right'; } export interface ITableCellState { diff --git a/lib/ui/paragraphFrontMenu/config.ts b/lib/ui/paragraphFrontMenu/config.ts index 331fab7..018b940 100644 --- a/lib/ui/paragraphFrontMenu/config.ts +++ b/lib/ui/paragraphFrontMenu/config.ts @@ -43,8 +43,8 @@ export const canTurnIntoMenu = (block: Parent) => { switch (blockName) { case 'paragraph': { - const isEmpty = /^\s*$/.test(block.firstContentInDescendant().text); - if (isEmpty) { + const paragraphIsEmpty = /^\s*$/.test(block.firstContentInDescendant()!.text); + if (paragraphIsEmpty) { return ALL_MENU_CONFIG.filter((item) => item.label !== 'frontmatter'); } diff --git a/tsconfig.json b/tsconfig.json index cb66161..416f545 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,13 +14,14 @@ "resolveJsonModule": true, "isolatedModules": true, "noEmit": true, - + /* Linting */ "strict": true, "noUnusedLocals": true, "noUnusedParameters": true, "noFallthroughCasesInSwitch": true, "noErrorTruncation": true, + "noImplicitOverride": true, "paths": { "@muya/*": ["./lib/*"], }