Этот вопрос относится только к версии Haxe ‹ 2.10
Я знал о haxe некоторое время, но никогда не играл с ним до вчерашнего дня. Из любопытства я решил портировать showdown.js, javascript-порт markdown.pl, чтобы удалить. Это было довольно просто, и генерируемый им javascript, кажется, работает нормально (редактировать: Если вы хотите увидеть его в действии, проверьте его здесь).
Однако я заметил, что сгенерированный код сбрасывает массу информации в глобальное пространство имен... и, что еще хуже, он делает это, присваивая значения необъявленным идентификаторам без использования ключевого слова var
, поэтому они global, даже если вы оберните все это закрытием.
Например...
if(typeof js=='undefined') js = {}
...
Hash = function(p) { if( p === $_ ) return; {
...
EReg = function(r,opt) { if( r === $_ ) return; {
...
Мне удалось очистить большую часть этого с помощью sed, но меня также беспокоят такие вещи:
{
String.prototype.__class__ = String;
String.__name__ = ["String"];
Array.prototype.__class__ = Array;
Array.__name__ = ["Array"];
Int = { __name__ : ["Int"]}
Dynamic = { __name__ : ["Dynamic"]}
Float = Number;
Float.__name__ = ["Float"];
Bool = { __ename__ : ["Bool"]}
Class = { __name__ : ["Class"]}
Enum = { }
Void = { __ename__ : ["Void"]}
}
{
Math.__name__ = ["Math"];
Math.NaN = Number["NaN"];
Math.NEGATIVE_INFINITY = Number["NEGATIVE_INFINITY"];
Math.POSITIVE_INFINITY = Number["POSITIVE_INFINITY"];
Math.isFinite = function(i) {
return isFinite(i);
}
Math.isNaN = function(i) {
return isNaN(i);
}
}
Какой-то довольно неприятный javascript.
Вопросы
Есть ли где-нибудь форк или клон haxe, который не загрязняет глобальные переменные? Стоит ли модифицировать источник haxe, чтобы получить то, что я хочу, или кто-то уже решил это? Гугление не дало многого. Я открыт для любых предложений. Между тем, я умираю от желания увидеть, какой PHP-код эта штука будет производить... :D
Ответы?
Вот некоторые из идей, которые я пробовал:
постобработка
Вот мой скромный скрипт сборки; он довольно хорошо справляется с удалением вещей, но не улавливает все. Я не решаюсь удалить модификации встроенных прототипов конструктора; Я уверен, что это сломало бы вещи. Исправить все может быть непростой задачей, и я не хочу начинать, если кто-то уже сделал эту работу...
haxe -cp ~/Projects/wmd-new -main Markdown -js markdown.js
echo "this.Markdown=(function(){ var \$closure, Float;" > markdown.clean.js;
sed "s/^if(typeof js=='undefined') js = {}$/if(typeof js=='undefined') var js = {};/g ;
s/^\([ \x09]*\)\([\$_a-zA-Z0-9]* = \({\|function\)\)/\1var \2/g ;
/^[ \x09]*\(else \)\?null;$/d ;
" markdown.js >> markdown.clean.js
echo "return Markdown}());" >> markdown.clean.js;
java -jar closure/compiler.jar --js markdown.clean.js \
--compilation_level SIMPLE_OPTIMIZATIONS \
> markdown.cc.js
Переключатель --js-namespace спасает положение
Спасибо Дину Берджу за указание на переключатель пространства имен. Это в значительной степени решило мою проблему с небольшой помощью. Вот мой текущий скрипт сборки. Я думаю, что это захватывает все глобальные переменные...
NS=N\$
haxe -cp ~/Projects/wmd-new -main Markdown --js-namespace $NS -js markdown.js
# export our function and declare some vars
echo "this.markdown=(function(){var \$_,\$Main,\$closure,\$estr,js,"$NS"" > markdown.clean.js;
# strip silly lines containing "null;" or "else null;"
sed "/^[ \x09]*\(else \)\?null;$/d ;" markdown.js >> markdown.clean.js
# finish the closure
echo "return "$NS".Markdown.makeHtml}());" >> markdown.clean.js;