J'ai une chaîne qui contient des maths. Je dois envelopper les balises mathématiques dans une étendue et remettre la chaîne en place. J'ai accompli cela pour un cas spécifique, mais je recherche quelque chose de beaucoup plus simple (s'il y en a) et un moyen plus efficace d'y parvenir. Par exemple, s'il y a du texte avant la balise mathématique, cela ne fonctionnera pas ou s'il y a plusieurs balises mathématiques, cela ne fonctionnera pas. Merci pour toute l'aide que vous pouvez nous apporter.

Chaîne

<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn><mo>&#xA0;</mo><msqrt><mn>34</mn></msqrt></math> I am text after the string.

Chaîne souhaitée

<span class="math math-inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn><mo>&#xA0;</mo><msqrt><mn>34</mn></msqrt></math></span> I am text after the string.

Solution à ce jour

let spanStart = '<span class="math math-inline">';
let spanEnd = '</span>';
let mathStart = '<math';
let mathEnd = '</math>';
let startPos = mathString.indexOf(mathStart);
let endPos = mathString.indexOf(mathEnd);

let output = mathString.substr(startPos, 0) + spanStart + mathStart + mathString.substr(mathStart.length, (endPos - mathStart.length)) + mathString.substr(endPos, mathEnd.length) + spanEnd + mathString.substr((endPos + spanEnd.length));

J'ai fait un stylo pour montrer ma solution jusqu'à présent mais encore une fois cela ne fonctionnera pas tout le temps .

Par exemple si vous aviez :

This is question 2 <math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn><mo>&#xA0;</mo><msqrt><mn>34</mn></msqrt></math> I am text after the string.

Ce ne serait plus correct. Merci pour ton aide

0
bilcker 15 mars 2019 à 16:32

2 réponses

Meilleure réponse

Voici ma solution basée sur le commentaire de @Lewsi

function wrapMath (string) {
  if (typeof string !== 'string') return false
  if (!checkForMath(string)) return false

  const spanStart = '<span class="math math-inline">'
  const spanEnd = '</span>'

  return string.replace(/<math/g, spanStart + '<math').replace(/<\/math>/g, spanEnd)
}

let string = 'This is my string <math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn><mo>&#xA0;</mo><msqrt><mn>34</mn></msqrt></math> I am text after the string.
'

wrapMath(string)

// Output
'This is my string <span class="math math-inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn><mo>&#xA0;</mo><msqrt><mn>34</mn></msqrt></math></span> I am text after the string'
0
bilcker 7 nov. 2019 à 17:19

En supposant que la balise <math> se trouve dans <body>. Utilisez .innerHTML.

var html = document.querySelector('body').innerHTML;
document.querySelector('body').innerHTML = `<span class='math math-inline'>${html}</span>`;
.math {font-family: consolas; font-style:italic; color:red}
<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn><mo>&#xA0;</mo><msqrt><mn>34</mn></msqrt></math>
0
zer00ne 15 mars 2019 à 13:43