<?xml version="1.0"?>
     <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
     <channel>
      <link>http://www.bitacora.davidesperalta.com/</link>
      <title>David Esperalta - Archivo de la categoría "Curioso" en la bitácora</title>
      <generator>Gesbit</generator>
      <description>Bitácora personal, software, opinión</description>
      <atom:link href="http://www.bitacora.davidesperalta.com/rss/" rel="self"
       type="application/rss+xml" />
    
      <item>
       <link>http://www.bitacora.davidesperalta.com/nuevas-demos-de-jquery-ui/</link>
       <guid>http://www.bitacora.davidesperalta.com/nuevas-demos-de-jquery-ui/</guid>
       <pubDate>Fri, 02 Jan 2009 20:39:30 +0100</pubDate>
       <title><![CDATA[ Nuevas "demos" de jQuery UI ]]></title>
       <description><![CDATA[<p><img class="floatleft" src="http://www.bitacora.davidesperalta.com/archives/images/logotipo-jquery.png" alt="Logotipo de jQuery" width="180" height="195" />En el sitio web de <a title="ui.jQuery.com" href="http://ui.jquery.com/">jQuery UI</a> (User Interface) se puede apreciar un renovado apartado para las <a title="Demostraciones de ui.jquery.com" href="http://ui.jquery.com/demos">"demostraciones"</a> de los distintos componentes. Se aprecian varios cambios, mejoras, en general, como que la biblioteca de componentes visuales de <a title="Archivo de la etiqueta jQuery en esta bitácora" href="http://www.bitacora.davidesperalta.com/tag/jquery">jQuery</a> (si puede llamarse así) va tomando forma y cuerpo. Nuevos temas, nuevos ejemplos, nuevas versiones.</p>
<p>Personalmente, no terminan de convencerme estos componentes, es como si me sintiera "atado" con ellos, aunque, probablemente me equivoque al desestimarlos sin más. De hecho no es mi intención, sólo que cuando pienso en jQuery me digo a mí mismo que es de lo mejor que hay para trabajar con Javascript, mientras que jQuery UI no acaba de convencerme.</p>
<p>Tal vez es que no sirvan para todo tipo de aplicaciones, aunque, si sirven, si encajan en el diseño que tenemos pensado, entonces evidentemente pueden ahorrarnos mucho trabajo este tipo de componentes. Hay que decir, por otro lado, que jQuery UI no sólo se trata de componentes "de alto nivel", sino que algunas otras características se encuentran ahí y no en jQuery.</p>
<p>Por ejemplo, lo que se refiere a conseguir elementos "sortables", "droppables", "draggables", "resizables", etc., así como todo tipo de efectos, no se encuentran disponibles en jQuery, sino en jQuery UI. Lo bueno, en cualquier caso, es que la <a title="Descarga de jQuery UI" href="http://ui.jquery.com/download">descarga de esta última</a> puede personalizarse, de modo que podemos obtener todo lo dicho, prescindiendo de los componentes "visuales". Pero, ya me he enrrollado demasiado. Echa un vistazo a las nuevas "demos", verás qué chulas son. ;)</p>]]></description>
      </item>
      
      <item>
       <link>http://www.bitacora.davidesperalta.com/rapidshare-television-a-la-carta/</link>
       <guid>http://www.bitacora.davidesperalta.com/rapidshare-television-a-la-carta/</guid>
       <pubDate>Thu, 25 Dec 2008 14:21:41 +0100</pubDate>
       <title><![CDATA[ Rapidshare: televisión a la carta ]]></title>
       <description><![CDATA[<p><img class="floatleft" src="http://www.bitacora.davidesperalta.com/archives/images/logotipo-rapidshare.png" alt="Logotipo de RapidShare" width="300" height="214" />Ya he hablado sobre ello alguna vez <a title="Archivo de la etiqueta Rapidshare en esta bitácora" href="http://www.bitacora.davidesperalta.com/tag/rapidshare">en esta bitácora</a>, y, es que <a title="Rapidshare.com" href="http://www.rapidshare.com">Rapidshare</a>, junto con otros servicios similares, permiten hoy día algo que tal vez algunos soñamos hace mucho tiempo, una especie de televisión a la carta, al gusto de cada cuál, con una programación absolutamente personalizada. Esto es cierto al menos en lo que se refiere al cine. Basta con buscar en <a title="Google.es" href="http://www.google.es">Google</a>, por ejemplo, el título de cualquier película, seguido de la palabra mágica "Rapidshare", para que aparezcan no uno, sino varios sitios que nos ofrecen dicha película, con una calidad muy aceptable (cuando no en "alta definición", directamente) y a nuestra disposición en pocos minutos: si tenemos la suerte de contar con una conexión a Internet de unos cuantos "megas", digamos que cinco o seis.</p>
<p>Es una pena que no tengamos a nuestra disposición velocidades "de subida" que nos permitieran compartir con la misma rapidez utilizando otros servicios y protocolos, como pueda ser el, por otro lado, nada desdeñable <a title="Archivo de la etiqueta Torrents en esta bitácora" href="http://www.bitacora.davidesperalta.com/tag/torrents">Torrent</a>. Lo que ofrece Rapidshare es precisamente eso: rapidez, puesto que se aprovecha al cien por cien nuestra conexión a Internet, como digo, contar con la película que queremos ver, es cuestión de minutos. Se me dirá que no todo el cine está disponible en Rapidshare, que no se encontrará de todo, sin embargo, reto a quien quiera a que busque en Google la película que mejor le parezca, por su título, como he dicho antes, añadiendo la palabra "Rapidshare" justo a continuación. Raro será que no encuentre lo que quiere.</p>
<p>Que no se pueda utilizar algo distinto a Rapidshare tiene varios inconvenientes, empezando porque para alcanzar las velocidades mencionadas, es necesario pagar un precio, lo que cuesta una sucripción "Premium" a Rapidshare, que, por supuesto, hay que sumar a la tarifa que pagamos por conectarnos a Internet. Y, sin embargo, es posible que el precio en conjunto sea inferior que el que pagaríamos por contar con una televisión a la carta "tradicional". No sólo es más barato, probablemente, sino que no podrá compararse nunca la cantidad de películas que encontraremos en la televisión a la carta tradicional, con la cantidad y calidad que nos encontraremos en Internet. Nótese que no estoy hablando de elegir una película "de pago" entre una docena de "estrenos".</p>
<p>Estamos hablando de conseguir la película que quieres ver, a elegir el universo de cine disponible en Internet. Más aún, últimamente (y de ahí esta entrada) se trata de elegir la película que quieres ver: que en un alto por ciento de ocasiones estará disponible para nosotros. No se trata, pues, ni siquiera de elegir una película entre un amplio catálogo de ellas, lo que tampoco está nada mal, pero de elegir la película que están dando en la tele (pero que quieres ver en el ordenador) o una sobre la que te han hablado hace poco, o de la que acabas de enterarte: muy probablemente podrás obtenerla y podrás verla a los pocos minutos de haberlo decidido. ¿Hay algo más parecido a una supuesta televisión a la carta? Tal vez que en lugar de minutos fuesen segundos.</p>
<p>Tan sólo una cosa me preocupa, aunque ya la he dicho: el hecho de que no sea posible lo mismo utilizando otros medios como el P2P, el intercambio directo entre distintas personas, culpa sin duda de la velocidad de subida limitada conque se cuenta en España, algo que tal vez pueda generalizarse también a otros países. Bueno, claro, me preocupa que esto sea así porque el pago de Rapidshare y servicios similares implica una barrera que no todo el mundo estará dispuesta a pasar, si es que puede hacerlo. Sólo que al ponerme a pensar en estas barreras me siento una especie de burgués de cinco euros, porque, ¿acaso no existe ya una barrera infinitivamente mayor? ¿Cuándo será Internet accesible a todo el mundo? Pero para qué seguir.</p>]]></description>
      </item>
      
      <item>
       <link>http://www.bitacora.davidesperalta.com/como-pasar-de-ciudad-en-san-andreas/</link>
       <guid>http://www.bitacora.davidesperalta.com/como-pasar-de-ciudad-en-san-andreas/</guid>
       <pubDate>Mon, 22 Dec 2008 13:42:11 +0100</pubDate>
       <title><![CDATA[ Cómo pasar de ciudad en San Andreas ]]></title>
       <description><![CDATA[<p><img class="floatleft" src="http://www.bitacora.davidesperalta.com/archives/images/caratula-gta-san-andreas.png" alt="Carátula del juego GTA San Andreas" width="250" height="354" /> Hace poco dediqué una entrada al <a title="Entrada en esta bitácora" href="http://www.bitacora.davidesperalta.com/como-me-lo-paso-en-san-andreas/">juego GTA San Andreas</a>, y, entre otras cosas, terminé preguntando si alguien sabía cómo demonios "pasar de ciudad" sin que aparecieran las "estrellas" que hacen imposible jugar en condiciones, ni con trucos ni nada. Pues bien, al final he conseguido la forma de "pasar de ciudad", mejor dicho, porque esa era la finalidad, de poder recorrer todo el escenario del juego, independientemente de que me hubiera pasado las "misiones" o no.</p>
<p>En realidad no es ningún "truco", sino que, como este juego permite "guardar las partidas", otros usuarios pueden haber llegado al final del juego, haber guardado la partida en ese momento, y compartir después el archivo correspondiente, que nosotros podremos situar en "Mis Documentos", en la carpeta de "GTA San Andreas", donde se encuentran los archivos de nuestras "partidas guardadas". En efecto, he encontrado <a title="Hilo en los foros Taringa!" href="http://www.taringa.net/posts/juegos/1406310/archivos-gta-san-andreas-por-si-no-puedes-pasar-alguna.html">este hilo en Taringa!</a>, donde un usuario comparte varios archivos de "partidas guardadas".</p>
<p>Basta con descargar uno de los archivos que ahí se ofrecen, por ejemplo, el último de ellos, que corresponde con una partida guardada después de haberse pasado el juego completamente. De este modo, estaremos en disposición de recorrer todo el escenario del juego (¡realmente grande!), contaremoso con un montón de vehículos como helicópteros e hidroaviones que sólo se encuentran en determinados sitios (a los que tendremos acceso) en definitiva, podremos pasar completamente de las misiones del juego, si es que lo que nos interesa es tener a nuestra disposición todo el escenario para recorrerlo a gusto.</p>
<p>Y eso es todo. Es cierto que le quitas un poco de "salsa" al juego, pero, lo cierto es que puedes jugar partidas "con todo el escenario", para divertirte, y también jugar partidas en las que trates de superar las misiones de marras. Vamos, como suele decirse, que una cosa no quita la otra. ;)</p>
<p><strong>Actualización:</strong> Por si tienes problemas para acceder al archivo de la "partida guardada" siguiendo el enlace que he puesto más arriba, o, simplemente, para tener otra posibilidad, <a title="Partida guardada de GTA San Andreas" href="http://www.box.net/shared/vlki0nay43"><strong>sigue este enlace</strong></a>, para descargar la partida guardada "con todo el juego pasado". De nada. ;)</p>]]></description>
      </item>
      
      <item>
       <link>http://www.bitacora.davidesperalta.com/salida-de-la-tierra-en-la-luna/</link>
       <guid>http://www.bitacora.davidesperalta.com/salida-de-la-tierra-en-la-luna/</guid>
       <pubDate>Sun, 21 Dec 2008 11:06:08 +0100</pubDate>
       <title><![CDATA[ Salida de la Tierra en la Luna ]]></title>
       <description><![CDATA[<p>Imágenes en alta resolución (haz clic en el vídeo, abajo, donde pone "HQ") tomadas por una sonda japonesa hace poco. Realmente impresionantes: parece que están generadas por ordenador, aunque, a lo visto no es así: son imágenes reales, en alta definición, de una salida de la Tierra vista de la Luna.</p>
<div class="center">
<object width="430" height="317">
<param name="movie" value="http://www.dailymotion.com/swf/k5HtL9dQWsELnOBV3T&amp;colors=foreground:969393;special:D6D2C5;&amp;related=0" />
<param name="allowFullScreen" value="true" />
<param name="allowScriptAccess" value="always" /> <embed width="430" height="317" src="http://www.dailymotion.com/swf/k5HtL9dQWsELnOBV3T&amp;colors=foreground:969393;special:D6D2C5;&amp;related=0" allowfullscreen="true" allowscriptaccess="always"></embed>
</object>
<br /> <a title="Enlace al vídeo en Daily Motion" href="http://www.dailymotion.com/video/x5dpd9_kaguyafullearthrisever200804_tech">Enlace al vídeo en Daily Motion</a></div>
<p>Lo encontré anoche en la <a title="Entrada en la bitácora de un gato nipón" href="http://www.ungatonipon.com/?p=615">bitácora de un gato nipón</a>.</p>]]></description>
      </item>
      
      <item>
       <link>http://www.bitacora.davidesperalta.com/que-vuelve-stage6-con-vreel/</link>
       <guid>http://www.bitacora.davidesperalta.com/que-vuelve-stage6-con-vreel/</guid>
       <pubDate>Fri, 19 Dec 2008 13:27:33 +0100</pubDate>
       <title><![CDATA[ ¡Que vuelve Stage6 con VReel! ]]></title>
       <description><![CDATA[<p><img class="floatleft" src="http://www.bitacora.davidesperalta.com/archives/images/logotipo-vreel.png" alt="Logotipo de Vreel" width="191" height="116" /> Ya hablé en esta bitácora de <a title="Entrada en esta bitácora" href="http://www.bitacora.davidesperalta.com/vreel-mas-alternativas-a-stage6/">VReel</a>, como una alternativa al nunca como se debe alabado <a title="Archivo de la etiqueta Stage6 en esta bitácora" href="http://www.bitacora.davidesperalta.com/tag/stage6">Stage6</a>. Pues bien, <strong>VReel</strong> ha estado no poco tiempo en "beta privada", y ahora me entero de que, aunque sigue estando en "beta", al menos es pública y todos podemos acceder al <a title="Sitio web de VReel" href="http://www.vreel.net/">sitio web de VReel</a> y añorar de nuevo a Stage6... En efecto, es una gozada ver el reproductor web de <a title="DivX.com" href="http://www.divx.com/">DivX</a>, pero, es inevitable comparar VReel con Stage6, porque, ¿recuerdas cómo "cargaban" y descargabas los vídeos en Stage6? Pues es justo como no puede hacerse en VReel, probablemente porque "no da más de sí". Pero merece la pena echar un vistazo. Aunque sólo sea por recordar buenos "viejos" tiempos.</p>]]></description>
      </item>
      
      <item>
       <link>http://www.bitacora.davidesperalta.com/estadisticas-de-codigo-php/</link>
       <guid>http://www.bitacora.davidesperalta.com/estadisticas-de-codigo-php/</guid>
       <pubDate>Thu, 18 Dec 2008 18:23:31 +0100</pubDate>
       <title><![CDATA[ Estadísticas de código PHP ]]></title>
       <description><![CDATA[<p><img class="floatleft" src="http://www.bitacora.davidesperalta.com/archives/images/logotipo-php.png" alt="Logotipo de PHP" width="210" height="120" />Hace algún tiempo que hablé en esta bitácora de <a title="Entrada en esta bitácora" href="http://www.bitacora.davidesperalta.com/analizador-de-codigo-fuente-php/">Codalizer</a>, un programa escrito en <a title="PHP.net" href="http://www.php.net">PHP</a> capaz de analizar hasta cierto punto el código fuente de archivos PHP, precisamente, contando el número de líneas, y, algunas otras cosas que ahora mismo no recuerdo. Debe ser una manía mía el enterarme de cuántas líneas de código llevo escritas en cierto proyecto (como si esto importara... todo), y de otras curiosidades, como cuántas clases se están utilizando, cuántas funciones y métodos, etc., etc.</p>
<p>Pues bien, el caso es que, aprovechando la función <a title="Manual de PHP" href="http://es.php.net/manual/es/function.token-get-all.php">"token_get_all()"</a>, y, sobre todo, los identificadores o <a title="Manual de PHP" href="http://es.php.net/manual/es/tokens.php">"tokens" disponibles</a>, he escrito una sencilla clase que puede ofrecer no poca información acerca de un archivo PHP, o, si se prefiere, de todos los archivos PHP de un determinado directorio, y, opcionalmente, también los subdirectorios de este. La clase en cuestión, que, he dado en llamar "PStats", por "PHP Stats", pero, también por "Project stats", es muy sencilla de utilizar, y, como digo, proporciona no poca información.</p>
<p>Concretamente, además del número de líneas de todos los archivos PHP "encontrados", puede consultarse a la clase por el número de un identificador o "token" PHP en concreto. Por ejemplo, es posible conocer cuántos "Ifs" hay en el archivo o archivos PHP, cuántos "whiles", cuántos "foearch", cuántos "espacios", cuántas "cadenas", cuántos "enteros", cuántos "decimales",... y un largo etcétera, y aquí me remito de nuevo a la lista completa de <a title="Manual de PHP" href="http://es.php.net/manual/es/tokens.php">"tokens" disponibles</a>. Por ejemplo, puedo ofrecerte información sobre <a title="Sitio web del gestor de bitácoras Gesbit" href="http://www.gesbit.com">Gesbit</a>, sobre los archivos PHP que lo componen:</p>
<div class="entrycite">Files: <strong>214</strong>, Lines: <strong>48408</strong>, Ifs: <strong>1934</strong>, Fors: <strong>25</strong>, Exits: <strong>294</strong>, Whiles: <strong>40</strong>, Echoes: <strong>1017</strong>, Arrays: <strong>1305</strong>, Issets: <strong>100</strong>, Globals: <strong>255</strong>, Classes: <strong>89</strong>, Switchs: <strong>26</strong>, Strings: <strong>16467</strong>, Returns: <strong>1595</strong>, Comments: <strong>1474</strong>, Integers: <strong>1691</strong>, Decimals: <strong>7</strong>, Foreachs: <strong>186</strong>, Includes: <strong>0</strong>, Requires: <strong>138</strong>, Methods: <strong>1130</strong>, Inline HTML: <strong>2772</strong>, Bad Chars: <strong>0</strong></div>
<p>Los datos que refiero arriba son todos los que son, pero, no todos los que pueden conseguirse, pues la lista de "tokens" contiene más aún, pero, me he limitado a poner unos cuantos aquí, a modo de ejemplo de la información que puede conseguirse a través de la clase "PStats" de una forma muy sencilla. Ahora, si continuas leyendo, podrás ver cómo utilizar la clase y obtener el propio código de la misma, por si te interesa jugar un poco con ella y algún proyecto tuyo.</p>
<p></p>
<p><strong>Cómo usar la clase "PStats"</strong></p>
<p>La clase "PStats" está escrita en PHP 5, aunque, con pocos retoques también funcionará con PHP 4, me parece. Por otro lado, creo que en todo caso puede "analizar" código PHP 4. El uso de la clase es muy sencillo. Luego de requerirla convenientemente, para analizar un archivo PHP podemos codificar algo así:</p><div class="gbhighlighcode"><div class="sourcecode"><pre class="php"><span style="color: #0000ff;">$pstats</span> = <span style="color: #000000; font-weight: bold;">new</span> PStats<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #0000ff;">$pstats</span>-&gt;<span style="color: #006600;">GetPhpFileStat</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'ruta-archivo.php'</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>
<p>Una vez hayamos hecho eso, será posible llamar al resto de métodos de la clase: hablo de los tres métodos públicos principales, que son "GetTotalFiles()" (en este caso retornará 1), "GetTotalLines()", y, principalmente, el método "GetStatValue()". Este método requiere un argumento, precisamente, una constante que especifique un "token" de PHP. Aquí un par de ejemplos:</p><div class="gbhighlighcode"><div class="sourcecode"><pre class="php"><a href="http://www.php.net/printf"><span style="color: #000066;">printf</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Fors: %s, '</span>, <span style="color: #0000ff;">$pstats</span>-&gt;<span style="color: #006600;">GetStatValue</span><span style="color: #66cc66;">&#40;</span>T_FOR<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
<a href="http://www.php.net/printf"><span style="color: #000066;">printf</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Whiles: %s, '</span>, <span style="color: #0000ff;">$pstats</span>-&gt;<span style="color: #006600;">GetStatValue</span><span style="color: #66cc66;">&#40;</span>T_WHILE<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>
<p>Con este mismo método pueden obtenerse el resto de estadísticas, sólo cambiando la constante que pasamos a "GetStatValue" como argumento, y que, repito, se corresponde con un "token" de PHP, de los <a title="Manual de PHP" href="http://es.php.net/manual/es/tokens.php">listados en el manual</a>. Y, realmente ya está dicho todo, excepto que también podemos obtener estadísticas de varios archivos PHP, de todos los que se encuentren en un directorio:</p><div class="gbhighlighcode"><div class="sourcecode"><pre class="php"><span style="color: #0000ff;">$pstats</span> = <span style="color: #000000; font-weight: bold;">new</span> PStats<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #0000ff;">$pstats</span>-&gt;<span style="color: #006600;">GetDirectoryStats</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'/ruta-directorio'</span>, <span style="color: #000000; font-weight: bold;">false</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>
<p>E incluso dentro de los subdirectorios de un directorio en concreto:</p><div class="gbhighlighcode"><div class="sourcecode"><pre class="php"><span style="color: #0000ff;">$pstats</span> = <span style="color: #000000; font-weight: bold;">new</span> PStats<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #0000ff;">$pstats</span>-&gt;<span style="color: #006600;">GetDirectoryStats</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'/ruta-directorio'</span>, <span style="color: #000000; font-weight: bold;">true</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #808080; font-style: italic;">// También podría escribirse así, sin más</span>
<span style="color: #808080; font-style: italic;">// $pstats-&gt;GetDirectoryStats('/ruta-directorio');</span></pre></div></div>
<p>En estos últimos casos, cuando después ejecutemos el método "GetStatValue", obtendremos el número de "whiles" (por ejempo) que se encuentren en todos los archivos PHP "analizados". Y, bueno. Ahora sí creo que eso es todo. Tampoco es que quepa decir mucho más, sólo que el uso de esta clase (o algo parecido) puede resultar curioso, por ejemplo, al ver las cifras de Gesbit, pues chico, resulta curioso. No van a ningún lado, ¿pero a que son curiosas? :D</p>
<p>Sin más dilación, este es el código fuente de la clase "PStats". Supongo que no tendrás problema en copiarlo en un archivo y a partir de ahí trabajar con la clase tal como he referido arriba. Que lo pases bien. Y si te resulta curioso a ti también y quieres, deja algún comentario al respecto, que se agradece. ;)</p><div class="gbhighlighcode"><div class="sourcecode"><pre class="php"><span style="color: #000000; font-weight: bold;">class</span> PStats
<span style="color: #66cc66;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #0000ff;">$phpStats</span>;
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #0000ff;">$phpFiles</span>;
&nbsp;
  const PHP_FILE_EXT = <span style="color: #ff0000;">'.php'</span>;
  const T_TOTAL_LINES = <span style="color: #ff0000;">'lines'</span>;
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
    <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">Initialize</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #66cc66;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> GetPhpFileStat<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$filePath</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
    <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">Initialize</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">IsValidPhpFile</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$filePath</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
      <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">phpStats</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$filePath</span><span style="color: #66cc66;">&#93;</span> =
       <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">GetPhpFileStats</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$filePath</span><span style="color: #66cc66;">&#41;</span>;
      <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">true</span>;
    <span style="color: #66cc66;">&#125;</span><span style="color: #b1b100;">else</span><span style="color: #66cc66;">&#123;</span>
      <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">false</span>;
    <span style="color: #66cc66;">&#125;</span>
  <span style="color: #66cc66;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> GetDirectoryStats<span style="color: #66cc66;">&#40;</span>
   <span style="color: #0000ff;">$rootDir</span>, <span style="color: #0000ff;">$inSubdirs</span> = <span style="color: #000000; font-weight: bold;">true</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
     <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">Initialize</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
     <span style="color: #0000ff;">$phpFiles</span> = <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">GetPhpFilePaths</span><span style="color: #66cc66;">&#40;</span>
       <span style="color: #0000ff;">$rootDir</span>,
       <span style="color: #0000ff;">$inSubdirs</span>
     <span style="color: #66cc66;">&#41;</span>;
     <span style="color: #b1b100;">foreach</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$phpFiles</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$filePath</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
       <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">phpStats</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$filePath</span><span style="color: #66cc66;">&#93;</span> =
        <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">GetPhpFileStats</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$filePath</span><span style="color: #66cc66;">&#41;</span>;
     <span style="color: #66cc66;">&#125;</span>
     <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">true</span>;
  <span style="color: #66cc66;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> GetTotalFiles<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">return</span> <a href="http://www.php.net/count"><span style="color: #000066;">count</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">phpStats</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #66cc66;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> GetTotalLines<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
    <span style="color: #0000ff;">$lines</span> = <span style="color: #cc66cc;">0</span>;
    <span style="color: #b1b100;">foreach</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">phpStats</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$stat</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
      <span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/isset"><span style="color: #000066;">isset</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$stat</span><span style="color: #66cc66;">&#91;</span>self::<span style="color: #006600;">T_TOTAL_LINES</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
        <span style="color: #0000ff;">$lines</span> += <span style="color: #0000ff;">$stat</span><span style="color: #66cc66;">&#91;</span>self::<span style="color: #006600;">T_TOTAL_LINES</span><span style="color: #66cc66;">&#93;</span>;
      <span style="color: #66cc66;">&#125;</span>
    <span style="color: #66cc66;">&#125;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$lines</span>;
  <span style="color: #66cc66;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> GetStatValue<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$tokenConst</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
    <span style="color: #0000ff;">$value</span> = <span style="color: #cc66cc;">0</span>;
    <span style="color: #b1b100;">foreach</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">phpStats</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$stat</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
      <span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/isset"><span style="color: #000066;">isset</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$stat</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$tokenConst</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
        <span style="color: #0000ff;">$value</span> += <span style="color: #0000ff;">$stat</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$tokenConst</span><span style="color: #66cc66;">&#93;</span>;
      <span style="color: #66cc66;">&#125;</span>
    <span style="color: #66cc66;">&#125;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$value</span>;
  <span style="color: #66cc66;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> Initialize<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
    <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">phpStats</span> = <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">phpFiles</span> = <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #66cc66;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> IncrementFileStat<span style="color: #66cc66;">&#40;</span>
   &amp;<span style="color: #0000ff;">$fileStats</span>, <span style="color: #0000ff;">$name</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
     <span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/isset"><span style="color: #000066;">isset</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$fileStats</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$name</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
       <span style="color: #0000ff;">$fileStats</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$name</span><span style="color: #66cc66;">&#93;</span>++;
     <span style="color: #66cc66;">&#125;</span><span style="color: #b1b100;">else</span><span style="color: #66cc66;">&#123;</span>
       <span style="color: #0000ff;">$fileStats</span><span style="color: #66cc66;">&#91;</span><span style="color: #0000ff;">$name</span><span style="color: #66cc66;">&#93;</span> = <span style="color: #cc66cc;">1</span>;
     <span style="color: #66cc66;">&#125;</span>
     <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">true</span>;
  <span style="color: #66cc66;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> GetPhpFileStats<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$filePath</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
    <span style="color: #0000ff;">$fileStats</span> = <a href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #0000ff;">$phpSource</span> = <a href="http://www.php.net/file_get_contents"><span style="color: #000066;">file_get_contents</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$filePath</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #0000ff;">$phpTokens</span> = <a href="http://www.php.net/token_get_all"><span style="color: #000066;">token_get_all</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$phpSource</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #b1b100;">foreach</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$phpTokens</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$token</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
      <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">IncrementFileStat</span><span style="color: #66cc66;">&#40;</span>
        <span style="color: #0000ff;">$fileStats</span>,
        <span style="color: #66cc66;">&#40;</span>string<span style="color: #66cc66;">&#41;</span><span style="color: #0000ff;">$token</span><span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#93;</span>
      <span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
    <span style="color: #0000ff;">$totalLines</span> = <a href="http://www.php.net/explode"><span style="color: #000066;">explode</span></a><span style="color: #66cc66;">&#40;</span>
     PHP_EOL, <span style="color: #0000ff;">$phpSource</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #0000ff;">$fileStats</span><span style="color: #66cc66;">&#91;</span>self::<span style="color: #006600;">T_TOTAL_LINES</span><span style="color: #66cc66;">&#93;</span>
      = <a href="http://www.php.net/count"><span style="color: #000066;">count</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$totalLines</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$fileStats</span>;
  <span style="color: #66cc66;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> IsValidPhpFile<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$filePath</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">return</span> <a href="http://www.php.net/is_file"><span style="color: #000066;">is_file</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$filePath</span><span style="color: #66cc66;">&#41;</span> &amp;&amp; <a href="http://www.php.net/is_readable"><span style="color: #000066;">is_readable</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$filePath</span><span style="color: #66cc66;">&#41;</span>
     &amp;&amp; <span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/strpos"><span style="color: #000066;">strpos</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$filePath</span>, self::<span style="color: #006600;">PHP_FILE_EXT</span><span style="color: #66cc66;">&#41;</span> !== <span style="color: #000000; font-weight: bold;">false</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #66cc66;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> GetPhpFilePaths<span style="color: #66cc66;">&#40;</span>
   <span style="color: #0000ff;">$dirPath</span>, <span style="color: #0000ff;">$inSubdirs</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
     try<span style="color: #66cc66;">&#123;</span>
       <span style="color: #0000ff;">$dir</span> = <span style="color: #000000; font-weight: bold;">new</span> DirectoryIterator<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$dirPath</span><span style="color: #66cc66;">&#41;</span>;
       <span style="color: #b1b100;">foreach</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$dir</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$file</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
         <span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>!<span style="color: #0000ff;">$file</span>-&gt;<span style="color: #006600;">isDot</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
          &amp;&amp; <span style="color: #0000ff;">$file</span>-&gt;<span style="color: #006600;">isDir</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> &amp;&amp; <span style="color: #0000ff;">$inSubdirs</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
            <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">GetPhpFilePaths</span><span style="color: #66cc66;">&#40;</span>
              <span style="color: #0000ff;">$file</span>-&gt;<span style="color: #006600;">getPathname</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>,
              <span style="color: #0000ff;">$inSubdirs</span>
            <span style="color: #66cc66;">&#41;</span>;
         <span style="color: #66cc66;">&#125;</span><span style="color: #b1b100;">elseif</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">IsValidPhpFile</span><span style="color: #66cc66;">&#40;</span>
          <span style="color: #0000ff;">$file</span>-&gt;<span style="color: #006600;">getPathname</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
            <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">phpFiles</span><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span> =
             <span style="color: #0000ff;">$file</span>-&gt;<span style="color: #006600;">getPathname</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
         <span style="color: #66cc66;">&#125;</span>
       <span style="color: #66cc66;">&#125;</span>
     <span style="color: #66cc66;">&#125;</span>catch<span style="color: #66cc66;">&#40;</span>Exception <span style="color: #0000ff;">$e</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
       throw <span style="color: #0000ff;">$e</span>;
     <span style="color: #66cc66;">&#125;</span>
     <span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">phpFiles</span>;
  <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>]]></description>
      </item>
      
     </channel>
    </rss>