OEmbed plugin para jQuery

Estou fazendo alguns testes para um sistema que lê tweets para agregar conteúdos e pensei: como fazer para que quando um texto que contenha um link pro Twitpic (por exemplo) exiba a foto?

Primeiro passo: baixe a biblioteca jquery-oembed para o seu projeto.

Imagine que você tenha a seguinte marcação html:

<p class="post">Esse é o teste com <a href="http://twitpic.com/2qabs0">http://twitpic.com/2qabs0</a> sadsa dsaff adsfdsaf dsf sadsa dsaff adsfdsaf dsf sadsa dsaff adsfdsaf dsf sadsa dsaff adsfdsaf dsf</p>

Usando jQuery e essa biblioteca, você pode percorrer todos os p.posts e seus links e para cada um deles, jogar em uma div com classe imgarea o embed

$(" p.post a").each(function() {
   $("div.imgarea").oembed($(this).attr("href"));
});

Fontes que podem ser embedadas:

  • 5min
  • Amazon Product Images
  • Flickr
  • Google Video
  • Hulu
  • Imdb
  • Metacafe
  • Myspace Videos
  • Qik
  • Revision3
  • Screenr
  • Slideshare
  • Twitpic
  • Viddler
  • Vimeo
  • Wikipedia
  • WordPress
  • YouTube

Reflection no PHP

O PHP5 veio com uma API inteira nova de Reflection (não vou usar a tradução por não ser usada no dia-a-dia dos programadores). Com isso, foi dada a capacidade de se observar estruturas como classes, interfaces, funções e métodos em tempo de execução (runtime).

Veja um exemplo. Para o script abaixo:

class Post extends Page {
    private $title;
    private $url;
    private $date;
    function getTitle() {
        return $this->title;
    }
    function getUrl() {
        return $this->url;
    }
    function getDate() {
        return $this->url;
    }
}
$reflection = new ReflectionClass('Post');
var_dump($reflection->getMethods());
?>

A saída será:

array(3) { [0]=> &object(ReflectionMethod)#2 (2) { ["name"]=> string(8) "getTitle" ["class"]=> string(4) "Post" } [1]=> &object(ReflectionMethod)#3 (2) { ["name"]=> string(6) "getUrl" ["class"]=> string(4) "Post" } [2]=> &object(ReflectionMethod)#4 (2) { ["name"]=> string(7) "getDate" ["class"]=> string(4) "Post" } }

Ou seja, em tempo de execução o seu script consegue identificar através do método getMethods() quais são os métodos de uma determinada classe.
As possibilidades são imensas: você pode verificar para um determinado método a sua assinatura, pode verificar se uma classe é filha de outra, se implementa uma determinada interface…

É claro, o uso de Reflection não é comum no dia-a-dia de um programador, mas no caso de sistemas que geram códigos, no uso de metadados, Reflection é a saída (e não só no PHP, esse é um conceito quem vem de outras linguagens).

Links:

Verificando o tipo de um elemento no javascript

Estava com problema entre a comunicação de dois serviços diferentes feito pela parte de front-end através do javascript.

Uma requisição ajax para o serviço retornava um array de objetos que a interface deveria percorrer e montar um html como resposta. O problema é que algumas vezes este array continha além dos objetos esperados alguma função de callback ou retorno indefinido (undfined) no array.

Para fazer o tratamento deste erro eu precisaria saber qual é o tipo do objeto retornado e ignorar qualquer um que não fosse "object".

Javascript typeof

O comando typeof do javascript retorna qual é o tipo do objeto em questão, os retornos dessa função podem ser:

  • number
  • string
  • boolean
  • object
  • function
  • undefined

 

Exemplo de uso:

if(typeof(myObj) == "object"){
   alert("myObj é um objeto, pode prosseguir");
}else{
   alert("Não é um objeto, ignore");
}

 

Curiosidades

A função typeof sempre retorna uma string (com os valores da lista lé de cima), então typeof(typeof(x)) sempre irá retornar string, não importa se x é um array, string, int ou função.

Um array é considerado um object, mas com a função abaixo (case sensitive, criamos a função typeOf) retorna os tipos padrões mais o array.

function typeOf(obj) {
  if ( typeof(obj) == "object" )
    if (obj.length)
      return "array";
    else
      return "object";
    } else
  return typeof(obj);
}

 

Função bem simples e ótima para previnir e tratar erros, dúvidas e sugestões nos comentários!