wxMaxima
Loading...
Searching...
No Matches
MathParser.h
Go to the documentation of this file.
1// -*- mode: c++; c-file-style: "linux"; c-basic-offset: 2; indent-tabs-mode: nil -*-
2//
3// Copyright (C) 2004-2015 Andrej Vodopivec <andrej.vodopivec@gmail.com>
4// (C) 2004-2015 Gunter Königsmann <wxMaxima@physikbuch.de>
5// (C) 2020 Kuba Ober <kuba@bertec.com>
6//
7// This program is free software; you can redistribute it and/or modify
8// it under the terms of the GNU General Public License as published by
9// the Free Software Foundation; either version 2 of the License, or
10// (at your option) any later version.
11//
12// This program is distributed in the hope that it will be useful,
13// but WITHOUT ANY WARRANTY; without even the implied warranty of
14// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15// GNU General Public License for more details.
16//
17//
18// You should have received a copy of the GNU General Public License
19// along with this program; if not, write to the Free Software
20// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21//
22// SPDX-License-Identifier: GPL-2.0+
23
29#ifndef MATHPARSER_H
30#define MATHPARSER_H
31
32#include <memory>
33#include "precomp.h"
34#include <wx/xml/xml.h>
35
36#include <wx/filesys.h>
37#include <wx/fs_arc.h>
38#include <wx/regex.h>
39#include <wx/hashmap.h>
40#include "cells/Cell.h"
41#include "cells/TextCell.h"
42#include "cells/EditorCell.h"
43#include "cells/FracCell.h"
44#include "cells/GroupCell.h"
45#include <unordered_map>
46#include <unordered_set>
47
54{
55public:
61 explicit MathParser(Configuration *cfg, const wxString &zipfile = {});
63 MathParser(const MathParser&) = delete;
65 MathParser& operator=(const MathParser&) = delete;
66 virtual ~MathParser();
67
74 void SetUserLabel(const wxString &label){ m_userDefinedLabel = label; }
75 /***
76 * Parse the string s, which is (correct) xml fragment.
77 * Put the result in line.
78 */
79 std::unique_ptr<Cell> ParseLine(wxString s, CellType style = MC_TYPE_DEFAULT);
80 std::unique_ptr<Cell> ParseLine(const wxXmlDocument &xml, CellType style = MC_TYPE_DEFAULT);
81 /***
82 * Parse the node and return the corresponding tag.
83 */
84
85 std::unique_ptr<Cell> ParseTag(wxXmlNode *node, bool all = true, int depth = 0);
86 std::unique_ptr<Cell> ParseRowTag(wxXmlNode *node, int depth = 0);
87
88 std::unique_ptr<GroupCell> CreateTreeFromXMLNode(wxXmlNode *xmlcells);
89
91 void SetGroup(GroupCell *group) { m_group = group; }
92
93private:
95 using MathCellFunc = std::unique_ptr<Cell> (MathParser::*)(wxXmlNode *node, int depth);
96
98 using GroupCellFunc = std::unique_ptr<GroupCell> (MathParser::*)(wxXmlNode *node);
99
100 typedef std::unordered_map <wxString, MathCellFunc, wxStringHash> MathCellFunctionHash;
101 typedef std::unordered_map <wxString, GroupCellFunc, wxStringHash> GroupCellFunctionHash;
102
104 static MathCellFunctionHash m_innerTags;
106 static GroupCellFunctionHash m_groupTags;
108 static std::unordered_set<wxString, wxStringHash> m_knownAttributes;
109
111 static void ParseCommonAttrs(wxXmlNode *node, Cell *cell);
112 template <typename T>
113 static void ParseCommonAttrs(wxXmlNode *node, const std::unique_ptr<T> &cell)
114 { ParseCommonAttrs(node, cell.get()); }
115
117 static void ParseCommonGroupCellAttrs(wxXmlNode *node, const std::unique_ptr<GroupCell> &group);
118
120 std::unique_ptr<Cell> HandleNullPointer(std::unique_ptr<Cell> &&cell);
121
134 static wxXmlNode *GetNextTag(wxXmlNode *node);
135
137 static int CountChildren(wxXmlNode *node);
138
144 static wxXmlNode *SkipWhitespaceNode(wxXmlNode *node);
145
157 std::unique_ptr<Cell> ParseCellTag(wxXmlNode *node, int depth = 0);
159 std::unique_ptr<GroupCell> GroupCellFromCodeTag(wxXmlNode *node);
161 std::unique_ptr<GroupCell> GroupCellFromImageTag(wxXmlNode *node);
163 std::unique_ptr<GroupCell> GroupCellFromTitleTag(wxXmlNode *WXUNUSED(node));
165 std::unique_ptr<GroupCell> GroupCellFromSectionTag(wxXmlNode *WXUNUSED(node));
167 std::unique_ptr<GroupCell> GroupCellFromPagebreakTag(wxXmlNode *WXUNUSED(node));
169 std::unique_ptr<GroupCell> GroupCellFromSubsectionTag(wxXmlNode *node);
171 std::unique_ptr<GroupCell> GroupCellFromSubsubsectionTag(wxXmlNode *WXUNUSED(node));
173 std::unique_ptr<GroupCell> GroupCellHeading5Tag(wxXmlNode *WXUNUSED(node));
175 std::unique_ptr<GroupCell> GroupCellHeading6Tag(wxXmlNode *WXUNUSED(node));
177 std::unique_ptr<GroupCell> GroupCellFromTextTag(wxXmlNode *WXUNUSED(node));
178 /* @} */
179
184 std::unique_ptr<Cell> ParseEditorTag(wxXmlNode *node, int depth = 0);
186 std::unique_ptr<Cell> ParseFracTag(wxXmlNode *node, int depth = 0);
188 std::unique_ptr<Cell> ParseText(wxXmlNode *node, TextStyle style = TS_MATH, int depth = 0);
193 std::unique_ptr<Cell> ParseVariableNameTag(wxXmlNode *node, int depth = 0);
195 std::unique_ptr<Cell> ParseOperatorNameTag(wxXmlNode *node, int depth = 0){return ParseText(node->GetChildren(), TS_FUNCTION, depth);}
197 std::unique_ptr<Cell> ParseMiscTextTag(wxXmlNode *node, int depth = 0);
199 std::unique_ptr<Cell> ParseNumberTag(wxXmlNode *node, int depth = 0){return ParseText(node->GetChildren(), TS_NUMBER, depth);}
201 std::unique_ptr<Cell> ParseHiddenOperatorTag(wxXmlNode *node, int depth = 0);
203 std::unique_ptr<Cell> ParseGreekTag(wxXmlNode *node, int depth = 0){return ParseText(node->GetChildren(), TS_GREEK_CONSTANT, depth);}
205 std::unique_ptr<Cell> ParseSpecialConstantTag(wxXmlNode *node, int depth = 0){return ParseText(node->GetChildren(), TS_SPECIAL_CONSTANT, depth);}
207 std::unique_ptr<Cell> ParseFunctionNameTag(wxXmlNode *node, int depth = 0){return ParseText(node->GetChildren(), TS_FUNCTION, depth);}
209 std::unique_ptr<Cell> ParseSpaceTag(wxXmlNode *WXUNUSED(node), int WXUNUSED(depth) = 0){return std::make_unique<TextCell>(m_group, m_configuration, wxS(" "));}
214 std::unique_ptr<Cell> ParseMthTag(wxXmlNode *node, int depth = 0);
216 std::unique_ptr<Cell> ParseOutputLabelTag(wxXmlNode *node, int depth = 0);
218 std::unique_ptr<Cell> ParseStringTag(wxXmlNode *node, int depth = 0);
220 std::unique_ptr<Cell> ParseHighlightTag(wxXmlNode *node, int depth = 0);
222 std::unique_ptr<Cell> ParseImageTag(wxXmlNode *node, int depth = 0);
224 std::unique_ptr<Cell> ParseAnimationTag(wxXmlNode *node, int depth = 0);
226 std::unique_ptr<Cell> ParseCharCode(wxXmlNode *node, int depth = 0);
228 std::unique_ptr<Cell> ParseSupTag(wxXmlNode *node, int depth = 0);
230 std::unique_ptr<Cell> ParseSubTag(wxXmlNode *node, int depth = 0);
232 std::unique_ptr<Cell> ParseAbsTag(wxXmlNode *node, int depth = 0);
234 std::unique_ptr<Cell> ParseConjugateTag(wxXmlNode *node, int depth = 0);
235#if 0
237 std::unique_ptr<Cell> ParseUnderTag(wxXmlNode *node, int depth = 0);
238#endif
240 std::unique_ptr<Cell> ParseTableTag(wxXmlNode *node, int depth = 0);
242 std::unique_ptr<Cell> ParseAtTag(wxXmlNode *node, int depth = 0);
244 std::unique_ptr<Cell> ParseDiffTag(wxXmlNode *node, int depth = 0);
246 std::unique_ptr<Cell> ParseSumTag(wxXmlNode *node, int depth = 0);
248 std::unique_ptr<Cell> ParseIntTag(wxXmlNode *node, int depth = 0);
250 std::unique_ptr<Cell> ParseFunTag(wxXmlNode *node, int depth = 0);
252 std::unique_ptr<Cell> ParseSqrtTag(wxXmlNode *node, int depth = 0);
254 std::unique_ptr<Cell> ParseLimitTag(wxXmlNode *node, int depth = 0);
256 std::unique_ptr<Cell> ParseParenTag(wxXmlNode *node, int depth = 0);
258 std::unique_ptr<Cell> ParseSubSupTag(wxXmlNode *node, int depth = 0);
260 std::unique_ptr<Cell> ParseMmultiscriptsTag(wxXmlNode *node, int depth = 0);
262 std::unique_ptr<Cell> ParseOutputTag(wxXmlNode *node, int depth = 0);
264 std::unique_ptr<Cell> ParseMtdTag(wxXmlNode *node, int depth = 0);
265 // @}
267 wxString m_userDefinedLabel;
269 static wxRegEx m_graphRegex;
270
271 CellType m_ParserStyle = MC_TYPE_DEFAULT;
272 FracCell::FracType m_FracStyle;
273 CellPtr<GroupCell> m_group;
274 Configuration *m_configuration = NULL;
275 bool m_highlight = false;
276 wxString m_wxmxFile; // if not wxEmptyString: The wxmx file to load images from
277 static wxString m_unknownXMLTagToolTip;
278};
279
280#endif // MATHPARSER_H
The definition of the base class of all cells the worksheet consists of.
CellType
The supported types of math cells.
Definition: Cell.h:64
This file contains the definition of the class EditorCell.
This file declares the class FracCell.
This file defines the class GroupCell that bundles input and output in the worksheet.
TextStyle
All text styles known to wxMaxima.
Definition: TextStyle.h:231
A weak non-owning pointer that becomes null whenever the observed object is destroyed.
Definition: CellPtr.h:480
The base class all cell types the worksheet can consist of are derived from.
Definition: Cell.h:142
The configuration storage for the current worksheet.
Definition: Configuration.h:86
FracType
All types of fractions we support.
Definition: FracCell.h:72
A cell grouping input (and, if there is one, also the output) cell to a foldable item.
Definition: GroupCell.h:87
This class handles parsing the xml representation of a cell tree.
Definition: MathParser.h:54
void SetUserLabel(const wxString &label)
Tells the parser what user label to assign to the next label cell.
Definition: MathParser.h:74
MathParser & operator=(const MathParser &)=delete
This class doesn't have a = operator.
MathParser(const MathParser &)=delete
This class doesn't have a copy constructor.
void SetGroup(GroupCell *group)
Sets the group the newly parsed cells are provided with.
Definition: MathParser.h:91