katex2tex.ts 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. export interface CopyDelimiters {
  2. inline: [string, string];
  3. display: [string, string];
  4. }
  5. // Set these to how you want inline and display math to be delimited.
  6. export const defaultCopyDelimiters: CopyDelimiters = {
  7. inline: ['$', '$'], // alternative: ['\(', '\)']
  8. display: ['$$', '$$'], // alternative: ['\[', '\]']
  9. };
  10. // Replace .katex elements with their TeX source (<annotation> element).
  11. // Modifies fragment in-place. Useful for writing your own 'copy' handler,
  12. // as in copy-tex.js.
  13. export function katexReplaceWithTex(
  14. fragment: DocumentFragment,
  15. copyDelimiters: CopyDelimiters = defaultCopyDelimiters
  16. ): DocumentFragment {
  17. // Remove .katex-html blocks that are preceded by .katex-mathml blocks
  18. // (which will get replaced below).
  19. const katexHtml = fragment.querySelectorAll('.katex-mathml + .katex-html');
  20. for (let i = 0; i < katexHtml.length; i++) {
  21. const element = katexHtml[i];
  22. if (element.remove) {
  23. element.remove();
  24. } else if (element.parentNode) {
  25. element.parentNode.removeChild(element);
  26. }
  27. }
  28. // Replace .katex-mathml elements with their annotation (TeX source)
  29. // descendant, with inline delimiters.
  30. const katexMathml = fragment.querySelectorAll('.katex-mathml');
  31. for (let i = 0; i < katexMathml.length; i++) {
  32. const element = katexMathml[i];
  33. const texSource = element.querySelector('annotation');
  34. if (texSource) {
  35. if (element.replaceWith) {
  36. element.replaceWith(texSource);
  37. } else if (element.parentNode) {
  38. element.parentNode.replaceChild(texSource, element);
  39. }
  40. texSource.innerHTML = copyDelimiters.inline[0] +
  41. texSource.innerHTML + copyDelimiters.inline[1];
  42. }
  43. }
  44. // Switch display math to display delimiters.
  45. const displays = fragment.querySelectorAll('.katex-display annotation');
  46. for (let i = 0; i < displays.length; i++) {
  47. const element = displays[i];
  48. element.innerHTML = copyDelimiters.display[0] +
  49. element.innerHTML.substr(copyDelimiters.inline[0].length,
  50. element.innerHTML.length - copyDelimiters.inline[0].length
  51. - copyDelimiters.inline[1].length)
  52. + copyDelimiters.display[1];
  53. }
  54. return fragment;
  55. }
  56. export default katexReplaceWithTex;