Speedcube.de Forum

Normale Version: Algorithmen-Plugin
Sie sehen gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2 3 4
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
(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
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=(?:&quot;|\"|')?(.*?)[\"']?(?:&quot;|\"|')?\](.*?)\[\/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
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... Smile
lg
Michaelius
(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?
Das sind Überreste vom Spoiler-Plugin. Habe das einfach umgeschrieben. Eig. kann man alles auskommentierte löschen
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>?
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&notation=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&notation=WCA" target="_blank">R U R' U'</a> Url1
foo2 <a href="http://alg.garron.us/?alg=R_U_R-_U-&animtype=solve&notation=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&notation=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
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.
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&notation=WCA\" target=\"_blank\">$alg</a>";
}

?>

Und es liegt nicht an der gleichen guid, das hab ich als erstes probiert.
Seiten: 1 2 3 4