rubyang 0.1.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.
@@ -0,0 +1,48 @@
1
+ <div class="page-header">
2
+ <h2>A Container</h2>
3
+ </div>
4
+
5
+ <div class="well">
6
+ <div class="" id="root" data-schemapath="/"></div>
7
+
8
+ <div>
9
+ <button type="button" class="btn btn-success button-ok" data-toggle="modal">OK</button>
10
+ </div>
11
+ </div>
12
+
13
+ <% content_for :javascript do %>
14
+ <script type="text/javascript">
15
+ $(document).ready(function(){
16
+ $('#myModal2').modal();
17
+ $('#myModal2 .progress-bar').css('width', '33%');
18
+ $.ajax({
19
+ type: 'GET',
20
+ url: "api/schema",
21
+ dataType: 'json'
22
+ }).done(function(data){
23
+ $('#myModal2 .progress-bar').css('width', '67%');
24
+ make_form(data, 'root');
25
+ $.ajax({
26
+ type: 'GET',
27
+ url: "api/data",
28
+ dataType: 'json'
29
+ }).done(function(data){
30
+ set_config(data, 'root');
31
+ $('#myModal2 .progress-bar').css('width', '100%');
32
+ $('#myModal2').modal('hide');
33
+ }).fail(function(data){
34
+ alert('failed to load config');
35
+ $('#myModal2 .progress-bar').css('width', '100%');
36
+ $('#myModal2').modal('hide');
37
+ }).always(function(data){
38
+ });
39
+ }).fail(function(data){
40
+ alert('failed to load schema');
41
+ $('#myModal2 .progress-bar').css('width', '100%');
42
+ $('#myModal2').modal('hide');
43
+ }).always(function(data){
44
+ });
45
+ });
46
+ </script>
47
+ <% end %>
48
+
@@ -0,0 +1,82 @@
1
+ <!DOCTYPE html>
2
+ <html lang="ja">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1">
7
+ <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
8
+ <title>Rubyang WebUI</title>
9
+ <!-- Bootstrap -->
10
+ <!-- <link href="css/bootstrap.min.css" rel="stylesheet"> -->
11
+ <!-- Latest compiled and minified CSS -->
12
+ <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
13
+ </head>
14
+ <body>
15
+ <div class="container-fluid" style="background-color:black;color:white;height:50;">
16
+ <h1>Rubyang::WebUI</h1>
17
+ </div>
18
+ <div class="container">
19
+ <div class="row">
20
+ <div class="col-md-3 sidebar">
21
+ <ul class="nav nav-pills nav-stacked">
22
+ <li data-toggle="collapse" href="#collapse-A">
23
+ <a href="#"><span class="caret"></span> menu A</a>
24
+ </li>
25
+ <ul id="collapse-A" class="collapse" style="list-style-type:none;">
26
+ <li><a href="A-1"><span class="fa fa-angle-double-right fa-fw"></span> A-1</a>
27
+ <li><a href="A-2"><span class="fa fa-angle-double-right fa-fw"></span> A-2</a>
28
+ <li><a href="A-3"><span class="fa fa-angle-double-right fa-fw"></span> A-3</a>
29
+ </ul>
30
+ <li data-toggle="collapse" href="#collapse-B">
31
+ <a href="#"><span class="caret"></span> menu B</a>
32
+ </li>
33
+ <ul id="collapse-B" class="collapse" style="list-style-type:none;">
34
+ <li><a href="B-1"><span class="fa fa-angle-double-right fa-fw"> B-1</a>
35
+ <li><a href="B-2"><span class="fa fa-angle-double-right fa-fw"> B-2</a>
36
+ <li><a href="B-3"><span class="fa fa-angle-double-right fa-fw"> B-3</a>
37
+ </ul>
38
+ </ul>
39
+ </div>
40
+ <div class="col-md-9">
41
+ <%= yield %>
42
+ </div>
43
+ </div>
44
+ </div>
45
+ <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
46
+ <div class="modal-dialog">
47
+ <div class="modal-content">
48
+ <div class="modal-header">
49
+ <h4 class="modal-title" id="myModalLabel"><i class="fa fa-clock-o"></i>Please Wait ...</h4>
50
+ </div>
51
+ <div class="modal-body center-block">
52
+ <div class="progress">
53
+ <div class="progress-bar progress-bar-striped active" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100" style="width:100%"></div>
54
+ </div>
55
+ </div>
56
+ </div>
57
+ </div>
58
+ </div>
59
+ <div class="modal fade" id="myModal2" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
60
+ <div class="modal-dialog">
61
+ <div class="modal-content">
62
+ <div class="modal-header">
63
+ <h4 class="modal-title" id="myModalLabel"><i class="fa fa-clock-o"></i>Please Wait ...</h4>
64
+ </div>
65
+ <div class="modal-body center-block">
66
+ <div class="progress">
67
+ <div class="progress-bar progress-bar-striped active" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100" style="width:0%"></div>
68
+ </div>
69
+ </div>
70
+ </div>
71
+ </div>
72
+ </div>
73
+ <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
74
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
75
+ <!-- Include all compiled plugins (below), or include individual files as needed -->
76
+ <!-- <script src="js/bootstrap.min.js"></script> -->
77
+ <!-- Latest compiled and minified JavaScript -->
78
+ <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>
79
+ <script type="text/javascript" src="/js/webui.js"></script>
80
+ <%= yield_content :javascript %>
81
+ </body>
82
+ </html>
@@ -0,0 +1,224 @@
1
+ # coding utf-8
2
+
3
+ require_relative 'xpath/parser'
4
+
5
+ module Rubyang
6
+ module Xpath
7
+ class LocationSteps < Array
8
+ def initialize *location_steps
9
+ self.push *location_steps
10
+ end
11
+ end
12
+
13
+ class LocationStep
14
+ attr_reader :axis, :node_test, :predicates
15
+
16
+ def initialize axis, node_test, predicates
17
+ @axis = axis
18
+ @node_test = node_test
19
+ @predicates = predicates
20
+ end
21
+ end
22
+
23
+ class Axis
24
+ ANCESTOR ||= 'ancestor'
25
+ ANCESTOR_OR_SELF ||= 'ancestor-or-self'
26
+ ATTRIBUTE ||= 'attribute'
27
+ CHILD ||= 'child'
28
+ DESCENDANT ||= 'descendant'
29
+ DESCENDANT_OR_SELF ||= 'descendant-or-self'
30
+ FOLLOWING ||= 'following'
31
+ FOLLOWING_SIBLING ||= 'following-sibling'
32
+ NAMESPACE ||= 'namespace'
33
+ PARENT ||= 'parent'
34
+ PRECEDING ||= 'preceding'
35
+ PRECEDING_SIBLING ||= 'preceding-sibling'
36
+ SELF ||= 'self'
37
+
38
+ attr_reader :name
39
+
40
+ def initialize name
41
+ @name = name
42
+ end
43
+ end
44
+
45
+ class NodeTest
46
+ module NodeTestType
47
+ NAME_TEST ||= 'name-test'
48
+ NODE_TYPE ||= 'node-type'
49
+ PROCESSING_INSTRUCTION ||= 'processing-instruction'
50
+ end
51
+
52
+ class NameTest
53
+ attr_reader :name
54
+
55
+ def initialize name
56
+ @name = name
57
+ end
58
+ end
59
+
60
+ module NodeType
61
+ COMMENT ||= 'comment'
62
+ TEXT ||= 'text'
63
+ NODE ||= 'node'
64
+ end
65
+
66
+ class ProcessingInstruction
67
+ attr_reader :literal
68
+
69
+ def initialize literal
70
+ @literal = literal
71
+ end
72
+ end
73
+
74
+ attr_reader :node_test_type, :node_test
75
+
76
+ def initialize node_test_type, node_test
77
+ @node_test_type = node_test_type
78
+ @node_test = node_test
79
+ end
80
+ end
81
+
82
+ class Predicates < Array
83
+ def initialize *predicates
84
+ self.push *predicates
85
+ end
86
+ end
87
+
88
+ class Predicate
89
+ class Expr
90
+ end
91
+
92
+ class OrExpr < Expr
93
+ attr_reader :op1, :op2
94
+ def initialize op1, op2=nil
95
+ @op1 = op1
96
+ @op2 = op2
97
+ end
98
+ end
99
+
100
+ class AndExpr < Expr
101
+ attr_reader :op1, :op2
102
+ def initialize op1, op2=nil
103
+ @op1 = op1
104
+ @op2 = op2
105
+ end
106
+ end
107
+
108
+ class EqualityExpr < Expr
109
+ attr_reader :op1, :operator, :op2
110
+ def initialize op1, operator=nil, op2=nil
111
+ @op1 = op1
112
+ @operator = operator
113
+ @op2 = op2
114
+ end
115
+ end
116
+
117
+ class RelationalExpr < Expr
118
+ attr_reader :op1, :operator, :op2
119
+ def initialize op1, operator=nil, op2=nil
120
+ @op1 = op1
121
+ @operator = operator
122
+ @op2 = op2
123
+ end
124
+ end
125
+
126
+ class AdditiveExpr < Expr
127
+ attr_reader :op1, :operator, :op2
128
+ def initialize op1, operator=nil, op2=nil
129
+ @op1 = op1
130
+ @operator = operator
131
+ @op2 = op2
132
+ end
133
+ end
134
+
135
+ class MultiplicativeExpr < Expr
136
+ attr_reader :op1, :operator, :op2
137
+ def initialize op1, operator=nil, op2=nil
138
+ @op1 = op1
139
+ @operator = operator
140
+ @op2 = op2
141
+ end
142
+ end
143
+
144
+ class UnaryExpr < Expr
145
+ attr_reader :op1, :operator
146
+ def initialize op1, operator=nil
147
+ @op1 = op1
148
+ @operator = operator
149
+ end
150
+ end
151
+
152
+ class UnionExpr < Expr
153
+ attr_reader :op1, :operator, :op2
154
+ def initialize op1, operator=nil, op2=nil
155
+ @op1 = op1
156
+ @operator = operator
157
+ @op2 = op2
158
+ end
159
+ end
160
+
161
+ class PathExpr < Expr
162
+ attr_reader :op1, :operator, :op2
163
+ def initialize op1, operator=nil, op2=nil
164
+ @op1 = op1
165
+ @operator = operator
166
+ @op2 = op2
167
+ end
168
+ end
169
+
170
+ class FilterExpr < Expr
171
+ attr_reader :op1, :op2
172
+ def initialize op1, op2=nil
173
+ @op1 = op1
174
+ @op2 = op2
175
+ end
176
+ end
177
+
178
+ class PrimaryExpr < Expr
179
+ attr_reader :op1
180
+ def initialize op1
181
+ @op1 = op1
182
+ end
183
+ end
184
+
185
+ class Literal
186
+ attr_reader :value
187
+ def initialize value
188
+ @value = case value
189
+ when /^"(?:[^"])*"/
190
+ value.gsub(/^"/,'').gsub(/"$/,'').gsub(/\\n/,"\n").gsub(/\\t/,"\t").gsub(/\\"/,"\"").gsub(/\\\\/,"\\")
191
+ when /^'(?:[^'])*'/
192
+ value.gsub(/^'/,'').gsub(/'$/,'')
193
+ else
194
+ value
195
+ end
196
+ end
197
+ end
198
+
199
+ class Number
200
+ attr_reader :value
201
+ def initialize value
202
+ @value = value.to_f.to_s
203
+ end
204
+ end
205
+
206
+ class FunctionCall
207
+ CURRENT ||= 'current'
208
+
209
+ attr_reader :name, :args
210
+ def initialize name, args=[]
211
+ @name = name
212
+ @args = args
213
+ end
214
+ end
215
+
216
+ attr_reader :expr
217
+
218
+ def initialize expr
219
+ @expr = expr
220
+ end
221
+ end
222
+
223
+ end
224
+ end
@@ -0,0 +1,146 @@
1
+ # coding: utf-8
2
+
3
+ require 'strscan'
4
+
5
+ require_relative '../xpath.rb'
6
+
7
+ require_relative 'parser/parser.tab.rb'
8
+
9
+ module Rubyang
10
+ module Xpath
11
+ class Parser
12
+ DEBUG ||= false
13
+
14
+ def self.parse( xpath_str )
15
+ parser = self.new
16
+ parser.parse( xpath_str )
17
+ end
18
+
19
+ def initialize
20
+ end
21
+
22
+ def parse( xpath_str )
23
+ @tokens = Array.new
24
+
25
+ s = StringScanner.new( xpath_str )
26
+
27
+ scanre_list = [
28
+ ["(", /^\(/],
29
+ [")", /^\)/],
30
+ ["[", /^\[/],
31
+ ["]", /^\]/],
32
+ ["..", /^\.\./],
33
+ [".", /^\./],
34
+ ["@", /^\@/],
35
+ [",", /^\,/],
36
+ ["::", /^\:\:/],
37
+ ["Literal", /^(?:"[^"]*"|'[^']*')/],
38
+ ["Digits", /^[0-9]+/],
39
+ ["//", /^\/\//],
40
+ ["/", /^\//],
41
+ ["|", /^\|/],
42
+ ["+", /^\+/],
43
+ ["-", /^\-/],
44
+ ["!=", /^\!\=/],
45
+ ["<=", /^\<\=/],
46
+ [">=", /^\>\=/],
47
+ ["=", /^\=/],
48
+ ["<", /^\</],
49
+ [">", /^\>/],
50
+ ["and", /^and/],
51
+ ["or", /^or/],
52
+ ["mod", /^mod/],
53
+ ["div", /^div/],
54
+ ["$", /^\$/],
55
+ ["*", /^\*/],
56
+ [":", /^\:/],
57
+ ["S", /^[ \t]+/],
58
+ # NodeType
59
+ ["comment", /^comment/],
60
+ ["text", /^text/],
61
+ ["node", /^node/],
62
+ # ProcessingInstruction
63
+ ["processing-instruction", /^processing-instruction/],
64
+ # Axis
65
+ ["ancestor", /^ancestor/],
66
+ ["ancestor-or-self", /^ancestor-or-self/],
67
+ ["attribute", /^attribute/],
68
+ ["child", /^child/],
69
+ ["descendant", /^descendant/],
70
+ ["descendant-or-self", /^descendant-or-self/],
71
+ ["following", /^following/],
72
+ ["following-sibling", /^following-sibling/],
73
+ ["namespace", /^namespace/],
74
+ ["parent", /^parent/],
75
+ ["preceding", /^preceding/],
76
+ ["preceding-sibling", /^preceding-sibling/],
77
+ ["self", /^self/],
78
+ # FunctionName
79
+ ["last(", /^last[ \t]*\(/],
80
+ ["position(", /^position[ \t]*\(/],
81
+ ["count(", /^count[ \t]*\(/],
82
+ ["id(", /^id[ \t]*\(/],
83
+ ["local-name(", /^local-name[ \t]*\(/],
84
+ ["namespace-uri(", /^namespace-uri[ \t]*\(/],
85
+ ["name(", /^name[ \t]*\(/],
86
+ ["string(", /^string[ \t]*\(/],
87
+ ["concat(", /^concat[ \t]*\(/],
88
+ ["starts-with(", /^starts-with[ \t]*\(/],
89
+ ["contains(", /^contains[ \t]*\(/],
90
+ ["substring-before(", /^substring-before[ \t]*\(/],
91
+ ["substring-after(", /^substring-after[ \t]*\(/],
92
+ ["substring(", /^substring[ \t]*\(/],
93
+ ["string-length(", /^string-length[ \t]*\(/],
94
+ ["normalize-space(", /^normalize-space[ \t]*\(/],
95
+ ["translate(", /^translate[ \t]*\(/],
96
+ ["boolean(", /^boolean[ \t]*\(/],
97
+ ["not(", /^not[ \t]*\(/],
98
+ ["true(", /^true[ \t]*\(/],
99
+ ["false(", /^false[ \t]*\(/],
100
+ ["lang(", /^lang[ \t]*\(/],
101
+ ["number(", /^number[ \t]*\(/],
102
+ ["sum(", /^sum[ \t]*\(/],
103
+ ["floor(", /^floor[ \t]*\(/],
104
+ ["ceiling(", /^ceiling[ \t]*\(/],
105
+ ["round(", /^round[ \t]*\(/],
106
+ ["current(", /^current[ \t]*\(/],
107
+ # NCName
108
+ ["NCName", /^(?:[A-Z]|\_|[a-z])(?:[A-Z]|\_|[a-z]|\-|\.|[0-9])*/],
109
+ ]
110
+
111
+ scanre = Regexp.union( scanre_list.map{ |scanre| scanre[1] } )
112
+
113
+ until s.eos?
114
+ token = s.scan( scanre )
115
+ #p token
116
+ next if "S" == scanre_list.find{ |s| s[1] =~ token }[0]
117
+ @tokens.push [scanre_list.find{ |s| s[1] =~ token }[0], token]
118
+ end
119
+
120
+ result = self.do_parse
121
+ result
122
+ end
123
+
124
+ def next_token
125
+ #p @tokens.first
126
+ @tokens.shift
127
+ end
128
+ end
129
+ end
130
+ end
131
+
132
+ if __FILE__ == $0
133
+ require 'yaml'
134
+
135
+ #str = "../leaf0"
136
+ #xpath = Rubyang::Xpath::Parser.parse(str)
137
+ #puts xpath.to_yaml
138
+
139
+ #str = "/hoge"
140
+ #xpath = Rubyang::Xpath::Parser.parse(str)
141
+ #puts xpath.to_yaml
142
+
143
+ str = "../hoge[name1 = current()/../container1/name]/leaf"
144
+ xpath = Rubyang::Xpath::Parser.parse(str)
145
+ puts xpath.to_yaml
146
+ end