Базару 0, инфа добрая. Хотя про аварийные ситуации уже не ваша должна быть проблема... Главное чтобы программа после перезапуска работала стабильно, остальное уж не стоит брать во внимание как по мне. Еще тест на чистую машину тоже хз, обычно софты на дедиках запускают, а там каждый хостинг сам выбирает что блочить и как работать, так что..
Лайфхаки BAS
-
Возможно совсем для новичков, но все же. Для уменьшения количества итоговых действий в скрипте ( когда все отлажено ), можно пойти таким путем.
Кликаем для редактирования простого действия(работа с xpath,регулярками,рэндомом,датой и тд) и копируем его id

далее переходим сюда

нажимаем ctrl+f и вставляем наш id (команда для вставки ctrl+v)
Видим такой текст

нас интересует только все что после section_start и зелёных надписей до section_end
вставляем этот текст в

и таким же образом поступаем с остальными не сложными действиями. Соответсвенно добавляя ВСЕ эти действия в один код.
Итог : количество (элементарных) действий уменьшилось, читаемость повысилась -
Не скажу, кто именно, но кто то на форуме спросил
:D

И я начал смотреть разные gui, для себя нашёл очень интересную nwjs, но о ней в следующий раз. А потом вспомнил, что есть более простые решения этой задачи на VBScript.
Код VBS скрипта :
result = MsgBox ("Fox is a great forum admin?", vbYesNo, "Yes or No?") Select Case result Case vbYes WScript.Echo("yes") Case vbNo WScript.Echo("no") End Selectи код действия "Запустить Процесс":
@echo off @ cscript //Nologo Fox.vbs

Вот тестовый скрипт для наглядности.
-
Расширенный spintax.
Кроме стандартного БАСовского перебора {1|2|3} может менять текст местами, поддерживает любую вложеность.
Вставить в экшн "Выполнить код"/*Спинтакс {текст 1|текст 2|текст 3} - перебор вариантов [текст 1|текст 2|текст 3] - перестановки [+разделитель+текст 1|текст 2|текст 3] - перестановки с разделителем \{ \} \| [ ] \+ \\ - экранизация спецсимволов Поддерживается вложенность команд */ function TextRandomizator_Node($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; } } } function TextRandomizator($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 text_data = [[SPINTAX_TEXT]]; // Ваш текст var rm_text = new TextRandomizator(text_data); var rm_text_random = true; VAR_SPINTAX_TEXT = (rm_text.get_text(rm_text_random));За наводку спасибо @Fox
-
@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 действия например:

Для этого нужно переопределить функцию log, к сожалению сама функция лога находится в C++ коде и немного изменить её не получится, но можно воспользоваться функцией log_html()
Вдруг кто не в курсе, переопределять функцию нужно в действии "выполнить код". Отображение действия изменится только после переопределения, то есть если нужно изменить вывод всех действий "лог", значит выполнять код нужно в самом начале скрипта.
Лог без id действия

//здесь могла быть ваша реклама :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); }
Лог без времени

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

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

На случай если нужно программно отключить вывод сообщений в лог.//здесь могла быть ваша реклама :) function log(text) {}
Вот тестовый скрипт для примера.
-
Для читабельности созданной в BAS конструкции разработчик рекомендует использовать функции. И отделять таким образом логические разделы скрипта.
Однако у этого метода есть свои недостатки (пусть кому-то они и покажутся мелочными):- Если следовать рекомендациям разраба, многие функции будут использованы лишь один раз, что противоречит общей идеологии функций в программировании. Они просто будут захламлять список функций и усложнят поиск тех, которые используются в скрипте по нескольку раз.
- При копировании функций из одного скрипта в другой, необходимо предварительно объявить функцию. А лучше - объявить, вызвать и скопировать все действия. Встречал ошибки при несоблюдении подобной последовательности (возможно из-за кривизны рук).
Для решения задачи из п.2 применил простой и доступный всем метод:
Разделение логических разделов скрипта через условный оператор IF и единичку в условиии с описанием раздела. Увидев скриншот сразу станет понятнее:

После добавления функционала сворачивания вложенных конструкций стало совсем удобно. При необходимости каждый раздел разворачивается и нужные данные редактируются. Для пущей красоты можно раскрасить "разделы".
С таким разделением можно не боясь проблем копировать готовые конструкции из одного скрипта в другой. В приведенном скриншоте каждый из разделов создавался отдельно, каждый в автономном скрипте.Конечно же у этого метода есть недостатки связанные исключительно с отсутствием у них возможностей функций, а именно:
- Удалив конструкцию, она пропадет из скрипта навсегда, тогда как при использовании функций вложенные действия остаются объявленными и их можно снова вызвать.
- Не получится использовать рекурсию. Частично заменил метками. Использовать их рекомендую только в самых простых конструкциях.
- Если очень хочется запустить часть скрипта в несколько потоков, всё-таки придется использовать функции =)
Можно использовать такой метод для многократного повторения однотипных действий в скрипте. Аргументов у функций в BAS по прежнему нет. Так что можно как при использовании функций, объявить или присвоить значение какой-либо переменной, которая будет использоваться уже внутри конструкции. Однако следует помнить, что вновь добавленные в конструкцию экшны не будут добавлены в скопированные. Так что тут удобство сомнительно. Тут уж на вкус, цвет и внимательность.
Оперировать кубиками в таком скрипте намного удобнее, чем в функциональном. Не нужно искать нужную функцию в списке. К тому же всегда видно, что и где будет использоваться.
Может уже было. Может кому-то бесполезно. Жду факелы =)
-
Есть ещё одна вещь, ради которой я не хочу создавать отдельную тему. Но вряд ли её кто-нибудь заметил.
Это появление плагина Spoiler на форуме. Для создания спойлера можно воспользоваться кнопочкой на панели:

После нажатия появится код
Который на форуме будет выглядить вот так:


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

Вот тестовый скрипт
-
@gamid В смысле...?
Если в ручную вводить, то лучше тогда копировать 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()
Интересный вариант, редко на форуме встретишь красивый, качественный код.
Только в файле лога будет неразбериха:

ни каких опозновательных данных:

Потому что в функции 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); }

Вот тестовый скрипт
-
@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, чтобы они не выполнялись.
-
-
Section Rules
Pinned Locked LifeHacks -
Правила Раздела
Pinned Locked LifeHacks -
-