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
data/infod/page.rb ADDED
@@ -0,0 +1,13 @@
1
+ #watch __FILE__
2
+ class E
3
+
4
+ fn 'view/'+HTTP+'Response',->d,e{
5
+ u = d['#']
6
+ [u[Prev].do{|p|{_: :a, rel: :prev, style: 'background-color:white;color:black;font-size:2.3em;float: left;clear:both;margin-right:.3em',href: p.uri, c: '←'}},
7
+ u[Next].do{|n|{_: :a, rel: :next, style: 'background-color:black;color:white;font-size:2.3em;float:right;clear:both;border-radius:0',href: n.uri, c: '→'}},
8
+ {_: :a, href: e['REQUEST_URI']+'?view=data', # data browser
9
+ c: {_: :img, src: '/css/misc/cube.png', style: 'height:2em;background-color:white;padding:.54em;border-radius:1em;margin:.2em'}},
10
+ (H.js '/js/pager'),(H.once e,:mu,(H.js '/js/mu')) # next/prev key mapping
11
+ ]}
12
+
13
+ end
@@ -0,0 +1,26 @@
1
+ #watch __FILE__
2
+ class E
3
+
4
+ def triplrPS
5
+ p = E[dirname + '/.' + File.basename(path) + '/']
6
+ unless p.e # && p.m > m
7
+ p.mk
8
+ `gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE=png16m -r300 -sOutputFile='#{p.sh}%03d.png' -dTextAlphaBits=4 #{sh}`
9
+ end
10
+ yield uri, Content, `ps2txt #{sh}`.hrefs
11
+ p.a('*.png').glob.map{|i|
12
+ yield uri, DC+'Image', i }
13
+ end
14
+
15
+ F['view/'+MIMEtype+'application/postscript']=->r,e{
16
+ [(H.once e, :mu, (H.js '/js/mu')),(H.once e, :book, (H.js '/js/book')),
17
+ {_: :style, c: 'div[type="book"] a {background-color:#ccc;color:#fff;float:left;margin:.16em}'},
18
+ r.values.map{|d|
19
+ d[DC+'Image'].do{|is|
20
+ is = is.sort_by(&:uri)
21
+ {type: :book,
22
+ c: [{_: :img, style:'float:left;max-width:100%', src: is[0].url},
23
+ {name: :pages,
24
+ c: is.map{|i|{_: :a,href: i.url, c: i.E.bare}}}]}}}]}
25
+
26
+ end
data/infod/rdf.rb ADDED
@@ -0,0 +1,51 @@
1
+ #watch __FILE__
2
+ class E
3
+
4
+ begin require 'linkeddata'; rescue LoadError => e; end
5
+
6
+ def self.renderRDF d,f,e
7
+ (RDF::Writer.for f).buffer{|w|
8
+ d.triples{|s,p,o|
9
+ if s && p && o
10
+ s = RDF::URI s=='#' ? '' : (s.E.hostURL e)
11
+ p = RDF::URI p
12
+ o = ([E,Hash].member?(o.class) ? (RDF::URI o.E.hostURL(e)) :
13
+ (l = RDF::Literal o
14
+ l.datatype=RDF.XMLLiteral if p == Content
15
+ l)) rescue nil
16
+ (w << (RDF::Statement.new s,p,o) if o ) rescue nil
17
+ end
18
+ }}
19
+ end
20
+
21
+ def triplrRDF format=nil, local=true
22
+ uri = (local && f) ? d : uri
23
+ RDF::Reader.open(uri, :format => format){|r|
24
+ r.each_triple{|s,p,o|
25
+ yield s.to_s, p.to_s, [RDF::Node, RDF::URI].member?(o.class) ? E(o) : o.value.do{|v|v.class == String ? v.to_utf8 : v}}}
26
+ end
27
+
28
+ [['application/ld+json',:jsonld],
29
+ ['text/ntriples',:ntriples],
30
+ ['text/turtle',:turtle],
31
+ ['text/n3',:n3]
32
+ ].map{|mime|
33
+ F[Render+mime[0]] = ->d,e{E.renderRDF d, mime[1], e}}
34
+
35
+ F['view/data'] = ->d,e {
36
+ local = true
37
+ tab = (local ? '/js/' : 'https://w3.scripts.mit.edu/') + 'tabulator/'
38
+ [(H.css tab + 'tabbedtab'),
39
+ (H.js 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min'),
40
+ (H.js tab + 'js/mashup/mashlib'),
41
+ "<script>
42
+ jQuery(document).ready(function() {
43
+ var uri = window.location.href;
44
+ window.document.title = uri;
45
+ var kb = tabulator.kb;
46
+ var subject = kb.sym(uri);
47
+ tabulator.outline.GotoSubject(subject, true, undefined, true, undefined);
48
+ });</script>",
49
+ {class: :TabulatorOutline, id: :DummyUUID},{_: :table, id: :outline}]}
50
+
51
+ end
@@ -1,20 +1,25 @@
1
- # Rb Rubidium
2
-
3
1
  class Array
4
2
  def head; self[0] end
5
3
  def tail; self[1..-1] end
6
- def snd; self[1] end
7
- def random; self[rand length] end
8
4
  def h; join.h end
9
5
  def intersperse i
10
6
  inject([]){|a,b|a << b << i}[0..-2]
11
7
  end
12
- def sum
13
- inject 0, &:+
14
- end
15
- def cr
16
- intersperse "\n"
17
- end
8
+ def cr; intersperse "\n" end
9
+ end
10
+
11
+ class FalseClass
12
+ def do; false end
13
+ end
14
+
15
+ class Fixnum
16
+ def max i; i > self ? self : i end
17
+ def min i; i < self ? self : i end
18
+ end
19
+
20
+ class Float
21
+ def max i; i > self ? self : i end
22
+ def min i; i < self ? self : i end
18
23
  end
19
24
 
20
25
  class Hash
@@ -33,14 +38,9 @@ class Hash
33
38
  end
34
39
  end
35
40
 
36
- class Float
37
- def max i; i > self ? self : i end
38
- def min i; i < self ? self : i end
39
- end
40
-
41
- class Fixnum
42
- def max i; i > self ? self : i end
43
- def min i; i < self ? self : i end
41
+ class NilClass
42
+ def do; nil end
43
+ def html e=nil; "" end
44
44
  end
45
45
 
46
46
  class Object
@@ -50,22 +50,7 @@ end
50
50
 
51
51
  class String
52
52
  def h; Digest::SHA1.hexdigest self end
53
- def hsub h; map{|e|h[e]||e} end
54
- def map; each_char.map{|l| yield l}.join end
55
53
  def tail; self[1..-1] end
56
54
  def to_utf8; encode('UTF-8', undef: :replace) end
57
55
  def t; match(/\/$/) ? self : self+'/' end
58
56
  end
59
- class FalseClass
60
- def do; nil end
61
- def to_s; "" end
62
- alias_method :to_str,:to_s
63
- end
64
-
65
- class NilClass
66
- def do; nil end
67
- def to_ary; [] end
68
- def to_hash; {} end
69
- def to_s; "" end
70
- %w{html to_str}.map{|m|alias_method m,:to_s}
71
- end
@@ -3,7 +3,8 @@ class E
3
3
  =begin
4
4
  www) http://data.whats-your.name
5
5
 
6
- local) wget http://whats-your.name/schema.txt
6
+ local) cd schema
7
+ curl http://data.whats-your.name/schema/schema.txt.gz | zcat > schema/schema.txt
7
8
  x-www-browser http://localhost/schema
8
9
 
9
10
  rebuild)
@@ -12,11 +13,11 @@ class E
12
13
  curl http://prefix.cc/popular/all.file.txt > prefix.txt
13
14
  ) RDF usage data
14
15
  curl http://data.whats-your.name/schema/gromgull.gz | zcat > properties.txt
15
- 2) analyze
16
+ 2) massage
16
17
  irb> E.cacheSchemas
17
18
  .. E.indexSchemas
18
19
 
19
- schema missing? publish and contact prefix.cc,
20
+ schema missing? publish and add to prefix.cc,
20
21
  see also ideas at http://www.w3.org/2013/04/vocabs/
21
22
 
22
23
  =end
@@ -81,19 +82,33 @@ class E
81
82
  concat SchemasRDFa) # schema list
82
83
  end
83
84
 
84
- fn '/schema/GET',->e,r{
85
+ fn '/schema.n3/GET',->e,r{
86
+ g = {}
85
87
  if (q = r.q['q']) && !q.empty?
88
+ search = "grep -i #{q.sh} #{'/schema/schema.txt'.E.d} | head -n 86"
89
+ found = `#{search}`.to_utf8.lines.to_a.map{|i|
90
+ c,u,t = i.split ' ',3
91
+ c = c.to_i
92
+ g[u] = {'uri' => u, 'http://www.w3.org/2000/01/rdf-schema#comment' => t, 'http://purl.org/vocommons/voaf#occurrences' => c}}
93
+ end
94
+ [200,{'Content-Type'=>e.env.format+'; charset=utf-8'},[(e.render e.env.format, g, e.env)]]}
95
+
96
+ fn '/schema/GET',->e,r{
97
+ q = r.q['q']
98
+ if q && !q.empty?
86
99
  search = "grep -i #{q.sh} #{'/schema/schema.txt'.E.d} | head -n 255"
87
100
  found = `#{search}`.to_utf8.lines.to_a.map{|i|
88
101
  c,u,t = i.split ' ',3
89
102
  c = c.to_i
90
103
  [("<b>#{c}</b>" unless c.zero?),
91
- " <a href='#{u}'>#{F['abbrURI'][u]}</a> ",
104
+ " <a href='#{u}'>#{u.abbrURI}</a> ",
92
105
  t,"<br>\n"]}
93
106
  end
94
- (H ['<html><body>',(H.css '/css/search'),(H.css '/css/schema'),(H.js '/js/search'),
95
- F['view/search/form'][r.q,r], found,
96
- '<br>sources ',{_: :a, href: 'http://prefix.cc', c: 'prefix.cc'},' and ',{_: :a, href: SchemasRDFa[0], c: 'schema.org'},
107
+ (H ['<html><body>',
108
+ q.do{|q|{_: :a, style: 'float:left',href: '/schema.n3?q='+CGI.escape(q), c: {_: :img, src: '/css/misc/cube.png'}}},
109
+ (H.css '/css/search'),(H.css '/css/schema'),(H.js '/js/search'),
110
+ F['view/'+Search][r.q,r], found,
111
+ '<br>sources ',{_: :a, href: 'http://prefix.cc', c: 'prefix.cc'},' and ',{_: :a, href: SchemasRDFa[0], c: 'schema.org'},' ',
97
112
  ]).hR}
98
113
 
99
114
  end
@@ -2,23 +2,17 @@ class E
2
2
 
3
3
  fn '/search/GET',->e,r{
4
4
  r.q['graph'] = 'roonga'
5
- e.response
6
- }
5
+ e.response }
7
6
 
8
- fn 'head/search',->d,e{[{_: :title, c: e.q['q']},(Fn 'head.formats',e)]}
7
+ F['/search.n3/GET'] = F['/search/GET']
9
8
 
10
- fn 'view/search',->d,e{
9
+ fn 'view/'+Search,-> q=nil,e { q||={}
11
10
  [H.css('/css/search'),H.js('/js/search'),
12
- (Fn 'view/search/form',e.q,e),
13
- (Fn 'view/page',d,e)]}
14
-
15
- fn 'view/search/form',-> q=nil,e { q||={}
16
- [{:class => :form,
11
+ {:class => :form,
17
12
  c: {_: :form, action: e['REQUEST_PATH'],
18
13
  c: [{_: :input, name: :q, value: q['q']}, # search box
19
14
  q.except('q','start'). # new query & offset for this search
20
15
  map{|a,s|
21
- {_: :input, name: a, value: s, :type => :hidden}}]}},
22
- {class: :space}]}
16
+ {_: :input, name: a, value: s, :type => :hidden}}]}}]}
23
17
 
24
18
  end
File without changes
@@ -3,15 +3,15 @@
3
3
 
4
4
  class String
5
5
 
6
+ # text to HTML
6
7
  def hrefs i=false
7
- # keep consuming URL chars when:
8
- # ( to ) - ")" won't match without an opener, such as when URL is placed in ()s
9
- # , or . followed by non-whitespace
10
- # not URI-wrapping chars, phrase/sentence terminators , . or whitespace
11
- (partition /(https?:\/\/(\([^)]*\)|[,.]\S|[^\s),.”\'\"<>\]])+)/).do{|p|
12
- p[0].gsub('<','&lt;').gsub('>','&gt;')+
13
- (p[1].empty?&&''||'<a rel=untyped href='+p[1]+'>'+p[1].do{|p|
14
- i && p.match(/(gif|jpe?g|png|tiff)$/i) &&
8
+ # ) only matches with an opener
9
+ # ,. only match mid-URI
10
+ (partition /(https?:\/\/(\([^)>\s]*\)|[,.]\S|[^\s),.”\'\"<>\]])+)/).do{|p|
11
+ u = p[1] # URI
12
+ p[0].gsub('<','&lt;').gsub('>','&gt;')+ # escape <>
13
+ (p[1].empty?&&''||'<a rel=untyped href="'+u+'">'+u.do{|p|
14
+ i && p.match(/(gif|jpe?g|png|tiff)$/i) && # inline images if asked for
15
15
  "<img src=#{p}>" || p
16
16
  }+'</a>')+
17
17
  (p[2].empty?&&''||p[2].hrefs)
@@ -48,21 +48,20 @@ class E
48
48
  r[Content]]}}}
49
49
 
50
50
  fn 'view/title',->d,e{
51
- i = F['view/title/item']
51
+ i = F['itemview/title']
52
52
  [d.map{|u,r|[i.(r,e),' ']},
53
- (H.once e,'title',(H.css '/css/title'))
54
- ]}
53
+ (H.once e,'title',(H.css '/css/title'))]}
55
54
 
56
- fn 'view/title/item',->r,e{
55
+ fn 'itemview/title',->r,e{
57
56
  {_: :a, class: :title, href: r.E.url,
58
- c: r[Title] || (Fn 'abbrURI', r.uri)}}
57
+ c: r[Title] || r.uri.abbrURI} if (r.class == E || r.class == Hash) && r.uri}
59
58
 
60
59
  # linebreak-delimited list of URIs
61
60
  def triplrUriList
62
61
  open(d).readlines.grep(/^[^#]/).map{|l|
63
62
  l = l.chomp
64
- yield uri, '/rel', l
65
- yield l, '/rev', uri
63
+ yield uri, '/rel', l.E
64
+ yield l, '/rev', self
66
65
  }
67
66
  end
68
67
 
@@ -74,6 +73,10 @@ class E
74
73
  yield uri, Content, `cat #{sh} | aha`
75
74
  end
76
75
 
76
+ def triplrPDF &f
77
+ triplrStdOut 'pdfinfo', &f
78
+ end
79
+
77
80
  def triplrRTF
78
81
  yield uri, Content, `which catdoc && catdoc #{sh}`.hrefs
79
82
  end
@@ -82,21 +85,22 @@ class E
82
85
  yield uri, Content, `which antiword && antiword #{sh}`.hrefs
83
86
  end
84
87
 
88
+ def triplrTeX
89
+ yield uri, Content, `cat #{sh} | tth -r`
90
+ end
91
+
85
92
  fn Render+'text/plain',->d,_=nil{
86
- d.map{|u,r|# each resource
87
- [u,"\n", # subject URI
88
- r.map{|k,v| # each predicate
89
- p = k.split(/[\/#]/)[-1] # predicate
90
- k == 'uri' || # already displayed
91
- [" "*(16-p.size).min(1),p," ", # align objects
92
- (v.class==Array ? v:[v]).map{|v|# each object
93
- v.respond_to?(:uri) ? v.uri : # object-URI
94
- v.to_s. # object-content
95
- gsub(/<\/*(br|p|div)[^>]*>/,"\n"). # add linebreaks
96
- gsub(/<a.*?href="*([^'">\s]+)[^>]*>/,'\1 '). # unwrap links
97
- gsub(/<[^>]+>/,''). # remove HTML
98
- gsub(/\n+/,"\n")}. # collapse empty space
99
- intersperse(' '),"\n"]},"\n"]}.join} # collate
93
+ d.values.map{|r|
94
+ [(r.map{|k,v|
95
+ ["<",(k=='uri' ? '' : k),"> ", # predicate
96
+ (v.class==Array ? v:[v]).map{|v|# each object
97
+ v.respond_to?(:uri) ? '<'+(v.uri||'')+'>' : # object-URI
98
+ v.to_s. # object-content
99
+ gsub(/<\/*(br|p|div)[^>]*>/,"\n"). # add linebreaks
100
+ gsub(/<a.*?href="*([^'">\s]+)[^>]*>/,'<\1> '). # unwrap links
101
+ gsub(/<[^>]+>/,''). # remove HTML
102
+ gsub(/\n+/,"\n")}. # collapse empty space
103
+ intersperse(' '),"\n"]} if r.class==Hash),"\n"]}.join} # collate
100
104
 
101
105
  F['view/text/plain']=->d,e{
102
106
  {_: :pre, c: F[Render+'text/plain'][d,e]}}
@@ -1,9 +1,16 @@
1
- watch __FILE__
1
+ # -*- coding: utf-8 -*-
2
+ #watch __FILE__
2
3
  class E
3
4
 
4
- fn 'protograph/thread',->d,_,g{
5
- d.walk SIOC+'reply_of',g
6
- F['docsID'][g]}
5
+ fn 'protograph/thread',->d,e,g{
6
+ # find reachable discussion by recursively walking reply_of arcs
7
+ d.pathSegment.do{|p|p.walk SIOC+'reply_of',g }
8
+ g['#']={'uri' => '#',
9
+ RDFs+'member' => g.keys.map(&:E),
10
+ Type => [E[HTTP+'Response'],
11
+ E[SIOC+'Thread']
12
+ ]} unless g.empty?
13
+ F['docsID'][g,e]}
7
14
 
8
15
  fn 'view/threads',->d,env{
9
16
 
@@ -14,11 +21,10 @@ class E
14
21
  (p = env.q['p']
15
22
  o = env['uri'].E
16
23
  [(H.js '/js/search'),
17
- {_: :a, class: :rangeP, href: '/@'+p+'?set=indexP&view=page&v=linkPO&c=12', c: {'sioc:addressed_to' => 'to', 'sioc:has_creator' => 'From'}[p] || p}, '&nbsp;',
18
- {_: :a, class: :rangePO, href: o.url+'?set=indexPO&view=page&v=threads&c=32&p='+p, c: env['uri']},
24
+ {_: :a, class: :rangeP, href: '/@'+p+'?set=indexP&&c=12', c: {'sioc:addressed_to' => 'to', 'sioc:has_creator' => 'From'}[p] || p}, '&nbsp;',
25
+ {_: :a, class: :rangePO, href: o.url+'?set=indexPO&c=12&p='+p, c: env['uri']},
19
26
  {_: :form, action: (URI.escape (p.expand.E.poIndex o).uri),
20
27
  c: [{_: :input, name: :set, value: :grep, type: :hidden},
21
- {_: :input, name: :view,value: :grep, type: :hidden},
22
28
  {_: :input, name: :q}
23
29
  ]},
24
30
  ] if env.q['set']=='indexPO'),
@@ -26,7 +32,7 @@ class E
26
32
  '<table>',
27
33
 
28
34
  # group posts by thread name
29
- d.values.select{|r| r[Type].do{|t| t.map(&:uri).member? SIOC+'Post'}
35
+ d.values.select{|r| r[Type].do{|t| [*t].map{|t| t.respond_to?(:uri) && t.uri}.member? SIOC+'Post'}
30
36
  }.group_by{|r|
31
37
  [*r[Title]][0].do{|t|t.sub(/^[rR][eE][^A-Za-z]./,'')}}.
32
38
 
@@ -35,11 +41,11 @@ class E
35
41
  k[To].do{|o|o.head.uri}}}.map{|e|
36
42
 
37
43
  # group
38
- c = E.c
44
+ c = E.cs
39
45
  ['<tr><td class=subject>', e[1].map{|t|
40
46
 
41
47
  # thread
42
- [{_: :a, property: Title, :class => 'thread', style: "border-color:#{c}", href: t[1][0].url+'??=thread',
48
+ [{_: :a, property: Title, :class => 'thread', style: "border-color:#{c}", href: t[1][0].url+'?graph=thread',
43
49
  c: t[0].to_s.gsub(/[<>]/,'_').gsub(/\[([a-z\-A-Z0-9]+)\]/,'<span class=g>\1</span>')},
44
50
 
45
51
 
@@ -48,30 +54,17 @@ class E
48
54
  ['<br>', t[1].map{|s|
49
55
 
50
56
  # author name and RDFa
51
- {_: :a, property: Creator, href: s.url+'??=thread#'+s.uri, :class => 'sender', style: 'background-color:'+c,
57
+ {_: :a, property: Creator, href: s.url+'?graph=thread#'+s.uri, :class => 'sender', style: 'background-color:'+c,
52
58
  c: (s[SIOC+'name']||s[Creator]).do{|n|n[0]}
53
59
  }}]),'<br>']},'</td>',
54
60
 
55
61
  {_: :td, class: :group, property: To,
56
62
  c: {_: :a, :class => :to, style: 'background-color:'+c, c: e[0] && e[0].split(/@/)[0],
57
- href: e[0] && e[0].E.url+'?set=indexPO&p=sioc:addressed_to&view=page&v=threads'}},
63
+ href: e[0] && e[0].E.url+'?set=indexPO&p=sioc:addressed_to'}},
58
64
 
59
65
  '</tr>']},'</table>',
60
66
 
61
- # link to unabbreviated content of post-set
62
- {_: :a, id: :down, c: '&darr;',
63
- href: env['REQUEST_PATH'] + env.q.merge({'view'=>'page','views'=>'timegraph,mail','arc'=>'/parent','v'=>'multi','sort'=>'dc:date','reverse'=>true}).qs}]}
64
-
65
- F["?"] ||= {}
66
- F["?"].update({'thread' =>{
67
- 'graph'=>'thread',
68
- 'sort' => 'dc:date',
69
- 'reverse' => nil,
70
- 'view' => 'mail'},
71
- 'ann' =>{
72
- 'view'=>'threads',
73
- 'set'=>'glob',
74
- 'matchP' => 'dc:title',
75
- 'match' => /[^a-zA-Z][Aa][Nn][nN]([oO][uU]|[^a-zA-Z])/}})
67
+ # drill down to full-content of this set
68
+ {_: :a, id: :down, href: env['REQUEST_PATH'].t, c: ''}]}
76
69
 
77
70
  end