diff options
Diffstat (limited to 'client/src/lib/db/index.js')
| -rw-r--r-- | client/src/lib/db/index.js | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/client/src/lib/db/index.js b/client/src/lib/db/index.js new file mode 100644 index 0000000..3fc6397 --- /dev/null +++ b/client/src/lib/db/index.js @@ -0,0 +1,85 @@ +import hosts from './hosts' +import { backupDB } from './backupDB'; + +function fetchDB(cb) { + let raw_db; + fetch(hosts.db, { + method: 'GET' + }).then(res => { + return res.json() + }).then(json => { + raw_db = parse(json) + return fetch(hosts.comments, { + method: 'GET', + }) + }).then(res => { + return res.json() + }).then(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 } |
