Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
Zeile 1: Zeile 1:
[[Hauptseite]] > [[Hauptseite#Schwarzatal.org|Schwarzatal.org]]
[[Hauptseite]] > [[Hauptseite#Schwarzatal.org|Schwarzatal.org]]


{{Kurzbeschreibung|Formular zum Anlegen von Bahnhofsseiten mit Karte, Standort-Links und Live-Tafeln.}}


/**
Das Gadget '''Bahnhof anlegen''' stellt auf der Seite [[Bahnhof anlegen]] einen Knopf bereit, der aus wenigen Eingaben eine fertige Bahnhofsseite erzeugt: Breadcrumb, Website- und Wikipedia-Link, eine WikiMap-Karte, die Standort-Links (OpenStreetMap, CoMaps, Google Maps) und den Abschnitt „Monitore" mit den beiden Live-Tafeln ([[Hilfe:Bahnsteiganzeiger|Bahnsteiganzeiger]]).
* Gadget-Bahnhof_anlegen.js
* ============================================================================
* Komfortables Anlegen von Bahnhofsseiten. Button erscheint nur auf der Seite
* "Bahnhof anlegen" und nur für angemeldete Nutzer.
*
* Erzeugt eine Seite "Bahnhof <Name>" mit:
*  - Breadcrumb + 🌐 Website + Wikipedia
- WikiMap-Karte (aktiver Ort = Seitentitel, Filter "Bahnhof",
*    Start-Layer "Zug + Luftbild + Karte")
*  - Standort-Zeilen (📍 Adresse, OSM, 🧭 Koordinaten, CoMaps, Google Maps)
*    mit Auto-Links aus Koordinaten
*  - Abschnitt "Monitore" mit zwei Bahnsteiganzeigern (dep/arr) und je einem
*    Link zur detaillierten ÖBB-Tafel
*
* Die evaId wird von Hand eingetragen ("Prüfen" öffnet die Monitore-Ansicht
* dieser evaId zur Kontrolle). Die WikiMap-Orte.json wird NICHT angefasst
* (pflegst du selbst).
* ============================================================================
*/
( function () {
'use strict';


// Button nur auf dieser Seite (wgPageName nutzt Unterstriche).
Der Knopf erscheint nur für '''angemeldete''' Nutzer und nur auf der Seite [[Bahnhof anlegen]].
if ( mw.config.get( 'wgPageName' ) !== 'Bahnhof_anlegen' ) {
return;
}
if ( !mw.config.get( 'wgUserName' ) ) {
return;
}


// Start-Layer der Karte auf Bahnhofsseiten.
== Verwenden ==
var KARTE_LAYER = 'Zug + Luftbild + Karte';


function v( val ) {
# Seite [[Bahnhof anlegen]] öffnen, auf „Neuen Bahnhof anlegen" klicken.
return ( val || '' ).trim();
# Felder ausfüllen (siehe unten).
}
# „Seite anlegen" – die neue Seite „Bahnhof <Name>" wird erstellt und geöffnet.


/* ------------------------------------------------------------------ *
=== Felder ===
* Koordinaten-Parsing + Link-Bau.
* ------------------------------------------------------------------ */
function parseCoordinates( input ) {
if ( !input ) {
return null;
}
var s = input.trim();
var m;


m = /^(-?\d+,\d+)\s*[;\s]\s*(-?\d+,\d+)$/.exec( s ) ||
{| class="wikitable"
/^(-?\d+,\d+),\s+(-?\d+,\d+)$/.exec( s );
! Feld !! Pflicht? !! Zweck
if ( m ) {
|-
var latDE = parseFloat( m[ 1 ].replace( ',', '.' ) );
| '''Bahnhofsname''' || ja || Wird zu „Bahnhof <Name>". Das ist der Seitentitel '''und''' die Karten-ID (<code>data-aktiv-ort</code>).
var lngDE = parseFloat( m[ 2 ].replace( ',', '.' ) );
|-
if ( isFinite( latDE ) && isFinite( lngDE ) &&
| '''evaId''' + „Prüfen" || ja || Stationsnummer, nur Ziffern. „Prüfen" öffnet die Monitore-Ansicht dieser evaId in einem neuen Tab zur Kontrolle.
Math.abs( latDE ) <= 90 && Math.abs( lngDE ) <= 180 ) {
|-
return { lat: latDE, lng: lngDE };
| '''🌐 Website''' || nein || Steht als erste Zeile oben. Später kommt das Panorama von Hand darüber.
}
|-
}
| '''Wikipedia''' || nein || Link zum Wikipedia-Artikel.
|-
| '''📍 Adresse''' || nein || Postanschrift des Bahnhofs.
|-
| '''🧭 Koordinaten''' || nein || Siehe Automatik unten.
|-
| '''OSM / CoMaps / Google Maps''' || nein || Leer lassen → werden aus den Koordinaten erzeugt. Manuell eingetragene Links bleiben unangetastet.
|}


m = /^(-?\d+(?:\.\d+)?)\s*[,;\s]\s*(-?\d+(?:\.\d+)?)$/.exec( s );
=== Automatik aus Koordinaten ===
if ( m ) {
var lat = parseFloat( m[ 1 ] );
var lng = parseFloat( m[ 2 ] );
if ( isFinite( lat ) && isFinite( lng ) &&
Math.abs( lat ) <= 90 && Math.abs( lng ) <= 180 ) {
return { lat: lat, lng: lng };
}
}


m = /^(\d+(?:[.,]\d+)?)\s*°?\s*([NS])\s*[,;\s]?\s*(\d+(?:[.,]\d+)?)\s*°?\s*([EW])$/i.exec( s );
Trägt man '''Koordinaten''' ein (viele Formate erlaubt, z.B. <code>47.69694, 16.00583</code>, deutsches Komma-Format oder Grad/Minuten/Sekunden), werden für die '''leeren''' Kartendienst-Felder automatisch Links erzeugt: OpenStreetMap, CoMaps (<code>comaps.at/map</code> mit dem Seitentitel als Pin-Namen) und Google Maps.
if ( m ) {
var lat2 = parseFloat( m[ 1 ].replace( ',', '.' ) );
if ( m[ 2 ].toUpperCase() === 'S' ) { lat2 = -lat2; }
var lng2 = parseFloat( m[ 3 ].replace( ',', '.' ) );
if ( m[ 4 ].toUpperCase() === 'W' ) { lng2 = -lng2; }
if ( isFinite( lat2 ) && isFinite( lng2 ) &&
Math.abs( lat2 ) <= 90 && Math.abs( lng2 ) <= 180 ) {
return { lat: lat2, lng: lng2 };
}
}


m = /^(\d+)\s*°\s*(\d+)\s*['\u2019\u2032]\s*(\d+(?:[.,]\d+)?)\s*["\u201D\u2033]\s*([NS])\s*[,;\s]?\s*(\d+)\s*°\s*(\d+)\s*['\u2019\u2032]\s*(\d+(?:[.,]\d+)?)\s*["\u201D\u2033]\s*([EW])$/i.exec( s );
'''Wichtig:''' Der Karten-Pin auf der Seite kommt '''nicht''' aus diesem Feld, sondern aus der zentralen Datenseite <code>MediaWiki:WikiMap-Orte.json</code>. Die Koordinaten hier dienen nur den Standort-Links.
if ( m ) {
var lat3 = parseInt( m[ 1 ], 10 ) + parseInt( m[ 2 ], 10 ) / 60 + parseFloat( m[ 3 ].replace( ',', '.' ) ) / 3600;
if ( m[ 4 ].toUpperCase() === 'S' ) { lat3 = -lat3; }
var lng3 = parseInt( m[ 5 ], 10 ) + parseInt( m[ 6 ], 10 ) / 60 + parseFloat( m[ 7 ].replace( ',', '.' ) ) / 3600;
if ( m[ 8 ].toUpperCase() === 'W' ) { lng3 = -lng3; }
if ( Math.abs( lat3 ) <= 90 && Math.abs( lng3 ) <= 180 ) {
return { lat: lat3, lng: lng3 };
}
}


m = /^(\d+)\s*°\s*(\d+(?:[.,]\d+)?)\s*['\u2019\u2032]\s*([NS])\s*[,;\s]?\s*(\d+)\s*°\s*(\d+(?:[.,]\d+)?)\s*['\u2019\u2032]\s*([EW])$/i.exec( s );
=== evaId beschaffen ===
if ( m ) {
var lat4 = parseInt( m[ 1 ], 10 ) + parseFloat( m[ 2 ].replace( ',', '.' ) ) / 60;
if ( m[ 3 ].toUpperCase() === 'S' ) { lat4 = -lat4; }
var lng4 = parseInt( m[ 4 ], 10 ) + parseFloat( m[ 5 ].replace( ',', '.' ) ) / 60;
if ( m[ 6 ].toUpperCase() === 'W' ) { lng4 = -lng4; }
if ( Math.abs( lat4 ) <= 90 && Math.abs( lng4 ) <= 180 ) {
return { lat: lat4, lng: lng4 };
}
}


return null;
Die evaId steht für die meisten Bahnhöfe schon in der alten „Zug"-Vorlage. Sonst: auf fahrplan.oebb.at den Bahnhof abfragen, die detaillierte Abfahrtstafel öffnen und in der Adresse die Zahl hinter <code>evaId=</code> bzw. <code>station_evaId=</code> ablesen. Nur Ziffern – ein Name wie „Ternitz" wird nicht angenommen, weil die Live-Tafel zwingend die Nummer braucht.
}


function fmtCoord( n ) {
== Was erzeugt wird ==
return n.toFixed( 7 );
}
function buildOsmUrl( c ) {
var lat = fmtCoord( c.lat ), lng = fmtCoord( c.lng );
return 'https://www.openstreetmap.org/?mlat=' + lat + '&mlon=' + lng + '#map=17/' + lat + '/' + lng;
}
function buildGoogleMapsUrl( c ) {
return 'https://www.google.com/maps?q=' + fmtCoord( c.lat ) + ',' + fmtCoord( c.lng );
}
function buildCoMapsUrl( c, name ) {
// CoMaps/Organic Maps: ll = Koordinaten, n = URL-kodierter Name.
return 'https://comaps.at/map?v=1&ll=' + fmtCoord( c.lat ) + ',' + fmtCoord( c.lng ) +
'&n=' + encodeURIComponent( name || '' );
}


/* ------------------------------------------------------------------ *
Die angelegte Seite hat diesen Aufbau (Auszug):
* ÖBB-Detaillink (volle Tafel). typ: "dep"/"arr" -> sqView 2/3.
* "mon" -> Monitore-Ansicht (sqView 1), für den Prüf-Knopf.
* ------------------------------------------------------------------ */
function baueDetailUrl( eva, typ ) {
var boardType = ( typ === 'arr' ) ? 'arr' : 'dep';
var sqView = ( typ === 'arr' ) ? '3' : ( typ === 'mon' ? '1' : '2' );
return 'https://fahrplan.oebb.at/bin/stboard.exe/dn?protocol=https:&input=' +
encodeURIComponent( eva ) +
'&boardType=' + boardType +
'&sqView=' + sqView +
'&productsFilter=1111111111111&maxJourneys=40&start=yes&newrequest=yes&';
}


/* ------------------------------------------------------------------ *
<pre>
* Wikitext der Bahnhofsseite.
[[Hauptseite]] > ... > [[Zug]] > [[Zug#Bahnhöfe|Bahnhöfe]]
* Abstand: nach jedem BLOCK zwei <br> + Leerzeile. Die einzelnen
* Standort-Zeilen bleiben eng (nur je eine Leerzeile = eigener Absatz).
* ------------------------------------------------------------------ */
function buildWikitext( f ) {
var L = [];


function block() {
🌐 <Website>
L.push( '<br><br>' );
L.push( '' );
}


L.push( '[[Hauptseite]] > [[Hauptseite#Öffentlicher Verkehr|Öffentlicher Verkehr]] > [[Zug]] > [[Zug#Bahnhöfe|Bahnhöfe]]' );
[[file:Wikipedia.png|24px|link=|Wikipedia]] <Wikipedia>
block();


if ( f.website ) {
<div class="wikimap" data-aktiv-ort="Bahnhof <Name>" data-filter="Bahnhof" data-layer="Zug + Luftbild + Karte"></div>
L.push( '🌐 ' + f.website );
block();
}


if ( f.wikipedia ) {
📍 <Adresse>
L.push( '[[file:Wikipedia.png|24px|link=|Wikipedia]] ' + f.wikipedia );
[[file:osm.png|24px|link=]] <OSM>
block();
🧭 <Koordinaten>
}
[[file:CoMaps.png|24px|link=]] <CoMaps>
[[file:GoogleMaps.png|24px|link=]] <Google Maps>


// Karte: aktiver Ort = Seitentitel, nur Bahnhof-Pins, Start-Layer.
== Monitore ==
L.push( '<div class="wikimap" data-aktiv-ort="' + f.titel +
'" data-filter="Bahnhof" data-layer="' + KARTE_LAYER + '"></div>' );
block();


// Standort-Zeilen – eng, jede in eigenem Absatz (Leerzeile dazwischen).
<div class="bahnsteiganzeiger" data-evaid="<evaId>" data-typ="dep"></div>
var hatStandort = false;
[<ÖBB-Detaillink> Zur detaillierten Abfahrtstafel]
var first = true;
function loc( line ) {
if ( !first ) { L.push( '' ); }
L.push( line );
first = false;
hatStandort = true;
}
if ( f.adresse ) { loc( '📍 ' + f.adresse ); }
if ( f.osmUrl ) { loc( '[[file:osm.png|24px|link=]] ' + f.osmUrl ); }
if ( f.koordinaten ) { loc( '🧭 ' + f.koordinaten ); }
if ( f.comapsUrl ) { loc( '[[file:CoMaps.png|24px|link=]] ' + f.comapsUrl ); }
if ( f.gmapsUrl ) { loc( '[[file:GoogleMaps.png|24px|link=]] ' + f.gmapsUrl ); }
if ( hatStandort ) {
L.push( '<br><br>' );
block();
}


// Monitore (intern: Bahnsteiganzeiger). Link jeweils direkt unter dem Anzeiger.
<div class="bahnsteiganzeiger" data-evaid="<evaId>" data-typ="arr"></div>
L.push( '== Monitore ==' );
[<ÖBB-Detaillink> Zur detaillierten Ankunftstafel]
block();
</pre>
L.push( '<div class="bahnsteiganzeiger" data-evaid="' + f.evaId + '" data-typ="dep"></div>' );
L.push( '' );
L.push( '[' + baueDetailUrl( f.evaId, 'dep' ) + ' Zur detaillierten Abfahrtstafel]' );
L.push( '<br><br>' );
block();
L.push( '<div class="bahnsteiganzeiger" data-evaid="' + f.evaId + '" data-typ="arr"></div>' );
L.push( '' );
L.push( '[' + baueDetailUrl( f.evaId, 'arr' ) + ' Zur detaillierten Ankunftstafel]' );
block();


return L.join( '\n' );
Der Platz für Fotos/Panorama ganz oben bleibt zunächst leer und wird später von Hand ergänzt.
}


/* ------------------------------------------------------------------ *
== Voraussetzungen ==
* Oberfläche.
* ------------------------------------------------------------------ */
mw.loader.using( [
'oojs-ui-core',
'oojs-ui-windows',
'oojs-ui.styles.icons-interactions',
'oojs-ui.styles.icons-content',
'mediawiki.api',
'mediawiki.util'
] ).then( function () {


function BahnhofDialog( config ) {
Damit eine erzeugte Seite vollständig funktioniert, müssen im Wiki vorhanden sein:
BahnhofDialog.super.call( this, config );
}
OO.inheritClass( BahnhofDialog, OO.ui.ProcessDialog );


BahnhofDialog.static.name = 'bahnhofDialog';
* das Gadget '''[[Hilfe:Bahnsteiganzeiger|Bahnsteiganzeiger]]''' – sonst bleiben die beiden Tafeln leer;
BahnhofDialog.static.title = 'Neuen Bahnhof anlegen';
* das '''WikiMap'''-Gadget '''und''' in <code>MediaWiki:WikiMap-Orte.json</code> ein Eintrag mit <code>id</code> = „Bahnhof <Name>", <code>kategorie</code> = „Bahnhof" und den Koordinaten – sonst hat die Karte keinen Pin. '''Diese Einträge pflegt man selbst''', das Formular ändert die JSON nicht;
BahnhofDialog.static.actions = [
* die Bild-Dateien <code>osm.png</code>, <code>CoMaps.png</code>, <code>GoogleMaps.png</code>, <code>Wikipedia.png</code> (hochgeladen);
{ action: 'save', label: 'Seite anlegen', flags: [ 'primary', 'progressive' ] },
* die Seiten [[Hauptseite]] und [[Zug]] (für die Breadcrumb) sowie in der WikiMap-Layer-Liste der Eintrag „Zug + Luftbild + Karte".
{ label: 'Abbrechen', flags: 'safe' }
];


BahnhofDialog.prototype.initialize = function () {
== Manuell einrichten (für andere Wikis) ==
BahnhofDialog.super.prototype.initialize.apply( this, arguments );
var dialog = this;


this.panel = new OO.ui.PanelLayout( { padded: true, expanded: false } );
Voraussetzung: [https://www.mediawiki.org/wiki/Extension:Gadgets Extension:Gadgets] ist installiert.


this.nameInput = new OO.ui.TextInputWidget( { placeholder: 'z.B. Pottschach', required: true } );
# Seite <code>MediaWiki:Gadget-Bahnhof_anlegen.js</code> anlegen und den Inhalt von [[MediaWiki:Gadget-Bahnhof_anlegen.js]] hineinkopieren.
# In <code>MediaWiki:Gadgets-definition</code> diese Zeile ergänzen:


this.evaidInput = new OO.ui.TextInputWidget( { placeholder: 'z.B. 1131839', required: true } );
<pre>
this.pruefButton = new OO.ui.ButtonWidget( { label: 'Prüfen', icon: 'linkExternal' } );
* Bahnhof_anlegen[ResourceLoader|default]|Bahnhof_anlegen.js
</pre>


this.websiteInput = new OO.ui.TextInputWidget( { placeholder: 'https://bahnhof.oebb.at/…' } );
<ol start="3">
this.wikipediaInput = new OO.ui.TextInputWidget( { placeholder: 'https://de.wikipedia.org/wiki/…' } );
<li>Eine Seite mit dem Namen <code>Bahnhof anlegen</code> anlegen (beliebiger Inhalt). Der Knopf hängt sich automatisch an den Seiteninhalt; alternativ platziert man ihn gezielt mit <code><nowiki><div id="bahnhof-form-container"></div></nowiki></code>.</li>
this.adresseInput = new OO.ui.TextInputWidget( { placeholder: '2630 Pottschach, Putzmannsdorfer Straße 2' } );
<li>Die Voraussetzungen oben bereitstellen (Bahnsteiganzeiger-Gadget, WikiMap + JSON, Bilddateien).</li>
this.koordinatenInput = new OO.ui.TextInputWidget( { placeholder: '47.69694, 16.00583' } );
</ol>
this.osmUrlInput = new OO.ui.TextInputWidget( { placeholder: 'https://www.openstreetmap.org/…' } );
this.comapsUrlInput = new OO.ui.TextInputWidget( { placeholder: 'https://comaps.at/…' } );
this.gmapsUrlInput = new OO.ui.TextInputWidget( { placeholder: 'https://maps.app.goo.gl/…' } );


// evaId im Browser prüfen -> Monitore-Ansicht (sqView=1).
'''Anpassen für ein anderes Wiki''' – im Gadget-Code sind einige Dinge fest verdrahtet und müssen ggf. geändert werden:
this.pruefButton.on( 'click', function () {
var eva = v( dialog.evaidInput.getValue() ).replace( /^0+/, '' );
if ( !eva ) { return; }
window.open( baueDetailUrl( eva, 'mon' ), '_blank', 'noopener' );
} );


var fsPflicht = new OO.ui.FieldsetLayout( { label: 'Bahnhof (Pflicht)' } );
* die Auslöser-Seite (Prüfung auf <code>wgPageName === 'Bahnhof_anlegen'</code>);
fsPflicht.addItems( [
* die Breadcrumb-Zeile und die Kategorie „Bahnhof";
new OO.ui.FieldLayout( this.nameInput, {
* der Start-Layer der Karte (<code>KARTE_LAYER = 'Zug + Luftbild + Karte'</code>) muss buchstabengleich zu einem Eintrag in der WikiMap-Layer-Liste sein, sonst fällt die Karte lautlos auf den Standard zurück;
label: 'Bahnhofsname', align: 'left',
* die Namen der Bild-Dateien.
help: 'Wird zu „Bahnhof <Name>" das ist Seitentitel UND Karten-ID (data-aktiv-ort). Der gleichnamige Eintrag muss in WikiMap-Orte.json existieren.'
} ),
new OO.ui.ActionFieldLayout( this.evaidInput, this.pruefButton, {
label: 'evaId', align: 'left',
help: 'Stationsnummer, nur Ziffern (z.B. 1131839). Findest du in der alten „Zug"-Vorlage oder in der ÖBB-Adresse hinter evaId=. „Prüfen" öffnet die Monitore-Ansicht dieser evaId in einem neuen Tab.'
} )
] );


var fsStandort = new OO.ui.FieldsetLayout( { label: 'Standort (optional)' } );
Die OOUI-Oberfläche und <code>mediawiki.api</code> lädt das Gadget selbst nach; sie müssen nicht in der Definition-Zeile stehen.
fsStandort.addItems( [
new OO.ui.FieldLayout( this.websiteInput, {
label: '🌐 Website', align: 'left',
help: 'z.B. die ÖBB-Bahnhofsseite. Steht als erste Zeile oben; das Panorama kommt später von Hand darüber.'
} ),
new OO.ui.FieldLayout( this.wikipediaInput, {
label: 'Wikipedia', align: 'left',
help: 'Link zum Wikipedia-Artikel des Bahnhofs (optional).'
} ),
new OO.ui.FieldLayout( this.adresseInput, { label: '📍 Adresse', align: 'left' } ),
new OO.ui.FieldLayout( this.koordinatenInput, {
label: '🧭 Koordinaten', align: 'left',
help: 'Akzeptiert u.a.: 47.69694, 16.00583 · deutsches Komma-Format · 47°45\'00"N 15°40\'48"E. Wenn gesetzt, werden für leere OSM/CoMaps/Google-Maps-Felder automatisch Links erzeugt. (Der Karten-Pin kommt aus WikiMap-Orte.json, nicht von hier.)'
} ),
new OO.ui.FieldLayout( this.osmUrlInput, {
label: 'OpenStreetMap-URL', align: 'left',
help: 'Leer lassen -> wird bei gegebenen Koordinaten automatisch erzeugt.'
} ),
new OO.ui.FieldLayout( this.comapsUrlInput, {
label: 'CoMaps-URL', align: 'left',
help: 'Leer lassen -> wird bei gegebenen Koordinaten automatisch erzeugt (mit dem Seitentitel als Pin-Namen).'
} ),
new OO.ui.FieldLayout( this.gmapsUrlInput, {
label: 'Google-Maps-URL', align: 'left',
help: 'Leer lassen -> wird bei gegebenen Koordinaten automatisch erzeugt.'
} )
] );


this.panel.$element.append( fsPflicht.$element, fsStandort.$element );
== Grenzen & Wartung ==
this.$body.append( this.panel.$element );
};


BahnhofDialog.prototype.getActionProcess = function ( action ) {
* '''Keine eingebaute evaId-Suche.''' Eine frühere Live-Suche (über einen fremden Dienst) wurde entfernt, weil sie im Browser/CSP blockiert wurde. Die evaId wird von Hand eingetragen; „Prüfen" hilft bei der Kontrolle.
var dialog = this;
* '''CoMaps-Linkformat.''' Der erzeugte <code>comaps.at/map</code>-Link folgt dem aktuellen Format. Ändert CoMaps das, muss die Funktion <code>buildCoMapsUrl</code> im Code angepasst werden.
function fehler( msg ) {
* '''Blanker Link mit Klammern.''' Der CoMaps-Link wird als blanke URL ausgegeben und kann Klammern enthalten. Bei ausbalancierten Klammern erkennt MediaWiki ihn korrekt; sonst in <code><nowiki>[URL Text]</nowiki></code> verpacken.
return $.Deferred().reject( new OO.ui.Error( msg, { recoverable: true } ) ).promise();
}
if ( action === 'save' ) {
return new OO.ui.Process( function () {
var name = v( dialog.nameInput.getValue() );
var evaId = v( dialog.evaidInput.getValue() ).replace( /^0+/, '' );


if ( !name ) {
[[Kategorie:Hilfe]]
return fehler( 'Bitte den Bahnhofsnamen ausfüllen.' );
}
if ( !/^\d+$/.test( evaId ) ) {
return fehler( 'Bitte eine gültige evaId (nur Ziffern) eintragen.' );
}
 
var titel = /^Bahnhof\s/i.test( name ) ? name : 'Bahnhof ' + name;
 
var fields = {
titel: titel,
evaId: evaId,
website: v( dialog.websiteInput.getValue() ),
wikipedia: v( dialog.wikipediaInput.getValue() ),
adresse: v( dialog.adresseInput.getValue() ),
koordinaten: v( dialog.koordinatenInput.getValue() ),
osmUrl: v( dialog.osmUrlInput.getValue() ),
comapsUrl: v( dialog.comapsUrlInput.getValue() ),
gmapsUrl: v( dialog.gmapsUrlInput.getValue() )
};
 
var coords = parseCoordinates( fields.koordinaten );
if ( coords ) {
if ( !fields.osmUrl ) { fields.osmUrl = buildOsmUrl( coords ); }
if ( !fields.comapsUrl ) { fields.comapsUrl = buildCoMapsUrl( coords, titel ); }
if ( !fields.gmapsUrl ) { fields.gmapsUrl = buildGoogleMapsUrl( coords ); }
}
 
var wikitext = buildWikitext( fields );
var api = new mw.Api();
 
return api.get( {
action: 'query', titles: titel, formatversion: 2
} ).then( function ( data ) {
var page = data.query.pages[ 0 ];
if ( !page.missing ) {
return fehler( 'Eine Seite „' + titel + '" existiert bereits.' );
}
return api.postWithToken( 'csrf', {
action: 'edit',
title: titel,
text: wikitext,
createonly: true,
summary: 'Bahnhofsseite über Bahnhof-anlegen-Gadget angelegt'
} );
} ).then( function () {
window.location.href = mw.util.getUrl( titel );
}, function ( err ) {
if ( err instanceof OO.ui.Error ) {
return $.Deferred().reject( err ).promise();
}
return fehler( 'Fehler beim Anlegen: ' + ( err && err.toString ? err.toString() : 'unbekannt' ) );
} );
} );
}
return BahnhofDialog.super.prototype.getActionProcess.call( this, action );
};
 
BahnhofDialog.prototype.getBodyHeight = function () {
return 600;
};
 
var $container = $( '#bahnhof-form-container' );
if ( !$container.length ) {
$container = $( '<div id="bahnhof-form-container"></div>' )
.appendTo( '#mw-content-text .mw-parser-output' );
}
 
var button = new OO.ui.ButtonWidget( {
label: 'Neuen Bahnhof anlegen',
flags: [ 'primary', 'progressive' ],
icon: 'add'
} );
 
var windowManager = new OO.ui.WindowManager();
$( document.body ).append( windowManager.$element );
var dialog = new BahnhofDialog( { size: 'large' } );
windowManager.addWindows( [ dialog ] );
 
button.on( 'click', function () {
windowManager.openWindow( dialog );
} );
 
$container.empty().append( button.$element );
 
} );
}() );

Aktuelle Version vom 10. Juli 2026, 08:02 Uhr

Hauptseite > Schwarzatal.org

Vorlage:Kurzbeschreibung

Das Gadget Bahnhof anlegen stellt auf der Seite Bahnhof anlegen einen Knopf bereit, der aus wenigen Eingaben eine fertige Bahnhofsseite erzeugt: Breadcrumb, Website- und Wikipedia-Link, eine WikiMap-Karte, die Standort-Links (OpenStreetMap, CoMaps, Google Maps) und den Abschnitt „Monitore" mit den beiden Live-Tafeln (Bahnsteiganzeiger).

Der Knopf erscheint nur für angemeldete Nutzer und nur auf der Seite Bahnhof anlegen.

Verwenden

  1. Seite Bahnhof anlegen öffnen, auf „Neuen Bahnhof anlegen" klicken.
  2. Felder ausfüllen (siehe unten).
  3. „Seite anlegen" – die neue Seite „Bahnhof <Name>" wird erstellt und geöffnet.

Felder

Feld Pflicht? Zweck
Bahnhofsname ja Wird zu „Bahnhof <Name>". Das ist der Seitentitel und die Karten-ID (data-aktiv-ort).
evaId + „Prüfen" ja Stationsnummer, nur Ziffern. „Prüfen" öffnet die Monitore-Ansicht dieser evaId in einem neuen Tab zur Kontrolle.
🌐 Website nein Steht als erste Zeile oben. Später kommt das Panorama von Hand darüber.
Wikipedia nein Link zum Wikipedia-Artikel.
📍 Adresse nein Postanschrift des Bahnhofs.
🧭 Koordinaten nein Siehe Automatik unten.
OSM / CoMaps / Google Maps nein Leer lassen → werden aus den Koordinaten erzeugt. Manuell eingetragene Links bleiben unangetastet.

Automatik aus Koordinaten

Trägt man Koordinaten ein (viele Formate erlaubt, z.B. 47.69694, 16.00583, deutsches Komma-Format oder Grad/Minuten/Sekunden), werden für die leeren Kartendienst-Felder automatisch Links erzeugt: OpenStreetMap, CoMaps (comaps.at/map mit dem Seitentitel als Pin-Namen) und Google Maps.

Wichtig: Der Karten-Pin auf der Seite kommt nicht aus diesem Feld, sondern aus der zentralen Datenseite MediaWiki:WikiMap-Orte.json. Die Koordinaten hier dienen nur den Standort-Links.

evaId beschaffen

Die evaId steht für die meisten Bahnhöfe schon in der alten „Zug"-Vorlage. Sonst: auf fahrplan.oebb.at den Bahnhof abfragen, die detaillierte Abfahrtstafel öffnen und in der Adresse die Zahl hinter evaId= bzw. station_evaId= ablesen. Nur Ziffern – ein Name wie „Ternitz" wird nicht angenommen, weil die Live-Tafel zwingend die Nummer braucht.

Was erzeugt wird

Die angelegte Seite hat diesen Aufbau (Auszug):

[[Hauptseite]] > ... > [[Zug]] > [[Zug#Bahnhöfe|Bahnhöfe]]

🌐 <Website>

[[file:Wikipedia.png|24px|link=|Wikipedia]] <Wikipedia>

<div class="wikimap" data-aktiv-ort="Bahnhof <Name>" data-filter="Bahnhof" data-layer="Zug + Luftbild + Karte"></div>

📍 <Adresse>
[[file:osm.png|24px|link=]] <OSM>
🧭 <Koordinaten>
[[file:CoMaps.png|24px|link=]] <CoMaps>
[[file:GoogleMaps.png|24px|link=]] <Google Maps>

== Monitore ==

<div class="bahnsteiganzeiger" data-evaid="<evaId>" data-typ="dep"></div>
[<ÖBB-Detaillink> Zur detaillierten Abfahrtstafel]

<div class="bahnsteiganzeiger" data-evaid="<evaId>" data-typ="arr"></div>
[<ÖBB-Detaillink> Zur detaillierten Ankunftstafel]

Der Platz für Fotos/Panorama ganz oben bleibt zunächst leer und wird später von Hand ergänzt.

Voraussetzungen

Damit eine erzeugte Seite vollständig funktioniert, müssen im Wiki vorhanden sein:

  • das Gadget Bahnsteiganzeiger – sonst bleiben die beiden Tafeln leer;
  • das WikiMap-Gadget und in MediaWiki:WikiMap-Orte.json ein Eintrag mit id = „Bahnhof <Name>", kategorie = „Bahnhof" und den Koordinaten – sonst hat die Karte keinen Pin. Diese Einträge pflegt man selbst, das Formular ändert die JSON nicht;
  • die Bild-Dateien osm.png, CoMaps.png, GoogleMaps.png, Wikipedia.png (hochgeladen);
  • die Seiten Hauptseite und Zug (für die Breadcrumb) sowie in der WikiMap-Layer-Liste der Eintrag „Zug + Luftbild + Karte".

Manuell einrichten (für andere Wikis)

Voraussetzung: Extension:Gadgets ist installiert.

  1. Seite MediaWiki:Gadget-Bahnhof_anlegen.js anlegen und den Inhalt von MediaWiki:Gadget-Bahnhof_anlegen.js hineinkopieren.
  2. In MediaWiki:Gadgets-definition diese Zeile ergänzen:
* Bahnhof_anlegen[ResourceLoader|default]|Bahnhof_anlegen.js
  1. Eine Seite mit dem Namen Bahnhof anlegen anlegen (beliebiger Inhalt). Der Knopf hängt sich automatisch an den Seiteninhalt; alternativ platziert man ihn gezielt mit <div id="bahnhof-form-container"></div>.
  2. Die Voraussetzungen oben bereitstellen (Bahnsteiganzeiger-Gadget, WikiMap + JSON, Bilddateien).

Anpassen für ein anderes Wiki – im Gadget-Code sind einige Dinge fest verdrahtet und müssen ggf. geändert werden:

  • die Auslöser-Seite (Prüfung auf wgPageName === 'Bahnhof_anlegen');
  • die Breadcrumb-Zeile und die Kategorie „Bahnhof";
  • der Start-Layer der Karte (KARTE_LAYER = 'Zug + Luftbild + Karte') – muss buchstabengleich zu einem Eintrag in der WikiMap-Layer-Liste sein, sonst fällt die Karte lautlos auf den Standard zurück;
  • die Namen der Bild-Dateien.

Die OOUI-Oberfläche und mediawiki.api lädt das Gadget selbst nach; sie müssen nicht in der Definition-Zeile stehen.

Grenzen & Wartung

  • Keine eingebaute evaId-Suche. Eine frühere Live-Suche (über einen fremden Dienst) wurde entfernt, weil sie im Browser/CSP blockiert wurde. Die evaId wird von Hand eingetragen; „Prüfen" hilft bei der Kontrolle.
  • CoMaps-Linkformat. Der erzeugte comaps.at/map-Link folgt dem aktuellen Format. Ändert CoMaps das, muss die Funktion buildCoMapsUrl im Code angepasst werden.
  • Blanker Link mit Klammern. Der CoMaps-Link wird als blanke URL ausgegeben und kann Klammern enthalten. Bei ausbalancierten Klammern erkennt MediaWiki ihn korrekt; sonst in [URL Text] verpacken.