Как оценить объект HTML DOM (например, «документ») в RubyRacer - PullRequest
2 голосов
/ 21 марта 2012

RubyRacer позволяет мне легко выполнять код javascript в среде ruby, например:

cxt = V8::Context.new
wanted_output = cxt.eval(whatever_javascipt_code)

Как это сделать, когда задействованы такие объекты, как «документ», как, например, в следующем фрагменте кода? (Другими словами, как я могу сгенерировать вывод «document.write» в этом случае?)

<script language="javascript" type="text/javascript">
  A="some_string";
  B="some_other_string";
  C="";

  for(j=0;j<B.length;j++){
    C+=A.charAt(B.charCodeAt(j)-48);
  }document.write(C);
</script>

Простая оценка приведенного выше сценария приведет к сообщению об ошибке:

"V8::JSError: document is not defined"

Большое спасибо за любые подсказки!

1 Ответ

0 голосов
/ 21 марта 2012

Предполагая, что переменная 'script' содержит указанный выше код JavaScript:

cxt = V8::Context.new
script.insert(0, "output=''")

document_write_count = script.scan('document.write(').count
remaining = script
document_write_count.times do |i|
  document_write_clause_content = remaining.partition('document.write(')[2].partition(')')[0]
  document_write_clause = "document.write(#{document_write_clause_content})"
  document_write_clause_replacement = "output+=#{document_write_clause_content}"
  script.gsub!(document_write_clause, document_write_clause_replacement)
  remaining = remaining.rpartition(document_write_clause_replacement)[2]
end

script.insert(-1, "output;")

wanted_output = cxt.eval("#{script}")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...