Plugin @define

Agregar a favoritos

4 Comentarios

Posteado hace 1007 días en:

Una de las mejores formas de entender los plugins en CSSing es creando un ejemplo y para ello vamos a crear un plugin para definir variables propietarias.

Los plugins en CSSing funcionan definiendo acciones y elementos que llaman a una función, recibiendo una serie de parámetros y devolviendolos analizados.

Para crear una regla arroba tenemos que definir el elemento @define, para ello lo añadimos a la clase con la función add_atrule.

CSSing:add_atrule('define','dml_atrule_define'); 

Aquí podemos ver como el primer parámetro es el nombre de la regla y el segundo la función que se llama.constancia de la regla @define.

¿Que es lo que envía CSSing?

CSSing devuelve un array con información sobre esa regla, es decir, claves, pseudoclasses, contenido, tipo de regla… Veamos un print_r.

Ejemplo:


@define {
rosa: #d8327b;
gris: #808080;
}
Array
(
[atrule] => define
[pseudoclass] => Array()
[precontent] => 
[key] => 437b9d7bb6f58
[content] => 
rosa: #d8327b;
gris: #808080;
[type] => property
)

Algunos parámetros aparecen vacíos porque no los contiene la regla.Existen 3 tipos de reglas, inline que es el tipico @import,property como es este caso y block como las regla @media.

Ahora vamos a ver el código para conseguir el contenido.


global $dml_define_array;
$dml_define_array = array();
function dml_atrule_define($params) {
global $dml_define_array;
        extract($params);
        switch($type) {
            case 'property': $dml_define_array = array_merge($dml_define_array,CSSing::get_propertys($content)); break;
        }
        return false;
    }

Al llamar a la función comprobamos que el tipo sea valido y si es así parseamos el contenido para conseguir un array con las propiedades.

Con esto tenemos el 50% del plugin, ahora nos quedaría sustituir los valores en el CSS, para ellos utilizamos la acción preblock que se llama después de analizar las reglas arroba y antes del parseo de bloques CSS.


CSSing::add_action_preblock('define','dml_action_preblock_define');
function dml_action_preblock_define($css_string) {
        global $dml_define_array;
        if(!count($dml_define_array)) return $css_string;
        foreach($dml_define_array as $var=>$value) {
            $css_string= str_replace('define('.$var.')',$value,$css_string);
        }
        return $css_string;
    }

En este caso la función recibe una cadena y devuelve el CSS parseado.

Puede parecer algo complejo por el desconocimiento de las acciones y los elementos pero se pueden conseguir bastantes cosas con muy pocas lineas.

Y con esto hemos conseguido crear un plugin para CSSing.


  • avatar

    sosa#1 hace 1006 días

    Que manera de crear expectativa

  • avatar

    show#2 hace 1005 días

    Tío como te lo curras. Felicidades.

  • avatar

    DrSlump#3 hace 1003 días

    Buenas,

    Esta idea de crear un ‘macro lenguaje’ para CSS me parece muy buena, así que he aprovechado este fin de semana para hacer una implementación de SAC [1] en PHP usando un lexer.
    Supongo que estarás usando expresiones regulares para parsear el CSS, lo que me parece bien, pero entiendo (por lo menos en mi caso) que todo esto es realmente util cuando podemos utilizar syntaxis complejas, las cuales podrían dar serios problemas con un parser basado en regexps.

    Dado que la idea original es vuestra, seguiré trabajando en esto en privado y cuando liberalizes el código quizás podamos coger lo mejor de ambas implementaciones.

    Solo quería que supieras que el tema es muy interesante y que en mi opinión tiene muchas posibilidades si se implementa y utiliza adequadamente.

    [1] http://www.w3.org/Style/CSS/SAC/

  • avatar

    Icebeat#4 hace 1003 días

    Gracias show ;P.
    DrSlump estas en lo cierto,el script funciona con expresiones regulares (que han costado la vida) y algunas veces no son muy fiables.
    El parseador no tiene la calidad de smarty pero es el comienzo de la aplicación.

    Si quereis probar una beta solo teneis que mandarme un mail.