This repository was archived by the owner on Jan 22, 2024. It is now read-only.

JavaScript minification

Chuck Dumont edited this page Apr 27, 2016 · 15 revisions

The Aggregator uses the Google Closure Compiler to perform JavaScript minification of .js modules, including:

  • Removal of comments, white-space and unneeded block delimiters
  • Renaming of local and function variables to use shorter names
  • Dead code removal
  • Code re-organization (e.g. changing if-then-else blocks to use tertiary operator).

The Aggregator uses the Closure Compiler's simple optimization level for JavaScript optimizations. You can optionally specify an optimization level of whitespace only for debugging by setting optimize='whitespace' in the loader extension config. This will cause the compiler to remove comments and whitespace, but not rename any variables. Setting optimize='none' removes all optimization, by-passing the compiler, but on versions prior to 1.2 this has the effect of disabling code trimming using has.js feature detection, as well as require list expansion, since both of these features depend on functionality provided by the compiler. In versions 1.2 and above, using an optimization level of none does not restrict the use of any other features.

See the sample application's test.html and loaderConfig.js for example code showing how to set loader extension config properties from URL query args specified on the application page's URL.

Starting with version 1.3.3, the use of source maps for JavaScript code is supported though the sourcemaps loader extension config parameter and the sourceMaps option. When source maps are enabled, each layer will specify the URL of a source map for the layer. The URL for a layer source map is the same as the URL for the layer, except that /_sourcemap is appended to the resource path.

Starting with version 1.3.7, arbitrary Closure Compiler options may be specified using the compilerOptions Server-side AMD Config property.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content
This repository was archived by the owner on Jan 22, 2024. It is now read-only.

JavaScript minification

Chuck Dumont edited this page Apr 27, 2016 · 15 revisions

The Aggregator uses the Google Closure Compiler to perform JavaScript minification of .js modules, including:

  • Removal of comments, white-space and unneeded block delimiters
  • Renaming of local and function variables to use shorter names
  • Dead code removal
  • Code re-organization (e.g. changing if-then-else blocks to use tertiary operator).

The Aggregator uses the Closure Compiler's simple optimization level for JavaScript optimizations. You can optionally specify an optimization level of whitespace only for debugging by setting optimize='whitespace' in the loader extension config. This will cause the compiler to remove comments and whitespace, but not rename any variables. Setting optimize='none' removes all optimization, by-passing the compiler, but on versions prior to 1.2 this has the effect of disabling code trimming using has.js feature detection, as well as require list expansion, since both of these features depend on functionality provided by the compiler. In versions 1.2 and above, using an optimization level of none does not restrict the use of any other features.

See the sample application's test.html and loaderConfig.js for example code showing how to set loader extension config properties from URL query args specified on the application page's URL.

Starting with version 1.3.3, the use of source maps for JavaScript code is supported though the sourcemaps loader extension config parameter and the sourceMaps option. When source maps are enabled, each layer will specify the URL of a source map for the layer. The URL for a layer source map is the same as the URL for the layer, except that /_sourcemap is appended to the resource path.

Starting with version 1.3.7, arbitrary Closure Compiler options may be specified using the compilerOptions Server-side AMD Config property.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jan 22, 2024. It is now read-only.

JavaScript minification

Chuck Dumont edited this page Apr 27, 2016 · 15 revisions

The Aggregator uses the Google Closure Compiler to perform JavaScript minification of .js modules, including:

  • Removal of comments, white-space and unneeded block delimiters
  • Renaming of local and function variables to use shorter names
  • Dead code removal
  • Code re-organization (e.g. changing if-then-else blocks to use tertiary operator).

The Aggregator uses the Closure Compiler's simple optimization level for JavaScript optimizations. You can optionally specify an optimization level of whitespace only for debugging by setting optimize='whitespace' in the loader extension config. This will cause the compiler to remove comments and whitespace, but not rename any variables. Setting optimize='none' removes all optimization, by-passing the compiler, but on versions prior to 1.2 this has the effect of disabling code trimming using has.js feature detection, as well as require list expansion, since both of these features depend on functionality provided by the compiler. In versions 1.2 and above, using an optimization level of none does not restrict the use of any other features.

See the sample application's test.html and loaderConfig.js for example code showing how to set loader extension config properties from URL query args specified on the application page's URL.

Starting with version 1.3.3, the use of source maps for JavaScript code is supported though the sourcemaps loader extension config parameter and the sourceMaps option. When source maps are enabled, each layer will specify the URL of a source map for the layer. The URL for a layer source map is the same as the URL for the layer, except that /_sourcemap is appended to the resource path.

Starting with version 1.3.7, arbitrary Closure Compiler options may be specified using the compilerOptions Server-side AMD Config property.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jan 22, 2024. It is now read-only.

JavaScript minification

Chuck Dumont edited this page Apr 27, 2016 · 15 revisions

The Aggregator uses the Google Closure Compiler to perform JavaScript minification of .js modules, including:

  • Removal of comments, white-space and unneeded block delimiters
  • Renaming of local and function variables to use shorter names
  • Dead code removal
  • Code re-organization (e.g. changing if-then-else blocks to use tertiary operator).

The Aggregator uses the Closure Compiler's simple optimization level for JavaScript optimizations. You can optionally specify an optimization level of whitespace only for debugging by setting optimize='whitespace' in the loader extension config. This will cause the compiler to remove comments and whitespace, but not rename any variables. Setting optimize='none' removes all optimization, by-passing the compiler, but on versions prior to 1.2 this has the effect of disabling code trimming using has.js feature detection, as well as require list expansion, since both of these features depend on functionality provided by the compiler. In versions 1.2 and above, using an optimization level of none does not restrict the use of any other features.

See the sample application's test.html and loaderConfig.js for example code showing how to set loader extension config properties from URL query args specified on the application page's URL.

Starting with version 1.3.3, the use of source maps for JavaScript code is supported though the sourcemaps loader extension config parameter and the sourceMaps option. When source maps are enabled, each layer will specify the URL of a source map for the layer. The URL for a layer source map is the same as the URL for the layer, except that /_sourcemap is appended to the resource path.

Starting with version 1.3.7, arbitrary Closure Compiler options may be specified using the compilerOptions Server-side AMD Config property.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
This repository was archived by the owner on Jan 22, 2024. It is now read-only.

JavaScript minification

Chuck Dumont edited this page Apr 27, 2016 · 15 revisions

The Aggregator uses the Google Closure Compiler to perform JavaScript minification of .js modules, including:

  • Removal of comments, white-space and unneeded block delimiters
  • Renaming of local and function variables to use shorter names
  • Dead code removal
  • Code re-organization (e.g. changing if-then-else blocks to use tertiary operator).

The Aggregator uses the Closure Compiler's simple optimization level for JavaScript optimizations. You can optionally specify an optimization level of whitespace only for debugging by setting optimize='whitespace' in the loader extension config. This will cause the compiler to remove comments and whitespace, but not rename any variables. Setting optimize='none' removes all optimization, by-passing the compiler, but on versions prior to 1.2 this has the effect of disabling code trimming using has.js feature detection, as well as require list expansion, since both of these features depend on functionality provided by the compiler. In versions 1.2 and above, using an optimization level of none does not restrict the use of any other features.

See the sample application's test.html and loaderConfig.js for example code showing how to set loader extension config properties from URL query args specified on the application page's URL.

Starting with version 1.3.3, the use of source maps for JavaScript code is supported though the sourcemaps loader extension config parameter and the sourceMaps option. When source maps are enabled, each layer will specify the URL of a source map for the layer. The URL for a layer source map is the same as the URL for the layer, except that /_sourcemap is appended to the resource path.

Starting with version 1.3.7, arbitrary Closure Compiler options may be specified using the compilerOptions Server-side AMD Config property.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jan 22, 2024. It is now read-only.

JavaScript minification

Chuck Dumont edited this page Apr 27, 2016 · 15 revisions

The Aggregator uses the Google Closure Compiler to perform JavaScript minification of .js modules, including:

  • Removal of comments, white-space and unneeded block delimiters
  • Renaming of local and function variables to use shorter names
  • Dead code removal
  • Code re-organization (e.g. changing if-then-else blocks to use tertiary operator).

The Aggregator uses the Closure Compiler's simple optimization level for JavaScript optimizations. You can optionally specify an optimization level of whitespace only for debugging by setting optimize='whitespace' in the loader extension config. This will cause the compiler to remove comments and whitespace, but not rename any variables. Setting optimize='none' removes all optimization, by-passing the compiler, but on versions prior to 1.2 this has the effect of disabling code trimming using has.js feature detection, as well as require list expansion, since both of these features depend on functionality provided by the compiler. In versions 1.2 and above, using an optimization level of none does not restrict the use of any other features.

See the sample application's test.html and loaderConfig.js for example code showing how to set loader extension config properties from URL query args specified on the application page's URL.

Starting with version 1.3.3, the use of source maps for JavaScript code is supported though the sourcemaps loader extension config parameter and the sourceMaps option. When source maps are enabled, each layer will specify the URL of a source map for the layer. The URL for a layer source map is the same as the URL for the layer, except that /_sourcemap is appended to the resource path.

Starting with version 1.3.7, arbitrary Closure Compiler options may be specified using the compilerOptions Server-side AMD Config property.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jan 22, 2024. It is now read-only.

JavaScript minification

Chuck Dumont edited this page Apr 27, 2016 · 15 revisions

The Aggregator uses the Google Closure Compiler to perform JavaScript minification of .js modules, including:

  • Removal of comments, white-space and unneeded block delimiters
  • Renaming of local and function variables to use shorter names
  • Dead code removal
  • Code re-organization (e.g. changing if-then-else blocks to use tertiary operator).

The Aggregator uses the Closure Compiler's simple optimization level for JavaScript optimizations. You can optionally specify an optimization level of whitespace only for debugging by setting optimize='whitespace' in the loader extension config. This will cause the compiler to remove comments and whitespace, but not rename any variables. Setting optimize='none' removes all optimization, by-passing the compiler, but on versions prior to 1.2 this has the effect of disabling code trimming using has.js feature detection, as well as require list expansion, since both of these features depend on functionality provided by the compiler. In versions 1.2 and above, using an optimization level of none does not restrict the use of any other features.

See the sample application's test.html and loaderConfig.js for example code showing how to set loader extension config properties from URL query args specified on the application page's URL.

Starting with version 1.3.3, the use of source maps for JavaScript code is supported though the sourcemaps loader extension config parameter and the sourceMaps option. When source maps are enabled, each layer will specify the URL of a source map for the layer. The URL for a layer source map is the same as the URL for the layer, except that /_sourcemap is appended to the resource path.

Starting with version 1.3.7, arbitrary Closure Compiler options may be specified using the compilerOptions Server-side AMD Config property.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
This repository was archived by the owner on Jan 22, 2024. It is now read-only.

JavaScript minification

Chuck Dumont edited this page Apr 27, 2016 · 15 revisions

The Aggregator uses the Google Closure Compiler to perform JavaScript minification of .js modules, including:

  • Removal of comments, white-space and unneeded block delimiters
  • Renaming of local and function variables to use shorter names
  • Dead code removal
  • Code re-organization (e.g. changing if-then-else blocks to use tertiary operator).

The Aggregator uses the Closure Compiler's simple optimization level for JavaScript optimizations. You can optionally specify an optimization level of whitespace only for debugging by setting optimize='whitespace' in the loader extension config. This will cause the compiler to remove comments and whitespace, but not rename any variables. Setting optimize='none' removes all optimization, by-passing the compiler, but on versions prior to 1.2 this has the effect of disabling code trimming using has.js feature detection, as well as require list expansion, since both of these features depend on functionality provided by the compiler. In versions 1.2 and above, using an optimization level of none does not restrict the use of any other features.

See the sample application's test.html and loaderConfig.js for example code showing how to set loader extension config properties from URL query args specified on the application page's URL.

Starting with version 1.3.3, the use of source maps for JavaScript code is supported though the sourcemaps loader extension config parameter and the sourceMaps option. When source maps are enabled, each layer will specify the URL of a source map for the layer. The URL for a layer source map is the same as the URL for the layer, except that /_sourcemap is appended to the resource path.

Starting with version 1.3.7, arbitrary Closure Compiler options may be specified using the compilerOptions Server-side AMD Config property.

Clone this wiki locally