Latest commit

History

History
70 lines (45 loc) · 3.49 KB

File metadata and controls

70 lines (45 loc) · 3.49 KB

PROOF OF CONCEPT: A JavaScript Library Manager for Joomla

This plugin is a proof of concept of how Joomla could manage JavaScript libraries, as well as dependent scripts. The idea is to ensure that one and only one copy of any specific library is loaded on the page. This is one way we could potentially solve the problem.

jQuery

This library will automatically send jQuery into noConflict() mode immediately after loading it. If a copy of jQuery is already present in the document head, it will not load another copy.

What it doesn't do

It does not remove duplicate instances of libraries that have been added into the document head manually, nor does it remove scripts that have been hard coded into the template. It only manages the JavaScript libraries that have been registered within it.

CDN

This plugin has support for the Google and Microsoft JavaScript CDNs. To activate, select the CDN you wish to use from the parameters in the plugin. If you wish to use a different CDN for a specific library, this is possible using the "overrides" parameter. Specify the name of the library, followed by a comma, followed by the URL to the library.

Usage

Once you have the plugin enabled, you can simply register a library this way:

<?php
JavascriptLibraries::register_library('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');

Rouven Weßling has a proposed integration for the Joomla Platform's JDocument class. If this proposal is accepted, you can make your code forward compatible with his work by first checking JDocument for the registerLibrary() method:

<?php$document = JFactory::getDocument();
if (method_exists($document, 'registerLibrary')) {
$document->registerLibrary('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
} else {
JavascriptLibraries::register_library('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
}

Be sure to bundle a copy of the JavaScript library with your extension, otherwise an exception will be thrown. When you load a JavaScript library, you specify the name of the library (in lowercase) and specify the minimum version you wish to use. If other extensions register a higher version, that will be used instead.

You can also register a specific script, specifying which library the script relies on:

<?php
JavascriptLibraries::register_library('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
JavascriptLibraries::register_script('path/to/my/jquery/based/script.js', 'jquery');

The JavascriptLibraries class will make sure that dependent scripts are loaded after the specified library. Rouven's proposed JDocument integration does not currently register scripts with specific libraries, so simply call the existing addScript() method in forward-compatible code:

<?php$document = JFactory::getDocument();
if (method_exists($document, 'registerLibrary')) {
$document->registerLibrary('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
$document->addScript(JURI::base() . 'path/to/my/jquery/based/script.js');
} else {
JavascriptLibraries::register_library('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
JavascriptLibraries::register_script('path/to/my/jquery/based/script.js', 'jquery');
}

Design Considerations

This plugin has only been tested on the Square One distribution of Joomla 2.5, but is intended to work all the way back to Joomla 1.5. Because of this, the JavascriptLibraries class is included in the same file as the plugin for maximum compatibility.

, '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

Latest commit

History

History
70 lines (45 loc) · 3.49 KB

File metadata and controls

70 lines (45 loc) · 3.49 KB

PROOF OF CONCEPT: A JavaScript Library Manager for Joomla

This plugin is a proof of concept of how Joomla could manage JavaScript libraries, as well as dependent scripts. The idea is to ensure that one and only one copy of any specific library is loaded on the page. This is one way we could potentially solve the problem.

jQuery

This library will automatically send jQuery into noConflict() mode immediately after loading it. If a copy of jQuery is already present in the document head, it will not load another copy.

What it doesn't do

It does not remove duplicate instances of libraries that have been added into the document head manually, nor does it remove scripts that have been hard coded into the template. It only manages the JavaScript libraries that have been registered within it.

CDN

This plugin has support for the Google and Microsoft JavaScript CDNs. To activate, select the CDN you wish to use from the parameters in the plugin. If you wish to use a different CDN for a specific library, this is possible using the "overrides" parameter. Specify the name of the library, followed by a comma, followed by the URL to the library.

Usage

Once you have the plugin enabled, you can simply register a library this way:

<?php
JavascriptLibraries::register_library('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');

Rouven Weßling has a proposed integration for the Joomla Platform's JDocument class. If this proposal is accepted, you can make your code forward compatible with his work by first checking JDocument for the registerLibrary() method:

<?php$document = JFactory::getDocument();
if (method_exists($document, 'registerLibrary')) {
$document->registerLibrary('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
} else {
JavascriptLibraries::register_library('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
}

Be sure to bundle a copy of the JavaScript library with your extension, otherwise an exception will be thrown. When you load a JavaScript library, you specify the name of the library (in lowercase) and specify the minimum version you wish to use. If other extensions register a higher version, that will be used instead.

You can also register a specific script, specifying which library the script relies on:

<?php
JavascriptLibraries::register_library('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
JavascriptLibraries::register_script('path/to/my/jquery/based/script.js', 'jquery');

The JavascriptLibraries class will make sure that dependent scripts are loaded after the specified library. Rouven's proposed JDocument integration does not currently register scripts with specific libraries, so simply call the existing addScript() method in forward-compatible code:

<?php$document = JFactory::getDocument();
if (method_exists($document, 'registerLibrary')) {
$document->registerLibrary('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
$document->addScript(JURI::base() . 'path/to/my/jquery/based/script.js');
} else {
JavascriptLibraries::register_library('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
JavascriptLibraries::register_script('path/to/my/jquery/based/script.js', 'jquery');
}

Design Considerations

This plugin has only been tested on the Square One distribution of Joomla 2.5, but is intended to work all the way back to Joomla 1.5. Because of this, the JavascriptLibraries class is included in the same file as the plugin for maximum compatibility.

, '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

Latest commit

History

History
70 lines (45 loc) · 3.49 KB

File metadata and controls

70 lines (45 loc) · 3.49 KB

PROOF OF CONCEPT: A JavaScript Library Manager for Joomla

This plugin is a proof of concept of how Joomla could manage JavaScript libraries, as well as dependent scripts. The idea is to ensure that one and only one copy of any specific library is loaded on the page. This is one way we could potentially solve the problem.

jQuery

This library will automatically send jQuery into noConflict() mode immediately after loading it. If a copy of jQuery is already present in the document head, it will not load another copy.

What it doesn't do

It does not remove duplicate instances of libraries that have been added into the document head manually, nor does it remove scripts that have been hard coded into the template. It only manages the JavaScript libraries that have been registered within it.

CDN

This plugin has support for the Google and Microsoft JavaScript CDNs. To activate, select the CDN you wish to use from the parameters in the plugin. If you wish to use a different CDN for a specific library, this is possible using the "overrides" parameter. Specify the name of the library, followed by a comma, followed by the URL to the library.

Usage

Once you have the plugin enabled, you can simply register a library this way:

<?php
JavascriptLibraries::register_library('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');

Rouven Weßling has a proposed integration for the Joomla Platform's JDocument class. If this proposal is accepted, you can make your code forward compatible with his work by first checking JDocument for the registerLibrary() method:

<?php$document = JFactory::getDocument();
if (method_exists($document, 'registerLibrary')) {
$document->registerLibrary('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
} else {
JavascriptLibraries::register_library('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
}

Be sure to bundle a copy of the JavaScript library with your extension, otherwise an exception will be thrown. When you load a JavaScript library, you specify the name of the library (in lowercase) and specify the minimum version you wish to use. If other extensions register a higher version, that will be used instead.

You can also register a specific script, specifying which library the script relies on:

<?php
JavascriptLibraries::register_library('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
JavascriptLibraries::register_script('path/to/my/jquery/based/script.js', 'jquery');

The JavascriptLibraries class will make sure that dependent scripts are loaded after the specified library. Rouven's proposed JDocument integration does not currently register scripts with specific libraries, so simply call the existing addScript() method in forward-compatible code:

<?php$document = JFactory::getDocument();
if (method_exists($document, 'registerLibrary')) {
$document->registerLibrary('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
$document->addScript(JURI::base() . 'path/to/my/jquery/based/script.js');
} else {
JavascriptLibraries::register_library('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
JavascriptLibraries::register_script('path/to/my/jquery/based/script.js', 'jquery');
}

Design Considerations

This plugin has only been tested on the Square One distribution of Joomla 2.5, but is intended to work all the way back to Joomla 1.5. Because of this, the JavascriptLibraries class is included in the same file as the plugin for maximum compatibility.

, '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

Latest commit

History

History
70 lines (45 loc) · 3.49 KB

File metadata and controls

70 lines (45 loc) · 3.49 KB

PROOF OF CONCEPT: A JavaScript Library Manager for Joomla

This plugin is a proof of concept of how Joomla could manage JavaScript libraries, as well as dependent scripts. The idea is to ensure that one and only one copy of any specific library is loaded on the page. This is one way we could potentially solve the problem.

jQuery

This library will automatically send jQuery into noConflict() mode immediately after loading it. If a copy of jQuery is already present in the document head, it will not load another copy.

What it doesn't do

It does not remove duplicate instances of libraries that have been added into the document head manually, nor does it remove scripts that have been hard coded into the template. It only manages the JavaScript libraries that have been registered within it.

CDN

This plugin has support for the Google and Microsoft JavaScript CDNs. To activate, select the CDN you wish to use from the parameters in the plugin. If you wish to use a different CDN for a specific library, this is possible using the "overrides" parameter. Specify the name of the library, followed by a comma, followed by the URL to the library.

Usage

Once you have the plugin enabled, you can simply register a library this way:

<?php
JavascriptLibraries::register_library('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');

Rouven Weßling has a proposed integration for the Joomla Platform's JDocument class. If this proposal is accepted, you can make your code forward compatible with his work by first checking JDocument for the registerLibrary() method:

<?php$document = JFactory::getDocument();
if (method_exists($document, 'registerLibrary')) {
$document->registerLibrary('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
} else {
JavascriptLibraries::register_library('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
}

Be sure to bundle a copy of the JavaScript library with your extension, otherwise an exception will be thrown. When you load a JavaScript library, you specify the name of the library (in lowercase) and specify the minimum version you wish to use. If other extensions register a higher version, that will be used instead.

You can also register a specific script, specifying which library the script relies on:

<?php
JavascriptLibraries::register_library('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
JavascriptLibraries::register_script('path/to/my/jquery/based/script.js', 'jquery');

The JavascriptLibraries class will make sure that dependent scripts are loaded after the specified library. Rouven's proposed JDocument integration does not currently register scripts with specific libraries, so simply call the existing addScript() method in forward-compatible code:

<?php$document = JFactory::getDocument();
if (method_exists($document, 'registerLibrary')) {
$document->registerLibrary('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
$document->addScript(JURI::base() . 'path/to/my/jquery/based/script.js');
} else {
JavascriptLibraries::register_library('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
JavascriptLibraries::register_script('path/to/my/jquery/based/script.js', 'jquery');
}

Design Considerations

This plugin has only been tested on the Square One distribution of Joomla 2.5, but is intended to work all the way back to Joomla 1.5. Because of this, the JavascriptLibraries class is included in the same file as the plugin for maximum compatibility.

, '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

Latest commit

History

History
70 lines (45 loc) · 3.49 KB

File metadata and controls

70 lines (45 loc) · 3.49 KB

PROOF OF CONCEPT: A JavaScript Library Manager for Joomla

This plugin is a proof of concept of how Joomla could manage JavaScript libraries, as well as dependent scripts. The idea is to ensure that one and only one copy of any specific library is loaded on the page. This is one way we could potentially solve the problem.

jQuery

This library will automatically send jQuery into noConflict() mode immediately after loading it. If a copy of jQuery is already present in the document head, it will not load another copy.

What it doesn't do

It does not remove duplicate instances of libraries that have been added into the document head manually, nor does it remove scripts that have been hard coded into the template. It only manages the JavaScript libraries that have been registered within it.

CDN

This plugin has support for the Google and Microsoft JavaScript CDNs. To activate, select the CDN you wish to use from the parameters in the plugin. If you wish to use a different CDN for a specific library, this is possible using the "overrides" parameter. Specify the name of the library, followed by a comma, followed by the URL to the library.

Usage

Once you have the plugin enabled, you can simply register a library this way:

<?php
JavascriptLibraries::register_library('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');

Rouven Weßling has a proposed integration for the Joomla Platform's JDocument class. If this proposal is accepted, you can make your code forward compatible with his work by first checking JDocument for the registerLibrary() method:

<?php$document = JFactory::getDocument();
if (method_exists($document, 'registerLibrary')) {
$document->registerLibrary('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
} else {
JavascriptLibraries::register_library('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
}

Be sure to bundle a copy of the JavaScript library with your extension, otherwise an exception will be thrown. When you load a JavaScript library, you specify the name of the library (in lowercase) and specify the minimum version you wish to use. If other extensions register a higher version, that will be used instead.

You can also register a specific script, specifying which library the script relies on:

<?php
JavascriptLibraries::register_library('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
JavascriptLibraries::register_script('path/to/my/jquery/based/script.js', 'jquery');

The JavascriptLibraries class will make sure that dependent scripts are loaded after the specified library. Rouven's proposed JDocument integration does not currently register scripts with specific libraries, so simply call the existing addScript() method in forward-compatible code:

<?php$document = JFactory::getDocument();
if (method_exists($document, 'registerLibrary')) {
$document->registerLibrary('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
$document->addScript(JURI::base() . 'path/to/my/jquery/based/script.js');
} else {
JavascriptLibraries::register_library('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
JavascriptLibraries::register_script('path/to/my/jquery/based/script.js', 'jquery');
}

Design Considerations

This plugin has only been tested on the Square One distribution of Joomla 2.5, but is intended to work all the way back to Joomla 1.5. Because of this, the JavascriptLibraries class is included in the same file as the plugin for maximum compatibility.

, '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

Latest commit

History

History
70 lines (45 loc) · 3.49 KB

File metadata and controls

70 lines (45 loc) · 3.49 KB

PROOF OF CONCEPT: A JavaScript Library Manager for Joomla

This plugin is a proof of concept of how Joomla could manage JavaScript libraries, as well as dependent scripts. The idea is to ensure that one and only one copy of any specific library is loaded on the page. This is one way we could potentially solve the problem.

jQuery

This library will automatically send jQuery into noConflict() mode immediately after loading it. If a copy of jQuery is already present in the document head, it will not load another copy.

What it doesn't do

It does not remove duplicate instances of libraries that have been added into the document head manually, nor does it remove scripts that have been hard coded into the template. It only manages the JavaScript libraries that have been registered within it.

CDN

This plugin has support for the Google and Microsoft JavaScript CDNs. To activate, select the CDN you wish to use from the parameters in the plugin. If you wish to use a different CDN for a specific library, this is possible using the "overrides" parameter. Specify the name of the library, followed by a comma, followed by the URL to the library.

Usage

Once you have the plugin enabled, you can simply register a library this way:

<?php
JavascriptLibraries::register_library('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');

Rouven Weßling has a proposed integration for the Joomla Platform's JDocument class. If this proposal is accepted, you can make your code forward compatible with his work by first checking JDocument for the registerLibrary() method:

<?php$document = JFactory::getDocument();
if (method_exists($document, 'registerLibrary')) {
$document->registerLibrary('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
} else {
JavascriptLibraries::register_library('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
}

Be sure to bundle a copy of the JavaScript library with your extension, otherwise an exception will be thrown. When you load a JavaScript library, you specify the name of the library (in lowercase) and specify the minimum version you wish to use. If other extensions register a higher version, that will be used instead.

You can also register a specific script, specifying which library the script relies on:

<?php
JavascriptLibraries::register_library('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
JavascriptLibraries::register_script('path/to/my/jquery/based/script.js', 'jquery');

The JavascriptLibraries class will make sure that dependent scripts are loaded after the specified library. Rouven's proposed JDocument integration does not currently register scripts with specific libraries, so simply call the existing addScript() method in forward-compatible code:

<?php$document = JFactory::getDocument();
if (method_exists($document, 'registerLibrary')) {
$document->registerLibrary('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
$document->addScript(JURI::base() . 'path/to/my/jquery/based/script.js');
} else {
JavascriptLibraries::register_library('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
JavascriptLibraries::register_script('path/to/my/jquery/based/script.js', 'jquery');
}

Design Considerations

This plugin has only been tested on the Square One distribution of Joomla 2.5, but is intended to work all the way back to Joomla 1.5. Because of this, the JavascriptLibraries class is included in the same file as the plugin for maximum compatibility.

, '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

Latest commit

History

History
70 lines (45 loc) · 3.49 KB

File metadata and controls

70 lines (45 loc) · 3.49 KB

PROOF OF CONCEPT: A JavaScript Library Manager for Joomla

This plugin is a proof of concept of how Joomla could manage JavaScript libraries, as well as dependent scripts. The idea is to ensure that one and only one copy of any specific library is loaded on the page. This is one way we could potentially solve the problem.

jQuery

This library will automatically send jQuery into noConflict() mode immediately after loading it. If a copy of jQuery is already present in the document head, it will not load another copy.

What it doesn't do

It does not remove duplicate instances of libraries that have been added into the document head manually, nor does it remove scripts that have been hard coded into the template. It only manages the JavaScript libraries that have been registered within it.

CDN

This plugin has support for the Google and Microsoft JavaScript CDNs. To activate, select the CDN you wish to use from the parameters in the plugin. If you wish to use a different CDN for a specific library, this is possible using the "overrides" parameter. Specify the name of the library, followed by a comma, followed by the URL to the library.

Usage

Once you have the plugin enabled, you can simply register a library this way:

<?php
JavascriptLibraries::register_library('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');

Rouven Weßling has a proposed integration for the Joomla Platform's JDocument class. If this proposal is accepted, you can make your code forward compatible with his work by first checking JDocument for the registerLibrary() method:

<?php$document = JFactory::getDocument();
if (method_exists($document, 'registerLibrary')) {
$document->registerLibrary('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
} else {
JavascriptLibraries::register_library('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
}

Be sure to bundle a copy of the JavaScript library with your extension, otherwise an exception will be thrown. When you load a JavaScript library, you specify the name of the library (in lowercase) and specify the minimum version you wish to use. If other extensions register a higher version, that will be used instead.

You can also register a specific script, specifying which library the script relies on:

<?php
JavascriptLibraries::register_library('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
JavascriptLibraries::register_script('path/to/my/jquery/based/script.js', 'jquery');

The JavascriptLibraries class will make sure that dependent scripts are loaded after the specified library. Rouven's proposed JDocument integration does not currently register scripts with specific libraries, so simply call the existing addScript() method in forward-compatible code:

<?php$document = JFactory::getDocument();
if (method_exists($document, 'registerLibrary')) {
$document->registerLibrary('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
$document->addScript(JURI::base() . 'path/to/my/jquery/based/script.js');
} else {
JavascriptLibraries::register_library('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
JavascriptLibraries::register_script('path/to/my/jquery/based/script.js', 'jquery');
}

Design Considerations

This plugin has only been tested on the Square One distribution of Joomla 2.5, but is intended to work all the way back to Joomla 1.5. Because of this, the JavascriptLibraries class is included in the same file as the plugin for maximum compatibility.

, '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

Latest commit

History

History
70 lines (45 loc) · 3.49 KB

File metadata and controls

70 lines (45 loc) · 3.49 KB

PROOF OF CONCEPT: A JavaScript Library Manager for Joomla

This plugin is a proof of concept of how Joomla could manage JavaScript libraries, as well as dependent scripts. The idea is to ensure that one and only one copy of any specific library is loaded on the page. This is one way we could potentially solve the problem.

jQuery

This library will automatically send jQuery into noConflict() mode immediately after loading it. If a copy of jQuery is already present in the document head, it will not load another copy.

What it doesn't do

It does not remove duplicate instances of libraries that have been added into the document head manually, nor does it remove scripts that have been hard coded into the template. It only manages the JavaScript libraries that have been registered within it.

CDN

This plugin has support for the Google and Microsoft JavaScript CDNs. To activate, select the CDN you wish to use from the parameters in the plugin. If you wish to use a different CDN for a specific library, this is possible using the "overrides" parameter. Specify the name of the library, followed by a comma, followed by the URL to the library.

Usage

Once you have the plugin enabled, you can simply register a library this way:

<?php
JavascriptLibraries::register_library('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');

Rouven Weßling has a proposed integration for the Joomla Platform's JDocument class. If this proposal is accepted, you can make your code forward compatible with his work by first checking JDocument for the registerLibrary() method:

<?php$document = JFactory::getDocument();
if (method_exists($document, 'registerLibrary')) {
$document->registerLibrary('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
} else {
JavascriptLibraries::register_library('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
}

Be sure to bundle a copy of the JavaScript library with your extension, otherwise an exception will be thrown. When you load a JavaScript library, you specify the name of the library (in lowercase) and specify the minimum version you wish to use. If other extensions register a higher version, that will be used instead.

You can also register a specific script, specifying which library the script relies on:

<?php
JavascriptLibraries::register_library('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
JavascriptLibraries::register_script('path/to/my/jquery/based/script.js', 'jquery');

The JavascriptLibraries class will make sure that dependent scripts are loaded after the specified library. Rouven's proposed JDocument integration does not currently register scripts with specific libraries, so simply call the existing addScript() method in forward-compatible code:

<?php$document = JFactory::getDocument();
if (method_exists($document, 'registerLibrary')) {
$document->registerLibrary('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
$document->addScript(JURI::base() . 'path/to/my/jquery/based/script.js');
} else {
JavascriptLibraries::register_library('jquery', '1.4.2', 'media/jquery-1.4.2.min.js');
JavascriptLibraries::register_script('path/to/my/jquery/based/script.js', 'jquery');
}

Design Considerations

This plugin has only been tested on the Square One distribution of Joomla 2.5, but is intended to work all the way back to Joomla 1.5. Because of this, the JavascriptLibraries class is included in the same file as the plugin for maximum compatibility.