ShortCodes.php 4.44 KB
<?php
class ShortCodes extends Singleton {
    private static $registered = Array();
    private static $private    = Array();

    public static function make() {
        add_actions('ShortCodes_Actions');
    }

    public static function registerClass($class) {
        if (!class_exists($class)) {
            throw new Exception("$class does not exist");
        }

        $ref     = new ReflectionClass($class);
        $methods = $ref->getMethods(ReflectionMethod::IS_STATIC);
        foreach ($methods as $method) {
            self::add($method->name, Array($class, $method->name));
        }
    }

    public static function add($code, $callback) {
        $fn = (function_exists('wp_add_shortcode') ? 'wp_add_shortcode' : 'add_shortcode');
        call_user_func($fn, $code, $callback);

        if (is_admin()) {
            self::$registered[$code] = Array('code' => $code, 'title' => $code, 'params' => Array(), 'uses_content' => 0);

            if (is_array($callback)) {
                $ref = new ReflectionMethod($callback[0], $callback[1]);
            } else {
                $ref = new ReflectionFunction($callback);
            }
            $api = $ref->getDocComment();
            $api = explode("\n", $api);
            array_shift($api);
            array_pop($api);

            foreach ($api as $key => &$comment) {
                $comment = trim($comment, ' *');

                if (substr($comment, 0, 1) == '@') {
                    $tag = trim(substr($comment, 1, strpos($comment, ' ')));
                    if (empty($tag)) {
                        $tag = trim($comment, '@');
                    }

                    if (method_exists(__CLASS__, 'parseTag_' . $tag)) {
                        call_user_func_array(Array(__CLASS__, 'parseTag_' . $tag), Array($code, $comment));
                    }
                }
            }
        }
    }

    public static function parseTag_display($code, $string) {
        $string = trim(str_replace('@display', '', $string));
        self::$registered[$code]['title'] = $string;
    }

    public static function parseTag_param($code, $string) {
        $regex = '.*?@param {((?:[a-z][a-z]+))(\\(.*?\\))?} (.*?) (.*?)$';  // Awww yeah!
        if ($num  = preg_match_all("/" . $regex . "/is", $string, $matches)) {
            self::$registered[$code]['params'][] = Array('name' => $matches[3][0], 'type' => $matches[1][0], 'options' => explode(',', trim($matches[2][0], ')(')), 'desc' => $matches[4][0]);
        }
    }

    public static function parseTag_private($code, $string) {
        self::$private[$code] = 1;
    }

    public static function uses_content($code) {
        self::$registered[$code]['uses_content'] = 1;
    }

    public static function getRegistered() {
        $return = self::$registered;
        foreach (self::$private as $key => $one) {
            unset($return[$key]);
        }

        return $return;
    }

    public static function drawMetaBox() {
?>
<label for="TzShortCodeList">Tag:</label>
<select id="TzShortCodeList" name="TzShortCodeList">
<?php
    $options = ShortCodes::getRegistered();
    ksort($options);
    foreach ($options as $tag => $data) {
        echo '<option value="' . $tag . '">' . $data['title'] . '</option>';
    }
?>
</select>

<p class="submit">
  <input type="button" id="TzInsertSC" value="<?php _e('Insert into post'); ?>" />
</p>
<?php
    }
}

class ShortCodes_Actions {
    public static function admin_menu() {
        add_meta_box('TzShortCodes', 'Code Helper', Array('ShortCodes', 'drawMetaBox'), 'post', 'normal');
        add_meta_box('TzShortCodes', 'Code Helper', Array('ShortCodes', 'drawMetaBox'), 'page', 'normal');
    }

    public static function admin_print_scripts() {
        if ($GLOBALS['editing']) {
            _enqueue_script('shortcoder', TzTools::tools_url('shortcoder.js', __FILE__), Array('jquery'));

            echo "<script type=\"text/javascript\">\n/* <![CDATA[ */\n";
            echo 'var TzRegisteredShortCodes = ' . json_encode(ShortCodes::getRegistered());
            echo "\n/* ]]> */</script>\n";
        }
    }
}

/**
 * @deprecated
 */
function add_shortcodes($class) {
    call_user_func(Array('ShortCodes', 'registerClass'), $class);
}


    if (function_exists('rename_function')) {
        rename_function('add_shortcode', 'wp_add_shortcode');

        function add_shortcode() {
            $args = func_get_args();
            call_user_func_array(Array('ShortCodes', 'add'), $args);
        }
    }

    ShortCodes::make();
?>