hyp_diff 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -107,7 +107,7 @@ module HypDiff; class << self
107
107
  insertions << change.new_element.text
108
108
  when "=" then
109
109
  apply_insertions_and_deletions
110
- new_text << change.new_element.text
110
+ new_text << escape_html(change.new_element.text)
111
111
  when "+" then
112
112
  insertions << change.new_element.text
113
113
  when "-" then
@@ -132,10 +132,10 @@ module HypDiff; class << self
132
132
 
133
133
  def apply_insertions_and_deletions
134
134
  if deletions.length > 0
135
- @new_text << deletion_tag(deletions.join)
135
+ new_text << deletion_tag(deletions.join)
136
136
  end
137
137
  if insertions.length > 0
138
- @new_text << insertion_tag(insertions.join)
138
+ new_text << insertion_tag(insertions.join)
139
139
  end
140
140
 
141
141
  @insertions = []
@@ -143,11 +143,17 @@ module HypDiff; class << self
143
143
  end
144
144
 
145
145
  def insertion_tag(text)
146
- @render_insertion.call(text)
146
+ @render_insertion.call(escape_html(text))
147
147
  end
148
148
 
149
149
  def deletion_tag(text)
150
- @render_deletion.call(text)
150
+ @render_deletion.call(escape_html(text))
151
+ end
152
+
153
+ def escape_html(text)
154
+ fragment = Nokogiri::HTML::DocumentFragment.parse("")
155
+ fragment.content = text
156
+ fragment.to_html
151
157
  end
152
158
 
153
159
  end
@@ -162,7 +168,7 @@ module HypDiff; class << self
162
168
 
163
169
  def text_fragments(node)
164
170
  if node.is_a?(Nokogiri::XML::Text)
165
- node.text.split(/(?=[.!, ])|\b/).map { |token| TextFromNode.new(token, node) }
171
+ node.text.split(/(?=[.!,<> ])|\b/).map { |token| TextFromNode.new(token, node) }
166
172
  else
167
173
  node.children.map { |c| text_fragments(c) }.flatten
168
174
  end
@@ -1,3 +1,3 @@
1
1
  module HypDiff
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -98,6 +98,24 @@ describe HypDiff do
98
98
  end
99
99
  end
100
100
 
101
+ describe "handling html entities" do
102
+ it "handles them transparently when whole words are entities" do
103
+ expect_diff(
104
+ "foo &lt; bar",
105
+ "foo &gt; bar",
106
+ "foo <del>&lt;</del><ins>&gt;</ins> bar"
107
+ )
108
+ end
109
+
110
+ it "handles them transparently when words contain entities" do
111
+ expect_diff(
112
+ "f&#252; b&#228;r",
113
+ "f&#246; b&#228;r",
114
+ "<del>f&#252;</del><ins>f&#246;</ins> b&#228;r"
115
+ )
116
+ end
117
+ end
118
+
101
119
  describe "handling whitespace" do
102
120
  it "treats consecutive whitespace as a single whitespace" do
103
121
  expect_diff("hello world", "hello world", "hello world")
metadata CHANGED
@@ -1,18 +1,20 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hyp_diff
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - Kristian Hanekamp
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2014-03-18 00:00:00.000000000 Z
12
+ date: 2014-04-01 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: nokogiri
15
16
  requirement: !ruby/object:Gem::Requirement
17
+ none: false
16
18
  requirements:
17
19
  - - ~>
18
20
  - !ruby/object:Gem::Version
@@ -20,6 +22,7 @@ dependencies:
20
22
  type: :runtime
21
23
  prerelease: false
22
24
  version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
23
26
  requirements:
24
27
  - - ~>
25
28
  - !ruby/object:Gem::Version
@@ -27,6 +30,7 @@ dependencies:
27
30
  - !ruby/object:Gem::Dependency
28
31
  name: diff-lcs
29
32
  requirement: !ruby/object:Gem::Requirement
33
+ none: false
30
34
  requirements:
31
35
  - - ~>
32
36
  - !ruby/object:Gem::Version
@@ -34,6 +38,7 @@ dependencies:
34
38
  type: :runtime
35
39
  prerelease: false
36
40
  version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
37
42
  requirements:
38
43
  - - ~>
39
44
  - !ruby/object:Gem::Version
@@ -41,6 +46,7 @@ dependencies:
41
46
  - !ruby/object:Gem::Dependency
42
47
  name: bundler
43
48
  requirement: !ruby/object:Gem::Requirement
49
+ none: false
44
50
  requirements:
45
51
  - - ~>
46
52
  - !ruby/object:Gem::Version
@@ -48,6 +54,7 @@ dependencies:
48
54
  type: :development
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
51
58
  requirements:
52
59
  - - ~>
53
60
  - !ruby/object:Gem::Version
@@ -55,6 +62,7 @@ dependencies:
55
62
  - !ruby/object:Gem::Dependency
56
63
  name: rspec
57
64
  requirement: !ruby/object:Gem::Requirement
65
+ none: false
58
66
  requirements:
59
67
  - - ~>
60
68
  - !ruby/object:Gem::Version
@@ -62,6 +70,7 @@ dependencies:
62
70
  type: :development
63
71
  prerelease: false
64
72
  version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
65
74
  requirements:
66
75
  - - ~>
67
76
  - !ruby/object:Gem::Version
@@ -69,6 +78,7 @@ dependencies:
69
78
  - !ruby/object:Gem::Dependency
70
79
  name: rake
71
80
  requirement: !ruby/object:Gem::Requirement
81
+ none: false
72
82
  requirements:
73
83
  - - ~>
74
84
  - !ruby/object:Gem::Version
@@ -76,14 +86,15 @@ dependencies:
76
86
  type: :development
77
87
  prerelease: false
78
88
  version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
79
90
  requirements:
80
91
  - - ~>
81
92
  - !ruby/object:Gem::Version
82
93
  version: '10.1'
83
- description: "\nHypDiff compares HTML snippets. It generates a diff between two input
84
- snippets. The diff is a new HTML snippet that highlights textual changes. The tag
85
- structure and formatting of the input snippets is preserved. The generated diff
86
- snippet is valid, well-formed HTML and suitable for presentation inside a WYSIWYG
94
+ description: ! "\nHypDiff compares HTML snippets. It generates a diff between two
95
+ input snippets. The diff is a new HTML snippet that highlights textual changes.
96
+ The tag structure and formatting of the input snippets is preserved. The generated
97
+ diff snippet is valid, well-formed HTML and suitable for presentation inside a WYSIWYG
87
98
  environment.\n "
88
99
  email:
89
100
  - kris.hanekamp@gmail.com
@@ -107,26 +118,33 @@ files:
107
118
  homepage: https://github.com/krishan/hyp_diff
108
119
  licenses:
109
120
  - MIT
110
- metadata: {}
111
121
  post_install_message:
112
122
  rdoc_options: []
113
123
  require_paths:
114
124
  - lib
115
125
  required_ruby_version: !ruby/object:Gem::Requirement
126
+ none: false
116
127
  requirements:
117
- - - '>='
128
+ - - ! '>='
118
129
  - !ruby/object:Gem::Version
119
130
  version: '0'
131
+ segments:
132
+ - 0
133
+ hash: -2073153059126079532
120
134
  required_rubygems_version: !ruby/object:Gem::Requirement
135
+ none: false
121
136
  requirements:
122
- - - '>='
137
+ - - ! '>='
123
138
  - !ruby/object:Gem::Version
124
139
  version: '0'
140
+ segments:
141
+ - 0
142
+ hash: -2073153059126079532
125
143
  requirements: []
126
144
  rubyforge_project:
127
- rubygems_version: 2.0.14
145
+ rubygems_version: 1.8.23
128
146
  signing_key:
129
- specification_version: 4
147
+ specification_version: 3
130
148
  summary: HypDiff compares html snippets
131
149
  test_files:
132
150
  - spec/hyp_diff_spec.rb
checksums.yaml DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- SHA1:
3
- metadata.gz: 7f4edc59168406b4b1194beb77ecde74bd4e2645
4
- data.tar.gz: e89d6a3a2a7c55250d3d9183c6f2b6fcdbb16a80
5
- SHA512:
6
- metadata.gz: d0197e591ec496470791dd49b63bcb78f88fa44d9d86e42bca2ddf95633f9f6576094cb4173aa7d29c71088482e2544c16fbb4ab30e29009947a1f6330f6e2a5
7
- data.tar.gz: ed945683196fe5997645ba09f38d16853c9d2acac68d72cf531d8590d8f42227ad3e8389c73d2e254b12ee58d9e6200e16aedd269f026d195323f51cf08cf07d