|
|
|
|
|
|
|
|
|
|
|
|
Ein Stachelbeerkuchen? Ich weiß nicht, die Stachelbeeren haben mir ja nicht so gut geschmeckt. Die Stachelbeeren haben irgendwie nach gar nichts geschmeckt. Außerdem mögen es die Leute hier im Salat ja nicht, wenn man zu oft Stachelbeeren erwähnt. Und wenn ich dann davon berichten müsste, wie gut der Stachelbeerkuchen gelungen ist, und wie gut insbesondere die Stachelbeeren im Gebäck geschmeckt haben... Besser nicht!
|
|
|
|
|
|
|
So, habe meinen BB-Code-Parser erweitert:
|
Code: |
open System
#nowarn "40"
type Parser<'a> = char list -> ('a * char list) option
// Monad
type ParserMonad() =
member x.Bind(p, f) = fun i ->
match p i with
| Some (v, r) -> (f v) r
| None -> None
member x.Delay(f) = fun i -> f () i
member x.Return(v) = fun i -> Some (v, i)
member x.Zero() = fun _ -> None
// Builder instance
let parse = new ParserMonad()
// Prioritized choice
let (</>) p1 p2 = fun i ->
match p1 i with
| Some (v, r) -> Some (v, r)
| None -> p2 i
// Predicates
let notpred p = fun i ->
match p i with
| None -> Some ((), i)
| _ -> None
// Star, plus
let rec many p = many1 p </> parse.Return([])
and many1 p = parse {
let! x = p
let! xs = many p
return x :: xs }
// Sequence
let (.>>) p1 p2 = parse {
let! r = p1
let! _ = p2
return r }
let (>>.) p1 p2 = parse {
let! _ = p1
let! r = p2
return r }
// Epsilon: always matches, consumes no input
let epsilon = fun i -> Some ((), i)
// Skip
let skip p = parse {
let! _ = p
return () }
// Characters and strings
let satisfy (pred : char -> bool) = fun i ->
match i with
| c :: r when pred c -> Some (c, r)
| _ -> None
let whitespace = satisfy Char.IsWhiteSpace
let anychar = satisfy (fun _ -> true)
let pchar c = satisfy ((=) c)
let pchari c = satisfy (fun x -> (Char.ToUpper x) = (Char.ToUpper c))
let pstring s = List.fold (.>>) epsilon [for c in s -> pchar c]
let pstringi s = List.fold (.>>) epsilon [for c in s -> pchari c]
//
// BB code specifics
//
type BBListStyle = Itemized | Numbered | Characters
type BBFormattingStyle = Bold | Italics | Underlined | Monospace | Strikethrough | Spoiler | Quote
type BBEmoticonStyle = Happy | Sad
type BBCode =
| BBText of string
| BBEmoticon of BBEmoticonStyle
| BBFormatting of BBFormattingStyle * BBCode list
| BBImage of string
| BBTex of string
| BBSimpleUrl of string
| BBUrlWithContent of string * BBCode list // URL, contents
| BBList of BBListStyle * BBCode list
| BBListItem of BBCode list
| BBProperQuote of int * int * string * BBCode list // TID, PID, user, contents
// convenience function to create parsers for opening, closing tags
let tags t = pstringi (sprintf "[%s]" t), pstringi (sprintf "[/%s]" t)
// parses plain text up to the next valid BB code statement or until the guard expression matches
let rec bbtext guard = parse {
let! cs = many1 ((notpred bbtag) >>. (notpred guard) >>. anychar)
return BBText (new String(List.toArray cs)) }
// parses emoticons
and bbemoticon =
let emostyle = parse {
do! pstring ":)"
return BBEmoticonStyle.Happy } </> parse {
do! pstring ":("
return BBEmoticonStyle.Sad }
parse {
let! style = emostyle
return BBEmoticon style }
// parses a simple BB code statement and wraps its contents in an instance of the given type constructor
and bbformatting name style =
let s, e = tags name
parse {
do! s
let! contents = many (bbelem e)
do! e
return BBFormatting (style, contents) }
// parses [img] expressions
and bbimage =
let s, e = tags "img"
parse {
do! s
let! url = many ((notpred e) >>. anychar)
do! e
return BBImage (new string(List.toArray url)) }
// parses [tex] expressions
and bbtex =
let s, e = tags "tex"
parse {
do! s
let! tex = many ((notpred e) >>. anychar)
do! e
return BBTex (new string(List.toArray tex)) }
// parses [url], [url=...] expressions
and bburl =
let s, e = tags "url"
let bbsimpleurl = parse {
do! s
let! url = many ((notpred e) >>. anychar)
do! e
return BBSimpleUrl (new string(List.toArray url)) }
let bburlwithcontent = parse {
do! pstringi "[url="
let! url = many ((notpred (pchar ']')) >>. anychar)
do! pchar ']' |> skip
let! contents = many (bbelem e)
do! e
return BBUrlWithContent (new string(List.toArray url), contents) }
bbsimpleurl </> bburlwithcontent
// parses [list], [list=...] expressions
and bblist =
let s, e = tags "list"
let bullet = pstring "[*]"
let listitem = parse {
do! bullet
let! contents = many (bbelem (e </> bullet))
return BBListItem contents }
let parseliststyle = parse {
do! s
return BBListStyle.Itemized } </> parse {
do! pstringi "[list=1]"
return BBListStyle.Numbered } </> parse {
do! pstringi "[list=a]"
return BBListStyle.Characters }
parse {
let! style = parseliststyle
do! skip (many whitespace)
let! prelude = many (bbelem (e </> bullet))
let! properitems = many listitem
do! e
return BBList (style, prelude @ properitems) }
// parses quotes
and bbquote =
let e = tags "quote" |> snd
parse {
do! pstringi "[quote="
let! tid = many1 (satisfy Char.IsDigit)
do! pchar ',' |> skip
let! pid = many1 (satisfy Char.IsDigit)
do! pstring ",\""
let! user = many1 (satisfy ((<>) '"'))
do! pstring "\"]"
let! contents = many (bbelem e)
do! e
return BBProperQuote (Int32.Parse(new string(List.toArray tid)),
Int32.Parse(new string(List.toArray pid)),
new string(List.toArray user),
contents) }
// parses any BB code expression except plain text
and bbtag = (bbformatting "b" BBFormattingStyle.Bold) </>
(bbformatting "i" BBFormattingStyle.Italics) </>
(bbformatting "u" BBFormattingStyle.Underlined) </>
(bbformatting "m" BBFormattingStyle.Monospace) </>
(bbformatting "s" BBFormattingStyle.Strikethrough) </>
(bbformatting "spoiler" BBFormattingStyle.Spoiler) </>
(bbformatting "quote" BBFormattingStyle.Quote) </>
bbimage </>
bbtex </>
bburl </>
bblist </>
bbquote </>
bbemoticon
// parses BB code expressions including plain text until guard matches or all input is consumed
and bbelem guard = bbtag </> bbtext guard
let bbparse = many (bbelem (parse.Zero()))
|
|
Aufruf mit
"Text hier" |> Seq.toList |> bbparse |> printfn "%A"
Komplett vollständig oder schön ist er noch nicht, Code-Tags z.B. fehlen. Das ist aber nur noch stupide Tipparbeit. Ich stelle den hier zur freien Verwendung, falls den jemand für sein Projekt brauchen kann.
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von igor]2 am 04.07.2010 11:56]
|
|
|
|
|
|
konvertier den mal in ne ordentliche sprache
|
|
|
|
|
|
|
Ich versuch grad dem Motivationsloch zu entfliehen, indem ich ein bisschen arbeite.
Eigentlich wär heute auch schönes Fahrradtour-Wetter. Aber mit dem Wissen, dass morgen mein neuer Sattel und eine neue Sattelstütze kommt, hab ich eigentlich keine Lust mehr mit dem alten Zeug rumzufahren.
|
|
|
|
|
|
|
Wie würdet ihr die dominanteste Farbe eines Bildes berechnen? Gibt es da was allgemein bekanntes?
|
|
|
|
|
|
|
Hmm, müsste man sich mal genau überlegen, wann eine Farbe auf einer Bitmap als "dominant" empfunden wird.
Ne einfache Last auf eine Farbe zu berechnen reicht da nicht unbedingt aus. Hmhm
Die Tools, die aus vielen Einzelbilderne in Gesamt-Bild komposieren werden ja auch nur den Durchschnitsswert eines Bilds berechnen. Das ist auch was anderes.
Was genau möchtest du denn erreichen?
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von TriggerTG am 04.07.2010 14:24]
|
|
|
|
|
|
Ich möchte eine Art "Produktkarte" generieren, für http://pivot.das-stueckwerk.de , wo nicht nur ein Bild hinterlegt ist. Damit man auf Entfernung aber noch die Grundfarbe erkennen kann, würde ich diese gern als Hintergrundfarbe einsetzen.
|
|
|
|
|
|
|
Hmm, verstehe ich noch nicht ganz. Was meinst du mit Produktkarte?
Btw zu deiner Imagewall kam ja noch keine Kritik: Da musst du noch an einigen Details schrauben:
- Der Plain-White Background geht nicht, da muss ein Hintergrund mit Gradient rein oder so. Schau dir mal an, was für Art von Hintergründen Coolris* nutzt.
- Die Abstände zwischen den Bildern sind zu klein. Lieber beim Start nen Ausschnitt zeigen der übersichtlicher ist? Da könnte man es ja zB so machen, dass nach dem Load ein Stück reingezoomt wird. Dann weiß der Kunde, dass da außenrum noch mehr Bilder zum betrachten sind
- Die Unterschiedlichen Maße der Bilder wirklen sehr unruhig. Da musst du noch nen Standard-Rahmen um die Bilder basteln, der dann überall die selbe Maße/Kantenrelation hat
*
Klar: Coolris hat nur 3 Reihen Bilder, was das einfacher macht. Aber der Horizont der da durch den Farbverlauf entsteht gibt den Ganzen gut Orientierung
|
[Dieser Beitrag wurde 2 mal editiert; zum letzten Mal von TriggerTG am 04.07.2010 14:38]
|
|
|
|
|
|
Cooliris
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von Teufel am 04.07.2010 14:42]
|
|
|
|
|
|
Oh! Da ist Google dran schuld, da dort auch schlimmste Typos zum Ziel führen
|
|
|
|
|
|
|
Das UI ist praktisch Standard, also außer den Bildern kommt da nichts von mir. Ich hab zwar vor, da noch was zu machen, aber erstmal will ich die Produktdarstellung vernünftig haben. Mir gefällt eben auch nicht, dass die Bilder unterschiedliche Ausmaße haben, daher die "Produktkarten", die ungefähr so aussehen könnte:
(Ganz interessant, um nachher hochauflösende Bilder zu bekommen, verwende ich WPF um die Produktkarte mittels Data-Binding zu erstellen. Da kämpf ich gerade auch noch ein wenig mit ).
|
|
|
|
|
|
|
Ahh,
naja ich würde da für den Hintergrund einfach den Durchschnitts-Farbwert berechnen und ein bisschen (10%) Sättigung rausnehmen und/oder den Farbwert etwas erhellen
|
|
|
|
|
|
|
| Zitat von Noch_ein_Kamel
konvertier den mal in ne ordentliche sprache
| |
Ist doch .NET. Hippie!
|
|
|
|
|
|
|
Achso. Imagewall. Mir sind die Bilder einfach zu *klein*. Ist ja eine nette Idee, alles ohne Scrollbars darzustellen, aber hier funktioniert es nicht, denn so sieht das alles nach Brei aus und ich erkenne keinerlei Details, die mich auf irgendein einzelnes Objekt "heiß" machen würden. Ich stimme Trigger zu, dass das dadurch alles zu gedrängt sitzt. Selbst wenn ich eine Kategorie auswähle, ist mir das noch zu überfrachtet. Den Zoomregler oben rechts habe ich erstmal komplett übersehen, und zweitens killt er beim Reinzoomen meine Orientierung, da ich dann in zwei Richtungen scrollen kann (und dabei nichtmal Scrollbars bekomme). Da würde ich insgesamt also wirklich größere Bilder empfehlen, auch mit mehr Abstand zueinander. Dafür dann halt eine Scrollbar, und Scrollen in nur in EINER Dimension, also nach unten oder rechts. (Also ich meine z.B. je nach Zoomstufe immer "n" Bilder in einer Zeile des Grids -- soviele wie nebeneinander passen halt, Scrollen nach oben/unten, und wenn die Zoomstufe erhöht wird, wird "n" halt angepasst.)
(e: Oder man spart sich das mit dem freien Zoom komplett und zoomt weich nur zwischen zwei festen Stufen hin und her: Komplettübersicht in eine Richtung scrollend und Detailansicht mit dem Kontext, wie du es schon gemacht hast. Hintergrund ist, dass unsere Orientierung sich ziemlich stark auf raumstrukturierende Gedächtnisprozesse stützt, wie hier dann z.B. die Position eines Objekts am linken/rechten Rand einer Zeile. Und eigentlich sind das die zwei Hauptaufgaben dieses Views: a) einen Gesamteindruck vermitteln und b) Details zu *einem* Objekt zeigen. Die Zwischenstufen sind fummelige Spielerei, solange die Anordnung im Grid auf keinem wirklich Mehrwehrt-schaffendem Ordnungsprinzip beruht. Eigentlich würde ich diese Lösung sogar favorisieren...)
Dass beim Reinzoomen der Kontext (Teile umliegender Elemente) beibehalten wird und beim Wechsel zwischen diesen Objekten ein sauberer Übergang verwendet wird, gefällt mir sehr gut. Auch dieses nichtmodale Einblenden der Details rechts ab einer gewissen Zoomstufe. Ist vielleicht noch ein bisschen unauffällig, habs bei den ersten Malen scheinbar übersehen (oder es ist erst magisch in den letzten Minuten hinzugekommen).
Außerdem würde ich über einen "Flucht"-Mechanismus nachdenken, der den Nutzer aus Zooms und Detailansichten zu einem sicheren, vorhersagbaren Zustand (z.B. Komplettübersicht über aktuelle Kategorie) zurückbringt. Rauszoomen per zweitem Klick ist nämlich nicht so furchtbar offensichtlich.
Sonst schon sehr beeindruckend. Schade, dass Silverlight so ein Randgruppenplugin ist.
|
[Dieser Beitrag wurde 2 mal editiert; zum letzten Mal von igor]2 am 04.07.2010 16:04]
|
|
|
|
|
|
Nur, um das noch mal klarzustellen, ich hab wirklich nur die Bilder generiert. Das Plugin kommt so direkt von MS (www.getpivot.com). Ich wollte zwar ein bisschen "Branding" einbauen, aber laut Dokumentation kann man da gar nicht so viel machen.
Letztlich soll es aber auch gar nicht für den Endkunden gedacht sein, sondern für Kundengespräche, wo es um Sonderanfertigungen geht und man Beispiele vergleichen können soll.
Zumindest hab ich jetzt alles zusammen, damit ich meine "Kärtchen" erstellen kann:
Allerdings muss ich das noch optimieren, weil ich bei 300 Kommoden mit 1100 Bildern den Arbeitsspeicher ausreize.
(Btw. die Kärtchen sind nicht fertig, aber sind die halt mittels WPF und Data-Binding erstellt, was es sehr bequem macht, diese zu "stylen" )
|
|
|
|
|
|
|
Achso, na für den zweck würden dann die Kärtchen sogar ausreichen. Das Chaos hat mich am meisten gestört.
Den weißen Hintergrund würde ich dennoch versuchen auszutauschen.
|
|
|
|
|
|
|
| Zitat von TriggerTG
Achso, na für den zweck würden dann die Kärtchen sogar ausreichen. Das Chaos hat mich am meisten gestört.
Den weißen Hintergrund würde ich dennoch versuchen auszutauschen.
| |
Ich glaub, das sollte auf jeden Fall machbar sein.
Btw. ich glaube mein Algorithmus für die Durschnittsfarbe scheint nicht wirklich zu stimmen:
|
Code: |
private static Color GetAmbientColor(System.Drawing.Image image)
{
System.Drawing.Bitmap b = image as System.Drawing.Bitmap;
if (null == b)
{
return Colors.Transparent;
}
long red = 0L;
long green = 0L;
long blue = 0L;
for (int x = 0; x < b.Width; x++)
{
for (int y = 0; y < b.Height; y++)
{
System.Drawing.Color c = b.GetPixel(x, y);
red += c.R;
green += c.G;
blue += c.B;
}
}
long size = b.Width * b.Height;
return Color.FromRgb((byte)(red / size), (byte)(green / size), (byte)(red / size));
}
|
|
Ist nur schnell zum Testen gewesen, daher auch die ausführlichen Namespaces (Mein Catalog hat ne Image-Klasse, WPF hat ne Image-Klasse und die DeepZoomTools ebenfalls )
|
|
|
|
|
|
|
Achso, für so interne Zwecke finde ich das so völlig okay, da sind die einzelnen Bilder ja auch mehr Gedächtnisstütze. Ich dachte, das sollte mal Teil einer öffentlichen Website werden... :x
|
|
|
|
|
|
|
| Zitat von igor]2
Achso, für so interne Zwecke finde ich das so völlig okay, da sind die einzelnen Bilder ja auch mehr Gedächtnisstütze. Ich dachte, das sollte mal Teil einer öffentlichen Website werden... :x
| |
Ich mach mir zur Zeit keine Illusionen, dass man Silverlight für mehr als interne Zwecke nutzen kann.
|
|
|
|
|
|
|
Wie soll man sich bei so einem Porno Dialog denn aufs wesentliche konzentrieren?
"I have nothing to live for!"
"What about music?"
"I listen to Goth."
"What about movies?"
"I only watch porn."
"What about kids?"
"They throw rocks at me. Please kill me!"
"How?"
"Well I was born by the snatch so I wanna de by the snatch!"
|
|
|
|
|
|
|
|
|
|
|
hat als link doch gereicht -_-
|
|
|
|
|
|
|
ist das forum wieder langsamer geworden, oder liegt es (mal wieder) am GS?
Rendertime 20+ sek
|
|
|
|
|
|
|
Also bei mir ist sie konstant unter 4 sek. Auch hier im Salat.
@Kamel: Ich hab hier endlich DSL4000 (statt vorher DSL2000). Das will auch genutzt werden.
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von cms am 04.07.2010 17:28]
|
|
|
|
|
|
| Zitat von Noch_ein_Kamel
hat als link doch gereicht -_-
| |
Mimimi. Als ob ich aufm iPhone sehe bzw. darauf achte, wie groß das Bild nun ist.
Heulsuse!
|
|
|
|
|
|
|
| Zitat von SkunkyVillage
| Zitat von Noch_ein_Kamel
hat als link doch gereicht -_-
| |
Mimimi. Als ob ich aufm iPhone sehe bzw. darauf achte, wie groß das Bild nun ist.
| |
Oho, der feine Herr nutzt also unterlegene Technik.
|
|
|
|
|
|
|
Arr, die Welt ist so gemein.
Ich war grad dabei hier zu schreiben, dass das Wochenende langsam vorbei gehen könne und dass das rumgegammele langsam öde wird.
Genau in dem Moment ruft mich ein Kumpel an und fragt ob ich nacher gegen 8 beim Ausladen eines Autos helfen kann.
Scheiße, muss ich nacher noch tatsache was tun
|
|
|
|
|
|
|
Yeah, ich hab eine positive Rückmeldung für eine WG bekommen \o/
Von einer Informatikerin die jetzt bei 1&1 arbeitet
|
|
|
|
|
|
Thema: Gehirnsalat ( wir unter uns ) |