Лайфхаки BAS

Pinned Moved LifeHacks
  • @bms-java said in Лайфхаки BAS:

    Расширенный spintax.

    Кроме стандартного БАСовского перебора {1|2|3} может менять текст местами, поддерживает любую вложеность.
    Вставить в экшн "Выполнить код"

    Твой код не работает, а искать почему, мне лень :D.
    Скопировал библиотеку по новой (библиотека взята с сайта http://xbb.uz/randomizator/) и немного подправил код, чтобы не поймать баг в объявлении именованой функции.


    /* Библиотека для обработки текста рандомизатором http://gsgen.ru/ */
    /* Поддерживаемые шаблоны и директивы */
    /*
    {текст 1|текст 2|текст 3} - перебор вариантов
    [текст 1|текст 2|текст 3] - перестановки
    [+разделитель+текст 1|текст 2|текст 3] - перестановки с разделителем
    \{ \} \| [ ] \+ \\ - экранизация спецсимволов
    */
    TextRandomizator_Node = function($parent) {
    	$parent = (typeof $parent !== 'undefined') ? $parent : null;
    	var $this = this;
    	//$this.$_parent = null;
    	$this.$_str = '';
    	$this.$_type = 'mixing';
    	$this.$_subNodes = [];
    	$this.$_usedKeys_s = [];
    	$this.$_usedKeys_m = [];
    	$this.var_num_m = 0;
    	$this.$pset_arr = [];
    	$this.$_separator = '';
    	$this.$_isSeparator = false;
    	$this.$_parent = $parent;
    	if($parent) {
    		$this.$_parent.$_subNodes.push($this);
    	}
    // Перемешать элементы массива в случайном порядке
    	function shuffle($arr) {
    		function compareRandom(a, b) {
    			return Math.random() - 0.5;
    		}
    		return $arr.sort(compareRandom);
    	}
    // Сортировка элементов массива по заданному массиву ключей
    	function sort_arr_arr($arr, $key_arr) {
    		var output = [];
    		for(var $i=0; $i<$key_arr.length; $i++) {
    			output.push($arr[$key_arr[$i]]);
    		}
    		return output;
    	}
    // Получение списка ключей массива	
    	function array_keys(myObject) {
    		var output = [];
    		for(var key in myObject) {
    			output.push(key);
    		}
    		return output;
    	}
    // Поменять местами элементы массива
    	function swap($i, $j, $arr) {
    		if($i != $j) {
    			var $temp = $arr[$i];
    			$arr[$i] = $arr[$j];
    			$arr[$j] = $temp;
    		}
    		return $arr;
    	}
    // Расстановка элементов в обратном порядке от заданной позиции
    	function reverse_arr($k, $arr) {
    		var $i = 0;
    		var $j = $k;
    		while($i < $j) {
    			$arr = swap($i, $j, $arr);
    			$i++;
    			$j--;
    		}
    		return $arr;
    	}
    // Генерация массива с перестановками
    	function gen_mset($arr, $k) {	
    		if ($k == 0) {
    			$this.$pset_arr.push($arr.slice());
    		} else {
    			for(var $i = 0; $i <= $k; $i++) {
    				gen_pvar($k-1, $arr);
    				if($i < $k) {
    					$arr = swap($i, $k, $arr);
    					$arr = reverse_arr($k - 1, $arr);
    				}
    			}
    		}
    	}
    // Генерация следующей перестановки
    	function next_mset($arr, $n) {
    		var $j = $n - 2;
    		while($j != -1 && $arr[$j] >= $arr[$j + 1]) $j--;
    		if ($j == -1)
    			return false; // больше перестановок нет
    		var $k = $n - 1;
    		while ($arr[$j] >= $arr[$k]) $k--;
    		$arr = swap($j, $k, $arr);
    		var $l = $j + 1, $r = $n - 1; // сортируем оставшуюся часть последовательности
    		while ($l<$r)
    			$arr = swap($l++, $r--, $arr);
    		return $arr;
    	}
    	
        $this.get_text = function($rand) {
    		$rand = (typeof $rand !== 'undefined') ? $rand : false;
            var $result = '';
            switch ($this.$_type) {
                case 'synonyms':
    				if ($this.$_usedKeys_s.length == 0) {
                        $this.$_usedKeys_s = array_keys($this.$_subNodes);
    				}
    				if($rand == true) {
    					var $random_key = Math.floor(Math.random() * ($this.$_usedKeys_s.length));
    					var $key = $this.$_usedKeys_s[$random_key];
    					$result = $this.$_subNodes[$key].get_text($rand);
    					$this.$_usedKeys_s.splice($random_key, 1);				
    				} else {
    					var $key_s = $this.$_usedKeys_s[0];
    					$result = $this.$_subNodes[$key_s].get_text($rand);
    					$this.$_usedKeys_s.splice(0, 1);
    				}
    				break;
                case 'mixing':
    				var $_subNodes_m = $this.$_subNodes;
    				if($this.$_usedKeys_m.length == 0 && $this.$_subNodes.length > 1) {
    					if($rand == true) {
    						$this.$_subNodes = shuffle($this.$_subNodes);
    					}
    					$_subNodes_m = $this.$_subNodes;
    					$this.$_usedKeys_m = array_keys($this.$_subNodes);
    				}
    				if($this.$_usedKeys_m.length > 1) {
    					$this.$_usedKeys_m = next_mset($this.$_usedKeys_m, $this.$_usedKeys_m.length);
    					if($this.$_usedKeys_m == false) {
    						$this.$_usedKeys_m = array_keys($this.$_subNodes);
    					}
    					$_subNodes_m = sort_arr_arr($this.$_subNodes, $this.$_usedKeys_m);
    				}
                    $_subNodes_m.forEach(function($item, $i, $arr) {
                        if($result) {
                            $result += '' + $this.$_separator;
                        }
                        $result += '' + $item.get_text($rand);
                    });
                    break;
                case 'series':
                    $this.$_subNodes.forEach(function($item, $i, $arr) {
                        $result += '' + $item.get_text($rand);
                    });
                    break;
                default:
                    $result = $this.$_str;
    		}
    		//$result = $result.trim();
            $result = $result.replace(new RegExp('\\s+', 'g'), ' ');
            $result = $result.replace(' ,', ',');
            $result = $result.replace(' .', '.');
            $result = $result.replace(' !', '!');
            $result = $result.replace(' ?', '?');
            return $result;
        }
    
        $this.num_variant = function() {
            var $result = 1;
            switch ($this.$_type) {
                case 'synonyms':
                    $result = 0;
                    $this.$_subNodes.forEach(function($item, $i, $arr) {
                        $result += $item.num_variant();
                    });
                    break;
                case 'mixing':
                    for (var $i=2, $kol=$this.$_subNodes.length; $i<=$kol; ++$i) {
                        $result *= $i;
                    }
                    $this.$_subNodes.forEach(function($item, $i, $arr) {
                        $result *= $item.num_variant();
                    });
                    break;
                case 'series':
                   $this.$_subNodes.forEach(function($item, $i, $arr) {
                        $result *= $item.num_variant();
                    });
                    break;
            }
            return $result;
        }
    
        $this.concat = function($str) {
            $str = String($str);
            if ($this.$_isSeparator) {
                $this.$_separator += $str;
                return $this;
            }
            if ('string' == $this.$_type) {
                $this.$_str += $str;
                return $this;
            }
            $currentNode = new TextRandomizator_Node($this);
            $currentNode.set_type('string');
            return $currentNode.concat($str);
        }
    
        $this.set_type = function ($type) {
            switch (String($type)) {
                case 'string':
                    $this.$_type = 'string';
                    break;
                case 'synonyms':
                    $this.$_type = 'synonyms';
                    break;
                case 'series':
                    $this.$_type = 'series';
                    break;
                default:
                    $this.$_type = 'mixing';
            }
        }
    
        $this.get = function($var) {
            $var = $var.toLowerCase();
            switch (String($var)) {
                case 'isseparator':
                    return $this.$_isSeparator;
                    break;
                case 'parent':
                    return $this.$_parent;
                    break;
                case 'type':
                    return $this.$_type;
                    break;
                default:
                    return null;
            }
        }
    
        $this.set = function($var, $value) {
            $var = $var.toLowerCase();
            switch (String($var)) {
                case 'isseparator':
                    $this.$_isSeparator = $value;
            }
        }
    }
    
    TextRandomizator = function($text) {
    	$text = (typeof $text !== 'undefined') ? $text : '';
    	var $text = String($text);
    	var $match = [];
    	var $this = this;
    	$this.$_tree = null;
    	$this.$_text = $text;
    	$this.$_tree = new TextRandomizator_Node();
    	var regexp_str ='\\\\\\\\|\\\\\[|\\\\\]|\\\\\\{|\\\\\\}|\\\\\\+|\\\\\\||\[\\+|\\+|\\{|\\}|\[|\]|\\||[^\\\\\\+\\{\\}[\]\\|]+';
    	var $regexp = new RegExp(regexp_str, '');
            $currentNode = $this.$_tree;
            $currentNode = new TextRandomizator_Node($currentNode);
            $currentNode.set_type('series');
            $currentNode = $currentNode.concat('');
    		//while(($match = /\\\\|\\[|\\]|\\\{|\\\}|\\\+|\\\||[\+|\+|\{|\}|[|]|\||[^\\\+\{\}[]\|]+/.exec($text)) != null) {
    		while(($match =  $regexp.exec($text)) != null) {
    			switch ($match[0]) {
    				case '\\\\':
    				case '\\':
    					$currentNode = $currentNode.concat('\\');
    					break;
    				case '\\+':
    					$currentNode = $currentNode.concat('+');
    					break;
    				case '\\{':
    					$currentNode = $currentNode.concat('{');
    					break;
    				case '\\}':
    					$currentNode = $currentNode.concat('}');
    					break;
    				case '\[':
    					$currentNode = $currentNode.concat('[');
    					break;
    				case '\]':
    					$currentNode = $currentNode.concat(']');
    					break;
    				case '\\|':
    					$currentNode = $currentNode.concat('|');
    					break;
    				case '[+':
    					if('string' == $currentNode.get('type')) {
    						$currentNode = new TextRandomizator_Node($currentNode.get('parent'));
    					} else {
    						$currentNode = new TextRandomizator_Node($currentNode);
    					}
    					$currentNode.set('isSeparator', true);
    					break;
    				case '+':
    					if ($currentNode.get('isSeparator') == true) {
    						$currentNode.set('isSeparator', false);
    						$currentNode = new TextRandomizator_Node($currentNode);
    						$currentNode.set_type('series');
    						$currentNode = $currentNode.concat('');
    					} else {
    						$currentNode = $currentNode.concat('+');
    					}
    					break;
    				case '{':
    					if ('string' == $currentNode.get('type')) {
    						$currentNode = new TextRandomizator_Node($currentNode.get('parent'));
    					} else {
    						$currentNode = new TextRandomizator_Node($currentNode);
    					}
    					$currentNode.set_type('synonyms');
    					$currentNode = new TextRandomizator_Node($currentNode);
    					$currentNode.set_type('series');
    					$currentNode = $currentNode.concat('');
    					break;
    				case '}':
    					var $is = $currentNode.get('parent').get('parent');
    					if ($is && 'synonyms' == $is.get('type')) {
    						$currentNode = $is.get('parent');
    						$currentNode = $currentNode.concat('');
    					} else {
    						$currentNode = $currentNode.concat('}');
    					}
    					break;
    				case '[':
    					if ('string' == $currentNode.get('type')) {
    						$currentNode = new TextRandomizator_Node($currentNode.get('parent'));
    					} else {
    						$currentNode = new TextRandomizator_Node($currentNode);
    					}
    					$currentNode = new TextRandomizator_Node($currentNode);
    					$currentNode.set_type('series');
    					$currentNode = $currentNode.concat('');
    					break;
    				case ']':
    					var $is = $currentNode.get('parent').get('parent');
    					if ($is && 'mixing' == $is.get('type') && $is.get('parent')) {
    						$currentNode = $is.get('parent');
    						$currentNode = $currentNode.concat('');
    					} else {
    						$currentNode = $currentNode.concat(']');
    					}
    					break;
    				case '|':
    					var $is = $currentNode.get('parent');
    					if ($is && 'series' == $is.get('type')) {
    						$currentNode = $is.get('parent');
    						$currentNode = new TextRandomizator_Node($currentNode);
    						$currentNode.set_type('series');
    						$currentNode = $currentNode.concat('');
    					} else {
    						$currentNode = $currentNode.concat('|');
    					}
    					break;
    				default:
    					$currentNode = $currentNode.concat($match[0]);
    			}
    			$text = $text.substr($match[0].length);
    		}
    		
    	$this.get_text = function($rand) {
    		return $this.$_tree.get_text($rand);
    	}
    
    	$this.num_variant = function() {
    		return $this.$_tree.num_variant();
    	}
    }
    
    var rm_text = new TextRandomizator([[TEXT]])
    var rm_text_random = true
    [[SPINTAX_TEXT]] = rm_text.get_text(rm_text_random)
    

    Вот тестовый скрипт для наглядности.

  • Давненько сюда ни кто ни чего новевнького не скидывал. Не помню, кто на форуме спрашивал, можно ли видоизменить лог, чтобы убрать вывод id действия например:
    0_1547309292653_6b06f535-97ea-4463-80d6-9e0244581ec7-изображение.png
    Для этого нужно переопределить функцию log, к сожалению сама функция лога находится в C++ коде и немного изменить её не получится, но можно воспользоваться функцией log_html()


    Вдруг кто не в курсе, переопределять функцию нужно в действии "выполнить код". Отображение действия изменится только после переопределения, то есть если нужно изменить вывод всех действий "лог", значит выполнять код нужно в самом начале скрипта.


    Лог без id действия 0_1547310031022_50372e75-1923-450a-a269-227f6d8cabd7-изображение.png

    //здесь могла быть ваша реклама :D
    function log(text) {
        var tm = new Date();
        var h = tm.getHours();
        var m = tm.getMinutes();
        var s = tm.getSeconds();
        if (h < 10) h = "0" + h;
        if (m < 10) m = "0" + m;
        if (s < 10) s = "0" + s;
        var time_ = "[" + h + ":" + m + ":" + s + "]"
        Logger.WriteHtml("<span style='color:#FFFFFF'>" + time_ + " Поток№ " + thread_number() + ": " + text + "</span>", time_ + " Поток№ " + thread_number() + ": " + text);
    }
    

    Лог без времени 0_1547310211630_d5a16a74-acee-4cf4-8f11-3d52707d4832-изображение.png

    //здесь могла быть ваша реклама :)
    function log(text) {
        Logger.WriteHtml("<span style='color:#FFFFFF'>Поток №" + thread_number() + " : " + text + "</span>", "Поток №" + thread_number() + " : " + text);
    }
    

    Лог без номера потока 0_1547310328436_1ab2e055-5aae-44e7-9911-757bac1ea752-изображение.png

    //здесь могла быть ваша реклама :)
    function log(text) {
        Logger.WriteHtml("<span style='color:#FFFFFF'>" + text + "</span>", text);
    }
    

    Лог без текста 0_1547310407603_3f7fe19a-d487-4297-b2ad-02a34d7f3733-изображение.png
    На случай если нужно программно отключить вывод сообщений в лог.

    //здесь могла быть ваша реклама :)
    function log(text) {}
    

    Вот тестовый скрипт для примера.

  • Для читабельности созданной в BAS конструкции разработчик рекомендует использовать функции. И отделять таким образом логические разделы скрипта.
    Однако у этого метода есть свои недостатки (пусть кому-то они и покажутся мелочными):

    1. Если следовать рекомендациям разраба, многие функции будут использованы лишь один раз, что противоречит общей идеологии функций в программировании. Они просто будут захламлять список функций и усложнят поиск тех, которые используются в скрипте по нескольку раз.
    2. При копировании функций из одного скрипта в другой, необходимо предварительно объявить функцию. А лучше - объявить, вызвать и скопировать все действия. Встречал ошибки при несоблюдении подобной последовательности (возможно из-за кривизны рук).

    Для решения задачи из п.2 применил простой и доступный всем метод:
    Разделение логических разделов скрипта через условный оператор IF и единичку в условиии с описанием раздела. Увидев скриншот сразу станет понятнее:
    0_1547448550531_d7eefa61-6657-4f0f-a244-3005b4cbdac4-image.png
    После добавления функционала сворачивания вложенных конструкций стало совсем удобно. При необходимости каждый раздел разворачивается и нужные данные редактируются. Для пущей красоты можно раскрасить "разделы".
    С таким разделением можно не боясь проблем копировать готовые конструкции из одного скрипта в другой. В приведенном скриншоте каждый из разделов создавался отдельно, каждый в автономном скрипте.

    Конечно же у этого метода есть недостатки связанные исключительно с отсутствием у них возможностей функций, а именно:

    1. Удалив конструкцию, она пропадет из скрипта навсегда, тогда как при использовании функций вложенные действия остаются объявленными и их можно снова вызвать.
    2. Не получится использовать рекурсию. Частично заменил метками. Использовать их рекомендую только в самых простых конструкциях.
    3. Если очень хочется запустить часть скрипта в несколько потоков, всё-таки придется использовать функции =)

    Можно использовать такой метод для многократного повторения однотипных действий в скрипте. Аргументов у функций в BAS по прежнему нет. Так что можно как при использовании функций, объявить или присвоить значение какой-либо переменной, которая будет использоваться уже внутри конструкции. Однако следует помнить, что вновь добавленные в конструкцию экшны не будут добавлены в скопированные. Так что тут удобство сомнительно. Тут уж на вкус, цвет и внимательность.

    Оперировать кубиками в таком скрипте намного удобнее, чем в функциональном. Не нужно искать нужную функцию в списке. К тому же всегда видно, что и где будет использоваться.

    Может уже было. Может кому-то бесполезно. Жду факелы =)

  • Есть ещё одна вещь, ради которой я не хочу создавать отдельную тему. Но вряд ли её кто-нибудь заметил.

    Это появление плагина Spoiler на форуме. Для создания спойлера можно воспользоваться кнопочкой на панели:
    0_1547467062558_fb8ed0dd-f7ab-47f4-8cb3-2ca7567e1b56-изображение.png

    После нажатия появится код

    
    
    
    

    Который на форуме будет выглядить вот так:
    0_1547467243595_06a63b02-49f5-49fb-bc22-7247bafd11e7-изображение.png
    0_1547467275803_2828136c-fcc5-4391-801a-4d85131e3a8b-изображение.png



    Важные момент в переопределении функций BAS, выполнять код нужно для каждого потока.

    0_1547467511179_4fff101c-69dc-483a-9eec-9a158b35ff9a-изображение.png

    Вот тестовый скрипт


  • @fox Как получить ID действия?

  • @yumilen как вариант придумай свои для лога

  • @gamid В смысле...?
    Если в ручную вводить, то лучше тогда копировать ID экшена, в котором производится вызов функции и передать его аргументом (в принципе, как вариант). Но, тут есть одно неудобство. При перемещении блока его айдишник изменяется, т.е, каждый раз желательно менять значение аргумента вручную.
    Я надеялся, что, может, есть какая функция или переменная, которая уже в себе имеет значение айдишника текущего экшена...

  • @yumilen для чего тебе id действия что ты с ним дальше хочешь сделать?

  • @gamid Лог часто является точкой обозначения каких-то действий или данных, поэтому айдишник лога часто используется для быстрого перемещения по скрипту

  • @yumilen В общем, чисто случайно нашел ответ но свой вопрос. Берите, кому надо
    ScriptWorker.GetCurrentAction() - возвращает ID текущего экшина

  • @fox Немного пошаманил тут над вашими сорсами и написал универсальный log_html()
    Функция, также, как и обычный log() выводит айдишник экшина с той лишь разницей, что он не кликабельный.
    В общем, пользуйтесь, кому надо:

    /** _LogHTML()
     * 
     * @param [mix] text - text to log
     * @param [string] color - text color
     * @param [string|Array|Object] define - print parameters
     *  Empty define print all data
     *  [string] ('id, time, thread'), empty string, print only text
     *  [Array] (['id', 'time', 'thread']), empty array, print only text
     *  [Object] ({id: true, time: true, thread: true}), empty object, print only text
     *    @example ({id: false, time: false, thread: false} == {}),
     *    @example ({id: true, time: false, thread: false} == {id: true})
     */
    function _LogHTML(text, color, define){
        var id, time, thread, logHtml;
    
        define = (typeof define == 'string') ? define.split(/[\s,.|:;]+/g) : define;
        if(typeof define === 'object' && define !== null){
            if(Array.isArray(define)){
                id = define.indexOf('id') > -1;
                time = define.indexOf('time') > -1;
                thread = define.indexOf('thread') > -1;
            }
            else{
                id = define.id == true;
                time = define.time == true;
                thread = define.thread == true;
            }
        }
        else id = time = thread = true;
        id = id ? '<span style="color: grey">[' + ScriptWorker.GetCurrentAction() + ']</span>' : '';
        time = time ? ' ' + getTime() : '';
        thread =  thread ? ' Поток №' + thread_number() : '';
    
        logHtml = (id || time || thread) ? id + '<span style="color: white">' + time + thread + ' : </span>' : '';
        logHtml += '<span style="color:' + (color ? color : 'white') + '">' + text + '</span>';
    
    	function getTime(){
    		var checkTime = function(i){ return (i < 10) ? "0" + i : i; };
    		var d = new Date();
    		var hh = checkTime(d.getHours());
    		var mm = checkTime(d.getMinutes());
    		var ss = checkTime(d.getSeconds());	
    		return '[' + hh + ':' + mm + ':' + ss + ']';
    	};
    
    	Logger.WriteHtml(logHtml, text);
    }
    
  • @yumilen said in Лайфхаки BAS:

    @fox Немного пошаманил тут над вашими сорсами и написал универсальный log_html()

    Интересный вариант, редко на форуме встретишь красивый, качественный код.


    Только в файле лога будет неразбериха:
    0_1547930361581_9e4c6ffb-dc44-438d-beeb-59f084f4a1f7-изображение.png


    ни каких опозновательных данных:
    0_1547930421177_888e60ab-be85-46b5-823e-ebff4c3472e0-изображение.png

    Потому что в функции log_html() два атрибута:

    log_html("<span style='color:yellow'>ТЕКСТ который отображается в логе</span>","ТЕКСТ который записывается в файл лога")
    

    а вы записываете в лог только текст:

    Logger.WriteHtml(logHtml, text);
    

    Функция, также, как и обычный log() выводит айдишник экшина с той лишь разницей, что он не кликабельный.

    Чтобы id был кликабельным, можно указать на него ссылку:

    log_html("<a href='action://action366852852' style='color:gray;'>[366852852]</a>")
    

    Вот версия вашей функции с кликабельным id и обычной информацией в текстовом логе:

    /** _LogHTML()
     * 
     * @param [mix] text - text to log
     * @param [string] color - text color
     * @param [string|Array|Object] define - print parameters
     *  Empty define print all data
     *  [strijng] ('id, time, thread'), empty string, print only text
     *  [Array] (['id', 'time', 'thread']), empty array, print only text
     *  [Object] ({id: true, time: true, thread: true}), empty object, print only text
     *    @example ({id: false, time: false, thread: false} == {}),
     *    @example ({id: true, time: false, thread: false} == {id: true})
     */
    function _LogHTML(text, color, define){
        var id, time, thread, logHtml, textLog;
    
        define = (typeof define == 'string') ? define.split(/[\s,.|:;]+/g) : define;
        if(typeof define === 'object' && define !== null){
            if(Array.isArray(define)){
                id = define.indexOf('id') > -1;
                time = define.indexOf('time') > -1;
                thread = define.indexOf('thread') > -1;
            }
            else{
                id = define.id == true;
                time = define.time == true;
                thread = define.thread == true;
            }
        }
        else id = time = thread = true;
        id = id ? '<a href="action://action' + ScriptWorker.GetCurrentAction() + '" style="color:gray;">[' + ScriptWorker.GetCurrentAction() + ']</a>' : '';
        time = time ? ' ' + getTime() : '';
        thread =  thread ? ' Поток №' + thread_number() : '';
    
        logHtml = (id || time || thread) ? id + '<span style="color: white">' + time + thread + ' : </span>' : '';
        logHtml += '<span style="color:' + (color ? color : 'white') + '">' + text + '</span>';
    
        textLog = '[' + ScriptWorker.GetCurrentAction() + ']' + time + thread + ' : ' + text
    
    	function getTime(){
    		var checkTime = function(i){ return (i < 10) ? "0" + i : i; };
    		var d = new Date();
    		var hh = checkTime(d.getHours());
    		var mm = checkTime(d.getMinutes());
    		var ss = checkTime(d.getSeconds());	
    		return '[' + hh + ':' + mm + ':' + ss + ']';
    	};
    
    	Logger.WriteHtml(logHtml, textLog);
    }
    

    0_1547932097727_e6ea81b1-4225-443d-831c-e98a69df1a39-изображение.png


    0_1547932125168_2ef32fc0-f931-42d8-9f35-a34e32806826-изображение.png


    Вот тестовый скрипт

  • @fox Да, спасибо. Не знал как сделать кликабельность, а с выводом лога в файл не заморачивался, поскольку редко использую.
    Общими усилиями функция доведена до нормального рабочего состояния и это хорошо.
    Не плохо было бы ее еще замостырить в какой-нибудь экшин с соответствующими полями и чеками, а если б еще какой Colorpicker, то вообще было бы супер, но я еще пока толком не разобрался с разработкой модулей, хоть и имею общее представление и при сильном желании мог бы упаковать, но, это, пока, не в приоритете.
    Еще, интересно, возможно ли, в файле, вместо стандартного black и red указывать значение параметра функции color?

  • @fox И еще, на счет кликабельности...
    Если бы разработчик увеличил время подсветки экшина после клика, скажем, так до 3-х секунд, то было бы лучше, а то, часто, пока, после клика перейду с одного окна в другое, то подсветка исчезает.
    Естественно, эта проблема возникает, когда при записи браузер используется в полноэкранном режиме, но я, например, обычно так и использую

  • @xclsv
    Спасибо за свой метод. Как раз пригоден из-за первого пункта для меня.
    Так же, если вы хотите спрятать свой код, но не хотите, чтобы при компиляции он сработал, то можете заюзать заведомо невыполнимые условия. Например:
    If 0>1 или while 0>1
    А внутри запихнуть конструкцию, которую выполнять не нужно.

    Что касается невозможности использовать функцию из-за того, что случаи могут быть разными, то тут необходимо создавать переменные входные параметры, которые можно задавать перед началом функции. Я раньше делал так.

  • @olegtut said in Лайфхаки BAS:

    @xclsv
    Спасибо за свой метод. Как раз пригоден из-за первого пункта для меня.
    Так же, если вы хотите спрятать свой код, но не хотите, чтобы при компиляции он сработал, то можете заюзать заведомо невыполнимые условия. Например:
    If 0>1 или while 0>1
    А внутри запихнуть конструкцию, которую выполнять не нужно.

    Что касается невозможности использовать функцию из-за того, что случаи могут быть разными, то тут необходимо создавать переменные входные параметры, которые можно задавать перед началом функции. Я раньше делал так.

    if и while можно писать со значением просто 0, чтобы они не выполнялись.

  • @fox
    Да, но мне этот метод не особо нравится. Я же люблю прослеживать семантическую логику везде. Мне нравится именно читать код. Ведь читая такую конструкцию, получаешь: "Если ноль, то", а это математически меня запутает :D

  • @olegtut
    С точки зрения мат.логики, If 0 также правильно, как if 0>1.
    Операции внутри оператора условия выполняются тогда и только тогда, когда выражение истинно. В данном случае 0 преобразуется к false, то есть не к истине, а любое другое значение преобразуется к true. Если внутри выражения нет операторов, то это всё равно выражение.
    Но согласен с тем, что человеческой логике это противоречит =)

  • @olegtut said in Лайфхаки BAS:

    @fox
    Да, но мне этот метод не особо нравится. Я же люблю прослеживать семантическую логику везде. Мне нравится именно читать код. Ведь читая такую конструкцию, получаешь: "Если ноль, то", а это математически меня запутает :D

    Это так, но это плохой тон. Можно вообще писать код в стиле обсуфикатора и он будет работать. Только Вас уволят за это, если работаете в компании )

  • Думаю очень годный лайфхак:

    Чтобы убрать весь звук со страниц из скриптов BAS нужно добавить в файл chrome_command_line.txt строку

    --mute-audio
    

    upd: Пользователь @Mic предложил альтернативный вариант отключения звука
    https://community.bablosoft.com/topic/11145/bas-палится/24

    upd2: Начиная с 24 версии BAS звук можно отключить в настройках профиля браузера

    chrome://settings/content/sound
    

    тестовый скрипт: 1934.xml