Alle Nachrichten und Formatierungsanweisungen sind in einer Datei gespeichert. Das Format ist ähnlich dem von XML (wird später komplett auf XML umgestellt).
Jeder Text zwischen den Befehlen <news> und </news> wird ausgegeben, wobei mehrfach vorhandene Leerzeichen zwischen Wörtern und Newlines entfernt werden. Alle Befehle gelten jeweils zwischen <tag> und </tag>. Mit <tag/> wirkt ein Befehl bis zum nächsten Befehl gleichen Namens und wird nicht geschlossen, was für <position> sinnvoll ist. <position/> kann auch außerhalb von einem News-Block angegeben werden. Dadurch legt man eine Startposition für jeden folgenden News-Block fest.
Zur Schreiberleichterung reicht es, wenn man nur den ersten Buchstaben von Befehl und Parameter angibt (z.B. <f n="Arial">).
Außer <ticker> kann jeder Befehl mehrfach verwendet werden und bis auf <news> und <ticker> können alle Befehle beliebig verschachtelt werden.
Befehle für den Newsbereich:
Befehlsbeispiel | Ergebnis |
---|---|
<font name="Arial" size=12 color=#000000> | Ändert den Font |
<bold> | Fett |
<italic> | Kursiv |
<position x=100 y=200> | Positionsangabe für den nachfolgenden Text |
<effect class="test"> | Effektangabe mit beliebigen Parametern |
<canvas image="hintergrund.gif" color=#000000> | Hintergrundbild oder Farbe |
<link target="http://xyz"> | Link für News |
Die gesamte Datei kann optional vom Befehl <ticker> eingeleitet und mit </ticker> beendet werden. Als Parameter kann play="ordered" oder play="random" angegeben werden, um die Reihenfolge der Anzeige der Nachrichten festzulegen. Der <ticker>-Befehl kann nur einmal in der Datei verwendet werden.
Eine Nachricht wird mit dem Befehl <news> definiert. Sobald dieser Befehl gelesen wird, werden alle aktuellen Einstellungen zwischengespeichert und beim Beenden des Blocks wiederhergestellt. Damit kann bspw. ein <position>-Befehl auf mehrere News-Blocks wirken. Wird <news/> angegeben, dann gilt der Block bis zum nächsten <news/>, <news>, </ticker> oder Dateiende.
Sonstige Befehle:<!-- Kommentar -->
Sonderzeichen:
Token | Ergebnis |
---|---|
\> | > |
\< | < |
\ (Backslash gefolgt von einem Leerzeichen) | explizites Leerzeichen |
\\ | \ |
Intern werden mehrere Zustände für den Ticker verwaltet:
Name | Typ |
---|---|
fontName | String |
fontSize | int |
fontColor | Color |
bold | boolean |
italic | boolean |
effectClass | String |
effectParameter | Hashtable (parameter: String -> value: [Integer | String]) |
canvasImage | Image |
canvasColor | Color |
link | URL |
position | Point |
Die können durch die jeweiligen Befehle geändert werden, wobei mit <tag/> der alte Zustand nicht gespeichert wird und nach </tag> der jeweils betroffene (alle für </news>) Zustand vor <tag> wiederhergestellt wird.
Während des Parsens der Datei wird eine Liste von News-Objekten aufgebaut, die je nach play-Parameter dann abgespielt wird. In den Pausen beim Anzeigen werden bereits Aktivitäten für die anderen News ausgeführt, z.B. Bilder laden usw.
Um die Größe des Applets klein zu halten, wird kein Lex/Yacc für das Parsen verwendet, sondern ein direkter Ansatz, der mit 2 Zuständen arbeitet und direkt die Newsliste aufbaut, indem jeder gelesene Befehl eine entsprechende Aktion auslöst, z.B. <news> das Speichern eines evtl. bereits vorhandenen News-Objekts und das Anlegen eines neuen News-Objekts.
In der ersten Beta-Version sind alle Befehle realisiert und zwei Effekte. Zum einen der ShowEffekt, der den Text direkt anzeigt und als zweiter Effekt der WordEffekt, der eine News wortweise einblendet, wobei von der Canvas-Color zur Text-Color überblendet wird.
Hier das aktuelle Klassendiagramm:
NewsFile ::= <ticker [Parameters] > [CmdList] </ticker> | <ticker [Parameters] /> [CmdList] | [CmdList] CmdList ::= < [Cmd] [Parameters] > [CmdList] </ [Cmd] [Parameters] > | < [Cmd] [Parameters] /> [CmdList] | <!-- [CommentText] --> | leer Cmd ::= news | n | font | f | bold | b | italic | i | position | p | effect | e | canvas | c | link Parameters ::= [Parameters] [Parameter] | leer Parameter ::= [Identifier] = [Value] Identifier ::= folgender regulärer Ausdruck: [a-zA-Z_]*[a-zA-Z0-9]* Value ::= String | Int | Hex String ::= Text in Anführungszeichen eingeschlossen, wobei \" für " steht Int ::= folgender regulärer Ausdruck: [0-9]* Hex ::= folgender regulärer Ausdruck: #[0-9a-fA-F]* CommentText ::= beliebiger String, in dem nicht das Zeichen '>' vorkommt