ich versuche mich gerade darin eine kleine Anwendung zu basteln, die eine SVG-Datei schreiben soll.
Das Beispiel aus https://wiki.freepascal.org/fpvectorial#SVG habe ich zum Laufen bekommen.
Jetzt sagt die W3 SVG Spezifikation, dass jedes Element bei Bedarf ein "title"- und/oder ein "desc"-Element haben darf. Diese beiden Elemente werden nicht dargestellt, sondern dienen zur inneren Erklärung, können aber von geeigneten Programmen als "Tooltip" dargestellt werden, wenn ein entsprechendes Element (wie auch immer) ausgewählt wird.
Wird ein entsprechendes SVG-Dokument z.B. in einen Browser geladen und fährt man mit der Maus über ein Element welches einen "title" enthält, wird der Inhalt als kleines Textfeld angezeigt.
Technisch wird das Ganze als XML-Element innerhalb einer Gruppe realisiert.
Ausgehend von dem Beispiel aus der o.a. Seite sähe das so aus:
Code: Alles auswählen
<g>
<title>Text in english</title>
<text
x="35.433"
y="318.897"
font-family="Arial,Helvetica,sans-serif"
font-size="35.43"
fill="#000000"
>10,10 Some text in english.</text>
</g>
Leider gibt es innerhalb der Unit fpvectorial keine Elemente die diese Optionen bieten und ich bin ziemlich unschlüssig wo das eingebaut werden könnte.
Ein Weg mit der Brechstange ginge vielleicht so:
Alle geschriebenen Elemente in procedure TvSVGVectorialWriter.WriteEntity(...) (in Datei svgvectorialwriter.pas, Zeile 374) sind von TvNamedEntity abgeleitet. Diese Klasse verfügt über eine public Property "Name" von Typ String, welche nirgends verwendet wird.
In procedure TvSVGVectorialWriter.WriteEntity(...) könnte eine einfache Abfrage über Length(TvNamedEntity(AEntity).Name) > 0 ein umschließendes "<g>"-Element erzeugen und ein zusätzliches "<title>%s</title>" einfügen, mit %s ersetzt mit Name.
Sauberer wäre natürlich die Klasse TvEntity um eine Property "Desc" und "Title" zu erweitern, das würde aber dann Änderungen in zwei Units erfordern.
Eine schöne Lösung ohne Änderung in den Units sehe ich nicht, es fehlen dazu leider passende Events in procedure TvSVGVectorialWriter.WriteEntity(...), wie bspw. "OnBeforeWritingEntity" und "OnAfterWritingEntity" oder "OnWritingEntity".
Aber vielleicht stehe ich ja auf dem Schlauch und jemand hilft mir freundlich über die Straße.
Grüße aus Hildesheim
Ekkehard