BlitzBasic Portal

Kommentare anzeigen Worklog abonnieren
Gehe zu Seite Zurück  1, 2

Worklogs BlitzBasic Portal

Eigene Dateien

Dienstag, 23. Februar 2010 von D2006
Hellas folks,

es mag zwar blöd sein, ein und dasselbe an zwei verschiedenen Stellen im Forum vorzustellen, aber erstens kriegt man so später beim Lesen dieses Worklogs mit, wann was in welcher Reihenfolge kam, und zweitens ist die neue Dateiverwaltung in den Eigenen Dateien einfach mal so cool, dass das sein muss! Smile

Arrow Hier geht's zur Ankündigung im Portal-Forum.

Bei der Entwicklung fielen mir zwei Bugs im Showcase auf. Wenn man seinen Eintrag bearbeitet und per "Galeriebild auswählen" oder "Download auswählen" das jeweils dazugehörige Popup anforderte, so wurde das einem mit einem Fehler 404 bedankt. Warum in aller Welt ist das nie jemandem aufgefallen? Nunja, jetzt geht's wieder.

Die Funktion der ungelesenen Worklogs macht wohl hin und wieder immernoch Probleme. Da sich das immer schlecht reproduzierend lässt, bitte ich um Geduld. Sollte die NEU-Markierung partout nicht verschwinden, bitte ich alle "blitzforum_wl" Cookies zu löschen (könnten zwei sein) und es dann noch mindestens zwei Mal zu probieren.

Die Eigenen Dateien waren ein ganzer Brocken Arbeit, aber die Motivation ist ungebrochen. Demnächst also: Wie endlich das Kommentieren besser werden kann... stay tuned!

Ungelesene Worklogs

Montag, 15. Februar 2010 von D2006
Ich habe soeben eingebaut, dass man Forum-like über ungelesene Worklogs informiert wird. Diese haben in der Liste ein fettes "Neu: " vorm Namen stehen. Außerdem tauchen sie in BBP Live auf.

Ich erwähnte übrigens letztens nicht, dass es im Showcasebereich in der Sidebar nun einen Link zu den eigenen Projekten gibt.

Nachgelegt: Nach Wünschen aus dem Chat habe ich im Dateiarchiv-Bereich das Forumlar zum Hochladen vor die Dateileiste gesetzt, damit man nicht mehr so weit scrollen muss.

Ausgebessert: (18.02.2010) Nachdem nun endlich mal wieder jemand einen Worklog-Eintrag schrieb, konnte ich hier die in den Kommentaren erwähnten Probleme nachvollziehen und beheben. Die "Neu:"-Markierung sollte nun nach dem Lesen wirklich verschwinden. Für Interessierte: die Cookie-Domain "www.blitzforum.de" war falsch. Das "www." musste weg.

Kleine Verbesserungen im Showcase

Samstag, 6. Februar 2010 von D2006
Was schon ewig gestört hat: Jedwede Änderung eines Showcase-Eintrags führte bisher unweigerlich dazu, dass der Eintrag wieder ganz oben in der Liste der neusten Projekte erschien. Selbst wenn man nur einen Schreibfehler beseitigte, oder einen toten Download erneuerte. Jetzt muss man beim Speichern explizit ein Häkchen setzen, wenn man möchte, dass der Eintrag "gepusht" wird. Dies sollte natürlich nur bei größeren Änderungen geschehen, zum Beispiel bei einer neuen Hauptversion mit neuen Featues.

Bisher begegnete einem nach dem Editieren die Meldung, dass der Eintrag wieder gesperrt wurde, und man doch bitte etwas Geduld bis zur Freigabe haben sollte. Das war allein totaler Unfug, weil das Editieren nie zu einer Sperrung führte. Und da diese nie ausgenutzt wurde, habe ich die Meldung nun ausgebaut und stattdessen einen Link zum Eintrag hinplatziert.

Weiterhin hab ich einige "Schlechter Deutsch"-Fehler bei der Genreansicht entfernt. Wählte man "Sonstiges" aus, stand da tatsächlich "Die neusten / besten Sonstiges"... peinlich!

Update, die Zweite

Mittwoch, 15. Juli 2009 von hamZta
Hab' heute scheinbar einen fleissigen Tag Wink

BB-Codes Nr. 2
Ich hab den Vorschlag von Xeres beherzigt, wenn man auf die BB-Code-Buttons klickt werden jetzt immer Start- und Endtag eingefügt, der Cursor steht in der Mitte. So kann man flott und fröhlich weitertippen Smile
Ich bin mir noch nicht 100% sicher ob alles so läuft wie es soll, also bitte testet das neue Feature und schreit sofort wenn ihr Fehler entdeckt!
edit: Und der nächste Vorschlag von Xeres umgesetzt: Neben URL gibts nun die Buttons BB und BM für BB-/BM-Syntaxhighlighting.

Profilupdate
Im Profil finden sich nun zusätzlich die Anzahl der Worklogs inkl. Link dazu und die Anzahl und Namen der Teams in denen ein Benutzer ist.
edit: Und schon den ersten Fehler entdeckt: In Worklogs waren die Änderungen der BB-Code-Buttons noch nicht drin. Fixed!

mfg,
hamZta

My home is my castle

Mittwoch, 15. Juli 2009 von hamZta
Damn you, Scriptkiddie!
Nachdem wir wieder mal Ziel einer Scriptkiddie-DoS-Attacke waren blockiert unser Server derartige Angriffe nun (hoffentlich Wink) automatisch. Das ganze braucht bestimmt noch ein wenig Feineinstellung aber ich denke es wird sehr hilfreich sein. Mögen sich die zornigen Kinder die Zähne ausbeissen!

Achtung: Sollte jemand von dem System plötzlich unschuldigerweise ausgesperrt werden, schreibt bitte eine Mail an webmaster@blitzforum.de, wir kümmern uns dann darum.


BB-Codes, formiert euch!
Was mich schon länger nervte hab ich jetzt endlich ausgebessert: BB-Codes werden jetzt, wenn man die Buttons dafür benutzt nicht mehr ans Ende des Textes eingefügt sondern an die Position des Cursors. Sollte das bei jemandem Probleme wg. JavaScript geben so möge sich derjenige bitte melden.

Direktlinks in Worklogs
Werden die meisten vermutlich schon wissen: Bei Worklogeinträgen gibts nun neben dem Datum ein kleines Icon mit einem Link zu dem entsprechenden Beitrag, ähnlich Forenbeiträgen. Damit kann man nur schön direkt auf bestimmte Einträge verweisen. Danke an Kernle für den Hinweis Wink

Das war's soweit, schönen Tag wünscht
hamZta

Syntax Highlighting

Montag, 20. April 2009 von YellowRider
Wie schon im Thread geschrieben, besitzt das Portal nun eine Funktion zum Highlighten von BlitzBasic und BlitzMax Code. Bei BlitzBasic Quelltexten werden alle Keywords hervorgehoben, die auch in der Hilfe vorhanden sind. Bei BlitzMax Quelltexten werden ebenfalls alle Befehle hervorgehoben, allerdings nur die verlinkt, die es auch in BlitzBasic gibt.

Das Syntax Highlighting wird verwendet, indem man den Quelltext mit
Code: [AUSKLAPPEN]
[syntax="bb"] ... [/syntax]

bzw. mit
Code: [AUSKLAPPEN]
[syntax="bmax"] ... [/syntax]

umschließt.

Zusätzlich werden nun Tabs auch als Tabs dargestellt und beim Kopieren in einen Editor bleiben sie auch vorhanden. Falls ihr Probleme mit dem Einfügen in eine BlitzBasic-IDE habt, benutzt bitte "Paste" im Edit-Menü.

Ein Beispiel, wie das Ganze dann aussieht:
BlitzMax: [AUSKLAPPEN]
'This BMX file was edited with BLIde ( http://www.blide.org )
SuperStrict
Import bah.libxml

Local cg:TCodeGenerator = New TCodeGenerator
Local file:String = Input("File to parse: ")
cg.start(file)
Print "<Program shuts down in 3 sec>"
Delay 3000
End


Type TCodeGenerator
Field out:TStream
Field default_out:String
Field types:TMap

Method New()
types = CreateMap()
default_out = "Default.bmx"
End Method

Method start(filename:String)
Print "Start processing file: " + filename
Local doc:TxmlDoc = TxmlDoc.parseFile(filename)
If doc = Null Print "Could not parse document";Return
Local node:TxmlNode = doc.getRootElement()
If node = Null Print "Could not get a root element"; Return
out = WriteFile(node.getAttribute("out"))
If out = Null out = WriteFile(default_out)
Parse(node)
doc.free()
write()
CloseFile(out)
Print "Successfully finished"
End Method

Method parse(node:TxmlNode)
If node.getName() <> "CodeGenerator" Return

Local children:TList = node.getChildren()
If children = Null Return
For Local c:TxmlNode = EachIn children
Select c.getName()
Case "Type" parseType(c)
Case "Connect" parseConnection(c)
End Select
Next
End Method

Method write()
For Local t:DType = EachIn MapValues(Self.types)
t.write(out)
Next
End Method

Method parseType:DType(node:TxmlNode)
Local t:DType
If node.getName() <> "Type" Return Null

Local id:String = node.getAttribute("id")
Local bbdoc:Byte = Byte(node.getAttribute("bbdoc"))
t = DType.Create(id)
t.bbdoc = bbdoc
addType(t)

Local children:TList = node.getChildren()
If children = Null Return t
For Local c:TxmlNode = EachIn children
Select c.getName()
Case "Field"
parseField(c, t)
End Select
Next
Return t
End Method

Method addType(t:DType)
MapInsert(types, t.id, t)
End Method

Method getType:DType(id:String)
Return DType(MapValueForKey(types, id))
End Method

Method parseField(node:TxmlNode, t:DType)
Local f:DField
If node.getName() <> "Field" Return

Local id:String = node.getAttribute("id")
Local datatype:String = node.getAttribute("datatype")
Local val:String = node.getAttribute("value")
Local set:Byte = Byte(node.getAttribute("setter"))
Local get:Byte = Byte(node.getAttribute("getter"))

f = DField.Create(id, datatype, val)
t.addVar(f)

If set
Local setter:DMethod = New DMethod
setter.setId("set" + Upper(Left(id, 1)) + Mid(id, 2))
setter.setBBdocText("setter for " + f.id + ":" + f.datatype)
setter.addInput("val:" + f.datatype)
setter.addContent("Self." + f.id + " = " + "val")
t.addMethod(setter)
End If

If get
Local getter:DMethod = New DMethod
getter.setId("get" + Upper(Left(id, 1)) + Mid(id, 2))
getter.setBBdocText("getter for " + f.id + ":" + f.datatype)
getter.setOutput(f.datatype)
getter.addContent("Return " + f.id)
t.addMethod(getter)
EndIf

Local children:TList = node.getChildren()
If children = Null Return
For Local c:TxmlNode = EachIn children
Select c.getName()
End Select
Next
End Method

Method parseConnection(node:TxmlNode)
If node.getName() <> "Connect" Return

Local type1:DType = Self.getType("T" + node.getAttribute("type1"))
Local type2:DType = Self.getType("T" + node.getAttribute("type2"))

Local t1Name:String = node.getAttribute("link1Id")
Local t2Name:String = node.getAttribute("link2Id")

If t1Name = "" t1Name:String = Mid(type1.id, 2)
If t2Name = "" t2Name:String = Mid(type2.id, 2)

Local linkType:String = node.getAttribute("linkType")



If linkType = "bi121"
bidirectionalOneToOne(type1:DType, type2:DType, t1Name:String, t2Name:String)
ElseIf linkType = "mono121"
monoDirectionalOneToOne(type1:DType, type2:DType, t1Name:String, t2Name:String)
ElseIf linkType = "monoM21"
monoDirectionalManyToOne(type1:DType, type2:DType, t1Name:String, t2Name:String)
EndIf


Local children:TList = node.getChildren()
If children = Null Return
For Local c:TxmlNode = EachIn children
Next
End Method

Method bidirectionalOneToOne(type1:DType, type2:DType, t1Name:String, t2Name:String)
Local linkVarName:String = Lower(t2Name) + "Link"
Local m1Linker:DMethod = New DMethod
Local m1LinkRemover:DMethod = New DMethod

If t1Name = "" t1Name:String = Mid(type1.id, 2)
If t2Name = "" t2Name:String = Mid(type2.id, 2)

type1.addLinkVar(DField.Create(linkVarName, type2.id))
m1Linker.setId("set" + t2Name)
m1Linker.addInput("obj:" + type2.id)
m1Linker.addInput("call:byte = true")
m1Linker.addContent("if call obj.set" + t1Name + "(Self,false)")
m1Linker.addContent(linkVarName + " = obj")
type1.addMethod(m1Linker)

m1LinkRemover.setId("remove" + t2Name)
m1LinkRemover.addContent("if " + linkVarName + " = Null Return")
m1LinkRemover.addContent("local val:" + type2.id + " = " + linkVarName)
m1LinkRemover.addContent(linkVarName + " = Null")
m1LinkRemover.addContent("val.remove" + t1Name + "()")
type1.addMethod(m1LinkRemover)
type1.destructor.addContent(m1LinkRemover.id + "()")

linkVarName:String = Lower(t1Name) + "Link"
Local m2Linker:DMethod = New DMethod
Local m2LinkRemover:DMethod = New DMethod

type2.addLinkVar(DField.Create(linkVarName, type1.id))
m2Linker.setId("set" + t1Name)
m2Linker.addInput("obj:" + type1.id)
m2Linker.addInput("call:byte = true")
m2Linker.addContent("if call obj.set" + t2Name + "(Self,false)")
m2Linker.addContent(linkVarName + " = obj")
type2.addMethod(m2Linker)

m2LinkRemover.setId("remove" + t1Name)
m2LinkRemover.addContent("if " + linkVarName + " = Null Return")
m2LinkRemover.addContent("local val:" + type1.id + " = " + linkVarName)
m2LinkRemover.addContent(linkVarName + " = Null")
m2LinkRemover.addContent("val.remove" + t2Name + "()")
type2.addMethod(m2LinkRemover)
type2.destructor.addContent(m2LinkRemover.id + "()")
End Method

Method monoDirectionalOneToOne(type1:DType, type2:DType, t1Name:String, t2Name:String)
Local linkVarName:String = Lower(t2Name) + "Link"
Local m1Linker:DMethod = New DMethod
Local m1LinkRemover:DMethod = New DMethod

t1Name = Upper(Left(t1Name, 1)) + Mid(t1Name, 2)
t2Name = Upper(Left(t2Name, 1)) + Mid(t2Name, 2)

type1.addLinkVar(DField.Create(linkVarName, type2.id))
m1Linker.setId("set" + t2Name)
m1Linker.addInput("obj:" + type2.id)
m1Linker.addContent(linkVarName + " = obj")
type1.addMethod(m1Linker)

m1LinkRemover.setId("remove" + t2Name)
m1LinkRemover.addContent("if " + linkVarName + " = Null Return")
m1LinkRemover.addContent(linkVarName + " = Null")
type1.addMethod(m1LinkRemover)
type1.destructor.addContent(m1LinkRemover.id + "()")
End Method

Method monoDirectionalManyToOne(type1:DType, type2:DType, t1Name:String, t2Name:String)
Local linkVarName:String = Lower(t2Name) + "Link"
Local collectionName:String = Lower(t1Name) + "List"
Local m1Linker:DMethod = New DMethod
Local m1LinkRemover:DMethod = New DMethod

t2Name = Upper(Left(t2Name, 1)) + Mid(t2Name, 2)
t1Name = Upper(Left(t1Name, 1)) + Mid(t1Name, 2)

type1.addLinkVar(DField.Create(linkVarName, type2.id))
type1.addLinkVar(DField.Create("_" + linkVarName, "TLink"))
m1Linker.setId("set" + t2Name)
m1Linker.addInput("obj:" + type2.id)
m1Linker.addInput("call:byte = True")
m1Linker.addContent("If " + linkVarName + " <> Null self.remove" + t2Name + "()")
m1Linker.addContent(linkVarName + " = obj")
m1Linker.addContent("if call _" + linkVarName + " = obj.add" + t1Name + "(self,false)")
type1.addMethod(m1Linker)

m1LinkRemover.setId("remove" + t2Name)
m1LinkRemover.addContent("if " + linkVarName + " = Null Return")
m1LinkRemover.addContent(linkVarName + " = Null")
m1LinkRemover.addContent("removeLink(_" + linkVarName + ")")
type1.addMethod(m1LinkRemover)
type1.destructor.addContent(m1LinkRemover.id + "()")


type2.addLinkVar(DField.Create(collectionName, "TList", "New TList"))
Local m2Linker:DMethod = New DMethod
m2Linker.setId("add" + t1Name)
m2Linker.addInput("obj:" + type1.id)
m2Linker.addInput("call:byte = true")
m2Linker.addContent("if call obj.set" + t2Name + "(self,false)")
m2Linker.addContent("return " + collectionName + ".addLast(obj)")
m2Linker.setOutput("TLink")
type2.addMethod(m2Linker)

Local m2Remover:DMethod = New DMethod
m2Remover.setId("removeAll" + t1Name + "Links")
m2Remover.addContent("For local obj:" + type1.id + " = eachin Self." + collectionName)
m2Remover.addContent(Chr(9) + "obj.remove" + t2Name + "()")
m2Remover.addContent("Next")
type2.addMethod(m2Remover)
type2.destructor.addContent(m2Remover.id + "()")
End Method
End Type

Type DType
Field bbdoc:Byte
Field id:String
Field vars:TList
Field linkVars:TList
Field methods:TList
Field destructor:DMethod

Method New()
vars = New TList
linkVars = New TList
methods = New TList
destructor = New DMethod
End Method

Function Create:DType(id:String)
Local t:DType = New DType
t.id = "T" + id
t.destructor.setId("remove")
Return t
End Function

Method write(stream:TStream)
WriteLine stream, ""
If bbdoc
WriteLine stream, "Rem"
WriteLine stream, Chr(9) + "bbdoc: " + Self.id
WriteLine stream, Chr(9) + "about:"
WriteLine stream, "End Rem"
End If
WriteLine stream, "Type " + id
If Not vars.IsEmpty()
WriteLine stream, ""
For Local v:DField = EachIn vars
v.write(stream)
Next
EndIf

If Not linkVars.IsEmpty()
WriteLine stream, ""
For Local v:DField = EachIn linkVars
v.write(stream)
Next
EndIf

If Not methods.IsEmpty()
WriteLine(stream, "")
For Local m:DMethod = EachIn methods
m.write(stream)
WriteLine(stream, "")
Next
EndIf
WriteLine(stream, "")
Self.destructor.write(stream)
WriteLine stream, "End Type"
WriteLine stream, ""
End Method

Method addVar(v:DField)
vars.AddLast(v)
End Method

Method addLinkVar(v:DField)
linkVars.AddLast(v)
End Method

Method addMethod(m:DMethod)
methods.AddLast(m)
End Method
End Type

Type DField
Field id:String
Field datatype:String
Field val:String

Function Create:DField(id:String, datatype:String, val:String = "")
Local v:DField = New DField
Select datatype
Case "" datatype = "Int"
Case "%" datatype = "Int"
Case "#" datatype = "Float"
End Select
v.id = id
v.datatype = datatype
v.val = val
Return v
End Function

Method write(stream:TStream)
Local l:String = Chr(9) + "Field " + id + ":" + datatype
If val <> ""
If Lower(datatype) = "string"
l:+" = " + Chr(34)+val+Chr(34)
Else
l:+" = " + val
EndIf
EndIf
WriteLine stream, l
End Method
End Type

Type DMethod
Field bbdoc:Byte
Field bbdocText:String
Field id:String
Field inputs:TList
Field output:String
Field content:TList


Method New()
inputs = New TList
output = ""
content = New TList
End Method

Method setId(id:String)
Self.id = id
End Method

Method addContent(line:String)
content.AddLast(line)
End Method

Method addInput(line:String)
inputs.AddLast(line)
End Method

Method setOutput(line:String)
output = line
End Method

Method setBBdocText(txt:String)
Self.bbdocText = txt
Self.bbdoc = True
If bbdocText = "" bbdocText = Self.id
End Method

Method write(stream:TStream)
If bbdoc
WriteLine stream, Chr(9) + "Rem"
WriteLine stream, Chr(9) + Chr(9) + "bbdoc: " + bbdocText
For Local l:String = EachIn inputs
WriteLine stream, Chr(9) + Chr(9) + "var: " + l
Next
WriteLine stream, Chr(9) + "End Rem"
End If
Local l:String
l = Chr(9) + "Method " + id
If output <> "" l:+":" + output
l:+"("
While inputs.Count() > 0
Local v:String = String(inputs.RemoveFirst())
If inputs.IsEmpty()
l:+v
Else
l:+v + " , "
EndIf
Wend
l:+")"
WriteLine stream, l
For l = EachIn content
WriteLine stream, Chr(9) + Chr(9) + l
Next
WriteLine stream, Chr(9) + "End Method"
End Method
End Type

(Code von Firstdeathmaker, siehe https://www.blitzforum.de/foru...hp?t=31031)

Danke

Edit: Bei BlitzMax Codes werden die Keywords nun nichtmehr verlinkt. Es gibt einfach zu viele Unterschiede bei den Funktionen.

Neues Feature: BBP-Live

Montag, 9. Februar 2009 von D2006
Soeben ist ein neues Feature fertig geworden, womit ich den neu angelegten Worklog (der extra nachträglich die ID 1 zugewiesen bekommen hat Wink ) gleich ordentlich einweihen will.

BBP-Live: https://www.blitzforum.de/live/

Diese Seite zeigt alle ungelesenen Beiträgen an. Und wirklich nur die ungelesenen. Zusätzlich aktualisiert sie sich jede Minute selbst. Wenn man also längere Zeit online ist, schon alle neuen Beiträge abgeklappert hat, ist diese Seite eine ideale Anlaufstelle. Man schaut nun bei Interesse immer mal schnell auf die Seite und sieht sofort, ob es neue Beiträge gibt. Zusätzlich führt ein Klick auf den Link zum wirklich ersten ungelesenen Beitrag!

Der Link zur Live-Seite ist ab sofort in der Sidebar des Forums.

Vielen Dank für die Aufmerksamkeit,
D2006

UPDATE (11.02.):
Hab die gute Idee von Xeres umgesetzt. Wenn neue Beiträge vorhanden sind, steht im Seitentitel nun "Neue Beiträge!" statt "BBP Live". So sieht man noch schneller, ob es was neues im Forum gibt. Danke für die Idee!

Erster Eintrag

Montag, 9. Februar 2009 von D2006
Hallo liebe Community,

als die Worklogs vor über einem Jahr geboren worden, dachten wir schon gleich daran, auch mal einen "offiziellen" BBP-Worklog zu machen, in dem wir über aktuelle Entwicklungen im Portal berichten (Im Sinne von der Technik/dem Code dahinter; nicht im Sinne eines Boulevard-Magazins Wink ). Aber irgendwie sind wir bisher nie dazugekommen. Das ändert sich nun!

An dieser Stelle informieren wir euch über kleine und große Änderungen im BlitzBasic Portal und freuen uns über Feedback via Kommentare.

Grüße
D2006

Im Namen der Portalsadministration

Gehe zu Seite Zurück  1, 2