Почему скрипт не работает на https-страничках?
http://edem4u.narod2.ru/other/new1.html тут работает, а тут Linky :: Дополнения Firefox в первом комменте слово pastebin.com не превращает в ссылку. Самое интересное, и на этой страничке как-то оно у меня работало, но вот почему перестало?
http://www.mozdev.org/source/browse/pre … ttolink.js Revision 1.9
Короче, в Scriptish код такой
// ==UserScript== // @name Text to Link // @description Change URIs and non-URIs written as text into links. // @include * // ==/UserScript== // This script changes URIs and non-URIs written as text into links. /* * URI - RFC 2396 */ var OFFICIAL_SCHEME = "(aaas|aaa|acap|afs|cap|cid|crid|data|dav|dict|dns|dtn|fax|file|ftp|gopher|go|h323|https|http|iax2|icap|imap|im|info|ipp|iris\\.beep|iris\\.lwz|iris\\.xpcs|iris\\.xpc|iris|ldap|mailserver|mailto|mid|modem|msrps|msrp|mtqp|mupdate|news|nfs|nntp|opaquelocktoken|pack|pop|pres|prospero|rtsp|service|shttp|sips|sip|snmp|soap\\.beeps|soap\\.beep|tag|telnet|tel|tftp|thismessage|tip|tn3270|tv|urn|vemmi|wais|xmlrpc\\.beeps|xmlrpc\\.beep|xmpp|z39\\.50r|z39\\.50s)"; var UNOFFICIAL_SCHEME = "(about|addbook|afp|aim|applescript|bcp|bk|btspp|bzr|callto|castanet|cdv|cel|chrome|chttp|cvs|daap|daytime|device|doi|ed2k|eid|enp|feed|finger|fish|freenet|gg|git|gizmoproject|gsiftp|gsm-sms|h324|hdl|hnews|httpsy|iax2|iioploc|ilu|IOR|ircs|irc|itms|jar|javascript|jdbc|klik|kn|lastfm|ldaps|lifn|livescript|lrq|magnet|mailbox|man|md5|mms|mocha|moz-abmdbdirectory|msnim|myim|notes|nsfw|oai|pcast|phone|php|pop3|printer|psyc|pyimp|rdar|res|rsync|rvp|rwhois|rx|sdp|secondlife|sftp|skype|smb|sms|snews|soap\\.udp|soldat|ssh|steam|SubEthaEdit|svn\\+ssh|svn|t120|tann|tcp|telephone|txmt|uddi|unreal|ut2004|uuid|videotex|view-source|vzochat|wcap|webcal|whodp|whois\\+\\+|whois|wpn|wtai|xeerkat|xfire|ymsgr)"; var SCHEME = "(" + OFFICIAL_SCHEME + "|" + UNOFFICIAL_SCHEME + "):"; var IP_LITERAL = "(\\[((([a-f\\d]{1,4}:){6}([a-f\\d]{1,4}:[a-f\\d]{1,4})|((([1-9]?\\d|1\\d{2}|2[0-4]\\d|25[0-5])\\.){3}([1-9]?\\d|1\\d{2}|2[0-4]\\d|25[0-5])))|(::([a-f\\d]{1,4}:){5}([a-f\\d]{1,4}:[a-f\\d]{1,4})|((([1-9]?\\d|1\\d{2}|2[0-4]\\d|25[0-5])\\.){3}([1-9]?\\d|1\\d{2}|2[0-4]\\d|25[0-5])))|(([a-f\\d]{1,4})?::([a-f\\d]{1,4}:){4}([a-f\\d]{1,4}:[a-f\\d]{1,4})|((([1-9]?\\d|1\\d{2}|2[0-4]\\d|25[0-5])\\.){3}([1-9]?\\d|1\\d{2}|2[0-4]\\d|25[0-5])))|((([a-f\\d]{1,4}:)?[a-f\\d]{1,4})?::([a-f\\d]{1,4}:){3}([a-f\\d]{1,4}:[a-f\\d]{1,4})|((([1-9]?\\d|1\\d{2}|2[0-4]\\d|25[0-5])\\.){3}([1-9]?\\d|1\\d{2}|2[0-4]\\d|25[0-5])))|(((([a-f\\d]{1,4}:){1,2})?[a-f\\d]{1,4})?::([a-f\\d]{1,4}:){2}([a-f\\d]{1,4}:[a-f\\d]{1,4})|((([1-9]?\\d|1\\d{2}|2[0-4]\\d|25[0-5])\\.){3}([1-9]?\\d|1\\d{2}|2[0-4]\\d|25[0-5])))|(((([a-f\\d]{1,4}:){1,3})?[a-f\\d]{1,4})?::([a-f\\d]{1,4}:[a-f\\d]{1,4})|((([1-9]?\\d|1\\d{2}|2[0-4]\\d|25[0-5])\\.){3}([1-9]?\\d|1\\d{2}|2[0-4]\\d|25[0-5])))|(((([a-f\\d]{1,4}:){1,4})?[a-f\\d]{1,4})?::([a-f\\d]{1,4}:[a-f\\d]{1,4})|((([1-9]?\\d|1\\d{2}|2[0-4]\\d|25[0-5])\\.){3}([1-9]?\\d|1\\d{2}|2[0-4]\\d|25[0-5])))|(((([a-f\\d]{1,4}:){1,5})?[a-f\\d]{1,4})?::[a-f\\d]{1,4})|(((([a-f\\d]{1,4}:){1,6})?[a-f\\d]{1,4})?::))\\])"; var IPV4ADDRESS = "((([1-9]?\\d|1\\d{2}|2[0-4]\\d|25[0-5])\\.){3}([1-9]?\\d|1\\d{2}|2[0-4]\\d|25[0-5]))"; var IP = "(" + IPV4ADDRESS + "|" + IP_LITERAL + ")"; var HIER_PART = "(((\\/\\/)?((([\\w-.~!$&'()*+,;=:]|%[a-f\\d]{2})*@)?(" + IP + "|([\\w-.~!$&'()*+,;=]|%[a-f\\d]{2})*)(:\\d+)?))([\\w-.~!$&'()*+,;=:@/]|%[a-f\\d]{2})*)"; var QUERY_FRAGMENT = "([&?]([\\w-.~!$&'()*+,;=:@/?]|%[a-f\\d]{2})*)?(#([\\w-.~!$&'()*+,;=:@/?]|%[a-f\\d]{2})*)?"; var URI1 = "(" + SCHEME + HIER_PART + QUERY_FRAGMENT + ")"; /* * URI - NO SCHEME, SPECIFIC REG-NAME AND TOP-LEVEL DOMAIN */ var AUTHORITY = "([a-z\\d]([\\w-.~!$&*+,=:]|%[a-f\\d]{2})*@)?"; var REG_NAME = "([a-z\\d]([\\w-~!$&*+,=@]|%[a-f\\d]{2})+\\.)+"; var TLD = "(ac|ad|aero|ae|af|ag|ai|al|am|an|ao|aq|arpa|ar|asia|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|biz|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|cat|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|coop|com|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|edu|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gov|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|info|int|in|io|iq|ir|is|it|je|jm|jobs|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mil|mk|ml|mm|mn|mobi|mo|mp|mq|mr|ms|mt|museum|mu|mv|mw|mx|my|mz|name|na|nc|net|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|org|pa|pe|pf|pg|ph|pk|pl|pm|pn|pro|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tel|tf|tg|th|tj|tk|tl|tm|tn|to|tp|travel|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|xn--0zwm56d|xn--11b5bs3a9aj6g|xn--80akhbyknj4f|xn--9t4b11yi5a|xn--deba0ad|xn--g6w251d|xn--hgbk6aj7f53bba|xn--hlcj6aya9esc7a|xn--jxalpdlp|xn--kgbechtv|xn--zckzah|ye|yt|yu|za|zm|zw)"; var PATH = "([;/]([\\w-.~!$&'()*+,;=:@/]|%[a-f\\d]{2})*)?"; var URI2 = "(" + AUTHORITY + "(" + IP + "|(" + REG_NAME + TLD + "\\b))(:\\d+)?" + PATH + QUERY_FRAGMENT + ")"; /* * TELEPHONE */ var TEL = "((\\+[-.()\\d]*\\d[-.()\\d]*((;[a-z\\d-]+(=([\\w\\[\\]/:&+$-.!~*'()]|%[a-f\\d]{2})+)?)|(;ext=[-.()\\d]+)|(;isub=([\\w;/?:@&=+$,-.!~*'()]|%[a-f\\d]{2})+))*)|([a-f\\d*#-.()]*[a-f\\d*#][a-f\\d*#-.()]*((;[a-z\\d-]+(=(\\w[\\[\\]/:&+$-.!~*'()]|%[a-f\\d]{2})+)?)|(;ext=[-.()\\d]+)|(;isub=([\\w;/?:@&=+$,-.!~*'()]|%[a-f\\d]{2})+))*;phone-context=((([a-z\\d]|([a-z\\d][a-z\\d-]*[a-z\\d]\\.))*([a-z]|([a-z][a-z\\d-]*[a-z\\d]\\.?)))|(\\+[-.()\\d]*\\d[-.()\\d]*))((;[a-z\\d-]+(=([\\w\\[\\]/:&+$-.!~*'()]|%[a-f\\d]{2})+)?)|(;ext=[-.()\\d]+)|(;isub=([\\w;/?:@&=+$,-.!~*'()]|%[a-f\\d]{2})+))*))"; /* * URI REGULAR EXPRESSION */ var uriRegExp = new RegExp(URI1 + "|" + URI2 + "|" + TEL, "i"); /* * UNWANTED REGULAR EXPRESSION */ var unwantedRegExp = new RegExp("^((" + SCHEME + "?(\\/*([-.~!$&'()*+,;=:\\d]{1,3})?))|(\\+[-.()\\d]{1,2}(\\D[-.()\\d]{1,2}[-.()]*)?)|(\\[?(\\d+\\.){3}\\d+(\\/+\\d+)?\\]?))$", "i"); // SCHEME-ONLY WITH SOME SEPECIAL SYMBOLS OR SOME (SMALL) PHONENUMBER OR IP-ONLY WITH OPTIONAL DIGIT PATH /* * MAILTO REGULAR EXPRESSION */ var MAILTO = "((([\\w-.~]|%[a-f\\d]{2})+@([\\w-.~,]|%[a-f\\d]{2})+)*([&?]([\\w-.~=@]|%[a-f\\d]{2})*)*)"; var mailtoRegExp = new RegExp("^" + MAILTO + "$", "i"); /* * MATCH TYPES */ var UNKNOWN = 0; var URI_HAS_SCHEME = 1; var URI_NO_SCHEME = 2; var TEL_NO_SCHEME = 3; function removeUnwanted(text) { if (/[\-~=_,;:!?.'()\[@$*&#+]/.test(text.charAt(text.length - 1))) { return removeUnwanted(text.substring(0, text.length - 1)); } var index = text.search(/</); // < return index > -1 ? removeUnwanted(text.substring(0, index)) : text; } /* * MAXIMUM LENGTH OF LEFT STRING */ var MAX_LEFT_STR = "&laquo;".length; function fixBalanced(text, leftStr) { var index = -1; switch (leftStr.charAt(leftStr.length - 1)) { case "`": index = text.indexOf("'"); break; // ` ' case "'": index = text.indexOf("'"); break; // ' ' case "(": index = text.indexOf(")"); break; // ( ) case "[": index = text.indexOf("]"); break; // [ ] } if (index > -1) { return text.substring(0, index); } leftStr = leftStr.substring(leftStr.length - MAX_LEFT_STR); if (/<$/.test(leftStr)) { index = text.indexOf(">"); } // < > else { if (/&lt;$/.test(leftStr)) { index = text.indexOf("&gt;"); } // < > else { if (/&#60;$/.test(leftStr)) { index = text.indexOf("&#62;"); } // < > else { if (/&quot;$/.test(leftStr)) { index = text.indexOf("&quot;"); } // " " else { if (/&#34;$/.test(leftStr)) { index = text.indexOf("&#34;"); } // " " else { if (/&#96;$/.test(leftStr)) { index = text.indexOf("'"); } // ` ' else { if (/&laquo;$/.test(leftStr)) { index = text.indexOf("&raquo;"); } // « » else { if (/&#171;$/.test(leftStr)) { index = text.indexOf("&#187;"); } // « » }}}}}}} return index > -1 ? text.substring(0, index) : text; } function textToLink(nodeValue) { var changesMade = false; var matches = null; var text = null; var matchType = 0; var index = null; var leftStr = null; var link = null; var anchor = null; var fromIndex = 0; nodeValue = nodeValue.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">"); while ((matches = nodeValue.substring(fromIndex).match(uriRegExp)) !== null) { text = matches[0]; index = nodeValue.indexOf(text, fromIndex); leftStr = nodeValue.substring(0, index); text = fixBalanced(text, leftStr); text = removeUnwanted(text); fromIndex = index + text.length; matchType = matches[1] !== undefined ? URI_HAS_SCHEME : matches[93] !== undefined ? URI_NO_SCHEME : matches[182] !== undefined ? TEL_NO_SCHEME : UNKNOWN; if (unwantedRegExp.test(text) || matchType === UNKNOWN) { continue; } //dump("text="+text+"\n"); //for (var i = 1; i < matches.length - 1; i++) { dump("matches["+i+"]="+matches[i]+"\n"); } link = nodeValue.substring(index, index + text.length); switch (matchType) { case URI_HAS_SCHEME: if (/^(aaas?|acap|crid|dict|file|gopher|https?|imap|ldap|nntp|pop|snmp|telnet|wais|z39\.50r|z39\.50s|adiumxtra|afp|aw|bolo|chrome|content|cvs|ed2k|finger|fish|gizmoproject|ircs?|keyparc|lastfm|ldaps|mms|notes|rmi|rsync|secondlife|sftp|sgn|smb|soldat|ssh|svn(\+ssh)?|teamspeak|unreal|ut2004|webcal|wtai|wyciwyg|xri)$/i.test(matches[2]) && matches[7] === undefined) { link = "http://" + link; } break; case URI_NO_SCHEME: // if (/^([äåæöøü]|[:.!?])$/i.test(nodeValue.substring(fromIndex, fromIndex + 1))) { continue; } if (/^[äåæöøü]$/i.test(nodeValue.charAt(fromIndex))) { continue; } if (mailtoRegExp.test(link)) { link = "mailto:" + link; } else { link = "http://" + link; } break; case TEL_NO_SCHEME: link = "tel:" + link; break; default: continue; } anchor = "<a href=\"" + link + "\">" + text + "</a>"; nodeValue = leftStr + anchor + nodeValue.substring(fromIndex); fromIndex = index + anchor.length; changesMade = true; } return changesMade ? nodeValue : null; } function main() { switch (document.contentType) { case "text/html": case "application/xhtml+xml": document.normalize(); var elements = document.evaluate(".//text()[not(ancestor::a) and not(ancestor::button) and not(ancestor::label) and not(ancestor::legend) and not(ancestor::option) and not(ancestor::script) and not(ancestor::select) and not(ancestor::style) and not(ancestor::textarea) and not(ancestor::title)]", document.body, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); if (!elements || elements.snapshotLength === 0) { return; } var element = null; var nodeValue = null; var span = null; for (var i = 0; i < elements.snapshotLength; i++) { element = elements.snapshotItem(i); nodeValue = textToLink(element.nodeValue); if (!nodeValue) { continue; } span = document.createElement("span"); span.innerHTML = nodeValue; element.parentNode.replaceChild(span, element); } break; } } main();
Отсутствует
Мне очень нравится Scriptish, он гораздо удобнее, чем Greasemonkey.
Я полностью перевела на русский язык дополнение Scriptish 0.1.7
http://rghost.ru/37460530
http://www.mediafire.com/?1zpbuz63aqonnzl
Попробуйте, всё ли нормально? Как бы теперь его отправить разработчику дополнения, чтобы включил официально?
А также перевела описание Scriptish (можно добавить в шапку):
Scriptish – менеджер пользовательских скриптов для Firefox.
Лучший движок пользовательских скриптов в Интернете.Scriptish – это форк Greasemonkey, предлагающий:
• Все, что делает Greasemonkey (что на самом деле полезно)
• Обновление: Пользовательские скрипты могут быть обновлены в Scriptish с помощью @updateURL
• Много новых ключей метаданных
• Много новых дополнений к GM_ API
• Высокая производительность: более быстрая и чистая кодовая база, которая использует все то, что могут предложить последние версии Firefox
• Превосходная безопасность: Scriptish обеспечивает функции безопасности, которые вы не найдёте где-либо ещё
• Тестирование: разработчики делают множество тестов, чтобы гарантировать правильное функционирование Scriptish и найти какие-либо ошибки как можно скорее
• Scriptish имеет всё, что и Greasemonkey, а также множество функций, о которых вы можете прочитать на: http://github.com/scriptish/scriptish/wikiПожалуйста, присылайте любые ошибки или пожелания на: http://scriptish.lighthouseapp.com/projects/83146-firefox-extension/
Если у вас есть какие-либо другие вопросы, пожалуйста, присылайте их в список рассылки: http://groups.google.com/group/scriptish
Отсутствует
iHastr
В переведенном вами описании и есть ссылки для связи с разработчиками отправляйте туда. И наверно не стоило самолично вписывать себя в install.rdf, отправте перевод и думаю вас включат в список переводчиков
Отсутствует
В переведенном вами описании и есть ссылки для связи с разработчиками отправляйте туда.
Отправлено в тикеты №607, посмотрим, что из этого получится...
https://scriptish.lighthouseapp.com/projects/83146-firefox-extension/tickets
И наверно не стоило самолично вписывать себя в install.rdf, отправте перевод и думаю вас включат в список переводчиков
Ну я делала для себя, как-то безымянно оставлять не хочется
Отредактировано iHastr (12-04-2012 23:17:12)
Отсутствует
Обновлённая русская версия Scriptish 0.1.7
http://www.mediafire.com/?o4hfxv0vx5xku7d
Небольшие косметические улучшения.
Русский перевод отправлен автору на babelzilla.org
Отсутствует
Scriptish 0.1.8 на страничке автора
http://scriptish.org/news/release/2012/ … eased.html
там же можно посмотреть изменения.
Отсутствует
Scriptish 0.1.8 на страничке автораhttp://scriptish.org/news/release/2012/ … eased.htmlтам же можно посмотреть изменения.
Она и на addons.mozilla.org есть
Scriptish :: Versions :: Дополнения Firefox
Отсутствует
но на addons.mozilla.org загрузить можно только 0.1.7, а там доступна 0.1.8
https://github.com/downloads/scriptish/ … -0.1.8.xpi
Отредактировано AlexCondor (26-09-2012 10:54:59)
Отсутствует
но на addons.mozilla.org загрузить можно только 0.1.7, а там доступна 0.1.8https://github.com/downloads/scriptish/ … -0.1.8.xpi
Отредактировано AlexCondor (Сегодня 10:54:59)
А по ссылке пробовал перейти, что я привёл выше?
Отсутствует
Scriptish обновился до версии 0.1.8
https://addons.mozilla.org/ru/firefox/addon/scriptish/
В настройках добавили вкладку «Синхронизация».
Русский перевод мой официальный.
Отсутствует
Хорошее было расширение.Было для меня.
Пришлось вернуться на GreaseMonkey.
А причина то что Scriptish конфликтует с FireBug.
Причём конфликтует по взрослому.При включённом Scriptish и попытке проанализировать страничку при помощи Firebug, браузер виснет намертво.
Пожирание памяти растёт со скоростью света вплоть до максимума установленного на компьютере.10 секунд и уже 3 гигабайта.Нагрузка проца под 100%.
Как же писать скрипты без FireBug.
Установив GreaseMonkey всё работает нормально.
Ни кто не сталкивался с подобным?
Отсутствует
questman, Как вариант - можно завести отдельный профиль для Firebug
Отсутствует
Можно как-то автоматизировать перенос настроек установленных скриптов из GM в сабж? Или придётся всё ручками перебивать? Речь о тех скриптах, которые поддерживают донастройку в основном через гуй.
Отсутствует
главное что все не заметили в Scriptish!!!
-- это расширение поддерживает кросс-доменную передачу
GM_xmlhttpRequest({})
что дает возможность звпрашивать состояние любого сайта не открывая его, и при этом находиться вне пределов его досегаемость и при этом правильно передавать все кукисы и настройки
я это использую на ЯРу - для получения информации об непрочитаных ответах, находясь в любом месте - инета.
реально эту возможность можно ограничить списком доменов и тогда вы сможете контроллировать доступ
Вообще называть его форком жадной макаки - я бы не стал - реально это расширение возможностей и новые функции.
я им пользуюсь до сих пор
Отредактировано cargan (08-03-2014 10:41:37)
Отсутствует
Я чота совсем запутался. Кто же всё-таки круче: Scriptish или Greasemonkey?
Или уже появилось что-то что круче их вместе взятых? Типа Selenium IDE?
Помогите разобраться: в чём всё-таки лучше писать скрипты для парсинга и преобразования веб-страниц и писать ботов.
Отсутствует
Народ! Те кто юсал и Scriptish и Greasemonkey!
Объясните на пальцах, в чём недостатки и достоинства каждого из этих дополнений Firefox
Отсутствует
Народ! Те кто юсал и Scriptish и Greasemonkey!
Объясните на пальцах, в чём недостатки и достоинства каждого из этих дополнений Firefox
Разница в том что в Scriptish удобнее управление стилями, например кнопка на панели функциональней.
Отсутствует
Kamui
А Scriptish поддерживает объектно-ориентированное программирование?
Если да, то на каких языках?
Вот, к примеру, Selenium IDE поддерживает несколько языков
Отсутствует
Kamui
А Scriptish поддерживает объектно-ориентированное программирование?
Если да, то на каких языках?
Вот, к примеру, Selenium IDE поддерживает несколько языков
Насколько я знаю, он поддерживает только javascript.
Отсутствует
Kamui
Т.е. Вы хотите сказать, что для серьёзной разработки лучше юсать SELENIUM IDE?
Отсутствует
в чём недостатки и достоинства
Скрипты пишутся в основном под Greasemonkey, поэтому иногда могут не работать в Scriptish. Но в Greasemonkey нельзя задать кастомные include/exclude, игнорируя встроенные в скрипт, а в Scriptish можно. На этом, собственно, разница и заканчивается.
Отсутствует
Доктор ТуамОсес, Skeptic
Greasemonkey давно поддерживает Firefox 1.5, и только недавно было принято решение повысить минимальную версию Firefox поддерживает до 3,0, но много старого кода все еще существует, и это дошло до точки, где Greasemonkey необходимости полной реорганизации.
..........
В Scriptish есть все что имеет Greasemonkey , также оно поддерживает сценарии Google Chrome , ...... код является гораздо более организованым, существенно меньше загрузка, что непосредственно влияет на быстродействие!
https://forum.mozilla-russia.org/viewtopic.php?id=46188
Отредактировано Крошка Ру (01-05-2014 16:08:33)
Отсутствует
Доктор ТуамОсес
на самом деле всё печально и там, и там: Scriptish уже около года не обновлялся, а в Greasemonkey присутствует уязвимость, благодаря которой сайты могут делать проверки об установленных у пользователя дополнениях, выполняя проверки существования resource:// объектов, которые используются в очень многих (если не почти во всех) дополнениях. Собственно, чтобы исправить эту уязвимость и создавался Scriptish.
Подробнее.
Рабочий proof of concept, определяющий присутствие работающего Greasemonkey у пользователя.
mzfx
Отсутствует
Scriptish уже около года не обновлялся
iDev.Pi, Scriptish nightly
Отсутствует