Benutzer:Schnark/js/linkUnlinked.js/test.js
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
- Edge: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
//<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 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 < bar]]'), '[[foo < 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 <noch> nicht]]'), '[[Das geht <noch> nicht]]',
'Spitze Klammern in internen Links');
assert.strictEqual(changeHtml('[[Das ist ein <!--unsichtbarer -->Kommentar]]'),
'<a href="/wiki/Das_ist_ein_Kommentar" class="schnark-linkUnlinked-link">[[Das ist ein <!--unsichtbarer -->Kommentar]]</a>',
'HTML-Kommentar in internem Link');
assert.strictEqual(changeHtml('<ref>http://example.org</ref>'),
//FIXME: <ref><a href="http://example.org" class="schnark-linkUnlinked-link">http://example.org</a></ref>
'<ref><a href="http://example.org" class="schnark-linkUnlinked-link">http://example.org</ref></a>',
'Spitze Klammern nach freiem externen Link');
assert.strictEqual(changeHtml('http://example.org?<!--alt=alt&-->neu=neu'),
'<a href="http://example.org?neu=neu" class="schnark-linkUnlinked-link">http://example.org?<!--alt=alt&-->neu=neu</a>',
'Kommentar in freiem externen Link');
assert.strictEqual(changeHtml('[http://example.org<]'),
'<a href="http://example.org" class="schnark-linkUnlinked-link">[http://example.org<]</a>',
'Spitze Klammern nach externen Link');
assert.strictEqual(changeHtml('[http://example.org?<!--alt=alt&-->neu=neu]'),
'<a href="http://example.org?neu=neu" class="schnark-linkUnlinked-link">[http://example.org?<!--alt=alt&-->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>