Beiträge: 2.570
Themen: 126
Registriert seit: Apr 2009
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
Beiträge: 1.184
Themen: 14
Registriert seit: Oct 2009
(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
Beiträge: 2.570
Themen: 126
Registriert seit: Apr 2009
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
Beiträge: 415
Themen: 37
Registriert seit: Apr 2010
22.07.2011, 21:20
(Dieser Beitrag wurde zuletzt bearbeitet: 22.07.2011, 21:21 von Michaelius.)
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
Wenn man einen Zauberwürfel löst, ist man ein Freak. Wenn man einen Speedcube löst, ist man ein Speedcuber!
Algos3x3 Fridrich (FULL)
2x2 FULL Ortega
11/42 CLL's
Megaminx OLL's 24/260
PLL's 17/63(es kann auch mehr geben )
FULL Parity
Beiträge: 1.184
Themen: 14
Registriert seit: Oct 2009
22.07.2011, 21:43
(Dieser Beitrag wurde zuletzt bearbeitet: 22.07.2011, 22:01 von Stefan Pochmann.)
(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?
Beiträge: 2.570
Themen: 126
Registriert seit: Apr 2009
Das sind Überreste vom Spoiler-Plugin. Habe das einfach umgeschrieben. Eig. kann man alles auskommentierte löschen
Beiträge: 1.184
Themen: 14
Registriert seit: Oct 2009
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>?
Beiträge: 1.184
Themen: 14
Registriert seit: Oct 2009
22.07.2011, 23:41
(Dieser Beitrag wurde zuletzt bearbeitet: 23.07.2011, 00:32 von Stefan Pochmann.)
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
Beiträge: 2.570
Themen: 126
Registriert seit: Apr 2009
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/Developme...ost_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.
Beiträge: 2.570
Themen: 126
Registriert seit: Apr 2009
23.07.2011, 01:29
(Dieser Beitrag wurde zuletzt bearbeitet: 23.07.2011, 01:30 von Felk.)
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.
|