2016-11-18 1 views
2

J'essaie de pré-rendre un fichier html MathJax en utilisant PhantomJS. Par exemple, supposons que dans math.html je:Comment puis-je forcer PhantomJS à attendre que MathJax soit terminé?

<!DOCTYPE html> 
<html> 
    <head> 
    <script type="text/javascript" src="MathJax/MathJax.js"></script> 
    <script src="ConfigMathJax.js"></script> 
    </head> 
    <body> 
    <span class="math">\(e = m c^2\)</span> 
    </body> 
</html> 

Mon (cassé) renderscript ressemble actuellement:

var page = require('webpage').create(); 
var system = require('system'); 
var fs = require('fs'); 
page.open(system.args[1], function() { 
    page.evaluate(function(){ 
     var flag = false; 
     MathJax.Hub.Queue(["Typeset",MathJax.Hub]); 
     MathJax.Hub.Queue(function(){ 
     console.log(page.content); 
     phantom.exit(); 
     }); 
    }); 
}); 

J'ai essayé d'écrire la page vers la sortie standard et la sortie after la La commande de rendu MathJax est appelée depuis la file d'attente. Mais il semble que je sois dans le contexte de la «page» plutôt que dans le contexte fantôme de niveau supérieur. La variable page est introuvable: ReferenceError: Can't find variable: page.

Je pirater dans un setTimeout au lieu d'utiliser le drapeau:

var page = require('webpage').create();             
var system = require('system');               
var fs = require('fs');                 
page.open(system.args[1], function() {             
    page.evaluate(function(){                
     MathJax.Hub.Queue(["Typeset",MathJax.Hub]);           
    });                     
    setTimeout(function(){                
     console.log(page.content);               
     phantom.exit();                  
    },10000);                    
}); 

puis-je obtenir la sortie désirée, mais bien sûr, le temps d'attente 10000 ms dépendra du contenu. Comment puis-je faire savoir à PhantomJS que MathJax a terminé le rendu?

Est-ce un problème de bac à sable?

+1

JavaScript est mono-thread. Vous ne pouvez pas arrêter une boucle infinie avec un événement asynchrone, car l'événement est bloqué jusqu'à ce que le thread soit disponible. – 4castle

+0

Ah, j'ai lu les réponses sur ceci trop rapidement: http://stackoverflow.com/a/22125915/148668 –

+1

Exactement, plutôt que de placer un drapeau dans le rappel, mettez les instructions que vous voulez exécuter dans le rappel. – 4castle

Répondre

1

les opérations suivantes:

var page = require('webpage').create(); 
var system = require('system');               
var fs = require('fs'); 
page.open(system.args[1], function() { 
    page.evaluate(function() { 
    MathJax.Hub.Queue(
     ["Typeset",MathJax.Hub], 
     function() { 
     console.log(page.content); 
     phantom.exit(); 
     } 
    ); 
    }); 
}); 

Cela file d'attente de la sortie de la console et phantom.exit() appels à se produire immédiatement après la photocomposition se produit. Je n'ai pas testé le code, mais c'est le moyen de synchroniser quelque chose avec le processus de MathJax.


MISE À JOUR

Essayez ceci:

var page = require('webpage').create(); 
var system = require('system');               
var fs = require('fs'); 
page.open(system.args[1], function() { 
    page.onAlert = function (msg) { 
    if (msg === "MathJax Done") { 
     console.log(page.content); 
    } else if (msg === "MathJax Timeout") { 
     console.log("Timed out waiting for MathJax"); 
    } else {console.log(msg)} 
    phantom.exit(); 
    }; 
    page.evaluate(function() { 
    MathJax.Hub.Queue(
     ["Typeset",MathJax.Hub], 
     [alert,'MathJax Done'] 
    ); 
    setTimeout(function() {alert("MathJax Timeout")},10000); // timeout after 10 seconds 
    }); 
}); 
+0

On dirait que le bac à sable est en train de le déjouer. Je reçois 'ReferenceError: Impossible de trouver la variable: page'. –

+0

J'ai mis à jour ma réponse avec une nouvelle version à essayer. Vous pouvez également regarder [code I fourni] (https://groups.google.com/forum/#!msg/mathjax-users/nQXVaFi4IKQ/AwZ-UrRhiDAJ) il y a des années pour produire un fichier SVG à partir de MathJax via phantom.js (qui a été remplacé depuis par mathjax-node, comme Peter l'a suggéré). J'ai criblé le code ci-dessus à partir de cet exemple de code précédent. –

+0

Le code mis à jour fonctionne. C'est une solution de contournement, je n'aurais pas pensé à utiliser l'alerte de cette façon. –