transformers.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import { SemanticRole, SemanticType } from '../semantic_tree/semantic_meaning.js';
  2. export function pluralCase(num, _plural) {
  3. return num.toString();
  4. }
  5. export function identityTransformer(input) {
  6. return input.toString();
  7. }
  8. export function siCombiner(prefix, unit) {
  9. return prefix + unit.toLowerCase();
  10. }
  11. export const Combiners = {};
  12. Combiners.identityCombiner = function (a, b, c) {
  13. return a + b + c;
  14. };
  15. Combiners.prefixCombiner = function (letter, font, cap) {
  16. letter = cap ? cap + ' ' + letter : letter;
  17. return font ? font + ' ' + letter : letter;
  18. };
  19. Combiners.postfixCombiner = function (letter, font, cap) {
  20. letter = cap ? cap + ' ' + letter : letter;
  21. return font ? letter + ' ' + font : letter;
  22. };
  23. Combiners.romanceCombiner = function (letter, font, cap) {
  24. letter = cap ? letter + ' ' + cap : letter;
  25. return font ? letter + ' ' + font : letter;
  26. };
  27. export function convertVulgarFraction(node, over = '') {
  28. if (!node.childNodes ||
  29. !node.childNodes[0] ||
  30. !node.childNodes[0].childNodes ||
  31. node.childNodes[0].childNodes.length < 2 ||
  32. node.childNodes[0].childNodes[0].tagName !==
  33. SemanticType.NUMBER ||
  34. node.childNodes[0].childNodes[0].getAttribute('role') !==
  35. SemanticRole.INTEGER ||
  36. node.childNodes[0].childNodes[1].tagName !==
  37. SemanticType.NUMBER ||
  38. node.childNodes[0].childNodes[1].getAttribute('role') !==
  39. SemanticRole.INTEGER) {
  40. return { convertible: false, content: node.textContent };
  41. }
  42. const denStr = node.childNodes[0].childNodes[1].textContent;
  43. const enumStr = node.childNodes[0].childNodes[0].textContent;
  44. const denominator = Number(denStr);
  45. const enumerator = Number(enumStr);
  46. if (isNaN(denominator) || isNaN(enumerator)) {
  47. return {
  48. convertible: false,
  49. content: `${enumStr} ${over} ${denStr}`
  50. };
  51. }
  52. return {
  53. convertible: true,
  54. enumerator: enumerator,
  55. denominator: denominator
  56. };
  57. }
  58. export function vulgarFractionSmall(node, enumer, denom) {
  59. const conversion = convertVulgarFraction(node);
  60. if (conversion.convertible) {
  61. const enumerator = conversion.enumerator;
  62. const denominator = conversion.denominator;
  63. return (enumerator > 0 &&
  64. enumerator < enumer &&
  65. denominator > 0 &&
  66. denominator < denom);
  67. }
  68. return false;
  69. }