omf_web 1.2.6 → 1.2.7

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.
Files changed (93) hide show
  1. data/.travis.yml +13 -0
  2. data/README.md +6 -0
  3. data/example/bridge/README.md +1 -1
  4. data/example/bridge/bridge.yaml +10 -0
  5. data/example/bridge/bridge_viz_server +41 -0
  6. data/example/bridge/data_sources/sensor-sqlite.rb +3 -2
  7. data/example/bridge/htdocs/graph/js/event_table.js +2 -7
  8. data/example/bridge/tabs/overview.yaml +82 -0
  9. data/example/openflow-gec15/dashboard_tab.yaml +1 -0
  10. data/example/simple/simple.yaml +1 -1
  11. data/example/simple/simple_dynamic.yaml +5 -3
  12. data/example/topo_discovery/data_sources/links.csv +3 -0
  13. data/example/topo_discovery/data_sources/links2.csv +21 -0
  14. data/example/topo_discovery/data_sources/node_info.csv +10 -0
  15. data/example/topo_discovery/data_sources/nodes.csv +4 -0
  16. data/example/topo_discovery/data_sources/nodes2.csv +11 -0
  17. data/example/topo_discovery/introduction.md +17 -0
  18. data/example/topo_discovery/topo_discovery_simple.yaml +35 -0
  19. data/example/topo_discovery/topo_discovery_simple2.yaml +32 -0
  20. data/example/topo_discovery/widgets/network.yaml +52 -0
  21. data/example/topo_discovery/widgets/node_info.yaml +23 -0
  22. data/lib/omf-web/content/file_repository.rb +5 -1
  23. data/lib/omf-web/content/git_repository.rb +11 -0
  24. data/lib/omf-web/content/repository.rb +13 -2
  25. data/lib/omf-web/data_source_proxy.rb +22 -10
  26. data/lib/omf-web/theme.rb +11 -4
  27. data/lib/omf-web/theme/abstract_page.rb +5 -0
  28. data/lib/omf-web/thin/server.rb +62 -16
  29. data/lib/omf-web/version.rb +1 -1
  30. data/lib/omf-web/widget/code_widget.rb +24 -23
  31. data/lib/omf-web/widget/data_widget.rb +14 -5
  32. data/lib/omf-web/widget/text/maruku.rb +16 -1
  33. data/lib/omf-web/widget/text/text_widget.rb +1 -1
  34. data/share/htdocs/graph/js/abstract_chart.js +7 -1
  35. data/share/htdocs/graph/js/abstract_multiple_datasource_chart.js +21 -3
  36. data/share/htdocs/graph/js/abstract_nv_chart.js +17 -11
  37. data/share/htdocs/graph/js/abstract_widget.js +44 -14
  38. data/share/htdocs/graph/js/line_chart3.js +5 -9
  39. data/share/htdocs/graph/js/map2.js +122 -79
  40. data/share/htdocs/graph/js/network2.js +205 -36
  41. data/share/htdocs/graph/js/table2.js +7 -11
  42. data/share/htdocs/js/data_source3.js +24 -4
  43. data/share/htdocs/vendor/VERSION_MAP.yaml +1 -1
  44. data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/css/font-awesome.css +251 -23
  45. data/share/htdocs/vendor/font-awesome-4.1.0/css/font-awesome.min.css +4 -0
  46. data/share/htdocs/vendor/font-awesome-4.1.0/fonts/FontAwesome.otf +0 -0
  47. data/share/htdocs/vendor/font-awesome-4.1.0/fonts/fontawesome-webfont.eot +0 -0
  48. data/share/htdocs/vendor/font-awesome-4.1.0/fonts/fontawesome-webfont.svg +504 -0
  49. data/share/htdocs/vendor/font-awesome-4.1.0/fonts/fontawesome-webfont.ttf +0 -0
  50. data/share/htdocs/vendor/font-awesome-4.1.0/fonts/fontawesome-webfont.woff +0 -0
  51. data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/less/bordered-pulled.less +0 -0
  52. data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/less/core.less +0 -0
  53. data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/less/fixed-width.less +0 -0
  54. data/share/htdocs/vendor/font-awesome-4.1.0/less/font-awesome.less +17 -0
  55. data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/less/icons.less +97 -3
  56. data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/less/larger.less +0 -0
  57. data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/less/list.less +0 -0
  58. data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/less/mixins.less +0 -0
  59. data/share/htdocs/vendor/font-awesome-4.1.0/less/path.less +14 -0
  60. data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/less/rotated-flipped.less +0 -0
  61. data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/less/spinning.less +8 -6
  62. data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/less/stacked.less +0 -0
  63. data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/less/variables.less +463 -329
  64. data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/scss/_bordered-pulled.scss +0 -0
  65. data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/scss/_core.scss +0 -0
  66. data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/scss/_fixed-width.scss +0 -0
  67. data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/scss/_icons.scss +97 -3
  68. data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/scss/_larger.scss +0 -0
  69. data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/scss/_list.scss +0 -0
  70. data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/scss/_mixins.scss +2 -2
  71. data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/scss/_path.scss +0 -0
  72. data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/scss/_rotated-flipped.scss +0 -0
  73. data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/scss/_spinning.scss +8 -6
  74. data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/scss/_stacked.scss +0 -0
  75. data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/scss/_variables.scss +464 -330
  76. data/share/htdocs/vendor/{font-awesome-4.0.3 → font-awesome-4.1.0}/scss/font-awesome.scss +1 -1
  77. data/share/htdocs/vendor/jquery-ui-1.8.23/js/jquery-ui.js +125 -0
  78. data/share/htdocs/vendor/spin/jquery.spin.js +46 -24
  79. data/share/htdocs/vendor/spin/spin.js +20 -17
  80. metadata +277 -237
  81. data/example/bridge/data_sources/test2.oml +0 -1808
  82. data/example/bridge/data_sources/test2.sq3 +0 -0
  83. data/example/bridge/data_sources/test31.sq3 +0 -0
  84. data/example/bridge/viz_server.rb +0 -59
  85. data/share/htdocs/vendor/font-awesome-4.0.3/css/font-awesome.min.css +0 -4
  86. data/share/htdocs/vendor/font-awesome-4.0.3/fonts/FontAwesome.otf +0 -0
  87. data/share/htdocs/vendor/font-awesome-4.0.3/fonts/fontawesome-webfont.eot +0 -0
  88. data/share/htdocs/vendor/font-awesome-4.0.3/fonts/fontawesome-webfont.svg +0 -414
  89. data/share/htdocs/vendor/font-awesome-4.0.3/fonts/fontawesome-webfont.ttf +0 -0
  90. data/share/htdocs/vendor/font-awesome-4.0.3/fonts/fontawesome-webfont.woff +0 -0
  91. data/share/htdocs/vendor/font-awesome-4.0.3/less/font-awesome.less +0 -17
  92. data/share/htdocs/vendor/font-awesome-4.0.3/less/path.less +0 -14
  93. data/share/htdocs/vendor/spin/spin.min.js +0 -1
@@ -0,0 +1,23 @@
1
+ data_sources:
2
+ - id: node_info
3
+ file: data_sources/node_info.csv
4
+
5
+ widgets:
6
+ - id: node_info
7
+ type: data/table2
8
+ title: Node Info
9
+ data_source:
10
+ name: node_info
11
+ slice:
12
+ slice_column: nodeID
13
+ event:
14
+ name: "graph.network/nodes.selected"
15
+ key: id
16
+ columns:
17
+ - field: property
18
+ #name: Name
19
+ - field: value
20
+ #name: Value
21
+
22
+ margin:
23
+ left: 5
@@ -33,7 +33,6 @@ module OMF::Web
33
33
  end
34
34
  end
35
35
 
36
- #
37
36
  # Return an array of file names which are in the repository and
38
37
  # match 'search_pattern'
39
38
  #
@@ -51,5 +50,10 @@ module OMF::Web
51
50
  end.compact
52
51
  end
53
52
 
53
+ protected
54
+
55
+ def _create_if_not_exists
56
+ FileUtils.mkdir_p(@top_dir) unless File.exist?(@top_dir)
57
+ end
54
58
  end # class
55
59
  end # module
@@ -80,5 +80,16 @@ module OMF::Web
80
80
  end
81
81
  res
82
82
  end
83
+
84
+ protected
85
+
86
+ def _create_if_not_exists
87
+ unless File.exist?("#{@top_dir}/.git")
88
+ FileUtils.mkdir_p(@top_dir)
89
+ Dir.chdir(@top_dir) do
90
+ system "git init"
91
+ end
92
+ end
93
+ end
83
94
  end # class
84
95
  end # module
@@ -77,7 +77,7 @@ module OMF::Web
77
77
  # raise "Unknown repository type '#{type}'"
78
78
  # end
79
79
 
80
- @@repositories[name] = r = create(opts)
80
+ @@repositories[name] = r = create(name, opts)
81
81
  @@primary_repository = r if opts[:is_primary]
82
82
  r
83
83
  end
@@ -191,11 +191,15 @@ module OMF::Web
191
191
  return GitContentRepository.create_url(path, strictly_new)
192
192
  end
193
193
 
194
+ def self.register_mime_type(mapping)
195
+ MIME_TYPE.merge!(mapping)
196
+ end
194
197
 
195
198
  attr_reader :name, :top_dir
196
199
 
197
200
  # params opts [Hash]
198
201
  # opts read_only [Boolean] If true, write will fail
202
+ # opts create_if_not_exists [Boolean]
199
203
  def initialize(name, opts)
200
204
  @name = name
201
205
  @url_prefix = "#{@name}:"
@@ -207,6 +211,8 @@ module OMF::Web
207
211
  end
208
212
  @top_dir = File.expand_path(@top_dir)
209
213
  debug "Creating repo '#{name} with top dir: #{@top_dir}"
214
+
215
+ _create_if_not_exists if opts[:create_if_not_exists]
210
216
  end
211
217
  end
212
218
 
@@ -313,7 +319,6 @@ module OMF::Web
313
319
  return path
314
320
  end
315
321
 
316
- #
317
322
  # Return a URL for a path in this repo
318
323
  #
319
324
  def get_url_for_path(path)
@@ -325,5 +330,11 @@ module OMF::Web
325
330
  #"\#<#{self.class}-#{@name} - #{@top_dir}>"
326
331
  "\#<#{self.class}-#{@name}>"
327
332
  end
333
+
334
+ protected
335
+
336
+ def _create_if_not_exists
337
+ raise NotImplementedError, "#{__method__} NOT implementated in #{self.class}"
338
+ end
328
339
  end # class
329
340
  end # module
@@ -67,9 +67,21 @@ module OMF::Web
67
67
  unless ds_name = ds_descr[:id] || ds_descr[:stream] || ds_descr[:name]
68
68
  raise "Missing 'name' attribute in datasource description. (#{ds_descr.inspect})"
69
69
  end
70
- ds_name = ds_name.to_sym
71
- ds = @@datasources[ds_name]
72
- ds != nil
70
+ if ds_descr[:sub_sources]
71
+ res = ds_descr[:sub_sources].inject(true) do |ok, name|
72
+ #puts ">>>>> #{ok} - #{name}"
73
+ ok && (@@datasources["#{ds_name}/#{name}".to_sym] != nil)
74
+ end
75
+ else
76
+ ds_name = ds_name.to_sym
77
+ ds = @@datasources[ds_name]
78
+ return true if ds
79
+
80
+ # Check for automatic sub sources
81
+ top = "#{ds_name}/"
82
+ names = @@datasources.keys.find_all { |ds_name| ds_name.to_s.start_with? top }
83
+ !names.empty?
84
+ end
73
85
  end
74
86
 
75
87
  # Return proxies for 'ds_name'. Note, there can be more then
@@ -85,8 +97,8 @@ module OMF::Web
85
97
  unless ds_descr.is_a? Hash
86
98
  raise "Expected Hash, but got '#{ds_descr.class}::#{ds_descr.inspect}'"
87
99
  end
88
- unless ds_name = ds_descr[:name]
89
- raise "Missing 'name' attribute in datasource description. (#{ds_descr.inspect})"
100
+ unless ds_name = ds_descr[:stream] || ds_descr[:name]
101
+ raise "Missing 'stream' or 'name' attribute in datasource description. (#{ds_descr.inspect})"
90
102
  end
91
103
  ds_name = ds_name.to_sym
92
104
  ds = @@datasources[ds_name]
@@ -104,11 +116,11 @@ module OMF::Web
104
116
  end
105
117
  if ds.is_a? Hash
106
118
  raise "Is this actually used anywhere?"
107
- proxies = ds.map do |name, ds|
108
- id = "#{ds_name}_#{name}".to_sym
109
- proxy = OMF::Web::SessionStore[id, :dsp] ||= self.new(id, ds)
110
- end
111
- return proxies
119
+ # proxies = ds.map do |name, ds|
120
+ # id = "#{ds_name}_#{name}".to_sym
121
+ # proxy = OMF::Web::SessionStore[id, :dsp] ||= self.new(id, ds)
122
+ # end
123
+ # return proxies
112
124
  end
113
125
 
114
126
  #debug ">>>>> DS: #{ds_descr.inspect} - #{ds}"
data/lib/omf-web/theme.rb CHANGED
@@ -26,7 +26,7 @@ module OMF::Web::Theme
26
26
 
27
27
  def self.register_renderer(name, klass, theme = DEFAULT_THEME)
28
28
  tr = @@additional_renderers[theme.to_s] ||= {}
29
- tr[name] = klass
29
+ tr[name.to_sym] = klass
30
30
  end
31
31
 
32
32
  # Set additional themes to search in the given order for
@@ -40,17 +40,24 @@ module OMF::Web::Theme
40
40
 
41
41
  # Return a named renderer for this theme initialised with 'widget'
42
42
  #
43
- def self.create_renderer(name, widget)
43
+ def self.create_renderer(name, widget, opts = {})
44
44
  name = name.to_sym
45
45
  @@search_order.each do |theme|
46
46
  if tr = @@additional_renderers[theme.to_s]
47
47
  if klass = tr[name]
48
48
  #self.require(name)
49
- return klass.new(widget)
49
+ return klass.new(widget, opts)
50
50
  end
51
51
  end
52
52
  end
53
- raise "Can't find class implementing renderer '#{name}' in '#{@@search_order.join(', ')}'"
53
+ renderers = Set.new
54
+ @@search_order.each do |theme|
55
+ if tr = @@additional_renderers[theme.to_s]
56
+ tr.keys.each {|n| renderers << n}
57
+ end
58
+ end
59
+ #raise "Can't find class implementing renderer '#{name}' in '#{@@search_order.join(', ')}'"
60
+ raise "Can't find class implementing renderer '#{name}' - #{renderers.to_a.inspect}"
54
61
  end
55
62
 
56
63
  def self.require(name)
@@ -19,6 +19,11 @@ module OMF::Web::Theme
19
19
  depends_on :script, %{
20
20
  // ABSTRACT PAGE
21
21
  if (typeof(OML) == "undefined") OML = {};
22
+ OML._shim = {}
23
+ OML.require_dependency = function(target, dependencies) {
24
+ OML._shim[target] = dependencies
25
+ require.config({shim: OML._shim});
26
+ }
22
27
  }
23
28
 
24
29
  attr_reader :opts
@@ -23,14 +23,17 @@ module OMF::Web
23
23
  pre_parse: lambda do |p, runner|
24
24
  p.on("--config CONF_FILE", "File holding description of web site") {|f| runner.options[:omf_config_file] = f}
25
25
  p.on("--top-dir DIR", "Directory to start from for relative data paths [directory of config file]") {|td| @top_dir = td }
26
- end,
27
- post_parse: lambda { |r| load_environment(r.options) },
26
+ end
28
27
  },
29
28
  authentication: {
30
29
  required: false
31
30
  }
32
31
  }.merge(opts)
33
-
32
+ post_parse = opts[:handlers][:post_parse]
33
+ opts[:handlers][:post_parse] = lambda do |r|
34
+ post_parse.call(r) if post_parse
35
+ load_environment(r.options)
36
+ end
34
37
  @server_name = server_name
35
38
  @top_dir = top_dir
36
39
  @databases = {}
@@ -53,6 +56,16 @@ module OMF::Web
53
56
  @cfg_dir = File.dirname(cf)
54
57
  opts[:static_dirs].insert(0, File.absolute_path(File.join(@cfg_dir, 'htdocs')))
55
58
  @top_dir ||= @cfg_dir
59
+ load_config_file(cf, opts)
60
+ end
61
+
62
+ def load_config_file(cf, opts)
63
+ unless File.readable? cf
64
+ fatal "Can't read config file '#{cf}'"
65
+ abort
66
+ end
67
+
68
+ debug "Loading config file '#{cf}'"
56
69
  cfg = _rec_sym_keys(YAML.load_file(cf))
57
70
 
58
71
  if log_opts = cfg[:logging]
@@ -80,20 +93,54 @@ module OMF::Web
80
93
  tabs.each {|t| t[:top_level] = true}
81
94
  widgets += tabs
82
95
  end
83
- if widgets.empty?
84
- fatal "Can't find 'widgets' or 'tabs' section in config file '#{cf}' - #{cfg.keys}"
85
- abort
86
- end
96
+ # if widgets.empty?
97
+ # fatal "Can't find 'widgets' or 'tabs' section in config file '#{cf}' - #{cfg.keys}"
98
+ # abort
99
+ # end
87
100
  widgets.each do |w|
88
101
  register_widget w
89
102
  end
90
103
 
91
104
  # Any other file to load before opening shop
92
- if init = cfg[:init]
93
- unless init.is_a? Enumerable
94
- init = [init]
105
+ if load = cfg[:load]
106
+ unless load.is_a? Enumerable
107
+ load = [load]
108
+ end
109
+ load.each do |g| #{|f| load_ruby_file(f) }
110
+ unless g.start_with? '/'
111
+ g = File.absolute_path(g, File.dirname(cf))
112
+ end
113
+ found_something = false
114
+ Dir.glob(g).each do |f|
115
+ found_something = true
116
+ load_ruby_file(f)
117
+ end
118
+ unless found_something
119
+ fatal "Couldn't find any load file for pattern '#{g}'"
120
+ abort
121
+ end
122
+ end
123
+ end
124
+
125
+ # Any other configure to load
126
+ if include = cfg[:include]
127
+ unless include.is_a? Enumerable
128
+ include = [include]
129
+ end
130
+ include.each do |g|
131
+ unless g.start_with? '/'
132
+ g = File.absolute_path(g, File.dirname(cf))
133
+ end
134
+ found_something = false
135
+ Dir.glob(g).each do |f|
136
+ found_something = true
137
+ load_config_file(f, opts)
138
+ end
139
+ unless found_something
140
+ fatal "Couldn't find any config file for pattern '#{g}'"
141
+ abort
142
+ end
95
143
  end
96
- init.each {|f| load_ruby_file(f) }
97
144
  end
98
145
 
99
146
  end
@@ -147,7 +194,6 @@ module OMF::Web
147
194
  def get_database(config)
148
195
  require 'omf_oml/table'
149
196
  require 'omf_oml/sql_source'
150
-
151
197
  if config.is_a? String
152
198
  if db = @databases[config]
153
199
  return db
@@ -173,8 +219,8 @@ module OMF::Web
173
219
  # inject top dir
174
220
  url.insert('sqlite:'.length, '//' + @cfg_dir + '/')
175
221
  end
176
- config[:check_interval] ||= 3.0
177
- puts "URL: #{url} - #{config}"
222
+ #config[:check_interval] ||= 3.0
223
+ #puts "URL: #{url} - #{config}"
178
224
  begin
179
225
  db = OMF::OML::OmlSqlSource.new(url, config)
180
226
  @databases[id] = db if id
@@ -195,7 +241,7 @@ module OMF::Web
195
241
  abort
196
242
  end
197
243
  unless file.start_with? '/'
198
- File.absolute_path(file, @cfg_dir)
244
+ file = File.absolute_path(file, @cfg_dir)
199
245
  end
200
246
  unless File.readable? file
201
247
  fatal "Can't read file '#{file}'"
@@ -298,7 +344,7 @@ module OMF::Web
298
344
  require 'digest/md5'
299
345
  w[:id] = Digest::MD5.hexdigest(w[:name] || "tab#{rand(10000)}")[0, 8]
300
346
  end
301
- w[:top_level] = true
347
+ #w[:top_level] = true
302
348
  w[:type] ||= 'layout/one_column'
303
349
  OMF::Web.register_widget w
304
350
  end
@@ -1,7 +1,7 @@
1
1
 
2
2
  module OMF
3
3
  module Web
4
- VERSION = '1.2.6'
4
+ VERSION = '1.2.7'
5
5
  # Used for finding the example directory
6
6
  TOP_DIR = File.dirname(File.dirname(File.dirname(__FILE__)))
7
7
  end
@@ -3,62 +3,63 @@ require 'omf-web/widget/abstract_widget'
3
3
  require 'omf-web/content/repository'
4
4
 
5
5
  module OMF::Web::Widget
6
-
6
+
7
7
  # Maintains the context for a particular code rendering within a specific session.
8
8
  #
9
9
  class CodeWidget < AbstractWidget
10
-
10
+
11
11
  def self.create_code_widget(type, wdescr)
12
12
  return self.new(wdescr)
13
13
  end
14
-
14
+
15
15
  attr_accessor :content_proxy
16
-
16
+
17
17
  def initialize(opts)
18
18
  super opts
19
19
  unless (content_descr = opts[:content])
20
20
  raise "Missing 'content' option in '#{opts.describe}'"
21
- end
21
+ end
22
22
  @content_proxy = OMF::Web::ContentRepository.create_content_proxy_for(content_descr, opts)
23
23
  end
24
-
25
- def title
24
+
25
+ def title
26
26
  @content_proxy.name
27
27
  end
28
-
28
+
29
29
  def mime_type
30
30
  @content_proxy.mime_type
31
31
  end
32
-
32
+
33
33
  def update_url
34
34
  @content_proxy.content_url
35
35
  end
36
-
36
+
37
37
  def content_id
38
- @content_proxy.content_id
38
+ @content_proxy.content_url
39
+ #@content_proxy.content_id
39
40
  end
40
-
41
+
41
42
  def content()
42
43
  OMF::Web::Theme.require 'code_renderer'
43
44
  mode = @content_proxy.mime_type.split('/')[-1]
44
45
  OMF::Web::Theme::CodeRenderer.new(self, @content_proxy.content, mode, @opts)
45
46
  end
46
-
47
+
47
48
  def collect_data_sources(ds_set)
48
49
  ds_set
49
50
  end
50
-
51
-
51
+
52
+
52
53
  # @@codeType2mime = {
53
54
  # :ruby => '/text/ruby',
54
55
  # :xml => '/text/xml'
55
56
  # }
56
-
57
+
57
58
  # def render_code(source)
58
59
  # content = load_content(source)
59
60
  # type = code_type(source)
60
61
  # mimeType = @@codeType2mime[type]
61
- #
62
+ #
62
63
  # begin
63
64
  # CodeRay.scan content, type
64
65
  # #tokens.html :line_numbers => :inline, :tab_width => 2, :wrap => :div
@@ -67,15 +68,15 @@ module OMF::Web::Widget
67
68
  # debug ex.backtrace.join("\n")
68
69
  # end
69
70
  # end
70
-
71
+
71
72
  # def load_content(source)
72
73
  # unless File.readable?(source)
73
74
  # raise "Cannot read text file '#{source}'"
74
75
  # end
75
76
  # content = File.open(source).read
76
77
  # end
77
-
78
- # Return the language the code is written in
78
+
79
+ # Return the language the code is written in
79
80
  #
80
81
  def code_type(source)
81
82
  if source.end_with? '.rb'
@@ -86,8 +87,8 @@ module OMF::Web::Widget
86
87
  :text
87
88
  end
88
89
  end
89
-
90
-
90
+
91
+
91
92
  end # CodeWidget
92
-
93
+
93
94
  end