git ssb

0+

ev / minbase



Tree: a82d9b053001af225a6db818036079f377f481d0

Files: a82d9b053001af225a6db818036079f377f481d0 / modules / search.js

2535 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
15var whitespace = /\s+/
16
17function andSearch(terms, inputs) {
18 for(var i = 0; i < terms.length; i++) {
19 var match = false
20 for(var j = 0; j < inputs.length; j++) {
21 if(terms[i].test(inputs[j])) match = true
22 }
23 //if a term was not matched by anything, filter this one
24 if(!match) return false
25 }
26 return true
27}
28
29function searchFilter(terms) {
30 return function (msg) {
31 var c = msg && msg.value && msg.value.content
32 return c && (
33 msg.key == terms[0] ||
34 andSearch(terms.map(function (term) {
35 return new RegExp(term, 'i')
36 // return new RegExp('\\b'+term+'\\b', 'i')
37 }), [c.text, c.name, c.title])
38 )
39 }
40}
41
42function createOrRegExp(ary) {
43 return new RegExp(ary.map(function (e) {
44 return '\\b'+e+'\\b'
45 }).join('|'), 'i')
46}
47
48/*function highlight(el, query) {
49 var searcher = new TextNodeSearcher({container: el})
50 searcher.query = query
51 searcher.highlight()
52 return el
53}*/
54
55exports.create = function (api) {
56
57 return function (path) {
58 if((path[0] === '?') || (path[0] === '#')) {
59 if (path[0] === '?') {
60 var query = path.substr(1).trim().split(whitespace)
61 } else { var query = path.split(whitespace)}
62 var _matches = searchFilter(query)
63
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