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.
- data/infod.rb +51 -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 +131 -0
- data/infod/{Es/grep.rb → grep.rb} +3 -3
- data/infod/{Es/groonga.rb → groonga.rb} +35 -26
- 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} +44 -49
- data/infod/infod.rb +51 -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 +108 -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} +77 -56
- 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} +23 -8
- 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} +20 -27
- data/infod/{H/time.rb → time.rb} +14 -34
- data/infod/{H/wiki.rb → wiki.rb} +0 -0
- metadata +53 -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/H/who.rb +0 -30
- 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['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
|
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>',
|
95
|
-
|
96
|
-
|
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
|
-
|
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,16 @@
|
|
1
|
-
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
#watch __FILE__
|
2
3
|
class E
|
3
4
|
|
4
|
-
fn 'protograph/thread',->d,
|
5
|
-
|
6
|
-
|
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
|
18
|
-
{_: :a, class: :rangePO, href: o.url+'?set=indexPO&
|
24
|
+
{_: :a, class: :rangeP, href: '/@'+p+'?set=indexP&&c=12', c: {'sioc:addressed_to' => 'to', 'sioc:has_creator' => 'From'}[p] || p}, ' ',
|
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(
|
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.
|
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+'
|
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+'
|
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
|
63
|
+
href: e[0] && e[0].E.url+'?set=indexPO&p=sioc:addressed_to'}},
|
58
64
|
|
59
65
|
'</tr>']},'</table>',
|
60
66
|
|
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])/}})
|
67
|
+
# drill down to full-content of this set
|
68
|
+
{_: :a, id: :down, href: env['REQUEST_PATH'].t, c: '↓'}]}
|
76
69
|
|
77
70
|
end
|