Расширение против Callback hell
-
@support Так будет работать?
QString async_str = "/*!async*/"; int async_str_length = async_str.length(); while (true) { int length = Res.length(); int index_start = Res.indexOf(");" + async_str, from); from = index_start + async_str_length + 2; bool is_one_argument = false; int index_search = index_start - 1; while (true) { if (index_search >= 0) { QChar c = Res.at(index_search); if (c.isSpace()) { } else if (c == '(') { is_one_argument = true; break; } else { break; } index_search--; } else break; } if (Res.indexOf(");" + async_str) < 0) { break; } int index_end = index_start + async_str_length + 2; int open_bracket = 0; while (true) { if (index_end >= length - 1) { QString all = Res.mid(index_start + async_str_length + 2); if (all.indexOf(");" + async_str) >= 0) break; Res = Res.replace(index_start + async_str_length + 2, all.length(), Encrypt(all, ParanoicLevel)); Res = Res.replace(index_start, async_str_length + 2, ", function(){"); Res = Res.append("})"); from = 0; break; } else { QChar c = Res.at(index_end); if (c == '{') { open_bracket++; } else if (c == '}') { open_bracket--; if (open_bracket < 0) { QString all = Res.mid(index_start + async_str_length + 2, index_end - index_start - async_str_length - 2); if (all.indexOf(");" + async_str) >= 0) break; Res = Res.replace(index_end, 1, "})}"); Res = Res.replace(index_start + async_str_length + 2, all.length(), Encrypt(all, ParanoicLevel)); QString replace_string = "function(){"; if (!is_one_argument) replace_string = "," + replace_string; Res = Res.replace(index_start, async_str_length + 2, replace_string); from = 0; break; } } if (index_end == length - 1) { QString all = Res.mid(index_start + async_str_length + 2); if (all.indexOf(");" + async_str) >= 0) break; Res = Res.replace(index_start + async_str_length + 2, all.length(), Encrypt(all, ParanoicLevel)); Res.append("})"); QString replace_string = "function(){"; if (!is_one_argument) replace_string = "," + replace_string; Res = Res.replace(index_start, async_str_length + 2, replace_string); from = 0; break; } index_end++; } } }
В C# больше опыта, чем в C++, тем более, код сложный, исходников много. Добавил переменную со строкой
/*!async*/
, она будет использоваться вместо знака !, и переменную с числом длинны строки, далее заменил везде в цикле, например, index_start + 2 на index_start + async_str_length + 2, т.к. посчитал, что 2 - количество символов строки ")!", которая определяется как указатель на асинхронность функции. Прошу поправить, если не прав. Еще раз повторюсь, что опыта в С++ мало, в основном программировал на PHP и С#. Отправил pull request на гитхабе для удобства.
-
@blackhacker Все правильно, спасибо за пулл реквест. Есть только один недочет - этот код не будет работать с форматом )! это значит, что весь старый код придется переписывать. Предлагаю в начале функции заменить
/*!async*/
на)!
-
@support что-то я уже совсем запутался. вроде же изначально и было задумано, чтобы заменить ! на что-то типа
/*!async*/
, чтобы при работе в IDE писать javascript код было удобнее, потому что из-за знака ! синтаксис теряется, и более того, код с ! не работает в eval, а знаки/* */
означают комментарий текста между ними, и синтаксис бы не терялся, и асинхронные функции работали бы
-
@blackhacker Да, но что тогда делать с другими скриптами написанными до этого изменения(там где используется
)!
)? Они перестанут работать(
-
@blackhacker Ладно, доделаю сам. Будет в завтрашней версии.
-
@support скриптами - всмысле, проектами, написанными ранее? или другими исходниками BAS? давайте тогда добавлю в код обработку обоих вариантов. я сначала думал, что вы про исходники сказали, что где-то в них используется )!
-
всмысле, проектами, написанными ранее? или другими исходниками BAS?
И того и другого полно.
-
@support если сильно в нагрузку исправлять, то ладно тогда. я думал, дело только в цикле, в других исходниках не нужно ничего менять. но у вас наверно и без этого много чего исправлять.
BAS создан для непрограммистов, чтобы люди без знания программирования могли создавать шаблоны. Но о программистах тоже нужно думать) Мне например проще и удобнее подключить BAS к своему уже написанному боту, который сможет посылать в BAS команды для выполнения эмуляции браузера, а вся динамическая часть остается на боте. В BAS трудно сделать шаблон динамичным, во всяком случае, для этого придется использовать много действий в шаблоне, либо писать тот же код и выполнять его в BAS. Я бы даже порекомендовал в будущем написать модули для управления BAS через С#/PHP, т.к. это очень нужная вещь. Либо даже я могу позже с этим помочь и написать модуль для PHP, т.к. сейчас использую BAS совместно с PHP, и почти все уже готово.
Сегодня поиском по исходникам поискал, ")!" встречается только в одном месте в одном файле помимо того цикла, который я переделывал. Вы точно уверены, что много переделывать нужно?
-
@blackhacker Не успел в новой версии, выпущу отдельным патчем.
-
@support Хорошо, спасибо большое) Но если правда сложно, то лучше потом тогда, я не думал просто, что там многое переделывать придется. Это уж скорее для удобства больше, потому как сейчас приходится при работе с кодом в IDE сначала комментировать везде знак !, а когда надо переносить код в BAS, то обратно заменять его везде.
-
@blackhacker В 16.4.0 можно писать
/*async!*/
и будет работать.
Например,load("google.com")/*async!*/
-
@support Еще раз хочу сказать спасибо, что стараетесь ради нас, обычных юзеров, почти безвозмездно) И софт лучше, чем у конкурентов, например чем ZennoPoster. У них в новой версии что-то там кардинально в структуре шаблонов поменялось (я не углублялся, т.к. не пользуюсь), и всем пришлось заново учиться делать шаблоны.
-
@support Спасибо, я ведь правильно понял, что теперь "!" и "/async!/" - это "синонимы"?
-
@UlybnisJe Да, если они стоят после закрывающейся скобки.