mirror of
https://github.com/renbaoshuo/S2OJ.git
synced 2024-12-27 20:31:52 +00:00
96d4a3ecf7
Due to historical reasons, the code is in subfolder "1". With SVN removal, we place the code back and remove the annoying "1" folder.
60 lines
1.6 KiB
PHP
60 lines
1.6 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Injector that converts http, https and ftp text URLs to actual links.
|
|
*/
|
|
class HTMLPurifier_Injector_Linkify extends HTMLPurifier_Injector
|
|
{
|
|
/**
|
|
* @type string
|
|
*/
|
|
public $name = 'Linkify';
|
|
|
|
/**
|
|
* @type array
|
|
*/
|
|
public $needed = array('a' => array('href'));
|
|
|
|
/**
|
|
* @param HTMLPurifier_Token $token
|
|
*/
|
|
public function handleText(&$token)
|
|
{
|
|
if (!$this->allowsElement('a')) {
|
|
return;
|
|
}
|
|
|
|
if (strpos($token->data, '://') === false) {
|
|
// our really quick heuristic failed, abort
|
|
// this may not work so well if we want to match things like
|
|
// "google.com", but then again, most people don't
|
|
return;
|
|
}
|
|
|
|
// there is/are URL(s). Let's split the string:
|
|
// Note: this regex is extremely permissive
|
|
$bits = preg_split('#((?:https?|ftp)://[^\s\'",<>()]+)#Su', $token->data, -1, PREG_SPLIT_DELIM_CAPTURE);
|
|
|
|
|
|
$token = array();
|
|
|
|
// $i = index
|
|
// $c = count
|
|
// $l = is link
|
|
for ($i = 0, $c = count($bits), $l = false; $i < $c; $i++, $l = !$l) {
|
|
if (!$l) {
|
|
if ($bits[$i] === '') {
|
|
continue;
|
|
}
|
|
$token[] = new HTMLPurifier_Token_Text($bits[$i]);
|
|
} else {
|
|
$token[] = new HTMLPurifier_Token_Start('a', array('href' => $bits[$i]));
|
|
$token[] = new HTMLPurifier_Token_Text($bits[$i]);
|
|
$token[] = new HTMLPurifier_Token_End('a');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// vim: et sw=4 sts=4
|