You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hop.apache.org by ha...@apache.org on 2020/12/26 22:51:01 UTC
[incubator-hop] branch master updated: HOP-1835 Add Help about
This is an automated email from the ASF dual-hosted git repository.
hansva pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-hop.git
The following commit(s) were added to refs/heads/master by this push:
new 8ef312b HOP-1835 Add Help about
new 804cb30 Merge pull request #494 from nadment/HOP-1835
8ef312b is described below
commit 8ef312bbe277475e12de7472ab4969b87172382b
Author: nadment <na...@gmail.com>
AuthorDate: Fri Dec 25 22:55:29 2020 +0100
HOP-1835 Add Help about
Add Help > About menu entry
Add AboutDialog class
Add image logo
Replace icon logo
---
.../org/apache/hop/ui/core/gui/GuiResource.java | 2 +-
.../main/java/org/apache/hop/ui/hopgui/HopGui.java | 26 +++
.../apache/hop/ui/hopgui/dialog/AboutDialog.java | 177 +++++++++++++++++++++
.../dialog/messages/messages_en_US.properties | 2 +-
ui/src/main/resources/ui/images/hop_logo.svg | 60 -------
ui/src/main/resources/ui/images/logo_hop.svg | 62 ++++++++
ui/src/main/resources/ui/images/logo_icon.svg | 59 +++++++
7 files changed, 326 insertions(+), 62 deletions(-)
diff --git a/ui/src/main/java/org/apache/hop/ui/core/gui/GuiResource.java b/ui/src/main/java/org/apache/hop/ui/core/gui/GuiResource.java
index d047442..58d3a69 100644
--- a/ui/src/main/java/org/apache/hop/ui/core/gui/GuiResource.java
+++ b/ui/src/main/java/org/apache/hop/ui/core/gui/GuiResource.java
@@ -700,7 +700,7 @@ public class GuiResource {
// Svg image
//
- imageLogo = SwtSvgImageUtil.getImageAsResource( display, "ui/images/hop_logo.svg" );
+ imageLogo = SwtSvgImageUtil.getImageAsResource( display, "ui/images/logo_icon.svg" );
imagePipeline = SwtSvgImageUtil.getImageAsResource( display, "ui/images/pipeline.svg" );
imageWorkflow = SwtSvgImageUtil.getImageAsResource( display, "ui/images/workflow.svg" );
imageServer = SwtSvgImageUtil.getImageAsResource( display, "ui/images/server.svg" );
diff --git a/ui/src/main/java/org/apache/hop/ui/hopgui/HopGui.java b/ui/src/main/java/org/apache/hop/ui/hopgui/HopGui.java
index d2fb76c..e580491 100644
--- a/ui/src/main/java/org/apache/hop/ui/hopgui/HopGui.java
+++ b/ui/src/main/java/org/apache/hop/ui/hopgui/HopGui.java
@@ -75,6 +75,7 @@ import org.apache.hop.ui.hopgui.delegates.HopGuiAuditDelegate;
import org.apache.hop.ui.hopgui.delegates.HopGuiContextDelegate;
import org.apache.hop.ui.hopgui.delegates.HopGuiFileDelegate;
import org.apache.hop.ui.hopgui.delegates.HopGuiUndoDelegate;
+import org.apache.hop.ui.hopgui.dialog.AboutDialog;
import org.apache.hop.ui.hopgui.file.HopFileTypeRegistry;
import org.apache.hop.ui.hopgui.file.IHopFileType;
import org.apache.hop.ui.hopgui.file.IHopFileTypeHandler;
@@ -165,6 +166,10 @@ public class HopGui
public static final String ID_MAIN_MENU_TOOLS_OPTIONS = "40010-menu-tools-options";
public static final String ID_MAIN_MENU_TOOLS_SYSPROPS = "40020-menu-tools-system-properties";
+ public static final String ID_MAIN_MENU_HELP_PARENT_ID = "90000-menu-help";
+ public static final String ID_MAIN_MENU_HELP_ABOUT = "90009-menu-help-about";
+
+
// The main toolbar IDs
public static final String ID_MAIN_TOOLBAR = "HopGui-Toolbar";
public static final String ID_MAIN_TOOLBAR_NEW = "toolbar-10010-new";
@@ -896,6 +901,27 @@ public class HopGui
}
}
+ @GuiMenuElement(
+ root = ID_MAIN_MENU,
+ id = ID_MAIN_MENU_HELP_PARENT_ID,
+ label = "&Help",
+ parentId = ID_MAIN_MENU)
+ public void menuHelp() {
+ // Nothing is done here.
+ }
+
+
+ @GuiMenuElement(
+ root = ID_MAIN_MENU,
+ id = ID_MAIN_MENU_HELP_ABOUT,
+ label = "About...",
+ parentId = ID_MAIN_MENU_HELP_PARENT_ID)
+ public void menuHelpAbout() {
+ AboutDialog dialog = new AboutDialog(hopGui.getShell());
+ dialog.open();
+ }
+
+
protected void addMainToolbar() {
mainToolbar = new ToolBar(shell, SWT.WRAP | SWT.LEFT | SWT.HORIZONTAL);
FormData fdToolBar = new FormData();
diff --git a/ui/src/main/java/org/apache/hop/ui/hopgui/dialog/AboutDialog.java b/ui/src/main/java/org/apache/hop/ui/hopgui/dialog/AboutDialog.java
new file mode 100644
index 0000000..a8f551a
--- /dev/null
+++ b/ui/src/main/java/org/apache/hop/ui/hopgui/dialog/AboutDialog.java
@@ -0,0 +1,177 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hop.ui.hopgui.dialog;
+
+import java.util.Arrays;
+import org.apache.hop.core.Const;
+import org.apache.hop.i18n.BaseMessages;
+import org.apache.hop.ui.core.PropsUi;
+import org.apache.hop.ui.core.gui.GuiResource;
+import org.apache.hop.ui.hopgui.HopGui;
+import org.apache.hop.ui.pipeline.transform.BaseTransformDialog;
+import org.apache.hop.ui.util.SwtSvgImageUtil;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ShellAdapter;
+import org.eclipse.swt.events.ShellEvent;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.program.Program;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Dialog;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+/** A dialog to display version information. */
+public class AboutDialog extends Dialog {
+ private static final Class<?> PKG = AboutDialog.class; // Needed by Translator
+
+ private final String[] PROPERTIES = new String[] { "os.name","os.version","os.arch", "java.version", "java.vm.vendor", "java.specification.version","java.class.path","file.encoding","HOP_PLATFORM_RUNTIME","HOP_CONFIG_FOLDER"};
+
+ private Shell shell;
+
+ public AboutDialog(Shell parent) {
+ super(parent, SWT.NONE);
+ }
+
+ public void open() {
+ Shell parent = getParent();
+ Display display = parent.getDisplay();
+
+ PropsUi props = PropsUi.getInstance();
+
+ shell = new Shell(parent, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL | SWT.SHEET | SWT.RESIZE);
+ shell.setText(BaseMessages.getString(PKG, "AboutDialog.Title"));
+ shell.setImage(GuiResource.getInstance().getImageHopUi());
+ shell.setSize(400, 400);
+ shell.setMinimumSize(350, 250);
+
+ FormLayout formLayout = new FormLayout();
+ formLayout.marginWidth = Const.FORM_MARGIN;
+ formLayout.marginHeight = Const.FORM_MARGIN;
+ shell.setLayout(formLayout);
+ props.setLook(shell);
+
+ // Widget application logo
+ Label wLogo = new Label(shell, SWT.CENTER);
+ wLogo.setImage(
+ SwtSvgImageUtil.getImageAsResource(display, "ui/images/logo_hop.svg")
+ .getAsBitmapForSize(display, 100, 100));
+ FormData fdLogo = new FormData();
+ fdLogo.top = new FormAttachment(0, 0);
+ fdLogo.left = new FormAttachment(0, 0);
+ wLogo.setLayoutData(fdLogo);
+
+ // Widget application name
+ Label wName = new Label(shell, SWT.CENTER);
+ wName.setText("Apache Hop\n(Incubating)");
+ wName.setFont(GuiResource.getInstance().getFontLarge());
+ FormData fdName = new FormData();
+ fdName.top = new FormAttachment(0, 0);
+ fdName.left = new FormAttachment(wLogo, 0);
+ fdName.right = new FormAttachment(100, 0);
+ wName.setLayoutData(fdName);
+ props.setLook(wName);
+
+ // Widget application version
+ Label wVersion = new Label(shell, SWT.CENTER);
+ wVersion.setText(HopGui.class.getPackage().getImplementationVersion());
+ FormData fdAppVersion = new FormData();
+ fdAppVersion.top = new FormAttachment(wName, Const.MARGIN);
+ fdAppVersion.left = new FormAttachment(wLogo, 0);
+ fdAppVersion.right = new FormAttachment(100, 0);
+ wVersion.setLayoutData(fdAppVersion);
+ props.setLook(wVersion);
+
+ // Widget link, use composite for centering
+ Composite composite = new Composite(shell, SWT.NONE);
+ FormData fdLink = new FormData();
+ fdLink.top = new FormAttachment(wVersion, Const.MARGIN);
+ fdLink.left = new FormAttachment(wLogo, 0);
+ fdLink.right = new FormAttachment(100, 0);
+ composite.setLayoutData(fdLink);
+ composite.setLayout(new GridLayout(1, false));
+ props.setLook(composite);
+
+ Link wLink = new Link(composite, SWT.WRAP | SWT.MULTI);
+ wLink.setText("<a href=\"https://hop.apache.org\">hop.apache.org</a>");
+ wLink.addListener(SWT.Selection, e -> Program.launch("https://hop.apache.org"));
+ wLink.setLayoutData(new GridData(SWT.CENTER, SWT.FILL, true, true));
+ props.setLook(wLink);
+
+ // Buttons
+ Button wOk = new Button(shell, SWT.PUSH);
+ wOk.setText(BaseMessages.getString(PKG, "System.Button.OK"));
+ wOk.addListener(SWT.Selection, e -> ok());
+ BaseTransformDialog.positionBottomButtons(shell, new Button[] {wOk}, Const.MARGIN, null);
+
+ // Widget system properties
+ Text wText = new Text(shell, SWT.READ_ONLY | SWT.MULTI | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
+ wText.setText(getProperties());
+ FormData fdText = new FormData();
+ fdText.top = new FormAttachment(wLogo, Const.MARGIN);
+ fdText.left = new FormAttachment(0, 0);
+ fdText.right = new FormAttachment(100, 0);
+ fdText.bottom = new FormAttachment(wOk, -Const.MARGIN);
+ wText.setLayoutData(fdText);
+ props.setLook(wText);
+
+ // Detect [X] or ALT-F4 or something that kills this window...
+ shell.addShellListener(
+ new ShellAdapter() {
+ public void shellClosed(ShellEvent e) {
+ ok();
+ }
+ });
+
+ shell.open();
+ while (!shell.isDisposed()) {
+ if (!display.readAndDispatch()) {
+ display.sleep();
+ }
+ }
+ }
+
+ private String getProperties() {
+
+ StringBuilder builder = new StringBuilder();
+ Arrays.sort(PROPERTIES);
+ for (String name : PROPERTIES) {
+ builder.append(name);
+ builder.append('=');
+ builder.append(System.getProperty(name,""));
+ builder.append('\n');
+ }
+
+ return builder.toString();
+ }
+
+ public void dispose() {
+ shell.dispose();
+ }
+
+ private void ok() {
+ dispose();
+ }
+}
diff --git a/ui/src/main/resources/org/apache/hop/ui/hopgui/dialog/messages/messages_en_US.properties b/ui/src/main/resources/org/apache/hop/ui/hopgui/dialog/messages/messages_en_US.properties
index ee66f7c..8aa59dd 100644
--- a/ui/src/main/resources/org/apache/hop/ui/hopgui/dialog/messages/messages_en_US.properties
+++ b/ui/src/main/resources/org/apache/hop/ui/hopgui/dialog/messages/messages_en_US.properties
@@ -17,7 +17,7 @@
#
#
#
-
+AboutDialog.Title=About
AnalyseImpactProgressDialog.RuntimeError.UnableToAnalyzeImpact.Exception=Problem encountered generating impact list\: {0}
AnalyseImpactProgressDialog.Dialog.UnableToAnalyzeImpact.Title=Error checking pipeline
GetSQLProgressDialog.Dialog.UnableToGenerateSQL.Title=Error generating SQL for pipeline
diff --git a/ui/src/main/resources/ui/images/hop_logo.svg b/ui/src/main/resources/ui/images/hop_logo.svg
deleted file mode 100644
index dd57620..0000000
--- a/ui/src/main/resources/ui/images/hop_logo.svg
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- version="1.1"
- id="Livello_1"
- x="0px"
- y="0px"
- width="80.08448"
- height="80.00547"
- viewBox="0 0 80.08448 80.005465"
- enable-background="new 0 0 419.53 595.28"
- xml:space="preserve"
- sodipodi:docname="hop_logo.svg"
- inkscape:version="0.92.4 (5da689c313, 2019-01-14)"><metadata
- id="metadata9"><rdf:RDF><cc:Work
- rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage"/><dc:title></dc:title></cc:Work></rdf:RDF></metadata>
- <defs
- id="defs7"/>
- <sodipodi:namedview
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1"
- objecttolerance="10"
- gridtolerance="10"
- guidetolerance="10"
- inkscape:pageopacity="0"
- inkscape:pageshadow="2"
- inkscape:window-width="640"
- inkscape:window-height="480"
- id="namedview5"
- showgrid="false"
- inkscape:zoom="32"
- inkscape:cx="30.548347"
- inkscape:cy="34.35906"
- inkscape:current-layer="Livello_1"
- fit-margin-top="0"
- fit-margin-left="0"
- fit-margin-right="0"
- fit-margin-bottom="0"/>
-
- <rect
- style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:2.4749999;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers fill stroke"
- id="rect898"
- width="77.609482"
- height="77.530472"
- x="1.2375"
- y="1.2375"/>
- <path
- d="m 34.55418,31.865252 c -1.807984,1.928035 -2.965842,4.64207 -3.473329,8.141242 l -2.462765,16.978315 c -0.507488,3.499695 -0.136525,6.21292 1.112055,8.140958 0.477845,0.71464 1.250305,1.410987 2.316847,2.089017 1.065698,0.678573 2.562882,1.017455 4.492112,1.017455 1.964878,0 3.56961,-0.338882 4.81444,-1.017455 1.24454,-0.67803 2.209565,-1.374377 2.89563,-2.089017 1.80825,-1.928038 2.965843,-4.641263 3.473063,-8.140958 L 50.185,40.006494 c 0.507463,-3.499172 0.137225,-6.213207 -1 [...]
- id="path2"
- inkscape:connector-curvature="0"
- style="fill:#000000;fill-opacity:1;stroke-width:0.27172738"/></svg>
\ No newline at end of file
diff --git a/ui/src/main/resources/ui/images/logo_hop.svg b/ui/src/main/resources/ui/images/logo_hop.svg
new file mode 100644
index 0000000..1712996
--- /dev/null
+++ b/ui/src/main/resources/ui/images/logo_hop.svg
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
+ sodipodi:docname="logo_hop.svg"
+ id="svg32"
+ viewBox="0 0 512.00002 512.00002"
+ height="512pt"
+ width="512pt"
+ version="1.1">
+ <metadata
+ id="metadata38">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs36" />
+ <sodipodi:namedview
+ inkscape:current-layer="svg32"
+ inkscape:window-maximized="0"
+ inkscape:window-y="0"
+ inkscape:window-x="0"
+ inkscape:cy="505.49151"
+ inkscape:cx="565.11167"
+ inkscape:zoom="2.1879343"
+ showgrid="false"
+ id="namedview34"
+ inkscape:window-height="1255"
+ inkscape:window-width="2612"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0"
+ guidetolerance="10"
+ gridtolerance="10"
+ objecttolerance="10"
+ borderopacity="1"
+ bordercolor="#666666"
+ pagecolor="#ffffff" />
+ <rect
+ y="-0.68557811"
+ x="-0.68557817"
+ height="513.84088"
+ width="514.52649"
+ id="rect986"
+ style="fill:#033d5d;fill-opacity:1;stroke-width:0.519195;stroke-linecap:round;stroke-linejoin:round" />
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-st [...]
+ d="m 450.74235,214.50802 c -2.88745,20.28937 -9.59656,35.65629 -20.11979,46.09622 -11.24242,11.25302 -26.40494,16.87348 -45.48601,16.87348 l 4.07453,-28.62163 c 7.8326,0 13.28196,-0.90393 16.35414,-2.7118 3.06914,-1.80939 5.07534,-3.21147 6.0232,-4.21989 5.07386,-4.6181 8.58663,-13.75436 10.5323,-27.41638 1.02959,-7.23149 1.2537,-13.05181 0.67529,-17.47458 -0.57384,-4.41672 -1.84875,-7.83261 -3.81408,-10.2431 -1.96838,-2.40898 -4.65141,-4.01548 -8.04913,-4.81948 -3.40377,-0.80247 -7 [...]
+ id="path951-1" />
+</svg>
diff --git a/ui/src/main/resources/ui/images/logo_icon.svg b/ui/src/main/resources/ui/images/logo_icon.svg
new file mode 100644
index 0000000..37416ba
--- /dev/null
+++ b/ui/src/main/resources/ui/images/logo_icon.svg
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
+ sodipodi:docname="logo_icon.svg"
+ id="svg32"
+ viewBox="0 0 48.000001 48.000002"
+ height="48pt"
+ width="48pt"
+ version="1.1">
+ <metadata
+ id="metadata38">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs36" />
+ <sodipodi:namedview
+ inkscape:current-layer="svg32"
+ inkscape:window-maximized="0"
+ inkscape:window-y="0"
+ inkscape:window-x="0"
+ inkscape:cy="27.400388"
+ inkscape:cx="-30.935922"
+ inkscape:zoom="4.9220178"
+ showgrid="false"
+ id="namedview34"
+ inkscape:window-height="1255"
+ inkscape:window-width="2612"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0"
+ guidetolerance="10"
+ gridtolerance="10"
+ objecttolerance="10"
+ borderopacity="1"
+ bordercolor="#666666"
+ pagecolor="#ffffff" />
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-st [...]
+ d="m 40.722651,30.877314 c 0,9.460954 -7.669665,17.130619 -17.130619,17.130619 -9.461195,0 -17.130858,-7.669665 -17.130858,-17.130619 0,-9.460952 7.669663,-17.130616 17.130858,-17.130616 9.460954,0 17.130619,7.669664 17.130619,17.130616"
+ id="path957-7" />
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-st [...]
+ d="m 27.151703,37.971659 c -2.366321,-2.670082 -3.42083,-6.253141 -2.976257,-10.096881 h 0.01132 l 1.963872,-13.93701 0.391377,-2.835928 4.837589,0.366587 -6.8561,-11.33552696 -8.485395,10.17318596 4.729754,0.358402 -0.490547,3.405664 -0.442166,3.107679 -1.3756,9.922857 h -2.33e-4 l -7.23e-4,0.0057 -0.106384,0.768315 h 0.03249 c -0.440721,5.246056 1.122626,10.164758 4.451748,13.921122 1.99468,2.250547 4.478941,3.914505 7.275398,4.924242 2.494611,-1.027791 4.69124,-2.627965 6.430538, [...]
+ id="path963-0" />
+</svg>