NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name oujs - Meta View // @namespace https://openuserjs.org/users/Marti // @author Marti Martz <martii@users.noreply.github.com> (https://openuserjs.org/scripts/Marti) // @description Adds a script navigation link next to `Source Code` titled `Meta` and opens a phantom url to show the detected metadata // @copyright 2014+, Marti Martz (https://openuserjs.org/users/Marti) // @license CC-BY-NC-SA-4.0; https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode // @license GPL-3.0-or-later; http://www.gnu.org/licenses/gpl-3.0.txt // @version 5.0.1 // @icon https://www.gravatar.com/avatar/7ff58eb098c23feafa72e0b4cd13f396?r=G&s=48&default=identicon // @homepageURL https://github.com/Martii/UserScripts/tree/master/src/oujs/Meta%20View // @homepageURL https://openuserjs.org/scripts/marti/oujs_-_Meta_View // @supportURL https://openuserjs.org/scripts/marti/oujs_-_Meta_View/issues // @updateURL https://openuserjs.org/meta/Marti/oujs_-_Meta_View.meta.js // @downloadURL https://openuserjs.org/install/Marti/oujs_-_Meta_View.min.user.js // @include /^https?://openuserjs\.org(?::\d{1,5})?/scripts// // @include /^http://localhost(?::\d{1,5})?/scripts// // @include https://openuserjs.org/scripts/* // @include http://localhost:8080/scripts/* // @match https://openuserjs.org/scripts/* // @match http://localhost:8080/scripts/* // @grant none // ==/UserScript== // ==OpenUserJS== // @author Marti // ==/OpenUserJS== /* jshint esversion: 5 */ /* globals ace */ /* eslint dot-notation: off */ /* eslint curly: off */ (function() { 'use strict'; /** * */ var FQDN = window.location.protocol + '//' + window.location.host; var matches = location.pathname.match(/^\/scripts\/(.*?)\/(.*?)(?:$|\/)/); if (matches) { var userName = matches[1], scriptName = matches[2] ; var hookNode; if (/\/meta$/.test(location.pathname)) { // NOTE: Currently a 404 page // Simulate a Source Code page var bodyNode = document.querySelector('body'); var NodeScript = document.createElement('script'); // Watchpoint NodeScript.setAttribute('src', '/redist/npm/ace-builds/src/ace.js'); NodeScript.setAttribute('type', 'text/javascript'); NodeScript.setAttribute('charset', 'UTF-8'); bodyNode.appendChild(NodeScript); var NodeLink = document.createElement('link'); NodeLink.setAttribute('rel', 'stylesheet'); NodeLink.setAttribute('type', 'text/css'); NodeLink.setAttribute('href', '/redist/npm/animate.css/animate.css'); bodyNode.appendChild(NodeLink); var NodeStyle = document.createElement('style'); NodeStyle.setAttribute('type', 'text/css'); var min_height = 85.2; var offset = 292; var textSVGMetaJS = 'data:image/svg+xml;base64,' + window.btoa([ '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 -200 14.482108 52.124682" height="52.12">', '<g fill="#ccc">', '<path d="m9.668-150.24q-.36-.36-.36-.875 0-.515.36-.875.36-.36.875-.36.515 0 .875.36.36.36.36.875 0 .515-.36.875-.36.36-.875.36-.515 0-.875-.36"/>', '<path d="m3.241-160.82q0-2.128 2.265-2.128h6.28v2.299h-6.555q-.137 0-.24.094-.103.094-.103.232v.738q0 .137.103.232.103.094.24.094h6.555v2.299h-6.555q-.137 0-.24.094-.103.094-.103.232v.738q0 .137.103.232.103.094.24.094h6.555v2.299h-8.374v-2.093h.429q-.601-.532-.601-1.613v-.154q0-1.27.789-1.767-.789-.532-.789-1.767v-.154"/>', '<path d="m3.051-168.11q0-2.128 2.265-2.128h2.711v3.895h1.75q.137 0 .24-.094.103-.094.103-.232v-.944q0-.137-.103-.232-.103-.094-.24-.094h-.927v-2.299h.652q2.265 0 2.265 2.128v1.939q0 2.128-2.265 2.128h-4.187q-2.265 0-2.265-2.128v-1.939m3.466 1.767v-1.596h-1.544q-.137 0-.24.094-.103.094-.103.232v.944q0 .137.103.232.103.094.24.094h1.544"/>', '<path d="m10.288-174.6v-.686h1.493v1.613q0 2.128-2.265 2.128h-8.099v-2.299h1.819v-1.441h1.664v1.441h4.564q.48 0 .652-.189.172-.189.172-.566"/>', '<path d="m3.236-180.91v-1.939h8.374v1.939h-.618q.789.532.789 1.767v.36q0 2.128-2.265 2.128h-4.187q-2.265 0-2.265-2.128v-.36q0-1.235.789-1.767h-.618m6.555.36h-4.736q-.137 0-.24.094-.103.094-.103.232v.944q0 .137.103.232.103.094.24.094h4.736q.137 0 .24-.094.103-.094.103-.232v-.944q0-.137-.103-.232-.103-.094-.24-.094"/>', '<path d="m9.672-184.36q-.36-.36-.36-.875 0-.515.36-.875.36-.36.875-.36.515 0 .875.36.36.36.36.875 0 .515-.36.875-.36.36-.875.36-.515 0-.875-.36"/>', '<path d="m11.977-188.26h-8.768v-2.299h9.01q2.265 0 2.265 2.128v1.39h-1.682v-.463q0-.377-.172-.566-.172-.189-.652-.189m-9.455-1.15q0 .515-.369.892-.369.377-.892.377-.523 0-.892-.377-.369-.377-.369-.892 0-.515.369-.884.369-.369.901-.369.532 0 .892.369.36.369.36.884"/>', '<path d="m6.325-195.87q0-2.128 2.265-2.128h.892q2.265 0 2.265 2.128v1.905q0 2.128-2.265 2.128h-.532v-2.128h.755q.137 0 .24-.094.103-.094.103-.232v-1.407q0-.137-.103-.232-.103-.094-.24-.094h-1.03q-.137 0-.24.094-.103.094-.103.232v1.767q0 2.128-2.265 2.128h-.772q-2.265 0-2.265-2.128v-1.802q0-2.128 2.265-2.128h.309v2.128h-.532q-.137 0-.24.094-.103.094-.103.232v1.304q0 .137.103.232.103.094.24.094h.909q.137 0 .24-.094.103-.094.103-.232v-1.767"/>', '</g>', '</svg>' ].join('')); var textSVGMetaJSON = 'data:image/svg+xml;base64,' + window.btoa([ '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 -200 14.48211 66.085035" height="66.09">', '<g fill="#ccc">', '<path d="m9.668-136.28q-.36-.36-.36-.875 0-.515.36-.875.36-.36.875-.36.515 0 .875.36.36.36.36.875 0 .515-.36.875-.36.36-.875.36-.515 0-.875-.36"/>', '<path d="m3.241-146.86q0-2.128 2.265-2.128h6.28v2.299h-6.555q-.137 0-.24.094-.103.094-.103.232v.738q0 .137.103.232.103.094.24.094h6.555v2.299h-6.555q-.137 0-.24.094-.103.094-.103.232v.738q0 .137.103.232.103.094.24.094h6.555v2.299h-8.374v-2.093h.429q-.601-.532-.601-1.613v-.154q0-1.27.789-1.767-.789-.532-.789-1.767v-.154"/>', '<path d="m3.051-154.15q0-2.128 2.265-2.128h2.711v3.895h1.75q.137 0 .24-.094.103-.094.103-.232v-.944q0-.137-.103-.232-.103-.094-.24-.094h-.927v-2.299h.652q2.265 0 2.265 2.128v1.939q0 2.128-2.265 2.128h-4.187q-2.265 0-2.265-2.128v-1.939m3.466 1.767v-1.596h-1.544q-.137 0-.24.094-.103.094-.103.232v.944q0 .137.103.232.103.094.24.094h1.544"/>', '<path d="m10.288-160.64v-.686h1.493v1.613q0 2.128-2.265 2.128h-8.099v-2.299h1.819v-1.441h1.664v1.441h4.564q.48 0 .652-.189.172-.189.172-.566"/>', '<path d="m3.236-166.95v-1.939h8.374v1.939h-.618q.789.532.789 1.767v.36q0 2.128-2.265 2.128h-4.187q-2.265 0-2.265-2.128v-.36q0-1.235.789-1.767h-.618m6.555.36h-4.736q-.137 0-.24.094-.103.094-.103.232v.944q0 .137.103.232.103.094.24.094h4.736q.137 0 .24-.094.103-.094.103-.232v-.944q0-.137-.103-.232-.103-.094-.24-.094"/>', '<path d="m9.672-170.4q-.36-.36-.36-.875 0-.515.36-.875.36-.36.875-.36.515 0 .875.36.36.36.36.875 0 .515-.36.875-.36.36-.875.36-.515 0-.875-.36"/>', '<path d="m11.977-174.3h-8.768v-2.299h9.01q2.265 0 2.265 2.128v1.39h-1.682v-.463q0-.377-.172-.566-.172-.189-.652-.189m-9.455-1.15q0 .515-.369.892-.369.377-.892.377-.523 0-.892-.377-.369-.377-.369-.892 0-.515.369-.884.369-.369.901-.369.532 0 .892.369.36.369.36.884"/>', '<path d="m6.325-181.91q0-2.128 2.265-2.128h.892q2.265 0 2.265 2.128v1.905q0 2.128-2.265 2.128h-.532v-2.128h.755q.137 0 .24-.094.103-.094.103-.232v-1.407q0-.137-.103-.232-.103-.094-.24-.094h-1.03q-.137 0-.24.094-.103.094-.103.232v1.767q0 2.128-2.265 2.128h-.772q-2.265 0-2.265-2.128v-1.802q0-2.128 2.265-2.128h.309v2.128h-.532q-.137 0-.24.094-.103.094-.103.232v1.304q0 .137.103.232.103.094.24.094h.909q.137 0 .24-.094.103-.094.103-.232v-1.767"/>', '<path d="m5.305-190.99h4.197q2.271 0 2.271 2.133v1.944q0 2.133-2.271 2.133h-4.197q-2.271 0-2.271-2.133v-1.944q0-2.133 2.271-2.133m4.679 2.305h-5.178q-.138 0-.241.095-.103.095-.103.232v.946q0 .138.103.232.103.095.241.095h5.178q.138 0 .241-.095.103-.095.103-.232v-.946q0-.138-.103-.232-.103-.095-.241-.095"/>', '<path d="m11.786-194v2.36h-8.595v-2.149h.44q-.616-.546-.616-1.656v-.37q0-2.184 2.325-2.184h6.446v2.36h-6.728q-.141 0-.247.097-.106.097-.106.238v.969q0 .141.106.238.106.097.247.097h6.728"/>', '</g>', '</svg>' ].join('')); NodeStyle.textContent = [ '#mdb { min-height: 115px; overflow: auto; }', '#json { min-height: 115px; height: -moz-calc(' + min_height + 'vh - ' + offset + 'px); height: -o-calc(' + min_height + 'vh - ' + offset + 'px); height: -webkit-calc(' + min_height + 'vh - ' + offset + 'px); height: calc(' + min_height + 'vh - ' + offset + 'px); overflow: auto; }', '.path-divider { color: #666; margin: 0 0.25em; }', '#mdb .ace_gutter { background: #ebebeb url(' + textSVGMetaJS + ') repeat-y scroll left top !important; }', '#json .ace_gutter { background: #ebebeb url(' + textSVGMetaJSON + ') repeat-y scroll left top !important; }' ].join('\n') ; document.head.appendChild(NodeStyle); var panelBodyNode = document.querySelector('div.panel-body'); if (panelBodyNode && panelBodyNode.firstChild.nextSibling.textContent == '404') { var titleNode = document.head.querySelector('title'); if (titleNode) titleNode.textContent = 'Meta ' + scriptName + '| OpenUserJS'; hookNode = panelBodyNode.parentNode; // Reset content while (hookNode.hasChildNodes()) hookNode.removeChild(hookNode.firstChild); hookNode.classList.remove('panel-default'); hookNode.classList.remove('panel'); hookNode.classList.add('panel-group'); // Simulate navbar var navbar2TextStrongNodeB = document.createElement('b'); navbar2TextStrongNodeB.textContent = 'Installs:'; var navbar2TextIconNodeI = document.createElement('i'); navbar2TextIconNodeI.classList.add('fa'); navbar2TextIconNodeI.classList.add('fa-fw'); navbar2TextIconNodeI.classList.add('fa-signal'); var navbar2TextNodeP = document.createElement('p'); navbar2TextNodeP.classList.add('navbar-text'); navbar2TextNodeP.classList.add('pull-right'); navbar2TextNodeP.classList.add('hidden-xs'); var navNodeUl = document.createElement('ul'); navNodeUl.classList.add('nav'); navNodeUl.classList.add('navbar-nav'); var navNodeA4 = document.createElement('a'); navNodeA4.textContent = 'Issues '; navNodeA4.href = '/scripts/' + userName + '/' + scriptName + '/issues'; var navNodeLi4 = document.createElement('li'); var navNodeA3 = document.createElement('a'); navNodeA3.textContent = 'Meta'; navNodeA3.href = '/scripts/' + userName + '/' + scriptName + '/meta'; navNodeA3.classList.add('notranslate'); navNodeA3.setAttribute('translate', 'no'); var navNodeLi3 = document.createElement('li'); navNodeLi3.classList.add('active'); var navNodeA2 = document.createElement('a'); navNodeA2.textContent = 'Source Code'; navNodeA2.href = '/scripts/' + userName + '/' + scriptName + '/source'; var navNodeLi2 = document.createElement('li'); var navNodeA1 = document.createElement('a'); navNodeA1.textContent = 'About'; navNodeA1.href = '/scripts/' + userName + '/' + scriptName; var navNodeLi1 = document.createElement('li'); var navbarCollapseNodeDiv = document.createElement('div'); navbarCollapseNodeDiv.classList.add('navbar-collapse'); navbarCollapseNodeDiv.classList.add('collapse'); navbarCollapseNodeDiv.classList.add('in'); navbarCollapseNodeDiv.id = 'content-navbar'; var navbar1TextStrongNodeB = document.createElement('b'); navbar1TextStrongNodeB.textContent = 'Installs:'; var navbar1TextIconNodeI = document.createElement('i'); navbar1TextIconNodeI.classList.add('fa'); navbar1TextIconNodeI.classList.add('fa-fw'); navbar1TextIconNodeI.classList.add('fa-signal'); var navbar1TextNodeP = document.createElement('p'); navbar1TextNodeP.classList.add('navbar-text'); navbar1TextNodeP.classList.add('visible-xs'); var navbarBrandNodeDiv = document.createElement('div'); navbarBrandNodeDiv.classList.add('navbar-brand'); navbarBrandNodeDiv.classList.add('visible-xs'); var navbarToggleIconNodeI = document.createElement('i'); navbarToggleIconNodeI.classList.add('fa'); navbarToggleIconNodeI.classList.add('fa-bars'); var navbarToggleNodeButton = document.createElement('button'); navbarToggleNodeButton.type = 'button'; navbarToggleNodeButton.setAttribute('data-toggle', 'collapse'); navbarToggleNodeButton.setAttribute('data-target', '#content-navbar'); navbarToggleNodeButton.classList.add('navbar-toggle'); var navbarHeaderNodeDiv = document.createElement('div'); navbarHeaderNodeDiv.classList.add('navbar-header'); var navbarNodeNav = document.createElement('nav'); navbarNodeNav.classList.add('navbar'); navbarNodeNav.classList.add('navbar-default'); navbarNodeNav.classList.add('navbar-static-top'); navbarNodeNav.setAttribute('role', 'navigation'); // Watchpoint // Piece elements together navbarNodeNav.appendChild(navbarHeaderNodeDiv); navbarHeaderNodeDiv.appendChild(navbarToggleNodeButton); navbarToggleNodeButton.appendChild(navbarToggleIconNodeI); navbarHeaderNodeDiv.appendChild(navbarBrandNodeDiv); navbarHeaderNodeDiv.appendChild(navbar1TextNodeP); navbar1TextNodeP.appendChild(navbar1TextIconNodeI); navbar1TextNodeP.appendChild(navbar1TextStrongNodeB); navbarNodeNav.appendChild(navbarCollapseNodeDiv); navbarCollapseNodeDiv.appendChild(navNodeUl); navNodeUl.appendChild(navNodeLi1); navNodeLi1.appendChild(navNodeA1); navNodeUl.appendChild(navNodeLi2); navNodeLi2.appendChild(navNodeA2); navNodeUl.appendChild(navNodeLi3); navNodeLi3.appendChild(navNodeA3); navNodeUl.appendChild(navNodeLi4); navNodeLi4.appendChild(navNodeA4); navbarCollapseNodeDiv.appendChild(navbar2TextNodeP); navbar2TextNodeP.appendChild(navbar2TextIconNodeI); navbar2TextNodeP.appendChild(navbar2TextStrongNodeB); // Simulate the page-heading var scriptNameNodeA = document.createElement('a'); scriptNameNodeA.classList.add('script-name'); scriptNameNodeA.href = '/scripts/' + userName + '/' + scriptName; var pathDividerNodeSpan = document.createElement('span'); pathDividerNodeSpan.classList.add('path-divider'); pathDividerNodeSpan.textContent = '\u2003'; var scriptAuthorNodeA = document.createElement('a'); scriptAuthorNodeA.classList.add('script-author'); scriptAuthorNodeA.href = '/users/' + userName; scriptAuthorNodeA.textContent = '\u2003'; var pageHeadingNodeH2 = document.createElement('h2'); pageHeadingNodeH2.classList.add('page-heading'); // Piece elements together pageHeadingNodeH2.appendChild(document.createTextNode(' ')); pageHeadingNodeH2.appendChild(scriptAuthorNodeA); pageHeadingNodeH2.appendChild(document.createTextNode(' ')); pageHeadingNodeH2.appendChild(pathDividerNodeSpan); pageHeadingNodeH2.appendChild(document.createTextNode(' ')); pageHeadingNodeH2.appendChild(scriptNameNodeA); // Place parts into the DOM hookNode.parentNode.insertBefore(navbarNodeNav, hookNode.parentNode.firstChild); hookNode.parentNode.insertBefore(pageHeadingNodeH2, hookNode.parentNode.firstChild); // Status notices var NodeDiv1 = document.createElement('div'); NodeDiv1.classList.add('alert'); NodeDiv1.classList.add('alert-warning'); NodeDiv1.classList.add('ace_invisible'); NodeDiv1.classList.add('ace_emptyMessage'); var NodeStrong1 = document.createElement('strong'); NodeStrong1.textContent = 'PLEASE WAIT'; var NodeText1 = document.createTextNode(': Fetching the meta.js'); NodeDiv1.appendChild(NodeStrong1); NodeDiv1.appendChild(NodeText1); var NodeDiv2 = document.createElement('div'); NodeDiv2.classList.add('alert'); NodeDiv2.classList.add('alert-warning'); NodeDiv2.classList.add('ace_invisible'); NodeDiv2.classList.add('ace_emptyMessage'); var NodeStrong2 = document.createElement('strong'); NodeStrong2.textContent = 'PLEASE WAIT'; var NodeText2 = document.createTextNode(': Fetching the meta.json'); NodeDiv2.appendChild(NodeStrong2); NodeDiv2.appendChild(NodeText2); // Create meta views var jsonNodePre = document.createElement('pre'); jsonNodePre.classList.add('ace_editor'); jsonNodePre.classList.add('ace-dawn'); jsonNodePre.id = 'json'; jsonNodePre.textContent = ''; var mdbNodePre = document.createElement('pre'); mdbNodePre.classList.add('ace_editor'); mdbNodePre.classList.add('ace-dawn'); mdbNodePre.id = 'mdb'; mdbNodePre.textContent = ''; var scriptNameNodeSpinner = document.createElement('i'); scriptNameNodeSpinner.textContent = ''; scriptNameNodeSpinner.classList.add('fa'); scriptNameNodeSpinner.classList.add('fa-cog'); scriptNameNodeSpinner.classList.add('fa-spin'); scriptNameNodeA.appendChild(scriptNameNodeSpinner); scriptAuthorNodeA.textContent = decodeURI(userName); pathDividerNodeSpan.textContent = "/"; hookNode.appendChild(mdbNodePre); hookNode.appendChild(jsonNodePre); // Toolbar var wrappedNodeInput = document.createElement('input'); wrappedNodeInput.classList.add('btn'); wrappedNodeInput.classList.add('btn-sm'); wrappedNodeInput.classList.add('btn-success'); wrappedNodeInput.id = 'wrap'; wrappedNodeInput.setAttribute('value', 'Wrap'); wrappedNodeInput.type = 'button'; wrappedNodeInput.setAttribute('disabled', 'disabled'); var toolbarNodeDiv = document.createElement('div'); toolbarNodeDiv.classList.add('btn-toolbar'); toolbarNodeDiv.appendChild(wrappedNodeInput); hookNode.appendChild(toolbarNodeDiv); var thisAce = null; var Id = setInterval(function () { thisAce = (typeof ace !== 'undefined' ? ace : (window.wrappedJSObject ? window.wrappedJSObject.ace : null)); if (thisAce) { clearInterval(Id); // Activate Ace var commands = ['showSettingsMenu', 'overwrite']; var mdb = thisAce.edit('mdb'); mdb.setTheme('ace/theme/dawn'); mdb.getSession().setMode('ace/mode/javascript'); mdb.container.style.fontFamily = "monospace"; commands.forEach(function (aE, aI, aA) { mdb.commands.removeCommand(aE); }); mdb.setReadOnly(true); var node1 = mdb.renderer.emptyMessageNode = NodeDiv1; mdb.renderer.scroller.appendChild(node1); var mdj = thisAce.edit('json'); mdj.setTheme('ace/theme/dawn'); mdj.getSession().setMode('ace/mode/json'); mdj.container.style.fontFamily = "monospace"; commands.forEach(function (aE, aI, aA) { mdj.commands.removeCommand(aE); }); mdj.setReadOnly(true); var node2 = mdb.renderer.emptyMessageNode = NodeDiv2; mdj.renderer.scroller.appendChild(node2); function hasRelative(aPrefix) { aPrefix = aPrefix || ''; var hasCalc = document.createElement('div'); hasCalc.style.setProperty(aPrefix + 'width', 'calc(1px)', ''); var hasUnitV = document.createElement("div"); hasUnitV.style.setProperty(aPrefix + "width", "calc(5vw + 5vw)", ""); return !!hasCalc.style.length && !!hasUnitV.style.length; } function hasOurRelative() { return hasRelative('-moz-') || hasRelative('-ms-') || hasRelative('-o-') || hasRelative('-webkit-') || hasRelative(); } function calcHeight() { return parseInt((window.innerHeight - 306) / 2.004); } // Find metas var url1 = FQDN + '/src/scripts/' + userName + '/' + scriptName + '.user.js'; var req1 = new XMLHttpRequest(); req1.open('GET', url1); req1.setRequestHeader('Accept', 'text/x-userscript-meta'); req1.onreadystatechange = function () { if (this.readyState == this.DONE) { console.log( [ 'META VIEW REQUEST SUMMARY', '', 'status: ' + this.status, 'statusText: ' + this.statusText, 'readyState: ' + this.readyState, 'getAllResponseHeaders():\n' + this.getAllResponseHeaders().split('\n').map(function (aE, aI, aA) { return ' ' + aE; }).join('\n'), 'responseURL: ' + this.responseURL ].join('\n') ); switch (this.status) { case 200: if (!this.responseText) { NodeDiv1.classList.remove('alert-warning'); NodeDiv1.classList.add('alert-danger'); NodeStrong1.textContent = "FAILURE: "; NodeText1.textContent = "Unable to retrieve the meta text. `responseText` is absent."; scriptNameNodeSpinner.classList.remove('fa-spin'); scriptNameNodeSpinner.classList.add('fa-pulse'); return; } var responseTextMetaJS = this.responseText.trim(); mdb.setValue(responseTextMetaJS); mdb.clearSelection(); mdb.moveCursorTo(0,0); // Clean up mdb.renderer.scroller.removeChild(node1); // Resize for older browsers if (!hasOurRelative()) { mdbNodePre.style.setProperty('height', calcHeight() + 'px', ''); if (window.addEventListener) { window.addEventListener('resize', function () { mdbNodePre.style.setProperty('height', calcHeight() + 'px', ''); }, false); } else if (window.attachEvent) { window.addEventListener('resize', function () { mdbNodePre.style.setProperty('height', calcHeight() + 'px', ''); }); } } break; default: NodeDiv1.classList.remove('alert-warning'); NodeDiv1.classList.add('alert-danger'); NodeStrong1.textContent = 'ERROR'; NodeText1.textContent = ': Unable to fetch the meta.js with status of: ' + this.status + ' ' + this.statusText + (this.status === 429 ? '. Try again in ' + (this.getResponseHeader('Retry-After') ? this.getResponseHeader('Retry-After') + ' seconds.' : 'a few.') : ''); scriptNameNodeSpinner.classList.remove('fa-spin'); scriptNameNodeSpinner.classList.add('fa-pulse'); break; } } }; NodeText2.textContent = ": Fetching the meta.json"; var url2 = FQDN + '/meta/' + userName + '/' + scriptName + '.meta.json'; var req2 = new XMLHttpRequest(); req2.open('GET', url2); req2.onreadystatechange = function () { if (this.readyState == this.DONE) { switch (this.status) { case 200: if (!this.responseText) { NodeDiv2.classList.remove('alert-warning'); NodeDiv2.classList.add('alert-danger'); NodeStrong2.textContent = "FAILURE: "; NodeText2.textContent = "Unable to retrieve the meta JSON. `responseText` is absent."; scriptNameNodeSpinner.classList.remove('fa-spin'); scriptNameNodeSpinner.classList.add('fa-pulse'); return; } var responseTextMetaJSON = this.responseText; var meta = JSON.parse(responseTextMetaJSON); mdj.setValue(JSON.stringify(meta, null, ' ')); mdj.clearSelection(); mdj.moveCursorTo(0,0); // Finish up DOM wrappedNodeInput.addEventListener('click', function (aE) { var active = false; if (document.querySelector('pre#mdb')) { if (thisAce.edit('mdb').getSession().getUseWrapMode()) { thisAce.edit('mdb').getSession().setUseWrapMode(false); } else { thisAce.edit('mdb').getSession().setUseWrapMode(true); active = true; } } if (document.querySelector('pre#json')) { if (thisAce.edit('json').getSession().getUseWrapMode()) { thisAce.edit('json').getSession().setUseWrapMode(false); } else { thisAce.edit('json').getSession().setUseWrapMode(true); active = true; } } if (active) { aE.target.classList.add('active'); } else { aE.target.classList.remove('active'); } aE.target.blur(); }); wrappedNodeInput.removeAttribute('disabled'); // Update title to be native var scriptNameX = null; meta.UserScript['name'].forEach(function (e, i, a) { if (!e.locale) { // Default to absent locale... requirement of OUJS to have `@name` scriptNameX = e.value; } }); titleNode.textContent = 'Meta ' + scriptNameX + ' | OpenUserJS'; // Update srcript name scriptNameNodeA.textContent = scriptNameX; // Update issue count var issueCount = meta.OpenUserJS && meta.OpenUserJS.issues && meta.OpenUserJS.issues[0] && typeof meta.OpenUserJS.issues[0].value !== 'undefined' ? meta.OpenUserJS.issues[0].value : null; if (issueCount && issueCount !== '0') { var navNodeA4Span4 = document.createElement('span'); navNodeA4Span4.classList.add('badge'); var nodeUsername = document.querySelector('.navbar-default .navbar-right li a[href^="/users/"]'); if (nodeUsername) { var matches = nodeUsername.href.match(/\/users\/(.*)$/) ; if (matches && matches[1].toLowerCase() === userName.toLowerCase()) { navNodeA4Span4.classList.add('animate__animated'); navNodeA4Span4.classList.add('animate__zoomInRight'); navNodeA4Span4.classList.add('animate__slow'); } } navNodeA4.appendChild(navNodeA4Span4); navNodeA4Span4.textContent = issueCount; } // Update install count var installCount = meta.OpenUserJS && meta.OpenUserJS.installs && meta.OpenUserJS.installs[0] && typeof meta.OpenUserJS.installs[0].value !== 'undefined' ? meta.OpenUserJS.installs[0].value : 'n/a'; navbar1TextNodeP.appendChild(document.createTextNode(' ' + installCount)); navbar2TextNodeP.appendChild(document.createTextNode(' ' + installCount)); var atIcon = meta.UserScript['icon']; if (atIcon) { atIcon = meta.UserScript['icon'][0].value; var pageHeadingIconNodeSpan = document.createElement('span'); pageHeadingIconNodeSpan.classList.add('page-heading-icon'); pageHeadingIconNodeSpan.setAttribute('data-icon-src', atIcon); var pageHeadingIconNodeI = document.createElement('i'); pageHeadingIconNodeI.classList.add('fa'); pageHeadingIconNodeI.classList.add('fa-fw'); pageHeadingIconNodeI.classList.add('fa-file-code-o'); pageHeadingNodeH2.insertBefore(pageHeadingIconNodeSpan, pageHeadingNodeH2.firstChild); pageHeadingIconNodeSpan.appendChild(pageHeadingIconNodeI); var scriptIconNodeImg = document.createElement('img'); scriptIconNodeImg.addEventListener('load', function () { pageHeadingIconNodeSpan.removeChild(pageHeadingIconNodeI); pageHeadingIconNodeSpan.appendChild(scriptIconNodeImg); }); scriptIconNodeImg.src = atIcon; } // Clean up mdj.renderer.scroller.removeChild(node2); // Resize for older browsers if (!hasOurRelative()) { jsonNodePre.style.setProperty('height', calcHeight() + 'px', ''); if (window.addEventListener) { window.addEventListener('resize', function () { jsonNodePre.style.setProperty('height', calcHeight() + 'px', ''); }, false); } else if (window.attachEvent) { window.addEventListener('resize', function () { jsonNodePre.style.setProperty('height', calcHeight() + 'px', ''); }); } } break; default: NodeDiv2.classList.remove('alert-warning'); NodeDiv2.classList.add('alert-danger'); NodeStrong2.textContent = 'ERROR'; NodeText2.textContent = ': Unable to fetch the meta.json with status of: ' + this.status + ' ' + this.statusText + (this.status === 429 ? '. Try again in ' + (this.getResponseHeader('Retry-After') ? this.getResponseHeader('Retry-After') + ' seconds.' : 'a few.') : ''); scriptNameNodeSpinner.classList.remove('fa-spin'); scriptNameNodeSpinner.classList.add('fa-pulse'); break; } } }; req1.send(); req2.send(); } }, 1); } } else { var metaNode = document.querySelector('#content-navbar ul.nav li a[href$="/meta"]'); if (!metaNode) { var sourceNode = document.querySelector('#content-navbar ul.nav li a[href$="/source"]'); if (sourceNode) { hookNode = sourceNode.parentNode.parentNode; var NodeA = document.createElement('a'); NodeA.href = '/scripts/' + userName + '/' + scriptName + '/meta'; NodeA.textContent = 'Meta'; NodeA.classList.add('notranslate'); NodeA.setAttribute('translate', 'no'); var NodeLi = document.createElement('li'); NodeLi.appendChild(NodeA); hookNode.insertBefore(NodeLi, sourceNode.parentNode.nextSibling.nextSibling); } } } } })();