From 2cfb374580119356276dbba1b9b64cdf529a1515 Mon Sep 17 00:00:00 2001 From: Stefan Bohacek Date: Thu, 20 Aug 2020 16:28:01 -0400 Subject: [PATCH] Switched to ScreenshotMachine for page screenshots. --- admin-js/scripts.min.js.map | 2 +- composer.json | 5 +- composer.lock | 55 ++++++++++++--- includes/helpers.php | 101 +++++++++++++++++++++++++-- js/scripts.min.js | 2 +- js/scripts.min.js.map | 2 +- src/admin-scripts/screenshot-tool.js | 61 +++++++++------- 7 files changed, 185 insertions(+), 43 deletions(-) diff --git a/admin-js/scripts.min.js.map b/admin-js/scripts.min.js.map index 264c732..05e75b7 100644 --- a/admin-js/scripts.min.js.map +++ b/admin-js/scripts.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["bot-archive.js","hide-duplicate-posts-menu.js","screenshot-tool.js","show-bot-submission-form-link-admin.js"],"names":["$","archive_select_frame","$archive_btn","$archive_btn_remove","$archive_file_wrapper","$archive_date_wrapper","$archive_date","$output_archive_url","$output_archive_link","$output_archive_filename","on","ev","preventDefault","confirm","val","attr","addClass","wp","media","title","button","text","multiple","attachment","state","get","first","toJSON","console","log","removeClass","url","filename","open","jQuery","window","load","waitForElement","selector","callback","length","setTimeout","$menu_posts","hide","document","$get_screenshot_btn","this","screenshot_btn_txt","html","$screenshot_img","page_url","trim","$screenshot_hint","url_parts","split","download_name","src","download","post","ajaxurl","action","done","data","image_url","alert"],"mappings":"cAAA,SAAYA,GAGV,IASIC,EATAC,EAAeF,EAAE,uBACjBG,EAAsBH,EAAE,0BACxBI,EAAwBJ,EAAE,gCAC1BK,EAAwBL,EAAE,gCAC1BM,EAAgBN,EAAE,wBAElBO,GADgBP,EAAE,wBACIA,EAAE,wBACxBQ,EAAuBR,EAAE,wBACzBS,EAA2BT,EAAE,4BAIjCG,EAAoBO,GAAG,QAAS,SAASC,GAcvC,OAbAA,EAAGC,kBAI4B,IAFFC,QAAQ,8CAGnCP,EAAcQ,IAAI,IAClBP,EAAoBO,IAAI,IACxBL,EAAyBK,IAAI,IAC7BN,EAAqBO,KAAK,OAAQ,KAClCX,EAAsBY,SAAS,UAC/BX,EAAsBW,SAAS,YAG1B,IAGTd,EAAaQ,GAAG,QAAS,SAASC,GAChCA,EAAGC,iBAE0B,MAAxBX,IAKLA,EAAuBgB,GAAGC,MAAM,CAC9BC,MAAO,4BACPC,OAAQ,CACNC,KAAM,iBAERC,UAAU,KAISZ,GAAI,SAAU,WACjC,IAAIa,EAAatB,EAAqBuB,QAAQC,IAAI,aAAaC,QAAQC,SACvEC,QAAQC,IAAIN,GAEZnB,EAAsB0B,YAAY,UAClCzB,EAAsByB,YAAY,UAElCvB,EAAoBO,IAAIS,EAAWQ,KACnCtB,EAAyBK,IAAIS,EAAWS,UACxCxB,EAAqBO,KAAK,OAAQQ,EAAWQ,OAS/C9B,EAAqBgC,SAnEzB,CAqEKC,QCrEL,SAAYlC,GAERA,EAAEmC,QAAQC,KAAK,WACbD,OAAOE,eAAiB,SAASC,EAAUC,GACzC,GAAIvC,EAAEsC,GAAUE,OACdD,QACK,CAGLE,WAAW,WACTN,OAAOE,eAAeC,EAAUC,IAC/B,OAIPJ,OAAOE,eAAe,oBAAqB,WAEzC,IAAIK,EAAc1C,EAAE,qBAEK,EAArB0C,EAAYF,QACdE,EAAYhB,QAAQiB,WApB9B,CAwBKT,QCxBL,SAAYlC,GAEVA,EAAE4C,UAAUlC,GAAG,QAAS,kBAAmB,SAASC,GAClD,IAAIkC,EAAsB7C,EAAE8C,MACxBC,EAAqBF,EAAoBG,OACzCC,EAAkBjD,EAAE,mBAEpBkD,EADYlD,EAAE,aACOc,MAAMqC,OAC3BC,EAAmBpD,EAAE,oBAEzB,GAAIkD,EAAS,CACX,IAAIG,EAAYH,EAASI,MAAM,KAC3BC,EAAgBF,EAAUA,EAAUb,OAAS,GAEjDK,EAAoBG,KAAK,cAAcjC,KAAK,YAAY,GACxDkC,EAAgBlC,KAAK,CACnByC,IAAO,GACPC,SAAY,KAEdL,EAAiBpC,SAAS,UAE1BhB,EAAE0D,KAAMC,QAAS,CACfC,OAAQ,kBACR7B,IAAKmB,IACJW,KAAK,SAAUC,GAEhBV,EAAiBtB,YAAY,UAC7Be,EAAoBG,KAAKD,GAAoBhC,KAAK,YAAY,GAC9DkC,EAAgBlC,KAAK,CACnByC,IAAOM,EAAKC,UACZN,SAAYF,WAKhBS,MAAM,yBAnCZ,CAsCK9B,QClCAA,OADD,+CAA+CnB,KAAK,OAAQ","file":"scripts.min.js","sourcesContent":["( function( $ ) {\n 'use strict';\n\n var $archive_btn = $('#output-archive-btn'),\n $archive_btn_remove = $('#output-archive-remove'),\n $archive_file_wrapper = $('#output-archive-file-wrapper'),\n $archive_date_wrapper = $('#output-archive-date-wrapper'),\n $archive_date = $('#output-archive-date'),\n $archive_file = $('#output-archive-file'),\n $output_archive_url = $('#output-archive-url'),\n $output_archive_link = $('#output-archive-link'),\n $output_archive_filename = $('#output-archive-filename'), \n archive_select_frame;\n\n\n $archive_btn_remove.on('click', function(ev){\n ev.preventDefault();\n\n var confirm_archive_remove = confirm('Are you sure you want to remove archive?');\n\n if (confirm_archive_remove === true){\n $archive_date.val('');\n $output_archive_url.val('');\n $output_archive_filename.val('');\n $output_archive_link.attr('href', '#');\n $archive_file_wrapper.addClass('hidden');\n $archive_date_wrapper.addClass('hidden');\n }\n\n return false;\n });\n\n $archive_btn.on('click', function(ev){\n ev.preventDefault();\n\n if ( archive_select_frame != null ) {\n archive_select_frame.open();\n return;\n }\n\n archive_select_frame = wp.media({\n title: 'Select bot\\'s archive file',\n button: {\n text: 'Yep, this one'\n },\n multiple: false\n });\n\n \n archive_select_frame.on( 'select', function() {\n var attachment = archive_select_frame.state().get('selection').first().toJSON();\n console.log(attachment);\n\n $archive_file_wrapper.removeClass('hidden');\n $archive_date_wrapper.removeClass('hidden');\n\n $output_archive_url.val(attachment.url);\n $output_archive_filename.val(attachment.filename);\n $output_archive_link.attr('href', attachment.url);\n\n\n // imgContainer.append( '\"\"' );\n // imgIdInput.val( attachment.id );\n // addImgLink.addClass( 'hidden' );\n // delImgLink.removeClass( 'hidden' );\n });\n\n archive_select_frame.open();\n });\n} )( jQuery );\n","( function( $ ) {\n 'use strict';\n $(window).load(function() {\n window.waitForElement = function(selector, callback) {\n if ($(selector).length) {\n callback();\n } else {\n var helpers = this;\n\n setTimeout(function() {\n window.waitForElement(selector, callback);\n }, 100);\n }\n };\n\n window.waitForElement('[id=\"menu-posts\"]', function() {\n /* Quick fix for duplicate Posts appearing in admin, after modifying default post slug. */\n var $menu_posts = $('[id=\"menu-posts\"]');\n\n if ($menu_posts.length > 1){\n $menu_posts.first().hide(); \n }\n });\n });\n} )( jQuery );\n","( function( $ ) {\n 'use strict';\n $(document).on('click', '#get-screenshot', function(ev){\n var $get_screenshot_btn = $(this),\n screenshot_btn_txt = $get_screenshot_btn.html(),\n $screenshot_img = $('#screenshot-img'),\n $page_url = $('#page-url'),\n page_url = $page_url.val().trim(),\n $screenshot_hint = $('#screenshot-hint');\n\n if (page_url){\n var url_parts = page_url.split('/'),\n download_name = url_parts[url_parts.length - 1]; \n\n $get_screenshot_btn.html('Processing').attr('disabled', true);\n $screenshot_img.attr({\n 'src': '',\n 'download': ''\n });\n $screenshot_hint.addClass('hidden');\n\n $.post( ajaxurl, {\n action: 'make_screenshot',\n url: page_url\n }).done(function( data ) {\n // console.log(data);\n $screenshot_hint.removeClass('hidden');\n $get_screenshot_btn.html(screenshot_btn_txt).attr('disabled', false);\n $screenshot_img.attr({\n 'src': data.image_url,\n 'download': download_name\n });\n });\n }\n else{\n alert('You forgot the URL!');\n }\n });\n} )( jQuery );\n","( function( $ ) {\n 'use strict';\n 'use strict';\n $(\"body.post-type-bot .wrap .page-title-action\").attr('href', '/submit-your-bot');\n} )( jQuery );\n"]} \ No newline at end of file +{"version":3,"sources":["bot-archive.js","hide-duplicate-posts-menu.js","screenshot-tool.js","show-bot-submission-form-link-admin.js"],"names":["$","archive_select_frame","$archive_btn","$archive_btn_remove","$archive_file_wrapper","$archive_date_wrapper","$archive_date","$output_archive_url","$output_archive_link","$output_archive_filename","on","ev","preventDefault","confirm","val","attr","addClass","wp","media","title","button","text","multiple","attachment","state","get","first","toJSON","console","log","removeClass","url","filename","open","jQuery","window","load","waitForElement","selector","callback","length","setTimeout","$menu_posts","hide","document","$screenshotBtn","this","screenshotBtnText","html","$screenshotImg","pageUrl","trim","$screenshot_hint","url_parts","split","download_name","src","download","post","ajaxurl","action","done","data","image_url","alert"],"mappings":"cAAA,SAAYA,GAGV,IASIC,EATAC,EAAeF,EAAE,uBACjBG,EAAsBH,EAAE,0BACxBI,EAAwBJ,EAAE,gCAC1BK,EAAwBL,EAAE,gCAC1BM,EAAgBN,EAAE,wBAElBO,GADgBP,EAAE,wBACIA,EAAE,wBACxBQ,EAAuBR,EAAE,wBACzBS,EAA2BT,EAAE,4BAIjCG,EAAoBO,GAAG,QAAS,SAASC,GAcvC,OAbAA,EAAGC,kBAI4B,IAFFC,QAAQ,8CAGnCP,EAAcQ,IAAI,IAClBP,EAAoBO,IAAI,IACxBL,EAAyBK,IAAI,IAC7BN,EAAqBO,KAAK,OAAQ,KAClCX,EAAsBY,SAAS,UAC/BX,EAAsBW,SAAS,YAG1B,IAGTd,EAAaQ,GAAG,QAAS,SAASC,GAChCA,EAAGC,iBAE0B,MAAxBX,IAKLA,EAAuBgB,GAAGC,MAAM,CAC9BC,MAAO,4BACPC,OAAQ,CACNC,KAAM,iBAERC,UAAU,KAISZ,GAAI,SAAU,WACjC,IAAIa,EAAatB,EAAqBuB,QAAQC,IAAI,aAAaC,QAAQC,SACvEC,QAAQC,IAAIN,GAEZnB,EAAsB0B,YAAY,UAClCzB,EAAsByB,YAAY,UAElCvB,EAAoBO,IAAIS,EAAWQ,KACnCtB,EAAyBK,IAAIS,EAAWS,UACxCxB,EAAqBO,KAAK,OAAQQ,EAAWQ,OAS/C9B,EAAqBgC,SAnEzB,CAqEKC,QCrEL,SAAYlC,GAERA,EAAEmC,QAAQC,KAAK,WACbD,OAAOE,eAAiB,SAASC,EAAUC,GACzC,GAAIvC,EAAEsC,GAAUE,OACdD,QACK,CAGLE,WAAW,WACTN,OAAOE,eAAeC,EAAUC,IAC/B,OAIPJ,OAAOE,eAAe,oBAAqB,WAEzC,IAAIK,EAAc1C,EAAE,qBAEK,EAArB0C,EAAYF,QACdE,EAAYhB,QAAQiB,WApB9B,CAwBKT,QCxBL,SAAYlC,GAEVA,EAAG4C,UAAWlC,GAAI,QAAS,kBAAmB,SAAUC,GACtD,IAAIkC,EAAiB7C,EAAG8C,MACpBC,EAAoBF,EAAeG,OACnCC,EAAiBjD,EAAG,mBAEpBkD,EADgBlD,EAAG,aACKc,MAAOqC,OAC/BC,EAAmBpD,EAAG,oBAE1B,GAAKkD,EAAS,CACZ,IAAIG,EAAYH,EAAQI,MAAO,KAC3BC,EAAgBF,EAAUA,EAAUb,OAAS,GAEjDK,EAAeG,KAAM,cAAejC,KAAM,YAAY,GACtDkC,EAAelC,KAAM,CACnByC,IAAO,GACPC,SAAY,KAEdL,EAAiBpC,SAAU,UAe3BhB,EAAE0D,KAAMC,QAAS,CACfC,OAAQ,kBACR7B,IAAKmB,IACHW,KAAM,SAAUC,GAElBV,EAAiBtB,YAAa,UAC9Be,EAAeG,KAAMD,GAAoBhC,KAAM,YAAY,GAC3DkC,EAAelC,KAAM,CACnByC,IAAOM,EAAKC,UACZN,SAAYF,WAKhBS,MAAO,yBAhDb,CAmDK9B,QC/CAA,OADD,+CAA+CnB,KAAK,OAAQ","file":"scripts.min.js","sourcesContent":["( function( $ ) {\n 'use strict';\n\n var $archive_btn = $('#output-archive-btn'),\n $archive_btn_remove = $('#output-archive-remove'),\n $archive_file_wrapper = $('#output-archive-file-wrapper'),\n $archive_date_wrapper = $('#output-archive-date-wrapper'),\n $archive_date = $('#output-archive-date'),\n $archive_file = $('#output-archive-file'),\n $output_archive_url = $('#output-archive-url'),\n $output_archive_link = $('#output-archive-link'),\n $output_archive_filename = $('#output-archive-filename'), \n archive_select_frame;\n\n\n $archive_btn_remove.on('click', function(ev){\n ev.preventDefault();\n\n var confirm_archive_remove = confirm('Are you sure you want to remove archive?');\n\n if (confirm_archive_remove === true){\n $archive_date.val('');\n $output_archive_url.val('');\n $output_archive_filename.val('');\n $output_archive_link.attr('href', '#');\n $archive_file_wrapper.addClass('hidden');\n $archive_date_wrapper.addClass('hidden');\n }\n\n return false;\n });\n\n $archive_btn.on('click', function(ev){\n ev.preventDefault();\n\n if ( archive_select_frame != null ) {\n archive_select_frame.open();\n return;\n }\n\n archive_select_frame = wp.media({\n title: 'Select bot\\'s archive file',\n button: {\n text: 'Yep, this one'\n },\n multiple: false\n });\n\n \n archive_select_frame.on( 'select', function() {\n var attachment = archive_select_frame.state().get('selection').first().toJSON();\n console.log(attachment);\n\n $archive_file_wrapper.removeClass('hidden');\n $archive_date_wrapper.removeClass('hidden');\n\n $output_archive_url.val(attachment.url);\n $output_archive_filename.val(attachment.filename);\n $output_archive_link.attr('href', attachment.url);\n\n\n // imgContainer.append( '\"\"' );\n // imgIdInput.val( attachment.id );\n // addImgLink.addClass( 'hidden' );\n // delImgLink.removeClass( 'hidden' );\n });\n\n archive_select_frame.open();\n });\n} )( jQuery );\n","( function( $ ) {\n 'use strict';\n $(window).load(function() {\n window.waitForElement = function(selector, callback) {\n if ($(selector).length) {\n callback();\n } else {\n var helpers = this;\n\n setTimeout(function() {\n window.waitForElement(selector, callback);\n }, 100);\n }\n };\n\n window.waitForElement('[id=\"menu-posts\"]', function() {\n /* Quick fix for duplicate Posts appearing in admin, after modifying default post slug. */\n var $menu_posts = $('[id=\"menu-posts\"]');\n\n if ($menu_posts.length > 1){\n $menu_posts.first().hide(); \n }\n });\n });\n} )( jQuery );\n","( function( $ ){\n 'use strict';\n $( document ).on( 'click', '#get-screenshot', function( ev ){\n var $screenshotBtn = $( this ),\n screenshotBtnText = $screenshotBtn.html( ),\n $screenshotImg = $( '#screenshot-img' ),\n $pageUrlInput = $( '#page-url' ),\n pageUrl = $pageUrlInput.val( ).trim( ),\n $screenshot_hint = $( '#screenshot-hint' );\n\n if ( pageUrl ){\n var url_parts = pageUrl.split( '/' ),\n download_name = url_parts[url_parts.length - 1]; \n\n $screenshotBtn.html( 'Processing' ).attr( 'disabled', true );\n $screenshotImg.attr( {\n 'src': '',\n 'download': ''\n } );\n $screenshot_hint.addClass( 'hidden' );\n\n // $.ajax( { \n // url: `https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=${ pageUrl }` \n // } ).done( function( data ) { \n // // console.log( data ); \n // console.log( data.lighthouseResult.audits['final-screenshot'].details );\n // $screenshot_hint.removeClass( 'hidden' );\n // $screenshotBtn.html( screenshotBtnText ).attr( 'disabled', false ); \n // $screenshotImg.attr( { \n // // 'src': `data:image/png;base64, ${ data.screenshot }`, \n // 'src': data.lighthouseResult.audits['final-screenshot'].details.data,\n // 'download': download_name \n // } );\n // } );\n $.post( ajaxurl, {\n action: 'make_screenshot',\n url: pageUrl\n } ).done( function( data ) {\n // console.log( data );\n $screenshot_hint.removeClass( 'hidden' );\n $screenshotBtn.html( screenshotBtnText ).attr( 'disabled', false );\n $screenshotImg.attr( {\n 'src': data.image_url,\n 'download': download_name\n } );\n } );\n }\n else{\n alert( 'You forgot the URL!' );\n }\n } );\n} )( jQuery );\n","( function( $ ) {\n 'use strict';\n 'use strict';\n $(\"body.post-type-bot .wrap .page-title-action\").attr('href', '/submit-your-bot');\n} )( jQuery );\n"]} \ No newline at end of file diff --git a/composer.json b/composer.json index 3bcf929..d5054ca 100644 --- a/composer.json +++ b/composer.json @@ -1,9 +1,10 @@ { "require": { - "ksubileau/color-thief-php": "^1.3", + "ksubileau/color-thief-php": "^1.4", "fightbulc/moment": "^1.26", "erusev/parsedown": "^1.6", "j7mbo/twitter-api-php": "^1.0", - "microweber/screen": "^1.0" + "microweber/screen": "^1.0", + "screenshotmachine/screenshotmachine-php": "^2.0" } } diff --git a/composer.lock b/composer.lock index ea59010..1781c05 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "c7783cc19a85bb68bf607b85ba2ffe5b", + "content-hash": "ea187f5283ab42f603a69ca6fad2dcde", "packages": [ { "name": "erusev/parsedown", @@ -167,24 +167,24 @@ }, { "name": "ksubileau/color-thief-php", - "version": "v1.3.1", + "version": "v1.4.1", "source": { "type": "git", "url": "https://github.com/ksubileau/color-thief-php.git", - "reference": "a673d7d3fa815c70fa4bebdee74d337e9e6944fa" + "reference": "fc2acefacbd037f68cf61bcc62b30ac1bb16ed59" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ksubileau/color-thief-php/zipball/a673d7d3fa815c70fa4bebdee74d337e9e6944fa", - "reference": "a673d7d3fa815c70fa4bebdee74d337e9e6944fa", + "url": "https://api.github.com/repos/ksubileau/color-thief-php/zipball/fc2acefacbd037f68cf61bcc62b30ac1bb16ed59", + "reference": "fc2acefacbd037f68cf61bcc62b30ac1bb16ed59", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=5.4.0" }, "require-dev": { - "phpunit/phpunit": "~4.8|~5.7", - "squizlabs/php_codesniffer": "~2.7" + "friendsofphp/php-cs-fixer": "^2.13", + "phpunit/phpunit": "~4.8|~5.7" }, "suggest": { "ext-gd": "to use the GD image adapter.", @@ -216,7 +216,7 @@ "php", "thief" ], - "time": "2016-12-18T03:12:25+00:00" + "time": "2018-10-27T18:57:38+00:00" }, { "name": "microweber/screen", @@ -268,6 +268,43 @@ "screen" ], "time": "2017-01-20T15:21:43+00:00" + }, + { + "name": "screenshotmachine/screenshotmachine-php", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/screenshotmachine/screenshotmachine-php.git", + "reference": "8d2b08b7561c7818c954f181babed37d5883d754" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/screenshotmachine/screenshotmachine-php/zipball/8d2b08b7561c7818c954f181babed37d5883d754", + "reference": "8d2b08b7561c7818c954f181babed37d5883d754", + "shasum": "" + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Captures website screenshot and converts website to PDF using Screenshot machine - online website screenshot generator and website to PDF converter.", + "homepage": "https://github.com/screenshotmachine/screenshotmachine-php", + "keywords": [ + "Thumbnails", + "capture", + "headless", + "html2pdf", + "htmltopdf", + "pdf", + "screenshot", + "screenshots", + "snapshot", + "thumbnail", + "webpage", + "website" + ], + "time": "2019-08-26T08:53:44+00:00" } ], "packages-dev": [], diff --git a/includes/helpers.php b/includes/helpers.php index 667430a..bd05fb9 100644 --- a/includes/helpers.php +++ b/includes/helpers.php @@ -1,5 +1,7 @@ $url, + 'width' => $width, + 'height' => $height, + ); + } + + if ( !empty( $options['file_name'] ) ){ + $file_name = $options['file_name'] . '-' . time(); + } else { + $file_name = preg_replace( '/[^a-z0-9]+/', '-', strtolower( $url ) ) . '-' . time(); + } + + $options['dimension'] = $width. 'x' . $height; + $options['device'] = 'desktop'; + $options['format'] = 'png'; + $options['cacheLimit'] = "0"; + $options['delay'] = '6000'; + $options['zoom'] = '100'; + $options['hide'] = '%23layers'; + + // $machine = new ScreenshotMachine( SCREENSHOT_MACHINE_API_KEY, SCREENSHOT_MACHINE_API_PHRASE ); + $machine = new ScreenshotMachine( SCREENSHOT_MACHINE_API_KEY, '' ); + $api_url = $machine->generate_screenshot_api_url( $options ); + + $file_name = preg_replace( "/[^a-z0-9\.]/", "-", strtolower( $file_name ) ) . '.png'; + + $image_path = ABSPATH . 'temp/' . $file_name; + $image_url = get_site_url() . '/temp/' . $file_name; + + if ( !file_exists( ABSPATH . 'temp/' ) ) { + mkdir( ABSPATH . 'temp/' , 0777, true ); + } + + file_put_contents( $image_path, file_get_contents( $api_url ) ); + + // log_this( array( + // '$page_screenshot' => $page_screenshot, + // '$file_name' => $file_name + // ) ); + + $screenshot_data = array( + 'image_path' => $image_path, + 'image_url' => $image_url + ); + + return $screenshot_data; + } + +/* + function __make_screenshot( $options ){ + if ( !file_exists( ABSPATH . 'temp/' ) ) { + mkdir( ABSPATH . 'temp/' , 0777, true); + } $default_width = 1200; $default_height = 1000; @@ -57,8 +136,9 @@ function make_screenshot( $options ){ $page_screenshot = new Capture( $url ); - $page_screenshot->setUserAgentString( 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 OPR/68.0.3618.125' ); - $page_screenshot->setDelay( 5000 ); + $page_screenshot->setUserAgentString( 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36 OPR/70.0.3728.106' ); + // $page_screenshot->setUserAgentString( 'Mozilla/5.0 (compatible; MSIE 9.0; InfoChannel RNSafeBrowser/v.1.1.0G)' ); + // $page_screenshot->setDelay( 5000 ); $page_screenshot->setWidth( $width ); @@ -66,9 +146,13 @@ function make_screenshot( $options ){ $page_screenshot->setClipWidth( $width ); $page_screenshot->setClipHeight( $height ); - $page_screenshot->setImageType('png'); + $page_screenshot->setImageType( 'png' ); + + $page_screenshot->setOptions( [ + 'ignore-ssl-errors' => 'yes', + ] ); - $page_screenshot->includeJs(new \Screen\Injection\LocalPath( get_template_directory() . '/includes/phantomjs/twitter-cleanup.js' ) ); + // $page_screenshot->includeJs(new \Screen\Injection\LocalPath( get_template_directory() . '/includes/phantomjs/twitter-cleanup.js' ) ); $file_name = preg_replace( "/[^a-z0-9\.]/", "-", strtolower( $file_name ) ) . '.png'; @@ -81,6 +165,12 @@ function make_screenshot( $options ){ $page_screenshot->save( $image_path ); + log_this( array( + '$page_screenshot' => $page_screenshot + ) ); + + $page_screenshot->jobs->clean(); + $screenshot_data = array( 'image_path' => $image_path, 'image_url' => $image_url @@ -88,6 +178,7 @@ function make_screenshot( $options ){ return $screenshot_data; } +*/ function join_with_and( $array ) { $oxf_comma = ( count( $array ) > 2 ? ',' : '' ); diff --git a/js/scripts.min.js b/js/scripts.min.js index d695ed6..7b3c354 100644 --- a/js/scripts.min.js +++ b/js/scripts.min.js @@ -1,2 +1,2 @@ -"use strict";$=jQuery.noConflict(!0),$(function(){$(window).scroll(function(){var e=document.getElementById("back-to-top");(window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0)>screen.height/2?(e.classList.add("slide-up"),e.classList.remove("slide-down")):(e.classList.remove("slide-up"),e.classList.add("slide-down"))})}),$(function(){}),window.bwHelpers={randomFromArray:function(e,t){var o=[];t=t||1;for(var r=0;r';for(var r=1,n=1,s=Math.floor(e.offsetHeight/100),i=Math.floor(e.offsetWidth/100)*s,a="",l=document.head||document.getElementsByTagName("head")[0],c=document.createElement("style"),d=0;d<=i;d++)a+=".robot:nth-child("+d+") { animation-delay: "+60/i/200*d+"s; }";for(l.appendChild(c),c.type="text/css",c.appendChild(document.createTextNode(a));n',r
'),$("#resource-name").val("One cool resource"),$("#author-1-name").val("Stefan"),$("#author-1-url").val("https://twitter.com/fourtonfish"),$("#author-2-name").val("John Doe"),$("#resource-url").val("https://coolresource.github.com/"),$("#resource-selected-tweets").val("https://twitter.com/mycoolresource/status/123456789\nhttps://twitter.com/mycoolresource/status/987654321"),$("#resource-tagline").val("This is a cool resource."),$("#resource-networks").val(["twitter-bots"]),$("#resource-networks").trigger("change"),$("#resource-tags").val(["generative","images","nodejs"]),$("#resource-tags").trigger("change"),$("#resource-is-opensource").click(),$("#resource-source-url").val("https://github.com/resourcewiki/resourcewiki.org"),$("#resource-source-language").val("nodejs"),$("#resource-source-language").trigger("change"),$("html, body").animate({scrollTop:t.offset().top-500},450),!1}),$("#submit-resource-form").submit(function(){t.attr("disabled","disabled").html("Please wait..."),setTimeout(function(){t.html("Still working...")},4700)});var n=$('[name="resource-type'),s=$(".resource-type-name");n.on("change",function(e){var t=$(this).children("option").filter(":selected").text().toLowerCase();-1===["tutorial","tool","starter project","library/framework"].indexOf(t)&&(t="resource"),s.html(t),$("#resource-name").attr("placeholder","My "+t+"..."),$("#resource-tagline").attr("placeholder","A useful "+t+".")}),$("#add-author-fields").click(function(e){e.preventDefault();var t=$(".author-fields").length+1;return $(this).before('
'),!1});var i=$("#resource-network").html();$("#add-resource-info-fields").click(function(e){e.preventDefault();var t=$(".resource-info-fields").length+1;return $(this).before('
'),$("#resource-info-"+t+"-network").select2({tags:!0,placeholder:$(this).attr("placeholder")}),o(),!1});var a=$("#resource-source-info");$("#resource-is-opensource").click(function(e){$(this).is(":checked")?a.removeClass("d-none"):a.addClass("d-none")});var l=$("#apply-for-botmaker-badge"),c=$("#botmaker-badge-application");l.click(function(e){$(this).is(":checked")?c.removeClass("d-none"):c.addClass("d-none")}),o()}}),$(function(){var e=$("body"),o=$("#bot-form-submit");function r(){var e=$('[name="bot-networks[]'),t=$("#bot-selected-tweets-field"),r=$("#bot-selected-tweets-label");e.on("change",function(){var o=!1;e.each(function(e){var t=$(this).children("option").filter(":selected").text();-1
'),$("#bot-name").val("@coolbot"),$("#author-1-name").val("Stefan"),$("#author-1-url").val("https://twitter.com/fourtonfish"),$("#author-2-name").val("John Doe"),window.bot_description_editor.setContent("generates random images.");var t=$("#bot-info-1-network").html();return $("#add-bot-info-fields").before('
"),$("#bot-info-2-network").select2({tags:!0,placeholder:$(this).attr("placeholder")}),$("#bot-info-1-network").val("twitter-bots").trigger("change"),$("#bot-info-2-network").val("tumblr-bots").trigger("change"),$("#bot-info-1-url").val("https://twitter.com/coolbot"),$("#bot-info-2-url").val("https://coolbot.tumblr.com/"),$("#bot-selected-tweets").val("https://twitter.com/mycoolbot/status/123456789\nhttps://twitter.com/mycoolbot/status/987654321"),$("#bot-tagline").val("This is a cool bot."),$("#bot-tags").append('\n ').val(["generative","images"]).trigger("change"),$("#bot-is-opensource").click(),$("#bot-source-url").val("https://github.com/botwiki/botwiki.org"),$("#bot-source-language").val("nodejs").trigger("change"),$("html, body").animate({scrollTop:o.offset().top-500},450),!1}),$(".js-select2").each(function(e){var t=$(this),o=t.data("ajax");o?(window.processSearchResults=function(e){var r=[];return $.each(e,function(e,t){var o=t.name;r[e]={id:o,text:o}}),r},t.select2({tags:!0,placeholder:$(this).attr("placeholder"),minimumInputLength:parseInt($(this).data("minimum-input-length"))||3,ajax:{url:o,dataType:"json",data:function(e){return{search:e.term}},processResults:function(e,o,t){return{results:window.processSearchResults(e).sort(function(e,t){return window.levenshteinDistance(e.text,o.term)-window.levenshteinDistance(t.text,o.term)})}}}})):t.select2({tags:!0,placeholder:$(this).attr("placeholder"),minimumInputLength:parseInt($(this).data("minimum-input-length"))||3})}),$("#submit-bot-form").submit(function(){o.attr("disabled","disabled").html("Please wait..."),setTimeout(function(){o.html("Still working...")},4700)}),$("#add-author-fields").click(function(e){e.preventDefault();var t=$(".author-fields").length+1;return $(this).before('
'),!1});var s=$("#bot-info-1-network").html();$("#add-bot-info-fields").click(function(e){e.preventDefault();var t=$(".bot-info-fields").length+1;return $(this).before('
\n
\n \n
\n
\n \n
\n
"),$("#bot-info-"+t+"-network").select2({tags:!0,placeholder:$(this).attr("placeholder")}),r(),!1});var t=$("#bot-source-info");$("#bot-is-opensource").click(function(e){$(this).is(":checked")?t.removeClass("d-none"):t.addClass("d-none")});var i=$("#bot-submitted-output");$(document).on("change input propertychange",'[name="bot-urls[]"]',function(e){var t=$(this),o=t.parents(".bot-info-fields").find('[name="bot-networks[]"]'),r=t.attr("id"),n=t.val().trim();-1!==n.indexOf("twitter.com")?o.val("twitter-bots").trigger("change"):-1!==n.indexOf("tumblr.com")?o.val("tumblr-bots").trigger("change"):-1!==n.indexOf("mastodon.social")?o.val("mastodon").trigger("change"):-1!==n.indexOf("botsin.space")?o.val("mastodon").trigger("change"):-1!==n.indexOf("reddit.com")?o.val("reddit-bots").trigger("change"):-1!==n.indexOf("youtube.com")&&o.val("youtube-bots").trigger("change"),-1!==r.indexOf("bot-")&&-1!==r.indexOf("-url")&&(n&&5\n \n Screenshot of '+e.title.rendered+'\n \n
\n
'+e.title.rendered+"
\n

"+e.excerpt.rendered+"

\n
\n "}),i.html(t).parent().removeClass("d-none")}}}):i.html("").parent().addClass("d-none"))});var a=$("#apply-for-botmaker-badge"),l=$("#botmaker-badge-application");a.click(function(e){$(this).is(":checked")?l.removeClass("d-none"):l.addClass("d-none")}),r()}"undefined"!=typeof MediumEditor&&(window.bot_description_editor=new MediumEditor("#bot-description",{placeholder:{text:"This bot makes...",hideOnClick:!0},toolbar:{buttons:["anchor","pre","quote"]}}))}),$(function(){var e=parseInt(Cookies.get("bw_visits"))||0;e++,Cookies.set("bw_visits",e,{expires:365}),9screen.height/2?(e.classList.add("slide-up"),e.classList.remove("slide-down")):(e.classList.remove("slide-up"),e.classList.add("slide-down"))})}),$(function(){}),window.bwHelpers={randomFromArray:function(e,t){var o=[];t=t||1;for(var r=0;r';for(var r=1,n=1,s=Math.floor(e.offsetHeight/100),i=Math.floor(e.offsetWidth/100)*s,a="",l=document.head||document.getElementsByTagName("head")[0],c=document.createElement("style"),d=0;d<=i;d++)a+=".robot:nth-child("+d+") { animation-delay: "+60/i/200*d+"s; }";for(l.appendChild(c),c.type="text/css",c.appendChild(document.createTextNode(a));n',r
'),$("#resource-name").val("One cool resource"),$("#author-1-name").val("Stefan"),$("#author-1-url").val("https://twitter.com/fourtonfish"),$("#author-2-name").val("John Doe"),$("#resource-url").val("https://coolresource.github.com/"),$("#resource-selected-tweets").val("https://twitter.com/mycoolresource/status/123456789\nhttps://twitter.com/mycoolresource/status/987654321"),$("#resource-tagline").val("This is a cool resource."),$("#resource-networks").val(["twitter-bots"]),$("#resource-networks").trigger("change"),$("#resource-tags").val(["generative","images","nodejs"]),$("#resource-tags").trigger("change"),$("#resource-is-opensource").click(),$("#resource-source-url").val("https://github.com/resourcewiki/resourcewiki.org"),$("#resource-source-language").val("nodejs"),$("#resource-source-language").trigger("change"),$("html, body").animate({scrollTop:t.offset().top-500},450),!1}),$("#submit-resource-form").submit(function(){t.attr("disabled","disabled").html("Please wait..."),setTimeout(function(){t.html("Still working...")},4700)});var n=$('[name="resource-type'),s=$(".resource-type-name");n.on("change",function(e){var t=$(this).children("option").filter(":selected").text().toLowerCase();-1===["tutorial","tool","starter project","library/framework"].indexOf(t)&&(t="resource"),s.html(t),$("#resource-name").attr("placeholder","My "+t+"..."),$("#resource-tagline").attr("placeholder","A useful "+t+".")}),$("#add-author-fields").click(function(e){e.preventDefault();var t=$(".author-fields").length+1;return $(this).before('
'),!1});var i=$("#resource-network").html();$("#add-resource-info-fields").click(function(e){e.preventDefault();var t=$(".resource-info-fields").length+1;return $(this).before('
'),$("#resource-info-"+t+"-network").select2({tags:!0,placeholder:$(this).attr("placeholder")}),o(),!1});var a=$("#resource-source-info");$("#resource-is-opensource").click(function(e){$(this).is(":checked")?a.removeClass("d-none"):a.addClass("d-none")});var l=$("#apply-for-botmaker-badge"),c=$("#botmaker-badge-application");l.click(function(e){$(this).is(":checked")?c.removeClass("d-none"):c.addClass("d-none")}),o()}}),$(function(){var e=$("body"),o=$("#bot-form-submit");function r(){var e=$('[name="bot-networks[]'),t=$("#bot-selected-tweets-field"),r=$("#bot-selected-tweets-label");e.on("change",function(){var o=!1;e.each(function(e){var t=$(this).children("option").filter(":selected").text();-1
'),$("#bot-name").val("@coolbot"),$("#author-1-name").val("Stefan"),$("#author-1-url").val("https://twitter.com/fourtonfish"),$("#author-2-name").val("John Doe"),window.bot_description_editor.setContent("generates random images.");var t=$("#bot-info-1-network").html();return $("#add-bot-info-fields").before('
"),$("#bot-info-2-network").select2({tags:!0,placeholder:$(this).attr("placeholder")}),$("#bot-info-1-network").val("twitter-bots").trigger("change"),$("#bot-info-2-network").val("tumblr-bots").trigger("change"),$("#bot-info-1-url").val("https://twitter.com/coolbot"),$("#bot-info-2-url").val("https://coolbot.tumblr.com/"),$("#bot-selected-tweets").val("https://twitter.com/mycoolbot/status/123456789\nhttps://twitter.com/mycoolbot/status/987654321"),$("#bot-tagline").val("This is a cool bot."),$("#bot-tags").append('\n ').val(["generative","images"]).trigger("change"),$("#bot-is-opensource").click(),$("#bot-source-url").val("https://github.com/botwiki/botwiki.org"),$("#bot-source-language").val("nodejs").trigger("change"),$("html, body").animate({scrollTop:o.offset().top-500},450),!1}),$(".js-select2").each(function(e){var t=$(this),o=t.data("ajax");o?(window.processSearchResults=function(e){var r=[];return $.each(e,function(e,t){var o=t.name;r[e]={id:o,text:o}}),r},t.select2({tags:!0,placeholder:$(this).attr("placeholder"),minimumInputLength:parseInt($(this).data("minimum-input-length"))||3,ajax:{url:o,dataType:"json",data:function(e){return{search:e.term}},processResults:function(e,o,t){return{results:window.processSearchResults(e).sort(function(e,t){return window.levenshteinDistance(e.text,o.term)-window.levenshteinDistance(t.text,o.term)})}}}})):t.select2({tags:!0,placeholder:$(this).attr("placeholder"),minimumInputLength:parseInt($(this).data("minimum-input-length"))||3})}),$("#submit-bot-form").submit(function(){o.attr("disabled","disabled").html("Please wait..."),setTimeout(function(){o.html("Still working...")},4700)}),$("#add-author-fields").click(function(e){e.preventDefault();var t=$(".author-fields").length+1;return $(this).before('
'),!1});var s=$("#bot-info-1-network").html();$("#add-bot-info-fields").click(function(e){e.preventDefault();var t=$(".bot-info-fields").length+1;return $(this).before('
\n
\n \n
\n
\n \n
\n
"),$("#bot-info-"+t+"-network").select2({tags:!0,placeholder:$(this).attr("placeholder")}),r(),!1});var t=$("#bot-source-info");$("#bot-is-opensource").click(function(e){$(this).is(":checked")?t.removeClass("d-none"):t.addClass("d-none")});var i=$("#bot-submitted-output");$(document).on("change input propertychange",'[name="bot-urls[]"]',function(e){var t=$(this),o=t.parents(".bot-info-fields").find('[name="bot-networks[]"]'),r=t.attr("id"),n=t.val().trim();-1!==n.indexOf("twitter.com")?o.val("twitter-bots").trigger("change"):-1!==n.indexOf("tumblr.com")?o.val("tumblr-bots").trigger("change"):-1!==n.indexOf("mastodon.social")?o.val("mastodon").trigger("change"):-1!==n.indexOf("botsin.space")?o.val("mastodon").trigger("change"):-1!==n.indexOf("reddit.com")?o.val("reddit-bots").trigger("change"):-1!==n.indexOf("youtube.com")&&o.val("youtube-bots").trigger("change"),-1!==r.indexOf("bot-")&&-1!==r.indexOf("-url")&&(n&&5\n \n Screenshot of '+e.title.rendered+'\n \n
\n
'+e.title.rendered+"
\n

"+e.excerpt.rendered+"

\n
\n "}),i.html(t).parent().removeClass("d-none")}}}):i.html("").parent().addClass("d-none"))});var a=$("#apply-for-botmaker-badge"),l=$("#botmaker-badge-application");a.click(function(e){$(this).is(":checked")?l.removeClass("d-none"):l.addClass("d-none")}),r()}"undefined"!=typeof MediumEditor&&(window.bot_description_editor=new MediumEditor("#bot-description",{placeholder:{text:"This bot makes...",hideOnClick:!0},toolbar:{buttons:["anchor","pre","quote"]}}))}),$.fn.waitUntilExists=function(e,t,o){var r=$(this.selector),n=r.not(function(){return $(this).data("found")}).each(e).data("found",!0);return o?t&&n.length&&window.clearInterval(window.waitUntilExists_Intervals[this.selector]):(window.waitUntilExists_Intervals=window.waitUntilExists_Intervals||{})[this.selector]=window.setInterval(function(){r.waitUntilExists(e,t,!0)},500),r}; //# sourceMappingURL=scripts.min.js.map diff --git a/js/scripts.min.js.map b/js/scripts.min.js.map index e4e92ff..4271c7f 100644 --- a/js/scripts.min.js.map +++ b/js/scripts.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["back-to-top.js","expand-image.js","helpers.js","highlight-js.js","lazy-load-images.js","levenshtein_distance.js","menu-toggle.js","misc.js","on-load-scroll.js","robots.js","search.js","select2-init.js","smooth-scroll.js","submit-resource.js","submit-your-bot.js","visit-counter.js","waitUntilExists.jquery.js"],"names":["$","jQuery","noConflict","window","scroll","backToTop","document","getElementById","pageYOffset","documentElement","scrollTop","body","screen","height","classList","add","remove","bwHelpers","randomFromArray","arr","count","newArray","i","sort","Math","round","random","push","pop","hljs","initHighlighting","called","addEventListener","n","f","attachEvent","removeEventListener","b","detachEvent","getOffsetTop","el","val","offsetParent","offsetTop","lazyLoader","cache","mobileScreenSize","addObservers","throttledLoad","removeObservers","throttleTimer","Date","getTime","now","loadVisibleImages","scrollY","range","innerHeight","clientHeight","length","image","imagePosition","mobileSrc","getAttribute","className","replace","width","src","removeAttribute","splice","init","querySelectorAll","selector","doc","head","firstChild","styleTag","createElement","appendChild","__qsaels","styleSheet","cssText","scrollBy","_lazyLoaderInit","imageNodes","imageNode","levenshteinDistance","s","t","d","m","j","s_i","charAt","t_j","cost","mi","c","min","on","ev","$menu_icon","is","removeClass","html","addClass","$menuToggle","keyup","key","click","location","hash","waitUntilExists","animate","offset","top","floor","images","robotsContainer","querySelector","innerHTML","index","totalCount","colSize","offsetHeight","totalCountFinal","offsetWidth","css","getElementsByTagName","style","type","createTextNode","setTimeout","forEach","interval","setInterval","find","each","$this","this","ajax_url","data","processSearchResults","results","k","v","tag_name","name","id","text","select2","tags","placeholder","attr","minimumInputLength","parseInt","ajax","url","dataType","params","search","term","processResults","page","query","a","options","multiple","allowClear","trigger","not","event","pathname","hostname","target","history","pushState","slice","preventDefault","$target","focus","$body","$form_submit_button","enable_selected_tweets_field","$resource_networks_select","$selected_tweets_field","show_selected_tweets_field","children","filter","indexOf","hasClass","$disassociateAuthorBtn","before","submit","$resource_type_select","$resource_type_name","resource_type_name","toLowerCase","new_id","resource_info_network_select_html","$resource_source_info","$apply_for_botmaker_badge","$resourceaker_badge_application","$bot_networks_select","$selected_tweets_label","selected_network","bot_description_editor","setContent","bot_info_network_select_html","append","$bot_source_info","$botSubmittedNotice","$inputField","$networkField","parents","inputFieldId","inputFieldValue","trim","success","resultsHtml","JSON","parse","err","bot","link","featured_image_url","title","rendered","excerpt","parent","$botaker_badge_application","MediumEditor","hideOnClick","toolbar","buttons","visits","Cookies","get","set","expires","fn","handler","shouldRunHandlerOnce","isChild","$elements","clearInterval","waitUntilExists_Intervals"],"mappings":"aAAAA,EAAIC,OAAOC,YAAW,GAEtBF,EAAE,WAEAA,EAAEG,QAAQC,OAAO,WAEf,IAAIC,EAAYC,SAASC,eAAe,gBAChBJ,OAAOK,aAAeF,SAASG,gBAAgBC,WAAaJ,SAASK,KAAKD,WAAa,GAEtFE,OAAOC,OAAO,GACrCR,EAAUS,UAAUC,IAAI,YACxBV,EAAUS,UAAUE,OAAO,gBAG3BX,EAAUS,UAAUE,OAAO,YAC3BX,EAAUS,UAAUC,IAAI,mBCf9Bf,EAAE,cCAFG,OAAOc,UAAY,CACjBC,gBAAiB,SAAUC,EAAKC,GAC9B,IAAIC,EAAW,GACfD,EAAQA,GAAS,EACjB,IAAM,IAAIE,EAAI,EAAGA,EAAIF,EAAOE,IAC1BH,EAAII,KAAM,WAAY,OAAOC,KAAKC,MAAOD,KAAKE,YAC9CL,EAASM,KAAMR,EAAIS,OAErB,OAAOP,ICRXrB,EAAE,WAEqB,oBAAT6B,OACVA,KAAKC,iBAAiBC,QAAS,EAC/BF,KAAKC,sBCET,WACE,IAAIE,EAAoB7B,OAAO6B,kBAAoB,SAASC,EAAEC,GAAK/B,OAAOgC,YAAY,KAAKF,EAAGC,IAC1FE,EAAsBjC,OAAOiC,qBAAuB,SAASH,EAAEC,EAAEG,GAAKlC,OAAOmC,YAAY,KAAKL,EAAGC,IAIrG,SAASK,EAAaC,GACpB,IAAIC,EAAM,EACV,GAAID,EAAGE,aAAc,CACnB,KACED,GAAOD,EAAGG,UACHH,EAAKA,EAAGE,eACjB,OAAOD,GAIX,IAAIG,EAAa,CACfC,MAAO,GACPC,iBAAkB,IAGlBC,aAAc,WACZf,EAAiB,SAAUY,EAAWI,eACtChB,EAAiB,SAAUY,EAAWI,gBAGxCC,gBAAiB,WACfb,EAAoB,SAAUQ,EAAWI,eAAe,GACxDZ,EAAoB,SAAUQ,EAAWI,eAAe,IAG1DE,eAAe,IAAIC,MAAOC,UAE1BJ,cAAe,WACb,IAAIK,GAAM,IAAIF,MAAOC,UACmB,KAAnCC,EAAMT,EAAWM,gBACpBN,EAAWM,cAAgBG,EAC3BT,EAAWU,sBAIfA,kBAAmB,WASjB,IARA,IAAIC,EAAUpD,OAAOK,aAAeF,SAASG,gBAAgBC,UAEzD8C,EACGD,EAAU,IADbC,EAEGD,GAHUpD,OAAOsD,aAAenD,SAASG,gBAAgBiD,cAGlC,IAG1BpC,EAAI,EACDA,EAAIsB,EAAWC,MAAMc,QAAQ,CAClC,IAAIC,EAAQhB,EAAWC,MAAMvB,GACzBuC,EAAgBtB,EAAaqB,GAGjC,GAAsBJ,GAFJI,EAAM/C,QAAU,IAE7BgD,GAA8CA,GAAiBL,EAApE,CACE,IAAIM,EAAYF,EAAMG,aAAa,mBAOnCH,EAAMI,UAAYJ,EAAMI,UAAUC,QAAQ,0BAA2B,mBAGjEH,GAAalD,OAAOsD,OAAStB,EAAWE,iBAC1Cc,EAAMO,IAAML,EAGZF,EAAMO,IAAMP,EAAMG,aAAa,YAGjCH,EAAMQ,gBAAgB,YACtBR,EAAMQ,gBAAgB,mBAEtBxB,EAAWC,MAAMwB,OAAO/C,EAAG,QAI7BA,IAG8B,IAA5BsB,EAAWC,MAAMc,QACnBf,EAAWK,mBAIfqB,KAAM,WAEChE,SAASiE,mBACZjE,SAASiE,iBAAmB,SAASC,GACnC,IAAIC,EAAMnE,SACNoE,EAAOD,EAAIhE,gBAAgBkE,WAC3BC,EAAWH,EAAII,cAAc,SAKjC,OAJAH,EAAKI,YAAYF,GACjBH,EAAIM,SAAW,GACfH,EAASI,WAAWC,QAAUT,EAAW,+CACzCrE,OAAO+E,SAAS,EAAG,GACZT,EAAIM,WAIf/C,EAAiB,OAAQ,SAASmD,IAGhC,IAFA,IAAIC,EAAa9E,SAASiE,iBAAiB,iBAElCjD,EAAI,EAAGA,EAAI8D,EAAWzB,OAAQrC,IAAK,CAC1C,IAAI+D,EAAYD,EAAW9D,GAK3BsB,EAAWC,MAAMlB,KAAK0D,GAGxBzC,EAAWG,eACXH,EAAWU,oBAEXlB,EAAoB,OAAQ+C,GAAiB,OAKnDvC,EAAW0B,OA3Hb,GCNA,IAAIgB,oBAAsB,SAAUC,EAAGC,GACnC,GAAMD,GAAMC,EAAZ,CAMA,IAAIC,EAAI,GAGJxD,EAAIsD,EAAE5B,OACN+B,EAAIF,EAAE7B,OAEV,GAAW,IAAN1B,EACD,OAAOyD,EAGX,GAAW,IAANA,EACD,OAAOzD,EAIX,IAAM,IAAIX,EAAIW,EAAQ,GAALX,EAAQA,IACrBmE,EAAEnE,GAAK,GAIX,IAAUA,EAAIW,EAAQ,GAALX,EAAQA,IACrBmE,EAAEnE,GAAG,GAAKA,EAEd,IAAM,IAAIqE,EAAID,EAAQ,GAALC,EAAQA,IACrBF,EAAE,GAAGE,GAAKA,EAId,IAAUrE,EAAI,EAAGA,GAAKW,EAAGX,IACrB,CAAA,IAAIsE,EAAML,EAAEM,OAAQvE,EAAI,GAGxB,IAAUqE,EAAI,EAAGA,GAAKD,EAAGC,IAAM,CAG3B,GAAKrE,IAAMqE,GAAe,EAAVF,EAAEnE,GAAGqE,GACjB,OAAO1D,EAGX,IAAI6D,EAAMN,EAAEK,OAAQF,EAAI,GACpBI,EAASH,IAAQE,EAAQ,EAAI,EAG7BE,EAAKP,EAAEnE,EAAI,GAAGqE,GAAK,EACnBtD,EAAIoD,EAAEnE,GAAGqE,EAAI,GAAK,EAClBM,EAAIR,EAAEnE,EAAI,GAAGqE,EAAI,GAAKI,EAErB1D,EAAI2D,IACLA,EAAK3D,GAEJ4D,EAAID,IACLA,EAAKC,GAGTR,EAAEnE,GAAGqE,GAAKK,EAGD,EAAJ1E,GAAa,EAAJqE,GAASC,IAAQJ,EAAEK,OAAQF,EAAI,IAAOJ,EAAEM,OAAQvE,EAAI,KAAQwE,IACtEL,EAAEnE,GAAGqE,GAAKnE,KAAK0E,IAAKT,EAAEnE,GAAGqE,GAAIF,EAAEnE,EAAI,GAAGqE,EAAI,GAAKI,KAM3D,OAAON,EAAExD,GAAGyD,KCvEhB1F,EAAE,WAEYA,EAAE,QACKA,EAAE,gBAErBA,EAAE,cAAcmG,GAAG,QAAS,SAASC,GACnC,IAAIC,EAAaA,GAAcrG,EAAE,eAEQ,IAArCA,EAAE,gBAAgBsG,GAAG,aACvBtG,EAAE,QAAQuG,YAAY,aACtBF,EAAWG,KAAK,KAAKD,YAAY,eAGjCvG,EAAE,QAAQyG,SAAS,aACnBJ,EAAWG,KAAK,KAAKC,SAAS,kBCdpCzG,EAAE,WAKA,IAAI0G,EAAc1G,EAAG,gBACrBA,EAAGM,UAAWqG,MAAO,SAAUP,GACb,WAAXA,EAAGQ,KACDF,EAAYJ,GAAI,aACjBI,EAAYG,YCTtB7G,EAAE,WAEIG,OAAO2G,SAASC,MACe,EAA7B/G,EAAE,kBAAkB2D,QACtB3D,EAAE,2BAA2BgH,gBAAgB,WAC3ChH,EAAE,cAAciH,QAAQ,CACtBvG,UAAWV,EAAEG,OAAO2G,SAASC,MAAMG,SAASC,IAAM,SCJ5DnH,EAAG,WACD,SAASkB,EAAiBC,GACxB,OAAOA,EAAIK,KAAK4F,MAAO5F,KAAKE,SAAWP,EAAIwC,SAG7C,IAAM0D,EAAS,CACb,gEACA,+DACA,+DACA,+DACA,+DACA,+DACA,+DACA,+DACA,+DACA,+DACA,+DACA,+DACA,+DACA,+DACA,+DACA,+DACA,+DACA,+DACA,gEACA,+DACA,+DACA,+DACA,+DACA,gEACA,iEAGEC,EAAkBhH,SAASC,eAAgB,UAC9BD,SAASiH,cAAe,YAEzC,GAAKD,EAAiB,CACpBA,EAAgBE,UAAhB,mCAAgEH,EAAO,GAAvE,KAYA,IAVA,IAAII,EAAQ,EACRC,EAAa,EACbC,EAAUnG,KAAK4F,MAAOE,EAAgBM,aAAe,KAErDC,EADUrG,KAAK4F,MAAOE,EAAgBQ,YAAc,KACxBH,EAE5BI,EAAM,GACNrD,EAAOpE,SAASoE,MAAQpE,SAAS0H,qBAAqB,QAAQ,GAC9DC,EAAQ3H,SAASuE,cAAe,SAE1BvD,EAAI,EAAGA,GAAKuG,EAAiBvG,IACrCyG,GAAAA,oBAA4BzG,EAA5B,wBAAuD,GAAGuG,EAAgB,IAAMvG,EAAhF,OAQF,IALAoD,EAAKI,YAAamD,GAClBA,EAAMC,KAAO,WACbD,EAAMnD,YAAaxE,SAAS6H,eAAgBJ,IAGpCL,EAAaG,GACnBvH,SAASC,eAAgB,UAAWiH,UAAYlH,SAASC,eAAgB,UAAWiH,UAApC,2BAA4EE,EAA5E,UAAkGL,EAAOI,GAAzG,KAC3CA,EAAQJ,EAAO1D,OAAS,EAC3B8D,IAEAA,EAAQ,EAEVC,IAwBFU,WAAY,WACV,CAAC,IAAK,IAAK,MAAMC,QAAS,SAAUC,GAClCC,YAAa,WAECrH,EADCZ,SAASiE,iBAAiB,WAEjCJ,IAAMjD,EAAiBmG,IAC5BiB,MAEJ,QCnGPtI,EAAE,WAEkCA,EAAE,mBAAmBwI,KAAK,0BAC3BxI,EAAE,6BACFA,EAAE,6BAEjCA,EAAE,iBAAiB6G,MAAM,SAAST,GAChCpG,EAAE,mBAAmBuG,YAAY,mBAAmBE,SAAS,gBCPnEzG,EAAE,WAEAA,EAAG,eAAgByI,KAAK,SAASnH,GAC/B,IAAIoH,EAAQ1I,EAAG2I,MACXC,EAAWF,EAAMG,KAAM,QAE3B,GAAID,EAAS,CACXzI,OAAO2I,qBAAuB,SAASC,GACrC,IAAIF,EAAO,GASX,OAPA7I,EAAEyI,KAAKM,EAAS,SAAUC,EAAGC,GAC3B,IAAIC,EAAWD,EAAEE,KACjBN,EAAMG,GAAM,CACVI,GAAIF,EACJG,KAAMH,KAGHL,GAKTH,EAAMY,QAAQ,CACZC,MAAM,EACNC,YAAaxJ,EAAG2I,MAAOc,KAAM,eAC7BC,mBAAoBC,SAAS3J,EAAG2I,MAAOE,KAAM,0BAA6B,EAC1Ee,KAAK,CACHC,IAAKjB,EACLkB,SAAU,OAEVjB,KAAM,SAAUkB,GAId,MAHY,CACVC,OAAQD,EAAOE,OAInBC,eAAgB,SAAUrB,EAAMsB,EAAMC,GAGpC,MAAO,CACLrB,QAHY5I,OAAO2I,qBAAqBD,GAGvBtH,KAAK,SAAS8I,EAAEhI,GAC/B,OAAOlC,OAAOmF,oBAAoB+E,EAAEhB,KAAMc,EAAKF,MAAQ9J,OAAOmF,oBAAoBjD,EAAEgH,KAAMc,EAAKF,iBAOvG,CACF,IAAIK,EAAU,CACZf,KAAMvJ,EAAG2I,MAAOE,KAAM,QACtB0B,SAAUvK,EAAG2I,MAAOE,KAAM,YAC1BW,YAAaxJ,EAAG2I,MAAOc,KAAM,eAC7BC,mBAAoBC,SAAS3J,EAAG2I,MAAOE,KAAM,0BAA6B,GAGtEH,EAAMe,KAAM,cAChBa,EAAQE,YAAa,GAGvB9B,EAAMY,QAASgB,GAEV5B,EAAMG,KAAM,UACfH,EAAMjG,IAAI,MAAMgI,QAAS,eC7DjCzK,EAAE,WAEAA,EAAE,gBACD0K,IAAI,cACJA,IAAI,eACJ7D,MAAM,SAAS8D,GACd,GACE7D,SAAS8D,SAAS3G,QAAQ,MAAO,MAAQ0E,KAAKiC,SAAS3G,QAAQ,MAAO,KAEtE6C,SAAS+D,WAAalC,KAAKkC,SAC3B,CACA,IAAIC,EAAS9K,EAAE2I,KAAK5B,MAEhB5G,OAAO4K,SAAW5K,OAAO4K,QAAQC,WAAaF,EAAOtG,WAC/B,YAApBsG,EAAOtG,SACTuG,QAAQC,UAAU,KAAM,KAAM7K,OAAO2G,SAAS8D,UAG9CG,QAAQC,UAAU,KAAM,KAAMF,EAAOtG,YAIzCsG,EAASA,EAAOnH,OAASmH,EAAS9K,EAAE,SAAW2I,KAAK5B,KAAKkE,MAAM,GAAK,MACzDtH,SACTgH,EAAMO,iBACNlL,EAAE,cAAciH,QAAQ,CACtBvG,UAAWoK,EAAO5D,SAASC,KAC1B,IAAK,WACN,IAAIgE,EAAUnL,EAAE8K,GAEhB,GADAK,EAAQC,QACJD,EAAQ7E,GAAG,UACb,OAAO,EAEP6E,EAAQ1B,KAAK,WAAW,MACxB0B,EAAQC,gBClCpBpL,EAAG,WACD,IAAIqL,EAAQrL,EAAG,QACXsL,EAAsBtL,EAAG,yBAE7B,SAASuL,IACP,IAAIC,EAA4BxL,EAAG,8BAC/ByL,EAAyBzL,EAAG,mCAEhCwL,EAA0BrF,GAAI,SAAU,WACtC,IAAIuF,GAA6B,EACjCF,EAA0B/C,KAAM,SAAUnH,IAE6C,EADzEtB,EAAG2I,MACJgD,SAAU,UAAWC,OAAQ,aAAcvC,OAAOwC,QAAS,aACpEH,GAA6B,KAI5BA,EACHD,EAAuBlF,YAAa,UAGpCkF,EAAuBhF,SAAU,YAKvC,GAAK4E,EAAMS,SAAU,0CAA4C,CAG/D,IAAIC,EAAyB/L,EAAG,wBAEhC+L,EAAuBlF,MAAO,SAAUT,GAKtC,OAJAA,EAAG8E,iBACHlL,EAAG,qBAAsBgB,SACzBhB,EAAG,8BAA+ByC,IAAK,QACvCzC,EAAG,sBAAuB6G,SACnB,IAKT7G,EAAG,SAAU6G,MAAO,SAAUT,GA+B5B,OA9BAA,EAAG8E,iBACHa,EAAuBlF,QAEvB7G,EAAG,sBAAuBgM,OAAQ,yVAElChM,EAAG,kBAAmByC,IAAK,qBAC3BzC,EAAG,kBAAmByC,IAAK,UAC3BzC,EAAG,iBAAkByC,IAAK,mCAC1BzC,EAAG,kBAAmByC,IAAK,YAE3BzC,EAAG,iBAAkByC,IAAK,oCAE1BzC,EAAG,6BAA8ByC,IAAK,4GACtCzC,EAAG,qBAAsByC,IAAK,4BAC9BzC,EAAG,sBAAuByC,IAAK,CAAC,iBAChCzC,EAAG,sBAAuByK,QAAS,UAEnCzK,EAAG,kBAAmByC,IAAK,CAAC,aAAc,SAAU,WACpDzC,EAAG,kBAAmByK,QAAS,UAE/BzK,EAAG,2BAA4B6G,QAE/B7G,EAAG,wBAAyByC,IAAK,oDACjCzC,EAAG,6BAA8ByC,IAAK,UACtCzC,EAAG,6BAA8ByK,QAAS,UAE1CzK,EAAG,cAAeiH,QAAS,CACvBvG,UAAW4K,EAAoBpE,SAASC,IAAM,KAC/C,MAEI,IAGTnH,EAAG,yBAA0BiM,OAAQ,WACnCX,EAAoB7B,KAAM,WAAY,YAAajD,KAAM,kBACzD4B,WAAY,WACVkD,EAAoB9E,KAAM,qBACzB,QAGL,IAAI0F,EAAwBlM,EAAG,wBAC3BmM,EAAsBnM,EAAG,uBAE7BkM,EAAsB/F,GAAI,SAAU,SAAUC,GAC5C,IAAIgG,EAAqBpM,EAAG2I,MAAOgD,SAAU,UAAWC,OAAQ,aAAcvC,OAAOgD,eAEgB,IAAhG,CAAC,WAAY,OAAQ,kBAAmB,qBAAqBR,QAASO,KACzEA,EAAqB,YAGvBD,EAAoB3F,KAAM4F,GAC1BpM,EAAG,kBAAmByJ,KAAM,cAA5B,MAAiD2C,EAAjD,OACApM,EAAG,qBAAsByJ,KAAM,cAA/B,YAA0D2C,EAA1D,OAGFpM,EAAG,sBAAuB6G,MAAO,SAAUT,GACzCA,EAAG8E,iBAEH,IAAIoB,EAAStM,EAAG,kBAAmB2D,OAAS,EAI5C,OAFA3D,EAAG2I,MAAOqD,OAAV,2HAA6IM,EAA7I,8IAAiSA,EAAjS,qFAEO,IAGT,IAAIC,EAAoCvM,EAAG,qBAAsBwG,OAEjExG,EAAG,6BAA8B6G,MAAO,SAAUT,GAChDA,EAAG8E,iBAEH,IAAIoB,EAAStM,EAAG,yBAA0B2D,OAAS,EAWnD,OATA3D,EAAG2I,MAAOqD,OAAV,yIAA2JM,EAA3J,iFAAkPC,EAAkCtI,QAAS,MAAOqI,GAApS,uGAAmZA,EAAnZ,6EAAseA,EAAte,kBAEAtM,EAAAA,kBAAqBsM,EAArB,YAAwChD,QAAS,CAC/CC,MAAM,EACNC,YAAaxJ,EAAG2I,MAAOc,KAAM,iBAG/B8B,KAEO,IAGT,IAAIiB,EAAwBxM,EAAG,yBAE/BA,EAAG,2BAA4B6G,MAAO,SAAUT,GAEzCpG,EAAG2I,MAAOrC,GAAI,YACjBkG,EAAsBjG,YAAa,UAGnCiG,EAAsB/F,SAAU,YAIpC,IAAIgG,EAA4BzM,EAAG,6BAC/B0M,EAAkC1M,EAAG,+BAEzCyM,EAA0B5F,MAAO,SAAUT,GAEpCpG,EAAG2I,MAAOrC,GAAI,YACjBoG,EAAgCnG,YAAa,UAG7CmG,EAAgCjG,SAAU,YAI9C8E,OCvJJvL,EAAG,WACD,IAAIqL,EAAQrL,EAAG,QACXsL,EAAsBtL,EAAG,oBAE7B,SAASuL,IACP,IAAIoB,EAAuB3M,EAAG,yBAC1ByL,EAAyBzL,EAAG,8BAC5B4M,EAAyB5M,EAAG,8BAGhC2M,EAAqBxG,GAAI,SAAU,WACjC,IAAIuF,GAA6B,EACjCiB,EAAqBlE,KAAM,SAAUnH,GACnC,IACIuL,EADQ7M,EAAG2I,MACcgD,SAAU,UAAWC,OAAQ,aAAcvC,QAE1B,EAAzCwD,EAAiBhB,QAAS,aAC7Be,EAAuBpG,KAAM,UAC7BkF,GAA6B,IAEgB,EAA1CmB,EAAiBhB,QAAS,cAC7Be,EAAuBpG,KAAM,SAC7BkF,GAA6B,KAI5BA,EACHD,EAAuBlF,YAAa,UAGpCkF,EAAuBhF,SAAU,YAKvC,GAAK4E,EAAMS,SAAU,0CAA4C,CAI/D,IAAIC,EAAyB/L,EAAG,wBAEhC+L,EAAuBlF,MAAO,SAAUT,GAKtC,OAJAA,EAAG8E,iBACHlL,EAAG,qBAAsBgB,SACzBhB,EAAG,8BAA+ByC,IAAK,QACvCzC,EAAG,sBAAuB6G,SACnB,IAMT7G,EAAG,SAAU6G,MAAO,SAAUT,GAC5BA,EAAG8E,iBACHa,EAAuBlF,QAEvB7G,EAAG,sBAAuBgM,OAAQ,yVAElChM,EAAG,aAAcyC,IAAK,YACtBzC,EAAG,kBAAmByC,IAAK,UAC3BzC,EAAG,iBAAkByC,IAAK,mCAC1BzC,EAAG,kBAAmByC,IAAK,YAE3BtC,OAAO2M,uBAAuBC,WAAW,4BAEzC,IAAIC,EAA+BhN,EAAG,uBAAwBwG,OAiC9D,OA/BAxG,EAAG,wBAAyBgM,OAA5B,2WAA+YgB,EAA6B/I,QAAS,MAAO,OAA5b,yBAEAjE,EAAG,uBAAwBsJ,QAAS,CAClCC,MAAM,EACNC,YAAaxJ,EAAG2I,MAAOc,KAAM,iBAG/BzJ,EAAG,uBAAwByC,IAAK,gBAAiBgI,QAAS,UAE1DzK,EAAG,uBAAwByC,IAAK,eAAgBgI,QAAS,UAEzDzK,EAAG,mBAAoByC,IAAK,+BAC5BzC,EAAG,mBAAoByC,IAAK,+BAE5BzC,EAAG,wBAAyByC,IAAK,kGACjCzC,EAAG,gBAAiByC,IAAK,uBAEzBzC,EAAG,aAAciN,OAAjB,mGAGGxK,IAAK,CAAC,aAAc,WAAYgI,QAAS,UAE5CzK,EAAG,sBAAuB6G,QAE1B7G,EAAG,mBAAoByC,IAAK,0CAC5BzC,EAAG,wBAAyByC,IAAK,UAAWgI,QAAS,UAErDzK,EAAG,cAAeiH,QAAS,CACvBvG,UAAW4K,EAAoBpE,SAASC,IAAM,KAC/C,MAEI,IAGTnH,EAAG,eAAgByI,KAAM,SAAUnH,GACjC,IAAIoH,EAAQ1I,EAAG2I,MACXC,EAAWF,EAAMG,KAAM,QAEtBD,GACHzI,OAAO2I,qBAAuB,SAAUC,GACtC,IAAIF,EAAO,GASX,OAPA7I,EAAEyI,KAAMM,EAAS,SAAWC,EAAGC,GAC7B,IAAIC,EAAWD,EAAEE,KACjBN,EAAMG,GAAM,CACVI,GAAIF,EACJG,KAAMH,KAGHL,GAGTH,EAAMY,QAAS,CACbC,MAAM,EACNC,YAAaxJ,EAAG2I,MAAOc,KAAM,eAC7BC,mBAAoBC,SAAU3J,EAAG2I,MAAOE,KAAM,0BAA8B,EAC5Ee,KAAK,CACHC,IAAKjB,EACLkB,SAAU,OAEVjB,KAAM,SAAWkB,GAIf,MAHY,CACVC,OAAQD,EAAOE,OAInBC,eAAgB,SAAWrB,EAAMsB,EAAMC,GAGrC,MAAO,CACLrB,QAHY5I,OAAO2I,qBAAsBD,GAGxBtH,KAAM,SAAU8I,EAAEhI,GACjC,OAAOlC,OAAOmF,oBAAqB+E,EAAEhB,KAAMc,EAAKF,MAAS9J,OAAOmF,oBAAqBjD,EAAEgH,KAAMc,EAAKF,cAQ5GvB,EAAMY,QAAS,CACbC,MAAM,EACNC,YAAaxJ,EAAG2I,MAAOc,KAAM,eAC7BC,mBAAoBC,SAAU3J,EAAG2I,MAAOE,KAAM,0BAA8B,MAKlF7I,EAAG,oBAAqBiM,OAAQ,WAC9BX,EAAoB7B,KAAM,WAAY,YAAajD,KAAM,kBACzD4B,WAAY,WACVkD,EAAoB9E,KAAM,qBACzB,QAGLxG,EAAG,sBAAuB6G,MAAO,SAAUT,GACzCA,EAAG8E,iBAEH,IAAIoB,EAAStM,EAAG,kBAAmB2D,OAAS,EAI5C,OAFA3D,EAAG2I,MAAOqD,OAAV,2HAA6IM,EAA7I,8IAAiSA,EAAjS,qFAEO,IAGT,IAAIU,EAA+BhN,EAAG,uBAAwBwG,OAE9DxG,EAAG,wBAAyB6G,MAAO,SAAUT,GAC3CA,EAAG8E,iBAEH,IAAIoB,EAAStM,EAAG,oBAAqB2D,OAAS,EAmB9C,OAjBA3D,EAAG2I,MAAOqD,OAAV,mJAEuDM,EAFvD,sEAEmIA,EAFnI,uIAK6DA,EAL7D,4EAK+IU,EAA6B/I,QAAS,MAAOqI,GAL5L,6DAUAtM,EAAAA,aAAgBsM,EAAhB,YAAmChD,QAAS,CAC1CC,MAAM,EACNC,YAAaxJ,EAAG2I,MAAOc,KAAM,iBAG/B8B,KAEO,IAGT,IAAI2B,EAAmBlN,EAAG,oBAE1BA,EAAG,sBAAuB6G,MAAO,SAAUT,GAEpCpG,EAAG2I,MAAOrC,GAAI,YACjB4G,EAAiB3G,YAAa,UAG9B2G,EAAiBzG,SAAU,YAI/B,IAAI0G,EAAsBnN,EAAG,yBAE7BA,EAAGM,UAAW6F,GAAI,8BAA+B,sBAAuB,SAAUC,GAChF,IAAIgH,EAAcpN,EAAG2I,MACjB0E,EAAgBD,EAAYE,QAAS,oBAAqB9E,KAAM,2BAChE+E,EAAeH,EAAY3D,KAAM,MACjC+D,EAAkBJ,EAAY3K,MAAMgL,QAEW,IAA9CD,EAAgB3B,QAAS,eAC5BwB,EAAc5K,IAAK,gBAAiBgI,QAAS,WACU,IAA7C+C,EAAgB3B,QAAS,cACnCwB,EAAc5K,IAAK,eAAgBgI,QAAS,WACgB,IAAlD+C,EAAgB3B,QAAS,mBACnCwB,EAAc5K,IAAK,YAAagI,QAAS,WACgB,IAA/C+C,EAAgB3B,QAAS,gBACnCwB,EAAc5K,IAAK,YAAagI,QAAS,WACc,IAA7C+C,EAAgB3B,QAAS,cACnCwB,EAAc5K,IAAK,eAAgBgI,QAAS,WACY,IAA9C+C,EAAgB3B,QAAS,gBACnCwB,EAAc5K,IAAK,gBAAiBgI,QAAS,WAGN,IAApC8C,EAAa1B,QAAS,UAAuD,IAApC0B,EAAa1B,QAAS,UAC7D2B,GAA4C,EAAzBA,EAAgB7J,SAAqD,IAAvC6J,EAAgB3B,QAAS,QAC7E7L,EAAE4J,KAAM,CACNC,IAAAA,8BAAoC2D,EACpCE,QAAS,SAAU7E,GACjB,QAAqB,IAATA,GAAwBA,GAAsB,EAAdA,EAAKlF,QAAckF,EAAKlF,OAAS,EAAI,CAC/E,IAAIgK,EAAc,GAElB,IACE9E,EAAO+E,KAAKC,MAAOhF,GACnB,MAAOiF,IAETjF,EAAKR,QAAS,SAAU0F,GACtBJ,GAAAA,qDACcI,EAAIC,KADlB,qEAE+BD,EAAIE,mBAFnC,qCAE4FF,EAAIG,MAAMC,SAFtG,0BAE0IJ,EAAIG,MAAMC,SAFpJ,+HAKiCJ,EAAIC,KALrC,qBAKgED,EAAIG,MAAMC,SAL1E,uCAMUJ,EAAIK,QAAQD,SANtB,+DAUFhB,EAAoB3G,KAAMmH,GAAcU,SAAS9H,YAAa,cAKpE4G,EAAoB3G,KAAM,IAAK6H,SAAS5H,SAAU,aAKxD,IAAIgG,EAA4BzM,EAAG,6BAC/BsO,EAA6BtO,EAAG,+BAEpCyM,EAA0B5F,MAAO,SAAUT,GAEpCpG,EAAG2I,MAAOrC,GAAI,YACjBgI,EAA2B/H,YAAa,UAGxC+H,EAA2B7H,SAAU,YAIzC8E,IAE2B,oBAAjBgD,eACVpO,OAAO2M,uBAAyB,IAAIyB,aAAc,mBAAoB,CACpE/E,YAAa,CACXH,KAAM,oBACNmF,aAAa,GAEfC,QAAS,CACPC,QAAS,CAAC,SAAU,MAAO,eCjSnC1O,EAAE,WAGE,IAAI2O,EAAShF,SAAUiF,QAAQC,IAAK,eAAmB,EACvDF,IACAC,QAAQE,IAAK,YAAaH,EAAQ,CAAEI,QAAS,MAE/B,EAATJ,GACD3O,EAAG,2BAA4BuG,YAAa,YCCpDvG,EAAEgP,GAAGhI,gBAAkB,SAAUiI,EAASC,EAAsBC,GAC9D,IACIzG,EAAQ1I,EAAE2I,KAAKnE,UACf4K,EAAY1G,EAAMgC,IAAI,WAAc,OAAO1K,EAAE2I,MAAME,KAF3C,WAE2DJ,KAAKwG,GAASpG,KAFzE,SAEqF,GAUjG,OARKsG,EAIID,GAAwBE,EAAUzL,QACzCxD,OAAOkP,cAAclP,OAAOmP,0BAA0B3G,KAAKnE,YAJ1DrE,OAAOmP,0BAA4BnP,OAAOmP,2BAA6B,IAAI3G,KAAKnE,UAC/ErE,OAAOoI,YAAY,WAAcG,EAAM1B,gBAAgBiI,EAASC,GAAsB,IAAU,KAM7FxG","file":"scripts.min.js","sourcesContent":["$ = jQuery.noConflict(true);\n\n$(function() {\n 'use strict';\n $(window).scroll(function(){\n /* TODO: Legacy script, rewrite with jQuery. */\n var backToTop = document.getElementById('back-to-top'),\n documentScrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;\n\n if (documentScrollTop > (screen.height/2)){\n backToTop.classList.add('slide-up');\n backToTop.classList.remove('slide-down');\n }\n else{\n backToTop.classList.remove('slide-up');\n backToTop.classList.add('slide-down');\n }\n });\n});","$(function() {\n 'use strict';\n // $('.expand-image').click(function(ev){\n // ev.preventDefault();\n // $(this).toggleClass('image-expanded');\n // $(this).parents('.thumbnail-wrapper').toggleClass('image-expanded');\n // return false;\n // });\n});\n","window.bwHelpers = {\n randomFromArray: function( arr, count ) {\n let newArray = [];\n count = count || 1;\n for ( let i = 0; i < count; i++){\n arr.sort( function(){ return Math.round( Math.random() ) ; } );\n newArray.push( arr.pop() );\n }\n return newArray;\n }\n}\n","$(function() {\n 'use strict';\n if ( typeof hljs !== 'undefined' ){\n hljs.initHighlighting.called = false;\n hljs.initHighlighting();\n }\n});\n","/*\n Lazy Load Images without jQuery\n http://kaizau.github.com/Lazy-Load-Images-without-jQuery/\n Original by Mike Pulaski - http://www.mikepulaski.com\n Modified by Kai Zau - http://kaizau.com\n*/\n(function() {\n var addEventListener = window.addEventListener || function(n,f) { window.attachEvent('on'+n, f); },\n removeEventListener = window.removeEventListener || function(n,f,b) { window.detachEvent('on'+n, f); };\n\n // For IE7 compatibility\n // Adapted from http://www.quirksmode.org/js/findpos.html\n function getOffsetTop(el) {\n var val = 0;\n if (el.offsetParent) {\n do {\n val += el.offsetTop;\n } while (el = el.offsetParent);\n return val;\n }\n } \n\n var lazyLoader = {\n cache: [],\n mobileScreenSize: 500,\n //tinyGif: 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==',\n\n addObservers: function() {\n addEventListener('scroll', lazyLoader.throttledLoad);\n addEventListener('resize', lazyLoader.throttledLoad);\n },\n\n removeObservers: function() {\n removeEventListener('scroll', lazyLoader.throttledLoad, false);\n removeEventListener('resize', lazyLoader.throttledLoad, false);\n },\n\n throttleTimer: new Date().getTime(),\n\n throttledLoad: function() {\n var now = new Date().getTime();\n if ((now - lazyLoader.throttleTimer) >= 200) {\n lazyLoader.throttleTimer = now;\n lazyLoader.loadVisibleImages();\n }\n },\n\n loadVisibleImages: function() {\n var scrollY = window.pageYOffset || document.documentElement.scrollTop;\n var pageHeight = window.innerHeight || document.documentElement.clientHeight;\n var range = {\n min: scrollY - 200,\n max: scrollY + pageHeight + 200\n };\n\n var i = 0;\n while (i < lazyLoader.cache.length) {\n var image = lazyLoader.cache[i];\n var imagePosition = getOffsetTop(image);\n var imageHeight = image.height || 0;\n\n if ((imagePosition >= range.min - imageHeight) && (imagePosition <= range.max)) {\n var mobileSrc = image.getAttribute('data-src-mobile');\n\n // image.onload = function() {\n // this.className = this.className.replace(/(^|\\s+)lazy-load(\\s+|$)/, '$1lazy-loaded$2');\n // };\n// Temporary fix for Safari!\n\n image.className = image.className.replace(/(^|\\s+)lazy-load(\\s+|$)/, '$1lazy-loaded$2');\n\n\n if (mobileSrc && screen.width <= lazyLoader.mobileScreenSize) {\n image.src = mobileSrc;\n }\n else {\n image.src = image.getAttribute('data-src');\n }\n\n image.removeAttribute('data-src');\n image.removeAttribute('data-src-mobile');\n\n lazyLoader.cache.splice(i, 1);\n continue;\n }\n\n i++;\n }\n\n if (lazyLoader.cache.length === 0) {\n lazyLoader.removeObservers();\n }\n },\n\n init: function() {\n // Patch IE7- (querySelectorAll)\n if (!document.querySelectorAll) {\n document.querySelectorAll = function(selector) {\n var doc = document,\n head = doc.documentElement.firstChild,\n styleTag = doc.createElement('STYLE');\n head.appendChild(styleTag);\n doc.__qsaels = [];\n styleTag.styleSheet.cssText = selector + '{x:expression(document.__qsaels.push(this))}';\n window.scrollBy(0, 0);\n return doc.__qsaels;\n };\n }\n\n addEventListener('load', function _lazyLoaderInit() {\n var imageNodes = document.querySelectorAll('img[data-src]');\n\n for (var i = 0; i < imageNodes.length; i++) {\n var imageNode = imageNodes[i];\n\n // Add a placeholder if one doesn't exist\n //imageNode.src = imageNode.src || lazyLoader.tinyGif;\n\n lazyLoader.cache.push(imageNode);\n }\n\n lazyLoader.addObservers();\n lazyLoader.loadVisibleImages();\n\n removeEventListener('load', _lazyLoaderInit, false);\n });\n }\n };\n\n lazyLoader.init();\n})();\n","var levenshteinDistance = function( s, t ) {\n if ( !s || !t ){\n return;\n }\n /*\n https://stackoverflow.com/a/11958496/2207606\n */\n var d = []; //2d matrix\n\n // Step 1\n var n = s.length;\n var m = t.length;\n\n if ( n === 0 ){\n return m;\n }\n\n if ( m === 0 ){\n return n;\n }\n\n //Create an array of arrays in javascript ( a descending loop is quicker )\n for ( var i = n; i >= 0; i-- ){\n d[i] = [];\n }\n\n // Step 2\n for ( var i = n; i >= 0; i-- ){\n d[i][0] = i;\n }\n for ( var j = m; j >= 0; j-- ){\n d[0][j] = j;\n }\n\n // Step 3\n for ( var i = 1; i <= n; i++ ) {\n var s_i = s.charAt( i - 1 );\n\n // Step 4\n for ( var j = 1; j <= m; j++ ) {\n\n //Check the jagged ld total so far\n if ( i === j && d[i][j] > 4 ){\n return n;\n }\n\n var t_j = t.charAt( j - 1 );\n var cost = ( s_i === t_j ) ? 0 : 1; // Step 5\n\n //Calculate the minimum\n var mi = d[i - 1][j] + 1;\n var b = d[i][j - 1] + 1;\n var c = d[i - 1][j - 1] + cost;\n\n if ( b < mi ){\n mi = b;\n }\n if ( c < mi ){\n mi = c;\n }\n\n d[i][j] = mi; // Step 6\n\n //Damerau transposition\n if ( i > 1 && j > 1 && s_i === t.charAt( j - 2 ) && s.charAt( i - 2 ) === t_j ) {\n d[i][j] = Math.min( d[i][j], d[i - 2][j - 2] + cost );\n }\n }\n }\n\n // Step 7\n return d[n][m];\n};","$(function() {\n 'use strict';\n var $body = $('body'),\n $menu_toggle = $('#menu-toggle');\n\n $('#menu-icon').on('click', function(ev){\n var $menu_icon = $menu_icon || $('#menu-icon');\n\n if ($('#menu-toggle').is(':checked') === true){\n $('body').removeClass('menu-open');\n $menu_icon.html('b').removeClass('mr-3 mt-0');\n }\n else{\n $('body').addClass('menu-open'); \n $menu_icon.html('×').addClass('mr-3 mt-0');\n }\n });\n});\n","$(function() {\n 'use strict';\n \n /* Close site menu with Escape key. */\n\n let $menuToggle = $( '#menu-toggle' );\n $( document ).keyup( function( ev ) {\n if ( ev.key === 'Escape' ) {\n if ( $menuToggle.is( ':checked') ){\n $menuToggle.click();\n }\n }\n });\n});\n","$(function() {\n 'use strict';\n if (window.location.hash) {\n if ($('.twitter-tweet').length > 0){\n $('.twitter-tweet-rendered').waitUntilExists(function(){\n $('html, body').animate({\n scrollTop: $(window.location.hash).offset().top - 20\n });\n });\n }\n }\n});","/* globals MediumEditor */\n\n$( function() {\n function randomFromArray( arr ){\n return arr[Math.floor( Math.random() * arr.length )];\n }\n\n const images = [\n '/wp-content/themes/botwiki/images/robots/EFFCy_oX4AESj3i.jpeg',\n '/wp-content/themes/botwiki/images/robots/EFKMZbiX4AcQCbN.png',\n '/wp-content/themes/botwiki/images/robots/EFQM7GoXoAAQN6r.png',\n '/wp-content/themes/botwiki/images/robots/EGUA_S0WsAIE03o.png',\n '/wp-content/themes/botwiki/images/robots/EHqDhb3X0AIgaSX.png',\n '/wp-content/themes/botwiki/images/robots/EI54X3oXUAA-i8k.png',\n '/wp-content/themes/botwiki/images/robots/EIFTnxIXkAAKlnM.png',\n '/wp-content/themes/botwiki/images/robots/EIIvWWBWsAUGDtX.png',\n '/wp-content/themes/botwiki/images/robots/EJYIvKRXUAATZt7.png',\n '/wp-content/themes/botwiki/images/robots/EKrm5zOWsAAAwIQ.png',\n '/wp-content/themes/botwiki/images/robots/EMzpr0WX0AUPKAD.png',\n '/wp-content/themes/botwiki/images/robots/ENV--axWoAE2R95.png',\n '/wp-content/themes/botwiki/images/robots/EOzcyTKWAAEIr8u.png',\n '/wp-content/themes/botwiki/images/robots/EP9_Xa7X0AE9-nz.png',\n '/wp-content/themes/botwiki/images/robots/EQMlNajWkAA83Sw.png',\n '/wp-content/themes/botwiki/images/robots/ERA8F2LUwAAdnOI.png',\n '/wp-content/themes/botwiki/images/robots/ERbVQjfXsAAwDRB.png',\n '/wp-content/themes/botwiki/images/robots/ERYwdhZXsAAcYuL.png',\n '/wp-content/themes/botwiki/images/robots/EUlexoMUwAYuMj_.jpeg',\n '/wp-content/themes/botwiki/images/robots/EUQBeAeXgAYxhP5.png',\n '/wp-content/themes/botwiki/images/robots/EV17armWoAM3cMw.png',\n '/wp-content/themes/botwiki/images/robots/EVIPh3sWAAMgwXN.png',\n '/wp-content/themes/botwiki/images/robots/EWspV_dUcAAqkTF.png',\n '/wp-content/themes/botwiki/images/robots/EYTv8FDX0AIBNFo.jpeg',\n '/wp-content/themes/botwiki/images/robots/EZq_8QTX0AYo6wn.jpeg'\n ];\n\n let robotsContainer = document.getElementById( 'robots' );\n let firstRobot = document.querySelector( '.robot-1' );\n\n if ( robotsContainer ){\n robotsContainer.innerHTML = ``; \n\n let index = 1,\n totalCount = 1,\n colSize = Math.floor( robotsContainer.offsetHeight / 100 ),\n rowSize = Math.floor( robotsContainer.offsetWidth / 100 ),\n totalCountFinal = rowSize * colSize;\n\n let css = '',\n head = document.head || document.getElementsByTagName('head')[0],\n style = document.createElement( 'style' );\n\n for ( let i = 0; i <= totalCountFinal; i++ ) {\n css += `.robot:nth-child(${ i }) { animation-delay: ${ 60/totalCountFinal/200 * i }s; }`;\n }\n\n head.appendChild( style );\n style.type = 'text/css';\n style.appendChild( document.createTextNode( css ) );\n\n\n while ( totalCount < totalCountFinal ){\n document.getElementById( 'robots' ).innerHTML = document.getElementById( 'robots' ).innerHTML + ``;\n if ( index < images.length - 1 ){\n index++;\n } else {\n index = 0;\n }\n totalCount++;\n }\n\n\n // let imageEls = document.querySelectorAll( '.robot img' );\n\n // let mouseenterIntervals = [];\n\n // imageEls.forEach( function( img, i ){\n // img.addEventListener( 'mouseenter', function( event ) {\n // event.target.src = randomFromArray( images );\n\n // mouseenterIntervals.push(\n // setInterval( function() {\n // event.target.src = randomFromArray( images );\n // }, 100 ) );\n // }, false )\n\n // img.addEventListener( 'mouseleave', function( event ) {\n // clearInterval( mouseenterIntervals[i] );\n // }, false )\n\n // } );\n\n setTimeout( function(){\n [300, 750, 1250].forEach( function( interval ){\n setInterval( function(){\n let robots = document.querySelectorAll('.robot');\n let robot = randomFromArray( robots );\n robot.src = randomFromArray( images );\n }, interval );\n } );\n }, 1000 );\n }\n\n} );","$(function() {\n 'use strict';\n var $search_filter_checkboxes = $('#search-filters').find('input[type=\"checkbox\"]'),\n $search_filter_tutorials = $('#search-filters-tutorials'),\n $search_filter_resources = $('#search-filters-resources');\n\n $('#search-input').click(function(ev){\n $('#search-filters').removeClass('slide-up-hidden').addClass('slide-up');\n });\n});\n","$(function() {\n 'use strict';\n $( '.js-select2' ).each(function(i){\n var $this = $( this ),\n ajax_url = $this.data( 'ajax' );\n\n if (ajax_url){\n window.processSearchResults = function(results){\n var data = [];\n\n $.each(results, function (k, v) {\n var tag_name = v.name;\n data[ k ] = {\n id: tag_name,\n text: tag_name\n };\n });\n return data;\n };\n\n let options = {};\n\n $this.select2({\n tags: true,\n placeholder: $( this ).attr( 'placeholder' ), \n minimumInputLength: parseInt($( this ).data( 'minimum-input-length' )) || 3,\n ajax:{\n url: ajax_url,\n dataType: 'json',\n // delay: 250,\n data: function (params) {\n var query = {\n search: params.term\n };\n return query;\n },\n processResults: function (data, page, query) {\n var results = window.processSearchResults(data);\n\n return {\n results: results.sort(function(a,b){\n return window.levenshteinDistance(a.text, page.term) - window.levenshteinDistance(b.text, page.term);\n })\n };\n }\n }\n });\n }\n else{\n let options = {\n tags: $( this ).data( 'tags' ),\n multiple: $( this ).data( 'multiple' ),\n placeholder: $( this ).attr( 'placeholder' ),\n minimumInputLength: parseInt($( this ).data( 'minimum-input-length' )) || 3\n };\n\n if ( !$this.attr( 'required' ) ){\n options.allowClear = true;\n }\n\n $this.select2( options );\n\n if ( $this.data( 'clear' ) ){\n $this.val(null).trigger( 'change' );\n }\n }\n });\n});\n","//$ = jQuery.noConflict(true);\n// Source: https://css-tricks.com/snippets/jquery/smooth-scrolling/\n$(function() {\n 'use strict';\n $('a[href*=\"#\"]')\n .not('[href=\"#\"]')\n .not('[href=\"#0\"]')\n .click(function(event) {\n if (\n location.pathname.replace(/^\\//, '') === this.pathname.replace(/^\\//, '') \n && \n location.hostname === this.hostname\n ) {\n var target = $(this.hash);\n\n if (window.history && window.history.pushState && target.selector){\n if (target.selector === '#header'){\n history.pushState(null, null, window.location.pathname);\n }\n else{\n history.pushState(null, null, target.selector);\n }\n }\n\n target = target.length ? target : $('[name=' + this.hash.slice(1) + ']');\n if (target.length) {\n event.preventDefault();\n $('html, body').animate({\n scrollTop: target.offset().top\n }, 500, function() {\n var $target = $(target);\n $target.focus();\n if ($target.is(':focus')) {\n return false;\n } else {\n $target.attr('tabindex','-1');\n $target.focus();\n }\n });\n }\n }\n });\n});","/* globals MediumEditor */\n\n$( function() {\n var $body = $( 'body' ),\n $form_submit_button = $( '#resource-form-submit' );\n\n function enable_selected_tweets_field(){\n var $resource_networks_select = $( '[name=\"resource-networks[]' ),\n $selected_tweets_field = $( '#resource-selected-tweets-field' );\n\n $resource_networks_select.on( 'change', function(){\n var show_selected_tweets_field = false;\n $resource_networks_select.each( function( i ){\n var $this = $( this );\n if ( $this.children( \"option\" ).filter( \":selected\" ).text().indexOf( 'Twitter' ) > -1 ){\n show_selected_tweets_field = true;\n }\n } );\n\n if ( show_selected_tweets_field ){\n $selected_tweets_field.removeClass( 'd-none' );\n }\n else{\n $selected_tweets_field.addClass( 'd-none' ); \n }\n } );\n }\n\n if ( $body.hasClass( 'page-template-template-submit-resource' ) ){\n /* Disassociate resource author to allow logged in users to submit other people's resources. */\n\n let $disassociateAuthorBtn = $( '#disassociate-author' );\n\n $disassociateAuthorBtn.click( function( ev ){\n ev.preventDefault();\n $( '#logged-in-author' ).remove();\n $( '#disassociate-author-input' ).val( 'true' );\n $( '#add-author-fields' ).click();\n return false;\n } );\n\n /* Test submission, only available to admins. */\n\n $( '#test' ).click( function( ev ){\n ev.preventDefault();\n $disassociateAuthorBtn.click();\n\n $( '#add-author-fields' ).before( '
' );\n\n $( '#resource-name' ).val( 'One cool resource' );\n $( '#author-1-name' ).val( 'Stefan' );\n $( '#author-1-url' ).val( 'https://twitter.com/fourtonfish' );\n $( '#author-2-name' ).val( 'John Doe' );\n\n $( '#resource-url' ).val( 'https://coolresource.github.com/' );\n\n $( '#resource-selected-tweets' ).val( 'https://twitter.com/mycoolresource/status/123456789\\nhttps://twitter.com/mycoolresource/status/987654321' );\n $( '#resource-tagline' ).val( 'This is a cool resource.' );\n $( '#resource-networks' ).val( ['twitter-bots'] );\n $( '#resource-networks' ).trigger( 'change' );\n\n $( '#resource-tags' ).val( ['generative', 'images', 'nodejs'] );\n $( '#resource-tags' ).trigger( 'change' );\n\n $( '#resource-is-opensource' ).click();\n\n $( '#resource-source-url' ).val( 'https://github.com/resourcewiki/resourcewiki.org' );\n $( '#resource-source-language' ).val( 'nodejs' );\n $( '#resource-source-language' ).trigger( 'change' );\n\n $( 'html, body' ).animate( {\n scrollTop: $form_submit_button.offset().top - 500\n }, 450 );\n\n return false;\n } );\n\n $( '#submit-resource-form' ).submit( function(){\n $form_submit_button.attr( 'disabled', 'disabled' ).html( 'Please wait...' );\n setTimeout( function(){\n $form_submit_button.html( 'Still working...' );\n }, 4700 );\n } );\n\n var $resource_type_select = $( '[name=\"resource-type' ),\n $resource_type_name = $( '.resource-type-name' );\n\n $resource_type_select.on( 'change', function( ev ){\n var resource_type_name = $( this ).children( \"option\" ).filter( \":selected\" ).text().toLowerCase();\n\n if ( ['tutorial', 'tool', 'starter project', 'library/framework'].indexOf( resource_type_name ) === -1 ){\n resource_type_name = 'resource';\n }\n\n $resource_type_name.html( resource_type_name );\n $( '#resource-name' ).attr( 'placeholder', `My ${resource_type_name}...` );\n $( '#resource-tagline' ).attr( 'placeholder', `A useful ${resource_type_name}.` );\n } );\n\n $( '#add-author-fields' ).click( function( ev ){\n ev.preventDefault();\n\n var new_id = $( '.author-fields' ).length + 1;\n\n $( this ).before( `
` );\n\n return false;\n } );\n\n var resource_info_network_select_html = $( '#resource-network' ).html();\n\n $( '#add-resource-info-fields' ).click( function( ev ){\n ev.preventDefault();\n\n var new_id = $( '.resource-info-fields' ).length + 1;\n\n $( this ).before( `
` );\n\n $( `#resource-info-${new_id}-network` ).select2( {\n tags: true,\n placeholder: $( this ).attr( 'placeholder' )\n } );\n\n enable_selected_tweets_field();\n\n return false;\n } );\n\n var $resource_source_info = $( '#resource-source-info' );\n\n $( '#resource-is-opensource' ).click( function( ev ){\n\n if ( $( this ).is( ':checked' ) ){\n $resource_source_info.removeClass( 'd-none' );\n }\n else{\n $resource_source_info.addClass( 'd-none' );\n }\n } );\n\n var $apply_for_botmaker_badge = $( '#apply-for-botmaker-badge' ),\n $resourceaker_badge_application = $( '#botmaker-badge-application' );\n\n $apply_for_botmaker_badge.click( function( ev ){\n\n if ( $( this ).is( ':checked' ) ){\n $resourceaker_badge_application.removeClass( 'd-none' );\n }\n else{\n $resourceaker_badge_application.addClass( 'd-none' );\n }\n } );\n\n enable_selected_tweets_field();\n }\n} );","/* globals MediumEditor */\n\n$( function() {\n let $body = $( 'body' ),\n $form_submit_button = $( '#bot-form-submit' );\n\n function enable_selected_tweets_field(){\n let $bot_networks_select = $( '[name=\"bot-networks[]' ),\n $selected_tweets_field = $( '#bot-selected-tweets-field' ),\n $selected_tweets_label = $( '#bot-selected-tweets-label' );\n\n\n $bot_networks_select.on( 'change', function(){\n let show_selected_tweets_field = false;\n $bot_networks_select.each( function( i ){\n let $this = $( this ),\n selected_network = $this.children( \"option\" ).filter( \":selected\" ).text();\n\n if ( selected_network.indexOf( 'Twitter' ) > -1 ){\n $selected_tweets_label.html( 'tweets' );\n show_selected_tweets_field = true;\n }\n if ( selected_network.indexOf( 'Mastodon' ) > -1 ){\n $selected_tweets_label.html( 'toots' );\n show_selected_tweets_field = true;\n }\n } );\n\n if ( show_selected_tweets_field ){\n $selected_tweets_field.removeClass( 'd-none' );\n }\n else{\n $selected_tweets_field.addClass( 'd-none' ); \n }\n } );\n }\n\n if ( $body.hasClass( 'page-template-template-submit-your-bot' ) ){\n\n /* Disassociate bot author to allow logged in users to submit other people's bots. */\n\n let $disassociateAuthorBtn = $( '#disassociate-author' );\n\n $disassociateAuthorBtn.click( function( ev ){\n ev.preventDefault();\n $( '#logged-in-author' ).remove();\n $( '#disassociate-author-input' ).val( 'true' );\n $( '#add-author-fields' ).click();\n return false;\n } );\n \n\n /* Test submission, only available to admins. */\n\n $( '#test' ).click( function( ev ){\n ev.preventDefault();\n $disassociateAuthorBtn.click();\n\n $( '#add-author-fields' ).before( '
' );\n\n $( '#bot-name' ).val( '@coolbot' );\n $( '#author-1-name' ).val( 'Stefan' );\n $( '#author-1-url' ).val( 'https://twitter.com/fourtonfish' );\n $( '#author-2-name' ).val( 'John Doe' );\n\n window.bot_description_editor.setContent('generates random images.');\n\n let bot_info_network_select_html = $( '#bot-info-1-network' ).html();\n\n $( '#add-bot-info-fields' ).before( `
` );\n\n $( '#bot-info-2-network' ).select2( {\n tags: true,\n placeholder: $( this ).attr( 'placeholder' )\n } );\n\n $( '#bot-info-1-network' ).val( 'twitter-bots' ).trigger( 'change' );\n\n $( '#bot-info-2-network' ).val( 'tumblr-bots' ).trigger( 'change' );\n\n $( '#bot-info-1-url' ).val( 'https://twitter.com/coolbot' );\n $( '#bot-info-2-url' ).val( 'https://coolbot.tumblr.com/' );\n\n $( '#bot-selected-tweets' ).val( 'https://twitter.com/mycoolbot/status/123456789\\nhttps://twitter.com/mycoolbot/status/987654321' );\n $( '#bot-tagline' ).val( 'This is a cool bot.' );\n\n $( '#bot-tags' ).append(\n `\n `\n ).val( ['generative', 'images'] ).trigger( 'change' );\n\n $( '#bot-is-opensource' ).click();\n\n $( '#bot-source-url' ).val( 'https://github.com/botwiki/botwiki.org' );\n $( '#bot-source-language' ).val( 'nodejs' ).trigger( 'change' );\n\n $( 'html, body' ).animate( {\n scrollTop: $form_submit_button.offset().top - 500\n }, 450 );\n\n return false;\n } );\n\n $( '.js-select2' ).each( function( i ){\n let $this = $( this ),\n ajax_url = $this.data( 'ajax' );\n\n if ( ajax_url ){\n window.processSearchResults = function( results ){\n let data = [];\n\n $.each( results, function ( k, v ) {\n let tag_name = v.name;\n data[ k ] = {\n id: tag_name,\n text: tag_name\n };\n } );\n return data;\n };\n\n $this.select2( {\n tags: true,\n placeholder: $( this ).attr( 'placeholder' ), \n minimumInputLength: parseInt( $( this ).data( 'minimum-input-length' ) ) || 3,\n ajax:{\n url: ajax_url,\n dataType: 'json',\n // delay: 250,\n data: function ( params ) {\n let query = {\n search: params.term\n };\n return query;\n },\n processResults: function ( data, page, query ) {\n let results = window.processSearchResults( data );\n\n return {\n results: results.sort( function( a,b ){\n return window.levenshteinDistance( a.text, page.term ) - window.levenshteinDistance( b.text, page.term );\n } )\n };\n }\n }\n } );\n }\n else{\n $this.select2( {\n tags: true,\n placeholder: $( this ).attr( 'placeholder' ),\n minimumInputLength: parseInt( $( this ).data( 'minimum-input-length' ) ) || 3\n } );\n }\n } );\n\n $( '#submit-bot-form' ).submit( function(){\n $form_submit_button.attr( 'disabled', 'disabled' ).html( 'Please wait...' );\n setTimeout( function(){\n $form_submit_button.html( 'Still working...' );\n }, 4700 );\n } );\n\n $( '#add-author-fields' ).click( function( ev ){\n ev.preventDefault();\n\n let new_id = $( '.author-fields' ).length + 1;\n\n $( this ).before( `
` );\n\n return false;\n } );\n\n let bot_info_network_select_html = $( '#bot-info-1-network' ).html();\n\n $( '#add-bot-info-fields' ).click( function( ev ){\n ev.preventDefault();\n\n let new_id = $( '.bot-info-fields' ).length + 1;\n\n $( this ).before( `
\n
\n \n
\n
\n \n
\n
` );\n\n $( `#bot-info-${new_id}-network` ).select2( {\n tags: true,\n placeholder: $( this ).attr( 'placeholder' )\n } );\n\n enable_selected_tweets_field();\n\n return false;\n } );\n\n let $bot_source_info = $( '#bot-source-info' );\n\n $( '#bot-is-opensource' ).click( function( ev ){\n\n if ( $( this ).is( ':checked' ) ){\n $bot_source_info.removeClass( 'd-none' );\n }\n else{\n $bot_source_info.addClass( 'd-none' );\n }\n } );\n\n let $botSubmittedNotice = $( '#bot-submitted-output' );\n\n $( document ).on( 'change input propertychange', '[name=\"bot-urls[]\"]', function( ev ){\n let $inputField = $( this ),\n $networkField = $inputField.parents( '.bot-info-fields' ).find( '[name=\"bot-networks[]\"]'),\n inputFieldId = $inputField.attr( 'id' ),\n inputFieldValue = $inputField.val().trim();\n\n if ( inputFieldValue.indexOf( 'twitter.com' ) !== -1 ){\n $networkField.val( 'twitter-bots' ).trigger( 'change' );\n } else if ( inputFieldValue.indexOf( 'tumblr.com' ) !== -1 ){\n $networkField.val( 'tumblr-bots' ).trigger( 'change' );\n } else if ( inputFieldValue.indexOf( 'mastodon.social' ) !== -1 ){\n $networkField.val( 'mastodon' ).trigger( 'change' );\n } else if ( inputFieldValue.indexOf( 'botsin.space' ) !== -1 ){\n $networkField.val( 'mastodon' ).trigger( 'change' );\n } else if ( inputFieldValue.indexOf( 'reddit.com' ) !== -1 ){\n $networkField.val( 'reddit-bots' ).trigger( 'change' );\n } else if ( inputFieldValue.indexOf( 'youtube.com' ) !== -1 ){\n $networkField.val( 'youtube-bots' ).trigger( 'change' );\n }\n\n if ( inputFieldId.indexOf( 'bot-' ) !== -1 && inputFieldId.indexOf( '-url' ) !== -1 ){\n if ( inputFieldValue && inputFieldValue.length > 5 && inputFieldValue.indexOf( 'http' ) !== -1 ){\n $.ajax( {\n url: `/wp-json/wp/v2/bot?bot_url=${ inputFieldValue }`,\n success: function( data ) {\n if ( typeof data !== 'undefined' && data && data.length > 0 && data.length < 3 ) {\n let resultsHtml = '';\n\n try{\n data = JSON.parse( data );\n } catch( err ){ /* noop */ }\n\n data.forEach( function( bot ){\n resultsHtml += `
\n \n \"Screenshot\n \n
\n
${ bot.title.rendered }
\n

${ bot.excerpt.rendered }

\n
\n
`;\n } );\n $botSubmittedNotice.html( resultsHtml ).parent().removeClass( 'd-none' );\n }\n }\n } );\n } else {\n $botSubmittedNotice.html( '' ).parent().addClass( 'd-none' );\n }\n }\n } );\n\n let $apply_for_botmaker_badge = $( '#apply-for-botmaker-badge' ),\n $botaker_badge_application = $( '#botmaker-badge-application' );\n\n $apply_for_botmaker_badge.click( function( ev ){\n\n if ( $( this ).is( ':checked' ) ){\n $botaker_badge_application.removeClass( 'd-none' );\n }\n else{\n $botaker_badge_application.addClass( 'd-none' );\n }\n } );\n\n enable_selected_tweets_field();\n }\n if ( typeof MediumEditor !== \"undefined\" ){\n window.bot_description_editor = new MediumEditor( '#bot-description', {\n placeholder: {\n text: 'This bot makes...',\n hideOnClick: true\n },\n toolbar: {\n buttons: ['anchor', 'pre', 'quote']\n }\n } );\n }\n} );","$(function() {\n 'use strict';\n\n let visits = parseInt( Cookies.get( 'bw_visits' ) ) || 0;\n visits++;\n Cookies.set( 'bw_visits', visits, { expires: 365 });\n\n if ( visits > 9 ){\n $( '#botwiki-support-prompt' ).removeClass( 'd-none' );\n }\n});\n","// Source: https://gist.github.com/buu700/4200601\n/**\n* @function\n* @property {object} jQuery plugin which runs handler function once specified element is inserted into the DOM\n* @param {function} handler A function to execute at the time when the element is inserted\n* @param {bool} shouldRunHandlerOnce Optional: if true, handler is unbound after its first invocation\n* @example $(selector).waitUntilExists(function);\n*/\n\n$.fn.waitUntilExists = function (handler, shouldRunHandlerOnce, isChild) {\n var found = 'found';\n var $this = $(this.selector);\n var $elements = $this.not(function () { return $(this).data(found); }).each(handler).data(found, true);\n \n if (!isChild){\n (window.waitUntilExists_Intervals = window.waitUntilExists_Intervals || {})[this.selector] =\n window.setInterval(function () { $this.waitUntilExists(handler, shouldRunHandlerOnce, true); }, 500);\n }\n else if (shouldRunHandlerOnce && $elements.length){\n window.clearInterval(window.waitUntilExists_Intervals[this.selector]);\n }\n \n return $this;\n};\n"]} \ No newline at end of file +{"version":3,"sources":["back-to-top.js","expand-image.js","helpers.js","highlight-js.js","lazy-load-images.js","levenshtein_distance.js","menu-toggle.js","misc.js","on-load-scroll.js","robots.js","search.js","select2-init.js","smooth-scroll.js","submit-resource.js","submit-your-bot.js","waitUntilExists.jquery.js"],"names":["$","jQuery","noConflict","window","scroll","backToTop","document","getElementById","pageYOffset","documentElement","scrollTop","body","screen","height","classList","add","remove","bwHelpers","randomFromArray","arr","count","newArray","i","sort","Math","round","random","push","pop","hljs","initHighlighting","called","addEventListener","n","f","attachEvent","removeEventListener","b","detachEvent","getOffsetTop","el","val","offsetParent","offsetTop","lazyLoader","cache","mobileScreenSize","addObservers","throttledLoad","removeObservers","throttleTimer","Date","getTime","now","loadVisibleImages","scrollY","range","innerHeight","clientHeight","length","image","imagePosition","mobileSrc","getAttribute","className","replace","width","src","removeAttribute","splice","init","querySelectorAll","selector","doc","head","firstChild","styleTag","createElement","appendChild","__qsaels","styleSheet","cssText","scrollBy","_lazyLoaderInit","imageNodes","imageNode","levenshteinDistance","s","t","d","m","j","s_i","charAt","t_j","cost","mi","c","min","on","ev","$menu_icon","is","removeClass","html","addClass","$menuToggle","keyup","key","click","location","hash","waitUntilExists","animate","offset","top","floor","images","robotsContainer","querySelector","innerHTML","index","totalCount","colSize","offsetHeight","totalCountFinal","offsetWidth","css","getElementsByTagName","style","type","createTextNode","setTimeout","forEach","interval","setInterval","find","each","$this","this","ajax_url","data","processSearchResults","results","k","v","tag_name","name","id","text","select2","tags","placeholder","attr","minimumInputLength","parseInt","ajax","url","dataType","params","search","term","processResults","page","query","a","options","multiple","allowClear","trigger","not","event","pathname","hostname","target","history","pushState","slice","preventDefault","$target","focus","$body","$form_submit_button","enable_selected_tweets_field","$resource_networks_select","$selected_tweets_field","show_selected_tweets_field","children","filter","indexOf","hasClass","$disassociateAuthorBtn","before","submit","$resource_type_select","$resource_type_name","resource_type_name","toLowerCase","new_id","resource_info_network_select_html","$resource_source_info","$apply_for_botmaker_badge","$resourceaker_badge_application","$bot_networks_select","$selected_tweets_label","selected_network","bot_description_editor","setContent","bot_info_network_select_html","append","$bot_source_info","$botSubmittedNotice","$inputField","$networkField","parents","inputFieldId","inputFieldValue","trim","success","resultsHtml","JSON","parse","err","bot","link","featured_image_url","title","rendered","excerpt","parent","$botaker_badge_application","MediumEditor","hideOnClick","toolbar","buttons","fn","handler","shouldRunHandlerOnce","isChild","$elements","clearInterval","waitUntilExists_Intervals"],"mappings":"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","file":"scripts.min.js","sourcesContent":["$ = jQuery.noConflict(true);\n\n$(function() {\n 'use strict';\n $(window).scroll(function(){\n /* TODO: Legacy script, rewrite with jQuery. */\n var backToTop = document.getElementById('back-to-top'),\n documentScrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;\n\n if (documentScrollTop > (screen.height/2)){\n backToTop.classList.add('slide-up');\n backToTop.classList.remove('slide-down');\n }\n else{\n backToTop.classList.remove('slide-up');\n backToTop.classList.add('slide-down');\n }\n });\n});","$(function() {\n 'use strict';\n // $('.expand-image').click(function(ev){\n // ev.preventDefault();\n // $(this).toggleClass('image-expanded');\n // $(this).parents('.thumbnail-wrapper').toggleClass('image-expanded');\n // return false;\n // });\n});\n","window.bwHelpers = {\n randomFromArray: function( arr, count ) {\n let newArray = [];\n count = count || 1;\n for ( let i = 0; i < count; i++){\n arr.sort( function(){ return Math.round( Math.random() ) ; } );\n newArray.push( arr.pop() );\n }\n return newArray;\n }\n}\n","$(function() {\n 'use strict';\n if ( typeof hljs !== 'undefined' ){\n hljs.initHighlighting.called = false;\n hljs.initHighlighting();\n }\n});\n","/*\n Lazy Load Images without jQuery\n http://kaizau.github.com/Lazy-Load-Images-without-jQuery/\n Original by Mike Pulaski - http://www.mikepulaski.com\n Modified by Kai Zau - http://kaizau.com\n*/\n(function() {\n var addEventListener = window.addEventListener || function(n,f) { window.attachEvent('on'+n, f); },\n removeEventListener = window.removeEventListener || function(n,f,b) { window.detachEvent('on'+n, f); };\n\n // For IE7 compatibility\n // Adapted from http://www.quirksmode.org/js/findpos.html\n function getOffsetTop(el) {\n var val = 0;\n if (el.offsetParent) {\n do {\n val += el.offsetTop;\n } while (el = el.offsetParent);\n return val;\n }\n } \n\n var lazyLoader = {\n cache: [],\n mobileScreenSize: 500,\n //tinyGif: 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==',\n\n addObservers: function() {\n addEventListener('scroll', lazyLoader.throttledLoad);\n addEventListener('resize', lazyLoader.throttledLoad);\n },\n\n removeObservers: function() {\n removeEventListener('scroll', lazyLoader.throttledLoad, false);\n removeEventListener('resize', lazyLoader.throttledLoad, false);\n },\n\n throttleTimer: new Date().getTime(),\n\n throttledLoad: function() {\n var now = new Date().getTime();\n if ((now - lazyLoader.throttleTimer) >= 200) {\n lazyLoader.throttleTimer = now;\n lazyLoader.loadVisibleImages();\n }\n },\n\n loadVisibleImages: function() {\n var scrollY = window.pageYOffset || document.documentElement.scrollTop;\n var pageHeight = window.innerHeight || document.documentElement.clientHeight;\n var range = {\n min: scrollY - 200,\n max: scrollY + pageHeight + 200\n };\n\n var i = 0;\n while (i < lazyLoader.cache.length) {\n var image = lazyLoader.cache[i];\n var imagePosition = getOffsetTop(image);\n var imageHeight = image.height || 0;\n\n if ((imagePosition >= range.min - imageHeight) && (imagePosition <= range.max)) {\n var mobileSrc = image.getAttribute('data-src-mobile');\n\n // image.onload = function() {\n // this.className = this.className.replace(/(^|\\s+)lazy-load(\\s+|$)/, '$1lazy-loaded$2');\n // };\n// Temporary fix for Safari!\n\n image.className = image.className.replace(/(^|\\s+)lazy-load(\\s+|$)/, '$1lazy-loaded$2');\n\n\n if (mobileSrc && screen.width <= lazyLoader.mobileScreenSize) {\n image.src = mobileSrc;\n }\n else {\n image.src = image.getAttribute('data-src');\n }\n\n image.removeAttribute('data-src');\n image.removeAttribute('data-src-mobile');\n\n lazyLoader.cache.splice(i, 1);\n continue;\n }\n\n i++;\n }\n\n if (lazyLoader.cache.length === 0) {\n lazyLoader.removeObservers();\n }\n },\n\n init: function() {\n // Patch IE7- (querySelectorAll)\n if (!document.querySelectorAll) {\n document.querySelectorAll = function(selector) {\n var doc = document,\n head = doc.documentElement.firstChild,\n styleTag = doc.createElement('STYLE');\n head.appendChild(styleTag);\n doc.__qsaels = [];\n styleTag.styleSheet.cssText = selector + '{x:expression(document.__qsaels.push(this))}';\n window.scrollBy(0, 0);\n return doc.__qsaels;\n };\n }\n\n addEventListener('load', function _lazyLoaderInit() {\n var imageNodes = document.querySelectorAll('img[data-src]');\n\n for (var i = 0; i < imageNodes.length; i++) {\n var imageNode = imageNodes[i];\n\n // Add a placeholder if one doesn't exist\n //imageNode.src = imageNode.src || lazyLoader.tinyGif;\n\n lazyLoader.cache.push(imageNode);\n }\n\n lazyLoader.addObservers();\n lazyLoader.loadVisibleImages();\n\n removeEventListener('load', _lazyLoaderInit, false);\n });\n }\n };\n\n lazyLoader.init();\n})();\n","var levenshteinDistance = function( s, t ) {\n if ( !s || !t ){\n return;\n }\n /*\n https://stackoverflow.com/a/11958496/2207606\n */\n var d = []; //2d matrix\n\n // Step 1\n var n = s.length;\n var m = t.length;\n\n if ( n === 0 ){\n return m;\n }\n\n if ( m === 0 ){\n return n;\n }\n\n //Create an array of arrays in javascript ( a descending loop is quicker )\n for ( var i = n; i >= 0; i-- ){\n d[i] = [];\n }\n\n // Step 2\n for ( var i = n; i >= 0; i-- ){\n d[i][0] = i;\n }\n for ( var j = m; j >= 0; j-- ){\n d[0][j] = j;\n }\n\n // Step 3\n for ( var i = 1; i <= n; i++ ) {\n var s_i = s.charAt( i - 1 );\n\n // Step 4\n for ( var j = 1; j <= m; j++ ) {\n\n //Check the jagged ld total so far\n if ( i === j && d[i][j] > 4 ){\n return n;\n }\n\n var t_j = t.charAt( j - 1 );\n var cost = ( s_i === t_j ) ? 0 : 1; // Step 5\n\n //Calculate the minimum\n var mi = d[i - 1][j] + 1;\n var b = d[i][j - 1] + 1;\n var c = d[i - 1][j - 1] + cost;\n\n if ( b < mi ){\n mi = b;\n }\n if ( c < mi ){\n mi = c;\n }\n\n d[i][j] = mi; // Step 6\n\n //Damerau transposition\n if ( i > 1 && j > 1 && s_i === t.charAt( j - 2 ) && s.charAt( i - 2 ) === t_j ) {\n d[i][j] = Math.min( d[i][j], d[i - 2][j - 2] + cost );\n }\n }\n }\n\n // Step 7\n return d[n][m];\n};","$(function() {\n 'use strict';\n var $body = $('body'),\n $menu_toggle = $('#menu-toggle');\n\n $('#menu-icon').on('click', function(ev){\n var $menu_icon = $menu_icon || $('#menu-icon');\n\n if ($('#menu-toggle').is(':checked') === true){\n $('body').removeClass('menu-open');\n $menu_icon.html('b').removeClass('mr-3 mt-0');\n }\n else{\n $('body').addClass('menu-open'); \n $menu_icon.html('×').addClass('mr-3 mt-0');\n }\n });\n});\n","$(function() {\n 'use strict';\n \n /* Close site menu with Escape key. */\n\n let $menuToggle = $( '#menu-toggle' );\n $( document ).keyup( function( ev ) {\n if ( ev.key === 'Escape' ) {\n if ( $menuToggle.is( ':checked') ){\n $menuToggle.click();\n }\n }\n });\n});\n","$(function() {\n 'use strict';\n if (window.location.hash) {\n if ($('.twitter-tweet').length > 0){\n $('.twitter-tweet-rendered').waitUntilExists(function(){\n $('html, body').animate({\n scrollTop: $(window.location.hash).offset().top - 20\n });\n });\n }\n }\n});","/* globals MediumEditor */\n\n$( function() {\n function randomFromArray( arr ){\n return arr[Math.floor( Math.random() * arr.length )];\n }\n\n const images = [\n '/wp-content/themes/botwiki/images/robots/EFFCy_oX4AESj3i.jpeg',\n '/wp-content/themes/botwiki/images/robots/EFKMZbiX4AcQCbN.png',\n '/wp-content/themes/botwiki/images/robots/EFQM7GoXoAAQN6r.png',\n '/wp-content/themes/botwiki/images/robots/EGUA_S0WsAIE03o.png',\n '/wp-content/themes/botwiki/images/robots/EHqDhb3X0AIgaSX.png',\n '/wp-content/themes/botwiki/images/robots/EI54X3oXUAA-i8k.png',\n '/wp-content/themes/botwiki/images/robots/EIFTnxIXkAAKlnM.png',\n '/wp-content/themes/botwiki/images/robots/EIIvWWBWsAUGDtX.png',\n '/wp-content/themes/botwiki/images/robots/EJYIvKRXUAATZt7.png',\n '/wp-content/themes/botwiki/images/robots/EKrm5zOWsAAAwIQ.png',\n '/wp-content/themes/botwiki/images/robots/EMzpr0WX0AUPKAD.png',\n '/wp-content/themes/botwiki/images/robots/ENV--axWoAE2R95.png',\n '/wp-content/themes/botwiki/images/robots/EOzcyTKWAAEIr8u.png',\n '/wp-content/themes/botwiki/images/robots/EP9_Xa7X0AE9-nz.png',\n '/wp-content/themes/botwiki/images/robots/EQMlNajWkAA83Sw.png',\n '/wp-content/themes/botwiki/images/robots/ERA8F2LUwAAdnOI.png',\n '/wp-content/themes/botwiki/images/robots/ERbVQjfXsAAwDRB.png',\n '/wp-content/themes/botwiki/images/robots/ERYwdhZXsAAcYuL.png',\n '/wp-content/themes/botwiki/images/robots/EUlexoMUwAYuMj_.jpeg',\n '/wp-content/themes/botwiki/images/robots/EUQBeAeXgAYxhP5.png',\n '/wp-content/themes/botwiki/images/robots/EV17armWoAM3cMw.png',\n '/wp-content/themes/botwiki/images/robots/EVIPh3sWAAMgwXN.png',\n '/wp-content/themes/botwiki/images/robots/EWspV_dUcAAqkTF.png',\n '/wp-content/themes/botwiki/images/robots/EYTv8FDX0AIBNFo.jpeg',\n '/wp-content/themes/botwiki/images/robots/EZq_8QTX0AYo6wn.jpeg'\n ];\n\n let robotsContainer = document.getElementById( 'robots' );\n let firstRobot = document.querySelector( '.robot-1' );\n\n if ( robotsContainer ){\n robotsContainer.innerHTML = ``; \n\n let index = 1,\n totalCount = 1,\n colSize = Math.floor( robotsContainer.offsetHeight / 100 ),\n rowSize = Math.floor( robotsContainer.offsetWidth / 100 ),\n totalCountFinal = rowSize * colSize;\n\n let css = '',\n head = document.head || document.getElementsByTagName('head')[0],\n style = document.createElement( 'style' );\n\n for ( let i = 0; i <= totalCountFinal; i++ ) {\n css += `.robot:nth-child(${ i }) { animation-delay: ${ 60/totalCountFinal/200 * i }s; }`;\n }\n\n head.appendChild( style );\n style.type = 'text/css';\n style.appendChild( document.createTextNode( css ) );\n\n\n while ( totalCount < totalCountFinal ){\n document.getElementById( 'robots' ).innerHTML = document.getElementById( 'robots' ).innerHTML + ``;\n if ( index < images.length - 1 ){\n index++;\n } else {\n index = 0;\n }\n totalCount++;\n }\n\n\n // let imageEls = document.querySelectorAll( '.robot img' );\n\n // let mouseenterIntervals = [];\n\n // imageEls.forEach( function( img, i ){\n // img.addEventListener( 'mouseenter', function( event ) {\n // event.target.src = randomFromArray( images );\n\n // mouseenterIntervals.push(\n // setInterval( function() {\n // event.target.src = randomFromArray( images );\n // }, 100 ) );\n // }, false )\n\n // img.addEventListener( 'mouseleave', function( event ) {\n // clearInterval( mouseenterIntervals[i] );\n // }, false )\n\n // } );\n\n setTimeout( function(){\n [300, 750, 1250].forEach( function( interval ){\n setInterval( function(){\n let robots = document.querySelectorAll('.robot');\n let robot = randomFromArray( robots );\n robot.src = randomFromArray( images );\n }, interval );\n } );\n }, 1000 );\n }\n\n} );","$(function() {\n 'use strict';\n var $search_filter_checkboxes = $('#search-filters').find('input[type=\"checkbox\"]'),\n $search_filter_tutorials = $('#search-filters-tutorials'),\n $search_filter_resources = $('#search-filters-resources');\n\n $('#search-input').click(function(ev){\n $('#search-filters').removeClass('slide-up-hidden').addClass('slide-up');\n });\n});\n","$(function() {\n 'use strict';\n $( '.js-select2' ).each(function(i){\n var $this = $( this ),\n ajax_url = $this.data( 'ajax' );\n\n if (ajax_url){\n window.processSearchResults = function(results){\n var data = [];\n\n $.each(results, function (k, v) {\n var tag_name = v.name;\n data[ k ] = {\n id: tag_name,\n text: tag_name\n };\n });\n return data;\n };\n\n let options = {};\n\n $this.select2({\n tags: true,\n placeholder: $( this ).attr( 'placeholder' ), \n minimumInputLength: parseInt($( this ).data( 'minimum-input-length' )) || 3,\n ajax:{\n url: ajax_url,\n dataType: 'json',\n // delay: 250,\n data: function (params) {\n var query = {\n search: params.term\n };\n return query;\n },\n processResults: function (data, page, query) {\n var results = window.processSearchResults(data);\n\n return {\n results: results.sort(function(a,b){\n return window.levenshteinDistance(a.text, page.term) - window.levenshteinDistance(b.text, page.term);\n })\n };\n }\n }\n });\n }\n else{\n let options = {\n tags: $( this ).data( 'tags' ),\n multiple: $( this ).data( 'multiple' ),\n placeholder: $( this ).attr( 'placeholder' ),\n minimumInputLength: parseInt($( this ).data( 'minimum-input-length' )) || 3\n };\n\n if ( !$this.attr( 'required' ) ){\n options.allowClear = true;\n }\n\n $this.select2( options );\n\n if ( $this.data( 'clear' ) ){\n $this.val(null).trigger( 'change' );\n }\n }\n });\n});\n","//$ = jQuery.noConflict(true);\n// Source: https://css-tricks.com/snippets/jquery/smooth-scrolling/\n$(function() {\n 'use strict';\n $('a[href*=\"#\"]')\n .not('[href=\"#\"]')\n .not('[href=\"#0\"]')\n .click(function(event) {\n if (\n location.pathname.replace(/^\\//, '') === this.pathname.replace(/^\\//, '') \n && \n location.hostname === this.hostname\n ) {\n var target = $(this.hash);\n\n if (window.history && window.history.pushState && target.selector){\n if (target.selector === '#header'){\n history.pushState(null, null, window.location.pathname);\n }\n else{\n history.pushState(null, null, target.selector);\n }\n }\n\n target = target.length ? target : $('[name=' + this.hash.slice(1) + ']');\n if (target.length) {\n event.preventDefault();\n $('html, body').animate({\n scrollTop: target.offset().top\n }, 500, function() {\n var $target = $(target);\n $target.focus();\n if ($target.is(':focus')) {\n return false;\n } else {\n $target.attr('tabindex','-1');\n $target.focus();\n }\n });\n }\n }\n });\n});","/* globals MediumEditor */\n\n$( function() {\n var $body = $( 'body' ),\n $form_submit_button = $( '#resource-form-submit' );\n\n function enable_selected_tweets_field(){\n var $resource_networks_select = $( '[name=\"resource-networks[]' ),\n $selected_tweets_field = $( '#resource-selected-tweets-field' );\n\n $resource_networks_select.on( 'change', function(){\n var show_selected_tweets_field = false;\n $resource_networks_select.each( function( i ){\n var $this = $( this );\n if ( $this.children( \"option\" ).filter( \":selected\" ).text().indexOf( 'Twitter' ) > -1 ){\n show_selected_tweets_field = true;\n }\n } );\n\n if ( show_selected_tweets_field ){\n $selected_tweets_field.removeClass( 'd-none' );\n }\n else{\n $selected_tweets_field.addClass( 'd-none' ); \n }\n } );\n }\n\n if ( $body.hasClass( 'page-template-template-submit-resource' ) ){\n /* Disassociate resource author to allow logged in users to submit other people's resources. */\n\n let $disassociateAuthorBtn = $( '#disassociate-author' );\n\n $disassociateAuthorBtn.click( function( ev ){\n ev.preventDefault();\n $( '#logged-in-author' ).remove();\n $( '#disassociate-author-input' ).val( 'true' );\n $( '#add-author-fields' ).click();\n return false;\n } );\n\n /* Test submission, only available to admins. */\n\n $( '#test' ).click( function( ev ){\n ev.preventDefault();\n $disassociateAuthorBtn.click();\n\n $( '#add-author-fields' ).before( '
' );\n\n $( '#resource-name' ).val( 'One cool resource' );\n $( '#author-1-name' ).val( 'Stefan' );\n $( '#author-1-url' ).val( 'https://twitter.com/fourtonfish' );\n $( '#author-2-name' ).val( 'John Doe' );\n\n $( '#resource-url' ).val( 'https://coolresource.github.com/' );\n\n $( '#resource-selected-tweets' ).val( 'https://twitter.com/mycoolresource/status/123456789\\nhttps://twitter.com/mycoolresource/status/987654321' );\n $( '#resource-tagline' ).val( 'This is a cool resource.' );\n $( '#resource-networks' ).val( ['twitter-bots'] );\n $( '#resource-networks' ).trigger( 'change' );\n\n $( '#resource-tags' ).val( ['generative', 'images', 'nodejs'] );\n $( '#resource-tags' ).trigger( 'change' );\n\n $( '#resource-is-opensource' ).click();\n\n $( '#resource-source-url' ).val( 'https://github.com/resourcewiki/resourcewiki.org' );\n $( '#resource-source-language' ).val( 'nodejs' );\n $( '#resource-source-language' ).trigger( 'change' );\n\n $( 'html, body' ).animate( {\n scrollTop: $form_submit_button.offset().top - 500\n }, 450 );\n\n return false;\n } );\n\n $( '#submit-resource-form' ).submit( function(){\n $form_submit_button.attr( 'disabled', 'disabled' ).html( 'Please wait...' );\n setTimeout( function(){\n $form_submit_button.html( 'Still working...' );\n }, 4700 );\n } );\n\n var $resource_type_select = $( '[name=\"resource-type' ),\n $resource_type_name = $( '.resource-type-name' );\n\n $resource_type_select.on( 'change', function( ev ){\n var resource_type_name = $( this ).children( \"option\" ).filter( \":selected\" ).text().toLowerCase();\n\n if ( ['tutorial', 'tool', 'starter project', 'library/framework'].indexOf( resource_type_name ) === -1 ){\n resource_type_name = 'resource';\n }\n\n $resource_type_name.html( resource_type_name );\n $( '#resource-name' ).attr( 'placeholder', `My ${resource_type_name}...` );\n $( '#resource-tagline' ).attr( 'placeholder', `A useful ${resource_type_name}.` );\n } );\n\n $( '#add-author-fields' ).click( function( ev ){\n ev.preventDefault();\n\n var new_id = $( '.author-fields' ).length + 1;\n\n $( this ).before( `
` );\n\n return false;\n } );\n\n var resource_info_network_select_html = $( '#resource-network' ).html();\n\n $( '#add-resource-info-fields' ).click( function( ev ){\n ev.preventDefault();\n\n var new_id = $( '.resource-info-fields' ).length + 1;\n\n $( this ).before( `
` );\n\n $( `#resource-info-${new_id}-network` ).select2( {\n tags: true,\n placeholder: $( this ).attr( 'placeholder' )\n } );\n\n enable_selected_tweets_field();\n\n return false;\n } );\n\n var $resource_source_info = $( '#resource-source-info' );\n\n $( '#resource-is-opensource' ).click( function( ev ){\n\n if ( $( this ).is( ':checked' ) ){\n $resource_source_info.removeClass( 'd-none' );\n }\n else{\n $resource_source_info.addClass( 'd-none' );\n }\n } );\n\n var $apply_for_botmaker_badge = $( '#apply-for-botmaker-badge' ),\n $resourceaker_badge_application = $( '#botmaker-badge-application' );\n\n $apply_for_botmaker_badge.click( function( ev ){\n\n if ( $( this ).is( ':checked' ) ){\n $resourceaker_badge_application.removeClass( 'd-none' );\n }\n else{\n $resourceaker_badge_application.addClass( 'd-none' );\n }\n } );\n\n enable_selected_tweets_field();\n }\n} );","/* globals MediumEditor */\n\n$( function() {\n let $body = $( 'body' ),\n $form_submit_button = $( '#bot-form-submit' );\n\n function enable_selected_tweets_field(){\n let $bot_networks_select = $( '[name=\"bot-networks[]' ),\n $selected_tweets_field = $( '#bot-selected-tweets-field' ),\n $selected_tweets_label = $( '#bot-selected-tweets-label' );\n\n\n $bot_networks_select.on( 'change', function(){\n let show_selected_tweets_field = false;\n $bot_networks_select.each( function( i ){\n let $this = $( this ),\n selected_network = $this.children( \"option\" ).filter( \":selected\" ).text();\n\n if ( selected_network.indexOf( 'Twitter' ) > -1 ){\n $selected_tweets_label.html( 'tweets' );\n show_selected_tweets_field = true;\n }\n if ( selected_network.indexOf( 'Mastodon' ) > -1 ){\n $selected_tweets_label.html( 'toots' );\n show_selected_tweets_field = true;\n }\n } );\n\n if ( show_selected_tweets_field ){\n $selected_tweets_field.removeClass( 'd-none' );\n }\n else{\n $selected_tweets_field.addClass( 'd-none' ); \n }\n } );\n }\n\n if ( $body.hasClass( 'page-template-template-submit-your-bot' ) ){\n\n /* Disassociate bot author to allow logged in users to submit other people's bots. */\n\n let $disassociateAuthorBtn = $( '#disassociate-author' );\n\n $disassociateAuthorBtn.click( function( ev ){\n ev.preventDefault();\n $( '#logged-in-author' ).remove();\n $( '#disassociate-author-input' ).val( 'true' );\n $( '#add-author-fields' ).click();\n return false;\n } );\n \n\n /* Test submission, only available to admins. */\n\n $( '#test' ).click( function( ev ){\n ev.preventDefault();\n $disassociateAuthorBtn.click();\n\n $( '#add-author-fields' ).before( '
' );\n\n $( '#bot-name' ).val( '@coolbot' );\n $( '#author-1-name' ).val( 'Stefan' );\n $( '#author-1-url' ).val( 'https://twitter.com/fourtonfish' );\n $( '#author-2-name' ).val( 'John Doe' );\n\n window.bot_description_editor.setContent('generates random images.');\n\n let bot_info_network_select_html = $( '#bot-info-1-network' ).html();\n\n $( '#add-bot-info-fields' ).before( `
` );\n\n $( '#bot-info-2-network' ).select2( {\n tags: true,\n placeholder: $( this ).attr( 'placeholder' )\n } );\n\n $( '#bot-info-1-network' ).val( 'twitter-bots' ).trigger( 'change' );\n\n $( '#bot-info-2-network' ).val( 'tumblr-bots' ).trigger( 'change' );\n\n $( '#bot-info-1-url' ).val( 'https://twitter.com/coolbot' );\n $( '#bot-info-2-url' ).val( 'https://coolbot.tumblr.com/' );\n\n $( '#bot-selected-tweets' ).val( 'https://twitter.com/mycoolbot/status/123456789\\nhttps://twitter.com/mycoolbot/status/987654321' );\n $( '#bot-tagline' ).val( 'This is a cool bot.' );\n\n $( '#bot-tags' ).append(\n `\n `\n ).val( ['generative', 'images'] ).trigger( 'change' );\n\n $( '#bot-is-opensource' ).click();\n\n $( '#bot-source-url' ).val( 'https://github.com/botwiki/botwiki.org' );\n $( '#bot-source-language' ).val( 'nodejs' ).trigger( 'change' );\n\n $( 'html, body' ).animate( {\n scrollTop: $form_submit_button.offset().top - 500\n }, 450 );\n\n return false;\n } );\n\n $( '.js-select2' ).each( function( i ){\n let $this = $( this ),\n ajax_url = $this.data( 'ajax' );\n\n if ( ajax_url ){\n window.processSearchResults = function( results ){\n let data = [];\n\n $.each( results, function ( k, v ) {\n let tag_name = v.name;\n data[ k ] = {\n id: tag_name,\n text: tag_name\n };\n } );\n return data;\n };\n\n $this.select2( {\n tags: true,\n placeholder: $( this ).attr( 'placeholder' ), \n minimumInputLength: parseInt( $( this ).data( 'minimum-input-length' ) ) || 3,\n ajax:{\n url: ajax_url,\n dataType: 'json',\n // delay: 250,\n data: function ( params ) {\n let query = {\n search: params.term\n };\n return query;\n },\n processResults: function ( data, page, query ) {\n let results = window.processSearchResults( data );\n\n return {\n results: results.sort( function( a,b ){\n return window.levenshteinDistance( a.text, page.term ) - window.levenshteinDistance( b.text, page.term );\n } )\n };\n }\n }\n } );\n }\n else{\n $this.select2( {\n tags: true,\n placeholder: $( this ).attr( 'placeholder' ),\n minimumInputLength: parseInt( $( this ).data( 'minimum-input-length' ) ) || 3\n } );\n }\n } );\n\n $( '#submit-bot-form' ).submit( function(){\n $form_submit_button.attr( 'disabled', 'disabled' ).html( 'Please wait...' );\n setTimeout( function(){\n $form_submit_button.html( 'Still working...' );\n }, 4700 );\n } );\n\n $( '#add-author-fields' ).click( function( ev ){\n ev.preventDefault();\n\n let new_id = $( '.author-fields' ).length + 1;\n\n $( this ).before( `
` );\n\n return false;\n } );\n\n let bot_info_network_select_html = $( '#bot-info-1-network' ).html();\n\n $( '#add-bot-info-fields' ).click( function( ev ){\n ev.preventDefault();\n\n let new_id = $( '.bot-info-fields' ).length + 1;\n\n $( this ).before( `
\n
\n \n
\n
\n \n
\n
` );\n\n $( `#bot-info-${new_id}-network` ).select2( {\n tags: true,\n placeholder: $( this ).attr( 'placeholder' )\n } );\n\n enable_selected_tweets_field();\n\n return false;\n } );\n\n let $bot_source_info = $( '#bot-source-info' );\n\n $( '#bot-is-opensource' ).click( function( ev ){\n\n if ( $( this ).is( ':checked' ) ){\n $bot_source_info.removeClass( 'd-none' );\n }\n else{\n $bot_source_info.addClass( 'd-none' );\n }\n } );\n\n let $botSubmittedNotice = $( '#bot-submitted-output' );\n\n $( document ).on( 'change input propertychange', '[name=\"bot-urls[]\"]', function( ev ){\n let $inputField = $( this ),\n $networkField = $inputField.parents( '.bot-info-fields' ).find( '[name=\"bot-networks[]\"]'),\n inputFieldId = $inputField.attr( 'id' ),\n inputFieldValue = $inputField.val().trim();\n\n if ( inputFieldValue.indexOf( 'twitter.com' ) !== -1 ){\n $networkField.val( 'twitter-bots' ).trigger( 'change' );\n } else if ( inputFieldValue.indexOf( 'tumblr.com' ) !== -1 ){\n $networkField.val( 'tumblr-bots' ).trigger( 'change' );\n } else if ( inputFieldValue.indexOf( 'mastodon.social' ) !== -1 ){\n $networkField.val( 'mastodon' ).trigger( 'change' );\n } else if ( inputFieldValue.indexOf( 'botsin.space' ) !== -1 ){\n $networkField.val( 'mastodon' ).trigger( 'change' );\n } else if ( inputFieldValue.indexOf( 'reddit.com' ) !== -1 ){\n $networkField.val( 'reddit-bots' ).trigger( 'change' );\n } else if ( inputFieldValue.indexOf( 'youtube.com' ) !== -1 ){\n $networkField.val( 'youtube-bots' ).trigger( 'change' );\n }\n\n if ( inputFieldId.indexOf( 'bot-' ) !== -1 && inputFieldId.indexOf( '-url' ) !== -1 ){\n if ( inputFieldValue && inputFieldValue.length > 5 && inputFieldValue.indexOf( 'http' ) !== -1 ){\n $.ajax( {\n url: `/wp-json/wp/v2/bot?bot_url=${ inputFieldValue }`,\n success: function( data ) {\n if ( typeof data !== 'undefined' && data && data.length > 0 && data.length < 3 ) {\n let resultsHtml = '';\n\n try{\n data = JSON.parse( data );\n } catch( err ){ /* noop */ }\n\n data.forEach( function( bot ){\n resultsHtml += `
\n \n \"Screenshot\n \n
\n
${ bot.title.rendered }
\n

${ bot.excerpt.rendered }

\n
\n
`;\n } );\n $botSubmittedNotice.html( resultsHtml ).parent().removeClass( 'd-none' );\n }\n }\n } );\n } else {\n $botSubmittedNotice.html( '' ).parent().addClass( 'd-none' );\n }\n }\n } );\n\n let $apply_for_botmaker_badge = $( '#apply-for-botmaker-badge' ),\n $botaker_badge_application = $( '#botmaker-badge-application' );\n\n $apply_for_botmaker_badge.click( function( ev ){\n\n if ( $( this ).is( ':checked' ) ){\n $botaker_badge_application.removeClass( 'd-none' );\n }\n else{\n $botaker_badge_application.addClass( 'd-none' );\n }\n } );\n\n enable_selected_tweets_field();\n }\n if ( typeof MediumEditor !== \"undefined\" ){\n window.bot_description_editor = new MediumEditor( '#bot-description', {\n placeholder: {\n text: 'This bot makes...',\n hideOnClick: true\n },\n toolbar: {\n buttons: ['anchor', 'pre', 'quote']\n }\n } );\n }\n} );","// Source: https://gist.github.com/buu700/4200601\n/**\n* @function\n* @property {object} jQuery plugin which runs handler function once specified element is inserted into the DOM\n* @param {function} handler A function to execute at the time when the element is inserted\n* @param {bool} shouldRunHandlerOnce Optional: if true, handler is unbound after its first invocation\n* @example $(selector).waitUntilExists(function);\n*/\n\n$.fn.waitUntilExists = function (handler, shouldRunHandlerOnce, isChild) {\n var found = 'found';\n var $this = $(this.selector);\n var $elements = $this.not(function () { return $(this).data(found); }).each(handler).data(found, true);\n \n if (!isChild){\n (window.waitUntilExists_Intervals = window.waitUntilExists_Intervals || {})[this.selector] =\n window.setInterval(function () { $this.waitUntilExists(handler, shouldRunHandlerOnce, true); }, 500);\n }\n else if (shouldRunHandlerOnce && $elements.length){\n window.clearInterval(window.waitUntilExists_Intervals[this.selector]);\n }\n \n return $this;\n};\n"]} \ No newline at end of file diff --git a/src/admin-scripts/screenshot-tool.js b/src/admin-scripts/screenshot-tool.js index 76c7405..b3330be 100644 --- a/src/admin-scripts/screenshot-tool.js +++ b/src/admin-scripts/screenshot-tool.js @@ -1,39 +1,52 @@ -( function( $ ) { +( function( $ ){ 'use strict'; - $(document).on('click', '#get-screenshot', function(ev){ - var $get_screenshot_btn = $(this), - screenshot_btn_txt = $get_screenshot_btn.html(), - $screenshot_img = $('#screenshot-img'), - $page_url = $('#page-url'), - page_url = $page_url.val().trim(), - $screenshot_hint = $('#screenshot-hint'); + $( document ).on( 'click', '#get-screenshot', function( ev ){ + var $screenshotBtn = $( this ), + screenshotBtnText = $screenshotBtn.html( ), + $screenshotImg = $( '#screenshot-img' ), + $pageUrlInput = $( '#page-url' ), + pageUrl = $pageUrlInput.val( ).trim( ), + $screenshot_hint = $( '#screenshot-hint' ); - if (page_url){ - var url_parts = page_url.split('/'), + if ( pageUrl ){ + var url_parts = pageUrl.split( '/' ), download_name = url_parts[url_parts.length - 1]; - $get_screenshot_btn.html('Processing').attr('disabled', true); - $screenshot_img.attr({ + $screenshotBtn.html( 'Processing' ).attr( 'disabled', true ); + $screenshotImg.attr( { 'src': '', 'download': '' - }); - $screenshot_hint.addClass('hidden'); + } ); + $screenshot_hint.addClass( 'hidden' ); + // $.ajax( { + // url: `https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=${ pageUrl }` + // } ).done( function( data ) { + // // console.log( data ); + // console.log( data.lighthouseResult.audits['final-screenshot'].details ); + // $screenshot_hint.removeClass( 'hidden' ); + // $screenshotBtn.html( screenshotBtnText ).attr( 'disabled', false ); + // $screenshotImg.attr( { + // // 'src': `data:image/png;base64, ${ data.screenshot }`, + // 'src': data.lighthouseResult.audits['final-screenshot'].details.data, + // 'download': download_name + // } ); + // } ); $.post( ajaxurl, { action: 'make_screenshot', - url: page_url - }).done(function( data ) { - // console.log(data); - $screenshot_hint.removeClass('hidden'); - $get_screenshot_btn.html(screenshot_btn_txt).attr('disabled', false); - $screenshot_img.attr({ + url: pageUrl + } ).done( function( data ) { + // console.log( data ); + $screenshot_hint.removeClass( 'hidden' ); + $screenshotBtn.html( screenshotBtnText ).attr( 'disabled', false ); + $screenshotImg.attr( { 'src': data.image_url, 'download': download_name - }); - }); + } ); + } ); } else{ - alert('You forgot the URL!'); + alert( 'You forgot the URL!' ); } - }); + } ); } )( jQuery );