ENGLISH VERSION |
|
Links | | | Forum | | | Kommentare | | | News melden |
Chat | | | Umfragen | | | Newsticker | | | Archiv |
amiga-news.de Forum > Programmierung > GUI Markup Language | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
-1- 2 | [ - Beitrag schreiben - ] |
01.06.2011, 18:13 Uhr AGSzabo Posts: 1663 Nutzer |
Hallo, ich hatte gerade Lust ein kleines GUI in Form einer Markup Language zu entwerfen. Das ist jetzt blos Theorie. Hier das GUI: Bild: http://images.quicktunnels.net/OXML.png Hier das Script: XML code:<WINDOW title="Memory Monitor" undermouse="TRUE" layout="TRUE" RELPTR="g_pic_window"> <VERT> <TITLE text="bitplane" /> <FRAME style="bevel" hprop="TRUE" vprop="TRUE"> <PLANEVIEW RELPTR="g_picview" /> </FRAME> <HORIZ spaceprop="FALSE"> <CHECK senschar="z" hook="zoom_hook" RELPTR="g_zoom_check" /> <LABEL text="zoom" linechar="1" /> </HORIZ> </VERT> </WINDOW> Auf meine GUI Bibliothek zugeschnitten könnte dann daraus durch einen Compiler folgendes werden: M68k Assmbler code:dc.l OX_WINDOW,.window_001 dc.l TAG_END .window_001 dc.l oxWA_title,.wa_title_001 dc.l oxWA_undermouse,TRUE dc.l oxWA_layout,TRUE dc.l OX_RELPTR,g_pic_window dc.l OX_VERT,.vert_001 dc.l TAG_END .wa_title_001 dc.b "Memory Monitor",0 even .vert_001 dc.l OX_TITLE,.title_001 dc.l OX_FRAME,.frame_001 dc.l OX_HORIZ,.horiz_001 dc.l TAG_END .title_001 dc.l oxTA_text,.ta_title_001 dc.l TAG_END .ta_title_001 dc.b "bitplane",0 even .frame_001 dc.l oxFrA_framestyle,oxFr_BEVEL dc.l oxFrA_hprop,TRUE dc.l oxFrA_vprop,TRUE dc.l planeview,.planeview_001 dc.l TAG_END .planeview_001 dc.l OX_RELPTR,g_picview dc.l TAG_END .horiz_001 dc.l oxGA_spaceprop,FALSE dc.l OX_CHECK,.check_001 dc.l OX_LABEL,.label_001 dc.l TAG_END .check_001 dc.l oxChkA_senschar,"z" dc.l oxChkA_hook,zoom_hook dc.l OX_RELPTR,g_zoom_check dc.l TAG_END .label_001 dc.l oxLabA_text,.laba_text_001 dc.l oxLabA_linechar,1 dc.l TAG_END .laba_text_001 dc.b "zoom",0 even Hat jemand Lust so einen Compiler zu schreiben? -- Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux [ Dieser Beitrag wurde von AGSzabo am 01.06.2011 um 18:24 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
01.06.2011, 19:28 Uhr Thore Posts: 2266 Nutzer |
Klingt zwar schön und gut, doch wie soll das Compilat aussehen? Soll es eine eigene GUI Engine werden (wie MUI, Intuition, Boopsi...) oder eine der vorhandenen benutzen? Etwas eigenes zu machen ist nicht "nur ein Compiler" entwerfen, sondern ein komplettes GUI System. Das ist nicht nur Buttons und Checkboxen malen, sondern auch Hierarchien, Events etc zu implementieren. Kannst Du hier etwas nährere Infos geben? Ah ok ich sehe gerade, du hast OX als Beispiel angegeben. Gibt es für OX bereits ein Developer Paket? [ Dieser Beitrag wurde von Thore am 01.06.2011 um 19:30 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
01.06.2011, 19:43 Uhr AGSzabo Posts: 1663 Nutzer |
@Thore: Nö, so ein Paket existiert nicht, falls du ne guide meinst. Es gibt nur einen Haufen Beispielsources und Includefiles mit vielen Kommentaren. Das Komplilat wäre eine liste mit assembler-daten definitionen die verschachtelte taglists enthalten. ich habe schonmal mit dem konzept für den compiler angefangen. irgendwie will ich das teil halt haben. die markup sprache heisst jetzt OXML! es spricht imo auch was dafür so ne markup sprache auch in andere gui systeme übersetzen zu können, zb mui. -- Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux [ Dieser Beitrag wurde von AGSzabo am 01.06.2011 um 19:53 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
01.06.2011, 22:08 Uhr Der_Wanderer Posts: 1229 Nutzer |
NTUI macht (fast) genau das. Allerdings ist es relativ unsinnig, 68K ASM Code zu erzeugen. Der "Compiler" sollte lediglich ein Parser für den XML Code sein und zur Laufzeit interpretieren und die GUI aufbauen. Das ist ja gerade der Vorteil an Scripting, dass es nicht zur Compilezeit bereits existieren muss. Bild: http://www.hd-rec.de/pics/ntui_skin1.png -- -- Author of HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr... Homepage: http://www.hd-rec.de [ - Antworten - Zitieren - Direktlink - ] |
01.06.2011, 22:09 Uhr Thore Posts: 2266 Nutzer |
Unter einem Developer Paket versteht man in erster Linie Dateien, die der Programmierer zum direkten Programmieren deiner Programmteile verwenden kann. Dazu gehört neben einer Anleitung eben auch die Header/Include-Dateien, Beispielcodes, evtl. Linklibs und Shared Libs. Nach deiner Beschreibung existiert sowas also schon Das Compilat wäre also nur sowas wie Du da aufgeschrieben hast? Sowas ist wirklich machbar. Um alle Objekte und Möglichkeiten (Events, Verschachtelung, ...) von XML nach ASM zu konvertieren, bräuchte man mehr Hintergrundwissen, z.b. wie die Elemente übersetzt heißen. Das könnte man den Headerdateien entnehmen. Wie soll die Assemblerliste klarmachen, wie die Objekte liegen (Position) und wie sie hierarchisch verbunden sind? Welche Events hängen an den Objekten? Für MUI brauchts das meiner Meinung nach nicht, da die defines sehr gut ausgeklügelt sind, um ein Pseudo-Script im Sourcecode zu integrieren. Damit wird MUI in C zu programmieren wie Scripting. Feine Sache [ - Antworten - Zitieren - Direktlink - ] |
01.06.2011, 22:38 Uhr AGSzabo Posts: 1663 Nutzer |
NTUI scheint wirklich toll zu sein, aber soweit ich weiss ist das auf BlitzBasic fixiert? Naja, jedem sein GUI. Meins ist eben für die Einbindung in M68K gedacht. Das GUI direkt durch parsen zu erstellen, wozu soll das gut sein? Immerhin muss man (bei mir) die addressen bestimmter erzeugter objekte in globale variablen des programms schreiben können, um später auf diese objekte direkt zugreiffen zu können. Die Informationen in den Headerdateien reichen nicht bzw sind ungünstig zur beschreibung der übersetzung. entweder man macht ein paar hardgecodete strukturen oder bedient sich einer weiteren beschreibungsprache, entwirft also sowas änliches wie die headerdateien aber für genau den Zweck des Übersetzens des GUIs in den Assembler Quelltext. Die Namen der Attribute und Klassen im Ziel-Code sind einfach das was man im XML code findet plus ein prefix. Das ist einfach. Man muss aber wissen zB wissen ob es sich bei einem Parameter um einen String handelt. Positionen und Hierarchien gehen in OX per horizontalen oder vertikalen Gruppen und änlichem. Im moment ist mir bis zu einem gewissen Punkt klar, wie der Compiler zu coden sei, blos dass manche elemente nicht andere elemente enthalten können, sondern nur)individuelle unterelemente. Eine Gruppe kann zB fast beliebige andere elemente enthalten, ein Menu aber nur Menu Items, wobei letztere aber keine eigene Klasse sind, sondern im Menu mit drin sind. Ich hoffe ich konnte es erklären. -- Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux [ - Antworten - Zitieren - Direktlink - ] |
01.06.2011, 22:43 Uhr Holger Posts: 8116 Nutzer |
Zitat:Nicht wirklich. Wenn man mal versucht hat, ein komplexes GUI damit zu bauen, merkt man sehr schnell, dass es eine Krücke ist, die ein Sprachelement, das nicht mal richtiges C ist (Präprozessor) für etwas zu missbrauchen, für das es niemals gedacht war (hierarchische Datenstrukturen definieren). Nicht falsch verstehen, dass ganze ist im Rahmen des Möglichen wirklich gut, der Rahmen des Möglichen ist halt leider sehr begrenzt. Eine sorgfältig entworfene XML-Anwendung wäre dafür definitiv sinnvoll, auch deshalb, weil es systemübergreifend diverse nützliche Werkzeuge dafür gibt, und eine Transformation innerhalb weniger Stunden implementiert, wenn man XSLT verwenden würde. Und aus einer Beschreibung Code für verschiedene Toolkits generieren zu können, wäre auch nicht unbedingt schlecht. -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
01.06.2011, 22:52 Uhr Holger Posts: 8116 Nutzer |
Zitat:Man kann es beispielsweise ändern, ohne das Programm neu übersetzen zu müssen. Das ermöglicht es auch, dass User für ihre Umgebung angepasste GUIs erzeugen können, somit kann ein Programm sowohl für 640x256, als auch 1680x1050 das optimale GUI anbieten. Zitat:Dafür gibt es IDs. Zitat:Ja, und genau diese Informationen musst Du liefern, wenn Dir jemand so einen Compiler schreiben soll. Zitat:Dann solltest Du die Art und Weise, wie Du den Compiler schreiben wolltest, noch mal überdenken. Ein XSLT-Prozessor mit verifizierendem XML-Parser liefert Dir das alles frei Haus, sofern Du eine DTD oder ein Schema und natürlich das XSLT-Skript definierst. -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
01.06.2011, 23:01 Uhr Der_Wanderer Posts: 1229 Nutzer |
NTUI ist selbst momentan (noch) in Amiblitz3 geschrieben. Die Library wird man aber natürlich in jeder anderen Sprache ganz normal nutzen können. Es steht aber zwecks Portierbarkeit noch ein C Port an. Was ich meinte ist, dass der XML Code keinen Quelltext erzeugen sollte (wie z.B. C oder ASM), sondern interpretiert werden sollte. Dadurch ergibt sich eine enorme Flexibilität. Anders wären z.b. auch die GUIs der DSP Effekte in HD-Rec nicht machbar, da ich ja zur Compilezeit von HD-Rec noch nicht weis welche DSP Effekte es geben wird. Und es soll ja nicht jeder DSP Effekt seine eigene GUI Engine mitbringen. NTUI ist natürlich erstmal eine Shared Library mit Funktionen wie code:ntui_BeginWindow("Demo"); ntui_Label("Test"); ntui_Button("myButton","Click me!"); ntui_EndWindow(); aber man kann das ganze auch in XML definieren: code:und dann<Window title="Demo"> <Label text="Test"> <Button text="Click me!" id="myButton"); </Window> ntui_CreateFromXML(const char* xml); bzw. ntui_CreateFromXMLFile(const char* filename); aufrufen, was das gleiche bewirkt. So solltest du das auch machen. Pointer auf die Widgets holt man sich über die ID, die ein String ist. Oder man verzichtet ganz auf Pointer und interagiert mit der GUI komplett über die IDs. In NTUI geht beides. -- -- Author of HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr... Homepage: http://www.hd-rec.de [ - Antworten - Zitieren - Direktlink - ] |
01.06.2011, 23:13 Uhr AGSzabo Posts: 1663 Nutzer |
@Der_Wanderer: > Und es soll ja nicht jeder DSP Effekt seine eigene GUI Engine mitbringen. Bei mir bringt zB jede Klasse ihr eigenes Beispiel-GUI mit, in dem sie sich selbst vorstellt (Demo Window). Warum kann es nicht auch jeder DSP-Effekt so machen? Wie machst Du bei Dir zB nen Click-Hook für einen Button? -- Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux [ - Antworten - Zitieren - Direktlink - ] |
01.06.2011, 23:21 Uhr AGSzabo Posts: 1663 Nutzer |
Zitat:Zitat:Ja, und genau diese Informationen musst Du liefern, wenn Dir jemand so einen Compiler schreiben soll. Ich weis ja noch nicht, was Deine gebrachten Kürzel wie zB XSLT bedeuten, ich hab mal kurz bei wikipedia geschaut, aber mir es scheint sinnvoll für diese Beschreibungen wieder XML code zu verwenden. ZB hier die Umschreibung für die Fenster-Klasse: XML code:<CLASS name="WINDOW" attrprefix="W"> <ATTRIBUTE name="name" type="string" /> </CLASS> -- Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux [ Dieser Beitrag wurde von AGSzabo am 01.06.2011 um 23:25 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
01.06.2011, 23:33 Uhr Kaesebroetchen Posts: 643 Nutzer |
@AGSzabo: Vielleicht wäre ja Feelin etwas für dich ? Damit kannst du einfach per XML GUIs erstellen. -- http://amidevcpp.amiga-world.de/ [ - Antworten - Zitieren - Direktlink - ] |
01.06.2011, 23:43 Uhr AGSzabo Posts: 1663 Nutzer |
@Kaesebroetchen: Nett! Btw, ich wollte mal ein GUI für den OS4 port von UADE machen. Gibts schon eins? -- Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux [ - Antworten - Zitieren - Direktlink - ] |
02.06.2011, 00:10 Uhr Thore Posts: 2266 Nutzer |
>Nicht falsch verstehen, dass ganze ist im Rahmen des Möglichen wirklich gut, der Rahmen des Möglichen ist halt leider sehr begrenzt. Ja es kommt immer drauf an was man machen will. Für komplexere Sachen kannst die defines ja einfach nicht benutzen oder Elemente dynamisch hinzuadden. Das ist mit MUI ebenfalls möglich. Es soll nur eine Erleichtrung sein, eine GUI scriptähnlich aufzubauen. Dafür find ich das wirklich gut. Zur XML als Script Lösung bin ich zwiegespalten und hab diesbezüglich keine 100%ig feste Meinung: XML ist zwar eine gute Beschreibung die unendlich Möglichkeiten bietet, allerdings muss der Parser diese Möglichkeiten kennen (logischer Aspekt, XMLs aus anderen Versionen können inkompatibel sein) und das Programm muss immer mit dem passenden XML mitgeliefert sein. Sinn oder Unsinn die GUI zu 100% in Userhand zu legen (als Script) ist sicher ein streitbares Thema. Kommt aufs Programm an würd ich sagen, aber _generell_ ist die Idee nicht so prickelnd. Hier stehen sich Dynamische Änderung und Bequemlichkeit gegenüber mit Programmstabilität und ggf Sicherheit. Kommt also wohl aufs Programm an obs angebracht ist oder nicht. Feelin hatte ich mir seinerzeit angeschaut, und jetzt weiß ich wieder die die GUI mit dem XML heißt Danke für die Erinnerung. Fand es auch recht schick, aber dann gings mir sicher wie den meisten Leuten Ich bin zu MUI zurückgekehrt.... es hat mir damals mehr gegeben als Feelin [ - Antworten - Zitieren - Direktlink - ] |
02.06.2011, 01:05 Uhr Holger Posts: 8116 Nutzer |
Zitat:Das vermischt zwei Dinge. Schema wäre das, was in einer XML-Syntax beschreibt, welche Elemente und Attribute existieren und wo sie erlaubt sind, bzw. welche Werte für de Attribute gültig sind. XSLT beschreibt, wie eine gültige XML-Datei in eine andere Form transformiert werden soll. Für das, was Du oben beschrieben hast, sähe eine mögliche XSLT-Datei so aus: XSLT code:Sie weicht in ein paar Punkten ab. Zum einen überlässt sie das Generieren der Label-IDs dem jeweils verwendeten Prozessor, das müssen somit nicht zwangsläufig laufende Nummern sein. Zum anderen habe ich alle String-Definitionen an Ende hinter die Tags gelegt. Das halte ich für sinnvoller als Strings und Tags zu mischen und alle naselang potentiell Padding-Bytes einzufügen. Durch die Trennung sind alle Tags 4-byte aligned, sofern der erste 4-byte aligned ist und das ohne ein einziges padding-byte.<?xml version="1.0" encoding="iso-8859-1"?> <?xml version="1.0" encoding="iso-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="ISO-8859-1" indent="no"/> <xsl:template match="/"> <xsl:apply-templates select="." mode="tags"/> <xsl:apply-templates mode="strings"/> </xsl:template> <xsl:template match="*" mode="tags"> <xsl:variable name="n" select="name()"/> .<xsl:value-of select="concat($n,generate-id())"/> <xsl:apply-templates select="@*" mode="tags"/> <xsl:apply-templates mode="ref"/> dc.l TAG_END <xsl:apply-templates mode="tags"/> </xsl:template> <xsl:template match="@*" mode="tags"> dc.l ox<xsl:apply-templates select="parent::node()" mode="prefix"/>_<xsl:value-of select="concat(name(),',',.)"/> </xsl:template> <xsl:template match="@senschar" mode="tags"> dc.l oxChkA_senschar,"<xsl:value-of select="."/>" </xsl:template> <xsl:template match="@RELPTR" mode="tags"> dc.l OX_<xsl:value-of select="concat(name(),',',.)"/> </xsl:template> <xsl:template match="@title|@text" mode="tags"> dc.l ox<xsl:apply-templates select="parent::node()" mode="prefix"/>_<xsl:value-of select="concat(translate(name(), 'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ'), ',.',name(),generate-id())"/> </xsl:template> <xsl:template match="*" mode="ref"> dc.l OX_<xsl:value-of select="concat(name(),',.',name(),generate-id())"/> </xsl:template> <xsl:template match="*" mode="strings"> <xsl:for-each select="@title|@text"> .<xsl:value-of select="concat(name(),generate-id())"/> dc.b "<xsl:value-of select="."/>",0</xsl:for-each> <xsl:apply-templates mode="strings"/> </xsl:template> <!-- tag id prefixes --> <xsl:template match="WINDOW" mode="prefix">WA</xsl:template> <xsl:template match="HORIZ|VERT" mode="prefix">GA</xsl:template> <xsl:template match="FRAME" mode="prefix">FrA</xsl:template> <xsl:template match="TITLE" mode="prefix">TA</xsl:template> <xsl:template match="PLANEVIEW" mode="prefix">???????</xsl:template> <xsl:template match="CHECK" mode="prefix">ChkA</xsl:template> <xsl:template match="LABEL" mode="prefix">LabA</xsl:template> <!-- ignore text pi and so on --> <xsl:template match="node()" mode="ref" priority="-1"/> <xsl:template match="node()" mode="tags" priority="-1"/> <xsl:template match="node()" mode="strings" priority="-1"/> </xsl:stylesheet> Ein Resultat der Transformation (in diesem Fall mit Xalan) Deiner oben geposteten XML-Datei würde so aussehen: Assembler code:Übrigens können auch Webbrowser XML+XSLT verarbeiten. Wenn Du <?xml-stylesheet type="text/xsl" href="ui2asm.xsl"?> an den Anfang Deiner XML-Datei schreibst, versuchen sie die XSLT-Datei zu verwenden, um die XML-Datei darzustellen. Wenn obige XSLT-Datei unter dem Namen ui2asm.xsl abgespeichert wurde, zeigt der Browser also den Assembler-Code an (habe ich mit Firefox und Internet Explorer getestet)..WINDOWN65538 dc.l OX_RELPTR,g_pic_window dc.l oxWA_layout,TRUE dc.l oxWA_TITLE,.titleN65542 dc.l oxWA_undermouse,TRUE dc.l OX_VERT,.VERTN65545 dc.l TAG_END .VERTN65545 dc.l OX_TITLE,.TITLEN65547 dc.l OX_FRAME,.FRAMEN65550 dc.l OX_HORIZ,.HORIZN65559 dc.l TAG_END .TITLEN65547 dc.l oxTA_TEXT,.textN65548 dc.l TAG_END .FRAMEN65550 dc.l oxFrA_hprop,TRUE dc.l oxFrA_style,bevel dc.l oxFrA_vprop,TRUE dc.l OX_PLANEVIEW,.PLANEVIEWN65555 dc.l TAG_END .PLANEVIEWN65555 dc.l OX_RELPTR,g_picview dc.l TAG_END .HORIZN65559 dc.l oxGA_spaceprop,FALSE dc.l OX_CHECK,.CHECKN65562 dc.l OX_LABEL,.LABELN65567 dc.l TAG_END .CHECKN65562 dc.l OX_RELPTR,g_zoom_check dc.l oxChkA_hook,zoom_hook dc.l oxChkA_senschar,"z" dc.l TAG_END .LABELN65567 dc.l oxLabA_linechar,1 dc.l oxLabA_TEXT,.textN65569 dc.l TAG_END .titleN65542 dc.b "Memory Monitor",0 .textN65548 dc.b "bitplane",0 .textN65569 dc.b "zoom",0 -- Edit: Doppelung entfernt [ Dieser Beitrag wurde von Holger am 02.06.2011 um 09:56 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
02.06.2011, 01:16 Uhr Holger Posts: 8116 Nutzer |
Nachtrag: Ich hab's natürlich auch mal auf nem Amiga getestet, Systemunabhängigkeit hin oder her Hiermit: http://aminet.net/package/text/misc/xsltproc funktioniert es. Es werden zwar im Vergleich zu anderen Prozessoren ein paar zusätzliche Zeilenumbrüche generiert, aber die tun ja nicht weh. -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
02.06.2011, 01:29 Uhr AGSzabo Posts: 1663 Nutzer |
@Holger: Wow, so compliziert hatte ich mir das garnicht vorgestellt. Aber wenn es funktioniert ... es sieht sehr vielversprechend aus und man kann das "kompilieren" mit schon bestehender software erledigen, wenn ich das richtig verstanden habe. an den attributen muss noch etwas geschraubt werden. so soll es zb nicht oxhook,zoom_hook heissen, sondern oxChkA_hook,zoom_hook "Chk" ist dabei der prefix für die attribute der check-klasse und das ox und das A (für Attribut) wird drangesetzt. -- Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux [ - Antworten - Zitieren - Direktlink - ] |
02.06.2011, 01:30 Uhr Holger Posts: 8116 Nutzer |
Zitat:Der Parser ist ein generischer XML-Parser und bekommt, so man denn verifizieren will, eine DTD oder ein Schema vom Programm, und akzeptiert somit nur, was das Programm verarbeiten kann. Prinzipiell kann man aber auch eine Syntax für beliebige Erweiterungen definieren, deren Code man dann laden kann. Wenn Programme beliebige Plugins laden können, die sich nur dadurch auszeichnen, dass ihr Code in einem bestimmten Verzeichnis liegt, warum dann nicht auch Erweiterungen, die anhand einer XML-Deklaration beschrieben werden... Zitat:Das ist eine grundsätzliche Frage. Vertraut man dem Benutzer, für den man das Programm ja schreibt, oder geht man den Apple-Weg. Angesichts dessen, was Benutzer auf dem Amiga schon via Patches Programmen untergejubelt haben, sind via XML konfigurierbare GUIs eher harmlos. Die Programmstabilität leidet nicht unter einem GUI, das via XML beschrieben wird. Das GUI besteht unabhängig von der Quelle seiner Beschreibung immer nur aus einem Layout von vordefinierten Komponenten. Ob Button A links oder rechts von Button B liegt, hat keine Auswirkungen auf die Programmlogik. Das Programm muss nur vor dem Übernehmen einer GUI-Beschreibung verifizieren, dass für alle in der XML-Datei definieren Bindungs (Aktionen, Datenquellen, etc.) auch wirklich eine Entsprechung im Programm bekannt ist und dass für bestimmte Programmaktivitäten auch ein zugehöriges GUI-Element definiert wurde. Mindestens das Zurücksetzen des GUIs auf den Default, bzw. das erneute Laden eines anderen GUIs sollte im jeweiligen GUI möglich sein. -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
02.06.2011, 01:44 Uhr Holger Posts: 8116 Nutzer |
Zitat:Ach, das geht schon. Der initiale Aufwand ist etwas hoch und die XSLT-Sprache etwas gewöhnungsbedürftig. Aber das Ding verarbeitet schon beliebige Elemente und Attribute und braucht nur geringfügige Änderungen für Erweiterungen. Ein weiteres textuelles Attribut muss z.B. nur an der richtigen Stelle namentlich eingefügt werden, ohne weiteren Code zu benötigen. Zitat:Ja, das hab ich, glaube ich, dreimal erwähnt Zitat:Du wirst es nicht glauben, aber genau das ist schon drin. Irgendwie habe ich das Kunststück fertig gebracht, den Output einer älteren Fassung zu posten, obwohl das XSLT darüber schon fertig und getestet war. Deshalb habe ich auch nicht noch mal auf den Output drauf geschaut. Aber wenn Du in das XSLT schaust, wirst Du etwas von "prefix" lesen. Und wenn Du es ausprobierst, wirst Du auch die gewünschten Attribute sehen. -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
02.06.2011, 07:38 Uhr AGSzabo Posts: 1663 Nutzer |
@Holger: Und aus hook="zoom_hook" wird dc.l oxChkA_hook,zoom_hook mit label für den code ganz unten nach den strings? Kann man das XSLT auf mehrere Dateien aufteilen damit zB jede neue Klasse ihre eigenen Kompilier-Regeln mitbrigen kann? Die Benennung mit _001 ... _002 und so weiter hat mir besser gefallen, und zwar nicht global sondern per klasse und per attribut, wie in meinem Eingangsbeispiel. Geht das? -- Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux [ Dieser Beitrag wurde von AGSzabo am 02.06.2011 um 07:41 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
02.06.2011, 08:19 Uhr AGSzabo Posts: 1663 Nutzer |
@holgerZitat:Zitat:Dann solltest Du die Art und Weise, wie Du den Compiler schreiben wolltest, noch mal überdenken. Ist jetzt geschehen. Ich verwende mal meine eigene 'regelsprache' um es zu verdeutlichen. Die Frage ist ja, ob das mit dem XSLT auch geht. XML code:<CLASS name="MENU" prefix="M" allowobjects="false"> <ATTR name="popup" type="bool" /> <ATTR name="hook" type="label" /> <!-- erzeugt eine Zeile "dc.l oxMA_separator,0", "noclose" steht dafür dass dieses element nicht geschlossen werden braucht --> <SUB name="separator" type="noclose" /></SUB> <SUB name="ITEM" prefix="MI"> <ATTR name="text" type="string" /> <ATTR name="ID" type="number" /> <ATTR name="exclude" type="words" /> <SUB name="separator" type="noclose" /></SUB> <!-- allow recursive from allready defined entity named "ITEM" --> <RECUR name="ITEM" /> </SUB> </CLASS> Und so sieht das MENU objekt in der GUI definition aus: XML code:<MENU popup="TRUE" hook="menu_hook"> <ITEM text="Datei"> <ITEM text="laden"></ITEM> <ITEM text="speichern"></ITEM> <SEPARATOR /> <ITEM text="beenden"></ITEM> </ITEM> <ITEM text="Ansicht"> <ITEM text="Vollbild"></ITEM> <ITEM text="klein"></ITEM> <ITEM text="groß"></ITEM> </ITEM> <ITEM text="Optionen"> <ITEM text="Opt 1" id="1" exclude="2, 3"></ITEM> <ITEM text="Opt 2" id="2" exclude="1, 3"></ITEM> <ITEM text="Opt 3" id="3" exclude="1, 2"></ITEM> </ITEM> </MENU> Wir sehen hier, dass das MENU nicht andere objekte (allowobjects="false") sondern nur eigene sub-elemente beinhalten kann (ITEM). Außerdem kann ein ITEM wieder weitere ITEMS rekursiv enthalten (<RECUR name="ITEM" />). Das Kompilat aus dem Menu-Script (in Auszügen): asm code:--dc.l OX_MENU,.menu_001 dc.l TAG_END .menu_001 dc.l oxMA_popup,TRUE dc.l oxMA_hook,menu_hook dc.l oxMA_item,.item_001 dc.l oxMA_item,.item_002 dc.l oxMA_item,.item_003 dc.l TAG_END .item_001 dc.l oxMIA_text,.mi_text_001 dc.l oxMIA_item,.item_001_001 dc.l oxMIA_item,.item_001_002 dc.l oxMIA_separator,0 dc.l oxMIA_item,.item_001_002 dc.l TAG_END .item_002 dc.l oxMIA_text,.mi_text_002 ... dc.l TAG_END .item_003 ... dc.l oxMIA_item,.item_003_001 ... dc.l TAG_END .item_003_001 dc.l oxMIA_text,.mi_text_00x dc.l oxMIA_exclude,.mi_exclude_001 dc.l TAG_END .mi_exclude dc.w 2,3 dc.w 0 ; exclude list end .mi_text_001 dc.b "Datei",0 .mi_text_002 dc.b "Ansicht" ... .mi_text_00x dc.b "Opt 1",0 ... even Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux [ Dieser Beitrag wurde von AGSzabo am 02.06.2011 um 08:42 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
02.06.2011, 10:50 Uhr Holger Posts: 8116 Nutzer |
Zitat:Das kannst Du haben, halte ich aber nicht für sinnvoll. Was willst Du mit einem leeren Label? Wenn Du ihn mit Code füllen willst, solltest Du das in einer anderen Datei tun, als der, die bei der nächsten Änderung der XML-Datei übergebügelt wird. Zitat:Klar, aber momentan braucht es gar keine eigenen Regeln, von den Präfixen und ein paar Inkonsistenzen in Deiner Definition abgesehen. Zitat:Grundsätzlich denke ich schon, dass das geht. Es verkompliziert das Ganze allerdings und das ohne jeglichen Mehrwert. Wenn Du eine XML-Datei als Ausgangsbasis hast, solltest Du auch nur diese als Source-Code ansehen und den Assembler-Code als Zwischenschritt, der nicht unbedingt perfekter Lesbarkeit genügen muss. Zitat:Es lohnt sich durchaus, dafür Schema zu verwenden (erlernen). Wenn Du Deine Syntax mit einem XML-Schema beschreibst, kann der Parser auch überprüfen, ob die Eingangsdatei gemäß dieser Beschreibung korrekt ist. XSLT tut das nicht, was allerdings auch gut so ist, denn das vereinfacht die Transformation erheblich, weil man sich nur auf das jeweilige Ziel-Format konzentrieren kann. Zitat:Das ist für die Transformation gar nicht relevant, da deren Aufgabe, wie gesagt, nicht das Verifizieren der Struktur ist. Der Vorteil zeigt sich genau hier, weil die Erweiterung nur minimale Änderungen erfordert (rot hervorgehoben): code:<?xml version="1.0" encoding="iso-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="ISO-8859-1" indent="no"/> <xsl:template match="/"> <xsl:apply-templates select="." mode="tags"/> <xsl:apply-templates mode="strings"/> </xsl:template> <xsl:template match="*" mode="tags"> <xsl:variable name="n" select="name()"/> .<xsl:value-of select="concat($n,generate-id())"/> <xsl:apply-templates select="@*" mode="tags"/> <xsl:apply-templates mode="ref"/> dc.l TAG_END <xsl:apply-templates mode="tags"/> </xsl:template> <xsl:template match="@*" mode="tags"> dc.l ox<xsl:apply-templates select="parent::node()" mode="prefix"/>_<xsl:value-of select="concat(name(),',',.)"/> </xsl:template> <xsl:template match="@senschar" mode="tags"> dc.l oxChkA_senschar,"<xsl:value-of select="."/>" </xsl:template> <xsl:template match="@RELPTR" mode="tags"> dc.l OX_<xsl:value-of select="concat(name(),',',.)"/> </xsl:template> <xsl:template match="@title|@text" mode="tags"> dc.l ox<xsl:apply-templates select="parent::node()" mode="prefix"/>_<xsl:value-of select="concat(translate(name(), 'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ'), ',.',name(),generate-id())"/> </xsl:template> <xsl:template match="*" mode="ref"> dc.l OX_<xsl:value-of select="concat(name(),',.',name(),generate-id())"/> </xsl:template> <xsl:template match="MENU/ITEM|ITEM/ITEM" mode="ref"> dc.l ox<xsl:apply-templates select="parent::node()" mode="prefix"/>_item,.<xsl:value-of select="concat(name(),generate-id())"/> </xsl:template> <xsl:template match="*" mode="strings"> <xsl:for-each select="@title|@text"> .<xsl:value-of select="concat(name(),generate-id())"/> dc.b "<xsl:value-of select="."/>",0</xsl:for-each> <xsl:apply-templates mode="strings"/> </xsl:template> <!-- tag id prefixes --> <xsl:template match="WINDOW" mode="prefix">WA</xsl:template> <xsl:template match="HORIZ|VERT" mode="prefix">GA</xsl:template> <xsl:template match="FRAME" mode="prefix">FrA</xsl:template> <xsl:template match="TITLE" mode="prefix">TA</xsl:template> <xsl:template match="PLANEVIEW" mode="prefix">???????</xsl:template> <xsl:template match="CHECK" mode="prefix">ChkA</xsl:template> <xsl:template match="LABEL" mode="prefix">LabA</xsl:template> <xsl:template match="MENU" mode="prefix">MA</xsl:template> <xsl:template match="ITEM" mode="prefix">MIA</xsl:template> <!-- ignore text pi and so on --> <xsl:template match="node()" mode="ref" priority="-1"/> <xsl:template match="node()" mode="tags" priority="-1"/> <xsl:template match="node()" mode="strings" priority="-1"/> </xsl:stylesheet> -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
02.06.2011, 11:08 Uhr AGSzabo Posts: 1663 Nutzer |
@Holger: Ich habe Respekt vor Deinem Wissen aber ich glaube, daß es der Einfachkeit halber für meine Zwecke völlig ausreicht, das einfache Schema wie ich darstellte zu verwenden. Imo wird das ebenso von gewissen tools unterstützt, glaube ich. Sowohl für das Schema als auch für die GUI definitionen kann ich, bevor ich die Inhalte auswerte, alles in strukturen lesen, zB m68k include code:STRUCTURE oxmlEntity,0 STRUCT oxmlE_Node,MLN_SIZE APTR oxmlE_TagName STRUCT oxmlE_AttrList,MLH_SIZE STRUCT oxmlE_EntitiesList,MLH_SIZE LABEL oxmlE_SIZEOF STRUCTURE oxmlAttr,0 STRUCT oxmlA_Node,MLN_SIZE APTR oxmlA_Name APTR oxmlA_Data LABEL oxmlA_SIZEOF Dafür gibts vielleicht sogar schon ne library? Das mit der Rekursion könnte ich trotzem wie du schriebst ausbügeln: XML code:<ENTITY name="MENU" prefix="M" allowobjects="false" allow="MENU/SEPARATOR, MENU/ITEM"> <ATTR name="popup" type="bool" /> <ATTR name="hook" type="label" /> </ENTITY> <ENTITY name="MENU/SEPARATOR" type="noclose"></ENTITY> <ENTITY name="MENU/ITEM" prefix="MI" allow="MENU/SEPARATOR, MENU/ITEM" allowobjects="false"> <ATTR name="text" type="string" /> <ATTR name="ID" type="number" /> <ATTR name="exclude" type="words" /> </ENTITY> -- Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux [ Dieser Beitrag wurde von AGSzabo am 02.06.2011 um 11:36 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
03.06.2011, 16:46 Uhr Thore Posts: 2266 Nutzer |
Du kannst auch ein Parent Parameter einführen, z.B. <ENTITY name="ITEM" parent="MENU" .... [ - Antworten - Zitieren - Direktlink - ] |
03.06.2011, 16:47 Uhr Holger Posts: 8116 Nutzer |
Zitat:Welche Tools sollen das sein? Wenn Du bestehende Tools verwenden willst, musst Du auch eine bestehende Beschreibungssprache verwenden. Natürlich kannst Du auch auf die Verifizierung verzichten, dann erzeugt eine fehlerhafte GUI-Beschreibung eben auch fehlerhaften Code. In Projekten mit überschaubaren Rahmen kann man auch mit dem shit-in-shit-out Prinzip etwas zustande bringen. Zitat:Zu welchem Zweck? Um das selber zu programmieren, was die schon existierenden Tools mit dem hier schon geposteten Skript frei Haus liefern? Zitat:Dafür gibt's im Aminet sogar zwei, expat und libxml. Guckst Du einfach mal unter http://aminet.net/search?query=XML -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
03.06.2011, 16:51 Uhr AGSzabo Posts: 1663 Nutzer |
@Thore: hihi, genau das hatte ich schon ... und verworfen zu gunsten sowas:XML code:<ENTITY name="MENU" prefix="M" objects="0"> <!-- false=0=none, yes=true=-1, 1-n --> <ATTR name="popup" type="bool" /> <ATTR name="hook" type="label" /> <ENTITY name="SEPARATOR" private="true" close="false"></ENTITY> <ENTITY name="ITEM" private="true" prefix="MI" objects="none" recursive="true"> <ATTR name="text" type="string" /> <ATTR name="ID" type="number" /> <ATTR name="exclude" type="words" /> </ENTITY> </ENTITY> der clou ist dabei das private="true". wenn das fehlt, wird ein kind-objekt des globalen typs name="xyz" erzeugt statt zB nem subitem im menu. @Holger: mein konzept unterstützt aber schon verifizierung. danke für die lib links. -- Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux [ Dieser Beitrag wurde von AGSzabo am 03.06.2011 um 17:03 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
03.06.2011, 17:04 Uhr Holger Posts: 8116 Nutzer |
Zitat:Bei XML-Sprachen kann es durchaus auch vorkommen, dass ein Element in mehr als einem Parent-Typen vorkommen darf. So darf z.B. Item sowohl in Menu als auch in Item vorkommen, sofern man kein spezielles SubItem Element einführt. Somit gibt es schon in diesem Beispiel zwei mögliche Parents. Ich bevorzuge beim Design solcher Schnittstellen, die Diversifizierung der Elemente zu reduzieren und dadurch weniger Regeln zu erzeugen. Weniger Regel heißt, weniger Code zum Überprüfen und weniger mögliche Fehler. Das heißt, wenn ein Item hier letztendlich ein Art von Aktion beschreibt, warum dann nicht ein Action-Element definieren, das je nach Kontext unterhalb von Menu ein Menu-Item, unterhalb von Toolbar ein Toolbar-Item und überall sonst ein Button erzeugt? Dann braucht man nicht drei unterschiedliche Elemente, die nur an bestimmten Orten erlaubt sind, sondern nur eines, das nahezu überall erlaubt ist: weniger Regel, weniger mögliche Fehler. Und wenn man noch die unsäglichen Präfixe abschafft, würde sich der Code auf einen Bruchteil reduzieren. Entweder Tags haben unterschiedliche Bedeutung und somit auch unterschiedliche Namen oder sie meinen das Gleiche und können auch gleich heißen. In jedem Fall kommt man ohne Präfixe aus. Also, wozu ein oxTA_text Tag und ein oxLabA_text Tag, wenn beide eh dasselbe meinen, nämlich Text, womit ein einziges ox_text ausreichen würde? Im Grund ist oxWA_title auch dasselbe in Grün. Wenn man dann noch eine konsistente Groß-/ Kleinschreibung einhalten würde, wäre das Skript zur XML-Asm Konvertierung schätzungsweise ein Fünfzeiler... -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
03.06.2011, 17:11 Uhr Holger Posts: 8116 Nutzer |
Zitat:Ersetze "ENTITY" durch "element" und "ATTR" durch "attribute" und bist sehr nah an dem, wie es in Schema definiert wird. Nur dass Schema all die Dinge berücksichtigt, die Du noch vergessen hast. Wie z.B., wie man definiert, dass ein bestimmtes Element auch unterhalb eines weiteren Elements erscheinen darf oder wie man ganz einfach deklariert, dass sich ein bestimmtes Element im wesentlichen genauso wie ein bestimmtes anderes verhalten soll, also zum Beispiel, wie man sagt, dass für "HORIZ" genau die gleichen Regeln wie für "VERT" gelten. -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
03.06.2011, 17:12 Uhr AGSzabo Posts: 1663 Nutzer |
> Bei XML-Sprachen kann es durchaus auch vorkommen, dass ein Element in mehr als einem Parent-Typen vorkommen darf. So darf z.B. Item sowohl in Menu als auch in Item vorkommen, sofern man kein spezielles SubItem Element einführt. Somit gibt es schon in diesem Beispiel zwei mögliche Parents. Genau darum hab ich es jetzt so wie oben grad eben gezeigt. :-) Deine Reduktion der Tags auf das nötigste verstehe ich. mache ich aber nicht. Ein fünfzeiler? Scheint verlockend! Ich habe zum Spass mal den XML-Parser in asm angefangen, der hat schon 400 zeilen (mit vielen leer- und kommentarzeilen zur übersichtlickeit)... nur für spass. -- Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux [ Dieser Beitrag wurde von AGSzabo am 03.06.2011 um 17:26 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
03.06.2011, 17:19 Uhr AGSzabo Posts: 1663 Nutzer |
@Holger: > Ersetze "ENTITY" durch "element" und "ATTR" durch "attribute" und bist sehr nah an dem, wie es in Schema definiert wird. Namen sind imo nicht so wichtig. Ich sehe nicht ein, warum ich mich da an Schema halten soll. > Nur dass Schema all die Dinge berücksichtigt, die Du noch vergessen hast. Wie z.B., wie man definiert, dass ein bestimmtes Element auch unterhalb eines weiteren Elements erscheinen darf Wenn objects nicht "false" ist, dürfen alle verfügbaren objekte unterhalb erscheinen. man könnte noch objects="NAME1 NAME2 NAME3" machen um nur bestimmte klassen zuzulassen. > oder wie man ganz einfach deklariert, dass sich ein bestimmtes Element im wesentlichen genauso wie ein bestimmtes anderes verhalten soll, also zum Beispiel, wie man sagt, dass für "HORIZ" genau die gleichen Regeln wie für "VERT" gelten. Es gelten in der Tat die gleichen regeln. Im moment hab ich blos keine Idee ... vielleicht XML code:<ENTITY name="VERT" RULES="HORIZ"> Geht nur wenn horiz existiert... -- Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux [ - Antworten - Zitieren - Direktlink - ] |
-1- 2 | [ - Beitrag schreiben - ] |
amiga-news.de Forum > Programmierung > GUI Markup Language | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
Impressum |
Datenschutzerklärung |
Netiquette |
Werbung |
Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten. |