@embedpdf/plugin - 注释
注释插件: 绘图、 选择、 移动、 重排、 输入和输入
删除注释, 在引擎拥有的文档上 。 纯洁的电线
@embedpdf/core-annotation 到发动机
和互动中心。 它没有框架代码;适配器使其
读取.
三种数据,每个拥有者一个
用户所看到的是由三种数据构建的. 每个都有一个 主人,没有别的东西写.
| 数据 | 这是什么 | 拥有者 | 由 |
|---|---|---|---|
| 确认 | 每个注释记录引擎确认, 及其外观版本 | 记录镜像( e)sync/records.ts, (中文(简体) ), records.get() | 任何会话中确认的文档事件和负载 |
| 待处理 | 此会话的更改引擎尚未回复, 每个用户动作一次 | 内核的更改队列( n)ctx.changes(中文(简体) ) | 用户动作第一阶段; 引擎回答后退出 |
| 第二届会议 | 选择、 徘徊、 手势进行中、 文本编辑、 工具设置、 为新记录所持有的对象编号 | session 在插件状态中( e)model.ts(中文(简体) ) | 这是核心 update |
记录镜显示引擎之上的未决更改
已确认(records.view():它重新播放它们,逐个操作,通过
predictRecords,同样的规则 引擎适用。 这个 视图
(单位:千美元)read/view.ts)将这些记录变成核心记录,每张记录都是
上面写着变化 把它们和会话组成核心
Model每一个读取和手势都采用这个模型。 这是纪念品
记录,所以更改一个记录不会重算其他记录.
一个变化的生命
用户将正方形拖入新位置 :
pointer up
│
▼
store.commit({ type: 'editPointer', phase: 'up', … }) services/store.ts
│
├─ update(model, message) core-annotation
│ → session (the drag is over)
│ → change (put: the square at its new place)
│ → effects ([{ type: 'patch', id: 'obj:12', patch: { box } }])
│
├─ op builders write/ops.ts
│ patch → { type: 'annotations.update', ref, patch }
│ (an annotation's link children follow it: write/links.ts)
│
└─ ctx.changes.stage({ label, ops, undo }) the kernel
the records mirror predicts it: the view shows the square at its
new place at once. The queue sends it after everything staged
before it; the engine applies it, all or nothing, and publishes
`annotations.updated` before it answers:
the records mirror folds it → confirmed obj:12 is at the new place
the change leaves the view → the view shows the confirmed record
一个用户动作就是一个改变:移动五个说明就是五个改变 行动,一个请求,一个撤销步骤。 规则:
- 拒绝 (取消赠款,在别处设置锁):
并显示确认的记录,包括任何
另一会话也随之改变。 无所不能由手取出
onWriteFailed告诉UI为什么。 名称只有记录的更改 a 拒绝的变更本可以创造的 与它一起被拒绝. - 应用: 当记录镜显示 答案, 即当其事件折叠时; 如果折叠要求读取 页面,视图将它保存到读取土地.
- 顺序: 引擎回答的顺序改变,所以 新的变化总是表现在 旧的答案.
同样的管道带来各种变化:
- 新说明 选中对象编号
(单位:千美元)
services/object-numbers.ts因此,新的记录有 其最后的参考 从其 第一个框架:可以同时选择、编辑、链接或删除,以及 每一个被创造出来的人, 替换文本护栏和 它的罢工是两个创造的 在一个变化中,罢工回应 照着它的号码 如果文档的池是空的,一会儿 创建数字等值(绘图保留在屏幕上). - 删除:记录及其内容(其答复,分组部分, 弹出后)立刻离开取景地,如果发动机拒绝,就回来.
- 键入 每暂停一次, 进入一个所持更改( q)
write/text-editing.ts: 每个按键都会修正,所以文本一次显示,然后发送 暂停,当编辑结束, 当其他东西被摆出, 之前 下载。 输入时输入选中单词的格式 . - 代码中的更改 (单位:千美元)
create, (中文(简体) ),update, (中文(简体) ),delete, (中文(简体) ),reorder, (中文(简体) ), 评论,链接,脚本)通过商店的第二扇门,apply: 每个 使用引擎本身的功能检查,同时显示,并发送, 回答和拒绝 就像一个手势。 一个呼叫就是改变.
记录如何使
引擎的外观光栅所形成的确认记录(baked(中文(简体) )
除非本届会议编辑或创建了它,在这种情况下,它从
说明vector: vector 国家优先。 又一个
会话将记录转换回光栅上(sync/confirmed.ts) (中文(简体) ).
虽然本届会议有待改变,但记录的绘制方式如下:
从变化本身(核心) drawnAfter引擎的判断:
将光栅带上,任何其它可见的活画, 和改变
光栅已经显示(一面旗帜)已照原样离开. 邮票和部件没有
活生生的渲染 总是使用光栅: 邮票的分数保持在
调整框大小( 引擎适合它) contain),并加盖了本届会议的印章
显示它被放置的预览, 直到引擎的相片存在
(单位:千美元)read/render.ts) (中文(简体) ). 光栅再次被取回 恰好当记录
外观版本更改, 当引擎报告时镜像会推进
重生的外观.
东西住的地方
| 文件夹 | 里面有什么东西 |
|---|---|
controller.ts | 构成根: 构建服务, 连接每个区域, 组装能力 |
model.ts | 插件状态及其过渡(withSession,使偏好,.) |
services/ | 每个区域的基础是什么:商店、对象编号、事件、权威 |
sync/ | 记录镜(引擎确认的内容及其预测)和随后的 |
read/ | (注释、制成物品、铬) |
write/ | 动词,以及将核心效果转化为引擎操作的操作构建器 |
comments/ | 注释线程在相同记录上的镜头 |
tools/ | 工具定义, 注册, 工具的幽灵, 和枢纽上的指针处理器 |
测试
test/harness.ts 运行内核测试上下文中的控制器
假引擎 行为像真实的: 它一次应用一个变化,
他们被派去的顺序, 全部或无, 并公布事件之前
它回答;一个创建得到它命名的对象编号. test/pending.test.ts
是起始地点:用户在更改时和更改后所看到的内容
它的方式. test/interleavings.test.ts 播放种子随机序列
更改、拒绝和远程更新,并检查视图(数值和如何)
在每一步之后.