/* 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(); Próxima estación - Jeremías Gamboa - Revista ASIA SUR

Próxima estación

O qué sucede cuando dejamos de ser quienes somos

Hace tan solo unos semestres dictaba en la universidad un curso de Periodismo Narrativo que desafiaba a los estudiantes a contar de manera periodística un relato sobre la vida o un trozo significativo de la vida de un personaje público. Pronto descubrimos que para dividir las historias en capítulos –pedíamos tres­– uno de los mejores recursos era detectar en las vidas personales de esas figuras aquellos eventos que significaron un punto de no retorno en sus vidas profesionales: el descubrimiento de una vocación, la realización de la obra consagratoria, el gran evento que instaló a aquellas figuras en nuestra memoria colectiva y que marcó con cierta claridad las «etapas de su vida». Le llamábamos a esos hechos cráteres o nudos nerviosos y organizábamos sobre ellos la vida de nuestros personajes reales. Los hechos que narrábamos iban dirigidos a esos nudos narrativos y se desprendían de ellos. Recuerdo aún uno de esos episodios de Britain’s Got Talent donde Simon Cowell le dice lo siguiente a una talentosa participante después de terminada su audición: «Espero que hayas sido consciente de lo importante que han sido estos cinco minutos en toda tu vida». Ese era un cráter.

La vida de quienes somos más bien simples no obedece, por cierto, solo a ese tipo de eventos tan claros o precisos –la muerte o el nacimiento de alguien, un logro o una decepción específica– sino sobre todo a esas pequeñas modificaciones internas y casi invisibles que de pronto, y sin que nos demos cuenta, nos llevan a ser personas bastante diferentes de las que éramos hasta cierto momento. Me encantan las novelas en las que comprobamos que el personaje ha dejado de ser al final quien fue en las primeras páginas, pero que no nos permiten precisar en qué momento puntual ocurrió esa transformación. Me parece que la vida suele ser así. Muchas veces nos podemos dar una idea de los cambios por algunas decisiones que tomamos cuando las cosas ya se modificaron –dejamos de reaccionar de la misma manera ante una agresión o demanda similares, decidimos por fin cortarnos el pelo o rompemos sin esfuerzo un vínculo con alguien–, pero difícilmente sabremos en qué momento ese cambio se produjo. De pronto, por algo que escapa a nuestra conciencia, ya no somos
los que fuimos.

No estoy muy seguro si es porque el verano está llegando a su fin, porque en casa pasamos dos meses de una enorme hondura ante la posibilidad de que mi papá se fuera de este mundo o a que uno de mis grandes amigos se haya mudado de la calle en la que ambos vivimos con luz y libertad durante los últimos años, pero de pronto me siento en el fin de una estación vital y en el inicio de otra, como ante la llegada de un otoño personal. De pronto he regresado a dictar clases a la universidad bajo el calor de los últimos días de marzo, tal como unas semanas atrás en febrero durante el ciclo de verano, pero siento que he vuelto convertido en otra persona. Todo, por cierto, sigue igual –el campus, los chicos, los horarios­– ­aunque algo me dice que mi relación con lo que me rodea y mi lectura de las cosas se han modificado. Y claro, como en una de esas maravillosas películas de Truffaut, me es imposible identificar el punto de inflexión.

Tengo algunas pistas, claro. Hace algunos años he venido escribiendo la historia de un muchacho. El mismo que, de alguna manera, representa mucho de lo que fui de los veinte a los treinta años, antes de descubrir el sentido del tiempo que ahora rige mi vida y esa manera algo más serena de relacionarme con el mundo. La empecé a los 32, cuando de cierta forma había dejado ya de ser ese muchacho. Para cuando eso pasó, yo sabía que un escritor nunca escribe sobre lo que es, sino sobre lo que ha dejado de ser, pero igual me sentía comprometido con la fe y la voluntad de mi personaje, ese chico que intentaba curar las heridas que había recibido mediante un grito de centenares de páginas en las que recuenta de modo exaltado su vida. Con el paso del tiempo, sin embargo, y mientras seguía sus transformaciones, me fui dando cuenta de que yo también cambiaba fuera del texto y que habría un momento en que quizá ya no tendría ninguna conexión, ni siquiera de mínima identificación, con él. A pesar de eso, acaso porque temía que hacerlo era despedirme de todo lo que él amó y lo rodeó por tantos años –sus amigos, su rutina, sus parejas–, me resistí a terminar su historia. Ahora que me ha sido tan simple dejarlo ir, sé que ocurrió porque en algún punto (que no puedo precisar, pero que ha pasado este último verano) dejé de ser quien era. Sin más. Y ya no tengo miedo.