Bearbeiten von „FreewarWiki:Bot/Skripts/maplist.php

Zur Navigation springen Zur Suche springen

Achtung

Du bearbeitest diese Seite unangemeldet. Wenn du deine Änderung speicherst, wird deine aktuelle IP-Adresse in der Versionsgeschichte aufgezeichnet und ist damit öffentlich einsehbar. Um effektiver mitarbeiten zu können und deine IP-Adresse zu verbergen, melde dich doch bitte an.

Speichere bitte keine Textversuche ab. Nutze stattdessen die Spielwiese, um dich im Umgang mit der Textverarbeitung im Wiki vertraut zu machen.

Die Bearbeitung kann rückgängig gemacht werden. Bitte prüfe den Vergleich unten, um sicherzustellen, dass du dies tun möchtest, und veröffentliche dann unten deine Änderungen, um die Bearbeitung rückgängig zu machen.

Aktuelle Version Dein Text
Zeile 1: Zeile 1:
{{Scriptquelltextverwendung}}
{{Scriptquelltextverwendung}}
 
Das Skript ist semantisch identisch zu [[FreewarWiki:Bot/Skripts/maplist.pl]] mit dem Unterschied, dass es die Informationen aus [[:Kategorie:Felder]] holt und daher keine Angaben über Passagen machen kann.
Letzte Änderungen:
* Ermittlung unbegehbarer Felder aus makemap.php hier eingebaut. --[[Benutzer:Count Ypsilon|Count Ypsilon]] ([[Benutzer Diskussion:Count Ypsilon|Diskussion]]) 23:30, 14. Feb. 2019 (CET)
 
<pre>
<pre>
<?php
<?php
// Ausgabeformat: Gebiet;Betretbar;X-Position;Y-Position;Slash/separierte/NPC-Liste;Bild-URL;Passage
// wobei Passage Komma-separierte X,Y Koordinaten sind bzw. ein Komma ohne Koordinaten zeigt eine Zufallspassage an (ohne festen Zielort)
header('Content-Type: text/plain; charset=utf-8;');
header('Content-Type: text/plain; charset=utf-8;');
error_reporting(E_ALL ^ E_NOTICE);
error_reporting(E_ALL ^ E_NOTICE);


define('TEMPLATE_GET_KEY', 1);
define('TEMPLATE_GET_KEY',   1);
define('TEMPLATE_GET_VALUE', 2);
define('TEMPLATE_GET_VALUE', 2);
define('WIKIURL', 'https://fwwiki.de');
define("BERGFELD", 'http://welt1.freewar.de/freewar/images/map/std.jpg');


function is_obsolete($wiki_text)
function is_obsolete($wiki_text) {
{
     // Veraltetes Feld=none liefert true!
     // Veraltetes Feld=none liefert true!
     return (bool)preg_match('/Veraltetes Feld=[^}]+/', $wiki_text);
     return (bool)preg_match('/Veraltetes Feld=[^}]+/', $wiki_text);
}
}


// Zerlegt eine Seite so, dass jedes Resultat mit der angegebenen
function get_areas($url, $prefix) {
// Vorlage beginnt (kann danach aber noch Müll enthalten)
    preg_match_all("/>$prefix:([^<]+)</", file_get_contents($url), $areas);


function get_templates($template, $wiki_text)
    return $areas[1];
{
}
 
function get_templates($template, $wiki_text) {
     $pattern = '/\{\{(Vorlage:)?' . preg_quote($template, '/') . '/';
     $pattern = '/\{\{(Vorlage:)?' . preg_quote($template, '/') . '/';
   
     $templates = preg_split($pattern, $wiki_text);
     $templates = preg_split($pattern, $wiki_text);
   
     return array_slice($templates, 1);
     return array_slice($templates, 1);
}
}


// Liest zu einem angegebenen Gebiet die Felder aus dem "Felder:XXX"-Artikel.
function parse_field_article($area, $host) {
// Die unbetretbaren Felder um das Gebiet herum sind nicht mit dabei, dafür
// aber Details zu NPCs usw.
 
function parse_field_article($area)
{
 
     $fields = array();
     $fields = array();
 
     // Artikel fetchen
     // Artikel fetchen
     $field_url = WIKIURL . "/index.php/Felder:" . rawurlencode($area) . "?action=raw";
     $field_url = "$host/index.php/Felder:" . str_replace(' ', '%20', $area).
                "?action=raw";
     $html = file_get_contents($field_url);
     $html = file_get_contents($field_url);
 
   
     if (is_obsolete($html) === true) { // veraltet
     if (is_obsolete($html) === true) { // veraltet
         return array();
         return array();
Zeile 52: Zeile 41:
         // Layout Vorlagen matchen
         // Layout Vorlagen matchen
         $field_templates = get_templates('Feldzusammenfassung/Layout', $html);
         $field_templates = get_templates('Feldzusammenfassung/Layout', $html);
 
       
         // Layout Vorlagen durchlaufen
         // Layout Vorlagen durchlaufen
         foreach ($field_templates as $field_template) {
         foreach ($field_templates as $field_template) {
Zeile 61: Zeile 50:
             $fields[] = $field;
             $fields[] = $field;
         }
         }
 
         return $fields;
         return $fields;
     }
     }
}
}


// Liest zu einem angegebenen Gebiet die unbetretbaren Felder aus dem
function parse_field_template($wiki_text) {
// "Karte:XXX"-Artikel.
 
function parse_map_article($area)
{
    // Artikel fetchen
    $field_url = WIKIURL . "/index.php/Karte:" . rawurlencode($area) . "?action=raw";
    echo "$field_url\n";
    $raw = file_get_contents($field_url);
    return array_map(function ($template_text) use ($area) {
        if (!preg_match("/^\|(-?\d+)\|(-?\d+)(\|([^}|]+))?/", $template_text, $values)) return [];
        return [
            'area' => $area,
            'accessible' => 0,
            'pos_x' => $values[1],
            'pos_y' => $values[2],
            'npc' => NULL,
            'url' => isset($values[4]) ? $values[4] : BERGFELD,
            'passages' => NULL
        ];
    }, array_merge(get_templates("Karte/Unbetretbar", $raw), get_templates("Karte/Rahmenfeld", $raw)));
}
 
// Verarbeitet Feld-Templates
 
function parse_field_template($wiki_text)
{
 
     // Standard-Werte
     // Standard-Werte
     $field = array(
     $field = array(
         'accessible' => 1,
         'accessible' => 1,
         'pos_x' => -10,
         'pos_x'     => -10,
         'pos_y' => -9,
         'pos_y'     => -9,
         'npc' => array(),
         'npc'     => array(),
         'url' => '',
         'url'       => '',
         'passages' => array()
         'passages'   => array()
     );
     );


Zeile 110: Zeile 72:
     $field['pos_x'] = (int)$template['X'];
     $field['pos_x'] = (int)$template['X'];
     $field['pos_y'] = (int)$template['Y'];
     $field['pos_y'] = (int)$template['Y'];
     $field['url'] = $template['Bild'];
     $field['url']   = $template['Bild'];
 
   
     // Passagen lesen
     // Passagen lesen
     $passage_templates = get_templates('Feldzusammenfassung/Passage', $wiki_text);
     $passage_templates = get_templates('Feldzusammenfassung/Passage', $wiki_text);
 
   
     // Passagen durchlaufen
     // Passagen durchlaufen
     foreach ($passage_templates as $passage_template) {
     foreach ($passage_templates as $passage_template) {
         $passage = parse_template($passage_template);
         $passage = parse_template($passage_template);
 
       
         // keine Koordinaten gesetzt
         // keine Koordinaten gesetzt
         if (strcasecmp($passage['Nach'], 'zufall') && !isset($passage['X'], $passage['Y'])) {
         if (!isset($passage['X']) || !isset($passage['Y'])) {
             /* Warnung deaktiviert - Es gibt einige Passagen in denen das beabsichtigt ist (Buran), solange nicht speziell gefiltert wird stört die Meldung nur
             trigger_error('Warnung: Keine Koordinatenangabe in Passage von '.
                trigger_error('Keine Koordinatenangabe in Passage von '.
                          $template['Name'] . ' nach ' . $passage['Nach'], E_USER_WARNING);
                    $template['Name'] . ' nach ' . $passage['Nach'], E_USER_WARNING);
            */
         } else {
         } else {
             $field['passages'][] = $passage['X'] . ',' . $passage['Y'];
             $field['passages'][] = $passage['X'] . ',' . $passage['Y'];
Zeile 131: Zeile 91:


     // npcs lesen
     // npcs lesen
     preg_match_all('/\[\[([^]]+)]]/', $template['NPC'], $npc_matches, PREG_PATTERN_ORDER);
     preg_match_all('/\[\[([^]]+)\]\]/', $template['NPC'], $npc_matches);
     $field['npc'] = $npc_matches[1];
     $field['npc'] = $npc_matches[1];
 
   
     return $field;
     return $field;
}
}


function parse_template($text)
function parse_template($text) {
{
     $template = array();
     $template = array();
 
   
     /* nicht kompatibel mit verschachtelten Vorlagen
     /* nicht kompatibel mit verschachtelten Vorlagen
     // Key-Value Paare spliten
     // Key-Value Paare spliten
     $lines = array_filter(explode('|', $template_text));
     $lines = array_filter(explode('|', $template_text));
 
   
     foreach ($lines as $line) {
     foreach ($lines as $line) {
         // Key/Value trennen
         // Key/Value trennen
Zeile 151: Zeile 110:
         $template[$keyval[0]] = trim($keyval[1]); // 'Parameter=' wirft undefined offset 1
         $template[$keyval[0]] = trim($keyval[1]); // 'Parameter=' wirft undefined offset 1
     }//*/
     }//*/
 
   
     $key = '';
     $key = '';
     $mode = TEMPLATE_GET_KEY;
     $mode = TEMPLATE_GET_KEY;
     $depth = 0;
     $depth = 0;
 
   
     for ($i = 1, $length = strlen($text); $i < $length; ++$i) {
     for ($i = 1, $length = strlen($text); $i < $length; ++$i) {
         if ($text[$i] === '{' && $text[$i + 1] === '{') { // weitere Vorlage
         if ($text[$i] === '{' && $text[$i+1] === '{') { // weitere Vorlage
             ++$depth;
             ++$depth;
             ++$i;
             ++$i;
             $template[$key] .= '{';
             $template[$key] .= '{';
         } else if ($text[$i] === '}' && $text[$i + 1] === '}') { // geschlossene Vorlage
         } else if ($text[$i] === '}' && $text[$i+1] === '}') { // geschlossene Vorlage
 
           
             if ($depth === 0) {
             if ($depth === 0) {
                 break;
                 break;
Zeile 170: Zeile 129:
                 $template[$key] .= '}';
                 $template[$key] .= '}';
             }
             }
         } else if ($text[$i] === '[' && $text[$i + 1] === '[') { // geöffneter Link
         } else if ($text[$i] === '[' && $text[$i+1] === '[') { // geöffneter Link
             ++$depth;
             ++$depth;
             ++$i;
             ++$i;
             $template[$key] .= '[';
             $template[$key] .= '[';
         } else if ($text[$i] === ']' && $text[$i + 1] === ']') { // geschlossener Link
         } else if ($text[$i] === ']' && $text[$i+1] === ']') { // geschlossener Link
 
           
             if ($depth === 0) {
             if ($depth === 0) {
                 break;
                 break;
Zeile 184: Zeile 143:
             }
             }
         }
         }
 
       
         if ($text[$i] === '=' && $depth === 0) { // Wertzuweisung beginnt
         if ($text[$i] === '=' && $depth === 0) { // Wertzuweisung beginnt
             $mode = TEMPLATE_GET_VALUE;
             $mode = TEMPLATE_GET_VALUE;
Zeile 198: Zeile 157:
         }
         }
     }
     }
 
   
     return array_map('trim', $template);
     return array_map('trim',$template);
}
}


// Liste aller Gebiete aus "Katgorie:Felder" bestimmen
$host            = 'http://fwwiki.de';
$prefix          = 'Felder';                          // Wiki-Namespace
$parser_function = 'parse_field_article';              // Parser Funktion des Skripts
$category_url    = "$host/index.php/Kategorie:Felder"; // Gebietskategorie


preg_match_all("/>Felder:([^<]+)</",
// init
    file_get_contents(WIKIURL . '/index.php/Kategorie:Felder'), $areas);
$fields = array();


// Für jedes Gebiet die Felder und die Randfelder ermitteln,
// Gebiete fetchen
// und alles in ein großes Array werfen
$areas = get_areas($category_url, $prefix);


$fields = array();
// durchlaufen
foreach ($areas[1] as $area) {
foreach ($areas as $area) {
     $fields = array_merge($fields, parse_field_article($area));
     $fields = array_merge($fields, $parser_function($area, $host));
    $fields = array_merge($fields, parse_map_article($area));
}
}


// Ausgabe
// und ausgeben
$delimiter = ';';
 
// head
#echo implode($delimiter, array_keys($fields[0])) . "\n";


// body
foreach ($fields as $field) {
foreach ($fields as $field) {
     // output wie maplist.pl
     // output wie maplist.pl
     printf("%s;%d;%d;%d;%s;%s;%s\n",
     $field['npc'] = implode('/', $field['npc']);
        $field['area'],
    $field['passages'] = implode('/', $field['passages']);
        $field['accessible'],
   
        $field['pos_x'],
    echo implode($delimiter, $field) . "\n";
        $field['pos_y'],
        is_null($field['npc']) ? "" : implode('/', $field['npc']),
        $field['url'],
        is_null($field['passages']) ? "" : implode('/', $field['passages']));
}
}
</pre>
</pre>

Bitte beachte, dass alle Beiträge zu Chaos FreewarWiki von anderen Mitwirkenden bearbeitet, geändert oder gelöscht werden können. Reiche hier keine Texte ein, falls du nicht willst, dass diese ohne Einschränkung geändert werden können.

Du bestätigst hiermit auch, dass du diese Texte selbst geschrieben hast oder diese von einer gemeinfreien Quelle kopiert hast (weitere Einzelheiten unter FreewarWiki:Urheberrechte). ÜBERTRAGE OHNE GENEHMIGUNG KEINE URHEBERRECHTLICH GESCHÜTZTEN INHALTE!

Bitte beantworte die folgende Frage, um diese Seite speichern zu können (weitere Informationen):

Abbrechen Bearbeitungshilfe (wird in einem neuen Fenster geöffnet)

Die folgende Vorlage wird auf dieser Seite verwendet: