infod 0.0.2 → 0.0.3.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.
Files changed (83) hide show
  1. data/infod.rb +51 -12
  2. data/infod/{Th/404.rb → 404.rb} +4 -16
  3. data/infod/500.rb +53 -0
  4. data/infod/GET.rb +104 -0
  5. data/infod/HEAD.rb +23 -0
  6. data/infod/HTTP.rb +105 -0
  7. data/infod/{Th/PATCH.rb → PATCH.rb} +0 -0
  8. data/infod/POST.rb +34 -0
  9. data/infod/audio.rb +30 -0
  10. data/infod/blog.rb +34 -0
  11. data/infod/cal.rb +72 -0
  12. data/infod/{Es/code.rb → code.rb} +7 -4
  13. data/infod/constants.rb +55 -0
  14. data/infod/{Es/css.rb → css.rb} +0 -0
  15. data/infod/{Es/csv.rb → csv.rb} +0 -0
  16. data/infod/{Es/du.rb → du.rb} +0 -0
  17. data/infod/edit.rb +73 -0
  18. data/infod/{H/facets.rb → facets.rb} +20 -11
  19. data/infod/{Es/feed.rb → feed.rb} +17 -16
  20. data/infod/{Es/find.rb → find.rb} +2 -3
  21. data/infod/forum.rb +13 -0
  22. data/infod/{Es/fs.rb → fs.rb} +5 -2
  23. data/infod/glob.rb +26 -0
  24. data/infod/graph.rb +131 -0
  25. data/infod/{Es/grep.rb → grep.rb} +3 -3
  26. data/infod/{Es/groonga.rb → groonga.rb} +35 -26
  27. data/infod/{H/histogram.rb → histogram.rb} +23 -16
  28. data/infod/html.rb +231 -0
  29. data/infod/{Es/image.rb → image.rb} +16 -26
  30. data/infod/{Es/index.rb → index.rb} +44 -49
  31. data/infod/infod.rb +51 -12
  32. data/infod/json.rb +38 -0
  33. data/infod/{Es/kv.rb → kv.rb} +3 -9
  34. data/infod/{Y.rb → lambda.rb} +18 -1
  35. data/infod/ls.rb +49 -0
  36. data/infod/mail.rb +108 -0
  37. data/infod/{Es/man.rb → man.rb} +3 -15
  38. data/infod/{H/microblog.rb → microblog.rb} +22 -31
  39. data/infod/{K.rb → mime.rb} +68 -52
  40. data/infod/{N.rb → names.rb} +77 -56
  41. data/infod/page.rb +13 -0
  42. data/infod/postscript.rb +26 -0
  43. data/infod/rdf.rb +51 -0
  44. data/infod/{Rb.rb → ruby.rb} +18 -33
  45. data/infod/{Es/schema.rb → schema.rb} +23 -8
  46. data/infod/{Es/search.rb → search.rb} +5 -11
  47. data/infod/{Es/sh.rb → sh.rb} +0 -0
  48. data/infod/{Es/text.rb → text.rb} +33 -29
  49. data/infod/{H/threads.rb → threads.rb} +20 -27
  50. data/infod/{H/time.rb → time.rb} +14 -34
  51. data/infod/{H/wiki.rb → wiki.rb} +0 -0
  52. metadata +53 -64
  53. data/config.ru +0 -3
  54. data/infod/Es.rb +0 -31
  55. data/infod/Es/filter.rb +0 -75
  56. data/infod/Es/glob.rb +0 -22
  57. data/infod/Es/html.rb +0 -271
  58. data/infod/Es/in.rb +0 -68
  59. data/infod/Es/json.rb +0 -68
  60. data/infod/Es/ls.rb +0 -58
  61. data/infod/Es/mail.rb +0 -87
  62. data/infod/Es/mime.rb +0 -59
  63. data/infod/Es/out.rb +0 -52
  64. data/infod/Es/pager.rb +0 -34
  65. data/infod/Es/pdf.rb +0 -19
  66. data/infod/Es/rdf.rb +0 -35
  67. data/infod/H.rb +0 -15
  68. data/infod/H/audio.rb +0 -19
  69. data/infod/H/blog.rb +0 -15
  70. data/infod/H/cal.rb +0 -81
  71. data/infod/H/edit.rb +0 -88
  72. data/infod/H/forum.rb +0 -4
  73. data/infod/H/hf.rb +0 -114
  74. data/infod/H/mail.rb +0 -92
  75. data/infod/H/who.rb +0 -30
  76. data/infod/Th.rb +0 -36
  77. data/infod/Th/500.rb +0 -41
  78. data/infod/Th/GET.rb +0 -62
  79. data/infod/Th/HEAD.rb +0 -5
  80. data/infod/Th/POST.rb +0 -39
  81. data/infod/Th/perf.rb +0 -37
  82. data/infod/Th/uid.rb +0 -24
  83. data/infod/Th/util.rb +0 -89
@@ -1,7 +1,7 @@
1
1
  #watch __FILE__
2
2
 
3
3
  class Time
4
- def html; H({_: :time, datetime: iso8601, c: to_s}) end
4
+ def html e=nil; H({_: :time, datetime: iso8601, c: to_s}) end
5
5
  end
6
6
 
7
7
  class Object
@@ -17,14 +17,12 @@ end
17
17
 
18
18
  class E
19
19
 
20
- # linked-timeline
21
20
  fn 'view/timegraph',->g,e{
22
- i = F['view/timegraph/item']
23
- Fn 'view/timegraph/base',g,e,->{
21
+ i = F['itemview/timegraph']
22
+ Fn 'baseview/timegraph',g,e,->{
24
23
  g.map{|u,r|i.(r,e)}}}
25
-
26
- # timegraph container-element
27
- fn 'view/timegraph/base',->d,e,c{
24
+
25
+ fn 'baseview/timegraph',->d,e,c{
28
26
  Fn 'filter/timegraph', e.q,d,nil
29
27
 
30
28
  e[:graph] = d
@@ -36,7 +34,7 @@ class E
36
34
  [H.css('/css/timegraph'),{class: :timegraph, style: "height: #{h}em", c: c.()}]}
37
35
 
38
36
  # timegraph entry
39
- fn 'view/timegraph/item',->r,x{
37
+ fn 'itemview/timegraph',->r,x{
40
38
 
41
39
  # on resources w x-axis field
42
40
  if r[x.q['x'] || Date]
@@ -57,8 +55,7 @@ class E
57
55
  }]},
58
56
 
59
57
  # arc(s)
60
- {_: :svg, c:
61
- r[arc].do{|a|a.map{|e|
58
+ {_: :svg, c: r.class==Hash && r[arc].do{|a|a.map{|e|
62
59
  # target resource
63
60
  x[:graph][e.uri].do{|e|
64
61
  # arc path
@@ -78,8 +75,8 @@ class E
78
75
  y = e['y'] # y property
79
76
 
80
77
  # 2D values
81
- vX = m.map{|_,r|r[x]}.flatten.compact.map(&:to_time).map &:to_f
82
- vY = m.map{|_,r|r[y]}.flatten.compact.map &:to_f
78
+ vX = m.map{|_,r|r[x] if r.class==Hash}.flatten.compact.map(&:to_time).map &:to_f
79
+ vY = m.map{|_,r|r[y] if r.class==Hash}.flatten.compact.map &:to_f
83
80
  maxX = vX.max || 0
84
81
  minX = vX.min || 0
85
82
  maxY = vY.max || 0
@@ -91,28 +88,11 @@ class E
91
88
 
92
89
  # annotate resources
93
90
  m.map{|u,r|
94
- r['x'] = [*r[x]][0].do{|v|(maxX - v.to_time.to_f)*scaleX} || 0
95
- r['y'] = y.do{|y|[*r[y]][0].do{|v|(maxY - v.to_f)*scaleY} || 0} || rand(100)}}
96
-
97
- ## SIMILE Timeline
98
- # http://www.simile-widgets.org/
99
-
100
- fn Render+'application/timeline',->d,e{
101
- {dateTimeFormat: 'iso8601',
102
- events: d.values.map{|r|
103
- r[Date].do{|d|
104
- {description: r.uri,
105
- title: r[Title],
106
- start: [*d][0],
107
- link: r.url,
108
- }}}.compact}.to_json}
109
-
110
- fn 'head/timeline',->d,e{
111
- ['<script>var t="'+e['REQUEST_PATH']+e.q.except('view','?').merge({format: 'application/timeline'}).qs+'"</script>',
112
- (H.js '/js/timeline'),
113
- (H.js 'http://api.simile-widgets.org/timeline/2.3.1/timeline-api')]}
114
-
115
- fn 'view/timeline',->d,e{'<div id="tl" class="timeline-default" style="height: 300px;"></div>'}
91
+ if r.class==Hash
92
+ r['x'] = r[x].class==Array && r[x][0].do{|v|(maxX - v.to_time.to_f)*scaleX} || 0
93
+ r['y'] = y.do{|y|[*r[y]][0].do{|v|(maxY - v.to_f)*scaleY} || 0} || rand(100)
94
+ end
95
+ }}
116
96
 
117
97
  # tripleStream -> tripleStream
118
98
  def dateNorm *f
File without changes
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: infod
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3.0
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: 2013-11-22 00:00:00.000000000 Z
12
+ date: 2014-01-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack
@@ -59,7 +59,7 @@ dependencies:
59
59
  - - ! '>='
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
- description: a www-server
62
+ description: www-server
63
63
  email: _@whats-your.name
64
64
  executables:
65
65
  - infod
@@ -68,67 +68,56 @@ extra_rdoc_files: []
68
68
  files:
69
69
  - bin/infod
70
70
  - infod.rb
71
- - config.ru
72
- - infod/Th/perf.rb
73
- - infod/Th/util.rb
74
- - infod/Th/PATCH.rb
75
- - infod/Th/POST.rb
76
- - infod/Th/404.rb
77
- - infod/Th/GET.rb
78
- - infod/Th/500.rb
79
- - infod/Th/HEAD.rb
80
- - infod/Th/uid.rb
81
- - infod/Es.rb
82
- - infod/H/audio.rb
83
- - infod/H/microblog.rb
84
- - infod/H/forum.rb
85
- - infod/H/hf.rb
86
- - infod/H/edit.rb
87
- - infod/H/threads.rb
88
- - infod/H/mail.rb
89
- - infod/H/blog.rb
90
- - infod/H/facets.rb
91
- - infod/H/cal.rb
92
- - infod/H/who.rb
93
- - infod/H/wiki.rb
94
- - infod/H/histogram.rb
95
- - infod/H/time.rb
96
- - infod/K.rb
97
- - infod/Rb.rb
98
- - infod/Y.rb
71
+ - infod/audio.rb
72
+ - infod/fs.rb
73
+ - infod/csv.rb
74
+ - infod/grep.rb
75
+ - infod/microblog.rb
76
+ - infod/forum.rb
77
+ - infod/json.rb
78
+ - infod/graph.rb
79
+ - infod/sh.rb
80
+ - infod/PATCH.rb
81
+ - infod/POST.rb
82
+ - infod/404.rb
83
+ - infod/man.rb
84
+ - infod/GET.rb
85
+ - infod/constants.rb
99
86
  - infod/infod.rb
100
- - infod/Es/fs.rb
101
- - infod/Es/pdf.rb
102
- - infod/Es/csv.rb
103
- - infod/Es/grep.rb
104
- - infod/Es/filter.rb
105
- - infod/Es/json.rb
106
- - infod/Es/sh.rb
107
- - infod/Es/man.rb
108
- - infod/Es/glob.rb
109
- - infod/Es/ls.rb
110
- - infod/Es/html.rb
111
- - infod/Es/code.rb
112
- - infod/Es/text.rb
113
- - infod/Es/feed.rb
114
- - infod/Es/du.rb
115
- - infod/Es/groonga.rb
116
- - infod/Es/out.rb
117
- - infod/Es/mail.rb
118
- - infod/Es/image.rb
119
- - infod/Es/css.rb
120
- - infod/Es/kv.rb
121
- - infod/Es/rdf.rb
122
- - infod/Es/schema.rb
123
- - infod/Es/search.rb
124
- - infod/Es/mime.rb
125
- - infod/Es/index.rb
126
- - infod/Es/find.rb
127
- - infod/Es/pager.rb
128
- - infod/Es/in.rb
129
- - infod/H.rb
130
- - infod/N.rb
131
- - infod/Th.rb
87
+ - infod/HTTP.rb
88
+ - infod/glob.rb
89
+ - infod/edit.rb
90
+ - infod/ls.rb
91
+ - infod/page.rb
92
+ - infod/html.rb
93
+ - infod/threads.rb
94
+ - infod/500.rb
95
+ - infod/code.rb
96
+ - infod/text.rb
97
+ - infod/HEAD.rb
98
+ - infod/feed.rb
99
+ - infod/ruby.rb
100
+ - infod/du.rb
101
+ - infod/groonga.rb
102
+ - infod/mail.rb
103
+ - infod/blog.rb
104
+ - infod/image.rb
105
+ - infod/facets.rb
106
+ - infod/cal.rb
107
+ - infod/css.rb
108
+ - infod/postscript.rb
109
+ - infod/kv.rb
110
+ - infod/rdf.rb
111
+ - infod/schema.rb
112
+ - infod/wiki.rb
113
+ - infod/search.rb
114
+ - infod/mime.rb
115
+ - infod/names.rb
116
+ - infod/histogram.rb
117
+ - infod/index.rb
118
+ - infod/find.rb
119
+ - infod/time.rb
120
+ - infod/lambda.rb
132
121
  homepage: http://whats-your.name/www/
133
122
  licenses:
134
123
  - Unlicense
@@ -153,5 +142,5 @@ rubyforge_project:
153
142
  rubygems_version: 1.8.23
154
143
  signing_key:
155
144
  specification_version: 3
156
- summary: a www-server
145
+ summary: www-server
157
146
  test_files: []
data/config.ru DELETED
@@ -1,3 +0,0 @@
1
- require 'infod'
2
- use Rack::Deflater
3
- run E
data/infod/Es.rb DELETED
@@ -1,31 +0,0 @@
1
- %w{
2
- code
3
- css
4
- csv
5
- du
6
- feed
7
- filter
8
- find
9
- fs
10
- glob
11
- grep
12
- groonga
13
- html
14
- image
15
- in
16
- index
17
- json
18
- kv
19
- ls
20
- mail
21
- man
22
- mime
23
- out
24
- pager
25
- pdf
26
- rdf
27
- schema
28
- search
29
- sh
30
- text
31
- }.map{|e|require_relative 'Es/'+e}
data/infod/Es/filter.rb DELETED
@@ -1,75 +0,0 @@
1
- class E
2
-
3
- # narrow to specified properties
4
- fn 'filter/p',->e,m,_{
5
- a=Hash[*e['p'].split(/,/).map(&:expand).map{|p|[p,true]}.flatten]
6
- m.values.map{|r|
7
- r.delete_if{|p,o|!a[p]}}}
8
-
9
- fn 'filter/frag',->e,m,r{
10
- f = [r.uri].concat m['frag']['res']
11
- m.keys.map{|u|
12
- m.delete u unless f.member? u}}
13
-
14
- fn 'filter/basic',->o,m,_{
15
- d=m.values
16
- o['match'] && (p=o['matchP'].expand
17
- d=d.select{|r|r[p].do{|p|(p.class==Array ? p[0] : p).to_s.match o['match']}})
18
- o['min'] && (min=o['min'].to_f
19
- p=o['minP'].expand
20
- d=d.select{|r|r[p].do{|p|(p.class==Array ? p[0] : p).to_f >= min }})
21
- o['max'] && (max=o['max'].to_f
22
- p=o['maxP'].expand
23
- d=d.select{|r|r[p].do{|p|(p.class==Array ? p[0] : p).to_f <= max }})
24
- o['sort'] && (p=o['sort'].expand
25
- _ = d.partition{|r|r[p]}
26
- d =_[0].sort_by{|r|r[p]}.concat _[1] rescue d)
27
- o['sortN'] && (p=o['sortN'].expand
28
- _ = d.partition{|r|r[p]}
29
- d =_[0].sort_by{|r|
30
- (r[p].class==Array && r[p] || [r[p]])[0].do{|d|
31
- d.class==String && d.to_i || d
32
- }
33
- }.concat _[1])
34
- o.has_key?('reverse') && d.reverse!
35
- m.clear;d.map{|r|m[r['uri']]=r}}
36
-
37
- fn 'filter/map',->o,m,_{
38
- o.except('filter','graph','view').map{|p,n|
39
- p=p.expand
40
- n=n.expand
41
- p!=n &&
42
- m.values.map{|r|
43
- r[p].do{|o|
44
- r[n]=o
45
- r.delete p }}}}
46
-
47
- fn 'view/map',->d,e{
48
- [H.js('/js/normal'),(H.once e,:mu,(H.js '/js/mu')),
49
- '<style>.b {display:inline-block;font-weight:bold;padding-right:.8em;text-align:right;min-width:12em}
50
- .exerpt {display:inline-block;max-height:1em;overflow:hidden;max-width:44em;font-size: .9em} </style>',
51
- {_: :form, c:
52
- [d.values.map(&:keys).flatten.uniq.-(['uri']).do{|ps|
53
- ps.map{|p|
54
- [{class: :b, c: p},{_: :select, name: p, c:
55
- (ps + [Date,Creator,Content,Title]).map{|q|
56
- {_: :option, c: q}.
57
- update(p==q ? {selected: :selected}:{})}},
58
- {class: :exerpt, c: d.values.map{|r|r[p]}.flatten.uniq.html},
59
- '<br>']}},
60
- {_: :input, type: :hidden, name: :view, value: :tab},
61
- {_: :input, type: :hidden, name: :filter, value: :map},
62
- {_: :input, type: :submit}
63
- ]}]}
64
-
65
- def self.filter o,m,r
66
- o['filter'].do{|f|f.split(/,/).map{|f|Fn 'filter/'+f,o,m,r}}
67
- Fn'filter/basic',o,m,r if o.has_any_key ['reverse','sort','max','min','match']
68
- m
69
- end
70
-
71
- def E.graphProperties g
72
- g.values.select{|v|v.respond_to? :keys}.map(&:keys).flatten.uniq
73
- end
74
-
75
- end
data/infod/Es/glob.rb DELETED
@@ -1,22 +0,0 @@
1
- class E
2
-
3
- # glob :: pattern -> [E]
4
- def glob p=""
5
- (Pathname.glob d + p).map &:E
6
- end
7
-
8
- fn 'set/glob',->d,e=nil,_=nil{
9
- [d,d.pathSegment].compact.map(&:glob).flatten[0..3e3]}
10
-
11
- fn 'req/randomFile',->e,r{
12
- g = F['set/glob'][e]
13
- !g.empty? ? [302, {Location: g.random.uri}, []] : [404]}
14
-
15
- def docs
16
- doc = self if e # directly-referenced doc
17
- docs = docBase.glob ".{e,html,n3,nt,owl,rdf,ttl}" # basename-sharing docs
18
- dir = (d? && uri[-1]=='/' && uri.size>1) ? c : [] # trailing slash descends
19
- [doc,docs,dir].flatten.compact
20
- end
21
-
22
- end
data/infod/Es/html.rb DELETED
@@ -1,271 +0,0 @@
1
- #watch __FILE__
2
-
3
- def H _
4
- # Ruby object-literal syntax as HTML constructors
5
- case _
6
- when Hash then
7
- '<'+(_[:_]||:div).to_s+(_.keys-[:_,:c]).map{|a|
8
- ' '+a.to_s+'='+"'"+
9
- _[a].to_s.hsub({"'"=>'%27',
10
- '>'=>'%3E',
11
- '<'=>'%3C'})+"'"}.join+'>'+
12
- (_[:c] ? (H _[:c]) : '')+
13
- (_[:_] == :link ? '' : ('</'+(_[:_]||:div).to_s+'>'))
14
- when Array then
15
- _.map{|n|H n}.join
16
- else
17
- _.to_s
18
- end
19
- end
20
-
21
- class H
22
-
23
- def H.[] h; H h end
24
-
25
- def H.js a,inline=false
26
- p=a+'.js'
27
- inline ? {_: :script, c: p.E.r} :
28
- {_: :script, type: "text/javascript", src: p}
29
- end
30
-
31
- def H.once e,n,*h
32
- return if e[n]
33
- e[n]=true
34
- h
35
- end
36
- end
37
-
38
- class Array
39
- def html table=true
40
- map(&:html).join ' '
41
- end
42
- end
43
-
44
- class Object
45
- def html *a
46
- name = self.class
47
- href = "https://duckduckgo.com/?q=ruby+#{name}"
48
- "<a href=#{href}><b>#{name}</b></a>"
49
- end
50
- end
51
-
52
- class String
53
- def br
54
- gsub(/\n/,"<br>\n")
55
- end
56
- def href name=nil
57
- '<a href="'+self+'">'+(name||(Fn 'abbrURI',self))+'</a>'
58
- end
59
- def html
60
- if match /\A(\/|http)[\S]+\Z/
61
- href
62
- else
63
- self
64
- end
65
- rescue
66
- self
67
- end
68
- end
69
-
70
- class Fixnum
71
- def html; H({_: :input, type: :number, value: to_s}) end
72
- end
73
-
74
- class Float
75
- def html; H({_: :input, type: :number, value: to_s}) end
76
- end
77
-
78
- class TrueClass
79
- def html; H({_: :input, type: :checkbox, title: :True, checked: :checked}) end
80
- end
81
-
82
- class FalseClass
83
- def html; H({_: :input, type: :checkbox, title: :False}) end
84
- end
85
-
86
- class Hash
87
- def html
88
- H({_: :table, class: :html, c:
89
- map{|k,v|
90
- {_: :tr, property: k, c:
91
- [{_: :td,
92
- c: {_: :a, name: k,
93
- href: (k == 'uri' ? v : k),
94
- c: (Fn 'abbrURI',k)}, class: :key},
95
- {_: :td,
96
- c: (case k
97
- when E::Content
98
- {_: :pre, style: "white-space: pre-wrap", c: v}
99
- when 'uri'
100
- u = v.E
101
- {_: :a, id: u, href: u.url, c: v}
102
- else
103
- v.html
104
- end), class: :val}].cr}}.cr})
105
- end
106
- end
107
-
108
- class E
109
- def html name=nil,l=false
110
- (l ? url : uri).href name
111
- end
112
-
113
- def link
114
- html '#',true
115
- end
116
-
117
- fn 'abbrURI',->u{
118
- u.to_s.sub(/(?<scheme>[a-z]+:\/\/)?(?<abbr>.*?)(?<frag>[^#\/]*)$/,
119
- '<div class="abbr"><div class="scheme">\k<scheme></div>\k<abbr></div><div class="frag">\k<frag></div>')}
120
-
121
- fn 'head',->d,e{
122
- [{_: :title, c: e.uri},
123
- (Fn 'head.formats',e),
124
- (Fn 'head.icon')].cr}
125
-
126
- fn 'head.formats',->e{
127
- formats = %w{text/plain text/n3 application/json+ld}
128
- formats.map{|f|
129
- {_: :link, rel: :meta, type: f,
130
- href:'http://' + e['SERVER_NAME'] + e['REQUEST_PATH'] + e.q.merge({'format' => f}).qs}}.cr}
131
-
132
- fn 'head.icon',->{{_: :link, href:'/css/misc/favicon.ico', rel: :icon}}
133
-
134
- fn 'view/select',->d,e{#(Fn 'view/divine/set',d,e)||
135
- (Fn 'view/divine/files',d,e)||
136
- d.values.map{|r|Fn 'view/divine/resource',r,e}}
137
-
138
- # default view
139
- F['view'] = F['view/select']
140
-
141
- fn 'view/base',->d,e{
142
- [H.once(e,'base',H.css('/css/html')),
143
- d.values.map(&:html)]}
144
-
145
- # select a view based on RDF-type majority
146
- fn 'view/divine/set',->d,e{
147
- # we'd be throwing away oddball resources to select one view for all of them
148
- # but maybe you have a specific reason to
149
- # inbuilt views support calling on set or per-resource basis, via "once" spec of set-wide components
150
- # so views are selected per-resource unless you hack here..
151
- }
152
-
153
- fn 'view/divine/files',->d,e{
154
- d.values.map{|e|e.E.base}.do{|b|
155
- s = b.size.to_f # size of set
156
- t = 0.42 # threshold, max of 0.5 as file and RDF resource are separate
157
- if b.grep(/^msg\./).size / s > t
158
- Fn 'view/threads',d,e
159
-
160
- elsif b.grep(AudioFile).size / s > t
161
- Fn 'view/audio', d,e
162
-
163
- elsif b.grep(/(gif|jpe?g|png)$/i).size / s > t
164
- Fn 'view/th', d,e
165
-
166
- elsif b.grep(/\.log$/).size / s > t
167
- Fn 'view/chat', d,e
168
-
169
- else false
170
- end}}
171
-
172
- # select a view for a RDF resource
173
- fn 'view/divine/resource',->r,e{
174
- graph = {r.uri => r}
175
- view = F['view/base']
176
- # find types, skipping malformed/missing info
177
- if r.class == Hash
178
- r[Type].do{|types|
179
- views = types.map{|t|
180
- # discard non-URIs
181
- t.uri if t.respond_to? :uri}.
182
- compact.map{|t|
183
- subtype = t
184
- type = subtype.split(/\//)[-2]
185
- [F['view/' + subtype],
186
- F['view/' + type]]}.flatten.compact
187
- view = views[0] unless views.empty?}
188
- end
189
- view[graph,e]}
190
-
191
- # multiple views (comma-separated)
192
- fn 'view/multi',->d,e{
193
- e.q['views'].split(',').map{|v|
194
- F['view/'+v].do{|f|f[d,e]}}}
195
-
196
- def triplrBlob
197
- glob.select(&:f).do{|f|f.map{|r|
198
- yield r.uri,Type,E('blob')
199
- yield r.uri,Content,r.r}} end
200
-
201
- def triplrHref enc=nil
202
- puts "triplrHref #{uri} #{d}"
203
- yield uri,Content,(f && read).do{|r|enc ? r.force_encoding(enc).to_utf8 : r}.hrefs
204
- end
205
-
206
- fn Render+'text/html',->d,e{
207
- v = e.q['view'].to_s
208
- h = F['head/'+v] || F['head']
209
- v = F['view/'+v] || F['view']
210
- H(e.q.has_key?('un') ? v[d,e] :
211
- ['<!DOCTYPE html>',
212
- {_: :html,
213
- c: [{_: :head,
214
- c: ['<meta charset="utf-8" />',
215
- h[d,e]]},
216
- {_: :body, c: v[d,e]}].cr}].cr)}
217
-
218
-
219
- # property-selector toolbar (requires RDFa views)
220
- fn 'view/p',->d,e{
221
- [H.once(e,'property.toolbar',H.once(e,'p',(H.once e,:mu,H.js('/js/mu')),
222
- H.js('/js/p'),
223
- H.css('/css/table')),
224
- {_: :a, href: '#', c: '-', id: :hideP},
225
- {_: :a, href: '#', c: '+', id: :showP},
226
- {_: :span, id: 'properties',
227
- c: E.graphProperties(d).map{|k|
228
- {_: :a, class: :n, href: k, c: k.label+' '}}},
229
- {_: :style, id: :pS},
230
- {_: :style, id: :lS}),
231
- (Fn 'view/'+(e.q['pv']||'table'),d,e)]}
232
-
233
- # table-cell placement on sparse matrix of rows/columns
234
- # cal.rb contains an example usage
235
- fn 'view/t',->d,e,l=nil,a=nil{
236
- [H.once(e,'table',H.css('/css/table')),
237
- {_: :table, c:
238
- {_: :tbody, c: (Fn 'table/'+(l||e.q['table']),d).do{|t|
239
- rx = t.keys.max
240
- rm = t.keys.min
241
- c = t.values.map(&:keys)
242
- cm = c.map(&:min).min
243
- cx = c.map(&:max).max
244
- (rm..rx).map{|r|
245
- {_: :tr, c:
246
- t[r].do{|r|
247
- (cm..cx).map{|c|
248
- r[c].do{|c|
249
- {_: :td, class: :cell, c:(Fn 'view/'+(a||e.q['cellview']),c,e)}
250
- }||{_: :td}}}}}}}}]}
251
-
252
- fn 'view/table',->i,e{[H.css('/css/table'),(Fn 'table',i.values,e)]}
253
-
254
- fn 'table',->es,q=nil{
255
- ks = {} # predicate table
256
- es.map{|e|e.respond_to?(:keys) &&
257
- e.keys.map{|k|ks[k]=true}}
258
- keys = ks.keys
259
- keys.empty? ? es.html :
260
- H({_: :table,:class => :tab,
261
- c: [{_: :tr,
262
- c: keys.map{|k|
263
- {_: :th, class: :label, property: k,
264
- c: q ? {_: :a,
265
- href: q['REQUEST_PATH']+q.q.except('reverse').merge({'sort'=>k}).merge(q.q.member?('reverse') ? {} : {'reverse'=>true}).qs,
266
- c: (Fn 'abbrURI',k)} : k}}},
267
- *es.map{|e|
268
- {_: :tr, about: e.uri, c:
269
- keys.map{|k| {_: :td, property: k, c: e[k].send(k=='uri' ? :href : :html)} }}}]})}
270
-
271
- end