wtf_wikipedia
Version:
parse wikiscript into json
198 lines (185 loc) • 5.25 kB
JavaScript
const strip = require('../../../parse/toJSON/_strip')
const parse = require('../../../parse/toJSON')
const delta = require('./_lib').delta
const fmt = require('./_format')
//wrap it up as a template
const template = function (date) {
return {
template: 'date',
data: date,
}
}
const getBoth = function (tmpl) {
tmpl = strip(tmpl)
let arr = tmpl.split('|')
let from = fmt.ymd(arr.slice(1, 4))
let to = arr.slice(4, 7)
//assume now, if 'to' is empty
if (to.length === 0) {
let d = new Date()
to = [d.getFullYear(), d.getMonth(), d.getDate()]
}
to = fmt.ymd(to)
return {
from: from,
to: to,
}
}
const parsers = {
//generic {{date|year|month|date}} template
date: (tmpl, list) => {
let order = ['year', 'month', 'date', 'hour', 'minute', 'second', 'timezone']
let obj = parse(tmpl, order)
let data = fmt.ymd([obj.year, obj.month, obj.date || obj.day])
obj.text = fmt.toText(data) //make the replacement string
if (obj.timezone) {
if (obj.timezone === 'Z') {
obj.timezone = 'UTC'
}
obj.text += ` (${obj.timezone})`
}
if (obj.hour && obj.minute) {
if (obj.second) {
obj.text = `${obj.hour}:${obj.minute}:${obj.second}, ` + obj.text
} else {
obj.text = `${obj.hour}:${obj.minute}, ` + obj.text
}
}
if (obj.text) {
list.push(template(obj))
}
return obj.text
},
//support parsing of 'February 10, 1992'
natural_date: (tmpl, list) => {
let order = ['text']
let obj = parse(tmpl, order)
let str = obj.text || ''
// - just a year
let date = {}
if (/^[0-9]{4}$/.test(str)) {
date.year = parseInt(str, 10)
} else {
//parse the date, using the js date object (for now?)
let txt = str.replace(/[a-z]+\/[a-z]+/i, '')
txt = txt.replace(/[0-9]+:[0-9]+(am|pm)?/i, '')
let d = new Date(txt)
if (isNaN(d.getTime()) === false) {
date.year = d.getFullYear()
date.month = d.getMonth() + 1
date.date = d.getDate()
}
}
list.push(template(date))
return str.trim()
},
//just grab the first value, and assume it's a year
one_year: (tmpl, list) => {
let order = ['year']
let obj = parse(tmpl, order)
let year = Number(obj.year)
list.push(
template({
year: year,
})
)
return String(year)
},
//assume 'y|m|d' | 'y|m|d' // {{BirthDeathAge|B|1976|6|6|1990|8|8}}
two_dates: (tmpl, list) => {
let order = ['b', 'birth_year', 'birth_month', 'birth_date', 'death_year', 'death_month', 'death_date']
let obj = parse(tmpl, order)
//'b' means show birth-date, otherwise show death-date
if (obj.b && obj.b.toLowerCase() === 'b') {
let date = fmt.ymd([obj.birth_year, obj.birth_month, obj.birth_date])
list.push(template(date))
return fmt.toText(date)
}
let date = fmt.ymd([obj.death_year, obj.death_month, obj.death_date])
list.push(template(date))
return fmt.toText(date)
},
age: (tmpl) => {
let d = getBoth(tmpl)
let diff = delta(d.from, d.to)
return diff.years || 0
},
'diff-y': (tmpl) => {
let d = getBoth(tmpl)
let diff = delta(d.from, d.to)
if (diff.years === 1) {
return diff.years + ' year'
}
return (diff.years || 0) + ' years'
},
'diff-ym': (tmpl) => {
let d = getBoth(tmpl)
let diff = delta(d.from, d.to)
let arr = []
if (diff.years === 1) {
arr.push(diff.years + ' year')
} else if (diff.years && diff.years !== 0) {
arr.push(diff.years + ' years')
}
if (diff.months === 1) {
arr.push('1 month')
} else if (diff.months && diff.months !== 0) {
arr.push(diff.months + ' months')
}
return arr.join(', ')
},
'diff-ymd': (tmpl) => {
let d = getBoth(tmpl)
let diff = delta(d.from, d.to)
let arr = []
if (diff.years === 1) {
arr.push(diff.years + ' year')
} else if (diff.years && diff.years !== 0) {
arr.push(diff.years + ' years')
}
if (diff.months === 1) {
arr.push('1 month')
} else if (diff.months && diff.months !== 0) {
arr.push(diff.months + ' months')
}
if (diff.days === 1) {
arr.push('1 day')
} else if (diff.days && diff.days !== 0) {
arr.push(diff.days + ' days')
}
return arr.join(', ')
},
'diff-yd': (tmpl) => {
let d = getBoth(tmpl)
let diff = delta(d.from, d.to)
let arr = []
if (diff.years === 1) {
arr.push(diff.years + ' year')
} else if (diff.years && diff.years !== 0) {
arr.push(diff.years + ' years')
}
//ergh...
diff.days += (diff.months || 0) * 30
if (diff.days === 1) {
arr.push('1 day')
} else if (diff.days && diff.days !== 0) {
arr.push(diff.days + ' days')
}
return arr.join(', ')
},
'diff-d': (tmpl) => {
let d = getBoth(tmpl)
let diff = delta(d.from, d.to)
let arr = []
//ergh...
diff.days += (diff.years || 0) * 365
diff.days += (diff.months || 0) * 30
if (diff.days === 1) {
arr.push('1 day')
} else if (diff.days && diff.days !== 0) {
arr.push(diff.days + ' days')
}
return arr.join(', ')
},
}
module.exports = parsers