anpera.net
http://anpera.homeip.net/phpbb3/

exCT: Extended Colortags
http://anpera.homeip.net/phpbb3/viewtopic.php?f=43&t=4877
Seite 1 von 1

Autor:  Eliwood [ Di 28 Apr, 2009 23:12 ]
Betreff des Beitrags:  exCT: Extended Colortags

Nach langem überlegen, wie man Farbtags am besten implementiert, so dass es einen guten Kompromiss aus Vielfaltigkeit und Kürze gibt, bin ich auf folgende Idee gekommen: Der HSL-Farbraum (der in CSS3 übrigens auch angewendet werden kann) unterteilt sich in die Parameter Farbe, Sättigung und Licht. Das hat den Vorteil gegenüber RGB, dass man die Farbe gezielt wählen kann - und dann erst manipulieren kann/muss.
Beim überlegen der Syntax bin ich eher zufällig als absichtlich auf das Zeichen @ gestossen - im RP wirds nicht gebraucht und hat auch sonst keine Sonderbedeutung. Damit man sich auch keine hunderte Symbole merken muss, habe ich ein System geschaffen, das 4-Stellig ist und 3468 Farben umfasst - müsste wohl genug sein. ;)
Der Vorteil dieses Systems ist, dass die 3468 Farben ohne irgendwelche Datenbanken verfügbar sind, Farbtags müssen nichtmehr hinzugefügt werden. Der grosse Nachteil ist, dass sich der Speicherbedarf gut verdoppelt für die Farbtags, heisst also, die Felder für Namen und so müssen weiterwachsen... Ein Name mit 50 Zeichen benötigt genau 255 Zeichen Platz mit Schliessfarbe, um jeden Buchstaben einzeln färben zu können.

Um nun zur Syntax zu kommen: Die Syntax der Farbtags funktioniert so:
$this->bbcode_second_pass_code('', '@<Farbe><Sättigung><Intensität>')
Farbe ist dabei ein Zeichen zwischen 0 und 9, A oder B, wobei A für 10 und B für 11 steht. 0 ist Rot, 1 Orange, 2 Gelb, 4 Grün, 6 Cyan, 8 Blau und A Magenta - 9 ist zum Beispiel Blau-Magenta, also Violett.
Sättigung ist ein Zeichen zwischen 0 und 9, A und H. 0-F entsprechen den Hexadezimalzahlen, G steht für 16, H für 17 - diese Wahl musste ich treffen um die Schritte schön gestalten zu können.
Die Lichtintensität folgt der Sättigung mit den selben Zeichen.
Zusätzlich gibt es noch für die Sättung und die Intensität die Synonyme @. Bei der Sättigung steht @ für 100%-ige Sättiung, also H. Eine Intensität von "@" bedeutet halbe Lichtintensität, also zwischen ganz-dunkel und ganz-hell, was dem normalen Farbton entspricht. Das W3 hat gute Tabellen für den HSL-Farbraum.
Mit @@@@ schliesst man den Farbtag (`0), mit @@ schreibt man ein normales @ (wie ``).

Einige Beispiele:
$this->bbcode_second_pass_code('', '@0@@ => rgb(255, 0, 0)
@2@@ => rgb(255, 255, 0)
@4@@ => rgb(0, 255, 0)
@000 => rgb(0, 0, 0)
@0G0 => rgb(0, 0, 0)
@0HH => rgb(255, 255, 255)
@8D4 => rgb(6%, 6%, 43%), Dunkles Cyan-Blau')

$this->bbcode_second_pass_code('', '<?php
/**
* exCT: Extended Colortags. Erweiterte Farbtags für LoGD
*
* @author Basilius Sauter
* @copyright 2009
* @version 0.1
* @package exct
*
*/

class ExCT {
const SIGN_HSL = '@';

# Umwandlungstabelle Farbcode => Farbe im HSL-Farbrau
protected $keyA = array(
'0' => 000, # Rot
'1' => 030, # Orange
'2' => 060, # Gelb
'3' => 090, # Grün-Gelb
'4' => 120, # Grün
'5' => 150, # Grün-Cyan
'6' => 180, # Cyan
'7' => 210, # Cyan-Blau
'8' => 240, # Blau
'9' => 270, # Blau-Magenta
'A' => 300, # Magenta
'B' => 330, # Magenta-Rot
);

# Umwandlungstabelle Farbcode => Sättigung (Saturation, S) oder Farbintensität
protected $keyB = array(
'0' => 0.00, '1' => 0.0625,
'2' => 0.125, '3' => 0.1875,
'4' => 0.25, '5' => 0.3125,
'6' => 0.375, '8' => 0.4375,
'9' => 0.5, 'A' => 0.5625,
'B' => 0.625, 'C' => 0.6825,
'D' => 0.75, 'E' => 0.8125,
'F' => 0.875, 'G' => 0.9375,
'H' => 1,
);

protected static $instance = false;

protected function __construct() {

}

public function getInstance() {
if(self::$instance === false) {
self::$instance = new self();
}

return self::$instance;
}

public function stripTags($data) {
$striptmpl = '/[%s].../';

$data = preg_replace(sprintf($striptmpl, preg_quote(self::SIGN_HSL)), '', $data);
$data = str_replace('@@', '', $data);
return $data;
}

public function parseTags($data) {
$parsed = '';
$opentag = false;

while( (!(($x = strpos($data, '@')) === false)) ) {
$tag = substr($data, $x, 1);

# Einzelne Farben holen
$tag_r = strtoupper(substr($data, $x+1, 1));
$tag_g = strtoupper(substr($data, $x+2, 1));
$tag_b = strtoupper(substr($data, $x+3, 1));

# Alles, was bis zum Farbsymbol steht, parsed zuteilen
$parsed .= substr($data, 0, $x);

# Von $data alles abschneiden, was schon geparst wurde, inklusive Farbtag
if($tag_r == '@' AND ($tag_g != '@' OR $tag_b != '@')) {
$nocolor = true;
$data = substr($data, $x+2);
}
else {
$nocolor = false;
$data = substr($data, $x+4);
}

if(($tag_r == '@' AND $tag_g == '@' AND $tag_b == '@') AND $nocolor === false) {
if($opentag === true) {
$parsed .= '</span>';
$opentag = false;
}
}
elseif($nocolor) {
$parsed .= '@';
}
else {
# Alias für Sättigung = 100%
if($tag_g == '@') $tag_g = 'H';
# Alias für Lichtintensität = 50%
if($tag_b == '@') $tag_b = '9';
var_dump( $tag_r, $tag_g, $tag_b );
$col_h = $this->keyA[$tag_r];
$col_s = $this->keyB[$tag_g];
$col_l = $this->keyB[$tag_b];

$cols = $this->hsl2rgb($col_h, $col_s, $col_l, true, true);
$col_r = $cols[0];
$col_g = $cols[1];
$col_b = $cols[2];

if($opentag) $parsed .= '</span>';
else $opentag = true;
$parsed .= sprintf('<span style="color: rgb(%d%%, %d%%, %d%%) /*hsl(%f, %f, %f)*/">',
$col_r*100, $col_g*100, $col_b*100,
$col_h, $col_s, $col_l
);
}
}

# Der übrig gebliebene Rest hinzufügen
$parsed .= $data;

return $parsed;
}

# HSL 2 RGB, nach W3
public function hsl2rgb($h, $s, $l, $return = true, $degree = false) {
if($l < 0.5) {
$m2 = $l * (1 + $s);
}
else {
$m2 = $l + $s - ($l * $s);
}

$m1 = 2 * $l - $m2;

if($degree === true) {
$h = $h/360;
}

$r = $this->hue2rgb($m1, $m2, $h+1/3);
$g = $this->hue2rgb($m1, $m2, $h);
$b = $this->hue2rgb($m1, $m2, $h-1/3);

if($return === true) {
return array($r, $g, $b);
}
else {
switch($return) {
case 'r': return $r; break;
case 'g': return $g; break;
case 'b': return $b; break;
}
}
}

# HUE 2 RGB, nach W3, Hilfsfunktion für hsl2rgb()
public function hue2rgb($m1, $m2, $h) {
if($h < 0) $h = $h+1;
if($h > 1) $h = $h-1;

if($h*6 < 1) return $m1+($m2-$m1)*$h*6;
if($h*2 < 1) return $m2;
if($h*3 < 2) return $m1+($m2-$m1)*(2/3-$h)*6;
return $m1;
}
}
?>')

Die Anwendung der Klasse ist relativ einfach:
$this->bbcode_second_pass_code('', '$exCT = exCT::getInstance();
$data = $exCT->parseTags("@0@@Rote Farbe @0D4Dunkelrote Farbe");')

Autor:  Harthas [ Mi 29 Apr, 2009 07:40 ]
Betreff des Beitrags:  Re: exCT: Extended Colortags

Schöne Sache, gefällt mir auf jeden Fall :-)

Autor:  Auric [ Mi 29 Apr, 2009 10:32 ]
Betreff des Beitrags:  Re: exCT: Extended Colortags

Cooles System (noch dazu hat jemand meinen Hilferuf nach mehrstelligen Farbtags erhört).
Allerdings habe ich die Befürchtung, das die meisten User das nicht so einfach aufnehmen werden. Ein gewisser Grad an Kenntnis über die Farbskalen des HLS-Systems ist ja beim Ottonormal-LotgDler ja leider nicht immer vorhanden.

Ein vernünftiger Colorchooser dürfte dem Problem allerdings Abhilfe schaffen.

Auric

Autor:  Eliwood [ Mi 29 Apr, 2009 12:45 ]
Betreff des Beitrags:  Re: exCT: Extended Colortags

Nojo, wenn man eine richtige Erklärung hinschreibt, ist HSL viel einfacher zu verstehen als RGB. Vor allem ist es einfacher, die gewünschte Farbrichtig zu mischen - Gibt man die 12 Grundtöne an, kann man sich auf die Experimentierfreudigkeit der User verlassen, den Kniff für den Rest rauszufinden.
Zusätzlich könnten Tabellen (Ich bastle grad an einer) dabei helfen, Ordnung und Klarheit zu schaffen. :D

Und ja, Auric, das war als Antwort auf deinen Post gedacht. ;) Zuerst hatte ich eines Entworfen mit ~270'000 Farben... Das hielt ich dann aber vielleicht doch etwas _zu_ viel.

Autor:  Auric [ Fr 01 Mai, 2009 16:22 ]
Betreff des Beitrags:  Re: exCT: Extended Colortags

Mir ist da just was aufgefallen:
$this->bbcode_second_pass_code('', ' 'B' => 360, # Magenta-Rot')
Müsste es hier nicht 330 heißen? 360 wäre doch wieder = 0 und damit Rot!

Autor:  Eliwood [ Fr 01 Mai, 2009 17:37 ]
Betreff des Beitrags:  Re: exCT: Extended Colortags

Edit: Ja, stimmt. 330° wäre richtiger. Da waren meine Gedanken wohl wo anders.

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/