4d2b93d9f38a75d6947704d2647a12c1b0699624
[WebKit-https.git] / Source / WebCore / mathml / MathMLMencloseElement.cpp
1 /*
2  * Copyright (C) 2014 Gurpreet Kaur (k.gurpreet@samsung.com). All rights reserved.
3  * Copyright (C) 2016 Igalia S.L.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
15  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
16  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
17  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
18  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
19  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
20  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 #include "config.h"
28 #include "MathMLMencloseElement.h"
29
30 #if ENABLE(MATHML)
31
32 #include "MathMLNames.h"
33 #include "RenderMathMLMenclose.h"
34
35 namespace WebCore {
36
37 using namespace MathMLNames;
38
39 MathMLMencloseElement::MathMLMencloseElement(const QualifiedName& tagName, Document& document)
40     : MathMLRowElement(tagName, document)
41 {
42     // By default we draw a longdiv.
43     clearNotations();
44     addNotation(LongDiv);
45 }
46
47 Ref<MathMLMencloseElement> MathMLMencloseElement::create(const QualifiedName& tagName, Document& document)
48 {
49     return adoptRef(*new MathMLMencloseElement(tagName, document));
50 }
51
52 RenderPtr<RenderElement> MathMLMencloseElement::createElementRenderer(RenderStyle&& style, const RenderTreePosition&)
53 {
54     return createRenderer<RenderMathMLMenclose>(*this, WTFMove(style));
55 }
56
57 void MathMLMencloseElement::parseNotationAttribute()
58 {
59     clearNotations();
60     if (!hasAttribute(notationAttr)) {
61         addNotation(LongDiv); // The default value is longdiv.
62         return;
63     }
64     auto& value = attributeWithoutSynchronization(notationAttr);
65     Vector<String> notationsList;
66     String(value).split(' ', notationsList);
67     for (auto& notation : notationsList) {
68         if (notation == "longdiv") {
69             addNotation(LongDiv);
70         } else if (notation == "roundedbox") {
71             addNotation(RoundedBox);
72         } else if (notation == "circle") {
73             addNotation(Circle);
74         } else if (notation == "left") {
75             addNotation(Left);
76         } else if (notation == "right") {
77             addNotation(Right);
78         } else if (notation == "top") {
79             addNotation(Top);
80         } else if (notation == "bottom") {
81             addNotation(Bottom);
82         } else if (notation == "updiagonalstrike") {
83             addNotation(UpDiagonalStrike);
84         } else if (notation == "downdiagonalstrike") {
85             addNotation(DownDiagonalStrike);
86         } else if (notation == "verticalstrike") {
87             addNotation(VerticalStrike);
88         } else if (notation == "horizontalstrike") {
89             addNotation(HorizontalStrike);
90         } else if (notation == "updiagonalarrow") {
91             addNotation(UpDiagonalArrow);
92         } else if (notation == "phasorangle") {
93             addNotation(PhasorAngle);
94         } else if (notation == "box") {
95             addNotation(Left);
96             addNotation(Right);
97             addNotation(Top);
98             addNotation(Bottom);
99         } else if (notation == "actuarial") {
100             addNotation(Right);
101             addNotation(Top);
102         } else if (notation == "madruwb") {
103             addNotation(Right);
104             addNotation(Bottom);
105         }
106     }
107 }
108
109 bool MathMLMencloseElement::hasNotation(MencloseNotationFlag notationFlag)
110 {
111     if (!m_notationFlags)
112         parseNotationAttribute();
113     return m_notationFlags.value() & notationFlag;
114 }
115
116 void MathMLMencloseElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
117 {
118     if (name == notationAttr)
119         m_notationFlags = Nullopt;
120
121     MathMLRowElement::parseAttribute(name, value);
122 }
123
124 }
125 #endif // ENABLE(MATHML)