P->addMode('internallink', new Internallink()); $this->P->parse("Foo [[l]] Bar"); $calls = [ ['document_start', []], ['p_open', []], ['cdata', ["\n" . 'Foo ']], ['internallink', ['l', null]], ['cdata', [' Bar']], ['p_close', []], ['document_end', []], ]; $this->assertCalls($calls, $this->H->calls); } function testNoChar() { $this->P->addMode('internallink', new Internallink()); $this->P->parse("Foo [[]] Bar"); $calls = [ ['document_start', []], ['p_open', []], ['cdata', ["\n" . 'Foo ']], ['internallink', ['', null]], ['cdata', [' Bar']], ['p_close', []], ['document_end', []], ]; $this->assertCalls($calls, $this->H->calls); } function testNamespaceNoTitle() { $this->P->addMode('internallink', new Internallink()); $this->P->parse("Foo [[foo:bar]] Bar"); $calls = [ ['document_start', []], ['p_open', []], ['cdata', ["\n" . 'Foo ']], ['internallink', ['foo:bar', null]], ['cdata', [' Bar']], ['p_close', []], ['document_end', []], ]; $this->assertCalls($calls, $this->H->calls); } function testNamespace() { $this->P->addMode('internallink', new Internallink()); $this->P->parse("Foo [[x:1:y:foo_bar:z|Test]] Bar"); $calls = [ ['document_start', []], ['p_open', []], ['cdata', ["\n" . 'Foo ']], ['internallink', ['x:1:y:foo_bar:z', 'Test']], ['cdata', [' Bar']], ['p_close', []], ['document_end', []], ]; $this->assertCalls($calls, $this->H->calls); } function testSectionRef() { $this->P->addMode('internallink', new Internallink()); $this->P->parse("Foo [[wiki:syntax#internal|Syntax]] Bar"); $calls = [ ['document_start', []], ['p_open', []], ['cdata', ["\n" . 'Foo ']], ['internallink', ['wiki:syntax#internal', 'Syntax']], ['cdata', [' Bar']], ['p_close', []], ['document_end', []], ]; $this->assertCalls($calls, $this->H->calls); } function testCodeFollows() { $this->P->addMode('internallink', new Internallink()); $this->P->parse("Foo [[wiki:internal:link|Test]] Bar command [arg1 [arg2 [arg3]]]"); $calls = [ ['document_start', []], ['p_open', []], ['cdata', ["\n" . 'Foo ']], ['internallink', ['wiki:internal:link', 'Test']], ['cdata', [' Bar command [arg1 [arg2 [arg3]]]']], ['p_close', []], ['document_end', []], ]; $this->assertCalls($calls, $this->H->calls); } function testCodeFollows2() { $this->P->addMode('internallink', new Internallink()); $this->P->parse("Foo [[wiki:internal:link|[Square brackets in title] Test]] Bar command [arg1 [arg2 [arg3]]]"); $calls = [ ['document_start', []], ['p_open', []], ['cdata', ["\n" . 'Foo ']], ['internallink', ['wiki:internal:link', '[Square brackets in title] Test']], ['cdata', [' Bar command [arg1 [arg2 [arg3]]]']], ['p_close', []], ['document_end', []], ]; $this->assertCalls($calls, $this->H->calls); } function testTwoLinks() { $this->P->addMode('internallink', new Internallink()); $this->P->parse("Foo [[foo:bar|one]] and [[bar:foo|two]] Bar"); $calls = [ ['document_start', []], ['p_open', []], ['cdata', ["\n" . 'Foo ']], ['internallink', ['foo:bar', 'one']], ['cdata', [' and ']], ['internallink', ['bar:foo', 'two']], ['cdata', [' Bar']], ['p_close', []], ['document_end', []], ]; $this->assertCalls($calls, $this->H->calls); } // ----- dispatch to externallink ----- function testExternalUrlInside() { $this->P->addMode('internallink', new Internallink()); $this->P->parse("Foo [[http://www.google.com|Google]] Bar"); $calls = [ ['document_start', []], ['p_open', []], ['cdata', ["\n" . 'Foo ']], ['externallink', ['http://www.google.com', 'Google']], ['cdata', [' Bar']], ['p_close', []], ['document_end', []], ]; $this->assertCalls($calls, $this->H->calls); } function testExternalUrlWithBracketsInside() { $this->P->addMode('internallink', new Internallink()); $this->P->parse("Foo [[http://www.google.com?test[]=squarebracketsinurl|Google]] Bar"); $calls = [ ['document_start', []], ['p_open', []], ['cdata', ["\n" . 'Foo ']], ['externallink', ['http://www.google.com?test[]=squarebracketsinurl', 'Google']], ['cdata', [' Bar']], ['p_close', []], ['document_end', []], ]; $this->assertCalls($calls, $this->H->calls); } function testExternalUrlWithBracketsInsideCodeFollows() { $this->P->addMode('internallink', new Internallink()); $this->P->parse("Foo [[http://www.google.com?test[]=squarebracketsinurl|Google]] Bar command [arg1 [arg2 [arg3]]]"); $calls = [ ['document_start', []], ['p_open', []], ['cdata', ["\n" . 'Foo ']], ['externallink', ['http://www.google.com?test[]=squarebracketsinurl', 'Google']], ['cdata', [' Bar command [arg1 [arg2 [arg3]]]']], ['p_close', []], ['document_end', []], ]; $this->assertCalls($calls, $this->H->calls); } function testFileSchemeInside() { $this->P->addMode('internallink', new Internallink()); $this->P->parse('Foo [[file://temp/file.txt|Some File]] Bar'); $calls = [ ['document_start', []], ['p_open', []], ['cdata', ["\n" . 'Foo ']], ['externallink', ['file://temp/file.txt', 'Some File']], ['cdata', [' Bar']], ['p_close', []], ['document_end', []], ]; $this->assertCalls($calls, $this->H->calls); } // ----- dispatch to interwikilink ----- function testInterwikiLink() { $this->P->addMode('internallink', new Internallink()); $this->P->parse("Foo [[iw>somepage|Some Page]] Bar"); $calls = [ ['document_start', []], ['p_open', []], ['cdata', ["\n" . 'Foo ']], ['interwikilink', ['iw>somepage', 'Some Page', 'iw', 'somepage']], ['cdata', [' Bar']], ['p_close', []], ['document_end', []], ]; $this->assertCalls($calls, $this->H->calls); } function testInterwikiLinkCase() { $this->P->addMode('internallink', new Internallink()); $this->P->parse("Foo [[IW>somepage|Some Page]] Bar"); $calls = [ ['document_start', []], ['p_open', []], ['cdata', ["\n" . 'Foo ']], ['interwikilink', ['IW>somepage', 'Some Page', 'iw', 'somepage']], ['cdata', [' Bar']], ['p_close', []], ['document_end', []], ]; $this->assertCalls($calls, $this->H->calls); } function testInterwikiPedia() { $this->P->addMode('internallink', new Internallink()); $this->P->parse("Foo [[wp>Callback_(computer_science)|callbacks]] Bar"); $calls = [ ['document_start', []], ['p_open', []], ['cdata', ["\n" . 'Foo ']], ['interwikilink', ['wp>Callback_(computer_science)', 'callbacks', 'wp', 'Callback_(computer_science)']], ['cdata', [' Bar']], ['p_close', []], ['document_end', []], ]; $this->assertCalls($calls, $this->H->calls); } // ----- media payload as link title ----- function testMediaImageAsTitle() { $this->P->addMode('internallink', new Internallink()); $this->P->parse("Foo [[x:1:y:foo_bar:z|{{img.gif?10x20nocache|Some Image}}]] Bar"); $image = [ 'type' => 'internalmedia', 'src' => 'img.gif', 'title' => 'Some Image', 'align' => null, 'width' => 10, 'height' => 20, 'cache' => 'nocache', 'linking' => 'details', ]; $calls = [ ['document_start', []], ['p_open', []], ['cdata', ["\n" . 'Foo ']], ['internallink', ['x:1:y:foo_bar:z', $image]], ['cdata', [' Bar']], ['p_close', []], ['document_end', []], ]; $this->assertCalls($calls, $this->H->calls); } function testMediaNonImageAsTitle() { $this->P->addMode('internallink', new Internallink()); $this->P->parse("Foo [[x:1:y:foo_bar:z|{{foo.txt?10x20nocache|Some Image}}]] Bar"); $image = [ 'type' => 'internalmedia', 'src' => 'foo.txt', 'title' => 'Some Image', 'align' => null, 'width' => 10, 'height' => 20, 'cache' => 'nocache', 'linking' => 'details', ]; $calls = [ ['document_start', []], ['p_open', []], ['cdata', ["\n" . 'Foo ']], ['internallink', ['x:1:y:foo_bar:z', $image]], ['cdata', [' Bar']], ['p_close', []], ['document_end', []], ]; $this->assertCalls($calls, $this->H->calls); } function testMediaAsEmailLinkTitle() { $this->P->addMode('internallink', new Internallink()); $this->P->parse("Foo [[foo@example.com|{{img.gif?10x20nocache|Some Image}}]] Bar"); $image = [ 'type' => 'internalmedia', 'src' => 'img.gif', 'title' => 'Some Image', 'align' => null, 'width' => 10, 'height' => 20, 'cache' => 'nocache', 'linking' => 'details', ]; $calls = [ ['document_start', []], ['p_open', []], ['cdata', ["\n" . 'Foo ']], ['emaillink', ['foo@example.com', $image]], ['cdata', [' Bar']], ['p_close', []], ['document_end', []], ]; $this->assertCalls($calls, $this->H->calls); } }