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/blog.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
#watch __FILE__
|
2
|
+
class E
|
3
|
+
|
4
|
+
F['view/'+SIOCt+'BlogPost']=->g,e{
|
5
|
+
|
6
|
+
F['example/blogview'][g,e]
|
7
|
+
|
8
|
+
}
|
9
|
+
|
10
|
+
F['example/blogview']=->g,e{
|
11
|
+
g.map{|u,r|
|
12
|
+
case u
|
13
|
+
when /artery.wbur/ # compact whitespace a bit
|
14
|
+
r[Content] = {class: :WBUR, c: [{_: :style, c: ".WBUR p {margin:0}"},r[Content]]}
|
15
|
+
F['view/base'][{u => r},e,false]
|
16
|
+
when /boston\.com/ # crop sharebuttons
|
17
|
+
(Nokogiri::HTML.parse r[Content][0]).css('p')[0].do{|p|r[Content]=p.inner_html}
|
18
|
+
F['view/base'][{u => r},e,false]
|
19
|
+
when /flickr/
|
20
|
+
r[Content]
|
21
|
+
when /reddit/ # minimal view
|
22
|
+
F['view/'+SIOCt+'BoardPost'][{u => r},e]
|
23
|
+
when /universalhub/ # logo + trim spacehogging tagjunk
|
24
|
+
c = Nokogiri::HTML.parse r[Content][0]
|
25
|
+
c.css('section').map{|x|x.remove}
|
26
|
+
{c: [{_: :a, href: r['http://purl.org/rss/1.0/link'][0].E.uri,
|
27
|
+
c: [{_: :img, src: '/logos/uhub.png',style: 'position:absolute;top:-93px'},
|
28
|
+
{_: :h2, style: 'color:#000;margin:0',c: r[Title]}]},c.to_s],
|
29
|
+
style: 'float:left;max-width:40em;position:relative;background-color:#fff;border-color:#eee;margin-top:93px;margin-right:.3em;padding-top:0;border-style:dotted;border-width:.3em;border-radius:0 .8em .8em .8em'}
|
30
|
+
else
|
31
|
+
F['view/base'][{u => r},e,false]
|
32
|
+
end}}
|
33
|
+
|
34
|
+
end
|
data/infod/cal.rb
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
#watch __FILE__
|
2
|
+
class E
|
3
|
+
|
4
|
+
fn 'req/day',->e,r{
|
5
|
+
[303, {'Location'=> e.day.uri + r.q.except('y').qs}, []]}
|
6
|
+
|
7
|
+
def day; as Time.now.strftime '%Y/%m/%d/' end
|
8
|
+
|
9
|
+
fn 'table/month',->d{ m={}
|
10
|
+
d.map{|u,r|
|
11
|
+
r[Date].do{|d|d[0].do{|t|
|
12
|
+
t = Time.parse t unless t.time?
|
13
|
+
o=12*t.year + t.month - 1
|
14
|
+
x=o/3
|
15
|
+
y=o%3
|
16
|
+
m[x] ||= {}
|
17
|
+
m[x][y] ||= {}
|
18
|
+
m[x][y][u] = r
|
19
|
+
m[x][y][:time] = t
|
20
|
+
}} if r.class==Hash }
|
21
|
+
m }
|
22
|
+
|
23
|
+
fn 'table/day',->d{ m={}
|
24
|
+
d.map{|u,r|
|
25
|
+
r[Date].do{|d|d[0].do{|t|
|
26
|
+
t = DateTime.parse t unless t.time?
|
27
|
+
w=t.strftime('%Y%W').to_i
|
28
|
+
d=t.cwday
|
29
|
+
m[w] ||= {}
|
30
|
+
m[w][d] ||= {}
|
31
|
+
m[w][d][u] = r
|
32
|
+
m[w][d][:time] = t
|
33
|
+
}} if r.class==Hash }
|
34
|
+
m }
|
35
|
+
|
36
|
+
fn 'table/hour',->d{ m={}
|
37
|
+
d.map{|u,r|
|
38
|
+
r[Date].do{|d|d[0].do{|t|
|
39
|
+
t = Time.parse t unless t.time?
|
40
|
+
h=t.hour
|
41
|
+
s=h/12
|
42
|
+
h12=h%12
|
43
|
+
m[h12] ||= {}
|
44
|
+
m[h12][s] ||= {}
|
45
|
+
m[h12][s][u] = r
|
46
|
+
m[h12][s][:time] = t
|
47
|
+
}} if r.class==Hash }
|
48
|
+
m }
|
49
|
+
|
50
|
+
fn 'view/year',->d,e{F['view/t'][d,e,'month','month']}
|
51
|
+
|
52
|
+
fn 'view/month',->d,e{
|
53
|
+
[(d.delete :time).do{|month|
|
54
|
+
{_: :b, c: month.strftime('%B'),style: "color: #{E.cs}"}},
|
55
|
+
F['view/t'][d,e,'day','day-terminate']]}
|
56
|
+
|
57
|
+
fn 'view/day-terminate',->d,e{
|
58
|
+
[(d.delete :time).do{|day|
|
59
|
+
{_: :b, c: day.strftime('%d'),style: "float:left; color: #888"}},
|
60
|
+
F['view/title'][d,e]]}
|
61
|
+
|
62
|
+
fn 'view/day',->d,e{
|
63
|
+
[(d.delete :time).do{|day|
|
64
|
+
{_: :b, c: day.strftime('%d'),style: "float:left; color: #888"}},
|
65
|
+
F['view/t'][d,e,'hour','hour']]}
|
66
|
+
|
67
|
+
fn 'view/hour',->d,e{
|
68
|
+
[(d.delete :time).do{|hour|
|
69
|
+
{_: :b, c: hour.strftime('%H'),style: "float:left"}},
|
70
|
+
F['view/title'][d,e]]}
|
71
|
+
|
72
|
+
end
|
@@ -3,10 +3,9 @@ class E
|
|
3
3
|
def triplrSourceCode
|
4
4
|
m = mime.split(/\//)[-1].sub(/^x-/,'')
|
5
5
|
# show line numbers?
|
6
|
-
n = @r.has_key?('n')
|
6
|
+
n = (@r && @r.q.has_key?('n')) ? "--line-number-ref=#{uri.sh}:" : ""
|
7
7
|
if size < 512e3
|
8
|
-
yield uri,Content,
|
9
|
-
`source-highlight -f html -o STDOUT -i #{sh} -s #{m} #{n}`
|
8
|
+
yield uri,Content, `source-highlight -f html -s #{m} #{n} -i #{sh} -o STDOUT`
|
10
9
|
end
|
11
10
|
end
|
12
11
|
|
@@ -15,7 +14,11 @@ class E
|
|
15
14
|
r[Content]]}]}
|
16
15
|
|
17
16
|
# ls /usr/share/source-highlight/*.lang | xargs -i basename {} .lang | tr "\n" " "
|
18
|
-
%w{ada applescript asm awk bat bib bison caml changelog c clipper cobol conf cpp csharp css
|
17
|
+
%w{ada applescript asm awk bat bib bison caml changelog c clipper cobol conf cpp csharp css
|
18
|
+
desktop diff d erlang errors flex fortran function glsl haskell haskell_literate haxe html java
|
19
|
+
javascript key_string langdef latex ldap lisp log logtalk lsm lua m4 makefile manifest nohilite
|
20
|
+
number outlang oz pascal pc perl php prolog properties proto python ruby scala sh
|
21
|
+
shellscript slang sml spec sql style symbols tcl texinfo todo url vala vbscript xml}
|
19
22
|
.map{|l|
|
20
23
|
ma = 'application/' + l
|
21
24
|
mt = 'text/x-' + l
|
data/infod/constants.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
class E
|
2
|
+
|
3
|
+
FSbase = `pwd`.chomp ; BaseLen = FSbase.size
|
4
|
+
URIURL = '/@' # non-HTTP URI path resolution-prefix
|
5
|
+
S = /\._/ # data path-separator
|
6
|
+
|
7
|
+
W3 = 'http://www.w3.org/'
|
8
|
+
Purl = 'http://purl.org/'
|
9
|
+
FOAF = "http://xmlns.com/foaf/0.1/"
|
10
|
+
SIOC = 'http://rdfs.org/sioc/ns#'
|
11
|
+
SIOCt = 'http://rdfs.org/sioc/types#'
|
12
|
+
MIMEtype = 'http://www.iana.org/assignments/media-types/'
|
13
|
+
DIG = 'http://dig.csail.mit.edu/'
|
14
|
+
Deri = 'http://vocab.deri.ie/'
|
15
|
+
DC = Purl + 'dc/terms/'
|
16
|
+
Date = DC + 'date'
|
17
|
+
Title = DC + 'title'
|
18
|
+
Name = FOAF + 'name'
|
19
|
+
To = SIOC + 'addressed_to'
|
20
|
+
Creator = SIOC + 'has_creator'
|
21
|
+
Content = SIOC + 'content'
|
22
|
+
XHV = W3 + '1999/xhtml/vocab#'
|
23
|
+
RDFns = W3 + "1999/02/22-rdf-syntax-ns#"
|
24
|
+
EXIF = W3 + '2003/12/exif/ns#'
|
25
|
+
WF = W3 + '2005/01/wf/flow#'
|
26
|
+
HTTP = W3 + '2011/http#'
|
27
|
+
Header = W3 + '2011/http-headers#'
|
28
|
+
LDP = W3 + 'ns/ldp#'
|
29
|
+
Next = LDP+'nextPage'
|
30
|
+
Prev = LDP+'prevPage'
|
31
|
+
Posix = W3 + 'ns/posix/'
|
32
|
+
Type = RDFns+ "type"
|
33
|
+
# Type = W3 + "ns/rdf#type"
|
34
|
+
RDFs = W3 + 'ns/rdfs#'
|
35
|
+
PAC = DIG + '2008/PAC/ontology/pac#'
|
36
|
+
COGS = Deri + 'cogs#'
|
37
|
+
CSV = Deri + 'scsv#'
|
38
|
+
HTML = RDFns + "HTML"
|
39
|
+
Label = RDFs + 'label'
|
40
|
+
Stat = Posix + 'stat#'
|
41
|
+
Search = 'http://sindice.com/vocab/search#'
|
42
|
+
Audio = 'http://www.semanticdesktop.org/ontologies/nid3/#'
|
43
|
+
Edit = 'http://buzzword.org.uk/rdf/personal-link-types#edit'
|
44
|
+
Render = 'http://whats-your.name/www#RenderMIME/'
|
45
|
+
|
46
|
+
Prefix={
|
47
|
+
"dc" => DC,
|
48
|
+
"foaf" => FOAF,
|
49
|
+
"rdf" => W3 + "ns/rdf#" ,
|
50
|
+
"rdfs" => RDFs,
|
51
|
+
"sioc" => SIOC,
|
52
|
+
"stat" => Stat,
|
53
|
+
}
|
54
|
+
|
55
|
+
end
|
data/infod/{Es/css.rb → css.rb}
RENAMED
File without changes
|
data/infod/{Es/csv.rb → csv.rb}
RENAMED
File without changes
|
data/infod/{Es/du.rb → du.rb}
RENAMED
File without changes
|
data/infod/edit.rb
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
#watch __FILE__
|
2
|
+
class E
|
3
|
+
|
4
|
+
Prototypes = {
|
5
|
+
SIOCt+'MicroblogPost' => [Content],
|
6
|
+
SIOCt+'BlogPost' => [Date, Title, Content], nil=>nil,
|
7
|
+
'blank'=>[]
|
8
|
+
}
|
9
|
+
|
10
|
+
F['protograph/editable'] = F['protograph/_']
|
11
|
+
|
12
|
+
fn 'graph/editable',->e,env,g{
|
13
|
+
e.fromStream g, :triplrFsStore}
|
14
|
+
|
15
|
+
# select a prototype graph
|
16
|
+
# , or go blank
|
17
|
+
fn 'view/create',->g,e{
|
18
|
+
[H.css('/css/create'),{_: :b, c: :create},
|
19
|
+
Prototypes.map{|s,_| s.nil? ? {_: :b, c: ' '} : {_: :a, href: e['REQUEST_PATH']+'?graph=edit&prototype='+(CGI.escape s), c: s.label}}]}
|
20
|
+
|
21
|
+
fn 'view/edit',->g,e{
|
22
|
+
triple = ->s,p,o{
|
23
|
+
if s && p && o
|
24
|
+
s = s.E
|
25
|
+
p = p.E
|
26
|
+
oE = p.literal o
|
27
|
+
(id = s.concatURI(p).concatURI oE
|
28
|
+
[(case p
|
29
|
+
when Content
|
30
|
+
{_: :textarea, name: id, c: o, rows: 24, cols: 80}
|
31
|
+
when Date
|
32
|
+
{_: :input, name: id, type: :datetime, value: o.empty? ? Time.now.iso8601 : o}
|
33
|
+
else
|
34
|
+
{_: :input, name: id, value: o, size: 54}
|
35
|
+
end
|
36
|
+
),"<br>\n"]) if oE
|
37
|
+
end}
|
38
|
+
|
39
|
+
ps = []
|
40
|
+
e.q['prototype'].do{|pr| Prototypes[pr].do{|v|
|
41
|
+
g[e['uri']+'#'] ||= {}
|
42
|
+
ps.concat v }}
|
43
|
+
e.q['p'].do{|p| ps.push p }
|
44
|
+
|
45
|
+
[(H.once e, 'edit', (H.css '/css/edit')),
|
46
|
+
{_: :form, name: :editor, method: :POST, action: e['REQUEST_PATH'],
|
47
|
+
|
48
|
+
# each resource
|
49
|
+
c: [ g.map{|s,r|
|
50
|
+
url = s.E.localURL e
|
51
|
+
# per-resource links
|
52
|
+
{class: :resource, c:
|
53
|
+
[{_: :a, class: :uri, id: s, c: s, href: url},
|
54
|
+
{_: :a, class: :edit, c: '+predicate', href: url+'?graph=_&view=addP'},'<br><br>',
|
55
|
+
|
56
|
+
# each property
|
57
|
+
# r.keys.concat(ps).uniq.-(['uri']).map{|p|
|
58
|
+
(r.keys.concat(ps).uniq.map{|p|
|
59
|
+
[{_: :b, c: p}, '<br>',
|
60
|
+
r[p].do{|o| [*o].map{|o|triple[s,p,o]}}, # existing triples
|
61
|
+
triple[e['uri'],p,''], '<br>']} if r.class==Hash)]} if s.match(/#/)}, # create triple
|
62
|
+
{_: :input, type: :submit, value: 'save'}]}]}
|
63
|
+
|
64
|
+
# select a property to edit
|
65
|
+
fn 'view/addP',->g,e{
|
66
|
+
[(H.once e, 'edit', (H.css '/css/edit')),
|
67
|
+
[Date,Title,Creator,Content,Label].map{|p|{_: :a, href: p, c: p.label+' '}},
|
68
|
+
|
69
|
+
{_: :form, action: e['REQUEST_PATH'], method: :GET,
|
70
|
+
c: [{_: :input, type: :url, name: :p, pattern: '^http.*$', size: 64},
|
71
|
+
{_: :input, type: :submit, value: 'property'}]}]}
|
72
|
+
|
73
|
+
end
|
@@ -1,7 +1,16 @@
|
|
1
1
|
#watch __FILE__
|
2
2
|
class E
|
3
|
+
=begin
|
4
|
+
faceted-filter, implemented via dynamically-generated style-sheets
|
3
5
|
|
4
|
-
|
6
|
+
user defines 'itemview/name' which is wrapped by tagged DOM nodes
|
7
|
+
structure conformed to in microblog & timegraph (time.rb) views
|
8
|
+
|
9
|
+
?view=facets will prompt on which properties (predicates) to use
|
10
|
+
|
11
|
+
=end
|
12
|
+
|
13
|
+
fn 'facets',->a,m,e{
|
5
14
|
# facets
|
6
15
|
a = Hash[(a.split ',').map{|a|[a,{}]}]
|
7
16
|
|
@@ -17,7 +26,7 @@ class E
|
|
17
26
|
n=->o{
|
18
27
|
i[o]||='f'+(c+=1).to_s}
|
19
28
|
|
20
|
-
view=
|
29
|
+
view = e.q['fv'].do{|fv| F['itemview/'+fv] } || F['itemview/title']
|
21
30
|
resources=->{
|
22
31
|
m.map{|u,r| # each resource
|
23
32
|
a.map{|p,_| # each facet
|
@@ -33,27 +42,27 @@ class E
|
|
33
42
|
[(H.css'/css/facets'),(H.js'/js/facets'),(H.js'/js/mu'),
|
34
43
|
|
35
44
|
a.map{|b,_|{_: :style, class: n[b]}},
|
45
|
+
' ' * 22,
|
46
|
+
a.map{|f,v|{class: :selector, facet: n[f], c: f.label}},
|
36
47
|
|
37
48
|
# facet selection
|
38
49
|
{class: :sidebar, c: a.map{|f,v|
|
39
|
-
{class: :facet,
|
40
|
-
c: [f.label,
|
50
|
+
{class: :facet, facet: n[f], # predicate
|
51
|
+
c: [{class: :predicate, c: f.label},
|
41
52
|
v.sort_by{|k,v|v}.reverse.map{|k,v| # sort by popularity
|
42
53
|
k.respond_to?(:label) &&
|
43
54
|
{facet: n.(k.to_s), # predicate-object tuple
|
44
55
|
c: [{_: :span, class: :count, c: v},
|
45
|
-
{_: :span, class: :name, c: k.label}]}}]}}},
|
46
|
-
|
47
|
-
(F['view/'+e.q['fv']+'/base']||
|
48
|
-
->m,e,r{r.()}).(m,e,resources)]}
|
56
|
+
{_: :span, class: :name, c: k.label}]}}]}}},
|
57
|
+
(e.q['fv'].do{|fv|F['baseview/'+fv]} || ->m,e,r{r.()}).(m,e,resources)]}
|
49
58
|
|
50
|
-
fn 'view/
|
59
|
+
fn 'view/facetSelect',->m,e{
|
51
60
|
[(H.js '/js/facets.select'),(H.js '/js/mu'),(H.css '/css/facets'),
|
52
61
|
E.graphProperties(m).map{|e|[{c: e},' ']},
|
53
62
|
{_: 'button', c: 'Go'}]}
|
54
63
|
|
55
64
|
fn 'view/facets',->m,e{
|
56
|
-
e.q['a'].do{|a|Fn '
|
57
|
-
(Fn 'view/
|
65
|
+
e.q['a'].do{|a|Fn 'facets',a,m,e} ||
|
66
|
+
(Fn 'view/facetSelect',m,e)}
|
58
67
|
|
59
68
|
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
#watch __FILE__
|
2
|
+
|
2
3
|
module FeedParse
|
4
|
+
|
3
5
|
def html; CGI.unescapeHTML self end
|
4
6
|
def cdata; sub /^\s*<\!\[CDATA\[(.*?)\]\]>\s*$/m,'\1'end
|
5
7
|
def guess; send (case self
|
@@ -11,21 +13,20 @@ module FeedParse
|
|
11
13
|
:html
|
12
14
|
end) end
|
13
15
|
|
14
|
-
def parse
|
16
|
+
def parse
|
15
17
|
|
16
|
-
#
|
18
|
+
#prefix table
|
17
19
|
x={}
|
18
20
|
match(/<(rdf|rss|feed)([^>]+)/i)[2].scan(/xmlns:?([a-z]+)?=["']?([^'">\s]+)/){|m|x[m[0]]=m[1]}
|
19
21
|
|
20
22
|
#items
|
21
23
|
scan(%r{<(rss:|atom:)?(item|entry)([\s][^>]*)?>(.*?)</\1?\2>}mi){|m|
|
22
24
|
|
23
|
-
#
|
24
|
-
|
25
|
-
# find identifier
|
25
|
+
# identifier select -> RDF URI || <id> || <link>
|
26
26
|
u = m[2] && (u = m[2].match /about=["']?([^'">\s]+)/) && u[1] ||
|
27
27
|
m[3] && (((u = m[3].match /<(gu)?id[^>]*>([^<]+)/) || (u = m[3].match /<(link)>([^<]+)/)) && u[2])
|
28
28
|
|
29
|
+
yield u, E::Type, (E::SIOCt+'BlogPost').E
|
29
30
|
yield u, E::Type, (E::SIOC+'Post').E
|
30
31
|
|
31
32
|
#links
|
@@ -37,7 +38,9 @@ module FeedParse
|
|
37
38
|
m[3].scan(%r{<([a-z]+:)?([a-z]+)([\s][^>]*)?>(.*?)</\1?\2>}mi){|e|
|
38
39
|
yield u, # s
|
39
40
|
(x[e[0]&&e[0].chop]||E::RSS)+e[1], # p
|
40
|
-
e[3].extend(FeedParse).guess
|
41
|
+
e[3].extend(FeedParse).guess.do{|o|# o
|
42
|
+
o.match(/\A(\/|http)[\S]+\Z/) ? o.E : o
|
43
|
+
}}}
|
41
44
|
|
42
45
|
nil
|
43
46
|
end
|
@@ -53,13 +56,11 @@ class E
|
|
53
56
|
def listFeeds; (nokogiri.css 'link[rel=alternate]').map{|u|E (URI uri).merge(u.attr :href)} end
|
54
57
|
alias_method :feeds, :listFeeds
|
55
58
|
|
56
|
-
def getFeed
|
57
|
-
def getFeedReddit g;
|
59
|
+
def getFeed g; insertDocs :triplrFeed, g end
|
60
|
+
def getFeedReddit g; insertDocs :triplrFeedReddit, g end
|
58
61
|
|
59
|
-
# tripleStream
|
60
62
|
def triplrFeed &f
|
61
|
-
dateNorm :
|
62
|
-
rescue Exception => x
|
63
|
+
dateNorm :contentURIresolve,:triplrFeedNormalize,:triplrFeedRaw,&f
|
63
64
|
end
|
64
65
|
|
65
66
|
def triplrFeedReddit &f
|
@@ -68,16 +69,17 @@ class E
|
|
68
69
|
Nokogiri::HTML.parse(o).do{|o|
|
69
70
|
o.css('.md').do{|o|yield s,p,o}
|
70
71
|
yield s,Creator,o.css('a')[-4].child.to_s.strip
|
72
|
+
yield s,Type,(SIOCt+'BoardPost').E
|
71
73
|
} : (yield s,p,o)}
|
72
74
|
end
|
73
75
|
|
74
|
-
# tripleStream
|
75
76
|
def triplrFeedRaw &f
|
76
|
-
read.extend(FeedParse).parse &f
|
77
|
+
read.to_utf8.extend(FeedParse).parse &f
|
78
|
+
rescue Exception => e
|
79
|
+
puts [uri,e,e.backtrace[0]].join ' '
|
77
80
|
end
|
78
81
|
|
79
|
-
|
80
|
-
def triplrFeedSIOCize *f
|
82
|
+
def triplrFeedNormalize *f
|
81
83
|
send(*f){|s,p,o|
|
82
84
|
yield s,
|
83
85
|
{ Purl+'dc/elements/1.1/creator' => Creator,
|
@@ -92,7 +94,6 @@ class E
|
|
92
94
|
}[p]||p,
|
93
95
|
o } end
|
94
96
|
|
95
|
-
|
96
97
|
fn Render+'application/atom+xml',->d,e{
|
97
98
|
id = 'http://' + e['SERVER_NAME'] + (CGI.escapeHTML e['REQUEST_URI'])
|
98
99
|
H(['<?xml version="1.0" encoding="utf-8"?>',
|
@@ -4,8 +4,8 @@ class E
|
|
4
4
|
fn 'set/find',->e,q,m,x=''{
|
5
5
|
q['q'].do{|q|
|
6
6
|
r = '-iregex ' + ('.*' + q + '.*' + x).sh
|
7
|
-
s = q['size'].do{|s| s.match(/^\d+$/) && '-size +' + s + 'M'}
|
8
|
-
t = q['day'].do{|d| d.match(/^\d+$/) && '-ctime -' + d }
|
7
|
+
s = q['size'].do{|s| s.match(/^\d+$/) && '-size +' + s + 'M'} || ""
|
8
|
+
t = q['day'].do{|d| d.match(/^\d+$/) && '-ctime -' + d } || ""
|
9
9
|
[e,e.pathSegment].compact.select(&:e).map{|e|
|
10
10
|
`find #{e.sh} #{t} #{s} #{r} | head -n 1000`.
|
11
11
|
lines.map{|l|l.chomp.unpathFs}}.compact.flatten}}
|
@@ -13,7 +13,6 @@ class E
|
|
13
13
|
fn 'view/find',->i,e{
|
14
14
|
{_: :form, method: :GET, action: e['REQUEST_PATH'].t,
|
15
15
|
c: [{_: :input, name: :set, value: :find, type: :hidden},
|
16
|
-
{_: :input, name: :triplr, value: :id, type: :hidden},
|
17
16
|
{_: :input, name: :view, value: :ls, type: :hidden},
|
18
17
|
{_: :input, name: :q, style: 'float: left;font-size:1.3em'}]}}
|
19
18
|
|