Skip to content

Instantly share code, notes, and snippets.

@mjc
Created December 5, 2008 04:38
Show Gist options
  • Select an option

  • Save mjc/32236 to your computer and use it in GitHub Desktop.

Select an option

Save mjc/32236 to your computer and use it in GitHub Desktop.

Revisions

  1. mjc revised this gist Dec 5, 2008. 1 changed file with 0 additions and 106 deletions.
    106 changes: 0 additions & 106 deletions class.wp-scripts.php
    Original file line number Diff line number Diff line change
    @@ -1,106 +0,0 @@
    <?php
    /**
    * BackPress Scripts enqueue.
    *
    * These classes were refactored from the WordPress WP_Scripts and WordPress
    * script enqueue API.
    *
    * @package BackPress
    * @since r16
    */

    /**
    * BackPress Scripts enqueue class.
    *
    * @package BackPress
    * @uses WP_Dependencies
    * @since r16
    */
    class WP_Scripts extends WP_Dependencies {
    var $base_url; // Full URL with trailing slash
    var $default_version;

    function __construct() {
    do_action_ref_array( 'wp_default_scripts', array(&$this) );
    }

    /**
    * Prints scripts
    *
    * Prints the scripts passed to it or the print queue. Also prints all necessary dependencies.
    *
    * @param mixed handles (optional) Scripts to be printed. (void) prints queue, (string) prints that script, (array of strings) prints those scripts.
    * @return array Scripts that have been printed
    */
    function print_scripts( $handles = false ) {
    return $this->do_items( $handles );
    }

    function print_scripts_l10n( $handle ) {
    if ( empty($this->registered[$handle]->extra['l10n']) || empty($this->registered[$handle]->extra['l10n'][0]) || !is_array($this->registered[$handle]->extra['l10n'][1]) )
    return false;

    $object_name = $this->registered[$handle]->extra['l10n'][0];

    echo "<script type='text/javascript'>\n";
    echo "/* <![CDATA[ */\n";
    echo "\t$object_name = {\n";
    $eol = '';
    foreach ( $this->registered[$handle]->extra['l10n'][1] as $var => $val ) {
    echo "$eol\t\t$var: \"" . js_escape( $val ) . '"';
    $eol = ",\n";
    }
    echo "\n\t}\n";
    echo "try{convertEntities($object_name);}catch(e){};\n";
    echo "/* ]]> */\n";
    echo "</script>\n";

    return true;
    }

    function do_item( $handle ) {
    if ( !parent::do_item($handle) )
    return false;

    $ver = $this->registered[$handle]->ver ? $this->registered[$handle]->ver : $this->default_version;
    if ( isset($this->args[$handle]) )
    $ver .= '&amp;' . $this->args[$handle];

    $src = $this->registered[$handle]->src;
    if ( !preg_match('|^https?://|', $src) && !preg_match('|^' . preg_quote(WP_CONTENT_URL) . '|', $src) ) {
    $src = $this->base_url . $src;
    }

    $src = add_query_arg('ver', $ver, $src);
    $src = clean_url(apply_filters( 'script_loader_src', $src, $handle ));

    $this->print_scripts_l10n( $handle );

    echo "<script type='text/javascript' src='$src'></script>\n";

    return true;
    }

    /**
    * Localizes a script
    *
    * Localizes only if script has already been added
    *
    * @param string handle Script name
    * @param string object_name Name of JS object to hold l10n info
    * @param array l10n Array of JS var name => localized string
    * @return bool Successful localization
    */
    function localize( $handle, $object_name, $l10n ) {
    if ( !$object_name || !$l10n )
    return false;
    return $this->add_data( $handle, 'l10n', array( $object_name, $l10n ) );
    }

    function all_deps( $handles, $recursion = false ) {
    $r = parent::all_deps( $handles, $recursion );
    if ( !$recursion )
    $this->to_do = apply_filters( 'print_scripts_array', $this->to_do );
    return $r;
    }
    }
  2. mjc revised this gist Dec 5, 2008. 1 changed file with 0 additions and 209 deletions.
    209 changes: 0 additions & 209 deletions class.wp-dependencies.php
    Original file line number Diff line number Diff line change
    @@ -1,209 +0,0 @@
    <?php
    /**
    * BackPress Scripts enqueue.
    *
    * These classes were refactored from the WordPress WP_Scripts and WordPress
    * script enqueue API.
    *
    * @package BackPress
    * @since r74
    */

    /**
    * BackPress enqueued dependiences class.
    *
    * @package BackPress
    * @uses _WP_Dependency
    * @since r74
    */
    class WP_Dependencies {
    var $registered = array();
    var $queue = array();
    var $to_do = array();
    var $done = array();
    var $args = array();

    function WP_Dependencies() {
    $args = func_get_args();
    call_user_func_array( array(&$this, '__construct'), $args );
    }

    function __construct() {}

    /**
    * Do the dependencies
    *
    * Process the items passed to it or the queue. Processes all dependencies.
    *
    * @param mixed handles (optional) items to be processed. (void) processes queue, (string) process that item, (array of strings) process those items
    * @return array Items that have been processed
    */
    function do_items( $handles = false ) {
    // Print the queue if nothing is passed. If a string is passed, print that script. If an array is passed, print those scripts.
    $handles = false === $handles ? $this->queue : (array) $handles;
    $this->all_deps( $handles );

    foreach( $this->to_do as $handle ) {
    if ( !in_array($handle, $this->done) && isset($this->registered[$handle]) ) {
    if ( $this->registered[$handle]->src ) { // Else it defines a group.
    $this->do_item( $handle );
    }
    $this->done[] = $handle;
    }
    }

    $this->to_do = array();
    return $this->done;
    }

    function do_item( $handle ) {
    return isset($this->registered[$handle]);
    }

    /**
    * Determines dependencies
    *
    * Recursively builds array of items to process taking dependencies into account. Does NOT catch infinite loops.
    *
    * @param mixed handles Accepts (string) dep name or (array of strings) dep names
    * @param bool recursion Used internally when function calls itself
    */
    function all_deps( $handles, $recursion = false ) {
    if ( !$handles = (array) $handles )
    return false;

    foreach ( $handles as $handle ) {
    $handle = explode('?', $handle);
    if ( isset($handle[1]) )
    $this->args[$handle[0]] = $handle[1];
    $handle = $handle[0];

    if ( isset($this->to_do[$handle]) ) // Already grobbed it and its deps
    continue;

    $keep_going = true;
    if ( !isset($this->registered[$handle]) )
    $keep_going = false; // Script doesn't exist
    elseif ( $this->registered[$handle]->deps && array_diff($this->registered[$handle]->deps, array_keys($this->registered)) )
    $keep_going = false; // Script requires deps which don't exist (not a necessary check. efficiency?)
    elseif ( $this->registered[$handle]->deps && !$this->all_deps( $this->registered[$handle]->deps, true ) )
    $keep_going = false; // Script requires deps which don't exist

    if ( !$keep_going ) { // Either script or its deps don't exist.
    if ( $recursion )
    return false; // Abort this branch.
    else
    continue; // We're at the top level. Move on to the next one.
    }

    $this->to_do[$handle] = true;
    }

    if ( !$recursion ) // at the end
    $this->to_do = array_keys( $this->to_do );
    return true;
    }

    /**
    * Adds item
    *
    * Adds the item only if no item of that name already exists
    *
    * @param string handle Script name
    * @param string src Script url
    * @param array deps (optional) Array of script names on which this script depends
    * @param string ver (optional) Script version (used for cache busting)
    * @return array Hierarchical array of dependencies
    */
    function add( $handle, $src, $deps = array(), $ver = false, $args = null ) {
    if ( isset($this->registered[$handle]) )
    return false;
    $this->registered[$handle] = new _WP_Dependency( $handle, $src, $deps, $ver, $args );
    return true;
    }

    /**
    * Adds extra data
    *
    * Adds data only if script has already been added
    *
    * @param string handle Script name
    * @param string data_name Name of object in which to store extra data
    * @param array data Array of extra data
    * @return bool success
    */
    function add_data( $handle, $data_name, $data ) {
    if ( !isset($this->registered[$handle]) )
    return false;
    return $this->registered[$handle]->add_data( $data_name, $data );
    }

    function remove( $handles ) {
    foreach ( (array) $handles as $handle )
    unset($this->registered[$handle]);
    }

    function enqueue( $handles ) {
    foreach ( (array) $handles as $handle ) {
    $handle = explode('?', $handle);
    if ( !in_array($handle[0], $this->queue) && isset($this->registered[$handle[0]]) ) {
    $this->queue[] = $handle[0];
    if ( isset($handle[1]) )
    $this->args[$handle[0]] = $handle[1];
    }
    }
    }

    function dequeue( $handles ) {
    foreach ( (array) $handles as $handle )
    unset( $this->queue[$handle] );
    }

    function query( $handle, $list = 'registered' ) { // registered, queue, done, to_do
    switch ( $list ) :
    case 'registered':
    case 'scripts': // back compat
    if ( isset($this->registered[$handle]) )
    return $this->registered[$handle];
    break;
    case 'to_print': // back compat
    case 'printed': // back compat
    if ( 'to_print' == $list )
    $list = 'to_do';
    else
    $list = 'printed';
    default:
    if ( in_array($handle, $this->$list) )
    return true;
    break;
    endswitch;
    return false;
    }

    }

    class _WP_Dependency {
    var $handle;
    var $src;
    var $deps = array();
    var $ver = false;
    var $args = null;

    var $extra = array();

    function _WP_Dependency() {
    @list($this->handle, $this->src, $this->deps, $this->ver, $this->args) = func_get_args();
    if ( !is_array($this->deps) )
    $this->deps = array();
    if ( !$this->ver )
    $this->ver = false;
    }

    function add_data( $name, $data ) {
    if ( !is_scalar($name) )
    return false;
    $this->extra[$name] = $data;
    return true;
    }
    }
  3. mjc revised this gist Dec 5, 2008. 1 changed file with 14 additions and 2 deletions.
    16 changes: 14 additions & 2 deletions DD32s-combine-plugin.php
    Original file line number Diff line number Diff line change
    @@ -25,17 +25,26 @@ function combine_init() {
    remove_action('admin_print_scripts', 'wp_print_scripts', 20);
    //add_action('wp_head', 'combine_js_link'); //non-admin
    add_action('admin_print_scripts', 'combine_js_link', 20);
    add_filter('print_scripts_array','combine_script_loader_src', 20);
    }

    function combine_script_loader_src($src) {
    //var_dump($src);
    return $src;
    }

    function combine_css() {
    global $wp_styles;
    if ( !is_a($wp_styles, 'WP_Styles') )
    $wp_styles = new WP_Styles();

    $wp_styles->all_deps(array_keys($wp_styles->registered));

    header('content-type: text/css; charset: UTF-8');

    $content = '';
    foreach ( (array)$wp_styles->registered as $style ) {
    foreach ( (array)$wp_styles->to_do as $style ) {
    $style = $wp_styles->registered[$style];
    if ( file_exists(ABSPATH . $style->src) )
    $content .= file_get_contents(ABSPATH . $style->src);
    $content .= "\n\n";
    @@ -52,10 +61,13 @@ function combine_js() {
    if ( !is_a($wp_scripts, 'WP_Scripts') )
    $wp_scripts = new WP_Scripts();

    $wp_scripts->all_deps(array_keys($wp_scripts->registered));
    //var_dump($wp_scripts->to_do);
    header("content-type: text/javascript; charset: UTF-8");

    $content = '';
    foreach ( (array)$wp_scripts->registered as $script ) {
    foreach ( (array)$wp_scripts->to_do as $script ) {
    $script = $wp_scripts->registered[$script];
    if ( file_exists(ABSPATH . $script->src) )
    $content .= file_get_contents(ABSPATH . $script->src) . "\n\n";
    if ( isset($script->extra['l10n']) ) {
  4. mjc created this gist Dec 5, 2008.
    79 changes: 79 additions & 0 deletions DD32s-combine-plugin.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,79 @@
    <?php
    /*
    Plugin Name: The Combiner
    Plugin URI: http://dd32.id.au/wordpress-plugins/?plugin=combine-css-js
    Description: Combine CSS & JS into one large monolithic file
    Author: DD32
    Version: 1.0
    Author URI: http://dd32.id.au/
    */

    add_action('admin_init', 'combine_init');
    function combine_init() {
    //Handler
    add_action('admin_post_css', 'combine_css');
    add_action('admin_post_js', 'combine_js');

    //Styles
    //remove_action('wp_head', 'wp_print_styles', 9); //non-admin
    remove_action('admin_print_styles', 'wp_print_styles', 20);
    //add_action('wp_head', 'combine_css_link');//non-admin
    add_action('admin_print_styles', 'combine_css_link', 20);

    //Scripts
    //remove_action('wp_head', 'wp_print_scripts', 9); //non-admin
    remove_action('admin_print_scripts', 'wp_print_scripts', 20);
    //add_action('wp_head', 'combine_js_link'); //non-admin
    add_action('admin_print_scripts', 'combine_js_link', 20);
    }

    function combine_css() {
    global $wp_styles;
    if ( !is_a($wp_styles, 'WP_Styles') )
    $wp_styles = new WP_Styles();

    header('content-type: text/css; charset: UTF-8');

    $content = '';
    foreach ( (array)$wp_styles->registered as $style ) {
    if ( file_exists(ABSPATH . $style->src) )
    $content .= file_get_contents(ABSPATH . $style->src);
    $content .= "\n\n";
    }
    echo $content;
    }

    function combine_css_link() {
    echo '<link rel="stylesheet" type="text/css" media="all" href="' . admin_url('admin-post.php?action=css' . (is_admin() ? '&admin=true' : '') ) . '" />' . "\n";
    }

    function combine_js() {
    global $wp_scripts;
    if ( !is_a($wp_scripts, 'WP_Scripts') )
    $wp_scripts = new WP_Scripts();

    header("content-type: text/javascript; charset: UTF-8");

    $content = '';
    foreach ( (array)$wp_scripts->registered as $script ) {
    if ( file_exists(ABSPATH . $script->src) )
    $content .= file_get_contents(ABSPATH . $script->src) . "\n\n";
    if ( isset($script->extra['l10n']) ) {
    $object_name = $script->extra['l10n'][0];

    $content .= "\t$object_name = {\n";
    $eol = '';
    foreach ( $script->extra['l10n'][1] as $var => $val ) {
    $content .= "$eol\t\t$var: \"" . js_escape( $val ) . '"';
    $eol = ",\n";
    }
    $content .= "\n\t}\n\n";
    }
    }
    echo $content;
    }

    function combine_js_link() {
    echo '<script type="text/javascript" src="' . admin_url('admin-post.php?action=js' . (is_admin() ? '&admin=true' : '') ) . '"></script>' . "\n";
    }
    ?>
    209 changes: 209 additions & 0 deletions class.wp-dependencies.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,209 @@
    <?php
    /**
    * BackPress Scripts enqueue.
    *
    * These classes were refactored from the WordPress WP_Scripts and WordPress
    * script enqueue API.
    *
    * @package BackPress
    * @since r74
    */

    /**
    * BackPress enqueued dependiences class.
    *
    * @package BackPress
    * @uses _WP_Dependency
    * @since r74
    */
    class WP_Dependencies {
    var $registered = array();
    var $queue = array();
    var $to_do = array();
    var $done = array();
    var $args = array();

    function WP_Dependencies() {
    $args = func_get_args();
    call_user_func_array( array(&$this, '__construct'), $args );
    }

    function __construct() {}

    /**
    * Do the dependencies
    *
    * Process the items passed to it or the queue. Processes all dependencies.
    *
    * @param mixed handles (optional) items to be processed. (void) processes queue, (string) process that item, (array of strings) process those items
    * @return array Items that have been processed
    */
    function do_items( $handles = false ) {
    // Print the queue if nothing is passed. If a string is passed, print that script. If an array is passed, print those scripts.
    $handles = false === $handles ? $this->queue : (array) $handles;
    $this->all_deps( $handles );

    foreach( $this->to_do as $handle ) {
    if ( !in_array($handle, $this->done) && isset($this->registered[$handle]) ) {
    if ( $this->registered[$handle]->src ) { // Else it defines a group.
    $this->do_item( $handle );
    }
    $this->done[] = $handle;
    }
    }

    $this->to_do = array();
    return $this->done;
    }

    function do_item( $handle ) {
    return isset($this->registered[$handle]);
    }

    /**
    * Determines dependencies
    *
    * Recursively builds array of items to process taking dependencies into account. Does NOT catch infinite loops.
    *
    * @param mixed handles Accepts (string) dep name or (array of strings) dep names
    * @param bool recursion Used internally when function calls itself
    */
    function all_deps( $handles, $recursion = false ) {
    if ( !$handles = (array) $handles )
    return false;

    foreach ( $handles as $handle ) {
    $handle = explode('?', $handle);
    if ( isset($handle[1]) )
    $this->args[$handle[0]] = $handle[1];
    $handle = $handle[0];

    if ( isset($this->to_do[$handle]) ) // Already grobbed it and its deps
    continue;

    $keep_going = true;
    if ( !isset($this->registered[$handle]) )
    $keep_going = false; // Script doesn't exist
    elseif ( $this->registered[$handle]->deps && array_diff($this->registered[$handle]->deps, array_keys($this->registered)) )
    $keep_going = false; // Script requires deps which don't exist (not a necessary check. efficiency?)
    elseif ( $this->registered[$handle]->deps && !$this->all_deps( $this->registered[$handle]->deps, true ) )
    $keep_going = false; // Script requires deps which don't exist

    if ( !$keep_going ) { // Either script or its deps don't exist.
    if ( $recursion )
    return false; // Abort this branch.
    else
    continue; // We're at the top level. Move on to the next one.
    }

    $this->to_do[$handle] = true;
    }

    if ( !$recursion ) // at the end
    $this->to_do = array_keys( $this->to_do );
    return true;
    }

    /**
    * Adds item
    *
    * Adds the item only if no item of that name already exists
    *
    * @param string handle Script name
    * @param string src Script url
    * @param array deps (optional) Array of script names on which this script depends
    * @param string ver (optional) Script version (used for cache busting)
    * @return array Hierarchical array of dependencies
    */
    function add( $handle, $src, $deps = array(), $ver = false, $args = null ) {
    if ( isset($this->registered[$handle]) )
    return false;
    $this->registered[$handle] = new _WP_Dependency( $handle, $src, $deps, $ver, $args );
    return true;
    }

    /**
    * Adds extra data
    *
    * Adds data only if script has already been added
    *
    * @param string handle Script name
    * @param string data_name Name of object in which to store extra data
    * @param array data Array of extra data
    * @return bool success
    */
    function add_data( $handle, $data_name, $data ) {
    if ( !isset($this->registered[$handle]) )
    return false;
    return $this->registered[$handle]->add_data( $data_name, $data );
    }

    function remove( $handles ) {
    foreach ( (array) $handles as $handle )
    unset($this->registered[$handle]);
    }

    function enqueue( $handles ) {
    foreach ( (array) $handles as $handle ) {
    $handle = explode('?', $handle);
    if ( !in_array($handle[0], $this->queue) && isset($this->registered[$handle[0]]) ) {
    $this->queue[] = $handle[0];
    if ( isset($handle[1]) )
    $this->args[$handle[0]] = $handle[1];
    }
    }
    }

    function dequeue( $handles ) {
    foreach ( (array) $handles as $handle )
    unset( $this->queue[$handle] );
    }

    function query( $handle, $list = 'registered' ) { // registered, queue, done, to_do
    switch ( $list ) :
    case 'registered':
    case 'scripts': // back compat
    if ( isset($this->registered[$handle]) )
    return $this->registered[$handle];
    break;
    case 'to_print': // back compat
    case 'printed': // back compat
    if ( 'to_print' == $list )
    $list = 'to_do';
    else
    $list = 'printed';
    default:
    if ( in_array($handle, $this->$list) )
    return true;
    break;
    endswitch;
    return false;
    }

    }

    class _WP_Dependency {
    var $handle;
    var $src;
    var $deps = array();
    var $ver = false;
    var $args = null;

    var $extra = array();

    function _WP_Dependency() {
    @list($this->handle, $this->src, $this->deps, $this->ver, $this->args) = func_get_args();
    if ( !is_array($this->deps) )
    $this->deps = array();
    if ( !$this->ver )
    $this->ver = false;
    }

    function add_data( $name, $data ) {
    if ( !is_scalar($name) )
    return false;
    $this->extra[$name] = $data;
    return true;
    }
    }
    106 changes: 106 additions & 0 deletions class.wp-scripts.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,106 @@
    <?php
    /**
    * BackPress Scripts enqueue.
    *
    * These classes were refactored from the WordPress WP_Scripts and WordPress
    * script enqueue API.
    *
    * @package BackPress
    * @since r16
    */

    /**
    * BackPress Scripts enqueue class.
    *
    * @package BackPress
    * @uses WP_Dependencies
    * @since r16
    */
    class WP_Scripts extends WP_Dependencies {
    var $base_url; // Full URL with trailing slash
    var $default_version;

    function __construct() {
    do_action_ref_array( 'wp_default_scripts', array(&$this) );
    }

    /**
    * Prints scripts
    *
    * Prints the scripts passed to it or the print queue. Also prints all necessary dependencies.
    *
    * @param mixed handles (optional) Scripts to be printed. (void) prints queue, (string) prints that script, (array of strings) prints those scripts.
    * @return array Scripts that have been printed
    */
    function print_scripts( $handles = false ) {
    return $this->do_items( $handles );
    }

    function print_scripts_l10n( $handle ) {
    if ( empty($this->registered[$handle]->extra['l10n']) || empty($this->registered[$handle]->extra['l10n'][0]) || !is_array($this->registered[$handle]->extra['l10n'][1]) )
    return false;

    $object_name = $this->registered[$handle]->extra['l10n'][0];

    echo "<script type='text/javascript'>\n";
    echo "/* <![CDATA[ */\n";
    echo "\t$object_name = {\n";
    $eol = '';
    foreach ( $this->registered[$handle]->extra['l10n'][1] as $var => $val ) {
    echo "$eol\t\t$var: \"" . js_escape( $val ) . '"';
    $eol = ",\n";
    }
    echo "\n\t}\n";
    echo "try{convertEntities($object_name);}catch(e){};\n";
    echo "/* ]]> */\n";
    echo "</script>\n";

    return true;
    }

    function do_item( $handle ) {
    if ( !parent::do_item($handle) )
    return false;

    $ver = $this->registered[$handle]->ver ? $this->registered[$handle]->ver : $this->default_version;
    if ( isset($this->args[$handle]) )
    $ver .= '&amp;' . $this->args[$handle];

    $src = $this->registered[$handle]->src;
    if ( !preg_match('|^https?://|', $src) && !preg_match('|^' . preg_quote(WP_CONTENT_URL) . '|', $src) ) {
    $src = $this->base_url . $src;
    }

    $src = add_query_arg('ver', $ver, $src);
    $src = clean_url(apply_filters( 'script_loader_src', $src, $handle ));

    $this->print_scripts_l10n( $handle );

    echo "<script type='text/javascript' src='$src'></script>\n";

    return true;
    }

    /**
    * Localizes a script
    *
    * Localizes only if script has already been added
    *
    * @param string handle Script name
    * @param string object_name Name of JS object to hold l10n info
    * @param array l10n Array of JS var name => localized string
    * @return bool Successful localization
    */
    function localize( $handle, $object_name, $l10n ) {
    if ( !$object_name || !$l10n )
    return false;
    return $this->add_data( $handle, 'l10n', array( $object_name, $l10n ) );
    }

    function all_deps( $handles, $recursion = false ) {
    $r = parent::all_deps( $handles, $recursion );
    if ( !$recursion )
    $this->to_do = apply_filters( 'print_scripts_array', $this->to_do );
    return $r;
    }
    }