Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | 49x 49x 49x 49x 11708x 11708x 11708x 5902x 5902x 11682x 11682x 11682x 8979x 8979x 8979x 2703x 2703x 2703x 5902x 5169x 49x 978x 978x 978x 978x 978x 1351x 978x 49x 11757x 9831x 9831x 9831x 9831x 9831x 14995x 14995x 14995x 9831x 49x 4399x 1518x 540x 540x 540x 540x 701x 701x 701x 701x 444x 540x 540x 540x 739x 739x 410x 540x 470x | import {isEmpty} from '@jsonjoy.com/util/lib/isEmpty'; import {PersistedSlice} from '../peritext/slice/PersistedSlice'; import {SliceStacking} from '../peritext/slice/constants'; import type {OverlayPoint} from '../peritext/overlay/OverlayPoint'; import type {QuillDeltaAttributes} from './types'; import type {PathStep} from '@jsonjoy.com/json-pointer'; export const getAttributes = (overlayPoint: OverlayPoint): QuillDeltaAttributes | undefined => { const layers = overlayPoint.layers; const layerLength = layers.length; if (!layerLength) return; const attributes: QuillDeltaAttributes = {}; for (let i = 0; i < layerLength; i++) { const slice = layers[i]; Iif (!(slice instanceof PersistedSlice)) continue; switch (slice.stacking) { case SliceStacking.One: { const tag = slice.type as PathStep; if (tag) attributes[tag] = slice.data(); break; } case SliceStacking.Erase: { const tag = slice.type as PathStep; if (tag) delete attributes[tag]; break; } } } if (isEmpty(attributes)) return undefined; return attributes; }; const eraseAttributes = (attr: QuillDeltaAttributes | undefined): Record<string | number, null> | undefined => { Iif (!attr) return; const keys = Object.keys(attr); const length = keys.length; Iif (!length) return; const erased: Record<string | number, null> = {}; for (let i = 0; i < length; i++) erased[keys[i]] = null; return erased; }; export const removeErasures = (attr: QuillDeltaAttributes | undefined): QuillDeltaAttributes | undefined => { if (!attr) return; const keys = Object.keys(attr); const length = keys.length; Iif (!length) return; const cleaned: QuillDeltaAttributes = {}; for (let i = 0; i < length; i++) { const key = keys[i]; const value = attr[key]; if (value !== null) cleaned[key] = value; } return isEmpty(cleaned) ? undefined : cleaned; }; export const diffAttributes = ( oldAttributes: QuillDeltaAttributes | undefined, newAttributes: QuillDeltaAttributes | undefined, ): QuillDeltaAttributes | undefined => { if (!oldAttributes) return removeErasures(newAttributes); if (!newAttributes) return eraseAttributes(oldAttributes); const diff: QuillDeltaAttributes = {}; const keys = Object.keys(newAttributes); const length = keys.length; for (let i = 0; i < length; i++) { const key = keys[i]; const newValue = newAttributes[key]; const oldValue = oldAttributes[key]; if (newValue === oldValue) continue; diff[key] = newValue; } const oldKeys = Object.keys(oldAttributes); const oldLength = oldKeys.length; for (let i = 0; i < oldLength; i++) { const key = oldKeys[i]; // tslint:disable-next-line:triple-equals if (newAttributes[key] !== undefined) continue; diff[key] = null; } if (isEmpty(diff)) return undefined; return diff; }; |