diff --git a/lib/models/text.js b/lib/models/text.js index fde1a2745..738ecd35f 100644 --- a/lib/models/text.js +++ b/lib/models/text.js @@ -287,14 +287,14 @@ class Text extends new Record(DEFAULTS) { */ updateMark(index, length, mark, properties) { + const m = mark.merge(properties) const characters = this.characters.map((char, i) => { if (i < index) return char if (i >= index + length) return char let { marks } = char - const j = marks.indexOf(mark) - let m = marks.get(j) - m = m.merge(properties) - marks = marks.set(j, m) + if (!marks.has(mark)) return char + marks = marks.remove(mark) + marks = marks.add(m) char = char.merge({ marks }) return char }) diff --git a/lib/transforms/apply-operation.js b/lib/transforms/apply-operation.js index 74fb31469..3d80d3a5a 100644 --- a/lib/transforms/apply-operation.js +++ b/lib/transforms/apply-operation.js @@ -245,6 +245,7 @@ function setMark(state, operation) { let { document } = state let node = document.assertPath(path) node = node.updateMark(offset, length, mark, properties) + debugger document = document.updateDescendant(node) state = state.merge({ document }) return state diff --git a/test/transforms/fixtures/by-key/set-mark-by-key/set-data/index.js b/test/transforms/fixtures/by-key/set-mark-by-key/set-data/index.js new file mode 100644 index 000000000..9c2a24bb3 --- /dev/null +++ b/test/transforms/fixtures/by-key/set-mark-by-key/set-data/index.js @@ -0,0 +1,21 @@ + +export default function (state) { + const { document, selection } = state + const first = document.getTexts().first() + + return state + .transform() + .setMarkByKey( + first.key, + 0, + first.length, + { + type: 'bold', + data: { key: true } + }, + { + data: { key: false } + } + ) + .apply() +} diff --git a/test/transforms/fixtures/by-key/set-mark-by-key/set-data/input.yaml b/test/transforms/fixtures/by-key/set-mark-by-key/set-data/input.yaml new file mode 100644 index 000000000..bc54126ff --- /dev/null +++ b/test/transforms/fixtures/by-key/set-mark-by-key/set-data/input.yaml @@ -0,0 +1,12 @@ + +nodes: + - kind: block + type: paragraph + nodes: + - kind: text + ranges: + - text: word + marks: + - type: bold + data: + key: true diff --git a/test/transforms/fixtures/by-key/set-mark-by-key/set-data/output.yaml b/test/transforms/fixtures/by-key/set-mark-by-key/set-data/output.yaml new file mode 100644 index 000000000..88518e9d8 --- /dev/null +++ b/test/transforms/fixtures/by-key/set-mark-by-key/set-data/output.yaml @@ -0,0 +1,12 @@ + +nodes: + - kind: block + type: paragraph + nodes: + - kind: text + ranges: + - text: word + marks: + - type: bold + data: + key: false