#!/usr/bin/env perl use strict; use warnings; use Test::More tests => 17; use MarkdownParser; my $parser = MarkdownParser->new(); is( $parser->parse("[link text](http://example.com)"), "

link text

\n", "Simple link" ); is( $parser->parse("[link with spaces](https://example.com/path)"), "

link with spaces

\n", "Link with path" ); is( $parser->parse("![alt text](image.png)"), "

\"alt

\n", "Simple image" ); is( $parser->parse("![alt with spaces](http://example.com/image.jpg)"), "

\"alt

\n", "Image with URL" ); is( $parser->parse("[Click me](javascript:alert('XSS'))"), "

Click me

\n", "JavaScript protocol blocked in links" ); is( $parser->parse("[Click me](data:text/html,)"), "

Click me

\n", "Data protocol blocked in links" ); is( $parser->parse("[Click me](javascript:alert('XSS'))"), "

Click me

\n", "Encoded JavaScript protocol blocked in links" ); is( $parser->parse("![Image](javascript:alert('XSS'))"), "

Image

\n", "JavaScript protocol blocked in images" ); is( $parser->parse("![Image](file:///etc/passwd)"), "

Image

\n", "File protocol blocked in images" ); is( $parser->parse("![Image](javascript:%2f%2falert('XSS'))"), "

Image

\n", "Encoded JavaScript protocol blocked in images" ); is( $parser->parse("[Click me](javascript :alert('XSS'))"), "

Click me

\n", "JavaScript protocol with numeric newline entity blocked" ); is( $parser->parse("[Click me](java script:alert('XSS'))"), "

Click me

\n", "JavaScript protocol with hex carriage return entity blocked" ); is( $parser->parse("[Click me](javascript%3Aalert('XSS'))"), "

Click me

\n", "Mixed encoded JavaScript protocol blocked" ); is( $parser->parse("![Image](java script:alert('XSS'))"), "

Image

\n", "JavaScript protocol with tab entity blocked in images" ); is( $parser->parse("[email](mailto:user\@example.com)"), "

email

\n", "Mailto protocol remains allowed" ); is( $parser->parse("[safe](%68%74%74%70%73://example.com/path)"), "

safe

\n", "Percent-encoded https scheme remains allowed" ); is( $parser->parse("[relative](/docs/java script:guide)"), "

relative

\n", "Relative URL with colon in path remains allowed" );