Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

没太明白 MNode 是个什么样的结构 #6

Open
jiulu313 opened this issue Nov 10, 2022 · 6 comments
Open

没太明白 MNode 是个什么样的结构 #6

jiulu313 opened this issue Nov 10, 2022 · 6 comments

Comments

@jiulu313
Copy link

大神,能不能给点解答,源码里面 MNode 类型
里面有 pre, next 了,是个双链表,怎么还有个 firstChild, lastChild 类型
有点不太明白了

`export class MNode {
type: NodeType;
parent: MNode | null = null;
firstChild: MNode | null = null;
lastChild: MNode | null = null;
prev: MNode | null = null;
next: MNode | null = null;
open: boolean = true;
stringContent: string = '';
sourceStart: number;
sourceEnd: number;
blockMarkerBefore: string | undefined = ''; // 标识占位符(叶子块需要,目前只有代码块和标题需要,因为其他叶子快内部可以包含p标签)
blockMarkerAfter: string | undefined = ''; // 标识占位符(叶子块需要,目前只有代码块和标题需要,因为其他叶子快内部可以包含p标签)
marker: string = ''; // 是否是文本标记符占位节点
isShow: boolean = true; // 是否需要显示和隐藏(隐藏的话直接不创建dom节点,占位场景)
// lastLineBlank: boolean = false; // 末尾是否存在空白行,用于换行时容器切换

constructor (sourceStart: number) {
this.sourceStart = sourceStart;
}`

@jiulu313
Copy link
Author

解析 md 内容的时候,生成AST,应该节点里面有children的,这个里面没有
不过还在继续深入研究,如果大神能给点点拨更好了

谢谢

@Ben-love-zy
Copy link
Owner

MNode各个节点的节点树,是一颗链表树,pre, next可以用于找到兄弟节点,firstChild可用于找到子节点,找到firstChild第一个字子节点后,通过firstChild-> next 就可以继续找到所有子节点,也就是children了。这里通过链表去实现 而不是children数组,方便节点高效操作

@Ben-love-zy
Copy link
Owner

也可以了解下treewalker ,就是用来遍历这种结构的,和真实dom结构一样

@jiulu313
Copy link
Author

/** 当前位置前移,1个tab对应4个空格 */
export function advanceOffset (line: string, offset: number, column: number, count: number, forColumns?: boolean) {
  let char, spaceInTab = 0;
  while (count > 0 && (char = line[offset])) {
    if (char === "\t") {
      spaceInTab = 4 - (column % 4); // 一个tab内还剩余多少个空格
      if (forColumns) {
        const inTab = spaceInTab > count; // 剩余空格足够满足本次移动
        const columnDelta = inTab ? count : spaceInTab; // 最多移动一个tab
        offset += inTab ? 0 : 1; // 剩余空格足够满足本次移动,则offset不用移动,说明在一个tab字符内
        column += columnDelta;
        count -= columnDelta;
      } else {
        column += spaceInTab;
        spaceInTab = 0;
        offset += 1;
        count -= 1;
      }
    } else {
      offset += 1;
      column += 1;
      count -= 1;
    }
  }
  return { offset, column, spaceInTab }
}

这个函数是啥意思啊
我琢磨了一下午,没琢磨明白
就感觉好像是删除的时候用的
望大佬能解释一下

@Ben-love-zy
Copy link
Owner

为了 换行打 tab 缩进的时候,能够对齐上一行的 tab 。而不会因为下一行先输入了一个空格再输入tab,与上一行错位

@jiulu313
Copy link
Author

这样啊,明白了
对 了,刚才MNode的结构,是不是就是下面的那样?
对于红色节点,它的 pre, next ,firstChild, lastChild 如下
image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants