MediaWiki:Gadget-Pano360.js: Unterschied zwischen den Versionen
Admin (Diskussion | Beiträge) Die Seite wurde neu angelegt: „/** * Gadget-Pano360 * Bindet 360-Grad-Panoramen (equirektangular) per Pannellum ein. * Verwendung im Wikitext: * <div class="pano360" data-src="Datei:Beispiel.jpg">Fallback-Text</div> * * Unterstützte data-Attribute: * data-src Wiki-Dateiname ("Datei:X.jpg" oder "X.jpg") oder URL/Pfad (Pflicht) * data-height Höhe in Pixeln (Standard: per CSS, 400) * data-yaw Start-Blickrichtung horizontal in Grad (-180..180) * data…“ |
Admin (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
| Zeile 12: | Zeile 12: | ||
* data-hfov Start-Blickwinkel/Zoom in Grad (Standard 100) | * data-hfov Start-Blickwinkel/Zoom in Grad (Standard 100) | ||
* data-autorotate Autorotation in Grad/Sekunde (z.B. 2, negativ = andersherum) | * data-autorotate Autorotation in Grad/Sekunde (z.B. 2, negativ = andersherum) | ||
* data-preview Vorschaubild, wird waehrend des Ladens angezeigt (Dateiname oder URL) | |||
* data-preview Vorschaubild | |||
* data-title Titel-Einblendung im Viewer | * data-title Titel-Einblendung im Viewer | ||
* data-author Autor-Einblendung im Viewer | * data-author Autor-Einblendung im Viewer | ||
| Zeile 82: | Zeile 81: | ||
type: 'equirectangular', | type: 'equirectangular', | ||
panorama: resolveSrc(src), | panorama: resolveSrc(src), | ||
autoLoad: | autoLoad: true, | ||
showFullscreenCtrl: true, | showFullscreenCtrl: true, | ||
strings: { | strings: { | ||
loadingLabel: 'Wird geladen …', | loadingLabel: 'Wird geladen …', | ||
bylineLabel: 'von %s', | bylineLabel: 'von %s', | ||
Aktuelle Version vom 12. Juni 2026, 10:54 Uhr
/**
* Gadget-Pano360
* Bindet 360-Grad-Panoramen (equirektangular) per Pannellum ein.
* Verwendung im Wikitext:
* <div class="pano360" data-src="Datei:Beispiel.jpg">Fallback-Text</div>
*
* Unterstützte data-Attribute:
* data-src Wiki-Dateiname ("Datei:X.jpg" oder "X.jpg") oder URL/Pfad (Pflicht)
* data-height Höhe in Pixeln (Standard: per CSS, 400)
* data-yaw Start-Blickrichtung horizontal in Grad (-180..180)
* data-pitch Start-Blickrichtung vertikal in Grad (-90..90)
* data-hfov Start-Blickwinkel/Zoom in Grad (Standard 100)
* data-autorotate Autorotation in Grad/Sekunde (z.B. 2, negativ = andersherum)
* data-preview Vorschaubild, wird waehrend des Ladens angezeigt (Dateiname oder URL)
* data-title Titel-Einblendung im Viewer
* data-author Autor-Einblendung im Viewer
* data-compass "1" = Kompass anzeigen
* data-north Nordversatz in Grad (fuer Kompass), Blickrichtung von Norden
*/
(function () {
'use strict';
var LIB_PATH = mw.config.get('wgScriptPath') + '/resources/lib/pannellum/';
var loadPromise = null;
// Pannellum-Bibliothek (JS + CSS) genau einmal nachladen
function loadPannellum() {
if (loadPromise) {
return loadPromise;
}
loadPromise = $.Deferred(function (deferred) {
$('<link>', {
rel: 'stylesheet',
href: LIB_PATH + 'pannellum.css'
}).appendTo('head');
var script = document.createElement('script');
script.src = LIB_PATH + 'pannellum.js';
script.onload = function () {
deferred.resolve();
};
script.onerror = function () {
deferred.reject();
};
document.head.appendChild(script);
}).promise();
return loadPromise;
}
// Dateiname oder URL -> ladbare Bild-URL
function resolveSrc(src) {
src = String(src).trim();
// Bereits URL oder absoluter Pfad? Unveraendert lassen.
if (/^(https?:)?\/\//i.test(src) || src.charAt(0) === '/') {
return src;
}
// Wiki-Datei: ueber Spezial:Weiterleitung zur Originaldatei
var name = src.replace(/^(Datei|File):/i, '');
return mw.util.getUrl('Special:Redirect/file/' + name);
}
// data-Attribut als Zahl lesen, sonst undefined
function num($el, attr) {
var v = $el.attr(attr);
if (v === undefined || v === '' || isNaN(parseFloat(v))) {
return undefined;
}
return parseFloat(v);
}
function initContainer(container) {
var $c = $(container);
var src = $c.attr('data-src');
if (!src) {
$c.text('Pano360: Attribut data-src fehlt.');
return;
}
var config = {
type: 'equirectangular',
panorama: resolveSrc(src),
autoLoad: true,
showFullscreenCtrl: true,
strings: {
loadingLabel: 'Wird geladen …',
bylineLabel: 'von %s',
noPanoramaError: 'Kein Panoramabild angegeben.',
fileAccessError: 'Die Datei %s konnte nicht geladen werden.',
malformedURLError: 'Fehlerhafte Panorama-URL.'
}
};
var yaw = num($c, 'data-yaw');
var pitch = num($c, 'data-pitch');
var hfov = num($c, 'data-hfov');
var autorotate = num($c, 'data-autorotate');
var north = num($c, 'data-north');
if (yaw !== undefined) { config.yaw = yaw; }
if (pitch !== undefined) { config.pitch = pitch; }
if (hfov !== undefined) { config.hfov = hfov; }
if (autorotate !== undefined) { config.autoRotate = autorotate; }
if (north !== undefined) { config.northOffset = north; }
if ($c.attr('data-compass') === '1') { config.compass = true; }
if ($c.attr('data-title')) { config.title = $c.attr('data-title'); }
if ($c.attr('data-author')) { config.author = $c.attr('data-author'); }
if ($c.attr('data-preview')) {
config.preview = resolveSrc($c.attr('data-preview'));
}
var height = num($c, 'data-height');
if (height !== undefined) {
container.style.height = height + 'px';
}
// Fallback-Inhalt entfernen, Viewer starten
$c.empty();
pannellum.viewer(container, config);
}
// Initialisierung bei Seitenladen und Vorschau
mw.hook('wikipage.content').add(function ($content) {
var $panos = $content.find('.pano360');
if (!$panos.length) {
return;
}
loadPannellum().then(function () {
$panos.each(function () {
if (this.getAttribute('data-pano360-init') !== '1') {
this.setAttribute('data-pano360-init', '1');
initContainer(this);
}
});
}, function () {
mw.log.warn('Pano360: Pannellum nicht ladbar unter ' + LIB_PATH);
$panos.text('360°-Panorama-Viewer konnte nicht geladen werden.');
});
});
}());