ckeditor5 1.24.9 → 1.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1e3979d3dd215de48789d30f772f4919f0e5fafff9a159f6944deab41ba9ce42
4
- data.tar.gz: 1519e054bfcd633deb13683dd65e40cb28249ba5c0cfb0e2f1da3c025c329a95
3
+ metadata.gz: 51c0f877edf5aa0ddc0c6b2333f5b631f1ce04144a84eb20c4555bfe63d3206b
4
+ data.tar.gz: 5d477a6bdf0d8fd05fc3bfedfe34f33398a1c58a015a5de8f6871afd1f38f4bb
5
5
  SHA512:
6
- metadata.gz: e860202c101db6c46f924264b7b4389ada039267bf7f249097a0b060532930c07fdc7e1cc5405ee826163e069a1186479b5911299561e992ca93360e4f6e7226
7
- data.tar.gz: 4e3794dac5d1285ff2c82694aaa9ae3b2c9f539c777ed89ad4bdbc06e18da1045c63422bbbbd92796607abdbd4f7460dd8693fb756b29c145548912a3b4866dd
6
+ metadata.gz: 401eb14e4e732e5ac3bd1d249372234b0d134277ad934e1cf38968a121824004266acf00ec71699ef3325288a28346fa42254735480207bc3d3a1c901b4b49d9
7
+ data.tar.gz: 21679ec808b05ff0c052fe419799e47a44b6587b66119cc43d2092c969f0634f52ee8f34c2a8a93eb5300e50c2c7e258cb3d8a4d073898b86ca07d4f1070839b
data/README.md CHANGED
@@ -139,6 +139,7 @@ For extending CKEditor's functionality, refer to the [plugins directory](https:/
139
139
  - [`inline_plugin(name, code)` method](#inline_pluginname-code-method)
140
140
  - [`external_plugin(name, script:, import_as: nil, window_name: nil, stylesheets: [])` method](#external_pluginname-script-import_as-nil-window_name-nil-stylesheets--method)
141
141
  - [`simple_upload_adapter(url)` method](#simple_upload_adapterurl-method)
142
+ - [`special_characters(&block)` method](#special_charactersblock-method)
142
143
  - [`wproofreader(version: nil, cdn: nil, **config)` method](#wproofreaderversion-nil-cdn-nil-config-method)
143
144
  - [Controller / View helpers 📦](#controller--view-helpers-)
144
145
  - [`ckeditor5_element_ref(selector)` method](#ckeditor5_element_refselector-method)
@@ -794,6 +795,23 @@ CKEditor5::Rails.configure do
794
795
  plugin :YourPlugin, window_name: 'YourPlugin'
795
796
  end
796
797
  ```
798
+
799
+ If there is no `window.YourPlugin` object, the plugin will dispatch window event to load. To handle this event, you can use the `window.addEventListener` method:
800
+
801
+ ```js
802
+ window.addEventListener('ckeditor:request-cjs-plugin:YourPlugin', () => {
803
+ window.YourPlugin = (async () => {
804
+ const { Plugin } = await import('ckeditor5');
805
+
806
+ return class YourPlugin extends Plugin {
807
+ // Your plugin code
808
+ };
809
+ })();
810
+ });
811
+ ```
812
+
813
+ ⚠️ The event handler must be attached before the plugin is requested. If the plugin is requested before the event handler is attached, the plugin will not be loaded.
814
+
797
815
  </details>
798
816
 
799
817
  #### `plugins(*names, **kwargs)` method
@@ -984,6 +1002,52 @@ end
984
1002
  ```
985
1003
  </details>
986
1004
 
1005
+ #### `special_characters(&block)` method
1006
+
1007
+ <details>
1008
+ <summary>Configure special characters plugin</summary>
1009
+
1010
+ <br />
1011
+
1012
+ Defines the special characters plugin to be included in the editor. The example below shows how to include the special characters plugin:
1013
+
1014
+ ```rb
1015
+ # config/initializers/ckeditor5.rb
1016
+
1017
+ CKEditor5::Rails.configure do
1018
+ # ... other configuration
1019
+
1020
+ special_characters do
1021
+ # Enable built-in packs using symbols
1022
+ packs :Text, :Essentials, :Currency, :Mathematical, :Latin
1023
+
1024
+ # Custom groups
1025
+ group 'Emoji', label: 'Emoticons' do
1026
+ item 'smiley', '😊'
1027
+ item 'heart', '❤️'
1028
+ end
1029
+
1030
+ group 'Arrows',
1031
+ items: [
1032
+ { title: 'right arrow', character: '→' },
1033
+ { title: 'left arrow', character: '←' }
1034
+ ]
1035
+
1036
+ group 'Mixed',
1037
+ items: [{ title: 'star', character: '⭐' }],
1038
+ label: 'Mixed Characters' do
1039
+ item 'heart', '❤️'
1040
+ end
1041
+
1042
+ order :Text, :Currency, :Mathematical, :Latin, :Emoji, :Arrows, :Mixed
1043
+ end
1044
+ end
1045
+ ```
1046
+
1047
+ For more info about the special characters plugin, check the [official documentation](https://ckeditor.com/docs/ckeditor5/latest/features/special-characters.html).
1048
+
1049
+ </details>
1050
+
987
1051
  #### `wproofreader(version: nil, cdn: nil, **config)` method
988
1052
 
989
1053
  <details>
@@ -1865,7 +1929,7 @@ end
1865
1929
 
1866
1930
  ```js
1867
1931
  // app/javascript/custom_plugins/highlight.js
1868
- import { Plugin, Command, ButtonView } from 'ckeditor5';
1932
+ const { Plugin, Command, ButtonView } = await import('ckeditor5');
1869
1933
 
1870
1934
  return class MyCustomPlugin extends Plugin {
1871
1935
  static get pluginName() {
@@ -7,16 +7,20 @@ module CKEditor5::Rails::Editor
7
7
  def initialize(name, premium: false, **js_import_meta_attrs)
8
8
  super(name)
9
9
 
10
- js_import_meta_attrs[:import_name] ||= if premium
11
- 'ckeditor5-premium-features'
12
- else
13
- 'ckeditor5'
14
- end
10
+ if js_import_meta_attrs[:window_name]
11
+ @js_import_meta = ::CKEditor5::Rails::Assets::JSImportMeta.new(**js_import_meta_attrs)
12
+ else
13
+ js_import_meta_attrs[:import_name] ||= if premium
14
+ 'ckeditor5-premium-features'
15
+ else
16
+ 'ckeditor5'
17
+ end
15
18
 
16
- @js_import_meta = ::CKEditor5::Rails::Assets::JSImportMeta.new(
17
- import_as: js_import_meta_attrs[:window_name] ? nil : name,
18
- **js_import_meta_attrs
19
- )
19
+ @js_import_meta = ::CKEditor5::Rails::Assets::JSImportMeta.new(
20
+ import_as: name,
21
+ **js_import_meta_attrs
22
+ )
23
+ end
20
24
  end
21
25
 
22
26
  # Compress a little bit default plugins to make output smaller
@@ -5,6 +5,7 @@ require 'rails/engine'
5
5
  require_relative 'presets/manager'
6
6
  require_relative 'plugins/simple_upload_adapter'
7
7
  require_relative 'plugins/wproofreader'
8
+ require_relative 'plugins/special_characters_bootstrap'
8
9
 
9
10
  module CKEditor5::Rails
10
11
  class PresetNotFoundError < ArgumentError; end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative '../editor/props_inline_plugin'
4
+
3
5
  module CKEditor5::Rails::Plugins
4
6
  class SimpleUploadAdapter < CKEditor5::Rails::Editor::PropsInlinePlugin
5
7
  PLUGIN_CODE = <<~JS
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../editor/props_inline_plugin'
4
+
5
+ module CKEditor5::Rails::Plugins
6
+ class SpecialCharactersBootstrap < CKEditor5::Rails::Editor::PropsInlinePlugin
7
+ PLUGIN_CODE = <<~JS
8
+ const { Plugin } = await import( 'ckeditor5' );
9
+
10
+ return class SpecialCharactersBootstrap extends Plugin {
11
+ static get pluginName() {
12
+ return 'SpecialCharactersBootstrap';
13
+ }
14
+
15
+ get bootstrapConfig() {
16
+ return this.editor.config.get('specialCharactersBootstrap');
17
+ }
18
+
19
+ async init() {
20
+ const { editor, bootstrapConfig } = this;
21
+ const currentConfig = editor.config.get('specialCharacters');
22
+
23
+ if (!bootstrapConfig) {
24
+ return;
25
+ }
26
+
27
+ editor.config.define('specialCharacters', {
28
+ ...currentConfig,
29
+ order: bootstrapConfig.order || currentConfig.order,
30
+ } );
31
+ }
32
+
33
+ async afterInit() {
34
+ const { editor, bootstrapConfig } = this;
35
+ const specialCharacters = editor.plugins.get('SpecialCharacters');
36
+
37
+ if (!specialCharacters || !bootstrapConfig) {
38
+ return;
39
+ }
40
+
41
+ const groups = bootstrapConfig.groups || [];
42
+
43
+ for (const { name, items, options } of groups) {
44
+ specialCharacters.addItems(name, items, {
45
+ label: name,
46
+ ...options
47
+ });
48
+ }
49
+ }
50
+ }
51
+ JS
52
+
53
+ def initialize
54
+ super(:SpecialCharactersBootstrap, PLUGIN_CODE)
55
+ compress!
56
+ end
57
+ end
58
+ end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative '../editor/props_external_plugin'
4
+ require_relative '../editor/props_inline_plugin'
4
5
 
5
6
  module CKEditor5::Rails::Plugins
6
7
  class WProofreader < CKEditor5::Rails::Editor::PropsExternalPlugin
@@ -2,6 +2,7 @@
2
2
 
3
3
  require_relative 'concerns/configuration_methods'
4
4
  require_relative 'concerns/plugin_methods'
5
+ require_relative 'special_characters_builder'
5
6
 
6
7
  module CKEditor5::Rails
7
8
  module Presets
@@ -368,6 +369,46 @@ module CKEditor5::Rails
368
369
  end
369
370
  end
370
371
 
372
+ # Configure special characters plugin
373
+ #
374
+ # @yield Block for configuring special characters
375
+ # @example Basic configuration with block
376
+ # special_characters do
377
+ # group 'Emoji', label: 'Emoticons' do
378
+ # item 'smiley', '😊'
379
+ # item 'heart', '❤️'
380
+ # end
381
+ # order :Text, :Emoji
382
+ # end
383
+ # @example Configuration with direct items array
384
+ # special_characters do
385
+ # group 'Arrows',
386
+ # items: [
387
+ # { title: 'right', character: '→' },
388
+ # { title: 'left', character: '←' }
389
+ # ]
390
+ # end
391
+ # @example Mixed configuration
392
+ # special_characters do
393
+ # group 'Mixed',
394
+ # items: [{ title: 'star', character: '⭐' }],
395
+ # label: 'Mixed Characters' do
396
+ # item 'heart', '❤️'
397
+ # end
398
+ # end
399
+ def special_characters(&block)
400
+ builder = SpecialCharactersBuilder.new
401
+ builder.instance_eval(&block) if block_given?
402
+
403
+ plugins do
404
+ append(:SpecialCharacters)
405
+ builder.packs_plugins.each { |pack| append(pack) }
406
+ prepend(Plugins::SpecialCharactersBootstrap.new)
407
+ end
408
+
409
+ configure(:specialCharactersBootstrap, builder.to_h)
410
+ end
411
+
371
412
  private
372
413
 
373
414
  def deep_copy_toolbar(toolbar)
@@ -0,0 +1,150 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CKEditor5::Rails::Presets
4
+ # Builder class for configuring special characters in CKEditor5
5
+ #
6
+ # @example Basic configuration
7
+ # special_characters do
8
+ # group 'Emoji', label: 'Emoticons' do
9
+ # item 'smiley', '😊'
10
+ # end
11
+ #
12
+ # order :Text, :Mathematical, :Emoji
13
+ # end
14
+ class SpecialCharactersBuilder
15
+ attr_reader :packs_plugins
16
+
17
+ # Builder class for configuring special characters groups
18
+ #
19
+ # @example Basic group configuration
20
+ # group = Group.new('Emoji', label: 'Emoticons')
21
+ # group.item('smiley', '😊')
22
+ class Group
23
+ attr_reader :name, :label
24
+ private attr_reader :items
25
+
26
+ # Initialize a new special characters group
27
+ #
28
+ # @param name [String] Name of the group
29
+ # @param label [String, nil] Optional display label for the group
30
+ def initialize(name, label: nil)
31
+ @name = name
32
+ @label = label
33
+ @items = []
34
+ end
35
+
36
+ # Add a single character to the group
37
+ #
38
+ # @param title [String] Character title/description
39
+ # @param character [String] The special character
40
+ # @example Add smiley face
41
+ # item 'smiley face', '😊'
42
+ def item(title, character)
43
+ @items << { title: title, character: character }
44
+ end
45
+
46
+ # Add multiple characters to the group at once
47
+ #
48
+ # @param collection [Array<Hash>] Array of character definitions
49
+ # @example Add multiple items
50
+ # add_items [
51
+ # { title: 'star', character: '⭐' },
52
+ # { title: 'heart', character: '❤️' }
53
+ # ]
54
+ def add_items(collection)
55
+ collection.each do |item|
56
+ @items << item.slice(:title, :character)
57
+ end
58
+ end
59
+
60
+ # Add multiple characters to the group
61
+ #
62
+ # @param items [Array<Hash>] Array of character definitions
63
+ def add_characters(items)
64
+ items.each do |item|
65
+ @items << item.slice(:title, :character)
66
+ end
67
+ end
68
+
69
+ # Convert group configuration to hash
70
+ #
71
+ # @return [Hash] Group configuration hash
72
+ def to_h
73
+ {
74
+ name: @name,
75
+ items: @items,
76
+ options: label ? { label: label } : {}
77
+ }
78
+ end
79
+ end
80
+
81
+ # Initialize a new special characters builder
82
+ #
83
+ # @example Create new builder
84
+ # SpecialCharactersBuilder.new
85
+ def initialize
86
+ @groups = []
87
+ @order = []
88
+ @packs_plugins = []
89
+ end
90
+
91
+ # Define a new special characters group
92
+ #
93
+ # @param name [String] Name of the group
94
+ # @param items [Array<Hash>] Optional array of character items
95
+ # @param label [String, nil] Optional display label
96
+ # @yield Group configuration block
97
+ # @return [Group] Created group instance
98
+ # @example Define group with items array
99
+ # group 'Emoji',
100
+ # items: [
101
+ # { title: 'smiley', character: '😊' },
102
+ # { title: 'heart', character: '❤️' }
103
+ # ],
104
+ # label: 'Emoticons'
105
+ # @example Define group with block
106
+ # group 'Emoji', label: 'Emoticons' do
107
+ # item 'smiley', '😊'
108
+ # item 'heart', '❤️'
109
+ # end
110
+ def group(name, items: [], label: nil, &block)
111
+ group = Group.new(name, label: label)
112
+ group.add_characters(items) if items.any?
113
+ group.instance_eval(&block) if block_given?
114
+ @groups << group
115
+ group
116
+ end
117
+
118
+ # Enable special characters packs
119
+ #
120
+ # @param names [Array<Symbol, String>] Pack names to enable
121
+ # @example Enable essential and extended characters
122
+ # packs :Text, :Currency, :Mathematical
123
+ def packs(*names)
124
+ names.each do |name|
125
+ plugin_name = "SpecialCharacters#{name.to_s.capitalize}"
126
+ @packs_plugins << plugin_name
127
+ end
128
+ end
129
+
130
+ # Set the display order of character groups
131
+ #
132
+ # @param categories [Array<Symbol, String>] Category names in desired order
133
+ # @example Set display order
134
+ # order :Text, :Mathematical, 'Currency', :Emoji
135
+ def order(*categories)
136
+ @order = categories.map(&:to_s)
137
+ end
138
+
139
+ # Convert builder configuration to hash
140
+ #
141
+ # @return [Hash] Complete special characters configuration
142
+ def to_h
143
+ {
144
+ groups: @groups.map(&:to_h),
145
+ order: @order,
146
+ packs: @packs_plugins
147
+ }
148
+ end
149
+ end
150
+ end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module CKEditor5
4
4
  module Rails
5
- VERSION = '1.24.9'
5
+ VERSION = '1.25.0'
6
6
 
7
7
  DEFAULT_CKEDITOR_VERSION = '44.1.0'
8
8
  end
@@ -96,6 +96,15 @@ RSpec.describe 'CKEditor5 Types Integration', type: :feature, js: true do
96
96
  expect(plugin_exists).to be true
97
97
  end
98
98
  end
99
+
100
+ it 'initializes the window plugin' do
101
+ visit 'classic'
102
+
103
+ eventually do
104
+ plugin_exists = page.evaluate_script('window.__customWindowPlugin !== undefined')
105
+ expect(plugin_exists).to be true
106
+ end
107
+ end
99
108
  end
100
109
 
101
110
  describe 'Decoupled Editor' do
@@ -1,8 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'spec_helper'
4
- require_relative './plugins_builder_spec'
5
- require_relative './toolbar_builder_spec'
6
4
 
7
5
  RSpec.describe CKEditor5::Rails::Presets::PresetBuilder do
8
6
  let(:builder) { described_class.new }
@@ -520,4 +518,79 @@ RSpec.describe CKEditor5::Rails::Presets::PresetBuilder do
520
518
  expect(builder.config[:wproofreader]).to eq({ language: 'en' })
521
519
  end
522
520
  end
521
+
522
+ describe '#special_characters' do
523
+ it 'configures special characters with groups and items' do # rubocop:disable Metrics/BlockLength
524
+ builder.special_characters do
525
+ group 'Emoji', label: 'Emoticons' do
526
+ item 'smiley', '😊'
527
+ item 'heart', '❤️'
528
+ end
529
+
530
+ group 'Arrows',
531
+ items: [
532
+ { title: 'right', character: '→' },
533
+ { title: 'left', character: '←' }
534
+ ]
535
+
536
+ group 'Mixed',
537
+ items: [{ title: 'star', character: '⭐' }],
538
+ label: 'Mixed Characters' do
539
+ item 'heart', '❤️'
540
+ end
541
+
542
+ order :Text, :Arrows, :Emoji, :Mixed
543
+ end
544
+
545
+ expect(builder.config[:specialCharactersBootstrap]).to eq({
546
+ groups: [
547
+ {
548
+ name: 'Emoji',
549
+ items: [
550
+ { title: 'smiley', character: '😊' },
551
+ { title: 'heart', character: '❤️' }
552
+ ],
553
+ options: { label: 'Emoticons' }
554
+ },
555
+ {
556
+ name: 'Arrows',
557
+ items: [
558
+ { title: 'right', character: '→' },
559
+ { title: 'left', character: '←' }
560
+ ],
561
+ options: {}
562
+ },
563
+ {
564
+ name: 'Mixed',
565
+ items: [
566
+ { title: 'star', character: '⭐' },
567
+ { title: 'heart', character: '❤️' }
568
+ ],
569
+ options: { label: 'Mixed Characters' }
570
+ }
571
+ ],
572
+ order: %w[Text Arrows Emoji Mixed],
573
+ packs: []
574
+ })
575
+
576
+ plugin_names = builder.config[:plugins].map(&:name)
577
+ expect(plugin_names).to include(:SpecialCharacters)
578
+ expect(plugin_names).to include(:SpecialCharactersBootstrap)
579
+ end
580
+
581
+ it 'enables special characters packs' do
582
+ builder.special_characters do
583
+ packs :Text, :Mathematical, :Currency
584
+ end
585
+
586
+ plugin_names = builder.config[:plugins].map(&:name)
587
+ expect(plugin_names).to include(
588
+ :SpecialCharactersBootstrap,
589
+ :SpecialCharacters,
590
+ 'SpecialCharactersText',
591
+ 'SpecialCharactersMathematical',
592
+ 'SpecialCharactersCurrency'
593
+ )
594
+ end
595
+ end
523
596
  end
@@ -0,0 +1,157 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe CKEditor5::Rails::Presets::SpecialCharactersBuilder do
6
+ subject(:builder) { described_class.new }
7
+
8
+ describe '#group' do
9
+ it 'creates a group with items array' do
10
+ group = builder.group('Arrows', items: [
11
+ { title: 'right', character: '→' },
12
+ { title: 'left', character: '←' }
13
+ ])
14
+
15
+ expect(group.to_h).to eq({
16
+ name: 'Arrows',
17
+ items: [
18
+ { title: 'right', character: '→' },
19
+ { title: 'left', character: '←' }
20
+ ],
21
+ options: {}
22
+ })
23
+ end
24
+
25
+ it 'creates a group with block syntax' do
26
+ group = builder.group('Emoji', label: 'Emoticons') do
27
+ item 'smiley', '😊'
28
+ item 'heart', '❤️'
29
+ end
30
+
31
+ expect(group.to_h).to eq({
32
+ name: 'Emoji',
33
+ items: [
34
+ { title: 'smiley', character: '😊' },
35
+ { title: 'heart', 'character': '❤️' }
36
+ ],
37
+ options: { label: 'Emoticons' }
38
+ })
39
+ end
40
+
41
+ it 'creates a group with mixed configuration' do
42
+ group = builder.group('Mixed',
43
+ items: [{ title: 'star', character: '⭐' }],
44
+ label: 'Mixed Characters') do
45
+ item 'heart', '❤️'
46
+ end
47
+
48
+ expect(group.to_h).to eq({
49
+ name: 'Mixed',
50
+ items: [
51
+ { title: 'star', character: '⭐' },
52
+ { title: 'heart', 'character': '❤️' }
53
+ ],
54
+ options: { label: 'Mixed Characters' }
55
+ })
56
+ end
57
+ end
58
+
59
+ describe '#packs' do
60
+ it 'registers special characters plugins' do
61
+ builder.packs(:Text, :Mathematical, :Currency)
62
+
63
+ expect(builder.packs_plugins).to eq(%w[
64
+ SpecialCharactersText
65
+ SpecialCharactersMathematical
66
+ SpecialCharactersCurrency
67
+ ])
68
+ end
69
+ end
70
+
71
+ describe '#order' do
72
+ it 'sets the display order of character groups' do
73
+ builder.order(:Text, :Mathematical, 'Currency', :Emoji)
74
+
75
+ expect(builder.to_h[:order]).to eq(%w[Text Mathematical Currency Emoji])
76
+ end
77
+ end
78
+
79
+ describe '#to_h' do
80
+ it 'returns complete configuration' do
81
+ builder.group('Emoji', label: 'Emoticons') do
82
+ item 'smiley', '😊'
83
+ end
84
+
85
+ builder.packs(:Text, :Mathematical)
86
+ builder.order(:Text, :Mathematical, :Emoji)
87
+
88
+ expect(builder.to_h).to eq({
89
+ groups: [{
90
+ name: 'Emoji',
91
+ items: [{ title: 'smiley', character: '😊' }],
92
+ options: { label: 'Emoticons' }
93
+ }],
94
+ order: %w[Text Mathematical Emoji],
95
+ packs: %w[SpecialCharactersText SpecialCharactersMathematical]
96
+ })
97
+ end
98
+ end
99
+
100
+ describe CKEditor5::Rails::Presets::SpecialCharactersBuilder::Group do
101
+ subject(:group) { described_class.new('Test', label: 'Test Group') }
102
+
103
+ describe '#item' do
104
+ it 'adds a single character' do
105
+ group.item('test', '*')
106
+ expect(group.to_h[:items]).to eq([{ title: 'test', character: '*' }])
107
+ end
108
+ end
109
+
110
+ describe '#add_items' do
111
+ it 'adds multiple characters' do
112
+ group.add_items([
113
+ { title: 'star', character: '⭐' },
114
+ { title: 'heart', 'character': '❤️' }
115
+ ])
116
+
117
+ expect(group.to_h[:items]).to eq([
118
+ { title: 'star', character: '⭐' },
119
+ { title: 'heart', 'character': '❤️' }
120
+ ])
121
+ end
122
+
123
+ it 'filters out invalid keys' do
124
+ group.add_items([
125
+ { title: 'star', character: '⭐', invalid: 'key' }
126
+ ])
127
+
128
+ expect(group.to_h[:items]).to eq([
129
+ { title: 'star', character: '⭐' }
130
+ ])
131
+ end
132
+ end
133
+
134
+ describe '#to_h' do
135
+ it 'includes group name, items and options' do
136
+ group.item('test', '*')
137
+
138
+ expect(group.to_h).to eq({
139
+ name: 'Test',
140
+ items: [{ title: 'test', character: '*' }],
141
+ options: { label: 'Test Group' }
142
+ })
143
+ end
144
+
145
+ it 'omits empty options' do
146
+ group = described_class.new('Test')
147
+ group.item('test', '*')
148
+
149
+ expect(group.to_h).to eq({
150
+ name: 'Test',
151
+ items: [{ title: 'test', character: '*' }],
152
+ options: {}
153
+ })
154
+ end
155
+ end
156
+ end
157
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ckeditor5
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.24.9
4
+ version: 1.25.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mateusz Bagiński
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2025-01-17 00:00:00.000000000 Z
12
+ date: 2025-02-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -89,12 +89,14 @@ files:
89
89
  - lib/ckeditor5/rails/hooks/importmap.rb
90
90
  - lib/ckeditor5/rails/hooks/simple_form.rb
91
91
  - lib/ckeditor5/rails/plugins/simple_upload_adapter.rb
92
+ - lib/ckeditor5/rails/plugins/special_characters_bootstrap.rb
92
93
  - lib/ckeditor5/rails/plugins/wproofreader.rb
93
94
  - lib/ckeditor5/rails/presets/concerns/configuration_methods.rb
94
95
  - lib/ckeditor5/rails/presets/concerns/plugin_methods.rb
95
96
  - lib/ckeditor5/rails/presets/manager.rb
96
97
  - lib/ckeditor5/rails/presets/plugins_builder.rb
97
98
  - lib/ckeditor5/rails/presets/preset_builder.rb
99
+ - lib/ckeditor5/rails/presets/special_characters_builder.rb
98
100
  - lib/ckeditor5/rails/presets/toolbar_builder.rb
99
101
  - lib/ckeditor5/rails/semver.rb
100
102
  - lib/ckeditor5/rails/version.rb
@@ -133,6 +135,7 @@ files:
133
135
  - spec/lib/ckeditor5/rails/presets/manager_spec.rb
134
136
  - spec/lib/ckeditor5/rails/presets/plugins_builder_spec.rb
135
137
  - spec/lib/ckeditor5/rails/presets/preset_builder_spec.rb
138
+ - spec/lib/ckeditor5/rails/presets/special_characters_builder_spec.rb
136
139
  - spec/lib/ckeditor5/rails/presets/toolbar_builder_spec.rb
137
140
  - spec/lib/ckeditor5/rails/semver_spec.rb
138
141
  - spec/lib/ckeditor5/rails/version_detector_spec.rb
@@ -201,6 +204,7 @@ test_files:
201
204
  - spec/lib/ckeditor5/rails/presets/manager_spec.rb
202
205
  - spec/lib/ckeditor5/rails/presets/plugins_builder_spec.rb
203
206
  - spec/lib/ckeditor5/rails/presets/preset_builder_spec.rb
207
+ - spec/lib/ckeditor5/rails/presets/special_characters_builder_spec.rb
204
208
  - spec/lib/ckeditor5/rails/presets/toolbar_builder_spec.rb
205
209
  - spec/lib/ckeditor5/rails/semver_spec.rb
206
210
  - spec/lib/ckeditor5/rails/version_detector_spec.rb