nokodiff 0.4.1 → 0.4.2

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: 463332f5f2d94367e447941e4d28e53b0f8b8f421ec04e7b1fae4975668655df
4
- data.tar.gz: 9d8b69166e7669290aae29f75309f38a47a211d5e30f54927b2dd26c5276d6cf
3
+ metadata.gz: 8574d5f3cb682d4797c8d6cfa9c979e10ca2307a4c55997a0ddd6b3299801856
4
+ data.tar.gz: c3e4b13e2632ba3bf99de7c7a3ef5583618f68e6e94c03f877e5059b764c36e2
5
5
  SHA512:
6
- metadata.gz: d3e110802143d03c8ff63763a21380f3f46016c0656447302552ccb5e95ad687fec50b6452c5e72ef43b9186eb2f1b5544c753919c7cc963631d91d50da1cdc1
7
- data.tar.gz: 5c5299d0e0759559f95e9e85fd3cacf963cd710e630918817d5d187d2b19f8be6e30a41c02a4aed7e058873c208fdc0d93a5f1ec94fac67c95da408892523464
6
+ metadata.gz: b5a8d417f70b4d7fbc1cc2c4745dbd4494d3bf401ad7038e45c239cf9c69e1bca9af24cc0d7e2a078a5d29727d91d8acf29959a5d8e6d94c2d5ba600709f4e05
7
+ data.tar.gz: af1d8b59965819a131bf96d6dcfd9e64e2563196bc74be4bb1c75310d2cd1f4862b40c92691cae1845e4fdf5fe7030fe52ec128376fcfcd09b3dc48649d935b6
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Nokodiff
2
2
 
3
- A Ruby Gem to highlight additions, deletions and character level changes while preserving original HTML.
3
+ A Ruby Gem to highlight additions, deletions, and character level changes while preserving original HTML.
4
4
 
5
5
  It includes functionality to:
6
6
  * Compare two HTML fragments and output diffs with semantic HTML
@@ -24,31 +24,21 @@ gem "nokodiff"
24
24
 
25
25
  ## Local Development
26
26
 
27
- The gem includes a dummy Rails application located in `spec/dummy`. It can be used to preview `Nokodiff` in a real browser environment without needing to integrate with an external host app.
27
+ The gem includes a dummy Rails application located in `spec/dummy`. It can be used to preview `Nokodiff` in a real
28
+ browser environment without needing to integrate with an external host app.
28
29
 
29
- To get the dummy app running you need to:
30
-
31
- ### Install dependencies
30
+ You can run the dummy app with the following command:
32
31
 
33
32
  ```bash
34
- bundle install
33
+ bin/run-dummy-app
35
34
  ```
36
35
 
37
- ### Navigate to the app and install dependencies
38
-
39
- ```bash
40
- cd spec/dummy
41
- bundle install
42
- ```
36
+ This installs the dependencies, builds the assets, and starts the server.
43
37
 
44
- ### Start the server
45
-
46
- ```bash
47
- bin/rails server
48
- ```
38
+ The dummy app will now be running on `localhost:3000`.
49
39
 
50
- The dummy app will now be running on `localhost:3000`
51
- If you want to edit the content you are testing it is located in `spec/dummy/app/controllers/application_controller.rb`, alongside the code calling `Nokodiff.diff(@before, @after)`
40
+ If you want to edit the content you are testing it is located in `spec/dummy/fixtures/before.html`, and
41
+ `spec/dummy/fixtures/after.html`.
52
42
 
53
43
  ## Usage
54
44
 
@@ -76,7 +66,7 @@ In your application.scss file include:
76
66
  @import "nokodiff";
77
67
  ```
78
68
 
79
- This will include the styling for `<del>`, `<ins>` and `<span>` tags to allow colour coding, highlighting and underlining of changes.
69
+ This will include the styling for `<del>`, `<ins>` and `<span>` tags to allow colour coding, highlighting, and underlining of changes.
80
70
 
81
71
  ### More complex diffing with `data-diff-key`
82
72
 
@@ -17,7 +17,7 @@ $black: #0b0c0c;
17
17
  position: static;
18
18
  margin-bottom: 10px;
19
19
 
20
- del, ins, ul, li {
20
+ del, ins {
21
21
  position: static !important;
22
22
  display: block;
23
23
  text-decoration: none;
@@ -13,9 +13,9 @@ module Nokodiff
13
13
  when :changed
14
14
  changed_block(diff[:before], diff[:after])
15
15
  when :deleted
16
- deleted_block(diff[:before])
16
+ diff[:before].name == "li" ? deleted_li(diff[:before]) : deleted_block(diff[:before])
17
17
  when :added
18
- added_block(diff[:after])
18
+ diff[:after].name == "li" ? added_li(diff[:after]) : added_block(diff[:after])
19
19
  end
20
20
  }.join("\n")
21
21
  end
@@ -60,23 +60,41 @@ module Nokodiff
60
60
  end
61
61
 
62
62
  def changed_block(before_node, after_node)
63
- if structurally_similar?(before_node, after_node)
63
+ if structurally_similar?(before_node, after_node) && should_not_be_treated_as_single_change?(before_node)
64
64
  inner_diff = Differ.new(before_node, after_node).to_html
65
65
  rebuild_element(after_node, inner_diff)
66
- elsif before_node.text? && after_node.text?
67
- before_diff, after_diff = diff_raw_text(before_node, after_node)
68
- deleted_block(before_diff) + added_block(after_diff)
69
66
  else
70
- before_diff, after_diff = diff_sub_elements(before_node, after_node)
71
- deleted_block(before_diff) + added_block(after_diff)
67
+ before_diff, after_diff = if both_text_nodes?(before_node, after_node)
68
+ diff_raw_text(before_node, after_node)
69
+ else
70
+ diff_sub_elements(before_node, after_node)
71
+ end
72
+
73
+ if before_node.name == "li"
74
+ deleted_li(before_diff) + added_li(after_diff)
75
+ else
76
+ deleted_block(before_diff) + added_block(after_diff)
77
+ end
72
78
  end
73
79
  end
74
80
 
81
+ def both_text_nodes?(before_node, after_node)
82
+ before_node.text? && after_node.text?
83
+ end
84
+
75
85
  def structurally_similar?(before_node, after_node)
76
86
  before_node.element? &&
77
87
  after_node.element? &&
78
- before_node.name == after_node.name &&
79
- before_node.name != "p"
88
+ before_node.name == after_node.name
89
+ end
90
+
91
+ # We want all changes within a paragraph, heading, or list item to be treated as a single change, even if they are
92
+ # structurally different, to avoid overwhelming the user with changes, and ensure any nested elements are included
93
+ # within the diff, rather than being treated as added or removed content on their own.
94
+ def should_not_be_treated_as_single_change?(before_node)
95
+ before_node.name != "p" &&
96
+ !before_node.name.match(/^h[1-6]$/) &&
97
+ before_node.name != "li"
80
98
  end
81
99
 
82
100
  def rebuild_element(template_node, inner_html)
@@ -108,7 +126,11 @@ module Nokodiff
108
126
  merge_adjacent_highlighted_changes(before_fragment)
109
127
  merge_adjacent_highlighted_changes(after_fragment)
110
128
 
111
- [before_fragment.to_html, after_fragment.to_html]
129
+ if before_html.name == "li"
130
+ [before_fragment.inner_html, after_fragment.inner_html]
131
+ else
132
+ [before_fragment.to_html, after_fragment.to_html]
133
+ end
112
134
  end
113
135
 
114
136
  def merge_adjacent_highlighted_changes(node)
@@ -137,6 +159,16 @@ module Nokodiff
137
159
  node.to_html
138
160
  end
139
161
 
162
+ def deleted_li(html)
163
+ %(
164
+ <li>
165
+ <div class="diff">
166
+ <del aria-label="removed content">#{html}</del>
167
+ </div>
168
+ </li>
169
+ )
170
+ end
171
+
140
172
  def deleted_block(html)
141
173
  %(
142
174
  <div class="diff">
@@ -152,5 +184,15 @@ module Nokodiff
152
184
  </div>
153
185
  )
154
186
  end
187
+
188
+ def added_li(html)
189
+ %(
190
+ <li>
191
+ <div class="diff">
192
+ <ins aria-label="added content">#{html}</ins>
193
+ </div>
194
+ </li>
195
+ )
196
+ end
155
197
  end
156
198
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Nokodiff
4
- VERSION = "0.4.1"
4
+ VERSION = "0.4.2"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nokodiff
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - GOV.UK Dev
@@ -102,7 +102,7 @@ dependencies:
102
102
  version: '6'
103
103
  - - "<"
104
104
  - !ruby/object:Gem::Version
105
- version: 8.1.3
105
+ version: 8.1.4
106
106
  type: :runtime
107
107
  prerelease: false
108
108
  version_requirements: !ruby/object:Gem::Requirement
@@ -112,7 +112,7 @@ dependencies:
112
112
  version: '6'
113
113
  - - "<"
114
114
  - !ruby/object:Gem::Version
115
- version: 8.1.3
115
+ version: 8.1.4
116
116
  - !ruby/object:Gem::Dependency
117
117
  name: byebug
118
118
  requirement: !ruby/object:Gem::Requirement
@@ -184,7 +184,7 @@ dependencies:
184
184
  version: '6'
185
185
  - - "<"
186
186
  - !ruby/object:Gem::Version
187
- version: 8.1.3
187
+ version: 8.1.4
188
188
  type: :runtime
189
189
  prerelease: false
190
190
  version_requirements: !ruby/object:Gem::Requirement
@@ -194,7 +194,7 @@ dependencies:
194
194
  version: '6'
195
195
  - - "<"
196
196
  - !ruby/object:Gem::Version
197
- version: 8.1.3
197
+ version: 8.1.4
198
198
  - !ruby/object:Gem::Dependency
199
199
  name: view_component
200
200
  requirement: !ruby/object:Gem::Requirement
@@ -244,7 +244,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
244
244
  - !ruby/object:Gem::Version
245
245
  version: '0'
246
246
  requirements: []
247
- rubygems_version: 4.0.9
247
+ rubygems_version: 4.0.10
248
248
  specification_version: 4
249
249
  summary: A Ruby Gem to highlight additions, deletions and character level changes
250
250
  while preserving original HTML