RE: Algorithmen-Plugin - Felk - 22.07.2011
Ja klar wir basteln am Grundstein. so einen Buchstaben hinzufügen ist kein Ding.
@Stefan: Ich denke Klammern kann man erstmal auslassen, ebenso wie Algorithmen grösserer Cubes. Die meißten Algorithmen sind eh blank geschriebene 3x3 Algos.
Und das mit den URL's ist mir klar, aber ich hab keine Möglichkeit gesehen, eine Backreference eines regulären Ausdrucks zu manipulieren. Da müsste man dann schon ein richtiges Programm schreiben, nicht nur 1 regulären Ausdruck. Und wie gesagt, das Linken an unerwünschten Stellen kann man halt damit umgehen, dass nur komplette Algos gesucht werden (also nix mit Bruchteilen davor).
Ich Versuch mein Glück heute mal weiter
RE: Algorithmen-Plugin - Stefan Pochmann - 22.07.2011
(22.07.2011, 17:52)Felk schrieb: Und das mit den URL's ist mir klar, aber ich hab keine Möglichkeit gesehen, eine Backreference eines regulären Ausdrucks zu manipulieren.
Dafuer gibt's den e-Modifikator.
PHP-Code: <?php $in = "foo R U R' U' bar [alg]R U R' U'[/alg] ney"; $move = "\b[UDFBLR]('|2|\b)"; $out = preg_replace( "#\[alg](.*?)\[/alg]|($move( $move){2,})#e", 'garron("$1$2")', $in ); function garron ( $alg ) { $raw = stripslashes( $alg ); $par = strtr( $raw, " '", "_-" ); return "[url=http://alg.garron.us/?alg=$par]{$raw}[/url]"; } print $out;
Eingabe und Resultat:
Code: foo R U R' U' bar [alg]R U R' U'[/alg] ney
wird zu:
foo [url=http://alg.garron.us/?alg=R_U_R-_U-]R U R' U'[/url] bar [url=http://alg.garron.us/?alg=R_U_R-_U-]R U R' U'[/url] ney
Sieht dann so aus:
foo R U R' U' bar R U R' U' ney
RE: Algorithmen-Plugin - Felk - 22.07.2011
Du studierst Informatik, oder? Ich glaub ich geb dir das ganze Teil und du machst es fertig, weil ich mach nur immer wieder Probleme draus ^^
Code: <?php
$plugins->add_hook("parse_message", "alglinker_run");
function alglinker_info()
{
return array(
"name" => "Algorithmus-Verlinker",
"description" => "Verlinkt Algorithmen mithilfe von [alg]- oder [alg=size]-Tags zum cube.garron.us Simulator",
"website" => "http://www.speedcube.de",
"author" => "Felk",
"authorsite" => "http://www.speedcube.de",
"version" => "1.0",
"guid" => "795e4538050784720a1196a8b6e8065f", // Das ist die guid vom Spoiler-Plugin. Ich habs einfach mal so gelassen
"compatibility" => "16*"
);
}
function alglinker_activate()
{
}
function alglinker_deactivate()
{
}
function alglinker_run($message)
{
// Assign pattern and replace values.
//$pattern = array("#\[spoiler=(?:"|\"|')?(.*?)[\"']?(?:"|\"|')?\](.*?)\[\/spoiler\](\r\n?|\n?)#si", "#\[spoiler\](.*?)\[\/spoiler\](\r\n?|\n?)#si");
$move = "\b[UDFBLR]('|2|\b)";
$pattern = array(
"#\[alg=([2-7]{1})\](.*?)\[\/alg\]#si",
"#\[alg\](.*?)\[\/alg\]#si",
//"#(?<!U|U'|U2|D|D'|D2|F|F'|F2|B|B'|B2|R|R'|R2|L|L'|L2|u|u'|u2|d|d'|d2|f|f'|f2|b|b'|b2|r|r'|r2|l|l'|l2|Uw|Uw'|Uw2|Dw|Dw'|Dw2|Fw|Fw'|Fw2|Bw|Bw'|Bw2|Rw|Rw'|Rw2|Lw|Lw'|Lw2|x|y|z|x'|y'|z'|x2|y2|z2)(\x20|^)(((((F|B|R|L|U|D)(w?))|(f|b|r|l|u|d|x|y|z))('|2){0,1}(\x20|$)){3,})(?!U|U'|U2|D|D'|D2|F|F'|F2|B|B'|B2|R|R'|R2|L|L'|L2|u|u'|u2|d|d'|d2|f|f'|f2|b|b'|b2|r|r'|r2|l|l'|l2|Uw|Uw'|Uw2|Dw|Dw'|Dw2|Fw|Fw'|Fw2|Bw|Bw'|Bw2|Rw|Rw'|Rw2|Lw|Lw'|Lw2|x|y|z|x'|y'|z'|x2|y2|z2)#"
//"#((\b[UDFBLR][w]?[']?[2]?( |$)){3,})#mi"
"#($move( $move){2,})#i"
);
$replace = array(
"<a href=\"http://alg.garron.us/?alg=$2&animtype=solve&cube=$1x$1x$1\" target=\"_blank\">$2</a>",
"<a href=\"http://alg.garron.us/?alg=$1&animtype=solve\" target=\"_blank\">$1</a>",
"<a href=\"http://alg.garron.us/?alg=$1&animtype=solve\" target=\"_blank\">$1</a>"
);
//$replace = array("<div><div class=\"spoiler_header\">$1 <a href=\"javascript:void(0);\" onclick=\"javascript:if(parentNode.parentNode.getElementsByTagName('div')[1].style.display=='block'){parentNode.parentNode.getElementsByTagName('div')[1].style.display='none';this.innerHTML='<button>Ausklappen</button>';}else {parentNode.parentNode.getElementsByTagName('div')[1].style.display='block';this.innerHTML='<button>Einklappen</button>';}\"><button>Ausklappen</button></a></div><div class=\"spoiler_body\" style=\"display: none;\">$2</div></div>", "<div><div class=\"spoiler_header\">Spoiler <a href=\"javascript:void(0);\" onclick=\"javascript:if(parentNode.parentNode.getElementsByTagName('div')[1].style.display=='block'){parentNode.parentNode.getElementsByTagName('div')[1].style.display='none';this.innerHTML='<button>Ausklappen</button>';}else {parentNode.parentNode.getElementsByTagName('div')[1].style.display='block';this.innerHTML='<button>Einklappen</button>';}\"><button>Ausklappen</button></a></div><div class=\"spoiler_body\" style=\"display: none;\">$1</div></div>");
$message = preg_replace($pattern, $replace, $message);
/*while(preg_match($pattern[0], $message) or preg_match($pattern[1], $message) or preg_match($pattern[2], $message))
{
$message = preg_replace($pattern, $replace, $message);
}*/
// Funktioniert nicht, geht aber auch ohne.
//$message = preg_replace("#(http://alg\.garron\.us/\?alg=)( )(\"|&)#", "$1_", $message);
//$message = preg_replace("#(http://alg\.garron\.us/\?alg=)(')(\"|&)#", "$2-", $message);
return $message;
}
?>
Also das ist es bis jetzt
RE: Algorithmen-Plugin - Michaelius - 22.07.2011
Gibt es auch irgendwie eine Möglichkeit, dass bestimme Schlüsselwörter wie ''T-Perm'' oder ''sexy move'' verlinkt werden? ,
denn viele schreiben auch etwas wie: ''F-Perm = R' U' F' T-Perm F U R'' und wenn es Leute gibt, die den T-Perm nicht kennen.
Aber da es sehr viele Ausführungen von'n paar Schlüsselwörtern gibt, müsste man irgendwie mehrere Algorithmen (eher die meistangewendeten) zur Wahl hinkriegen, die bei cube.garron.us nicht ''zusammen'' als ein Algorithmus ablaufen, sondern einzeln wählbar sind.
Also ich kenne mich garnicht mit Programmen aus, also kenne ich die Probleme nicht, aber ist nur so ein Wunsch von mir...
lg
Michaelius
RE: Algorithmen-Plugin - Stefan Pochmann - 22.07.2011
(22.07.2011, 21:04)Felk schrieb: Du studierst Informatik, oder?
Nicht mehr, hab mein Diplom vor drei Jahren abgeschlossen. PHP und ernsthafte Anwendung regulaerer Ausdruecke hab ich aber wie auch einiges andere nicht direkt im Studium gelernt, sondern so nebenbei. Im Studium ging's eher um theoretischere Sachen, nicht so handfeste Programmierung mit einer bestimmten Programmiersprache. Zum Beispiel weiss ich daher, dass Klammersprachen schlicht nicht regulaer sind und daher unmoeglich durch einen regulaeren Ausdruck darstellbar sind (das ist die Erklaerung vom gestrigen kleinen Witz).
(22.07.2011, 21:04)Felk schrieb: Ich glaub ich geb dir das ganze Teil und du machst es fertig, weil ich mach nur immer wieder Probleme draus ^^
Ha, ok, ich schau's mir morgen mal an. Das Riesenzeug mit Spoilern und Javascript, soll das dazu? Oder sind das bloss Ueberbleibsel von der Vorlage?
RE: Algorithmen-Plugin - Felk - 22.07.2011
Das sind Überreste vom Spoiler-Plugin. Habe das einfach umgeschrieben. Eig. kann man alles auskommentierte löschen
RE: Algorithmen-Plugin - Stefan Pochmann - 22.07.2011
Ist zum Zeitpunkt, wo alglinker_run ausgefuehrt wird, das url-Tag bereits in HTML-Links umgewandelt? Also muss ich auf {url} achten oder auf <a>?
RE: Algorithmen-Plugin - Stefan Pochmann - 22.07.2011
Hab mal grad beide Faelle "verarbeitet" (also nicht verarbeitet). Probier mal das hier statt deinem bisherigen alglinker_run:
PHP-Code: function alglinker_run ( $message ) { $move = "\b[UDFBLRudfblrMESxyz](?:'|2|\b)"; return preg_replace( "#\[alg(?:=([2-7]))?](.*?)\[/alg]|($move(?: $move){2,})|(\[url.*?/url]|<a .*?/a>)#eis", '"$4" ? stripslashes("$4") : garron("$2$3","$1")', $message ); } function garron ( $alg, $size ) { $alg = stripslashes( $alg ); $par = preg_replace( '/\s+/', '_', strtr( $alg, "'", "-" ) ); $cube = $size ? "&cube={$size}x{$size}x{$size}" : ''; return "<a href=\"http://alg.garron.us/?alg=$par$cube&animtype=solve¬ation=WCA\" target=\"_blank\">$alg</a>"; }
Hier ein Test:Code: $message = <<<MESSAGE
foo1 R U R' U' Url1
foo2 [alg]R U R' U'[/alg] Url2
foo3 [alg=4]Rw U
F2
Rw' U'[/alg] Url3
foo4 [url=http://alg.garron.us/?alg=R_U_R-_U-]R U R' U'[/url] Url4
foo5 <a href="http://alg.garron.us/?alg=R_U_R-_U-" target="_blank">R U R' U'</a> Url5
MESSAGE;
echo alglinker_run( $message );
Das ergibt:Code: foo1 <a href="http://alg.garron.us/?alg=R_U_R-_U-&animtype=solve¬ation=WCA" target="_blank">R U R' U'</a> Url1
foo2 <a href="http://alg.garron.us/?alg=R_U_R-_U-&animtype=solve¬ation=WCA" target="_blank">R U R' U'</a> Url2
foo3 <a href="http://alg.garron.us/?alg=Rw_U_F2_Rw-_U-&cube=4x4x4&animtype=solve¬ation=WCA" target="_blank">Rw U
F2
Rw' U'</a> Url3
foo4 [url=http://alg.garron.us/?alg=R_U_R-_U-]R U R' U'[/url] Url4
foo5 <a href="http://alg.garron.us/?alg=R_U_R-_U-" target="_blank">R U R' U'</a> Url5
RE: Algorithmen-Plugin - Felk - 23.07.2011
Also den Zeitpunkt kann man sich aussuchen, an dem alglinker_run ausgeführt wird. Gibt da verschiedene Hooks. Der jetzige ist "parse_message": http://wiki.mybb.com/index.php/Development:Plugin_Hooks_-_Post_Parser
Habe den Code übrigens gerade getestet, funktioniert bravorös. Fehlen nurnoch lowercased w's, die ich selbst einfach mal mit (w?) eingefügt hab.
Ich habs gleich mal so erstmal hochgeladen, um die aktuelle verbugte Version aus dem Forum wegzukriegen.
RE: Algorithmen-Plugin - Felk - 23.07.2011
Ich musste es wieder deaktivieren, weil es alle Spoiler-Ausklapp-Knöpfe hat verschwinden lassen O_o
Code: <?php
$plugins->add_hook("parse_message", "alglinker_run");
function alglinker_info()
{
return array(
"name" => "Algorithmus-Verlinker",
"description" => "Verlinkt selbst gefundene 3x3-Algorithmen und mit [alg]- oder [alg=n]-Tags selbst gekennzeichnete Algorithmen zum alg.garron.us Simulator.",
"website" => "http://www.speedcube.de und http://www.speedcubers.de",
"author" => "1.0 Felix König, >1 Stefan Pochmann",
"authorsite" => "http://www.stefan-pochmann.de",
"version" => "2.0",
"guid" => "795e4538050784720a1196a8b6e8065f", // Das ist die guid vom Spoiler-Plugin. Ich habs einfach mal so gelassen
"compatibility" => "16*"
);
}
function alglinker_activate()
{
}
function alglinker_deactivate()
{
}
function alglinker_run ( $message ) {
$move = "\b[UDFBLRudfblrMESxyz](w?)(?:'|2|\b)";
return preg_replace( "#\[alg(?:=([2-7]))?](.*?)\[/alg]|($move(?: $move){2,})|(\[url.*?/url]|<a .*?/a>)#eis",
'"$4" ? stripslashes("$4") : garron("$2$3","$1")',
$message );
}
function garron ( $alg, $size ) {
$alg = stripslashes( $alg );
$par = preg_replace( '/\s+/', '_', strtr( $alg, "'", "-" ) );
$cube = $size ? "&cube={$size}x{$size}x{$size}" : '';
return "<a href=\"http://alg.garron.us/?alg=$par$cube&animtype=solve¬ation=WCA\" target=\"_blank\">$alg</a>";
}
?>
Und es liegt nicht an der gleichen guid, das hab ich als erstes probiert.
|