Расширение против Callback hell



  • Сильно ли трудно поменять знак "!", указывающий на асинхронность функции, на какой-нибудь другой, например, на //! или на /*!*/? Как например сделано с /*Browser*/. Очень облегчило бы написание кода в IDE


  • administrators

    @blackhacker
    Добавить возможность понимать /*!*/ просто - нужно внести изменения в этот цикл
    https://github.com/bablosoft/BAS/blob/d9acdb4a51e48b1f2bd09342cf726636695fc74e/Engine/preprocessor.cpp#L175-L278
    и пересобрать http://wiki.bablosoft.com/doku.php?id=how_can_i_change_bas_and_compile

    Сделать так, чтобы код выдаваемый конструктором можно было бы читать в ide сложнее - нужно менять кучу файлов.



  • @support Не, я в IDE сырой код на js пишу, там все нормально. Единственное, из-за знака ! синтаксис неправильно определяется, точнее, он вообще теряется, и труднее работать с кодом. Как если бы писать код в блокноте. Пока временно ставлю //! в коде, а когда нужно добавить код в проект BAS, меняю обратно на !
    Изменения я бы внес и пересобрал, но в вашей версии же этих изменений не будет, поэтому мне придется всегда пользоваться старой, либо каждый раз вносить изменения и перекомпилировать. А нельзя в следующей версии внести это изменение? На BAS ведь это никак не повлияет. Те, кто кто пользуются конструктором, этого не заметят, а для программистов будет удобнее работать с IDE. Да и eval такой код не понимает, а с /*!*/ бы работало.


  • administrators

    @blackhacker

    Изменения я бы внес и пересобрал, но в вашей версии же этих изменений не будет

    Присылайте новый файл я добавлю. Еще лучше пулл реквест на гитхабе, но измененный файл тоже пойдет.



  • @support Точно лучше мне прислать файл? Я думал, проще было бы, если бы вы внесли изменения, тем более, вы гораздо лучше разбираетесь в структуре кода BAS, и исходники уже у вас есть. Но в любом случае, я сделаю так, как вам удобнее, все-таки вы и так сделали многое, создав бесплатно для людей такой софт) Если вам проще, то тогда надо поменять
    int index_start = Res.indexOf(")!", from);
    на
    int index_start = Res.indexOf(");/*!*/", from);
    Или я завтра поменяю, сегодня уже поздно этим заниматься

    Позже заметил, что там много кода менять, я тогда завтра поменяю и пришлю файл, либо pull request на гитхабе


  • administrators

    @blackhacker не только, нужно что и такой вариант и такой работал.
    )!
    )/*!*/



  • @support а зачем нужно оба варианта? вроде второй более правильный - функционал не меняется, но работать с кодом в IDE удобнее


  • administrators

    @blackhacker Чтобы поменять на 2 нужно править море кода. Еще я подумал, в перед тем циклом можно заменить второй вариант на 1 и все.



  • @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 на гитхабе для удобства.


  • administrators

    @blackhacker Все правильно, спасибо за пулл реквест. Есть только один недочет - этот код не будет работать с форматом )! это значит, что весь старый код придется переписывать. Предлагаю в начале функции заменить /*!async*/на )!



  • @support что-то я уже совсем запутался. вроде же изначально и было задумано, чтобы заменить ! на что-то типа /*!async*/, чтобы при работе в IDE писать javascript код было удобнее, потому что из-за знака ! синтаксис теряется, и более того, код с ! не работает в eval, а знаки /* */ означают комментарий текста между ними, и синтаксис бы не терялся, и асинхронные функции работали бы


  • administrators

    @blackhacker Да, но что тогда делать с другими скриптами написанными до этого изменения(там где используется )!)? Они перестанут работать(


  • administrators

    @blackhacker Ладно, доделаю сам. Будет в завтрашней версии.



  • @support скриптами - всмысле, проектами, написанными ранее? или другими исходниками BAS? давайте тогда добавлю в код обработку обоих вариантов. я сначала думал, что вы про исходники сказали, что где-то в них используется )!


  • administrators

    @blackhacker

    всмысле, проектами, написанными ранее? или другими исходниками BAS?

    И того и другого полно.



  • @support если сильно в нагрузку исправлять, то ладно тогда. я думал, дело только в цикле, в других исходниках не нужно ничего менять. но у вас наверно и без этого много чего исправлять.

    BAS создан для непрограммистов, чтобы люди без знания программирования могли создавать шаблоны. Но о программистах тоже нужно думать) Мне например проще и удобнее подключить BAS к своему уже написанному боту, который сможет посылать в BAS команды для выполнения эмуляции браузера, а вся динамическая часть остается на боте. В BAS трудно сделать шаблон динамичным, во всяком случае, для этого придется использовать много действий в шаблоне, либо писать тот же код и выполнять его в BAS. Я бы даже порекомендовал в будущем написать модули для управления BAS через С#/PHP, т.к. это очень нужная вещь. Либо даже я могу позже с этим помочь и написать модуль для PHP, т.к. сейчас использую BAS совместно с PHP, и почти все уже готово.

    Сегодня поиском по исходникам поискал, ")!" встречается только в одном месте в одном файле помимо того цикла, который я переделывал. Вы точно уверены, что много переделывать нужно?


  • administrators

    @blackhacker Не успел в новой версии, выпущу отдельным патчем.



  • @support Хорошо, спасибо большое) Но если правда сложно, то лучше потом тогда, я не думал просто, что там многое переделывать придется. Это уж скорее для удобства больше, потому как сейчас приходится при работе с кодом в IDE сначала комментировать везде знак !, а когда надо переносить код в BAS, то обратно заменять его везде.


  • administrators

    @blackhacker В 16.4.0 можно писать /*async!*/ и будет работать.
    Например,

    load("google.com")/*async!*/
    


  • @support Еще раз хочу сказать спасибо, что стараетесь ради нас, обычных юзеров, почти безвозмездно) И софт лучше, чем у конкурентов, например чем ZennoPoster. У них в новой версии что-то там кардинально в структуре шаблонов поменялось (я не углублялся, т.к. не пользуюсь), и всем пришлось заново учиться делать шаблоны.



  • @support Спасибо, я ведь правильно понял, что теперь "!" и "/async!/" - это "синонимы"?


Log in to reply
 

Looks like your connection to Bablosoft was lost, please wait while we try to reconnect.