1<?php
2
3/**
4 * Injector that converts configuration directive syntax %Namespace.Directive
5 * to links
6 */
7class HTMLPurifier_Injector_PurifierLinkify extends HTMLPurifier_Injector
8{
9    /**
10     * @type string
11     */
12    public $name = 'PurifierLinkify';
13
14    /**
15     * @type string
16     */
17    public $docURL;
18
19    /**
20     * @type array
21     */
22    public $needed = array('a' => array('href'));
23
24    /**
25     * @param HTMLPurifier_Config $config
26     * @param HTMLPurifier_Context $context
27     * @return string
28     */
29    public function prepare($config, $context)
30    {
31        $this->docURL = $config->get('AutoFormat.PurifierLinkify.DocURL');
32        return parent::prepare($config, $context);
33    }
34
35    /**
36     * @param HTMLPurifier_Token $token
37     */
38    public function handleText(&$token)
39    {
40        if (!$this->allowsElement('a')) {
41            return;
42        }
43        if (strpos($token->data, '%') === false) {
44            return;
45        }
46
47        $bits = preg_split('#%([a-z0-9]+\.[a-z0-9]+)#Si', $token->data, -1, PREG_SPLIT_DELIM_CAPTURE);
48        $token = array();
49
50        // $i = index
51        // $c = count
52        // $l = is link
53        for ($i = 0, $c = count($bits), $l = false; $i < $c; $i++, $l = !$l) {
54            if (!$l) {
55                if ($bits[$i] === '') {
56                    continue;
57                }
58                $token[] = new HTMLPurifier_Token_Text($bits[$i]);
59            } else {
60                $token[] = new HTMLPurifier_Token_Start(
61                    'a',
62                    array('href' => str_replace('%s', $bits[$i], $this->docURL))
63                );
64                $token[] = new HTMLPurifier_Token_Text('%' . $bits[$i]);
65                $token[] = new HTMLPurifier_Token_End('a');
66            }
67        }
68    }
69}
70
71// vim: et sw=4 sts=4
72