infod 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/infod.rb +52 -12
- data/infod/{Th/404.rb → 404.rb} +4 -16
- data/infod/500.rb +53 -0
- data/infod/GET.rb +104 -0
- data/infod/HEAD.rb +23 -0
- data/infod/HTTP.rb +105 -0
- data/infod/{Th/PATCH.rb → PATCH.rb} +0 -0
- data/infod/POST.rb +34 -0
- data/infod/audio.rb +30 -0
- data/infod/blog.rb +34 -0
- data/infod/cal.rb +72 -0
- data/infod/{Es/code.rb → code.rb} +7 -4
- data/infod/constants.rb +55 -0
- data/infod/{Es/css.rb → css.rb} +0 -0
- data/infod/{Es/csv.rb → csv.rb} +0 -0
- data/infod/{Es/du.rb → du.rb} +0 -0
- data/infod/edit.rb +73 -0
- data/infod/{H/facets.rb → facets.rb} +20 -11
- data/infod/{Es/feed.rb → feed.rb} +17 -16
- data/infod/{Es/find.rb → find.rb} +2 -3
- data/infod/forum.rb +13 -0
- data/infod/{Es/fs.rb → fs.rb} +5 -2
- data/infod/glob.rb +26 -0
- data/infod/graph.rb +123 -0
- data/infod/{Es/grep.rb → grep.rb} +2 -2
- data/infod/{Es/groonga.rb → groonga.rb} +41 -33
- data/infod/{H/histogram.rb → histogram.rb} +23 -16
- data/infod/html.rb +231 -0
- data/infod/{Es/image.rb → image.rb} +16 -26
- data/infod/{Es/index.rb → index.rb} +38 -25
- data/infod/infod.rb +52 -12
- data/infod/json.rb +38 -0
- data/infod/{Es/kv.rb → kv.rb} +3 -9
- data/infod/{Y.rb → lambda.rb} +18 -1
- data/infod/ls.rb +49 -0
- data/infod/mail.rb +90 -0
- data/infod/{Es/man.rb → man.rb} +3 -15
- data/infod/{H/microblog.rb → microblog.rb} +22 -31
- data/infod/{K.rb → mime.rb} +68 -52
- data/infod/{N.rb → names.rb} +78 -45
- data/infod/page.rb +13 -0
- data/infod/postscript.rb +26 -0
- data/infod/rdf.rb +51 -0
- data/infod/{Rb.rb → ruby.rb} +18 -33
- data/infod/{Es/schema.rb → schema.rb} +22 -7
- data/infod/{Es/search.rb → search.rb} +5 -11
- data/infod/{Es/sh.rb → sh.rb} +0 -0
- data/infod/{Es/text.rb → text.rb} +33 -29
- data/infod/{H/threads.rb → threads.rb} +17 -27
- data/infod/{H/time.rb → time.rb} +14 -34
- data/infod/{H/who.rb → whois.rb} +6 -4
- data/infod/{H/wiki.rb → wiki.rb} +0 -0
- metadata +54 -64
- data/config.ru +0 -3
- data/infod/Es.rb +0 -31
- data/infod/Es/filter.rb +0 -75
- data/infod/Es/glob.rb +0 -22
- data/infod/Es/html.rb +0 -271
- data/infod/Es/in.rb +0 -68
- data/infod/Es/json.rb +0 -68
- data/infod/Es/ls.rb +0 -58
- data/infod/Es/mail.rb +0 -87
- data/infod/Es/mime.rb +0 -59
- data/infod/Es/out.rb +0 -52
- data/infod/Es/pager.rb +0 -34
- data/infod/Es/pdf.rb +0 -19
- data/infod/Es/rdf.rb +0 -35
- data/infod/H.rb +0 -15
- data/infod/H/audio.rb +0 -19
- data/infod/H/blog.rb +0 -15
- data/infod/H/cal.rb +0 -81
- data/infod/H/edit.rb +0 -88
- data/infod/H/forum.rb +0 -4
- data/infod/H/hf.rb +0 -114
- data/infod/H/mail.rb +0 -92
- data/infod/Th.rb +0 -36
- data/infod/Th/500.rb +0 -41
- data/infod/Th/GET.rb +0 -62
- data/infod/Th/HEAD.rb +0 -5
- data/infod/Th/POST.rb +0 -39
- data/infod/Th/perf.rb +0 -37
- data/infod/Th/uid.rb +0 -24
- 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
|
data/infod/postscript.rb
ADDED
@@ -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
|
data/infod/{Rb.rb → ruby.rb}
RENAMED
@@ -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
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
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
|
37
|
-
def
|
38
|
-
def
|
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)
|
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)
|
16
|
+
2) massage
|
16
17
|
irb> E.cacheSchemas
|
17
18
|
.. E.indexSchemas
|
18
19
|
|
19
|
-
schema missing? publish and
|
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}'>#{
|
104
|
+
" <a href='#{u}'>#{u.abbrURI}</a> ",
|
92
105
|
t,"<br>\n"]}
|
93
106
|
end
|
94
|
-
(H ['<html><body>',
|
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
|
-
|
7
|
+
F['/search.n3/GET'] = F['/search/GET']
|
9
8
|
|
10
|
-
fn 'view/
|
9
|
+
fn 'view/'+Search,-> q=nil,e { q||={}
|
11
10
|
[H.css('/css/search'),H.js('/js/search'),
|
12
|
-
|
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
|
data/infod/{Es/sh.rb → sh.rb}
RENAMED
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
|
-
#
|
8
|
-
#
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
p[
|
13
|
-
|
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('<','<').gsub('>','>')+ # 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['
|
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 '
|
55
|
+
fn 'itemview/title',->r,e{
|
57
56
|
{_: :a, class: :title, href: r.E.url,
|
58
|
-
c: r[Title] || (
|
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',
|
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{|
|
87
|
-
[
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
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
|
-
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
#watch __FILE__
|
2
3
|
class E
|
3
4
|
|
4
|
-
fn 'protograph/thread',->d,
|
5
|
-
d.walk SIOC+'reply_of',g
|
6
|
-
|
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
|
18
|
-
{_: :a, class: :rangePO, href: o.url+'?set=indexPO&
|
21
|
+
{_: :a, class: :rangeP, href: '/@'+p+'?set=indexP&&c=12', c: {'sioc:addressed_to' => 'to', 'sioc:has_creator' => 'From'}[p] || p}, ' ',
|
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(
|
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.
|
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+'
|
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+'
|
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
|
60
|
+
href: e[0] && e[0].E.url+'?set=indexPO&p=sioc:addressed_to'}},
|
58
61
|
|
59
62
|
'</tr>']},'</table>',
|
60
63
|
|
61
|
-
#
|
62
|
-
{_: :a, id: :down, c: '
|
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
|