/* Plugin Name: RSS Validator Plugin URI: http://andrewnorcross.com/plugins/ Description: Checks your RSS feed against the W3 RSS validator for errors Version: 1.1 Author: Andrew Norcross Author URI: http://andrewnorcross.com Copyright 2012 Andrew Norcross This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License, version 2, as published by the Free Software Foundation. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ // http://feed2.w3.org/docs/soap.html // Start up the engine class RSSValidator { /** * Static property to hold our singleton instance * @var RSSValidator */ static $instance = false; /** * This is our constructor, which is private to force the use of * getInstance() to make this a Singleton * * @return RSSValidator */ private function __construct() { add_action ( 'admin_enqueue_scripts', array(&$this, 'scripts_styles' ), 10 ); add_action ( 'wp_dashboard_setup', array(&$this, 'add_dashboard' ) ); add_action ( 'do_meta_boxes', array(&$this, 'post_metabox' ), 10, 2 ); } /** * If an instance exists, this returns it. If not, it creates one and * retuns it. * * @return RSSValidator */ public static function getInstance() { if ( !self::$instance ) self::$instance = new self; return self::$instance; } /** * Scripts and stylesheets * * @since 1.0 */ public function scripts_styles($hook) { // for post editor if ( $hook == 'post-new.php' || $hook == 'post.php' ) : wp_enqueue_style( 'validator-style', plugins_url('/lib/css/rss-validator.css', __FILE__), array(), null, 'all' ); wp_enqueue_script( 'validator-init', plugins_url('/lib/js/validator.init.js', __FILE__) , array('jquery'), null, true ); endif; // for dashboard $current_screen = get_current_screen(); if ( 'dashboard' == $current_screen->base ) : wp_enqueue_style( 'validator-style', plugins_url('/lib/css/rss-validator.css', __FILE__), array(), null, 'all' ); wp_enqueue_script( 'validator-init', plugins_url('/lib/js/validator.init.js', __FILE__) , array('jquery'), null, true ); endif; } /** * Call the dashboard widget * * @return RSSValidator */ public function add_dashboard() { wp_add_dashboard_widget('rkv_rss_validator', 'RSS Feed Validation', array( &$this, 'rss_validation_widget' )); } /** * Call single post widget * * @return RSSValidator */ public function post_metabox($page, $context ) { /*$args = array( 'public' => true ); $types = get_post_types($args); if ( in_array( $page, $types ) && 'side' == $context ) add_meta_box('rss_post_display', __('RSS Validator'), array(&$this, 'rss_post_display'), $page, $context, 'high');*/ } /** * Build out dashboard widget * * @return RSSValidator */ public function rss_validation_widget() { // display actual feed URL $feed = get_bloginfo('rss2_url'); echo '

Your main RSS feed: '.$feed.'

'; // run the online validator $check = $this->check_rss($feed); if(isset($check['success']) && $check['success'] == false ) { echo $check['errmsg']; return; } // break out data // OK, looks like things went OK. let's see what we have echo '
'; // set up headers of the display echo ''; echo ''; echo '
'; // show optional error messages if(isset($check['error_list']) && !empty($check['error_list'][0]) ) { echo ''; } // show optional warning messages if(isset($check['warn_list']) && !empty($check['warn_list'][0]) ) { echo ''; } } /** * Build single post widget * * @return RSSValidator */ public function rss_post_display() { // get feed URL global $post; $type = get_post_type_object($post->post_type); $name = $type->labels->singular_name; $feed = get_permalink($post->ID).'feed/'; echo '

This '.$name.' RSS feed
'.$feed.'

'; // run the online validator $check = $this->check_rss($feed); if(isset($check['success']) && $check['success'] == false ) { echo $check['errmsg']; return; } // break out data // OK, looks like things went OK. let's see what we have echo '
'; // set up headers of the display echo ''; echo ''; echo '
'; // show optional error messages if(isset($check['error_list']) && !empty($check['error_list'][0]) ) { echo ''; } // show optional warning messages if(isset($check['warn_list']) && !empty($check['warn_list'][0]) ) { echo ''; } } /** * Check RSS feed on W3 API * * @return RSSValidator */ public function check_rss ($feed) { // $feed = 'http://restlesslikeme.com/feed/'; $request = new WP_Http; $url = 'http://validator.w3.org/feed/check.cgi?url='.urlencode($feed).'&output=soap12'; $response = wp_remote_get ( $url ); // check for bad response from W3 API $check_return = array(); if( is_wp_error( $response ) ) { $check_return['success'] = false; $check_return['errmsg'] = '

Sorry, there was an error with your request.

'; } if(!is_wp_error( $response ) ) { $feed_data = $response['body']; $return_xml = simplexml_load_string( (string) $feed_data ); $return_xml->registerXPathNamespace( 'm', 'http://www.w3.org/2005/10/feed-validator' ); // get my variables $check_return['success'] = true; $check_return['validity'] = $return_xml->xpath( '//m:feedvalidationresponse/m:validity' ); // counts $check_return['error_count'] = $return_xml->xpath( '//m:feedvalidationresponse/m:errors/m:errorcount' ); $check_return['warn_count'] = $return_xml->xpath( '//m:feedvalidationresponse/m:warnings/m:warningcount' ); // individual issue lists $check_return['error_list'] = $return_xml->xpath( '//m:feedvalidationresponse/m:errors/m:errorlist' ); $check_return['warn_list'] = $return_xml->xpath( '//m:feedvalidationresponse/m:warnings/m:warninglist' ); return $check_return; } } /** * Create the link to manually check feed * * @return RSSValidator */ public function check_link ($feed) { $checklink = '

See complete details on W3 Validator site

'; return $checklink; } /// end class } // Instantiate our class $RSSValidator = RSSValidator::getInstance(); Carteles al sur

Carteles al Sur

Por Joanna Boloña
JOA RED

«Por la carretera,
cruzando la frontera,
una linda morena me dijo: llévame…»

Con esta canción inicio mi ruta hacia la playa este fin de semana. Pese al suplicio que es enfrentar el tráfico y las «inteligentes» obras de la ex alcaldesa, todo desaparece cuando estaciono el carro al lado del mar y veo el cielo, el sol o las estrellas. Respiro. «¡Amo el verano!».

En el camino me doy cuenta que con esta estación, también llega la invasión de paneles. Algunos son creativos y otros provocan, más que tristeza, indignación y asco. Mi expectativa crece por verlos. Tal vez porque estudié Marketing y quiero ver con qué imágenes «innovadoras» me sorprenderán las marcas.

La carretera está dura. TODO VALE. Las empresas no creen en nadie y se ha convertido en una guerra, en todo el sentido de la palabra. Creo que algunos de estos anunciantes piensan que: «el que no arriesga, no gana» -con censura o sin ella-. No hay mucha ciencia.

El primer cartel que capta mi atención es el de una marca de condones. Así es, CONDONES. No soy cucufata, pero ¿condones? No helados, gaseosas o cervezas. No. Condones. El mensaje me parece muy gracioso y también me recuerda lo que no quiero que suceda este verano: «El que la sigue, la consigue / Lo que pasó en el sur, se queda en el sur». Los amores de verano –o, mejor dicho, los choques y fuga de verano- están a la orden del día y casi nadie quiere estar enrollado en esta época.

Paso el TouriCamp y recuerdo lo terrible que fue sacar mi brevete y cómo pasé ese maldito examen práctico la tercera vez. No soy Lewis Hamilton, pero tampoco soy una mujer que odies al volante.

Sigo manejando. Sinceramente hay carteles que no entiendo, y otros que no quisiera entender. Me acompaña una cancion de Avicii -Wake Me Up-, que me recuerda que debo estar atenta a la pista, a los carros, a las bestias al volante, a que Dios me libre de un accidente y a los paneles que siento que, poco a poco, me comen y me absorben como en un viaje interestelar a través de ellos. Es que, mientras uno maneja siente como todo alrededor nos habla sin parar.

También veo carteles que anuncian los conciertos de verano a los que muero por ir, pero que, lamentablemente, mi trabajo no me permitirá. Veámosle el lado positivo: ahorro es progreso.

Visualizo la flecha a la derecha para volver a Lima. Siento la tentación de huir de este mundo «acartelado». Pero no. La verdad es que quiero seguir navegando en este mar de paneles. De pronto, comienzo a ver ladrillos con mensajes directos y fuertes: «Está dura, maciza, está fuerte». ¿WTF? En el cartel hay una mujer morena en bikini, con un cuerpo que, bien por ella, pero yo jamás quisiera tener. Ella aparece en varios de los afiches de esta compañía que denigra a la mujer en tres segundos. Me hace sentir como un pedazo de ladrillo. Mi indignación es absoluta. Me dan arcadas. Una cosa es hacer una campaña publicitaria y otra, ese desastre. Esos 3 o 4 paneles solo me producen un sentimiento: asco y vergüenza. No puedo creer que en pleno siglo XXI se siga usando a la mujer como un objeto. Lo peor es que una mujer se preste a eso. ¡Ups!, me olvidé quién era: ella vive de los escándalos, el chisme y también del photoshop.

Sigo manejando. Me acompaña el último hit de Bruno Mars. ¡Que viva el funk para olvidarme de esas imágenes desagradables!

Los tragos y la comida tampoco pasan desapercibidos entre los paneles. Todos piden ser devorados: es un banquete de pizza, pollo y hamburguesas. Los chorizos parecieran puestos sobre la parrilla y ya es casi la hora de almuerzo. Latas de atún, bebidas naturales, agua y un lema que dice: «lo importante es lo de adentro», con una chica regia en bikini al lado. Ya pues, ¡¿no que lo importante es lo de adentro?! Por Dios, estoy salivando.

Al fin llego al boulevard de Asia. Me tengo que concentrar, es viernes. Debo ensayar para el programa de esta noche. Pero antes me doy una vuelta por la Granja azul. El pollito es infaltable. Esos carteles de comida lograron su cometido. Ñam.