Benutzer:Schnark/js/linkUnlinked.js/test.js

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

Hinweis: Leere nach dem Veröffentlichen den Browser-Cache, um die Änderungen sehen zu können.

  • Firefox/Safari: Umschalttaste drücken und gleichzeitig Aktualisieren anklicken oder entweder Strg+F5 oder Strg+R (⌘+R auf dem Mac) drücken
  • Google Chrome: Umschalttaste+Strg+R (⌘+Umschalttaste+R auf dem Mac) drücken
  • Internet Explorer/Edge: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
  • Opera: Strg+F5
//<nowiki>
/*global mediaWiki, QUnit*/
(function ($, mw, base) {
"use strict";
var wgConfigOrig,
	rel2abs = base.rel2abs,
	wikilinkToUrl = base.wikilinkToUrl,
	strip = base.strip,
	unstrip = base.unstrip,
	changeHtml = base.changeHtml,
	changeElements = base.changeElements;

function before () {
	wgConfigOrig = mw.config.get(['wgArticlePath', 'wgPageName']);
	mw.config.set({wgArticlePath: '/wiki/$1', wgPageName: 'Base'});
}

function after () {
	mw.config.set(wgConfigOrig);
}

QUnit.module('linkUnlinked', {
	beforeEach: before,
	afterEach: after
});

QUnit.test('rel2abs', function (assert) {
	assert.expect(10);
	assert.strictEqual(rel2abs('Sub', 'Base'), 'Sub', 'Keine Unterseite');
	assert.strictEqual(rel2abs('/Sub', 'Base'), 'Base/Sub', 'Einfache Unterseite');
	assert.strictEqual(rel2abs('/Sub/', 'Base'), 'Base/Sub',
		'Einfache Unterseite mit schließendem Schrägstrich');
	assert.strictEqual(rel2abs(':/Sub', 'Base'), '/Sub', 'Doppelpunkt');
	assert.strictEqual(rel2abs(':/Sub/', 'Base'), '/Sub/', 'Doppelpunkt und schließender Schrägstrich');
	assert.strictEqual(rel2abs('../Sub2', 'Base/Sub1'), 'Base/Sub2', 'Einfacher Pfadwechsel');
	assert.strictEqual(rel2abs('../Sub2/', 'Base/Sub1'), 'Base/Sub2',
		'Einfacher Pfadwechsel mit schließendem Schrägstrich');
	assert.strictEqual(rel2abs('../Sub2', 'Base'), 'Base/../Sub2', 'Fehlerhafter Pfadwechsel');
	assert.strictEqual(rel2abs('../Sub2', 'Base/Sub/Sub'), 'Base/Sub/Sub2', 'Tiefer Pfadwechsel');
	assert.strictEqual(rel2abs('../../Sub2', 'Base/Sub/Sub'), 'Base/Sub2', 'Doppelter Pfadwechsel');
});

QUnit.test('wikilinkToUrl', function (assert) {
	assert.expect(15);
	assert.strictEqual(wikilinkToUrl('Foo'), '/wiki/Foo', 'Einfacher Titel');
	assert.strictEqual(wikilinkToUrl('en:Foo'), '/wiki/en:Foo', 'andere Sprache');
	assert.strictEqual(wikilinkToUrl('Windows&nbsp;10'), '/wiki/Windows%C2%A010', 'Link mit NBSP');
	assert.strictEqual(wikilinkToUrl('#Bar?'), '#Bar?', 'Anker im selben Artikel');
	assert.strictEqual(wikilinkToUrl('Foo#Bar?'), '/wiki/Foo#Bar?', 'Anker in anderem Artikel');
	assert.strictEqual(wikilinkToUrl('ÄÖÜ (+?)'), '/wiki/%C3%84%C3%96%C3%9C_(%2B%3F)',
		'Titel mit Sonderzeichen');
	assert.strictEqual(wikilinkToUrl('%C3%84%C3%96%C3%9C_%28%2B%3F%29'), '/wiki/%C3%84%C3%96%C3%9C_(%2B%3F)',
		'Titel mit Sonderzeichen, %-kodiert');
	assert.strictEqual(wikilinkToUrl('%C3%84Ö%C3%9C_%28%2B%3F%29'), '/wiki/%C3%84%C3%96%C3%9C_(%2B%3F)',
		'Titel mit Sonderzeichen, teilweise %-kodiert');
	assert.strictEqual(wikilinkToUrl('5%'), '/wiki/5%25', 'Titel mit %');
	assert.strictEqual(wikilinkToUrl('/Sub'), '/wiki/Base/Sub', 'Unterseite');
	assert.strictEqual(wikilinkToUrl('/Sub/#Foo'), '/wiki/Base/Sub#Foo',
		'Unterseite mit schließendem Schrägstrich und Anker');
	assert.strictEqual(wikilinkToUrl(':/Sub'), '/wiki//Sub', 'keine Unterseite');
	assert.strictEqual(wikilinkToUrl(':#Foo'), '#Foo', 'Anker nach Doppelpunkt');
	assert.strictEqual(wikilinkToUrl('Base/../Sub2'), false, 'Fehlerhafter Pfadwechsel');
	assert.strictEqual(wikilinkToUrl('1 < 2'), false, 'Kleiner-Zeichen im Titel');
});

QUnit.test('strip - unstrip', function (assert) {
	function stripUnstripTest (input, name) {
		var ret = strip(input);
		assert.ok(!(/[<>"]/).test(ret[0]), name + ' - alle Tags entfernt');
		assert.strictEqual(unstrip(ret[0], ret[1]), input, name + ' - Eingabe exakt wiederhergestellt');
	}

	assert.expect(5 * 2);
	stripUnstripTest('foo bar', 'Ohne Tags');
	stripUnstripTest('foo <x>bar</x> baz', 'Ein Tag');
	stripUnstripTest('foo <x>bar<y>baz</y> foo <z /></x>', 'Mehrere Tags');
	stripUnstripTest('foo <!-- comment <x> -->', 'Kommentar');
	stripUnstripTest('<x type="nonsense">foo<y multi attr single="true"/></x><z a="" b="b" c d="d"></z>',
		'Mit Attributen');
});

//jscs:disable maximumLineLength
QUnit.test('changeHtml', function (assert) {
	assert.expect(25);
	assert.strictEqual(changeHtml('foo bar baz'), 'foo bar baz', 'Ohne Links');
	assert.strictEqual(changeHtml('foo [[bar]] baz'),
		'foo <a href="/wiki/bar" class="schnark-linkUnlinked-link">[[bar]]</a> baz',
		'Einfacher Wikilink');
	assert.strictEqual(changeHtml('foo [[bar|BAR]] baz'),
		'foo <a href="/wiki/bar" class="schnark-linkUnlinked-link">[[bar|BAR]]</a> baz',
		'Maskierter Wikilink');
	assert.strictEqual(changeHtml('foo [//bar.org] baz'),
		'foo <a href="//bar.org" class="schnark-linkUnlinked-link">[//bar.org]</a> baz',
		'Einfacher (protokollrelativer) Weblink');
	assert.strictEqual(changeHtml('foo [http://bar.org BAR] baz'),
		'foo <a href="http://bar.org" class="schnark-linkUnlinked-link">[http://bar.org BAR]</a> baz',
		'Maskierter Weblink');
	assert.strictEqual(changeHtml('foo https://bar.org baz'),
		'foo <a href="https://bar.org" class="schnark-linkUnlinked-link">https://bar.org</a> baz',
		'Freier Weblink');
	assert.strictEqual(changeHtml('foo (http://bar.org/baz!) foo'),
		'foo (<a href="http://bar.org/baz" class="schnark-linkUnlinked-link">http://bar.org/baz</a>!) foo',
		'Freier Weblink mit Satzzeichen - 1');
	assert.strictEqual(changeHtml('foo http://bar.org/b(az)! foo'),
		'foo <a href="http://bar.org/b(az)" class="schnark-linkUnlinked-link">http://bar.org/b(az)</a>! foo',
		'Freier Weblink mit Satzzeichen - 2');
	assert.strictEqual(changeHtml('foo ISBN 3-123-456 78-x baz'),
		'foo <a href="/wiki/Special:Booksources/312345678X" class="schnark-linkUnlinked-link">ISBN 3-123-456 78-x</a> baz',
		'ISBN-10');
	assert.strictEqual(changeHtml('foo ISBN 978 3-123-456 78-0 baz'),
		'foo <a href="/wiki/Special:Booksources/9783123456780" class="schnark-linkUnlinked-link">ISBN 978 3-123-456 78-0</a> baz',
		'ISBN-13');
	assert.strictEqual(changeHtml('foo [[http://bar.org?foo=baz|bar]] foo'),
		'foo [<a href="http://bar.org?foo=baz|bar" class="schnark-linkUnlinked-link">[http://bar.org?foo=baz|bar]</a>] foo',
		'Weblink mit senkrechtem Strich in doppelter eckiger Klammer');
	assert.strictEqual(changeHtml('foo <x>bar</x> baz'), 'foo <x>bar</x> baz', 'Ohne Links - mit Tags');
	assert.strictEqual(changeHtml('foo <x>[[b</x>ar]] baz'),
		'foo <x><a href="/wiki/bar" class="schnark-linkUnlinked-link">[[b</a></x><a href="/wiki/bar" class="schnark-linkUnlinked-link">ar]]</a> baz',
		'Einfacher Wikilink - mit Tags');
	assert.strictEqual(changeHtml('foo [[ba<y>r|BAR]] b</y>az'),
		'foo <a href="/wiki/bar" class="schnark-linkUnlinked-link">[[ba</a><y><a href="/wiki/bar" class="schnark-linkUnlinked-link">r|BAR]]</a> b</y>az',
		'Maskierter Wikilink - mit Tags');
	assert.strictEqual(changeHtml('foo [//ba<z/>r.org] baz'),
		'foo <a href="//bar.org" class="schnark-linkUnlinked-link">[//ba</a><z/><a href="//bar.org" class="schnark-linkUnlinked-link">r.org]</a> baz',
		'Einfacher (protokollrelativer) Weblink - mit Tags');
	assert.strictEqual(changeHtml('foo <b>[http://<c d="e">b</c>ar.org</b> BAR] baz'),
		'foo <b><a href="http://bar.org" class="schnark-linkUnlinked-link">[http://</a><c d="e"><a href="http://bar.org" class="schnark-linkUnlinked-link">b</a></c><a href="http://bar.org" class="schnark-linkUnlinked-link">ar.org</a></b><a href="http://bar.org" class="schnark-linkUnlinked-link"> BAR]</a> baz',
		'Maskierter Weblink - mit Tags');
	assert.strictEqual(changeHtml('foo https://b<n/>a<n/>r<n/>.<n/>o<n/>r<n/>g<n/> baz'),
		'foo <a href="https://bar.org" class="schnark-linkUnlinked-link">https://b</a><n/><a href="https://bar.org" class="schnark-linkUnlinked-link">a</a><n/><a href="https://bar.org" class="schnark-linkUnlinked-link">r</a><n/><a href="https://bar.org" class="schnark-linkUnlinked-link">.</a><n/><a href="https://bar.org" class="schnark-linkUnlinked-link">o</a><n/><a href="https://bar.org" class="schnark-linkUnlinked-link">r</a><n/><a href="https://bar.org" class="schnark-linkUnlinked-link">g</a><n/> baz',
		'Freier Weblink - mit Tags');
	assert.strictEqual(changeHtml('[[foo]] [[bar]] [[baz'),
		'<a href="/wiki/foo" class="schnark-linkUnlinked-link">[[foo]]</a> <a href="/wiki/bar" class="schnark-linkUnlinked-link">[[bar]]</a> [[baz',
		'Mehrere Links, unvollständige Links');
	assert.strictEqual(changeHtml('<span title="[[foo]]"><img src="http://example.org/image.jpg" /></span>'),
		'<span title="[[foo]]"><img src="http://example.org/image.jpg" /></span>',
		'Links in Attributen');
	assert.strictEqual(changeHtml('[[Datei:Test.png|miniatur|Testbild]]'),
		'<a href="/wiki/Datei:Test.png" class="schnark-linkUnlinked-link">[[Datei:Test.png|miniatur|Testbild]]</a>',
		'Datei mit einfacher Beschreibung');
	assert.strictEqual(changeHtml('[[Datei:Diagramm.svg|miniatur|hochkant=2|Legende über mehrere Zeilen'),
		'<a href="/wiki/Datei:Diagramm.svg" class="schnark-linkUnlinked-link">[[Datei:Diagramm.svg|miniatur|hochkant=2|</a>Legende über mehrere Zeilen',
		'Datei mit Beschreibung (abgebrochen)');
	assert.strictEqual(changeHtml('[[Datei:Max Mustermann.jpg|miniatur|Porträt von [[Max Mustermann]] (2012)]]'),
		'<a href="/wiki/Datei:Max_Mustermann.jpg" class="schnark-linkUnlinked-link">[[Datei:Max Mustermann.jpg|miniatur|</a>Porträt von <a href="/wiki/Max_Mustermann" class="schnark-linkUnlinked-link">[[Max Mustermann]]</a> (2012)]]',
		'Datei mit Link in Beschreibung');
	assert.strictEqual(changeHtml('[[foo &lt; bar]]'), '[[foo &lt; bar]]', 'Link mit Kleiner-Zeichen');
	assert.strictEqual(changeHtml('[[foo]] <'), false, 'Ungültiges HTML');
	assert.strictEqual(changeHtml('[<x>[foo]</x>], [<y/><y/>h<y/><y/>tt<z>p://ex</z>ample.org], ISBN 978 <span style="color:blue;">3-123-456 78</span>-0, ht<tt>t</tt>ps://de.wikipedia.org/wiki/Wikipedia:Hauptseite!'),
		'<a href="/wiki/foo" class="schnark-linkUnlinked-link">[</a><x><a href="/wiki/foo" class="schnark-linkUnlinked-link">[foo]</a></x><a href="/wiki/foo" class="schnark-linkUnlinked-link">]</a>, <a href="http://example.org" class="schnark-linkUnlinked-link">[</a><y/><y/><a href="http://example.org" class="schnark-linkUnlinked-link">h</a><y/><y/><a href="http://example.org" class="schnark-linkUnlinked-link">tt</a><z><a href="http://example.org" class="schnark-linkUnlinked-link">p://ex</a></z><a href="http://example.org" class="schnark-linkUnlinked-link">ample.org]</a>, <a href="/wiki/Special:Booksources/9783123456780" class="schnark-linkUnlinked-link">ISBN 978 </a><span style="color:blue;"><a href="/wiki/Special:Booksources/9783123456780" class="schnark-linkUnlinked-link">3-123-456 78</a></span><a href="/wiki/Special:Booksources/9783123456780" class="schnark-linkUnlinked-link">-0</a>, <a href="https://de.wikipedia.org/wiki/Wikipedia:Hauptseite" class="schnark-linkUnlinked-link">ht</a><tt><a href="https://de.wikipedia.org/wiki/Wikipedia:Hauptseite" class="schnark-linkUnlinked-link">t</a></tt><a href="https://de.wikipedia.org/wiki/Wikipedia:Hauptseite" class="schnark-linkUnlinked-link">ps://de.wikipedia.org/wiki/Wikipedia:Hauptseite</a>!',
		'Links mit Tags an kennzeichnenden Stellen');
});

QUnit.test('Spitze Klammern', function (assert) {
	assert.expect(6);
	assert.strictEqual(changeHtml('[[Das geht &lt;noch&gt; nicht]]'), '[[Das geht &lt;noch&gt; nicht]]',
		'Spitze Klammern in internen Links');
	assert.strictEqual(changeHtml('[[Das ist ein &lt;!--unsichtbarer --&gt;Kommentar]]'),
		'<a href="/wiki/Das_ist_ein_Kommentar" class="schnark-linkUnlinked-link">[[Das ist ein &lt;!--unsichtbarer --&gt;Kommentar]]</a>',
		'HTML-Kommentar in internem Link');
	assert.strictEqual(changeHtml('&lt;ref&gt;http://example.org&lt;/ref&gt;'),
		//FIXME: &lt;ref&gt;<a href="http://example.org" class="schnark-linkUnlinked-link">http://example.org</a>&lt;/ref&gt;
		'&lt;ref&gt;<a href="http://example.org" class="schnark-linkUnlinked-link">http://example.org&lt;/ref&gt;</a>',
		'Spitze Klammern nach freiem externen Link');
	assert.strictEqual(changeHtml('http://example.org?&lt;!--alt=alt&amp;--&gt;neu=neu'),
		'<a href="http://example.org?neu=neu" class="schnark-linkUnlinked-link">http://example.org?&lt;!--alt=alt&amp;--&gt;neu=neu</a>',
		'Kommentar in freiem externen Link');
	assert.strictEqual(changeHtml('[http://example.org&lt;]'),
		'<a href="http://example.org" class="schnark-linkUnlinked-link">[http://example.org&lt;]</a>',
		'Spitze Klammern nach externen Link');
	assert.strictEqual(changeHtml('[http://example.org?&lt;!--alt=alt&amp;--&gt;neu=neu]'),
		'<a href="http://example.org?neu=neu" class="schnark-linkUnlinked-link">[http://example.org?&lt;!--alt=alt&amp;--&gt;neu=neu]</a>',
		'Kommentar in externen Link');
});

QUnit.test('changeElements', function (assert) {
	assert.expect(2);
	var $el = $('<div><p><span style="color: white;">[[fo</span>o<del id="bar">]]</del><br /></p><p id="foo">http://ex<u>a</u>mple.org, //exmample.org</p><p>[[foo|<br />bar]]</p></div>');
	changeElements($el.find('p'));
	assert.strictEqual($el.html(),
		'<p><span style="color: white;"><a href="/wiki/foo" class="schnark-linkUnlinked-link">[[fo</a></span><a href="/wiki/foo" class="schnark-linkUnlinked-link">o</a><del id="bar"><a href="/wiki/foo" class="schnark-linkUnlinked-link">]]</a></del><br></p><p id="foo"><a href="http://example.org" class="schnark-linkUnlinked-link">http://ex</a><u><a href="http://example.org" class="schnark-linkUnlinked-link">a</a></u><a href="http://example.org" class="schnark-linkUnlinked-link">mple.org</a>, //exmample.org</p><p><a href="/wiki/foo" class="schnark-linkUnlinked-link">[[foo|</a><br><a href="/wiki/foo" class="schnark-linkUnlinked-link">bar]]</a></p>',
		'Einfacher Test');
	$el.appendTo('#qunit-fixture');
	assert.strictEqual($el.find('a').first().css('color'), 'rgb(255, 255, 255)', 'Standard-CSS überschreibt normale Link-Farbe');
});

})(jQuery, mediaWiki, mediaWiki.libs.qunit);
//</nowiki>