gpt4 book ai didi

javascript - 将下标从 OpenMath 转换为 MathML

转载 作者:行者123 更新时间:2023-12-03 08:49:35 24 4
gpt4 key购买 nike

我正在使用 mathdox,在我的网页中插入方程。我已经实现了所需的所有符号和数学表达式,将它们作为 openmath 插入并将它们转换为 MathML(下标除外)。我知道它应该像这样工作:

<OMOBJ xmlns='http://www.openmath.org/OpenMath' version='2.0' cdbase='http://www.openmath.org/cd'>
<OMA style='sub'>
<OMV name='x'/>
<OMI>2</OMI>
</OMA>
</OMOBJ>

应该转换为

<math xmlns="http://www.w3.org/1998/Math/MathML">
<msub>
<mi>X</mi>
<mn>2</mn>
</msub>
</math>

但我找不到在 javascript 中实现它的方法,也找不到它在 mathdox 中的现有实现。

最佳答案

对我来说,这只适用于 Firefox。这项工作的主要工具是 createElementNS getElementsByTagNameNS 。另外,我不确定你从哪里得到你的 openmath文档,但我将通过 AJAX 检索它.

因此,假设您的文件结构是:

/root
+-/js
| +-convert.js
|
+-/xml
| +-openmath.xml
|
+-index.html

您的文件如下:

index.html

唯一需要注意的是index.html就是我们设置一个id关于<math>我们想要将转换后的标签放在下面的元素。我们还包括convert.js JavaScript 文件。

<html>
<head>
<title>Convert</title>
<script src="js/convert.js"></script>
</head>
<body>
<main>
<math xmlns="http://www.w3.org/1998/Math/MathML" id="target"></math>
</main>
</body>
</html>

openmath.xml

此文件只是您在问题中发布的 XML,我们将转换为数学命名空间。

<OMOBJ xmlns='http://www.openmath.org/OpenMath' version='2.0' cdbase='http://www.openmath.org/cd'>
<OMA style='sub'>
<OMV name='x' />
<OMI>2</OMI>
</OMA>
</OMOBJ>

convert.js

这样convert.js工作原理是它通过 xhr 加载 openmath 文档,然后使用 DOMParser() 创建一个包含文档文本的新 XML 文档。和parseFromString() 。然后我们将该文档提供给 mathSubscriptConverter()它拉动所有 OMA标签,从中获取相关数据,然后将其转换为 msub标签。一旦我们有了msub标签,我们将它们添加为 <math> 下的子级存在于我们的 index.html 中的标签.

(function () {

"use strict";

var mathNS = "http://www.w3.org/1998/Math/MathML",
openMathNS = "http://www.openmath.org/OpenMath",
xhr = new XMLHttpRequest();

function mathSubscriptConverter(openmathDoc) {
var target = document.getElementById("target"),
omas = openmathDoc.getElementsByTagNameNS(openMathNS, "OMA");

// Make sure we have a math element to put this under
if (target) {
// Iterate each OMA tag
Array.prototype.forEach.call(omas, function (oma) {
var omv, omi, msub, mi, mn;

// Get the first OMV
omv = oma.getElementsByTagNameNS(openMathNS, "OMV")[0];
// Get the first OMV
omi = oma.getElementsByTagNameNS(openMathNS, "OMI")[0];

// Create a subscript tag in the math namespace
msub = document.createElementNS(mathNS, "msub");
// Create an mi tag in the math namespace
mi = document.createElementNS(mathNS, "mi");
// Create an mn tag in the math namespace
mn = document.createElementNS(mathNS, "mn");

// Set our math attributes
mi.innerHTML = omv.getAttribute("name");
mn.innerHTML = omi.innerHTML;

// Add our new elements to the target
msub.appendChild(mi);
msub.appendChild(mn);
target.appendChild(msub);
});
}
}

// Wait for document load
document.addEventListener("DOMContentLoaded", function () {
// Load our openmath document
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
var parser = new DOMParser(),
mdoc = parser.parseFromString(xhr.responseText, "application/xml");
mathSubscriptConverter(mdoc);
}
};
xhr.open("GET", "xml/openmath.xml", true);
xhr.send();
});

}());

关于javascript - 将下标从 OpenMath 转换为 MathML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32743826/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com