summaryrefslogtreecommitdiff
path: root/client/src/lib/db/index.js
blob: 21e648de048329ddffbd8b24a5bfcfeb21998c77 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import hosts from './hosts'
import { backupDB } from './backupDB';

function fetchDB(cb) {
  let raw_db;
  fetch('/db.json', {
    method: 'GET'
  }).then(res => {
    if (res.status !== 200) {
      return null
    }
    return res.json()
  }).then(json => {
    if (json) {
      raw_db = parse(json)
    }
    cb(raw_db)  
//     return fetch(hosts.comments, {
//       method: 'GET',
//     })
//   }).then(res => {
//     if (res.status !== 200) {
//       return null
//     }
//     return res.json()
//   }).then(json => {
//     if (json) {
//       raw_db.comments = json.reverse()
//       cb(raw_db)  
//     }
  }).catch((err) => {
    console.warn(err)
  })
}

function backup() {
  return parse(backupDB)
}

function parse(db) {
  let { page, ...parsed } = db
  parsed.page = {}
  parsed.timeline = parsed.timeline
    .filter((el) => ! el.disabled)
    .sort((a,b) => a.__index<b.__index?-1:a.__index===b.__index?0:1)
  Object.values(page).forEach((el) => {
    parsed.page[el.id] = el
  })
  parseKeywords(parsed)
  parsed.comments = []
  return parsed
}

function parseKeywords(db){
  const counts = {}
  db.about = db.about[0]
  db.drone = db.drone[0]
  db.stream = db.stream[0]
  db.timeline.forEach((event) => {
    const dedupe = {}
    event.keywords = event.keywords.replace(/\n/, ' ').split('#')
      .map((t) => (t || '').trim().toLowerCase())
      .filter((t) => !!t.length)
      .map((t) => {
        if (t in dedupe) return
        dedupe[t] = 1
        const caps = capitalize(t)
        counts[caps] = counts[caps] || 0
        counts[caps] += 1
        return caps
      })
  })
  db.timeline.forEach((event) => {
    event.keywords = event.keywords.filter( (t) => counts[t] > 1 )
  })
}

const shortWords = makeLookup('of and to')

const allcaps = makeLookup('usa us cia fbi nsa ii nasa uav cctv gchq')

function makeLookup(s) {
  const lookup = {}
  s.split(' ').forEach( (t) => lookup[t] = true )
  return lookup
}
function capitalize(s) {
  return s.replace(/-/,' ').split(' ').map(capitalizeWord).join(' ')
}
function capitalizeWord(s) {
  if (allcaps[s]) return s.toUpperCase()
  if (shortWords[s]) return s
  return s.charAt(0).toUpperCase() + s.slice(1)
}

export default { fetch: fetchDB, backup, hosts }