precis-js
Version:
A JavaScript implementation of RFC 7564 (The PRECIS Framework).
87 lines (79 loc) • 3.86 kB
JavaScript
// 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);