nice 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/assets/javascripts/nice_imp_jquery.js.coffee +16 -2
- data/lib/nice/html_parser.rb +46 -6
- data/lib/nice/middleware.rb +36 -18
- data/lib/nice/version.rb +1 -1
- metadata +5 -5
@@ -29,8 +29,22 @@ class NiceJquery
|
|
29
29
|
# remove all elements which are not of current state and all elements
|
30
30
|
# which are of current state and secondly annotated to be always updated.
|
31
31
|
@remove_state_elements: (event) ->
|
32
|
-
$("[data-state]").not("[data-state~='#{event.curr_state}']").
|
33
|
-
$("[data-state~='#{event.curr_state}'][data-state-update
|
32
|
+
a = jQuery.makeArray( $("[data-state]").not("[data-state~='#{event.curr_state}']").not("[data-state~='all']") )
|
33
|
+
a = a.concat jQuery.makeArray( $("[data-state~='#{event.curr_state}'][data-state-update]").not("[data-state~='all']") )
|
34
|
+
a = a.concat jQuery.makeArray( $("[data-state~='all'][data-state-update]") )
|
35
|
+
|
36
|
+
for elem in a
|
37
|
+
transition = $(elem).data('state-transition-class')
|
38
|
+
console.log "######## REMOVE ELEMENT: #{elem}"
|
39
|
+
if( transition )
|
40
|
+
$(elem).bind 'transitionend webkitTransitionEnd oTransitionEnd otransitionend', (e) ->
|
41
|
+
$(this).remove()
|
42
|
+
$(elem).addClass(transition)
|
43
|
+
else
|
44
|
+
$(elem).remove()
|
45
|
+
|
46
|
+
return null
|
47
|
+
|
34
48
|
|
35
49
|
# remove everything under the "root tag"
|
36
50
|
@clean_root_tree: (event) ->
|
data/lib/nice/html_parser.rb
CHANGED
@@ -8,7 +8,12 @@ module Nice
|
|
8
8
|
def self.remove_elements_not_of_state(state, doc)
|
9
9
|
|
10
10
|
doc.css("[data-state]").each do |node|
|
11
|
-
|
11
|
+
state_list = node.attribute('data-state').value.split(" ")
|
12
|
+
|
13
|
+
if !state_list.include?('all') &&
|
14
|
+
!state_list.include?(state) then
|
15
|
+
|
16
|
+
p "removed state: #{state_list}"
|
12
17
|
node.remove
|
13
18
|
end
|
14
19
|
end
|
@@ -21,20 +26,25 @@ module Nice
|
|
21
26
|
# get all nodes of the current state
|
22
27
|
doc.css("*[data-state-root]").remove if upper_root # for upper_root option remove tree below root to shorten the search
|
23
28
|
curr_state_nodes = doc.css("[data-state~='#{curr_state}']")
|
29
|
+
all_nodes = doc.css("[data-state~='all']")
|
30
|
+
|
24
31
|
|
25
32
|
# get reference nodes in DOM tree for current nodes and generate js insert statements
|
26
33
|
stack = curr_state_nodes.reverse.each_with_index.map do |curr_node,index|
|
27
34
|
|
28
|
-
|
29
|
-
|
35
|
+
# in case this node is not only assigned to the current state - check if it should be updated
|
36
|
+
if curr_node.attribute("data-state").value != curr_state &&
|
37
|
+
!curr_node.has_attribute?("data-state-update") then
|
30
38
|
next
|
31
39
|
end
|
32
40
|
|
33
|
-
ref_id = self.ref_node_uid(curr_state,curr_state_nodes.count - index)
|
41
|
+
ref_id = self.ref_node_uid( curr_state,curr_state_nodes.count - index)
|
34
42
|
ref_node_name = "[data-state-uid~=\'#{ref_id}\']"
|
35
43
|
ref_node = doc.css(ref_node_name)
|
36
|
-
|
37
|
-
|
44
|
+
|
45
|
+
if ref_node.blank?
|
46
|
+
next
|
47
|
+
end
|
38
48
|
|
39
49
|
#get index
|
40
50
|
idx = ref_node.attribute("data-state-uid").value.split(" ").find_index(ref_id)
|
@@ -50,6 +60,36 @@ module Nice
|
|
50
60
|
# remove unuseful chars which will break the js parser
|
51
61
|
js_text = js_text.gsub(/(\r\n|\n|\r|\t|\s\s)/,'')
|
52
62
|
end
|
63
|
+
|
64
|
+
# nodes with 'all' attribute
|
65
|
+
stack += all_nodes.reverse.each_with_index.map do |curr_node,index|
|
66
|
+
|
67
|
+
if !curr_node.has_attribute?("data-state-update") then
|
68
|
+
next
|
69
|
+
end
|
70
|
+
|
71
|
+
ref_id = self.ref_node_uid( 'all',all_nodes.count - index)
|
72
|
+
ref_node_name = "[data-state-uid~=\'#{ref_id}\']"
|
73
|
+
ref_node = doc.css(ref_node_name)
|
74
|
+
|
75
|
+
if ref_node.blank?
|
76
|
+
next
|
77
|
+
end
|
78
|
+
|
79
|
+
#get index
|
80
|
+
idx = ref_node.attribute("data-state-uid").value.split(" ").find_index(ref_id)
|
81
|
+
|
82
|
+
ref_node_method = ref_node.attribute('data-state-insert-method').value.split(" ")[idx]
|
83
|
+
|
84
|
+
if ref_node_method == "insert"
|
85
|
+
js_text = Nice::Js::Caller.generate_js_insert_after curr_node, ref_node_name
|
86
|
+
else
|
87
|
+
js_text = Nice::Js::Caller.generate_js_insert_inside curr_node, ref_node_name
|
88
|
+
end
|
89
|
+
|
90
|
+
# remove unuseful chars which will break the js parser
|
91
|
+
js_text = js_text.gsub(/(\r\n|\n|\r|\t|\s\s)/,'')
|
92
|
+
end
|
53
93
|
|
54
94
|
stack
|
55
95
|
end
|
data/lib/nice/middleware.rb
CHANGED
@@ -18,7 +18,12 @@ module Nice
|
|
18
18
|
## case 3: curr_state == prev_state
|
19
19
|
|
20
20
|
# => respond with JS which either first removes all elements of the current state and
|
21
|
-
# later inserts new content OR directly replaces elements
|
21
|
+
# later inserts new content OR directly replaces elements
|
22
|
+
|
23
|
+
|
24
|
+
## case 4: this is a normal ajax request responding with javascript from rails
|
25
|
+
|
26
|
+
# => ignore any NICE handling and return body unfiltered
|
22
27
|
|
23
28
|
|
24
29
|
def initialize(app)
|
@@ -30,32 +35,41 @@ module Nice
|
|
30
35
|
@referer = nil
|
31
36
|
|
32
37
|
status, @headers, @body = @app.call(env)
|
38
|
+
|
39
|
+
p ""
|
40
|
+
p "!!!!!!!! RAILS RESPONSE HEADERS: #{@headers}"
|
41
|
+
p ""
|
33
42
|
|
34
|
-
@
|
43
|
+
@call_is_js = Rack::Request.new(env).xhr?
|
44
|
+
@app_resp_is_js = js?
|
45
|
+
|
46
|
+
if !@app_resp_is_js && (html? || @call_is_js)
|
47
|
+
|
48
|
+
@referer = env["HTTP_REFERER"]
|
49
|
+
@method = env["REQUEST_METHOD"]
|
50
|
+
@path = env["PATH_INFO"]
|
35
51
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
# in case 2+3 the response will be plain javascript
|
42
|
-
if @is_js
|
43
|
-
@headers = {"Content-Type" => "text/javascript"}
|
44
|
-
end
|
52
|
+
# in case 2+3 the response will be plain javascript
|
53
|
+
if @call_is_js
|
54
|
+
@headers = {"Content-Type" => "text/javascript"}
|
55
|
+
end
|
45
56
|
|
46
57
|
[status, @headers, self]
|
58
|
+
|
47
59
|
else
|
48
|
-
[status, @headers, @body]
|
60
|
+
[status, @headers, @body]
|
49
61
|
end
|
50
62
|
end
|
51
63
|
|
52
|
-
def each(&block)
|
53
|
-
|
54
|
-
|
55
|
-
block.call(
|
56
|
-
|
57
|
-
|
64
|
+
def each(&block)
|
65
|
+
|
66
|
+
if !@app_resp_is_js && (html? || @call_is_js)
|
67
|
+
block.call("<!-- NICE Interception -->\n")
|
68
|
+
block.call( Nice::Logic.run( @method, @path, @referer, doc, @call_is_js) )
|
69
|
+
else
|
70
|
+
block.call(@body)
|
58
71
|
end
|
72
|
+
|
59
73
|
end
|
60
74
|
|
61
75
|
# Helper
|
@@ -64,6 +78,10 @@ module Nice
|
|
64
78
|
def html?
|
65
79
|
@headers["Content-Type"] && @headers["Content-Type"].include?("text/html")
|
66
80
|
end
|
81
|
+
|
82
|
+
def js?
|
83
|
+
@headers["Content-Type"] && ( @headers["Content-Type"].include?("text/javascript") || @headers["Content-Type"].include?("application/json") )
|
84
|
+
end
|
67
85
|
|
68
86
|
def doc
|
69
87
|
@doc ||= Nokogiri::HTML(body_to_string)
|
data/lib/nice/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nice
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-02-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -97,7 +97,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
97
97
|
version: '0'
|
98
98
|
segments:
|
99
99
|
- 0
|
100
|
-
hash:
|
100
|
+
hash: 3851994827556330401
|
101
101
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
102
102
|
none: false
|
103
103
|
requirements:
|
@@ -106,10 +106,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
106
106
|
version: '0'
|
107
107
|
segments:
|
108
108
|
- 0
|
109
|
-
hash:
|
109
|
+
hash: 3851994827556330401
|
110
110
|
requirements: []
|
111
111
|
rubyforge_project:
|
112
|
-
rubygems_version: 1.8.
|
112
|
+
rubygems_version: 1.8.24
|
113
113
|
signing_key:
|
114
114
|
specification_version: 3
|
115
115
|
summary: Nice / Nizza is a posh little town in south France.
|