Skip to content

Instantly share code, notes, and snippets.

@ptgolden
Last active August 29, 2015 14:03
Show Gist options
  • Save ptgolden/05533a1de0841d89e10d to your computer and use it in GitHub Desktop.
Save ptgolden/05533a1de0841d89e10d to your computer and use it in GitHub Desktop.
Simple PegJS year parser
// vim: set filetype=javascript
{
function zeroPadded(number) {
var numberInt = parseInt(number)
, numberStr = '' + Math.abs(numberInt)
, sign = numberInt < 0 ? '-' : '+'
if (numberStr.length < 4) numberStr = ('0000' + numberStr).substr(-4, 4);
return sign + numberStr;
}
function formatReturn(type, value, isoValue) {
return { type: type, value: value, isoValue: zeroPadded(isoValue) }
}
}
start
= years
years
= gregorianyear
/ bpyear
/ isoyear
isoyear =
val:(sign:sign first:fourdigits rest:digit+ { return sign + first + rest.join('') }
/ sign:sign? digits:fourdigits { return (sign || '') + digits })
{
return formatReturn('iso8601', val, val)
}
gregorianyear =
val:(y:digitsorcomma ' '* suffix:(bc / ad) { return y + ' ' + suffix })
{
var neg = val.search('BC') !== -1;
var yearInt = parseInt(val) * (neg ? -1 : 1) + (neg ? 1 : 0);
return formatReturn('gregorian', val, yearInt);
}
bpyear =
val:(y:digitsorcomma ' '* suffix:(bp) { return y + ' ' + suffix })
{
var yearInt = 2000 - parseInt(val);
return formatReturn('bp', val, yearInt)
}
digitsorcomma =
head:(onetothreedigits) tail:(',' ds:threedigits { return ds })+ { return head + tail.join('') }
/ manydigits
// Constants
sign = '+' / '-'
digit = [0-9]
onetothreedigits = a:digit b:digit? c:digit? { return a + (b || '') + (c || '')}
threedigits = a:digit b:digit c:digit { return a + b + c }
fourdigits = a:digit b:digit c:digit d:digit { return a + b + c + d }
manydigits = digits:digit+ { return digits.join('') }
bp = 'b'i '.'? 'p'i '.'? { return 'BP' }
bc = b:'b'i '.'? c:'c'i '.'? e:('e'i '.'?)? { return 'BC' + (e ? 'E' : '') }
ad = 'a'i '.'? 'd'i '.'? { return 'AD' }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment