math_simple_store.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import { Engine } from '../common/engine.js';
  2. import { Axis } from './dynamic_cstr.js';
  3. export class MathSimpleStore {
  4. constructor() {
  5. this.rules = new Map();
  6. }
  7. static parseUnicode(num) {
  8. const keyValue = parseInt(num, 16);
  9. return String.fromCodePoint(keyValue);
  10. }
  11. static testDynamicConstraints_(dynamic, rule) {
  12. if (Engine.getInstance().strict) {
  13. return rule.cstr.equal(dynamic);
  14. }
  15. return Engine.getInstance().comparator.match(rule.cstr);
  16. }
  17. defineRulesFromMappings(locale, modality, mapping) {
  18. for (const [domain, styles] of Object.entries(mapping)) {
  19. for (const [style, content] of Object.entries(styles)) {
  20. this.defineRuleFromStrings(locale, modality, domain, style, content);
  21. }
  22. }
  23. }
  24. getRules(key) {
  25. let store = this.rules.get(key);
  26. if (!store) {
  27. store = [];
  28. this.rules.set(key, store);
  29. }
  30. return store;
  31. }
  32. defineRuleFromStrings(locale, modality, domain, style, content) {
  33. let store = this.getRules(locale);
  34. const parser = Engine.getInstance().parsers[domain] ||
  35. Engine.getInstance().defaultParser;
  36. const comp = Engine.getInstance().comparators[domain];
  37. const cstr = `${locale}.${modality}.${domain}.${style}`;
  38. const dynamic = parser.parse(cstr);
  39. const comparator = comp ? comp() : Engine.getInstance().comparator;
  40. const oldCstr = comparator.getReference();
  41. comparator.setReference(dynamic);
  42. const rule = { cstr: dynamic, action: content };
  43. store = store.filter((r) => !dynamic.equal(r.cstr));
  44. store.push(rule);
  45. this.rules.set(locale, store);
  46. comparator.setReference(oldCstr);
  47. }
  48. lookupRule(_node, dynamic) {
  49. let rules = this.getRules(dynamic.getValue(Axis.LOCALE));
  50. rules = rules.filter(function (rule) {
  51. return MathSimpleStore.testDynamicConstraints_(dynamic, rule);
  52. });
  53. if (rules.length === 1) {
  54. return rules[0];
  55. }
  56. return rules.length
  57. ? rules.sort((r1, r2) => Engine.getInstance().comparator.compare(r1.cstr, r2.cstr))[0]
  58. : null;
  59. }
  60. }