2009-05-22 8 views
2

J'essaye d'écrire une simple commande Ubiquity qui lancera une requête sur Wolfram Alpha, et affichera les résultats dans l'objet d'aperçu Ubiquity.jQuery + Ubiquity: Retourne un objet document à partir d'une URL

Je dois définir innerHTML de l'objet d'aperçu. Je suis actuellement ce pour obtenir le code HTML, qui est seulement un début:

//... 
jQuery.get('http://www.wolframalpha.com/input/?i=' + input.text, 
    null, 
    function(page) { 
     previewBlock.innerHTML = page; 
    } 
); 

J'ai 2 problèmes/questions:

  1. Wolfram prend 5-10 secondes pour générer tout le code HTML de la page , donc la commande get() renvoie HTML incomplet
    Comment peut-il attendre le chargement complet de la page?

  2. Les résultats ont id="results" sur la page Wolfram, je voudrais simplement obtenir les résultats en faisant quelque chose comme ceci:
    previewBlock.innerHTML = page.getElementById('results').innerHTML
    Comment cela peut-il être fait avec l'URL que je utilise?

Une autre option pourrait être de créer un nouvel élément en utilisant l'URL Wolfram en tant que source et l'ajouter à previewBlock - Je ne sais pas comment faire bien. Toute suggestion serait appréciée.

MISE À JOUR
Voici le script Ubiquity j'utilise - Il va chercher les images à partir du code source HTML et les sorties dans une boucle. Note: CmdUtils.previewGet(pblock, opt) appelle jQuery.get(opt)

CmdUtils.CreateCommand({ 
    name: "wolfram", 
    takes: {"input": noun_arb_text}, 
    icon: "http://www.wolframalpha.com/favicon.ico", 
    homepage: "http://www.wolframalpha.com", 
    author: {name:"Jason Coon"}, 
    description: "Searches Wolfram Alpha and loads results in to Preview pane.", 

    preview: function(pblock, input) { 
    CmdUtils.previewGet(pblock, 
     'http://www.wolframalpha.com/input/?i=' + input.text, 
     null, 
     function(data){ 
     var resultStart = data.indexOf("results",0); 
     var beginPos = data.indexOf("<img src", resultStart); 
     var endPos = 0; 
     var html = "" 
     while(beginPos != -1){ 
      endPos = data.indexOf(">", beginPos); 
      html = html + "<br><br>" + data.substring(beginPos, endPos); 
      beginPos = data.indexOf("<img src", endPos); 
     } 
     pblock.innerHTML = html; 
     } 
    ); 
    } 
}) 
+0

Tout d'abord, comment passez-vous l'erreur "URI restreinte refusée"? –

+0

Ubiquity semble prendre soin de lui, et est capable d'aller chercher les données. –

+0

Veuillez poster le code qui inclut l'appel d'ubiquité? –

Répondre

2

Je ne pense pas que cela est encore possible en utilisant la Ubiquity Preview. Le problème est que lors de l'envoi de la requête à Wolfram, la page finit de se charger très rapidement, mais elle continue d'aller chercher des informations supplémentaires de manière asynchrone comme vous le savez déjà. Si cela a été fait à travers une fenêtre de navigateur au lieu de l'aperçu Ubiquity, vous pouvez réellement charger la page dans un iframe caché et vérifier le contenu avant de mettre à jour les résultats div. Cependant, cette option n'est pas disponible dans la version actuelle d'Ubiquity.

Voici une capture d'écran de l'exécution de votre commande et de la transmission du texte "PIB USA". Deux divs reçoivent des informations d'affichage et deux autres commencent à extraire des données supplémentaires de manière asynchrone dès que la page est chargée.
alt text http://exterbase.com/wolfram-result.png

1

Je pense que votre idée est faisable, mais je pense que vous aurez plus de succès avec un appel AJAX à Wolfram | API Alpha que en essayant d'analyser une réponse à la W-A frontal Web. Pour la documentation sur l'API WolframAlpha, voir ici: www.wolframalpha.com/WolframAlphaAPI.pdf

Je pense que changer votre approche pour interagir avec l'API devrait résoudre vos problèmes. Si vous souhaitez poursuivre votre approche actuelle, vous pouvez examiner le code de la commande Wikipedia intégrée pour voir comment ils analysent les résultats de recherche, puis extraire de manière asynchrone des résumés d'articles pour l'aperçu.

Questions connexes