git ssb

0+

ev / minbase



Tree: af61e933b76582db7ede664f53deca0cd2bd5dcf

Files: af61e933b76582db7ede664f53deca0cd2bd5dcf / modules / search.js

2580 bytesRaw
1var h = require('hyperscript')
2var u = require('../util')
3var pull = require('pull-stream')
4var Scroller = require('pull-scroll')
5var TextNodeSearcher = require('text-node-searcher')
6var log = require('./scuttlebot').log
7
8
9exports.needs = {
10 message_render: 'first'
11}
12
13exports.gives = 'screen_view'
14
15function andSearch(terms, inputs) {
16 for(var i = 0; i < terms.length; i++) {
17 var match = false
18 for(var j = 0; j < inputs.length; j++) {
19 if(terms[i].test(inputs[j])) match = true
20 }
21 //if a term was not matched by anything, filter this one
22 if(!match) return false
23 }
24 return true
25}
26
27function searchFilter(terms) {
28 return function (msg) {
29 var c = msg && msg.value && msg.value.content
30 return c && (
31 msg.key == terms[0] ||
32 andSearch(terms.map(function (term) {
33 //return new RegExp(term, 'i')
34 return new RegExp('\\b'+term+'\\b', 'i')
35 }), [c.text, c.name, c.title])
36 )
37 }
38}
39
40function createOrRegExp(ary) {
41 return new RegExp(ary.map(function (e) {
42 return '\\b'+e+'\\b'
43 }).join('|'), 'i')
44}
45
46function highlight(el, query) {
47 var searcher = new TextNodeSearcher({container: el})
48 searcher.query = query
49 searcher.highlight()
50 return el
51}
52
53exports.create = function (api) {
54
55 return function (path) {
56 if((path[0] === '?') || (path[0] === '#')) {
57 console.log(path)
58 if (path[0] === '?') {
59 var query = path.substr(1).split('%20').join(' ').split(' ')
60 } else { var query = path.split('%20').join(' ').split(' ')}
61 var _matches = searchFilter(query)
62
63 console.log(query)
64 var total = 0, matches = 0
65
66 var header = h('div.search_header', '')
67 var content = h('div.column.scroller__content')
68 var div = h('div.column.scroller',
69 {style: {'overflow':'auto'}},
70 h('div.scroller__wrapper',
71 header,
72 content
73 )
74 )
75
76 function matchesQuery (data) {
77 total++
78 var m = _matches(data)
79 if(m) matches++
80 //header.textContent = 'searched:'+total+', found:'+matches
81 return m
82 }
83
84 function renderMsg(msg) {
85 var el = api.message_render(msg)
86 //highlight(el, createOrRegExp(query))
87 return el
88 }
89
90 pull(
91 log({old: false}),
92 pull.filter(matchesQuery),
93 Scroller(div, content, renderMsg, true, false)
94 )
95
96 pull(
97 u.next(log, {reverse: true, limit: 500, live: false}),
98 pull.filter(matchesQuery),
99 Scroller(div, content, renderMsg, false, false)
100 )
101
102 return div
103 }
104 }
105
106}
107

Built with git-ssb-web