delta.mdx 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. ---
  2. title: Delta
  3. ---
  4. Deltas are a simple, yet expressive format that can be used to describe Quill's contents and changes. The format is a strict subset of JSON, is human readable, and easily parsible by machines. Deltas can describe any Quill document, includes all text and formatting information, without the ambiguity and complexity of HTML.
  5. Don't be confused by its name Delta—Deltas represents both documents and changes to documents. If you think of Deltas as the instructions from going from one document to another, the way Deltas represent a document is by expressing the instructions starting from an empty document.
  6. Deltas are implemented as a separate [standalone library](https://github.com/quilljs/delta/), allowing its use outside of Quill. It is suitable for [Operational Transform](https://en.wikipedia.org/wiki/Operational_transformation) and can be used in realtime, Google Docs like applications. For a more in depth explanation behind Deltas, see [Designing the Delta Format](/guides/designing-the-delta-format/).
  7. **Note:** It is not recommended to construct Deltas by hand—rather use the chainable [`insert()`](https://github.com/quilljs/delta#insert), [`delete()`](https://github.com/quilljs/delta#delete), and [`retain()`](https://github.com/quilljs/delta#retain) methods to create new Deltas. You can use [`import()`](/docs/api/#import) to access Delta from Quill.
  8. ## Document
  9. The Delta format is almost entirely self-explanatory—the example below describes the string "Gandalf the Grey" where "Gandalf" is bolded and "Grey" is colored #cccccc.
  10. ```javascript
  11. {
  12. ops: [
  13. { insert: 'Gandalf', attributes: { bold: true } },
  14. { insert: ' the ' },
  15. { insert: 'Grey', attributes: { color: '#cccccc' } }
  16. ]
  17. }
  18. ```
  19. As its name would imply, describing content is actually a special case for Deltas. The above example is more specifically instructions to insert a bolded string "Gandalf", an unformatted string " the ", followed by the string "Grey" colored #cccccc. When Deltas are used to describe content, it can be thought of as the content that would be created if the Delta was applied to an empty document.
  20. Since Deltas are a data format, there is no inherent meaning to the values of `attribute` keypairs. For example, there is nothing in the Delta format that dictates color value must be in hex—this is a choice that Quill makes, and can be modified if desired with [Parchment](https://github.com/quilljs/parchment/).
  21. ### Embeds
  22. For non-text content such as images or formulas, the insert key can be an object. The object should have one key, which will be used to determine its type. This is the `blotName` if you are building custom content with [Parchment](https://github.com/quilljs/parchment/). Like text, embeds can still have an `attributes` key to describe formatting to be applied to the embed. All embeds have a length of one.
  23. ```javascript
  24. {
  25. ops: [{
  26. // An image link
  27. insert: {
  28. image: 'https://quilljs.com/assets/images/icon.png'
  29. },
  30. attributes: {
  31. link: 'https://quilljs.com'
  32. }
  33. }]
  34. }
  35. ```
  36. ### Line Formatting
  37. Attributes associated with a newline character describes formatting for that line.
  38. ```javascript
  39. {
  40. ops: [
  41. { insert: 'The Two Towers' },
  42. { insert: '\n', attributes: { header: 1 } },
  43. { insert: 'Aragorn sped on up the hill.\n' }
  44. ]
  45. }
  46. ```
  47. All Quill documents must end with a newline character, even if there is no formatting applied to the last line. This way, you will always have a character position to apply line formatting to.
  48. Many line formats are exclusive. For example Quill does not allow a line to simultaneously be both a header and a list, despite being possible to represent in the Delta format.
  49. ## Changes
  50. When you register a listener for Quill's [`text-change`](/docs/api/#text-change) event, one of the arguments you will get is a Delta describing what changed. In addition to `insert` operations, this Delta might also have `delete` or `retain` operations.
  51. ### Delete
  52. The `delete` operation instructs exactly what it implies: delete the next number of characters.
  53. ```javascript
  54. {
  55. ops: [
  56. { delete: 10 } // Delete the next 10 characters
  57. ]
  58. }
  59. ```
  60. Since `delete` operations do not include _what_ was deleted, a Delta is not reversible.
  61. ### Retain
  62. A `retain` operation simply means keep the next number of characters, without modification. If `attributes` is specified, it still means keep those characters, but apply the formatting specified by the `attributes` object. A `null` value for an attributes key is used to specify format removal.
  63. Starting with the above "Gandalf the Grey" example:
  64. ```javascript
  65. // {
  66. // ops: [
  67. // { insert: 'Gandalf', attributes: { bold: true } },
  68. // { insert: ' the ' },
  69. // { insert: 'Grey', attributes: { color: '#cccccc' } }
  70. // ]
  71. // }
  72. {
  73. ops: [
  74. // Unbold and italicize "Gandalf"
  75. { retain: 7, attributes: { bold: null, italic: true } },
  76. // Keep " the " as is
  77. { retain: 5 },
  78. // Insert "White" formatted with color #fff
  79. { insert: 'White', attributes: { color: '#fff' } },
  80. // Delete "Grey"
  81. { delete: 4 }
  82. ]
  83. }
  84. ```
  85. Note that a Delta's instructions always starts at the beginning of the document. And because of plain `retain` operations, we never need to specify an index for a `delete` or `insert` operation.
  86. ### Playground
  87. Play around with Quill and take a look at how its content and changes look. Open your developer console for another view into the Deltas.
  88. <CodePen height="470" hash="dMQGmq" defaultTab="result" />