AssetStore Linkify

AssetStore Linkify is a user script for finding links in plain-text and converting them to HTML <a> tags.

目前为 2017-07-21 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name AssetStore Linkify
  3. // @namespace https://github.com/XpycT/
  4. // @version 0.1.18
  5. // @description AssetStore Linkify is a user script for finding links in plain-text and converting them to HTML <a> tags.
  6. // @homepageURL https://github.com/XpycT/assetstore-linkify
  7. // @supportURL https://github.com/XpycT/assetstore-linkify/issues
  8. // @author XpycT
  9. // @require https://code.jquery.com/jquery-latest.js
  10. // @require https://cdnjs.cloudflare.com/ajax/libs/fancybox/3.0.47/jquery.fancybox.min.js
  11. // @match *://forum.cgpersia.com/*
  12. // @match *://www.cgpeers.to/*
  13. // @grant GM_setValue
  14. // @grant GM_getValue
  15. // @grant GM_addStyle
  16. // @grant GM_xmlhttpRequest
  17. // @grant unsafeWindow
  18. // @run-at document-start
  19. // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAIAAADajyQQAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QTc1RUY1OEIxRUQ1MTFFNEJBMjNERUQ5QTNFNzNDMzYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QTc1RUY1OEMxRUQ1MTFFNEJBMjNERUQ5QTNFNzNDMzYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBNzVFRjU4OTFFRDUxMUU0QkEyM0RFRDlBM0U3M0MzNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBNzVFRjU4QTFFRDUxMUU0QkEyM0RFRDlBM0U3M0MzNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PrgK2iMAAAaZSURBVHjaYlTSMWcY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
  20. // ==/UserScript==
  21.  
  22. (function () {
  23. 'use strict';
  24.  
  25. var $ = $ || window.$;
  26.  
  27. const apis = {
  28. 'head': 'https://www.assetstore.unity3d.com/api/en-US/head/package/',
  29. 'content_overview': 'https://www.assetstore.unity3d.com/api/en-US/content/overview/',
  30. 'price': 'https://www.assetstore.unity3d.com/api/en-US/content/price/'
  31. };
  32.  
  33. /**
  34. * replace all assetstore text with link
  35. */
  36. function replaceTextLinks() {
  37. let urlRegex = /\b(https?:\/\/[^\s+\"\<\>]+)/ig;
  38. let snapTextElements = document.evaluate("//text()[not(ancestor::a) " +
  39. "and not(ancestor::script) and not(ancestor::style) and " +
  40. "contains(translate(., 'HTTP', 'http'), 'http') and contains(., 'assetstore.unity3d')]",
  41. document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  42. for (let i = snapTextElements.snapshotLength - 1; i >= 0; i--) {
  43. let elmText = snapTextElements.snapshotItem(i);
  44. if (urlRegex.test(elmText.nodeValue)) {
  45.  
  46. let elmSpan = document.createElement("div");
  47. elmSpan.className = "unitystore-holder";
  48. let sURLText = elmText.nodeValue;
  49. elmSpan.dataset.id = sURLText.split('/').pop().trim();
  50.  
  51. elmText.parentNode.replaceChild(elmSpan, elmText);
  52. urlRegex.lastIndex = 0;
  53. for (var match = null, lastLastIndex = 0;
  54. (match = urlRegex.exec(sURLText));) {
  55. elmSpan.appendChild(document.createTextNode(
  56. sURLText.substring(lastLastIndex, match.index)));
  57. let elmLink = document.createElement("a");
  58. elmLink.className = "unitystore-link";
  59. elmLink.setAttribute("href", match[0]);
  60. elmLink.setAttribute("target", '_blank');
  61. elmLink.appendChild(document.createTextNode(match[0]));
  62. elmSpan.appendChild(elmLink);
  63. lastLastIndex = urlRegex.lastIndex;
  64. }
  65. elmSpan.appendChild(document.createTextNode(
  66. sURLText.substring(lastLastIndex)));
  67. elmSpan.normalize();
  68. }
  69. }
  70. }
  71.  
  72. /**
  73. * add styles
  74. */
  75. function addStyles() {
  76. GM_addStyle(
  77. `@import url('//fonts.googleapis.com/css?family=Roboto:100,400');
  78. @charset "UTF-8";.fancybox-enabled{overflow:hidden}.fancybox-enabled body{overflow:visible;height:100%}.fancybox-container{position:fixed;top:0;left:0;width:100%;height:100%;z-index:99993;-webkit-backface-visibility:hidden;backface-visibility:hidden}.fancybox-container~.fancybox-container{z-index:99992}.fancybox-bg{position:absolute;top:0;right:0;bottom:0;left:0;background:#0f0f11;opacity:0;transition-timing-function:cubic-bezier(.55,.06,.68,.19);-webkit-backface-visibility:hidden;backface-visibility:hidden}.fancybox-container--ready .fancybox-bg{opacity:.87;transition-timing-function:cubic-bezier(.22,.61,.36,1)}.fancybox-controls{position:absolute;top:0;left:0;right:0;text-align:center;opacity:0;z-index:99994;transition:opacity .2s;pointer-events:none;-webkit-backface-visibility:hidden;backface-visibility:hidden;direction:ltr}.fancybox-show-controls .fancybox-controls{opacity:1}.fancybox-infobar{display:none}.fancybox-show-infobar .fancybox-infobar{display:inline-block;pointer-events:all}.fancybox-infobar__body{display:inline-block;width:70px;line-height:44px;font-size:13px;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;text-align:center;color:#ddd;background-color:rgba(30,30,30,.7);pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent;-webkit-font-smoothing:subpixel-antialiased}.fancybox-buttons{position:absolute;top:0;right:0;display:none;pointer-events:all}.fancybox-show-buttons .fancybox-buttons{display:block}.fancybox-slider-wrap{overflow:hidden;direction:ltr}.fancybox-slider,.fancybox-slider-wrap{position:absolute;top:0;left:0;bottom:0;right:0;padding:0;margin:0;z-index:99993;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-tap-highlight-color:transparent}.fancybox-slide{position:absolute;top:0;left:0;width:100%;height:100%;margin:0;padding:0;overflow:auto;outline:none;white-space:normal;box-sizing:border-box;text-align:center;z-index:99994;-webkit-overflow-scrolling:touch}.fancybox-slide:before{content:"";height:100%;width:0}.fancybox-slide:before,.fancybox-slide>*{display:inline-block;vertical-align:middle}.fancybox-slide>*{position:relative;padding:24px;margin:44px 0;border-width:0;text-align:left;background-color:#fff;overflow:auto;box-sizing:border-box}.fancybox-slide--image{overflow:hidden}.fancybox-slide--image:before{display:none}.fancybox-content{display:inline-block;position:relative;margin:44px auto;padding:0;border:0;width:80%;height:calc(100% - 88px);vertical-align:middle;line-height:normal;text-align:left;white-space:normal;outline:none;font-size:16px;font-family:Arial,sans-serif;box-sizing:border-box;-webkit-tap-highlight-color:transparent;-webkit-overflow-scrolling:touch}.fancybox-iframe{display:block;margin:0;padding:0;border:0;width:100%;height:100%;background:#fff}.fancybox-slide--video .fancybox-content,.fancybox-slide--video .fancybox-iframe{background:transparent}.fancybox-placeholder{z-index:99995;background:transparent;cursor:default;overflow:visible;-webkit-transform-origin:top left;transform-origin:top left;background-size:100% 100%;background-repeat:no-repeat;-webkit-backface-visibility:hidden;backface-visibility:hidden}.fancybox-image,.fancybox-placeholder,.fancybox-spaceball{position:absolute;top:0;left:0;margin:0;padding:0;border:0}.fancybox-image,.fancybox-spaceball{width:100%;height:100%;max-width:none;max-height:none;background:transparent;background-size:100% 100%}.fancybox-controls--canzoomOut .fancybox-placeholder{cursor:zoom-out}.fancybox-controls--canzoomIn .fancybox-placeholder{cursor:zoom-in}.fancybox-controls--canGrab .fancybox-placeholder{cursor:-webkit-grab;cursor:grab}.fancybox-controls--isGrabbing .fancybox-placeholder{cursor:-webkit-grabbing;cursor:grabbing}.fancybox-spaceball{z-index:1}.fancybox-tmp{position:absolute;top:-9999px;left:-9999px;visibility:hidden}.fancybox-error{position:absolute;margin:0;padding:40px;top:50%;left:50%;width:380px;max-width:100%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);background:#fff;cursor:default}.fancybox-error p{margin:0;padding:0;color:#444;font:16px/20px Helvetica Neue,Helvetica,Arial,sans-serif}.fancybox-close-small{position:absolute;top:0;right:0;width:44px;height:44px;padding:0;margin:0;border:0;border-radius:0;outline:none;background:transparent;z-index:10;cursor:pointer}.fancybox-close-small:after{content:"×";position:absolute;top:5px;right:5px;width:30px;height:30px;font:20px/30px Arial,Helvetica Neue,Helvetica,sans-serif;color:#888;font-weight:300;text-align:center;border-radius:50%;border-width:0;background:#fff;transition:background .2s;box-sizing:border-box;z-index:2}.fancybox-close-small:focus:after{outline:1px dotted #888}.fancybox-slide--video .fancybox-close-small{top:-36px;right:-36px;background:transparent}.fancybox-close-small:hover:after{color:#555;background:#eee}.fancybox-caption-wrap{position:absolute;bottom:0;left:0;right:0;padding:60px 30px 0;z-index:99998;-webkit-backface-visibility:hidden;backface-visibility:hidden;box-sizing:border-box;background:linear-gradient(180deg,transparent 0,rgba(0,0,0,.1) 20%,rgba(0,0,0,.2) 40%,rgba(0,0,0,.6) 80%,rgba(0,0,0,.8));opacity:0;transition:opacity .2s;pointer-events:none}.fancybox-show-caption .fancybox-caption-wrap{opacity:1}.fancybox-caption{padding:30px 0;border-top:1px solid hsla(0,0%,100%,.4);font-size:14px;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;color:#fff;line-height:20px;-webkit-text-size-adjust:none}.fancybox-caption a,.fancybox-caption button{pointer-events:all}.fancybox-caption a{color:#fff;text-decoration:underline}.fancybox-button{display:inline-block;position:relative;width:44px;height:44px;line-height:44px;margin:0;padding:0;border:0;border-radius:0;cursor:pointer;background:transparent;color:#fff;box-sizing:border-box;vertical-align:top;outline:none}.fancybox-button--disabled{cursor:default;pointer-events:none}.fancybox-button,.fancybox-infobar__body{background:rgba(30,30,30,.6)}.fancybox-button:hover{background:rgba(0,0,0,.8)}.fancybox-button:after,.fancybox-button:before{content:"";pointer-events:none;position:absolute;border-color:#fff;background-color:currentColor;color:currentColor;opacity:.9;box-sizing:border-box;display:inline-block}.fancybox-button--disabled:after,.fancybox-button--disabled:before{opacity:.5}.fancybox-button--left:after{left:20px;-webkit-transform:rotate(-135deg);transform:rotate(-135deg)}.fancybox-button--left:after,.fancybox-button--right:after{top:18px;width:6px;height:6px;background:transparent;border-top:2px solid currentColor;border-right:2px solid currentColor}.fancybox-button--right:after{right:20px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.fancybox-button--left{border-bottom-left-radius:5px}.fancybox-button--right{border-bottom-right-radius:5px}.fancybox-button--close{float:right}.fancybox-button--close:after,.fancybox-button--close:before{content:"";display:inline-block;position:absolute;height:2px;width:16px;top:calc(50% - 1px);left:calc(50% - 8px)}.fancybox-button--close:before{-webkit-transform:rotate(45deg);transform:rotate(45deg)}.fancybox-button--close:after{-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.fancybox-loading{border:6px solid hsla(0,0%,39%,.4);border-top:6px solid hsla(0,0%,100%,.6);border-radius:100%;height:50px;width:50px;-webkit-animation:a .8s infinite linear;animation:a .8s infinite linear;background:transparent;position:absolute;top:50%;left:50%;margin-top:-25px;margin-left:-25px;z-index:99999}@-webkit-keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@media (max-width:800px){.fancybox-controls{text-align:left}.fancybox-button--left,.fancybox-button--right,.fancybox-buttons button:not(.fancybox-button--close){display:none!important}.fancybox-caption{padding:20px 0;margin:0}}.fancybox-button--fullscreen:before{width:15px;height:11px;left:15px;top:16px;border:2px solid;background:none}.fancybox-button--play:before{top:16px;left:18px;width:0;height:0;border-top:6px inset transparent;border-bottom:6px inset transparent;border-left:10px solid;border-radius:1px;background:transparent}.fancybox-button--pause:before{top:16px;left:18px;width:7px;height:11px;border-style:solid;border-width:0 2px;background:transparent}.fancybox-button--thumbs span{font-size:23px}.fancybox-button--thumbs:before{top:20px;left:21px;width:3px;height:3px;box-shadow:0 -4px 0,-4px -4px 0,4px -4px 0,inset 0 0 0 32px,-4px 0 0,4px 0 0,0 4px 0,-4px 4px 0,4px 4px 0}.fancybox-container--thumbs .fancybox-caption-wrap,.fancybox-container--thumbs .fancybox-controls,.fancybox-container--thumbs .fancybox-slider-wrap{right:220px}.fancybox-thumbs{position:absolute;top:0;right:0;bottom:0;left:auto;width:220px;margin:0;padding:5px 5px 0 0;background:#fff;z-index:99993;word-break:normal;-webkit-overflow-scrolling:touch;-webkit-tap-highlight-color:transparent;box-sizing:border-box}.fancybox-thumbs>ul{list-style:none;position:absolute;position:relative;width:100%;height:100%;margin:0;padding:0;overflow-x:hidden;overflow-y:auto;font-size:0}.fancybox-thumbs>ul>li{float:left;overflow:hidden;max-width:50%;padding:0;margin:0;width:105px;height:75px;position:relative;cursor:pointer;outline:none;border:5px solid #fff;border-top-width:0;border-right-width:0;-webkit-tap-highlight-color:transparent;-webkit-backface-visibility:hidden;backface-visibility:hidden;box-sizing:border-box}li.fancybox-thumbs-loading{background:rgba(0,0,0,.1)}.fancybox-thumbs>ul>li>img{position:absolute;top:0;left:0;min-width:100%;min-height:100%;max-width:none;max-height:none;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.fancybox-thumbs>ul>li:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:2px;border:4px solid #4ea7f9;z-index:99991;opacity:0;transition:all .2s cubic-bezier(.25,.46,.45,.94)}.fancybox-thumbs>ul>li.fancybox-thumbs-active:before{opacity:1}@media (max-width:800px){.fancybox-thumbs{display:none!important}.fancybox-container--thumbs .fancybox-caption-wrap,.fancybox-container--thumbs .fancybox-controls,.fancybox-container--thumbs .fancybox-slider-wrap{right:0}}
  79. .unitystore-holder{white-space:nowrap;}
  80. .unitystore-link {text-decoration: none; border-bottom: 1px dotted;}
  81. .unitystore-link:hover {border-bottom: 1px dotted rgba(0,0,0,0);}
  82. .unitystore-info-label {color: #2e2e2e; background: #8BC34A; padding: 2px 5px; border-radius: 3px; text-shadow: 1px 1px 0px white; position: relative; left: 5px; font-size: 0.8em;font-family:'Roboto',sans-serif; cursor: pointer;}
  83. .assetstore-dialog.popup-holder{width:798px;height:385px;background:#222b37;position:fixed;top:calc(50% - 195px);left:calc(50% - 395px);z-index:1001;box-shadow:0 0 15px #000}
  84. .assetstore-dialog .popup-holder-close{position:absolute;top:0;right:0;z-index:50;width:30px;height:30px;line-height:30px;background:#222b37;border-radius:0;cursor:pointer;vertical-align:top;outline:0;padding:4px}
  85. .assetstore-dialog .popup-holder-content{padding:5px;position:relative;background-position:right;min-height:100%;-webkit-background-clip:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;background-repeat:no-repeat;box-sizing:border-box}
  86. .assetstore-dialog .popup-holder-main-info{position:absolute;top:0;bottom:0;left:0;width:250px;margin:0;overflow:auto;background-color:#222b37;padding:20px 15px 20px 20px}
  87. .assetstore-dialog .overview-text-overlay{color:#fff;font-family:'Roboto',sans-serif;font-size:12px}
  88. .assetstore-dialog .overview-text-overlay h1{font-family:'Roboto',sans-serif;font-size:28px;line-height:32px;font-weight:100;margin:0;overflow:hidden;text-overflow:ellipsis}
  89. .assetstore-dialog .overview-text-overlay .details-container{font-family:'Roboto',sans-serif;padding:0;position:relative;white-space:nowrap;font-size:16px;line-height:24px}
  90. .assetstore-dialog .overview-text-overlay .details-container .asset-price{margin-top:5px;font-weight:400;color:#8ac249}
  91. .assetstore-dialog .overview-text-overlay span{font-weight:100;display:block;overflow:hidden;text-overflow:ellipsis}
  92. .assetstore-dialog .overview-text-overlay .notes{margin:10px 0}
  93. .assetstore-dialog .overview-text-overlay .notes .min-unity-version,.assetstore-dialog .overview-text-overlay .notes .package-size,.assetstore-dialog .overview-text-overlay .notes .package-version{margin:5px;font-weight:400}
  94. .assetstore-dialog .overview-text-overlay .fulldescription{word-break:break-word;font-weight:300;line-height:16px}
  95. .assetstore-dialog .overview-text-overlay .fulldescription a{color:#fff;text-decoration:underline}
  96. .assetstore-dialog .overview-text-overlay .fulldescription strong{font-weight: 400;}
  97. .assetstore-dialog ::-webkit-scrollbar{width:6px;height:6px}
  98. .assetstore-dialog ::-webkit-scrollbar-button{width:0;height:0}
  99. .assetstore-dialog ::-webkit-scrollbar-thumb{background:#e1e1e1;border:0 none #fff;border-radius:0}
  100. .assetstore-dialog ::-webkit-scrollbar-thumb:hover{background:#fff}
  101. .assetstore-dialog ::-webkit-scrollbar-thumb:active{background:#000}
  102. .assetstore-dialog ::-webkit-scrollbar-track{background:#666;border:0 none #fff;border-radius:0}
  103. .assetstore-dialog ::-webkit-scrollbar-track:hover{background:#666}
  104. .assetstore-dialog ::-webkit-scrollbar-track:active{background:#333}
  105. .assetstore-dialog ::-webkit-scrollbar-corner{background:transparent}
  106. .assetstore-dialog .screen-holder{position:absolute;background:rgba(0,0,0,0.85);padding:5px;bottom:0;right:0}
  107. .assetstore-dialog .screen-holder img{width:140px;cursor:pointer;margin:0 3px;}`
  108. );
  109. }
  110.  
  111. function addInfoLabel() {
  112. $('.unitystore-holder').each(function (el) {
  113. let small = $('<small/>').addClass('unitystore-info-label').html('Detail');
  114. small.unbind().on('click', function (e) {
  115. let $label = $(this);
  116. $label.html('Loading...');
  117. let id = $(this).parent().data('id');
  118. let info = {
  119. header: null,
  120. content: null,
  121. price: null
  122. };
  123. //console.log('clicked ', id);
  124. // get headers
  125. GM_xmlhttpRequest({
  126. method: "GET",
  127. url: apis.head + id + '.json',
  128. onload: function (response) {
  129. try {
  130. info.header = $.parseJSON(response.responseText);
  131. // price
  132. GM_xmlhttpRequest({
  133. method: "GET",
  134. url: apis.price + id + '.json',
  135. onload: function (response) {
  136. try {
  137. info.price = $.parseJSON(response.responseText);
  138. // content
  139. GM_xmlhttpRequest({
  140. method: "GET",
  141. url: apis.content_overview + id + '.json',
  142. onload: function (response) {
  143. try {
  144. info.content = $.parseJSON(response.responseText);
  145. $label.html('Detail');
  146. createPopup(info);
  147. } catch (e) {
  148. console.log('content request error');
  149. }
  150.  
  151. }
  152. });
  153.  
  154. } catch (e) {
  155. console.log('price request error');
  156. }
  157.  
  158. }
  159. });
  160.  
  161. } catch (e) {
  162. console.log('header request error');
  163. }
  164.  
  165. }
  166. });
  167. });
  168. $(this).append(small);
  169. });
  170. }
  171.  
  172. function createPopup(info) {
  173. console.log(info);
  174. let id = info.content.content.id;
  175.  
  176. preload([info.content.content.keyimage.big]);
  177.  
  178. let html = `
  179. <div class="assetstore-dialog popup-holder" style="display:none;">
  180. <div class="popup-holder-close"><svg width="30" height="30"><g stroke="rgb(160,160,160)" stroke-width="4"><line x1="5" y1="5" x2="25" y2="25"/><line x1="5" y1="25" x2="25" y2="5"/></g></svg></div>
  181. <div class="popup-holder-content" style="background-image: url(${info.content.content.keyimage.big});">`;
  182.  
  183. if (info.content.content.images.length > 0) {
  184. html += '<div class="screen-holder">';
  185. for (let i = 0; i <= 2; i++) {
  186. if (info.content.content.images[i] !== undefined) {
  187. let img = info.content.content.images[i];
  188. preload([img.thumb]);
  189. html += `<a data-fancybox="gallery_${id}" href="${img.link}"><img src="${img.thumb}"></a>`;
  190. }
  191. }
  192. html += '</div>';
  193. }
  194.  
  195. html += `</div>
  196. <div class="popup-holder-main-info">
  197. <div class="overview-text-overlay">
  198. <h1>${info.header.result.title}</h1>
  199. <div class="details-container">
  200. <span class="asset-category">${info.header.result.category}</span>
  201. <span class="asset-author">${info.header.result.publisher}</span>
  202. <span class="asset-price">${info.price.price}</span>
  203. </div>
  204. <div class="notes">
  205. <span class="package-version">Version: ${info.content.content.version} (${info.content.content.pubdate})</span>
  206. <span class="package-size">Size: ${info.content.content.sizetext}</span>
  207. <span class="min-unity-version">Requires Unity ${info.content.content.min_unity_version} or higher.</span>
  208. </div>
  209. <div class="fulldescription vscroll">${info.content.content.description}</div>
  210. </div>
  211. </div>
  212. </div>`;
  213.  
  214. let popup = $(html);
  215. $('.popup-holder-close', popup).on('click', function () {
  216. $(this).parent().remove();
  217. });
  218. $('.assetstore-dialog').remove();
  219. $('body').append(popup);
  220.  
  221. $("[data-fancybox]").fancybox({
  222. youtube: {
  223. controls: 1,
  224. showinfo: 1,
  225. autoplay: 0
  226. },
  227. vimeo: {
  228. color: 'f00'
  229. }
  230. });
  231.  
  232. setTimeout(function () {
  233. $('.assetstore-dialog').show();
  234. }, 100);
  235. }
  236.  
  237. function preload(images) {
  238. $(images).each(function () {
  239. (new Image()).src = this;
  240. });
  241. }
  242.  
  243. function init() {
  244. addStyles();
  245. replaceTextLinks();
  246. addInfoLabel()
  247. }
  248.  
  249. $(function () {
  250. init();
  251. });
  252.  
  253. })();