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 | 51x 51x 51x 51x 11594x 11594x 11594x 5785x 5785x 10973x 10973x 10973x 8633x 8633x 8633x 2340x 2340x 2340x 5785x 5079x 51x 943x 943x 943x 943x 943x 1282x 943x 51x 11878x 9949x 9949x 9949x 9949x 9949x 15121x 15121x 15121x 9949x 51x 4349x 1460x 517x 517x 517x 517x 675x 675x 675x 675x 420x 517x 517x 517x 687x 687x 368x 517x 431x | 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; }; |