amiga-news 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? :bounce:

--
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! :D

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:
Original von Thore:
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 :)

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:
Original von AGSzabo:
Das GUI direkt durch parsen zu erstellen, wozu soll das gut sein?

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:
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.
Dafür gibt es IDs.
Zitat:
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.
Ja, und genau diese Informationen musst Du liefern, wenn Dir jemand so einen Compiler schreiben soll.
Zitat:
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.
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:
<Window title="Demo">
  <Label text="Test">
  <Button text="Click me!" id="myButton");
</Window>

und dann

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:
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.
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 :D 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:
Original von AGSzabo:
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>


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:
<?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>

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.

Ein Resultat der Transformation (in diesem Fall mit Xalan) Deiner oben geposteten XML-Datei würde so aussehen:
Assembler code:
.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

Ü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).

--
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:
Original von Thore:
XML ist zwar eine gute Beschreibung die unendlich Möglichkeiten bietet, allerdings muss der Parser diese Möglichkeiten kennen ... und das Programm muss immer mit dem passenden XML mitgeliefert sein.

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:
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.
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:
Original von AGSzabo:
@Holger:

Wow, so compliziert hatte ich mir das garnicht vorgestellt.

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:
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.
Ja, das hab ich, glaube ich, dreimal erwähnt ;)
Zitat:
an den attributen muss noch etwas geschraubt werden. so soll es zb nicht

oxhook,zoom_hook

heissen, sondern

oxChkA_hook,zoom_hook

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
@holger

Zitat:
Zitat:
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.
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:
Original von AGSzabo:
@Holger:
Und aus hook="zoom_hook" wird dc.l oxChkA_hook,zoom_hook mit label für den code ganz unten nach den strings?

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:
Kann man das XSLT auf mehrere Dateien aufteilen damit zB jede neue Klasse ihre eigenen Kompilier-Regeln mitbrigen kann?
Klar, aber momentan braucht es gar keine eigenen Regeln, von den Präfixen und ein paar Inkonsistenzen in Deiner Definition abgesehen.
Zitat:
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?
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:
@holger
Ich verwende mal meine eigene 'regelsprache' um es zu verdeutlichen. Die Frage ist ja, ob das mit dem XSLT auch geht.

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:
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 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:
Original von AGSzabo:
...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.

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:
Sowohl für das Schema als auch für die GUI definitionen kann ich, bevor ich die Inhalte auswerte, alles in strukturen lesen, ...
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 gibts vielleicht sogar schon ne library?
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:
Original von Thore:
Du kannst auch ein Parent Parameter einführen, z.B.
<ENTITY name="ITEM" parent="MENU" ....

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:
Original von AGSzabo:
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>


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.
.