LibreOffice Module svgio (master) 1
svgtoken.cxx
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 *
9 * This file incorporates work covered by the following license notice:
10 *
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 */
19
20#include <svgtoken.hxx>
21#include <frozen/bits/defines.h>
22#include <frozen/bits/elsa_std.h>
23#include <frozen/unordered_map.h>
24
25namespace svgio::svgreader
26{
27
28constexpr auto aSVGTokenMapperList = frozen::make_unordered_map<std::u16string_view, SVGToken>(
29{
30 { u"width", SVGToken::Width },
31 { u"height", SVGToken::Height },
32 { u"viewBox", SVGToken::ViewBox },
33 { u"transform", SVGToken::Transform },
34 { u"style", SVGToken::Style },
35 { u"display", SVGToken::Display }, // #i121656#
36 { u"d", SVGToken::D },
37 { u"x", SVGToken::X },
38 { u"y", SVGToken::Y },
39 { u"xmlns", SVGToken::Xmlns },
40 { u"version", SVGToken::Version },
41 { u"id", SVGToken::Id },
42 { u"in", SVGToken::In },
43 { u"rx", SVGToken::Rx },
44 { u"ry", SVGToken::Ry },
45 { u"points", SVGToken::Points },
46 { u"dx", SVGToken::Dx },
47 { u"dy", SVGToken::Dy },
48 { u"rotate", SVGToken::Rotate },
49 { u"textLength", SVGToken::TextLength },
50 { u"lengthAdjust", SVGToken::LengthAdjust },
51 { u"font", SVGToken::Font },
52 { u"font-family", SVGToken::FontFamily },
53 { u"font-size", SVGToken::FontSize },
54 { u"font-size-adjust", SVGToken::FontSizeAdjust },
55 { u"font-stretch", SVGToken::FontStretch },
56 { u"font-style", SVGToken::FontStyle },
57 { u"font-variant", SVGToken::FontVariant },
58 { u"font-weight", SVGToken::FontWeight },
59 { u"direction", SVGToken::Direction },
60 { u"letter-spacing", SVGToken::LetterSpacing },
61 { u"text-decoration", SVGToken::TextDecoration },
62 { u"unicode-bidi", SVGToken::UnicodeBidi },
63 { u"word-spacing", SVGToken::WordSpacing },
64 { u"tspan", SVGToken::Tspan },
65 { u"tref", SVGToken::Tref },
66 { u"textPath", SVGToken::TextPath },
67 { u"startOffset", SVGToken::StartOffset },
68 { u"method", SVGToken::Method },
69 { u"spacing", SVGToken::Spacing },
70 { u"stdDeviation", SVGToken::StdDeviation },
71 { u"text-align", SVGToken::TextAlign },
72 { u"pathLength", SVGToken::PathLength },
73 { u"type", SVGToken::Type },
74 { u"class", SVGToken::Class },
75 { u"text-anchor", SVGToken::TextAnchor },
76 { u"xml:space", SVGToken::XmlSpace },
77 { u"color", SVGToken::Color },
78 { u"clipPath", SVGToken::ClipPathNode },
79 { u"clip-path", SVGToken::ClipPathProperty },
80 { u"feColorMatrix", SVGToken::FeColorMatrix },
81 { u"feDropShadow", SVGToken::FeDropShadow },
82 { u"feFlood", SVGToken::FeFlood },
83 { u"feImage", SVGToken::FeImage },
84 { u"feGaussianBlur", SVGToken::FeGaussianBlur },
85 { u"feOffset", SVGToken::FeOffset },
86 { u"filter", SVGToken::Filter },
87 { u"flood-color", SVGToken::FloodColor },
88 { u"flood-opacity", SVGToken::FloodOpacity },
89 { u"mask", SVGToken::Mask },
90 { u"clipPathUnits", SVGToken::ClipPathUnits },
91 { u"maskUnits", SVGToken::MaskUnits },
92 { u"maskContentUnits", SVGToken::MaskContentUnits },
93 { u"clip-rule", SVGToken::ClipRule },
94 { u"marker", SVGToken::Marker },
95 { u"marker-start", SVGToken::MarkerStart },
96 { u"marker-mid", SVGToken::MarkerMid },
97 { u"marker-end", SVGToken::MarkerEnd },
98 { u"refX", SVGToken::RefX },
99 { u"refY", SVGToken::RefY },
100 { u"markerUnits", SVGToken::MarkerUnits },
101 { u"markerWidth", SVGToken::MarkerWidth },
102 { u"markerHeight", SVGToken::MarkerHeight },
103 { u"orient", SVGToken::Orient },
104 { u"pattern", SVGToken::Pattern },
105 { u"patternUnits", SVGToken::PatternUnits },
106 { u"patternContentUnits", SVGToken::PatternContentUnits },
107 { u"patternTransform", SVGToken::PatternTransform },
108 { u"opacity", SVGToken::Opacity },
109 { u"visibility", SVGToken::Visibility },
110 { u"title", SVGToken::Title },
111 { u"desc", SVGToken::Desc },
112 { u"preserveAspectRatio", SVGToken::PreserveAspectRatio },
113 { u"defer", SVGToken::Defer },
114 { u"none", SVGToken::None },
115 { u"xMinYMin", SVGToken::XMinYMin },
116 { u"xMidYMin", SVGToken::XMidYMin },
117 { u"xMaxYMin", SVGToken::XMaxYMin },
118 { u"xMinYMid", SVGToken::XMinYMid },
119 { u"xMidYMid", SVGToken::XMidYMid },
120 { u"xMaxYMid", SVGToken::XMaxYMid },
121 { u"xMinYMax", SVGToken::XMinYMax },
122 { u"xMidYMax", SVGToken::XMidYMax },
123 { u"xMaxYMax", SVGToken::XMaxYMax },
124 { u"meet", SVGToken::Meet },
125 { u"slice", SVGToken::Slice },
126 { u"values", SVGToken::Values },
127
128 { u"defs", SVGToken::Defs },
129 { u"g", SVGToken::G },
130 { u"svg", SVGToken::Svg },
131 { u"symbol", SVGToken::Symbol },
132 { u"use", SVGToken::Use },
133 { u"a", SVGToken::A },
134
135 { u"circle", SVGToken::Circle },
136 { u"ellipse", SVGToken::Ellipse },
137 { u"line", SVGToken::Line },
138 { u"path", SVGToken::Path },
139 { u"polygon", SVGToken::Polygon },
140 { u"polyline", SVGToken::Polyline },
141 { u"rect", SVGToken::Rect },
142 { u"image", SVGToken::Image },
143
144 { u"linearGradient", SVGToken::LinearGradient },
145 { u"radialGradient", SVGToken::RadialGradient },
146 { u"stop", SVGToken::Stop },
147 { u"offset", SVGToken::Offset },
148 { u"x1", SVGToken::X1 },
149 { u"y1", SVGToken::Y1 },
150 { u"x2", SVGToken::X2 },
151 { u"y2", SVGToken::Y2 },
152 { u"cx", SVGToken::Cx },
153 { u"cy", SVGToken::Cy },
154 { u"fx", SVGToken::Fx },
155 { u"fy", SVGToken::Fy },
156 { u"r", SVGToken::R },
157 { u"gradientUnits", SVGToken::GradientUnits },
158 { u"gradientTransform", SVGToken::GradientTransform },
159 { u"spreadMethod", SVGToken::SpreadMethod },
160 { u"href", SVGToken::Href },
161 { u"xlink:href", SVGToken::XlinkHref },
162 { u"stop-color", SVGToken::StopColor },
163 { u"stop-opacity", SVGToken::StopOpacity },
164
165 { u"fill", SVGToken::Fill },
166 { u"fill-opacity", SVGToken::FillOpacity },
167 { u"fill-rule", SVGToken::FillRule },
168
169 { u"stroke", SVGToken::Stroke },
170 { u"stroke-dasharray", SVGToken::StrokeDasharray },
171 { u"stroke-dashoffset", SVGToken::StrokeDashoffset },
172 { u"stroke-linecap", SVGToken::StrokeLinecap },
173 { u"stroke-linejoin", SVGToken::StrokeLinejoin },
174 { u"stroke-miterlimit", SVGToken::StrokeMiterlimit },
175 { u"stroke-opacity", SVGToken::StrokeOpacity },
176 { u"stroke-width", SVGToken::StrokeWidth },
177
178 { u"text", SVGToken::Text },
179 { u"baseline-shift", SVGToken::BaselineShift },
180 { u"flowRoot", SVGToken::FlowRoot }
181});
182
183// The same elements as the map above but lowercase. CSS is case insensitive
184// TODO: create separate maps for css and xml elements
185constexpr auto aSVGLowerCaseTokenMapperList = frozen::make_unordered_map<std::u16string_view, SVGToken>(
186{
187 { u"width", SVGToken::Width },
188 { u"height", SVGToken::Height },
189 { u"viewbox", SVGToken::ViewBox },
190 { u"transform", SVGToken::Transform },
191 { u"style", SVGToken::Style },
192 { u"display", SVGToken::Display }, // #i121656#
193 { u"d", SVGToken::D },
194 { u"x", SVGToken::X },
195 { u"y", SVGToken::Y },
196 { u"xmlns", SVGToken::Xmlns },
197 { u"version", SVGToken::Version },
198 { u"id", SVGToken::Id },
199 { u"in", SVGToken::In },
200 { u"rx", SVGToken::Rx },
201 { u"ry", SVGToken::Ry },
202 { u"points", SVGToken::Points },
203 { u"dx", SVGToken::Dx },
204 { u"dy", SVGToken::Dy },
205 { u"rotate", SVGToken::Rotate },
206 { u"textlength", SVGToken::TextLength },
207 { u"lengthadjust", SVGToken::LengthAdjust },
208 { u"font", SVGToken::Font },
209 { u"font-family", SVGToken::FontFamily },
210 { u"font-size", SVGToken::FontSize },
211 { u"font-size-adjust", SVGToken::FontSizeAdjust },
212 { u"font-stretch", SVGToken::FontStretch },
213 { u"font-style", SVGToken::FontStyle },
214 { u"font-variant", SVGToken::FontVariant },
215 { u"font-weight", SVGToken::FontWeight },
216 { u"direction", SVGToken::Direction },
217 { u"letter-spacing", SVGToken::LetterSpacing },
218 { u"text-decoration", SVGToken::TextDecoration },
219 { u"unicode-bidi", SVGToken::UnicodeBidi },
220 { u"word-spacing", SVGToken::WordSpacing },
221 { u"tspan", SVGToken::Tspan },
222 { u"tref", SVGToken::Tref },
223 { u"textpath", SVGToken::TextPath },
224 { u"startoffset", SVGToken::StartOffset },
225 { u"method", SVGToken::Method },
226 { u"spacing", SVGToken::Spacing },
227 { u"stddeviation", SVGToken::StdDeviation },
228 { u"text-align", SVGToken::TextAlign },
229 { u"pathlength", SVGToken::PathLength },
230 { u"type", SVGToken::Type },
231 { u"class", SVGToken::Class },
232 { u"text-anchor", SVGToken::TextAnchor },
233 { u"xml:space", SVGToken::XmlSpace },
234 { u"color", SVGToken::Color },
235 { u"clippath", SVGToken::ClipPathNode },
236 { u"clip-path", SVGToken::ClipPathProperty },
237 { u"fecolormatrix", SVGToken::FeColorMatrix },
238 { u"fedropshadow", SVGToken::FeDropShadow },
239 { u"feflood", SVGToken::FeFlood },
240 { u"feimage", SVGToken::FeImage },
241 { u"fegaussianblur", SVGToken::FeGaussianBlur },
242 { u"feoffset", SVGToken::FeOffset },
243 { u"filter", SVGToken::Filter },
244 { u"flood-color", SVGToken::FloodColor },
245 { u"flood-opacity", SVGToken::FloodOpacity },
246 { u"mask", SVGToken::Mask },
247 { u"clippathunits", SVGToken::ClipPathUnits },
248 { u"maskunits", SVGToken::MaskUnits },
249 { u"maskcontentunits", SVGToken::MaskContentUnits },
250 { u"clip-rule", SVGToken::ClipRule },
251 { u"marker", SVGToken::Marker },
252 { u"marker-start", SVGToken::MarkerStart },
253 { u"marker-mid", SVGToken::MarkerMid },
254 { u"marker-end", SVGToken::MarkerEnd },
255 { u"refx", SVGToken::RefX },
256 { u"refy", SVGToken::RefY },
257 { u"markerunits", SVGToken::MarkerUnits },
258 { u"markerwidth", SVGToken::MarkerWidth },
259 { u"markerheight", SVGToken::MarkerHeight },
260 { u"orient", SVGToken::Orient },
261 { u"pattern", SVGToken::Pattern },
262 { u"patternunits", SVGToken::PatternUnits },
263 { u"patterncontentunits", SVGToken::PatternContentUnits },
264 { u"patterntransform", SVGToken::PatternTransform },
265 { u"opacity", SVGToken::Opacity },
266 { u"visibility", SVGToken::Visibility },
267 { u"title", SVGToken::Title },
268 { u"desc", SVGToken::Desc },
269 { u"preserveaspectratio", SVGToken::PreserveAspectRatio },
270 { u"defer", SVGToken::Defer },
271 { u"none", SVGToken::None },
272 { u"xminymin", SVGToken::XMinYMin },
273 { u"xmidymin", SVGToken::XMidYMin },
274 { u"xmaxymin", SVGToken::XMaxYMin },
275 { u"xminymid", SVGToken::XMinYMid },
276 { u"xmidymid", SVGToken::XMidYMid },
277 { u"xmaxymid", SVGToken::XMaxYMid },
278 { u"xminymax", SVGToken::XMinYMax },
279 { u"xmidymax", SVGToken::XMidYMax },
280 { u"xmaxymax", SVGToken::XMaxYMax },
281 { u"meet", SVGToken::Meet },
282 { u"slice", SVGToken::Slice },
283 { u"values", SVGToken::Values },
284
285 { u"defs", SVGToken::Defs },
286 { u"g", SVGToken::G },
287 { u"svg", SVGToken::Svg },
288 { u"symbol", SVGToken::Symbol },
289 { u"use", SVGToken::Use },
290 { u"a", SVGToken::A },
291
292 { u"circle", SVGToken::Circle },
293 { u"ellipse", SVGToken::Ellipse },
294 { u"line", SVGToken::Line },
295 { u"path", SVGToken::Path },
296 { u"polygon", SVGToken::Polygon },
297 { u"polyline", SVGToken::Polyline },
298 { u"rect", SVGToken::Rect },
299 { u"image", SVGToken::Image },
300
301 { u"lineargradient", SVGToken::LinearGradient },
302 { u"radialgradient", SVGToken::RadialGradient },
303 { u"stop", SVGToken::Stop },
304 { u"offset", SVGToken::Offset },
305 { u"x1", SVGToken::X1 },
306 { u"y1", SVGToken::Y1 },
307 { u"x2", SVGToken::X2 },
308 { u"y2", SVGToken::Y2 },
309 { u"cx", SVGToken::Cx },
310 { u"cy", SVGToken::Cy },
311 { u"fx", SVGToken::Fx },
312 { u"fy", SVGToken::Fy },
313 { u"r", SVGToken::R },
314 { u"gradientunits", SVGToken::GradientUnits },
315 { u"gradienttransform", SVGToken::GradientTransform },
316 { u"spreadmethod", SVGToken::SpreadMethod },
317 { u"href", SVGToken::Href },
318 { u"xlink:href", SVGToken::XlinkHref },
319 { u"stop-color", SVGToken::StopColor },
320 { u"stop-opacity", SVGToken::StopOpacity },
321
322 { u"fill", SVGToken::Fill },
323 { u"fill-opacity", SVGToken::FillOpacity },
324 { u"fill-rule", SVGToken::FillRule },
325
326 { u"stroke", SVGToken::Stroke },
327 { u"stroke-dasharray", SVGToken::StrokeDasharray },
328 { u"stroke-dashoffset", SVGToken::StrokeDashoffset },
329 { u"stroke-linecap", SVGToken::StrokeLinecap },
330 { u"stroke-linejoin", SVGToken::StrokeLinejoin },
331 { u"stroke-miterlimit", SVGToken::StrokeMiterlimit },
332 { u"stroke-opacity", SVGToken::StrokeOpacity },
333 { u"stroke-width", SVGToken::StrokeWidth },
334
335 { u"text", SVGToken::Text },
336 { u"baseline-shift", SVGToken::BaselineShift },
337 { u"flowroot", SVGToken::FlowRoot }
338});
339
340static_assert(sizeof(aSVGTokenMapperList) == sizeof(aSVGLowerCaseTokenMapperList),
341 "Number of elements in both maps must be the same");
342
343SVGToken StrToSVGToken(const OUString& rStr, bool bCaseIndependent)
344{
345 OUString aSearchString = rStr.startsWith("svg:") ? rStr.copy(4) : rStr;
346
347 if (bCaseIndependent)
348 {
349 auto const aResult(aSVGLowerCaseTokenMapperList.find(aSearchString.toAsciiLowerCase()));
350
351 if (aResult != aSVGLowerCaseTokenMapperList.end())
352 {
353 return aResult->second;
354 }
355 }
356 else
357 {
358 auto const aResult(aSVGTokenMapperList.find(aSearchString));
359
360 if (aResult != aSVGTokenMapperList.end())
361 {
362 return aResult->second;
363 }
364 }
365
366 return SVGToken::Unknown;
367}
368
369OUString SVGTokenToStr(const SVGToken& rToken)
370{
371 for (auto it = aSVGTokenMapperList.begin(); it != aSVGTokenMapperList.end(); ++it)
372 {
373 if (it->second == rToken)
374 {
375 OUString aFirst(it->first);
376 return aFirst;
377 }
378 }
379 return OUString();
380}
381
382} // end of namespace svgio
383
384/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
float u
OUString SVGTokenToStr(const SVGToken &rToken)
Definition: svgtoken.cxx:369
SVGToken StrToSVGToken(const OUString &rStr, bool bCaseIndependent)
Definition: svgtoken.cxx:343
constexpr auto aSVGTokenMapperList
Definition: svgtoken.cxx:28
constexpr auto aSVGLowerCaseTokenMapperList
Definition: svgtoken.cxx:185