infod 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. data/infod.rb +52 -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 +123 -0
  25. data/infod/{Es/grep.rb → grep.rb} +2 -2
  26. data/infod/{Es/groonga.rb → groonga.rb} +41 -33
  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} +38 -25
  31. data/infod/infod.rb +52 -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 +90 -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} +78 -45
  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} +22 -7
  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} +17 -27
  50. data/infod/{H/time.rb → time.rb} +14 -34
  51. data/infod/{H/who.rb → whois.rb} +6 -4
  52. data/infod/{H/wiki.rb → wiki.rb} +0 -0
  53. metadata +54 -64
  54. data/config.ru +0 -3
  55. data/infod/Es.rb +0 -31
  56. data/infod/Es/filter.rb +0 -75
  57. data/infod/Es/glob.rb +0 -22
  58. data/infod/Es/html.rb +0 -271
  59. data/infod/Es/in.rb +0 -68
  60. data/infod/Es/json.rb +0 -68
  61. data/infod/Es/ls.rb +0 -58
  62. data/infod/Es/mail.rb +0 -87
  63. data/infod/Es/mime.rb +0 -59
  64. data/infod/Es/out.rb +0 -52
  65. data/infod/Es/pager.rb +0 -34
  66. data/infod/Es/pdf.rb +0 -19
  67. data/infod/Es/rdf.rb +0 -35
  68. data/infod/H.rb +0 -15
  69. data/infod/H/audio.rb +0 -19
  70. data/infod/H/blog.rb +0 -15
  71. data/infod/H/cal.rb +0 -81
  72. data/infod/H/edit.rb +0 -88
  73. data/infod/H/forum.rb +0 -4
  74. data/infod/H/hf.rb +0 -114
  75. data/infod/H/mail.rb +0 -92
  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['uri'].E.docBase.a('.n3?')+e['QUERY_STRING'],
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')) # n/p 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'),
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'),
95
110
  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'},
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,13 @@
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
+ d.pathSegment.do{|p|p.walk SIOC+'reply_of',g }
7
+ g['#']={'uri' => '#',
8
+ RDFs+'member' => g.keys.map(&:E),
9
+ Type => (HTTP+'Response').E} unless g.empty?
10
+ F['docsID'][g,e]}
7
11
 
8
12
  fn 'view/threads',->d,env{
9
13
 
@@ -14,11 +18,10 @@ class E
14
18
  (p = env.q['p']
15
19
  o = env['uri'].E
16
20
  [(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']},
21
+ {_: :a, class: :rangeP, href: '/@'+p+'?set=indexP&&c=12', c: {'sioc:addressed_to' => 'to', 'sioc:has_creator' => 'From'}[p] || p}, '&nbsp;',
22
+ {_: :a, class: :rangePO, href: o.url+'?set=indexPO&c=12&p='+p, c: env['uri']},
19
23
  {_: :form, action: (URI.escape (p.expand.E.poIndex o).uri),
20
24
  c: [{_: :input, name: :set, value: :grep, type: :hidden},
21
- {_: :input, name: :view,value: :grep, type: :hidden},
22
25
  {_: :input, name: :q}
23
26
  ]},
24
27
  ] if env.q['set']=='indexPO'),
@@ -26,7 +29,7 @@ class E
26
29
  '<table>',
27
30
 
28
31
  # group posts by thread name
29
- d.values.select{|r| r[Type].do{|t| t.map(&:uri).member? SIOC+'Post'}
32
+ d.values.select{|r| r[Type].do{|t| [*t].map{|t| t.respond_to?(:uri) && t.uri}.member? SIOC+'Post'}
30
33
  }.group_by{|r|
31
34
  [*r[Title]][0].do{|t|t.sub(/^[rR][eE][^A-Za-z]./,'')}}.
32
35
 
@@ -35,11 +38,11 @@ class E
35
38
  k[To].do{|o|o.head.uri}}}.map{|e|
36
39
 
37
40
  # group
38
- c = E.c
41
+ c = E.cs
39
42
  ['<tr><td class=subject>', e[1].map{|t|
40
43
 
41
44
  # thread
42
- [{_: :a, property: Title, :class => 'thread', style: "border-color:#{c}", href: t[1][0].url+'??=thread',
45
+ [{_: :a, property: Title, :class => 'thread', style: "border-color:#{c}", href: t[1][0].url+'?graph=thread',
43
46
  c: t[0].to_s.gsub(/[<>]/,'_').gsub(/\[([a-z\-A-Z0-9]+)\]/,'<span class=g>\1</span>')},
44
47
 
45
48
 
@@ -48,30 +51,17 @@ class E
48
51
  ['<br>', t[1].map{|s|
49
52
 
50
53
  # author name and RDFa
51
- {_: :a, property: Creator, href: s.url+'??=thread#'+s.uri, :class => 'sender', style: 'background-color:'+c,
54
+ {_: :a, property: Creator, href: s.url+'?graph=thread#'+s.uri, :class => 'sender', style: 'background-color:'+c,
52
55
  c: (s[SIOC+'name']||s[Creator]).do{|n|n[0]}
53
56
  }}]),'<br>']},'</td>',
54
57
 
55
58
  {_: :td, class: :group, property: To,
56
59
  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'}},
60
+ href: e[0] && e[0].E.url+'?set=indexPO&p=sioc:addressed_to'}},
58
61
 
59
62
  '</tr>']},'</table>',
60
63
 
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])/}})
64
+ # drill down to full-content of this set
65
+ {_: :a, id: :down, href: env['REQUEST_PATH'].t, c: ''}]}
76
66
 
77
67
  end