UNPKG

precis-js

Version:

A JavaScript implementation of RFC 7564 (The PRECIS Framework).

87 lines (79 loc) 3.86 kB
// Generated by CoffeeScript 1.10.0 (function() { var DirectionalityValidator, InvalidDirectionalityError, precis; InvalidDirectionalityError = require('../error/InvalidDirectionalityError'); precis = require('../constants'); module.exports = DirectionalityValidator = (function() { function DirectionalityValidator(propertyReader) { this.propertyReader = propertyReader; } DirectionalityValidator.prototype.validate = function(codepoints) { var bidiClass, codepoint, direction, i, last, len, state; if (!codepoints.length) { return; } state = 0; direction = -1; last = -1; for (i = 0, len = codepoints.length; i < len; i++) { codepoint = codepoints[i]; bidiClass = this.propertyReader.bidiClass(codepoint); if (bidiClass !== precis.BIDI_CLASS.NSM) { last = bidiClass; } switch (state) { case 0: switch (bidiClass) { case precis.BIDI_CLASS.L: direction = 0; state = 1; break; case precis.BIDI_CLASS.R: case precis.BIDI_CLASS.AL: direction = 1; state = 2; break; default: throw new InvalidDirectionalityError(); } break; case 1: if (bidiClass !== precis.BIDI_CLASS.L && bidiClass !== precis.BIDI_CLASS.EN && bidiClass !== precis.BIDI_CLASS.ES && bidiClass !== precis.BIDI_CLASS.CS && bidiClass !== precis.BIDI_CLASS.ET && bidiClass !== precis.BIDI_CLASS.ON && bidiClass !== precis.BIDI_CLASS.BN && bidiClass !== precis.BIDI_CLASS.NSM) { throw new InvalidDirectionalityError(); } break; case 2: if (bidiClass !== precis.BIDI_CLASS.R && bidiClass !== precis.BIDI_CLASS.AL && bidiClass !== precis.BIDI_CLASS.AN && bidiClass !== precis.BIDI_CLASS.EN && bidiClass !== precis.BIDI_CLASS.ES && bidiClass !== precis.BIDI_CLASS.CS && bidiClass !== precis.BIDI_CLASS.ET && bidiClass !== precis.BIDI_CLASS.ON && bidiClass !== precis.BIDI_CLASS.BN && bidiClass !== precis.BIDI_CLASS.NSM) { throw new InvalidDirectionalityError(); } if (bidiClass === precis.BIDI_CLASS.EN) { state = 3; } if (bidiClass === precis.BIDI_CLASS.AN) { state = 4; } break; case 3: if (bidiClass !== precis.BIDI_CLASS.R && bidiClass !== precis.BIDI_CLASS.AL && bidiClass !== precis.BIDI_CLASS.EN && bidiClass !== precis.BIDI_CLASS.ES && bidiClass !== precis.BIDI_CLASS.CS && bidiClass !== precis.BIDI_CLASS.ET && bidiClass !== precis.BIDI_CLASS.ON && bidiClass !== precis.BIDI_CLASS.BN && bidiClass !== precis.BIDI_CLASS.NSM) { throw new InvalidDirectionalityError(); } break; case 4: if (bidiClass !== precis.BIDI_CLASS.R && bidiClass !== precis.BIDI_CLASS.AL && bidiClass !== precis.BIDI_CLASS.AN && bidiClass !== precis.BIDI_CLASS.ES && bidiClass !== precis.BIDI_CLASS.CS && bidiClass !== precis.BIDI_CLASS.ET && bidiClass !== precis.BIDI_CLASS.ON && bidiClass !== precis.BIDI_CLASS.BN && bidiClass !== precis.BIDI_CLASS.NSM) { throw new InvalidDirectionalityError(); } } } if (direction) { if (last !== precis.BIDI_CLASS.R && last !== precis.BIDI_CLASS.AL && last !== precis.BIDI_CLASS.AN && last !== precis.BIDI_CLASS.EN) { throw new InvalidDirectionalityError(); } } else { if (last !== precis.BIDI_CLASS.L && last !== precis.BIDI_CLASS.EN) { throw new InvalidDirectionalityError(); } } }; return DirectionalityValidator; })(); }).call(this);