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 +4 -4
- data/README.md +10 -20
- data/app/assets/stylesheets/nokodiff.scss +1 -1
- data/lib/nokodiff/differ.rb +53 -11
- data/lib/nokodiff/version.rb +1 -1
- metadata +6 -6
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 8574d5f3cb682d4797c8d6cfa9c979e10ca2307a4c55997a0ddd6b3299801856
|
|
4
|
+
data.tar.gz: c3e4b13e2632ba3bf99de7c7a3ef5583618f68e6e94c03f877e5059b764c36e2
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
### Install dependencies
|
|
30
|
+
You can run the dummy app with the following command:
|
|
32
31
|
|
|
33
32
|
```bash
|
|
34
|
-
|
|
33
|
+
bin/run-dummy-app
|
|
35
34
|
```
|
|
36
35
|
|
|
37
|
-
|
|
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
|
-
|
|
45
|
-
|
|
46
|
-
```bash
|
|
47
|
-
bin/rails server
|
|
48
|
-
```
|
|
38
|
+
The dummy app will now be running on `localhost:3000`.
|
|
49
39
|
|
|
50
|
-
|
|
51
|
-
|
|
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
|
|
data/lib/nokodiff/differ.rb
CHANGED
|
@@ -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 =
|
|
71
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
data/lib/nokodiff/version.rb
CHANGED
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|