omf_web 1.2.3 → 1.2.4
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.
- data/lib/irods4r/file.rb +2 -0
- data/lib/irods4r/icommands.rb +5 -0
- data/lib/irods4r.rb +1 -1
- data/lib/omf-web/content/git_repository.rb +3 -1
- data/lib/omf-web/content/irods_repository.rb +1 -1
- data/lib/omf-web/content/repository.rb +1 -0
- data/lib/omf-web/data_source_proxy.rb +14 -0
- data/lib/omf-web/theme/abstract_page.rb +4 -1
- data/lib/omf-web/thin/logging.rb +8 -1
- data/lib/omf-web/version.rb +1 -1
- data/lib/omf-web/widget/data_widget.rb +6 -1
- data/lib/omf-web/widget/text/maruku/helpers.rb +211 -211
- data/lib/omf-web/widget/text/maruku/input/parse_block.rb +498 -499
- data/lib/omf-web/widget/text/maruku/output/to_html.rb +810 -808
- data/lib/omf-web/widget/text/maruku.rb +54 -18
- data/lib/omf-web/widget/text/text_widget.rb +13 -13
- data/share/htdocs/graph/js/abstract_widget.js +1 -1
- data/share/htdocs/js/data_source3.js +36 -8
- data/share/htdocs/js/data_source_repo.js +14 -6
- metadata +2 -2
@@ -4,6 +4,8 @@
|
|
4
4
|
require 'maruku'
|
5
5
|
require 'maruku/ext/math'
|
6
6
|
# Monkey patches to add line numbers to html output
|
7
|
+
|
8
|
+
require 'omf_web'
|
7
9
|
require 'omf-web/widget/text/maruku/input/parse_block'
|
8
10
|
require 'omf-web/widget/text/maruku/output/to_html'
|
9
11
|
require 'omf-web/widget/text/maruku/helpers'
|
@@ -29,31 +31,66 @@ module OMF::Web::Widget::Text
|
|
29
31
|
|
30
32
|
# Fetch text and parse it
|
31
33
|
#
|
32
|
-
def self.
|
34
|
+
def self.format_content_proxy(content_proxy)
|
33
35
|
unless content_proxy.is_a? OMF::Web::ContentProxy
|
34
36
|
raise "Expected content proxy, but got '#{content_proxy.class}'"
|
35
37
|
end
|
36
|
-
|
37
|
-
|
38
|
+
format_content(content_proxy.content)
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.format_content(content)
|
38
42
|
::Maruku.new(content)
|
39
43
|
end
|
40
44
|
|
41
45
|
|
42
|
-
class WidgetElement
|
46
|
+
class WidgetElement < OMF::Base::LObject
|
47
|
+
|
48
|
+
@@pre_create_handlers = []
|
49
|
+
|
50
|
+
# Register a block which is presented with the
|
51
|
+
# widget description (Hash) we are about to create. The
|
52
|
+
# block is assumed to return a widget description.
|
53
|
+
#
|
54
|
+
def self.on_pre_create(&block)
|
55
|
+
@@pre_create_handlers << block
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.create(wdescr)
|
59
|
+
wdescr = @@pre_create_handlers.reduce(wdescr) do |wd, block|
|
60
|
+
wd2 = block.call(wd)
|
61
|
+
unless wd2.is_a? Hash
|
62
|
+
raise "Pre_create handler '#{block}' does not return hash, but '#{wd2}'"
|
63
|
+
end
|
64
|
+
wd2
|
65
|
+
end
|
66
|
+
self.new(wdescr)
|
67
|
+
end
|
68
|
+
|
43
69
|
attr_reader :widget
|
44
70
|
|
45
71
|
def initialize(wdescr)
|
72
|
+
debug "Embedding widget - #{wdescr} "
|
46
73
|
@wdescr = wdescr
|
47
74
|
@widget = OMF::Web::Widget.create_widget(wdescr)
|
75
|
+
debug "Created widget - #{@widget.class}"
|
48
76
|
end
|
49
77
|
|
50
78
|
def to_html
|
51
79
|
content = @widget.content
|
52
80
|
h = content.to_html
|
53
|
-
|
54
|
-
|
81
|
+
klass = ['embedded']
|
82
|
+
if caption = @wdescr[:caption] || @widget.title
|
83
|
+
if mt = @wdescr[:mime-type]
|
84
|
+
klass << "embedded-#{mt.gsub('/', '-')}"
|
85
|
+
end
|
86
|
+
if ty = @wdescr[:type]
|
87
|
+
klass << "embedded-#{ty.gsub('/', '-')}"
|
88
|
+
end
|
89
|
+
h += "<div class='caption'><span class='figure'>Figure: </span><span class='text'>#{caption}</span></div>"
|
55
90
|
end
|
56
|
-
::REXML::Document.new("<div class='
|
91
|
+
root = ::REXML::Document.new("<div class='#{klass.join(' ')}'>#{h}</div>").root
|
92
|
+
#puts "EMBEDDED >>> #{root}"
|
93
|
+
root
|
57
94
|
end
|
58
95
|
|
59
96
|
def node_type
|
@@ -80,7 +117,7 @@ module OMF::Web::Widget::Text
|
|
80
117
|
descr = YAML::load(lines.join("\n"))
|
81
118
|
descr = OMF::Web::deep_symbolize_keys(descr)
|
82
119
|
if (wdescr = descr[:widget])
|
83
|
-
wel = WidgetElement.
|
120
|
+
wel = WidgetElement.create(wdescr)
|
84
121
|
context << wel
|
85
122
|
(doc.attributes[:widgets] ||= []) << wel.widget
|
86
123
|
else
|
@@ -94,13 +131,12 @@ module OMF::Web::Widget::Text
|
|
94
131
|
|
95
132
|
end # OMF::Web::Widget::Text
|
96
133
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
# end
|
134
|
+
if __FILE__ == $0
|
135
|
+
unless fname = ARGV[0]
|
136
|
+
puts "ERROR: Missing file name"
|
137
|
+
exit -1
|
138
|
+
end
|
139
|
+
content = File.open(fname).read
|
140
|
+
x = OMF::Web::Widget::Text::Maruku.format_content(content)
|
141
|
+
puts x.to_html
|
142
|
+
end
|
@@ -4,49 +4,49 @@ require 'omf-web/content/repository'
|
|
4
4
|
|
5
5
|
module OMF::Web::Widget
|
6
6
|
|
7
|
-
# Supports widgets which displays text with
|
7
|
+
# Supports widgets which displays text with
|
8
8
|
# potentially other widgets embedded.
|
9
9
|
#
|
10
10
|
class TextWidget < AbstractWidget
|
11
|
-
|
11
|
+
|
12
12
|
def self.create_text_widget(type, wdescr)
|
13
13
|
return self.new(wdescr)
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
def initialize(opts)
|
17
17
|
opts = opts.dup # not sure why we may need to this. Is this hash used anywhere else?
|
18
|
-
super opts
|
18
|
+
super opts
|
19
19
|
|
20
20
|
unless (content_descr = opts[:content])
|
21
21
|
raise "Missing 'content' option in '#{opts.inspect}'"
|
22
|
-
end
|
22
|
+
end
|
23
23
|
# if content_descr.is_a? OMF::Web::ContentProxy
|
24
24
|
# self.content_proxy = content_descr
|
25
|
-
# else
|
25
|
+
# else
|
26
26
|
# #self.content_proxy = OMF::Web::ContentRepository[opts].load(content_descr)
|
27
27
|
# self.content_proxy = OMF::Web::ContentRepository.create_content_proxy_for(content_descr, opts)
|
28
28
|
# end
|
29
29
|
self.content_proxy = OMF::Web::ContentRepository.create_content_proxy_for(content_descr, opts)
|
30
30
|
end
|
31
|
-
|
31
|
+
|
32
32
|
def content_proxy=(content_proxy)
|
33
33
|
@content_proxy = content_proxy
|
34
34
|
end
|
35
|
-
|
35
|
+
|
36
36
|
def content()
|
37
|
-
update()
|
37
|
+
update()
|
38
38
|
OMF::Web::Theme.require 'text_renderer'
|
39
39
|
@opts[:title] = @content.attributes[:title] || opts[:title]
|
40
40
|
OMF::Web::Theme::TextRenderer.new(self, @content, @opts)
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
43
|
def update()
|
44
44
|
# Could avoid doing the next three steps every time if we would know if the
|
45
45
|
# content in content_proxy has changed.
|
46
|
-
@content = OMF::Web::Widget::Text::Maruku.
|
46
|
+
@content = OMF::Web::Widget::Text::Maruku.format_content_proxy(@content_proxy)
|
47
47
|
@widgets = @content.attributes[:widgets] || []
|
48
48
|
end
|
49
|
-
|
49
|
+
|
50
50
|
|
51
51
|
def content_url
|
52
52
|
@content_proxy.content_url
|
@@ -55,7 +55,7 @@ module OMF::Web::Widget
|
|
55
55
|
def content_id
|
56
56
|
@content_proxy.content_id
|
57
57
|
end
|
58
|
-
|
58
|
+
|
59
59
|
def mime_type
|
60
60
|
'text/html'
|
61
61
|
end
|
@@ -134,7 +134,7 @@ define(['omf/data_source_repo', 'vendor/d3/d3'], function(ds_repo) {
|
|
134
134
|
// Find the appropriate data source and bind to it
|
135
135
|
//
|
136
136
|
init_single_data_source: function(ds_descr) {
|
137
|
-
var ds = ds_repo.lookup(ds_descr
|
137
|
+
var ds = ds_repo.lookup(ds_descr);
|
138
138
|
var self = this;
|
139
139
|
OHUB.bind(ds.event_name, function() {
|
140
140
|
self.update();;
|
@@ -172,8 +172,8 @@ function omf_web_data_source(opts) {
|
|
172
172
|
// Reset state
|
173
173
|
rows = [];
|
174
174
|
update_indexes();
|
175
|
-
var sm = {col_name: active_slice_col_name, col_value: col_value}
|
176
|
-
send_server_msg('request_slice', {slice: sm})
|
175
|
+
var sm = {col_name: active_slice_col_name, col_value: col_value};
|
176
|
+
send_server_msg('request_slice', {slice: sm});
|
177
177
|
}
|
178
178
|
var active_slice_col_name = null;
|
179
179
|
var active_slice_value = null;
|
@@ -211,6 +211,28 @@ function omf_web_data_source(opts) {
|
|
211
211
|
return true;
|
212
212
|
}
|
213
213
|
|
214
|
+
function fetch_data(data_url) {
|
215
|
+
require(['vendor/jquery/jquery'], function() {
|
216
|
+
$.ajax({
|
217
|
+
url: data_url,
|
218
|
+
dataType: 'json',
|
219
|
+
//data: opts,
|
220
|
+
type: 'GET'
|
221
|
+
}).done(function(reply) {
|
222
|
+
var data = reply.data;
|
223
|
+
rows.splice(0, rows.length); // this is an update, not an add
|
224
|
+
_.each(data, function(r) { rows.push(r); });
|
225
|
+
|
226
|
+
update_indexes();
|
227
|
+
var evt = {data_source: data_source};
|
228
|
+
OHUB.trigger(event_name, evt);
|
229
|
+
OHUB.trigger("data_source.changed", evt);
|
230
|
+
}).error(function(ajax, textStatus, errorThrown) {
|
231
|
+
console.log("ERROR: '" + textStatus + "' - " + errorThrown);
|
232
|
+
});
|
233
|
+
});
|
234
|
+
}
|
235
|
+
|
214
236
|
// Let's check if this data_source maintains uniqueness along one axis (column)
|
215
237
|
if (opts.unique_column) {
|
216
238
|
var col_name = opts.unique_column;
|
@@ -233,7 +255,7 @@ function omf_web_data_source(opts) {
|
|
233
255
|
}
|
234
256
|
key2row[key] = row;
|
235
257
|
return false;
|
236
|
-
}
|
258
|
+
};
|
237
259
|
// pre-seed
|
238
260
|
rows = _.uniq(rows, false, function(r) { return r[index]; });
|
239
261
|
_.each(rows, function(r) { key2row[r[index]] = r; });
|
@@ -262,7 +284,7 @@ function omf_web_data_source(opts) {
|
|
262
284
|
var schema = msg.schema || msg.data_source.schema;
|
263
285
|
|
264
286
|
var key = so.event.key;
|
265
|
-
var col = _.find(schema, function(cd) { return cd.name == key });
|
287
|
+
var col = _.find(schema, function(cd) { return cd.name == key; });
|
266
288
|
if (col) {
|
267
289
|
var event = msg.datum;
|
268
290
|
var col_id = event[col.index];
|
@@ -270,12 +292,18 @@ function omf_web_data_source(opts) {
|
|
270
292
|
set_slice_column(col_id);
|
271
293
|
}
|
272
294
|
}
|
273
|
-
})
|
295
|
+
});
|
274
296
|
}
|
275
297
|
}
|
276
298
|
|
277
|
-
if (window.WebSocket) {
|
299
|
+
if (window.WebSocket && opts.ws_url) {
|
278
300
|
start_web_socket();
|
301
|
+
} else if (opts.update_url) {
|
302
|
+
throw "Missing implementation for NON web socket browsers";
|
303
|
+
} else if (opts.data_url) {
|
304
|
+
fetch_data(opts.data_url);
|
305
|
+
} else {
|
306
|
+
throw "Don't know how to fetch data source '" + name + "'.";
|
279
307
|
}
|
280
308
|
|
281
309
|
// Bind to event directly
|
@@ -289,7 +317,7 @@ function omf_web_data_source(opts) {
|
|
289
317
|
define(function() {
|
290
318
|
return function(opts) {
|
291
319
|
return omf_web_data_source(opts);
|
292
|
-
}
|
293
|
-
})
|
320
|
+
};
|
321
|
+
});
|
294
322
|
|
295
323
|
|
@@ -18,15 +18,23 @@ define(['omf/data_source3'], function(data_source) {
|
|
18
18
|
var name;
|
19
19
|
var dynamic = false;
|
20
20
|
|
21
|
-
if (typeof(ds_descr)
|
22
|
-
|
23
|
-
dynamic = ds_descr.dynamic;
|
24
|
-
} else {
|
25
|
-
name = ds_descr;
|
21
|
+
if (typeof(ds_descr) != 'object') {
|
22
|
+
ds_descr = {name: ds_descr};
|
26
23
|
}
|
24
|
+
name = ds_descr.id || ds_descr.stream || ds_descr.name;
|
25
|
+
dynamic = ds_descr.dynamic;
|
27
26
|
var source = sources[name];
|
28
27
|
if (! source) {
|
29
|
-
|
28
|
+
// Let's see if we can create one out of
|
29
|
+
if (ds_descr.data_url) {
|
30
|
+
// We can try to fetch it directly
|
31
|
+
if (! name) {
|
32
|
+
name = ds_descr.id = ds_descr.data_url;
|
33
|
+
}
|
34
|
+
source = sources[name] = data_source(ds_descr);
|
35
|
+
} else {
|
36
|
+
throw("Unknown data source '" + name + "'.");
|
37
|
+
}
|
30
38
|
}
|
31
39
|
if (dynamic) {
|
32
40
|
source.is_dynamic(dynamic);
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: omf_web
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.4
|
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: 2014-
|
12
|
+
date: 2014-03-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: omf_oml
|