Changeset 202960 in webkit


Ignore:
Timestamp:
Jul 7, 2016 10:40:20 PM (8 years ago)
Author:
fred.wang@free.fr
Message:

Implement an internal style property for displaystyle.
https://bugs.webkit.org/show_bug.cgi?id=133845

Patch by Frederic Wang <fwang@igalia.com> on 2016-07-07
Reviewed by Brent Fulgham.

Source/WebCore:

Tests: mathml/opentype/large-operators-displaystyle-dynamic.html

mathml/opentype/large-operators-displaystyle.html

This is based on a patch by Alejandro G. Castro <alex@igalia.com>

  • CMakeLists.txt: Add MathMLStyle to the build system.
  • WebCore.xcodeproj/project.pbxproj: ditto.
  • mathml/MathMLInlineContainerElement.cpp:

(WebCore::MathMLInlineContainerElement::parseAttribute): Resolve the mathml style when the
displaystyle attribute changes on the mtable or mstyle elements.

  • mathml/MathMLInlineContainerElement.h: Define parseAttribute.
  • mathml/MathMLMathElement.cpp:

(WebCore::MathMLMathElement::MathMLMathElement): Indicate that we have custom style.
(WebCore::MathMLMathElement::parseAttribute): Resolve the mathml style when the display or
displaystyle attributes change on the math element.
(WebCore::MathMLMathElement::didAttachRenderers): Resolve the mathml style when one
renderer is attached.

  • mathml/MathMLMathElement.h: Declare parseAttribute and didAttachRenderers.
  • mathml/mathattrs.in: Declare the display and displaystyle attributes.
  • rendering/mathml/MathMLStyle.cpp: Added.

(WebCore::MathMLStyle::MathMLStyle): New class to handle custom MathML style.
(WebCore::MathMLStyle::create):
(WebCore::MathMLStyle::setDisplayStyle): Helper function to take the displaystyle from
the specified rendered.
(WebCore::MathMLStyle::resolveMathMLStyleTree): Helper function to resolve the custom
MathML style in renderer subtree.
(WebCore::MathMLStyle::getMathMLParentNode): Helper function to get a MathML ancestor of
the specified renderer.
(WebCore::MathMLStyle::updateStyleIfNeeded): Helper function to update the style of the
specified renderer if needed.
(WebCore::MathMLStyle::resolveMathMLStyle): Resolve the MathML style of a given renderer.
For displaystyle, we inherit the value of the parent except for the cases mentioned in the
MathML recommendation.

  • rendering/mathml/MathMLStyle.h: New class header for custom MathML style.

Only displaystyle is supported for now.

  • rendering/mathml/RenderMathMLBlock.cpp: Add a member and getter for custom MathML style.

(WebCore::RenderMathMLBlock::RenderMathMLBlock):

  • rendering/mathml/RenderMathMLBlock.h: ditto.

(WebCore::RenderMathMLBlock::mathMLStyle):

  • rendering/mathml/RenderMathMLMath.h: Add definition to use the syntax is<RenderMathMLMath>.
  • rendering/mathml/RenderMathMLOperator.h:

(WebCore::RenderMathMLOperator::isLargeOperatorInDisplayStyle): Do not rerturn true when
the operator is not in displaystyle.

  • rendering/mathml/RenderMathMLRoot.h: Make updateStyle public, so that it can be called

by MathMLStyle::updateStyleIfNeeded.

  • rendering/mathml/RenderMathMLUnderOver.h: Add definition to use the syntax

is<RenderMathMLUnderOver>.

LayoutTests:

This is based on a patch by Alejandro G. Castro <alex@igalia.com>

Add two new tests to verify that the displaystyle property is correctly inherited
on various MathML elements.
large-operators-displaystyle verifies that large operators are only drawn bigger when
the displaystyle is true.
large-operators-displaystyle-dynamic verifies the same displaystyle is calculated when
the display and displaystyle attributes are changed dynamically.

  • mathml/opentype/large-operators-displaystyle-dynamic-expected.html: Added.
  • mathml/opentype/large-operators-displaystyle-dynamic.html: Added.
  • mathml/opentype/large-operators-displaystyle-expected.txt: Added.
  • imported/mathml-in-html5/fonts/math/largeop-displayoperatorminheight5000.woff: Added.
  • imported/mathml-in-html5/mathml/relations/css-styling/displaystyle-1.html: Added.
  • imported/mathml-in-html5/mathml/relations/css-styling/displaystyle-1-expected.txt: Added.
Location:
trunk
Files:
10 added
14 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r202959 r202960  
     12016-07-07  Frederic Wang  <fwang@igalia.com>
     2
     3        Implement an internal style property for displaystyle.
     4        https://bugs.webkit.org/show_bug.cgi?id=133845
     5
     6        Reviewed by Brent Fulgham.
     7
     8        This is based on a patch by Alejandro G. Castro <alex@igalia.com>
     9
     10        Add two new tests to verify that the displaystyle property is correctly inherited
     11        on various MathML elements.
     12        large-operators-displaystyle verifies that large operators are only drawn bigger when
     13        the displaystyle is true.
     14        large-operators-displaystyle-dynamic verifies the same displaystyle is calculated when
     15        the display and displaystyle attributes are changed dynamically.
     16
     17        * mathml/opentype/large-operators-displaystyle-dynamic-expected.html: Added.
     18        * mathml/opentype/large-operators-displaystyle-dynamic.html: Added.
     19        * mathml/opentype/large-operators-displaystyle-expected.txt: Added.
     20        * imported/mathml-in-html5/fonts/math/largeop-displayoperatorminheight5000.woff: Added.
     21        * imported/mathml-in-html5/mathml/relations/css-styling/displaystyle-1.html: Added.
     22        * imported/mathml-in-html5/mathml/relations/css-styling/displaystyle-1-expected.txt: Added.
     23
    1242016-07-07  Frederic Wang  <fwang@igalia.com>
    225
  • trunk/Source/WebCore/CMakeLists.txt

    r202937 r202960  
    25242524
    25252525    rendering/mathml/MathMLOperatorDictionary.cpp
     2526    rendering/mathml/MathMLStyle.cpp
    25262527    rendering/mathml/MathOperator.cpp
    25272528    rendering/mathml/RenderMathMLBlock.cpp
  • trunk/Source/WebCore/ChangeLog

    r202953 r202960  
     12016-07-07  Frederic Wang  <fwang@igalia.com>
     2
     3        Implement an internal style property for displaystyle.
     4        https://bugs.webkit.org/show_bug.cgi?id=133845
     5
     6        Reviewed by Brent Fulgham.
     7
     8        Tests: mathml/opentype/large-operators-displaystyle-dynamic.html
     9               mathml/opentype/large-operators-displaystyle.html
     10
     11        This is based on a patch by Alejandro G. Castro <alex@igalia.com>
     12
     13        * CMakeLists.txt: Add MathMLStyle to the build system.
     14        * WebCore.xcodeproj/project.pbxproj: ditto.
     15        * mathml/MathMLInlineContainerElement.cpp:
     16        (WebCore::MathMLInlineContainerElement::parseAttribute): Resolve the mathml style when the
     17        displaystyle attribute changes on the mtable or mstyle elements.
     18        * mathml/MathMLInlineContainerElement.h: Define parseAttribute.
     19        * mathml/MathMLMathElement.cpp:
     20        (WebCore::MathMLMathElement::MathMLMathElement): Indicate that we have custom style.
     21        (WebCore::MathMLMathElement::parseAttribute): Resolve the mathml style when the display or
     22        displaystyle attributes change on the math element.
     23        (WebCore::MathMLMathElement::didAttachRenderers): Resolve the mathml style when one
     24        renderer is attached.
     25        * mathml/MathMLMathElement.h: Declare parseAttribute and didAttachRenderers.
     26        * mathml/mathattrs.in: Declare the display and displaystyle attributes.
     27        * rendering/mathml/MathMLStyle.cpp: Added.
     28        (WebCore::MathMLStyle::MathMLStyle): New class to handle custom MathML style.
     29        (WebCore::MathMLStyle::create):
     30        (WebCore::MathMLStyle::setDisplayStyle): Helper function to take the displaystyle from
     31        the specified rendered.
     32        (WebCore::MathMLStyle::resolveMathMLStyleTree): Helper function to resolve the custom
     33        MathML style in renderer subtree.
     34        (WebCore::MathMLStyle::getMathMLParentNode): Helper function to get a MathML ancestor of
     35        the specified renderer.
     36        (WebCore::MathMLStyle::updateStyleIfNeeded): Helper function to update the style of the
     37        specified renderer if needed.
     38        (WebCore::MathMLStyle::resolveMathMLStyle): Resolve the MathML style of a given renderer.
     39        For displaystyle, we inherit the value of the parent except for the cases mentioned in the
     40        MathML recommendation.
     41        * rendering/mathml/MathMLStyle.h: New class header for custom MathML style.
     42        Only displaystyle is supported for now.
     43        * rendering/mathml/RenderMathMLBlock.cpp: Add a member and getter for custom MathML style.
     44        (WebCore::RenderMathMLBlock::RenderMathMLBlock):
     45        * rendering/mathml/RenderMathMLBlock.h: ditto.
     46        (WebCore::RenderMathMLBlock::mathMLStyle):
     47        * rendering/mathml/RenderMathMLMath.h: Add definition to use the syntax is<RenderMathMLMath>.
     48        * rendering/mathml/RenderMathMLOperator.h:
     49        (WebCore::RenderMathMLOperator::isLargeOperatorInDisplayStyle): Do not rerturn true when
     50        the operator is not in displaystyle.
     51        * rendering/mathml/RenderMathMLRoot.h: Make updateStyle public, so that it can be called
     52        by MathMLStyle::updateStyleIfNeeded.
     53        * rendering/mathml/RenderMathMLUnderOver.h: Add definition to use the syntax
     54        is<RenderMathMLUnderOver>.
     55
    1562016-07-07  Ryosuke Niwa  <rniwa@webkit.org>
    257
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r202944 r202960  
    16961696                439046DE12DA25E800AF80A2 /* RenderMathMLMath.h in Headers */ = {isa = PBXBuildFile; fileRef = 439046CA12DA25E800AF80A2 /* RenderMathMLMath.h */; };
    16971697                439046DF12DA25E17BAF80A2 /* MathMLOperatorDictionary.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 439046CB12DA25E17BAF80A2 /* MathMLOperatorDictionary.cpp */; };
     1698                439176DF12DA25E17BAF80A2 /* MathMLStyle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 439176CB12DA25E17BAF80A2 /* MathMLStyle.cpp */; };
    16981699                439046DF12DA25E800AF80A2 /* RenderMathMLOperator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 439046CB12DA25E800AF80A2 /* RenderMathMLOperator.cpp */; };
    16991700                439046E012DA25E17BAF80A2 /* MathMLOperatorDictionary.h in Headers */ = {isa = PBXBuildFile; fileRef = 439046CC12DA25E17BAF80A2 /* MathMLOperatorDictionary.h */; };
     1701                439176E012DA25E17BAF80A2 /* MathMLStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = 439176CC12DA25E17BAF80A2 /* MathMLStyle.h */; };
    17001702                439046E012DA25E800AF80A2 /* RenderMathMLOperator.h in Headers */ = {isa = PBXBuildFile; fileRef = 439046CC12DA25E800AF80A2 /* RenderMathMLOperator.h */; };
    17011703                439046E112DA25E800AF80A2 /* RenderMathMLRoot.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 439046CD12DA25E800AF80A2 /* RenderMathMLRoot.cpp */; };
     
    93089310                439046CA12DA25E800AF80A2 /* RenderMathMLMath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderMathMLMath.h; sourceTree = "<group>"; };
    93099311                439046CB12DA25E17BAF80A2 /* MathMLOperatorDictionary.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MathMLOperatorDictionary.cpp; sourceTree = "<group>"; };
     9312                439176CB12DA25E17BAF80A2 /* MathMLStyle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MathMLStyle.cpp; sourceTree = "<group>"; };
    93109313                439046CB12DA25E800AF80A2 /* RenderMathMLOperator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderMathMLOperator.cpp; sourceTree = "<group>"; };
    93119314                439046CC12DA25E17BAF80A2 /* MathMLOperatorDictionary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MathMLOperatorDictionary.h; sourceTree = "<group>"; };
     9315                439176CC12DA25E17BAF80A2 /* MathMLStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MathMLStyle.h; sourceTree = "<group>"; };
    93129316                439046CC12DA25E800AF80A2 /* RenderMathMLOperator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderMathMLOperator.h; sourceTree = "<group>"; };
    93139317                439046CD12DA25E800AF80A2 /* RenderMathMLRoot.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderMathMLRoot.cpp; sourceTree = "<group>"; };
     
    1711517119                                439046D512DA25E812AF80AC /* MathOperator.cpp */,
    1711617120                                439046D612DA25E812AF80AC /* MathOperator.h */,
     17121                                439176CB12DA25E17BAF80A2 /* MathMLStyle.cpp */,
     17122                                439176CC12DA25E17BAF80A2 /* MathMLStyle.h */,
    1711717123                                439046C312DA25E800AF80A2 /* RenderMathMLBlock.cpp */,
    1711817124                                439046C412DA25E800AF80A2 /* RenderMathMLBlock.h */,
     
    2742027426                                44A28AAF12DFB8BF00AE923B /* MathMLNames.h in Headers */,
    2742127427                                439046E012DA25E17BAF80A2 /* MathMLOperatorDictionary.h in Headers */,
     27428                                439176E012DA25E17BAF80A2 /* MathMLStyle.h in Headers */,
    2742227429                                FA654A6C1108ABED002615E0 /* MathMLTextElement.h in Headers */,
    2742327430                                439046EA12DA25E812AF80AC /* MathOperator.h in Headers */,
     
    3124531252                                FABE72FE1059C21100D999DD /* MathMLNames.cpp in Sources */,
    3124631253                                439046DF12DA25E17BAF80A2 /* MathMLOperatorDictionary.cpp in Sources */,
     31254                                439176DF12DA25E17BAF80A2 /* MathMLStyle.cpp in Sources */,
    3124731255                                FED48390CED66C3255F72C59 /* MathMLSelectElement.cpp in Sources */,
    3124831256                                FA654A6B1108ABED002615E0 /* MathMLTextElement.cpp in Sources */,
  • trunk/Source/WebCore/mathml/MathMLInlineContainerElement.cpp

    r202727 r202960  
    8484}
    8585
     86void MathMLInlineContainerElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
     87{
     88    if (name == displaystyleAttr && (hasTagName(mstyleTag) || hasTagName(mtableTag)) && renderer())
     89        MathMLStyle::resolveMathMLStyleTree(renderer());
     90
     91    MathMLElement::parseAttribute(name, value);
     92}
     93
    8694}
    8795
  • trunk/Source/WebCore/mathml/MathMLInlineContainerElement.h

    r202727 r202960  
    4242    MathMLInlineContainerElement(const QualifiedName& tagName, Document&);
    4343    void childrenChanged(const ChildChange&) override;
     44    void parseAttribute(const QualifiedName&, const AtomicString&) override;
    4445
    4546private:
  • trunk/Source/WebCore/mathml/MathMLMathElement.cpp

    r200041 r202960  
    3030
    3131#include "MathMLMathElement.h"
     32
     33#include "MathMLNames.h"
    3234#include "RenderMathMLMath.h"
    3335
    3436namespace WebCore {
    3537
     38using namespace MathMLNames;
     39
    3640inline MathMLMathElement::MathMLMathElement(const QualifiedName& tagName, Document& document)
    3741    : MathMLInlineContainerElement(tagName, document)
    3842{
     43    setHasCustomStyleResolveCallbacks();
    3944}
    4045
     
    4954}
    5055
     56void MathMLMathElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
     57{
     58    if ((name == displaystyleAttr || name == displayAttr) && hasTagName(mathTag) && renderer())
     59        MathMLStyle::resolveMathMLStyleTree(renderer());
     60
     61    MathMLInlineContainerElement::parseAttribute(name, value);
     62}
     63
     64void MathMLMathElement::didAttachRenderers()
     65{
     66    MathMLInlineContainerElement::didAttachRenderers();
     67
     68    MathMLStyle::resolveMathMLStyleTree(renderer());
     69}
     70
    5171}
    5272
  • trunk/Source/WebCore/mathml/MathMLMathElement.h

    r202727 r202960  
    3737    static Ref<MathMLMathElement> create(const QualifiedName& tagName, Document&);
    3838
     39protected:
     40    void didAttachRenderers() final;
     41
    3942private:
    4043    MathMLMathElement(const QualifiedName& tagName, Document&);
     44    void parseAttribute(const QualifiedName&, const AtomicString&) final;
    4145
    4246    RenderPtr<RenderElement> createElementRenderer(RenderStyle&&, const RenderTreePosition&) override;
  • trunk/Source/WebCore/mathml/mathattrs.in

    r164418 r202960  
    1515depth
    1616dir
     17display
     18displaystyle
    1719encoding
    1820fence
  • trunk/Source/WebCore/rendering/mathml/MathMLStyle.h

    r202959 r202960  
    11/*
    2  * Copyright (C) 2009 Alex Milowski (alex@milowski.com). All rights reserved.
    3  * Copyright (C) 2010 Apple Inc. All rights reserved.
     2 * Copyright (C) 2016 Igalia S.L. All rights reserved.
    43 *
    54 * Redistribution and use in source and binary forms, with or without
     
    2524 */
    2625
    27 #ifndef MathMLInlineContainerElement_h
    28 #define MathMLInlineContainerElement_h
     26#ifndef MathMLStyle_h
     27#define MathMLStyle_h
     28#pragma once
    2929
    3030#if ENABLE(MATHML)
    31 #include "MathMLElement.h"
     31
     32#include "Element.h"
     33#include <wtf/RefCounted.h>
    3234
    3335namespace WebCore {
    3436
    35 class MathMLInlineContainerElement : public MathMLElement {
     37class MathMLStyle: public RefCounted<MathMLStyle> {
    3638public:
    37     static Ref<MathMLInlineContainerElement> create(const QualifiedName& tagName, Document&);
     39    MathMLStyle() { }
     40    static Ref<MathMLStyle> create();
    3841
    39     bool isPresentationMathML() const override { return true; }
     42    bool displayStyle() const { return m_displayStyle; }
     43    void setDisplayStyle(bool displayStyle) { m_displayStyle = displayStyle; }
    4044
    41 protected:
    42     MathMLInlineContainerElement(const QualifiedName& tagName, Document&);
    43     void childrenChanged(const ChildChange&) override;
     45    void resolveMathMLStyle(RenderObject*);
     46    static void resolveMathMLStyleTree(RenderObject*);
    4447
    4548private:
    46     RenderPtr<RenderElement> createElementRenderer(RenderStyle&&, const RenderTreePosition&) override;
     49    bool isDisplayStyleAlwaysFalse(RenderObject*);
     50    void setDisplayStyle(RenderObject*);
     51    RenderObject* getMathMLParentNode(RenderObject*);
     52    void updateStyleIfNeeded(RenderObject*, bool);
     53
     54    bool m_displayStyle = false;
    4755};
    4856
     
    5058
    5159#endif // ENABLE(MATHML)
    52 #endif // MathMLInlineContainerElement_h
     60#endif // MathMLStyle_h
  • trunk/Source/WebCore/rendering/mathml/RenderMathMLBlock.cpp

    r202934 r202960  
    4747RenderMathMLBlock::RenderMathMLBlock(Element& container, RenderStyle&& style)
    4848    : RenderBlock(container, WTFMove(style), 0)
     49    , m_mathMLStyle(MathMLStyle::create())
    4950{
    5051    setChildrenInline(false); // All of our children must be block-level.
     
    5354RenderMathMLBlock::RenderMathMLBlock(Document& document, RenderStyle&& style)
    5455    : RenderBlock(document, WTFMove(style), 0)
     56    , m_mathMLStyle(MathMLStyle::create())
    5557{
    5658    setChildrenInline(false); // All of our children must be block-level.
  • trunk/Source/WebCore/rendering/mathml/RenderMathMLBlock.h

    r202934 r202960  
    3030#if ENABLE(MATHML)
    3131
     32#include "MathMLStyle.h"
    3233#include "RenderBlock.h"
    3334#include "RenderTable.h"
     
    4546    RenderMathMLBlock(Document&, RenderStyle&&);
    4647    virtual ~RenderMathMLBlock();
     48
     49    MathMLStyle* mathMLStyle() const { return const_cast<MathMLStyle*>(&m_mathMLStyle.get()); }
    4750
    4851    bool isChildAllowed(const RenderObject&, const RenderStyle&) const override;
     
    8184    bool canDropAnonymousBlockChild() const final { return false; }
    8285    void layoutItems(bool relayoutChildren);
     86
     87    Ref<MathMLStyle> m_mathMLStyle;
    8388};
    8489
     
    8792    explicit RenderMathMLTable(Element& element, RenderStyle&& style)
    8893        : RenderTable(element, WTFMove(style))
     94        , m_mathMLStyle(MathMLStyle::create())
    8995    {
    9096    }
     
    9298    Optional<int> firstLineBaseline() const override;
    9399
     100    MathMLStyle* mathMLStyle() const { return const_cast<MathMLStyle*>(&m_mathMLStyle.get()); }
     101
    94102private:
    95103    bool isRenderMathMLTable() const override { return true; }
    96104    const char* renderName() const override { return "RenderMathMLTable"; }
     105
     106    Ref<MathMLStyle> m_mathMLStyle;
    97107};
    98108
  • trunk/Source/WebCore/rendering/mathml/RenderMathMLOperator.h

    r202727 r202960  
    5050
    5151    bool hasOperatorFlag(MathMLOperatorDictionary::Flag flag) const { return m_operatorFlags & flag; }
    52     // FIXME: The displaystyle property is not implemented (https://bugs.webkit.org/show_bug.cgi?id=118737).
    53     bool isLargeOperatorInDisplayStyle() const { return !hasOperatorFlag(MathMLOperatorDictionary::Stretchy) && hasOperatorFlag(MathMLOperatorDictionary::LargeOp); }
     52    bool isLargeOperatorInDisplayStyle() const { return !hasOperatorFlag(MathMLOperatorDictionary::Stretchy) && hasOperatorFlag(MathMLOperatorDictionary::LargeOp) && mathMLStyle()->displayStyle(); }
    5453    bool isVertical() const { return m_isVertical; }
    5554    LayoutUnit italicCorrection() const { return m_mathOperator.italicCorrection(); }
  • trunk/Source/WebCore/rendering/mathml/RenderMathMLRoot.h

    r202934 r202960  
    5050    void computePreferredLogicalWidths() final;
    5151    void layoutBlock(bool relayoutChildren, LayoutUnit pageLogicalHeight = 0) final;
     52    void updateStyle();
    5253
    5354protected:
     
    6061    bool isRenderMathMLRoot() const final { return true; }
    6162    const char* renderName() const final { return "RenderMathMLRoot"; }
    62     void updateStyle();
    6363
    6464    MathOperator m_radicalOperator;
  • trunk/Source/WebCore/rendering/mathml/RenderMathMLUnderOver.h

    r202934 r202960  
    6262}
    6363
     64SPECIALIZE_TYPE_TRAITS_RENDER_OBJECT(RenderMathMLUnderOver, isRenderMathMLUnderOver())
     65
    6466#endif // ENABLE(MATHML)
    6567
Note: See TracChangeset for help on using the changeset viewer.