1<?php
2
3// must be called POST validation
4
5/**
6 * Adds rel="nofollow" to all outbound links.  This transform is
7 * only attached if Attr.Nofollow is TRUE.
8 */
9class HTMLPurifier_AttrTransform_Nofollow extends HTMLPurifier_AttrTransform
10{
11    /**
12     * @type HTMLPurifier_URIParser
13     */
14    private $parser;
15
16    public function __construct()
17    {
18        $this->parser = new HTMLPurifier_URIParser();
19    }
20
21    /**
22     * @param array $attr
23     * @param HTMLPurifier_Config $config
24     * @param HTMLPurifier_Context $context
25     * @return array
26     */
27    public function transform($attr, $config, $context)
28    {
29        if (!isset($attr['href'])) {
30            return $attr;
31        }
32
33        // XXX Kind of inefficient
34        $url = $this->parser->parse($attr['href']);
35        $scheme = $url->getSchemeObj($config, $context);
36
37        if ($scheme->browsable && !$url->isLocal($config, $context)) {
38            if (isset($attr['rel'])) {
39                $rels = explode(' ', $attr['rel']);
40                if (!in_array('nofollow', $rels)) {
41                    $rels[] = 'nofollow';
42                }
43                $attr['rel'] = implode(' ', $rels);
44            } else {
45                $attr['rel'] = 'nofollow';
46            }
47        }
48        return $attr;
49    }
50}
51
52// vim: et sw=4 sts=4
53