2016-11-18 6 views
2

Я пытаюсь сделать pre-render a MathJax html file using PhantomJS. Например, предположим, что в math.html у меня есть:Как заставить PhantomJS ждать окончания MathJax?

<!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> 

Мой (прерывистая) делают сценарий в настоящее время выглядит следующим образом:

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(); 
     }); 
    }); 
}); 

Я попытался написать страницу на стандартный вывод и выход after Команда MathJax render вызывается из очереди. Но похоже, что я в контексте «страницы», а не в контексте фантома верхнего уровня. Переменная page не может быть найдена: ReferenceError: Can't find variable: page.

Это я взломать в setTimeout вместо использования флага:

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);                    
}); 

тогда я получаю желаемый результат, но, конечно, время ожидания 10000 мс будет зависеть от содержания.

Как я могу сообщить PhantomJS, что MathJax сделан рендеринг?

Это проблема с песочницей?

+1

JavaScript является однопоточных. Вы не можете остановить бесконечный цикл с асинхронным событием, потому что событие блокируется до тех пор, пока поток не будет доступен. – 4castle

+0

Ах, я быстро прочитал ответы об этом: http://stackoverflow.com/a/22125915/148668 –

+1

Точно так, вместо того, чтобы устанавливать флаг в обратном вызове, поместите операторы, которые вы хотите выполнить в обратном вызове. – 4castle

ответ

1

Попробуйте следующее:

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(); 
     } 
    ); 
    }); 
}); 

Это будет очередь вывода на консоль и phantom.exit() вызов происходит сразу после того, как происходит набор текст. Я не тестировал код, но это способ синхронизации с процессом MathJax.


UPDATE

Попробуйте это:

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

Кажется, что песочница сорвала это. Я получаю 'ReferenceError: Не могу найти переменную: page'. –

+0

Я обновил свой ответ с новой версией, чтобы попробовать. Вы также можете посмотреть [код, предоставленный мной] (https://groups.google.com/forum/#!msg/mathjax-users/nQXVaFi4IKQ/AwZ-UrRhiDAJ) несколько лет назад для создания SVG из MathJax через phantom.js (который с тех пор был заменен mathjax-узлом, как предложил Петр). Я вырезал код выше из предыдущего примера кода. –

+0

Работает обновленный код. Это довольно обходное решение, я бы не подумал использовать это предупреждение. –

Смежные вопросы