office-viewer 0.1.0 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -2
- package/esm/OpenXML.d.ts +19 -0
- package/esm/OpenXML.js +43 -2
- package/esm/Word.d.ts +132 -15
- package/esm/Word.js +233 -54
- package/esm/openxml/ContentType.js +20 -6
- package/esm/openxml/Settings.d.ts +10 -0
- package/esm/openxml/Settings.js +93 -0
- package/esm/openxml/Style.d.ts +1 -1
- package/esm/openxml/Style.js +12 -12
- package/esm/openxml/Theme.js +30 -6
- package/esm/openxml/Types.d.ts +179 -2472
- package/esm/openxml/drawing/Blip.d.ts +7 -0
- package/esm/openxml/{word/drawing → drawing}/Blip.js +2 -1
- package/{lib/openxml/word → esm/openxml}/drawing/BlipFill.d.ts +1 -1
- package/esm/openxml/{word/drawing → drawing}/BlipFill.js +1 -1
- package/esm/openxml/drawing/CustomGeom.d.ts +9 -0
- package/esm/openxml/drawing/CustomGeom.js +17 -0
- package/esm/openxml/drawing/Drawing.d.ts +35 -0
- package/esm/openxml/drawing/Drawing.js +169 -0
- package/esm/openxml/drawing/Geom.d.ts +11 -0
- package/esm/openxml/drawing/Geom.js +34 -0
- package/esm/openxml/drawing/Path.d.ts +37 -0
- package/esm/openxml/drawing/Pic.d.ts +16 -0
- package/esm/openxml/drawing/Pic.js +26 -0
- package/esm/openxml/drawing/Shape.d.ts +20 -0
- package/esm/openxml/drawing/ShapeProperties.d.ts +22 -0
- package/esm/openxml/drawing/ShapeProperties.js +119 -0
- package/{lib/openxml/word → esm/openxml}/drawing/Transform.d.ts +2 -1
- package/esm/openxml/{word/drawing → drawing}/Transform.js +7 -3
- package/esm/openxml/drawing/diagram/Diagram.d.ts +7 -0
- package/esm/openxml/drawing/diagram/Diagram.js +24 -0
- package/esm/openxml/drawing/diagram/Sp.d.ts +2 -0
- package/esm/openxml/drawing/diagram/SpTree.d.ts +5 -0
- package/esm/openxml/drawing/presetShape.d.ts +3 -0
- package/esm/openxml/drawing/presetShape.js +38785 -0
- package/esm/openxml/drawing/svg/arcToA.d.ts +13 -0
- package/esm/openxml/drawing/svg/arcToA.js +88 -0
- package/esm/openxml/drawing/svg/formulas.d.ts +29 -0
- package/esm/openxml/drawing/svg/formulas.js +103 -0
- package/esm/openxml/drawing/svg/generateDefines.d.ts +12 -0
- package/esm/openxml/drawing/svg/generateDefines.js +144 -0
- package/esm/openxml/drawing/svg/presetVal.d.ts +43 -0
- package/esm/openxml/drawing/svg/presetVal.js +53 -0
- package/esm/openxml/drawing/svg/shapeToSVG.d.ts +9 -0
- package/esm/openxml/drawing/svg/shapeToSVG.js +151 -0
- package/esm/openxml/math/OMath.d.ts +5 -0
- package/esm/openxml/math/OMath.js +12 -0
- package/esm/openxml/math/convertOOML.d.ts +4 -0
- package/esm/openxml/math/convertOOML.js +13 -0
- package/esm/openxml/math/xsl.d.ts +4 -0
- package/esm/openxml/math/xsl.js +8 -0
- package/esm/openxml/word/Body.js +11 -7
- package/esm/openxml/word/Break.js +1 -3
- package/esm/openxml/word/Font.d.ts +16 -0
- package/esm/openxml/word/Font.js +78 -0
- package/esm/openxml/word/FontTable.d.ts +9 -0
- package/esm/openxml/word/FontTable.js +34 -0
- package/esm/openxml/word/Header.d.ts +11 -0
- package/esm/openxml/word/Header.js +54 -0
- package/esm/openxml/word/Hyperlink.d.ts +1 -0
- package/esm/openxml/word/Hyperlink.js +7 -3
- package/esm/openxml/word/InlineText.js +1 -1
- package/esm/openxml/word/NoBreakHyphen.d.ts +2 -0
- package/esm/openxml/word/NoBreakHyphen.js +7 -0
- package/esm/openxml/word/Note.d.ts +12 -0
- package/esm/openxml/word/Note.js +48 -0
- package/esm/openxml/word/Paragraph.d.ts +2 -2
- package/esm/openxml/word/Paragraph.js +10 -9
- package/esm/openxml/word/Pict.d.ts +1 -2
- package/esm/openxml/word/Pict.js +5 -3
- package/esm/openxml/word/Ruby.js +1 -1
- package/esm/openxml/word/Run.d.ts +7 -3
- package/esm/openxml/word/Run.js +28 -4
- package/esm/openxml/word/Section.d.ts +18 -5
- package/esm/openxml/word/Section.js +46 -2
- package/esm/openxml/word/Separator.d.ts +5 -0
- package/esm/openxml/word/Separator.js +10 -0
- package/esm/openxml/word/SoftHyphen.d.ts +5 -0
- package/esm/openxml/word/SoftHyphen.js +10 -0
- package/esm/openxml/word/Table.d.ts +4 -9
- package/esm/openxml/word/Table.js +0 -235
- package/esm/openxml/word/WDocument.d.ts +1 -2
- package/esm/openxml/word/WDocument.js +53 -7
- package/esm/openxml/word/numbering/AbstractNum.js +4 -2
- package/esm/openxml/word/numbering/Lvl.js +10 -4
- package/esm/openxml/word/numbering/Num.js +12 -4
- package/esm/openxml/word/numbering/NumberProperties.js +2 -2
- package/esm/openxml/word/numbering/Numbering.js +1 -1
- package/esm/openxml/word/table/Tc.d.ts +1 -22
- package/esm/openxml/word/table/Tc.js +1 -221
- package/esm/openxml/word/table/Tr.d.ts +0 -5
- package/esm/openxml/word/table/Tr.js +0 -97
- package/esm/openxml/word/wps/WPG.d.ts +5 -0
- package/esm/openxml/word/wps/WPS.d.ts +18 -0
- package/esm/openxml/word/wps/WPS.js +147 -0
- package/esm/openxml/word/wps/WPSStyle.d.ts +10 -0
- package/esm/openxml/word/wps/WPSStyle.js +42 -0
- package/esm/package/PackageParser.d.ts +1 -1
- package/esm/package/XMLPackageParser.d.ts +3 -3
- package/esm/package/ZipPackageParser.d.ts +1 -1
- package/esm/package/ZipPackageParser.js +7 -8
- package/esm/parse/Footnotes.d.ts +3 -0
- package/esm/parse/Footnotes.js +25 -0
- package/esm/parse/colorNameMap.d.ts +6 -0
- package/esm/parse/colorNameMap.js +201 -0
- package/esm/parse/jcToTextAlign.js +1 -0
- package/esm/parse/mergeSdt.d.ts +4 -0
- package/esm/parse/mergeSdt.js +57 -0
- package/esm/parse/modifyColor.d.ts +1 -0
- package/esm/parse/modifyColor.js +106 -0
- package/esm/parse/parseBorder.js +2 -21
- package/esm/parse/parseCellMargin.d.ts +2 -0
- package/esm/parse/parseCellMargin.js +38 -0
- package/esm/parse/parseChildColor.d.ts +5 -0
- package/esm/parse/parseChildColor.js +66 -0
- package/esm/parse/parseColor.d.ts +4 -0
- package/esm/parse/parseColor.js +41 -46
- package/esm/parse/parseEndnotes.d.ts +3 -0
- package/esm/parse/parseEndnotes.js +25 -0
- package/esm/parse/parseFont.js +1 -1
- package/esm/parse/parseInsideBorders.d.ts +9 -0
- package/esm/parse/parseInsideBorders.js +24 -0
- package/esm/parse/parsePr.d.ts +3 -0
- package/esm/parse/parsePr.js +108 -11
- package/esm/parse/parseRelationship.js +1 -1
- package/esm/parse/parseSdt.d.ts +5 -0
- package/esm/parse/parseShape.d.ts +10 -0
- package/esm/parse/parseShape.js +239 -0
- package/esm/parse/parseSize.d.ts +2 -1
- package/esm/parse/parseSize.js +7 -1
- package/esm/parse/parseSpacing.js +1 -1
- package/esm/parse/parseTable.d.ts +3 -0
- package/esm/parse/parseTable.js +62 -0
- package/esm/parse/parseTablePr.d.ts +3 -0
- package/esm/parse/parseTablePr.js +185 -0
- package/esm/parse/parseTblWidth.d.ts +4 -0
- package/esm/parse/parseTblWidth.js +23 -0
- package/esm/parse/parseTc.d.ts +10 -0
- package/esm/parse/parseTc.js +64 -0
- package/esm/parse/parseTcPr.d.ts +5 -0
- package/esm/parse/parseTcPr.js +99 -0
- package/esm/parse/parseTextDirection.js +4 -6
- package/esm/parse/parseTr.d.ts +6 -0
- package/esm/parse/parseTr.js +49 -0
- package/esm/parse/parseTrPr.d.ts +3 -0
- package/esm/parse/parseTrPr.js +59 -0
- package/esm/render/fixAbsolutePosition.d.ts +8 -0
- package/esm/render/renderBody.d.ts +6 -2
- package/esm/render/renderBody.js +184 -30
- package/esm/render/renderBr.d.ts +2 -1
- package/esm/render/renderBr.js +4 -1
- package/esm/render/renderCustGeom.d.ts +4 -0
- package/esm/render/renderCustGeom.js +10 -0
- package/esm/render/renderDocument.d.ts +2 -2
- package/esm/render/renderDocument.js +2 -2
- package/esm/render/renderDrawing.d.ts +3 -2
- package/esm/render/renderDrawing.js +129 -24
- package/esm/render/renderFont.d.ts +5 -0
- package/esm/render/renderFont.js +39 -0
- package/esm/render/renderGeom.d.ts +4 -0
- package/esm/render/renderGeom.js +14 -0
- package/esm/render/renderHeader.d.ts +6 -0
- package/esm/render/renderHeader.js +40 -0
- package/esm/render/renderHyperLink.js +4 -1
- package/esm/render/renderInlineText.js +1 -1
- package/esm/render/renderInstrText.js +1 -1
- package/esm/render/renderMath.d.ts +3 -0
- package/esm/render/renderMath.js +7 -0
- package/esm/render/renderNoBreakHyphen.d.ts +1 -0
- package/esm/render/renderNoBreakHyphen.js +9 -0
- package/esm/render/renderNotes.d.ts +5 -0
- package/esm/render/renderNotes.js +77 -0
- package/esm/render/renderNumbering.js +8 -10
- package/esm/render/renderParagraph.d.ts +1 -1
- package/esm/render/renderParagraph.js +26 -29
- package/esm/render/renderPict.js +5 -10
- package/esm/render/renderRuby.js +1 -1
- package/esm/render/renderRun.d.ts +4 -2
- package/esm/render/renderRun.js +35 -10
- package/esm/render/renderSection.d.ts +3 -2
- package/esm/render/renderSection.js +79 -5
- package/esm/render/renderSeparator.d.ts +1 -0
- package/esm/render/renderSeparator.js +9 -0
- package/esm/render/renderSoftHyphen.d.ts +1 -0
- package/esm/render/renderSoftHyphen.js +9 -0
- package/esm/render/renderStyle.js +36 -35
- package/esm/render/renderTab.d.ts +1 -0
- package/esm/render/renderTab.js +4 -6
- package/esm/render/renderTable.js +23 -20
- package/esm/render/setElementStyle.js +7 -2
- package/esm/render/zindex.d.ts +1 -0
- package/esm/util/blob.js +1 -10
- package/esm/util/color.d.ts +48 -0
- package/esm/util/color.js +211 -0
- package/esm/util/createObject.d.ts +10 -0
- package/esm/util/createObject.js +48 -0
- package/esm/util/dom.d.ts +8 -4
- package/esm/util/dom.js +21 -4
- package/esm/util/mergeRun.js +1 -1
- package/esm/util/parseSides.d.ts +11 -0
- package/esm/util/print.d.ts +5 -0
- package/esm/util/print.js +54 -0
- package/esm/util/replaceVar.d.ts +10 -0
- package/esm/util/replaceVar.js +214 -0
- package/esm/util/xml.js +4 -1
- package/lib/OpenXML.d.ts +19 -0
- package/lib/OpenXML.js +44 -1
- package/lib/Word.d.ts +132 -15
- package/lib/Word.js +238 -59
- package/lib/openxml/ContentType.js +20 -6
- package/lib/openxml/Settings.d.ts +10 -0
- package/lib/openxml/Settings.js +97 -0
- package/lib/openxml/Style.d.ts +1 -1
- package/lib/openxml/Style.js +15 -15
- package/lib/openxml/Theme.js +31 -7
- package/lib/openxml/Types.d.ts +179 -2472
- package/lib/openxml/drawing/Blip.d.ts +7 -0
- package/lib/openxml/{word/drawing → drawing}/Blip.js +2 -1
- package/{esm/openxml/word → lib/openxml}/drawing/BlipFill.d.ts +1 -1
- package/lib/openxml/{word/drawing → drawing}/BlipFill.js +1 -1
- package/lib/openxml/drawing/CustomGeom.d.ts +9 -0
- package/lib/openxml/drawing/CustomGeom.js +21 -0
- package/lib/openxml/drawing/Drawing.d.ts +35 -0
- package/lib/openxml/drawing/Drawing.js +173 -0
- package/lib/openxml/drawing/Geom.d.ts +11 -0
- package/lib/openxml/drawing/Geom.js +38 -0
- package/lib/openxml/drawing/Path.d.ts +37 -0
- package/lib/openxml/drawing/Pic.d.ts +16 -0
- package/lib/openxml/drawing/Pic.js +30 -0
- package/lib/openxml/drawing/Shape.d.ts +20 -0
- package/lib/openxml/drawing/ShapeProperties.d.ts +22 -0
- package/lib/openxml/drawing/ShapeProperties.js +123 -0
- package/{esm/openxml/word → lib/openxml}/drawing/Transform.d.ts +2 -1
- package/lib/openxml/{word/drawing → drawing}/Transform.js +7 -3
- package/lib/openxml/drawing/diagram/Diagram.d.ts +7 -0
- package/lib/openxml/drawing/diagram/Diagram.js +28 -0
- package/lib/openxml/drawing/diagram/Sp.d.ts +2 -0
- package/lib/openxml/drawing/diagram/SpTree.d.ts +5 -0
- package/lib/openxml/drawing/presetShape.d.ts +3 -0
- package/lib/openxml/drawing/presetShape.js +38789 -0
- package/lib/openxml/drawing/svg/arcToA.d.ts +13 -0
- package/lib/openxml/drawing/svg/arcToA.js +92 -0
- package/lib/openxml/drawing/svg/formulas.d.ts +29 -0
- package/lib/openxml/drawing/svg/formulas.js +108 -0
- package/lib/openxml/drawing/svg/generateDefines.d.ts +12 -0
- package/lib/openxml/drawing/svg/generateDefines.js +148 -0
- package/lib/openxml/drawing/svg/presetVal.d.ts +43 -0
- package/lib/openxml/drawing/svg/presetVal.js +57 -0
- package/lib/openxml/drawing/svg/shapeToSVG.d.ts +9 -0
- package/lib/openxml/drawing/svg/shapeToSVG.js +155 -0
- package/lib/openxml/math/OMath.d.ts +5 -0
- package/lib/openxml/math/OMath.js +16 -0
- package/lib/openxml/math/convertOOML.d.ts +4 -0
- package/lib/openxml/math/convertOOML.js +17 -0
- package/lib/openxml/math/xsl.d.ts +4 -0
- package/lib/openxml/math/xsl.js +12 -0
- package/lib/openxml/word/Body.js +11 -7
- package/lib/openxml/word/Break.js +1 -3
- package/lib/openxml/word/Font.d.ts +16 -0
- package/lib/openxml/word/Font.js +83 -0
- package/lib/openxml/word/FontTable.d.ts +9 -0
- package/lib/openxml/word/FontTable.js +38 -0
- package/lib/openxml/word/Header.d.ts +11 -0
- package/lib/openxml/word/Header.js +58 -0
- package/lib/openxml/word/Hyperlink.d.ts +1 -0
- package/lib/openxml/word/Hyperlink.js +8 -4
- package/lib/openxml/word/InlineText.js +2 -2
- package/lib/openxml/word/NoBreakHyphen.d.ts +2 -0
- package/lib/openxml/word/NoBreakHyphen.js +11 -0
- package/lib/openxml/word/Note.d.ts +12 -0
- package/lib/openxml/word/Note.js +52 -0
- package/lib/openxml/word/Paragraph.d.ts +2 -2
- package/lib/openxml/word/Paragraph.js +11 -10
- package/lib/openxml/word/Pict.d.ts +1 -2
- package/lib/openxml/word/Pict.js +5 -3
- package/lib/openxml/word/Ruby.js +4 -4
- package/lib/openxml/word/Run.d.ts +7 -3
- package/lib/openxml/word/Run.js +29 -5
- package/lib/openxml/word/Section.d.ts +18 -5
- package/lib/openxml/word/Section.js +47 -3
- package/lib/openxml/word/Separator.d.ts +5 -0
- package/lib/openxml/word/Separator.js +14 -0
- package/lib/openxml/word/SoftHyphen.d.ts +5 -0
- package/lib/openxml/word/SoftHyphen.js +14 -0
- package/lib/openxml/word/Table.d.ts +4 -9
- package/lib/openxml/word/Table.js +0 -235
- package/lib/openxml/word/WDocument.d.ts +1 -2
- package/lib/openxml/word/WDocument.js +53 -7
- package/lib/openxml/word/numbering/AbstractNum.js +5 -3
- package/lib/openxml/word/numbering/Lvl.js +11 -5
- package/lib/openxml/word/numbering/Num.js +12 -4
- package/lib/openxml/word/numbering/NumberProperties.js +2 -2
- package/lib/openxml/word/numbering/Numbering.js +3 -3
- package/lib/openxml/word/table/Tc.d.ts +1 -22
- package/lib/openxml/word/table/Tc.js +0 -224
- package/lib/openxml/word/table/Tr.d.ts +0 -5
- package/lib/openxml/word/table/Tr.js +0 -97
- package/lib/openxml/word/wps/WPG.d.ts +5 -0
- package/lib/openxml/word/wps/WPS.d.ts +18 -0
- package/lib/openxml/word/wps/WPS.js +151 -0
- package/lib/openxml/word/wps/WPSStyle.d.ts +10 -0
- package/lib/openxml/word/wps/WPSStyle.js +46 -0
- package/lib/package/PackageParser.d.ts +1 -1
- package/lib/package/XMLPackageParser.d.ts +3 -3
- package/lib/package/ZipPackageParser.d.ts +1 -1
- package/lib/package/ZipPackageParser.js +7 -8
- package/lib/parse/Footnotes.d.ts +3 -0
- package/lib/parse/Footnotes.js +29 -0
- package/lib/parse/colorNameMap.d.ts +6 -0
- package/lib/parse/colorNameMap.js +205 -0
- package/lib/parse/jcToTextAlign.js +1 -0
- package/lib/parse/mergeSdt.d.ts +4 -0
- package/lib/parse/mergeSdt.js +61 -0
- package/lib/parse/modifyColor.d.ts +1 -0
- package/lib/parse/modifyColor.js +110 -0
- package/lib/parse/parseBorder.js +3 -22
- package/lib/parse/parseCellMargin.d.ts +2 -0
- package/lib/parse/parseCellMargin.js +42 -0
- package/lib/parse/parseChildColor.d.ts +5 -0
- package/lib/parse/parseChildColor.js +70 -0
- package/lib/parse/parseColor.d.ts +4 -0
- package/lib/parse/parseColor.js +41 -45
- package/lib/parse/parseEndnotes.d.ts +3 -0
- package/lib/parse/parseEndnotes.js +29 -0
- package/lib/parse/parseFont.js +2 -2
- package/lib/parse/parseInsideBorders.d.ts +9 -0
- package/lib/parse/parseInsideBorders.js +28 -0
- package/lib/parse/parsePr.d.ts +3 -0
- package/lib/parse/parsePr.js +109 -12
- package/lib/parse/parseRelationship.js +2 -2
- package/lib/parse/parseSdt.d.ts +5 -0
- package/lib/parse/parseShape.d.ts +10 -0
- package/lib/parse/parseShape.js +247 -0
- package/lib/parse/parseSize.d.ts +2 -1
- package/lib/parse/parseSize.js +7 -0
- package/lib/parse/parseSpacing.js +1 -1
- package/lib/parse/parseTable.d.ts +3 -0
- package/lib/parse/parseTable.js +66 -0
- package/lib/parse/parseTablePr.d.ts +3 -0
- package/lib/parse/parseTablePr.js +189 -0
- package/lib/parse/parseTblWidth.d.ts +4 -0
- package/lib/parse/parseTblWidth.js +27 -0
- package/lib/parse/parseTc.d.ts +10 -0
- package/lib/parse/parseTc.js +68 -0
- package/lib/parse/parseTcPr.d.ts +5 -0
- package/lib/parse/parseTcPr.js +104 -0
- package/lib/parse/parseTextDirection.js +4 -6
- package/lib/parse/parseTr.d.ts +6 -0
- package/lib/parse/parseTr.js +53 -0
- package/lib/parse/parseTrPr.d.ts +3 -0
- package/lib/parse/parseTrPr.js +63 -0
- package/lib/render/fixAbsolutePosition.d.ts +8 -0
- package/lib/render/renderBody.d.ts +6 -2
- package/lib/render/renderBody.js +183 -29
- package/lib/render/renderBr.d.ts +2 -1
- package/lib/render/renderBr.js +4 -1
- package/lib/render/renderCustGeom.d.ts +4 -0
- package/lib/render/renderCustGeom.js +14 -0
- package/lib/render/renderDocument.d.ts +2 -2
- package/lib/render/renderDocument.js +2 -2
- package/lib/render/renderDrawing.d.ts +3 -2
- package/lib/render/renderDrawing.js +129 -24
- package/lib/render/renderFont.d.ts +5 -0
- package/lib/render/renderFont.js +43 -0
- package/lib/render/renderGeom.d.ts +4 -0
- package/lib/render/renderGeom.js +18 -0
- package/lib/render/renderHeader.d.ts +6 -0
- package/lib/render/renderHeader.js +44 -0
- package/lib/render/renderHyperLink.js +5 -2
- package/lib/render/renderInlineText.js +2 -2
- package/lib/render/renderInstrText.js +2 -2
- package/lib/render/renderMath.d.ts +3 -0
- package/lib/render/renderMath.js +11 -0
- package/lib/render/renderNoBreakHyphen.d.ts +1 -0
- package/lib/render/renderNoBreakHyphen.js +13 -0
- package/lib/render/renderNotes.d.ts +5 -0
- package/lib/render/renderNotes.js +81 -0
- package/lib/render/renderNumbering.js +9 -11
- package/lib/render/renderParagraph.d.ts +1 -1
- package/lib/render/renderParagraph.js +26 -29
- package/lib/render/renderPict.js +5 -10
- package/lib/render/renderRuby.js +3 -3
- package/lib/render/renderRun.d.ts +4 -2
- package/lib/render/renderRun.js +34 -9
- package/lib/render/renderSection.d.ts +3 -2
- package/lib/render/renderSection.js +79 -5
- package/lib/render/renderSeparator.d.ts +1 -0
- package/lib/render/renderSeparator.js +13 -0
- package/lib/render/renderSoftHyphen.d.ts +1 -0
- package/lib/render/renderSoftHyphen.js +13 -0
- package/lib/render/renderStyle.js +37 -36
- package/lib/render/renderTab.d.ts +1 -0
- package/lib/render/renderTab.js +4 -6
- package/lib/render/renderTable.js +25 -22
- package/lib/render/setElementStyle.js +6 -1
- package/lib/render/zindex.d.ts +1 -0
- package/lib/util/blob.js +0 -10
- package/lib/util/color.d.ts +48 -0
- package/lib/util/color.js +215 -0
- package/lib/util/createObject.d.ts +10 -0
- package/lib/util/createObject.js +54 -0
- package/lib/util/dom.d.ts +8 -4
- package/lib/util/dom.js +24 -5
- package/lib/util/mergeRun.js +5 -5
- package/lib/util/parseSides.d.ts +11 -0
- package/lib/util/print.d.ts +5 -0
- package/lib/util/print.js +58 -0
- package/lib/util/replaceVar.d.ts +10 -0
- package/lib/util/replaceVar.js +219 -0
- package/lib/util/xml.js +4 -0
- package/package.json +17 -6
- package/esm/node_modules/tslib/tslib.es6.js +0 -120
- package/esm/openxml/Types.js +0 -1003
- package/esm/openxml/word/CustomXml.d.ts +0 -8
- package/esm/openxml/word/SmartTag.d.ts +0 -8
- package/esm/openxml/word/SmartTag.js +0 -18
- package/esm/openxml/word/drawing/Blip.d.ts +0 -6
- package/esm/openxml/word/drawing/Drawing.d.ts +0 -6
- package/esm/openxml/word/drawing/Drawing.js +0 -15
- package/esm/openxml/word/drawing/Pic.d.ts +0 -8
- package/esm/openxml/word/drawing/Pic.js +0 -16
- package/esm/openxml/word/drawing/ShapeProperties.d.ts +0 -9
- package/esm/openxml/word/drawing/ShapeProperties.js +0 -20
- package/lib/node_modules/tslib/tslib.es6.js +0 -129
- package/lib/openxml/Types.js +0 -1005
- package/lib/openxml/word/CustomXml.d.ts +0 -8
- package/lib/openxml/word/SmartTag.d.ts +0 -8
- package/lib/openxml/word/SmartTag.js +0 -22
- package/lib/openxml/word/drawing/Blip.d.ts +0 -6
- package/lib/openxml/word/drawing/Drawing.d.ts +0 -6
- package/lib/openxml/word/drawing/Drawing.js +0 -19
- package/lib/openxml/word/drawing/Pic.d.ts +0 -8
- package/lib/openxml/word/drawing/Pic.js +0 -20
- package/lib/openxml/word/drawing/ShapeProperties.d.ts +0 -9
- package/lib/openxml/word/drawing/ShapeProperties.js +0 -24
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { parseXML } from '../../util/xml.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 手动从 OMML2MML.XSL 里拷贝过来的,避免打包工具依赖
|
|
5
|
+
*/
|
|
6
|
+
var xsl = parseXML("\n<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" xmlns:mml=\"http://www.w3.org/1998/Math/MathML\"\n\txmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\">\n <xsl:output method=\"xml\" encoding=\"UTF-16\" />\n\n <!-- %% Global Definitions -->\n\n <!-- Every single unicode character that is recognized by OMML as an operator -->\n <xsl:variable name=\"sOperators\"\n\t\tselect=\"concat(\n '¨!"#&()+,-./:',\n ';<=>?@[\]^_`{',\n '|}~¡¦¬¯°±²³´·¹¿',\n '×~÷ˇ˘˙˜˝̀́̂̃̄̅̆̇̈̉',\n '̊̋̌̍̎̏̐̑̒̓̔̕',\n '̡̛̖̗̘̙̜̝̞̟̠̚',\n '̢̧̨̣̤̥̦̩̪̫̬̭',\n '̴̵̶̷̸̮̯̰̱̲̳̿',\n '         ‐‒–',\n '—‖†‡•․‥…′″‴‼',\n '⁀⁄⁎⁏⁐⁗⁡⁢⁣⁰⁴⁵',\n '⁶⁷⁸⁹⁺⁻⁼⁽⁾₀₁₂',\n '₃₄₅₆₇₈₉₊₋₌₍₎',\n '⃒⃓⃘⃙⃚⃐⃑⃔⃕⃖⃗⃛',\n '⃜⃝⃞⃟⃠⃡⃤⃥⃦⃨⃧⃩',\n '⃪⅀ⅆ←↑→↓↔↕↖↗↘↙',\n '↚↛↜↝↞↟↠↡↢↣↤↥',\n '↦↧↨↩↪↫↬↭↮↯↰↱',\n '↲↳↶↷↺↻↼↽↾↿⇀⇁',\n '⇂⇃⇄⇅⇆⇇⇈⇉⇊⇋⇌⇍',\n '⇎⇏⇐⇑⇒⇓⇔⇕⇖⇗⇘⇙',\n '⇚⇛⇜⇝⇞⇟⇠⇡⇢⇣⇤⇥',\n '⇦⇧⇨⇩⇳⇴⇵⇶⇷⇸⇹⇺',\n '⇻⇼⇽⇾⇿∀∁∂∃∄∆∇',\n '∈∉∊∋∌∍∏∐∑−∓∔',\n '∕∖∗∘∙√∛∜∝∣∤∥',\n '∦∧∨∩∪∫∬∭∮∯∰∱',\n '∲∳∴∵∶∷∸∹∺∻∼∽',\n '∾≀≁≂≃≄≅≆≇≈≉≊',\n '≋≌≍≎≏≐≑≒≓≔≕≖',\n '≗≘≙≚≛≜≝≞≟≠≡≢',\n '≣≤≥≦≧≨≩≪≫≬≭≮',\n '≯≰≱≲≳≴≵≶≷≸≹≺',\n '≻≼≽≾≿⊀⊁⊂⊃⊄⊅⊆',\n '⊇⊈⊉⊊⊋⊌⊍⊎⊏⊐⊑⊒',\n '⊓⊔⊕⊖⊗⊘⊙⊚⊛⊜⊝⊞',\n '⊟⊠⊡⊢⊣⊥⊦⊧⊨⊩⊪⊫',\n '⊬⊭⊮⊯⊰⊱⊲⊳⊴⊵⊶⊷',\n '⊸⊹⊺⊻⊼⊽⋀⋁⋂⋃⋄⋅',\n '⋆⋇⋈⋉⋊⋋⋌⋍⋎⋏⋐⋑',\n '⋒⋓⋔⋕⋖⋗⋘⋙⋚⋛⋜⋝',\n '⋞⋟⋠⋡⋢⋣⋤⋥⋦⋧⋨⋩',\n '⋪⋫⋬⋭⋮⋯⋰⋱⋲⋳⋴⋵',\n '⋶⋷⋸⋹⋺⋻⋼⋽⋾⋿⌅⌆',\n '⌈⌉⌊⌋⌜⌝⌞⌟⌢⌣〈〉',\n '⌽⌿⎰⎱⏜⏝⏞⏟⏠│├┤',\n '┬┴▁█▒■□▭▲△▴▵',\n '▶▷▸▹▼▽▾▿◀◁◂◃',\n '◄◅◊○◦◫◬◸◹◺◻◼',\n '◽◾◿★☆❲❳⟑⟒⟓⟔⟕',\n '⟖⟗⟘⟙⟚⟛⟜⟝⟞⟟⟠⟡',\n '⟢⟣⟤⟥⟦⟧⟨⟩⟪⟫⟰⟱',\n '⟲⟳⟴⟵⟶⟷⟸⟹⟺⟻⟼⟽',\n '⟾⟿⤀⤁⤂⤃⤄⤅⤆⤇⤈⤉',\n '⤊⤋⤌⤍⤎⤏⤐⤑⤒⤓⤔⤕',\n '⤖⤗⤘⤙⤚⤛⤜⤝⤞⤟⤠⤡',\n '⤢⤣⤤⤥⤦⤧⤨⤩⤪⤫⤬⤭',\n '⤮⤯⤰⤱⤲⤳⤴⤵⤶⤷⤸⤹',\n '⤺⤻⤼⤽⤾⤿⥀⥁⥂⥃⥄⥅',\n '⥆⥇⥈⥉⥊⥋⥌⥍⥎⥏⥐⥑',\n '⥒⥓⥔⥕⥖⥗⥘⥙⥚⥛⥜⥝',\n '⥞⥟⥠⥡⥢⥣⥤⥥⥦⥧⥨⥩',\n '⥪⥫⥬⥭⥮⥯⥰⥱⥲⥳⥴⥵',\n '⥶⥷⥸⥹⥺⥻⥼⥽⥾⥿⦀⦂',\n '⦃⦄⦅⦆⦇⦈⦉⦊⦋⦌⦍⦎',\n '⦏⦐⦑⦒⦓⦔⦕⦖⦗⦘⦙⦚',\n '⦶⦷⦸⦹⧀⧁⧄⧅⧆⧇⧈⧎',\n '⧏⧐⧑⧒⧓⧔⧕⧖⧗⧘⧙⧚',\n '⧛⧟⧡⧢⧣⧤⧥⧦⧫⧴⧵⧶',\n '⧷⧸⧹⧺⧻⧼⧽⧾⧿⨀⨁⨂',\n '⨃⨄⨅⨆⨇⨈⨉⨊⨋⨌⨍⨎',\n '⨏⨐⨑⨒⨓⨔⨕⨖⨗⨘⨙⨚',\n '⨛⨜⨝⨞⨟⨠⨡⨢⨣⨤⨥⨦',\n '⨧⨨⨩⨪⨫⨬⨭⨮⨯⨰⨱⨲',\n '⨳⨴⨵⨶⨷⨸⨹⨺⨻⨼⨽⨾',\n '⨿⩀⩁⩂⩃⩄⩅⩆⩇⩈⩉⩊',\n '⩋⩌⩍⩎⩏⩐⩑⩒⩓⩔⩕⩖',\n '⩗⩘⩙⩚⩛⩜⩝⩞⩟⩠⩡⩢',\n '⩣⩤⩥⩦⩧⩨⩩⩪⩫⩬⩭⩮',\n '⩯⩰⩱⩲⩳⩴⩵⩶⩷⩸⩹⩺',\n '⩻⩼⩽⩾⩿⪀⪁⪂⪃⪄⪅⪆',\n '⪇⪈⪉⪊⪋⪌⪍⪎⪏⪐⪑⪒',\n '⪓⪔⪕⪖⪗⪘⪙⪚⪛⪜⪝⪞',\n '⪟⪠⪡⪢⪣⪤⪥⪦⪧⪨⪩⪪',\n '⪫⪬⪭⪮⪯⪰⪱⪲⪳⪴⪵⪶',\n '⪷⪸⪹⪺⪻⪼⪽⪾⪿⫀⫁⫂',\n '⫃⫄⫅⫆⫇⫈⫉⫊⫋⫌⫍⫎',\n '⫏⫐⫑⫒⫓⫔⫕⫖⫗⫘⫙⫚',\n '⫛⫝̸⫝⫞⫟⫠⫢⫣⫤⫥⫦⫧',\n '⫨⫩⫪⫫⫬⫭⫮⫯⫰⫲⫳⫴',\n '⫵⫶⫷⫸⫹⫺⫻⫼⫽⫾⫿⬄',\n '⬆⬇⬌⬍〔〕〖〗〘〙!&',\n '()+,-./:;<=>',\n '?@[\]^_{|}')\" />\n\n <!-- A string of '-'s repeated exactly as many times as the operators above -->\n <xsl:variable name=\"sMinuses\">\n <xsl:call-template name=\"SRepeatChar\">\n <xsl:with-param name=\"cchRequired\" select=\"string-length($sOperators)\" />\n <xsl:with-param name=\"ch\" select=\"'-'\" />\n </xsl:call-template>\n </xsl:variable>\n\n <!-- Every single unicode character that is recognized by OMML as a number -->\n <xsl:variable name=\"sNumbers\" select=\"'0123456789'\" />\n\n <!-- A string of '0's repeated exactly as many times as the list of numbers above -->\n <xsl:variable name=\"sZeros\">\n <xsl:call-template name=\"SRepeatChar\">\n <xsl:with-param name=\"cchRequired\" select=\"string-length($sNumbers)\" />\n <xsl:with-param name=\"ch\" select=\"'0'\" />\n </xsl:call-template>\n </xsl:variable>\n\n <!-- %%Template: SReplace\n\n\t\tReplace all occurences of sOrig in sInput with sReplacement\n\t\tand return the resulting string. -->\n <xsl:template name=\"SReplace\">\n <xsl:param name=\"sInput\" />\n <xsl:param name=\"sOrig\" />\n <xsl:param name=\"sReplacement\" />\n\n <xsl:choose>\n <xsl:when test=\"not(contains($sInput, $sOrig))\">\n <xsl:value-of select=\"$sInput\" />\n </xsl:when>\n <xsl:otherwise>\n <xsl:variable name=\"sBefore\" select=\"substring-before($sInput, $sOrig)\" />\n <xsl:variable name=\"sAfter\" select=\"substring-after($sInput, $sOrig)\" />\n <xsl:variable name=\"sAfterProcessed\">\n <xsl:call-template name=\"SReplace\">\n <xsl:with-param name=\"sInput\" select=\"$sAfter\" />\n <xsl:with-param name=\"sOrig\" select=\"$sOrig\" />\n <xsl:with-param name=\"sReplacement\" select=\"$sReplacement\" />\n </xsl:call-template>\n </xsl:variable>\n\n <xsl:value-of select=\"concat($sBefore, concat($sReplacement, $sAfterProcessed))\" />\n </xsl:otherwise>\n </xsl:choose>\n </xsl:template>\n\n <!-- Templates -->\n <xsl:template match=\"/\">\n <mml:math>\n <xsl:apply-templates select=\"*\" />\n </mml:math>\n </xsl:template>\n\n <xsl:template match=\"m:borderBox\">\n\n <!-- Get Lowercase versions of properties -->\n <xsl:variable name=\"sLowerCaseHideTop\" select=\"translate(m:borderBoxPr[last()]/m:hideTop[last()]/@m:val, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',\n\t\t 'abcdefghijklmnopqrstuvwxyz')\" />\n <xsl:variable name=\"sLowerCaseHideBot\" select=\"translate(m:borderBoxPr[last()]/m:hideBot[last()]/@m:val, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',\n\t\t 'abcdefghijklmnopqrstuvwxyz')\" />\n <xsl:variable name=\"sLowerCaseHideLeft\" select=\"translate(m:borderBoxPr[last()]/m:hideLeft[last()]/@m:val, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',\n\t\t 'abcdefghijklmnopqrstuvwxyz')\" />\n <xsl:variable name=\"sLowerCaseHideRight\" select=\"translate(m:borderBoxPr[last()]/m:hideRight[last()]/@m:val, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',\n\t\t 'abcdefghijklmnopqrstuvwxyz')\" />\n <xsl:variable name=\"sLowerCaseStrikeH\" select=\"translate(m:borderBoxPr[last()]/m:strikeH[last()]/@m:val, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',\n\t\t 'abcdefghijklmnopqrstuvwxyz')\" />\n <xsl:variable name=\"sLowerCaseStrikeV\" select=\"translate(m:borderBoxPr[last()]/m:strikeV[last()]/@m:val, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',\n\t\t 'abcdefghijklmnopqrstuvwxyz')\" />\n <xsl:variable name=\"sLowerCaseStrikeBLTR\" select=\"translate(m:borderBoxPr[last()]/m:strikeBLTR[last()]/@m:val, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',\n\t\t 'abcdefghijklmnopqrstuvwxyz')\" />\n <xsl:variable name=\"sLowerCaseStrikeTLBR\" select=\"translate(m:borderBoxPr[last()]/m:strikeTLBR[last()]/@m:val, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',\n\t\t 'abcdefghijklmnopqrstuvwxyz')\" />\n <xsl:variable name=\"fHideTop\">\n <xsl:call-template name=\"ForceTrueStrVal\">\n <xsl:with-param name=\"str\" select=\"$sLowerCaseHideTop\" />\n </xsl:call-template>\n </xsl:variable>\n <xsl:variable name=\"fHideBot\">\n <xsl:call-template name=\"ForceTrueStrVal\">\n <xsl:with-param name=\"str\" select=\"$sLowerCaseHideBot\" />\n </xsl:call-template>\n </xsl:variable>\n <xsl:variable name=\"fHideLeft\">\n <xsl:call-template name=\"ForceTrueStrVal\">\n <xsl:with-param name=\"str\" select=\"$sLowerCaseHideLeft\" />\n </xsl:call-template>\n </xsl:variable>\n <xsl:variable name=\"fHideRight\">\n <xsl:call-template name=\"ForceTrueStrVal\">\n <xsl:with-param name=\"str\" select=\"$sLowerCaseHideRight\" />\n </xsl:call-template>\n </xsl:variable>\n <xsl:variable name=\"fStrikeH\">\n <xsl:call-template name=\"ForceTrueStrVal\">\n <xsl:with-param name=\"str\" select=\"$sLowerCaseStrikeH\" />\n </xsl:call-template>\n </xsl:variable>\n <xsl:variable name=\"fStrikeV\">\n <xsl:call-template name=\"ForceTrueStrVal\">\n <xsl:with-param name=\"str\" select=\"$sLowerCaseStrikeV\" />\n </xsl:call-template>\n </xsl:variable>\n <xsl:variable name=\"fStrikeBLTR\">\n <xsl:call-template name=\"ForceTrueStrVal\">\n <xsl:with-param name=\"str\" select=\"$sLowerCaseStrikeBLTR\" />\n </xsl:call-template>\n </xsl:variable>\n <xsl:variable name=\"fStrikeTLBR\">\n <xsl:call-template name=\"ForceTrueStrVal\">\n <xsl:with-param name=\"str\" select=\"$sLowerCaseStrikeTLBR\" />\n </xsl:call-template>\n </xsl:variable>\n\n <xsl:choose>\n <xsl:when test=\"$fHideTop=1\n and $fHideBot=1\n and $fHideLeft=1\n and $fHideRight=1\n and $fStrikeH=0\n and $fStrikeV=0\n and $fStrikeBLTR=0\n and $fStrikeTLBR=0\">\n <mml:mrow>\n <xsl:apply-templates select=\"m:e[1]\" />\n </mml:mrow>\n </xsl:when>\n <xsl:otherwise>\n <mml:menclose>\n <xsl:call-template name=\"CreateMencloseNotationAttrFromBorderBoxAttr\">\n <xsl:with-param name=\"fHideTop\" select=\"$fHideTop\" />\n <xsl:with-param name=\"fHideBot\" select=\"$fHideBot\" />\n <xsl:with-param name=\"fHideLeft\" select=\"$fHideLeft\" />\n <xsl:with-param name=\"fHideRight\" select=\"$fHideRight\" />\n <xsl:with-param name=\"fStrikeH\" select=\"$fStrikeH\" />\n <xsl:with-param name=\"fStrikeV\" select=\"$fStrikeV\" />\n <xsl:with-param name=\"fStrikeBLTR\" select=\"$fStrikeBLTR\" />\n <xsl:with-param name=\"fStrikeTLBR\" select=\"$fStrikeTLBR\" />\n </xsl:call-template>\n <xsl:apply-templates select=\"m:e[1]\" />\n </mml:menclose>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:template>\n\n <xsl:template match=\"*\">\n <xsl:apply-templates select=\"*\" />\n </xsl:template>\n\n <!--\n { Non-combining, Upper-combining, Lower-combining }\n {U+02D8, U+0306, U+032E}, // BREVE\n {U+00B8, U+0312, U+0327}, // CEDILLA\n {U+0060, U+0300, U+0316}, // GRAVE ACCENT\n {U+002D, U+0305, U+0332}, // HYPHEN-MINUS/OVERLINE\n {U+2212, U+0305, U+0332}, // MINUS SIGN/OVERLINE\n {U+002E, U+0305, U+0323}, // FULL STOP/DOT ABOVE\n {U+02D9, U+0307, U+0323}, // DOT ABOVE\n {U+02DD, U+030B, U+02DD}, // DOUBLE ACUTE ACCENT\n {U+00B4, U+0301, U+0317}, // ACUTE ACCENT\n {U+007E, U+0303, U+0330}, // TILDE\n {U+02DC, U+0303, U+0330}, // SMALL TILDE\n {U+00A8, U+0308, U+0324}, // DIAERESIS\n {U+02C7, U+030C, U+032C}, // CARON\n {U+005E, U+0302, U+032D}, // CIRCUMFLEX ACCENT\n {U+00AF, U+0305, ::::::}, // MACRON\n {U+005F, ::::::, U+0332}, // LOW LINE\n {U+2192, U+20D7, U+20EF}, // RIGHTWARDS ARROW\n {U+27F6, U+20D7, U+20EF}, // LONG RIGHTWARDS ARROW\n {U+2190, U+20D6, U+20EE}, // LEFT ARROW\n -->\n <xsl:template name=\"ToNonCombining\">\n <xsl:param name=\"ch\" />\n <xsl:choose>\n <!-- BREVE -->\n <xsl:when test=\"$ch='̆' or $ch='̮'\">˘</xsl:when>\n <!-- CEDILLA -->\n <xsl:when test=\"$ch='̒' or $ch='̧'\">¸</xsl:when>\n <!-- GRAVE ACCENT -->\n <xsl:when test=\"$ch='̀' or $ch='̖'\">`</xsl:when>\n <!-- HYPHEN-MINUS/OVERLINE -->\n <xsl:when test=\"$ch='̅' or $ch='̲'\">-</xsl:when>\n <!-- MINUS SIGN/OVERLINE -->\n <xsl:when test=\"$ch='̅' or $ch='̲'\">−</xsl:when>\n <!-- FULL STOP/DOT ABOVE -->\n <xsl:when test=\"$ch='̅' or $ch='̣'\">.</xsl:when>\n <!-- DOT ABOVE -->\n <xsl:when test=\"$ch='̇' or $ch='̣'\">˙</xsl:when>\n <!-- DOUBLE ACUTE ACCENT -->\n <xsl:when test=\"$ch='̋' or $ch='˝'\">˝</xsl:when>\n <!-- ACUTE ACCENT -->\n <xsl:when test=\"$ch='́' or $ch='̗'\">´</xsl:when>\n <!-- TILDE -->\n <xsl:when test=\"$ch='̃' or $ch='̰'\">~</xsl:when>\n <!-- SMALL TILDE -->\n <xsl:when test=\"$ch='̃' or $ch='̰'\">˜</xsl:when>\n <!-- DIAERESIS -->\n <xsl:when test=\"$ch='̈' or $ch='̤'\">¨</xsl:when>\n <!-- CARON -->\n <xsl:when test=\"$ch='̌' or $ch='̬'\">ˇ</xsl:when>\n <!-- CIRCUMFLEX ACCENT -->\n <xsl:when test=\"$ch='̂' or $ch='̭'\">^</xsl:when>\n <!-- MACRON -->\n <xsl:when test=\"$ch='̅' \">¯</xsl:when>\n <!-- LOW LINE -->\n <xsl:when test=\" $ch='̲'\">_</xsl:when>\n <!-- RIGHTWARDS ARROW -->\n <xsl:when test=\"$ch='⃗' or $ch='⃯'\">→</xsl:when>\n <!-- LONG RIGHTWARDS ARROW -->\n <xsl:when test=\"$ch='⃗' or $ch='⃯'\">⟶</xsl:when>\n <!-- LEFT ARROW -->\n <xsl:when test=\"$ch='⃖' or $ch='⃮'\">←</xsl:when>\n <xsl:otherwise>\n <xsl:value-of select=\"$ch\"/>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:template>\n\n <xsl:template match=\"m:acc\">\n <mml:mover>\n <xsl:attribute name=\"accent\">true</xsl:attribute>\n <mml:mrow>\n <xsl:apply-templates select=\"m:e[1]\" />\n </mml:mrow>\n <xsl:variable name=\"chAcc\">\n <xsl:choose>\n <xsl:when test=\"not(m:accPr[last()]/m:chr)\">\n <xsl:value-of select=\"'̂'\" />\n </xsl:when>\n <xsl:otherwise>\n <xsl:value-of select=\"substring(m:accPr/m:chr/@m:val,1,1)\" />\n </xsl:otherwise>\n </xsl:choose>\n </xsl:variable>\n <xsl:variable name=\"chNonComb\">\n <xsl:call-template name=\"ToNonCombining\">\n <xsl:with-param name=\"ch\" select=\"$chAcc\" />\n </xsl:call-template>\n </xsl:variable>\n <xsl:choose>\n <xsl:when test=\"string-length($chAcc)=0\">\n <mml:mo/>\n </xsl:when>\n <xsl:otherwise>\n <xsl:call-template name=\"ParseMt\">\n <xsl:with-param name=\"sToParse\" select=\"$chNonComb\" />\n <xsl:with-param name=\"scr\" select=\"m:e[1]/*/m:rPr[last()]/m:scr/@m:val\" />\n <xsl:with-param name=\"sty\" select=\"m:e[1]/*/m:rPr[last()]/m:sty/@m:val\" />\n <xsl:with-param name=\"nor\">\n <xsl:choose>\n <xsl:when test=\"count(m:e[1]/*/m:rPr[last()]/m:nor) = 0\">0</xsl:when>\n <xsl:otherwise>\n <xsl:call-template name=\"ForceFalseStrVal\">\n <xsl:with-param name=\"str\" select=\"translate(m:e[1]/*/m:rPr[last()]/m:nor/@m:val,\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',\n\t\t 'abcdefghijklmnopqrstuvwxyz')\" />\n </xsl:call-template>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:with-param>\n </xsl:call-template>\n </xsl:otherwise>\n </xsl:choose>\n </mml:mover>\n </xsl:template>\n\n <xsl:template name=\"OutputScript\">\n <xsl:param name=\"ndCur\" select=\".\" />\n <xsl:choose>\n <!-- Only output contents of $ndCur if $ndCur exists\n and $ndCur has children -->\n <xsl:when test=\"count($ndCur/*) > 0\">\n <mml:mrow>\n <xsl:apply-templates select=\"$ndCur\" />\n </mml:mrow>\n </xsl:when>\n <xsl:otherwise>\n <mml:none />\n </xsl:otherwise>\n </xsl:choose>\n </xsl:template>\n\n <xsl:template match=\"m:sPre\">\n <mml:mmultiscripts>\n <mml:mrow>\n <xsl:apply-templates select=\"m:e[1]\" />\n </mml:mrow>\n <mml:mprescripts />\n <xsl:call-template name=\"OutputScript\">\n <xsl:with-param name=\"ndCur\" select=\"m:sub[1]\"/>\n </xsl:call-template>\n <xsl:call-template name=\"OutputScript\">\n <xsl:with-param name=\"ndCur\" select=\"m:sup[1]\" />\n </xsl:call-template>\n </mml:mmultiscripts>\n </xsl:template>\n\n <xsl:template match=\"m:m\">\n <mml:mtable>\n <xsl:call-template name=\"CreateMathMLMatrixAttr\">\n <xsl:with-param name=\"mcJc\" select=\"m:mPr[last()]/m:mcs/m:mc/m:mcPr[last()]/m:mcJc/@m:val\" />\n </xsl:call-template>\n <xsl:for-each select=\"m:mr\">\n <mml:mtr>\n <xsl:for-each select=\"m:e\">\n <mml:mtd>\n <xsl:apply-templates select=\".\" />\n </mml:mtd>\n </xsl:for-each>\n </mml:mtr>\n </xsl:for-each>\n </mml:mtable>\n </xsl:template>\n\n <xsl:template name=\"CreateMathMLMatrixAttr\">\n <xsl:param name=\"mcJc\" />\n <xsl:variable name=\"sLowerCaseMcjc\" select=\"translate($mcJc, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',\n\t\t 'abcdefghijklmnopqrstuvwxyz')\" />\n <xsl:choose>\n <xsl:when test=\"$sLowerCaseMcjc='left'\">\n <xsl:attribute name=\"columnalign\">left</xsl:attribute>\n </xsl:when>\n <xsl:when test=\"$sLowerCaseMcjc='right'\">\n <xsl:attribute name=\"columnalign\">right</xsl:attribute>\n </xsl:when>\n </xsl:choose>\n </xsl:template>\n\n <xsl:template match=\"m:phant\">\n <xsl:variable name=\"sLowerCaseZeroWidVal\" select=\"translate(m:phantPr[last()]/m:zeroWid[last()]/@m:val,\n\t\t 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',\n\t\t 'abcdefghijklmnopqrstuvwxyz')\" />\n <xsl:variable name=\"sLowerCaseZeroAscVal\" select=\"translate(m:phantPr[last()]/m:zeroAsc[last()]/@m:val,\n\t\t 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',\n\t\t 'abcdefghijklmnopqrstuvwxyz')\" />\n <xsl:variable name=\"sLowerCaseZeroDescVal\" select=\"translate(m:phantPr[last()]/m:zeroDesc[last()]/@m:val,\n\t\t 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',\n\t\t 'abcdefghijklmnopqrstuvwxyz')\" />\n <xsl:variable name=\"sLowerCaseShowVal\" select=\"translate(m:phantPr[last()]/m:show[last()]/@m:val,\n\t\t 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',\n\t\t 'abcdefghijklmnopqrstuvwxyz')\" />\n\n\n <!-- The following properties default to 'yes' unless the last value equals 'no' or there isn't any node for\n the property -->\n\n <xsl:variable name=\"fZeroWid\">\n <xsl:choose>\n <xsl:when test=\"count(m:phantPr[last()]/m:zeroWid[last()]) = 0\">0</xsl:when>\n <xsl:otherwise>\n <xsl:call-template name=\"ForceFalseStrVal\">\n <xsl:with-param name=\"str\" select=\"$sLowerCaseZeroWidVal\" />\n </xsl:call-template>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:variable>\n <xsl:variable name=\"fZeroAsc\">\n <xsl:choose>\n <xsl:when test=\"count(m:phantPr[last()]/m:zeroAsc[last()]) = 0\">0</xsl:when>\n <xsl:otherwise>\n <xsl:call-template name=\"ForceFalseStrVal\">\n <xsl:with-param name=\"str\" select=\"$sLowerCaseZeroAscVal\" />\n </xsl:call-template>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:variable>\n <xsl:variable name=\"fZeroDesc\">\n <xsl:choose>\n <xsl:when test=\"count(m:phantPr[last()]/m:zeroDesc[last()]) = 0\">0</xsl:when>\n <xsl:otherwise>\n <xsl:call-template name=\"ForceFalseStrVal\">\n <xsl:with-param name=\"str\" select=\"$sLowerCaseZeroDescVal\" />\n </xsl:call-template>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:variable>\n\n <!-- The show property defaults to 'on' unless there exists a show property and its value is 'off' -->\n\n <xsl:variable name=\"fShow\">\n <xsl:call-template name=\"ForceFalseStrVal\">\n <xsl:with-param name=\"str\" select=\"$sLowerCaseShowVal\" />\n </xsl:call-template>\n </xsl:variable>\n\n <xsl:choose>\n <!-- Show the phantom contents, therefore, just use mpadded. -->\n <xsl:when test=\"$fShow = 1\">\n <xsl:element name=\"mml:mpadded\">\n <xsl:call-template name=\"CreateMpaddedAttributes\">\n <xsl:with-param name=\"fZeroWid\" select=\"$fZeroWid\" />\n <xsl:with-param name=\"fZeroAsc\" select=\"$fZeroAsc\" />\n <xsl:with-param name=\"fZeroDesc\" select=\"$fZeroDesc\" />\n </xsl:call-template>\n <mml:mrow>\n <xsl:apply-templates select=\"m:e\" />\n </mml:mrow>\n </xsl:element>\n </xsl:when>\n <!-- Don't show phantom contents, but don't smash anything, therefore, just\n use mphantom -->\n <xsl:when test=\"$fZeroWid=0 and $fZeroAsc=0 and $fZeroDesc=0\">\n <xsl:element name=\"mml:mphantom\">\n <mml:mrow>\n <xsl:apply-templates select=\"m:e\" />\n </mml:mrow>\n </xsl:element>\n </xsl:when>\n <!-- Combination -->\n <xsl:otherwise>\n <xsl:element name=\"mml:mphantom\">\n <xsl:element name=\"mml:mpadded\">\n <xsl:call-template name=\"CreateMpaddedAttributes\">\n <xsl:with-param name=\"fZeroWid\" select=\"$fZeroWid\" />\n <xsl:with-param name=\"fZeroAsc\" select=\"$fZeroAsc\" />\n <xsl:with-param name=\"fZeroDesc\" select=\"$fZeroDesc\" />\n </xsl:call-template>\n <mml:mrow>\n <xsl:apply-templates select=\"m:e\" />\n </mml:mrow>\n </xsl:element>\n </xsl:element>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:template>\n\n <xsl:template name=\"CreateMpaddedAttributes\">\n <xsl:param name=\"fZeroWid\" />\n <xsl:param name=\"fZeroAsc\" />\n <xsl:param name=\"fZeroDesc\" />\n\n <xsl:if test=\"$fZeroWid=1\">\n <xsl:attribute name=\"width\">0in</xsl:attribute>\n </xsl:if>\n <xsl:if test=\"$fZeroAsc=1\">\n <xsl:attribute name=\"height\">0in</xsl:attribute>\n </xsl:if>\n <xsl:if test=\"$fZeroDesc=1\">\n <xsl:attribute name=\"depth\">0in</xsl:attribute>\n </xsl:if>\n </xsl:template>\n\n\n\n <xsl:template match=\"m:rad\">\n <xsl:variable name=\"fDegHide\">\n <xsl:choose>\n <xsl:when test=\"count(m:radPr[last()]/m:degHide)=0\">0</xsl:when>\n <xsl:otherwise>\n <xsl:call-template name=\"ForceFalseStrVal\">\n <xsl:with-param name=\"str\" select=\"translate(m:radPr[last()]/m:degHide/@m:val,\n\t\t 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',\n\t\t 'abcdefghijklmnopqrstuvwxyz')\" />\n </xsl:call-template>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:variable>\n <xsl:choose>\n <xsl:when test=\"$fDegHide=1\">\n <mml:msqrt>\n <xsl:apply-templates select=\"m:e[1]\" />\n </mml:msqrt>\n </xsl:when>\n <xsl:otherwise>\n <mml:mroot>\n <mml:mrow>\n <xsl:apply-templates select=\"m:e[1]\" />\n </mml:mrow>\n <mml:mrow>\n <xsl:apply-templates select=\"m:deg[1]\" />\n </mml:mrow>\n </mml:mroot>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:template>\n\n <xsl:template name=\"OutputNaryMo\">\n <xsl:param name=\"ndCur\" select=\".\" />\n <xsl:param name=\"fGrow\" select=\"0\" />\n <mml:mo>\n <xsl:choose>\n <xsl:when test=\"$fGrow=1\">\n <xsl:attribute name=\"stretchy\">true</xsl:attribute>\n </xsl:when>\n <xsl:otherwise>\n <xsl:attribute name=\"stretchy\">false</xsl:attribute>\n </xsl:otherwise>\n </xsl:choose>\n <xsl:choose>\n <xsl:when test=\"not($ndCur/m:naryPr[last()]/m:chr/@m:val) or\n\t\t\t $ndCur/m:naryPr[last()]/m:chr/@m:val=''\">\n <xsl:text>∫</xsl:text>\n </xsl:when>\n <xsl:otherwise>\n <xsl:value-of select=\"$ndCur/m:naryPr[last()]/m:chr/@m:val\" />\n </xsl:otherwise>\n </xsl:choose>\n </mml:mo>\n </xsl:template>\n\n <!-- %%Template match m:nary\n\t\tProcess an n-ary.\n\n\t\tDecides, based on which arguments are supplied, between\n\t\tusing an mo, msup, msub, or msubsup for the n-ary operator\n\t-->\n <xsl:template match=\"m:nary\">\n <xsl:variable name=\"sLowerCaseSubHide\">\n <xsl:choose>\n <xsl:when test=\"count(m:naryPr[last()]/m:subHide) = 0\">\n <xsl:text>off</xsl:text>\n </xsl:when>\n <xsl:otherwise>\n <xsl:value-of select=\"translate(m:naryPr[last()]/m:subHide/@m:val,\n\t 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',\n\t 'abcdefghijklmnopqrstuvwxyz')\" />\n </xsl:otherwise>\n </xsl:choose>\n </xsl:variable>\n\n <xsl:variable name=\"sLowerCaseSupHide\">\n <xsl:choose>\n <xsl:when test=\"count(m:naryPr[last()]/m:supHide) = 0\">\n <xsl:text>off</xsl:text>\n </xsl:when>\n <xsl:otherwise>\n <xsl:value-of select=\"translate(m:naryPr[last()]/m:supHide/@m:val,\n\t 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',\n\t 'abcdefghijklmnopqrstuvwxyz')\" />\n </xsl:otherwise>\n </xsl:choose>\n </xsl:variable>\n\n <xsl:variable name=\"sLowerCaseLimLoc\">\n <xsl:value-of select=\"translate(m:naryPr[last()]/m:limLoc/@m:val,\n\t 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',\n\t 'abcdefghijklmnopqrstuvwxyz')\" />\n </xsl:variable>\n\n <xsl:variable name=\"sLowerGrow\">\n <xsl:choose>\n <xsl:when test=\"count(m:naryPr[last()]/m:grow)=0\">off</xsl:when>\n <xsl:otherwise>\n <xsl:value-of select=\"translate(m:naryPr[last()]/m:grow/@m:val,\n\t 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',\n\t 'abcdefghijklmnopqrstuvwxyz')\" />\n </xsl:otherwise>\n </xsl:choose>\n </xsl:variable>\n\n <xsl:variable name=\"fLimLocSubSup\">\n <xsl:choose>\n <xsl:when test=\"count(m:naryPr[last()]/m:limLoc)=0 or $sLowerCaseLimLoc='subsup'\">1</xsl:when>\n <xsl:otherwise>0</xsl:otherwise>\n </xsl:choose>\n </xsl:variable>\n\n <xsl:variable name=\"fGrow\">\n <xsl:call-template name=\"ForceFalseStrVal\">\n <xsl:with-param name=\"str\" select=\"$sLowerGrow\" />\n </xsl:call-template>\n </xsl:variable>\n\n <xsl:variable name=\"fSupHide\">\n <xsl:call-template name=\"ForceFalseStrVal\">\n <xsl:with-param name=\"str\" select=\"$sLowerCaseSupHide\" />\n </xsl:call-template>\n </xsl:variable>\n\n <xsl:variable name=\"fSubHide\">\n <xsl:call-template name=\"ForceFalseStrVal\">\n <xsl:with-param name=\"str\" select=\"$sLowerCaseSubHide\" />\n </xsl:call-template>\n </xsl:variable>\n\n <mml:mrow>\n <xsl:choose>\n <xsl:when test=\"$fSupHide=1 and $fSubHide=1\">\n <xsl:call-template name=\"OutputNaryMo\">\n <xsl:with-param name=\"ndCur\" select=\".\" />\n <xsl:with-param name=\"fGrow\" select=\"$fGrow\" />\n </xsl:call-template>\n </xsl:when>\n <xsl:when test=\"$fSubHide=1\">\n <xsl:choose>\n <xsl:when test=\"$fLimLocSubSup=1\">\n <mml:msup>\n <xsl:call-template name=\"OutputNaryMo\">\n <xsl:with-param name=\"ndCur\" select=\".\" />\n <xsl:with-param name=\"fGrow\" select=\"$fGrow\" />\n </xsl:call-template>\n <mml:mrow>\n <xsl:apply-templates select=\"m:sup[1]\" />\n </mml:mrow>\n </mml:msup>\n </xsl:when>\n <xsl:otherwise>\n <mml:mover>\n <xsl:call-template name=\"OutputNaryMo\">\n <xsl:with-param name=\"ndCur\" select=\".\" />\n <xsl:with-param name=\"fGrow\" select=\"$fGrow\" />\n </xsl:call-template>\n <mml:mrow>\n <xsl:apply-templates select=\"m:sup[1]\" />\n </mml:mrow>\n </mml:mover>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:when>\n <xsl:when test=\"$fSupHide=1\">\n <xsl:choose>\n <xsl:when test=\"$fLimLocSubSup=1\">\n <mml:msub>\n <xsl:call-template name=\"OutputNaryMo\">\n <xsl:with-param name=\"ndCur\" select=\".\" />\n <xsl:with-param name=\"fGrow\" select=\"$fGrow\" />\n </xsl:call-template>\n <mml:mrow>\n <xsl:apply-templates select=\"m:sub[1]\" />\n </mml:mrow>\n </mml:msub>\n </xsl:when>\n <xsl:otherwise>\n <mml:munder>\n <xsl:call-template name=\"OutputNaryMo\">\n <xsl:with-param name=\"ndCur\" select=\".\" />\n <xsl:with-param name=\"fGrow\" select=\"$fGrow\" />\n </xsl:call-template>\n <mml:mrow>\n <xsl:apply-templates select=\"m:sub[1]\" />\n </mml:mrow>\n </mml:munder>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:when>\n <xsl:otherwise>\n <xsl:choose>\n <xsl:when test=\"$fLimLocSubSup=1\">\n <mml:msubsup>\n <xsl:call-template name=\"OutputNaryMo\">\n <xsl:with-param name=\"ndCur\" select=\".\" />\n <xsl:with-param name=\"fGrow\" select=\"$fGrow\" />\n </xsl:call-template>\n <mml:mrow>\n <xsl:apply-templates select=\"m:sub[1]\" />\n </mml:mrow>\n <mml:mrow>\n <xsl:apply-templates select=\"m:sup[1]\" />\n </mml:mrow>\n </mml:msubsup>\n </xsl:when>\n <xsl:otherwise>\n <mml:munderover>\n <xsl:call-template name=\"OutputNaryMo\">\n <xsl:with-param name=\"ndCur\" select=\".\" />\n <xsl:with-param name=\"fGrow\" select=\"$fGrow\" />\n </xsl:call-template>\n <mml:mrow>\n <xsl:apply-templates select=\"m:sub[1]\" />\n </mml:mrow>\n <mml:mrow>\n <xsl:apply-templates select=\"m:sup[1]\" />\n </mml:mrow>\n </mml:munderover>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:otherwise>\n </xsl:choose>\n <mml:mrow>\n <xsl:apply-templates select=\"m:e[1]\" />\n </mml:mrow>\n </mml:mrow>\n </xsl:template>\n\n <xsl:template match=\"m:limLow\">\n <mml:munder>\n <mml:mrow>\n <xsl:apply-templates select=\"m:e[1]\" />\n </mml:mrow>\n <mml:mrow>\n <xsl:apply-templates select=\"m:lim[1]\" />\n </mml:mrow>\n </mml:munder>\n </xsl:template>\n\n <xsl:template match=\"m:limUpp\">\n <mml:mover>\n <mml:mrow>\n <xsl:apply-templates select=\"m:e[1]\" />\n </mml:mrow>\n <mml:mrow>\n <xsl:apply-templates select=\"m:lim[1]\" />\n </mml:mrow>\n </mml:mover>\n </xsl:template>\n\n <xsl:template match=\"m:sSub\">\n <mml:msub>\n <mml:mrow>\n <xsl:apply-templates select=\"m:e[1]\" />\n </mml:mrow>\n <mml:mrow>\n <xsl:apply-templates select=\"m:sub[1]\" />\n </mml:mrow>\n </mml:msub>\n </xsl:template>\n\n <xsl:template match=\"m:sSup\">\n <mml:msup>\n <mml:mrow>\n <xsl:apply-templates select=\"m:e[1]\" />\n </mml:mrow>\n <mml:mrow>\n <xsl:apply-templates select=\"m:sup[1]\" />\n </mml:mrow>\n </mml:msup>\n </xsl:template>\n\n <xsl:template match=\"m:sSubSup\">\n <mml:msubsup>\n <mml:mrow>\n <xsl:apply-templates select=\"m:e[1]\" />\n </mml:mrow>\n <mml:mrow>\n <xsl:apply-templates select=\"m:sub[1]\" />\n </mml:mrow>\n <mml:mrow>\n <xsl:apply-templates select=\"m:sup[1]\" />\n </mml:mrow>\n </mml:msubsup>\n </xsl:template>\n\n <xsl:template match=\"m:groupChr\">\n <xsl:variable name=\"ndLastGroupChrPr\" select=\"m:groupChrPr[last()]\" />\n <xsl:variable name=\"sLowerCasePos\" select=\"translate($ndLastGroupChrPr/m:pos/@m:val,\n\t\t 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',\n\t\t 'abcdefghijklmnopqrstuvwxyz')\" />\n\n <xsl:variable name=\"sLowerCaseVertJc\" select=\"translate($ndLastGroupChrPr/m:vertJc/@m:val,\n\t\t 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',\n\t\t 'abcdefghijklmnopqrstuvwxyz')\" />\n <xsl:variable name=\"ndLastChr\" select=\"$ndLastGroupChrPr/m:chr\" />\n\n <xsl:variable name=\"chr\">\n <xsl:choose>\n <xsl:when test=\"$ndLastChr and (not($ndLastChr/@m:val) or string-length($ndLastChr/@m:val) = 0)\"></xsl:when>\n <xsl:when test=\"string-length($ndLastChr/@m:val) >= 1\">\n <xsl:value-of select=\"substring($ndLastChr/@m:val,1,1)\" />\n </xsl:when>\n <xsl:otherwise>\n <xsl:text>⏟</xsl:text>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:variable>\n <xsl:choose>\n <xsl:when test=\"$sLowerCasePos = 'top'\">\n <xsl:choose>\n <xsl:when test=\"$sLowerCaseVertJc = 'bot'\">\n <mml:mover accent=\"false\">\n <mml:mrow>\n <xsl:apply-templates select=\"m:e[1]\" />\n </mml:mrow>\n <mml:mo>\n <xsl:value-of select=\"$chr\" />\n </mml:mo>\n </mml:mover>\n </xsl:when>\n <xsl:otherwise>\n <mml:munder accentunder=\"false\">\n <mml:mo>\n <xsl:value-of select=\"$chr\" />\n </mml:mo>\n <mml:mrow>\n <xsl:apply-templates select=\"m:e[1]\" />\n </mml:mrow>\n </mml:munder>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:when>\n <xsl:otherwise>\n <xsl:choose>\n <xsl:when test=\"$sLowerCaseVertJc = 'bot'\">\n <mml:mover accent=\"false\">\n <mml:mo>\n <xsl:value-of select=\"$chr\" />\n </mml:mo>\n <mml:mrow>\n <xsl:apply-templates select=\"m:e[1]\" />\n </mml:mrow>\n </mml:mover>\n </xsl:when>\n <xsl:otherwise>\n <mml:munder accentunder=\"false\">\n <mml:mrow>\n <xsl:apply-templates select=\"m:e[1]\" />\n </mml:mrow>\n <mml:mo>\n <xsl:value-of select=\"$chr\" />\n </mml:mo>\n </mml:munder>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:template>\n\n <xsl:template name=\"fName\">\n <xsl:for-each select=\"m:fName/*\">\n <xsl:apply-templates select=\".\" />\n </xsl:for-each>\n </xsl:template>\n\n <xsl:template match=\"m:func\">\n <mml:mrow>\n <mml:mrow>\n <xsl:call-template name=\"fName\" />\n </mml:mrow>\n <mml:mo>⁡</mml:mo>\n <mml:mrow>\n <xsl:apply-templates select=\"m:e\" />\n </mml:mrow>\n </mml:mrow>\n </xsl:template>\n\n <!-- %%Template: match m:f\n\n\t\tm:f maps directly to mfrac.\n\t-->\n <xsl:template match=\"m:f\">\n <xsl:variable name=\"sLowerCaseType\" select=\"translate(m:fPr[last()]/m:type/@m:val, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')\" />\n <xsl:choose>\n <xsl:when test=\"$sLowerCaseType='lin'\">\n <mml:mrow>\n <mml:mrow>\n <xsl:apply-templates select=\"m:num[1]\" />\n </mml:mrow>\n <mml:mo>/</mml:mo>\n <mml:mrow>\n <xsl:apply-templates select=\"m:den[1]\" />\n </mml:mrow>\n </mml:mrow>\n </xsl:when>\n <xsl:otherwise>\n <mml:mfrac>\n <xsl:call-template name=\"CreateMathMLFracProp\">\n <xsl:with-param name=\"type\" select=\"$sLowerCaseType\" />\n </xsl:call-template>\n <mml:mrow>\n <xsl:apply-templates select=\"m:num[1]\" />\n </mml:mrow>\n <mml:mrow>\n <xsl:apply-templates select=\"m:den[1]\" />\n </mml:mrow>\n </mml:mfrac>\n </xsl:otherwise>\n </xsl:choose>\n\n </xsl:template>\n\n\n <!-- %%Template: CreateMathMLFracProp\n\n\t\t\tMake fraction properties based on supplied parameters.\n\t\t\tOMML differentiates between a linear fraction and a skewed\n\t\t\tone. For MathML, we write both as bevelled.\n\t-->\n <xsl:template name=\"CreateMathMLFracProp\">\n <xsl:param name=\"type\" />\n <xsl:variable name=\"sLowerCaseType\" select=\"translate($type, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')\" />\n\n <xsl:if test=\"$sLowerCaseType='skw' or $sLowerCaseType='lin'\">\n <xsl:attribute name=\"bevelled\">true</xsl:attribute>\n </xsl:if>\n <xsl:if test=\"$sLowerCaseType='nobar'\">\n <xsl:attribute name=\"linethickness\">0pt</xsl:attribute>\n </xsl:if>\n <xsl:choose>\n <xsl:when test=\"sLowerCaseNumJc='right'\">\n <xsl:attribute name=\"numalign\">right</xsl:attribute>\n </xsl:when>\n <xsl:when test=\"sLowerCaseNumJc='left'\">\n <xsl:attribute name=\"numalign\">left</xsl:attribute>\n </xsl:when>\n </xsl:choose>\n <xsl:choose>\n <xsl:when test=\"sLowerCaseDenJc='right'\">\n <xsl:attribute name=\"numalign\">right</xsl:attribute>\n </xsl:when>\n <xsl:when test=\"sLowerCaseDenJc='left'\">\n <xsl:attribute name=\"numalign\">left</xsl:attribute>\n </xsl:when>\n </xsl:choose>\n </xsl:template>\n\n <!-- %%Template: match m:e | m:den | m:num | m:lim | m:sup | m:sub\n\n\t\tThese element delinate parts of an expression (like the numerator). -->\n <xsl:template match=\"m:e | m:den | m:num | m:lim | m:sup | m:sub\">\n <xsl:choose>\n\n <!-- If there is no scriptLevel specified, just call through -->\n <xsl:when test=\"not(m:argPr[last()]/m:scrLvl/@m:val)\">\n <xsl:apply-templates select=\"*\" />\n </xsl:when>\n\n <!-- Otherwise, create an mstyle and set the script level -->\n <xsl:otherwise>\n <mml:mstyle>\n <xsl:attribute name=\"scriptlevel\">\n <xsl:value-of select=\"m:argPr[last()]/m:scrLvl/@m:val\" />\n </xsl:attribute>\n <xsl:apply-templates select=\"*\" />\n </mml:mstyle>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:template>\n\n <xsl:template match=\"m:bar\">\n <xsl:variable name=\"sLowerCasePos\" select=\"translate(m:barPr/m:pos/@m:val, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',\n\t\t 'abcdefghijklmnopqrstuvwxyz')\" />\n\n <xsl:variable name=\"fTop\">\n\n <xsl:choose>\n <xsl:when test=\"$sLowerCasePos='top'\">1</xsl:when>\n <xsl:otherwise>0</xsl:otherwise>\n </xsl:choose>\n </xsl:variable>\n <xsl:choose>\n <xsl:when test=\"$fTop=1\">\n <mml:mover accent=\"false\">\n <mml:mrow>\n <xsl:apply-templates select=\"m:e[1]\" />\n </mml:mrow>\n <mml:mo>\n <xsl:text>¯</xsl:text>\n </mml:mo>\n </mml:mover>\n </xsl:when>\n <xsl:otherwise>\n <mml:munder underaccent=\"false\">\n <mml:mrow>\n <xsl:apply-templates select=\"m:e[1]\" />\n </mml:mrow>\n <mml:mo>\n <xsl:text>_</xsl:text>\n </mml:mo>\n </mml:munder>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:template>\n\n <!-- %%Template match m:d\n\n\t\tProcess a delimiter.\n\t-->\n <xsl:template match=\"m:d\">\n <mml:mfenced>\n <!-- open: default is '(' for both OMML and MathML -->\n <xsl:if test=\"m:dPr[1]/m:begChr/@m:val and not(m:dPr[1]/m:begChr/@m:val ='(')\">\n <xsl:attribute name=\"open\">\n <xsl:value-of select=\"m:dPr[1]/m:begChr/@m:val\" />\n </xsl:attribute>\n </xsl:if>\n\n <!-- close: default is ')' for both OMML and MathML -->\n <xsl:if test=\"m:dPr[1]/m:endChr/@m:val and not(m:dPr[1]/m:endChr/@m:val =')')\">\n <xsl:attribute name=\"close\">\n <xsl:value-of select=\"m:dPr[1]/m:endChr/@m:val\" />\n </xsl:attribute>\n </xsl:if>\n\n <!-- separator: the default is ',' for MathML, and '|' for OMML -->\n <xsl:choose>\n <!-- Matches MathML default. Write nothing -->\n <xsl:when test=\"m:dPr[1]/m:sepChr/@m:val = ','\" />\n\n <!-- OMML default: | -->\n <xsl:when test=\"not(m:dPr[1]/m:sepChr/@m:val)\">\n <xsl:attribute name=\"separators\">\n <xsl:value-of select=\"'|'\" />\n </xsl:attribute>\n </xsl:when>\n\n <xsl:otherwise>\n <xsl:attribute name=\"separators\">\n <xsl:value-of select=\"m:dPr[1]/m:sepChr/@m:val\" />\n </xsl:attribute>\n </xsl:otherwise>\n </xsl:choose>\n\n <!-- now write all the children. Put each one into an mrow\n\t\t\tjust in case it produces multiple runs, etc -->\n <xsl:for-each select=\"m:e\">\n <mml:mrow>\n <xsl:apply-templates select=\".\" />\n </mml:mrow>\n </xsl:for-each>\n </mml:mfenced>\n </xsl:template>\n\n <xsl:template match=\"m:r\">\n <xsl:variable name=\"fNor\">\n <xsl:choose>\n <xsl:when test=\"count(child::m:rPr[last()]/m:nor) = 0\">0</xsl:when>\n <xsl:otherwise>\n <xsl:call-template name=\"ForceFalseStrVal\">\n <xsl:with-param name=\"str\" select=\"translate(child::m:rPr[last()]/m:nor/@m:val, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',\n\t\t 'abcdefghijklmnopqrstuvwxyz')\" />\n </xsl:call-template>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:variable>\n\n <xsl:choose>\n <xsl:when test=\"$fNor=1\">\n <mml:mtext>\n <xsl:variable name=\"sOutput\" select=\"translate(.//m:t, ' ', ' ')\" />\n <xsl:value-of select=\"$sOutput\" />\n </mml:mtext>\n </xsl:when>\n <xsl:otherwise>\n <xsl:for-each select=\".//m:t\">\n <xsl:call-template name=\"ParseMt\">\n <xsl:with-param name=\"sToParse\" select=\"text()\" />\n <xsl:with-param name=\"scr\" select=\"../m:rPr[last()]/m:scr/@m:val\" />\n <xsl:with-param name=\"sty\" select=\"../m:rPr[last()]/m:sty/@m:val\" />\n <xsl:with-param name=\"nor\">0</xsl:with-param>\n </xsl:call-template>\n </xsl:for-each>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:template>\n\n\n <xsl:template name=\"CreateTokenAttributes\">\n <xsl:param name=\"scr\" />\n <xsl:param name=\"sty\" />\n <xsl:param name=\"nor\" />\n <xsl:param name=\"nCharToPrint\" />\n <xsl:param name=\"sTokenType\" />\n\n <xsl:choose>\n <xsl:when test=\"$nor=1\">\n <xsl:attribute name=\"mathvariant\">normal</xsl:attribute>\n </xsl:when>\n <xsl:otherwise>\n <xsl:variable name=\"mathvariant\">\n <xsl:choose>\n <!-- numbers don't care -->\n <xsl:when test=\"$sTokenType='mn'\" />\n\n <xsl:when test=\"$scr='monospace'\">monospace</xsl:when>\n <xsl:when test=\"$scr='sans-serif' and $sty='i'\">sans-serif-italic</xsl:when>\n <xsl:when test=\"$scr='sans-serif' and $sty='b'\">bold-sans-serif</xsl:when>\n <xsl:when test=\"$scr='sans-serif' and $sty='bi'\">sans-serif-bold-italic</xsl:when>\n <xsl:when test=\"$scr='sans-serif'\">sans-serif</xsl:when>\n <xsl:when test=\"$scr='fraktur' and ($sty='b' or $sty='bi')\">bold-fraktur</xsl:when>\n <xsl:when test=\"$scr='fraktur'\">fraktur</xsl:when>\n <xsl:when test=\"$scr='double-struck'\">double-struck</xsl:when>\n <xsl:when test=\"$scr='script' and ($sty='b' or $sty='bi')\">bold-script</xsl:when>\n <xsl:when test=\"$scr='script'\">script</xsl:when>\n <xsl:when test=\"($scr='roman' or not($scr) or $scr='') and $sty='b'\">bold</xsl:when>\n <xsl:when test=\"($scr='roman' or not($scr) or $scr='') and $sty='i'\">italic</xsl:when>\n <xsl:when test=\"($scr='roman' or not($scr) or $scr='') and $sty='p'\">normal</xsl:when>\n <xsl:when test=\"($scr='roman' or not($scr) or $scr='') and $sty='bi'\">bold-italic</xsl:when>\n <xsl:otherwise />\n </xsl:choose>\n </xsl:variable>\n <xsl:variable name=\"fontweight\">\n <xsl:choose>\n <xsl:when test=\"$sty='b' or $sty='bi'\">bold</xsl:when>\n <xsl:otherwise>normal</xsl:otherwise>\n </xsl:choose>\n </xsl:variable>\n <xsl:variable name=\"fontstyle\">\n <xsl:choose>\n <xsl:when test=\"$sty='p' or $sty='b'\">normal</xsl:when>\n <xsl:otherwise>italic</xsl:otherwise>\n </xsl:choose>\n </xsl:variable>\n\n <!-- Writing of attributes begins here -->\n <xsl:choose>\n <!-- Don't write mathvariant for operators unless they want to be normal -->\n <xsl:when test=\"$sTokenType='mo' and $mathvariant!='normal'\" />\n\n <!-- A single character within an mi is already italics, don't write -->\n <xsl:when test=\"$sTokenType='mi' and $nCharToPrint=1 and ($mathvariant='' or $mathvariant='italic')\" />\n\n <xsl:when test=\"$sTokenType='mi' and $nCharToPrint > 1 and ($mathvariant='' or $mathvariant='italic')\">\n <xsl:attribute name=\"mathvariant\">\n <xsl:value-of select=\"'italic'\" />\n </xsl:attribute>\n </xsl:when>\n <xsl:when test=\"$mathvariant!='italic' and $mathvariant!=''\">\n <xsl:attribute name=\"mathvariant\">\n <xsl:value-of select=\"$mathvariant\" />\n </xsl:attribute>\n </xsl:when>\n <xsl:otherwise>\n <xsl:if test=\"not($sTokenType='mi' and $nCharToPrint=1) and $fontstyle='italic'\">\n <xsl:attribute name=\"fontstyle\">italic</xsl:attribute>\n </xsl:if>\n <xsl:if test=\"$fontweight='bold'\">\n <xsl:attribute name=\"fontweight\">bold</xsl:attribute>\n </xsl:if>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:template>\n\n <xsl:template match=\"m:eqArr\">\n <mml:mtable>\n <xsl:for-each select=\"m:e\">\n <mml:mtr>\n <mml:mtd>\n <xsl:choose>\n <xsl:when test=\"m:argPr[last()]/m:scrLvl/@m:val!='0' or\n\t\t\t\t\t not(m:argPr[last()]/m:scrLvl/@m:val) or\n\t\t\t\t\t m:argPr[last()]/m:scrLvl/@m:val=''\">\n <mml:mrow>\n <mml:maligngroup />\n <xsl:call-template name=\"CreateEqArrRow\">\n <xsl:with-param name=\"align\" select=\"1\" />\n <xsl:with-param name=\"ndCur\" select=\"*[1]\" />\n </xsl:call-template>\n </mml:mrow>\n </xsl:when>\n <xsl:otherwise>\n <mml:mstyle>\n <xsl:attribute name=\"scriptlevel\">\n <xsl:value-of select=\"m:argPr[last()]/m:scrLvl/@m:val\" />\n </xsl:attribute>\n <mml:maligngroup />\n <xsl:call-template name=\"CreateEqArrRow\">\n <xsl:with-param name=\"align\" select=\"1\" />\n <xsl:with-param name=\"ndCur\" select=\"*[1]\" />\n </xsl:call-template>\n </mml:mstyle>\n </xsl:otherwise>\n </xsl:choose>\n </mml:mtd>\n </mml:mtr>\n </xsl:for-each>\n </mml:mtable>\n </xsl:template>\n\n <xsl:template name=\"CreateEqArrRow\">\n <xsl:param name=\"align\" />\n <xsl:param name=\"ndCur\" />\n <xsl:variable name=\"sAllMt\">\n <xsl:for-each select=\"$ndCur/m:t\">\n <xsl:value-of select=\".\" />\n </xsl:for-each>\n </xsl:variable>\n <xsl:choose>\n <xsl:when test=\"$ndCur/self::m:r\">\n <xsl:call-template name=\"ParseEqArrMr\">\n <xsl:with-param name=\"sToParse\" select=\"$sAllMt\" />\n <xsl:with-param name=\"scr\" select=\"../m:rPr[last()]/m:scr/@m:val\" />\n <xsl:with-param name=\"sty\" select=\"../m:rPr[last()]/m:sty/@m:val\" />\n <xsl:with-param name=\"nor\">\n <xsl:choose>\n <xsl:when test=\"count($ndCur/m:rPr[last()]/m:nor) = 0\">0</xsl:when>\n <xsl:otherwise>\n <xsl:call-template name=\"ForceFalseStrVal\">\n <xsl:with-param name=\"str\" select=\"translate($ndCur/m:rPr[last()]/m:nor/@m:val,\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',\n\t\t 'abcdefghijklmnopqrstuvwxyz')\" />\n </xsl:call-template>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:with-param>\n <xsl:with-param name=\"align\" select=\"$align\" />\n </xsl:call-template>\n </xsl:when>\n <xsl:otherwise>\n <xsl:apply-templates select=\"$ndCur\" />\n </xsl:otherwise>\n </xsl:choose>\n <xsl:if test=\"count($ndCur/following-sibling::*) > 0\">\n <xsl:variable name=\"cAmp\">\n <xsl:call-template name=\"CountAmp\">\n <xsl:with-param name=\"sAllMt\" select=\"$sAllMt\" />\n <xsl:with-param name=\"cAmp\" select=\"0\" />\n </xsl:call-template>\n </xsl:variable>\n <xsl:call-template name=\"CreateEqArrRow\">\n <xsl:with-param name=\"align\" select=\"($align+($cAmp mod 2)) mod 2\" />\n <xsl:with-param name=\"ndCur\" select=\"$ndCur/following-sibling::*[1]\" />\n </xsl:call-template>\n </xsl:if>\n </xsl:template>\n\n <xsl:template name=\"CountAmp\">\n <xsl:param name=\"sAllMt\" />\n <xsl:param name=\"cAmp\" />\n <xsl:choose>\n <xsl:when test=\"string-length(substring-after($sAllMt, '&')) > 0 or\n\t\t\t substring($sAllMt, string-length($sAllMt))='&'\">\n <xsl:call-template name=\"CountAmp\">\n <xsl:with-param name=\"sAllMt\" select=\"substring-after($sAllMt, '&')\" />\n <xsl:with-param name=\"cAmp\" select=\"$cAmp+1\" />\n </xsl:call-template>\n </xsl:when>\n <xsl:otherwise>\n <xsl:value-of select=\"$cAmp\" />\n </xsl:otherwise>\n </xsl:choose>\n </xsl:template>\n\n <!-- %%Template: ParseEqArrMr\n\n\t\t\tSimilar to ParseMt, but this one has to do more for an equation array.\n In equation arrays & is a special character which denotes alignment.\n\n The & in an equation works by alternating between meaning insert alignment spacing\n and insert alignment mark. For each equation in the equation array\n there is an implied align space at the beginning of the equation. Within each equation,\n the first & means alignmark, the second, align space, the third, alignmark, etc.\n\n For this reason when parsing m:r's in equation arrays it is important to keep track of what\n the next ampersand will mean.\n\n $align=0 => Omml's align space, which is similar to MathML's maligngroup.\n $align=1 => Omml's alignment mark, which is similar to MathML's malignmark.\n\t-->\n <xsl:template name=\"ParseEqArrMr\">\n <xsl:param name=\"sToParse\" />\n <xsl:param name=\"sty\" />\n <xsl:param name=\"scr\" />\n <xsl:param name=\"nor\" />\n <xsl:param name=\"align\" />\n\n <xsl:if test=\"string-length($sToParse) > 0\">\n <xsl:choose>\n <xsl:when test=\"substring($sToParse,1,1) = '&'\">\n <xsl:choose>\n <xsl:when test=\"$align='0'\">\n <mml:maligngroup />\n </xsl:when>\n <xsl:when test=\"$align='1'\">\n <mml:malignmark />\n </xsl:when>\n </xsl:choose>\n <xsl:call-template name=\"ParseEqArrMr\">\n <xsl:with-param name=\"sToParse\" select=\"substring($sToParse,2)\" />\n <xsl:with-param name=\"scr\" select=\"$scr\" />\n <xsl:with-param name=\"sty\" select=\"$sty\" />\n <xsl:with-param name=\"nor\" select=\"$nor\" />\n <xsl:with-param name=\"align\">\n <xsl:choose>\n <xsl:when test=\"$align='1'\">0</xsl:when>\n <xsl:otherwise>1</xsl:otherwise>\n </xsl:choose>\n </xsl:with-param>\n </xsl:call-template>\n </xsl:when>\n <xsl:otherwise>\n <xsl:variable name=\"sRepNumWith0\">\n <xsl:call-template name=\"SReplaceNumWithZero\">\n <xsl:with-param name=\"sToParse\" select=\"$sToParse\" />\n </xsl:call-template>\n </xsl:variable>\n <xsl:variable name=\"sRepOperWith-\">\n <xsl:call-template name=\"SReplaceOperWithMinus\">\n <xsl:with-param name=\"sToParse\" select=\"$sRepNumWith0\" />\n </xsl:call-template>\n </xsl:variable>\n\n <xsl:variable name=\"iFirstOper\" select=\"string-length($sRepOperWith-) - string-length(substring-after($sRepOperWith-, '-'))\" />\n <xsl:variable name=\"iFirstNum\" select=\"string-length($sRepOperWith-) - string-length(substring-after($sRepOperWith-, '0'))\" />\n <xsl:variable name=\"iFirstAmp\" select=\"string-length($sRepOperWith-) - string-length(substring-after($sRepOperWith-, '&'))\" />\n <xsl:variable name=\"fNumAtPos1\">\n <xsl:choose>\n <xsl:when test=\"substring($sRepOperWith-,1,1)='0'\">1</xsl:when>\n <xsl:otherwise>0</xsl:otherwise>\n </xsl:choose>\n </xsl:variable>\n <xsl:variable name=\"fOperAtPos1\">\n <xsl:choose>\n <xsl:when test=\"substring($sRepOperWith-,1,1)='-'\">1</xsl:when>\n <xsl:otherwise>0</xsl:otherwise>\n </xsl:choose>\n </xsl:variable>\n <xsl:choose>\n\n <!-- Case I: The string begins with neither a number, nor an operator -->\n <xsl:when test=\"$fNumAtPos1='0' and $fOperAtPos1='0'\">\n <xsl:choose>\n <xsl:when test=\"$nor = 0\">\n <mml:mi>\n <xsl:call-template name=\"CreateTokenAttributes\">\n <xsl:with-param name=\"scr\" select=\"$scr\" />\n <xsl:with-param name=\"sty\" select=\"$sty\" />\n <xsl:with-param name=\"nor\" select=\"$nor\" />\n <xsl:with-param name=\"nCharToPrint\" select=\"1\" />\n <xsl:with-param name=\"sTokenType\" select=\"'mi'\" />\n </xsl:call-template>\n <xsl:variable name=\"sOutput\" select=\"translate(substring($sToParse, 1, 1), ' ', ' ')\" />\n <xsl:value-of select=\"$sOutput\" />\n </mml:mi>\n </xsl:when>\n <xsl:otherwise>\n <mml:mtext>\n <xsl:variable name=\"sOutput\" select=\"translate(substring($sToParse, 1, 1), ' ', ' ')\" />\n <xsl:value-of select=\"$sOutput\" />\n </mml:mtext>\n </xsl:otherwise>\n </xsl:choose>\n <xsl:call-template name=\"ParseEqArrMr\">\n <xsl:with-param name=\"sToParse\" select=\"substring($sToParse, 2)\" />\n <xsl:with-param name=\"scr\" select=\"$scr\" />\n <xsl:with-param name=\"sty\" select=\"$sty\" />\n <xsl:with-param name=\"nor\" select=\"$nor\" />\n <xsl:with-param name=\"align\" select=\"$align\" />\n </xsl:call-template>\n </xsl:when>\n\n <!-- Case II: There is an operator at position 1 -->\n <xsl:when test=\"$fOperAtPos1='1'\">\n <xsl:choose>\n <xsl:when test=\"$nor = 0\">\n <mml:mo>\n <xsl:call-template name=\"CreateTokenAttributes\">\n <xsl:with-param name=\"scr\" />\n <xsl:with-param name=\"sty\" />\n <xsl:with-param name=\"nor\" select=\"$nor\" />\n <xsl:with-param name=\"sTokenType\" select=\"'mo'\" />\n </xsl:call-template>\n <xsl:value-of select=\"substring($sToParse,1,1)\" />\n </mml:mo>\n </xsl:when>\n <xsl:otherwise>\n <mml:mtext>\n <xsl:value-of select=\"substring($sToParse,1,1)\" />\n </mml:mtext>\n </xsl:otherwise>\n </xsl:choose>\n <xsl:call-template name=\"ParseEqArrMr\">\n <xsl:with-param name=\"sToParse\" select=\"substring($sToParse, 2)\" />\n <xsl:with-param name=\"scr\" select=\"$scr\" />\n <xsl:with-param name=\"sty\" select=\"$sty\" />\n <xsl:with-param name=\"nor\" select=\"$nor\" />\n <xsl:with-param name=\"align\" select=\"$align\" />\n </xsl:call-template>\n </xsl:when>\n\n <!-- Case III: There is a number at position 1 -->\n <xsl:otherwise>\n <xsl:variable name=\"sConsecNum\">\n <xsl:call-template name=\"SNumStart\">\n <xsl:with-param name=\"sToParse\" select=\"$sToParse\" />\n <xsl:with-param name=\"sPattern\" select=\"$sRepNumWith0\" />\n </xsl:call-template>\n </xsl:variable>\n <xsl:choose>\n <xsl:when test=\"$nor = 0\">\n <mml:mn>\n <xsl:call-template name=\"CreateTokenAttributes\">\n <xsl:with-param name=\"scr\" />\n <xsl:with-param name=\"sty\" select=\"'p'\"/>\n <xsl:with-param name=\"nor\" select=\"$nor\" />\n <xsl:with-param name=\"sTokenType\" select=\"'mn'\" />\n </xsl:call-template>\n <xsl:value-of select=\"$sConsecNum\" />\n </mml:mn>\n </xsl:when>\n <xsl:otherwise>\n <mml:mtext>\n <xsl:value-of select=\"$sConsecNum\" />\n </mml:mtext>\n </xsl:otherwise>\n </xsl:choose>\n <xsl:call-template name=\"ParseEqArrMr\">\n <xsl:with-param name=\"sToParse\" select=\"substring-after($sToParse, $sConsecNum)\" />\n <xsl:with-param name=\"scr\" select=\"$scr\" />\n <xsl:with-param name=\"sty\" select=\"$sty\" />\n <xsl:with-param name=\"nor\" select=\"$nor\" />\n <xsl:with-param name=\"align\" select=\"$align\" />\n </xsl:call-template>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:if>\n </xsl:template>\n\n <!-- %%Template: ParseMt\n\n\t\t\tProduce a run of text. Technically, OMML makes no distinction\n\t\t\tbetween numbers, operators, and other characters in a run. For\n\t\t\tMathML we need to break these into mi, mn, or mo elements.\n\n\t\t\tSee also ParseEqArrMr\n\t-->\n <xsl:template name=\"ParseMt\">\n <xsl:param name=\"sToParse\" />\n <xsl:param name=\"sty\" />\n <xsl:param name=\"scr\" />\n <xsl:param name=\"nor\" />\n <xsl:if test=\"string-length($sToParse) > 0\">\n <xsl:variable name=\"sRepNumWith0\">\n <xsl:call-template name=\"SReplaceNumWithZero\">\n <xsl:with-param name=\"sToParse\" select=\"$sToParse\" />\n </xsl:call-template>\n </xsl:variable>\n <xsl:variable name=\"sRepOperWith-\">\n <xsl:call-template name=\"SReplaceOperWithMinus\">\n <xsl:with-param name=\"sToParse\" select=\"$sRepNumWith0\" />\n </xsl:call-template>\n </xsl:variable>\n\n <xsl:variable name=\"iFirstOper\" select=\"string-length($sRepOperWith-) - string-length(substring-after($sRepOperWith-, '-'))\" />\n <xsl:variable name=\"iFirstNum\" select=\"string-length($sRepOperWith-) - string-length(substring-after($sRepOperWith-, '0'))\" />\n <xsl:variable name=\"fNumAtPos1\">\n <xsl:choose>\n <xsl:when test=\"substring($sRepOperWith-,1,1)='0'\">1</xsl:when>\n <xsl:otherwise>0</xsl:otherwise>\n </xsl:choose>\n </xsl:variable>\n <xsl:variable name=\"fOperAtPos1\">\n <xsl:choose>\n <xsl:when test=\"substring($sRepOperWith-,1,1)='-'\">1</xsl:when>\n <xsl:otherwise>0</xsl:otherwise>\n </xsl:choose>\n </xsl:variable>\n\n <xsl:choose>\n\n <!-- Case I: The string begins with neither a number, nor an operator -->\n <xsl:when test=\"$fOperAtPos1='0' and $fNumAtPos1='0'\">\n <xsl:variable name=\"nCharToPrint\">\n <xsl:choose>\n <xsl:when test=\"ancestor::m:fName\">\n <xsl:choose>\n <xsl:when test=\"($iFirstOper=$iFirstNum) and\n\t\t\t\t\t\t\t\t\t\t\t($iFirstOper=string-length($sToParse)) and\n\t\t\t\t\t\t\t (substring($sRepOperWith-, string-length($sRepOperWith-))!='0') and\n\t\t\t\t\t\t\t (substring($sRepOperWith-, string-length($sRepOperWith-))!='-')\">\n <xsl:value-of select=\"string-length($sToParse)\" />\n </xsl:when>\n <xsl:when test=\"$iFirstOper < $iFirstNum\">\n <xsl:value-of select=\"$iFirstOper - 1\" />\n </xsl:when>\n <xsl:otherwise>\n <xsl:value-of select=\"$iFirstNum - 1\" />\n </xsl:otherwise>\n </xsl:choose>\n </xsl:when>\n <xsl:otherwise>1</xsl:otherwise>\n </xsl:choose>\n </xsl:variable>\n\n <mml:mi>\n <xsl:call-template name=\"CreateTokenAttributes\">\n <xsl:with-param name=\"scr\" select=\"$scr\" />\n <xsl:with-param name=\"sty\" select=\"$sty\" />\n <xsl:with-param name=\"nor\" select=\"$nor\" />\n <xsl:with-param name=\"nCharToPrint\" select=\"$nCharToPrint\" />\n <xsl:with-param name=\"sTokenType\" select=\"'mi'\" />\n </xsl:call-template>\n <xsl:variable name=\"sWrite\" select=\"translate(substring($sToParse, 1, $nCharToPrint), ' ', ' ')\" />\n <xsl:value-of select=\"$sWrite\" />\n </mml:mi>\n <xsl:call-template name=\"ParseMt\">\n <xsl:with-param name=\"sToParse\" select=\"substring($sToParse, $nCharToPrint+1)\" />\n <xsl:with-param name=\"scr\" select=\"$scr\" />\n <xsl:with-param name=\"sty\" select=\"$sty\" />\n <xsl:with-param name=\"nor\" select=\"$nor\" />\n </xsl:call-template>\n </xsl:when>\n\n <!-- Case II: There is an operator at position 1 -->\n <xsl:when test=\"$fOperAtPos1='1'\">\n <mml:mo>\n <xsl:call-template name=\"CreateTokenAttributes\">\n <xsl:with-param name=\"scr\" />\n <xsl:with-param name=\"sty\" />\n <xsl:with-param name=\"nor\" select=\"$nor\" />\n <xsl:with-param name=\"sTokenType\" select=\"'mo'\" />\n </xsl:call-template>\n <xsl:value-of select=\"substring($sToParse,1,1)\" />\n </mml:mo>\n <xsl:call-template name=\"ParseMt\">\n <xsl:with-param name=\"sToParse\" select=\"substring($sToParse, 2)\" />\n <xsl:with-param name=\"scr\" select=\"$scr\" />\n <xsl:with-param name=\"sty\" select=\"$sty\" />\n <xsl:with-param name=\"nor\" select=\"$nor\" />\n </xsl:call-template>\n </xsl:when>\n\n <!-- Case III: There is a number at position 1 -->\n <xsl:otherwise>\n <xsl:variable name=\"sConsecNum\">\n <xsl:call-template name=\"SNumStart\">\n <xsl:with-param name=\"sToParse\" select=\"$sToParse\" />\n <xsl:with-param name=\"sPattern\" select=\"$sRepNumWith0\" />\n </xsl:call-template>\n </xsl:variable>\n <mml:mn>\n <xsl:call-template name=\"CreateTokenAttributes\">\n <xsl:with-param name=\"scr\" select=\"$scr\" />\n <xsl:with-param name=\"sty\" select=\"'p'\" />\n <xsl:with-param name=\"nor\" select=\"$nor\" />\n <xsl:with-param name=\"sTokenType\" select=\"'mn'\" />\n </xsl:call-template>\n <xsl:value-of select=\"$sConsecNum\" />\n </mml:mn>\n <xsl:call-template name=\"ParseMt\">\n <xsl:with-param name=\"sToParse\" select=\"substring-after($sToParse, $sConsecNum)\" />\n <xsl:with-param name=\"scr\" select=\"$scr\" />\n <xsl:with-param name=\"sty\" select=\"$sty\" />\n <xsl:with-param name=\"nor\" select=\"$nor\" />\n </xsl:call-template>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:if>\n </xsl:template>\n\n <!-- %%Template: SNumStart\n\n\t\tReturn the longest substring of sToParse starting from the\n\t\tstart of sToParse that is a number. In addition, it takes the\n\t\tpattern string, which is sToParse with all of its numbers\n\t\treplaced with a 0. sPattern should be the same length\n\t\tas sToParse\n\t-->\n <xsl:template name=\"SNumStart\">\n <xsl:param name=\"sToParse\" select=\"''\" />\n <!-- if we don't get anything, take the string itself -->\n <xsl:param name=\"sPattern\" select=\"'$sToParse'\" />\n\n\n <xsl:choose>\n <!-- the pattern says this is a number, recurse with the rest -->\n <xsl:when test=\"substring($sPattern, 1, 1) = '0'\">\n <xsl:call-template name=\"SNumStart\">\n <xsl:with-param name=\"sToParse\" select=\"$sToParse\" />\n <xsl:with-param name=\"sPattern\" select=\"substring($sPattern, 2)\" />\n </xsl:call-template>\n </xsl:when>\n\n <!-- the pattern says we've run out of numbers. Take as many\n\t\t\t\tcharacters from sToParse as we shaved off sPattern -->\n <xsl:otherwise>\n <xsl:value-of select=\"substring($sToParse, 1, string-length($sToParse) - string-length($sPattern))\" />\n </xsl:otherwise>\n </xsl:choose>\n </xsl:template>\n\n <!-- %%Template SRepeatCharAcc\n\n\t\t\tThe core of SRepeatChar with an accumulator. The current\n\t\t\tstring is in param $acc, and we will double and recurse,\n\t\t\tif we're less than half of the required length or else just\n\t\t\tadd the right amount of characters to the accumulator and\n\t\t\treturn\n\t-->\n <xsl:template name=\"SRepeatCharAcc\">\n <xsl:param name=\"cchRequired\" select=\"1\" />\n <xsl:param name=\"ch\" select=\"'-'\" />\n <xsl:param name=\"acc\" select=\"$ch\" />\n\n <xsl:variable name=\"cchAcc\" select=\"string-length($acc)\" />\n <xsl:choose>\n <xsl:when test=\"(2 * $cchAcc) < $cchRequired\">\n <xsl:call-template name=\"SRepeatCharAcc\">\n <xsl:with-param name=\"cchRequired\" select=\"$cchRequired\" />\n <xsl:with-param name=\"ch\" select=\"$ch\" />\n <xsl:with-param name=\"acc\" select=\"concat($acc, $acc)\" />\n </xsl:call-template>\n </xsl:when>\n\n <xsl:otherwise>\n <xsl:value-of select=\"concat($acc, substring($acc, 1, $cchRequired - $cchAcc))\" />\n </xsl:otherwise>\n </xsl:choose>\n </xsl:template>\n\n\n <!-- %%Template SRepeatChar\n\n\t\t\tGenerates a string nchRequired long by repeating the given character ch\n\t-->\n <xsl:template name=\"SRepeatChar\">\n <xsl:param name=\"cchRequired\" select=\"1\" />\n <xsl:param name=\"ch\" select=\"'-'\" />\n\n <xsl:call-template name=\"SRepeatCharAcc\">\n <xsl:with-param name=\"cchRequired\" select=\"$cchRequired\" />\n <xsl:with-param name=\"ch\" select=\"$ch\" />\n <xsl:with-param name=\"acc\" select=\"$ch\" />\n </xsl:call-template>\n </xsl:template>\n\n <!-- %%Template SReplaceOperWithMinus\n\n\t\tGo through the given string and replace every instance\n\t\tof an operator with a minus '-'. This helps quickly identify\n\t\tthe first instance of an operator.\n\t-->\n <xsl:template name=\"SReplaceOperWithMinus\">\n <xsl:param name=\"sToParse\" select=\"''\" />\n\n <xsl:value-of select=\"translate($sToParse, $sOperators, $sMinuses)\" />\n </xsl:template>\n\n <!-- %%Template SReplaceNumWithZero\n\n\t\tGo through the given string and replace every instance\n\t\tof an number with a zero '0'. This helps quickly identify\n\t\tthe first occurence of a number.\n\n\t\tConsiders the '.' and ',' part of a number iff they are sandwiched\n\t\tbetween two other numbers. 0.3 will be recognized as a number,\n\t\tx.3 will not be. Since these characters can also be an operator, this\n\t\tshould be called before SReplaceOperWithMinus.\n\t-->\n <xsl:template name=\"SReplaceNumWithZero\">\n <xsl:param name=\"sToParse\" select=\"''\" />\n\n <!-- First do a simple replace. Numbers will all be come 0's.\n\t\t\tAfter this point, the pattern involving the . or , that\n\t\t\twe are looking for will become 0.0 or 0,0 -->\n <xsl:variable name=\"sSimpleReplace\" select=\"translate($sToParse, $sNumbers, $sZeros)\" />\n\n <!-- And then, replace 0.0 with just 000. This means that the . will\n\t\t\tbecome part of the number -->\n <xsl:variable name=\"sReplacePeriod\">\n <xsl:call-template name=\"SReplace\">\n <xsl:with-param name=\"sInput\" select=\"$sSimpleReplace\" />\n <xsl:with-param name=\"sOrig\" select=\"'0.0'\" />\n <xsl:with-param name=\"sReplacement\" select=\"'000'\" />\n </xsl:call-template>\n </xsl:variable>\n\n <!-- And then, replace 0,0 with just 000. This means that the , will\n\t\t\tbecome part of the number -->\n <xsl:call-template name=\"SReplace\">\n <xsl:with-param name=\"sInput\" select=\"$sReplacePeriod\" />\n <xsl:with-param name=\"sOrig\" select=\"'0,0'\" />\n <xsl:with-param name=\"sReplacement\" select=\"'000'\" />\n </xsl:call-template>\n </xsl:template>\n\n <!-- Template to translate Word's borderBox properties into the menclose notation attribute\n The initial call to this SHOULD NOT pass an sAttribute. Subsequent calls to\n CreateMencloseNotationAttrFromBorderBoxAttr by CreateMencloseNotationAttrFromBorderBoxAttr will\n update the sAttribute as appropriate.\n\n CreateMencloseNotationAttrFromBorderBoxAttr looks at each attribute (fHideTop, fHideBot, etc.) one at a time\n in the order they are listed and passes a modified sAttribute to CreateMencloseNotationAttrFromBorderBoxAttr.\n Each successive call to CreateMencloseNotationAttrFromBorderBoxAttr knows which attribute to look at because\n the previous call should have omitted passing the attribute it just analyzed. This is why as you read lower\n and lower in the template that each call to CreateMencloseNotationAttrFromBorderBoxAttr has fewer and fewer attributes.\n -->\n <xsl:template name=\"CreateMencloseNotationAttrFromBorderBoxAttr\">\n <xsl:param name=\"fHideTop\" />\n <xsl:param name=\"fHideBot\" />\n <xsl:param name=\"fHideLeft\" />\n <xsl:param name=\"fHideRight\" />\n <xsl:param name=\"fStrikeH\" />\n <xsl:param name=\"fStrikeV\" />\n <xsl:param name=\"fStrikeBLTR\" />\n <xsl:param name=\"fStrikeTLBR\" />\n <xsl:param name=\"sAttribute\" />\n\n <xsl:choose>\n <xsl:when test=\"string-length($sAttribute) = 0\">\n <xsl:choose>\n <xsl:when test=\"string-length($fHideTop) > 0\n and string-length($fHideBot) > 0\n and string-length($fHideLeft) > 0\n and string-length($fHideRight) > 0\">\n\n <xsl:choose>\n <xsl:when test=\"$fHideTop = 0\n and $fHideBot = 0\n and $fHideLeft = 0\n and $fHideRight = 0\">\n <!-- We can use 'box' instead of top, bot, left, and right. Therefore,\n replace sAttribute with 'box' and begin analyzing params fStrikeH\n and below. -->\n <xsl:call-template name=\"CreateMencloseNotationAttrFromBorderBoxAttr\">\n <xsl:with-param name=\"fStrikeH\" select=\"$fStrikeH\" />\n <xsl:with-param name=\"fStrikeV\" select=\"$fStrikeV\" />\n <xsl:with-param name=\"fStrikeBLTR\" select=\"$fStrikeBLTR\" />\n <xsl:with-param name=\"fStrikeTLBR\" select=\"$fStrikeTLBR\" />\n <xsl:with-param name=\"sAttribute\">\n <xsl:text>box</xsl:text>\n </xsl:with-param>\n </xsl:call-template>\n </xsl:when>\n <xsl:otherwise>\n <!-- Can't use 'box', theremore, must analyze all attributes -->\n <xsl:call-template name=\"CreateMencloseNotationAttrFromBorderBoxAttr\">\n <xsl:with-param name=\"fHideTop\" select=\"$fHideTop\" />\n <xsl:with-param name=\"fHideBot\" select=\"$fHideBot\" />\n <xsl:with-param name=\"fHideLeft\" select=\"$fHideLeft\" />\n <xsl:with-param name=\"fHideRight\" select=\"$fHideRight\" />\n <xsl:with-param name=\"fStrikeH\" select=\"$fStrikeH\" />\n <xsl:with-param name=\"fStrikeV\" select=\"$fStrikeV\" />\n <xsl:with-param name=\"fStrikeBLTR\" select=\"$fStrikeBLTR\" />\n <xsl:with-param name=\"fStrikeTLBR\" select=\"$fStrikeTLBR\" />\n <xsl:with-param name=\"sAttribute\">\n <!-- Assume using all four (left right top bottom). Subsequent calls\n will remove the sides which aren't to be includes. -->\n <xsl:text>left right top bottom</xsl:text>\n </xsl:with-param>\n </xsl:call-template>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:when>\n </xsl:choose>\n </xsl:when>\n <xsl:otherwise>\n <xsl:choose>\n <xsl:when test=\"string-length($fHideTop) > 0\">\n <xsl:choose>\n <xsl:when test=\"$fHideTop=1\">\n <xsl:call-template name=\"CreateMencloseNotationAttrFromBorderBoxAttr\">\n <xsl:with-param name=\"fHideBot\" select=\"$fHideBot\" />\n <xsl:with-param name=\"fHideLeft\" select=\"$fHideLeft\" />\n <xsl:with-param name=\"fHideRight\" select=\"$fHideRight\" />\n <xsl:with-param name=\"fStrikeH\" select=\"$fStrikeH\" />\n <xsl:with-param name=\"fStrikeV\" select=\"$fStrikeV\" />\n <xsl:with-param name=\"fStrikeBLTR\" select=\"$fStrikeBLTR\" />\n <xsl:with-param name=\"fStrikeTLBR\" select=\"$fStrikeTLBR\" />\n <xsl:with-param name=\"sAttribute\">\n <xsl:call-template name=\"SReplace\">\n <xsl:with-param name=\"sInput\" select=\"$sAttribute\" />\n <xsl:with-param name=\"sOrig\" select=\"'top'\" />\n <xsl:with-param name=\"sReplacement\" select=\"''\" />\n </xsl:call-template>\n </xsl:with-param>\n </xsl:call-template>\n </xsl:when>\n <xsl:otherwise>\n <xsl:call-template name=\"CreateMencloseNotationAttrFromBorderBoxAttr\">\n <xsl:with-param name=\"fHideBot\" select=\"$fHideBot\" />\n <xsl:with-param name=\"fHideLeft\" select=\"$fHideLeft\" />\n <xsl:with-param name=\"fHideRight\" select=\"$fHideRight\" />\n <xsl:with-param name=\"fStrikeH\" select=\"$fStrikeH\" />\n <xsl:with-param name=\"fStrikeV\" select=\"$fStrikeV\" />\n <xsl:with-param name=\"fStrikeBLTR\" select=\"$fStrikeBLTR\" />\n <xsl:with-param name=\"fStrikeTLBR\" select=\"$fStrikeTLBR\" />\n <xsl:with-param name=\"sAttribute\" select=\"$sAttribute\" />\n </xsl:call-template>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:when>\n <xsl:when test=\"string-length($fHideBot) > 0\">\n <xsl:choose>\n <xsl:when test=\"$fHideBot=1\">\n <xsl:call-template name=\"CreateMencloseNotationAttrFromBorderBoxAttr\">\n <xsl:with-param name=\"fHideLeft\" select=\"$fHideLeft\" />\n <xsl:with-param name=\"fHideRight\" select=\"$fHideRight\" />\n <xsl:with-param name=\"fStrikeH\" select=\"$fStrikeH\" />\n <xsl:with-param name=\"fStrikeV\" select=\"$fStrikeV\" />\n <xsl:with-param name=\"fStrikeBLTR\" select=\"$fStrikeBLTR\" />\n <xsl:with-param name=\"fStrikeTLBR\" select=\"$fStrikeTLBR\" />\n <xsl:with-param name=\"sAttribute\">\n <xsl:call-template name=\"SReplace\">\n <xsl:with-param name=\"sInput\" select=\"$sAttribute\" />\n <xsl:with-param name=\"sOrig\" select=\"'bottom'\" />\n <xsl:with-param name=\"sReplacement\" select=\"''\" />\n </xsl:call-template>\n </xsl:with-param>\n </xsl:call-template>\n </xsl:when>\n <xsl:otherwise>\n <xsl:call-template name=\"CreateMencloseNotationAttrFromBorderBoxAttr\">\n <xsl:with-param name=\"fHideLeft\" select=\"$fHideLeft\" />\n <xsl:with-param name=\"fHideRight\" select=\"$fHideRight\" />\n <xsl:with-param name=\"fStrikeH\" select=\"$fStrikeH\" />\n <xsl:with-param name=\"fStrikeV\" select=\"$fStrikeV\" />\n <xsl:with-param name=\"fStrikeBLTR\" select=\"$fStrikeBLTR\" />\n <xsl:with-param name=\"fStrikeTLBR\" select=\"$fStrikeTLBR\" />\n <xsl:with-param name=\"sAttribute\" select=\"$sAttribute\" />\n </xsl:call-template>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:when>\n <xsl:when test=\"string-length($fHideLeft) > 0\">\n <xsl:choose>\n <xsl:when test=\"$fHideLeft=1\">\n <xsl:call-template name=\"CreateMencloseNotationAttrFromBorderBoxAttr\">\n <xsl:with-param name=\"fHideRight\" select=\"$fHideRight\" />\n <xsl:with-param name=\"fStrikeH\" select=\"$fStrikeH\" />\n <xsl:with-param name=\"fStrikeV\" select=\"$fStrikeV\" />\n <xsl:with-param name=\"fStrikeBLTR\" select=\"$fStrikeBLTR\" />\n <xsl:with-param name=\"fStrikeTLBR\" select=\"$fStrikeTLBR\" />\n <xsl:with-param name=\"sAttribute\">\n <xsl:call-template name=\"SReplace\">\n <xsl:with-param name=\"sInput\" select=\"$sAttribute\" />\n <xsl:with-param name=\"sOrig\" select=\"'left'\" />\n <xsl:with-param name=\"sReplacement\" select=\"''\" />\n </xsl:call-template>\n </xsl:with-param>\n </xsl:call-template>\n </xsl:when>\n <xsl:otherwise>\n <xsl:call-template name=\"CreateMencloseNotationAttrFromBorderBoxAttr\">\n <xsl:with-param name=\"fHideRight\" select=\"$fHideRight\" />\n <xsl:with-param name=\"fStrikeH\" select=\"$fStrikeH\" />\n <xsl:with-param name=\"fStrikeV\" select=\"$fStrikeV\" />\n <xsl:with-param name=\"fStrikeBLTR\" select=\"$fStrikeBLTR\" />\n <xsl:with-param name=\"fStrikeTLBR\" select=\"$fStrikeTLBR\" />\n <xsl:with-param name=\"sAttribute\" select=\"$sAttribute\" />\n </xsl:call-template>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:when>\n <xsl:when test=\"string-length($fHideRight) > 0\">\n <xsl:choose>\n <xsl:when test=\"$fHideRight=1\">\n <xsl:call-template name=\"CreateMencloseNotationAttrFromBorderBoxAttr\">\n <xsl:with-param name=\"fStrikeH\" select=\"$fStrikeH\" />\n <xsl:with-param name=\"fStrikeV\" select=\"$fStrikeV\" />\n <xsl:with-param name=\"fStrikeBLTR\" select=\"$fStrikeBLTR\" />\n <xsl:with-param name=\"fStrikeTLBR\" select=\"$fStrikeTLBR\" />\n <xsl:with-param name=\"sAttribute\">\n <xsl:call-template name=\"SReplace\">\n <xsl:with-param name=\"sInput\" select=\"$sAttribute\" />\n <xsl:with-param name=\"sOrig\" select=\"'right'\" />\n <xsl:with-param name=\"sReplacement\" select=\"''\" />\n </xsl:call-template>\n </xsl:with-param>\n </xsl:call-template>\n </xsl:when>\n <xsl:otherwise>\n <xsl:call-template name=\"CreateMencloseNotationAttrFromBorderBoxAttr\">\n <xsl:with-param name=\"fStrikeH\" select=\"$fStrikeH\" />\n <xsl:with-param name=\"fStrikeV\" select=\"$fStrikeV\" />\n <xsl:with-param name=\"fStrikeBLTR\" select=\"$fStrikeBLTR\" />\n <xsl:with-param name=\"fStrikeTLBR\" select=\"$fStrikeTLBR\" />\n <xsl:with-param name=\"sAttribute\" select=\"$sAttribute\" />\n </xsl:call-template>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:when>\n <xsl:when test=\"string-length($fStrikeH) > 0\">\n <xsl:choose>\n <xsl:when test=\"$fStrikeH=1\">\n <xsl:call-template name=\"CreateMencloseNotationAttrFromBorderBoxAttr\">\n <xsl:with-param name=\"fStrikeV\" select=\"$fStrikeV\" />\n <xsl:with-param name=\"fStrikeBLTR\" select=\"$fStrikeBLTR\" />\n <xsl:with-param name=\"fStrikeTLBR\" select=\"$fStrikeTLBR\" />\n <xsl:with-param name=\"sAttribute\" select=\"concat($sAttribute, ' horizontalstrike')\" />\n </xsl:call-template>\n </xsl:when>\n <xsl:otherwise>\n <xsl:call-template name=\"CreateMencloseNotationAttrFromBorderBoxAttr\">\n <xsl:with-param name=\"fStrikeV\" select=\"$fStrikeV\" />\n <xsl:with-param name=\"fStrikeBLTR\" select=\"$fStrikeBLTR\" />\n <xsl:with-param name=\"fStrikeTLBR\" select=\"$fStrikeTLBR\" />\n <xsl:with-param name=\"sAttribute\" select=\"$sAttribute\" />\n </xsl:call-template>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:when>\n <xsl:when test=\"string-length($fStrikeV) > 0\">\n <xsl:choose>\n <xsl:when test=\"$fStrikeV=1\">\n <xsl:call-template name=\"CreateMencloseNotationAttrFromBorderBoxAttr\">\n <xsl:with-param name=\"fStrikeBLTR\" select=\"$fStrikeBLTR\" />\n <xsl:with-param name=\"fStrikeTLBR\" select=\"$fStrikeTLBR\" />\n <xsl:with-param name=\"sAttribute\" select=\"concat($sAttribute, ' verticalstrike')\" />\n </xsl:call-template>\n </xsl:when>\n <xsl:otherwise>\n <xsl:call-template name=\"CreateMencloseNotationAttrFromBorderBoxAttr\">\n <xsl:with-param name=\"fStrikeBLTR\" select=\"$fStrikeBLTR\" />\n <xsl:with-param name=\"fStrikeTLBR\" select=\"$fStrikeTLBR\" />\n <xsl:with-param name=\"sAttribute\" select=\"$sAttribute\" />\n </xsl:call-template>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:when>\n <xsl:when test=\"string-length($fStrikeBLTR) > 0\">\n <xsl:choose>\n <xsl:when test=\"$fStrikeBLTR=1\">\n <xsl:call-template name=\"CreateMencloseNotationAttrFromBorderBoxAttr\">\n <xsl:with-param name=\"fStrikeTLBR\" select=\"$fStrikeTLBR\" />\n <xsl:with-param name=\"sAttribute\" select=\"concat($sAttribute, ' updiagonalstrike')\" />\n </xsl:call-template>\n </xsl:when>\n <xsl:otherwise>\n <xsl:call-template name=\"CreateMencloseNotationAttrFromBorderBoxAttr\">\n <xsl:with-param name=\"fStrikeTLBR\" select=\"$fStrikeTLBR\" />\n <xsl:with-param name=\"sAttribute\" select=\"$sAttribute\" />\n </xsl:call-template>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:when>\n <xsl:when test=\"string-length($fStrikeTLBR) > 0\">\n <xsl:choose>\n <xsl:when test=\"$fStrikeTLBR=1\">\n <xsl:call-template name=\"CreateMencloseNotationAttrFromBorderBoxAttr\">\n <xsl:with-param name=\"sAttribute\" select=\"concat($sAttribute, ' downdiagonalstrike')\" />\n </xsl:call-template>\n </xsl:when>\n <xsl:otherwise>\n <xsl:call-template name=\"CreateMencloseNotationAttrFromBorderBoxAttr\">\n <xsl:with-param name=\"sAttribute\" select=\"$sAttribute\" />\n </xsl:call-template>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:when>\n <xsl:otherwise>\n <xsl:attribute name=\"notation\">\n <xsl:value-of select=\"normalize-space($sAttribute)\" />\n </xsl:attribute>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:otherwise>\n </xsl:choose>\n </xsl:template>\n\n <!-- Tristate (true, false, neither) from string value -->\n <xsl:template name=\"TFromStrVal\">\n <xsl:param name=\"str\" />\n <xsl:choose>\n <xsl:when test=\"$str = 'on' or $str = '1' or $str = 'true'\">1</xsl:when>\n <xsl:when test=\"$str = 'off' or $str = '0' or $str = 'false'\">0</xsl:when>\n <xsl:otherwise>-1</xsl:otherwise>\n </xsl:choose>\n </xsl:template>\n\n <!-- Return 0 iff $str is explicitly set to a false value.\n Return true otherwise -->\n <xsl:template name=\"ForceFalseStrVal\">\n <xsl:param name=\"str\" />\n <xsl:variable name=\"tValue\">\n <xsl:call-template name=\"TFromStrVal\">\n <xsl:with-param name=\"str\" select=\"$str\"/>\n </xsl:call-template>\n </xsl:variable>\n <xsl:choose>\n <xsl:when test=\"$tValue = '0'\">0</xsl:when>\n <xsl:otherwise>1</xsl:otherwise>\n </xsl:choose>\n </xsl:template>\n\n <!-- Return 1 iff $str is explicitly set to a true value.\n Return false otherwise -->\n <xsl:template name=\"ForceTrueStrVal\">\n <xsl:param name=\"str\" />\n <xsl:variable name=\"tValue\">\n <xsl:call-template name=\"TFromStrVal\">\n <xsl:with-param name=\"str\" select=\"$str\"/>\n </xsl:call-template>\n </xsl:variable>\n <xsl:choose>\n <xsl:when test=\"$tValue = '1'\">1</xsl:when>\n <xsl:otherwise>0</xsl:otherwise>\n </xsl:choose>\n </xsl:template>\n</xsl:stylesheet>\n".trim());
|
|
7
|
+
|
|
8
|
+
export { xsl };
|
package/esm/openxml/word/Body.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { __values } from '
|
|
1
|
+
import { __values } from 'tslib';
|
|
2
|
+
import { mergeSdt } from '../../parse/mergeSdt.js';
|
|
3
|
+
import { parseTable } from '../../parse/parseTable.js';
|
|
2
4
|
import { Paragraph } from './Paragraph.js';
|
|
3
5
|
import { Section } from './Section.js';
|
|
4
|
-
import { Table } from './Table.js';
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* body 类型定义
|
|
@@ -30,7 +31,7 @@ var Body = /** @class */ (function () {
|
|
|
30
31
|
var e_1, _a;
|
|
31
32
|
var body = new Body();
|
|
32
33
|
try {
|
|
33
|
-
for (var _b = __values(element
|
|
34
|
+
for (var _b = __values(mergeSdt(element)), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
34
35
|
var child = _c.value;
|
|
35
36
|
var tagName = child.tagName;
|
|
36
37
|
switch (tagName) {
|
|
@@ -38,15 +39,16 @@ var Body = /** @class */ (function () {
|
|
|
38
39
|
var paragraph = Paragraph.fromXML(word, child);
|
|
39
40
|
body.addChild(paragraph);
|
|
40
41
|
break;
|
|
41
|
-
case 'w:sectPr':
|
|
42
|
-
body.addSection(Section.parsePr(child));
|
|
43
|
-
break;
|
|
44
42
|
case 'w:tbl':
|
|
45
|
-
var table =
|
|
43
|
+
var table = parseTable(word, child);
|
|
46
44
|
body.addChild(table);
|
|
47
45
|
break;
|
|
46
|
+
case 'w:bookmarkStart':
|
|
48
47
|
case 'w:bookmarkEnd':
|
|
49
48
|
break;
|
|
49
|
+
case 'w:sectPr':
|
|
50
|
+
body.addSection(Section.parsePr(word, child, body));
|
|
51
|
+
break;
|
|
50
52
|
default:
|
|
51
53
|
console.warn('Body.fromXML Unknown key', tagName, child);
|
|
52
54
|
}
|
|
@@ -59,6 +61,8 @@ var Body = /** @class */ (function () {
|
|
|
59
61
|
}
|
|
60
62
|
finally { if (e_1) throw e_1.error; }
|
|
61
63
|
}
|
|
64
|
+
// 过滤掉没内容的 section,一般是最后一个
|
|
65
|
+
body.sections = body.sections.filter(function (section) { return section.children.length > 0; });
|
|
62
66
|
return body;
|
|
63
67
|
};
|
|
64
68
|
return Body;
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { ST_BrType } from '../Types.js';
|
|
2
|
-
|
|
3
1
|
/**
|
|
4
2
|
* http://webapp.docx4java.org/OnlineDemo/ecma376/WordML/br.html
|
|
5
3
|
*/
|
|
@@ -8,7 +6,7 @@ var Break = /** @class */ (function () {
|
|
|
8
6
|
/**
|
|
9
7
|
* 目前也只支持这种
|
|
10
8
|
*/
|
|
11
|
-
this.type =
|
|
9
|
+
this.type = 'textWrapping';
|
|
12
10
|
}
|
|
13
11
|
Break.fromXML = function (word, element) {
|
|
14
12
|
return new Break();
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 内嵌字体
|
|
3
|
+
* http://webapp.docx4java.org/OnlineDemo/ecma376/WordML/Font%20Embedding.html
|
|
4
|
+
*/
|
|
5
|
+
import Word from '../../Word';
|
|
6
|
+
/**
|
|
7
|
+
* 这是来自 docxjs 里的代码,参考了规范 17.8.1 里的算法
|
|
8
|
+
*/
|
|
9
|
+
export declare function deobfuscate(data: Uint8Array, guidKey: string): Uint8Array;
|
|
10
|
+
export declare class Font {
|
|
11
|
+
name: string;
|
|
12
|
+
family: string;
|
|
13
|
+
altName?: string;
|
|
14
|
+
url?: string;
|
|
15
|
+
static fromXML(word: Word, element: Element): Font;
|
|
16
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { __values } from 'tslib';
|
|
2
|
+
import { getVal } from '../../OpenXML.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 内嵌字体
|
|
6
|
+
* http://webapp.docx4java.org/OnlineDemo/ecma376/WordML/Font%20Embedding.html
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* 这是来自 docxjs 里的代码,参考了规范 17.8.1 里的算法
|
|
10
|
+
*/
|
|
11
|
+
function deobfuscate(data, guidKey) {
|
|
12
|
+
var len = 16;
|
|
13
|
+
var trimmed = guidKey.replace(/{|}|-/g, '');
|
|
14
|
+
var numbers = new Array(len);
|
|
15
|
+
for (var i = 0; i < len; i++)
|
|
16
|
+
numbers[len - i - 1] = parseInt(trimmed.substr(i * 2, 2), 16);
|
|
17
|
+
for (var i = 0; i < 32; i++)
|
|
18
|
+
data[i] = data[i] ^ numbers[i % len];
|
|
19
|
+
return data;
|
|
20
|
+
}
|
|
21
|
+
var Font = /** @class */ (function () {
|
|
22
|
+
function Font() {
|
|
23
|
+
}
|
|
24
|
+
Font.fromXML = function (word, element) {
|
|
25
|
+
var e_1, _a;
|
|
26
|
+
var font = new Font();
|
|
27
|
+
font.name = element.getAttribute('w:name') || '';
|
|
28
|
+
try {
|
|
29
|
+
for (var _b = __values(element.children), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
30
|
+
var child = _c.value;
|
|
31
|
+
var tagName = child.tagName;
|
|
32
|
+
switch (tagName) {
|
|
33
|
+
case 'w:family':
|
|
34
|
+
font.family = getVal(child);
|
|
35
|
+
break;
|
|
36
|
+
case 'w:altName':
|
|
37
|
+
font.altName = getVal(child);
|
|
38
|
+
break;
|
|
39
|
+
case 'w:panose1':
|
|
40
|
+
// 不知道是啥
|
|
41
|
+
// http://webapp.docx4java.org/OnlineDemo/ecma376/WordML/panose1.html
|
|
42
|
+
break;
|
|
43
|
+
case 'w:charset':
|
|
44
|
+
case 'w:sig':
|
|
45
|
+
case 'w:pitch':
|
|
46
|
+
// 用不上
|
|
47
|
+
break;
|
|
48
|
+
case 'w:embedRegular':
|
|
49
|
+
case 'w:embedBold':
|
|
50
|
+
case 'w:embedItalic':
|
|
51
|
+
case 'w:embedBoldItalic':
|
|
52
|
+
case 'w:embedSystemFonts':
|
|
53
|
+
case 'w:embedTrueTypeFonts':
|
|
54
|
+
var id = child.getAttribute('r:id') || '';
|
|
55
|
+
var fontKey = child.getAttribute('w:fontKey') || '';
|
|
56
|
+
var fontURL = word.loadFont(id, fontKey);
|
|
57
|
+
if (fontURL) {
|
|
58
|
+
font.url = fontURL;
|
|
59
|
+
}
|
|
60
|
+
break;
|
|
61
|
+
default:
|
|
62
|
+
console.warn('parse Font: Unknown key', tagName, child);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
67
|
+
finally {
|
|
68
|
+
try {
|
|
69
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
70
|
+
}
|
|
71
|
+
finally { if (e_1) throw e_1.error; }
|
|
72
|
+
}
|
|
73
|
+
return font;
|
|
74
|
+
};
|
|
75
|
+
return Font;
|
|
76
|
+
}());
|
|
77
|
+
|
|
78
|
+
export { Font, deobfuscate };
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { __values } from 'tslib';
|
|
2
|
+
import { Font } from './Font.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 解析和渲染字体
|
|
6
|
+
*/
|
|
7
|
+
var FontTable = /** @class */ (function () {
|
|
8
|
+
function FontTable() {
|
|
9
|
+
this.fonts = [];
|
|
10
|
+
}
|
|
11
|
+
FontTable.fromXML = function (word, doc) {
|
|
12
|
+
var e_1, _a;
|
|
13
|
+
var fonts = Array.from(doc.getElementsByTagName('w:font'));
|
|
14
|
+
var fontTable = new FontTable();
|
|
15
|
+
try {
|
|
16
|
+
for (var fonts_1 = __values(fonts), fonts_1_1 = fonts_1.next(); !fonts_1_1.done; fonts_1_1 = fonts_1.next()) {
|
|
17
|
+
var child = fonts_1_1.value;
|
|
18
|
+
var font = Font.fromXML(word, child);
|
|
19
|
+
fontTable.fonts.push(font);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
23
|
+
finally {
|
|
24
|
+
try {
|
|
25
|
+
if (fonts_1_1 && !fonts_1_1.done && (_a = fonts_1.return)) _a.call(fonts_1);
|
|
26
|
+
}
|
|
27
|
+
finally { if (e_1) throw e_1.error; }
|
|
28
|
+
}
|
|
29
|
+
return fontTable;
|
|
30
|
+
};
|
|
31
|
+
return FontTable;
|
|
32
|
+
}());
|
|
33
|
+
|
|
34
|
+
export { FontTable };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* header 的定义,footer 也是用这个,因为结构是一样的
|
|
3
|
+
*/
|
|
4
|
+
import Word from '../../Word';
|
|
5
|
+
import { Paragraph } from './Paragraph';
|
|
6
|
+
import { Table } from './Table';
|
|
7
|
+
export type HeaderChild = Paragraph | Table;
|
|
8
|
+
export declare class Header {
|
|
9
|
+
children: HeaderChild[];
|
|
10
|
+
static fromXML(word: Word, doc: Document): Header;
|
|
11
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { __values } from 'tslib';
|
|
2
|
+
import { mergeSdt } from '../../parse/mergeSdt.js';
|
|
3
|
+
import { parseTable } from '../../parse/parseTable.js';
|
|
4
|
+
import { Paragraph } from './Paragraph.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* header 的定义,footer 也是用这个,因为结构是一样的
|
|
8
|
+
*/
|
|
9
|
+
var Header = /** @class */ (function () {
|
|
10
|
+
function Header() {
|
|
11
|
+
this.children = [];
|
|
12
|
+
}
|
|
13
|
+
Header.fromXML = function (word, doc) {
|
|
14
|
+
var e_1, _a;
|
|
15
|
+
var footer = new Header();
|
|
16
|
+
var children = [];
|
|
17
|
+
footer.children = children;
|
|
18
|
+
var elm = doc;
|
|
19
|
+
var firstChild = doc.firstElementChild;
|
|
20
|
+
if (firstChild &&
|
|
21
|
+
(firstChild.tagName === 'w:hdr' || firstChild.tagName === 'w:ftr')) {
|
|
22
|
+
elm = firstChild;
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
for (var _b = __values(mergeSdt(elm)), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
26
|
+
var child = _c.value;
|
|
27
|
+
var tagName = child.tagName;
|
|
28
|
+
switch (tagName) {
|
|
29
|
+
case 'w:p':
|
|
30
|
+
var paragraph = Paragraph.fromXML(word, child);
|
|
31
|
+
children.push(paragraph);
|
|
32
|
+
break;
|
|
33
|
+
case 'w:tbl':
|
|
34
|
+
var table = parseTable(word, child);
|
|
35
|
+
children.push(table);
|
|
36
|
+
break;
|
|
37
|
+
default:
|
|
38
|
+
console.warn('Header.fromXML Unknown key', tagName, child);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
43
|
+
finally {
|
|
44
|
+
try {
|
|
45
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
46
|
+
}
|
|
47
|
+
finally { if (e_1) throw e_1.error; }
|
|
48
|
+
}
|
|
49
|
+
return footer;
|
|
50
|
+
};
|
|
51
|
+
return Header;
|
|
52
|
+
}());
|
|
53
|
+
|
|
54
|
+
export { Header };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __values } from '
|
|
1
|
+
import { __values } from 'tslib';
|
|
2
2
|
import { Run } from './Run.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
@@ -16,15 +16,19 @@ var Hyperlink = /** @class */ (function () {
|
|
|
16
16
|
var hyperlink = new Hyperlink();
|
|
17
17
|
var rId = element.getAttribute('r:id');
|
|
18
18
|
if (rId) {
|
|
19
|
-
var rel = word.
|
|
19
|
+
var rel = word.getDocumentRels(rId);
|
|
20
20
|
if (rel) {
|
|
21
21
|
hyperlink.relation = rel;
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
|
-
var anchor = element.getAttribute('anchor');
|
|
24
|
+
var anchor = element.getAttribute('w:anchor');
|
|
25
25
|
if (anchor) {
|
|
26
26
|
hyperlink.anchor = anchor;
|
|
27
27
|
}
|
|
28
|
+
var tooltip = element.getAttribute('w:tooltip');
|
|
29
|
+
if (tooltip) {
|
|
30
|
+
hyperlink.tooltip = tooltip;
|
|
31
|
+
}
|
|
28
32
|
try {
|
|
29
33
|
for (var _b = __values(element.children), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
30
34
|
var child = _c.value;
|