123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- import { MathStore } from './math_store.js';
- import { activate } from '../semantic_tree/semantic_annotations.js';
- import { SemanticMap } from '../semantic_tree/semantic_attr.js';
- import { SemanticType, SemanticRole } from '../semantic_tree/semantic_meaning.js';
- export class BrailleStore extends MathStore {
- constructor() {
- super(...arguments);
- this.modality = 'braille';
- this.customTranscriptions = {
- '\u22ca': '⠈⠡⠳'
- };
- }
- evaluateString(str) {
- const descs = [];
- const text = Array.from(str);
- for (let i = 0; i < text.length; i++) {
- descs.push(this.evaluateCharacter(text[i]));
- }
- return descs;
- }
- annotations() {
- for (let i = 0, annotator; (annotator = this.annotators[i]); i++) {
- activate(this.locale, annotator);
- }
- }
- }
- export class EuroStore extends BrailleStore {
- constructor() {
- super(...arguments);
- this.locale = 'euro';
- this.customTranscriptions = {};
- this.customCommands = {
- '\\cdot': '*',
- '\\lt': '<',
- '\\gt': '>'
- };
- this.lastSpecial = false;
- this.specialChars = ['^', '_', '{', '}'];
- }
- evaluateString(str) {
- const regexp = /(\\[a-z]+|\\{|\\}|\\\\)/i;
- const split = str.split(regexp);
- const cleaned = this.cleanup(split);
- return super.evaluateString(cleaned);
- }
- cleanup(commands) {
- const cleaned = [];
- let intext = false;
- let lastcom = null;
- for (let command of commands) {
- if (command.match(/^\\/)) {
- if (command === '\\text') {
- intext = true;
- }
- if (this.addSpace(SemanticMap.LatexCommands.get(command))) {
- cleaned.push(' ');
- }
- command = this.customCommands[command] || command;
- const newcom = command.match(/^\\/);
- if (newcom && command.match(/^\\[a-zA-Z]+$/) && lastcom) {
- cleaned.push(' ');
- }
- lastcom = newcom ? command : null;
- cleaned.push(command);
- continue;
- }
- const rest = command.split('');
- for (const char of rest) {
- if (intext) {
- cleaned.push(char);
- intext = char !== '}';
- lastcom = null;
- continue;
- }
- if (char.match(/[a-z]/i) && lastcom) {
- lastcom = null;
- cleaned.push(' ');
- cleaned.push(char);
- continue;
- }
- if (char.match(/\s/))
- continue;
- if (this.addSpace(char)) {
- cleaned.push(' ');
- }
- cleaned.push(char);
- lastcom = null;
- }
- }
- return cleaned.join('');
- }
- addSpace(char) {
- if (!char)
- return false;
- if (this.specialChars.indexOf(char) !== -1) {
- this.lastSpecial = true;
- return false;
- }
- if (this.lastSpecial) {
- this.lastSpecial = false;
- return false;
- }
- const meaning = SemanticMap.Meaning.get(char);
- return (meaning.type === SemanticType.OPERATOR ||
- meaning.type === SemanticType.RELATION ||
- (meaning.type === SemanticType.PUNCTUATION &&
- meaning.role === SemanticRole.COLON));
- }
- }
|